@microsoft/windows-admin-center-sdk 2.186.0 → 2.296.0

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 (236) hide show
  1. package/angular/assets/strings/cs-CZ/strings.json +1 -1
  2. package/angular/assets/strings/de-DE/strings.json +1 -1
  3. package/angular/assets/strings/es-ES/strings.json +1 -1
  4. package/angular/assets/strings/fr-FR/strings.json +1 -1
  5. package/angular/assets/strings/hu-HU/strings.json +1 -1
  6. package/angular/assets/strings/it-IT/strings.json +1 -1
  7. package/angular/assets/strings/ja-JP/strings.json +1 -1
  8. package/angular/assets/strings/ko-KR/strings.json +1 -1
  9. package/angular/assets/strings/nl-NL/strings.json +1 -1
  10. package/angular/assets/strings/pl-PL/strings.json +1 -1
  11. package/angular/assets/strings/pt-BR/strings.json +1 -1
  12. package/angular/assets/strings/pt-PT/strings.json +1 -1
  13. package/angular/assets/strings/ru-RU/strings.json +1 -1
  14. package/angular/assets/strings/strings.json +1 -1
  15. package/angular/assets/strings/sv-SE/strings.json +1 -1
  16. package/angular/assets/strings/tr-TR/strings.json +1 -1
  17. package/angular/assets/strings/zh-CN/strings.json +1 -1
  18. package/angular/assets/strings/zh-TW/strings.json +1 -1
  19. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +1103 -1209
  20. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
  21. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +2 -2
  22. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
  23. package/angular/esm2015/src/controls/actions/actions.module.js +2 -2
  24. package/angular/esm2015/src/controls/actions/containers/action-bar/action-bar.component.js +2 -2
  25. package/angular/esm2015/src/controls/actions/items/action-button/action-button-renderer.component.js +5 -5
  26. package/angular/esm2015/src/controls/actions/items/action-dropdown/action-dropdown.component.js +31 -13
  27. package/angular/esm2015/src/controls/actions/items/action-item.component.js +7 -3
  28. package/angular/esm2015/src/controls/badge/badge-base.component.js +2 -13
  29. package/angular/esm2015/src/controls/badge/bugfixes-feature-badge.component.js +42 -70
  30. package/angular/esm2015/src/controls/badge/coming-soon-badge.component.js +42 -70
  31. package/angular/esm2015/src/controls/badge/credssp-enabled-badge.component.js +42 -70
  32. package/angular/esm2015/src/controls/badge/critical-badge.component.js +42 -70
  33. package/angular/esm2015/src/controls/badge/custom-badge.component.js +42 -70
  34. package/angular/esm2015/src/controls/badge/feedback-badge.component.js +42 -70
  35. package/angular/esm2015/src/controls/badge/improvement-feature-badge.component.js +42 -70
  36. package/angular/esm2015/src/controls/badge/new-badge.component.js +42 -70
  37. package/angular/esm2015/src/controls/badge/new-feature-badge.component.js +42 -70
  38. package/angular/esm2015/src/controls/badge/preview-badge.component.js +42 -70
  39. package/angular/esm2015/src/controls/badge/warning-badge.component.js +42 -70
  40. package/angular/esm2015/src/controls/breadcrumb/breadcrumb.component.js +6 -6
  41. package/angular/esm2015/src/controls/breadcrumb-header/breadcrumb-header.component.js +2 -2
  42. package/angular/esm2015/src/controls/data-table/data-table-column.component.js +5 -3
  43. package/angular/esm2015/src/controls/data-table/data-table.component.js +20 -26
  44. package/angular/esm2015/src/controls/data-table/extensions/data-table-column-picker-extension.js +2 -1
  45. package/angular/esm2015/src/controls/details/details.component.js +2 -2
  46. package/angular/esm2015/src/controls/dialog/base-dialog.component.js +1 -1
  47. package/angular/esm2015/src/controls/dialog/confirmation-dialog/confirmation-dialog.component.js +20 -30
  48. package/angular/esm2015/src/controls/dialog/dialog.service.js +7 -3
  49. package/angular/esm2015/src/controls/dropdown/dropdown.component.js +2 -2
  50. package/angular/esm2015/src/controls/form/form-field/array/array-form-field.component.js +50 -40
  51. package/angular/esm2015/src/controls/form/form-field/checklist/checklist-form-field.component.js +3 -3
  52. package/angular/esm2015/src/controls/form/form-field/combobox/combobox-form-field.component.js +14 -13
  53. package/angular/esm2015/src/controls/form/form-field/datetime/datetime-form-field.component.js +2 -2
  54. package/angular/esm2015/src/controls/form/form-field/form-field.component.js +16 -4
  55. package/angular/esm2015/src/controls/form/form-field/options-form-field/form-field-option.component.js +5 -3
  56. package/angular/esm2015/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.js +25 -21
  57. package/angular/esm2015/src/controls/form/form-field/radio-group/classic/radio-group-form-field.component.js +5 -5
  58. package/angular/esm2015/src/controls/form/form-field/search/search-form-field.component.js +2 -2
  59. package/angular/esm2015/src/controls/form/form-field/tags/tags-form-field.component.js +2 -2
  60. package/angular/esm2015/src/controls/form/validation-alert/validation-alert.component.js +4 -10
  61. package/angular/esm2015/src/controls/form/validation-alert/validation-alert.js +1 -1
  62. package/angular/esm2015/src/controls/horizontal-bar-chart/stacked-horizontal-bar-chart.component.js +17 -1
  63. package/angular/esm2015/src/controls/icon/layered-icon/layered-icon.component.js +12 -1
  64. package/angular/esm2015/src/controls/icon/layered-icon/status/status-icon.component.js +53 -9
  65. package/angular/esm2015/src/controls/loading-wheel/loading-wheel.component.js +17 -1
  66. package/angular/esm2015/src/controls/master-view/master-view.component.js +34 -30
  67. package/angular/esm2015/src/controls/pivot/pivot-tab.component.js +1 -1
  68. package/angular/esm2015/src/controls/pivot/pivot.component.js +21 -9
  69. package/angular/esm2015/src/controls/property-grid/property-grid.component.js +13 -29
  70. package/angular/esm2015/src/controls/schema-form/schema-form-content.component.js +7 -4
  71. package/angular/esm2015/src/controls/settings/common-settings/common-settings.component.js +23 -35
  72. package/angular/esm2015/src/controls/settings/settings.component.js +28 -1
  73. package/angular/esm2015/src/controls/settings/settings.module.js +8 -3
  74. package/angular/esm2015/src/controls/tooltip/tooltip-host.component.js +16 -5
  75. package/angular/esm2015/src/controls/wizard/wizard.component.js +38 -6
  76. package/angular/esm2015/src/directives/clamp/clamp.directive.js +26 -7
  77. package/angular/esm2015/src/directives/discard/discard.directive.js +2 -2
  78. package/angular/esm2015/src/directives/markdown/markdown.directive.js +5 -18
  79. package/angular/esm2015/src/generated/strings.js +1 -1
  80. package/angular/esm2015/src/guards/experiment.guard.service.js +14 -1
  81. package/angular/esm2015/src/pipes/boolean-converter-pipe.js +11 -1
  82. package/angular/esm2015/src/pipes/byte-unit-converter-pipe.js +11 -1
  83. package/angular/esm2015/src/pipes/enum-converter-pipe.js +16 -1
  84. package/angular/esm2015/src/pipes/format-pipe.js +11 -1
  85. package/angular/esm2015/src/pipes/highlight-pipe.js +11 -1
  86. package/angular/esm2015/src/pipes/yesno-converter-pipe.js +11 -1
  87. package/angular/esm2015/src/service/gateway.service.js +8 -5
  88. package/angular/esm2015/src/service/notification.service.js +23 -1
  89. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +1042 -1069
  90. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
  91. package/angular/package.json +0 -1
  92. package/angular/src/controls/actions/items/action-dropdown/action-dropdown.component.d.ts +2 -0
  93. package/angular/src/controls/actions/items/action-item.component.d.ts +11 -1
  94. package/angular/src/controls/badge/badge-base.component.d.ts +0 -4
  95. package/angular/src/controls/data-table/data-table-column.component.d.ts +2 -1
  96. package/angular/src/controls/data-table/data-table.component.d.ts +4 -0
  97. package/angular/src/controls/dialog/base-dialog.component.d.ts +1 -1
  98. package/angular/src/controls/form/form-field/form-field.component.d.ts +10 -1
  99. package/angular/src/controls/form/form-field/options-form-field/form-field-option.component.d.ts +5 -1
  100. package/angular/src/controls/form/validation-alert/validation-alert.component.d.ts +0 -4
  101. package/angular/src/controls/form/validation-alert/validation-alert.d.ts +0 -1
  102. package/angular/src/controls/horizontal-bar-chart/stacked-horizontal-bar-chart.component.d.ts +16 -0
  103. package/angular/src/controls/icon/layered-icon/layered-icon.component.d.ts +11 -0
  104. package/angular/src/controls/icon/layered-icon/status/status-icon.component.d.ts +13 -2
  105. package/angular/src/controls/loading-wheel/loading-wheel.component.d.ts +16 -0
  106. package/angular/src/controls/master-view/master-view.component.d.ts +1 -0
  107. package/angular/src/controls/pivot/pivot-tab.component.d.ts +0 -1
  108. package/angular/src/controls/pivot/pivot.component.d.ts +4 -0
  109. package/angular/src/controls/settings/common-settings/common-settings.component.d.ts +6 -5
  110. package/angular/src/controls/settings/settings.component.d.ts +27 -0
  111. package/angular/src/controls/settings/settings.module.d.ts +7 -6
  112. package/angular/src/controls/tooltip/tooltip-host.component.d.ts +1 -1
  113. package/angular/src/controls/wizard/wizard.component.d.ts +23 -0
  114. package/angular/src/directives/clamp/clamp.directive.d.ts +5 -0
  115. package/angular/src/directives/markdown/markdown.directive.d.ts +2 -3
  116. package/angular/src/generated/strings.d.ts +9 -0
  117. package/angular/src/guards/experiment.guard.service.d.ts +13 -0
  118. package/angular/src/pipes/boolean-converter-pipe.d.ts +10 -0
  119. package/angular/src/pipes/byte-unit-converter-pipe.d.ts +10 -0
  120. package/angular/src/pipes/enum-converter-pipe.d.ts +15 -0
  121. package/angular/src/pipes/format-pipe.d.ts +10 -0
  122. package/angular/src/pipes/highlight-pipe.d.ts +10 -0
  123. package/angular/src/pipes/yesno-converter-pipe.d.ts +10 -0
  124. package/angular/src/service/gateway.service.d.ts +3 -1
  125. package/angular/src/service/notification.service.d.ts +22 -0
  126. package/core/base/environment.d.ts +7 -0
  127. package/core/base/environment.js.map +1 -1
  128. package/core/base/versioned-object.js +2 -2
  129. package/core/base/versioned-object.js.map +1 -1
  130. package/core/data/cim-stream.js +8 -1
  131. package/core/data/cim-stream.js.map +1 -1
  132. package/core/data/core-environment.d.ts +4 -0
  133. package/core/data/core-environment.js +1 -0
  134. package/core/data/core-environment.js.map +1 -1
  135. package/core/data/crypto.js +10 -9
  136. package/core/data/crypto.js.map +1 -1
  137. package/core/data/file-transfer.js +5 -1
  138. package/core/data/file-transfer.js.map +1 -1
  139. package/core/data/gateway-connection.d.ts +11 -1
  140. package/core/data/gateway-connection.js +51 -9
  141. package/core/data/gateway-connection.js.map +1 -1
  142. package/core/data/http-constants.d.ts +5 -1
  143. package/core/data/http-constants.js +5 -1
  144. package/core/data/http-constants.js.map +1 -1
  145. package/core/data/net.d.ts +15 -11
  146. package/core/data/net.js +44 -41
  147. package/core/data/net.js.map +1 -1
  148. package/core/data/node-connection.d.ts +2 -2
  149. package/core/data/node-connection.js.map +1 -1
  150. package/core/data/powershell-stream.js +11 -3
  151. package/core/data/powershell-stream.js.map +1 -1
  152. package/core/data/powershell.d.ts +17 -1
  153. package/core/data/powershell.js +35 -9
  154. package/core/data/powershell.js.map +1 -1
  155. package/core/data/settings-manager.d.ts +9 -0
  156. package/core/data/settings-manager.js +18 -1
  157. package/core/data/settings-manager.js.map +1 -1
  158. package/core/generated/powershell-scripts.d.ts +5 -4
  159. package/core/generated/powershell-scripts.js +5 -4
  160. package/core/generated/powershell-scripts.js.map +1 -1
  161. package/core/host/host-core-manager.d.ts +36 -0
  162. package/core/host/host-core-manager.js +134 -0
  163. package/core/host/host-core-manager.js.map +1 -0
  164. package/core/host/host-core-message-type.d.ts +12 -0
  165. package/core/host/host-core-message-type.js +17 -0
  166. package/core/host/host-core-message-type.js.map +1 -0
  167. package/core/host/host-core-messages.d.ts +14 -0
  168. package/core/host/host-core-messages.js +3 -0
  169. package/core/host/host-core-messages.js.map +1 -0
  170. package/core/manifest/manifest-loader.d.ts +2 -1
  171. package/core/manifest/manifest-loader.js +27 -18
  172. package/core/manifest/manifest-loader.js.map +1 -1
  173. package/core/notification/notification.js +4 -0
  174. package/core/notification/notification.js.map +1 -1
  175. package/core/security/authorization-manager.d.ts +44 -0
  176. package/core/security/authorization-manager.js +111 -5
  177. package/core/security/authorization-manager.js.map +1 -1
  178. package/core/security/sign-on-manager.d.ts +109 -0
  179. package/core/security/sign-on-manager.js +119 -0
  180. package/core/security/sign-on-manager.js.map +1 -0
  181. package/core/security/tag-manager.js.map +1 -1
  182. package/core/shared/cluster-inventory/cluster-inventory-cache.js +3 -2
  183. package/core/shared/cluster-inventory/cluster-inventory-cache.js.map +1 -1
  184. package/core/shared/gateway-inventory/gateway-inventory-cache.d.ts +1 -1
  185. package/core/shared/gateway-inventory/gateway-inventory-cache.js +1 -1
  186. package/core/shared/gateway-inventory/gateway-inventory-cache.js.map +1 -1
  187. package/core/shared/server-inventory/server-inventory-cache.js +2 -1
  188. package/core/shared/server-inventory/server-inventory-cache.js.map +1 -1
  189. package/core/shared/tool-inventory/tool-inventory-cache.js +1 -1
  190. package/core/shared/tool-inventory/tool-inventory-cache.js.map +1 -1
  191. package/e2e/assets/strings/cs-CZ/strings.json +1 -1
  192. package/e2e/assets/strings/de-DE/strings.json +1 -1
  193. package/e2e/assets/strings/es-ES/strings.json +1 -1
  194. package/e2e/assets/strings/fr-FR/strings.json +1 -1
  195. package/e2e/assets/strings/hu-HU/strings.json +1 -1
  196. package/e2e/assets/strings/it-IT/strings.json +1 -1
  197. package/e2e/assets/strings/ja-JP/strings.json +1 -1
  198. package/e2e/assets/strings/ko-KR/strings.json +1 -1
  199. package/e2e/assets/strings/nl-NL/strings.json +1 -1
  200. package/e2e/assets/strings/pl-PL/strings.json +1 -1
  201. package/e2e/assets/strings/pt-BR/strings.json +1 -1
  202. package/e2e/assets/strings/pt-PT/strings.json +1 -1
  203. package/e2e/assets/strings/ru-RU/strings.json +1 -1
  204. package/e2e/assets/strings/strings.json +1 -1
  205. package/e2e/assets/strings/sv-SE/strings.json +1 -1
  206. package/e2e/assets/strings/tr-TR/strings.json +1 -1
  207. package/e2e/assets/strings/zh-CN/strings.json +1 -1
  208. package/e2e/assets/strings/zh-TW/strings.json +1 -1
  209. package/package.json +5 -5
  210. package/styles/css/fonts.css +2 -2
  211. package/styles/css/main.css +1 -1
  212. package/styles/fonts/ServMDL2/ServMDL2-4.62.woff +0 -0
  213. package/styles/fonts/ServMDL2/ServMDL2.json +238 -2039
  214. package/styles/fonts/ServMDL2/ServMDL2.scss +238 -2039
  215. package/tools/gulp-manifest-resource/index.js +3 -1
  216. package/tools/gulp-manifest-resource/index.js.map +1 -1
  217. package/tools/gulp-ps-cim/index.js +1 -1
  218. package/tools/gulp-ps-cim/index.js.map +1 -1
  219. package/tools/gulp-ps-cim/powershell-cim-config-schema.json +1 -1
  220. package/tools/gulp-ps-code/index.js +36 -2
  221. package/tools/gulp-ps-code/index.js.map +1 -1
  222. package/tools/gulp-ps-code/ps-code-convert.js +4 -8
  223. package/tools/gulp-ps-code/ps-code-convert.js.map +1 -1
  224. package/tools/gulp-ps-resjson/index.js +79 -74
  225. package/tools/gulp-ps-resjson/index.js.map +1 -1
  226. package/tools/module-template/build/pipelines/codeinspector.yml +27 -0
  227. package/tools/module-template/gulpfile.ts/common/lint.ts +3 -3
  228. package/tools/module-template/gulpfile.ts/common/pack.ts +14 -14
  229. package/tools/module-template/gulpfile.ts/common/ui-test-automation.ts +40 -0
  230. package/tools/module-template/gulpfile.ts/common/utilities.ts +10 -10
  231. package/tools/module-template/gulpfile.ts/common/validate.ts +14 -4
  232. package/tools/module-template/gulpfile.ts/index.ts +20 -8
  233. package/tools/wac-cli/src/upgrade/file-updater.d.ts +1 -0
  234. package/tools/wac-cli/src/upgrade/file-updater.js +7 -1
  235. package/tools/wac-cli/src/upgrade/file-updater.js.map +1 -1
  236. package/styles/fonts/ServMDL2/ServMDL2-4.33.woff +0 -0
@@ -111,8 +111,8 @@ function DataTableComponent_div_7_Template(rf, ctx) { if (rf & 1) {
111
111
  const colIndex_r19 = ctx.index;
112
112
  const ctx_r3 = i0.ɵɵnextContext();
113
113
  i0.ɵɵclassMapInterpolate1("sme-table-caption sme-table-column-header sme-position-flex-auto ", column_r18.styleClass, "");
114
- i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(9, _c13, column_r18.width));
115
- i0.ɵɵattribute("field", column_r18.field);
114
+ i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(11, _c13, column_r18.width));
115
+ i0.ɵɵattribute("field", column_r18.field)("data-uta-id", column_r18.utaId)("column-index", colIndex_r19);
116
116
  i0.ɵɵadvance(1);
117
117
  i0.ɵɵproperty("ngIf", column_r18.sortable && column_r18.sortable != "false" && ctx_r3.showHeader);
118
118
  i0.ɵɵadvance(1);
@@ -824,8 +824,8 @@ function TreeTableComponent_div_7_Template(rf, ctx) { if (rf & 1) {
824
824
  const colIndex_r19 = ctx.index;
825
825
  const ctx_r3 = i0.ɵɵnextContext();
826
826
  i0.ɵɵclassMapInterpolate1("sme-table-caption sme-table-column-header sme-position-flex-auto ", column_r18.styleClass, "");
827
- i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(9, _c13, column_r18.width));
828
- i0.ɵɵattribute("field", column_r18.field);
827
+ i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(11, _c13, column_r18.width));
828
+ i0.ɵɵattribute("field", column_r18.field)("data-uta-id", column_r18.utaId)("column-index", colIndex_r19);
829
829
  i0.ɵɵadvance(1);
830
830
  i0.ɵɵproperty("ngIf", column_r18.sortable && column_r18.sortable != "false" && ctx_r3.showHeader);
831
831
  i0.ɵɵadvance(1);
@@ -3009,6 +3009,13 @@ export class DataTableComponent extends CoreBaseComponent {
3009
3009
  getNoRecordsMessage() {
3010
3010
  return this.noRecordMessage || this.strings.MsftSmeShell.Angular.DataTable.NoRecordsFound;
3011
3011
  }
3012
+ /**
3013
+ * It determines whether to, or not to show the No-Records Message.
3014
+ */
3015
+ showNoRecordsMessage() {
3016
+ return (this.renderedItems.length === 0 && !this.lazyLoad) || !this.isColumnWidthCalculated ||
3017
+ (this.lazyLoad && this.items && this.items.length === 0);
3018
+ }
3012
3019
  /**
3013
3020
  * It handles the behavior that when a group toggle is clicked.
3014
3021
  */
@@ -3411,7 +3418,7 @@ export class DataTableComponent extends CoreBaseComponent {
3411
3418
  return this.items && this.items.length || undefined;
3412
3419
  }
3413
3420
  set virtualCount(value) {
3414
- if (value) {
3421
+ if (value >= 0) {
3415
3422
  this.items = Array(value);
3416
3423
  for (let i = 0; i < value; i++) {
3417
3424
  this.items[i] = null;
@@ -3425,7 +3432,7 @@ export class DataTableComponent extends CoreBaseComponent {
3425
3432
  * An example of path is "location.zipCode".
3426
3433
  */
3427
3434
  resolveObjectPath(obj, path) {
3428
- if (path) {
3435
+ if (obj && path) {
3429
3436
  const pathSegments = path.split('.');
3430
3437
  if (pathSegments.length === 1) {
3431
3438
  return obj[path];
@@ -4056,19 +4063,6 @@ export class DataTableComponent extends CoreBaseComponent {
4056
4063
  if (this.isComponentInitialized && this.renderedItems) {
4057
4064
  // Scroll container is the div to render the view port of the data table and to provide the scroll bar.
4058
4065
  const scrollContainerElement = this.scrollContainerElement.nativeElement;
4059
- // Scroll body is the div to represent the actual data container.
4060
- // Its height is the height needed by all the data table items.
4061
- // When the list is long, this div can be very high and triggers the scroll container to show the scroll bar.
4062
- const scrollBodyElement = this.scrollBodyElement.nativeElement;
4063
- // Scroll data element is the div to show the displayed list items in and below the view port.
4064
- // When the scrolling is happening, we always adjust the top of this div to make sure it remains in the view port.
4065
- const scrollDataElement = this.scrollDataElement.nativeElement;
4066
- // "scroll above data" element is the div show the list items above the view port.
4067
- // We need to render this "above" data seperately
4068
- // then it's easy for us to find the "top" of the displayed list item in the view port.
4069
- // Note: the "scroll below data" is rendered in Scroll data element because we don't need to calculate the "top" for it
4070
- // since anyway it just follow the displayed list items in the view port.
4071
- const scrollAboveDataElement = this.scrollAboveDataElement.nativeElement;
4072
4066
  // Calculates how many items can be rendered in the view port.
4073
4067
  this.renderedItemLengthInViewPort = this.scrollable
4074
4068
  ? Math.min(this.renderedItems.length, scrollContainerElement.offsetHeight / this.rowHeight)
@@ -5049,7 +5043,7 @@ DataTableComponent.pxConverter = new PxConverter();
5049
5043
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.emptyMessageElement = _t.first);
5050
5044
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.lastFocusableShadowElement = _t.first);
5051
5045
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dataTableTemplateLoaderComponents = _t);
5052
- } }, inputs: { isBusy: "isBusy", enableRightClickSelect: "enableRightClickSelect", loadingMessage: "loadingMessage", noRecordMessage: "noRecordMessage", editable: "editable", expandTreeNodeOnChecked: "expandTreeNodeOnChecked", isAllEditableRowsVisible: "isAllEditableRowsVisible", scrollableHorizontal: "scrollableHorizontal", lazyLoad: "lazyLoad", rememberTreeNodeToggle: "rememberTreeNodeToggle", rememberSelection: "rememberSelection", preventEnterKeyForDefaultAction: "preventEnterKeyForDefaultAction", getItemIdentityFunction: "getItemIdentityFunction", disableNaturalSort: "disableNaturalSort", shouldScrollToSelectionAfterSorting: "shouldScrollToSelectionAfterSorting", globalFilter: "globalFilter", caseSensitiveFilter: "caseSensitiveFilter", showAsTree: "showAsTree", editableNewDataItem: "editableNewDataItem", items: "items", selection: "selection", selectionMode: "selectionMode", defaultSortColumn: "defaultSortColumn", defaultSortMode: "defaultSortMode", groupColumn: "groupColumn", groupSortMode: "groupSortMode", useGroupToggle: "useGroupToggle", showHeader: "showHeader", tableAriaLabelledBy: "tableAriaLabelledBy", tableAriaLabel: "tableAriaLabel", showGrid: "showGrid", showAllItemCheckbox: "showAllItemCheckbox", selectAndCheck: "selectAndCheck", rowHeight: "rowHeight", linkParentChildrenSelections: "linkParentChildrenSelections", selectItemWhenNavigatingWithKeyboard: "selectItemWhenNavigatingWithKeyboard", showLeftMargin: "showLeftMargin", scrollable: "scrollable", disableUIVirtualization: "disableUIVirtualization", selectable: "selectable", editableAutoNewRow: "editableAutoNewRow", defaultGroupToggleExpanded: "defaultGroupToggleExpanded", autoRowHeight: "autoRowHeight", virtualCount: "virtualCount" }, outputs: { onChangesetUpdated: "onChangesetUpdated", changesetUpdated: "changesetUpdated", selectionChange: "selectionChange", onRowDblclick: "onRowDblclick", rowDblclick: "rowDblclick", onGroupToggleClicked: "onGroupToggleClicked", groupToggleClick: "groupToggleClick", onNewEditableRowAdded: "onNewEditableRowAdded", editableRowAdded: "editableRowAdded", renderedItemsChange: "renderedItemsChange", lazyLoadingData: "lazyLoadingData", onNodeExpand: "onNodeExpand", nodeExpanded: "nodeExpanded", onNodeCollapsed: "onNodeCollapsed", nodeCollapsed: "nodeCollapsed", onNodeSelect: "onNodeSelect", nodeSelected: "nodeSelected", itemsChange: "itemsChange", onFilter: "onFilter", filter: "filter", doCustomSort: "doCustomSort", onRowSelect: "onRowSelect", rowSelected: "rowSelected", onRowUnselect: "onRowUnselect", rowUnselected: "rowUnselected" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 30, vars: 45, consts: [["role", "presentation", 1, "sme-table-header", "sme-focus-zone", "sme-data-table-transition"], ["header", ""], ["role", "rowgroup", 1, "sme-table", "sme-table-virtualized"], ["headerTable", ""], ["role", "row", 1, "sme-table-row", "sme-arrange-stack-h", "sme-position-flex-auto", 3, "keydown"], [1, "sme-table-caption"], ["class", "sme-table-checkbox sme-table-header-checkbox", "role", "presentation", 4, "ngIf"], ["role", "presentation", 3, "ngStyle", "class", 4, "ngFor", "ngForOf"], ["role", "presentation", 1, "sme-focus-zone", "sme-table-container", "sme-data-table-transition"], ["content", ""], ["role", "rowgroup", 1, "sme-table-scroll-container", "sme-layout-absolute", "sme-position-inset-none", 3, "ngClass"], ["scrollContainer", ""], ["role", "row", "class", "sme-table-row sme-table-row-placeholder", "tabindex", "0", 4, "ngIf"], ["role", "presentation", 1, "sme-layout-relative", "sme-position-stretch-h", "sme-arrange-overflow-hide"], ["scrollBody", ""], ["sme-lint-disable", "", 1, "sme-table", "sme-table-scrollable", "sme-table-virtualized", 3, "ngStyle"], ["scrollAboveData", ""], ["class", "sme-table-row sme-table-row-data sme-table-row-selectable", 3, "sme-table-row-active", "sme-table-row-selected", "sme-table-group-item", "sme-table-group-header", "sme-checked", 4, "ngFor", "ngForOf"], ["sme-lint-disable", "", "role", "presentation", 1, "sme-table", "sme-table-scrollable", 3, "ngStyle"], ["scrollData", ""], ["class", "sme-table-row sme-table-row-data sme-table-row-selectable", "role", "row", 3, "sme-table-row-active", "sme-table-row-selected", "sme-table-group-item", "sme-table-group-header", "sme-checked", "sme-table-row-editable", "sme-has-validation-error", "sme-data-table-row-new-item", "keydown", "keyup", "contextmenu", "click", "dblclick", "focus", "focusin", "focusout", "mouseenter", "mouseleave", 4, "ngFor", "ngForOf"], [1, "sme-table-row"], ["tempRow", ""], ["tabindex", "0", 1, "sme-table-td"], [1, "sme-table-cell"], ["class", "sme-focus-zone", "data-sme-last-focusable-shadow-element", "", "tabindex", "0", 3, "focus", 4, "ngIf"], ["class", "sme-layout-absolute sme-position-inset-none", 4, "ngIf"], [1, "sme-width-xxs", "sme-layout-absolute", "sme-position-stretch-v", "sme-background-color-base-80", "sme-layer-flyout", "sme-layout-none"], ["resizerIndicator", ""], ["role", "presentation", 1, "sme-table-checkbox", "sme-table-header-checkbox"], ["sme-lint-disable-self", "", "type", "checkbox", 3, "checked", "change"], ["role", "presentation"], ["role", "presentation", 3, "ngStyle"], ["class", "sme-table-header-cell sme-focus-zone", "role", "columnheader", "aria-live", "polite", "tabindex", "0", 3, "title", "click", 4, "ngIf"], ["class", "sme-table-header-cell", "role", "columnheader", 3, "title", 4, "ngIf"], ["class", "sme-table-header-cell", "role", "columnheader", 4, "ngIf"], ["tabindex", "0", "resizerHostSelector", "div.sme-table-header", "orientation", "left", "class", "sme-focus-zone", 3, "visibleToScreenReader", "showResizerCover", "resized", "resizing", 4, "ngIf"], ["role", "columnheader", "aria-live", "polite", "tabindex", "0", 1, "sme-table-header-cell", "sme-focus-zone", 3, "title", "click"], [1, "sme-icon", "sme-margin-left-xxs", 3, "ngClass"], ["role", "columnheader", 1, "sme-table-header-cell", 3, "title"], ["role", "columnheader", 1, "sme-table-header-cell"], ["tabindex", "0", "resizerHostSelector", "div.sme-table-header", "orientation", "left", 1, "sme-focus-zone", 3, "visibleToScreenReader", "showResizerCover", "resized", "resizing"], ["role", "row", "tabindex", "0", 1, "sme-table-row", "sme-table-row-placeholder"], ["emptyMessage", ""], [3, "message", 4, "ngIf"], [1, "sme-table-cell", "sme-table-cell-placeholder"], ["role", "cell", 1, "sme-table-cell"], [3, "message"], [1, "sme-table-row", "sme-table-row-data", "sme-table-row-selectable"], [1, "sme-arrange-stack-h"], [1, "sme-table-td", "sme-position-flex-auto"], ["class", "sme-table-checkbox", "role", "presentation", 4, "ngIf"], [3, "ngClass", "ngStyle", "class", 4, "ngFor", "ngForOf"], ["role", "presentation", 1, "sme-table-checkbox"], ["type", "checkbox", 3, "checked"], [3, "ngClass", "ngStyle"], ["class", "sme-screen-reader sme-screen-reader-disable-copy", 4, "ngIf"], ["class", "sme-table-cell", 3, "click", 4, "ngIf"], ["class", "sme-table-expander-cell", 3, "ngStyle", "ngClass", 4, "ngIf"], ["class", "sme-table-expander-cell", 3, "ngStyle", 4, "ngIf"], ["class", "sme-table-cell sme-table-checkbox-container", "role", "presentation", 4, "ngIf"], [4, "ngIf"], [1, "sme-screen-reader", "sme-screen-reader-disable-copy"], [1, "sme-table-cell", 3, "click"], ["class", "sme-icon sme-icon-size-xxs sme-margin-right-xxs", 3, "ngClass", 4, "ngIf"], [1, "sme-icon", "sme-icon-size-xxs", "sme-margin-right-xxs", 3, "ngClass"], [3, "template", "data"], [1, "sme-table-expander-cell", 3, "ngStyle", "ngClass"], ["role", "button", 1, "sme-icon", "sme-icon-size-xxs", 3, "ngClass", "click"], [1, "sme-table-expander-cell-placeholder"], [1, "sme-table-expander-cell", 3, "ngStyle"], ["size", "extra-small", 3, "inline", "isBackgroundTransparent"], ["role", "presentation", 1, "sme-table-cell", "sme-table-checkbox-container"], ["type", "checkbox", 3, "checked", "change"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", 4, "ngIf"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", "sme-table-cell-height-auto", 4, "ngIf"], [3, "template", "data", "rowIndex", 4, "ngIf"], [3, "template", "data", "rowIndex"], ["role", "row", 1, "sme-table-row", "sme-table-row-data", "sme-table-row-selectable", 3, "keydown", "keyup", "contextmenu", "click", "dblclick", "focus", "focusin", "focusout", "mouseenter", "mouseleave"], ["role", "presentation", 1, "sme-arrange-stack-h"], ["class", "sme-table-cell sme-table-checkbox-container", "role", "presentation", 3, "sme-table-cell-full-height", 4, "ngIf"], ["class", "sme-table-row-validation", 4, "ngIf"], ["class", "sme-table-cell", 3, "id", "click", 4, "ngIf"], [1, "sme-table-cell", 3, "id", "click"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", "id", 4, "ngIf"], ["class", "sme-table-cell", 3, "sme-table-cell-height-auto", "sme-table-cell-full-height", "id", 4, "ngIf"], [1, "sme-table-cell", 3, "id"], ["class", "sme-table-cell", 4, "ngIf"], [3, "renderedItem", "template", "data", "rowIndex", 4, "ngIf"], [3, "renderedItem", "template", "data", "rowIndex"], ["class", "sme-table-cell sme-table-edit-container", 4, "ngIf"], [1, "sme-table-cell", "sme-table-edit-container"], [3, "template", "field", "data", "rowIndex", "renderedItem", "validationAlert", "dataChanged", 4, "ngIf"], [3, "template", "field", "data", "rowIndex", "renderedItem", "validationAlert", "dataChanged"], [1, "sme-table-row-validation"], ["role", "presentation", 1, "sme-table-cell"], [4, "ngFor", "ngForOf"], [3, "alert"], ["data-sme-last-focusable-shadow-element", "", "tabindex", "0", 1, "sme-focus-zone", 3, "focus"], ["lastFocusableShadowElement", ""], [1, "sme-layout-absolute", "sme-position-inset-none"], [3, "isBackgroundTransparent"]], template: function DataTableComponent_Template(rf, ctx) { if (rf & 1) {
5046
+ } }, inputs: { isBusy: "isBusy", enableRightClickSelect: "enableRightClickSelect", loadingMessage: "loadingMessage", noRecordMessage: "noRecordMessage", editable: "editable", expandTreeNodeOnChecked: "expandTreeNodeOnChecked", isAllEditableRowsVisible: "isAllEditableRowsVisible", scrollableHorizontal: "scrollableHorizontal", lazyLoad: "lazyLoad", rememberTreeNodeToggle: "rememberTreeNodeToggle", rememberSelection: "rememberSelection", preventEnterKeyForDefaultAction: "preventEnterKeyForDefaultAction", getItemIdentityFunction: "getItemIdentityFunction", disableNaturalSort: "disableNaturalSort", shouldScrollToSelectionAfterSorting: "shouldScrollToSelectionAfterSorting", globalFilter: "globalFilter", caseSensitiveFilter: "caseSensitiveFilter", showAsTree: "showAsTree", editableNewDataItem: "editableNewDataItem", items: "items", selection: "selection", selectionMode: "selectionMode", defaultSortColumn: "defaultSortColumn", defaultSortMode: "defaultSortMode", groupColumn: "groupColumn", groupSortMode: "groupSortMode", useGroupToggle: "useGroupToggle", showHeader: "showHeader", tableAriaLabelledBy: "tableAriaLabelledBy", tableAriaLabel: "tableAriaLabel", showGrid: "showGrid", showAllItemCheckbox: "showAllItemCheckbox", selectAndCheck: "selectAndCheck", rowHeight: "rowHeight", linkParentChildrenSelections: "linkParentChildrenSelections", selectItemWhenNavigatingWithKeyboard: "selectItemWhenNavigatingWithKeyboard", showLeftMargin: "showLeftMargin", scrollable: "scrollable", disableUIVirtualization: "disableUIVirtualization", selectable: "selectable", editableAutoNewRow: "editableAutoNewRow", defaultGroupToggleExpanded: "defaultGroupToggleExpanded", autoRowHeight: "autoRowHeight", virtualCount: "virtualCount" }, outputs: { onChangesetUpdated: "onChangesetUpdated", changesetUpdated: "changesetUpdated", selectionChange: "selectionChange", onRowDblclick: "onRowDblclick", rowDblclick: "rowDblclick", onGroupToggleClicked: "onGroupToggleClicked", groupToggleClick: "groupToggleClick", onNewEditableRowAdded: "onNewEditableRowAdded", editableRowAdded: "editableRowAdded", renderedItemsChange: "renderedItemsChange", lazyLoadingData: "lazyLoadingData", onNodeExpand: "onNodeExpand", nodeExpanded: "nodeExpanded", onNodeCollapsed: "onNodeCollapsed", nodeCollapsed: "nodeCollapsed", onNodeSelect: "onNodeSelect", nodeSelected: "nodeSelected", itemsChange: "itemsChange", onFilter: "onFilter", filter: "filter", doCustomSort: "doCustomSort", onRowSelect: "onRowSelect", rowSelected: "rowSelected", onRowUnselect: "onRowUnselect", rowUnselected: "rowUnselected" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 30, vars: 45, consts: [["role", "presentation", 1, "sme-table-header", "sme-focus-zone", "sme-data-table-transition"], ["header", ""], ["role", "rowgroup", 1, "sme-table", "sme-table-virtualized"], ["headerTable", ""], ["role", "row", 1, "sme-table-row", "sme-arrange-stack-h", "sme-position-flex-auto", 3, "keydown"], ["data-uta-id", "checkboxColumn", 1, "sme-table-caption"], ["class", "sme-table-checkbox sme-table-header-checkbox", "role", "presentation", 4, "ngIf"], ["role", "presentation", 3, "ngStyle", "class", 4, "ngFor", "ngForOf"], ["role", "presentation", 1, "sme-focus-zone", "sme-table-container", "sme-data-table-transition"], ["content", ""], ["role", "rowgroup", 1, "sme-table-scroll-container", "sme-layout-absolute", "sme-position-inset-none", 3, "ngClass"], ["scrollContainer", ""], ["role", "row", "class", "sme-table-row sme-table-row-placeholder", "tabindex", "0", "data-uta-id", "empty-table-message", 4, "ngIf"], ["role", "presentation", 1, "sme-layout-relative", "sme-position-stretch-h", "sme-arrange-overflow-hide"], ["scrollBody", ""], ["sme-lint-disable", "", 1, "sme-table", "sme-table-scrollable", "sme-table-virtualized", 3, "ngStyle"], ["scrollAboveData", ""], ["class", "sme-table-row sme-table-row-data sme-table-row-selectable", 3, "sme-table-row-active", "sme-table-row-selected", "sme-table-group-item", "sme-table-group-header", "sme-checked", 4, "ngFor", "ngForOf"], ["sme-lint-disable", "", "role", "presentation", 1, "sme-table", "sme-table-scrollable", 3, "ngStyle"], ["scrollData", ""], ["class", "sme-table-row sme-table-row-data sme-table-row-selectable", "role", "row", 3, "sme-table-row-active", "sme-table-row-selected", "sme-table-group-item", "sme-table-group-header", "sme-checked", "sme-table-row-editable", "sme-has-validation-error", "sme-data-table-row-new-item", "keydown", "keyup", "contextmenu", "click", "dblclick", "focus", "focusin", "focusout", "mouseenter", "mouseleave", 4, "ngFor", "ngForOf"], [1, "sme-table-row"], ["tempRow", ""], ["tabindex", "0", 1, "sme-table-td"], [1, "sme-table-cell"], ["class", "sme-focus-zone", "data-sme-last-focusable-shadow-element", "", "tabindex", "0", 3, "focus", 4, "ngIf"], ["class", "sme-layout-absolute sme-position-inset-none", 4, "ngIf"], [1, "sme-width-xxs", "sme-layout-absolute", "sme-position-stretch-v", "sme-background-color-base-80", "sme-layer-flyout", "sme-layout-none"], ["resizerIndicator", ""], ["role", "presentation", 1, "sme-table-checkbox", "sme-table-header-checkbox"], ["sme-lint-disable-self", "", "type", "checkbox", 3, "checked", "change"], ["role", "presentation"], ["role", "presentation", 3, "ngStyle"], ["class", "sme-table-header-cell sme-focus-zone", "role", "columnheader", "aria-live", "polite", "tabindex", "0", 3, "title", "click", 4, "ngIf"], ["class", "sme-table-header-cell", "role", "columnheader", 3, "title", 4, "ngIf"], ["class", "sme-table-header-cell", "role", "columnheader", 4, "ngIf"], ["tabindex", "0", "resizerHostSelector", "div.sme-table-header", "orientation", "left", "class", "sme-focus-zone", 3, "visibleToScreenReader", "showResizerCover", "resized", "resizing", 4, "ngIf"], ["role", "columnheader", "aria-live", "polite", "tabindex", "0", 1, "sme-table-header-cell", "sme-focus-zone", 3, "title", "click"], [1, "sme-icon", "sme-margin-left-xxs", 3, "ngClass"], ["role", "columnheader", 1, "sme-table-header-cell", 3, "title"], ["role", "columnheader", 1, "sme-table-header-cell"], ["tabindex", "0", "resizerHostSelector", "div.sme-table-header", "orientation", "left", 1, "sme-focus-zone", 3, "visibleToScreenReader", "showResizerCover", "resized", "resizing"], ["role", "row", "tabindex", "0", "data-uta-id", "empty-table-message", 1, "sme-table-row", "sme-table-row-placeholder"], ["emptyMessage", ""], [3, "message", 4, "ngIf"], [1, "sme-table-cell", "sme-table-cell-placeholder"], ["role", "cell", 1, "sme-table-cell"], [3, "message"], [1, "sme-table-row", "sme-table-row-data", "sme-table-row-selectable"], [1, "sme-arrange-stack-h"], [1, "sme-table-td", "sme-position-flex-auto"], ["class", "sme-table-checkbox", "role", "presentation", 4, "ngIf"], [3, "ngClass", "ngStyle", "class", 4, "ngFor", "ngForOf"], ["role", "presentation", 1, "sme-table-checkbox"], ["type", "checkbox", 3, "checked"], [3, "ngClass", "ngStyle"], ["class", "sme-screen-reader sme-screen-reader-disable-copy", 4, "ngIf"], ["class", "sme-table-cell", 3, "click", 4, "ngIf"], ["class", "sme-table-expander-cell", 3, "ngStyle", "ngClass", 4, "ngIf"], ["class", "sme-table-expander-cell", 3, "ngStyle", 4, "ngIf"], ["class", "sme-table-cell sme-table-checkbox-container", "role", "presentation", 4, "ngIf"], [4, "ngIf"], [1, "sme-screen-reader", "sme-screen-reader-disable-copy"], [1, "sme-table-cell", 3, "click"], ["class", "sme-icon sme-icon-size-xxs sme-margin-right-xxs", 3, "ngClass", 4, "ngIf"], [1, "sme-icon", "sme-icon-size-xxs", "sme-margin-right-xxs", 3, "ngClass"], [3, "template", "data"], [1, "sme-table-expander-cell", 3, "ngStyle", "ngClass"], ["role", "button", 1, "sme-icon", "sme-icon-size-xxs", 3, "ngClass", "click"], [1, "sme-table-expander-cell-placeholder"], [1, "sme-table-expander-cell", 3, "ngStyle"], ["size", "extra-small", 3, "inline", "isBackgroundTransparent"], ["role", "presentation", 1, "sme-table-cell", "sme-table-checkbox-container"], ["type", "checkbox", 3, "checked", "change"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", 4, "ngIf"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", "sme-table-cell-height-auto", 4, "ngIf"], [3, "template", "data", "rowIndex", 4, "ngIf"], [3, "template", "data", "rowIndex"], ["role", "row", 1, "sme-table-row", "sme-table-row-data", "sme-table-row-selectable", 3, "keydown", "keyup", "contextmenu", "click", "dblclick", "focus", "focusin", "focusout", "mouseenter", "mouseleave"], ["role", "presentation", 1, "sme-arrange-stack-h"], ["class", "sme-table-cell sme-table-checkbox-container", "role", "presentation", 3, "sme-table-cell-full-height", 4, "ngIf"], ["class", "sme-table-row-validation", 4, "ngIf"], ["class", "sme-table-cell", 3, "id", "click", 4, "ngIf"], [1, "sme-table-cell", 3, "id", "click"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", "id", 4, "ngIf"], ["class", "sme-table-cell", 3, "sme-table-cell-height-auto", "sme-table-cell-full-height", "id", 4, "ngIf"], [1, "sme-table-cell", 3, "id"], ["class", "sme-table-cell", 4, "ngIf"], [3, "renderedItem", "template", "data", "rowIndex", 4, "ngIf"], [3, "renderedItem", "template", "data", "rowIndex"], ["class", "sme-table-cell sme-table-edit-container", 4, "ngIf"], [1, "sme-table-cell", "sme-table-edit-container"], [3, "template", "field", "data", "rowIndex", "renderedItem", "validationAlert", "dataChanged", 4, "ngIf"], [3, "template", "field", "data", "rowIndex", "renderedItem", "validationAlert", "dataChanged"], [1, "sme-table-row-validation"], ["role", "presentation", 1, "sme-table-cell"], [4, "ngFor", "ngForOf"], [3, "alert"], ["data-sme-last-focusable-shadow-element", "", "tabindex", "0", 1, "sme-focus-zone", 3, "focus"], ["lastFocusableShadowElement", ""], [1, "sme-layout-absolute", "sme-position-inset-none"], [3, "isBackgroundTransparent"]], template: function DataTableComponent_Template(rf, ctx) { if (rf & 1) {
5053
5047
  i0.ɵɵelementStart(0, "div", 0, 1);
5054
5048
  i0.ɵɵelementStart(2, "div", 2, 3);
5055
5049
  i0.ɵɵelementStart(4, "div", 4);
@@ -5057,7 +5051,7 @@ DataTableComponent.pxConverter = new PxConverter();
5057
5051
  i0.ɵɵelementStart(5, "div", 5);
5058
5052
  i0.ɵɵtemplate(6, DataTableComponent_div_6_Template, 3, 3, "div", 6);
5059
5053
  i0.ɵɵelementEnd();
5060
- i0.ɵɵtemplate(7, DataTableComponent_div_7_Template, 5, 11, "div", 7);
5054
+ i0.ɵɵtemplate(7, DataTableComponent_div_7_Template, 5, 13, "div", 7);
5061
5055
  i0.ɵɵelementEnd();
5062
5056
  i0.ɵɵelementEnd();
5063
5057
  i0.ɵɵelementEnd();
@@ -5097,7 +5091,7 @@ DataTableComponent.pxConverter = new PxConverter();
5097
5091
  i0.ɵɵadvance(2);
5098
5092
  i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(38, _c18, ctx.scrollable, ctx.shouldScroll));
5099
5093
  i0.ɵɵadvance(2);
5100
- i0.ɵɵproperty("ngIf", ctx.renderedItems.length === 0 && !ctx.lazyLoad || !ctx.isColumnWidthCalculated);
5094
+ i0.ɵɵproperty("ngIf", ctx.showNoRecordsMessage());
5101
5095
  i0.ɵɵadvance(3);
5102
5096
  i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(41, _c19, ctx.scrollAboveDataStyleTop));
5103
5097
  i0.ɵɵattribute("aria-hidden", true);
@@ -5357,7 +5351,7 @@ export class TreeTableComponent extends DataTableComponent {
5357
5351
  }
5358
5352
  }
5359
5353
  /** @nocollapse */ TreeTableComponent.ɵfac = function TreeTableComponent_Factory(t) { return new (t || TreeTableComponent)(i0.ɵɵdirectiveInject(i0.Injector)); };
5360
- /** @nocollapse */ TreeTableComponent.ɵcmp = i0.ɵɵdefineComponent({ type: TreeTableComponent, selectors: [["sme-tree-table"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 30, vars: 45, consts: [["role", "presentation", 1, "sme-table-header", "sme-focus-zone", "sme-data-table-transition"], ["header", ""], ["role", "rowgroup", 1, "sme-table", "sme-table-virtualized"], ["headerTable", ""], ["role", "row", 1, "sme-table-row", "sme-arrange-stack-h", "sme-position-flex-auto", 3, "keydown"], [1, "sme-table-caption"], ["class", "sme-table-checkbox sme-table-header-checkbox", "role", "presentation", 4, "ngIf"], ["role", "presentation", 3, "ngStyle", "class", 4, "ngFor", "ngForOf"], ["role", "presentation", 1, "sme-focus-zone", "sme-table-container", "sme-data-table-transition"], ["content", ""], ["role", "rowgroup", 1, "sme-table-scroll-container", "sme-layout-absolute", "sme-position-inset-none", 3, "ngClass"], ["scrollContainer", ""], ["role", "row", "class", "sme-table-row sme-table-row-placeholder", "tabindex", "0", 4, "ngIf"], ["role", "presentation", 1, "sme-layout-relative", "sme-position-stretch-h", "sme-arrange-overflow-hide"], ["scrollBody", ""], ["sme-lint-disable", "", 1, "sme-table", "sme-table-scrollable", "sme-table-virtualized", 3, "ngStyle"], ["scrollAboveData", ""], ["class", "sme-table-row sme-table-row-data sme-table-row-selectable", 3, "sme-table-row-active", "sme-table-row-selected", "sme-table-group-item", "sme-table-group-header", "sme-checked", 4, "ngFor", "ngForOf"], ["sme-lint-disable", "", "role", "presentation", 1, "sme-table", "sme-table-scrollable", 3, "ngStyle"], ["scrollData", ""], ["class", "sme-table-row sme-table-row-data sme-table-row-selectable", "role", "row", 3, "sme-table-row-active", "sme-table-row-selected", "sme-table-group-item", "sme-table-group-header", "sme-checked", "sme-table-row-editable", "sme-has-validation-error", "sme-data-table-row-new-item", "keydown", "keyup", "contextmenu", "click", "dblclick", "focus", "focusin", "focusout", "mouseenter", "mouseleave", 4, "ngFor", "ngForOf"], [1, "sme-table-row"], ["tempRow", ""], ["tabindex", "0", 1, "sme-table-td"], [1, "sme-table-cell"], ["class", "sme-focus-zone", "data-sme-last-focusable-shadow-element", "", "tabindex", "0", 3, "focus", 4, "ngIf"], ["class", "sme-layout-absolute sme-position-inset-none", 4, "ngIf"], [1, "sme-width-xxs", "sme-layout-absolute", "sme-position-stretch-v", "sme-background-color-base-80", "sme-layer-flyout", "sme-layout-none"], ["resizerIndicator", ""], ["role", "presentation", 1, "sme-table-checkbox", "sme-table-header-checkbox"], ["sme-lint-disable-self", "", "type", "checkbox", 3, "checked", "change"], ["role", "presentation"], ["role", "presentation", 3, "ngStyle"], ["class", "sme-table-header-cell sme-focus-zone", "role", "columnheader", "aria-live", "polite", "tabindex", "0", 3, "title", "click", 4, "ngIf"], ["class", "sme-table-header-cell", "role", "columnheader", 3, "title", 4, "ngIf"], ["class", "sme-table-header-cell", "role", "columnheader", 4, "ngIf"], ["tabindex", "0", "resizerHostSelector", "div.sme-table-header", "orientation", "left", "class", "sme-focus-zone", 3, "visibleToScreenReader", "showResizerCover", "resized", "resizing", 4, "ngIf"], ["role", "columnheader", "aria-live", "polite", "tabindex", "0", 1, "sme-table-header-cell", "sme-focus-zone", 3, "title", "click"], [1, "sme-icon", "sme-margin-left-xxs", 3, "ngClass"], ["role", "columnheader", 1, "sme-table-header-cell", 3, "title"], ["role", "columnheader", 1, "sme-table-header-cell"], ["tabindex", "0", "resizerHostSelector", "div.sme-table-header", "orientation", "left", 1, "sme-focus-zone", 3, "visibleToScreenReader", "showResizerCover", "resized", "resizing"], ["role", "row", "tabindex", "0", 1, "sme-table-row", "sme-table-row-placeholder"], ["emptyMessage", ""], [3, "message", 4, "ngIf"], [1, "sme-table-cell", "sme-table-cell-placeholder"], ["role", "cell", 1, "sme-table-cell"], [3, "message"], [1, "sme-table-row", "sme-table-row-data", "sme-table-row-selectable"], [1, "sme-arrange-stack-h"], [1, "sme-table-td", "sme-position-flex-auto"], ["class", "sme-table-checkbox", "role", "presentation", 4, "ngIf"], [3, "ngClass", "ngStyle", "class", 4, "ngFor", "ngForOf"], ["role", "presentation", 1, "sme-table-checkbox"], ["type", "checkbox", 3, "checked"], [3, "ngClass", "ngStyle"], ["class", "sme-screen-reader sme-screen-reader-disable-copy", 4, "ngIf"], ["class", "sme-table-cell", 3, "click", 4, "ngIf"], ["class", "sme-table-expander-cell", 3, "ngStyle", "ngClass", 4, "ngIf"], ["class", "sme-table-expander-cell", 3, "ngStyle", 4, "ngIf"], ["class", "sme-table-cell sme-table-checkbox-container", "role", "presentation", 4, "ngIf"], [4, "ngIf"], [1, "sme-screen-reader", "sme-screen-reader-disable-copy"], [1, "sme-table-cell", 3, "click"], ["class", "sme-icon sme-icon-size-xxs sme-margin-right-xxs", 3, "ngClass", 4, "ngIf"], [1, "sme-icon", "sme-icon-size-xxs", "sme-margin-right-xxs", 3, "ngClass"], [3, "template", "data"], [1, "sme-table-expander-cell", 3, "ngStyle", "ngClass"], ["role", "button", 1, "sme-icon", "sme-icon-size-xxs", 3, "ngClass", "click"], [1, "sme-table-expander-cell-placeholder"], [1, "sme-table-expander-cell", 3, "ngStyle"], ["size", "extra-small", 3, "inline", "isBackgroundTransparent"], ["role", "presentation", 1, "sme-table-cell", "sme-table-checkbox-container"], ["type", "checkbox", 3, "checked", "change"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", 4, "ngIf"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", "sme-table-cell-height-auto", 4, "ngIf"], [3, "template", "data", "rowIndex", 4, "ngIf"], [3, "template", "data", "rowIndex"], ["role", "row", 1, "sme-table-row", "sme-table-row-data", "sme-table-row-selectable", 3, "keydown", "keyup", "contextmenu", "click", "dblclick", "focus", "focusin", "focusout", "mouseenter", "mouseleave"], ["role", "presentation", 1, "sme-arrange-stack-h"], ["class", "sme-table-cell sme-table-checkbox-container", "role", "presentation", 3, "sme-table-cell-full-height", 4, "ngIf"], ["class", "sme-table-row-validation", 4, "ngIf"], ["class", "sme-table-cell", 3, "id", "click", 4, "ngIf"], [1, "sme-table-cell", 3, "id", "click"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", "id", 4, "ngIf"], ["class", "sme-table-cell", 3, "sme-table-cell-height-auto", "sme-table-cell-full-height", "id", 4, "ngIf"], [1, "sme-table-cell", 3, "id"], ["class", "sme-table-cell", 4, "ngIf"], [3, "renderedItem", "template", "data", "rowIndex", 4, "ngIf"], [3, "renderedItem", "template", "data", "rowIndex"], ["class", "sme-table-cell sme-table-edit-container", 4, "ngIf"], [1, "sme-table-cell", "sme-table-edit-container"], [3, "template", "field", "data", "rowIndex", "renderedItem", "validationAlert", "dataChanged", 4, "ngIf"], [3, "template", "field", "data", "rowIndex", "renderedItem", "validationAlert", "dataChanged"], [1, "sme-table-row-validation"], ["role", "presentation", 1, "sme-table-cell"], [4, "ngFor", "ngForOf"], [3, "alert"], ["data-sme-last-focusable-shadow-element", "", "tabindex", "0", 1, "sme-focus-zone", 3, "focus"], ["lastFocusableShadowElement", ""], [1, "sme-layout-absolute", "sme-position-inset-none"], [3, "isBackgroundTransparent"]], template: function TreeTableComponent_Template(rf, ctx) { if (rf & 1) {
5354
+ /** @nocollapse */ TreeTableComponent.ɵcmp = i0.ɵɵdefineComponent({ type: TreeTableComponent, selectors: [["sme-tree-table"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 30, vars: 45, consts: [["role", "presentation", 1, "sme-table-header", "sme-focus-zone", "sme-data-table-transition"], ["header", ""], ["role", "rowgroup", 1, "sme-table", "sme-table-virtualized"], ["headerTable", ""], ["role", "row", 1, "sme-table-row", "sme-arrange-stack-h", "sme-position-flex-auto", 3, "keydown"], ["data-uta-id", "checkboxColumn", 1, "sme-table-caption"], ["class", "sme-table-checkbox sme-table-header-checkbox", "role", "presentation", 4, "ngIf"], ["role", "presentation", 3, "ngStyle", "class", 4, "ngFor", "ngForOf"], ["role", "presentation", 1, "sme-focus-zone", "sme-table-container", "sme-data-table-transition"], ["content", ""], ["role", "rowgroup", 1, "sme-table-scroll-container", "sme-layout-absolute", "sme-position-inset-none", 3, "ngClass"], ["scrollContainer", ""], ["role", "row", "class", "sme-table-row sme-table-row-placeholder", "tabindex", "0", "data-uta-id", "empty-table-message", 4, "ngIf"], ["role", "presentation", 1, "sme-layout-relative", "sme-position-stretch-h", "sme-arrange-overflow-hide"], ["scrollBody", ""], ["sme-lint-disable", "", 1, "sme-table", "sme-table-scrollable", "sme-table-virtualized", 3, "ngStyle"], ["scrollAboveData", ""], ["class", "sme-table-row sme-table-row-data sme-table-row-selectable", 3, "sme-table-row-active", "sme-table-row-selected", "sme-table-group-item", "sme-table-group-header", "sme-checked", 4, "ngFor", "ngForOf"], ["sme-lint-disable", "", "role", "presentation", 1, "sme-table", "sme-table-scrollable", 3, "ngStyle"], ["scrollData", ""], ["class", "sme-table-row sme-table-row-data sme-table-row-selectable", "role", "row", 3, "sme-table-row-active", "sme-table-row-selected", "sme-table-group-item", "sme-table-group-header", "sme-checked", "sme-table-row-editable", "sme-has-validation-error", "sme-data-table-row-new-item", "keydown", "keyup", "contextmenu", "click", "dblclick", "focus", "focusin", "focusout", "mouseenter", "mouseleave", 4, "ngFor", "ngForOf"], [1, "sme-table-row"], ["tempRow", ""], ["tabindex", "0", 1, "sme-table-td"], [1, "sme-table-cell"], ["class", "sme-focus-zone", "data-sme-last-focusable-shadow-element", "", "tabindex", "0", 3, "focus", 4, "ngIf"], ["class", "sme-layout-absolute sme-position-inset-none", 4, "ngIf"], [1, "sme-width-xxs", "sme-layout-absolute", "sme-position-stretch-v", "sme-background-color-base-80", "sme-layer-flyout", "sme-layout-none"], ["resizerIndicator", ""], ["role", "presentation", 1, "sme-table-checkbox", "sme-table-header-checkbox"], ["sme-lint-disable-self", "", "type", "checkbox", 3, "checked", "change"], ["role", "presentation"], ["role", "presentation", 3, "ngStyle"], ["class", "sme-table-header-cell sme-focus-zone", "role", "columnheader", "aria-live", "polite", "tabindex", "0", 3, "title", "click", 4, "ngIf"], ["class", "sme-table-header-cell", "role", "columnheader", 3, "title", 4, "ngIf"], ["class", "sme-table-header-cell", "role", "columnheader", 4, "ngIf"], ["tabindex", "0", "resizerHostSelector", "div.sme-table-header", "orientation", "left", "class", "sme-focus-zone", 3, "visibleToScreenReader", "showResizerCover", "resized", "resizing", 4, "ngIf"], ["role", "columnheader", "aria-live", "polite", "tabindex", "0", 1, "sme-table-header-cell", "sme-focus-zone", 3, "title", "click"], [1, "sme-icon", "sme-margin-left-xxs", 3, "ngClass"], ["role", "columnheader", 1, "sme-table-header-cell", 3, "title"], ["role", "columnheader", 1, "sme-table-header-cell"], ["tabindex", "0", "resizerHostSelector", "div.sme-table-header", "orientation", "left", 1, "sme-focus-zone", 3, "visibleToScreenReader", "showResizerCover", "resized", "resizing"], ["role", "row", "tabindex", "0", "data-uta-id", "empty-table-message", 1, "sme-table-row", "sme-table-row-placeholder"], ["emptyMessage", ""], [3, "message", 4, "ngIf"], [1, "sme-table-cell", "sme-table-cell-placeholder"], ["role", "cell", 1, "sme-table-cell"], [3, "message"], [1, "sme-table-row", "sme-table-row-data", "sme-table-row-selectable"], [1, "sme-arrange-stack-h"], [1, "sme-table-td", "sme-position-flex-auto"], ["class", "sme-table-checkbox", "role", "presentation", 4, "ngIf"], [3, "ngClass", "ngStyle", "class", 4, "ngFor", "ngForOf"], ["role", "presentation", 1, "sme-table-checkbox"], ["type", "checkbox", 3, "checked"], [3, "ngClass", "ngStyle"], ["class", "sme-screen-reader sme-screen-reader-disable-copy", 4, "ngIf"], ["class", "sme-table-cell", 3, "click", 4, "ngIf"], ["class", "sme-table-expander-cell", 3, "ngStyle", "ngClass", 4, "ngIf"], ["class", "sme-table-expander-cell", 3, "ngStyle", 4, "ngIf"], ["class", "sme-table-cell sme-table-checkbox-container", "role", "presentation", 4, "ngIf"], [4, "ngIf"], [1, "sme-screen-reader", "sme-screen-reader-disable-copy"], [1, "sme-table-cell", 3, "click"], ["class", "sme-icon sme-icon-size-xxs sme-margin-right-xxs", 3, "ngClass", 4, "ngIf"], [1, "sme-icon", "sme-icon-size-xxs", "sme-margin-right-xxs", 3, "ngClass"], [3, "template", "data"], [1, "sme-table-expander-cell", 3, "ngStyle", "ngClass"], ["role", "button", 1, "sme-icon", "sme-icon-size-xxs", 3, "ngClass", "click"], [1, "sme-table-expander-cell-placeholder"], [1, "sme-table-expander-cell", 3, "ngStyle"], ["size", "extra-small", 3, "inline", "isBackgroundTransparent"], ["role", "presentation", 1, "sme-table-cell", "sme-table-checkbox-container"], ["type", "checkbox", 3, "checked", "change"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", 4, "ngIf"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", "sme-table-cell-height-auto", 4, "ngIf"], [3, "template", "data", "rowIndex", 4, "ngIf"], [3, "template", "data", "rowIndex"], ["role", "row", 1, "sme-table-row", "sme-table-row-data", "sme-table-row-selectable", 3, "keydown", "keyup", "contextmenu", "click", "dblclick", "focus", "focusin", "focusout", "mouseenter", "mouseleave"], ["role", "presentation", 1, "sme-arrange-stack-h"], ["class", "sme-table-cell sme-table-checkbox-container", "role", "presentation", 3, "sme-table-cell-full-height", 4, "ngIf"], ["class", "sme-table-row-validation", 4, "ngIf"], ["class", "sme-table-cell", 3, "id", "click", 4, "ngIf"], [1, "sme-table-cell", 3, "id", "click"], ["class", "sme-table-cell", 3, "sme-table-cell-full-height", "id", 4, "ngIf"], ["class", "sme-table-cell", 3, "sme-table-cell-height-auto", "sme-table-cell-full-height", "id", 4, "ngIf"], [1, "sme-table-cell", 3, "id"], ["class", "sme-table-cell", 4, "ngIf"], [3, "renderedItem", "template", "data", "rowIndex", 4, "ngIf"], [3, "renderedItem", "template", "data", "rowIndex"], ["class", "sme-table-cell sme-table-edit-container", 4, "ngIf"], [1, "sme-table-cell", "sme-table-edit-container"], [3, "template", "field", "data", "rowIndex", "renderedItem", "validationAlert", "dataChanged", 4, "ngIf"], [3, "template", "field", "data", "rowIndex", "renderedItem", "validationAlert", "dataChanged"], [1, "sme-table-row-validation"], ["role", "presentation", 1, "sme-table-cell"], [4, "ngFor", "ngForOf"], [3, "alert"], ["data-sme-last-focusable-shadow-element", "", "tabindex", "0", 1, "sme-focus-zone", 3, "focus"], ["lastFocusableShadowElement", ""], [1, "sme-layout-absolute", "sme-position-inset-none"], [3, "isBackgroundTransparent"]], template: function TreeTableComponent_Template(rf, ctx) { if (rf & 1) {
5361
5355
  i0.ɵɵelementStart(0, "div", 0, 1);
5362
5356
  i0.ɵɵelementStart(2, "div", 2, 3);
5363
5357
  i0.ɵɵelementStart(4, "div", 4);
@@ -5365,7 +5359,7 @@ export class TreeTableComponent extends DataTableComponent {
5365
5359
  i0.ɵɵelementStart(5, "div", 5);
5366
5360
  i0.ɵɵtemplate(6, TreeTableComponent_div_6_Template, 3, 3, "div", 6);
5367
5361
  i0.ɵɵelementEnd();
5368
- i0.ɵɵtemplate(7, TreeTableComponent_div_7_Template, 5, 11, "div", 7);
5362
+ i0.ɵɵtemplate(7, TreeTableComponent_div_7_Template, 5, 13, "div", 7);
5369
5363
  i0.ɵɵelementEnd();
5370
5364
  i0.ɵɵelementEnd();
5371
5365
  i0.ɵɵelementEnd();
@@ -5405,7 +5399,7 @@ export class TreeTableComponent extends DataTableComponent {
5405
5399
  i0.ɵɵadvance(2);
5406
5400
  i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(38, _c18, ctx.scrollable, ctx.shouldScroll));
5407
5401
  i0.ɵɵadvance(2);
5408
- i0.ɵɵproperty("ngIf", ctx.renderedItems.length === 0 && !ctx.lazyLoad || !ctx.isColumnWidthCalculated);
5402
+ i0.ɵɵproperty("ngIf", ctx.showNoRecordsMessage());
5409
5403
  i0.ɵɵadvance(3);
5410
5404
  i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(41, _c19, ctx.scrollAboveDataStyleTop));
5411
5405
  i0.ɵɵattribute("aria-hidden", true);
@@ -5428,4 +5422,4 @@ export class TreeTableComponent extends DataTableComponent {
5428
5422
  templateUrl: './data-table.component.html'
5429
5423
  }]
5430
5424
  }], function () { return [{ type: i0.Injector }]; }, null); })();
5431
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBQ2pHLE9BQU8sRUFBd0IsT0FBTyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDcEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdkYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RFLE9BQU8sRUFBVSxtQkFBbUIsRUFBRSxNQUFN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RSxlQUF5QztRQUF6Qyw4REFBeUM7UUFJOUMsZUFBOEU7UUFBOUUsK0ZBQThFOzt1RkRzMEh0RSxrQkFBa0I7Y0FKOUIsU0FBUztlQUFDO2dCQUNQLFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLFdBQVcsRUFBRSw2QkFBNkI7YUFDN0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIENvbnRlbnRDaGlsZCxcclxuICAgIENvbnRlbnRDaGlsZHJlbixcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbmplY3RvcixcclxuICAgIElucHV0LFxyXG4gICAgTmdab25lLFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgUXVlcnlMaXN0LFxyXG4gICAgVGVtcGxhdGVSZWYsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBWaWV3Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGVib3VuY2UgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGVjb3JhdG9ycy9kZWJvdW5jZS5kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgWWllbGQgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGVjb3JhdG9ycy95aWVsZC5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBFbGVtZW50Rm9jdXNpbmdFdmVudCwgS2V5Q29kZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9hY2Nlc3NpYmlsaXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBDb3JlRW52aXJvbm1lbnQgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvY29yZS1lbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy9sb2ctbGV2ZWwnO1xyXG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy9sb2dnaW5nJztcclxuaW1wb3J0IHsgRG9tIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kb20vZG9tJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvcmVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2Jhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU21lSW5qZWN0IH0gZnJvbSAnLi4vY29tbW9uL2RlY29yYXRvcnMvaW5qZWN0aW9uLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBMYXlvdXQsIFNNRV9MQVlPVVRfUFJPVklERVIgfSBmcm9tICcuLi9jb21tb24vbGF5b3V0JztcclxuaW1wb3J0IHsgRm9ybUZpZWxkQ29udGFpbmVyIH0gZnJvbSAnLi4vZm9ybS9mb3JtLWZpZWxkL2Zvcm0tZmllbGQtY29udGFpbmVyJztcclxuaW1wb3J0IHsgU2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9mb3JtLWZpZWxkL3NlYXJjaC9zZWFyY2gtZm9ybS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBRdWVyeURhdGEsIFF1ZXJ5RGF0YUl0ZW0sIFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUsIFF1ZXJ5RGF0YU9wZXJhbmQgfSBmcm9tICcuLi9xdWVyeS1lZGl0b3IvcXVlcnktZWRpdG9yLWNvbnRyYWN0JztcclxuaW1wb3J0IHsgRGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIgfSBmcm9tICcuL2RhdGEtdGFibGUtYWNjZXNzaWJpbGl0eS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbHVtbi5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gICAgRGF0YVRhYmxlQ3VzdG9tU29ydEV2ZW50LFxyXG4gICAgRGF0YVRhYmxlRGF0YUl0ZW0sXHJcbiAgICBEYXRhVGFibGVMYXp5TG9hZEV2ZW50LFxyXG4gICAgRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLFxyXG4gICAgRGF0YVRhYmxlUmVuZGVyZWRJdGVtLFxyXG4gICAgRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZSxcclxuICAgIERhdGFUYWJsZVNvcnRNb2RlLFxyXG4gICAgRWRpdGFibGVEYXRhQ2hhbmdlU2V0LFxyXG4gICAgRWRpdGFibGVEYXRhSXRlbSxcclxuICAgIE5vZGVOYXZpZ2F0aW5nVGFzayxcclxuICAgIFRyZWVOb2RlRGF0YUl0ZW1cclxufSBmcm9tICcuL2RhdGEtdGFibGUtY29udHJhY3QnO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUHhDb252ZXJ0ZXIgfSBmcm9tICcuL2hlbHBlcnMvcHgtY29udmVydGVyJztcclxuXHJcbi8qKlxyXG4gKiBEYXRhIHRhYmxlIGNvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1kYXRhLXRhYmxlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBzZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24gPSAnbXVsdGlwbGUnO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWluQ29sdW1uV2lkdGggPSA1MDtcclxuICAgIHByaXZhdGUgc3RhdGljIHB4Q29udmVydGVyID0gbmV3IFB4Q29udmVydGVyKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ0RhdGFUYWJsZUNvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0NvbXBvbmVudEluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGVkaXRhYmxlRGF0YUNoYW5nZVNldDogRWRpdGFibGVEYXRhQ2hhbmdlU2V0ID0ge1xyXG4gICAgICAgIGFkZGVkSXRlbXM6IFtdLFxyXG4gICAgICAgIHVwZGF0ZWRJdGVtczogW10sXHJcbiAgICAgICAgZGVsZXRlZEl0ZW1zOiBbXVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIGRlZmF1bHRTY3JvbGxQaXhlbHMgPSA5MDtcclxuICAgIHByaXZhdGUgZGVmYXVsdFNjcm9sbFBlcmNlbnRhZ2UgPSAwLjQ7XHJcbiAgICBwcml2YXRlIG1heEFjdHVhbFNjcm9sbERhdGFFbGVtZW50SGVpZ2h0ID0gNTAwMDAwO1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJEZWJvdW5jZVRpbWVvdXQgPSAzMDA7XHJcbiAgICBwcml2YXRlIGtleWJvYXJkTmF2aWdhdGlvbkRlYm91bmNlVGltZW91dCA9IDEwMDtcclxuICAgIHByaXZhdGUgc2Nyb2xsQ2hlY2tJbnRlcnZhbER1cmF0aW9uID0gMzAwO1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxDaGVja0ludGVydmFsO1xyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGJ1ZmZlclJvd1JhdGUgPSAxO1xyXG4gICAgcHJpdmF0ZSBldmVudFVucmVnaXN0cmF0ZXJIYW5kbGVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcclxuICAgIHByaXZhdGUgc29ydENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBwcmV2aW91c1NvcnRDb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudDtcclxuICAgIHByaXZhdGUgaW50ZXJuYWxJdGVtczogRGF0YVRhYmxlRGF0YUl0ZW1bXTtcclxuICAgIHByaXZhdGUgYWN0dWFsSXRlbXM6IERhdGFUYWJsZURhdGFJdGVtW107XHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50SGFzVmVydGljYWxPdmVyZmxvdzogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZmlsdGVyRGVib3VuY2VUaW1lcjtcclxuICAgIHByaXZhdGUgdHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXI7XHJcbiAgICBwcml2YXRlIG9sZEZpbHRlcktleXdvcmQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgZmlsdGVyS2V5d29yZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEdsb2JhbEZpbHRlcjogYW55O1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGlzU2Nyb2xsaW5nOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBpc1Njcm9sbGluZ0V2ZW50SGFuZGxlclNldHVwOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkaXNwbGF5SXRlbXNUb3A6IG51bWJlcjtcclxuICAgIHByaXZhdGUgaW50ZXJuYWxSZW5kZXJlZEl0ZW1zOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFNlbGVjdGlvbjogRGF0YVRhYmxlRGF0YUl0ZW1bXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBoYXNMb25nTGlzdDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0ID0gLTE7XHJcbiAgICBwcml2YXRlIGRhdGFTY3JvbGxUb3A6IG51bWJlcjtcclxuICAgIHByaXZhdGUgY3VycmVudFJlbmRlcmVkSXRlbUluVmlld1BvcnQ6IERhdGFUYWJsZVJlbmRlcmVkSXRlbTtcclxuICAgIHByaXZhdGUgaW50ZXJuYWxHcm91cENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEdyb3VwU29ydE1vZGUgPSBEYXRhVGFibGVTb3J0TW9kZS5Ob25lO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFNlbGVjdGlvbk1vZGU6IHN0cmluZztcclxuICAgIHByaXZhdGUgc2hhZG93VHJlZTogYW55OyAvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gbWFpbnRhaW4gdGhlIHRyZWUgdG8gaGVscCBkbyB0aGUgXCJzYW1lIGxldmVsIG9ubHlcIiBzb3J0LlxyXG4gICAgcHJpdmF0ZSBhY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBwcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIGFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggPSAtMTtcclxuICAgIHByaXZhdGUgaG92ZXJlZFJlbmRlcmVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIHJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgcmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICBwcml2YXRlIGN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgcHJpdmF0ZSB1bnJlZ2lzdGVyT25FbGVtZW50Rm9jdXNpbmdFdmVudEhhbmRsZXI6ICgpID0+IHZvaWQ7XHJcbiAgICBwcml2YXRlIGNvbnRlbnRBcmVhSGFzRm9jdXMgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgZWRpdGFibGVOZXdSb3dIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBjYW5jZWxMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudEZvY3VzT25jZSA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBsYXlvdXRDaGFuZ2VTdWJzY3JpYmVyO1xyXG4gICAgcHJpdmF0ZSBnbG9iYWxGaWx0ZXJTdWJzY3JpYmVyO1xyXG4gICAgcHJpdmF0ZSBncm91cEtleXM6IHsgW2tleTogc3RyaW5nXTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW10gfSA9IHt9O1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbENvbHVtbnM6IFF1ZXJ5TGlzdDxEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ+O1xyXG4gICAgcHJpdmF0ZSB0cmVlVG9nZ2xlU3RhdHVzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG4gICAgcHJpdmF0ZSBzaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFF1ZXJ5RWRpdG9yOiBRdWVyeURhdGE7XHJcbiAgICBwcml2YXRlIGFjdHVhbENvbHVtblByb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzRW1wdHlNZXNzYWdlQ291bnQgPSAzO1xyXG4gICAgcHJpdmF0ZSBhY2Nlc2liaWxpdHlNYW5hZ2VyID0gQ29yZUVudmlyb25tZW50LmFjY2Vzc2liaWxpdHlNYW5hZ2VyO1xyXG5cclxuICAgIHByaXZhdGUgaW50ZXJuYWxUYWJsZUFyaWFMYWJlbGxlZEJ5OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaW50ZXJuYWxUYWJsZUFyaWFMYWJlbDogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBzY3JvbGxEYXRhU3R5bGVUb3A6IHN0cmluZztcclxuICAgIHB1YmxpYyBzY3JvbGxBYm92ZURhdGFTdHlsZVRvcDogc3RyaW5nO1xyXG4gICAgcHVibGljIGlzTG9hZGluZyA9IHRydWU7XHJcbiAgICBwdWJsaWMgZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBuZXcgRGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIoKTtcclxuICAgIHB1YmxpYyBjb2x1bW5Tb3J0U2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdyZXNpemVySW5kaWNhdG9yJylcclxuICAgIHByaXZhdGUgcmVzaXplckluZGljYXRvcjogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdoZWFkZXInKVxyXG4gICAgcHJpdmF0ZSBoZWFkZXJFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclRhYmxlJylcclxuICAgIHByaXZhdGUgaGVhZGVyVGFibGVFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnKVxyXG4gICAgcHJpdmF0ZSBjb250ZW50RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcHJpdmF0ZSBzY3JvbGxDb250YWluZXJFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBSb3cnKVxyXG4gICAgcHJpdmF0ZSB0ZW1wUm93RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxCb2R5JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHByaXZhdGUgc2Nyb2xsQm9keUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsQWJvdmVEYXRhJylcclxuICAgIHByaXZhdGUgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxEYXRhJylcclxuICAgIHByaXZhdGUgc2Nyb2xsRGF0YUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnZW1wdHlNZXNzYWdlJylcclxuICAgIHByaXZhdGUgZW1wdHlNZXNzYWdlRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdsYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCcpXHJcbiAgICBwcml2YXRlIGxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoJ2dyb3VwJylcclxuICAgIHB1YmxpYyBncm91cEhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdjaGFuZ2VzZXRVcGRhdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbkNoYW5nZXNldFVwZGF0ZWQoKTogRXZlbnRFbWl0dGVyPEVkaXRhYmxlRGF0YUNoYW5nZVNldD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZXNldFVwZGF0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZXNldFVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEVkaXRhYmxlRGF0YUNoYW5nZVNldD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRoZSBldmVudCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2luZyBpcyBoYXBwZW5pbmcuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlRGF0YUl0ZW0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ3Jvd0RibGNsaWNrJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvblJvd0RibGNsaWNrKCk6IEV2ZW50RW1pdHRlcjx7IGRhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dEYmxjbGljaztcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgcm93RGJsY2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnZ3JvdXBUb2dnbGVDbGljaycgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Hcm91cFRvZ2dsZUNsaWNrZWQoKTogRXZlbnRFbWl0dGVyPHsgZ3JvdXBEYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBUb2dnbGVDbGljaztcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ3JvdXBUb2dnbGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBncm91cERhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ2VkaXRhYmxlUm93QWRkZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uTmV3RWRpdGFibGVSb3dBZGRlZCgpOiBFdmVudEVtaXR0ZXI8eyBkYXRhOiBhbnksIG92ZXJyaWRlTmV3RGF0YUhhbmRsZXI6IChkYXRhOiBhbnkpID0+IHZvaWQgfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRhYmxlUm93QWRkZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGVkaXRhYmxlUm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogYW55LCBvdmVycmlkZU5ld0RhdGFIYW5kbGVyOiAoZGF0YTogYW55KSA9PiB2b2lkIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGNvbHVtbnMgcmVuZGVyZWQgb24gdGhlIFVJLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogUXVlcnlMaXN0PERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsQ29sdW1ucztcclxuICAgIH1cclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudClcclxuICAgIHB1YmxpYyBzZXQgY29sdW1ucyh2YWx1ZTogUXVlcnlMaXN0PERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD4pIHtcclxuICAgICAgICB0aGlzLmludGVybmFsQ29sdW1ucyA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAVmlld0NoaWxkcmVuKERhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50KVxyXG4gICAgcHJpdmF0ZSBkYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHM6IFF1ZXJ5TGlzdDxEYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGFjdHVhbCBjb2x1bW5zIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGFibGUuXHJcbiAgICAgKiBJbiBncm91cGluZyBkYXRhIHRhYmxlIHNjZW5hcmlvLCB0aGUgYWN0dWFsIGNvbHVtbnMgZG9lc24ndCBjb250YWluIHRoZSBncm91cGluZyBjb2x1bW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3R1YWxDb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnRbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgaXRlbSByZW5kZXJlZCBvbiB0aGUgVUkgKGluY2x1ZGluZyB0aGUgaXRlbXMgaW4gYW5kIG91dHNpZGUgb2YgdmlldyBwb3J0KS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByZW5kZXJlZEl0ZW1zKCk6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFJlbmRlcmVkSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCByZW5kZXJlZEl0ZW1zKHZhbHVlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxSZW5kZXJlZEl0ZW1zID0gdmFsdWUgfHwgW107XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zQ2hhbmdlLmVtaXQoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1yb3djb3VudCcsIHZhbHVlLmxlbmd0aCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZpbHRlcmVkSXRlbXM6IERhdGFUYWJsZURhdGFJdGVtW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyByZW5kZXJlZCBpdGVtcyBhcmUgY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVuZGVyZWRJdGVtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgYmFja2dyb3VuZCBidXN5IHRhc2tzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlzQnVzeTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgcmlnaHQgY2xpY2sgc2VsZWN0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZW5hYmxlUmlnaHRDbGlja1NlbGVjdCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBtZXNzYWdlIHNob3dpbmcgd2hlbiB0aGUgZGF0YSBpcyBsb2FkaW5nLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxvYWRpbmdNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIG1lc3NhZ2Ugc2hvd2luZyB3aGVuIHRoZSBkYXRhIGxvYWRpbmcgaXMgZmluaXNoZWQgYnV0IHRoZSBkYXRhIGlzIGVtcHR5IG9yIG5vIGRhdGEgZ290IHJlbmRlcmVkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIG5vUmVjb3JkTWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZWRpdGFibGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBleHBhbmQgdHJlZSBub2RlIG9uIHJvb3Qgbm9kZSBjaGVja2VkLiBUaGlzIHBhcmFtZXRlciBjYW4gb25seSBiZSB1c2VkIGZvciB0cmVlIHRhYmxlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGV4cGFuZFRyZWVOb2RlT25DaGVja2VkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIGFsbCBlZGl0YWJsZSByb3dzIGluIGFuIGVkaXRhYmxlIHRhYmxlIHNob3VsZCBiZSB2aXNpYmxlIChyZWdhcmRsZXNzIG9mIGhvdmVyL3NlbGVjdGVkIHN0YXRlKS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpc0FsbEVkaXRhYmxlUm93c1Zpc2libGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEl0IGluZGljYXRlcyB0aGF0IGEgc2Nyb2xsYmFyIGNhbiBiZSB1c2VkIHdoZW4gdGhlIGV4cGVjdGVkIG51bWJlciBvZiBjb2x1bW5zIGlzIGh1Z2VcclxuICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNjcm9sbGFibGVIb3Jpem9udGFsID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhhdCBhIGRhdGEgbGF6eSBsb2FkaW5nIG5lZWRzIHRvIGhhcHBlbiBhbmQgcmVxdWlyZSB0aGUgY29uc3VtZXIgdG8gcHJvdmlkZSBkYXRhIGZvciB0aGUgbGF6eSBsb2FkaW5nIHBhcnQuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGxhenlMb2FkaW5nRGF0YTogRXZlbnRFbWl0dGVyPERhdGFUYWJsZUxhenlMb2FkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVMYXp5TG9hZEV2ZW50PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgdHJpZ2dlcnMgd2hlbiBhIHRyZWUgbm9kZSBpcyBleHBhbmRlZC5cclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnbm9kZUV4cGFuZGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbk5vZGVFeHBhbmQoKTogRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUV4cGFuZGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBub2RlRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgdHJpZ2dlcnMgd2hlbiBhIHRyZWUgbm9kZSBpcyBjb2xsYXBzZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ25vZGVDb2xsYXBzZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uTm9kZUNvbGxhcHNlZCgpOiBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlQ29sbGFwc2VkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBub2RlQ29sbGFwc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHRyaWdnZXJzIHdoZW4gYSB0cmVlIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ25vZGVTZWxlY3RlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Ob2RlU2VsZWN0KCk6IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVTZWxlY3RlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgbm9kZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgZGF0YSBpcyBsb2FkZWQgaW4gbGF6eSBsb2FkaW5nIHdheS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBsYXp5TG9hZDogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHJlbWVtYmVyIHRoZSB0cmVlIHRvZ2dsZSBzdGF0dXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcmVtZW1iZXJUcmVlTm9kZVRvZ2dsZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHJlbWVtYmVyIHRoZSBzZWxlY3Rpb24gdGhlbiBhZnRlciB0aGUgd2hvbGUgZGF0YSBzb3VyY2UgaXMgcmVmcmVzaGVkIHRoZSBzZWxlY3Rpb24gd2lsbCBzdGlsbCBiZSB0aGVyZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZW1lbWJlclNlbGVjdGlvbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxseSB0aGUgZW50ZXIga2V5IG9uIGEgcm93IHJlZGlyZWN0cyB0byB0aGUgZG91YmxlIGNsaWNrIGJlaGF2aW9yIG9mIHRoZSByb3cuXHJcbiAgICAgKiBJZiB0aGlzIGZsYWcgaXMgdHJ1ZSwgdGhlbiBkYXRhIHRhYmxlIHdvdWxkIGRvIG5vdGhpbmcgZm9yIGVudGVyIGtleSBvbiBhIHJvdy5cclxuICAgICAqIFRoZW4geW91IG5lZWQgdG8gaW1wbGVtZW50IHRoZSBlbnRlciBrZXkgYWN0aW9uIGJ5IHlvdXIgc2VsZi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBwcmV2ZW50RW50ZXJLZXlGb3JEZWZhdWx0QWN0aW9uOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcG9pbnRzIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhbiB1bmlxdWUgaWRlbnRpdHkgc3RyaW5nIGZvciBhbnkgZGF0YSBpdGVtLlxyXG4gICAgICogU29tZSBzY2VuYXJpb3MgbGlrZSB0cmVlIHRhYmxlIHdvdWxkIG5lZWQgdGhpcyBmdW5jdGlvbiB0byByZW1lbWJlciB0b2dnbGUgc3RhdHVzIGZvciBhbnkgdHJlZSBub2RlIGJ5IHRoZSBpZGVudGl0eS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXRJdGVtSWRlbnRpdHlGdW5jdGlvbjogKGRhdGE6IGFueSkgPT4gc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnkgZGVmYXVsdCBuYXR1cmFsIHNvcnQgaXMgdHVybmVkIG9uLlxyXG4gICAgICogQnV0IGZvciBwZXJmb3JtYW5jZSBjb25jZXJuLCB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSBuYXR1cmFsIHNvcnQgYW5kIGp1c3QgZG8gdmVyeSBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGlzYWJsZU5hdHVyYWxTb3J0ID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGl0ZW1zIHJlbmRlcmVkIGFib3ZlIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1zQWJvdmVWaWV3UG9ydDogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGl0ZW1zIHJlbmRlcmVkIGluIGFuZCBiZWxvdyB0aGUgdmlldyBwb3J0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydDogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBpcyBzY3JvbGxlZCBkb3duLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNTY3JvbGxlZERvd246IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBzaG91bGQgaGFuZGxlIHNjcm9sbGluZyBmb3IgY29udGVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3VsZFNjcm9sbDogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBsYXN0IGZvY3VzYWJsZSBzaGFkb3cgZWxlbWVudCBzaG91bGQgYmUgdXNlZC5cclxuICAgICAqIE5vcm1hbGx5IHdoZW4gdGhlIGRhdGEgdGFibGUgaXMgdGhlIGxhc3QgZm9jdXNhYmxlIGVsZW1lbnQsXHJcbiAgICAgKiB0aGUgbGFzdCBmb2N1c2FibGUgZWxlbWVudCBuZWVkIHRvIGJlIHVzZWQgdG8gaGFuZGxlIGZvY3VzIG1vdmVtZW50LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvdWxkVXNlTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQ6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBzY3JvbGwgdG8gc2VsZWN0aW9uIGFmdGVyIHNvcnRpbmcuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvdWxkU2Nyb2xsVG9TZWxlY3Rpb25BZnRlclNvcnRpbmc6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSBnbG9iYWwgZmlsdGVyIHZhbHVlIGh0bWwgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgZ2xvYmFsRmlsdGVyKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxHbG9iYWxGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBnbG9iYWxGaWx0ZXIoZ2xvYmFsRmlsdGVyOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBldmVudEhhbmRsZXIgPSAoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5maWx0ZXJEZWJvdW5jZVRpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJEZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkb1NlYXJjaChnbG9iYWxGaWx0ZXJbJ3ZhbHVlJ10pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRGVib3VuY2VUaW1lb3V0KTtcclxuICAgICAgICB9KS5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICBjb25zdCBkb1NlYXJjaCA9IChrZXl3b3JkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJLZXl3b3JkID0ga2V5d29yZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyS2V5d29yZCAhPT0gdGhpcy5vbGRGaWx0ZXJLZXl3b3JkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlci5lbWl0KHRoaXMuZmlsdGVyS2V5d29yZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5vbGRGaWx0ZXJLZXl3b3JkID0gdGhpcy5maWx0ZXJLZXl3b3JkO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxHbG9iYWxGaWx0ZXIgPSBnbG9iYWxGaWx0ZXI7XHJcbiAgICAgICAgaWYgKGdsb2JhbEZpbHRlcikge1xyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsRmlsdGVyIGluc3RhbmNlb2YgU2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlclN1YnNjcmliZXIgPSBnbG9iYWxGaWx0ZXIuc2VhcmNoLnN1YnNjcmliZShrZXl3b3JkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuc2VhcmNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9TZWFyY2goa2V5d29yZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5zZWFyY2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGV2ZW50SGFuZGxlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudFVucmVnaXN0cmF0ZXJIYW5kbGVycy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBldmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsIGV2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgYW5kIHNldHMgdGhlIENhc2UgU2Vuc2l0aXZlIGZsYWcgZm9yIGZpbHRlcmluZy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjYXNlU2Vuc2l0aXZlRmlsdGVyOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGEgdHJlZSBkYXRhIHRhYmxlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dBc1RyZWU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgbmV3IGl0ZW1cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlZGl0YWJsZU5ld0RhdGFJdGVtOiBEYXRhVGFibGVEYXRhSXRlbTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSBkYXRhIHNvdXJjZSBvZiB0aGUgZGF0YSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgaXRlbXMoKTogRGF0YVRhYmxlRGF0YUl0ZW1bXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgPyB0aGlzLmludGVybmFsSXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5jb250ZW50KSA6IHRoaXMuaW50ZXJuYWxJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGl0ZW1zKHZhbHVlOiBEYXRhVGFibGVEYXRhSXRlbVtdKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHRGcm9tUm93KCk7XHJcblxyXG4gICAgICAgIHRoaXMuYWN0dWFsSXRlbXMgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgbGV0IGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIHJlZmFjdG9yIHRvIHJlZHVjZSB0aGUgbmVzdGVkIGlmIGJsb2Nrcy5cclxuICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbikge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlcjogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbWVtYmVyU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3Rpb24pICYmIHRoaXMuc2VsZWN0aW9uLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLnB1c2godGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihpdGVtLmRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIucHVzaCh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGl0ZW0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLnNlbGVjdGlvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXR5VG9SZW1lbWJlciA9IHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24odGhpcy5zZWxlY3Rpb24uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyID0gdGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbih0aGlzLnNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcyA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zID0gdmFsdWUubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8RWRpdGFibGVEYXRhSXRlbT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBNc2Z0U21lLm5ld0d1aWQoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkFsZXJ0czoge31cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW1lbWJlclNlbGVjdGlvbiAmJiB0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvUHJvY2VzcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2Rlc1RvUHJvY2Vzcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBub2Rlc1RvUHJvY2Vzc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3Muc3BsaWNlKDAsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5pbmRleE9mKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oY3VycmVudE5vZGUuZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGN1cnJlbnROb2RlLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucGFyZW50ID0gY3VycmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3MucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmluZGV4T2YodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihpdGVtKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXNUb1Byb2Nlc3MgPSB0aGlzLml0ZW1zLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2Rlc1RvUHJvY2Vzcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBub2Rlc1RvUHJvY2Vzc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3Muc3BsaWNlKDAsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oY3VycmVudE5vZGUuZGF0YSkgPT09IHNlbGVjdGlvbklkZW50aXR5VG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZm91bmQgaW4gdGhlIHJlZnJlc2ggaXRlbXMsIHRoZW4gaXQgbWVhbnMgdGhlIHNlbGVjdGlvbiBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oaXRlbSkgPT09IHNlbGVjdGlvbklkZW50aXR5VG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBmb3VuZCBpbiB0aGUgcmVmcmVzaCBpdGVtcywgdGhlbiBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcjogRGF0YVRhYmxlRGF0YUl0ZW07XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXI6IERhdGFUYWJsZURhdGFJdGVtW10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbWVtYmVyU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3Rpb24pICYmIHRoaXMuc2VsZWN0aW9uLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIucHVzaChpdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5zZWxlY3Rpb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1Ub1JlbWVtYmVyID0gdGhpcy5zZWxlY3Rpb24uZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1Ub1JlbWVtYmVyID0gdGhpcy5zZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxFZGl0YWJsZURhdGFJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1zZnRTbWUubmV3R3VpZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQWxlcnRzOiB7fVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbWVtYmVyU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXNUb1Byb2Nlc3MgPSB0aGlzLmludGVybmFsSXRlbXMuc2xpY2UoMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2Rlc1RvUHJvY2Vzcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBub2Rlc1RvUHJvY2Vzc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3Muc3BsaWNlKDAsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIuaW5kZXhPZihjdXJyZW50Tm9kZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihjdXJyZW50Tm9kZSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucGFyZW50ID0gY3VycmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3MucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5pbmRleE9mKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvUHJvY2VzcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuZGF0YSA9PT0gc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZm91bmQgaW4gdGhlIHJlZnJlc2ggaXRlbXMsIHRoZW4gaXQgbWVhbnMgdGhlIHNlbGVjdGlvbiBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1Byb2Nlc3MucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IHNlbGVjdGlvbkl0ZW1Ub1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGZvdW5kIGluIHRoZSByZWZyZXNoIGl0ZW1zLCB0aGVuIGl0IG1lYW5zIHRoZSBzZWxlY3Rpb24gaXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2V0RWRpdGFibGVEYXRhQ2hhbmdlc2V0KCk7XHJcblxyXG4gICAgICAgIGlmIChpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBpdGVtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZXhwb3NlcyB0aGUgZW51bSB0eXBlIHRoZW4gaW4gdGVtcGxhdGUgd2UgY2FuIGRpcmVjdGx5IHJlZmVyIHRvIHRoZSBlbnVtIHZhbHVlIG5hbWUgaW5zdGVhZCBvZiBlbnVtIHZhbHVlIG51bWJlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNvcnRNb2RlRW51bTogYW55ID0gRGF0YVRhYmxlU29ydE1vZGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBleHBvc2VzIHRoZSBlbnVtIHR5cGUgdGhlbiBpbiB0ZW1wbGF0ZSB3ZSBjYW4gZGlyZWN0bHkgcmVmZXIgdG8gdGhlIGVudW0gdmFsdWUgbmFtZSBpbnN0ZWFkIG9mIGVudW0gdmFsdWUgbnVtYmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVuZGVyZWRJdGVtVHlwZUVudW06IGFueSA9IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGRhdGEgc291cmNlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBzZWxlY3Rpb24oKTogRGF0YVRhYmxlRGF0YUl0ZW0gfCBEYXRhVGFibGVEYXRhSXRlbVtdIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVkaXRhYmxlID8gdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5tYXAoaXRlbSA9PiBpdGVtLmNvbnRlbnQpIDogdGhpcy5pbnRlcm5hbFNlbGVjdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmludGVybmFsU2VsZWN0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgPyB0aGlzLmludGVybmFsU2VsZWN0aW9uWzBdLmNvbnRlbnQgOiB0aGlzLmludGVybmFsU2VsZWN0aW9uWzBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzZWxlY3Rpb24oc2VsZWN0aW9uOiBEYXRhVGFibGVEYXRhSXRlbSB8IERhdGFUYWJsZURhdGFJdGVtW10pIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Db250ZW50ID0gc2VsZWN0aW9uLm1hcChzID0+IHMuY29udGVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gdGhpcy5pbnRlcm5hbEl0ZW1zLmZpbHRlcihpdGVtID0+IHNlbGVjdGlvbkNvbnRlbnQuaW5kZXhPZihpdGVtLmNvbnRlbnQpICE9PSAtMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gc2VsZWN0aW9uIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5saW5rUGFyZW50Q2hpbGRyZW5TZWxlY3Rpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLm1hcChzZWxlY3Rpb25JdGVtID0+IHNlbGVjdGlvbkl0ZW0uZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFNlbGVjdGlvbiA9IHRoaXMuaW50ZXJuYWxJdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLmNvbnRlbnQgPT09IHNlbGVjdGlvbilbMF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gYWN0dWFsU2VsZWN0aW9uID8gW2FjdHVhbFNlbGVjdGlvbl0gOiBbXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb24gPyBbc2VsZWN0aW9uXSA6IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4QnlTZWxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0aW9uTW9kZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU2VsZWN0aW9uTW9kZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgc2VsZWN0aW9uTW9kZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbk1vZGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIGEgdGVtcCBjb2RlIHRvIHNvbHZlIHRoZSBwcm9ibGVtIHRoYXQ6XHJcbiAgICAgICAgLy8gd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSBhbmQgYW4gaW5pdGlhbCBhcnJheSB2YWx1ZSBpcyBhc3NpZ25lZCB0byB0aGUgc2VsZWN0aW9uIHByb3BlcnR5LFxyXG4gICAgICAgIC8vIGF0IHRoYXQgbW9tZW50IHRoZSBzZWxlY3Rpb25Nb2RlIHByb3BlcnR5IGlzIG5vdCBzZXQgdG8gbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGUgdmFsdWUsIHlldC5cclxuICAgICAgICAvLyBTbyB3ZSB0cmVhdCB0aGUgaW5pdGlhbCBhcnJheSB2YWx1ZSBhcyBhIG1lbWJlciBvZiB0aGUgc2VsZWN0aW9uIGFycmF5IGluc3RlYWQgb2YgdGhlIHNlbGVjdGlvbiBhcnJheS5cclxuICAgICAgICAvLyBTbyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBjb2RlIHRvIGZpeCB0aGlzIHByb2JsZW0uXHJcbiAgICAgICAgLy8gVE9ETzogbG9uZyB0ZXJtIHdpc2UsIHdlIG5lZWQgdG8gdXNlIHNlcGVyYXRlZCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBtYWludGFpbiB0aGUgc2VsZWN0aW9ucyBvZiBzZWxlY3Rpb25cclxuICAgICAgICAvLyBzZWxlY3Rpb24gYW5kIG11bHRpcGxlIHNlbGVjdGlvbi5cclxuICAgICAgICAvLyBUaGlzIGNoYW5nZSB3aWxsIGhhcHBlbiBpbiB0aGUgY29taW5nIHJlbGVhc2UuXHJcbiAgICAgICAgaWYgKHZhbHVlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24pICYmIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkodGhpcy5pbnRlcm5hbFNlbGVjdGlvblswXSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSB0aGlzLmludGVybmFsU2VsZWN0aW9uWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdFNvcnRDb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudDtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRlZmF1bHRTb3J0TW9kZTogRGF0YVRhYmxlU29ydE1vZGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBlbWl0cyB0aGUgZXZlbnQgd2hlbiBmaWx0ZXJpbmcgaXMgaGFwcGVuaW5nLlxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCB0cmlnZ2VycyB3aGVuIGEgdHJlZSBub2RlIGlzIHNlbGVjdGVkLlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdmaWx0ZXInIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uRmlsdGVyKCk6IEV2ZW50RW1pdHRlcjxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXI7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGRvQ3VzdG9tU29ydDogRXZlbnRFbWl0dGVyPERhdGFUYWJsZUN1c3RvbVNvcnRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUN1c3RvbVNvcnRFdmVudD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRoZSBldmVudCB3aGVuIGEgcm93IGlzIHNlbGVjdGVkLlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdyb3dTZWxlY3RlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Sb3dTZWxlY3QoKTogRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyByb3dTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBkYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdGhlIGV2ZW50IHdoZW4gYSByb3cgaXMgdW5zZWxlY3RlZCBhbmQgbm8gcm93IGlzIHNlbGVjdGVkLlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdyb3dVbnNlbGVjdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvblJvd1Vuc2VsZWN0KCk6IEV2ZW50RW1pdHRlcjx7IGRhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dVbnNlbGVjdGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyByb3dVbnNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGRhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIG9yIHNldHMgdGhlIGdyb3VwIGNvbHVtbi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgZ3JvdXBDb2x1bW4oKTogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEdyb3VwQ29sdW1uO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBncm91cENvbHVtbih2YWx1ZTogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxHcm91cENvbHVtbiAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEdyb3VwQ29sdW1uID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbHVtbnNPcmRlciAmJiB0aGlzLmNvbHVtbnNPcmRlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zTWFpbigpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ29sdW1ucygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyBvciBzZXRzIHRoZSBncm91cCBzb3J0IG1vZGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IGdyb3VwU29ydE1vZGUoKTogRGF0YVRhYmxlU29ydE1vZGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsR3JvdXBTb3J0TW9kZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZ3JvdXBTb3J0TW9kZSh2YWx1ZTogRGF0YVRhYmxlU29ydE1vZGUpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsR3JvdXBTb3J0TW9kZSA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdyb3VwIHRvZ2dsZSBzaG91bGQgYmUgdXNlZCB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIGdyb3VwLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHVzZUdyb3VwVG9nZ2xlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgaGVhZGVyLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dIZWFkZXIgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBcImFyaWEtbGFiZWxsZWRieVwiIHZhbHVlIGZvciB0aGUgdGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHRhYmxlQXJpYUxhYmVsbGVkQnkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFRhYmxlQXJpYUxhYmVsbGVkQnk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRhYmxlQXJpYUxhYmVsbGVkQnkodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxUYWJsZUFyaWFMYWJlbGxlZEJ5ID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBcmlhQXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBcImFyaWEtbGFiZWxcIiB2YWx1ZSBmb3IgdGhlIHRhYmxlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCB0YWJsZUFyaWFMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsVGFibGVBcmlhTGFiZWw7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHRhYmxlQXJpYUxhYmVsKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsVGFibGVBcmlhTGFiZWwgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFyaWFBdHRyaWJ1dGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgc2hvdWxkIHRoZSBkYXRhIHRhYmxlIGhhcyB0aGUgZ3JpZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG93R3JpZCA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBzaG93IHRoZSBcImFsbCBpdGVtXCIgY2hlY2tib3guXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0FsbEl0ZW1DaGVja2JveCA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBjaGVjayB0aGUgaXRlbSBhbmQgdW5jaGVjayBvdGhlciBpdGVtcyB3aGVuIHRoZSBjdXJyZW50IGl0ZW0gaXMgY2hlY2tlZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZWxlY3RBbmRDaGVjayA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIHJvdyBoZWlnaHQgZm9yIGVhY2ggaXRlbS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByb3dIZWlnaHQgPSAzMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIGxpbmsgdGhlIHNlbGVjdGlvbnMgb2YgcGFyZW50IG5vZGVzIGFuZCBjaGlsZCBub2Rlcy5cclxuICAgICAqIEl0IG9ubHkgYXBwbHkgdG8gdHJlZSB0YWJsZSBzY2VuYXJpby5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBsaW5rUGFyZW50Q2hpbGRyZW5TZWxlY3Rpb25zID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHNlbGVjdCB0aGUgaXRlbSB3aGVuIG5hdmlnYXRpbmcgd2l0aCB0aGUga2V5Ym9hcmQgKGUuZy4gYXJyb3cga2V5cywgaG9tZSwgZW5kLCBwYWdlIHVwLCBwYWdlIGRvd24pXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2VsZWN0SXRlbVdoZW5OYXZpZ2F0aW5nV2l0aEtleWJvYXJkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgdGhlIGxlZnQgbWFyZ2luIGluIGVhY2ggcm93LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dMZWZ0TWFyZ2luID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlIGlzIHNjcm9sbGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2Nyb2xsYWJsZSA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSdzIFVJIHZpcnR1YWxpemF0aW9uIHNob3VsZCBiZSBkaXNhYmxlZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkaXNhYmxlVUlWaXJ0dWFsaXphdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUgaXRlbXMgYXJlIHNlbGVjdGFibGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZWxlY3RhYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlZGl0YWJsZSBkYXRhIHRhYmxlIGFsbG93IGF1dG9tYXRpY2FsbHkgYWRkaW5nIG5ldyByb3dzXHJcbiAgICAgKiBTZXR0aW5nIHRoaXMgdG8gZmFsc2UgdGhlbiBoYXZlIHRvIGNyZWF0ZSBuZXcgbGluZSBvdXRzaWRlIG9mIHRoZSBkYXRhdGFibGUgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGVkaXRhYmxlQXV0b05ld1JvdyA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgc3RhdHVzIG9mIHRoZSBncm91cCB0b2dnbGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdEdyb3VwVG9nZ2xlRXhwYW5kZWQgPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYXV0b1Jvd0hlaWdodCA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgY29sdW1uc09yZGVyOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgcHVibGljIGdyb3VwVG9nZ2xlU3RhdHVzOiB7IFtncm91cDogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICBwdWJsaWMgbm9kZU5hdmlnYXRpbmdUYXNrOiBOb2RlTmF2aWdhdGluZ1Rhc2s7XHJcbiAgICBwdWJsaWMgaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBAU21lSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKVxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWY7XHJcblxyXG4gICAgQFNtZUluamVjdChOZ1pvbmUpXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lO1xyXG5cclxuICAgIEBTbWVJbmplY3QoU01FX0xBWU9VVF9QUk9WSURFUiwgdHJ1ZSlcclxuICAgIHByaXZhdGUgbGF5b3V0OiBMYXlvdXQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFZGl0YWJsZURhdGFDaGFuZ2VTZXQoKTogRWRpdGFibGVEYXRhQ2hhbmdlU2V0IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lZGl0YWJsZSA/IHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0IDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaERhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVzZXRTY3JvbGwoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gU2V0IHRoZSBzY3JvbGxUb3AoZGlzdGFuY2UgZnJvbSB0aGUgZWxlbWVudCdzIHRvcCB0byBpdHMgdG9wbW9zdCB2aXNpYmxlIGNvbnRlbnQpXHJcbiAgICAgICAgLy8gb2YgU2Nyb2xsIGNvbnRhaW5lciB0byAwLlxyXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcblxyXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gcmVzZXQgJ3RoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0JyB0byAwLCBhcyBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0XHJcbiAgICAgICAgLy8gYWRqdXN0ZWQgdG8gMCBpbiAnY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoKScuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVVJVmlydHVhbGl6YXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uID0gZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5pZDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICd0cmVlZ3JpZCcpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZ3JpZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFibGUnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxheW91dCkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dENoYW5nZVN1YnNjcmliZXIgPSB0aGlzLmxheW91dC5sYXlvdXRDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiBBcyB0aGUgdXNlciBzY3JvbGxzIG9uIHRoZSB4IGF4aXMgb2YgdGhlIGJvZHkgb2YgdGhlIHRhYmxlLCB3ZVxyXG4gICAgICAgICAgICAgKiBuZWVkIHRvIG1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgY29sdW1uIGhlYWRlcnMgb2YgdGhlIHRhYmxlIGludG9cclxuICAgICAgICAgICAgICogdmlldy5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWFyZ2luLWxlZnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHstdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdH1weGApO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kZWZhdWx0U29ydENvbHVtbiAmJiB0aGlzLmRlZmF1bHRTb3J0TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRDb2x1bW4gPSB0aGlzLmRlZmF1bHRTb3J0Q29sdW1uO1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRDb2x1bW4uc29ydE1vZGUgPSB0aGlzLmRlZmF1bHRTb3J0TW9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hY2Nlc2liaWxpdHlNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5yZWdpc3Rlck9uRWxlbWVudEZvY3VzaW5nRXZlbnRIYW5kbGVyID1cclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNpYmlsaXR5TWFuYWdlci5yZWdpc3RlckVsZW1lbnRGb2N1c2luZ0V2ZW50KHRoaXMub25FbGVtZW50Rm9jdXNpbmcuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUFyaWFBdHRyaWJ1dGVzKCk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IGxvb2sgaW50byBpbXByb3ZlbWVudHMsIGFkZGluZyBzZXRUaW1lb3V0IGhlcmUgbWFrZXMgdGhlIGNvbXBvbmVudCBsaWZlIGN5Y2xlIGhhcmQgdG8gbWFuYWdlXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50SW5UcmFwKHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkVXNlTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQgPSAhbmV4dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnMoKTtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25IZWFkZXJUYWJsZVByZXNzZWQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBsZXQgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlVwQXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRG93bkFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb0hlYWRPZlJlbmRlcmVkSXRlbXMoKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9IERvbS5nZXROZXh0Wm9uZUVsZW1lbnQoY3VycmVudEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24pIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbnRlbnRUYWJsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5vbkNvbnRlbnRUYWJsZUtleVVwKGV2ZW50LCB0aGlzLmNvbnRlbnRFbGVtZW50LCB0aGlzLmVkaXRhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFyYml0cmFyeVNjcm9sbChzY3JvbGxUb3A6IG51bWJlciwgaXNJbmNyZW1lbnQ/OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKGlzSW5jcmVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWlzSW5jcmVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGlmIChkaWZmID4gc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgKz0gc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPD0gc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIC0gc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBpZiAoZGlmZiA+IHNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIC09IHNjcm9sbFRvcDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmIDw9IHNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29udGVudFRhYmxlUHJlc3NlZChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9PSBLZXlDb2RlLkN0cmwgJiYgZXZlbnQua2V5Q29kZSAhPT0gS2V5Q29kZS5TaGlmdCkge1xyXG4gICAgICAgICAgICBDb3JlRW52aXJvbm1lbnQuYWNjZXNzaWJpbGl0eU1hbmFnZXIuY2hhbmdlQWNjZXNzaWJpbGl0eU1vZGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldDtcclxuICAgICAgICBjb25zdCBjdXJyZW50Um93ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IodGFyZ2V0RWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAvLyBjdHJsS2V5IGZvciBzaW5nbGUgc2VsZWN0aW9uIG1vZGUgd29ya3MgZmluZVxyXG4gICAgICAgIC8vIGN0cmxLZXkgZm9yIG11bHRpcGxlIHNlbGVjdGlvbiB3aWxsIGJlIHJlZ2FyZGVkIGFzIHNlbGVjdCBhbGwgcm93cyB0aGF0XHJcbiAgICAgICAgLy8gd2lsbCBiZSBoYW5kbGVkIG5vdCBoZXJlLlxyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlICYmICFldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJldHVybiA9IHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXJcclxuICAgICAgICAgICAgICAgIC5lZGl0YWJsZURhdGFUYWJsZU9uQ29udGVudFRhYmxlUHJlc3NlZEhhbmRsZXIoZXZlbnQsIHRhcmdldEVsZW1lbnQsIGN1cnJlbnRSb3csIHRoaXMubGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQpO1xyXG4gICAgICAgICAgICBpZiAoc2hvdWxkUmV0dXJuKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLkN0cmwgfHwgZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5TaGlmdCkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50UmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKV07XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlvdXNBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXg7XHJcbiAgICAgICAgLy8gRm9yIG5vdyBhc3N1bWluZyB0cmVlIHRhYmxlIGZpcnN0IGZvY3VzIG9uIHJvdyBhbmQgdGhlblxyXG4gICAgICAgIC8vIHRoZSB1c2VyIGhhcyB0byBoaXQgZW50ZXIvc3BhY2UgdG8gc2VsZWN0IHRoaXMgZm9jdXNlZCBpdGVtXHJcbiAgICAgICAgLy8gRm9yIG90aGVyIHR5cGUgb2YgdGFibGUgd2lsbCBmaXJzdCBzZWxlY3QgYW5kIHRoZW4gYXV0b21hdGljYWxseSBmb2N1cyBieSBkZWZhdWx0XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0QW5kRm9jdXMgPSAhdGhpcy5zaG93QXNUcmVlO1xyXG5cclxuICAgICAgICAvLyBPbmx5IHRoZSBzY3JvbGxpbmcgcmVsYXRlZCBuYXZpZ2F0aW9uIGtleWJvYXJkIG9wZXJhdGlvbnMgbmVlZCBkZWJvdW5jaW5nLlxyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuQTpcclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHNlbGVjdCBhbGwgaGFuZGxlclxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYWxzbyBoYW5kbGUgd2hlbiBlZGl0YWJsZSBkYXRhdGFibGUgYW5kIHRoZSBmb2N1cyBpcyBpbiBzbWUtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSAmJiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzU21lRm9ybUZpZWxkKHRhcmdldEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuc2hpZnRLZXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFsbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuSG9tZTpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb0hlYWRPZlJlbmRlcmVkSXRlbXMoc2VsZWN0QW5kRm9jdXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuVXBBcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Nyb2xsIHVwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJiaXRyYXJ5U2Nyb2xsKHRoaXMuZGVmYXVsdFNjcm9sbFBpeGVscywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgPiAwIHx8IHRoaXMuZ2V0QWN0aXZlRm9jdXNlZEl0ZW1JbmRleCgpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb1ByZXZpb3VzUmVuZGVyZWRJdGVtKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbGVtZW50ID0gRG9tLmdldFByZXZpb3VzWm9uZUVsZW1lbnQoY3VycmVudEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRG93bkFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzY3JvbGwgZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFyYml0cmFyeVNjcm9sbCh0aGlzLmRlZmF1bHRTY3JvbGxQaXhlbHMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3aXRoIHNoaWZ0S2V5IG1lYW5zIG5lZWRzIHNlbGVjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRSZW5kZXJlZEl0ZW0oZXZlbnQuc2hpZnRLZXkgPyB0cnVlIDogc2VsZWN0QW5kRm9jdXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5QYWdlVXA6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9QcmV2aW91c1BhZ2VPZlJlbmRlcmVkSXRlbXMoc2VsZWN0QW5kRm9jdXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuUGFnZURvd246XHJcbiAgICAgICAgICAgICAgICBpZiAoKDxIVE1MRWxlbWVudD5ldmVudC5zcmNFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvTmV4dFBhZ2VPZlJlbmRlcmVkSXRlbXMoc2VsZWN0QW5kRm9jdXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5FbmQ6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9FbmRPZlJlbmRlcmVkSXRlbXMoc2VsZWN0QW5kRm9jdXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuU3BhY2U6XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5FbnRlcjpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZEVudGVyU3BhY2UoY3VycmVudFJlbmRlcmVkSXRlbSxcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RBbmRGb2N1cywgZXZlbnQsIHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5MZWZ0QXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkTGVmdEFycm93KGN1cnJlbnRSZW5kZXJlZEl0ZW0sIHRhcmdldEVsZW1lbnQsIGN1cnJlbnRSb3cpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5SaWdodEFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZFJpZ2h0QXJyb3coY3VycmVudFJlbmRlcmVkSXRlbSwgdGFyZ2V0RWxlbWVudCwgY3VycmVudFJvdyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZvciB0aGUgdHJlZSB0YWJsZSBub3cgd2UgZmlyc3QgZm9jdXMgYW5kIHRoZW4gdXNlIHRoZSByaWdodCBhcnJvdyBrZXkgb3IgZW50ZXIgb3Igc3BhY2UgdG8gc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBsb2dpYyBiZWZvcmUgaGVyZSBvbmx5IGRpZCBhbiBhcnJvdyB1cC9kb3duIGtleSwgd2UgbmVlZCB0aGUgc2VsZWN0aW9uIGhhcHBlbmluZyBhcyB3ZWxsXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRTaG93QXNUcmVlSGVscGVyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oZXZlbnQsIHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4XSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5VcEFycm93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4LS07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuRG93bkFycm93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24pIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRGVib3VuY2VUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNvbnRlbnRUYWJsZVByZXNzZWRTaG93QXNUcmVlSGVscGVyKCkge1xyXG4gICAgICAgIC8vIElmIHRyZWUgdGFibGUgYW5kIHRoZSBjdXJyZW50IGZvY3VzZWQgZWxlbWVudCBpbmRleCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc2VsZWN0ZWQgb25lXHJcbiAgICAgICAgLy8gV2lsbCBzZWxlY3QgdGhlIHJvdyBiYXNlZCBvbiBmb2N1c2VkIGVsZW1lbnRcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ICE9PSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgodGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgodGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUga2V5Ym9hcmQgcHJlc3MgZXZlbnQgZm9yIGVudGVyIGFuZCBzcGFjZVxyXG4gICAgICogVG8gdHJpZ2dlciB0aGlzIGZ1bmN0aW9uLCBlaXRoZXIgZm9jdXMgb24gdGFibGUgcm93IG9yIHRhYmxlIHJvdyBjZWxsIHRlbXBsYXRlIGFuZFxyXG4gICAgICogY2xpY2sgdGhlICdlbnRlcicgb3IgJ3NwYWNlJyBidXR0b24uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25Db250ZW50VGFibGVQcmVzc2VkRW50ZXJTcGFjZShjdXJyZW50UmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIHNlbGVjdEFuZEZvY3VzOiBib29sZWFuLFxyXG4gICAgICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50LCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIC8vIGlmIGZhbHNlLCBmb2N1c2VkIG9uIHRhYmxlIHJvdyBjZWxsIHRlbXBsYXRlXHJcbiAgICAgICAgLy8gaWYgdHJ1ZSwgZm9jdXNlZCBvbiB0YWJsZSByb3cgaXRlbSBjb21wb25lbnRcclxuICAgICAgICBsZXQgZm9jdXNlZE9uUm93Q29tcG9uZW50ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQgJiYgdGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QgJiYgdGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSkge1xyXG4gICAgICAgICAgICBmb2N1c2VkT25Sb3dDb21wb25lbnQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQua2V5Q29kZSkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5TcGFjZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2Ygc3BhY2Ugb24gYSBkYXRhIHRhYmxlIGlzIHRvIG1vdmUgdG8gdGhlIG5leHQgcGFnZVxyXG4gICAgICAgICAgICAgICAgLy8gT3VyIGRhdGEgdGFibGUgYmVoYXZlcyBleGFjdGx5IHRoZSBzYW1lIGFzIHdpbmRvd3MgMTAgZmlsZSBleHBsb3JlclxyXG4gICAgICAgICAgICAgICAgLy8gT24gc3BhY2UvZW50ZXIgd2lsbCBib3RoIHNlbGVjdCB0aGUgY3VycmVudCByb3cuXHJcbiAgICAgICAgICAgICAgICAvLyBTbyBhbHdheXMgZGVjbGluZSBkZWZhdWx0IGZ1bmN0aW9uIGZvciBzcGFjZSBrZXlib2FyZCBldmVudCBhcyBsb25nIGFzIGZvY3VzIGlzIG9uIHRoZSByb3cgYmVjYXVzZVxyXG4gICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IG5lZWQgdGhlIG1vdmUgdG8gdGhlIG5leHQgcGFnZSBiZWhhdmlvclxyXG4gICAgICAgICAgICAgICAgaWYgKGZvY3VzZWRPblJvd0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIElmIEtleUNvZGUgaXMgRW50ZXIsIGp1c3QgcmVtYWluIHRoZSBjdXJyZW50IHZhbHVlIG9mIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb25cclxuICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBkaXNhYmxlIHRoZSBlbnRlciBrZXkgZGVmYXVsdCBmdW5jdGlvblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKTtcclxuICAgICAgICAgICAgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLm9uSXRlbUNoZWNrQm94Q2xpY2tlZChjdXJyZW50UmVuZGVyZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IHNlbGVjdCBhIHJvdy4gbm90IGV4cGFuZC9jb2xsYXBzZSBpdFxyXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJldmVudEVudGVyS2V5Rm9yRGVmYXVsdEFjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRvdWJsZUNsaWNrUm93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2luZy5sb2coe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogTG9nTGV2ZWwuRGVidWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdObyBldmVudCBoYW5kbGVyIGJpbmQgdG8gXCJkb3VibGVDbGlja1Jvd1wiIGV2ZW50LicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ0RhdGFUYWJsZUNvbXBvbmVudC5vbkNvbnRlbnRUYWJsZVByZXNzZWQnXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RBbmRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3VibGVDbGlja1JvdyhudWxsLCBjdXJyZW50UmVuZGVyZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQua2V5Q29kZSAmJiBldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLkVudGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQ29udGVudFRhYmxlUHJlc3NlZFJpZ2h0QXJyb3coY3VycmVudFJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgY3VycmVudFJvdzogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKTtcclxuICAgICAgICAgICAgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrR3JvdXBUb2dnbGUoY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSXRlbSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVHJlZVRhYmxlUGFyZW50Tm9kZShjdXJyZW50UmVuZGVyZWRJdGVtKSkge1xyXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRSZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUobnVsbCwgY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRSZW5kZXJlZEl0ZW0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IERvbS5nZXROZXh0Rm9jdXNhYmxlRWxlbWVudCh0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgbGV0IHJvd0Zvck5leHRFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IobmV4dEVsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSk7XHJcbiAgICAgICAgICAgIGxldCBjZWxsRm9yTmV4dEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihuZXh0RWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXRkJykpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNlbGxGb3JOZXh0RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnQgPSAtMTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBjZWxsRm9yTmV4dEVsZW1lbnQgJiYgaSA8IGNlbGxGb3JOZXh0RWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxGb3JOZXh0RWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuW2ldID09PSBjZWxsRm9yTmV4dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgcmVtYWluIGZvY3VzIG9uIHRoZSBmaXJzdCBjaGVja2JveCB3aGVuIGl0IGlzIGVkaXRhYmxlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwICYmICF0aGlzLmVkaXRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRGF0YVRhYmxlQ2hlY2tCb3hIVE1MRWxlbWVudChuZXh0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0RWxlbWVudCBpcyB0aGUgY2hlY2tib3ggaW4gZmlyc3QgY29sdW1uLCBtb3ZlIG9uIHRoZSBuZXh0IGNhbmRpZGF0ZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KG5leHRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0Zvck5leHRFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxGb3JOZXh0RWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS10ZCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCAhPT0gLTFcclxuICAgICAgICAgICAgICAgICYmIGN1cnJlbnRSb3cgPT09IHJvd0Zvck5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBuZXh0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db250ZW50VGFibGVQcmVzc2VkTGVmdEFycm93KGN1cnJlbnRSZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQsIGN1cnJlbnRSb3c6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRTaG93QXNUcmVlSGVscGVyKCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrR3JvdXBUb2dnbGUoY3VycmVudFJlbmRlcmVkSXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBJdGVtKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVHJlZVRhYmxlUGFyZW50Tm9kZShjdXJyZW50UmVuZGVyZWRJdGVtKSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShldmVudCwgY3VycmVudFJlbmRlcmVkSXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4XS5ub2RlLnBhcmVudDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUgPT09IHBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gRG9tLmdldFByZXZpb3VzRm9jdXNhYmxlRWxlbWVudCh0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3Qgcm93Rm9yUHJldmlvdXNFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IoXHJcbiAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxGb3JQcmV2aW91c0VsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXRkJykpO1xyXG4gICAgICAgICAgICBpZiAoY2VsbEZvclByZXZpb3VzRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnQgPSAtMTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBjZWxsRm9yUHJldmlvdXNFbGVtZW50ICYmIGkgPCBjZWxsRm9yUHJldmlvdXNFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEZvclByZXZpb3VzRWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuW2ldID09PSBjZWxsRm9yUHJldmlvdXNFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwICYmIHByZXZpb3VzRWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcmV2aW91c0VsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1jaGVja2JveCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXNFbGVtZW50IGlzIHRoZSBjaGVja2JveCBpcyBpbiB0aGUgZmlyc3QgY29sdW1uLCB0aGVuIHNraXAgaXQsIGRpcmVjdGx5IGdvIHRvIHRoZSByb3cuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQgPSByb3dGb3JQcmV2aW91c0VsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQgPT09IGN1cnJlbnRSb3cgfHwgcm93Rm9yUHJldmlvdXNFbGVtZW50ICE9PSBjdXJyZW50Um93KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyb3dGb3JQcmV2aW91c0VsZW1lbnQgPT09IGN1cnJlbnRSb3cpIHtcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1RyZWVUYWJsZVBhcmVudE5vZGUodHJlZU5vZGVJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJlZU5vZGVJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGUgJiYgIXRyZWVOb2RlSXRlbS5ub2RlLmlzTGVhZjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZW50SXRlbUZvY3VzZWQoZXZlbnQsIHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cyA9IGVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgIDxIVE1MRWxlbWVudD5kb2N1bWVudC5hY3RpdmVFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtdGQnKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyRWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKHRkRWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgaWYgKHRyRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGRFbGVtZW50cyA9IHRyRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLXRkJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRkRWxlbWVudHNbaV0gPT09IHRkRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbnRlbnRJdGVtQmx1cnJlZChldmVudCwgcmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRBcmVhSGFzRm9jdXMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmVkaXRhYmxlTmV3Um93SGFzRm9jdXMgPSBmYWxzZTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZW5kZXJlZEl0ZW1Sb3dGb2N1c091dChyZW5kZXJlZEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZUVkaXRhYmxlRGF0YVJvdyhkYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQgZGF0YUV4aXN0c0luSW50ZXJuYWxJdGVtcyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnRlcm5hbEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT50aGlzLmludGVybmFsSXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmNvbnRlbnQgPT09IGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGRhdGFFeGlzdHNJbkludGVybmFsSXRlbXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kSW5BZGRlZEl0ZW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtc1tqXSA9PT0gaXRlbS5jb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMuc3BsaWNlKGosIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluQWRkZWRJdGVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtc1tqXSA9PT0gaXRlbS5jb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtcy5zcGxpY2UoaiwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kSW5BZGRlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuZGVsZXRlZEl0ZW1zLnB1c2goaXRlbS5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxJdGVtcy5zcGxpY2UoaSwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyh0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSb3cgbm90IHlldCBhZGRlZCB0byBpbnRlcm5hbEl0ZW1zLCBqdXN0IHJlZnJlc2hcclxuICAgICAgICBpZiAoIWRhdGFFeGlzdHNJbkludGVybmFsSXRlbXMpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyh0cnVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c2VkKGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jYW5jZWxMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudEZvY3VzT25jZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXRlTkdDbGFzc0ZvclJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHJlbmRlcmVkSXRlbS5pbmRleCA9PT0gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpLFxyXG4gICAgICAgICAgICAnc21lLXRhYmxlLWdyb3VwLWl0ZW0nOiByZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEl0ZW0sXHJcbiAgICAgICAgICAgICdzbWUtdGFibGUtZ3JvdXAtaGVhZGVyJzogcmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIsXHJcbiAgICAgICAgICAgICdzbWUtY2hlY2tlZCc6IHRoaXMuaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuc2VsZWN0aW9uICYmIHRoaXMuc2VsZWN0aW9uLmxlbmd0aCA+IDAgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoID09PSB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJlZU5vZGVEYXRhSXRlbSA9IDxUcmVlTm9kZURhdGFJdGVtPnRoaXMuZmlsdGVyZWRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRyZWVOb2RlRGF0YUl0ZW0gfHwgIXRyZWVOb2RlRGF0YUl0ZW0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0SG92ZXJlZFJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaG92ZXJlZFJlbmRlcmVkSXRlbUluZGV4ID0gcmVuZGVyZWRJdGVtLmluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnNldEhvdmVyZWRSZW5kZXJlZEl0ZW0ocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5ob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXggPT09IHJlbmRlcmVkSXRlbS5pbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLmhvdmVyZWRSZW5kZXJlZEl0ZW1JbmRleCA9IC0xO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldElzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCgpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgaXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLXNtZS1sYXN0LWZvY3VzYWJsZS1zaGFkb3ctZWxlbWVudCcpKSB7XHJcbiAgICAgICAgICAgIGlzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVSZW5kZXJlZEl0ZW1Sb3dGb2N1c091dChyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICAgICAgaWYgKGVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzaG91bGRBZGROZXdSb3cgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgaGFuZGxlIGlmIGFueSBmb3JtIGZpZWxkIGlzIGRpcnR5IHRoZW4gdmFsaWRhdGVcclxuICAgICAgICAgICAgICAgIGxldCBhdExlYXN0T25lRmllbGREaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHMuZm9yRWFjaChsb2FkZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZENvbnRhaW5lciA9IDxGb3JtRmllbGRDb250YWluZXI+bG9hZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXIucmVuZGVyZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlckRhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+bG9hZGVyLnJlbmRlcmVkSXRlbS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyRGF0YUl0ZW0uaXNOZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtRmllbGRDb250YWluZXIuaXNEaXJ0eSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRMZWFzdE9uZUZpZWxkRGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIGFsc28gaGFuZGxlIHdoZW4gZm9jdXNpbmcgb3V0IGZyb20gdGhlIGxhc3QgZm9ybSBmaWVsZCBpbiB0aGUgcm93XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQgPSB0aGlzLmdldElzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdExlYXN0T25lRmllbGREaXJ0eSB8fCBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGROZXdSb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnRzLmZvckVhY2gobG9hZGVyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkQ29udGFpbmVyID0gPEZvcm1GaWVsZENvbnRhaW5lcj5sb2FkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXIucmVuZGVyZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZXJEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPmxvYWRlci5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXJEYXRhSXRlbS5pc05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm9ybUZpZWxkQ29udGFpbmVyLmNoZWNrVmFsaWRhdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZE5ld1JvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRBZGROZXdSb3cgJiYgdGhpcy5lZGl0YWJsZUF1dG9OZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RGF0YUl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnQpKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdmVycmlkZU5ld0RhdGFIYW5kbGVyID0gZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFJdGVtID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVSb3dBZGRlZC5lbWl0KHsgZGF0YTogbmV3RGF0YUl0ZW0sIG92ZXJyaWRlTmV3RGF0YUhhbmRsZXI6IG92ZXJyaWRlTmV3RGF0YUhhbmRsZXIgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRJdGVtLmRhdGEuY29udGVudCA9IG5ld0RhdGFJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbS5kYXRhLmlzTmV3Um93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zLnB1c2gocmVuZGVyZWRJdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMucHVzaChuZXdEYXRhSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VzZXRVcGRhdGVkLmVtaXQodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsSXRlbXMucHVzaChuZXdEYXRhSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG91bGRTaG93RWRpdFJvdyhyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQWxsRWRpdGFibGVSb3dzVmlzaWJsZSkgeyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkSXRlbS5pbmRleCA9PT0gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXHJcbiAgICAgICAgICAgIHx8IHRoaXMuaGFzVmFsaWRhdGlvbkVycm9yKHJlbmRlcmVkSXRlbSlcclxuICAgICAgICAgICAgfHwgcmVuZGVyZWRJdGVtLmluZGV4ID09PSB0aGlzLmhvdmVyZWRSZW5kZXJlZEl0ZW1JbmRleFxyXG4gICAgICAgICAgICB8fCBlZGl0YWJsZURhdGFJdGVtLmlzTmV3Um93O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW1wbGVtZW50cyB0aGUgQWZ0ZXJWaWV3SW5pdCBpbnRlcmZhY2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVTY3JvbGxiYXJXaWR0aCgpO1xyXG5cclxuICAgICAgICBjb25zdCBzY3JvbGxIYW5kbGVyID0gKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGVkRG93biA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA+IDA7XHJcbiAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2Nyb2xsZWREb3duKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxhenkgbG9hZGluZyBpcyBlbmFibGVkLCByZWR1Y2UgdGhlIGZyZXFlbmN5IG9mIGhhbmRsaW5nIHNjcm9sbGluZ1xyXG4gICAgICAgICAgICAgICAgLy8gZXNwZWNpYWxseSBkb2luZyB0aGUgZGF0YSBsYXp5IGxvYWRpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmdFdmVudEhhbmRsZXJTZXR1cCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNjcm9sbENoZWNrSW50ZXJ2YWwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTY3JvbGxpbmdFdmVudEhhbmRsZXJTZXR1cCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZ0V2ZW50SGFuZGxlclNldHVwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTY3JvbGxpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ2hlY2tJbnRlcnZhbER1cmF0aW9uKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMuZXZlbnRVbnJlZ2lzdHJhdGVySGFuZGxlcnMucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRpYWxpemVVSSgpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tJbW1lZGlhdGVWYWxpZGF0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgY2hlY2tJbW1lZGlhdGVWYWxpZGF0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnRzLmZvckVhY2gobG9hZGVyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZENvbnRhaW5lciA9IDxGb3JtRmllbGRDb250YWluZXI+bG9hZGVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvYWRlci5yZW5kZXJlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGRDb250YWluZXIuaW1tZWRpYXRlVmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbXBsZW1lbnRzIHRoZSBPbkRlc3Ryb3kgaW50ZXJmYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuc2Nyb2xsQ2hlY2tJbnRlcnZhbCk7XHJcbiAgICAgICAgdGhpcy5ldmVudFVucmVnaXN0cmF0ZXJIYW5kbGVycy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpdGVtKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlcikge1xyXG4gICAgICAgICAgICB0aGlzLnVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5sYXlvdXRDaGFuZ2VTdWJzY3JpYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Q2hhbmdlU3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXJTdWJzY3JpYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyU3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGltcGxlbWVudHMgdGhlIEFmdGVyVmlld0NoZWNrZWQgaW50ZXJmYWNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3Q2hlY2tlZCgpO1xyXG4gICAgICAgIHRoaXMuYWxpZ25Db250ZW50KCk7XHJcbiAgICAgICAgdGhpcy5hbGlnblNjcm9sbEJhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgc2VsZWN0aW9uIG9mIHRoZSBnaXZlbiBkYXRhIHRhYmxlIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCwgaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IG11bHRpcGxlU2VsZWN0TW9kZSA9IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5Ob3JtYWw7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZVNlbGVjdE1vZGUgPSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuUGljaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlU2VsZWN0TW9kZSA9IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5TZXF1ZW50aWFsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGFibGUgJiYgKDxIVE1MRWxlbWVudD5ldmVudC5zcmNFbGVtZW50KS50YWdOYW1lID09PSAnSU5QVVQnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlvdXNBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXg7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpdGVtID8gaXRlbS5pbmRleCA6IC0xKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0YWJsZSkge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlICE9PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0Wyd0eXBlJ10gPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBpdGVtLm5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZVNlbGVjdGVkLmVtaXQoeyBub2RlOiBpdGVtLm5vZGUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0QW5kQ2hlY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZVNlbGVjdE1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5Ob3JtYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goY3VycmVudEl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGN1cnJlbnRJdGVtLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oaXRlbS5ub2RlLCB0cnVlLCBmYWxzZSwgIXRoaXMubGlua1BhcmVudENoaWxkcmVuU2VsZWN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlU2VsZWN0ZWQuZW1pdCh7IG5vZGU6IGl0ZW0ubm9kZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXVsdGlwbGVTZWxlY3RNb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuUGljaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oaXRlbS5ub2RlLCAhaXRlbS5ub2RlLnNlbGVjdGVkLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtdWx0aXBsZVNlbGVjdE1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5TZXF1ZW50aWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NtZS11c2VyLXNlbGVjdC1ub25lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGVhclRleHRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldmlvdXNBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCAhPT0gLTEgJiYgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9IHRoaXMucHJldmlvdXNBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZCA9IGl0ZW0uaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaW5kZXggPCB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZWQgYSBidWcgdGhhdCB0cmVlIHRhYmxlIG11bHRpcGxlIHNlbGVjdGlvbiB3aWxsIGxvc3QgZm9jdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0UGFyZW50OiBUcmVlTm9kZURhdGFJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS50eXBlICE9PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UGFyZW50ID0gdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBlbmQgKyAxOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24odGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmludGVybmFsU2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RBbmRDaGVjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpcGxlU2VsZWN0TW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlBpY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uSXRlbUNoZWNrQm94Q2xpY2tlZChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpcGxlU2VsZWN0TW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNlcXVlbnRpYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NtZS11c2VyLXNlbGVjdC1ub25lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuY2xlYXJUZXh0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICE9PSAtMSAmJiB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9IHRoaXMucHJldmlvdXNBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZCA9IGl0ZW0uaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmluZGV4IDwgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpdGVtLmluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uSXRlbUNoZWNrQm94Q2xpY2tlZCh0aGlzLnJlbmRlcmVkSXRlbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBbaXRlbS5kYXRhXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiBpdGVtLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMuZWRpdGFibGUgPyBpdGVtLmRhdGEuY29udGVudCA6IGl0ZW0uZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogdGhpcy5lZGl0YWJsZSA/IGl0ZW0uZGF0YS5jb250ZW50IDogaXRlbS5kYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50ICYmICFEb20uaXNGb2N1c2FibGUoPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBmdW5jdGlvbiB0byBmb2N1cyBvbiBlbXB0eSBtZXNzYWdlIHdoZW4gdGhlIGRhdGEgdGFibGUgaXMgZW1wdHlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzRW1wdHlNZXNzYWdlKCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVtcHR5TWVzc2FnZUVsZW1lbnQgJiYgdGhpcy5lbXB0eU1lc3NhZ2VFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgaXRlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zY3JvbGxCb2R5RWxlbWVudCAmJiB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZXNldFRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVmZXJyZWRUcnlUb0ZvY3VzRW1wdHlNZXNzYWdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwcml2YXRlIGRlZmVycmVkVHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZSgpIHtcclxuICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudC0tO1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVzZXRUcnlUb0ZvY3VzRW1wdHlNZXNzYWdlQ291bnQoKSB7XHJcbiAgICAgICAgdGhpcy50cnlUb0ZvY3VzRW1wdHlNZXNzYWdlQ291bnQgPSAzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcmV0dXJucyB0aGUgbm8gcmVjb3JkcyBtZXNzYWdlIHdoZW4gdGhlIGRhdGEgdGFibGUgaXMgZW1wdHkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXROb1JlY29yZHNNZXNzYWdlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9SZWNvcmRNZXNzYWdlIHx8IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuTm9SZWNvcmRzRm91bmQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBiZWhhdmlvciB0aGF0IHdoZW4gYSBncm91cCB0b2dnbGUgaXMgY2xpY2tlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsaWNrR3JvdXBUb2dnbGUoaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpdGVtLmluZGV4KTtcclxuICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2l0ZW0uZGF0YV0gPSB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgIT09IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAgIHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSA6ICF0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2l0ZW0uZGF0YV07XHJcbiAgICAgICAgdGhpcy5ncm91cFRvZ2dsZUNsaWNrLmVtaXQoaXRlbS5kYXRhKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgYmVoYXZpb3IgdGhhdCB3aGVuIGEgdHJlZSBub2RlIHRvZ2dsZSBpcyBjbGlja2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xpY2tUcmVlVG9nZ2xlKGV2ZW50OiBFdmVudCwgaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtLm5vZGUuZXhwYW5kZWQgPSB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgIT09IHVuZGVmaW5lZCA/IHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSA6ICFpdGVtLm5vZGUuZXhwYW5kZWQ7XHJcbiAgICAgICAgaWYgKGl0ZW0ubm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVFeHBhbmRlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZUNvbGxhcHNlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmdldFRyZWVOb2RlRGF0YUlkZW50aXR5KGl0ZW0ubm9kZSk7XHJcbiAgICAgICAgdGhpcy50cmVlVG9nZ2xlU3RhdHVzW2lkZW50aXR5XSA9IGl0ZW0ubm9kZS5leHBhbmRlZDtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBleHBhbmRzIGFsbCB0aGUgZ3JvdXBzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhwYW5kQWxsR3JvdXAoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBpbiB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzLmhhc093blByb3BlcnR5KGdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgY29sbGFwc2VzIGFsbCB0aGUgZ3JvdXBzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGFzZUFsbEdyb3VwKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgaW4gdGhpcy5ncm91cFRvZ2dsZVN0YXR1cykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1cy5oYXNPd25Qcm9wZXJ0eShncm91cCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBdID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXR1cm5zIHRoZSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGdpdmVuIGNvbHVtbiBpcyB0aGUgZmlyc3QgZGF0YSBjb2x1bW4uXHJcbiAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIHVzZWQgdG8gYWRkIHNvbWUgY3VzdG9tIGNzcyBmb3IgdGhlIGZpcnN0IGRhdGEgY29sdW1uIHdoZW4gZ3JvdXBpbmcgaXMgZW5hYmxlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGZpcnN0RGF0YUNvbHVtbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY3VycmVudENvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29sdW1uICE9PSB0aGlzLmdyb3VwQ29sdW1uICYmICFmaXJzdERhdGFDb2x1bW4gJiYgIWN1cnJlbnRDb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdERhdGFDb2x1bW4gPSBjdXJyZW50Q29sdW1uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb2x1bW4gPT09IGZpcnN0RGF0YUNvbHVtbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBpZCBpZiB0aGUgY29sdW1uIGlzIHRoZSBmaXJzdCBhbmQgcmVuZGVyZWQgaXRlbSBoYXMgYSB2YWxpZCBpbmRleCwgb3RoZXJ3aXNlIHJldHVybiBudWxsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGaXJzdENvbHVtbklkKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50LCByZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pIHx8XHJcbiAgICAgICAgICAgICEocmVuZGVyZWRJdGVtICYmIE51bWJlci5pc0ludGVnZXIocmVuZGVyZWRJdGVtLmluZGV4KSAmJiByZW5kZXJlZEl0ZW0uaW5kZXggPj0gMCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5pZEJhZy5maXJzdERhdGFDb2x1bW4gKyByZW5kZXJlZEl0ZW0uaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29sdW1uUmVzaXppbmcoZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc21lLWxheW91dC1ub25lJyk7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGV2ZW50LnggKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbHVtblJlc2l6ZWQoY29sdW1uSW5kZXg6IG51bWJlciwgZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzbWUtbGF5b3V0LW5vbmUnKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sdW1uSGVhZGVyRWxlbWVudHMgPSB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtdGFibGUtY29sdW1uLWhlYWRlcicpO1xyXG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbldpZHRoczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBuZXdDb2x1bW5XaWR0aHMucHVzaChjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aCk7XHJcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUaGUgcmVzaXplciBpcyBhdCB0aGUgcmlnaHQgYm9yZGVyIG9mIHRoZSBjdXJyZW50IGNvbHVtbi5cclxuICAgICAgICAvLyBXaGVuIHRoZSByZXNpemluZyBoYXBwZW5zLCBpdCBtZWFucyByZXNpemluZyB0aGUgY3VycmVudCBjb2x1bW4gd2l0aCBkZWx0YSBhbW91bnRcclxuICAgICAgICAvLyBhbmQgcmVzaXppbmcgdGhlIG5leHQgY29sdW1uIHdpdGggLWRlbHRhIGFtb3VudC5cclxuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uSGVhZGVyRWxlbWVudCA9IGNvbHVtbkhlYWRlckVsZW1lbnRzW2NvbHVtbkluZGV4XTtcclxuICAgICAgICBsZXQgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gY3VycmVudENvbHVtbkhlYWRlckVsZW1lbnQub2Zmc2V0V2lkdGggKyBldmVudC54O1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbmV4dENvbHVtbkhlYWRlciBpcyBoaWRkZW4sIHRoYXQgbWVhbnMgaXQncyBhIGdyb3VwIGNvbHVtbiBoZWFkZXIgd2hpY2ggc2hvdWxkIGJlIGhpZGRlbi5cclxuICAgICAgICAvLyBBIGhpZGRlbiBncm91cCBoZWFkZXIncyB3aWR0aCBzaG91bGQgbm90IGJlIGNvdW50ZWQuXHJcbiAgICAgICAgLy8gVGhlbiBzZXQgdGhlIG5leHRDb2x1bW5JbmRleCB0byB0aGUgbmV4dCBuZXh0IGNvbHVtbidzIGluZGV4LlxyXG4gICAgICAgIGNvbnN0IG5leHRDb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4ICsgKGNvbHVtbkhlYWRlckVsZW1lbnRzW2NvbHVtbkluZGV4ICsgMV0uaGFzQXR0cmlidXRlKCdoaWRkZW4nKSA/IDIgOiAxKTtcclxuICAgICAgICBjb25zdCBuZXh0Q29sdW1uSGVhZGVyRWxlbWVudCA9IGNvbHVtbkhlYWRlckVsZW1lbnRzW25leHRDb2x1bW5JbmRleF07XHJcbiAgICAgICAgbGV0IG5ld1dpZHRoRm9yTmV4dENvbHVtbiA9IG5leHRDb2x1bW5IZWFkZXJFbGVtZW50Lm9mZnNldFdpZHRoIC0gZXZlbnQueDtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiBpcyBsZXNzIHRoZW4gbWluQ29sdW1uV2lkdGgsIGl0IG1lYW5zIHRoZSB1c2VyIGlzIHRyeWluZyB0byBkcmFnIHRoZSByZXNpemVyIHRvIHZlcnkgbGVmdFxyXG4gICAgICAgIC8vIHRvIG1ha2UgdGhlIG5leHQgY29sdW1uIHZlcnkgd2lkZS5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdHJ5IHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBjb2x1bW4gY2FuIGJlIHJlc2l6ZWQgdG8gYXMgd2lkZSBhcyB0aGUgdXNlciB3YW50cy5cclxuICAgICAgICAvLyBUaGUgbGVmdCBzaWRlIGNvbHVtbnMgb2YgdGhlIG5leHQgY29sdW1uIHdpbGwgYmUgc2hyaW5rZWQgYmFzZWQgb24gdGhlaXIgb3duIG9yaWdpbmFsIHBlcmNlbnRhZ2Ugd2lkdGguXHJcbiAgICAgICAgaWYgKG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiA8IERhdGFUYWJsZUNvbXBvbmVudC5taW5Db2x1bW5XaWR0aCkge1xyXG4gICAgICAgICAgICBsZXQgY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbmV4dENvbHVtbkluZGV4ICsgMTsgaSA8IGNvbHVtbkhlYWRlckVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdW1lZFdpZHRoUmlnaHRTaWRlQ29sdW1ucyArPSBjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoUmlnaHRTaWRlQ29sdW1ucyAtIG5leHRDb2x1bW5IZWFkZXJFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoUmlnaHRTaWRlQ29sdW1ucyAtIG5ld1dpZHRoRm9yTmV4dENvbHVtbjtcclxuXHJcbiAgICAgICAgICAgIGxldCBhY3R1YWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGNvbHVtbkluZGV4OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbHVtbldpZHRoID0gTWF0aC5tYXgoXHJcbiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgKiAoY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGggLyBvcmlnaW5hbFdpZHRoRm9yTGVmdFNpZGVDb2x1bW5zKSxcclxuICAgICAgICAgICAgICAgICAgICBEYXRhVGFibGVDb21wb25lbnQubWluQ29sdW1uV2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgbmV3Q29sdW1uV2lkdGhzW2ldID0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyArPSBuZXdDb2x1bW5XaWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW4gPSBuZXdDb2x1bW5XaWR0aHNbY29sdW1uSW5kZXhdO1xyXG4gICAgICAgICAgICBuZXdXaWR0aEZvck5leHRDb2x1bW4gPSB0b3RhbFdpZHRoIC0gY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgLSBhY3R1YWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBuZXdXaWR0aEZvck5leHRDb2x1bW4gaXMgbGVzcyB0aGVuIG1pbkNvbHVtbldpZHRoLCBpdCBtZWFucyB0aGUgdXNlciBpcyB0cnlpbmcgdG8gZHJhZyB0aGUgcmVzaXplciB0byB2ZXJ5IHJpZ2h0XHJcbiAgICAgICAgLy8gdG8gbWFrZSB0aGUgY3VycmVudCBjb2x1bW4gdmVyeSB3aWRlLlxyXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCB0cnkgdG8gbWFrZSBzdXJlIHRoZSBjdXJyZW50IGNvbHVtbiBjYW4gYmUgcmVzaXplZCB0byBhcyB3aWRlIGFzIHRoZSB1c2VyIHdhbnRzLlxyXG4gICAgICAgIC8vIFRoZSByaWdodCBzaWRlIGNvbHVtbnMgb2YgdGhlIGN1cnJlbnQgY29sdW1uIHdpbGwgYmUgc2hyaW5rZWQgYmFzZWQgb24gdGhlaXIgb3duIG9yaWdpbmFsIHBlcmNlbnRhZ2Ugd2lkdGguXHJcbiAgICAgICAgaWYgKG5ld1dpZHRoRm9yTmV4dENvbHVtbiA8IERhdGFUYWJsZUNvbXBvbmVudC5taW5Db2x1bW5XaWR0aCkge1xyXG4gICAgICAgICAgICBsZXQgY29uc3VtZWRXaWR0aExlZnRTaWRlQ29sdW1ucyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGNvbHVtbkluZGV4IC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zICs9IGNvbHVtbkhlYWRlckVsZW1lbnRzW2ldLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zIC0gY3VycmVudENvbHVtbkhlYWRlckVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zIC0gbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uO1xyXG5cclxuICAgICAgICAgICAgbGV0IGFjdHVhbFdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBuZXh0Q29sdW1uSW5kZXg7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29sdW1uV2lkdGggPSBNYXRoLm1heChcclxuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aEZvclJpZ2h0U2lkZUNvbHVtbnMgKiAoY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGggLyBvcmlnaW5hbFdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyksXHJcbiAgICAgICAgICAgICAgICAgICAgRGF0YVRhYmxlQ29tcG9uZW50Lm1pbkNvbHVtbldpZHRoKTtcclxuICAgICAgICAgICAgICAgIG5ld0NvbHVtbldpZHRoc1tpXSA9IG5ld0NvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICAgICAgYWN0dWFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zICs9IG5ld0NvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zIC0gYWN0dWFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zO1xyXG4gICAgICAgICAgICBuZXdXaWR0aEZvck5leHRDb2x1bW4gPSBuZXdDb2x1bW5XaWR0aHNbbmV4dENvbHVtbkluZGV4XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5ld0NvbHVtbldpZHRoc1tjb2x1bW5JbmRleF0gPSBuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW47XHJcbiAgICAgICAgbmV3Q29sdW1uV2lkdGhzW25leHRDb2x1bW5JbmRleF0gPSBuZXdXaWR0aEZvck5leHRDb2x1bW47XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZXMgdGhlIGNvbHVtbiB3aWR0aHMgYmFzZWQgb24gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdHMuXHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICBjb2x1bW4ud2lkdGggPSBuZXdDb2x1bW5XaWR0aHNbaW5kZXhdICsgJ3B4JztcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBjb2x1bW4gcGVyY2VudGFnZXMgYmFzZWQgb24gdGhlIG5ldyBjb2x1bW4gd2lkdGhzLlxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4ud2lkdGhQZXJjZW50YWdlID0gY29sdW1uSGVhZGVyRWxlbWVudHNbaW5kZXhdLm9mZnNldFdpZHRoIC8gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGNvbHVtbiBjbGlja2luZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsaWNrQ29sdW1uKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uU29ydFNldHRpbmdzID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0YWJsZSAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IGNvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Ob25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc29ydE1vZGUgPSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLkRlc2NlbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNTb3J0Q29sdW1uID0gdGhpcy5zb3J0Q29sdW1uO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydENvbHVtbiA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0SXRlbXMoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRTY3JvbGxUb1NlbGVjdGlvbkFmdGVyU29ydGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KGZhbHNlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RoW2ZpZWxkPVwiJyArIGNvbHVtbi5maWVsZCArICdcIl0nKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0cicpLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwMCBpcyBhIHZlcnkgdHJpY2t5IG51bWJlciBoZXJlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIGlzIHRvbyBzbWFsbCwgaXQgd29uJ3QgdHJpZ2dlciB0aGUgbmFycmF0b3IuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgdG9vIGJpZywgdGhlIG5hcnJhdG9yIHdvdWxkIGZpcnN0bHkgcmVhZCB0aGUgY29udGVudCBvZiBUUiBwYXJ0aWFsbHkgdGhlbiB0aGUgY29udGVudCBvZiB0aGUgVEguXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnNvcnRNb2RlID0gRGF0YVRhYmxlU29ydE1vZGUuTm9uZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29sdW1uU29ydFNldHRpbmdzW2l0ZW0uaGVhZGVyXSA9IHRoaXMuZ2V0QXJpYVNvcnRBdHRyaWJ1dGVWYWx1ZShpdGVtKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jb2x1bW5Tb3J0U2V0dGluZ3MgPSBjb2x1bW5Tb3J0U2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSByb3cgZG91YmxlIGNsaWNraW5nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZG91YmxlQ2xpY2tSb3coZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUoZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIHRoaXMucm93RGJsY2xpY2suZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHNjcm9sbHMgdGhlIHNlbGVjdGVkIGl0ZW0gaW50byB0aGUgdmlldyBhbmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRyeVRvTW92ZVRvQ2VudGVyPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGxldCBzZWxlY3Rpb25EYXRhID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvbi5kYXRhO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EYXRhID0gdGhpcy5zZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24ubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EYXRhID0gdGhpcy5zZWxlY3Rpb25bMF0uZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EYXRhID0gdGhpcy5zZWxlY3Rpb25bMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWxlY3Rpb25EYXRhKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSA9PT0gc2VsZWN0aW9uRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cnlUb01vdmVUb0NlbnRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbERhdGFFbGVtZW50ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtRWxlbWVudCA9IHNjcm9sbERhdGFFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1FbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtVG9wID0gc2VsZWN0ZWRJdGVtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzY3JvbGxEYXRhRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgPSBzZWxlY3RlZEl0ZW1Ub3AgKyBzY3JvbGxEYXRhRWxlbWVudC5vZmZzZXRUb3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBjbGlja2luZyBiZWhhdmlvciBvZiBjaGVja2JveC5cclxuICAgICAqIE11bHRpcGxlIHNlbGVjdGlvbiBiZWhhdmlvciBpcyBoYXBwZW5pbmcgaGVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSXRlbUNoZWNrQm94Q2xpY2tlZChpdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIGlzRnJvbUtleWJvYXJkPzogYm9vbGVhbikge1xyXG4gICAgICAgIC8vIElmIHRoZSBpdGVtIGlzIHVuY2hlY2tlZCwgbmVlZCB0byBzZXQgYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggdG8gLTEgdGhlbiB0aGlzIGl0ZW0gd29uJ3QgYmUgaGlnaGxpZ2h0ZWQgaW4gdGhlIFVJLlxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5UcmVlTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLm5vZGUsICFpdGVtLm5vZGUuc2VsZWN0ZWQsIGZhbHNlLCAhdGhpcy5saW5rUGFyZW50Q2hpbGRyZW5TZWxlY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLm5vZGUuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVTZWxlY3RlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRnJvbUtleWJvYXJkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoLTEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUgJiYgIXRoaXMuZWRpdGFibGUgJiYgdGhpcy5leHBhbmRUcmVlTm9kZU9uQ2hlY2tlZCAmJiBpdGVtLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUobnVsbCwgaXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihpdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ucHVzaChpdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93VW5zZWxlY3RlZC5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNGcm9tS2V5Ym9hcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pO1xyXG4gICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmZpbHRlcihjdXJyZW50SXRlbSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChjdXJyZW50SXRlbSwgdGhpcy5ncm91cENvbHVtbi5maWVsZCkgPT09IGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2YoZ3JvdXBJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBncm91cEl0ZW1zW2ldIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uLnB1c2goZ3JvdXBJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGdyb3VwSXRlbXNbaV0gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkICYmICFpc0Zyb21LZXlib2FyZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgtMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5lZWQgdG8gcmVjcmVhdGUgdGhlIFwiaW50ZXJuYWxTZWxlY3Rpb25cIiBhcnJheSBvdGhlcndpc2UgdGhlIGNoYW5nZSBkZXRlY3RvciB3b24ndCBkZXRlY3QgdGhlIGNoYW5nZVxyXG4gICAgICAgIC8vIHNpbmNlIHRoZSBhcnJheSdzIG93biByZWZlcmVuY2UgaXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uc2xpY2UoMCwgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5sZW5ndGgpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgXCJjaGVjayBhbGxcIiBjaGVja2JveCBiZWhhdmlvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQWxsSXRlbUNoZWNrQm94Q2xpY2tlZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5sZW5ndGggIT09IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93VW5zZWxlY3RlZC5lbWl0KHsgZGF0YTogaXRlbSB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFNlbGVjdCA9ICF0aGlzLnNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oaXRlbSwgc2hvdWxkU2VsZWN0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5pbnRlcm5hbFNlbGVjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIGl0ZW0gaXMgc2VsZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlICE9PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGl0ZW0uZGF0YSAmJiB0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2YoaXRlbS5kYXRhKSAhPT0gLTE7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmZpbHRlcihjdXJyZW50SXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGN1cnJlbnRJdGVtLCB0aGlzLmdyb3VwQ29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKSA9PT0gaXRlbS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBpdGVtLmRhdGEgPT09IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBJdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihncm91cEl0ZW1zW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaXRlbS5ub2RlICYmIGl0ZW0ubm9kZS5zZWxlY3RlZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaXRlbS5kYXRhICYmIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ubWFwKGN1cnJlbnRJdGVtID0+IGN1cnJlbnRJdGVtLmRhdGEpLmluZGV4T2YoaXRlbS5kYXRhKSAhPT0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIGEgZ3JvdXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBleHBhbmRlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzR3JvdXBFeHBhbmRlZChncm91cDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyBhbmQgc2V0cyB0aGUgdmlydHVhbCBjb3VudC5cclxuICAgICAqIEl0IG9ubHkgd29ya3Mgd2hlbiBcImxhenlMb2FkXCIgaXMgdHJ1ZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgdmlydHVhbENvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggfHwgdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB2aXJ0dWFsQ291bnQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1zID0gQXJyYXkodmFsdWUpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNbaV0gPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcmVzb2x2ZXMgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBnaXZlbiBwYXRoIHdpdGggbXVsdGlwbGUgbGV2ZWxzIG9mIHByb3BlcnRpZXMuXHJcbiAgICAgKiBBbiBleGFtcGxlIG9mIHBhdGggaXMgXCJsb2NhdGlvbi56aXBDb2RlXCIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXNvbHZlT2JqZWN0UGF0aChvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcclxuICAgICAgICBpZiAocGF0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXRoU2VnbWVudHM6IHN0cmluZ1tdID0gcGF0aC5zcGxpdCgnLicpO1xyXG4gICAgICAgICAgICBpZiAocGF0aFNlZ21lbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ialtwYXRoXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRPYmogPSBvYmo7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aFNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50T2JqID0gY3VycmVudE9ialtwYXRoU2VnbWVudHNbaV1dO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPYmogPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50T2JqID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRPYmo7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJldHVybnMgdGhlIGFjdGl2ZSByZW5kZXJlZCBpdGVtIGluZGV4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGlucHV0OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gaW5wdXQgPj0gMCA/IGlucHV0IDogLTE7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJldHVybnMgdGhlIGFjdGl2ZSBmb2N1c2VkIGl0ZW0gaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCA+IC0xID8gdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4IDogdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KGluZGV4OiBudW1iZXIsIGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGluZGV4LCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBoZWFkIG9mIHRoZSB3aG9sZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9IZWFkT2ZSZW5kZXJlZEl0ZW1zKGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgoMCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gcHJldmlvdXMgcGFnZSBvZiB0aGUgcmVuZGVyZWQgaXRlbSBsaXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW92ZVRvUHJldmlvdXNQYWdlT2ZSZW5kZXJlZEl0ZW1zKGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZG9TZWxlY3Rpb24gPyB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgOiB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTtcclxuICAgICAgICBsZXQgbmV3SW5kZXggPSAwO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXggLSBNYXRoLnJvdW5kKHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KG5ld0luZGV4LCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBwcmV2aW91cyBpdGVtIGluIHRoZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9QcmV2aW91c1JlbmRlcmVkSXRlbShkb1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGRvU2VsZWN0aW9uID8gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIDogdGhpcy5nZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCk7XHJcblxyXG4gICAgICAgIGxldCBuZXdJbmRleCA9IDA7XHJcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KG5ld0luZGV4LCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBuZXh0IGl0ZW0gaW4gdGhlIHJlbmRlcmVkIGl0ZW0gbGlzdC5cclxuICAgICAqIEBwYXJhbSBkb1NlbGVjdGlvbiBpZiB0cnVlIHdpbGwgZG8gc2VsZWN0aW9uIGFuZCBmb2N1cywgb3RoZXJ3aXNlIGZvY3VzIG9ubHlcclxuICAgICAqL1xyXG5cclxuICAgIHB1YmxpYyBtb3ZlVG9OZXh0UmVuZGVyZWRJdGVtKGRvU2VsZWN0aW9uID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZG9TZWxlY3Rpb24gPyB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgOiB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTtcclxuXHJcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICBuZXdJbmRleCA9IGluZGV4ICsgMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgobmV3SW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIG5leHQgcGFnZSBvZiB0aGUgcmVuZGVyZWQgaXRlbSBsaXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW92ZVRvTmV4dFBhZ2VPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBkb1NlbGVjdGlvbiA/IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA6IHRoaXMuZ2V0QWN0aXZlRm9jdXNlZEl0ZW1JbmRleCgpO1xyXG4gICAgICAgIGxldCBuZXdJbmRleCA9IDA7XHJcbiAgICAgICAgbmV3SW5kZXggPSBpbmRleCArIE1hdGgucm91bmQodGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleChuZXdJbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gZW5kIG9mIHRoZSB3aG9sZSByZW5kZXJlZCBsaXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW92ZVRvRW5kT2ZSZW5kZXJlZEl0ZW1zKGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDEsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdGl2YXRlIHRoZSByZW5kZXJlZCBpdGVtIGJ5IGNvbmRpdGlvbi5cclxuICAgICAqIEFjdGl2YXRlIGRvZXNuJ3QgbWVhbiBzZWxlY3QuIEl0IGp1c3QgaW5kaWNhdGVzIHdoaWNoIGl0ZW0gaXMgYWN0aXZlIHRvIHJlY2VpdmVkIG1vcmUgb3BlcmF0aW9ucyBlc3BlY2lhbGx5IGtleWJvYXJkIG9wZXJhdGlvbnMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5Q29uZGl0aW9uKGNvbmRpdGlvbjogKGl0ZW06IERhdGFUYWJsZURhdGFJdGVtKSA9PiBib29sZWFuLCBkb1NlbGVjdGlvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjb25kaXRpb24odGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleCh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uaW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0aXZhdGUgdGhlIHJlbmRlcmVkIGl0ZW0gYnkgaW5kZXguXHJcbiAgICAgKiBBY3RpdmF0ZSBkb2Vzbid0IG1lYW4gc2VsZWN0LiBJdCBqdXN0IGluZGljYXRlcyB3aGljaCBpdGVtIGlzIGFjdGl2ZSB0byByZWNlaXZlZCBtb3JlIG9wZXJhdGlvbnMgZXNwZWNpYWxseSBrZXlib2FyZCBvcGVyYXRpb25zLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpbmRleDogbnVtYmVyLCBkb1NlbGVjdGlvbjogYm9vbGVhbiwgZG9Gb2N1czogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZG9TZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpbmRleCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zICYmIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICYmIHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvblxyXG4gICAgICAgICAgICAmJiB0aGlzLnNlbGVjdEl0ZW1XaGVuTmF2aWdhdGluZ1dpdGhLZXlib2FyZCAmJiBkb1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0obnVsbCwgdGhpcy5yZW5kZXJlZEl0ZW1zW2luZGV4XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzY3JvbGxDb250YWluZXJFbGVtZW50ID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgdG90YWxTY3JvbGxhYmxlU3BhY2UgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IHRvdGFsU2Nyb2xsYWJsZUl0ZW1MZW5ndGggPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0O1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50UmVuZGVyZWRJdGVtU3RhcnRJbmRleCA9IHRvdGFsU2Nyb2xsYWJsZUl0ZW1MZW5ndGggKiBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCAvIHRvdGFsU2Nyb2xsYWJsZVNwYWNlXHJcbiAgICAgICAgICAgICsgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0O1xyXG5cclxuICAgICAgICBsZXQgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggPSAtMTtcclxuICAgICAgICBpZiAoaW5kZXggPj0gTWF0aC5mbG9vcihjdXJyZW50UmVuZGVyZWRJdGVtU3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAtIDEpKSB7XHJcbiAgICAgICAgICAgIG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID0gaW5kZXggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgKyAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZGV4IDw9IGN1cnJlbnRSZW5kZXJlZEl0ZW1TdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgIG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCA+PSAwLCBpdCBtZWFucyB3aGVuIHRoZSByZW5kZXJlZCBpdGVtIGlzIGFjdGl2YXRlZCwgaXQgdHJpZ2dlcnMgc2Nyb2xsaW5nIGluIHRoZSBsaXN0LlxyXG4gICAgICAgIGlmIChuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCdzIHRoZSBuZXcgc2Nyb2xsdG9wIGJhc2VkIG9uIG5ldyByZW5kZXJlZEl0ZW1TdGFydEluZGV4LlxyXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSBNYXRoLmZsb29yKHRvdGFsU2Nyb2xsYWJsZVNwYWNlICogKG5ld1JlbmRlckl0ZW1TdGFydEluZGV4IC8gdG90YWxTY3JvbGxhYmxlSXRlbUxlbmd0aCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzTG9uZ0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgYSBsb25nIGxpc3QsIHdoaWNoIG1lYW5zIG9uZSBwaXhlbCBvZiBzY3JvbGxiYXIgbW92ZW1lbnQgY2F1c2VzIG1vcmUgdGhhbiBvbmUgc2NyZWVuIG9mIHRoZSBsaXN0IHNjcm9sbGluZyxcclxuICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHRydW5jYXRlZCByZW5kZXJlZCBpdGVtIHN0YXJ0IGluZGV4LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkU3RhcnRJbmRleCA9IE1hdGguZmxvb3Ioc2Nyb2xsVG9wIC8gdG90YWxTY3JvbGxhYmxlU3BhY2UgKiB0b3RhbFNjcm9sbGFibGVJdGVtTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgYWN0dWFsIHBvc2l0aW9uIG9mIHRoZSBhY3RpdmF0ZWQgcmVuZGVyZWQgaXRlbSBsaXN0IGNhbiBiZSBtb3JlIHRoYW4gb25lIHNjcmVlbiBiZWxvdyxcclxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIG5ld1JlbmRlckl0ZW1TdGFydEluZGV4IGFuZCB0cnVuY2F0ZWRTdGFydEluZGV4LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlbiBsYXRlciB3aGVuIHdlIHJlbmRlciB0aGUgZGF0YSB0YWJsZSBpdGVtcyBpbiB0aGUgdmlldyBwb3J0LCB3ZSB3aWxsIHVzZSB0aGUgb2Zmc2V0IHRvIGFkanVzdFxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGl0ZW0gbGlzdCB0byBtYWtlIHN1cmUgdGhlIGFjdHVhbCBhY3RpdmF0ZWQgcmVuZGVyZWQgaXRlbSBjYW4gc2hvdyB1cCBpbiB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggLSB0cnVuY2F0ZWRTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgPiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHNjcm9sbHRvcCBhbmQgcmUtY2FsY3VhdGUgdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvRm9jdXMpIHtcclxuICAgICAgICAgICAgaWYgKGRvU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzUm93QnlJbmRleChpbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzUm93QnlJbmRleChpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBcmlhRXhwYW5kZWRBdHRyaWJ1dGVWYWx1ZShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG5cclxuICAgICAgICBpZiAocmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgaXNHcm91cEV4cGFuZGVkID0gdGhpcy5pc0dyb3VwRXhwYW5kZWQocmVuZGVyZWRJdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICBpZiAoaXNHcm91cEV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzR3JvdXBFeHBhbmRlZC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5UcmVlTm9kZSAmJiAhcmVuZGVyZWRJdGVtLm5vZGUuaXNMZWFmKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9ICghIShyZW5kZXJlZEl0ZW0ubm9kZSAmJiByZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCkpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBZGRpdGlvbmFsU2NyZWVuUmVjb3JkZXJDb250ZW50KHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XHJcbiAgICAgICAgc3dpdGNoIChyZW5kZXJlZEl0ZW0udHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGU6XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJOb2RlQ291bnQgPSByZW5kZXJlZEl0ZW0ubm9kZS5jaGlsZHJlbiA/IHJlbmRlcmVkSXRlbS5ub2RlLmNoaWxkcmVuLmxlbmd0aCA6IDA7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBzdWJOb2RlQ291bnQgPT09IDEgPyB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwub25lU3ViTm9kZUluVHJlZU5vZGVcclxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5uU3ViTm9kZXNJblRyZWVOb2RlLmZvcm1hdChzdWJOb2RlQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcjpcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbUNvdW50ID0gdGhpcy5ncm91cEtleXNbcmVuZGVyZWRJdGVtLmRhdGFdLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdyb3VwSXRlbUNvdW50ID09PSAxID8gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLm9uZUl0ZW1Jbkdyb3VwXHJcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwubkl0ZW1zSW5Hcm91cC5mb3JtYXQoZ3JvdXBJdGVtQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkVkaXRhYmxlRGF0YUNoYW5nZWQocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIGZpZWxkOiBzdHJpbmcpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZWRpdGFibGVEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPnJlbmRlcmVkSXRlbS5kYXRhO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFlZGl0YWJsZURhdGFJdGVtLmlzTmV3Um93ICYmIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMuaW5kZXhPZihlZGl0YWJsZURhdGFJdGVtLmNvbnRlbnQpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEl0ZW1JbmRleCA9IHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtcy5pbmRleE9mKGVkaXRhYmxlRGF0YUl0ZW0uY29udGVudCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlZEl0ZW1JbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC51cGRhdGVkSXRlbXMuc3BsaWNlKHVwZGF0ZWRJdGVtSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHZhbGlkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0cy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0c1twcm9wZXJ0eV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW3Byb3BlcnR5XS52YWxpZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLnB1c2goZWRpdGFibGVEYXRhSXRlbS5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlc2V0VXBkYXRlZC5lbWl0KHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXNldEVkaXRhYmxlRGF0YUNoYW5nZXNldCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldCA9IHtcclxuICAgICAgICAgICAgYWRkZWRJdGVtczogW10sXHJcbiAgICAgICAgICAgIHVwZGF0ZWRJdGVtczogW10sXHJcbiAgICAgICAgICAgIGRlbGV0ZWRJdGVtczogW11cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY2hhbmdlc2V0VXBkYXRlZC5lbWl0KHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25WYWxpZGF0aW9uQWxlcnRIYW5kbGVyKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCBmaWVsZDogc3RyaW5nLCBhbGVydDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZWRpdGFibGVEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPnJlbmRlcmVkSXRlbS5kYXRhO1xyXG4gICAgICAgIGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0c1tmaWVsZF0gPSBhbGVydDtcclxuXHJcbiAgICAgICAgcmVuZGVyZWRJdGVtLnZhbGlkYXRpb25SZXN1bHQubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLmZpZWxkICYmIGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0c1tjb2x1bW4uZmllbGRdICYmICFjb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29sdW1uLmhlYWRlcixcclxuICAgICAgICAgICAgICAgICAgICBhbGVydDogZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW2NvbHVtbi5maWVsZF1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaGFzIHZhbGlkYXRpb24gZXJyb3IgaWYgdGhlcmUgYXJlIGFueSB2YWxpZGF0aW9uIGFsZXJ0c1xyXG4gICAgcHVibGljIGhhc1ZhbGlkYXRpb25FcnJvcihyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdCAmJiByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdC5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSb2xlQXR0cmlidXRlRm9yVHJlZVRhYmxlUm93KHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRSb2xlQXR0cmlidXRlRm9yVHJlZVRhYmxlUm93KHJlbmRlcmVkSXRlbSwgdGhpcy5zaG93SGVhZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Um9sZUF0dHJpYnV0ZUZvclRhYmxlUm93Q2VsbChyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0Um9sZUF0dHJpYnV0ZUZvclRhYmxlUm93Q2VsbChyZW5kZXJlZEl0ZW0sIHRoaXMuc2hvd0hlYWRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFyaWFTb3J0QXR0cmlidXRlVmFsdWUoY29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEFyaWFTb3J0QXR0cmlidXRlVmFsdWUoY29sdW1uKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oa2VlcEhpZ2hsaWdodEZyb21Sb3c/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgha2VlcEhpZ2hsaWdodEZyb21Sb3cpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHRGcm9tUm93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVIaWdobGlnaHRGcm9tUm93KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoLTEpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuYXZpZ2F0ZUJ5UGF0aChwYXRoU2VjdGlvbnM6IHN0cmluZ1tdLFxyXG4gICAgICAgIGdldE5vZGVMYWJlbEhhbmRsZXI6IChub2RlOiBUcmVlTm9kZURhdGFJdGVtKSA9PiBzdHJpbmcsXHJcbiAgICAgICAgb25UYXNrRmluaXNoZWRIYW5kbGVyPzogKGZvdW5kOiBib29sZWFuKSA9PiB2b2lkLFxyXG4gICAgICAgIGlzTm9kZUxvYWRpbmdIYW5kbGVyPzogKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0pID0+IGJvb2xlYW4sXHJcbiAgICAgICAgdGltZW91dCA9IDUwMDAsXHJcbiAgICAgICAgb25seVRyaWdnZXJTZWxlY3Rpb25Gb3JMYXN0Tm9kZT86IGJvb2xlYW4sIG1hdGNoRmlyc3RBRmV3PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzayAmJiB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub2RlIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzayA9IHtcclxuICAgICAgICAgICAgcGF0aFNlY3Rpb25zOiBwYXRoU2VjdGlvbnMsXHJcbiAgICAgICAgICAgIGlzUnVubmluZzogdHJ1ZSxcclxuICAgICAgICAgICAgY3VycmVudFBhdGhTZWN0aW9uSW5kZXg6IDAsXHJcbiAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJlZEl0ZW1JbmRleDogMCxcclxuICAgICAgICAgICAgb25UYXNrRmluaXNoZWQ6IG9uVGFza0ZpbmlzaGVkSGFuZGxlcixcclxuICAgICAgICAgICAgY3VycmVudFBhdGhTZWN0aW9uU3RhcnRUaW1lOiBuZXcgRGF0ZSgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVQYXRoTmF2aWdhdGlvbihcclxuICAgICAgICAgICAgZ2V0Tm9kZUxhYmVsSGFuZGxlcixcclxuICAgICAgICAgICAgaXNOb2RlTG9hZGluZ0hhbmRsZXIsXHJcbiAgICAgICAgICAgIHRpbWVvdXQsXHJcbiAgICAgICAgICAgIG9ubHlUcmlnZ2VyU2VsZWN0aW9uRm9yTGFzdE5vZGUsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIG1hdGNoRmlyc3RBRmV3KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWxsSXRlbUNoZWNrQm94QXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpID8gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLnVuc2VsZWN0QWxsSXRlbXNcclxuICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwuc2VsZWN0QWxsSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEluaXRpYWxIb3N0Q2xhc3NlcygpIHtcclxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCkuY29uY2F0KFtcclxuICAgICAgICAgICAgJ3NtZS1kYXRhLXRhYmxlJ1xyXG4gICAgICAgIF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlUGF0aE5hdmlnYXRpb24oZ2V0Tm9kZUxhYmVsSGFuZGxlcjogKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0pID0+IHN0cmluZyxcclxuICAgICAgICBpc05vZGVMb2FkaW5nSGFuZGxlcj86IChub2RlOiBUcmVlTm9kZURhdGFJdGVtKSA9PiBib29sZWFuLFxyXG4gICAgICAgIHRpbWVvdXQ/OiBudW1iZXIsIG9ubHlUcmlnZ2VyU2VsZWN0aW9uRm9yTGFzdE5vZGU/OiBib29sZWFuLFxyXG4gICAgICAgIGxhc3RGb3VuZE5vZGU/OiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIG1hdGNoRmlyc3RBRmV3PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBzaG91bGRDb250aW51ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kTm9kZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5lYXJNYXRjaE5vZGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXggPCB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRSZW5kZXJlZEl0ZW1JbmRleDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRDb250aW51ZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGdldE5vZGVMYWJlbEhhbmRsZXIodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbCA9PT1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9uc1t0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleF0udG9Mb2NhbGVMb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZS5leHBhbmRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4IDwgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShldmVudCwgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kTm9kZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZvdW5kTm9kZSA9IHRoaXMucmVuZGVyZWRJdGVtc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXggPT09IHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uICE9PSB0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0obnVsbCwgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxTZWxlY3RlZEl0ZW1JbnRvVmlldyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sub25UYXNrRmluaXNoZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sub25UYXNrRmluaXNoZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZENvbnRpbnVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05vZGVMb2FkaW5nSGFuZGxlciB8fCAhaXNOb2RlTG9hZGluZ0hhbmRsZXIodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UmVuZGVyZWRJdGVtSW5kZXggPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25TdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZWFyTWF0Y2hOb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zW3RoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxhYmVsLmluZGV4T2YodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleF0udG9Mb2NhbGVMb3dlckNhc2UoKSkgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWFyTWF0Y2hOb2RlID0gdGhpcy5yZW5kZXJlZEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFJlbmRlcmVkSXRlbUluZGV4ID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRlcHRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRSZW5kZXJlZEl0ZW1JbmRleCAtIDFdLmRlcHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQ29udGludWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmROb2RlICYmIG5vdy5nZXRUaW1lKCkgLSB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25TdGFydFRpbWUuZ2V0VGltZSgpID4gdGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLm9uVGFza0ZpbmlzaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5vblRhc2tGaW5pc2hlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVhck1hdGNoTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShudWxsLCBuZWFyTWF0Y2hOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0Rm91bmROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG51bGwsIGxhc3RGb3VuZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBhdGhOYXZpZ2F0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9kZUxhYmVsSGFuZGxlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm9kZUxvYWRpbmdIYW5kbGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUcmlnZ2VyU2VsZWN0aW9uRm9yTGFzdE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Rm91bmROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGaXJzdEFGZXcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgMjAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRpYWxpemVVSSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRlbXBSb3dFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNvcnRJdGVtcygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zICYmIHRoaXMuc29ydENvbHVtbikge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wYXJlRnVuY3Rpb24gPSB0aGlzLnNvcnRDb2x1bW4uc29ydGFibGUgPT09ICdjdXN0b20nID9cclxuICAgICAgICAgICAgICAgIHRoaXMuc29ydENvbHVtbi5jb21wYXJlRnVuY3Rpb24uYmluZCh0aGlzKSA6IHRoaXMuZGVmYXVsdFNvcnRDb21wYXJlRnVuY3Rpb24uYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgY29uc3Qgc29ydERpcmVjdGlvbiA9IHRoaXMuc29ydENvbHVtbi5zb3J0TW9kZSA9PT0gRGF0YVRhYmxlU29ydE1vZGUuQXNjZW5kID8gMSA6IC0xO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmdyb3VwQ29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWRpdGFibGVOZXdSb3dSZW5kZXJlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUgJiYgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtcy5sYXN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVkSXRlbS5kYXRhLmlzTmV3Um93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlTmV3Um93UmVuZGVyZWRJdGVtID0gcmVuZGVyZWRJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMuc3BsaWNlKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSAxLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHNob3VsZEZhbGxCYWNrVG9EZWZhdWx0U29ydCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFscmVhZHlMb2FkZWRBbGxEYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZW5kZXJlZEl0ZW1zW2ldIHx8ICF0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlMb2FkZWRBbGxEYXRhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydENvbHVtbiA9PT0gdGhpcy5wcmV2aW91c1NvcnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRJdGVtcy5yZXZlcnNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlMb2FkZWRBbGxEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldID0geyBpbmRleDogaSwgZGF0YTogdW5kZWZpbmVkLCB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLk5vcm1hbCB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkRmFsbEJhY2tUb0RlZmF1bHRTb3J0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvQ3VzdG9tU29ydC5lbWl0KHtcclxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHNvcnREaXJlY3Rpb24sIGZpZWxkOiB0aGlzLnNvcnRDb2x1bW4uZmllbGQsIGZhbGxCYWNrVG9EZWZhdWx0U29ydDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRGYWxsQmFja1RvRGVmYXVsdFNvcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRGYWxsQmFja1RvRGVmYXVsdFNvcnQgfHwgdGhpcy5kb0N1c3RvbVNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gdGhpcy5yZW5kZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEsIGIuZGF0YSwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gdGhpcy5yZW5kZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEuY29udGVudCwgYi5kYXRhLmNvbnRlbnQsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBpbiBcImVsc2VcIiBibG9jayBoYW5kbGVzIHRoZSBzb3J0IGluIHRoZSB0cmVlIG5vZGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBzb3J0cyB0aGUgdHJlZSBub2RlcyBvbmx5IGluIGl0cyBvd24gdHJlZSBsZXZlbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBub2RlcyBoYXZlIHN1YiBub2RlcyBhbmQgb3RoZXIgbm9kZXMgZG9uJ3QgaGF2ZSBzdWIgbm9kZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBwdXQgdGhlIG5vZGVzIHdpdGggc3ViIG5vZGVzIGluIGZyb250IG9mIHRoZSBub2RlcyB3aXRob3V0IHN1YiBub2Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBbdGhpcy5zaGFkb3dUcmVlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaChjdXJyZW50Tm9kZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnNwbGljZShzdGFjay5sZW5ndGggLSAxLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGN1cnJlbnROb2RlLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBjb21wYXJlIHJlc3VsdCBhYm91dCAxIG9yIC0xIGlzIHJldmVyc2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlIGlmIGEgaXMgZ3JlYXRlciB0aGFuIGIsIDEgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIC0xLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgYmVjYXVzZSB0aG9zZSBub2RlcyBhcmUgd2VudCB0aG91Z2ggaW4gdGhlIHN0YWNrIHdpdGggaXMgRklGTyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgb3JkZXIgaXMgcmV2ZXJzZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydENvbHVtbiA9PT0gdGhpcy5hY3R1YWxDb2x1bW5zWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmRhdGEuaGFzQ2hpbGRyZW4gJiYgIWIuZGF0YS5oYXNDaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWEuZGF0YS5oYXNDaGlsZHJlbiAmJiBiLmRhdGEuaGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFWYWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoYS5kYXRhLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJWYWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoYi5kYXRhLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVZhbHVlID09PSB1bmRlZmluZWQgJiYgYlZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1zb3J0RGlyZWN0aW9uICogY29tcGFyZUZ1bmN0aW9uKGEuZGF0YS5kYXRhLCBiLmRhdGEuZGF0YSwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlTmV3Um93UmVuZGVyZWRJdGVtICYmIHRoaXMuZWRpdGFibGVBdXRvTmV3Um93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2goZWRpdGFibGVOZXdSb3dSZW5kZXJlZEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGhhbmRsZXMgdGhlIHNvcnRpbmcgd2hlbiBncm91cGluZyBpcyBlbmFibGVkLlxyXG4gICAgICAgICAgICAgICAgLy8gSXQgc29ydHMgdGhlIGdyb3VwIGl0ZW1zIGluIGVhY2ggb2YgdGhlIGdyb3VwLlxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkUmVuZGVyZWRJdGVtczogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW10gPSBbXTtcclxuICAgICAgICAgICAgICAgIGxldCBncm91cGVkUmVuZGVyZWRJdGVtczogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBlZFJlbmRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW5kZXJlZEl0ZW1zID0gZ3JvdXBlZFJlbmRlcmVkSXRlbXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uICogY29tcGFyZUZ1bmN0aW9uKGEuZGF0YSwgYi5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFJlbmRlcmVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFJlbmRlcmVkSXRlbXMucHVzaCh0aGlzLnJlbmRlcmVkSXRlbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW5kZXJlZEl0ZW1zLnB1c2godGhpcy5yZW5kZXJlZEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBlZFJlbmRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcyA9IGdyb3VwZWRSZW5kZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYS5kYXRhLCBiLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkUmVuZGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gc29ydGVkUmVuZGVyZWRJdGVtcztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleEJ5U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVmYXVsdFNvcnRDb21wYXJlRnVuY3Rpb24oYTogRGF0YVRhYmxlRGF0YUl0ZW0sIGI6IERhdGFUYWJsZURhdGFJdGVtLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKCFhICYmICFiKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICAgICAgfSBlbHNlIGlmICghYSAmJiBiKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhICYmICFiKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBhVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGEsIGZpZWxkKTtcclxuICAgICAgICAgICAgbGV0IGJWYWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoYiwgZmllbGQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB0eXBlb2YgYVZhbHVlO1xyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICBhVmFsdWUgPSBhVmFsdWUgPT09IDAgPyBhVmFsdWUgOiAoYVZhbHVlIHx8IE51bWJlci5NSU5fVkFMVUUpO1xyXG4gICAgICAgICAgICAgICAgYlZhbHVlID0gYlZhbHVlID09PSAwID8gYlZhbHVlIDogKGJWYWx1ZSB8fCBOdW1iZXIuTUlOX1ZBTFVFKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYVZhbHVlID4gYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVZhbHVlIDwgYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhVmFsdWUgPSBhVmFsdWUgJiYgYVZhbHVlLnRvU3RyaW5nICYmIGFWYWx1ZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICBiVmFsdWUgPSBiVmFsdWUgJiYgYVZhbHVlLnRvU3RyaW5nICYmIGJWYWx1ZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkgfHwgJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgd2UgZG8gbmF0dXJhbCBzb3J0IGhlcmUuXHJcbiAgICAgICAgICAgICAgICAvLyBCYXNlZCBvbiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24sIFwiYTEwMFwiLFwiYTIwXCIsXCJhM1wiIHdpbGwgYmUgc29ydGVkIGFzIFwiYTEwMFwiLFwiYTIwXCIsXCJhM1wiLlxyXG4gICAgICAgICAgICAgICAgLy8gQnV0IGJhc2VkIG9uIG5hdHVyYWwgc29ydCwgdGhleSB3aWxsIGJlIHNvcnRlZCBhcyBcImEzXCIsXCJhMjBcIixcImExMDBcIi5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlTmF0dXJhbFNvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc051bWJlciA9ICh0ZXh0OiBzdHJpbmcpID0+IHRleHQgPj0gJzAnICYmIHRleHQgPD0gJzknO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIDEsIGZpZ3VyZSBvdXQgdGhlIGNvbW1vbiBwYXJ0IG9mIDIgc3RyaW5ncy5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGFWYWx1ZS5sZW5ndGggJiYgaW5kZXggPCBiVmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVmFsdWVbaW5kZXhdICE9PSBiVmFsdWVbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCAyLCBpZiB0aGUgcmVzdCBwYXJ0IG9mIGVhY2ggc3RyaW5nIHN0YXJ0cyB3aXRoIGEgbnVtYmVyLCBwYXJzZSB0aGUgcmVzdCBwYXJ0IGludG8gZmxvYXQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2VGbG9hdCBmdW5jdGlvbiBpcyB2ZXJ5IGR1cmFibGUsIGl0IGNhbiBwYXJzZSBcIjEuNWFiY1wiIGFzIFwiMS41XCIgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSB0aGF0IHRoZSByZXN0IHBhcnRcclxuICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgc3RyaW5nIGlzIG1peGVkIHdpdGggbnVtYmVycyBhbmQgbGV0dGVycy5cclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzdCBwYXJ0IG9mIGVhY2ggc3RyaW5nIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIG51bWJlciwgdGhlbiBkb24ndCBkbyBuYXR1cmFsIHNvcnQsIGp1c3QgZG8gbm9ybWFsIHN0cmluZyBzb3J0LlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc051bWJlcihhVmFsdWVbaW5kZXhdKSAmJiBpc051bWJlcihiVmFsdWVbaW5kZXhdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhTnVtYmVyID0gcGFyc2VGbG9hdChhVmFsdWUuc3Vic3RyKGluZGV4LCBhVmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJOdW1iZXIgPSBwYXJzZUZsb2F0KGJWYWx1ZS5zdWJzdHIoaW5kZXgsIGJWYWx1ZS5sZW5ndGgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFOdW1iZXIgPiBiTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFOdW1iZXIgPCBiTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVmFsdWUgPiBiVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVZhbHVlIDwgYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFWYWx1ZSA+IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVZhbHVlIDwgYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFzVmVydGljYWxPdmVyZmxvdygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA+IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFsaWduU2Nyb2xsQmFyKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGhhc1ZlcnRpY2FsT3ZlcmZsb3cgPSB0aGlzLmhhc1ZlcnRpY2FsT3ZlcmZsb3coKTtcclxuICAgICAgICBpZiAoIXRoaXMuY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlU2Nyb2xsYmFyV2lkdGgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGhhc1ZlcnRpY2FsT3ZlcmZsb3cgIT09IHRoaXMuY3VycmVudEhhc1ZlcnRpY2FsT3ZlcmZsb3cgJiYgdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGhhc1ZlcnRpY2FsT3ZlcmZsb3cpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSAnY2FsYygxMDAlIC0gJyArIHRoaXMuY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoICsgJ3B4KSc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUucmlnaHQgPSB0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCArICdweCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzBweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SGFzVmVydGljYWxPdmVyZmxvdyA9IGhhc1ZlcnRpY2FsT3ZlcmZsb3c7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVTY3JvbGxiYXJXaWR0aCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzY3JvbGxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChzY3JvbGxEaXYpO1xyXG4gICAgICAgIHNjcm9sbERpdi5jbGFzc05hbWUgPSAnc21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24tc3RyZXRjaCBzbWUtYXJyYW5nZS1vdmVyZmxvdy1zY3JvbGwnO1xyXG4gICAgICAgIHNjcm9sbERpdi5zdHlsZS50b3AgPSAnLTk5OTlweCc7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYub2Zmc2V0V2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCA9IHNjcm9sbGJhcldpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlSXRlbUluVmlld1BvcnQocHJldmVudFNjcm9sbGluZz86IGJvb2xlYW4sIGZvcmNlVXBkYXRlPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQgJiYgdGhpcy5yZW5kZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIC8vIFNjcm9sbCBjb250YWluZXIgaXMgdGhlIGRpdiB0byByZW5kZXIgdGhlIHZpZXcgcG9ydCBvZiB0aGUgZGF0YSB0YWJsZSBhbmQgdG8gcHJvdmlkZSB0aGUgc2Nyb2xsIGJhci5cclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgLy8gU2Nyb2xsIGJvZHkgaXMgdGhlIGRpdiB0byByZXByZXNlbnQgdGhlIGFjdHVhbCBkYXRhIGNvbnRhaW5lci5cclxuICAgICAgICAgICAgLy8gSXRzIGhlaWdodCBpcyB0aGUgaGVpZ2h0IG5lZWRlZCBieSBhbGwgdGhlIGRhdGEgdGFibGUgaXRlbXMuXHJcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIGxpc3QgaXMgbG9uZywgdGhpcyBkaXYgY2FuIGJlIHZlcnkgaGlnaCBhbmQgdHJpZ2dlcnMgdGhlIHNjcm9sbCBjb250YWluZXIgdG8gc2hvdyB0aGUgc2Nyb2xsIGJhci5cclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQm9keUVsZW1lbnQgPSB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAvLyBTY3JvbGwgZGF0YSBlbGVtZW50IGlzIHRoZSBkaXYgdG8gc2hvdyB0aGUgZGlzcGxheWVkIGxpc3QgaXRlbXMgaW4gYW5kIGJlbG93IHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcsIHdlIGFsd2F5cyBhZGp1c3QgdGhlIHRvcCBvZiB0aGlzIGRpdiB0byBtYWtlIHN1cmUgaXQgcmVtYWlucyBpbiB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxEYXRhRWxlbWVudCA9IHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIC8vIFwic2Nyb2xsIGFib3ZlIGRhdGFcIiBlbGVtZW50IGlzIHRoZSBkaXYgc2hvdyB0aGUgbGlzdCBpdGVtcyBhYm92ZSB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlbmRlciB0aGlzIFwiYWJvdmVcIiBkYXRhIHNlcGVyYXRlbHlcclxuICAgICAgICAgICAgLy8gdGhlbiBpdCdzIGVhc3kgZm9yIHVzIHRvIGZpbmQgdGhlIFwidG9wXCIgb2YgdGhlIGRpc3BsYXllZCBsaXN0IGl0ZW0gaW4gdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgLy8gTm90ZTogdGhlIFwic2Nyb2xsIGJlbG93IGRhdGFcIiBpcyByZW5kZXJlZCBpbiBTY3JvbGwgZGF0YSBlbGVtZW50IGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCB0byBjYWxjdWxhdGUgdGhlIFwidG9wXCIgZm9yIGl0XHJcbiAgICAgICAgICAgIC8vIHNpbmNlIGFueXdheSBpdCBqdXN0IGZvbGxvdyB0aGUgZGlzcGxheWVkIGxpc3QgaXRlbXMgaW4gdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudCA9IHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlcyBob3cgbWFueSBpdGVtcyBjYW4gYmUgcmVuZGVyZWQgaW4gdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ID0gdGhpcy5zY3JvbGxhYmxlXHJcbiAgICAgICAgICAgICAgICA/IE1hdGgubWluKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gdGhpcy5yb3dIZWlnaHQpXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTY3JvbGxQaXhlbHMgPSB0aGlzLmRlZmF1bHRTY3JvbGxQZXJjZW50YWdlICogc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTY3JvbGxQaXhlbHMgPSBNYXRoLmZsb29yKGRlZmF1bHRTY3JvbGxQaXhlbHMgLyB0aGlzLnJvd0hlaWdodCkgKiB0aGlzLnJvd0hlaWdodDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICAgICAgICBsZXQgaXNBdExhc3RTY3JlZW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZW5kZXJlZEl0ZW1TdGFydCA9IDA7XHJcbiAgICAgICAgICAgIGxldCByZW5kZXJlZEl0ZW1FbmQgPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVVSVZpcnR1YWxpemF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNMb25nTGlzdCAmJiBwcmV2ZW50U2Nyb2xsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhU2Nyb2xsVG9wID0gKHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICogdGhpcy5jdXJyZW50U3RhcnRJbmRleE9mSXRlbUluVmlld1BvcnQgLyAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHRoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLmRhdGFTY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZXMgdGhlIHdoaWNoIGl0ZW0gaXMgdGhlIHN0YXJ0aW5nIGl0ZW0gaW4gdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaWRlYSBoZXJlIGlzIHRvIGNhbGN1bGF0ZSB0aGUgcGVyY2VudGFnZSBvZiBob3cgZmFyIHRoZSBzY3JvbGxiYXIgbW92ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRpc3RhbmNlIHRoZSBzY3JvbGxiYXIgY2FuIG1vdmUgaXMgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgc2Nyb2xsYmFyIG1pbnVzIHRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0LlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmZsb29yKHRoaXMuZGF0YVNjcm9sbFRvcCkgIT09IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNjcm9sbFRvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjdXJhdGVTdGFydEluZGV4ID0gKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpICogdGhpcy5kYXRhU2Nyb2xsVG9wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8gKHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLmZsb29yKGFjY3VyYXRlU3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgPiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0F0TGFzdFNjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0ID0gc3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGlzdCBpcyBzaG9ydCBhbmQgbm8gbmVlZCB0byBoYXZlIHNjcm9sbCBiYXIsIGp1c3Qgc2ltcGx5IHNldCB0aGUgc3RhcnQgaW5kZXggdG8gMC5cclxuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCA8PSBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbVN0YXJ0ID0gc3RhcnRJbmRleCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAqIHRoaXMuYnVmZmVyUm93UmF0ZTtcclxuICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbUVuZCA9IE1hdGguY2VpbChzdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgKiB0aGlzLmJ1ZmZlclJvd1JhdGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgc2hvdWxkTGF6eUxvYWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGxvZ2ljIGNhbGN1bGF0ZXMgd2hpY2ggcGFydCBvZiBkYXRhIHNob3VsZCBiZSBsb2FkZWQgd2l0aCB0aGUgbGF6eSBsb2FkaW5nIGV2ZW50LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF6eUxvYWRTdGFydCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmVuZGVyZWRJdGVtU3RhcnQpKTtcclxuICAgICAgICAgICAgICAgIGxldCBhY3R1YWxMYXp5TG9hZFN0YXJ0ID0gbGF6eUxvYWRTdGFydDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhenlMb2FkTGVuZ3RoID0gTWF0aC5taW4odGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCwgcmVuZGVyZWRJdGVtRW5kKSAtIGxhenlMb2FkU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWN0dWFsTGF6eUxvYWRMZW5ndGggPSBsYXp5TG9hZExlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gbGF6eUxvYWRTdGFydDsgaSA8IGxhenlMb2FkU3RhcnQgKyBsYXp5TG9hZExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVySXRlbUZsYWcgPSAoIXRoaXMucmVuZGVyZWRJdGVtc1tpXSB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkTGF6eUxvYWQgJiYgcmVuZGVySXRlbUZsYWcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkTGF6eUxvYWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxMYXp5TG9hZFN0YXJ0ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZExhenlMb2FkICYmICFyZW5kZXJJdGVtRmxhZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsTGF6eUxvYWRMZW5ndGggPSBpICsgMSAtIGFjdHVhbExhenlMb2FkU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFjdHVhbExhenlMb2FkTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkTGF6eUxvYWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkTGF6eUxvYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc29ydE9yZGVyID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3J0Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zb3J0Q29sdW1uLnNvcnRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0T3JkZXIgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVTb3J0TW9kZS5EZXNjZW5kOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRPcmRlciA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0T3JkZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXp5TG9hZEV2ZW50ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogYWN0dWFsTGF6eUxvYWRTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBhY3R1YWxMYXp5TG9hZExlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoTG9hZGluZ0RhdGE6IChpdGVtcywgYWxsSXRlbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc1thY3R1YWxMYXp5TG9hZFN0YXJ0ICsgaV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogYWN0dWFsTGF6eUxvYWRTdGFydCArIGksIGRhdGE6IGl0ZW1zW2ldLCB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLk5vcm1hbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNldCBpbnRlcm5hbCBpdGVtcyBzbyB0aGF0IHdlIGNhbiBzZWxlY3QgYWxsLCBhbmQgc28gd2UgY2FuIGRvIGZpbHRlcmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcyA9IGFsbEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlcigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgcmVmcmVzaCB0byBtYWtlIHRoZSBjaGFuZ2VzIHJlZmxlY3Qgb24gVUksIHdpbGwgbm90IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyBhZnRlciBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQsIHRoZSBzaG91bGRMYXp5TG9hZCB3aWxsIGJlIHNldCB0byBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyOiBzb3J0T3JkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGaWVsZDogdGhpcy5zb3J0Q29sdW1uID8gdGhpcy5zb3J0Q29sdW1uLmZpZWxkIDogdGhpcy5hY3R1YWxDb2x1bW5zID8gdGhpcy5hY3R1YWxDb2x1bW5zWzBdLmZpZWxkIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXp5TG9hZGluZ0RhdGEuZW1pdChsYXp5TG9hZEV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbExhenlMb2FkTGVuZ3RoID49IHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAqIHRoaXMuYnVmZmVyUm93UmF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQnVzeSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNob3VsZExhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBkaXNwbGF5aW5nIGxpc3QgaXRlbSBpbiB0aGUgdmlldyBwb3J0IGlzIG1vdmluZyBkdWUgdG8gc2Nyb2xsIGJhciBpcyBtb3ZpbmcsXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdG9wIG9mIHRoZSBzY3JvbGwgZGF0YSBlbGVtZW50LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGl0ZW0gb2YgdGhlIHNjcm9sbCBkYXRhIGVsZW1lbnQgd29uJ3QgYWx3YXlzIGFsaWdoIHRvIHRoZSB0b3Agb2YgdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgICAgIC8vIFNvIGhlcmUgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGl0ZW0uXHJcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgJSB0aGlzLnJvd0hlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiB3aGVuIHRoZSBkaXNwbGF5IGl0ZW0gbGlzdCBpcyBldmVuIGxvbmdlciB0aGFuIHRoZSBzY3JvbGwgY29udGFpbmVyIGhlaWdodCAqIHJvdyBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAvLyBpdCBtZWFucyB3aGVuIHdlIG1vdmUgMSBwaXhlbCBvZiB0aGUgc2Nyb2xsIGJhciwgdGhlIGRhdGEgdGFibGUgd2lsbCBtb3ZlIGJ5IGF0IGxlYXN0IG9uZSBpdGVtLlxyXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB3b24ndCBuZWVkIHRvIGhhbmRsZSBvZmZzZXQgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGNoYW5jZSB0byBzaG93IFwiaGFsZiBkYXRhIHRhYmxlIGl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgLy8gYXQgdGhlIHRvcCBib3JkZXIgb2YgdGhlIHNjcm9sbCBjb250YWluZXIgYnkgbW92aW5nIHRoZSBzY3JvbGwgYmFyIHZlcnkgbGl0dGxlLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggPiBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAqIHRoaXMucm93SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZVVJVmlydHVhbGl6YXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlJdGVtc1RvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wIC0gb2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtSW5kZXggPiBzdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0IC0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBzZWxlY3RlZEl0ZW1JbmRleCA8IHN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SXRlbXNUb3AgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoc2VsZWN0ZWRJdGVtSW5kZXggLSBzdGFydEluZGV4IC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ICsgMSkgKiB0aGlzLnJvd0hlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHNjcm9sbCBiYXIgaXMgbW92ZWQgdG8gdmVyeSBib3R0b20sIHdlIGp1c3Qgc2ltcGx5IGFsaWduIHRoZSBkaXNwbGF5ZWQgZGF0YSB0YWJsZSBpdGVtcydzIGJvdHRvbVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBib3R0b20gb2YgdGhlIGNvbnRhaW5lciB0byBtYWtlIHN1cmUgdGhlIGxhc3QgZGF0YSB0YWJsZSBpdGVtIGNhbiBiZSBkaXNwbGF5ZWQgY29tcGxldGVseS5cclxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdoZW4gdGhlIGxpc3QgaXMgc3VwZXIgbG9uZyAocmVmZXIgdG8gaG93IHdlIGNhbGN1bGF0ZSB0aGUgdG9wIG9mZnNldCBvZiB0aGUgc3VwZXIgbG9uZyBsaXN0KSxcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGFzdCBpdGVtIG1heSBub3QgYmUgcmVuZGVyZWQgY29tcGxldGVseS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA+IHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0ICogdGhpcy5yb3dIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgPj1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxIZWlnaHQgLSBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMucm93SGVpZ2h0IC8gMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0F0TGFzdFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlJdGVtc1RvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIE1hdGguY2VpbCh0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpICogdGhpcy5yb3dIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERhdGFTdHlsZVRvcCA9IHRoaXMuZGlzcGxheUl0ZW1zVG9wICsgJ3B4JztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9yY2VVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxBYm92ZURhdGFFbGVtZW50KE1hdGgucm91bmQoc3RhcnRJbmRleCAtIHJlbmRlcmVkSXRlbVN0YXJ0KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCghdGhpcy5jdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydCB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zW3N0YXJ0SW5kZXhdXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgKHRoaXMucmVuZGVyZWRJdGVtc1tzdGFydEluZGV4XS5kYXRhICE9PSB0aGlzLmN1cnJlbnRSZW5kZXJlZEl0ZW1JblZpZXdQb3J0LmRhdGEpKVxyXG4gICAgICAgICAgICAgICAgICAgIHx8IGZvcmNlVXBkYXRlIHx8IHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIGRpc3BsYXkgZGF0YSBhYm92ZSB0aGUgdmlldyBwb3J0IGFuZCBkaXNwbGF5IGRhdGEgaW4gYW5kIGJlbG93IHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd2hlbiB3ZSBwdXNoIG5ldyBpdGVtIGludG8gdGhlIGFycmF5cywgd2UgY3JlYXRlIGEgbmV3IG9iamVjdCB0byB3cmFwIHRoZSBkaXNwbGF5IGl0ZW0uXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSB3YW50IHRvIGZvcmNlIHRoZSBuZ0ZvciB0byByZS1yZW5kZXIgYWxsIHRoZSBpdGVtcyBpbnN0ZWFkIG9mIG9ubHkgcmUtcmVuZGVyIHRoZSB1cGRhdGVkIG9uZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBuZ0ZvciB3aWxsIHRyeSB0byBhZGp1c3QgRE9NIG9yZGVyIG9mIHRob3NlIGl0ZW1zIHdoaWNoIG1lc3NlcyB1cCB0aGUgc2Nyb2xsIGJhciBwb3NpdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG91bGRTY3JvbGwgPSB0aGlzLnNjcm9sbGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRoaXMuZWRpdGFibGUgfHwgdGhpcy5hdXRvUm93SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRTY3JvbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlbmRlcmVkSXRlbVN0YXJ0OyBpIDwgc3RhcnRJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBzdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY3VycmVudFJlbmRlcmVkSXRlbS50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zaG93QXNUcmVlID8gY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmRhdGEgOiBjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogY3VycmVudFJlbmRlcmVkSXRlbS5kZXB0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuOiBjdXJyZW50UmVuZGVyZWRJdGVtLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JblNldDogY3VycmVudFJlbmRlcmVkSXRlbS5wb3NpdGlvbkluU2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogY3VycmVudFJlbmRlcmVkSXRlbS5zZXRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogY3VycmVudFJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0Fib3ZlVmlld1BvcnQucHVzaCh7IGRhdGE6IHsgcGxhY2Vob2xkZXI6IHRydWUgfSwgdHlwZTogbnVsbCwgaW5kZXg6IG51bGwgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgcmVuZGVyZWRJdGVtRW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnNob3dBc1RyZWUgPyBjdXJyZW50UmVuZGVyZWRJdGVtLm5vZGUuZGF0YSA6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogY3VycmVudFJlbmRlcmVkSXRlbS5kZXB0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbjogY3VycmVudFJlbmRlcmVkSXRlbS5oYXNDaGlsZHJlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBjdXJyZW50UmVuZGVyZWRJdGVtLm5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5TZXQ6IGN1cnJlbnRSZW5kZXJlZEl0ZW0ucG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaXplOiBjdXJyZW50UmVuZGVyZWRJdGVtLnNldFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogY3VycmVudFJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNjcm9sbGFibGUgJiYgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA+IHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0LnB1c2goeyBkYXRhOiB7IHBsYWNlaG9sZGVyOiB0cnVlIH0sIHR5cGU6IG51bGwsIGluZGV4OiBudWxsIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydCA9IHRoaXMucmVuZGVyZWRJdGVtc1tzdGFydEluZGV4XTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNCdXN5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudEFyZWFIYXNGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzU21lRm9ybUZpZWxkKDxIVE1MRWxlbWVudD5kb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBqdW1wIGZyb20gZWRpdGFibGUgZm9ybSBmaWVsZHMgdG93YXJkcyB0aGUgcm93IHdoZW4gcmUtY2FsY3VsYXRpbmcgaXRlbXNcclxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcmVzZXQgdmFsaWRhdGlvbiBlcnJvcnMgb24gd2luZG93IHJlc2l6aW5nXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggIT09IHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzRmlsdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCA9IHRoaXMuaW50ZXJuYWxRdWVyeUVkaXRvcjtcclxuICAgICAgICBjb25zdCBoYXNWYWxpZFF1ZXJ5RWRpdG9yID0gKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCAmJiB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHMgJiZcclxuICAgICAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxJdGVtcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlciBpbnN0YW5jZW9mIFNlYXJjaEZvcm1GaWVsZENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaEZvcm1GaWVsZCA9IDxTZWFyY2hGb3JtRmllbGRDb21wb25lbnQ+dGhpcy5nbG9iYWxGaWx0ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJLZXl3b3JkID0gc2VhcmNoRm9ybUZpZWxkLnZhbHVlICYmIHNlYXJjaEZvcm1GaWVsZC52YWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJLZXl3b3JkID0gdGhpcy5nbG9iYWxGaWx0ZXJbJ3ZhbHVlJ10udG9Mb2NhbGVMb3dlckNhc2UoKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbHRlcktleXdvcmQgJiYgIWhhc1ZhbGlkUXVlcnlFZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHRoaXMuaW50ZXJuYWxJdGVtcy5tYXAoaXRlbSA9PiBpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmludGVybmFsSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZpcnN0IGZpbHRlciBieSB0aGUgbWFzdGVyIHZpZXcgZmlsdGVycyBpZiBhcHBsaWNhYmxlXHJcbiAgICAgICAgICAgICAgICAvLyBUaGVuIGZpbHRlciBieSB0aGUgY29sdW1uIGZpbHRlcnNcclxuICAgICAgICAgICAgICAgIC8vIE5vdGUgZmlsdGVyIGluc2lkZSB0aGUgY29sdW1uIGZpbHRlcnMgYXJlIGludGVyc2VjdGlvbnNcclxuICAgICAgICAgICAgICAgIC8vIENvbHVtbiBmaWx0ZXJzIG11bHRpcGxlIGNvbWJvYm94IHdpbGwgYmUgdW5pb25cclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmludGVybmFsSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pbnRlcm5hbEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERvIHRoZSBkYXRhdGFibGUgb3JpZ2luYWwgZmlsdGVycyBvbmx5IGlmIHVzZWQgaW4gbWFzdGVyIHZpZXcuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQW5kIGhhcyB2YWxpZCBmaWx0ZXJLZXl3b3JkXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyS2V5d29yZCAmJiB0aGlzLmZpbHRlcktleXdvcmQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIGNvbHVtbi5zZWFyY2hhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChpdGVtLCAodGhpcy5lZGl0YWJsZSA/ICdjb250ZW50LicgOiAnJykgKyBjb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5maWx0ZXJPdmVycmlkaW5nRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29sdW1uLmZpbHRlck92ZXJyaWRpbmdGdW5jdGlvbih2YWx1ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhc2VTZW5zaXRpdmVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLmluZGV4T2YodGhpcy5maWx0ZXJLZXl3b3JkKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmlsdGVyS2V5d29yZCBpcyBlbXB0eVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB0aGlzIGRhdGF0YWJsZSBpcyBub3QgdXNlZCBpbiBtYXN0ZXIgdmlld1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGZvdW5kIGJ5IGRhdGF0YWJsZSBvcmlnaW5hbCBmaWx0ZXIoZnJvbSBtYXN0ZXIgdmlldylcclxuICAgICAgICAgICAgICAgICAgICAvLyBvciBpZiBvcmlnaW5hbCBmaWx0ZXIgaXMgZW1wdHkobm90IGluIG1hc3RlciB2aWV3KVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVmFsaWRRdWVyeUVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIGJ5IHF1ZXJ5IGVkaXRvciBpZiBhcHBsaWVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMucXVlcnlFZGl0b3JGaWx0ZXJNYWluKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgc2F0aXNmeSBib3RoIG9yaWdpbmFsIGZpbHRlcnMgYW5kIHRoZSBxdWVyeSBlZGl0b3IgZmlsdGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVBcmlhQXR0cmlidXRlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlQXJpYUxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGhpcy50YWJsZUFyaWFMYWJlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMudGFibGVBcmlhTGFiZWxsZWRCeSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgdGhpcy50YWJsZUFyaWFMYWJlbGxlZEJ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSB8fCB0aGlzLnNlbGVjdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgICAgICdhcmlhLW11bHRpc2VsZWN0YWJsZScsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRyZWVOb2RlKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0sIGRlcHRoOiBudW1iZXIsIHBhcmVudFNoYWRvd1RyZWVOb2RlOiBhbnksIHBvc2l0aW9uSW5TZXQ6IG51bWJlciwgc2V0U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJUcmVlTm9kZVRvZ2dsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuZ2V0VHJlZU5vZGVEYXRhSWRlbnRpdHkobm9kZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRyZWVUb2dnbGVTdGF0dXMuaGFzT3duUHJvcGVydHkoaWRlbnRpdHkpKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gdGhpcy50cmVlVG9nZ2xlU3RhdHVzW2lkZW50aXR5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBub2RlLmNhbkV4cGFuZCB8fCBub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMDtcclxuICAgICAgICBub2RlLmlzTGVhZiA9ICFoYXNDaGlsZHJlbjtcclxuXHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWRJdGVtID0ge1xyXG4gICAgICAgICAgICBkYXRhOiBub2RlLmRhdGEsXHJcbiAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGUsXHJcbiAgICAgICAgICAgIGRlcHRoOiBkZXB0aCxcclxuICAgICAgICAgICAgaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLFxyXG4gICAgICAgICAgICBub2RlOiBub2RlLFxyXG4gICAgICAgICAgICBpbmRleDogdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgcG9zaXRpb25JblNldDogcG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgc2V0U2l6ZTogc2V0U2l6ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2gocmVuZGVyZWRJdGVtKTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFNoYWRvd1RyZWVOb2RlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiByZW5kZXJlZEl0ZW0sXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFpbnRhaW4gYSBzaGFkb3cgdHJlZSB0byBoYW5kbGUgdGhlIFwic2FtZSBsZXZlbCBvbmx5XCIgc29ydGluZy5cclxuICAgICAgICBwYXJlbnRTaGFkb3dUcmVlTm9kZS5jaGlsZHJlbi5wdXNoKGN1cnJlbnRTaGFkb3dUcmVlTm9kZSk7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCAmJiBub2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGxldCBjdXJyZW50UG9zaXRpb25JblNldCA9IDE7XHJcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZShjaGlsZCwgZGVwdGggKyAxLCBjdXJyZW50U2hhZG93VHJlZU5vZGUsIGN1cnJlbnRQb3NpdGlvbkluU2V0LCBub2RlLmNoaWxkcmVuLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25JblNldCsrO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVJlbmRlckl0ZW1zKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmdyb3VwQ29sdW1uICYmIHRoaXMuZ3JvdXBDb2x1bW4uZmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cEtleXMgPSB7fTtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBzOiB7IGdyb3VwOiBEYXRhVGFibGVEYXRhSXRlbSwgaXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdIH1bXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBTb3J0TW9kZSAhPT0gRGF0YVRhYmxlU29ydE1vZGUuTm9uZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5ncm91cENvbHVtbi5zb3J0YWJsZSA9PT0gJ2N1c3RvbScgP1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBDb2x1bW4uY29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcykgOiB0aGlzLmRlZmF1bHRTb3J0Q29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0RGlyZWN0aW9uID0gdGhpcy5ncm91cFNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQgPyAxIDogLTE7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYSwgYiwgdGhpcy5ncm91cENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwRGF0YSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoaXRlbSwgdGhpcy5ncm91cENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdyb3VwS2V5c1tncm91cERhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2goeyBncm91cDogZ3JvdXBEYXRhLCBpdGVtczogZ3JvdXBJdGVtcyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cEtleXNbZ3JvdXBEYXRhXSA9IGdyb3VwSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3VwRGF0YV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3VwRGF0YV0gPSB0aGlzLmRlZmF1bHRHcm91cFRvZ2dsZUV4cGFuZGVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwS2V5c1tncm91cERhdGFdLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZ3JvdXBzW2ldLmdyb3VwLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JblNldDogaSArIDEsXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogZ3JvdXBzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cHNbaV0uZ3JvdXBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRQb3NpdGlvbkluU2V0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBncm91cHNbaV0uaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBJdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkluU2V0OiBjdXJyZW50UG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpemU6IGdyb3Vwc1tpXS5pdGVtcy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbkluU2V0Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5zaGFkb3dUcmVlID0geyBkYXRhOiBudWxsLCBjaGlsZHJlbjogW10gfTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UG9zaXRpb25JblNldCA9IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZShub2RlLCAwLCB0aGlzLnNoYWRvd1RyZWUsIGN1cnJlbnRQb3NpdGlvbkluU2V0LCB0aGlzLml0ZW1zLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uSW5TZXQrKztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlckl0ZW0gPSA8RGF0YVRhYmxlUmVuZGVyZWRJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4KyssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuZmlsdGVyZWRJdGVtc1tpXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2gocmVuZGVySXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgrKyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbmRlckl0ZW1zKHByZXZlbnRTY3JvbGxpbmc/OiBib29sZWFuLCBmb3JjZVVwZGF0ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9ICF0aGlzLml0ZW1zO1xyXG5cclxuICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXIoKTtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlUmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlcyBob3cgaGlnaCB0aGUgc2Nyb2xsIGRhdGEgZGl2IHNob3VsZCBiZS5cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zICYmICF0aGlzLmRpc2FibGVVSVZpcnR1YWxpemF0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoICogdGhpcy5yb3dIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgaGVpZ2h0IGlzIHRvbyBtdWNoLCB3ZSBuZWVkIHRvIGxpbWl0ZWQgdGhlIGhlaWdodCBvdGhlcndpc2UgTWljcm9zb2Z0IEVkZ2Ugd2lsbCBjcmFzaC5cclxuICAgICAgICAgICAgLy8gSXQncyBvayBpZiB0aGUgc2Nyb2xsIGRhdGEgZGl2IGhlaWdodCBkb2Vzbid0IGVxdWFsIHRvIHRoZSBhY3R1YWwgdG90YWwgZGF0YSB0YWJsZSBoZWlnaHRcclxuICAgICAgICAgICAgLy8gYmVjYXVzZSBhbnl3YXkgd2UgdXNlIHRoZSByYXRpbyBvZiBzY3JvbGwgZGF0YSBkaXYgaGVpZ2h0IHRvIGFjdHVhbCB0b3RhbCBsaXN0IGl0ZW0gaGVpZ2h0XHJcbiAgICAgICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGUgc2Nyb2xsaW5nIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgZGF0YS5cclxuICAgICAgICAgICAgdGhpcy5oYXNMb25nTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gdGhpcy5tYXhBY3R1YWxTY3JvbGxEYXRhRWxlbWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaW5kIGEgaGVpZ2h0IG5lYXIgdGhlIG1heEFjdHVhbFNjcm9sbERhdGFFbGVtZW50SGVpZ2h0IHdoaWNoIGNhbiBiZSBkaXZpZGVkIGV4YWN0bHkgYnkgdGhlIHJvdyBoZWlnaHQuXHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2hlbiB3ZSBjYWxjdWF0ZSB0aGUgc2Nyb2xsaW5nIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgZGF0YSxcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBmbG9hdGluZyBwYXJ0IG9mIHRoZSBoZWlnaHQgd2lsbCBpbXBhY3QgdGhlIGFjY3VyYWN5IG9mIHRoZSBjYWxjdWxhdGlvbiByZXN1bHQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0xvbmdMaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5tYXhBY3R1YWxTY3JvbGxEYXRhRWxlbWVudEhlaWdodCAvIHRoaXMucm93SGVpZ2h0KSAqIHRoaXMucm93SGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zb3J0SXRlbXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUgJiYgdGhpcy5lZGl0YWJsZUF1dG9OZXdSb3cpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVySXRlbUZvck5ld0RhdGFJdGVtID0gPERhdGFUYWJsZVJlbmRlcmVkSXRlbT57XHJcbiAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IDxFZGl0YWJsZURhdGFJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICBpZDogTXNmdFNtZS5uZXdHdWlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkFsZXJ0czoge30sXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmVkaXRhYmxlTmV3RGF0YUl0ZW0gfHwge30pKSxcclxuICAgICAgICAgICAgICAgICAgICBpc05ld1JvdzogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuTm9ybWFsLFxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogW11cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKHJlbmRlckl0ZW1Gb3JOZXdEYXRhSXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KHByZXZlbnRTY3JvbGxpbmcsIGZvcmNlVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVNjcm9sbEFib3ZlRGF0YUVsZW1lbnQocmVuZGVyZWRJdGVtQWJvdmVWaWV3UG9ydExlbmd0aD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQgPSB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gT25seSBkaXNwbGF5IHRoZSBzY3JvbGwgYWJvdmUgZGF0YSBlbGVtZW50IHdoZW4gaXQncyBoZWlnaHQgaXMgYXZhaWxhYmxlLlxyXG4gICAgICAgIC8vIEl0cyBoZWlnaHQgbWF5IG5vdCBiZSByZWFkeSB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIHJlbmRlcmVkIGZpcnN0IHRpbWUgYW5kIHRoZSBzY3JvbGwgdG9wIGlzIDAuXHJcbiAgICAgICAgaWYgKCF0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgJiYgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ID0gc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVuZGVyZWRJdGVtQWJvdmVWaWV3UG9ydExlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgPSB0aGlzLnJvd0hlaWdodCAqIHJlbmRlcmVkSXRlbUFib3ZlVmlld1BvcnRMZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWJvdmVEYXRhU3R5bGVUb3AgPSB0aGlzLmRpc3BsYXlJdGVtc1RvcCAtIHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCArICdweCc7XHJcbiAgICAgICAgICAgIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzY3JvbGxBYm92ZURhdGFFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxheW91dENoYW5nZWQoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgem9vbVNjYWxlSCA9ICh3aW5kb3cuc2NyZWVuLndpZHRoIC0gd2luZG93LmlubmVyV2lkdGgpIC8gd2luZG93LnNjcmVlbi53aWR0aDtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFdpZHRoID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IE1hdGgubWF4KGN1cnJlbnRXaWR0aCArIHpvb21TY2FsZUggKiBjdXJyZW50V2lkdGgsIGN1cnJlbnRXaWR0aCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFjdHVhbENvbHVtblByb2Nlc3NlZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxBYm92ZURhdGFFbGVtZW50ID0gdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoZmFsc2UsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZUhvcml6b250YWwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEFzIHRoZSB1c2VyIHpvb21zIGluIGFuZCBvdXQsIHdlIG5lZWQgdG8gZW5hYmxlIGhvcml6b250YWwgc2Nyb2xsaW5nIGluIHRoZVxyXG4gICAgICAgICAgICAgICAgLy8gY29udGFpbmVyIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgIC8vIFRvIGFjY29tbW9kYXRlIGRpc3BsYXkgb2YgYmlnZ2VyIHpvb21lZCBpbiB0ZXh0LCB3ZSBhbHNvIGFkanVzdCB0aGUgd2lkdGggb2YgdGhlXHJcbiAgICAgICAgICAgICAgICAvLyBpbm5lciB0YWJsZSBjb250YWluZXJcclxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgdGVjaG5pcXVlIHdpbGwgbm90IHdvcmsgZm9yIE1vemlsbGEsIHdob3NlIHZhbHVlIG9mIHdpbmRvdy5pbm5lcldpZHRoIGFuZCB3aW5kb3cuc2NyZWVuLndpZHRoIHJlbWFpbnNcclxuICAgICAgICAgICAgICAgIC8vICAgICAgIGNvbnN0YW50XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnb3ZlcmZsb3cteCcsIGBhdXRvYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyxcclxuICAgICAgICAgICAgICAgICAgICBgJHthZGp1c3RlZFdpZHRofXB4YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLFxyXG4gICAgICAgICAgICAgICAgICAgIGAke2FkanVzdGVkV2lkdGh9cHhgKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFdpZHRoID0gdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFdlIHN0b3JlIHRoZSBvcmlnaW5hbCByYXRpb3Mgb2YgdGhlIGNvbHVtbiB3aWR0aHMgYXMgcGVyY2VudGFnZXMgb2YgdGhlIG9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi53aWR0aC5lbmRzV2l0aCgnJScpICYmICFjb2x1bW4ud2lkdGhQZXJjZW50YWdlKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbFdpZHRoID0gRGF0YVRhYmxlQ29tcG9uZW50LnB4Q29udmVydGVyLmNvbnZlcnRUb1B4KGNvbHVtbi53aWR0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgZ2V0IHJhdGlvcyBmb3IgdW5pdHMgdGhhdCB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IGNvbnZlcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbFdpZHRoICYmICFpc05hTihjb2xXaWR0aCkgJiYgb3JpZ2luYWxXaWR0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UgPSBjb2xXaWR0aCAvIG9yaWdpbmFsV2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFRoZSB0ZW1wbGF0ZSBhcHBsaWVzIHRoZSB3aWR0aCByYXRpbyBvZiBlYWNoIGNvbHVtbiBvbiB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ud2lkdGggPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAqIGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFdoZW4gbGF5b3V0IGlzIGNoYW5nZWQsIHRoZSBcImRpc3BsYXkgYWJvdmUgdmlldyBwb3J0XCIgaXRlbSBsaXN0IGRhdGEgc291cmNlIGlzIHVwZGF0ZWRcclxuICAgICAgICAgICAgLy8gYnV0IHRoZSBodG1sIGlzIG5vdCB1cGRhdGVkIHlldC4gU28gdGhlIFVJIG9mIHRoZSBcImRpc3BsYXkgYWJvdmUgdmlldyBwb3J0XCIgaXMgbm90IGdvb2QuXHJcbiAgICAgICAgICAgIC8vIFNvIGhpZGUgdGhlIFVJIGZvciBub3cgYW5kIGFkanVzdCBpdCBpbiBzZXRUaW1lb3V0LlxyXG4gICAgICAgICAgICBzY3JvbGxBYm92ZURhdGFFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxBYm92ZURhdGFFbGVtZW50KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihub2RlOiBUcmVlTm9kZURhdGFJdGVtLCBzZWxlY3RlZDogYm9vbGVhbiwgc2tpcEV2ZW50PzogYm9vbGVhbiwgc2tpcExpbmtTZWxlY3Rpb24/OiBib29sZWFuLFxyXG4gICAgICAgIGl0ZW1zVG9TZWxlY3Q/OiBUcmVlTm9kZURhdGFJdGVtW10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXRlbXNUb1NlbGVjdCkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZCA9IGl0ZW1zVG9TZWxlY3QuaW5kZXhPZihub2RlLmRhdGEpICE9PSAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24gfHxcclxuICAgICAgICAgICAgKHNraXBMaW5rU2VsZWN0aW9uIHx8ICFub2RlLmNoaWxkcmVuIHx8ICFub2RlLmNoaWxkcmVuLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ucHVzaChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiBub2RlLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uc3BsaWNlKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihub2RlKSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBub2RlLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgaWYgKCFza2lwTGlua1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvdWxkU2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW5baV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuc2VsZWN0ZWQgPSBzaG91bGRTZWxlY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCghc2tpcExpbmtTZWxlY3Rpb24gfHwgaXRlbXNUb1NlbGVjdCkgJiYgbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkTm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZE5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGNoaWxkTm9kZSwgc2VsZWN0ZWQsIHNraXBFdmVudCwgc2tpcExpbmtTZWxlY3Rpb24sIGl0ZW1zVG9TZWxlY3QpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnbkNvbnRlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyVGFibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRyeSB0byBmb2N1cyBvbiByb3cgZnVuY3Rpb247IGlmIHRoZXJlIGFyZSBubyByZWNvcmRzLCB0aGUgbm8gcmVjb3JkcyBtZXNzYWdlIGlzIHNlbGVjdGVkXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggT25seSBwYXNzIGluIGluZGV4IGlmIG5lZWRzIGZvY3VzIG9ubHlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzU2VsZWN0ZWRSb3coaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVuZGVyZWRJdGVtcyB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXIpO1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJvdzogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChpbmRleCkgJiYgaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoYC5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YVtkYXRhLXJlbmRlcmVkLWl0ZW0taW5kZXg9XCIke2luZGV4fVwiXWApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKE1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQocm93KSkge1xyXG4gICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YS5zbWUtdGFibGUtcm93LWFjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lclRvcCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBjb250YWluZXJCb3R0b20gPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJDbGllbnRSZWN0ID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKVswXTtcclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lckNsaWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lclRvcCA9IGNvbnRhaW5lckNsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyQm90dG9tID0gY29udGFpbmVyQ2xpZW50UmVjdC5ib3R0b207XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBpc1Jvd0luVmlld1BvcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvd1RvcCA9IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dDbGllbnRSZWN0ID0gcm93LmdldENsaWVudFJlY3RzKClbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAocm93Q2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1RvcCA9IHJvd0NsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlzUm93SW5WaWV3UG9ydCA9IHJvd1RvcCA+PSBjb250YWluZXJUb3AgJiYgcm93VG9wIDwgY29udGFpbmVyQm90dG9tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyb3cgJiYgIWlzUm93SW5WaWV3UG9ydCAmJiBpbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgcm93IGlzIG5vdCBpbiB2aWV3cG9ydCwganVzdCBmb2N1cyB0aGUgZmlyc3QgdmlzaWJsZSByb3cgaW4gdGhlIHZpZXdwb3J0LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlbiBkYXRhIHRhYmxlIHdpbGwgc3RpbGwgYmUgYWJsZSB0byByZWNlaXZlIGtleWJvYXJkIGV2ZW50LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFja3VwUm93cyA9IHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLXJvdy5zbWUtdGFibGUtcm93LWRhdGEnKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFja3VwUm93cy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dDbGllbnRSZWN0ID0gYmFja3VwUm93c1tpXS5nZXRDbGllbnRSZWN0cygpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3dDbGllbnRSZWN0LnRvcCA+IGNvbnRhaW5lclRvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBiYWNrdXBSb3dzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA+PSAwICYmICF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IDxIVE1MRWxlbWVudD5yb3cucXVlcnlTZWxlY3RvckFsbCgnLnNtZS10YWJsZS10ZCcpW3RoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50XTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50ID0gRG9tLmdldEZpcnN0Rm9jdXNhYmxlRGVzY2VuZGVudChjZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWRpdGFibGUgZGF0YSB0YWJsZSwgYmVjYXVzZSBvZiB0aGUgZGVzaWduXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGZvY3VzIG9uIHRoZSByb3cgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb3cuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkVsZW1lbnRGb2N1c2luZyhldmVudDogRWxlbWVudEZvY3VzaW5nRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Wm9uZSA9PT0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdEZvY3VzQmVoYXZpb3IoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0RXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldEVsZW1lbnQgJiYgZXZlbnQudGFyZ2V0RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc21lLWxhc3QtZm9jdXNhYmxlLXNoYWRvdy1lbGVtZW50JylcclxuICAgICAgICAgICAgJiYgZXZlbnQudGFyZ2V0RWxlbWVudCA9PT0gdGhpcy5sYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Rm9jdXNCZWhhdmlvcigpO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlWm9uZSA9PT0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50IHx8IGV2ZW50LnNvdXJjZVpvbmUgPT09IHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Rm9jdXNhYmxlRWxlbWVudCA9IERvbS5nZXROZXh0Wm9uZUVsZW1lbnQoZXZlbnQudGFyZ2V0RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5leHRGb2N1c2FibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c09uY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdEV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsVGFyZ2V0Wm9uZSA9IERvbS5nZXRBbmNlc3RvclpvbmUobmV4dEZvY3VzYWJsZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIENvcmVFbnZpcm9ubWVudC5hY2Nlc3NpYmlsaXR5TWFuYWdlci5wcm9jZXNzRWxlbWVudEZvY3VzaW5nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5uYXRpdmVFdmVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEZvY3VzYWJsZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldFpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFRhcmdldFpvbmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHRFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgodGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0NvbHVtbnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzQWN0dWFsQ29sdW1ucygpO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzQ29sdW1uc01haW4oKSB7XHJcbiAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1jb2xjb3VudCcsXHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5sZW5ndGggKyAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uID8gMSA6IDApKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1uUHJvY2Vzc2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NBY3R1YWxDb2x1bW5zKCkge1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucyA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goc291cmNlQ29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDb2x1bW4gIT09IHRoaXMuZ3JvdXBDb2x1bW4gJiYgIXNvdXJjZUNvbHVtbi5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMucHVzaChzb3VyY2VDb2x1bW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc3NDb2x1bW5zQnlPcmRlcihvcmRlcjogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29sdW1uc09yZGVyID0gb3JkZXI7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICAgICAgICBvcmRlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5maWVsZCA9PT0gZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDb2x1bW4gJiYgc291cmNlQ29sdW1uICE9PSB0aGlzLmdyb3VwQ29sdW1uICYmICFzb3VyY2VDb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLnB1c2goc291cmNlQ29sdW1uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcmRlciAmJiBvcmRlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ29sdW1ucygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgZnJvbSB1cGdyYWRpbmcgZGF0YSB0YWJsZSB0byBzdXBwb3J0IGVkaXRhYmxlIGRhdGEgdGFibGVcclxuICAgICAqIFRoZSBpZGVhIGlzIHRvIHVzZSB0aGUgZGF0YSB0YWJsZSdzIGhlYWRlciB3aWR0aCB0byBiZSBhcHBsaWVkIG9uIHRoZSBkYXRhIHRhYmxlIGJvZHkgY29sdW1ucy5cclxuICAgICAqIFdoZW4gbm90IHNob3dpbmcgaGVhZGVycywgbmVlZCB0byB1c2UgdGhlIGhlYWRlcidzIHdpZHRoIHRvIGJlIGFwcGxpZWQgdG8gdGQgYXMgd2VsbC5cclxuICAgICAqL1xyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRoRWxlbWVudHMgPSB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLWNhcHRpb24uc21lLXRhYmxlLWNvbHVtbi1oZWFkZXInKTtcclxuICAgICAgICBpZiAodGhFbGVtZW50cyAmJiB0aEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFjdHVhbENvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1uc1tpXS5kb21XaWR0aCA9IHRoRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRJc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgb25lIG1vcmUgdGljayBzbyB0aGF0IHRoZSBsb2FkaW5nIHdoZWVsIGNhbiBzdGFuZCBvbmUgbW9yZSBodG1sIHJlbmRlcmluZyBsaWZlIGN5Y2xlXHJcbiAgICAgKiBUaGlzIGZpeGVzIGEgYnVnIHJlbGF0ZWQgdG8gZGF0YSB0YWJsZSBvbiBsb2FkIG1pcy1hbGlnbmVkXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgYm9vbGVhblxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHJpdmF0ZSBzZXRJc0NvbHVtbldpZHRoQ2FsY3VsYXRlZChpbnB1dDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWQgPSBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4QnlTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEuY29udGVudCA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFRyZWVOb2RlRGF0YUlkZW50aXR5KG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbikge1xyXG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oY3VycmVudE5vZGUuZGF0YSkgKyAnXFxcXCcgKyByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbGVjdEFsbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMucmVuZGVyZWRJdGVtcy5zbGljZSgpLm1hcChpdGVtID0+IGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlRdWVyeUVkaXRvcih2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3Q6IFF1ZXJ5RGF0YSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxRdWVyeUVkaXRvciA9IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDtcclxuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgcXVlcnlFZGl0b3JGaWx0ZXJNYWluKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDogUXVlcnlEYXRhLCBpdGVtOiBEYXRhVGFibGVEYXRhSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcXVlcnlFZGl0b3JJdGVtID0gdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgdGhpcy5hY3R1YWxDb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHF1ZXJ5RWRpdG9ySXRlbS5jb2x1bW4udmFsdWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmFjdHVhbENvbHVtbnMuZmlsdGVyKChjb2wpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sLmZpZWxkID09PSBmaWVsZDtcclxuICAgICAgICAgICAgICAgIH0pWzBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoaXRlbSwgY29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uZmlsdGVyT3ZlcnJpZGluZ0Z1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbHVtbi5maWx0ZXJPdmVycmlkaW5nRnVuY3Rpb24odmFsdWUsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYXNlU2Vuc2l0aXZlRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRGbG9hdFZhbCA9IHBhcnNlRmxvYXQocXVlcnlFZGl0b3JJdGVtLnZhbHVlLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsRmxvYXRWYWwgPSBwYXJzZUZsb2F0KHZhbHVlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRTdHJpbmdWYWwgPSBxdWVyeUVkaXRvckl0ZW0udmFsdWUudmFsdWUudG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxTdHJpbmdWYWwgPSB2YWx1ZS50b1N0cmluZygpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeUVkaXRvckl0ZW0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxdWVyeUVkaXRvckl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5TaW5nbGVEcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLlRleHRJbnB1dCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocXVlcnlFZGl0b3JJdGVtLm9wZXJhbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFF1ZXJ5RGF0YU9wZXJhbmQuRXE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4ucXVlcnlFZGl0b3JFcXVhbElzQ29udGFpbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFN0cmluZ1ZhbC5pbmRleE9mKHRhcmdldFN0cmluZ1ZhbCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGZpbHRlciBzdHJpbmcgaXMgZW1wdHkgdGhlbiB0cmVhdCBhcyAnRXF1YWxJc0NvbnRhaW4nIHRvIHJlZnJlc2ggZGF0YSB0YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFN0cmluZ1ZhbCAhPT0gdGFyZ2V0U3RyaW5nVmFsICYmICFNc2Z0U21lLmlzRW1wdHkodGFyZ2V0U3RyaW5nVmFsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRdWVyeURhdGFPcGVyYW5kLkd0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRhcmdldEZsb2F0VmFsIHx8IHRhcmdldEZsb2F0VmFsID09PSAwKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdHVhbEZsb2F0VmFsIHx8IGFjdHVhbEZsb2F0VmFsID09PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFyZ2V0RmxvYXRWYWwgPD0gYWN0dWFsRmxvYXRWYWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFF1ZXJ5RGF0YU9wZXJhbmQuTHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGFyZ2V0RmxvYXRWYWwgfHwgdGFyZ2V0RmxvYXRWYWwgPT09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYWN0dWFsRmxvYXRWYWwgfHwgYWN0dWFsRmxvYXRWYWwgPT09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YXJnZXRGbG9hdFZhbCA+PSBhY3R1YWxGbG9hdFZhbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlEYXRhT3BlcmFuZC5OcTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWN0dWFsU3RyaW5nVmFsICE9PSB0YXJnZXRTdHJpbmdWYWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgZXFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFN0cmluZ1ZhbC5pbmRleE9mKHRhcmdldFN0cmluZ1ZhbCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLk11bHRpU2VsZWN0RHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdGhpcy5xdWVyeUVkaXRvckZpbHRlckJ5TXVsdGlwbGVTZWxlY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCwgcXVlcnlFZGl0b3JJdGVtLCBhY3R1YWxTdHJpbmdWYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLlRpbWVzcGFuRHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdGhpcy5xdWVyeUVkaXRvckZpbHRlckJ5VGltZXNwYW5Ecm9wZG93bihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LCBxdWVyeUVkaXRvckl0ZW0sIGFjdHVhbFN0cmluZ1ZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZm91bmQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBxdWVyeUVkaXRvckZpbHRlckJ5VGltZXNwYW5Ecm9wZG93bihcclxuICAgICAgICB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3Q6IFF1ZXJ5RGF0YSwgcXVlcnlFZGl0b3JJdGVtOiBRdWVyeURhdGFJdGVtLCBhY3R1YWxTdHJpbmdWYWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gcXVlcnlFZGl0b3JJdGVtLmNvbHVtbi52YWx1ZTtcclxuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XHJcbiAgICAgICAgbG9vcDE6XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50c1tpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLlRpbWVzcGFuRHJvcGRvd24gJiYgaXRlbS5jb2x1bW4gJiYgaXRlbS5jb2x1bW4udmFsdWUgPT09IGZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZS52YWx1ZSAmJiBpdGVtLnZhbHVlLnZhbHVlLnN0YXJ0ICYmIGl0ZW0udmFsdWUudmFsdWUuZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpdGVtLnZhbHVlLnZhbHVlLnN0YXJ0LmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBpdGVtLnZhbHVlLnZhbHVlLmVuZC5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsID0gbmV3IERhdGUoYWN0dWFsU3RyaW5nVmFsKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDw9IGFjdHVhbCAmJiBhY3R1YWwgPD0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3AxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcXVlcnlFZGl0b3JGaWx0ZXJCeU11bHRpcGxlU2VsZWN0aW9uKFxyXG4gICAgICAgIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDogUXVlcnlEYXRhLCBxdWVyeUVkaXRvckl0ZW06IFF1ZXJ5RGF0YUl0ZW0sIGFjdHVhbFN0cmluZ1ZhbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gcXVlcnlFZGl0b3JJdGVtLmNvbHVtbi52YWx1ZTtcclxuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XHJcbiAgICAgICAgbG9vcDE6XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50c1tpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLk11bHRpU2VsZWN0RHJvcGRvd24gJiYgaXRlbS5jb2x1bW4gJiYgaXRlbS5jb2x1bW4udmFsdWUgPT09IGZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZW0udmFsdWUudmFsdWUubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRTdHJpbmdWYWwgPSBpdGVtLnZhbHVlLnZhbHVlW2pdLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsU3RyaW5nVmFsID09PSB0YXJnZXRTdHJpbmdWYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBpZEJhZyB1c2VkIGJ5IHRoaXMgY29tcG9uZW50IHRvIHN0b3JlIHVuaXF1ZSBlbGVtZW50IGlkcy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUlkQmFnKCk6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpcnN0RGF0YUNvbHVtbjogJycsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZSB0cmVlIGdyaWQgYWNjZXNzaWJpbGl0eSBkb2N1bWVudGF0aW9uczogaHR0cHM6Ly93aWtpLm1vemlsbGEub3JnL0FjY2Vzc2liaWxpdHkvVHJlZUdyaWRcclxuICovXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLXRyZWUtdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBEYXRhVGFibGVDb21wb25lbnQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdUcmVlVGFibGVDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLnNob3dBc1RyZWUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtdHJlZS10YWJsZSdcclxuICAgICAgICBdKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IHJvbGU9XCJwcmVzZW50YXRpb25cIiBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXIgc21lLWZvY3VzLXpvbmUgc21lLWRhdGEtdGFibGUtdHJhbnNpdGlvblwiICNoZWFkZXJcclxuICBbY2xhc3Muc21lLXNoYWRvdy1zY3JvbGxlZC1jb250ZW50XT1cImlzU2Nyb2xsZWREb3duXCIgW2NsYXNzLnNtZS10YWJsZS1tdWx0aS1zZWxlY3RdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZSdcIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCIgW2NsYXNzLnNtZS10YWJsZS1pbmRlbnRlZF09XCJzaG93TGVmdE1hcmdpblwiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1zZWxlY3QtYWxsLWVuYWJsZWRdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgc2hvd0FsbEl0ZW1DaGVja2JveFwiPlxyXG4gIDwhLS0gQWNjb3JkaW5nIHRvIHRoZSBhY2Nlc3NpYmlsaXR5IHRlYW0sIGRhdGEtdGFibGUgaGVhZGVycyBzaG91bGQgYmUgYWNjZXNzaWJsZSBieSBrZXlib2FyZCBcclxuICBhbmQgdGhlIHJlc2l6ZXIgc2hvdWxkIGFsc28gYmUgYWNjZXNzZWQgYnkga2V5Ym9hcmQuLS0+XHJcbiAgPGRpdiAjaGVhZGVyVGFibGUgY2xhc3M9XCJzbWUtdGFibGUgc21lLXRhYmxlLXZpcnR1YWxpemVkXCIgcm9sZT1cInJvd2dyb3VwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXJvdyBzbWUtYXJyYW5nZS1zdGFjay1oIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG9cIiByb2xlPVwicm93XCJcclxuICAgICAgKGtleWRvd24pPVwib25IZWFkZXJUYWJsZVByZXNzZWQoJGV2ZW50KVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNhcHRpb25cIiBbYXR0ci5yb2xlXT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnPydjb2x1bW5oZWFkZXInOidwcmVzZW50YXRpb24nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jaGVja2JveCBzbWUtdGFibGUtaGVhZGVyLWNoZWNrYm94XCJcclxuICAgICAgICAgICpuZ0lmPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgc2hvd0FsbEl0ZW1DaGVja2JveCAmJiBzaG93SGVhZGVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgPGlucHV0IHNtZS1saW50LWRpc2FibGUtc2VsZiB0eXBlPVwiY2hlY2tib3hcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImdldEFsbEl0ZW1DaGVja0JveEFyaWFMYWJlbCgpXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cInNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKT8ndHJ1ZSc6J2ZhbHNlJ1wiIChjaGFuZ2UpPVwib25BbGxJdGVtQ2hlY2tCb3hDbGlja2VkKClcIiAvPlxyXG4gICAgICAgICAgPGxhYmVsIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGFjdHVhbENvbHVtbnM7IGxldCBjb2xJbmRleCA9IGluZGV4XCIgW2F0dHIuZmllbGRdPVwiY29sdW1uLmZpZWxkXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzogY29sdW1uLndpZHRofVwiXHJcbiAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2FwdGlvbiBzbWUtdGFibGUtY29sdW1uLWhlYWRlciBzbWUtcG9zaXRpb24tZmxleC1hdXRvIHt7Y29sdW1uLnN0eWxlQ2xhc3N9fVwiXHJcbiAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNvcnRhYmxlIT0nZmFsc2UnICYmIHNob3dIZWFkZXJcIiBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXItY2VsbCBzbWUtZm9jdXMtem9uZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiY2xpY2tDb2x1bW4oY29sdW1uKVwiIHJvbGU9XCJjb2x1bW5oZWFkZXJcIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiY29sdW1uU29ydFNldHRpbmdzW2NvbHVtbi5oZWFkZXJdXCI+XHJcbiAgICAgICAgICA8c3Bhbj57e2NvbHVtbi5oZWFkZXJ9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLW1hcmdpbi1sZWZ0LXh4c1wiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tdXAnOmNvbHVtbi5zb3J0TW9kZT09PXNvcnRNb2RlRW51bS5Bc2NlbmQsJ3NtZS1pY29uLWRvd24nOmNvbHVtbi5zb3J0TW9kZT09PXNvcnRNb2RlRW51bS5EZXNjZW5kfVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIShjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNvcnRhYmxlIT0nZmFsc2UnKSAmJiBzaG93SGVhZGVyXCIgY2xhc3M9XCJzbWUtdGFibGUtaGVhZGVyLWNlbGxcIlxyXG4gICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyXCI+XHJcbiAgICAgICAgICA8c3Bhbj57e2NvbHVtbi5oZWFkZXJ9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLW1hcmdpbi1sZWZ0LXh4c1wiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tdXAnOmNvbHVtbi5zb3J0TW9kZT09PXNvcnRNb2RlRW51bS5Bc2NlbmQsJ3NtZS1pY29uLWRvd24nOmNvbHVtbi5zb3J0TW9kZT09PXNvcnRNb2RlRW51bS5EZXNjZW5kfVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dIZWFkZXJcIiBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXItY2VsbFwiIHJvbGU9XCJjb2x1bW5oZWFkZXJcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c21lLXJlc2l6ZXIgdGFiaW5kZXg9XCIwXCIgKm5nSWY9XCJjb2xJbmRleCE9PWFjdHVhbENvbHVtbnMubGVuZ3RoLTEgJiYgc2hvd0hlYWRlclwiIHJlc2l6ZXJIb3N0U2VsZWN0b3I9XCJkaXYuc21lLXRhYmxlLWhlYWRlclwiXHJcbiAgICAgICAgICAocmVzaXplZCk9XCJvbkNvbHVtblJlc2l6ZWQoY29sSW5kZXgsICRldmVudClcIiBbdmlzaWJsZVRvU2NyZWVuUmVhZGVyXT1cInRydWVcIiBbc2hvd1Jlc2l6ZXJDb3Zlcl09XCJmYWxzZVwiXHJcbiAgICAgICAgICBvcmllbnRhdGlvbj1cImxlZnRcIiAocmVzaXppbmcpPVwib25Db2x1bW5SZXNpemluZygkZXZlbnQpXCIgY2xhc3M9XCJzbWUtZm9jdXMtem9uZVwiPjwvc21lLXJlc2l6ZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwic21lLWZvY3VzLXpvbmUgc21lLXRhYmxlLWNvbnRhaW5lciBzbWUtZGF0YS10YWJsZS10cmFuc2l0aW9uXCIgI2NvbnRlbnRcclxuICByb2xlPVwicHJlc2VudGF0aW9uXCIgW2NsYXNzLnNtZS10YWJsZS1tdWx0aS1zZWxlY3RdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZSdcIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCIgW2NsYXNzLnNtZS1tYXJnaW4tdG9wLW5vbmVdPVwiIXNob3dIZWFkZXJcIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtaW5kZW50ZWRdPVwic2hvd0xlZnRNYXJnaW5cIiBbY2xhc3Muc21lLXRhYmxlLWdyaWQtbGluZXNdPVwic2hvd0dyaWRcIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtc2VsZWN0LWFsbC1lbmFibGVkXT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnICYmIHNob3dBbGxJdGVtQ2hlY2tib3hcIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtZWRpdGFibGVdPVwiZWRpdGFibGVcIj5cclxuICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXNjcm9sbC1jb250YWluZXIgc21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24taW5zZXQtbm9uZVwiXHJcbiAgICBbbmdDbGFzc109XCJ7J3NtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLWluc2V0LW5vbmUnOiBzY3JvbGxhYmxlLCAnc21lLXNjcm9sbGFibGUnOiBzaG91bGRTY3JvbGx9XCJcclxuICAgICNzY3JvbGxDb250YWluZXIgcm9sZT1cInJvd2dyb3VwXCI+XHJcbiAgICA8ZGl2IHJvbGU9XCJyb3dcIiBjbGFzcz1cInNtZS10YWJsZS1yb3cgc21lLXRhYmxlLXJvdy1wbGFjZWhvbGRlclwiICNlbXB0eU1lc3NhZ2UgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgKm5nSWY9XCIocmVuZGVyZWRJdGVtcy5sZW5ndGg9PT0wICYmICFsYXp5TG9hZCkgfHwgIWlzQ29sdW1uV2lkdGhDYWxjdWxhdGVkXCI+XHJcbiAgICAgIDxzbWUtbG9hZGluZy13aGVlbCAqbmdJZj1cImlzTG9hZGluZyB8fCAhaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWRcIiBbbWVzc2FnZV09XCJsb2FkaW5nTWVzc2FnZVwiPlxyXG4gICAgICA8L3NtZS1sb2FkaW5nLXdoZWVsPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWNlbGwtcGxhY2Vob2xkZXJcIj4mbmJzcDs8L2Rpdj5cclxuICAgICAgPGRpdiByb2xlPVwiY2VsbFwiIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIj57e2dldE5vUmVjb3Jkc01lc3NhZ2UoKX19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtbGF5b3V0LXJlbGF0aXZlIHNtZS1wb3NpdGlvbi1zdHJldGNoLWggc21lLWFycmFuZ2Utb3ZlcmZsb3ctaGlkZVwiICNzY3JvbGxCb2R5IHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZSBzbWUtdGFibGUtc2Nyb2xsYWJsZSBzbWUtdGFibGUtdmlydHVhbGl6ZWRcIiAjc2Nyb2xsQWJvdmVEYXRhXHJcbiAgICAgICAgW25nU3R5bGVdPVwie3RvcDogc2Nyb2xsQWJvdmVEYXRhU3R5bGVUb3B9XCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwidHJ1ZVwiIHNtZS1saW50LWRpc2FibGU+XHJcbiAgICAgICAgPCEtLSBBYm92ZSB2aWV3IHBvcnQgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcmVuZGVyZWRJdGVtIG9mIHJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0OyBsZXQgcm93SW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1yb3cgc21lLXRhYmxlLXJvdy1kYXRhIHNtZS10YWJsZS1yb3ctc2VsZWN0YWJsZVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLXJvdy1hY3RpdmVdPVwicmVuZGVyZWRJdGVtLmluZGV4ID09PSBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtcm93LXNlbGVjdGVkXT1cInJlbmRlcmVkSXRlbS5pbmRleCA9PT0gZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSB8fCBpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtZ3JvdXAtaXRlbV09XCJyZW5kZXJlZEl0ZW0udHlwZSA9PT0gcmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBJdGVtXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtZ3JvdXAtaGVhZGVyXT1cInJlbmRlcmVkSXRlbS50eXBlID09PSByZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLWNoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1hcnJhbmdlLXN0YWNrLWhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dBc1RyZWVcIiBjbGFzcz1cInNtZS10YWJsZS1jaGVja2JveFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBhY3R1YWxDb2x1bW5zOyBsZXQgY29sSW5kZXg9aW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLXRhYmxlLWNvbHVtbi1maXJzdCc6IGlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbiksICdzbWUtdGFibGUtZ3JvdXAtaGVhZGVyLWNlbGwnOiByZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyfVwiXHJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6Y29sdW1uLmRvbVdpZHRoKydweCd9XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvIHt7Y29sdW1uLnN0eWxlQ2xhc3N9fVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaXNUcmVlVGFibGVQYXJlbnROb2RlKHJlbmRlcmVkSXRlbSkgPyAtMSA6IDBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXNjcmVlbi1yZWFkZXIgc21lLXNjcmVlbi1yZWFkZXItZGlzYWJsZS1jb3B5XCIgKm5nSWY9XCJpc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pXCI+XHJcbiAgICAgICAgICAgICAgICB7e2dldEFkZGl0aW9uYWxTY3JlZW5SZWNvcmRlckNvbnRlbnQocmVuZGVyZWRJdGVtKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXIgJiYgY29sSW5kZXg9PT0wXCIgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tHcm91cFRvZ2dsZShyZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInVzZUdyb3VwVG9nZ2xlXCIgY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1zaXplLXh4cyBzbWUtbWFyZ2luLXJpZ2h0LXh4c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLWNoZXZyb25Eb3duJzppc0dyb3VwRXhwYW5kZWQocmVuZGVyZWRJdGVtLmRhdGEpLCAnc21lLWljb24tY2hldnJvblJpZ2h0JzohaXNHcm91cEV4cGFuZGVkKHJlbmRlcmVkSXRlbS5kYXRhKX1cIj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGhpcy5ncm91cEhlYWRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgW3RlbXBsYXRlXT1cInRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiAhcmVuZGVyZWRJdGVtLm5vZGUuaXNCdXN5ICYmIGNvbEluZGV4PT09MFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsXCIgW25nU3R5bGVdPVwieydwYWRkaW5nLWxlZnQnOihyZW5kZXJlZEl0ZW0uZGVwdGgqMTYrNCkrJ3B4J31cIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtZXhwYW5kYWJsZSc6IHJlbmRlcmVkSXRlbS5oYXNDaGlsZHJlbiAmJiAhcmVuZGVyZWRJdGVtLm5vZGUuaXNMZWFmfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1zaXplLXh4c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZD8ndHJ1ZSc6J2ZhbHNlJ1wiIChjbGljayk9XCJjbGlja1RyZWVUb2dnbGUoJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tY2hldnJvbkRvd24nOnJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkLCAnc21lLWljb24tY2hldnJvblJpZ2h0JzohcmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWR9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQgPyB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwuY29sbGFwc2UgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwuZXhwYW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmIHJlbmRlcmVkSXRlbS5ub2RlLmlzQnVzeSAmJiBjb2xJbmRleD09PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1sZWZ0JzoocmVuZGVyZWRJdGVtLmRlcHRoKjE2KzQpKydweCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8c21lLWxvYWRpbmctd2hlZWwgc2l6ZT1cImV4dHJhLXNtYWxsXCIgW2lubGluZV09XCJ0cnVlXCIgW2lzQmFja2dyb3VuZFRyYW5zcGFyZW50XT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDwvc21lLWxvYWRpbmctd2hlZWw+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0FzVHJlZSAmJiBzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiByZW5kZXJlZEl0ZW0udHlwZT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgY29sSW5kZXg9PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbCBzbWUtdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jaGVja2JveFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JdGVtQ2hlY2tCb3hDbGlja2VkKHJlbmRlcmVkSXRlbSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWVkaXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5ib2R5VGVtcGxhdGUgJiYgcmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1mdWxsLWhlaWdodF09XCJhdXRvUm93SGVpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGE/cmVzb2x2ZU9iamVjdFBhdGgocmVuZGVyZWRJdGVtLmRhdGEsY29sdW1uLmZpZWxkKTonLid9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIHJlbmRlcmVkSXRlbS5kYXRhICYmIGNvbHVtbi5ib2R5VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWNlbGwtZnVsbC1oZWlnaHRdPVwiYXV0b1Jvd0hlaWdodFwiIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1oZWlnaHQtYXV0b109XCJhdXRvUm93SGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyICpuZ0lmPVwiIXJlbmRlcmVkSXRlbS5kYXRhLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLmJvZHlUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhXCIgW3Jvd0luZGV4XT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlIHNtZS10YWJsZS1zY3JvbGxhYmxlXCIgI3Njcm9sbERhdGEgW2NsYXNzLnNtZS10YWJsZS12aXJ0dWFsaXplZF09XCIhZGlzYWJsZVVJVmlydHVhbGl6YXRpb25cIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInt0b3A6IHNjcm9sbERhdGFTdHlsZVRvcH1cIiBzbWUtbGludC1kaXNhYmxlIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByZW5kZXJlZEl0ZW0gb2YgcmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxyXG4gICAgICAgICAgKGtleWRvd24pPVwib25Db250ZW50VGFibGVQcmVzc2VkKCRldmVudClcIiAoa2V5dXApPVwib25Db250ZW50VGFibGVLZXlVcCgkZXZlbnQpXCIgKGNvbnRleHRtZW51KT1cImVuYWJsZVJpZ2h0Q2xpY2tTZWxlY3QgPyBzZWxlY3RJdGVtKCRldmVudCwgcmVuZGVyZWRJdGVtKSA6IHRydWVcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEl0ZW0oJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCIgY2xhc3M9XCJzbWUtdGFibGUtcm93IHNtZS10YWJsZS1yb3ctZGF0YSBzbWUtdGFibGUtcm93LXNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1yb3ctYWN0aXZlXT1cInJlbmRlcmVkSXRlbS5pbmRleCA9PT0gZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLXJvdy1zZWxlY3RlZF09XCJyZW5kZXJlZEl0ZW0uaW5kZXggPT09IGdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgfHwgaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWdyb3VwLWl0ZW1dPVwicmVuZGVyZWRJdGVtLnR5cGUgPT09IHJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSXRlbVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWdyb3VwLWhlYWRlcl09XCJyZW5kZXJlZEl0ZW0udHlwZSA9PT0gcmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS1jaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIiBbY2xhc3Muc21lLXRhYmxlLXJvdy1lZGl0YWJsZV09XCJlZGl0YWJsZVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLWhhcy12YWxpZGF0aW9uLWVycm9yXT1cImhhc1ZhbGlkYXRpb25FcnJvcihyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtZGF0YS10YWJsZS1yb3ctbmV3LWl0ZW1dPVwicmVuZGVyZWRJdGVtPy5kYXRhPy5pc05ld1Jvd1wiXHJcbiAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJyZW5kZXJlZEl0ZW0uaW5kZXggPj0gMCA/IDAgOiB1bmRlZmluZWRcIiAoZGJsY2xpY2spPVwiZG91YmxlQ2xpY2tSb3coJGV2ZW50LHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgKGZvY3VzKT1cIm9uQ29udGVudEl0ZW1Gb2N1c2VkKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiIChmb2N1c2luKT1cIm9uQ29udGVudEl0ZW1Gb2N1c2VkKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAoZm9jdXNvdXQpPVwib25Db250ZW50SXRlbUJsdXJyZWQoJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCIgW2F0dHIuZGF0YS1yZW5kZXJlZC1pdGVtLWluZGV4XT1cInJlbmRlcmVkSXRlbS5pbmRleFwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInJlbmRlcmVkSXRlbS5pbmRleCsyXCIgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pPyd0cnVlJzonZmFsc2UnXCJcclxuICAgICAgICAgIChtb3VzZWVudGVyKT1cInNldEhvdmVyZWRSZW5kZXJlZEl0ZW0ocmVuZGVyZWRJdGVtKVwiIChtb3VzZWxlYXZlKT1cInVuc2V0SG92ZXJlZFJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIHJvbGU9XCJyb3dcIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImdldEFyaWFFeHBhbmRlZEF0dHJpYnV0ZVZhbHVlKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sZXZlbF09XCJzaG93QXNUcmVlICYmIHJlbmRlcmVkSXRlbS5kZXB0aCA/IChyZW5kZXJlZEl0ZW0uZGVwdGgrMSk6dW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2staFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvXCJcclxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnID8gZ2V0Um9sZUF0dHJpYnV0ZUZvclRhYmxlUm93Q2VsbChyZW5kZXJlZEl0ZW0pIDogJ3ByZXNlbnRhdGlvbidcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dBc1RyZWVcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1jaGVja2JveC1jb250YWluZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCIgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2hlY2tib3hcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKT8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkQmFnLmZpcnN0RGF0YUNvbHVtbiArIHJlbmRlcmVkSXRlbS5pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiIChjaGFuZ2UpPVwib25JdGVtQ2hlY2tCb3hDbGlja2VkKHJlbmRlcmVkSXRlbSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBhY3R1YWxDb2x1bW5zOyBsZXQgY29sSW5kZXg9aW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLXRhYmxlLWNvbHVtbi1maXJzdCc6IGlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbiksICdzbWUtdGFibGUtZ3JvdXAtaGVhZGVyLWNlbGwnOiByZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyfVwiXHJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6Y29sdW1uLmRvbVdpZHRoKydweCd9XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvIHt7Y29sdW1uLnN0eWxlQ2xhc3N9fVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJnZXRSb2xlQXR0cmlidXRlRm9yVGFibGVSb3dDZWxsKHJlbmRlcmVkSXRlbSlcIiBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInJlbmRlcmVkSXRlbS5pbmRleCsyXCJcclxuICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpc1RyZWVUYWJsZVBhcmVudE5vZGUocmVuZGVyZWRJdGVtKSA/IC0xIDogMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlciBzbWUtc2NyZWVuLXJlYWRlci1kaXNhYmxlLWNvcHlcIiAqbmdJZj1cImlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbilcIj5cclxuICAgICAgICAgICAgICAgIHt7Z2V0QWRkaXRpb25hbFNjcmVlblJlY29yZGVyQ29udGVudChyZW5kZXJlZEl0ZW0pfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiBjb2xJbmRleD09PTBcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0dyb3VwVG9nZ2xlKHJlbmRlcmVkSXRlbSlcIiBbaWRdPVwiZ2V0Rmlyc3RDb2x1bW5JZChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidXNlR3JvdXBUb2dnbGVcIiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNpemUteHhzIHNtZS1tYXJnaW4tcmlnaHQteHhzXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi1jaGV2cm9uRG93bic6aXNHcm91cEV4cGFuZGVkKHJlbmRlcmVkSXRlbS5kYXRhKSwgJ3NtZS1pY29uLWNoZXZyb25SaWdodCc6IWlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSl9XCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YX19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyIFt0ZW1wbGF0ZV09XCJ0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzQnVzeSAmJiBjb2xJbmRleD09PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1sZWZ0JzoocmVuZGVyZWRJdGVtLmRlcHRoKjE2KzQpKydweCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWV4cGFuZGFibGUnOiByZW5kZXJlZEl0ZW0uaGFzQ2hpbGRyZW4gJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzTGVhZn1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2l6ZS14eHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQ/J3RydWUnOidmYWxzZSdcIiAoY2xpY2spPVwiY2xpY2tUcmVlVG9nZ2xlKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLWNoZXZyb25Eb3duJzpyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCwgJ3NtZS1pY29uLWNoZXZyb25SaWdodCc6IXJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkID8gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLmNvbGxhcHNlIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLmV4cGFuZFwiPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbC1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiByZW5kZXJlZEl0ZW0ubm9kZS5pc0J1c3kgJiYgY29sSW5kZXg9PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGxcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6KHJlbmRlcmVkSXRlbS5kZXB0aCoxNis0KSsncHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNtZS1sb2FkaW5nLXdoZWVsIHNpemU9XCJleHRyYS1zbWFsbFwiIFtpbmxpbmVdPVwidHJ1ZVwiIFtpc0JhY2tncm91bmRUcmFuc3BhcmVudF09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NtZS1sb2FkaW5nLXdoZWVsPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbC1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dBc1RyZWUgJiYgc2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgcmVuZGVyZWRJdGVtLnR5cGU9PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmIGNvbEluZGV4PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2hlY2tib3hcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKT8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkQmFnLmZpcnN0RGF0YUNvbHVtbiArIHJlbmRlcmVkSXRlbS5pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiIChjaGFuZ2UpPVwib25JdGVtQ2hlY2tCb3hDbGlja2VkKHJlbmRlcmVkSXRlbSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWVkaXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5ib2R5VGVtcGxhdGUgJiYgcmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1mdWxsLWhlaWdodF09XCJhdXRvUm93SGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyICYmIGNvbHVtbi5nZXRUb29sdGlwSGFuZGxlcihyZW5kZXJlZEl0ZW0uZGF0YSlcIlxyXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0Rmlyc3RDb2x1bW5JZChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YT9yZXNvbHZlT2JqZWN0UGF0aChyZW5kZXJlZEl0ZW0uZGF0YSxjb2x1bW4uZmllbGQpOicuJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIHJlbmRlcmVkSXRlbS5kYXRhICYmIGNvbHVtbi5ib2R5VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCIgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWhlaWdodC1hdXRvXT1cImF1dG9Sb3dIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWNlbGwtZnVsbC1oZWlnaHRdPVwiYXV0b1Jvd0hlaWdodFwiIFtpZF09XCJnZXRGaXJzdENvbHVtbklkKGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImNvbHVtbi5nZXRUb29sdGlwSGFuZGxlciAmJiBjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIocmVuZGVyZWRJdGVtLmRhdGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgKm5nSWY9XCIhcmVuZGVyZWRJdGVtLmRhdGEucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2x1bW4uYm9keVRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGFcIiBbcm93SW5kZXhdPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgIWNvbHVtbi5ib2R5RWRpdFRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlICYmIHJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIgJiYgY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyKHJlbmRlcmVkSXRlbS5kYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhP3Jlc29sdmVPYmplY3RQYXRoKHJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnQsY29sdW1uLmZpZWxkKTonLid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiByZW5kZXJlZEl0ZW0uZGF0YSAmJiBjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIgJiYgY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyKHJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgKm5nSWY9XCIhcmVuZGVyZWRJdGVtLmRhdGEucGxhY2Vob2xkZXJcIiBbcmVuZGVyZWRJdGVtXT1cInJlbmRlcmVkSXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGEuY29udGVudFwiIFtyb3dJbmRleF09XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiBjb2x1bW4uYm9keUVkaXRUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaG91bGRTaG93RWRpdFJvdyhyZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY29sdW1uLmJvZHlSZWFkVGVtcGxhdGUgJiYgcmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIgJiYgY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyKHJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YT9yZXNvbHZlT2JqZWN0UGF0aChyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50LGNvbHVtbi5maWVsZCk6Jy4nfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIHJlbmRlcmVkSXRlbS5kYXRhICYmIGNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIgJiYgY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyKHJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLmJvZHlSZWFkVGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50XCIgW3Jvd0luZGV4XT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvdWxkU2hvd0VkaXRSb3cocmVuZGVyZWRJdGVtKVwiIGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWVkaXQtY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyICYmIGNvbHVtbi5nZXRUb29sdGlwSGFuZGxlcihyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyICpuZ0lmPVwiIXJlbmRlcmVkSXRlbS5kYXRhLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLmJvZHlFZGl0VGVtcGxhdGVcIiBbZmllbGRdPVwiY29sdW1uLmZpZWxkXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGEuY29udGVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd0luZGV4XT1cInJvd0luZGV4XCIgW3JlbmRlcmVkSXRlbV09XCJyZW5kZXJlZEl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWxpZGF0aW9uQWxlcnQpPVwib25WYWxpZGF0aW9uQWxlcnRIYW5kbGVyKHJlbmRlcmVkSXRlbSwgY29sdW1uLmZpZWxkLCAkZXZlbnQuYWxlcnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoZGF0YUNoYW5nZWQpPVwib25FZGl0YWJsZURhdGFDaGFuZ2VkKCRldmVudC5yZW5kZXJlZEl0ZW0sJGV2ZW50LmZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1ZhbGlkYXRpb25FcnJvcihyZW5kZXJlZEl0ZW0pXCIgY2xhc3M9XCJzbWUtdGFibGUtcm93LXZhbGlkYXRpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvXCJcclxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnID8gZ2V0Um9sZUF0dHJpYnV0ZUZvclRhYmxlUm93Q2VsbChyZW5kZXJlZEl0ZW0pIDogJ3ByZXNlbnRhdGlvbidcIlxyXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnPycwJzondW5kZWZpbmVkJ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhbGlkYXRpb25SZXN1bHRJdGVtIG9mIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtdmFsaWRhdGlvbi1hbGVydCBbYWxlcnRdPVwidmFsaWRhdGlvblJlc3VsdEl0ZW0uYWxlcnRcIj48L3NtZS12YWxpZGF0aW9uLWFsZXJ0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1yb3dcIiAjdGVtcFJvdz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtdGRcIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCI+Jm5ic3A7PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJzaG91bGRVc2VMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudFwiICNsYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCBjbGFzcz1cInNtZS1mb2N1cy16b25lXCJcclxuICAgICAgZGF0YS1zbWUtbGFzdC1mb2N1c2FibGUtc2hhZG93LWVsZW1lbnQgKGZvY3VzKT1cIm9uTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c2VkKCRldmVudClcIiB0YWJpbmRleD1cIjBcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwic21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24taW5zZXQtbm9uZVwiXHJcbiAgICAqbmdJZj1cImlzQnVzeSB8fCAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sgJiYgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nKVwiPlxyXG4gICAgPHNtZS1sb2FkaW5nLXdoZWVsIFtpc0JhY2tncm91bmRUcmFuc3BhcmVudF09XCJ0cnVlXCI+PC9zbWUtbG9hZGluZy13aGVlbD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgI3Jlc2l6ZXJJbmRpY2F0b3JcclxuICBjbGFzcz1cInNtZS13aWR0aC14eHMgc21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24tc3RyZXRjaC12IHNtZS1iYWNrZ3JvdW5kLWNvbG9yLWJhc2UtODAgc21lLWxheWVyLWZseW91dCBzbWUtbGF5b3V0LW5vbmVcIj5cclxuPC9kaXY+XHJcbiJdfQ==
5425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBQ2pHLE9BQU8sRUFBd0IsT0FBTyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDcEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdkYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RFLE9BQU8sRUFBVSxtQkFBbUIsRUFBRSxNQUFN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LDhEQUF5QztRQUk5QyxlQUE4RTtRQUE5RSwrRkFBOEU7O3VGRHd6SHRFLGtCQUFrQjtjQUo5QixTQUFTO2VBQUM7Z0JBQ1AsUUFBUSxFQUFFLGdCQUFnQjtnQkFDMUIsV0FBVyxFQUFFLDZCQUE2QjthQUM3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdDaGVja2VkLFxyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgQ29udGVudENoaWxkLFxyXG4gICAgQ29udGVudENoaWxkcmVuLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBUZW1wbGF0ZVJlZixcclxuICAgIFZpZXdDaGlsZCxcclxuICAgIFZpZXdDaGlsZHJlblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBZaWVsZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL3lpZWxkLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IEVsZW1lbnRGb2N1c2luZ0V2ZW50LCBLZXlDb2RlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2FjY2Vzc2liaWxpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IENvcmVFbnZpcm9ubWVudCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9jb3JlLWVudmlyb25tZW50JztcclxuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RpYWdub3N0aWNzL2xvZy1sZXZlbCc7XHJcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RpYWdub3N0aWNzL2xvZ2dpbmcnO1xyXG5pbXBvcnQgeyBEb20gfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RvbS9kb20nO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTbWVJbmplY3QgfSBmcm9tICcuLi9jb21tb24vZGVjb3JhdG9ycy9pbmplY3Rpb24uZGVjb3JhdG9ycyc7XHJcbmltcG9ydCB7IExheW91dCwgU01FX0xBWU9VVF9QUk9WSURFUiB9IGZyb20gJy4uL2NvbW1vbi9sYXlvdXQnO1xyXG5pbXBvcnQgeyBGb3JtRmllbGRDb250YWluZXIgfSBmcm9tICcuLi9mb3JtL2Zvcm0tZmllbGQvZm9ybS1maWVsZC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBTZWFyY2hGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mb3JtL2Zvcm0tZmllbGQvc2VhcmNoL3NlYXJjaC1mb3JtLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFF1ZXJ5RGF0YSwgUXVlcnlEYXRhSXRlbSwgUXVlcnlEYXRhSXRlbVZhbHVlVHlwZSwgUXVlcnlEYXRhT3BlcmFuZCB9IGZyb20gJy4uL3F1ZXJ5LWVkaXRvci9xdWVyeS1lZGl0b3ItY29udHJhY3QnO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlciB9IGZyb20gJy4vZGF0YS10YWJsZS1hY2Nlc3NpYmlsaXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2RhdGEtdGFibGUtY29sdW1uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgICBEYXRhVGFibGVDdXN0b21Tb3J0RXZlbnQsXHJcbiAgICBEYXRhVGFibGVEYXRhSXRlbSxcclxuICAgIERhdGFUYWJsZUxhenlMb2FkRXZlbnQsXHJcbiAgICBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUsXHJcbiAgICBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sXHJcbiAgICBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLFxyXG4gICAgRGF0YVRhYmxlU29ydE1vZGUsXHJcbiAgICBFZGl0YWJsZURhdGFDaGFuZ2VTZXQsXHJcbiAgICBFZGl0YWJsZURhdGFJdGVtLFxyXG4gICAgTm9kZU5hdmlnYXRpbmdUYXNrLFxyXG4gICAgVHJlZU5vZGVEYXRhSXRlbVxyXG59IGZyb20gJy4vZGF0YS10YWJsZS1jb250cmFjdCc7XHJcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQeENvbnZlcnRlciB9IGZyb20gJy4vaGVscGVycy9weC1jb252ZXJ0ZXInO1xyXG5cclxuLyoqXHJcbiAqIERhdGEgdGFibGUgY29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWRhdGEtdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95IHtcclxuICAgIHByaXZhdGUgc3RhdGljIHNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbiA9ICdtdWx0aXBsZSc7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBtaW5Db2x1bW5XaWR0aCA9IDUwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcHhDb252ZXJ0ZXIgPSBuZXcgUHhDb252ZXJ0ZXIoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnRGF0YVRhYmxlQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzQ29tcG9uZW50SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgZWRpdGFibGVEYXRhQ2hhbmdlU2V0OiBFZGl0YWJsZURhdGFDaGFuZ2VTZXQgPSB7XHJcbiAgICAgICAgYWRkZWRJdGVtczogW10sXHJcbiAgICAgICAgdXBkYXRlZEl0ZW1zOiBbXSxcclxuICAgICAgICBkZWxldGVkSXRlbXM6IFtdXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgZGVmYXVsdFNjcm9sbFBpeGVscyA9IDkwO1xyXG4gICAgcHJpdmF0ZSBkZWZhdWx0U2Nyb2xsUGVyY2VudGFnZSA9IDAuNDtcclxuICAgIHByaXZhdGUgbWF4QWN0dWFsU2Nyb2xsRGF0YUVsZW1lbnRIZWlnaHQgPSA1MDAwMDA7XHJcbiAgICBwcml2YXRlIGZpbHRlckRlYm91bmNlVGltZW91dCA9IDMwMDtcclxuICAgIHByaXZhdGUga2V5Ym9hcmROYXZpZ2F0aW9uRGVib3VuY2VUaW1lb3V0ID0gMTAwO1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxDaGVja0ludGVydmFsRHVyYXRpb24gPSAzMDA7XHJcbiAgICBwcml2YXRlIHNjcm9sbENoZWNrSW50ZXJ2YWw7XHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgYnVmZmVyUm93UmF0ZSA9IDE7XHJcbiAgICBwcml2YXRlIGV2ZW50VW5yZWdpc3RyYXRlckhhbmRsZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBzb3J0Q29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIHByZXZpb3VzU29ydENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEl0ZW1zOiBEYXRhVGFibGVEYXRhSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBhY3R1YWxJdGVtczogRGF0YVRhYmxlRGF0YUl0ZW1bXTtcclxuICAgIHByaXZhdGUgY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGN1cnJlbnRIYXNWZXJ0aWNhbE92ZXJmbG93OiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJEZWJvdW5jZVRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzU2VsZWN0ZWRSb3dUaW1lcjtcclxuICAgIHByaXZhdGUgb2xkRmlsdGVyS2V5d29yZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJLZXl3b3JkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGludGVybmFsR2xvYmFsRmlsdGVyOiBhbnk7XHJcbiAgICBwcml2YXRlIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgaXNTY3JvbGxpbmc6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGlzU2Nyb2xsaW5nRXZlbnRIYW5kbGVyU2V0dXA6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRpc3BsYXlJdGVtc1RvcDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFJlbmRlcmVkSXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdID0gW107XHJcbiAgICBwcml2YXRlIGludGVybmFsU2VsZWN0aW9uOiBEYXRhVGFibGVEYXRhSXRlbVtdID0gW107XHJcbiAgICBwcml2YXRlIGhhc0xvbmdMaXN0OiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50U3RhcnRJbmRleE9mSXRlbUluVmlld1BvcnQgPSAtMTtcclxuICAgIHByaXZhdGUgZGF0YVNjcm9sbFRvcDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydDogRGF0YVRhYmxlUmVuZGVyZWRJdGVtO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEdyb3VwQ29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIGludGVybmFsR3JvdXBTb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLk5vbmU7XHJcbiAgICBwcml2YXRlIGludGVybmFsU2VsZWN0aW9uTW9kZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBzaGFkb3dUcmVlOiBhbnk7IC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBtYWludGFpbiB0aGUgdHJlZSB0byBoZWxwIGRvIHRoZSBcInNhbWUgbGV2ZWwgb25seVwiIHNvcnQuXHJcbiAgICBwcml2YXRlIGFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIHByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggPSAtMTtcclxuICAgIHByaXZhdGUgYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXggPSAtMTtcclxuICAgIHByaXZhdGUgcmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSByZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gMDtcclxuICAgIHByaXZhdGUgY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gLTE7XHJcbiAgICBwcml2YXRlIHVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlcjogKCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgY29udGVudEFyZWFIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBlZGl0YWJsZU5ld1Jvd0hhc0ZvY3VzID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGxheW91dENoYW5nZVN1YnNjcmliZXI7XHJcbiAgICBwcml2YXRlIGdsb2JhbEZpbHRlclN1YnNjcmliZXI7XHJcbiAgICBwcml2YXRlIGdyb3VwS2V5czogeyBba2V5OiBzdHJpbmddOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSB9ID0ge307XHJcbiAgICBwcml2YXRlIGludGVybmFsQ29sdW1uczogUXVlcnlMaXN0PERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD47XHJcbiAgICBwcml2YXRlIHRyZWVUb2dnbGVTdGF0dXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICBwcml2YXRlIHNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIGludGVybmFsUXVlcnlFZGl0b3I6IFF1ZXJ5RGF0YTtcclxuICAgIHByaXZhdGUgYWN0dWFsQ29sdW1uUHJvY2Vzc2VkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCA9IDM7XHJcbiAgICBwcml2YXRlIGFjY2VzaWJpbGl0eU1hbmFnZXIgPSBDb3JlRW52aXJvbm1lbnQuYWNjZXNzaWJpbGl0eU1hbmFnZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFRhYmxlQXJpYUxhYmVsbGVkQnk6IHN0cmluZztcclxuICAgIHB1YmxpYyBpbnRlcm5hbFRhYmxlQXJpYUxhYmVsOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHNjcm9sbERhdGFTdHlsZVRvcDogc3RyaW5nO1xyXG4gICAgcHVibGljIHNjcm9sbEFib3ZlRGF0YVN0eWxlVG9wOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBkYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlciA9IG5ldyBEYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlcigpO1xyXG4gICAgcHVibGljIGNvbHVtblNvcnRTZXR0aW5ncyA9IHt9O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3Jlc2l6ZXJJbmRpY2F0b3InKVxyXG4gICAgcHJpdmF0ZSByZXNpemVySW5kaWNhdG9yOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlcicpXHJcbiAgICBwcml2YXRlIGhlYWRlckVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyVGFibGUnKVxyXG4gICAgcHJpdmF0ZSBoZWFkZXJUYWJsZUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnY29udGVudCcpXHJcbiAgICBwcml2YXRlIGNvbnRlbnRFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgICBwcml2YXRlIHNjcm9sbENvbnRhaW5lckVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgndGVtcFJvdycpXHJcbiAgICBwcml2YXRlIHRlbXBSb3dFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbEJvZHknLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcHJpdmF0ZSBzY3JvbGxCb2R5RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxBYm92ZURhdGEnKVxyXG4gICAgcHJpdmF0ZSBzY3JvbGxBYm92ZURhdGFFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbERhdGEnKVxyXG4gICAgcHJpdmF0ZSBzY3JvbGxEYXRhRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdlbXB0eU1lc3NhZ2UnKVxyXG4gICAgcHJpdmF0ZSBlbXB0eU1lc3NhZ2VFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2xhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50JylcclxuICAgIHByaXZhdGUgbGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZCgnZ3JvdXAnKVxyXG4gICAgcHVibGljIGdyb3VwSGVhZGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ2NoYW5nZXNldFVwZGF0ZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uQ2hhbmdlc2V0VXBkYXRlZCgpOiBFdmVudEVtaXR0ZXI8RWRpdGFibGVEYXRhQ2hhbmdlU2V0PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlc2V0VXBkYXRlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlc2V0VXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RWRpdGFibGVEYXRhQ2hhbmdlU2V0PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdGhlIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGNoYW5naW5nIGlzIGhhcHBlbmluZy5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVEYXRhSXRlbT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAncm93RGJsY2xpY2snIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uUm93RGJsY2xpY2soKTogRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd0RibGNsaWNrO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyByb3dEYmxjbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBkYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdncm91cFRvZ2dsZUNsaWNrJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbkdyb3VwVG9nZ2xlQ2xpY2tlZCgpOiBFdmVudEVtaXR0ZXI8eyBncm91cERhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncm91cFRvZ2dsZUNsaWNrO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBncm91cFRvZ2dsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGdyb3VwRGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnZWRpdGFibGVSb3dBZGRlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25OZXdFZGl0YWJsZVJvd0FkZGVkKCk6IEV2ZW50RW1pdHRlcjx7IGRhdGE6IGFueSwgb3ZlcnJpZGVOZXdEYXRhSGFuZGxlcjogKGRhdGE6IGFueSkgPT4gdm9pZCB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGVSb3dBZGRlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZWRpdGFibGVSb3dBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBkYXRhOiBhbnksIG92ZXJyaWRlTmV3RGF0YUhhbmRsZXI6IChkYXRhOiBhbnkpID0+IHZvaWQgfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgY29sdW1ucyByZW5kZXJlZCBvbiB0aGUgVUkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY29sdW1ucygpOiBRdWVyeUxpc3Q8RGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxDb2x1bW5zO1xyXG4gICAgfVxyXG5cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KVxyXG4gICAgcHVibGljIHNldCBjb2x1bW5zKHZhbHVlOiBRdWVyeUxpc3Q8RGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50Pikge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxDb2x1bW5zID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBWaWV3Q2hpbGRyZW4oRGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnQpXHJcbiAgICBwcml2YXRlIGRhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50czogUXVlcnlMaXN0PERhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgYWN0dWFsIGNvbHVtbnMgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0YWJsZS5cclxuICAgICAqIEluIGdyb3VwaW5nIGRhdGEgdGFibGUgc2NlbmFyaW8sIHRoZSBhY3R1YWwgY29sdW1ucyBkb2Vzbid0IGNvbnRhaW4gdGhlIGdyb3VwaW5nIGNvbHVtbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdHVhbENvbHVtbnM6IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBpdGVtIHJlbmRlcmVkIG9uIHRoZSBVSSAoaW5jbHVkaW5nIHRoZSBpdGVtcyBpbiBhbmQgb3V0c2lkZSBvZiB2aWV3IHBvcnQpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJlbmRlcmVkSXRlbXMoKTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsUmVuZGVyZWRJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHJlbmRlcmVkSXRlbXModmFsdWU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFJlbmRlcmVkSXRlbXMgPSB2YWx1ZSB8fCBbXTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNDaGFuZ2UuZW1pdCgpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXJvd2NvdW50JywgdmFsdWUubGVuZ3RoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmlsdGVyZWRJdGVtczogRGF0YVRhYmxlRGF0YUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHJlbmRlcmVkIGl0ZW1zIGFyZSBjaGFuZ2VkLlxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBiYWNrZ3JvdW5kIGJ1c3kgdGFza3MuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaXNCdXN5OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSByaWdodCBjbGljayBzZWxlY3RcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlbmFibGVSaWdodENsaWNrU2VsZWN0ID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIG1lc3NhZ2Ugc2hvd2luZyB3aGVuIHRoZSBkYXRhIGlzIGxvYWRpbmcuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbG9hZGluZ01lc3NhZ2U6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgbWVzc2FnZSBzaG93aW5nIHdoZW4gdGhlIGRhdGEgbG9hZGluZyBpcyBmaW5pc2hlZCBidXQgdGhlIGRhdGEgaXMgZW1wdHkgb3Igbm8gZGF0YSBnb3QgcmVuZGVyZWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbm9SZWNvcmRNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlZGl0YWJsZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIGV4cGFuZCB0cmVlIG5vZGUgb24gcm9vdCBub2RlIGNoZWNrZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHRyZWUgdGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZXhwYW5kVHJlZU5vZGVPbkNoZWNrZWQgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgYWxsIGVkaXRhYmxlIHJvd3MgaW4gYW4gZWRpdGFibGUgdGFibGUgc2hvdWxkIGJlIHZpc2libGUgKHJlZ2FyZGxlc3Mgb2YgaG92ZXIvc2VsZWN0ZWQgc3RhdGUpLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlzQWxsRWRpdGFibGVSb3dzVmlzaWJsZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICogSXQgaW5kaWNhdGVzIHRoYXQgYSBzY3JvbGxiYXIgY2FuIGJlIHVzZWQgd2hlbiB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGNvbHVtbnMgaXMgaHVnZVxyXG4gICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2Nyb2xsYWJsZUhvcml6b250YWwgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGF0IGEgZGF0YSBsYXp5IGxvYWRpbmcgbmVlZHMgdG8gaGFwcGVuIGFuZCByZXF1aXJlIHRoZSBjb25zdW1lciB0byBwcm92aWRlIGRhdGEgZm9yIHRoZSBsYXp5IGxvYWRpbmcgcGFydC5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgbGF6eUxvYWRpbmdEYXRhOiBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlTGF6eUxvYWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUxhenlMb2FkRXZlbnQ+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCB0cmlnZ2VycyB3aGVuIGEgdHJlZSBub2RlIGlzIGV4cGFuZGVkLlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdub2RlRXhwYW5kZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uTm9kZUV4cGFuZCgpOiBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlRXhwYW5kZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG5vZGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCB0cmlnZ2VycyB3aGVuIGEgdHJlZSBub2RlIGlzIGNvbGxhcHNlZC5cclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnbm9kZUNvbGxhcHNlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Ob2RlQ29sbGFwc2VkKCk6IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVDb2xsYXBzZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG5vZGVDb2xsYXBzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgdHJpZ2dlcnMgd2hlbiBhIHRyZWUgbm9kZSBpcyBzZWxlY3RlZC5cclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnbm9kZVNlbGVjdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbk5vZGVTZWxlY3QoKTogRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZVNlbGVjdGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBub2RlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBkYXRhIGlzIGxvYWRlZCBpbiBsYXp5IGxvYWRpbmcgd2F5LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxhenlMb2FkOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gcmVtZW1iZXIgdGhlIHRyZWUgdG9nZ2xlIHN0YXR1cy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZW1lbWJlclRyZWVOb2RlVG9nZ2xlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gcmVtZW1iZXIgdGhlIHNlbGVjdGlvbiB0aGVuIGFmdGVyIHRoZSB3aG9sZSBkYXRhIHNvdXJjZSBpcyByZWZyZXNoZWQgdGhlIHNlbGVjdGlvbiB3aWxsIHN0aWxsIGJlIHRoZXJlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHJlbWVtYmVyU2VsZWN0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGx5IHRoZSBlbnRlciBrZXkgb24gYSByb3cgcmVkaXJlY3RzIHRvIHRoZSBkb3VibGUgY2xpY2sgYmVoYXZpb3Igb2YgdGhlIHJvdy5cclxuICAgICAqIElmIHRoaXMgZmxhZyBpcyB0cnVlLCB0aGVuIGRhdGEgdGFibGUgd291bGQgZG8gbm90aGluZyBmb3IgZW50ZXIga2V5IG9uIGEgcm93LlxyXG4gICAgICogVGhlbiB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGVudGVyIGtleSBhY3Rpb24gYnkgeW91ciBzZWxmLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHByZXZlbnRFbnRlcktleUZvckRlZmF1bHRBY3Rpb246IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBwb2ludHMgdG8gdGhlIGV4dGVybmFsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuIHVuaXF1ZSBpZGVudGl0eSBzdHJpbmcgZm9yIGFueSBkYXRhIGl0ZW0uXHJcbiAgICAgKiBTb21lIHNjZW5hcmlvcyBsaWtlIHRyZWUgdGFibGUgd291bGQgbmVlZCB0aGlzIGZ1bmN0aW9uIHRvIHJlbWVtYmVyIHRvZ2dsZSBzdGF0dXMgZm9yIGFueSB0cmVlIG5vZGUgYnkgdGhlIGlkZW50aXR5LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uOiAoZGF0YTogYW55KSA9PiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCeSBkZWZhdWx0IG5hdHVyYWwgc29ydCBpcyB0dXJuZWQgb24uXHJcbiAgICAgKiBCdXQgZm9yIHBlcmZvcm1hbmNlIGNvbmNlcm4sIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIG5hdHVyYWwgc29ydCBhbmQganVzdCBkbyB2ZXJ5IHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvbi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkaXNhYmxlTmF0dXJhbFNvcnQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgaXRlbXMgcmVuZGVyZWQgYWJvdmUgdGhlIHZpZXcgcG9ydC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0OiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgaXRlbXMgcmVuZGVyZWQgaW4gYW5kIGJlbG93IHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0OiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlIGlzIHNjcm9sbGVkIGRvd24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc1Njcm9sbGVkRG93bjogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlIHNob3VsZCBoYW5kbGUgc2Nyb2xsaW5nIGZvciBjb250ZW50LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvdWxkU2Nyb2xsOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxhc3QgZm9jdXNhYmxlIHNoYWRvdyBlbGVtZW50IHNob3VsZCBiZSB1c2VkLlxyXG4gICAgICogTm9ybWFsbHkgd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyB0aGUgbGFzdCBmb2N1c2FibGUgZWxlbWVudCxcclxuICAgICAqIHRoZSBsYXN0IGZvY3VzYWJsZSBlbGVtZW50IG5lZWQgdG8gYmUgdXNlZCB0byBoYW5kbGUgZm9jdXMgbW92ZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG91bGRVc2VMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudDogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHNjcm9sbCB0byBzZWxlY3Rpb24gYWZ0ZXIgc29ydGluZy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG91bGRTY3JvbGxUb1NlbGVjdGlvbkFmdGVyU29ydGluZzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgYW5kIHNldHMgdGhlIGdsb2JhbCBmaWx0ZXIgdmFsdWUgaHRtbCBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBnbG9iYWxGaWx0ZXIoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEdsb2JhbEZpbHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGdsb2JhbEZpbHRlcihnbG9iYWxGaWx0ZXI6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50SGFuZGxlciA9IChldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZpbHRlckRlYm91bmNlVGltZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlckRlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvU2VhcmNoKGdsb2JhbEZpbHRlclsndmFsdWUnXSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJEZWJvdW5jZVRpbWVvdXQpO1xyXG4gICAgICAgIH0pLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRvU2VhcmNoID0gKGtleXdvcmQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcktleXdvcmQgPSBrZXl3b3JkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJLZXl3b3JkICE9PSB0aGlzLm9sZEZpbHRlcktleXdvcmQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyLmVtaXQodGhpcy5maWx0ZXJLZXl3b3JkKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm9sZEZpbHRlcktleXdvcmQgPSB0aGlzLmZpbHRlcktleXdvcmQ7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbEdsb2JhbEZpbHRlciA9IGdsb2JhbEZpbHRlcjtcclxuICAgICAgICBpZiAoZ2xvYmFsRmlsdGVyKSB7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWxGaWx0ZXIgaW5zdGFuY2VvZiBTZWFyY2hGb3JtRmllbGRDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyU3Vic2NyaWJlciA9IGdsb2JhbEZpbHRlci5zZWFyY2guc3Vic2NyaWJlKGtleXdvcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5zZWFyY2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb1NlYXJjaChrZXl3b3JkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBldmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgZXZlbnRIYW5kbGVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50VW5yZWdpc3RyYXRlckhhbmRsZXJzLnB1c2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIGV2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgZXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyBhbmQgc2V0cyB0aGUgQ2FzZSBTZW5zaXRpdmUgZmxhZyBmb3IgZmlsdGVyaW5nLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGNhc2VTZW5zaXRpdmVGaWx0ZXI6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSB0cmVlIGRhdGEgdGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0FzVHJlZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcgaXRlbVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGVkaXRhYmxlTmV3RGF0YUl0ZW06IERhdGFUYWJsZURhdGFJdGVtO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgYW5kIHNldHMgdGhlIGRhdGEgc291cmNlIG9mIHRoZSBkYXRhIHRhYmxlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBpdGVtcygpOiBEYXRhVGFibGVEYXRhSXRlbVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lZGl0YWJsZSA/IHRoaXMuaW50ZXJuYWxJdGVtcy5tYXAoaXRlbSA9PiBpdGVtLmNvbnRlbnQpIDogdGhpcy5pbnRlcm5hbEl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgaXRlbXModmFsdWU6IERhdGFUYWJsZURhdGFJdGVtW10pIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodEZyb21Sb3coKTtcclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxJdGVtcyA9IHZhbHVlO1xyXG5cclxuICAgICAgICBsZXQgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IG5lZWQgdG8gcmVmYWN0b3IgdG8gcmVkdWNlIHRoZSBuZXN0ZWQgaWYgYmxvY2tzLlxyXG4gICAgICAgIGlmICh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXI6IHN0cmluZztcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbikgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIucHVzaCh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGl0ZW0uZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5wdXNoKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oaXRlbSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuc2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyID0gdGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbih0aGlzLnNlbGVjdGlvbi5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXIgPSB0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKHRoaXMuc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxFZGl0YWJsZURhdGFJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1zZnRTbWUubmV3R3VpZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQWxlcnRzOiB7fVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbWVtYmVyU2VsZWN0aW9uICYmIHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9Qcm9jZXNzID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmluZGV4T2YodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihjdXJyZW50Tm9kZS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oY3VycmVudE5vZGUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnQgPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIuaW5kZXhPZih0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGl0ZW0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvUHJvY2VzcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihjdXJyZW50Tm9kZS5kYXRhKSA9PT0gc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBmb3VuZCBpbiB0aGUgcmVmcmVzaCBpdGVtcywgdGhlbiBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihpdGVtKSA9PT0gc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGZvdW5kIGluIHRoZSByZWZyZXNoIGl0ZW1zLCB0aGVuIGl0IG1lYW5zIHRoZSBzZWxlY3Rpb24gaXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbkl0ZW1Ub1JlbWVtYmVyOiBEYXRhVGFibGVEYXRhSXRlbTtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlcjogRGF0YVRhYmxlRGF0YUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbikgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5wdXNoKGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLnNlbGVjdGlvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIgPSB0aGlzLnNlbGVjdGlvbi5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIgPSB0aGlzLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcyA9IHZhbHVlLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPEVkaXRhYmxlRGF0YUl0ZW0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTXNmdFNtZS5uZXdHdWlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25BbGVydHM6IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvUHJvY2VzcyA9IHRoaXMuaW50ZXJuYWxJdGVtcy5zbGljZSgwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5pbmRleE9mKGN1cnJlbnROb2RlLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGN1cnJlbnROb2RlLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnQgPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9Qcm9jZXNzID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm9kZXNUb1Byb2Nlc3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Byb2Nlc3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnNwbGljZSgwLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5kYXRhID09PSBzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBmb3VuZCBpbiB0aGUgcmVmcmVzaCBpdGVtcywgdGhlbiBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZm91bmQgaW4gdGhlIHJlZnJlc2ggaXRlbXMsIHRoZW4gaXQgbWVhbnMgdGhlIHNlbGVjdGlvbiBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRFZGl0YWJsZURhdGFDaGFuZ2VzZXQoKTtcclxuXHJcbiAgICAgICAgaWYgKGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBleHBvc2VzIHRoZSBlbnVtIHR5cGUgdGhlbiBpbiB0ZW1wbGF0ZSB3ZSBjYW4gZGlyZWN0bHkgcmVmZXIgdG8gdGhlIGVudW0gdmFsdWUgbmFtZSBpbnN0ZWFkIG9mIGVudW0gdmFsdWUgbnVtYmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc29ydE1vZGVFbnVtOiBhbnkgPSBEYXRhVGFibGVTb3J0TW9kZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGV4cG9zZXMgdGhlIGVudW0gdHlwZSB0aGVuIGluIHRlbXBsYXRlIHdlIGNhbiBkaXJlY3RseSByZWZlciB0byB0aGUgZW51bSB2YWx1ZSBuYW1lIGluc3RlYWQgb2YgZW51bSB2YWx1ZSBudW1iZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1UeXBlRW51bTogYW55ID0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgYW5kIHNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZGF0YSBzb3VyY2UuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbigpOiBEYXRhVGFibGVEYXRhSXRlbSB8IERhdGFUYWJsZURhdGFJdGVtW10ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgPyB0aGlzLmludGVybmFsU2VsZWN0aW9uLm1hcChpdGVtID0+IGl0ZW0uY29udGVudCkgOiB0aGlzLmludGVybmFsU2VsZWN0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lZGl0YWJsZSA/IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF0uY29udGVudCA6IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNlbGVjdGlvbihzZWxlY3Rpb246IERhdGFUYWJsZURhdGFJdGVtIHwgRGF0YVRhYmxlRGF0YUl0ZW1bXSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbnRlbnQgPSBzZWxlY3Rpb24ubWFwKHMgPT4gcy5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSB0aGlzLmludGVybmFsSXRlbXMuZmlsdGVyKGl0ZW0gPT4gc2VsZWN0aW9uQ29udGVudC5pbmRleE9mKGl0ZW0uY29udGVudCkgIT09IC0xKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb24gfHwgW107XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24ubWFwKHNlbGVjdGlvbkl0ZW0gPT4gc2VsZWN0aW9uSXRlbS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0aW9uID0gdGhpcy5pbnRlcm5hbEl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uY29udGVudCA9PT0gc2VsZWN0aW9uKVswXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBhY3R1YWxTZWxlY3Rpb24gPyBbYWN0dWFsU2VsZWN0aW9uXSA6IFtdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IHNlbGVjdGlvbiA/IFtzZWxlY3Rpb25dIDogW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoc2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBzZWxlY3Rpb25Nb2RlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25Nb2RlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzZWxlY3Rpb25Nb2RlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uTW9kZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYSB0ZW1wIGNvZGUgdG8gc29sdmUgdGhlIHByb2JsZW0gdGhhdDpcclxuICAgICAgICAvLyB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlIGFuZCBhbiBpbml0aWFsIGFycmF5IHZhbHVlIGlzIGFzc2lnbmVkIHRvIHRoZSBzZWxlY3Rpb24gcHJvcGVydHksXHJcbiAgICAgICAgLy8gYXQgdGhhdCBtb21lbnQgdGhlIHNlbGVjdGlvbk1vZGUgcHJvcGVydHkgaXMgbm90IHNldCB0byBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSB2YWx1ZSwgeWV0LlxyXG4gICAgICAgIC8vIFNvIHdlIHRyZWF0IHRoZSBpbml0aWFsIGFycmF5IHZhbHVlIGFzIGEgbWVtYmVyIG9mIHRoZSBzZWxlY3Rpb24gYXJyYXkgaW5zdGVhZCBvZiB0aGUgc2VsZWN0aW9uIGFycmF5LlxyXG4gICAgICAgIC8vIFNvIHdlIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gZml4IHRoaXMgcHJvYmxlbS5cclxuICAgICAgICAvLyBUT0RPOiBsb25nIHRlcm0gd2lzZSwgd2UgbmVlZCB0byB1c2Ugc2VwZXJhdGVkIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIG1haW50YWluIHRoZSBzZWxlY3Rpb25zIG9mIHNlbGVjdGlvblxyXG4gICAgICAgIC8vIHNlbGVjdGlvbiBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uLlxyXG4gICAgICAgIC8vIFRoaXMgY2hhbmdlIHdpbGwgaGFwcGVuIGluIHRoZSBjb21pbmcgcmVsZWFzZS5cclxuICAgICAgICBpZiAodmFsdWUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5pbnRlcm5hbFNlbGVjdGlvbikgJiYgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmludGVybmFsU2VsZWN0aW9uWzBdKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWZhdWx0U29ydENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdFNvcnRNb2RlOiBEYXRhVGFibGVTb3J0TW9kZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRoZSBldmVudCB3aGVuIGZpbHRlcmluZyBpcyBoYXBwZW5pbmcuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHRyaWdnZXJzIHdoZW4gYSB0cmVlIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ2ZpbHRlcicgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25GaWx0ZXIoKTogRXZlbnRFbWl0dGVyPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcjtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgZG9DdXN0b21Tb3J0OiBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ3VzdG9tU29ydEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ3VzdG9tU29ydEV2ZW50PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdGhlIGV2ZW50IHdoZW4gYSByb3cgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ3Jvd1NlbGVjdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvblJvd1NlbGVjdCgpOiBFdmVudEVtaXR0ZXI8eyBkYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIHJvd1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGRhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBlbWl0cyB0aGUgZXZlbnQgd2hlbiBhIHJvdyBpcyB1bnNlbGVjdGVkIGFuZCBubyByb3cgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ3Jvd1Vuc2VsZWN0ZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uUm93VW5zZWxlY3QoKTogRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd1Vuc2VsZWN0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIHJvd1Vuc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgb3Igc2V0cyB0aGUgZ3JvdXAgY29sdW1uLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBncm91cENvbHVtbigpOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsR3JvdXBDb2x1bW47XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGdyb3VwQ29sdW1uKHZhbHVlOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbEdyb3VwQ29sdW1uICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsR3JvdXBDb2x1bW4gPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1uc09yZGVyICYmIHRoaXMuY29sdW1uc09yZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIG9yIHNldHMgdGhlIGdyb3VwIHNvcnQgbW9kZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgZ3JvdXBTb3J0TW9kZSgpOiBEYXRhVGFibGVTb3J0TW9kZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxHcm91cFNvcnRNb2RlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBncm91cFNvcnRNb2RlKHZhbHVlOiBEYXRhVGFibGVTb3J0TW9kZSkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxHcm91cFNvcnRNb2RlID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ3JvdXAgdG9nZ2xlIHNob3VsZCBiZSB1c2VkIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgZ3JvdXAuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdXNlR3JvdXBUb2dnbGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBzaG93IHRoZSBoZWFkZXIuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0hlYWRlciA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIFwiYXJpYS1sYWJlbGxlZGJ5XCIgdmFsdWUgZm9yIHRoZSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgdGFibGVBcmlhTGFiZWxsZWRCeSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsVGFibGVBcmlhTGFiZWxsZWRCeTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGFibGVBcmlhTGFiZWxsZWRCeSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlQXJpYUxhYmVsbGVkQnkgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFyaWFBdHRyaWJ1dGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIFwiYXJpYS1sYWJlbFwiIHZhbHVlIGZvciB0aGUgdGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHRhYmxlQXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxUYWJsZUFyaWFMYWJlbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGFibGVBcmlhTGFiZWwodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxUYWJsZUFyaWFMYWJlbCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJpYUF0dHJpYnV0ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyBzaG91bGQgdGhlIGRhdGEgdGFibGUgaGFzIHRoZSBncmlkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dHcmlkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgdGhlIFwiYWxsIGl0ZW1cIiBjaGVja2JveC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG93QWxsSXRlbUNoZWNrYm94ID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIGNoZWNrIHRoZSBpdGVtIGFuZCB1bmNoZWNrIG90aGVyIGl0ZW1zIHdoZW4gdGhlIGN1cnJlbnQgaXRlbSBpcyBjaGVja2VkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdEFuZENoZWNrID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgcm93IGhlaWdodCBmb3IgZWFjaCBpdGVtLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHJvd0hlaWdodCA9IDMwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gbGluayB0aGUgc2VsZWN0aW9ucyBvZiBwYXJlbnQgbm9kZXMgYW5kIGNoaWxkIG5vZGVzLlxyXG4gICAgICogSXQgb25seSBhcHBseSB0byB0cmVlIHRhYmxlIHNjZW5hcmlvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2VsZWN0IHRoZSBpdGVtIHdoZW4gbmF2aWdhdGluZyB3aXRoIHRoZSBrZXlib2FyZCAoZS5nLiBhcnJvdyBrZXlzLCBob21lLCBlbmQsIHBhZ2UgdXAsIHBhZ2UgZG93bilcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZWxlY3RJdGVtV2hlbk5hdmlnYXRpbmdXaXRoS2V5Ym9hcmQgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgbGVmdCBtYXJnaW4gaW4gZWFjaCByb3cuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0xlZnRNYXJnaW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUgaXMgc2Nyb2xsYWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzY3JvbGxhYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlJ3MgVUkgdmlydHVhbGl6YXRpb24gc2hvdWxkIGJlIGRpc2FibGVkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRpc2FibGVVSVZpcnR1YWxpemF0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBpdGVtcyBhcmUgc2VsZWN0YWJsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdGFibGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVkaXRhYmxlIGRhdGEgdGFibGUgYWxsb3cgYXV0b21hdGljYWxseSBhZGRpbmcgbmV3IHJvd3NcclxuICAgICAqIFNldHRpbmcgdGhpcyB0byBmYWxzZSB0aGVuIGhhdmUgdG8gY3JlYXRlIG5ldyBsaW5lIG91dHNpZGUgb2YgdGhlIGRhdGF0YWJsZSBjb250cm9sXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZWRpdGFibGVBdXRvTmV3Um93ID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgZGVmYXVsdCBzdGF0dXMgb2YgdGhlIGdyb3VwIHRvZ2dsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWZhdWx0R3JvdXBUb2dnbGVFeHBhbmRlZCA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBhdXRvUm93SGVpZ2h0ID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBjb2x1bW5zT3JkZXI6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgZ3JvdXBUb2dnbGVTdGF0dXM6IHsgW2dyb3VwOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICAgIHB1YmxpYyBub2RlTmF2aWdhdGluZ1Rhc2s6IE5vZGVOYXZpZ2F0aW5nVGFzaztcclxuICAgIHB1YmxpYyBpc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIEBTbWVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcclxuXHJcbiAgICBAU21lSW5qZWN0KE5nWm9uZSlcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmU7XHJcblxyXG4gICAgQFNtZUluamVjdChTTUVfTEFZT1VUX1BST1ZJREVSLCB0cnVlKVxyXG4gICAgcHJpdmF0ZSBsYXlvdXQ6IExheW91dDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVkaXRhYmxlRGF0YUNoYW5nZVNldCgpOiBFZGl0YWJsZURhdGFDaGFuZ2VTZXQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRhYmxlID8gdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXModHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXNldFNjcm9sbCgpOiB2b2lkIHtcclxuICAgICAgICAvLyBTZXQgdGhlIHNjcm9sbFRvcChkaXN0YW5jZSBmcm9tIHRoZSBlbGVtZW50J3MgdG9wIHRvIGl0cyB0b3Btb3N0IHZpc2libGUgY29udGVudClcclxuICAgICAgICAvLyBvZiBTY3JvbGwgY29udGFpbmVyIHRvIDAuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuXHJcbiAgICAgICAgLy8gTm8gbmVlZCB0byByZXNldCAndGhpcy5jdXJyZW50U3RhcnRJbmRleE9mSXRlbUluVmlld1BvcnQnIHRvIDAsIGFzIGl0IHdpbGwgYXV0b21hdGljYWxseSBnZXRcclxuICAgICAgICAvLyBhZGp1c3RlZCB0byAwIGluICdjYWxjdWxhdGVJdGVtSW5WaWV3UG9ydCgpJy5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlVUlWaXJ0dWFsaXphdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24gPSBkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmlkO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3RyZWVncmlkJyk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdncmlkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICd0YWJsZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Q2hhbmdlU3Vic2NyaWJlciA9IHRoaXMubGF5b3V0LmxheW91dENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqIEFzIHRoZSB1c2VyIHNjcm9sbHMgb24gdGhlIHggYXhpcyBvZiB0aGUgYm9keSBvZiB0aGUgdGFibGUsIHdlXHJcbiAgICAgICAgICAgICAqIG5lZWQgdG8gbW92ZSB0aGUgY29ycmVzcG9uZGluZyBjb2x1bW4gaGVhZGVycyBvZiB0aGUgdGFibGUgaW50b1xyXG4gICAgICAgICAgICAgKiB2aWV3LlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZnJvbUV2ZW50KHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJylcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdtYXJnaW4tbGVmdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAkey10aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0fXB4YCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRTb3J0Q29sdW1uICYmIHRoaXMuZGVmYXVsdFNvcnRNb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc29ydENvbHVtbiA9IHRoaXMuZGVmYXVsdFNvcnRDb2x1bW47XHJcbiAgICAgICAgICAgIHRoaXMuc29ydENvbHVtbi5zb3J0TW9kZSA9IHRoaXMuZGVmYXVsdFNvcnRNb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleEJ5U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFjY2VzaWJpbGl0eU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgdGhpcy51bnJlZ2lzdGVyT25FbGVtZW50Rm9jdXNpbmdFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc2liaWxpdHlNYW5hZ2VyLnJlZ2lzdGVyRWxlbWVudEZvY3VzaW5nRXZlbnQodGhpcy5vbkVsZW1lbnRGb2N1c2luZy5iaW5kKHRoaXMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQXJpYUF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogbG9vayBpbnRvIGltcHJvdmVtZW50cywgYWRkaW5nIHNldFRpbWVvdXQgaGVyZSBtYWtlcyB0aGUgY29tcG9uZW50IGxpZmUgY3ljbGUgaGFyZCB0byBtYW5hZ2VcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBEb20uZ2V0TmV4dEZvY3VzYWJsZUVsZW1lbnRJblRyYXAodGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgdGhpcy5zaG91bGRVc2VMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCA9ICFuZXh0RWxlbWVudDtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ29sdW1ucygpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkhlYWRlclRhYmxlUHJlc3NlZChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuVXBBcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5Eb3duQXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvSGVhZE9mUmVuZGVyZWRJdGVtcygpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50ID0gRG9tLmdldE5leHRab25lRWxlbWVudChjdXJyZW50RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbikge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29udGVudFRhYmxlS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLm9uQ29udGVudFRhYmxlS2V5VXAoZXZlbnQsIHRoaXMuY29udGVudEVsZW1lbnQsIHRoaXMuZWRpdGFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXJiaXRyYXJ5U2Nyb2xsKHNjcm9sbFRvcDogbnVtYmVyLCBpc0luY3JlbWVudD86IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoaXNJbmNyZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XHJcbiAgICAgICAgfSBlbHNlIGlmICghaXNJbmNyZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgaWYgKGRpZmYgPiBzY3JvbGxUb3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCArPSBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZiA8PSBzY3JvbGxUb3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgLSBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGlmIChkaWZmID4gc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgLT0gc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPD0gc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZW50VGFibGVQcmVzc2VkKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgIT09IEtleUNvZGUuQ3RybCAmJiBldmVudC5rZXlDb2RlICE9PSBLZXlDb2RlLlNoaWZ0KSB7XHJcbiAgICAgICAgICAgIENvcmVFbnZpcm9ubWVudC5hY2Nlc3NpYmlsaXR5TWFuYWdlci5jaGFuZ2VBY2Nlc3NpYmlsaXR5TW9kZSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSb3cgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3Rvcih0YXJnZXRFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpO1xyXG4gICAgICAgIC8vIGN0cmxLZXkgZm9yIHNpbmdsZSBzZWxlY3Rpb24gbW9kZSB3b3JrcyBmaW5lXHJcbiAgICAgICAgLy8gY3RybEtleSBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uIHdpbGwgYmUgcmVnYXJkZWQgYXMgc2VsZWN0IGFsbCByb3dzIHRoYXRcclxuICAgICAgICAvLyB3aWxsIGJlIGhhbmRsZWQgbm90IGhlcmUuXHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUgJiYgIWV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmV0dXJuID0gdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlclxyXG4gICAgICAgICAgICAgICAgLmVkaXRhYmxlRGF0YVRhYmxlT25Db250ZW50VGFibGVQcmVzc2VkSGFuZGxlcihldmVudCwgdGFyZ2V0RWxlbWVudCwgY3VycmVudFJvdywgdGhpcy5sYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChzaG91bGRSZXR1cm4pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuQ3RybCB8fCBldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLlNoaWZ0KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXTtcclxuXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAvLyBGb3Igbm93IGFzc3VtaW5nIHRyZWUgdGFibGUgZmlyc3QgZm9jdXMgb24gcm93IGFuZCB0aGVuXHJcbiAgICAgICAgLy8gdGhlIHVzZXIgaGFzIHRvIGhpdCBlbnRlci9zcGFjZSB0byBzZWxlY3QgdGhpcyBmb2N1c2VkIGl0ZW1cclxuICAgICAgICAvLyBGb3Igb3RoZXIgdHlwZSBvZiB0YWJsZSB3aWxsIGZpcnN0IHNlbGVjdCBhbmQgdGhlbiBhdXRvbWF0aWNhbGx5IGZvY3VzIGJ5IGRlZmF1bHRcclxuICAgICAgICBjb25zdCBzZWxlY3RBbmRGb2N1cyA9ICF0aGlzLnNob3dBc1RyZWU7XHJcblxyXG4gICAgICAgIC8vIE9ubHkgdGhlIHNjcm9sbGluZyByZWxhdGVkIG5hdmlnYXRpb24ga2V5Ym9hcmQgb3BlcmF0aW9ucyBuZWVkIGRlYm91bmNpbmcuXHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5BOlxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2VsZWN0IGFsbCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBhbHNvIGhhbmRsZSB3aGVuIGVkaXRhYmxlIGRhdGF0YWJsZSBhbmQgdGhlIGZvY3VzIGlzIGluIHNtZS1mb3JtLWZpZWxkXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlICYmIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNTbWVGb3JtRmllbGQodGFyZ2V0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZXZlbnQuYWx0S2V5ICYmICFldmVudC5zaGlmdEtleVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5Ib21lOlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvSGVhZE9mUmVuZGVyZWRJdGVtcyhzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5VcEFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzY3JvbGwgdXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmJpdHJhcnlTY3JvbGwodGhpcy5kZWZhdWx0U2Nyb2xsUGl4ZWxzLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA+IDAgfHwgdGhpcy5nZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvUHJldmlvdXNSZW5kZXJlZEl0ZW0oc2VsZWN0QW5kRm9jdXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSBEb20uZ2V0UHJldmlvdXNab25lRWxlbWVudChjdXJyZW50RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5Eb3duQXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjcm9sbCBkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJiaXRyYXJ5U2Nyb2xsKHRoaXMuZGVmYXVsdFNjcm9sbFBpeGVscywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdpdGggc2hpZnRLZXkgbWVhbnMgbmVlZHMgc2VsZWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvTmV4dFJlbmRlcmVkSXRlbShldmVudC5zaGlmdEtleSA/IHRydWUgOiBzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlBhZ2VVcDpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb1ByZXZpb3VzUGFnZU9mUmVuZGVyZWRJdGVtcyhzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5QYWdlRG93bjpcclxuICAgICAgICAgICAgICAgIGlmICgoPEhUTUxFbGVtZW50PmV2ZW50LnNyY0VsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9OZXh0UGFnZU9mUmVuZGVyZWRJdGVtcyhzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVuZDpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb0VuZE9mUmVuZGVyZWRJdGVtcyhzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5TcGFjZTpcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVudGVyOlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkRW50ZXJTcGFjZShjdXJyZW50UmVuZGVyZWRJdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEFuZEZvY3VzLCBldmVudCwgdGFyZ2V0RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkxlZnRBcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRMZWZ0QXJyb3coY3VycmVudFJlbmRlcmVkSXRlbSwgdGFyZ2V0RWxlbWVudCwgY3VycmVudFJvdyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlJpZ2h0QXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkUmlnaHRBcnJvdyhjdXJyZW50UmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50LCBjdXJyZW50Um93KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgLy8gRm9yIHRoZSB0cmVlIHRhYmxlIG5vdyB3ZSBmaXJzdCBmb2N1cyBhbmQgdGhlbiB1c2UgdGhlIHJpZ2h0IGFycm93IGtleSBvciBlbnRlciBvciBzcGFjZSB0byBzZWxlY3RcclxuICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIGxvZ2ljIGJlZm9yZSBoZXJlIG9ubHkgZGlkIGFuIGFycm93IHVwL2Rvd24ga2V5LCB3ZSBuZWVkIHRoZSBzZWxlY3Rpb24gaGFwcGVuaW5nIGFzIHdlbGxcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShldmVudCwgdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhdKTtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLlVwQXJyb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgtLTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5Eb3duQXJyb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbikge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25EZWJvdW5jZVRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKSB7XHJcbiAgICAgICAgLy8gSWYgdHJlZSB0YWJsZSBhbmQgdGhlIGN1cnJlbnQgZm9jdXNlZCBlbGVtZW50IGluZGV4IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzZWxlY3RlZCBvbmVcclxuICAgICAgICAvLyBXaWxsIHNlbGVjdCB0aGUgcm93IGJhc2VkIG9uIGZvY3VzZWQgZWxlbWVudFxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggIT09IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCh0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleCh0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4LCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBrZXlib2FyZCBwcmVzcyBldmVudCBmb3IgZW50ZXIgYW5kIHNwYWNlXHJcbiAgICAgKiBUbyB0cmlnZ2VyIHRoaXMgZnVuY3Rpb24sIGVpdGhlciBmb2N1cyBvbiB0YWJsZSByb3cgb3IgdGFibGUgcm93IGNlbGwgdGVtcGxhdGUgYW5kXHJcbiAgICAgKiBjbGljayB0aGUgJ2VudGVyJyBvciAnc3BhY2UnIGJ1dHRvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkNvbnRlbnRUYWJsZVByZXNzZWRFbnRlclNwYWNlKGN1cnJlbnRSZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgc2VsZWN0QW5kRm9jdXM6IGJvb2xlYW4sXHJcbiAgICAgICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgLy8gaWYgZmFsc2UsIGZvY3VzZWQgb24gdGFibGUgcm93IGNlbGwgdGVtcGxhdGVcclxuICAgICAgICAvLyBpZiB0cnVlLCBmb2N1c2VkIG9uIHRhYmxlIHJvdyBpdGVtIGNvbXBvbmVudFxyXG4gICAgICAgIGxldCBmb2N1c2VkT25Sb3dDb21wb25lbnQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGFyZ2V0RWxlbWVudCAmJiB0YXJnZXRFbGVtZW50LmNsYXNzTGlzdCAmJiB0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKSB7XHJcbiAgICAgICAgICAgIGZvY3VzZWRPblJvd0NvbXBvbmVudCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLlNwYWNlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBzcGFjZSBvbiBhIGRhdGEgdGFibGUgaXMgdG8gbW92ZSB0byB0aGUgbmV4dCBwYWdlXHJcbiAgICAgICAgICAgICAgICAvLyBPdXIgZGF0YSB0YWJsZSBiZWhhdmVzIGV4YWN0bHkgdGhlIHNhbWUgYXMgd2luZG93cyAxMCBmaWxlIGV4cGxvcmVyXHJcbiAgICAgICAgICAgICAgICAvLyBPbiBzcGFjZS9lbnRlciB3aWxsIGJvdGggc2VsZWN0IHRoZSBjdXJyZW50IHJvdy5cclxuICAgICAgICAgICAgICAgIC8vIFNvIGFsd2F5cyBkZWNsaW5lIGRlZmF1bHQgZnVuY3Rpb24gZm9yIHNwYWNlIGtleWJvYXJkIGV2ZW50IGFzIGxvbmcgYXMgZm9jdXMgaXMgb24gdGhlIHJvdyBiZWNhdXNlXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgbmVlZCB0aGUgbW92ZSB0byB0aGUgbmV4dCBwYWdlIGJlaGF2aW9yXHJcbiAgICAgICAgICAgICAgICBpZiAoZm9jdXNlZE9uUm93Q29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gSWYgS2V5Q29kZSBpcyBFbnRlciwganVzdCByZW1haW4gdGhlIGN1cnJlbnQgdmFsdWUgb2Ygc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvblxyXG4gICAgICAgICAgICAvLyBObyBuZWVkIHRvIGRpc2FibGUgdGhlIGVudGVyIGtleSBkZWZhdWx0IGZ1bmN0aW9uXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkU2hvd0FzVHJlZUhlbHBlcigpO1xyXG4gICAgICAgICAgICBjdXJyZW50UmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25JdGVtQ2hlY2tCb3hDbGlja2VkKGN1cnJlbnRSZW5kZXJlZEl0ZW0sIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgc2VsZWN0IGEgcm93LiBub3QgZXhwYW5kL2NvbGxhcHNlIGl0XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wcmV2ZW50RW50ZXJLZXlGb3JEZWZhdWx0QWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZG91YmxlQ2xpY2tSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2dnaW5nLmxvZyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbC5EZWJ1ZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ05vIGV2ZW50IGhhbmRsZXIgYmluZCB0byBcImRvdWJsZUNsaWNrUm93XCIgZXZlbnQuJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnRGF0YVRhYmxlQ29tcG9uZW50Lm9uQ29udGVudFRhYmxlUHJlc3NlZCdcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdEFuZEZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZUNsaWNrUm93KG51bGwsIGN1cnJlbnRSZW5kZXJlZEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3codGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudC5rZXlDb2RlICYmIGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuRW50ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db250ZW50VGFibGVQcmVzc2VkUmlnaHRBcnJvdyhjdXJyZW50UmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjdXJyZW50Um93OiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkU2hvd0FzVHJlZUhlbHBlcigpO1xyXG4gICAgICAgICAgICBjdXJyZW50UmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2N1cnJlbnRSZW5kZXJlZEl0ZW0uZGF0YV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tHcm91cFRvZ2dsZShjdXJyZW50UmVuZGVyZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICsgMTsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBJdGVtKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICsgMTsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUcmVlVGFibGVQYXJlbnROb2RlKGN1cnJlbnRSZW5kZXJlZEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIGlmICghY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShudWxsLCBjdXJyZW50UmVuZGVyZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvTmV4dFJlbmRlcmVkSXRlbSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IG5leHRFbGVtZW50ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICBsZXQgcm93Rm9yTmV4dEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihuZXh0RWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgbGV0IGNlbGxGb3JOZXh0RWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKG5leHRFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtdGQnKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbEZvck5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGNlbGxGb3JOZXh0RWxlbWVudCAmJiBpIDwgY2VsbEZvck5leHRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEZvck5leHRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5baV0gPT09IGNlbGxGb3JOZXh0RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCByZW1haW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoZWNrYm94IHdoZW4gaXQgaXMgZWRpdGFibGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgIXRoaXMuZWRpdGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNEYXRhVGFibGVDaGVja0JveEhUTUxFbGVtZW50KG5leHRFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5leHRFbGVtZW50IGlzIHRoZSBjaGVja2JveCBpbiBmaXJzdCBjb2x1bW4sIG1vdmUgb24gdGhlIG5leHQgY2FuZGlkYXRlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQgPSBEb20uZ2V0TmV4dEZvY3VzYWJsZUVsZW1lbnQobmV4dEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Rm9yTmV4dEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbEZvck5leHRFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXRkJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnQgPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ICE9PSAtMVxyXG4gICAgICAgICAgICAgICAgJiYgY3VycmVudFJvdyA9PT0gcm93Rm9yTmV4dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNvbnRlbnRUYWJsZVByZXNzZWRMZWZ0QXJyb3coY3VycmVudFJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgY3VycmVudFJvdzogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKTtcclxuICAgICAgICAgICAgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2N1cnJlbnRSZW5kZXJlZEl0ZW0uZGF0YV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tHcm91cFRvZ2dsZShjdXJyZW50UmVuZGVyZWRJdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEl0ZW0pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUcmVlVGFibGVQYXJlbnROb2RlKGN1cnJlbnRSZW5kZXJlZEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tUcmVlVG9nZ2xlKGV2ZW50LCBjdXJyZW50UmVuZGVyZWRJdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhdLm5vZGUucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSA9PT0gcGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBwcmV2aW91c0VsZW1lbnQgPSBEb20uZ2V0UHJldmlvdXNGb2N1c2FibGVFbGVtZW50KHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICBjb25zdCByb3dGb3JQcmV2aW91c0VsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgY29uc3QgY2VsbEZvclByZXZpb3VzRWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKFxyXG4gICAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtdGQnKSk7XHJcbiAgICAgICAgICAgIGlmIChjZWxsRm9yUHJldmlvdXNFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGNlbGxGb3JQcmV2aW91c0VsZW1lbnQgJiYgaSA8IGNlbGxGb3JQcmV2aW91c0VsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsRm9yUHJldmlvdXNFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5baV0gPT09IGNlbGxGb3JQcmV2aW91c0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgcHJldmlvdXNFbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHByZXZpb3VzRWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLWNoZWNrYm94JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91c0VsZW1lbnQgaXMgdGhlIGNoZWNrYm94IGlzIGluIHRoZSBmaXJzdCBjb2x1bW4sIHRoZW4gc2tpcCBpdCwgZGlyZWN0bHkgZ28gdG8gdGhlIHJvdy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCA9IHJvd0ZvclByZXZpb3VzRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCA9PT0gY3VycmVudFJvdyB8fCByb3dGb3JQcmV2aW91c0VsZW1lbnQgIT09IGN1cnJlbnRSb3cpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJvd0ZvclByZXZpb3VzRWxlbWVudCA9PT0gY3VycmVudFJvdykge1xyXG4gICAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVHJlZVRhYmxlUGFyZW50Tm9kZSh0cmVlTm9kZUl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0cmVlTm9kZUl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5UcmVlTm9kZSAmJiAhdHJlZU5vZGVJdGVtLm5vZGUuaXNMZWFmO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbnRlbnRJdGVtRm9jdXNlZChldmVudCwgcmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRBcmVhSGFzRm9jdXMgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5lZGl0YWJsZU5ld1Jvd0hhc0ZvY3VzID0gZWRpdGFibGVEYXRhSXRlbS5pc05ld1JvdztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRkRWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKFxyXG4gICAgICAgICAgICAgICAgPEhUTUxFbGVtZW50PmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS10ZCcpKTtcclxuICAgICAgICAgICAgY29uc3QgdHJFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IodGRFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpO1xyXG4gICAgICAgICAgICBpZiAodHJFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZEVsZW1lbnRzID0gdHJFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtdGFibGUtdGQnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gLTE7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRkRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGRFbGVtZW50c1tpXSA9PT0gdGRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29udGVudEl0ZW1CbHVycmVkKGV2ZW50LCByZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGVudEFyZWFIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZU5ld1Jvd0hhc0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlbmRlcmVkSXRlbVJvd0ZvY3VzT3V0KHJlbmRlcmVkSXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlRWRpdGFibGVEYXRhUm93KGRhdGE6IGFueSkge1xyXG4gICAgICAgIGxldCBkYXRhRXhpc3RzSW5JbnRlcm5hbEl0ZW1zID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmludGVybmFsSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPnRoaXMuaW50ZXJuYWxJdGVtc1tpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uY29udGVudCA9PT0gZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YUV4aXN0c0luSW50ZXJuYWxJdGVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBsZXQgZm91bmRJbkFkZGVkSXRlbXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC5hZGRlZEl0ZW1zW2pdID09PSBpdGVtLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtcy5zcGxpY2UoaiwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5BZGRlZEl0ZW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC51cGRhdGVkSXRlbXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zW2pdID09PSBpdGVtLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLnNwbGljZShqLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghZm91bmRJbkFkZGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC5kZWxldGVkSXRlbXMucHVzaChpdGVtLmNvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEl0ZW1zLnNwbGljZShpLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJvdyBub3QgeWV0IGFkZGVkIHRvIGludGVybmFsSXRlbXMsIGp1c3QgcmVmcmVzaFxyXG4gICAgICAgIGlmICghZGF0YUV4aXN0c0luSW50ZXJuYWxJdGVtcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25MYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudEZvY3VzZWQoZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c09uY2UgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2VuZXJhdGVOR0NsYXNzRm9yUmVuZGVyZWRJdGVtKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogYW55IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZDogcmVuZGVyZWRJdGVtLmluZGV4ID09PSB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCksXHJcbiAgICAgICAgICAgICdzbWUtdGFibGUtZ3JvdXAtaXRlbSc6IHJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSXRlbSxcclxuICAgICAgICAgICAgJ3NtZS10YWJsZS1ncm91cC1oZWFkZXInOiByZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcixcclxuICAgICAgICAgICAgJ3NtZS1jaGVja2VkJzogdGhpcy5pc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5zZWxlY3Rpb24gJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGlvbi5sZW5ndGggPT09IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmVlTm9kZURhdGFJdGVtID0gPFRyZWVOb2RlRGF0YUl0ZW0+dGhpcy5maWx0ZXJlZEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdHJlZU5vZGVEYXRhSXRlbSB8fCAhdHJlZU5vZGVEYXRhSXRlbS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRIb3ZlcmVkUmVuZGVyZWRJdGVtKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5ob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXggPSByZW5kZXJlZEl0ZW0uaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVuc2V0SG92ZXJlZFJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmhvdmVyZWRSZW5kZXJlZEl0ZW1JbmRleCA9PT0gcmVuZGVyZWRJdGVtLmluZGV4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaG92ZXJlZFJlbmRlcmVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc21lLWxhc3QtZm9jdXNhYmxlLXNoYWRvdy1lbGVtZW50JykpIHtcclxuICAgICAgICAgICAgaXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGhhbmRsZVJlbmRlcmVkSXRlbVJvd0ZvY3VzT3V0KHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZWRpdGFibGVEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPnJlbmRlcmVkSXRlbS5kYXRhO1xyXG4gICAgICAgICAgICBpZiAoZWRpdGFibGVEYXRhSXRlbS5pc05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNob3VsZEFkZE5ld1JvdyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHNob3VsZCBoYW5kbGUgaWYgYW55IGZvcm0gZmllbGQgaXMgZGlydHkgdGhlbiB2YWxpZGF0ZVxyXG4gICAgICAgICAgICAgICAgbGV0IGF0TGVhc3RPbmVGaWVsZERpcnR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50cy5mb3JFYWNoKGxvYWRlciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkQ29udGFpbmVyID0gPEZvcm1GaWVsZENvbnRhaW5lcj5sb2FkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlci5yZW5kZXJlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVyRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5sb2FkZXIucmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXJEYXRhSXRlbS5pc05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1GaWVsZENvbnRhaW5lci5pc0RpcnR5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdExlYXN0T25lRmllbGREaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgYWxzbyBoYW5kbGUgd2hlbiBmb2N1c2luZyBvdXQgZnJvbSB0aGUgbGFzdCBmb3JtIGZpZWxkIGluIHRoZSByb3dcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCA9IHRoaXMuZ2V0SXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGF0TGVhc3RPbmVGaWVsZERpcnR5IHx8IGlzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZE5ld1JvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHMuZm9yRWFjaChsb2FkZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtRmllbGRDb250YWluZXIgPSA8Rm9ybUZpZWxkQ29udGFpbmVyPmxvYWRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlci5yZW5kZXJlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlckRhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+bG9hZGVyLnJlbmRlcmVkSXRlbS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlckRhdGFJdGVtLmlzTmV3Um93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtRmllbGRDb250YWluZXIuY2hlY2tWYWxpZGF0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkTmV3Um93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFkZE5ld1JvdyAmJiB0aGlzLmVkaXRhYmxlQXV0b05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdEYXRhSXRlbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVuZGVyZWRJdGVtLmRhdGEuY29udGVudCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlTmV3RGF0YUhhbmRsZXIgPSBkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUl0ZW0gPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZVJvd0FkZGVkLmVtaXQoeyBkYXRhOiBuZXdEYXRhSXRlbSwgb3ZlcnJpZGVOZXdEYXRhSGFuZGxlcjogb3ZlcnJpZGVOZXdEYXRhSGFuZGxlciB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50ID0gbmV3RGF0YUl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRJdGVtLmRhdGEuaXNOZXdSb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMucHVzaChyZW5kZXJlZEl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtcy5wdXNoKG5ld0RhdGFJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZXNldFVwZGF0ZWQuZW1pdCh0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxJdGVtcy5wdXNoKG5ld0RhdGFJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3VsZFNob3dFZGl0Um93KHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNBbGxFZGl0YWJsZVJvd3NWaXNpYmxlKSB7IHJldHVybiB0cnVlOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRhYmxlRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICByZXR1cm4gcmVuZGVyZWRJdGVtLmluZGV4ID09PSB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KClcclxuICAgICAgICAgICAgfHwgdGhpcy5oYXNWYWxpZGF0aW9uRXJyb3IocmVuZGVyZWRJdGVtKVxyXG4gICAgICAgICAgICB8fCByZW5kZXJlZEl0ZW0uaW5kZXggPT09IHRoaXMuaG92ZXJlZFJlbmRlcmVkSXRlbUluZGV4XHJcbiAgICAgICAgICAgIHx8IGVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3c7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbXBsZW1lbnRzIHRoZSBBZnRlclZpZXdJbml0IGludGVyZmFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVNjcm9sbGJhcldpZHRoKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjcm9sbEhhbmRsZXIgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2Nyb2xsZWREb3duID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID4gMDtcclxuICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTY3JvbGxlZERvd24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGF6eSBsb2FkaW5nIGlzIGVuYWJsZWQsIHJlZHVjZSB0aGUgZnJlcWVuY3kgb2YgaGFuZGxpbmcgc2Nyb2xsaW5nXHJcbiAgICAgICAgICAgICAgICAvLyBlc3BlY2lhbGx5IGRvaW5nIHRoZSBkYXRhIGxhenkgbG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZ0V2ZW50SGFuZGxlclNldHVwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuc2Nyb2xsQ2hlY2tJbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Njcm9sbGluZ0V2ZW50SGFuZGxlclNldHVwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nRXZlbnRIYW5kbGVyU2V0dXAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ2hlY2tJbnRlcnZhbCA9IHNldEludGVydmFsKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Njcm9sbGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDaGVja0ludGVydmFsRHVyYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgICAgdGhpcy5ldmVudFVucmVnaXN0cmF0ZXJIYW5kbGVycy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVVJKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja0ltbWVkaWF0ZVZhbGlkYXRpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSBjaGVja0ltbWVkaWF0ZVZhbGlkYXRpb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHMuZm9yRWFjaChsb2FkZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkQ29udGFpbmVyID0gPEZvcm1GaWVsZENvbnRhaW5lcj5sb2FkZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9hZGVyLnJlbmRlcmVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZENvbnRhaW5lci5pbW1lZGlhdGVWYWxpZGF0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGltcGxlbWVudHMgdGhlIE9uRGVzdHJveSBpbnRlcmZhY2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxDaGVja0ludGVydmFsKTtcclxuICAgICAgICB0aGlzLmV2ZW50VW5yZWdpc3RyYXRlckhhbmRsZXJzLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0oKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudW5yZWdpc3Rlck9uRWxlbWVudEZvY3VzaW5nRXZlbnRIYW5kbGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5yZWdpc3Rlck9uRWxlbWVudEZvY3VzaW5nRXZlbnRIYW5kbGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmxheW91dENoYW5nZVN1YnNjcmliZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRDaGFuZ2VTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlclN1YnNjcmliZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW1wbGVtZW50cyB0aGUgQWZ0ZXJWaWV3Q2hlY2tlZCBpbnRlcmZhY2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdDaGVja2VkKCk7XHJcbiAgICAgICAgdGhpcy5hbGlnbkNvbnRlbnQoKTtcclxuICAgICAgICB0aGlzLmFsaWduU2Nyb2xsQmFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGdpdmVuIGRhdGEgdGFibGUgaXRlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbGVjdEl0ZW0oZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50LCBpdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBsZXQgbXVsdGlwbGVTZWxlY3RNb2RlID0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk5vcm1hbDtcclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlU2VsZWN0TW9kZSA9IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5QaWNrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVTZWxlY3RNb2RlID0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNlcXVlbnRpYWw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSAmJiAoPEhUTUxFbGVtZW50PmV2ZW50LnNyY0VsZW1lbnQpLnRhZ05hbWUgPT09ICdJTlBVVCcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGl0ZW0gPyBpdGVtLmluZGV4IDogLTEpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXRbJ3R5cGUnXSA9PT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGl0ZW0ubm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlU2VsZWN0ZWQuZW1pdCh7IG5vZGU6IGl0ZW0ubm9kZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RBbmRDaGVjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpcGxlU2VsZWN0TW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk5vcm1hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChjdXJyZW50SXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oY3VycmVudEl0ZW0sIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLm5vZGUsIHRydWUsIGZhbHNlLCAhdGhpcy5saW5rUGFyZW50Q2hpbGRyZW5TZWxlY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVTZWxlY3RlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtdWx0aXBsZVNlbGVjdE1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5QaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLm5vZGUsICFpdGVtLm5vZGUuc2VsZWN0ZWQsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG11bHRpcGxlU2VsZWN0TW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNlcXVlbnRpYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc21lLXVzZXItc2VsZWN0LW5vbmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICE9PSAtMSAmJiB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pbmRleCA8IHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpdGVtLmluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlZCBhIGJ1ZyB0aGF0IHRyZWUgdGFibGUgbXVsdGlwbGUgc2VsZWN0aW9uIHdpbGwgbG9zdCBmb2N1c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RQYXJlbnQ6IFRyZWVOb2RlRGF0YUl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24odGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXJlbnQgPSB0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGVuZCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbih0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSwgZmFsc2UsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdEFuZENoZWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGVTZWxlY3RNb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuUGljaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25JdGVtQ2hlY2tCb3hDbGlja2VkKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGVTZWxlY3RNb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuU2VxdWVudGlhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc21lLXVzZXItc2VsZWN0LW5vbmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGVhclRleHRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggIT09IC0xICYmIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaW5kZXggPCB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGl0ZW0uaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSAhPT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25JdGVtQ2hlY2tCb3hDbGlja2VkKHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtpdGVtLmRhdGFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5lZGl0YWJsZSA/IGl0ZW0uZGF0YS5jb250ZW50IDogaXRlbS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiB0aGlzLmVkaXRhYmxlID8gaXRlbS5kYXRhLmNvbnRlbnQgOiBpdGVtLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQgJiYgIURvbS5pc0ZvY3VzYWJsZSg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGZ1bmN0aW9uIHRvIGZvY3VzIG9uIGVtcHR5IG1lc3NhZ2Ugd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyBlbXB0eVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZW1wdHlNZXNzYWdlRWxlbWVudCAmJiB0aGlzLmVtcHR5TWVzc2FnZUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBpdGVtLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbEJvZHlFbGVtZW50ICYmIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudCAmJiB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0VHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZUNvdW50KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWZlcnJlZFRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQERlYm91bmNlKClcclxuICAgIHByaXZhdGUgZGVmZXJyZWRUcnlUb0ZvY3VzRW1wdHlNZXNzYWdlKCkge1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZUNvdW50LS07XHJcbiAgICAgICAgdGhpcy50cnlUb0ZvY3VzRW1wdHlNZXNzYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldFRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCgpIHtcclxuICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCA9IDM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXR1cm5zIHRoZSBubyByZWNvcmRzIG1lc3NhZ2Ugd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyBlbXB0eS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE5vUmVjb3Jkc01lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub1JlY29yZE1lc3NhZ2UgfHwgdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5Ob1JlY29yZHNGb3VuZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGRldGVybWluZXMgd2hldGhlciB0bywgb3Igbm90IHRvIHNob3cgdGhlIE5vLVJlY29yZHMgTWVzc2FnZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3dOb1JlY29yZHNNZXNzYWdlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5sYXp5TG9hZCkgfHwgIXRoaXMuaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWQgfHxcclxuICAgICAgICAgICAgKHRoaXMubGF6eUxvYWQgJiYgdGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBiZWhhdmlvciB0aGF0IHdoZW4gYSBncm91cCB0b2dnbGUgaXMgY2xpY2tlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsaWNrR3JvdXBUb2dnbGUoaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpdGVtLmluZGV4KTtcclxuICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2l0ZW0uZGF0YV0gPSB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgIT09IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAgIHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSA6ICF0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2l0ZW0uZGF0YV07XHJcbiAgICAgICAgdGhpcy5ncm91cFRvZ2dsZUNsaWNrLmVtaXQoaXRlbS5kYXRhKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgYmVoYXZpb3IgdGhhdCB3aGVuIGEgdHJlZSBub2RlIHRvZ2dsZSBpcyBjbGlja2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xpY2tUcmVlVG9nZ2xlKGV2ZW50OiBFdmVudCwgaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtLm5vZGUuZXhwYW5kZWQgPSB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgIT09IHVuZGVmaW5lZCA/IHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSA6ICFpdGVtLm5vZGUuZXhwYW5kZWQ7XHJcbiAgICAgICAgaWYgKGl0ZW0ubm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVFeHBhbmRlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZUNvbGxhcHNlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmdldFRyZWVOb2RlRGF0YUlkZW50aXR5KGl0ZW0ubm9kZSk7XHJcbiAgICAgICAgdGhpcy50cmVlVG9nZ2xlU3RhdHVzW2lkZW50aXR5XSA9IGl0ZW0ubm9kZS5leHBhbmRlZDtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBleHBhbmRzIGFsbCB0aGUgZ3JvdXBzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhwYW5kQWxsR3JvdXAoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBpbiB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzLmhhc093blByb3BlcnR5KGdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgY29sbGFwc2VzIGFsbCB0aGUgZ3JvdXBzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGFzZUFsbEdyb3VwKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgaW4gdGhpcy5ncm91cFRvZ2dsZVN0YXR1cykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1cy5oYXNPd25Qcm9wZXJ0eShncm91cCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBdID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXR1cm5zIHRoZSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGdpdmVuIGNvbHVtbiBpcyB0aGUgZmlyc3QgZGF0YSBjb2x1bW4uXHJcbiAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIHVzZWQgdG8gYWRkIHNvbWUgY3VzdG9tIGNzcyBmb3IgdGhlIGZpcnN0IGRhdGEgY29sdW1uIHdoZW4gZ3JvdXBpbmcgaXMgZW5hYmxlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGZpcnN0RGF0YUNvbHVtbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY3VycmVudENvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29sdW1uICE9PSB0aGlzLmdyb3VwQ29sdW1uICYmICFmaXJzdERhdGFDb2x1bW4gJiYgIWN1cnJlbnRDb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdERhdGFDb2x1bW4gPSBjdXJyZW50Q29sdW1uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb2x1bW4gPT09IGZpcnN0RGF0YUNvbHVtbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBpZCBpZiB0aGUgY29sdW1uIGlzIHRoZSBmaXJzdCBhbmQgcmVuZGVyZWQgaXRlbSBoYXMgYSB2YWxpZCBpbmRleCwgb3RoZXJ3aXNlIHJldHVybiBudWxsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGaXJzdENvbHVtbklkKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50LCByZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pIHx8XHJcbiAgICAgICAgICAgICEocmVuZGVyZWRJdGVtICYmIE51bWJlci5pc0ludGVnZXIocmVuZGVyZWRJdGVtLmluZGV4KSAmJiByZW5kZXJlZEl0ZW0uaW5kZXggPj0gMCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5pZEJhZy5maXJzdERhdGFDb2x1bW4gKyByZW5kZXJlZEl0ZW0uaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29sdW1uUmVzaXppbmcoZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc21lLWxheW91dC1ub25lJyk7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGV2ZW50LnggKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbHVtblJlc2l6ZWQoY29sdW1uSW5kZXg6IG51bWJlciwgZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzbWUtbGF5b3V0LW5vbmUnKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sdW1uSGVhZGVyRWxlbWVudHMgPSB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtdGFibGUtY29sdW1uLWhlYWRlcicpO1xyXG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbldpZHRoczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBuZXdDb2x1bW5XaWR0aHMucHVzaChjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aCk7XHJcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUaGUgcmVzaXplciBpcyBhdCB0aGUgcmlnaHQgYm9yZGVyIG9mIHRoZSBjdXJyZW50IGNvbHVtbi5cclxuICAgICAgICAvLyBXaGVuIHRoZSByZXNpemluZyBoYXBwZW5zLCBpdCBtZWFucyByZXNpemluZyB0aGUgY3VycmVudCBjb2x1bW4gd2l0aCBkZWx0YSBhbW91bnRcclxuICAgICAgICAvLyBhbmQgcmVzaXppbmcgdGhlIG5leHQgY29sdW1uIHdpdGggLWRlbHRhIGFtb3VudC5cclxuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uSGVhZGVyRWxlbWVudCA9IGNvbHVtbkhlYWRlckVsZW1lbnRzW2NvbHVtbkluZGV4XTtcclxuICAgICAgICBsZXQgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gY3VycmVudENvbHVtbkhlYWRlckVsZW1lbnQub2Zmc2V0V2lkdGggKyBldmVudC54O1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbmV4dENvbHVtbkhlYWRlciBpcyBoaWRkZW4sIHRoYXQgbWVhbnMgaXQncyBhIGdyb3VwIGNvbHVtbiBoZWFkZXIgd2hpY2ggc2hvdWxkIGJlIGhpZGRlbi5cclxuICAgICAgICAvLyBBIGhpZGRlbiBncm91cCBoZWFkZXIncyB3aWR0aCBzaG91bGQgbm90IGJlIGNvdW50ZWQuXHJcbiAgICAgICAgLy8gVGhlbiBzZXQgdGhlIG5leHRDb2x1bW5JbmRleCB0byB0aGUgbmV4dCBuZXh0IGNvbHVtbidzIGluZGV4LlxyXG4gICAgICAgIGNvbnN0IG5leHRDb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4ICsgKGNvbHVtbkhlYWRlckVsZW1lbnRzW2NvbHVtbkluZGV4ICsgMV0uaGFzQXR0cmlidXRlKCdoaWRkZW4nKSA/IDIgOiAxKTtcclxuICAgICAgICBjb25zdCBuZXh0Q29sdW1uSGVhZGVyRWxlbWVudCA9IGNvbHVtbkhlYWRlckVsZW1lbnRzW25leHRDb2x1bW5JbmRleF07XHJcbiAgICAgICAgbGV0IG5ld1dpZHRoRm9yTmV4dENvbHVtbiA9IG5leHRDb2x1bW5IZWFkZXJFbGVtZW50Lm9mZnNldFdpZHRoIC0gZXZlbnQueDtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiBpcyBsZXNzIHRoZW4gbWluQ29sdW1uV2lkdGgsIGl0IG1lYW5zIHRoZSB1c2VyIGlzIHRyeWluZyB0byBkcmFnIHRoZSByZXNpemVyIHRvIHZlcnkgbGVmdFxyXG4gICAgICAgIC8vIHRvIG1ha2UgdGhlIG5leHQgY29sdW1uIHZlcnkgd2lkZS5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdHJ5IHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBjb2x1bW4gY2FuIGJlIHJlc2l6ZWQgdG8gYXMgd2lkZSBhcyB0aGUgdXNlciB3YW50cy5cclxuICAgICAgICAvLyBUaGUgbGVmdCBzaWRlIGNvbHVtbnMgb2YgdGhlIG5leHQgY29sdW1uIHdpbGwgYmUgc2hyaW5rZWQgYmFzZWQgb24gdGhlaXIgb3duIG9yaWdpbmFsIHBlcmNlbnRhZ2Ugd2lkdGguXHJcbiAgICAgICAgaWYgKG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiA8IERhdGFUYWJsZUNvbXBvbmVudC5taW5Db2x1bW5XaWR0aCkge1xyXG4gICAgICAgICAgICBsZXQgY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbmV4dENvbHVtbkluZGV4ICsgMTsgaSA8IGNvbHVtbkhlYWRlckVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdW1lZFdpZHRoUmlnaHRTaWRlQ29sdW1ucyArPSBjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoUmlnaHRTaWRlQ29sdW1ucyAtIG5leHRDb2x1bW5IZWFkZXJFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoUmlnaHRTaWRlQ29sdW1ucyAtIG5ld1dpZHRoRm9yTmV4dENvbHVtbjtcclxuXHJcbiAgICAgICAgICAgIGxldCBhY3R1YWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGNvbHVtbkluZGV4OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbHVtbldpZHRoID0gTWF0aC5tYXgoXHJcbiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgKiAoY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGggLyBvcmlnaW5hbFdpZHRoRm9yTGVmdFNpZGVDb2x1bW5zKSxcclxuICAgICAgICAgICAgICAgICAgICBEYXRhVGFibGVDb21wb25lbnQubWluQ29sdW1uV2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgbmV3Q29sdW1uV2lkdGhzW2ldID0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyArPSBuZXdDb2x1bW5XaWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW4gPSBuZXdDb2x1bW5XaWR0aHNbY29sdW1uSW5kZXhdO1xyXG4gICAgICAgICAgICBuZXdXaWR0aEZvck5leHRDb2x1bW4gPSB0b3RhbFdpZHRoIC0gY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgLSBhY3R1YWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBuZXdXaWR0aEZvck5leHRDb2x1bW4gaXMgbGVzcyB0aGVuIG1pbkNvbHVtbldpZHRoLCBpdCBtZWFucyB0aGUgdXNlciBpcyB0cnlpbmcgdG8gZHJhZyB0aGUgcmVzaXplciB0byB2ZXJ5IHJpZ2h0XHJcbiAgICAgICAgLy8gdG8gbWFrZSB0aGUgY3VycmVudCBjb2x1bW4gdmVyeSB3aWRlLlxyXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCB0cnkgdG8gbWFrZSBzdXJlIHRoZSBjdXJyZW50IGNvbHVtbiBjYW4gYmUgcmVzaXplZCB0byBhcyB3aWRlIGFzIHRoZSB1c2VyIHdhbnRzLlxyXG4gICAgICAgIC8vIFRoZSByaWdodCBzaWRlIGNvbHVtbnMgb2YgdGhlIGN1cnJlbnQgY29sdW1uIHdpbGwgYmUgc2hyaW5rZWQgYmFzZWQgb24gdGhlaXIgb3duIG9yaWdpbmFsIHBlcmNlbnRhZ2Ugd2lkdGguXHJcbiAgICAgICAgaWYgKG5ld1dpZHRoRm9yTmV4dENvbHVtbiA8IERhdGFUYWJsZUNvbXBvbmVudC5taW5Db2x1bW5XaWR0aCkge1xyXG4gICAgICAgICAgICBsZXQgY29uc3VtZWRXaWR0aExlZnRTaWRlQ29sdW1ucyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGNvbHVtbkluZGV4IC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zICs9IGNvbHVtbkhlYWRlckVsZW1lbnRzW2ldLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zIC0gY3VycmVudENvbHVtbkhlYWRlckVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zIC0gbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uO1xyXG5cclxuICAgICAgICAgICAgbGV0IGFjdHVhbFdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBuZXh0Q29sdW1uSW5kZXg7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29sdW1uV2lkdGggPSBNYXRoLm1heChcclxuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aEZvclJpZ2h0U2lkZUNvbHVtbnMgKiAoY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGggLyBvcmlnaW5hbFdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyksXHJcbiAgICAgICAgICAgICAgICAgICAgRGF0YVRhYmxlQ29tcG9uZW50Lm1pbkNvbHVtbldpZHRoKTtcclxuICAgICAgICAgICAgICAgIG5ld0NvbHVtbldpZHRoc1tpXSA9IG5ld0NvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICAgICAgYWN0dWFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zICs9IG5ld0NvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiA9IHRvdGFsV2lkdGggLSBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zIC0gYWN0dWFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zO1xyXG4gICAgICAgICAgICBuZXdXaWR0aEZvck5leHRDb2x1bW4gPSBuZXdDb2x1bW5XaWR0aHNbbmV4dENvbHVtbkluZGV4XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5ld0NvbHVtbldpZHRoc1tjb2x1bW5JbmRleF0gPSBuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW47XHJcbiAgICAgICAgbmV3Q29sdW1uV2lkdGhzW25leHRDb2x1bW5JbmRleF0gPSBuZXdXaWR0aEZvck5leHRDb2x1bW47XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZXMgdGhlIGNvbHVtbiB3aWR0aHMgYmFzZWQgb24gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdHMuXHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICBjb2x1bW4ud2lkdGggPSBuZXdDb2x1bW5XaWR0aHNbaW5kZXhdICsgJ3B4JztcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBjb2x1bW4gcGVyY2VudGFnZXMgYmFzZWQgb24gdGhlIG5ldyBjb2x1bW4gd2lkdGhzLlxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4ud2lkdGhQZXJjZW50YWdlID0gY29sdW1uSGVhZGVyRWxlbWVudHNbaW5kZXhdLm9mZnNldFdpZHRoIC8gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGNvbHVtbiBjbGlja2luZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsaWNrQ29sdW1uKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uU29ydFNldHRpbmdzID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0YWJsZSAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IGNvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Ob25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc29ydE1vZGUgPSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLkRlc2NlbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNTb3J0Q29sdW1uID0gdGhpcy5zb3J0Q29sdW1uO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydENvbHVtbiA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0SXRlbXMoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRTY3JvbGxUb1NlbGVjdGlvbkFmdGVyU29ydGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KGZhbHNlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RoW2ZpZWxkPVwiJyArIGNvbHVtbi5maWVsZCArICdcIl0nKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0cicpLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwMCBpcyBhIHZlcnkgdHJpY2t5IG51bWJlciBoZXJlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIGlzIHRvbyBzbWFsbCwgaXQgd29uJ3QgdHJpZ2dlciB0aGUgbmFycmF0b3IuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgdG9vIGJpZywgdGhlIG5hcnJhdG9yIHdvdWxkIGZpcnN0bHkgcmVhZCB0aGUgY29udGVudCBvZiBUUiBwYXJ0aWFsbHkgdGhlbiB0aGUgY29udGVudCBvZiB0aGUgVEguXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnNvcnRNb2RlID0gRGF0YVRhYmxlU29ydE1vZGUuTm9uZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29sdW1uU29ydFNldHRpbmdzW2l0ZW0uaGVhZGVyXSA9IHRoaXMuZ2V0QXJpYVNvcnRBdHRyaWJ1dGVWYWx1ZShpdGVtKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jb2x1bW5Tb3J0U2V0dGluZ3MgPSBjb2x1bW5Tb3J0U2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSByb3cgZG91YmxlIGNsaWNraW5nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZG91YmxlQ2xpY2tSb3coZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUoZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIHRoaXMucm93RGJsY2xpY2suZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHNjcm9sbHMgdGhlIHNlbGVjdGVkIGl0ZW0gaW50byB0aGUgdmlldyBhbmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRyeVRvTW92ZVRvQ2VudGVyPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGxldCBzZWxlY3Rpb25EYXRhID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvbi5kYXRhO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EYXRhID0gdGhpcy5zZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24ubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EYXRhID0gdGhpcy5zZWxlY3Rpb25bMF0uZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EYXRhID0gdGhpcy5zZWxlY3Rpb25bMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWxlY3Rpb25EYXRhKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSA9PT0gc2VsZWN0aW9uRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cnlUb01vdmVUb0NlbnRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbERhdGFFbGVtZW50ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtRWxlbWVudCA9IHNjcm9sbERhdGFFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1FbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtVG9wID0gc2VsZWN0ZWRJdGVtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzY3JvbGxEYXRhRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgPSBzZWxlY3RlZEl0ZW1Ub3AgKyBzY3JvbGxEYXRhRWxlbWVudC5vZmZzZXRUb3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBjbGlja2luZyBiZWhhdmlvciBvZiBjaGVja2JveC5cclxuICAgICAqIE11bHRpcGxlIHNlbGVjdGlvbiBiZWhhdmlvciBpcyBoYXBwZW5pbmcgaGVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSXRlbUNoZWNrQm94Q2xpY2tlZChpdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIGlzRnJvbUtleWJvYXJkPzogYm9vbGVhbikge1xyXG4gICAgICAgIC8vIElmIHRoZSBpdGVtIGlzIHVuY2hlY2tlZCwgbmVlZCB0byBzZXQgYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggdG8gLTEgdGhlbiB0aGlzIGl0ZW0gd29uJ3QgYmUgaGlnaGxpZ2h0ZWQgaW4gdGhlIFVJLlxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5UcmVlTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLm5vZGUsICFpdGVtLm5vZGUuc2VsZWN0ZWQsIGZhbHNlLCAhdGhpcy5saW5rUGFyZW50Q2hpbGRyZW5TZWxlY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLm5vZGUuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVTZWxlY3RlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRnJvbUtleWJvYXJkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoLTEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUgJiYgIXRoaXMuZWRpdGFibGUgJiYgdGhpcy5leHBhbmRUcmVlTm9kZU9uQ2hlY2tlZCAmJiBpdGVtLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUobnVsbCwgaXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihpdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ucHVzaChpdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93VW5zZWxlY3RlZC5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNGcm9tS2V5Ym9hcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pO1xyXG4gICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmZpbHRlcihjdXJyZW50SXRlbSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChjdXJyZW50SXRlbSwgdGhpcy5ncm91cENvbHVtbi5maWVsZCkgPT09IGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2YoZ3JvdXBJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBncm91cEl0ZW1zW2ldIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uLnB1c2goZ3JvdXBJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGdyb3VwSXRlbXNbaV0gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkICYmICFpc0Zyb21LZXlib2FyZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgtMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5lZWQgdG8gcmVjcmVhdGUgdGhlIFwiaW50ZXJuYWxTZWxlY3Rpb25cIiBhcnJheSBvdGhlcndpc2UgdGhlIGNoYW5nZSBkZXRlY3RvciB3b24ndCBkZXRlY3QgdGhlIGNoYW5nZVxyXG4gICAgICAgIC8vIHNpbmNlIHRoZSBhcnJheSdzIG93biByZWZlcmVuY2UgaXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uc2xpY2UoMCwgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5sZW5ndGgpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgXCJjaGVjayBhbGxcIiBjaGVja2JveCBiZWhhdmlvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQWxsSXRlbUNoZWNrQm94Q2xpY2tlZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5sZW5ndGggIT09IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93VW5zZWxlY3RlZC5lbWl0KHsgZGF0YTogaXRlbSB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFNlbGVjdCA9ICF0aGlzLnNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oaXRlbSwgc2hvdWxkU2VsZWN0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5pbnRlcm5hbFNlbGVjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIGl0ZW0gaXMgc2VsZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlICE9PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGl0ZW0uZGF0YSAmJiB0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2YoaXRlbS5kYXRhKSAhPT0gLTE7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmZpbHRlcihjdXJyZW50SXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGN1cnJlbnRJdGVtLCB0aGlzLmdyb3VwQ29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKSA9PT0gaXRlbS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBpdGVtLmRhdGEgPT09IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBJdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihncm91cEl0ZW1zW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaXRlbS5ub2RlICYmIGl0ZW0ubm9kZS5zZWxlY3RlZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaXRlbS5kYXRhICYmIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ubWFwKGN1cnJlbnRJdGVtID0+IGN1cnJlbnRJdGVtLmRhdGEpLmluZGV4T2YoaXRlbS5kYXRhKSAhPT0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIGEgZ3JvdXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBleHBhbmRlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzR3JvdXBFeHBhbmRlZChncm91cDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyBhbmQgc2V0cyB0aGUgdmlydHVhbCBjb3VudC5cclxuICAgICAqIEl0IG9ubHkgd29ya3Mgd2hlbiBcImxhenlMb2FkXCIgaXMgdHJ1ZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgdmlydHVhbENvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggfHwgdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB2aXJ0dWFsQ291bnQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh2YWx1ZSA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXMgPSBBcnJheSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWU7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpXSA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXNvbHZlcyB0aGUgb2JqZWN0IHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGdpdmVuIHBhdGggd2l0aCBtdWx0aXBsZSBsZXZlbHMgb2YgcHJvcGVydGllcy5cclxuICAgICAqIEFuIGV4YW1wbGUgb2YgcGF0aCBpcyBcImxvY2F0aW9uLnppcENvZGVcIi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc29sdmVPYmplY3RQYXRoKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGlmIChvYmogJiYgcGF0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXRoU2VnbWVudHM6IHN0cmluZ1tdID0gcGF0aC5zcGxpdCgnLicpO1xyXG4gICAgICAgICAgICBpZiAocGF0aFNlZ21lbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ialtwYXRoXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRPYmogPSBvYmo7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aFNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50T2JqID0gY3VycmVudE9ialtwYXRoU2VnbWVudHNbaV1dO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPYmogPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50T2JqID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRPYmo7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJldHVybnMgdGhlIGFjdGl2ZSByZW5kZXJlZCBpdGVtIGluZGV4LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGlucHV0OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gaW5wdXQgPj0gMCA/IGlucHV0IDogLTE7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJldHVybnMgdGhlIGFjdGl2ZSBmb2N1c2VkIGl0ZW0gaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCA+IC0xID8gdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4IDogdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KGluZGV4OiBudW1iZXIsIGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGluZGV4LCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBoZWFkIG9mIHRoZSB3aG9sZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9IZWFkT2ZSZW5kZXJlZEl0ZW1zKGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgoMCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gcHJldmlvdXMgcGFnZSBvZiB0aGUgcmVuZGVyZWQgaXRlbSBsaXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW92ZVRvUHJldmlvdXNQYWdlT2ZSZW5kZXJlZEl0ZW1zKGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZG9TZWxlY3Rpb24gPyB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgOiB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTtcclxuICAgICAgICBsZXQgbmV3SW5kZXggPSAwO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXggLSBNYXRoLnJvdW5kKHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KG5ld0luZGV4LCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBwcmV2aW91cyBpdGVtIGluIHRoZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9QcmV2aW91c1JlbmRlcmVkSXRlbShkb1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGRvU2VsZWN0aW9uID8gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIDogdGhpcy5nZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCk7XHJcblxyXG4gICAgICAgIGxldCBuZXdJbmRleCA9IDA7XHJcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KG5ld0luZGV4LCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBuZXh0IGl0ZW0gaW4gdGhlIHJlbmRlcmVkIGl0ZW0gbGlzdC5cclxuICAgICAqIEBwYXJhbSBkb1NlbGVjdGlvbiBpZiB0cnVlIHdpbGwgZG8gc2VsZWN0aW9uIGFuZCBmb2N1cywgb3RoZXJ3aXNlIGZvY3VzIG9ubHlcclxuICAgICAqL1xyXG5cclxuICAgIHB1YmxpYyBtb3ZlVG9OZXh0UmVuZGVyZWRJdGVtKGRvU2VsZWN0aW9uID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZG9TZWxlY3Rpb24gPyB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgOiB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTtcclxuXHJcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICBuZXdJbmRleCA9IGluZGV4ICsgMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgobmV3SW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIG5leHQgcGFnZSBvZiB0aGUgcmVuZGVyZWQgaXRlbSBsaXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW92ZVRvTmV4dFBhZ2VPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBkb1NlbGVjdGlvbiA/IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA6IHRoaXMuZ2V0QWN0aXZlRm9jdXNlZEl0ZW1JbmRleCgpO1xyXG4gICAgICAgIGxldCBuZXdJbmRleCA9IDA7XHJcbiAgICAgICAgbmV3SW5kZXggPSBpbmRleCArIE1hdGgucm91bmQodGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleChuZXdJbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gZW5kIG9mIHRoZSB3aG9sZSByZW5kZXJlZCBsaXN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW92ZVRvRW5kT2ZSZW5kZXJlZEl0ZW1zKGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDEsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdGl2YXRlIHRoZSByZW5kZXJlZCBpdGVtIGJ5IGNvbmRpdGlvbi5cclxuICAgICAqIEFjdGl2YXRlIGRvZXNuJ3QgbWVhbiBzZWxlY3QuIEl0IGp1c3QgaW5kaWNhdGVzIHdoaWNoIGl0ZW0gaXMgYWN0aXZlIHRvIHJlY2VpdmVkIG1vcmUgb3BlcmF0aW9ucyBlc3BlY2lhbGx5IGtleWJvYXJkIG9wZXJhdGlvbnMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5Q29uZGl0aW9uKGNvbmRpdGlvbjogKGl0ZW06IERhdGFUYWJsZURhdGFJdGVtKSA9PiBib29sZWFuLCBkb1NlbGVjdGlvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjb25kaXRpb24odGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleCh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uaW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0aXZhdGUgdGhlIHJlbmRlcmVkIGl0ZW0gYnkgaW5kZXguXHJcbiAgICAgKiBBY3RpdmF0ZSBkb2Vzbid0IG1lYW4gc2VsZWN0LiBJdCBqdXN0IGluZGljYXRlcyB3aGljaCBpdGVtIGlzIGFjdGl2ZSB0byByZWNlaXZlZCBtb3JlIG9wZXJhdGlvbnMgZXNwZWNpYWxseSBrZXlib2FyZCBvcGVyYXRpb25zLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpbmRleDogbnVtYmVyLCBkb1NlbGVjdGlvbjogYm9vbGVhbiwgZG9Gb2N1czogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZG9TZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpbmRleCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zICYmIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICYmIHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvblxyXG4gICAgICAgICAgICAmJiB0aGlzLnNlbGVjdEl0ZW1XaGVuTmF2aWdhdGluZ1dpdGhLZXlib2FyZCAmJiBkb1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0obnVsbCwgdGhpcy5yZW5kZXJlZEl0ZW1zW2luZGV4XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzY3JvbGxDb250YWluZXJFbGVtZW50ID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgdG90YWxTY3JvbGxhYmxlU3BhY2UgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IHRvdGFsU2Nyb2xsYWJsZUl0ZW1MZW5ndGggPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0O1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50UmVuZGVyZWRJdGVtU3RhcnRJbmRleCA9IHRvdGFsU2Nyb2xsYWJsZUl0ZW1MZW5ndGggKiBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCAvIHRvdGFsU2Nyb2xsYWJsZVNwYWNlXHJcbiAgICAgICAgICAgICsgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0O1xyXG5cclxuICAgICAgICBsZXQgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggPSAtMTtcclxuICAgICAgICBpZiAoaW5kZXggPj0gTWF0aC5mbG9vcihjdXJyZW50UmVuZGVyZWRJdGVtU3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAtIDEpKSB7XHJcbiAgICAgICAgICAgIG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID0gaW5kZXggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgKyAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZGV4IDw9IGN1cnJlbnRSZW5kZXJlZEl0ZW1TdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgIG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCA+PSAwLCBpdCBtZWFucyB3aGVuIHRoZSByZW5kZXJlZCBpdGVtIGlzIGFjdGl2YXRlZCwgaXQgdHJpZ2dlcnMgc2Nyb2xsaW5nIGluIHRoZSBsaXN0LlxyXG4gICAgICAgIGlmIChuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCdzIHRoZSBuZXcgc2Nyb2xsdG9wIGJhc2VkIG9uIG5ldyByZW5kZXJlZEl0ZW1TdGFydEluZGV4LlxyXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSBNYXRoLmZsb29yKHRvdGFsU2Nyb2xsYWJsZVNwYWNlICogKG5ld1JlbmRlckl0ZW1TdGFydEluZGV4IC8gdG90YWxTY3JvbGxhYmxlSXRlbUxlbmd0aCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzTG9uZ0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgYSBsb25nIGxpc3QsIHdoaWNoIG1lYW5zIG9uZSBwaXhlbCBvZiBzY3JvbGxiYXIgbW92ZW1lbnQgY2F1c2VzIG1vcmUgdGhhbiBvbmUgc2NyZWVuIG9mIHRoZSBsaXN0IHNjcm9sbGluZyxcclxuICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHRydW5jYXRlZCByZW5kZXJlZCBpdGVtIHN0YXJ0IGluZGV4LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkU3RhcnRJbmRleCA9IE1hdGguZmxvb3Ioc2Nyb2xsVG9wIC8gdG90YWxTY3JvbGxhYmxlU3BhY2UgKiB0b3RhbFNjcm9sbGFibGVJdGVtTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgYWN0dWFsIHBvc2l0aW9uIG9mIHRoZSBhY3RpdmF0ZWQgcmVuZGVyZWQgaXRlbSBsaXN0IGNhbiBiZSBtb3JlIHRoYW4gb25lIHNjcmVlbiBiZWxvdyxcclxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIG5ld1JlbmRlckl0ZW1TdGFydEluZGV4IGFuZCB0cnVuY2F0ZWRTdGFydEluZGV4LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlbiBsYXRlciB3aGVuIHdlIHJlbmRlciB0aGUgZGF0YSB0YWJsZSBpdGVtcyBpbiB0aGUgdmlldyBwb3J0LCB3ZSB3aWxsIHVzZSB0aGUgb2Zmc2V0IHRvIGFkanVzdFxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGl0ZW0gbGlzdCB0byBtYWtlIHN1cmUgdGhlIGFjdHVhbCBhY3RpdmF0ZWQgcmVuZGVyZWQgaXRlbSBjYW4gc2hvdyB1cCBpbiB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggLSB0cnVuY2F0ZWRTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgPiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHNjcm9sbHRvcCBhbmQgcmUtY2FsY3VhdGUgdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvRm9jdXMpIHtcclxuICAgICAgICAgICAgaWYgKGRvU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzUm93QnlJbmRleChpbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzUm93QnlJbmRleChpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBcmlhRXhwYW5kZWRBdHRyaWJ1dGVWYWx1ZShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG5cclxuICAgICAgICBpZiAocmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgaXNHcm91cEV4cGFuZGVkID0gdGhpcy5pc0dyb3VwRXhwYW5kZWQocmVuZGVyZWRJdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICBpZiAoaXNHcm91cEV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzR3JvdXBFeHBhbmRlZC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5UcmVlTm9kZSAmJiAhcmVuZGVyZWRJdGVtLm5vZGUuaXNMZWFmKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9ICghIShyZW5kZXJlZEl0ZW0ubm9kZSAmJiByZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCkpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBZGRpdGlvbmFsU2NyZWVuUmVjb3JkZXJDb250ZW50KHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XHJcbiAgICAgICAgc3dpdGNoIChyZW5kZXJlZEl0ZW0udHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGU6XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJOb2RlQ291bnQgPSByZW5kZXJlZEl0ZW0ubm9kZS5jaGlsZHJlbiA/IHJlbmRlcmVkSXRlbS5ub2RlLmNoaWxkcmVuLmxlbmd0aCA6IDA7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBzdWJOb2RlQ291bnQgPT09IDEgPyB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwub25lU3ViTm9kZUluVHJlZU5vZGVcclxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5uU3ViTm9kZXNJblRyZWVOb2RlLmZvcm1hdChzdWJOb2RlQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcjpcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbUNvdW50ID0gdGhpcy5ncm91cEtleXNbcmVuZGVyZWRJdGVtLmRhdGFdLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdyb3VwSXRlbUNvdW50ID09PSAxID8gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLm9uZUl0ZW1Jbkdyb3VwXHJcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwubkl0ZW1zSW5Hcm91cC5mb3JtYXQoZ3JvdXBJdGVtQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkVkaXRhYmxlRGF0YUNoYW5nZWQocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIGZpZWxkOiBzdHJpbmcpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZWRpdGFibGVEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPnJlbmRlcmVkSXRlbS5kYXRhO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFlZGl0YWJsZURhdGFJdGVtLmlzTmV3Um93ICYmIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMuaW5kZXhPZihlZGl0YWJsZURhdGFJdGVtLmNvbnRlbnQpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEl0ZW1JbmRleCA9IHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtcy5pbmRleE9mKGVkaXRhYmxlRGF0YUl0ZW0uY29udGVudCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlZEl0ZW1JbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC51cGRhdGVkSXRlbXMuc3BsaWNlKHVwZGF0ZWRJdGVtSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHZhbGlkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0cy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0c1twcm9wZXJ0eV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW3Byb3BlcnR5XS52YWxpZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLnB1c2goZWRpdGFibGVEYXRhSXRlbS5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlc2V0VXBkYXRlZC5lbWl0KHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXNldEVkaXRhYmxlRGF0YUNoYW5nZXNldCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldCA9IHtcclxuICAgICAgICAgICAgYWRkZWRJdGVtczogW10sXHJcbiAgICAgICAgICAgIHVwZGF0ZWRJdGVtczogW10sXHJcbiAgICAgICAgICAgIGRlbGV0ZWRJdGVtczogW11cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY2hhbmdlc2V0VXBkYXRlZC5lbWl0KHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25WYWxpZGF0aW9uQWxlcnRIYW5kbGVyKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCBmaWVsZDogc3RyaW5nLCBhbGVydDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZWRpdGFibGVEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPnJlbmRlcmVkSXRlbS5kYXRhO1xyXG4gICAgICAgIGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0c1tmaWVsZF0gPSBhbGVydDtcclxuXHJcbiAgICAgICAgcmVuZGVyZWRJdGVtLnZhbGlkYXRpb25SZXN1bHQubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLmZpZWxkICYmIGVkaXRhYmxlRGF0YUl0ZW0udmFsaWRhdGlvbkFsZXJ0c1tjb2x1bW4uZmllbGRdICYmICFjb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29sdW1uLmhlYWRlcixcclxuICAgICAgICAgICAgICAgICAgICBhbGVydDogZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW2NvbHVtbi5maWVsZF1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaGFzIHZhbGlkYXRpb24gZXJyb3IgaWYgdGhlcmUgYXJlIGFueSB2YWxpZGF0aW9uIGFsZXJ0c1xyXG4gICAgcHVibGljIGhhc1ZhbGlkYXRpb25FcnJvcihyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdCAmJiByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdC5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSb2xlQXR0cmlidXRlRm9yVHJlZVRhYmxlUm93KHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRSb2xlQXR0cmlidXRlRm9yVHJlZVRhYmxlUm93KHJlbmRlcmVkSXRlbSwgdGhpcy5zaG93SGVhZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Um9sZUF0dHJpYnV0ZUZvclRhYmxlUm93Q2VsbChyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0Um9sZUF0dHJpYnV0ZUZvclRhYmxlUm93Q2VsbChyZW5kZXJlZEl0ZW0sIHRoaXMuc2hvd0hlYWRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFyaWFTb3J0QXR0cmlidXRlVmFsdWUoY29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEFyaWFTb3J0QXR0cmlidXRlVmFsdWUoY29sdW1uKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oa2VlcEhpZ2hsaWdodEZyb21Sb3c/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgha2VlcEhpZ2hsaWdodEZyb21Sb3cpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHRGcm9tUm93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVIaWdobGlnaHRGcm9tUm93KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoLTEpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuYXZpZ2F0ZUJ5UGF0aChwYXRoU2VjdGlvbnM6IHN0cmluZ1tdLFxyXG4gICAgICAgIGdldE5vZGVMYWJlbEhhbmRsZXI6IChub2RlOiBUcmVlTm9kZURhdGFJdGVtKSA9PiBzdHJpbmcsXHJcbiAgICAgICAgb25UYXNrRmluaXNoZWRIYW5kbGVyPzogKGZvdW5kOiBib29sZWFuKSA9PiB2b2lkLFxyXG4gICAgICAgIGlzTm9kZUxvYWRpbmdIYW5kbGVyPzogKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0pID0+IGJvb2xlYW4sXHJcbiAgICAgICAgdGltZW91dCA9IDUwMDAsXHJcbiAgICAgICAgb25seVRyaWdnZXJTZWxlY3Rpb25Gb3JMYXN0Tm9kZT86IGJvb2xlYW4sIG1hdGNoRmlyc3RBRmV3PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzayAmJiB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub2RlIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzayA9IHtcclxuICAgICAgICAgICAgcGF0aFNlY3Rpb25zOiBwYXRoU2VjdGlvbnMsXHJcbiAgICAgICAgICAgIGlzUnVubmluZzogdHJ1ZSxcclxuICAgICAgICAgICAgY3VycmVudFBhdGhTZWN0aW9uSW5kZXg6IDAsXHJcbiAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJlZEl0ZW1JbmRleDogMCxcclxuICAgICAgICAgICAgb25UYXNrRmluaXNoZWQ6IG9uVGFza0ZpbmlzaGVkSGFuZGxlcixcclxuICAgICAgICAgICAgY3VycmVudFBhdGhTZWN0aW9uU3RhcnRUaW1lOiBuZXcgRGF0ZSgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVQYXRoTmF2aWdhdGlvbihcclxuICAgICAgICAgICAgZ2V0Tm9kZUxhYmVsSGFuZGxlcixcclxuICAgICAgICAgICAgaXNOb2RlTG9hZGluZ0hhbmRsZXIsXHJcbiAgICAgICAgICAgIHRpbWVvdXQsXHJcbiAgICAgICAgICAgIG9ubHlUcmlnZ2VyU2VsZWN0aW9uRm9yTGFzdE5vZGUsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIG1hdGNoRmlyc3RBRmV3KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWxsSXRlbUNoZWNrQm94QXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpID8gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLnVuc2VsZWN0QWxsSXRlbXNcclxuICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwuc2VsZWN0QWxsSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEluaXRpYWxIb3N0Q2xhc3NlcygpIHtcclxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCkuY29uY2F0KFtcclxuICAgICAgICAgICAgJ3NtZS1kYXRhLXRhYmxlJ1xyXG4gICAgICAgIF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlUGF0aE5hdmlnYXRpb24oZ2V0Tm9kZUxhYmVsSGFuZGxlcjogKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0pID0+IHN0cmluZyxcclxuICAgICAgICBpc05vZGVMb2FkaW5nSGFuZGxlcj86IChub2RlOiBUcmVlTm9kZURhdGFJdGVtKSA9PiBib29sZWFuLFxyXG4gICAgICAgIHRpbWVvdXQ/OiBudW1iZXIsIG9ubHlUcmlnZ2VyU2VsZWN0aW9uRm9yTGFzdE5vZGU/OiBib29sZWFuLFxyXG4gICAgICAgIGxhc3RGb3VuZE5vZGU/OiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIG1hdGNoRmlyc3RBRmV3PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBzaG91bGRDb250aW51ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kTm9kZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5lYXJNYXRjaE5vZGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXggPCB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRSZW5kZXJlZEl0ZW1JbmRleDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRDb250aW51ZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGdldE5vZGVMYWJlbEhhbmRsZXIodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbCA9PT1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9uc1t0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleF0udG9Mb2NhbGVMb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZS5leHBhbmRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4IDwgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShldmVudCwgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kTm9kZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZvdW5kTm9kZSA9IHRoaXMucmVuZGVyZWRJdGVtc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXggPT09IHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uICE9PSB0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0obnVsbCwgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxTZWxlY3RlZEl0ZW1JbnRvVmlldyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sub25UYXNrRmluaXNoZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sub25UYXNrRmluaXNoZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZENvbnRpbnVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05vZGVMb2FkaW5nSGFuZGxlciB8fCAhaXNOb2RlTG9hZGluZ0hhbmRsZXIodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UmVuZGVyZWRJdGVtSW5kZXggPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25TdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZWFyTWF0Y2hOb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zW3RoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxhYmVsLmluZGV4T2YodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleF0udG9Mb2NhbGVMb3dlckNhc2UoKSkgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWFyTWF0Y2hOb2RlID0gdGhpcy5yZW5kZXJlZEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFJlbmRlcmVkSXRlbUluZGV4ID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRlcHRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gdGhpcy5yZW5kZXJlZEl0ZW1zW3RoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRSZW5kZXJlZEl0ZW1JbmRleCAtIDFdLmRlcHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQ29udGludWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmROb2RlICYmIG5vdy5nZXRUaW1lKCkgLSB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25TdGFydFRpbWUuZ2V0VGltZSgpID4gdGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLm9uVGFza0ZpbmlzaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5vblRhc2tGaW5pc2hlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVhck1hdGNoTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShudWxsLCBuZWFyTWF0Y2hOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0Rm91bmROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG51bGwsIGxhc3RGb3VuZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBhdGhOYXZpZ2F0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9kZUxhYmVsSGFuZGxlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm9kZUxvYWRpbmdIYW5kbGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUcmlnZ2VyU2VsZWN0aW9uRm9yTGFzdE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Rm91bmROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGaXJzdEFGZXcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgMjAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRpYWxpemVVSSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRlbXBSb3dFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNvcnRJdGVtcygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zICYmIHRoaXMuc29ydENvbHVtbikge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wYXJlRnVuY3Rpb24gPSB0aGlzLnNvcnRDb2x1bW4uc29ydGFibGUgPT09ICdjdXN0b20nID9cclxuICAgICAgICAgICAgICAgIHRoaXMuc29ydENvbHVtbi5jb21wYXJlRnVuY3Rpb24uYmluZCh0aGlzKSA6IHRoaXMuZGVmYXVsdFNvcnRDb21wYXJlRnVuY3Rpb24uYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgY29uc3Qgc29ydERpcmVjdGlvbiA9IHRoaXMuc29ydENvbHVtbi5zb3J0TW9kZSA9PT0gRGF0YVRhYmxlU29ydE1vZGUuQXNjZW5kID8gMSA6IC0xO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmdyb3VwQ29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWRpdGFibGVOZXdSb3dSZW5kZXJlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUgJiYgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtcy5sYXN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVkSXRlbS5kYXRhLmlzTmV3Um93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlTmV3Um93UmVuZGVyZWRJdGVtID0gcmVuZGVyZWRJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMuc3BsaWNlKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSAxLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHNob3VsZEZhbGxCYWNrVG9EZWZhdWx0U29ydCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFscmVhZHlMb2FkZWRBbGxEYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZW5kZXJlZEl0ZW1zW2ldIHx8ICF0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlMb2FkZWRBbGxEYXRhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydENvbHVtbiA9PT0gdGhpcy5wcmV2aW91c1NvcnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRJdGVtcy5yZXZlcnNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlMb2FkZWRBbGxEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldID0geyBpbmRleDogaSwgZGF0YTogdW5kZWZpbmVkLCB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLk5vcm1hbCB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkRmFsbEJhY2tUb0RlZmF1bHRTb3J0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvQ3VzdG9tU29ydC5lbWl0KHtcclxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHNvcnREaXJlY3Rpb24sIGZpZWxkOiB0aGlzLnNvcnRDb2x1bW4uZmllbGQsIGZhbGxCYWNrVG9EZWZhdWx0U29ydDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRGYWxsQmFja1RvRGVmYXVsdFNvcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRGYWxsQmFja1RvRGVmYXVsdFNvcnQgfHwgdGhpcy5kb0N1c3RvbVNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gdGhpcy5yZW5kZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEsIGIuZGF0YSwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gdGhpcy5yZW5kZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEuY29udGVudCwgYi5kYXRhLmNvbnRlbnQsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBpbiBcImVsc2VcIiBibG9jayBoYW5kbGVzIHRoZSBzb3J0IGluIHRoZSB0cmVlIG5vZGVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBzb3J0cyB0aGUgdHJlZSBub2RlcyBvbmx5IGluIGl0cyBvd24gdHJlZSBsZXZlbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBub2RlcyBoYXZlIHN1YiBub2RlcyBhbmQgb3RoZXIgbm9kZXMgZG9uJ3QgaGF2ZSBzdWIgbm9kZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBwdXQgdGhlIG5vZGVzIHdpdGggc3ViIG5vZGVzIGluIGZyb250IG9mIHRoZSBub2RlcyB3aXRob3V0IHN1YiBub2Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBbdGhpcy5zaGFkb3dUcmVlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaChjdXJyZW50Tm9kZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnNwbGljZShzdGFjay5sZW5ndGggLSAxLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGN1cnJlbnROb2RlLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBjb21wYXJlIHJlc3VsdCBhYm91dCAxIG9yIC0xIGlzIHJldmVyc2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlIGlmIGEgaXMgZ3JlYXRlciB0aGFuIGIsIDEgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIC0xLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgYmVjYXVzZSB0aG9zZSBub2RlcyBhcmUgd2VudCB0aG91Z2ggaW4gdGhlIHN0YWNrIHdpdGggaXMgRklGTyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgb3JkZXIgaXMgcmV2ZXJzZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydENvbHVtbiA9PT0gdGhpcy5hY3R1YWxDb2x1bW5zWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmRhdGEuaGFzQ2hpbGRyZW4gJiYgIWIuZGF0YS5oYXNDaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWEuZGF0YS5oYXNDaGlsZHJlbiAmJiBiLmRhdGEuaGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFWYWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoYS5kYXRhLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJWYWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoYi5kYXRhLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVZhbHVlID09PSB1bmRlZmluZWQgJiYgYlZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1zb3J0RGlyZWN0aW9uICogY29tcGFyZUZ1bmN0aW9uKGEuZGF0YS5kYXRhLCBiLmRhdGEuZGF0YSwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlTmV3Um93UmVuZGVyZWRJdGVtICYmIHRoaXMuZWRpdGFibGVBdXRvTmV3Um93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2goZWRpdGFibGVOZXdSb3dSZW5kZXJlZEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGhhbmRsZXMgdGhlIHNvcnRpbmcgd2hlbiBncm91cGluZyBpcyBlbmFibGVkLlxyXG4gICAgICAgICAgICAgICAgLy8gSXQgc29ydHMgdGhlIGdyb3VwIGl0ZW1zIGluIGVhY2ggb2YgdGhlIGdyb3VwLlxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkUmVuZGVyZWRJdGVtczogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW10gPSBbXTtcclxuICAgICAgICAgICAgICAgIGxldCBncm91cGVkUmVuZGVyZWRJdGVtczogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBlZFJlbmRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW5kZXJlZEl0ZW1zID0gZ3JvdXBlZFJlbmRlcmVkSXRlbXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uICogY29tcGFyZUZ1bmN0aW9uKGEuZGF0YSwgYi5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFJlbmRlcmVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFJlbmRlcmVkSXRlbXMucHVzaCh0aGlzLnJlbmRlcmVkSXRlbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW5kZXJlZEl0ZW1zLnB1c2godGhpcy5yZW5kZXJlZEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBlZFJlbmRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcyA9IGdyb3VwZWRSZW5kZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYS5kYXRhLCBiLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkUmVuZGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gc29ydGVkUmVuZGVyZWRJdGVtcztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleEJ5U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVmYXVsdFNvcnRDb21wYXJlRnVuY3Rpb24oYTogRGF0YVRhYmxlRGF0YUl0ZW0sIGI6IERhdGFUYWJsZURhdGFJdGVtLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKCFhICYmICFiKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICAgICAgfSBlbHNlIGlmICghYSAmJiBiKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhICYmICFiKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBhVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGEsIGZpZWxkKTtcclxuICAgICAgICAgICAgbGV0IGJWYWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoYiwgZmllbGQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB0eXBlb2YgYVZhbHVlO1xyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICBhVmFsdWUgPSBhVmFsdWUgPT09IDAgPyBhVmFsdWUgOiAoYVZhbHVlIHx8IE51bWJlci5NSU5fVkFMVUUpO1xyXG4gICAgICAgICAgICAgICAgYlZhbHVlID0gYlZhbHVlID09PSAwID8gYlZhbHVlIDogKGJWYWx1ZSB8fCBOdW1iZXIuTUlOX1ZBTFVFKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYVZhbHVlID4gYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVZhbHVlIDwgYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhVmFsdWUgPSBhVmFsdWUgJiYgYVZhbHVlLnRvU3RyaW5nICYmIGFWYWx1ZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICBiVmFsdWUgPSBiVmFsdWUgJiYgYVZhbHVlLnRvU3RyaW5nICYmIGJWYWx1ZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkgfHwgJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgd2UgZG8gbmF0dXJhbCBzb3J0IGhlcmUuXHJcbiAgICAgICAgICAgICAgICAvLyBCYXNlZCBvbiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24sIFwiYTEwMFwiLFwiYTIwXCIsXCJhM1wiIHdpbGwgYmUgc29ydGVkIGFzIFwiYTEwMFwiLFwiYTIwXCIsXCJhM1wiLlxyXG4gICAgICAgICAgICAgICAgLy8gQnV0IGJhc2VkIG9uIG5hdHVyYWwgc29ydCwgdGhleSB3aWxsIGJlIHNvcnRlZCBhcyBcImEzXCIsXCJhMjBcIixcImExMDBcIi5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlTmF0dXJhbFNvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc051bWJlciA9ICh0ZXh0OiBzdHJpbmcpID0+IHRleHQgPj0gJzAnICYmIHRleHQgPD0gJzknO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIDEsIGZpZ3VyZSBvdXQgdGhlIGNvbW1vbiBwYXJ0IG9mIDIgc3RyaW5ncy5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGFWYWx1ZS5sZW5ndGggJiYgaW5kZXggPCBiVmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVmFsdWVbaW5kZXhdICE9PSBiVmFsdWVbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCAyLCBpZiB0aGUgcmVzdCBwYXJ0IG9mIGVhY2ggc3RyaW5nIHN0YXJ0cyB3aXRoIGEgbnVtYmVyLCBwYXJzZSB0aGUgcmVzdCBwYXJ0IGludG8gZmxvYXQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2VGbG9hdCBmdW5jdGlvbiBpcyB2ZXJ5IGR1cmFibGUsIGl0IGNhbiBwYXJzZSBcIjEuNWFiY1wiIGFzIFwiMS41XCIgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSB0aGF0IHRoZSByZXN0IHBhcnRcclxuICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgc3RyaW5nIGlzIG1peGVkIHdpdGggbnVtYmVycyBhbmQgbGV0dGVycy5cclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzdCBwYXJ0IG9mIGVhY2ggc3RyaW5nIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIG51bWJlciwgdGhlbiBkb24ndCBkbyBuYXR1cmFsIHNvcnQsIGp1c3QgZG8gbm9ybWFsIHN0cmluZyBzb3J0LlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc051bWJlcihhVmFsdWVbaW5kZXhdKSAmJiBpc051bWJlcihiVmFsdWVbaW5kZXhdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhTnVtYmVyID0gcGFyc2VGbG9hdChhVmFsdWUuc3Vic3RyKGluZGV4LCBhVmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJOdW1iZXIgPSBwYXJzZUZsb2F0KGJWYWx1ZS5zdWJzdHIoaW5kZXgsIGJWYWx1ZS5sZW5ndGgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFOdW1iZXIgPiBiTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFOdW1iZXIgPCBiTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVmFsdWUgPiBiVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVZhbHVlIDwgYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFWYWx1ZSA+IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVZhbHVlIDwgYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFzVmVydGljYWxPdmVyZmxvdygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA+IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFsaWduU2Nyb2xsQmFyKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGhhc1ZlcnRpY2FsT3ZlcmZsb3cgPSB0aGlzLmhhc1ZlcnRpY2FsT3ZlcmZsb3coKTtcclxuICAgICAgICBpZiAoIXRoaXMuY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlU2Nyb2xsYmFyV2lkdGgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGhhc1ZlcnRpY2FsT3ZlcmZsb3cgIT09IHRoaXMuY3VycmVudEhhc1ZlcnRpY2FsT3ZlcmZsb3cgJiYgdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGhhc1ZlcnRpY2FsT3ZlcmZsb3cpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSAnY2FsYygxMDAlIC0gJyArIHRoaXMuY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoICsgJ3B4KSc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUucmlnaHQgPSB0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCArICdweCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzBweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SGFzVmVydGljYWxPdmVyZmxvdyA9IGhhc1ZlcnRpY2FsT3ZlcmZsb3c7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVTY3JvbGxiYXJXaWR0aCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzY3JvbGxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChzY3JvbGxEaXYpO1xyXG4gICAgICAgIHNjcm9sbERpdi5jbGFzc05hbWUgPSAnc21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24tc3RyZXRjaCBzbWUtYXJyYW5nZS1vdmVyZmxvdy1zY3JvbGwnO1xyXG4gICAgICAgIHNjcm9sbERpdi5zdHlsZS50b3AgPSAnLTk5OTlweCc7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYub2Zmc2V0V2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCA9IHNjcm9sbGJhcldpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlSXRlbUluVmlld1BvcnQocHJldmVudFNjcm9sbGluZz86IGJvb2xlYW4sIGZvcmNlVXBkYXRlPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQgJiYgdGhpcy5yZW5kZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIC8vIFNjcm9sbCBjb250YWluZXIgaXMgdGhlIGRpdiB0byByZW5kZXIgdGhlIHZpZXcgcG9ydCBvZiB0aGUgZGF0YSB0YWJsZSBhbmQgdG8gcHJvdmlkZSB0aGUgc2Nyb2xsIGJhci5cclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlcyBob3cgbWFueSBpdGVtcyBjYW4gYmUgcmVuZGVyZWQgaW4gdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ID0gdGhpcy5zY3JvbGxhYmxlXHJcbiAgICAgICAgICAgICAgICA/IE1hdGgubWluKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gdGhpcy5yb3dIZWlnaHQpXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTY3JvbGxQaXhlbHMgPSB0aGlzLmRlZmF1bHRTY3JvbGxQZXJjZW50YWdlICogc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTY3JvbGxQaXhlbHMgPSBNYXRoLmZsb29yKGRlZmF1bHRTY3JvbGxQaXhlbHMgLyB0aGlzLnJvd0hlaWdodCkgKiB0aGlzLnJvd0hlaWdodDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICAgICAgICBsZXQgaXNBdExhc3RTY3JlZW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZW5kZXJlZEl0ZW1TdGFydCA9IDA7XHJcbiAgICAgICAgICAgIGxldCByZW5kZXJlZEl0ZW1FbmQgPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVVSVZpcnR1YWxpemF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNMb25nTGlzdCAmJiBwcmV2ZW50U2Nyb2xsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhU2Nyb2xsVG9wID0gKHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICogdGhpcy5jdXJyZW50U3RhcnRJbmRleE9mSXRlbUluVmlld1BvcnQgLyAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHRoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLmRhdGFTY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZXMgdGhlIHdoaWNoIGl0ZW0gaXMgdGhlIHN0YXJ0aW5nIGl0ZW0gaW4gdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaWRlYSBoZXJlIGlzIHRvIGNhbGN1bGF0ZSB0aGUgcGVyY2VudGFnZSBvZiBob3cgZmFyIHRoZSBzY3JvbGxiYXIgbW92ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRpc3RhbmNlIHRoZSBzY3JvbGxiYXIgY2FuIG1vdmUgaXMgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgc2Nyb2xsYmFyIG1pbnVzIHRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0LlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmZsb29yKHRoaXMuZGF0YVNjcm9sbFRvcCkgIT09IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNjcm9sbFRvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjdXJhdGVTdGFydEluZGV4ID0gKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpICogdGhpcy5kYXRhU2Nyb2xsVG9wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8gKHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLmZsb29yKGFjY3VyYXRlU3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgPiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0F0TGFzdFNjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0ID0gc3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGlzdCBpcyBzaG9ydCBhbmQgbm8gbmVlZCB0byBoYXZlIHNjcm9sbCBiYXIsIGp1c3Qgc2ltcGx5IHNldCB0aGUgc3RhcnQgaW5kZXggdG8gMC5cclxuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCA8PSBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbVN0YXJ0ID0gc3RhcnRJbmRleCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAqIHRoaXMuYnVmZmVyUm93UmF0ZTtcclxuICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbUVuZCA9IE1hdGguY2VpbChzdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgKiB0aGlzLmJ1ZmZlclJvd1JhdGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgc2hvdWxkTGF6eUxvYWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGxvZ2ljIGNhbGN1bGF0ZXMgd2hpY2ggcGFydCBvZiBkYXRhIHNob3VsZCBiZSBsb2FkZWQgd2l0aCB0aGUgbGF6eSBsb2FkaW5nIGV2ZW50LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF6eUxvYWRTdGFydCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmVuZGVyZWRJdGVtU3RhcnQpKTtcclxuICAgICAgICAgICAgICAgIGxldCBhY3R1YWxMYXp5TG9hZFN0YXJ0ID0gbGF6eUxvYWRTdGFydDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhenlMb2FkTGVuZ3RoID0gTWF0aC5taW4odGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCwgcmVuZGVyZWRJdGVtRW5kKSAtIGxhenlMb2FkU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWN0dWFsTGF6eUxvYWRMZW5ndGggPSBsYXp5TG9hZExlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gbGF6eUxvYWRTdGFydDsgaSA8IGxhenlMb2FkU3RhcnQgKyBsYXp5TG9hZExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVySXRlbUZsYWcgPSAoIXRoaXMucmVuZGVyZWRJdGVtc1tpXSB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkTGF6eUxvYWQgJiYgcmVuZGVySXRlbUZsYWcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkTGF6eUxvYWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxMYXp5TG9hZFN0YXJ0ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZExhenlMb2FkICYmICFyZW5kZXJJdGVtRmxhZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsTGF6eUxvYWRMZW5ndGggPSBpICsgMSAtIGFjdHVhbExhenlMb2FkU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFjdHVhbExhenlMb2FkTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkTGF6eUxvYWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkTGF6eUxvYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc29ydE9yZGVyID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3J0Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zb3J0Q29sdW1uLnNvcnRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0T3JkZXIgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVTb3J0TW9kZS5EZXNjZW5kOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRPcmRlciA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0T3JkZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXp5TG9hZEV2ZW50ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogYWN0dWFsTGF6eUxvYWRTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBhY3R1YWxMYXp5TG9hZExlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoTG9hZGluZ0RhdGE6IChpdGVtcywgYWxsSXRlbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc1thY3R1YWxMYXp5TG9hZFN0YXJ0ICsgaV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogYWN0dWFsTGF6eUxvYWRTdGFydCArIGksIGRhdGE6IGl0ZW1zW2ldLCB0eXBlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLk5vcm1hbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNldCBpbnRlcm5hbCBpdGVtcyBzbyB0aGF0IHdlIGNhbiBzZWxlY3QgYWxsLCBhbmQgc28gd2UgY2FuIGRvIGZpbHRlcmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcyA9IGFsbEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlcigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgcmVmcmVzaCB0byBtYWtlIHRoZSBjaGFuZ2VzIHJlZmxlY3Qgb24gVUksIHdpbGwgbm90IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyBhZnRlciBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQsIHRoZSBzaG91bGRMYXp5TG9hZCB3aWxsIGJlIHNldCB0byBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyOiBzb3J0T3JkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGaWVsZDogdGhpcy5zb3J0Q29sdW1uID8gdGhpcy5zb3J0Q29sdW1uLmZpZWxkIDogdGhpcy5hY3R1YWxDb2x1bW5zID8gdGhpcy5hY3R1YWxDb2x1bW5zWzBdLmZpZWxkIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXp5TG9hZGluZ0RhdGEuZW1pdChsYXp5TG9hZEV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbExhenlMb2FkTGVuZ3RoID49IHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAqIHRoaXMuYnVmZmVyUm93UmF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQnVzeSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNob3VsZExhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBkaXNwbGF5aW5nIGxpc3QgaXRlbSBpbiB0aGUgdmlldyBwb3J0IGlzIG1vdmluZyBkdWUgdG8gc2Nyb2xsIGJhciBpcyBtb3ZpbmcsXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdG9wIG9mIHRoZSBzY3JvbGwgZGF0YSBlbGVtZW50LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGl0ZW0gb2YgdGhlIHNjcm9sbCBkYXRhIGVsZW1lbnQgd29uJ3QgYWx3YXlzIGFsaWdoIHRvIHRoZSB0b3Agb2YgdGhlIHZpZXcgcG9ydC5cclxuICAgICAgICAgICAgICAgIC8vIFNvIGhlcmUgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGl0ZW0uXHJcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgJSB0aGlzLnJvd0hlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiB3aGVuIHRoZSBkaXNwbGF5IGl0ZW0gbGlzdCBpcyBldmVuIGxvbmdlciB0aGFuIHRoZSBzY3JvbGwgY29udGFpbmVyIGhlaWdodCAqIHJvdyBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAvLyBpdCBtZWFucyB3aGVuIHdlIG1vdmUgMSBwaXhlbCBvZiB0aGUgc2Nyb2xsIGJhciwgdGhlIGRhdGEgdGFibGUgd2lsbCBtb3ZlIGJ5IGF0IGxlYXN0IG9uZSBpdGVtLlxyXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB3b24ndCBuZWVkIHRvIGhhbmRsZSBvZmZzZXQgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGNoYW5jZSB0byBzaG93IFwiaGFsZiBkYXRhIHRhYmxlIGl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgLy8gYXQgdGhlIHRvcCBib3JkZXIgb2YgdGhlIHNjcm9sbCBjb250YWluZXIgYnkgbW92aW5nIHRoZSBzY3JvbGwgYmFyIHZlcnkgbGl0dGxlLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggPiBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAqIHRoaXMucm93SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZVVJVmlydHVhbGl6YXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlJdGVtc1RvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wIC0gb2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtSW5kZXggPiBzdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0IC0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBzZWxlY3RlZEl0ZW1JbmRleCA8IHN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SXRlbXNUb3AgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoc2VsZWN0ZWRJdGVtSW5kZXggLSBzdGFydEluZGV4IC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ICsgMSkgKiB0aGlzLnJvd0hlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHNjcm9sbCBiYXIgaXMgbW92ZWQgdG8gdmVyeSBib3R0b20sIHdlIGp1c3Qgc2ltcGx5IGFsaWduIHRoZSBkaXNwbGF5ZWQgZGF0YSB0YWJsZSBpdGVtcydzIGJvdHRvbVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBib3R0b20gb2YgdGhlIGNvbnRhaW5lciB0byBtYWtlIHN1cmUgdGhlIGxhc3QgZGF0YSB0YWJsZSBpdGVtIGNhbiBiZSBkaXNwbGF5ZWQgY29tcGxldGVseS5cclxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdoZW4gdGhlIGxpc3QgaXMgc3VwZXIgbG9uZyAocmVmZXIgdG8gaG93IHdlIGNhbGN1bGF0ZSB0aGUgdG9wIG9mZnNldCBvZiB0aGUgc3VwZXIgbG9uZyBsaXN0KSxcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGFzdCBpdGVtIG1heSBub3QgYmUgcmVuZGVyZWQgY29tcGxldGVseS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA+IHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0ICogdGhpcy5yb3dIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3AgPj1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxIZWlnaHQgLSBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMucm93SGVpZ2h0IC8gMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0F0TGFzdFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlJdGVtc1RvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIE1hdGguY2VpbCh0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpICogdGhpcy5yb3dIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERhdGFTdHlsZVRvcCA9IHRoaXMuZGlzcGxheUl0ZW1zVG9wICsgJ3B4JztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9yY2VVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxBYm92ZURhdGFFbGVtZW50KE1hdGgucm91bmQoc3RhcnRJbmRleCAtIHJlbmRlcmVkSXRlbVN0YXJ0KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCghdGhpcy5jdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydCB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zW3N0YXJ0SW5kZXhdXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgKHRoaXMucmVuZGVyZWRJdGVtc1tzdGFydEluZGV4XS5kYXRhICE9PSB0aGlzLmN1cnJlbnRSZW5kZXJlZEl0ZW1JblZpZXdQb3J0LmRhdGEpKVxyXG4gICAgICAgICAgICAgICAgICAgIHx8IGZvcmNlVXBkYXRlIHx8IHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIGRpc3BsYXkgZGF0YSBhYm92ZSB0aGUgdmlldyBwb3J0IGFuZCBkaXNwbGF5IGRhdGEgaW4gYW5kIGJlbG93IHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd2hlbiB3ZSBwdXNoIG5ldyBpdGVtIGludG8gdGhlIGFycmF5cywgd2UgY3JlYXRlIGEgbmV3IG9iamVjdCB0byB3cmFwIHRoZSBkaXNwbGF5IGl0ZW0uXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSB3YW50IHRvIGZvcmNlIHRoZSBuZ0ZvciB0byByZS1yZW5kZXIgYWxsIHRoZSBpdGVtcyBpbnN0ZWFkIG9mIG9ubHkgcmUtcmVuZGVyIHRoZSB1cGRhdGVkIG9uZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBuZ0ZvciB3aWxsIHRyeSB0byBhZGp1c3QgRE9NIG9yZGVyIG9mIHRob3NlIGl0ZW1zIHdoaWNoIG1lc3NlcyB1cCB0aGUgc2Nyb2xsIGJhciBwb3NpdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG91bGRTY3JvbGwgPSB0aGlzLnNjcm9sbGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRoaXMuZWRpdGFibGUgfHwgdGhpcy5hdXRvUm93SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRTY3JvbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlbmRlcmVkSXRlbVN0YXJ0OyBpIDwgc3RhcnRJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBzdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY3VycmVudFJlbmRlcmVkSXRlbS50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zaG93QXNUcmVlID8gY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmRhdGEgOiBjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogY3VycmVudFJlbmRlcmVkSXRlbS5kZXB0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuOiBjdXJyZW50UmVuZGVyZWRJdGVtLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JblNldDogY3VycmVudFJlbmRlcmVkSXRlbS5wb3NpdGlvbkluU2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogY3VycmVudFJlbmRlcmVkSXRlbS5zZXRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogY3VycmVudFJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0Fib3ZlVmlld1BvcnQucHVzaCh7IGRhdGE6IHsgcGxhY2Vob2xkZXI6IHRydWUgfSwgdHlwZTogbnVsbCwgaW5kZXg6IG51bGwgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgcmVuZGVyZWRJdGVtRW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnNob3dBc1RyZWUgPyBjdXJyZW50UmVuZGVyZWRJdGVtLm5vZGUuZGF0YSA6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogY3VycmVudFJlbmRlcmVkSXRlbS5kZXB0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbjogY3VycmVudFJlbmRlcmVkSXRlbS5oYXNDaGlsZHJlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBjdXJyZW50UmVuZGVyZWRJdGVtLm5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5TZXQ6IGN1cnJlbnRSZW5kZXJlZEl0ZW0ucG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaXplOiBjdXJyZW50UmVuZGVyZWRJdGVtLnNldFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogY3VycmVudFJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNjcm9sbGFibGUgJiYgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA+IHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0LnB1c2goeyBkYXRhOiB7IHBsYWNlaG9sZGVyOiB0cnVlIH0sIHR5cGU6IG51bGwsIGluZGV4OiBudWxsIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydCA9IHRoaXMucmVuZGVyZWRJdGVtc1tzdGFydEluZGV4XTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNCdXN5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudEFyZWFIYXNGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzU21lRm9ybUZpZWxkKDxIVE1MRWxlbWVudD5kb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBqdW1wIGZyb20gZWRpdGFibGUgZm9ybSBmaWVsZHMgdG93YXJkcyB0aGUgcm93IHdoZW4gcmUtY2FsY3VsYXRpbmcgaXRlbXNcclxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcmVzZXQgdmFsaWRhdGlvbiBlcnJvcnMgb24gd2luZG93IHJlc2l6aW5nXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggIT09IHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzRmlsdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCA9IHRoaXMuaW50ZXJuYWxRdWVyeUVkaXRvcjtcclxuICAgICAgICBjb25zdCBoYXNWYWxpZFF1ZXJ5RWRpdG9yID0gKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCAmJiB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHMgJiZcclxuICAgICAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxJdGVtcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlciBpbnN0YW5jZW9mIFNlYXJjaEZvcm1GaWVsZENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaEZvcm1GaWVsZCA9IDxTZWFyY2hGb3JtRmllbGRDb21wb25lbnQ+dGhpcy5nbG9iYWxGaWx0ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJLZXl3b3JkID0gc2VhcmNoRm9ybUZpZWxkLnZhbHVlICYmIHNlYXJjaEZvcm1GaWVsZC52YWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJLZXl3b3JkID0gdGhpcy5nbG9iYWxGaWx0ZXJbJ3ZhbHVlJ10udG9Mb2NhbGVMb3dlckNhc2UoKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbHRlcktleXdvcmQgJiYgIWhhc1ZhbGlkUXVlcnlFZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHRoaXMuaW50ZXJuYWxJdGVtcy5tYXAoaXRlbSA9PiBpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmludGVybmFsSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZpcnN0IGZpbHRlciBieSB0aGUgbWFzdGVyIHZpZXcgZmlsdGVycyBpZiBhcHBsaWNhYmxlXHJcbiAgICAgICAgICAgICAgICAvLyBUaGVuIGZpbHRlciBieSB0aGUgY29sdW1uIGZpbHRlcnNcclxuICAgICAgICAgICAgICAgIC8vIE5vdGUgZmlsdGVyIGluc2lkZSB0aGUgY29sdW1uIGZpbHRlcnMgYXJlIGludGVyc2VjdGlvbnNcclxuICAgICAgICAgICAgICAgIC8vIENvbHVtbiBmaWx0ZXJzIG11bHRpcGxlIGNvbWJvYm94IHdpbGwgYmUgdW5pb25cclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmludGVybmFsSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pbnRlcm5hbEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERvIHRoZSBkYXRhdGFibGUgb3JpZ2luYWwgZmlsdGVycyBvbmx5IGlmIHVzZWQgaW4gbWFzdGVyIHZpZXcuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQW5kIGhhcyB2YWxpZCBmaWx0ZXJLZXl3b3JkXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyS2V5d29yZCAmJiB0aGlzLmZpbHRlcktleXdvcmQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIGNvbHVtbi5zZWFyY2hhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChpdGVtLCAodGhpcy5lZGl0YWJsZSA/ICdjb250ZW50LicgOiAnJykgKyBjb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5maWx0ZXJPdmVycmlkaW5nRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29sdW1uLmZpbHRlck92ZXJyaWRpbmdGdW5jdGlvbih2YWx1ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhc2VTZW5zaXRpdmVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLmluZGV4T2YodGhpcy5maWx0ZXJLZXl3b3JkKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmlsdGVyS2V5d29yZCBpcyBlbXB0eVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB0aGlzIGRhdGF0YWJsZSBpcyBub3QgdXNlZCBpbiBtYXN0ZXIgdmlld1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGZvdW5kIGJ5IGRhdGF0YWJsZSBvcmlnaW5hbCBmaWx0ZXIoZnJvbSBtYXN0ZXIgdmlldylcclxuICAgICAgICAgICAgICAgICAgICAvLyBvciBpZiBvcmlnaW5hbCBmaWx0ZXIgaXMgZW1wdHkobm90IGluIG1hc3RlciB2aWV3KVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVmFsaWRRdWVyeUVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIGJ5IHF1ZXJ5IGVkaXRvciBpZiBhcHBsaWVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMucXVlcnlFZGl0b3JGaWx0ZXJNYWluKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgc2F0aXNmeSBib3RoIG9yaWdpbmFsIGZpbHRlcnMgYW5kIHRoZSBxdWVyeSBlZGl0b3IgZmlsdGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVBcmlhQXR0cmlidXRlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlQXJpYUxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGhpcy50YWJsZUFyaWFMYWJlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMudGFibGVBcmlhTGFiZWxsZWRCeSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgdGhpcy50YWJsZUFyaWFMYWJlbGxlZEJ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSB8fCB0aGlzLnNlbGVjdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgICAgICdhcmlhLW11bHRpc2VsZWN0YWJsZScsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRyZWVOb2RlKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0sIGRlcHRoOiBudW1iZXIsIHBhcmVudFNoYWRvd1RyZWVOb2RlOiBhbnksIHBvc2l0aW9uSW5TZXQ6IG51bWJlciwgc2V0U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJUcmVlTm9kZVRvZ2dsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuZ2V0VHJlZU5vZGVEYXRhSWRlbnRpdHkobm9kZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRyZWVUb2dnbGVTdGF0dXMuaGFzT3duUHJvcGVydHkoaWRlbnRpdHkpKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gdGhpcy50cmVlVG9nZ2xlU3RhdHVzW2lkZW50aXR5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBub2RlLmNhbkV4cGFuZCB8fCBub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMDtcclxuICAgICAgICBub2RlLmlzTGVhZiA9ICFoYXNDaGlsZHJlbjtcclxuXHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWRJdGVtID0ge1xyXG4gICAgICAgICAgICBkYXRhOiBub2RlLmRhdGEsXHJcbiAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGUsXHJcbiAgICAgICAgICAgIGRlcHRoOiBkZXB0aCxcclxuICAgICAgICAgICAgaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLFxyXG4gICAgICAgICAgICBub2RlOiBub2RlLFxyXG4gICAgICAgICAgICBpbmRleDogdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgcG9zaXRpb25JblNldDogcG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgc2V0U2l6ZTogc2V0U2l6ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2gocmVuZGVyZWRJdGVtKTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFNoYWRvd1RyZWVOb2RlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiByZW5kZXJlZEl0ZW0sXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFpbnRhaW4gYSBzaGFkb3cgdHJlZSB0byBoYW5kbGUgdGhlIFwic2FtZSBsZXZlbCBvbmx5XCIgc29ydGluZy5cclxuICAgICAgICBwYXJlbnRTaGFkb3dUcmVlTm9kZS5jaGlsZHJlbi5wdXNoKGN1cnJlbnRTaGFkb3dUcmVlTm9kZSk7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCAmJiBub2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGxldCBjdXJyZW50UG9zaXRpb25JblNldCA9IDE7XHJcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZShjaGlsZCwgZGVwdGggKyAxLCBjdXJyZW50U2hhZG93VHJlZU5vZGUsIGN1cnJlbnRQb3NpdGlvbkluU2V0LCBub2RlLmNoaWxkcmVuLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25JblNldCsrO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVJlbmRlckl0ZW1zKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmdyb3VwQ29sdW1uICYmIHRoaXMuZ3JvdXBDb2x1bW4uZmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cEtleXMgPSB7fTtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBzOiB7IGdyb3VwOiBEYXRhVGFibGVEYXRhSXRlbSwgaXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdIH1bXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBTb3J0TW9kZSAhPT0gRGF0YVRhYmxlU29ydE1vZGUuTm9uZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5ncm91cENvbHVtbi5zb3J0YWJsZSA9PT0gJ2N1c3RvbScgP1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBDb2x1bW4uY29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcykgOiB0aGlzLmRlZmF1bHRTb3J0Q29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0RGlyZWN0aW9uID0gdGhpcy5ncm91cFNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQgPyAxIDogLTE7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYSwgYiwgdGhpcy5ncm91cENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwRGF0YSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoaXRlbSwgdGhpcy5ncm91cENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdyb3VwS2V5c1tncm91cERhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2goeyBncm91cDogZ3JvdXBEYXRhLCBpdGVtczogZ3JvdXBJdGVtcyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cEtleXNbZ3JvdXBEYXRhXSA9IGdyb3VwSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3VwRGF0YV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3VwRGF0YV0gPSB0aGlzLmRlZmF1bHRHcm91cFRvZ2dsZUV4cGFuZGVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwS2V5c1tncm91cERhdGFdLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZ3JvdXBzW2ldLmdyb3VwLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JblNldDogaSArIDEsXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogZ3JvdXBzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cHNbaV0uZ3JvdXBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRQb3NpdGlvbkluU2V0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBncm91cHNbaV0uaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBJdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkluU2V0OiBjdXJyZW50UG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpemU6IGdyb3Vwc1tpXS5pdGVtcy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbkluU2V0Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5zaGFkb3dUcmVlID0geyBkYXRhOiBudWxsLCBjaGlsZHJlbjogW10gfTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UG9zaXRpb25JblNldCA9IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZShub2RlLCAwLCB0aGlzLnNoYWRvd1RyZWUsIGN1cnJlbnRQb3NpdGlvbkluU2V0LCB0aGlzLml0ZW1zLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uSW5TZXQrKztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlckl0ZW0gPSA8RGF0YVRhYmxlUmVuZGVyZWRJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4KyssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuZmlsdGVyZWRJdGVtc1tpXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2gocmVuZGVySXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgrKyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbmRlckl0ZW1zKHByZXZlbnRTY3JvbGxpbmc/OiBib29sZWFuLCBmb3JjZVVwZGF0ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9ICF0aGlzLml0ZW1zO1xyXG5cclxuICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXIoKTtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlUmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlcyBob3cgaGlnaCB0aGUgc2Nyb2xsIGRhdGEgZGl2IHNob3VsZCBiZS5cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zICYmICF0aGlzLmRpc2FibGVVSVZpcnR1YWxpemF0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoICogdGhpcy5yb3dIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgaGVpZ2h0IGlzIHRvbyBtdWNoLCB3ZSBuZWVkIHRvIGxpbWl0ZWQgdGhlIGhlaWdodCBvdGhlcndpc2UgTWljcm9zb2Z0IEVkZ2Ugd2lsbCBjcmFzaC5cclxuICAgICAgICAgICAgLy8gSXQncyBvayBpZiB0aGUgc2Nyb2xsIGRhdGEgZGl2IGhlaWdodCBkb2Vzbid0IGVxdWFsIHRvIHRoZSBhY3R1YWwgdG90YWwgZGF0YSB0YWJsZSBoZWlnaHRcclxuICAgICAgICAgICAgLy8gYmVjYXVzZSBhbnl3YXkgd2UgdXNlIHRoZSByYXRpbyBvZiBzY3JvbGwgZGF0YSBkaXYgaGVpZ2h0IHRvIGFjdHVhbCB0b3RhbCBsaXN0IGl0ZW0gaGVpZ2h0XHJcbiAgICAgICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGUgc2Nyb2xsaW5nIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgZGF0YS5cclxuICAgICAgICAgICAgdGhpcy5oYXNMb25nTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gdGhpcy5tYXhBY3R1YWxTY3JvbGxEYXRhRWxlbWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaW5kIGEgaGVpZ2h0IG5lYXIgdGhlIG1heEFjdHVhbFNjcm9sbERhdGFFbGVtZW50SGVpZ2h0IHdoaWNoIGNhbiBiZSBkaXZpZGVkIGV4YWN0bHkgYnkgdGhlIHJvdyBoZWlnaHQuXHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2hlbiB3ZSBjYWxjdWF0ZSB0aGUgc2Nyb2xsaW5nIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgZGF0YSxcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBmbG9hdGluZyBwYXJ0IG9mIHRoZSBoZWlnaHQgd2lsbCBpbXBhY3QgdGhlIGFjY3VyYWN5IG9mIHRoZSBjYWxjdWxhdGlvbiByZXN1bHQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0xvbmdMaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5tYXhBY3R1YWxTY3JvbGxEYXRhRWxlbWVudEhlaWdodCAvIHRoaXMucm93SGVpZ2h0KSAqIHRoaXMucm93SGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zb3J0SXRlbXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUgJiYgdGhpcy5lZGl0YWJsZUF1dG9OZXdSb3cpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVySXRlbUZvck5ld0RhdGFJdGVtID0gPERhdGFUYWJsZVJlbmRlcmVkSXRlbT57XHJcbiAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IDxFZGl0YWJsZURhdGFJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICBpZDogTXNmdFNtZS5uZXdHdWlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkFsZXJ0czoge30sXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmVkaXRhYmxlTmV3RGF0YUl0ZW0gfHwge30pKSxcclxuICAgICAgICAgICAgICAgICAgICBpc05ld1JvdzogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuTm9ybWFsLFxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogW11cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKHJlbmRlckl0ZW1Gb3JOZXdEYXRhSXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KHByZXZlbnRTY3JvbGxpbmcsIGZvcmNlVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVNjcm9sbEFib3ZlRGF0YUVsZW1lbnQocmVuZGVyZWRJdGVtQWJvdmVWaWV3UG9ydExlbmd0aD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQgPSB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gT25seSBkaXNwbGF5IHRoZSBzY3JvbGwgYWJvdmUgZGF0YSBlbGVtZW50IHdoZW4gaXQncyBoZWlnaHQgaXMgYXZhaWxhYmxlLlxyXG4gICAgICAgIC8vIEl0cyBoZWlnaHQgbWF5IG5vdCBiZSByZWFkeSB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIHJlbmRlcmVkIGZpcnN0IHRpbWUgYW5kIHRoZSBzY3JvbGwgdG9wIGlzIDAuXHJcbiAgICAgICAgaWYgKCF0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgJiYgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ID0gc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVuZGVyZWRJdGVtQWJvdmVWaWV3UG9ydExlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgPSB0aGlzLnJvd0hlaWdodCAqIHJlbmRlcmVkSXRlbUFib3ZlVmlld1BvcnRMZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWJvdmVEYXRhU3R5bGVUb3AgPSB0aGlzLmRpc3BsYXlJdGVtc1RvcCAtIHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCArICdweCc7XHJcbiAgICAgICAgICAgIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzY3JvbGxBYm92ZURhdGFFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxheW91dENoYW5nZWQoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgem9vbVNjYWxlSCA9ICh3aW5kb3cuc2NyZWVuLndpZHRoIC0gd2luZG93LmlubmVyV2lkdGgpIC8gd2luZG93LnNjcmVlbi53aWR0aDtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFdpZHRoID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IE1hdGgubWF4KGN1cnJlbnRXaWR0aCArIHpvb21TY2FsZUggKiBjdXJyZW50V2lkdGgsIGN1cnJlbnRXaWR0aCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFjdHVhbENvbHVtblByb2Nlc3NlZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxBYm92ZURhdGFFbGVtZW50ID0gdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoZmFsc2UsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZUhvcml6b250YWwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEFzIHRoZSB1c2VyIHpvb21zIGluIGFuZCBvdXQsIHdlIG5lZWQgdG8gZW5hYmxlIGhvcml6b250YWwgc2Nyb2xsaW5nIGluIHRoZVxyXG4gICAgICAgICAgICAgICAgLy8gY29udGFpbmVyIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgIC8vIFRvIGFjY29tbW9kYXRlIGRpc3BsYXkgb2YgYmlnZ2VyIHpvb21lZCBpbiB0ZXh0LCB3ZSBhbHNvIGFkanVzdCB0aGUgd2lkdGggb2YgdGhlXHJcbiAgICAgICAgICAgICAgICAvLyBpbm5lciB0YWJsZSBjb250YWluZXJcclxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgdGVjaG5pcXVlIHdpbGwgbm90IHdvcmsgZm9yIE1vemlsbGEsIHdob3NlIHZhbHVlIG9mIHdpbmRvdy5pbm5lcldpZHRoIGFuZCB3aW5kb3cuc2NyZWVuLndpZHRoIHJlbWFpbnNcclxuICAgICAgICAgICAgICAgIC8vICAgICAgIGNvbnN0YW50XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnb3ZlcmZsb3cteCcsIGBhdXRvYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyxcclxuICAgICAgICAgICAgICAgICAgICBgJHthZGp1c3RlZFdpZHRofXB4YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLFxyXG4gICAgICAgICAgICAgICAgICAgIGAke2FkanVzdGVkV2lkdGh9cHhgKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFdpZHRoID0gdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFdlIHN0b3JlIHRoZSBvcmlnaW5hbCByYXRpb3Mgb2YgdGhlIGNvbHVtbiB3aWR0aHMgYXMgcGVyY2VudGFnZXMgb2YgdGhlIG9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi53aWR0aC5lbmRzV2l0aCgnJScpICYmICFjb2x1bW4ud2lkdGhQZXJjZW50YWdlKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbFdpZHRoID0gRGF0YVRhYmxlQ29tcG9uZW50LnB4Q29udmVydGVyLmNvbnZlcnRUb1B4KGNvbHVtbi53aWR0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgZ2V0IHJhdGlvcyBmb3IgdW5pdHMgdGhhdCB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IGNvbnZlcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbFdpZHRoICYmICFpc05hTihjb2xXaWR0aCkgJiYgb3JpZ2luYWxXaWR0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UgPSBjb2xXaWR0aCAvIG9yaWdpbmFsV2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFRoZSB0ZW1wbGF0ZSBhcHBsaWVzIHRoZSB3aWR0aCByYXRpbyBvZiBlYWNoIGNvbHVtbiBvbiB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ud2lkdGggPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAqIGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFdoZW4gbGF5b3V0IGlzIGNoYW5nZWQsIHRoZSBcImRpc3BsYXkgYWJvdmUgdmlldyBwb3J0XCIgaXRlbSBsaXN0IGRhdGEgc291cmNlIGlzIHVwZGF0ZWRcclxuICAgICAgICAgICAgLy8gYnV0IHRoZSBodG1sIGlzIG5vdCB1cGRhdGVkIHlldC4gU28gdGhlIFVJIG9mIHRoZSBcImRpc3BsYXkgYWJvdmUgdmlldyBwb3J0XCIgaXMgbm90IGdvb2QuXHJcbiAgICAgICAgICAgIC8vIFNvIGhpZGUgdGhlIFVJIGZvciBub3cgYW5kIGFkanVzdCBpdCBpbiBzZXRUaW1lb3V0LlxyXG4gICAgICAgICAgICBzY3JvbGxBYm92ZURhdGFFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxBYm92ZURhdGFFbGVtZW50KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihub2RlOiBUcmVlTm9kZURhdGFJdGVtLCBzZWxlY3RlZDogYm9vbGVhbiwgc2tpcEV2ZW50PzogYm9vbGVhbiwgc2tpcExpbmtTZWxlY3Rpb24/OiBib29sZWFuLFxyXG4gICAgICAgIGl0ZW1zVG9TZWxlY3Q/OiBUcmVlTm9kZURhdGFJdGVtW10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXRlbXNUb1NlbGVjdCkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZCA9IGl0ZW1zVG9TZWxlY3QuaW5kZXhPZihub2RlLmRhdGEpICE9PSAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24gfHxcclxuICAgICAgICAgICAgKHNraXBMaW5rU2VsZWN0aW9uIHx8ICFub2RlLmNoaWxkcmVuIHx8ICFub2RlLmNoaWxkcmVuLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ucHVzaChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiBub2RlLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uc3BsaWNlKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihub2RlKSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBub2RlLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgaWYgKCFza2lwTGlua1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvdWxkU2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW5baV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuc2VsZWN0ZWQgPSBzaG91bGRTZWxlY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCghc2tpcExpbmtTZWxlY3Rpb24gfHwgaXRlbXNUb1NlbGVjdCkgJiYgbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkTm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZE5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGNoaWxkTm9kZSwgc2VsZWN0ZWQsIHNraXBFdmVudCwgc2tpcExpbmtTZWxlY3Rpb24sIGl0ZW1zVG9TZWxlY3QpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnbkNvbnRlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyVGFibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRyeSB0byBmb2N1cyBvbiByb3cgZnVuY3Rpb247IGlmIHRoZXJlIGFyZSBubyByZWNvcmRzLCB0aGUgbm8gcmVjb3JkcyBtZXNzYWdlIGlzIHNlbGVjdGVkXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggT25seSBwYXNzIGluIGluZGV4IGlmIG5lZWRzIGZvY3VzIG9ubHlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzU2VsZWN0ZWRSb3coaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVuZGVyZWRJdGVtcyB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXIpO1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJvdzogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChpbmRleCkgJiYgaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoYC5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YVtkYXRhLXJlbmRlcmVkLWl0ZW0taW5kZXg9XCIke2luZGV4fVwiXWApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKE1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQocm93KSkge1xyXG4gICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YS5zbWUtdGFibGUtcm93LWFjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lclRvcCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBjb250YWluZXJCb3R0b20gPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJDbGllbnRSZWN0ID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKVswXTtcclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lckNsaWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lclRvcCA9IGNvbnRhaW5lckNsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyQm90dG9tID0gY29udGFpbmVyQ2xpZW50UmVjdC5ib3R0b207XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBpc1Jvd0luVmlld1BvcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvd1RvcCA9IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dDbGllbnRSZWN0ID0gcm93LmdldENsaWVudFJlY3RzKClbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAocm93Q2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1RvcCA9IHJvd0NsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlzUm93SW5WaWV3UG9ydCA9IHJvd1RvcCA+PSBjb250YWluZXJUb3AgJiYgcm93VG9wIDwgY29udGFpbmVyQm90dG9tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyb3cgJiYgIWlzUm93SW5WaWV3UG9ydCAmJiBpbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgcm93IGlzIG5vdCBpbiB2aWV3cG9ydCwganVzdCBmb2N1cyB0aGUgZmlyc3QgdmlzaWJsZSByb3cgaW4gdGhlIHZpZXdwb3J0LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlbiBkYXRhIHRhYmxlIHdpbGwgc3RpbGwgYmUgYWJsZSB0byByZWNlaXZlIGtleWJvYXJkIGV2ZW50LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFja3VwUm93cyA9IHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLXJvdy5zbWUtdGFibGUtcm93LWRhdGEnKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFja3VwUm93cy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dDbGllbnRSZWN0ID0gYmFja3VwUm93c1tpXS5nZXRDbGllbnRSZWN0cygpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3dDbGllbnRSZWN0LnRvcCA+IGNvbnRhaW5lclRvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBiYWNrdXBSb3dzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA+PSAwICYmICF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IDxIVE1MRWxlbWVudD5yb3cucXVlcnlTZWxlY3RvckFsbCgnLnNtZS10YWJsZS10ZCcpW3RoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50XTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50ID0gRG9tLmdldEZpcnN0Rm9jdXNhYmxlRGVzY2VuZGVudChjZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWRpdGFibGUgZGF0YSB0YWJsZSwgYmVjYXVzZSBvZiB0aGUgZGVzaWduXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGZvY3VzIG9uIHRoZSByb3cgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb3cuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkVsZW1lbnRGb2N1c2luZyhldmVudDogRWxlbWVudEZvY3VzaW5nRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Wm9uZSA9PT0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdEZvY3VzQmVoYXZpb3IoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0RXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldEVsZW1lbnQgJiYgZXZlbnQudGFyZ2V0RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc21lLWxhc3QtZm9jdXNhYmxlLXNoYWRvdy1lbGVtZW50JylcclxuICAgICAgICAgICAgJiYgZXZlbnQudGFyZ2V0RWxlbWVudCA9PT0gdGhpcy5sYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Rm9jdXNCZWhhdmlvcigpO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlWm9uZSA9PT0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50IHx8IGV2ZW50LnNvdXJjZVpvbmUgPT09IHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Rm9jdXNhYmxlRWxlbWVudCA9IERvbS5nZXROZXh0Wm9uZUVsZW1lbnQoZXZlbnQudGFyZ2V0RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5leHRGb2N1c2FibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c09uY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdEV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsVGFyZ2V0Wm9uZSA9IERvbS5nZXRBbmNlc3RvclpvbmUobmV4dEZvY3VzYWJsZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIENvcmVFbnZpcm9ubWVudC5hY2Nlc3NpYmlsaXR5TWFuYWdlci5wcm9jZXNzRWxlbWVudEZvY3VzaW5nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5uYXRpdmVFdmVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEZvY3VzYWJsZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldFpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFRhcmdldFpvbmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHRFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgodGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0NvbHVtbnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzQWN0dWFsQ29sdW1ucygpO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzQ29sdW1uc01haW4oKSB7XHJcbiAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1jb2xjb3VudCcsXHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5sZW5ndGggKyAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uID8gMSA6IDApKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1uUHJvY2Vzc2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NBY3R1YWxDb2x1bW5zKCkge1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucyA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goc291cmNlQ29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDb2x1bW4gIT09IHRoaXMuZ3JvdXBDb2x1bW4gJiYgIXNvdXJjZUNvbHVtbi5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMucHVzaChzb3VyY2VDb2x1bW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc3NDb2x1bW5zQnlPcmRlcihvcmRlcjogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29sdW1uc09yZGVyID0gb3JkZXI7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICAgICAgICBvcmRlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5maWVsZCA9PT0gZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDb2x1bW4gJiYgc291cmNlQ29sdW1uICE9PSB0aGlzLmdyb3VwQ29sdW1uICYmICFzb3VyY2VDb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLnB1c2goc291cmNlQ29sdW1uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcmRlciAmJiBvcmRlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ29sdW1ucygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgZnJvbSB1cGdyYWRpbmcgZGF0YSB0YWJsZSB0byBzdXBwb3J0IGVkaXRhYmxlIGRhdGEgdGFibGVcclxuICAgICAqIFRoZSBpZGVhIGlzIHRvIHVzZSB0aGUgZGF0YSB0YWJsZSdzIGhlYWRlciB3aWR0aCB0byBiZSBhcHBsaWVkIG9uIHRoZSBkYXRhIHRhYmxlIGJvZHkgY29sdW1ucy5cclxuICAgICAqIFdoZW4gbm90IHNob3dpbmcgaGVhZGVycywgbmVlZCB0byB1c2UgdGhlIGhlYWRlcidzIHdpZHRoIHRvIGJlIGFwcGxpZWQgdG8gdGQgYXMgd2VsbC5cclxuICAgICAqL1xyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRoRWxlbWVudHMgPSB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLWNhcHRpb24uc21lLXRhYmxlLWNvbHVtbi1oZWFkZXInKTtcclxuICAgICAgICBpZiAodGhFbGVtZW50cyAmJiB0aEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFjdHVhbENvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1uc1tpXS5kb21XaWR0aCA9IHRoRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRJc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgb25lIG1vcmUgdGljayBzbyB0aGF0IHRoZSBsb2FkaW5nIHdoZWVsIGNhbiBzdGFuZCBvbmUgbW9yZSBodG1sIHJlbmRlcmluZyBsaWZlIGN5Y2xlXHJcbiAgICAgKiBUaGlzIGZpeGVzIGEgYnVnIHJlbGF0ZWQgdG8gZGF0YSB0YWJsZSBvbiBsb2FkIG1pcy1hbGlnbmVkXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgYm9vbGVhblxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHJpdmF0ZSBzZXRJc0NvbHVtbldpZHRoQ2FsY3VsYXRlZChpbnB1dDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWQgPSBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4QnlTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEuY29udGVudCA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFRyZWVOb2RlRGF0YUlkZW50aXR5KG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbikge1xyXG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oY3VycmVudE5vZGUuZGF0YSkgKyAnXFxcXCcgKyByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbGVjdEFsbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMucmVuZGVyZWRJdGVtcy5zbGljZSgpLm1hcChpdGVtID0+IGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlRdWVyeUVkaXRvcih2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3Q6IFF1ZXJ5RGF0YSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxRdWVyeUVkaXRvciA9IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDtcclxuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgcXVlcnlFZGl0b3JGaWx0ZXJNYWluKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDogUXVlcnlEYXRhLCBpdGVtOiBEYXRhVGFibGVEYXRhSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcXVlcnlFZGl0b3JJdGVtID0gdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgdGhpcy5hY3R1YWxDb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHF1ZXJ5RWRpdG9ySXRlbS5jb2x1bW4udmFsdWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmFjdHVhbENvbHVtbnMuZmlsdGVyKChjb2wpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sLmZpZWxkID09PSBmaWVsZDtcclxuICAgICAgICAgICAgICAgIH0pWzBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoaXRlbSwgY29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uZmlsdGVyT3ZlcnJpZGluZ0Z1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbHVtbi5maWx0ZXJPdmVycmlkaW5nRnVuY3Rpb24odmFsdWUsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYXNlU2Vuc2l0aXZlRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRGbG9hdFZhbCA9IHBhcnNlRmxvYXQocXVlcnlFZGl0b3JJdGVtLnZhbHVlLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsRmxvYXRWYWwgPSBwYXJzZUZsb2F0KHZhbHVlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRTdHJpbmdWYWwgPSBxdWVyeUVkaXRvckl0ZW0udmFsdWUudmFsdWUudG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxTdHJpbmdWYWwgPSB2YWx1ZS50b1N0cmluZygpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeUVkaXRvckl0ZW0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxdWVyeUVkaXRvckl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5TaW5nbGVEcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLlRleHRJbnB1dCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocXVlcnlFZGl0b3JJdGVtLm9wZXJhbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFF1ZXJ5RGF0YU9wZXJhbmQuRXE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4ucXVlcnlFZGl0b3JFcXVhbElzQ29udGFpbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFN0cmluZ1ZhbC5pbmRleE9mKHRhcmdldFN0cmluZ1ZhbCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGZpbHRlciBzdHJpbmcgaXMgZW1wdHkgdGhlbiB0cmVhdCBhcyAnRXF1YWxJc0NvbnRhaW4nIHRvIHJlZnJlc2ggZGF0YSB0YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFN0cmluZ1ZhbCAhPT0gdGFyZ2V0U3RyaW5nVmFsICYmICFNc2Z0U21lLmlzRW1wdHkodGFyZ2V0U3RyaW5nVmFsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRdWVyeURhdGFPcGVyYW5kLkd0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRhcmdldEZsb2F0VmFsIHx8IHRhcmdldEZsb2F0VmFsID09PSAwKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdHVhbEZsb2F0VmFsIHx8IGFjdHVhbEZsb2F0VmFsID09PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFyZ2V0RmxvYXRWYWwgPD0gYWN0dWFsRmxvYXRWYWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFF1ZXJ5RGF0YU9wZXJhbmQuTHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGFyZ2V0RmxvYXRWYWwgfHwgdGFyZ2V0RmxvYXRWYWwgPT09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYWN0dWFsRmxvYXRWYWwgfHwgYWN0dWFsRmxvYXRWYWwgPT09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YXJnZXRGbG9hdFZhbCA+PSBhY3R1YWxGbG9hdFZhbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlEYXRhT3BlcmFuZC5OcTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWN0dWFsU3RyaW5nVmFsICE9PSB0YXJnZXRTdHJpbmdWYWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgZXFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFN0cmluZ1ZhbC5pbmRleE9mKHRhcmdldFN0cmluZ1ZhbCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLk11bHRpU2VsZWN0RHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdGhpcy5xdWVyeUVkaXRvckZpbHRlckJ5TXVsdGlwbGVTZWxlY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCwgcXVlcnlFZGl0b3JJdGVtLCBhY3R1YWxTdHJpbmdWYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLlRpbWVzcGFuRHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdGhpcy5xdWVyeUVkaXRvckZpbHRlckJ5VGltZXNwYW5Ecm9wZG93bihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LCBxdWVyeUVkaXRvckl0ZW0sIGFjdHVhbFN0cmluZ1ZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZm91bmQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBxdWVyeUVkaXRvckZpbHRlckJ5VGltZXNwYW5Ecm9wZG93bihcclxuICAgICAgICB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3Q6IFF1ZXJ5RGF0YSwgcXVlcnlFZGl0b3JJdGVtOiBRdWVyeURhdGFJdGVtLCBhY3R1YWxTdHJpbmdWYWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gcXVlcnlFZGl0b3JJdGVtLmNvbHVtbi52YWx1ZTtcclxuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XHJcbiAgICAgICAgbG9vcDE6XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50c1tpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLlRpbWVzcGFuRHJvcGRvd24gJiYgaXRlbS5jb2x1bW4gJiYgaXRlbS5jb2x1bW4udmFsdWUgPT09IGZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZS52YWx1ZSAmJiBpdGVtLnZhbHVlLnZhbHVlLnN0YXJ0ICYmIGl0ZW0udmFsdWUudmFsdWUuZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpdGVtLnZhbHVlLnZhbHVlLnN0YXJ0LmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBpdGVtLnZhbHVlLnZhbHVlLmVuZC5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsID0gbmV3IERhdGUoYWN0dWFsU3RyaW5nVmFsKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDw9IGFjdHVhbCAmJiBhY3R1YWwgPD0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3AxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcXVlcnlFZGl0b3JGaWx0ZXJCeU11bHRpcGxlU2VsZWN0aW9uKFxyXG4gICAgICAgIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDogUXVlcnlEYXRhLCBxdWVyeUVkaXRvckl0ZW06IFF1ZXJ5RGF0YUl0ZW0sIGFjdHVhbFN0cmluZ1ZhbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gcXVlcnlFZGl0b3JJdGVtLmNvbHVtbi52YWx1ZTtcclxuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XHJcbiAgICAgICAgbG9vcDE6XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50c1tpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLk11bHRpU2VsZWN0RHJvcGRvd24gJiYgaXRlbS5jb2x1bW4gJiYgaXRlbS5jb2x1bW4udmFsdWUgPT09IGZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZW0udmFsdWUudmFsdWUubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRTdHJpbmdWYWwgPSBpdGVtLnZhbHVlLnZhbHVlW2pdLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsU3RyaW5nVmFsID09PSB0YXJnZXRTdHJpbmdWYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBpZEJhZyB1c2VkIGJ5IHRoaXMgY29tcG9uZW50IHRvIHN0b3JlIHVuaXF1ZSBlbGVtZW50IGlkcy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUlkQmFnKCk6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpcnN0RGF0YUNvbHVtbjogJycsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZSB0cmVlIGdyaWQgYWNjZXNzaWJpbGl0eSBkb2N1bWVudGF0aW9uczogaHR0cHM6Ly93aWtpLm1vemlsbGEub3JnL0FjY2Vzc2liaWxpdHkvVHJlZUdyaWRcclxuICovXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLXRyZWUtdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBEYXRhVGFibGVDb21wb25lbnQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdUcmVlVGFibGVDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLnNob3dBc1RyZWUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtdHJlZS10YWJsZSdcclxuICAgICAgICBdKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IHJvbGU9XCJwcmVzZW50YXRpb25cIiBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXIgc21lLWZvY3VzLXpvbmUgc21lLWRhdGEtdGFibGUtdHJhbnNpdGlvblwiICNoZWFkZXJcclxuICBbY2xhc3Muc21lLXNoYWRvdy1zY3JvbGxlZC1jb250ZW50XT1cImlzU2Nyb2xsZWREb3duXCIgW2NsYXNzLnNtZS10YWJsZS1tdWx0aS1zZWxlY3RdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZSdcIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCIgW2NsYXNzLnNtZS10YWJsZS1pbmRlbnRlZF09XCJzaG93TGVmdE1hcmdpblwiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1zZWxlY3QtYWxsLWVuYWJsZWRdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgc2hvd0FsbEl0ZW1DaGVja2JveFwiPlxyXG4gIDwhLS0gQWNjb3JkaW5nIHRvIHRoZSBhY2Nlc3NpYmlsaXR5IHRlYW0sIGRhdGEtdGFibGUgaGVhZGVycyBzaG91bGQgYmUgYWNjZXNzaWJsZSBieSBrZXlib2FyZFxyXG4gIGFuZCB0aGUgcmVzaXplciBzaG91bGQgYWxzbyBiZSBhY2Nlc3NlZCBieSBrZXlib2FyZC4tLT5cclxuICA8ZGl2ICNoZWFkZXJUYWJsZSBjbGFzcz1cInNtZS10YWJsZSBzbWUtdGFibGUtdmlydHVhbGl6ZWRcIiByb2xlPVwicm93Z3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtcm93IHNtZS1hcnJhbmdlLXN0YWNrLWggc21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiIHJvbGU9XCJyb3dcIlxyXG4gICAgICAoa2V5ZG93bik9XCJvbkhlYWRlclRhYmxlUHJlc3NlZCgkZXZlbnQpXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2FwdGlvblwiIFthdHRyLnJvbGVdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZSc/J2NvbHVtbmhlYWRlcic6J3ByZXNlbnRhdGlvbidcIlxyXG4gICAgICAgIGRhdGEtdXRhLWlkPVwiY2hlY2tib3hDb2x1bW5cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94IHNtZS10YWJsZS1oZWFkZXItY2hlY2tib3hcIlxyXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiBzaG93QWxsSXRlbUNoZWNrYm94ICYmIHNob3dIZWFkZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICA8aW5wdXQgc21lLWxpbnQtZGlzYWJsZS1zZWxmIHR5cGU9XCJjaGVja2JveFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0QWxsSXRlbUNoZWNrQm94QXJpYUxhYmVsKClcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaG91bGRBbGxJdGVtQ2hlY2tCb3hDaGVja2VkKClcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwic2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpPyd0cnVlJzonZmFsc2UnXCIgKGNoYW5nZSk9XCJvbkFsbEl0ZW1DaGVja0JveENsaWNrZWQoKVwiIC8+XHJcbiAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgYWN0dWFsQ29sdW1uczsgbGV0IGNvbEluZGV4ID0gaW5kZXhcIiBbYXR0ci5maWVsZF09XCJjb2x1bW4uZmllbGRcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2x1bW4ud2lkdGh9XCJcclxuICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jYXB0aW9uIHNtZS10YWJsZS1jb2x1bW4taGVhZGVyIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG8ge3tjb2x1bW4uc3R5bGVDbGFzc319XCJcclxuICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCIgW2F0dHIuZGF0YS11dGEtaWRdPVwiY29sdW1uLnV0YUlkXCIgW2F0dHIuY29sdW1uLWluZGV4XT1cImNvbEluZGV4XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc29ydGFibGUhPSdmYWxzZScgJiYgc2hvd0hlYWRlclwiXHJcbiAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXItY2VsbCBzbWUtZm9jdXMtem9uZVwiIChjbGljayk9XCJjbGlja0NvbHVtbihjb2x1bW4pXCIgcm9sZT1cImNvbHVtbmhlYWRlclwiXHJcbiAgICAgICAgICBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHRhYmluZGV4PVwiMFwiIFthdHRyLmFyaWEtc29ydF09XCJjb2x1bW5Tb3J0U2V0dGluZ3NbY29sdW1uLmhlYWRlcl1cIj5cclxuICAgICAgICAgIDxzcGFuPnt7Y29sdW1uLmhlYWRlcn19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtbWFyZ2luLWxlZnQteHhzXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi11cCc6Y29sdW1uLnNvcnRNb2RlPT09c29ydE1vZGVFbnVtLkFzY2VuZCwnc21lLWljb24tZG93bic6Y29sdW1uLnNvcnRNb2RlPT09c29ydE1vZGVFbnVtLkRlc2NlbmR9XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhKGNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc29ydGFibGUhPSdmYWxzZScpICYmIHNob3dIZWFkZXJcIiBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXItY2VsbFwiXHJcbiAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuPnt7Y29sdW1uLmhlYWRlcn19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtbWFyZ2luLWxlZnQteHhzXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi11cCc6Y29sdW1uLnNvcnRNb2RlPT09c29ydE1vZGVFbnVtLkFzY2VuZCwnc21lLWljb24tZG93bic6Y29sdW1uLnNvcnRNb2RlPT09c29ydE1vZGVFbnVtLkRlc2NlbmR9XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0hlYWRlclwiIGNsYXNzPVwic21lLXRhYmxlLWhlYWRlci1jZWxsXCIgcm9sZT1cImNvbHVtbmhlYWRlclwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzbWUtcmVzaXplciB0YWJpbmRleD1cIjBcIiAqbmdJZj1cImNvbEluZGV4IT09YWN0dWFsQ29sdW1ucy5sZW5ndGgtMSAmJiBzaG93SGVhZGVyXCJcclxuICAgICAgICAgIHJlc2l6ZXJIb3N0U2VsZWN0b3I9XCJkaXYuc21lLXRhYmxlLWhlYWRlclwiIChyZXNpemVkKT1cIm9uQ29sdW1uUmVzaXplZChjb2xJbmRleCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICBbdmlzaWJsZVRvU2NyZWVuUmVhZGVyXT1cInRydWVcIiBbc2hvd1Jlc2l6ZXJDb3Zlcl09XCJmYWxzZVwiIG9yaWVudGF0aW9uPVwibGVmdFwiXHJcbiAgICAgICAgICAocmVzaXppbmcpPVwib25Db2x1bW5SZXNpemluZygkZXZlbnQpXCIgY2xhc3M9XCJzbWUtZm9jdXMtem9uZVwiPjwvc21lLXJlc2l6ZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwic21lLWZvY3VzLXpvbmUgc21lLXRhYmxlLWNvbnRhaW5lciBzbWUtZGF0YS10YWJsZS10cmFuc2l0aW9uXCIgI2NvbnRlbnQgcm9sZT1cInByZXNlbnRhdGlvblwiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1tdWx0aS1zZWxlY3RdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZSdcIiBbY2xhc3Muc21lLXRhYmxlLXNlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXHJcbiAgW2NsYXNzLnNtZS1tYXJnaW4tdG9wLW5vbmVdPVwiIXNob3dIZWFkZXJcIiBbY2xhc3Muc21lLXRhYmxlLWluZGVudGVkXT1cInNob3dMZWZ0TWFyZ2luXCJcclxuICBbY2xhc3Muc21lLXRhYmxlLWdyaWQtbGluZXNdPVwic2hvd0dyaWRcIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtc2VsZWN0LWFsbC1lbmFibGVkXT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnICYmIHNob3dBbGxJdGVtQ2hlY2tib3hcIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtZWRpdGFibGVdPVwiZWRpdGFibGVcIj5cclxuICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXNjcm9sbC1jb250YWluZXIgc21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24taW5zZXQtbm9uZVwiXHJcbiAgICBbbmdDbGFzc109XCJ7J3NtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLWluc2V0LW5vbmUnOiBzY3JvbGxhYmxlLCAnc21lLXNjcm9sbGFibGUnOiBzaG91bGRTY3JvbGx9XCJcclxuICAgICNzY3JvbGxDb250YWluZXIgcm9sZT1cInJvd2dyb3VwXCI+XHJcbiAgICA8ZGl2IHJvbGU9XCJyb3dcIiBjbGFzcz1cInNtZS10YWJsZS1yb3cgc21lLXRhYmxlLXJvdy1wbGFjZWhvbGRlclwiICNlbXB0eU1lc3NhZ2UgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgKm5nSWY9XCJzaG93Tm9SZWNvcmRzTWVzc2FnZSgpXCIgZGF0YS11dGEtaWQ9XCJlbXB0eS10YWJsZS1tZXNzYWdlXCI+XHJcbiAgICAgIDxzbWUtbG9hZGluZy13aGVlbCAqbmdJZj1cImlzTG9hZGluZyB8fCAhaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWRcIiBbbWVzc2FnZV09XCJsb2FkaW5nTWVzc2FnZVwiPlxyXG4gICAgICA8L3NtZS1sb2FkaW5nLXdoZWVsPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWNlbGwtcGxhY2Vob2xkZXJcIj4mbmJzcDs8L2Rpdj5cclxuICAgICAgPGRpdiByb2xlPVwiY2VsbFwiIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIj57e2dldE5vUmVjb3Jkc01lc3NhZ2UoKX19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtbGF5b3V0LXJlbGF0aXZlIHNtZS1wb3NpdGlvbi1zdHJldGNoLWggc21lLWFycmFuZ2Utb3ZlcmZsb3ctaGlkZVwiICNzY3JvbGxCb2R5IHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZSBzbWUtdGFibGUtc2Nyb2xsYWJsZSBzbWUtdGFibGUtdmlydHVhbGl6ZWRcIiAjc2Nyb2xsQWJvdmVEYXRhXHJcbiAgICAgICAgW25nU3R5bGVdPVwie3RvcDogc2Nyb2xsQWJvdmVEYXRhU3R5bGVUb3B9XCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwidHJ1ZVwiIHNtZS1saW50LWRpc2FibGU+XHJcbiAgICAgICAgPCEtLSBBYm92ZSB2aWV3IHBvcnQgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcmVuZGVyZWRJdGVtIG9mIHJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0OyBsZXQgcm93SW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1yb3cgc21lLXRhYmxlLXJvdy1kYXRhIHNtZS10YWJsZS1yb3ctc2VsZWN0YWJsZVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLXJvdy1hY3RpdmVdPVwicmVuZGVyZWRJdGVtLmluZGV4ID09PSBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtcm93LXNlbGVjdGVkXT1cInJlbmRlcmVkSXRlbS5pbmRleCA9PT0gZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSB8fCBpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtZ3JvdXAtaXRlbV09XCJyZW5kZXJlZEl0ZW0udHlwZSA9PT0gcmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBJdGVtXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtZ3JvdXAtaGVhZGVyXT1cInJlbmRlcmVkSXRlbS50eXBlID09PSByZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLWNoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1hcnJhbmdlLXN0YWNrLWhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dBc1RyZWVcIiBjbGFzcz1cInNtZS10YWJsZS1jaGVja2JveFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBhY3R1YWxDb2x1bW5zOyBsZXQgY29sSW5kZXg9aW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLXRhYmxlLWNvbHVtbi1maXJzdCc6IGlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbiksICdzbWUtdGFibGUtZ3JvdXAtaGVhZGVyLWNlbGwnOiByZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyfVwiXHJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6Y29sdW1uLmRvbVdpZHRoKydweCd9XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvIHt7Y29sdW1uLnN0eWxlQ2xhc3N9fVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaXNUcmVlVGFibGVQYXJlbnROb2RlKHJlbmRlcmVkSXRlbSkgPyAtMSA6IDBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXNjcmVlbi1yZWFkZXIgc21lLXNjcmVlbi1yZWFkZXItZGlzYWJsZS1jb3B5XCIgKm5nSWY9XCJpc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pXCI+XHJcbiAgICAgICAgICAgICAgICB7e2dldEFkZGl0aW9uYWxTY3JlZW5SZWNvcmRlckNvbnRlbnQocmVuZGVyZWRJdGVtKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXIgJiYgY29sSW5kZXg9PT0wXCIgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tHcm91cFRvZ2dsZShyZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInVzZUdyb3VwVG9nZ2xlXCIgY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1zaXplLXh4cyBzbWUtbWFyZ2luLXJpZ2h0LXh4c1wiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tY2hldnJvbkRvd24nOmlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSksICdzbWUtaWNvbi1jaGV2cm9uUmlnaHQnOiFpc0dyb3VwRXhwYW5kZWQocmVuZGVyZWRJdGVtLmRhdGEpfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdGhpcy5ncm91cEhlYWRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGF9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciBbdGVtcGxhdGVdPVwidGhpcy5ncm91cEhlYWRlclRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmICFyZW5kZXJlZEl0ZW0ubm9kZS5pc0J1c3kgJiYgY29sSW5kZXg9PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGxcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6KHJlbmRlcmVkSXRlbS5kZXB0aCoxNis0KSsncHgnfVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1leHBhbmRhYmxlJzogcmVuZGVyZWRJdGVtLmhhc0NoaWxkcmVuICYmICFyZW5kZXJlZEl0ZW0ubm9kZS5pc0xlYWZ9XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNpemUteHhzXCIgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQ/J3RydWUnOidmYWxzZSdcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tUcmVlVG9nZ2xlKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tY2hldnJvbkRvd24nOnJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkLCAnc21lLWljb24tY2hldnJvblJpZ2h0JzohcmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWR9XCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5jb2xsYXBzZSA6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5leHBhbmRcIj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGwtcGxhY2Vob2xkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgcmVuZGVyZWRJdGVtLm5vZGUuaXNCdXN5ICYmIGNvbEluZGV4PT09MFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsXCIgW25nU3R5bGVdPVwieydwYWRkaW5nLWxlZnQnOihyZW5kZXJlZEl0ZW0uZGVwdGgqMTYrNCkrJ3B4J31cIj5cclxuICAgICAgICAgICAgICAgIDxzbWUtbG9hZGluZy13aGVlbCBzaXplPVwiZXh0cmEtc21hbGxcIiBbaW5saW5lXT1cInRydWVcIiBbaXNCYWNrZ3JvdW5kVHJhbnNwYXJlbnRdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9zbWUtbG9hZGluZy13aGVlbD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGwtcGxhY2Vob2xkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93QXNUcmVlICYmIHNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnICYmIHJlbmRlcmVkSXRlbS50eXBlPT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiBjb2xJbmRleD09MFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1jaGVja2JveC1jb250YWluZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94XCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkl0ZW1DaGVja0JveENsaWNrZWQocmVuZGVyZWRJdGVtKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdGFibGVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY29sdW1uLmJvZHlUZW1wbGF0ZSAmJiByZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCIgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YT9yZXNvbHZlT2JqZWN0UGF0aChyZW5kZXJlZEl0ZW0uZGF0YSxjb2x1bW4uZmllbGQpOicuJ319XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXIgJiYgcmVuZGVyZWRJdGVtLmRhdGEgJiYgY29sdW1uLmJvZHlUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1mdWxsLWhlaWdodF09XCJhdXRvUm93SGVpZ2h0XCIgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWhlaWdodC1hdXRvXT1cImF1dG9Sb3dIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgKm5nSWY9XCIhcmVuZGVyZWRJdGVtLmRhdGEucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2x1bW4uYm9keVRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGFcIiBbcm93SW5kZXhdPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUgc21lLXRhYmxlLXNjcm9sbGFibGVcIiAjc2Nyb2xsRGF0YSBbY2xhc3Muc21lLXRhYmxlLXZpcnR1YWxpemVkXT1cIiFkaXNhYmxlVUlWaXJ0dWFsaXphdGlvblwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwie3RvcDogc2Nyb2xsRGF0YVN0eWxlVG9wfVwiIHNtZS1saW50LWRpc2FibGUgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJlbmRlcmVkSXRlbSBvZiByZW5kZXJlZEl0ZW1zSW5BbmRCZWxvd1ZpZXdQb3J0OyBsZXQgcm93SW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICAoa2V5ZG93bik9XCJvbkNvbnRlbnRUYWJsZVByZXNzZWQoJGV2ZW50KVwiIChrZXl1cCk9XCJvbkNvbnRlbnRUYWJsZUtleVVwKCRldmVudClcIlxyXG4gICAgICAgICAgKGNvbnRleHRtZW51KT1cImVuYWJsZVJpZ2h0Q2xpY2tTZWxlY3QgPyBzZWxlY3RJdGVtKCRldmVudCwgcmVuZGVyZWRJdGVtKSA6IHRydWVcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEl0ZW0oJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCIgY2xhc3M9XCJzbWUtdGFibGUtcm93IHNtZS10YWJsZS1yb3ctZGF0YSBzbWUtdGFibGUtcm93LXNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1yb3ctYWN0aXZlXT1cInJlbmRlcmVkSXRlbS5pbmRleCA9PT0gZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLXJvdy1zZWxlY3RlZF09XCJyZW5kZXJlZEl0ZW0uaW5kZXggPT09IGdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgfHwgaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWdyb3VwLWl0ZW1dPVwicmVuZGVyZWRJdGVtLnR5cGUgPT09IHJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSXRlbVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWdyb3VwLWhlYWRlcl09XCJyZW5kZXJlZEl0ZW0udHlwZSA9PT0gcmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS1jaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIiBbY2xhc3Muc21lLXRhYmxlLXJvdy1lZGl0YWJsZV09XCJlZGl0YWJsZVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLWhhcy12YWxpZGF0aW9uLWVycm9yXT1cImhhc1ZhbGlkYXRpb25FcnJvcihyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtZGF0YS10YWJsZS1yb3ctbmV3LWl0ZW1dPVwicmVuZGVyZWRJdGVtPy5kYXRhPy5pc05ld1Jvd1wiXHJcbiAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJyZW5kZXJlZEl0ZW0uaW5kZXggPj0gMCA/IDAgOiB1bmRlZmluZWRcIiAoZGJsY2xpY2spPVwiZG91YmxlQ2xpY2tSb3coJGV2ZW50LHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgKGZvY3VzKT1cIm9uQ29udGVudEl0ZW1Gb2N1c2VkKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiIChmb2N1c2luKT1cIm9uQ29udGVudEl0ZW1Gb2N1c2VkKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAoZm9jdXNvdXQpPVwib25Db250ZW50SXRlbUJsdXJyZWQoJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCIgW2F0dHIuZGF0YS1yZW5kZXJlZC1pdGVtLWluZGV4XT1cInJlbmRlcmVkSXRlbS5pbmRleFwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInJlbmRlcmVkSXRlbS5pbmRleCsyXCIgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pPyd0cnVlJzonZmFsc2UnXCJcclxuICAgICAgICAgIChtb3VzZWVudGVyKT1cInNldEhvdmVyZWRSZW5kZXJlZEl0ZW0ocmVuZGVyZWRJdGVtKVwiIChtb3VzZWxlYXZlKT1cInVuc2V0SG92ZXJlZFJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIHJvbGU9XCJyb3dcIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImdldEFyaWFFeHBhbmRlZEF0dHJpYnV0ZVZhbHVlKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sZXZlbF09XCJzaG93QXNUcmVlICYmIHJlbmRlcmVkSXRlbS5kZXB0aCA/IChyZW5kZXJlZEl0ZW0uZGVwdGgrMSk6dW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2staFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvXCJcclxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnID8gZ2V0Um9sZUF0dHJpYnV0ZUZvclRhYmxlUm93Q2VsbChyZW5kZXJlZEl0ZW0pIDogJ3ByZXNlbnRhdGlvbidcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dBc1RyZWVcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1jaGVja2JveC1jb250YWluZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1mdWxsLWhlaWdodF09XCJhdXRvUm93SGVpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94XCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2F0dHIuYXJpYS1jaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSk/J3RydWUnOidmYWxzZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZEJhZy5maXJzdERhdGFDb2x1bW4gKyByZW5kZXJlZEl0ZW0uaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIiAoY2hhbmdlKT1cIm9uSXRlbUNoZWNrQm94Q2xpY2tlZChyZW5kZXJlZEl0ZW0pXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgYWN0dWFsQ29sdW1uczsgbGV0IGNvbEluZGV4PWluZGV4XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS10YWJsZS1jb2x1bW4tZmlyc3QnOiBpc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pLCAnc21lLXRhYmxlLWdyb3VwLWhlYWRlci1jZWxsJzogcmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlcn1cIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOmNvbHVtbi5kb21XaWR0aCsncHgnfVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtdGQgc21lLXBvc2l0aW9uLWZsZXgtYXV0byB7e2NvbHVtbi5zdHlsZUNsYXNzfX1cIlxyXG4gICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiZ2V0Um9sZUF0dHJpYnV0ZUZvclRhYmxlUm93Q2VsbChyZW5kZXJlZEl0ZW0pXCIgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyZW5kZXJlZEl0ZW0uaW5kZXgrMlwiXHJcbiAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaXNUcmVlVGFibGVQYXJlbnROb2RlKHJlbmRlcmVkSXRlbSkgPyAtMSA6IDBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXNjcmVlbi1yZWFkZXIgc21lLXNjcmVlbi1yZWFkZXItZGlzYWJsZS1jb3B5XCIgKm5nSWY9XCJpc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pXCI+XHJcbiAgICAgICAgICAgICAgICB7e2dldEFkZGl0aW9uYWxTY3JlZW5SZWNvcmRlckNvbnRlbnQocmVuZGVyZWRJdGVtKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXIgJiYgY29sSW5kZXg9PT0wXCIgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tHcm91cFRvZ2dsZShyZW5kZXJlZEl0ZW0pXCIgW2lkXT1cImdldEZpcnN0Q29sdW1uSWQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInVzZUdyb3VwVG9nZ2xlXCIgY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1zaXplLXh4cyBzbWUtbWFyZ2luLXJpZ2h0LXh4c1wiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tY2hldnJvbkRvd24nOmlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSksICdzbWUtaWNvbi1jaGV2cm9uUmlnaHQnOiFpc0dyb3VwRXhwYW5kZWQocmVuZGVyZWRJdGVtLmRhdGEpfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdGhpcy5ncm91cEhlYWRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGF9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciBbdGVtcGxhdGVdPVwidGhpcy5ncm91cEhlYWRlclRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmICFyZW5kZXJlZEl0ZW0ubm9kZS5pc0J1c3kgJiYgY29sSW5kZXg9PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGxcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6KHJlbmRlcmVkSXRlbS5kZXB0aCoxNis0KSsncHgnfVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1leHBhbmRhYmxlJzogcmVuZGVyZWRJdGVtLmhhc0NoaWxkcmVuICYmICFyZW5kZXJlZEl0ZW0ubm9kZS5pc0xlYWZ9XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNpemUteHhzXCIgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQ/J3RydWUnOidmYWxzZSdcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tUcmVlVG9nZ2xlKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tY2hldnJvbkRvd24nOnJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkLCAnc21lLWljb24tY2hldnJvblJpZ2h0JzohcmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWR9XCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5jb2xsYXBzZSA6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5leHBhbmRcIj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGwtcGxhY2Vob2xkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgcmVuZGVyZWRJdGVtLm5vZGUuaXNCdXN5ICYmIGNvbEluZGV4PT09MFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsXCIgW25nU3R5bGVdPVwieydwYWRkaW5nLWxlZnQnOihyZW5kZXJlZEl0ZW0uZGVwdGgqMTYrNCkrJ3B4J31cIj5cclxuICAgICAgICAgICAgICAgIDxzbWUtbG9hZGluZy13aGVlbCBzaXplPVwiZXh0cmEtc21hbGxcIiBbaW5saW5lXT1cInRydWVcIiBbaXNCYWNrZ3JvdW5kVHJhbnNwYXJlbnRdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9zbWUtbG9hZGluZy13aGVlbD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGwtcGxhY2Vob2xkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93QXNUcmVlICYmIHNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnICYmIHJlbmRlcmVkSXRlbS50eXBlPT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiBjb2xJbmRleD09MFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1jaGVja2JveC1jb250YWluZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94XCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2F0dHIuYXJpYS1jaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSk/J3RydWUnOidmYWxzZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZEJhZy5maXJzdERhdGFDb2x1bW4gKyByZW5kZXJlZEl0ZW0uaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIiAoY2hhbmdlKT1cIm9uSXRlbUNoZWNrQm94Q2xpY2tlZChyZW5kZXJlZEl0ZW0pXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlZGl0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uYm9keVRlbXBsYXRlICYmIHJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIiBbY2xhc3Muc21lLXRhYmxlLWNlbGwtZnVsbC1oZWlnaHRdPVwiYXV0b1Jvd0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImNvbHVtbi5nZXRUb29sdGlwSGFuZGxlciAmJiBjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIocmVuZGVyZWRJdGVtLmRhdGEpXCJcclxuICAgICAgICAgICAgICAgICAgW2lkXT1cImdldEZpcnN0Q29sdW1uSWQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGE/cmVzb2x2ZU9iamVjdFBhdGgocmVuZGVyZWRJdGVtLmRhdGEsY29sdW1uLmZpZWxkKTonLid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiByZW5kZXJlZEl0ZW0uZGF0YSAmJiBjb2x1bW4uYm9keVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1oZWlnaHQtYXV0b109XCJhdXRvUm93SGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIiBbaWRdPVwiZ2V0Rmlyc3RDb2x1bW5JZChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIgJiYgY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyKHJlbmRlcmVkSXRlbS5kYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyICpuZ0lmPVwiIXJlbmRlcmVkSXRlbS5kYXRhLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLmJvZHlUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhXCIgW3Jvd0luZGV4XT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmICFjb2x1bW4uYm9keUVkaXRUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZSAmJiByZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyICYmIGNvbHVtbi5nZXRUb29sdGlwSGFuZGxlcihyZW5kZXJlZEl0ZW0uZGF0YSlcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YT9yZXNvbHZlT2JqZWN0UGF0aChyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50LGNvbHVtbi5maWVsZCk6Jy4nfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXIgJiYgcmVuZGVyZWRJdGVtLmRhdGEgJiYgY29sdW1uLmJvZHlSZWFkVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyICYmIGNvbHVtbi5nZXRUb29sdGlwSGFuZGxlcihyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyICpuZ0lmPVwiIXJlbmRlcmVkSXRlbS5kYXRhLnBsYWNlaG9sZGVyXCIgW3JlbmRlcmVkSXRlbV09XCJyZW5kZXJlZEl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnRcIiBbcm93SW5kZXhdPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgY29sdW1uLmJvZHlFZGl0VGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvdWxkU2hvd0VkaXRSb3cocmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlICYmIHJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyICYmIGNvbHVtbi5nZXRUb29sdGlwSGFuZGxlcihyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGE/cmVzb2x2ZU9iamVjdFBhdGgocmVuZGVyZWRJdGVtLmRhdGEuY29udGVudCxjb2x1bW4uZmllbGQpOicuJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiByZW5kZXJlZEl0ZW0uZGF0YSAmJiBjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyICYmIGNvbHVtbi5nZXRUb29sdGlwSGFuZGxlcihyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgKm5nSWY9XCIhcmVuZGVyZWRJdGVtLmRhdGEucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGEuY29udGVudFwiIFtyb3dJbmRleF09XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3VsZFNob3dFZGl0Um93KHJlbmRlcmVkSXRlbSlcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1lZGl0LWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImNvbHVtbi5nZXRUb29sdGlwSGFuZGxlciAmJiBjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIocmVuZGVyZWRJdGVtLmRhdGEuY29udGVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5RWRpdFRlbXBsYXRlXCIgW2ZpZWxkXT1cImNvbHVtbi5maWVsZFwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dJbmRleF09XCJyb3dJbmRleFwiIFtyZW5kZXJlZEl0ZW1dPVwicmVuZGVyZWRJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsaWRhdGlvbkFsZXJ0KT1cIm9uVmFsaWRhdGlvbkFsZXJ0SGFuZGxlcihyZW5kZXJlZEl0ZW0sIGNvbHVtbi5maWVsZCwgJGV2ZW50LmFsZXJ0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGRhdGFDaGFuZ2VkKT1cIm9uRWRpdGFibGVEYXRhQ2hhbmdlZCgkZXZlbnQucmVuZGVyZWRJdGVtLCRldmVudC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNWYWxpZGF0aW9uRXJyb3IocmVuZGVyZWRJdGVtKVwiIGNsYXNzPVwic21lLXRhYmxlLXJvdy12YWxpZGF0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtdGQgc21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiXHJcbiAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyA/IGdldFJvbGVBdHRyaWJ1dGVGb3JUYWJsZVJvd0NlbGwocmVuZGVyZWRJdGVtKSA6ICdwcmVzZW50YXRpb24nXCJcclxuICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJz8nMCc6J3VuZGVmaW5lZCdcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB2YWxpZGF0aW9uUmVzdWx0SXRlbSBvZiByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLXZhbGlkYXRpb24tYWxlcnQgW2FsZXJ0XT1cInZhbGlkYXRpb25SZXN1bHRJdGVtLmFsZXJ0XCI+PC9zbWUtdmFsaWRhdGlvbi1hbGVydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtcm93XCIgI3RlbXBSb3c+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXRkXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiPiZuYnNwOzwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvdWxkVXNlTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRcIiAjbGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQgY2xhc3M9XCJzbWUtZm9jdXMtem9uZVwiXHJcbiAgICAgIGRhdGEtc21lLWxhc3QtZm9jdXNhYmxlLXNoYWRvdy1lbGVtZW50IChmb2N1cyk9XCJvbkxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNlZCgkZXZlbnQpXCIgdGFiaW5kZXg9XCIwXCI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLWluc2V0LW5vbmVcIlxyXG4gICAgKm5nSWY9XCJpc0J1c3kgfHwgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrICYmIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmlzUnVubmluZylcIj5cclxuICAgIDxzbWUtbG9hZGluZy13aGVlbCBbaXNCYWNrZ3JvdW5kVHJhbnNwYXJlbnRdPVwidHJ1ZVwiPjwvc21lLWxvYWRpbmctd2hlZWw+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2ICNyZXNpemVySW5kaWNhdG9yXHJcbiAgY2xhc3M9XCJzbWUtd2lkdGgteHhzIHNtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLXN0cmV0Y2gtdiBzbWUtYmFja2dyb3VuZC1jb2xvci1iYXNlLTgwIHNtZS1sYXllci1mbHlvdXQgc21lLWxheW91dC1ub25lXCI+XHJcbjwvZGl2PlxyXG4iXX0=