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

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 (147) 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 +558 -240
  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/containers/action-bar/action-bar.component.js +7 -2
  24. package/angular/esm2015/src/controls/alert-bar/alert-bar.component.js +5 -5
  25. package/angular/esm2015/src/controls/common/base.component.js +8 -1
  26. package/angular/esm2015/src/controls/data-table/data-table.component.js +39 -9
  27. package/angular/esm2015/src/controls/form/form-field/checklist/checklist-form-field.component.js +11 -8
  28. package/angular/esm2015/src/controls/form/form-field/combobox/combobox-form-field.component.js +8 -9
  29. package/angular/esm2015/src/controls/form/form-field/file/file-form-field.component.js +14 -2
  30. package/angular/esm2015/src/controls/form/form-field/form-field.component.js +9 -2
  31. package/angular/esm2015/src/controls/layout/layout-definition.component.js +9 -2
  32. package/angular/esm2015/src/controls/layout/layout.component.js +11 -2
  33. package/angular/esm2015/src/controls/master-view/master-view.component.js +32 -5
  34. package/angular/esm2015/src/controls/page-alert-bar/models/index.js +1 -1
  35. package/angular/esm2015/src/controls/pivot/pivot.component.js +11 -5
  36. package/angular/esm2015/src/controls/property-grid/property-grid-item.component.js +50 -2
  37. package/angular/esm2015/src/controls/property-grid/property-grid.component.js +73 -60
  38. package/angular/esm2015/src/controls/property-grid/property-grid.module.js +5 -1
  39. package/angular/esm2015/src/controls/settings/common-settings/common-settings.component.js +151 -70
  40. package/angular/esm2015/src/controls/settings/settings.component.js +48 -8
  41. package/angular/esm2015/src/controls/settings/settings.module.js +21 -9
  42. package/angular/esm2015/src/controls/wizard/wizard.component.js +55 -65
  43. package/angular/esm2015/src/generated/strings.js +1 -1
  44. package/angular/esm2015/src/service/app-context.service.js +3 -1
  45. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +535 -240
  46. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
  47. package/angular/package.json +2 -0
  48. package/angular/src/controls/common/base.component.d.ts +5 -0
  49. package/angular/src/controls/data-table/data-table.component.d.ts +15 -0
  50. package/angular/src/controls/form/form-field/checklist/checklist-form-field.component.d.ts +1 -0
  51. package/angular/src/controls/form/form-field/file/file-form-field.component.d.ts +4 -0
  52. package/angular/src/controls/layout/layout-definition.component.d.ts +6 -1
  53. package/angular/src/controls/master-view/master-view.component.d.ts +118 -2
  54. package/angular/src/controls/page-alert-bar/models/index.d.ts +1 -1
  55. package/angular/src/controls/pivot/pivot.component.d.ts +4 -1
  56. package/angular/src/controls/property-grid/property-grid-item.component.d.ts +53 -3
  57. package/angular/src/controls/property-grid/property-grid.component.d.ts +1 -2
  58. package/angular/src/controls/property-grid/property-grid.module.d.ts +4 -3
  59. package/angular/src/controls/settings/common-settings/common-settings.component.d.ts +32 -1
  60. package/angular/src/controls/settings/settings.component.d.ts +18 -1
  61. package/angular/src/controls/settings/settings.module.d.ts +3 -1
  62. package/angular/src/generated/strings.d.ts +3 -0
  63. package/core/base/environment.d.ts +10 -0
  64. package/core/base/environment.js.map +1 -1
  65. package/core/data/gateway-connection.d.ts +34 -0
  66. package/core/data/gateway-connection.js +59 -2
  67. package/core/data/gateway-connection.js.map +1 -1
  68. package/core/data/gateway-status.d.ts +24 -0
  69. package/core/data/gateway-status.js +3 -0
  70. package/core/data/gateway-status.js.map +1 -0
  71. package/core/data/node-connection.d.ts +4 -0
  72. package/core/data/node-connection.js.map +1 -1
  73. package/core/data/powershell.d.ts +4 -0
  74. package/core/data/powershell.js +1 -0
  75. package/core/data/powershell.js.map +1 -1
  76. package/core/data/wdac-operations.d.ts +123 -0
  77. package/core/data/wdac-operations.js +144 -0
  78. package/core/data/wdac-operations.js.map +1 -0
  79. package/core/diagnostics/sme-web-telemetry-models.d.ts +20 -3
  80. package/core/diagnostics/sme-web-telemetry-models.js +6 -2
  81. package/core/diagnostics/sme-web-telemetry-models.js.map +1 -1
  82. package/core/diagnostics/sme-web-telemetry.d.ts +13 -1
  83. package/core/diagnostics/sme-web-telemetry.js +51 -11
  84. package/core/diagnostics/sme-web-telemetry.js.map +1 -1
  85. package/core/generated/powershell-scripts.d.ts +8 -4
  86. package/core/generated/powershell-scripts.js +8 -4
  87. package/core/generated/powershell-scripts.js.map +1 -1
  88. package/core/index.d.ts +2 -0
  89. package/core/index.js +1 -0
  90. package/core/index.js.map +1 -1
  91. package/core/manifest/environment-modules.js +10 -0
  92. package/core/manifest/environment-modules.js.map +1 -1
  93. package/core/notification/powershell-notification.js +1 -1
  94. package/core/notification/powershell-notification.js.map +1 -1
  95. package/core/performance/performance-tracker.d.ts +67 -0
  96. package/core/performance/performance-tracker.js +211 -4
  97. package/core/performance/performance-tracker.js.map +1 -1
  98. package/core/rpc/credssp/rpc-credssp-model.d.ts +27 -2
  99. package/core/rpc/credssp/rpc-credssp-model.js +10 -0
  100. package/core/rpc/credssp/rpc-credssp-model.js.map +1 -1
  101. package/core/security/credssp-manager.d.ts +15 -1
  102. package/core/security/credssp-manager.js +28 -0
  103. package/core/security/credssp-manager.js.map +1 -1
  104. package/core/shared/gateway-inventory/gateway-inventory.d.ts +10 -0
  105. package/core/shared/gateway-inventory/gateway-inventory.js +11 -0
  106. package/core/shared/gateway-inventory/gateway-inventory.js.map +1 -1
  107. package/e2e/assets/strings/cs-CZ/strings.json +1 -1
  108. package/e2e/assets/strings/de-DE/strings.json +1 -1
  109. package/e2e/assets/strings/es-ES/strings.json +1 -1
  110. package/e2e/assets/strings/fr-FR/strings.json +1 -1
  111. package/e2e/assets/strings/hu-HU/strings.json +1 -1
  112. package/e2e/assets/strings/it-IT/strings.json +1 -1
  113. package/e2e/assets/strings/ja-JP/strings.json +1 -1
  114. package/e2e/assets/strings/ko-KR/strings.json +1 -1
  115. package/e2e/assets/strings/nl-NL/strings.json +1 -1
  116. package/e2e/assets/strings/pl-PL/strings.json +1 -1
  117. package/e2e/assets/strings/pt-BR/strings.json +1 -1
  118. package/e2e/assets/strings/pt-PT/strings.json +1 -1
  119. package/e2e/assets/strings/ru-RU/strings.json +1 -1
  120. package/e2e/assets/strings/strings.json +1 -1
  121. package/e2e/assets/strings/sv-SE/strings.json +1 -1
  122. package/e2e/assets/strings/tr-TR/strings.json +1 -1
  123. package/e2e/assets/strings/zh-CN/strings.json +1 -1
  124. package/e2e/assets/strings/zh-TW/strings.json +1 -1
  125. package/package.json +5 -3
  126. package/styles/css/main.css +1 -1
  127. package/tools/module-template/gulpfile.ts/index.ts +1 -1
  128. package/tools/package-lock.json +18081 -4110
  129. package/tools/wac-cli/src/create/main.d.ts +6 -3
  130. package/tools/wac-cli/src/create/main.js +87 -35
  131. package/tools/wac-cli/src/create/main.js.map +1 -1
  132. package/tools/wac-cli/src/index.js +2 -2
  133. package/tools/wac-cli/src/index.js.map +1 -1
  134. package/tools/wac-cli/templates/internal/npmrc.txt +6 -0
  135. package/tools/wac-cli/templates/internal/package.json +101 -0
  136. package/tools/wac-cli/templates/{manifest/solution-manifest.json → solution/manifest.json} +19 -0
  137. package/tools/wac-cli/templates/solution/strings.resjson +16 -0
  138. package/tools/wac-cli/templates/wac-template/angular.json +2 -2
  139. package/tools/wac-cli/templates/wac-template/gulpfile.ts/config-data.ts +1 -1
  140. package/tools/wac-cli/templates/wac-template/package.json +0 -8
  141. package/tools/wac-cli/templates/wac-template/src/app/app-routing.module.ts +1 -1
  142. package/tools/wac-cli/templates/wac-template/src/main.ts +2 -0
  143. package/tools/wac-cli/templates/{manifest/tool-manifest.json → wac-template/src/manifest.json} +0 -0
  144. package/tools/wac-cli/templates/wac-template/src/polyfills.ts +1 -1
  145. package/tools/wac-cli/templates/wac-template/src/test.ts +2 -2
  146. package/tools/wac-cli/templates/wac-template/src/version.ts +3 -0
  147. package/tools/wac-cli/templates/wac-template/version.json +5 -0
@@ -8,6 +8,7 @@ import { EMPTY, from } from 'rxjs';
8
8
  import { AppContextService } from '../../../service/app-context.service';
9
9
  import { RpcShellService } from '../../../service/rpc-shell.service';
10
10
  import { CoreBaseComponent } from '../../common/base.component';
11
+ import { SearchFormFieldComponent } from '../../form';
11
12
  import { SettingsFormService } from '../settings-form.service';
12
13
  import { SettingsComponent } from '../settings.component';
13
14
  import * as i0 from "@angular/core";
@@ -15,9 +16,10 @@ import * as i1 from "@angular/router";
15
16
  import * as i2 from "../settings-form.service";
16
17
  import * as i3 from "../../../service/app-context.service";
17
18
  import * as i4 from "../../../service/rpc-shell.service";
19
+ const _c0 = ["searchTextBox"];
18
20
  function CommonSettingsComponent_header_2_Template(rf, ctx) { if (rf & 1) {
19
- i0.ɵɵelementStart(0, "header", 7);
20
- i0.ɵɵelementStart(1, "h2", 8);
21
+ i0.ɵɵelementStart(0, "header", 12);
22
+ i0.ɵɵelementStart(1, "h2", 13);
21
23
  i0.ɵɵtext(2);
22
24
  i0.ɵɵelementEnd();
23
25
  i0.ɵɵelementEnd();
@@ -28,94 +30,94 @@ function CommonSettingsComponent_header_2_Template(rf, ctx) { if (rf & 1) {
28
30
  i0.ɵɵadvance(1);
29
31
  i0.ɵɵtextInterpolate(ctx_r0.settingsTitle);
30
32
  } }
31
- function CommonSettingsComponent_li_6_h3_1_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelementStart(0, "h3", 12);
33
+ function CommonSettingsComponent_li_10_h4_1_Template(rf, ctx) { if (rf & 1) {
34
+ i0.ɵɵelementStart(0, "h4", 17);
33
35
  i0.ɵɵtext(1);
34
36
  i0.ɵɵelementEnd();
35
37
  } if (rf & 2) {
36
- const ctx_r8 = i0.ɵɵnextContext();
37
- const j_r5 = ctx_r8.index;
38
- const group_r4 = ctx_r8.$implicit;
39
- const ctx_r6 = i0.ɵɵnextContext();
40
- i0.ɵɵproperty("id", ctx_r6.idBag.group + "-" + j_r5)("title", group_r4.group);
38
+ const ctx_r9 = i0.ɵɵnextContext();
39
+ const j_r6 = ctx_r9.index;
40
+ const group_r5 = ctx_r9.$implicit;
41
+ const ctx_r7 = i0.ɵɵnextContext();
42
+ i0.ɵɵproperty("id", ctx_r7.idBag.group + "-" + j_r6)("title", group_r5.group);
41
43
  i0.ɵɵadvance(1);
42
- i0.ɵɵtextInterpolate(group_r4.group);
44
+ i0.ɵɵtextInterpolate(group_r5.group);
43
45
  } }
44
- function CommonSettingsComponent_li_6_a_2_Template(rf, ctx) { if (rf & 1) {
45
- const _r12 = i0.ɵɵgetCurrentView();
46
- i0.ɵɵelementStart(0, "a", 13);
47
- i0.ɵɵlistener("smeRouterLinkActivated", function CommonSettingsComponent_li_6_a_2_Template_a_smeRouterLinkActivated_0_listener() { i0.ɵɵrestoreView(_r12); const setting_r9 = ctx.$implicit; const ctx_r11 = i0.ɵɵnextContext(2); return ctx_r11.selectedSetting = setting_r9; });
48
- i0.ɵɵelement(1, "div", 14);
49
- i0.ɵɵelementStart(2, "div", 15);
50
- i0.ɵɵelementStart(3, "span", 16);
46
+ function CommonSettingsComponent_li_10_a_2_Template(rf, ctx) { if (rf & 1) {
47
+ const _r13 = i0.ɵɵgetCurrentView();
48
+ i0.ɵɵelementStart(0, "a", 18);
49
+ i0.ɵɵlistener("smeRouterLinkActivated", function CommonSettingsComponent_li_10_a_2_Template_a_smeRouterLinkActivated_0_listener() { i0.ɵɵrestoreView(_r13); const setting_r10 = ctx.$implicit; const ctx_r12 = i0.ɵɵnextContext(2); return ctx_r12.onSmeRouterLinkActivated(setting_r10); });
50
+ i0.ɵɵelement(1, "div", 19);
51
+ i0.ɵɵelementStart(2, "div", 20);
52
+ i0.ɵɵelementStart(3, "span", 21);
51
53
  i0.ɵɵtext(4);
52
54
  i0.ɵɵelementEnd();
53
55
  i0.ɵɵelementEnd();
54
56
  i0.ɵɵelementEnd();
55
57
  } if (rf & 2) {
56
- const setting_r9 = ctx.$implicit;
57
- const i_r10 = ctx.index;
58
- const j_r5 = i0.ɵɵnextContext().index;
59
- const ctx_r7 = i0.ɵɵnextContext();
60
- i0.ɵɵattributeInterpolate5("aria-labelledby", "", ctx_r7.idBag.option, "-", j_r5, "-", i_r10, " ", ctx_r7.idBag.group, "-", j_r5, "");
61
- i0.ɵɵproperty("routerLink", setting_r9.routeParams.commands)("preserveFragment", setting_r9.routeParams.extras && setting_r9.routeParams.extras.preserveFragment)("skipLocationChange", setting_r9.routeParams.extras && setting_r9.routeParams.extras.skipLocationChange)("replaceUrl", setting_r9.routeParams.extras && setting_r9.routeParams.extras.replaceUrl)("queryParams", setting_r9.routeParams.extras && setting_r9.routeParams.extras.queryParams)("title", setting_r9.label);
62
- i0.ɵɵattribute("aria-selected", ctx_r7.selectedSetting === setting_r9);
58
+ const setting_r10 = ctx.$implicit;
59
+ const i_r11 = ctx.index;
60
+ const j_r6 = i0.ɵɵnextContext().index;
61
+ const ctx_r8 = i0.ɵɵnextContext();
62
+ i0.ɵɵattributeInterpolate5("aria-labelledby", "", ctx_r8.idBag.option, "-", j_r6, "-", i_r11, " ", ctx_r8.idBag.group, "-", j_r6, "");
63
+ i0.ɵɵproperty("routerLink", setting_r10.routeParams.commands)("preserveFragment", setting_r10.routeParams.extras && setting_r10.routeParams.extras.preserveFragment)("skipLocationChange", setting_r10.routeParams.extras && setting_r10.routeParams.extras.skipLocationChange)("replaceUrl", setting_r10.routeParams.extras && setting_r10.routeParams.extras.replaceUrl)("queryParams", setting_r10.routeParams.extras && setting_r10.routeParams.extras.queryParams)("title", setting_r10.label);
64
+ i0.ɵɵattribute("aria-selected", ctx_r8.selectedSetting === setting_r10);
63
65
  i0.ɵɵadvance(1);
64
- i0.ɵɵproperty("ngClass", ctx_r7.getSmeIconClass(setting_r9));
66
+ i0.ɵɵproperty("ngClass", ctx_r8.getSmeIconClass(setting_r10));
65
67
  i0.ɵɵadvance(2);
66
- i0.ɵɵclassProp("sme-dirty", !!(setting_r9.form && setting_r9.form.dirty))("sme-pristine", !(setting_r9.form && setting_r9.form.dirty));
67
- i0.ɵɵproperty("id", ctx_r7.idBag.option + "-" + j_r5 + "-" + i_r10);
68
+ i0.ɵɵclassProp("sme-dirty", !!(setting_r10.form && setting_r10.form.dirty))("sme-pristine", !(setting_r10.form && setting_r10.form.dirty));
69
+ i0.ɵɵproperty("id", ctx_r8.idBag.option + "-" + j_r6 + "-" + i_r11);
68
70
  i0.ɵɵadvance(1);
69
- i0.ɵɵtextInterpolate(setting_r9.label);
71
+ i0.ɵɵtextInterpolate(setting_r10.label);
70
72
  } }
71
- function CommonSettingsComponent_li_6_Template(rf, ctx) { if (rf & 1) {
72
- i0.ɵɵelementStart(0, "li", 9);
73
- i0.ɵɵtemplate(1, CommonSettingsComponent_li_6_h3_1_Template, 2, 3, "h3", 10);
74
- i0.ɵɵtemplate(2, CommonSettingsComponent_li_6_a_2_Template, 5, 19, "a", 11);
73
+ function CommonSettingsComponent_li_10_Template(rf, ctx) { if (rf & 1) {
74
+ i0.ɵɵelementStart(0, "li", 14);
75
+ i0.ɵɵtemplate(1, CommonSettingsComponent_li_10_h4_1_Template, 2, 3, "h4", 15);
76
+ i0.ɵɵtemplate(2, CommonSettingsComponent_li_10_a_2_Template, 5, 19, "a", 16);
75
77
  i0.ɵɵelementEnd();
76
78
  } if (rf & 2) {
77
- const group_r4 = ctx.$implicit;
78
- const ctx_r1 = i0.ɵɵnextContext();
79
+ const group_r5 = ctx.$implicit;
80
+ const ctx_r2 = i0.ɵɵnextContext();
79
81
  i0.ɵɵadvance(1);
80
- i0.ɵɵproperty("ngIf", group_r4.group !== ctx_r1.defaultGroup);
82
+ i0.ɵɵproperty("ngIf", group_r5.group !== ctx_r2.defaultGroup);
81
83
  i0.ɵɵadvance(1);
82
- i0.ɵɵproperty("ngForOf", group_r4.options);
84
+ i0.ɵɵproperty("ngForOf", group_r5.options);
83
85
  } }
84
- function CommonSettingsComponent_div_7_div_1_Template(rf, ctx) { if (rf & 1) {
85
- const _r17 = i0.ɵɵgetCurrentView();
86
- i0.ɵɵelementStart(0, "div", 18);
87
- i0.ɵɵlistener("click", function CommonSettingsComponent_div_7_div_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r17); const layer_r15 = ctx.$implicit; const ctx_r16 = i0.ɵɵnextContext(2); return ctx_r16.onOverlayClick(layer_r15); });
86
+ function CommonSettingsComponent_div_11_div_1_Template(rf, ctx) { if (rf & 1) {
87
+ const _r18 = i0.ɵɵgetCurrentView();
88
+ i0.ɵɵelementStart(0, "div", 23);
89
+ i0.ɵɵlistener("click", function CommonSettingsComponent_div_11_div_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r18); const layer_r16 = ctx.$implicit; const ctx_r17 = i0.ɵɵnextContext(2); return ctx_r17.onOverlayClick(layer_r16); });
88
90
  i0.ɵɵelementEnd();
89
91
  } }
90
- function CommonSettingsComponent_div_7_Template(rf, ctx) { if (rf & 1) {
92
+ function CommonSettingsComponent_div_11_Template(rf, ctx) { if (rf & 1) {
91
93
  i0.ɵɵelementStart(0, "div");
92
- i0.ɵɵtemplate(1, CommonSettingsComponent_div_7_div_1_Template, 1, 0, "div", 17);
94
+ i0.ɵɵtemplate(1, CommonSettingsComponent_div_11_div_1_Template, 1, 0, "div", 22);
93
95
  i0.ɵɵelementEnd();
94
96
  } if (rf & 2) {
95
- const ctx_r2 = i0.ɵɵnextContext();
97
+ const ctx_r3 = i0.ɵɵnextContext();
96
98
  i0.ɵɵadvance(1);
97
- i0.ɵɵproperty("ngForOf", ctx_r2.layers);
99
+ i0.ɵɵproperty("ngForOf", ctx_r3.layers);
98
100
  } }
99
- function CommonSettingsComponent_sme_settings_header_8_h3_1_Template(rf, ctx) { if (rf & 1) {
100
- i0.ɵɵelementStart(0, "h3", 20);
101
+ function CommonSettingsComponent_sme_settings_header_12_h3_1_Template(rf, ctx) { if (rf & 1) {
102
+ i0.ɵɵelementStart(0, "h3", 25);
101
103
  i0.ɵɵtext(1);
102
104
  i0.ɵɵelementEnd();
103
105
  } if (rf & 2) {
104
- const ctx_r18 = i0.ɵɵnextContext(2);
105
- i0.ɵɵattribute("aria-label", ctx_r18.selectedSetting.label);
106
+ const ctx_r19 = i0.ɵɵnextContext(2);
107
+ i0.ɵɵattribute("aria-label", ctx_r19.selectedSetting.label);
106
108
  i0.ɵɵadvance(1);
107
- i0.ɵɵtextInterpolate1(" ", ctx_r18.selectedSetting.label, "");
109
+ i0.ɵɵtextInterpolate1(" ", ctx_r19.selectedSetting.label, "");
108
110
  } }
109
- function CommonSettingsComponent_sme_settings_header_8_Template(rf, ctx) { if (rf & 1) {
111
+ function CommonSettingsComponent_sme_settings_header_12_Template(rf, ctx) { if (rf & 1) {
110
112
  i0.ɵɵelementStart(0, "sme-settings-header");
111
- i0.ɵɵtemplate(1, CommonSettingsComponent_sme_settings_header_8_h3_1_Template, 2, 2, "h3", 19);
113
+ i0.ɵɵtemplate(1, CommonSettingsComponent_sme_settings_header_12_h3_1_Template, 2, 2, "h3", 24);
112
114
  i0.ɵɵelementEnd();
113
115
  } if (rf & 2) {
114
- const ctx_r3 = i0.ɵɵnextContext();
116
+ const ctx_r4 = i0.ɵɵnextContext();
115
117
  i0.ɵɵadvance(1);
116
- i0.ɵɵproperty("ngIf", !!ctx_r3.selectedSetting);
118
+ i0.ɵɵproperty("ngIf", !!ctx_r4.selectedSetting);
117
119
  } }
118
- const _c0 = ["*"];
120
+ const _c1 = ["*"];
119
121
  /**
120
122
  * Container around settings component, handles common settings behavior.
121
123
  */
@@ -129,11 +131,24 @@ export class CommonSettingsComponent extends CoreBaseComponent {
129
131
  this.rpcShellService = rpcShellService;
130
132
  this.defaultGroup = 'default';
131
133
  this.layers = [];
134
+ /**
135
+ * Search box related variables
136
+ */
137
+ this.filter = '';
138
+ this.filteredSettings = [];
132
139
  this.showHeader = true;
133
140
  this.hackShowOverlay = false;
134
141
  this.hackToolHeader = false;
142
+ /**
143
+ * Controls whether the tab list showing the Settings items is scrollable or not
144
+ * Default to true. Allowing separate scroll bar for the navbar and the selected Settings.
145
+ * Set to false for backward compatibility and use previous behavior where there is
146
+ * only 1 single scroll bar for both navbar and content of the selected Settings item.
147
+ */
148
+ this.scrollableSecondaryNav = true;
135
149
  this.autofocus = true;
136
150
  this.combinedForm = new FormGroup({});
151
+ this.searchTitle = this.strings.MsftSmeShell.Angular.searchPlaceHolder;
137
152
  }
138
153
  /**
139
154
  * The source name to use for logging
@@ -194,11 +209,20 @@ export class CommonSettingsComponent extends CoreBaseComponent {
194
209
  this.autofocus = false;
195
210
  }
196
211
  }
212
+ // Setting Title header is managed by child component this.settingsComponent,
213
+ // after current view and child view has been rendered, pass along the selectedSetting
214
+ // string if it exists so child view will render the title
215
+ if (this.selectedSetting) {
216
+ this.onSmeRouterLinkActivated(this.selectedSetting);
217
+ }
197
218
  }
198
219
  createMenu() {
220
+ // Before creating the Settings menu, filter the Settings menu to only display
221
+ // items that matches the filter
222
+ this.filteredSettings = this.filterSetting();
199
223
  const groupTools = [];
200
224
  groupTools['default'] = { group: 'default', options: [] };
201
- this.settings.forEach((setting) => {
225
+ this.filteredSettings.forEach((setting) => {
202
226
  if (!!!setting.group) {
203
227
  groupTools['default'].options.push(setting);
204
228
  }
@@ -349,33 +373,81 @@ export class CommonSettingsComponent extends CoreBaseComponent {
349
373
  }
350
374
  return formControl.value;
351
375
  }
376
+ /**
377
+ * Update this.selectedSetting to the newly selected Settings item when user navigate to a new Settings item
378
+ * Also call the child component this.settingsComponent to update the settingsTitle to reflect the title
379
+ * of the newly selected Settings item
380
+ *
381
+ * @param newSetting The newly selected Settings item
382
+ */
383
+ onSmeRouterLinkActivated(newSetting) {
384
+ this.selectedSetting = newSetting;
385
+ if (this.settingsComponent) {
386
+ this.settingsComponent.updateSelectedSettingTitle(newSetting.label);
387
+ }
388
+ }
389
+ /**
390
+ * Callback function for the search field
391
+ */
392
+ onSearch() {
393
+ this.searchTextBox.searching = true;
394
+ setTimeout(() => {
395
+ this.createMenu();
396
+ this.searchTextBox.searching = false;
397
+ });
398
+ }
399
+ /**
400
+ * Filter out the settings Item based on this.filter string and match the title of Settings Items
401
+ */
402
+ filterSetting() {
403
+ const settings = this.settings;
404
+ if (!this.filter) {
405
+ return settings;
406
+ }
407
+ const localFilter = this.filter.toLocaleLowerCase();
408
+ return settings.filter(setting => {
409
+ if (setting.label.toLocaleLowerCase().indexOf(localFilter) > -1) {
410
+ return true;
411
+ }
412
+ return false;
413
+ });
414
+ }
352
415
  }
353
416
  /** @nocollapse */ CommonSettingsComponent.ɵfac = function CommonSettingsComponent_Factory(t) { return new (t || CommonSettingsComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i2.SettingsFormService), i0.ɵɵdirectiveInject(i0.IterableDiffers), i0.ɵɵdirectiveInject(i3.AppContextService), i0.ɵɵdirectiveInject(i4.RpcShellService)); };
354
417
  /** @nocollapse */ CommonSettingsComponent.ɵcmp = i0.ɵɵdefineComponent({ type: CommonSettingsComponent, selectors: [["sme-common-settings"]], viewQuery: function CommonSettingsComponent_Query(rf, ctx) { if (rf & 1) {
418
+ i0.ɵɵviewQuery(_c0, 1);
355
419
  i0.ɵɵviewQuery(SettingsComponent, 1);
356
420
  } if (rf & 2) {
357
421
  let _t;
422
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchTextBox = _t.first);
358
423
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.settingsComponent = _t.first);
359
- } }, inputs: { settingsTitle: "settingsTitle", settings: "settings", showHeader: "showHeader", hackShowOverlay: "hackShowOverlay", hackToolHeader: "hackToolHeader", backRoute: "backRoute" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 13, vars: 6, consts: [[3, "settingsTitle"], ["class", "sme-layout-tool-header", 4, "ngIf"], ["role", "region"], ["role", "tablist", 1, "sme-padding-horizontal-lg", "sme-arrange-stack-v", "sme-focus-zone"], ["role", "presentation", 1, "sme-position-flex-auto", "sme-arrange-stack-v", "sme-arrange-overflow-hide-x", "sme-arrange-overflow-auto-y"], ["class", "sme-margin-inset-none", "role", "presentation", 4, "ngFor", "ngForOf"], [4, "ngIf"], [1, "sme-layout-tool-header"], [1, "sme-position-flex-none", "sme-font-h3"], ["role", "presentation", 1, "sme-margin-inset-none"], ["class", "sme-margin-top-xs sme-font-h5", 3, "id", "title", 4, "ngIf"], ["class", "sme-padding-squish-v-sm sme-arrange-stack-h sme-scheme-nav-item", "role", "tab", "href", "setting.routeParams.extras && setting.routeParams.extras.replaceUrl", "routerLinkActive", "sme-active", 3, "routerLink", "preserveFragment", "skipLocationChange", "replaceUrl", "queryParams", "title", "smeRouterLinkActivated", 4, "ngFor", "ngForOf"], [1, "sme-margin-top-xs", "sme-font-h5", 3, "id", "title"], ["role", "tab", "href", "setting.routeParams.extras && setting.routeParams.extras.replaceUrl", "routerLinkActive", "sme-active", 1, "sme-padding-squish-v-sm", "sme-arrange-stack-h", "sme-scheme-nav-item", 3, "routerLink", "preserveFragment", "skipLocationChange", "replaceUrl", "queryParams", "title", "smeRouterLinkActivated"], [1, "sme-icon", "sme-margin-right-xs", 3, "ngClass"], [1, "sme-position-flex-auto"], [3, "id"], ["class", "sme-layout-absolute sme-position-inset-none sme-layer-above sme-scheme-backdrop-opaque", 3, "click", 4, "ngFor", "ngForOf"], [1, "sme-layout-absolute", "sme-position-inset-none", "sme-layer-above", "sme-scheme-backdrop-opaque", 3, "click"], ["id", "sme-shell-setting-selectedTitle", 4, "ngIf"], ["id", "sme-shell-setting-selectedTitle"]], template: function CommonSettingsComponent_Template(rf, ctx) { if (rf & 1) {
424
+ } }, inputs: { settingsTitle: "settingsTitle", settings: "settings", showHeader: "showHeader", hackShowOverlay: "hackShowOverlay", hackToolHeader: "hackToolHeader", backRoute: "backRoute", scrollableSecondaryNav: "scrollableSecondaryNav" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c1, decls: 17, vars: 11, consts: [[3, "settingsTitle"], [1, "sme-position-stretch"], ["class", "sme-layout-tool-header", 4, "ngIf"], ["role", "region", 1, "sme-position-stretch", "sme-arrange-stack-v"], [1, "sme-position-flex-none", "sme-focus-zone"], [1, "sme-margin-squish-v-sm"], ["type", "search", "name", "toolsListSearch", 3, "ngModel", "placeholder", "autofocus", "count", "ngModelChange", "search"], ["searchTextBox", ""], ["role", "tablist", 1, "sme-arrange-stack-v", "sme-focus-zone", 3, "ngClass"], ["role", "presentation", 1, "sme-position-flex-auto", "sme-arrange-stack-v", "sme-arrange-overflow-hide-x", "sme-arrange-overflow-auto-y"], ["class", "sme-margin-inset-none", "role", "presentation", 4, "ngFor", "ngForOf"], [4, "ngIf"], [1, "sme-layout-tool-header"], [1, "sme-position-flex-none", "sme-font-h3"], ["role", "presentation", 1, "sme-margin-inset-none"], ["class", "sme-font-h4 sme-font-h4-settings", 3, "id", "title", 4, "ngIf"], ["class", "sme-padding-squish-v-sm sme-arrange-stack-h sme-scheme-nav-list-item", "role", "tab", "href", "setting.routeParams.extras && setting.routeParams.extras.replaceUrl", "routerLinkActive", "sme-active", 3, "routerLink", "preserveFragment", "skipLocationChange", "replaceUrl", "queryParams", "title", "smeRouterLinkActivated", 4, "ngFor", "ngForOf"], [1, "sme-font-h4", "sme-font-h4-settings", 3, "id", "title"], ["role", "tab", "href", "setting.routeParams.extras && setting.routeParams.extras.replaceUrl", "routerLinkActive", "sme-active", 1, "sme-padding-squish-v-sm", "sme-arrange-stack-h", "sme-scheme-nav-list-item", 3, "routerLink", "preserveFragment", "skipLocationChange", "replaceUrl", "queryParams", "title", "smeRouterLinkActivated"], [1, "sme-icon", "sme-margin-right-xs", 3, "ngClass"], [1, "sme-position-flex-auto"], [3, "id"], ["class", "sme-layout-absolute sme-position-inset-none sme-layer-above sme-scheme-backdrop-opaque", 3, "click", 4, "ngFor", "ngForOf"], [1, "sme-layout-absolute", "sme-position-inset-none", "sme-layer-above", "sme-scheme-backdrop-opaque", 3, "click"], ["id", "sme-shell-setting-selectedTitle", 4, "ngIf"], ["id", "sme-shell-setting-selectedTitle"]], template: function CommonSettingsComponent_Template(rf, ctx) { if (rf & 1) {
360
425
  i0.ɵɵprojectionDef();
361
426
  i0.ɵɵelementStart(0, "sme-settings", 0);
362
- i0.ɵɵelementStart(1, "sme-settings-navigation");
363
- i0.ɵɵtemplate(2, CommonSettingsComponent_header_2_Template, 3, 2, "header", 1);
364
- i0.ɵɵelementStart(3, "div", 2);
365
- i0.ɵɵelementStart(4, "nav", 3);
366
- i0.ɵɵelementStart(5, "ul", 4);
367
- i0.ɵɵtemplate(6, CommonSettingsComponent_li_6_Template, 3, 2, "li", 5);
427
+ i0.ɵɵelementStart(1, "sme-settings-navigation", 1);
428
+ i0.ɵɵtemplate(2, CommonSettingsComponent_header_2_Template, 3, 2, "header", 2);
429
+ i0.ɵɵelementStart(3, "div", 3);
430
+ i0.ɵɵelementStart(4, "div", 4);
431
+ i0.ɵɵelementStart(5, "form", 5);
432
+ i0.ɵɵelementStart(6, "sme-form-field", 6, 7);
433
+ i0.ɵɵlistener("ngModelChange", function CommonSettingsComponent_Template_sme_form_field_ngModelChange_6_listener($event) { return ctx.filter = $event; })("search", function CommonSettingsComponent_Template_sme_form_field_search_6_listener() { return ctx.onSearch(); });
368
434
  i0.ɵɵelementEnd();
369
435
  i0.ɵɵelementEnd();
370
436
  i0.ɵɵelementEnd();
371
- i0.ɵɵtemplate(7, CommonSettingsComponent_div_7_Template, 2, 1, "div", 6);
437
+ i0.ɵɵelementStart(8, "nav", 8);
438
+ i0.ɵɵelementStart(9, "ul", 9);
439
+ i0.ɵɵtemplate(10, CommonSettingsComponent_li_10_Template, 3, 2, "li", 10);
372
440
  i0.ɵɵelementEnd();
373
- i0.ɵɵtemplate(8, CommonSettingsComponent_sme_settings_header_8_Template, 2, 1, "sme-settings-header", 6);
374
- i0.ɵɵelementStart(9, "sme-settings-content");
375
- i0.ɵɵelement(10, "router-outlet");
376
441
  i0.ɵɵelementEnd();
377
- i0.ɵɵelementStart(11, "sme-settings-footer");
378
- i0.ɵɵprojection(12);
442
+ i0.ɵɵelementEnd();
443
+ i0.ɵɵtemplate(11, CommonSettingsComponent_div_11_Template, 2, 1, "div", 11);
444
+ i0.ɵɵelementEnd();
445
+ i0.ɵɵtemplate(12, CommonSettingsComponent_sme_settings_header_12_Template, 2, 1, "sme-settings-header", 11);
446
+ i0.ɵɵelementStart(13, "sme-settings-content");
447
+ i0.ɵɵelement(14, "router-outlet");
448
+ i0.ɵɵelementEnd();
449
+ i0.ɵɵelementStart(15, "sme-settings-footer");
450
+ i0.ɵɵprojection(16);
379
451
  i0.ɵɵelementEnd();
380
452
  i0.ɵɵelementEnd();
381
453
  } if (rf & 2) {
@@ -385,6 +457,10 @@ export class CommonSettingsComponent extends CoreBaseComponent {
385
457
  i0.ɵɵadvance(1);
386
458
  i0.ɵɵattribute("aria-label", ctx.settingsTitle);
387
459
  i0.ɵɵadvance(3);
460
+ i0.ɵɵproperty("ngModel", ctx.filter)("placeholder", ctx.searchTitle)("autofocus", true)("count", ctx.filteredSettings ? ctx.filteredSettings.length : 0);
461
+ i0.ɵɵadvance(2);
462
+ i0.ɵɵproperty("ngClass", ctx.scrollableSecondaryNav ? "sme-position-flex-auto sme-arrange-overflow-auto-y" : "");
463
+ i0.ɵɵadvance(2);
388
464
  i0.ɵɵproperty("ngForOf", ctx.groupTools);
389
465
  i0.ɵɵadvance(1);
390
466
  i0.ɵɵproperty("ngIf", ctx.hackShowOverlay);
@@ -397,7 +473,10 @@ export class CommonSettingsComponent extends CoreBaseComponent {
397
473
  selector: 'sme-common-settings',
398
474
  templateUrl: './common-settings.component.html'
399
475
  }]
400
- }], function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i2.SettingsFormService }, { type: i0.IterableDiffers }, { type: i3.AppContextService }, { type: i4.RpcShellService }]; }, { settingsTitle: [{
476
+ }], function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i2.SettingsFormService }, { type: i0.IterableDiffers }, { type: i3.AppContextService }, { type: i4.RpcShellService }]; }, { searchTextBox: [{
477
+ type: ViewChild,
478
+ args: ['searchTextBox']
479
+ }], settingsTitle: [{
401
480
  type: Input
402
481
  }], settings: [{
403
482
  type: Input
@@ -409,8 +488,10 @@ export class CommonSettingsComponent extends CoreBaseComponent {
409
488
  type: Input
410
489
  }], backRoute: [{
411
490
  type: Input
491
+ }], scrollableSecondaryNav: [{
492
+ type: Input
412
493
  }], settingsComponent: [{
413
494
  type: ViewChild,
414
495
  args: [SettingsComponent]
415
496
  }] }); })();
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3NldHRpbmdzL2NvbW1vbi1zZXR0aW5ncy9jb21tb24tc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc2V0dGluZ3MvY29tbW9uLXNldHRpbmdzL2NvbW1vbi1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFFBQVEsRUFDUixLQUFLLEVBRUwsZUFBZSxFQUlmLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBR0gsTUFBTSxFQUVULE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtFQUErRSxDQUFDO0FBR3RILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUVoRixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7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O1FBQ2pDLGlCQUF1QjtRQUN2Qiw0Q0FBcUI7UUFDbkIsbUJBQXlCO1FBQzNCLGlCQUFzQjtRQUN4QixpQkFBZTs7UUFqREQsMkVBQXFEO1FBRXZCLGVBQW9CO1FBQXBCLHlDQUFvQjtRQUd6QyxlQUFpQztRQUFqQywrQ0FBaUM7UUFJeEIsZUFBZTtRQUFmLHdDQUFlO1FBd0JyQyxlQUFxQjtRQUFyQiwwQ0FBcUI7UUFNUCxlQUFrQjtRQUFsQix1Q0FBa0I7O3VGRFE3Qix1QkFBdUI7Y0FKbkMsU0FBUztlQUFDO2dCQUNQLFFBQVEsRUFBRSxxQkFBcUI7Z0JBQy9CLFdBQVcsRUFBRSxrQ0FBa0M7YUFDbEQ7OE1BaUJVLGFBQWE7a0JBRG5CLEtBQUs7WUFJQyxRQUFRO2tCQURkLEtBQUs7WUFJQyxVQUFVO2tCQURoQixLQUFLO1lBSUMsZUFBZTtrQkFEckIsS0FBSztZQUlDLGNBQWM7a0JBRHBCLEtBQUs7WUFJQyxTQUFTO2tCQURmLEtBQUs7WUFJQyxpQkFBaUI7a0JBRHZCLFNBQVM7bUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0NoZWNrZWQsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBEb0NoZWNrLFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIEl0ZXJhYmxlRGlmZmVyLFxyXG4gICAgSXRlcmFibGVEaWZmZXJzLFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LFxyXG4gICAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxyXG4gICAgTmF2aWdhdGlvbkV4dHJhcyxcclxuICAgIFJvdXRlcixcclxuICAgIFJvdXRlclN0YXRlU25hcHNob3RcclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOZXQgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvbmV0JztcclxuaW1wb3J0IHsgUnBjT3ZlcmxheUNsb3NlQ2xpZW50IH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9ycGMvb3ZlcmxheS9ycGMtb3ZlcmxheS1jbG9zZS1jbGllbnQnO1xyXG5pbXBvcnQgeyBScGNEaWFsb2dPdmVybGF5RGF0YSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvcnBjL292ZXJsYXkvcnBjLW92ZXJsYXktbW9kZWwnO1xyXG5pbXBvcnQgeyBEZWZlcnJlZERhdGEgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL3JwYy9ycGMnO1xyXG5pbXBvcnQgeyBScGNUeXBlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9ycGMvcnBjLWJhc2UnO1xyXG5pbXBvcnQgeyBScGNPdXRib3VuZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvcnBjL3JwYy1vdXRib3VuZCc7XHJcbmltcG9ydCB7IEVNUFRZLCBmcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEFwcENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9hcHAtY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUnBjU2hlbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9ycGMtc2hlbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IENvcmVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uL2Jhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2FuQ29tcG9uZW50RGVhY3RpdmF0ZSB9IGZyb20gJy4uL3NldHRpbmdzLWNhbi1kZWFjdGl2YXRlLWd1YXJkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZXR0aW5nc0Zvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vc2V0dGluZ3MtZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuLi9zZXR0aW5ncy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tb25TZXR0aW5nc05hdmlnYXRpb25JdGVtLCBDb21tb25TZXR0aW5nc05hdmlnYXRpb25JdGVtV2l0aEZvcm0gfSBmcm9tICcuL2NvbW1vbi1zZXR0aW5ncy1uYXZpZ2F0aW9uLWl0ZW0nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHcm91cFRvb2xzTWVudSB7XHJcbiAgICBncm91cDogc3RyaW5nO1xyXG4gICAgb3B0aW9uczogQ29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbVdpdGhGb3JtW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb250YWluZXIgYXJvdW5kIHNldHRpbmdzIGNvbXBvbmVudCwgaGFuZGxlcyBjb21tb24gc2V0dGluZ3MgYmVoYXZpb3IuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWNvbW1vbi1zZXR0aW5ncycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29tbW9uLXNldHRpbmdzLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tbW9uU2V0dGluZ3NDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIERvQ2hlY2ssIEFmdGVyVmlld0NoZWNrZWQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdDb21tb25TZXR0aW5nc0NvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbWJpbmVkRm9ybTogRm9ybUdyb3VwO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRHcm91cCA9ICdkZWZhdWx0JztcclxuICAgIHB1YmxpYyBncm91cFRvb2xzOiBHcm91cFRvb2xzTWVudVtdO1xyXG4gICAgcHVibGljIGxheWVyczogUnBjRGlhbG9nT3ZlcmxheURhdGFbXSA9IFtdO1xyXG4gICAgcHVibGljIHNlbGVjdGVkU2V0dGluZzogQ29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldHRpbmdzVGl0bGU6IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldHRpbmdzOiBDb21tb25TZXR0aW5nc05hdmlnYXRpb25JdGVtW107XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG93SGVhZGVyID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGhhY2tTaG93T3ZlcmxheSA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaGFja1Rvb2xIZWFkZXIgPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGJhY2tSb3V0ZTogeyBjb21tYW5kczogYW55W10sIGV4dHJhcz86IE5hdmlnYXRpb25FeHRyYXMgfTtcclxuXHJcbiAgICBAVmlld0NoaWxkKFNldHRpbmdzQ29tcG9uZW50KVxyXG4gICAgcHVibGljIHNldHRpbmdzQ29tcG9uZW50OiBTZXR0aW5nc0NvbXBvbmVudDtcclxuXHJcbiAgICBwcml2YXRlIGxhdGVzdEZvcm06IEZvcm1Hcm91cDtcclxuICAgIHByaXZhdGUgbGF0ZXN0UHJpc3RpbmVGb3JtVmFsdWU6IGFueTtcclxuICAgIHByaXZhdGUgbGF0ZXN0Rm9ybVVwZGF0ZVZhbHVlSW5Db21wb25lbnQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIHNldHRpbmdzRGlmZmVyOiBJdGVyYWJsZURpZmZlcjxhbnk+O1xyXG4gICAgcHJpdmF0ZSBhdXRvZm9jdXMgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBzZXR0aW5nc0Zvcm1zOiBTZXR0aW5nc0Zvcm1TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgaXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXHJcbiAgICAgICAgcHJpdmF0ZSBhcHBDb250ZXh0OiBBcHBDb250ZXh0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJwY1NoZWxsU2VydmljZTogUnBjU2hlbGxTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5jb21iaW5lZEZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLnNldHRpbmdzRm9ybXMuZm9ybUFkZGVkKCkuc3Vic2NyaWJlKChmb3JtQWRkZWREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHRvIGF2b2lkIGR1cGxpY2F0ZXMgd2UgZmlyc3QgcmVtb3ZlIHRoZSBmb3JtIGlmIGl0IGV4aXN0c1xyXG4gICAgICAgICAgICB0aGlzLmxhdGVzdEZvcm0gPSBmb3JtQWRkZWREYXRhLmZvcm1Hcm91cDtcclxuICAgICAgICAgICAgdGhpcy5sYXRlc3RQcmlzdGluZUZvcm1WYWx1ZSA9IHRoaXMuZ2V0UmF3VmFsdWVSZWN1cnNpdmUoZm9ybUFkZGVkRGF0YS5mb3JtR3JvdXApO1xyXG4gICAgICAgICAgICB0aGlzLmxhdGVzdEZvcm1VcGRhdGVWYWx1ZUluQ29tcG9uZW50ID0gZm9ybUFkZGVkRGF0YS51cGRhdGVWYWx1ZUluQ29tcG9uZW50O1xyXG4gICAgICAgICAgICB0aGlzLnJlY2FsY3VsYXRlQWN0aXZlUGFuZWwoKTtcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc0RpZmZlciA9IHRoaXMuaXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5zZXR0aW5ncykuY3JlYXRlKG51bGwpO1xyXG5cclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXRlQWN0aXZlUGFuZWwoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGFja1Nob3dPdmVybGF5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMucnBjU2hlbGxTZXJ2aWNlLm92ZXJsYXlPcGVuU3ViamVjdFxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZGVmZXJyZWREYXRhOiBEZWZlcnJlZERhdGE8UnBjRGlhbG9nT3ZlcmxheURhdGEsIHZvaWQ+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcmxheSB0b29scyB3aXRoIG9uZSBtb3JlIGxheWVyIG9yIHJlbW92ZSBvbmUgZnJvbSB0b3BcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmZXJyZWREYXRhLmRhdGEub3ZlcmxheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheWVycy5wdXNoKGRlZmVycmVkRGF0YS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGF5ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdScGMgT3ZlcmxheUNsb3NlOiBjbG9zZSByZXF1ZXN0IGlzIGNhbGxlZCB3aGlsZSBsYXllciBpcyBubyBsb25nZXIgYXZhaWxhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkRGF0YS5kZWZlcnJlZC5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMuc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc0RpZmZlciA9IHRoaXMuaXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5zZXR0aW5ncykuY3JlYXRlKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNyZWF0ZU1lbnUoKTtcclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXRlQWN0aXZlUGFuZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xyXG4gICAgICAgIHN1cGVyLm5nRG9DaGVjaygpO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzRGlmZmVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLnNldHRpbmdzRGlmZmVyLmRpZmYodGhpcy5zZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU1lbnUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9mb2N1cykge1xyXG4gICAgICAgICAgICBjb25zdCBmb2N1c0VsZW1lbnRzID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tyb2xlPVwidGFiXCJdJyk7XHJcbiAgICAgICAgICAgIGlmIChmb2N1c0VsZW1lbnRzICYmIGZvY3VzRWxlbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBmb2N1c0VsZW1lbnRzWzBdLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9mb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjcmVhdGVNZW51KCkge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwVG9vbHM6IEdyb3VwVG9vbHNNZW51W10gPSBbXTtcclxuICAgICAgICBncm91cFRvb2xzWydkZWZhdWx0J10gPSB7IGdyb3VwOiAnZGVmYXVsdCcsIG9wdGlvbnM6IFtdIH07XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5mb3JFYWNoKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghISFzZXR0aW5nLmdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICBncm91cFRvb2xzWydkZWZhdWx0J10ub3B0aW9ucy5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhIWdyb3VwVG9vbHNbc2V0dGluZy5ncm91cF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBncm91cFRvb2xzW3NldHRpbmcuZ3JvdXBdID0geyBncm91cDogc2V0dGluZy5ncm91cCwgdGl0bGU6IHNldHRpbmcuZ3JvdXBUaXRsZSwgb3B0aW9uczogW10gfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGdyb3VwVG9vbHNbc2V0dGluZy5ncm91cF0ub3B0aW9ucy5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5ncm91cFRvb2xzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIGdyb3VwVG9vbHMpIHtcclxuICAgICAgICAgICAgaWYgKHByb3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBUb29scy5wdXNoKGdyb3VwVG9vbHNbcHJvcF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWNhbGN1bGF0ZUFjdGl2ZVBhbmVsKCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmcgPSA8Q29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbVdpdGhGb3JtPnRoaXMuc2VsZWN0ZWRTZXR0aW5nO1xyXG4gICAgICAgIGlmIChNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHNldHRpbmcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nLmZvcm0gJiYgc2V0dGluZy5mb3JtLmRpcnR5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZ2V0UmF3VmFsdWVSZWN1cnNpdmUoc2V0dGluZy5mb3JtKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLnVwZGF0ZVZhbHVlSW5Db21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3NGb3Jtcy5uZXdGb3JtVmFsdWUoc2V0dGluZy5mb3JtLCBmb3JtVmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXRlc3RGb3JtLnNldFZhbHVlKGZvcm1WYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubGF0ZXN0Rm9ybS5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc0Zvcm1zLnJlbW92ZUZvcm0oc2V0dGluZy5mb3JtKTtcclxuICAgICAgICBzZXR0aW5nLmZvcm0gPSB0aGlzLmxhdGVzdEZvcm07XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nLmZvcm0pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29tYmluZWRGb3JtLmNvbnRyb2xzW3NldHRpbmcubGFiZWxdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmVkRm9ybS5zZXRDb250cm9sKHNldHRpbmcubGFiZWwsIHNldHRpbmcuZm9ybSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmVkRm9ybS5hZGRDb250cm9sKHNldHRpbmcubGFiZWwsIHNldHRpbmcuZm9ybSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldHRpbmcudXBkYXRlVmFsdWVJbkNvbXBvbmVudCA9IHRoaXMubGF0ZXN0Rm9ybVVwZGF0ZVZhbHVlSW5Db21wb25lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2NhcmRBbGxDaGlsZEZvcm1zKCkge1xyXG4gICAgICAgIC8vIEZvciB0aGUgY3VycmVudCBhY3RpdmUgc2V0dGluZywgd2UgbmVlZCB0byByZXNldCB0aGUgZm9ybSB0byBpdHNcclxuICAgICAgICAvLyBvcmlnaW5hbCBwcmlzdGluZSBmb3JtIHdoZW4gZGlzY2FyZGluZyBjaGFuZ2VzXHJcbiAgICAgICAgY29uc3QgYWN0aXZlU2V0dGluZyA9IHRoaXMuc2VsZWN0ZWRTZXR0aW5nO1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdXaXRoRm9ybSA9IDxDb21tb25TZXR0aW5nc05hdmlnYXRpb25JdGVtV2l0aEZvcm0+YWN0aXZlU2V0dGluZztcclxuICAgICAgICBpZiAoc2V0dGluZ1dpdGhGb3JtLmZvcm0pIHtcclxuICAgICAgICAgICAgc2V0dGluZ1dpdGhGb3JtLmZvcm0ucmVzZXQodGhpcy5sYXRlc3RQcmlzdGluZUZvcm1WYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmdzLmZvckVhY2goKG90aGVyU2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAob3RoZXJTZXR0aW5nICE9PSBhY3RpdmVTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlcnNldHRpbmdXaXRoRm9ybSA9IDxDb21tb25TZXR0aW5nc05hdmlnYXRpb25JdGVtV2l0aEZvcm0+b3RoZXJTZXR0aW5nO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nc0Zvcm1zLnJlbW92ZUZvcm0ob3RoZXJzZXR0aW5nV2l0aEZvcm0uZm9ybSk7XHJcbiAgICAgICAgICAgICAgICBvdGhlcnNldHRpbmdXaXRoRm9ybS5mb3JtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbWJpbmVkRm9ybS5jb250cm9sc1tvdGhlcnNldHRpbmdXaXRoRm9ybS5sYWJlbF0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmVkRm9ybS5yZW1vdmVDb250cm9sKG90aGVyc2V0dGluZ1dpdGhGb3JtLmxhYmVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhY2NlcHRBbGxDaGlsZEZvcm1zVmFsdWUoKSB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlU2V0dGluZyA9IHRoaXMuc2VsZWN0ZWRTZXR0aW5nO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MuZm9yRWFjaCgoc2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nV2l0aEZvcm0gPSA8Q29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbVdpdGhGb3JtPnNldHRpbmc7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nV2l0aEZvcm0uZm9ybSkge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ1dpdGhGb3JtLmZvcm0ucmVzZXQodGhpcy5nZXRSYXdWYWx1ZVJlY3Vyc2l2ZShzZXR0aW5nV2l0aEZvcm0uZm9ybSkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVNldHRpbmcgPT09IHNldHRpbmdXaXRoRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF0ZXN0UHJpc3RpbmVGb3JtVmFsdWUgPSB0aGlzLmdldFJhd1ZhbHVlUmVjdXJzaXZlKHNldHRpbmdXaXRoRm9ybS5mb3JtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTbWVJY29uQ2xhc3Moc2V0dGluZzogQ29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbSkge1xyXG4gICAgICAgIGNvbnN0IG5nQ2xhc3NQYXJhbWV0ZXIgPSB7fTtcclxuICAgICAgICBpZiAoc2V0dGluZy5zbWVJY29uQ2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgIG5nQ2xhc3NQYXJhbWV0ZXJbc2V0dGluZy5zbWVJY29uQ2xhc3NOYW1lXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZ0NsYXNzUGFyYW1ldGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjYW5EZWFjdGl2YXRlKFxyXG4gICAgICAgIGNvbXBvbmVudDogQ2FuQ29tcG9uZW50RGVhY3RpdmF0ZSxcclxuICAgICAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcclxuICAgICAgICBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NDb21wb25lbnQuY2FuRGVhY3RpdmF0ZShjb21wb25lbnQsIHJvdXRlLCBzdGF0ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGluaXRpYWwgaG9zdCBjbGFzc2VzIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtY29tbW9uLXNldHRpbmdzJyxcclxuICAgICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGlkQmFnIHVzZWQgYnkgdGhpcyBjb21wb25lbnQgdG8gc3RvcmUgdW5pcXVlIGVsZW1lbnQgaWRzLlxyXG4gICAgICogaWQgdmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgYmUgdGhlIEBzZWUgQmFzZUNvbXBvbmVudCBzdXBlciBjbGFzcy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUlkQmFnKCk6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGdyb3VwOiAnJyxcclxuICAgICAgICAgICAgb3B0aW9uOiAnJ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uT3ZlcmxheUNsaWNrKGxheWVyOiBScGNEaWFsb2dPdmVybGF5RGF0YSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxheWVyUnBjID0gdGhpcy5hcHBDb250ZXh0LnJwYy5ycGNNYW5hZ2VyLnJwY0NoYW5uZWwuZ2V0UnBjPFJwY091dGJvdW5kPihcclxuICAgICAgICAgICAgbGF5ZXIuc291cmNlTmFtZSxcclxuICAgICAgICAgICAgbGF5ZXIuc291cmNlU3ViTmFtZSxcclxuICAgICAgICAgICAgUnBjVHlwZS5PdXRib3VuZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZnJvbShScGNPdmVybGF5Q2xvc2VDbGllbnQub3ZlcmxheUNsb3NlKHRoaXMuYXBwQ29udGV4dC5ycGMsIHsgb3ZlcmxheTogZmFsc2UsIGRpYWxvZ0lkOiBsYXllci5kaWFsb2dJZCB9LCBsYXllclJwYykpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Lm92ZXJsYXlDbG9zZWQgJiYgdGhpcy5sYXllcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheWVycy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHRoaXMuYXBwQ29udGV4dC5ub3RpZmljYXRpb24uY3JlYXRlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5zaG93RXJyb3IodGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLk92ZXJsYXkuY2xvc2VFcnJvclRpdGxlLCBOZXQuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGF5ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBjb250cm9sIGFuZCBhbGwgaXRzIGNoaWxkcmVuIHJlY3Vyc2l2ZWxseSxcclxuICAgICAqIGluY2x1ZGluZyBkaXNhYmxlZCBjb250cm9scy5cclxuICAgICAqXHJcbiAgICAgKiBXb3JrYXJvdW5kIGZvciBtaXNzaW5nIGZ1bmN0aW9uYWxpdHkgYWRkZWQgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgYW5ndWxhclxyXG4gICAgICogQ3VycmVudGx5IGdldFJhd1ZhbHVlIG9ubHkgcmV0dXJucyB0aGUgdmFsdWUgb2YgaHRlIGN1cnJlbnQgY29udHJvbCBkaXNhYmxlZFxyXG4gICAgICogY2hpbGRyZW4gYnV0IG9ubHkgZW5hYmxlZCBjb250cm9scyBvZiBvdGhlciBkZXNjZW5kYW50czpcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvY29tbWl0LzFlY2U3MzY2YzhiNjdmMzg3ZmJlMTNmOGQxMjhjMTlmNGM1MGRkMTlcclxuICAgICAqXHJcbiAgICAgKiBPbmNlIHdlIHVwZ3JhZGUgYW5ndWxhciB2ZXJzaW9uIHdlIGNhbiByZW1vdmUgdGhpcyBjb2RlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBmb3JtQ29udHJvbCBUaGUgZm9ybSBjb250cm9sIHRvIGdldCB0aGUgdmFsdWUgZnJvbVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFJhd1ZhbHVlUmVjdXJzaXZlKGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBhbnkge1xyXG4gICAgICAgIGlmIChmb3JtQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHt9O1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtQ29udHJvbC5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFsdWVba2V5XSA9IHRoaXMuZ2V0UmF3VmFsdWVSZWN1cnNpdmUoZm9ybUNvbnRyb2wuY29udHJvbHNba2V5XSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKGZvcm1Db250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JtQ29udHJvbC5jb250cm9scy5tYXAoKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmF3VmFsdWVSZWN1cnNpdmUoY29udHJvbCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgfVxyXG59XHJcbiIsIjxzbWUtc2V0dGluZ3MgW3NldHRpbmdzVGl0bGVdPVwiaGFja1Rvb2xIZWFkZXIgPyAnJyA6IHNldHRpbmdzVGl0bGVcIj5cclxuICA8c21lLXNldHRpbmdzLW5hdmlnYXRpb24+XHJcbiAgICA8aGVhZGVyIGNsYXNzPVwic21lLWxheW91dC10b29sLWhlYWRlclwiICpuZ0lmPVwiaGFja1Rvb2xIZWFkZXJcIj5cclxuICAgICAgPGgyIGNsYXNzPVwic21lLXBvc2l0aW9uLWZsZXgtbm9uZSBzbWUtZm9udC1oM1wiIFthdHRyLmFyaWEtbGFiZWxdPVwic2V0dGluZ3NUaXRsZVwiPnt7c2V0dGluZ3NUaXRsZX19PC9oMj5cclxuICAgIDwvaGVhZGVyPlxyXG4gICAgPGRpdiByb2xlPVwicmVnaW9uXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJzZXR0aW5nc1RpdGxlXCI+XHJcbiAgICAgIDxuYXYgcm9sZT1cInRhYmxpc3RcIiBjbGFzcz1cInNtZS1wYWRkaW5nLWhvcml6b250YWwtbGcgc21lLWFycmFuZ2Utc3RhY2stdiBzbWUtZm9jdXMtem9uZVwiPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cInNtZS1wb3NpdGlvbi1mbGV4LWF1dG8gc21lLWFycmFuZ2Utc3RhY2stdiBzbWUtYXJyYW5nZS1vdmVyZmxvdy1oaWRlLXggc21lLWFycmFuZ2Utb3ZlcmZsb3ctYXV0by15XCJcclxuICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZ3JvdXBUb29sczsgbGV0IGogPSBpbmRleFwiIGNsYXNzPVwic21lLW1hcmdpbi1pbnNldC1ub25lXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICA8aDMgW2lkXT1cImlkQmFnLmdyb3VwICsgJy0nICsgalwiIGNsYXNzPVwic21lLW1hcmdpbi10b3AteHMgc21lLWZvbnQtaDVcIiAqbmdJZj1cImdyb3VwLmdyb3VwIT09ZGVmYXVsdEdyb3VwXCJcclxuICAgICAgICAgICAgICBbdGl0bGVdPVwiZ3JvdXAuZ3JvdXBcIj57e2dyb3VwLmdyb3VwfX08L2gzPlxyXG4gICAgICAgICAgICA8YSAqbmdGb3I9XCJsZXQgc2V0dGluZyBvZiBncm91cC5vcHRpb25zOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInNtZS1wYWRkaW5nLXNxdWlzaC12LXNtIHNtZS1hcnJhbmdlLXN0YWNrLWggc21lLXNjaGVtZS1uYXYtaXRlbVwiIHJvbGU9XCJ0YWJcIlxyXG4gICAgICAgICAgICAgIGhyZWY9XCJzZXR0aW5nLnJvdXRlUGFyYW1zLmV4dHJhcyAmJiBzZXR0aW5nLnJvdXRlUGFyYW1zLmV4dHJhcy5yZXBsYWNlVXJsXCJcclxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInNlbGVjdGVkU2V0dGluZyA9PT0gc2V0dGluZ1wiXHJcbiAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwic2V0dGluZy5yb3V0ZVBhcmFtcy5jb21tYW5kc1wiIHJvdXRlckxpbmtBY3RpdmU9XCJzbWUtYWN0aXZlXCJcclxuICAgICAgICAgICAgICAoc21lUm91dGVyTGlua0FjdGl2YXRlZCk9XCJzZWxlY3RlZFNldHRpbmcgPSBzZXR0aW5nXCJcclxuICAgICAgICAgICAgICBbcHJlc2VydmVGcmFnbWVudF09XCJzZXR0aW5nLnJvdXRlUGFyYW1zLmV4dHJhcyAmJiBzZXR0aW5nLnJvdXRlUGFyYW1zLmV4dHJhcy5wcmVzZXJ2ZUZyYWdtZW50XCJcclxuICAgICAgICAgICAgICBbc2tpcExvY2F0aW9uQ2hhbmdlXT1cInNldHRpbmcucm91dGVQYXJhbXMuZXh0cmFzICYmIHNldHRpbmcucm91dGVQYXJhbXMuZXh0cmFzLnNraXBMb2NhdGlvbkNoYW5nZVwiXHJcbiAgICAgICAgICAgICAgW3JlcGxhY2VVcmxdPVwic2V0dGluZy5yb3V0ZVBhcmFtcy5leHRyYXMgJiYgc2V0dGluZy5yb3V0ZVBhcmFtcy5leHRyYXMucmVwbGFjZVVybFwiXHJcbiAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cInNldHRpbmcucm91dGVQYXJhbXMuZXh0cmFzICYmIHNldHRpbmcucm91dGVQYXJhbXMuZXh0cmFzLnF1ZXJ5UGFyYW1zXCJcclxuICAgICAgICAgICAgICBbdGl0bGVdPVwic2V0dGluZy5sYWJlbFwiIGF0dHIuYXJpYS1sYWJlbGxlZGJ5PVwie3tpZEJhZy5vcHRpb259fS17e2p9fS17e2l9fSB7e2lkQmFnLmdyb3VwfX0te3tqfX1cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLWljb24gc21lLW1hcmdpbi1yaWdodC14c1wiIFtuZ0NsYXNzXT1cImdldFNtZUljb25DbGFzcyhzZXR0aW5nKVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtcG9zaXRpb24tZmxleC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBbaWRdPVwiaWRCYWcub3B0aW9uICsgJy0nICsgaiArICctJyArIGlcIiBbY2xhc3Muc21lLWRpcnR5XT1cIiEhKHNldHRpbmcuZm9ybSAmJiBzZXR0aW5nLmZvcm0uZGlydHkpXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNtZS1wcmlzdGluZV09XCIhKHNldHRpbmcuZm9ybSAmJiBzZXR0aW5nLmZvcm0uZGlydHkpXCI+e3tzZXR0aW5nLmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgPC91bD5cclxuICAgICAgPC9uYXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJoYWNrU2hvd092ZXJsYXlcIj5cclxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbGF5ZXIgb2YgbGF5ZXJzXCJcclxuICAgICAgICBjbGFzcz1cInNtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLWluc2V0LW5vbmUgc21lLWxheWVyLWFib3ZlIHNtZS1zY2hlbWUtYmFja2Ryb3Atb3BhcXVlXCJcclxuICAgICAgICAoY2xpY2spPVwib25PdmVybGF5Q2xpY2sobGF5ZXIpXCI+PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L3NtZS1zZXR0aW5ncy1uYXZpZ2F0aW9uPlxyXG4gIDxzbWUtc2V0dGluZ3MtaGVhZGVyICpuZ0lmPVwiISFzaG93SGVhZGVyXCI+XHJcbiAgICA8aDMgaWQ9XCJzbWUtc2hlbGwtc2V0dGluZy1zZWxlY3RlZFRpdGxlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJzZWxlY3RlZFNldHRpbmcubGFiZWxcIiAqbmdJZj1cIiEhc2VsZWN0ZWRTZXR0aW5nXCI+XHJcbiAgICAgIHt7IHNlbGVjdGVkU2V0dGluZy5sYWJlbCB9fTwvaDM+XHJcbiAgPC9zbWUtc2V0dGluZ3MtaGVhZGVyPlxyXG4gIDxzbWUtc2V0dGluZ3MtY29udGVudD5cclxuICAgIDxyb3V0ZXItb3V0bGV0Pjwvcm91dGVyLW91dGxldD5cclxuICA8L3NtZS1zZXR0aW5ncy1jb250ZW50PlxyXG4gIDxzbWUtc2V0dGluZ3MtZm9vdGVyPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gIDwvc21lLXNldHRpbmdzLWZvb3Rlcj5cclxuPC9zbWUtc2V0dGluZ3M+XHJcbiJdfQ==
497
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3NldHRpbmdzL2NvbW1vbi1zZXR0aW5ncy9jb21tb24tc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc2V0dGluZ3MvY29tbW9uLXNldHRpbmdzL2NvbW1vbi1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFFBQVEsRUFDUixLQUFLLEVBRUwsZUFBZSxFQUlmLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBR0gsTUFBTSxFQUVULE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtFQUErRSxDQUFDO0FBR3RILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUVoRixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9B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O1lBSUMsY0FBYztrQkFEcEIsS0FBSztZQUlDLFNBQVM7a0JBRGYsS0FBSztZQVVDLHNCQUFzQjtrQkFENUIsS0FBSztZQUlDLGlCQUFpQjtrQkFEdkIsU0FBUzttQkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxuICAgIENvbXBvbmVudCxcclxuICAgIERvQ2hlY2ssXHJcbiAgICBJbmplY3RvcixcclxuICAgIElucHV0LFxyXG4gICAgSXRlcmFibGVEaWZmZXIsXHJcbiAgICBJdGVyYWJsZURpZmZlcnMsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICAgIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXHJcbiAgICBOYXZpZ2F0aW9uRXh0cmFzLFxyXG4gICAgUm91dGVyLFxyXG4gICAgUm91dGVyU3RhdGVTbmFwc2hvdFxyXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE5ldCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9uZXQnO1xyXG5pbXBvcnQgeyBScGNPdmVybGF5Q2xvc2VDbGllbnQgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL3JwYy9vdmVybGF5L3JwYy1vdmVybGF5LWNsb3NlLWNsaWVudCc7XHJcbmltcG9ydCB7IFJwY0RpYWxvZ092ZXJsYXlEYXRhIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9ycGMvb3ZlcmxheS9ycGMtb3ZlcmxheS1tb2RlbCc7XHJcbmltcG9ydCB7IERlZmVycmVkRGF0YSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvcnBjL3JwYyc7XHJcbmltcG9ydCB7IFJwY1R5cGUgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL3JwYy9ycGMtYmFzZSc7XHJcbmltcG9ydCB7IFJwY091dGJvdW5kIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9ycGMvcnBjLW91dGJvdW5kJztcclxuaW1wb3J0IHsgRU1QVFksIGZyb20sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQXBwQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL2FwcC1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBScGNTaGVsbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL3JwYy1zaGVsbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTZWFyY2hGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9mb3JtJztcclxuaW1wb3J0IHsgQ2FuQ29tcG9uZW50RGVhY3RpdmF0ZSB9IGZyb20gJy4uL3NldHRpbmdzLWNhbi1kZWFjdGl2YXRlLWd1YXJkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZXR0aW5nc0Zvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vc2V0dGluZ3MtZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuLi9zZXR0aW5ncy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tb25TZXR0aW5nc05hdmlnYXRpb25JdGVtLCBDb21tb25TZXR0aW5nc05hdmlnYXRpb25JdGVtV2l0aEZvcm0gfSBmcm9tICcuL2NvbW1vbi1zZXR0aW5ncy1uYXZpZ2F0aW9uLWl0ZW0nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHcm91cFRvb2xzTWVudSB7XHJcbiAgICBncm91cDogc3RyaW5nO1xyXG4gICAgb3B0aW9uczogQ29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbVdpdGhGb3JtW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb250YWluZXIgYXJvdW5kIHNldHRpbmdzIGNvbXBvbmVudCwgaGFuZGxlcyBjb21tb24gc2V0dGluZ3MgYmVoYXZpb3IuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWNvbW1vbi1zZXR0aW5ncycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29tbW9uLXNldHRpbmdzLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tbW9uU2V0dGluZ3NDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIERvQ2hlY2ssIEFmdGVyVmlld0NoZWNrZWQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdDb21tb25TZXR0aW5nc0NvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbWJpbmVkRm9ybTogRm9ybUdyb3VwO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRHcm91cCA9ICdkZWZhdWx0JztcclxuICAgIHB1YmxpYyBncm91cFRvb2xzOiBHcm91cFRvb2xzTWVudVtdO1xyXG4gICAgcHVibGljIGxheWVyczogUnBjRGlhbG9nT3ZlcmxheURhdGFbXSA9IFtdO1xyXG4gICAgcHVibGljIHNlbGVjdGVkU2V0dGluZzogQ29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlYXJjaCBib3ggcmVsYXRlZCB2YXJpYWJsZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbHRlciA9ICcnO1xyXG4gICAgcHVibGljIHNlYXJjaFRpdGxlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZmlsdGVyZWRTZXR0aW5nczogQ29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbVtdID0gW107XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoVGV4dEJveCcpXHJcbiAgICBwdWJsaWMgc2VhcmNoVGV4dEJveDogU2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V0dGluZ3NUaXRsZTogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V0dGluZ3M6IENvbW1vblNldHRpbmdzTmF2aWdhdGlvbkl0ZW1bXTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dIZWFkZXIgPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaGFja1Nob3dPdmVybGF5ID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBoYWNrVG9vbEhlYWRlciA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYmFja1JvdXRlOiB7IGNvbW1hbmRzOiBhbnlbXSwgZXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcyB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgdGFiIGxpc3Qgc2hvd2luZyB0aGUgU2V0dGluZ3MgaXRlbXMgaXMgc2Nyb2xsYWJsZSBvciBub3RcclxuICAgICAqIERlZmF1bHQgdG8gdHJ1ZS4gQWxsb3dpbmcgc2VwYXJhdGUgc2Nyb2xsIGJhciBmb3IgdGhlIG5hdmJhciBhbmQgdGhlIHNlbGVjdGVkIFNldHRpbmdzLlxyXG4gICAgICogU2V0IHRvIGZhbHNlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCB1c2UgcHJldmlvdXMgYmVoYXZpb3Igd2hlcmUgdGhlcmUgaXNcclxuICAgICAqIG9ubHkgMSBzaW5nbGUgc2Nyb2xsIGJhciBmb3IgYm90aCBuYXZiYXIgYW5kIGNvbnRlbnQgb2YgdGhlIHNlbGVjdGVkIFNldHRpbmdzIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2Nyb2xsYWJsZVNlY29uZGFyeU5hdiA9IHRydWU7XHJcblxyXG4gICAgQFZpZXdDaGlsZChTZXR0aW5nc0NvbXBvbmVudClcclxuICAgIHB1YmxpYyBzZXR0aW5nc0NvbXBvbmVudDogU2V0dGluZ3NDb21wb25lbnQ7XHJcblxyXG4gICAgcHJpdmF0ZSBsYXRlc3RGb3JtOiBGb3JtR3JvdXA7XHJcbiAgICBwcml2YXRlIGxhdGVzdFByaXN0aW5lRm9ybVZhbHVlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxhdGVzdEZvcm1VcGRhdGVWYWx1ZUluQ29tcG9uZW50OiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBzZXR0aW5nc0RpZmZlcjogSXRlcmFibGVEaWZmZXI8YW55PjtcclxuICAgIHByaXZhdGUgYXV0b2ZvY3VzID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHByaXZhdGUgc2V0dGluZ3NGb3JtczogU2V0dGluZ3NGb3JtU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGl0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzLFxyXG4gICAgICAgIHByaXZhdGUgYXBwQ29udGV4dDogQXBwQ29udGV4dFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBycGNTaGVsbFNlcnZpY2U6IFJwY1NoZWxsU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuY29tYmluZWRGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUaXRsZSA9IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5zZWFyY2hQbGFjZUhvbGRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLnNldHRpbmdzRm9ybXMuZm9ybUFkZGVkKCkuc3Vic2NyaWJlKChmb3JtQWRkZWREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHRvIGF2b2lkIGR1cGxpY2F0ZXMgd2UgZmlyc3QgcmVtb3ZlIHRoZSBmb3JtIGlmIGl0IGV4aXN0c1xyXG4gICAgICAgICAgICB0aGlzLmxhdGVzdEZvcm0gPSBmb3JtQWRkZWREYXRhLmZvcm1Hcm91cDtcclxuICAgICAgICAgICAgdGhpcy5sYXRlc3RQcmlzdGluZUZvcm1WYWx1ZSA9IHRoaXMuZ2V0UmF3VmFsdWVSZWN1cnNpdmUoZm9ybUFkZGVkRGF0YS5mb3JtR3JvdXApO1xyXG4gICAgICAgICAgICB0aGlzLmxhdGVzdEZvcm1VcGRhdGVWYWx1ZUluQ29tcG9uZW50ID0gZm9ybUFkZGVkRGF0YS51cGRhdGVWYWx1ZUluQ29tcG9uZW50O1xyXG4gICAgICAgICAgICB0aGlzLnJlY2FsY3VsYXRlQWN0aXZlUGFuZWwoKTtcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc0RpZmZlciA9IHRoaXMuaXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5zZXR0aW5ncykuY3JlYXRlKG51bGwpO1xyXG5cclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXRlQWN0aXZlUGFuZWwoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGFja1Nob3dPdmVybGF5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMucnBjU2hlbGxTZXJ2aWNlLm92ZXJsYXlPcGVuU3ViamVjdFxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZGVmZXJyZWREYXRhOiBEZWZlcnJlZERhdGE8UnBjRGlhbG9nT3ZlcmxheURhdGEsIHZvaWQ+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcmxheSB0b29scyB3aXRoIG9uZSBtb3JlIGxheWVyIG9yIHJlbW92ZSBvbmUgZnJvbSB0b3BcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmZXJyZWREYXRhLmRhdGEub3ZlcmxheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheWVycy5wdXNoKGRlZmVycmVkRGF0YS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGF5ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdScGMgT3ZlcmxheUNsb3NlOiBjbG9zZSByZXF1ZXN0IGlzIGNhbGxlZCB3aGlsZSBsYXllciBpcyBubyBsb25nZXIgYXZhaWxhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkRGF0YS5kZWZlcnJlZC5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMuc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc0RpZmZlciA9IHRoaXMuaXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5zZXR0aW5ncykuY3JlYXRlKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNyZWF0ZU1lbnUoKTtcclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXRlQWN0aXZlUGFuZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xyXG4gICAgICAgIHN1cGVyLm5nRG9DaGVjaygpO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzRGlmZmVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLnNldHRpbmdzRGlmZmVyLmRpZmYodGhpcy5zZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU1lbnUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9mb2N1cykge1xyXG4gICAgICAgICAgICBjb25zdCBmb2N1c0VsZW1lbnRzID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tyb2xlPVwidGFiXCJdJyk7XHJcbiAgICAgICAgICAgIGlmIChmb2N1c0VsZW1lbnRzICYmIGZvY3VzRWxlbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBmb2N1c0VsZW1lbnRzWzBdLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9mb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXR0aW5nIFRpdGxlIGhlYWRlciBpcyBtYW5hZ2VkIGJ5IGNoaWxkIGNvbXBvbmVudCB0aGlzLnNldHRpbmdzQ29tcG9uZW50LFxyXG4gICAgICAgIC8vIGFmdGVyIGN1cnJlbnQgdmlldyBhbmQgY2hpbGQgdmlldyBoYXMgYmVlbiByZW5kZXJlZCwgcGFzcyBhbG9uZyB0aGUgc2VsZWN0ZWRTZXR0aW5nXHJcbiAgICAgICAgLy8gc3RyaW5nIGlmIGl0IGV4aXN0cyBzbyBjaGlsZCB2aWV3IHdpbGwgcmVuZGVyIHRoZSB0aXRsZVxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU2V0dGluZykge1xyXG4gICAgICAgICAgICB0aGlzLm9uU21lUm91dGVyTGlua0FjdGl2YXRlZCh0aGlzLnNlbGVjdGVkU2V0dGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjcmVhdGVNZW51KCkge1xyXG5cclxuICAgICAgICAvLyBCZWZvcmUgY3JlYXRpbmcgdGhlIFNldHRpbmdzIG1lbnUsIGZpbHRlciB0aGUgU2V0dGluZ3MgbWVudSB0byBvbmx5IGRpc3BsYXlcclxuICAgICAgICAvLyBpdGVtcyB0aGF0IG1hdGNoZXMgdGhlIGZpbHRlclxyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTZXR0aW5ncyA9IHRoaXMuZmlsdGVyU2V0dGluZygpO1xyXG5cclxuICAgICAgICBjb25zdCBncm91cFRvb2xzOiBHcm91cFRvb2xzTWVudVtdID0gW107XHJcbiAgICAgICAgZ3JvdXBUb29sc1snZGVmYXVsdCddID0geyBncm91cDogJ2RlZmF1bHQnLCBvcHRpb25zOiBbXSB9O1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTZXR0aW5ncy5mb3JFYWNoKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghISFzZXR0aW5nLmdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICBncm91cFRvb2xzWydkZWZhdWx0J10ub3B0aW9ucy5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhIWdyb3VwVG9vbHNbc2V0dGluZy5ncm91cF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBncm91cFRvb2xzW3NldHRpbmcuZ3JvdXBdID0geyBncm91cDogc2V0dGluZy5ncm91cCwgdGl0bGU6IHNldHRpbmcuZ3JvdXBUaXRsZSwgb3B0aW9uczogW10gfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGdyb3VwVG9vbHNbc2V0dGluZy5ncm91cF0ub3B0aW9ucy5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5ncm91cFRvb2xzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIGdyb3VwVG9vbHMpIHtcclxuICAgICAgICAgICAgaWYgKHByb3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBUb29scy5wdXNoKGdyb3VwVG9vbHNbcHJvcF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWNhbGN1bGF0ZUFjdGl2ZVBhbmVsKCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmcgPSA8Q29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbVdpdGhGb3JtPnRoaXMuc2VsZWN0ZWRTZXR0aW5nO1xyXG4gICAgICAgIGlmIChNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHNldHRpbmcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nLmZvcm0gJiYgc2V0dGluZy5mb3JtLmRpcnR5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZ2V0UmF3VmFsdWVSZWN1cnNpdmUoc2V0dGluZy5mb3JtKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLnVwZGF0ZVZhbHVlSW5Db21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3NGb3Jtcy5uZXdGb3JtVmFsdWUoc2V0dGluZy5mb3JtLCBmb3JtVmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXRlc3RGb3JtLnNldFZhbHVlKGZvcm1WYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubGF0ZXN0Rm9ybS5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc0Zvcm1zLnJlbW92ZUZvcm0oc2V0dGluZy5mb3JtKTtcclxuICAgICAgICBzZXR0aW5nLmZvcm0gPSB0aGlzLmxhdGVzdEZvcm07XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nLmZvcm0pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29tYmluZWRGb3JtLmNvbnRyb2xzW3NldHRpbmcubGFiZWxdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmVkRm9ybS5zZXRDb250cm9sKHNldHRpbmcubGFiZWwsIHNldHRpbmcuZm9ybSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmVkRm9ybS5hZGRDb250cm9sKHNldHRpbmcubGFiZWwsIHNldHRpbmcuZm9ybSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldHRpbmcudXBkYXRlVmFsdWVJbkNvbXBvbmVudCA9IHRoaXMubGF0ZXN0Rm9ybVVwZGF0ZVZhbHVlSW5Db21wb25lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2NhcmRBbGxDaGlsZEZvcm1zKCkge1xyXG4gICAgICAgIC8vIEZvciB0aGUgY3VycmVudCBhY3RpdmUgc2V0dGluZywgd2UgbmVlZCB0byByZXNldCB0aGUgZm9ybSB0byBpdHNcclxuICAgICAgICAvLyBvcmlnaW5hbCBwcmlzdGluZSBmb3JtIHdoZW4gZGlzY2FyZGluZyBjaGFuZ2VzXHJcbiAgICAgICAgY29uc3QgYWN0aXZlU2V0dGluZyA9IHRoaXMuc2VsZWN0ZWRTZXR0aW5nO1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdXaXRoRm9ybSA9IDxDb21tb25TZXR0aW5nc05hdmlnYXRpb25JdGVtV2l0aEZvcm0+YWN0aXZlU2V0dGluZztcclxuICAgICAgICBpZiAoc2V0dGluZ1dpdGhGb3JtLmZvcm0pIHtcclxuICAgICAgICAgICAgc2V0dGluZ1dpdGhGb3JtLmZvcm0ucmVzZXQodGhpcy5sYXRlc3RQcmlzdGluZUZvcm1WYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmdzLmZvckVhY2goKG90aGVyU2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAob3RoZXJTZXR0aW5nICE9PSBhY3RpdmVTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlcnNldHRpbmdXaXRoRm9ybSA9IDxDb21tb25TZXR0aW5nc05hdmlnYXRpb25JdGVtV2l0aEZvcm0+b3RoZXJTZXR0aW5nO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nc0Zvcm1zLnJlbW92ZUZvcm0ob3RoZXJzZXR0aW5nV2l0aEZvcm0uZm9ybSk7XHJcbiAgICAgICAgICAgICAgICBvdGhlcnNldHRpbmdXaXRoRm9ybS5mb3JtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbWJpbmVkRm9ybS5jb250cm9sc1tvdGhlcnNldHRpbmdXaXRoRm9ybS5sYWJlbF0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmVkRm9ybS5yZW1vdmVDb250cm9sKG90aGVyc2V0dGluZ1dpdGhGb3JtLmxhYmVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhY2NlcHRBbGxDaGlsZEZvcm1zVmFsdWUoKSB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlU2V0dGluZyA9IHRoaXMuc2VsZWN0ZWRTZXR0aW5nO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MuZm9yRWFjaCgoc2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nV2l0aEZvcm0gPSA8Q29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbVdpdGhGb3JtPnNldHRpbmc7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nV2l0aEZvcm0uZm9ybSkge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ1dpdGhGb3JtLmZvcm0ucmVzZXQodGhpcy5nZXRSYXdWYWx1ZVJlY3Vyc2l2ZShzZXR0aW5nV2l0aEZvcm0uZm9ybSkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVNldHRpbmcgPT09IHNldHRpbmdXaXRoRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF0ZXN0UHJpc3RpbmVGb3JtVmFsdWUgPSB0aGlzLmdldFJhd1ZhbHVlUmVjdXJzaXZlKHNldHRpbmdXaXRoRm9ybS5mb3JtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTbWVJY29uQ2xhc3Moc2V0dGluZzogQ29tbW9uU2V0dGluZ3NOYXZpZ2F0aW9uSXRlbSkge1xyXG4gICAgICAgIGNvbnN0IG5nQ2xhc3NQYXJhbWV0ZXIgPSB7fTtcclxuICAgICAgICBpZiAoc2V0dGluZy5zbWVJY29uQ2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgIG5nQ2xhc3NQYXJhbWV0ZXJbc2V0dGluZy5zbWVJY29uQ2xhc3NOYW1lXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZ0NsYXNzUGFyYW1ldGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjYW5EZWFjdGl2YXRlKFxyXG4gICAgICAgIGNvbXBvbmVudDogQ2FuQ29tcG9uZW50RGVhY3RpdmF0ZSxcclxuICAgICAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcclxuICAgICAgICBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NDb21wb25lbnQuY2FuRGVhY3RpdmF0ZShjb21wb25lbnQsIHJvdXRlLCBzdGF0ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGluaXRpYWwgaG9zdCBjbGFzc2VzIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtY29tbW9uLXNldHRpbmdzJyxcclxuICAgICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGlkQmFnIHVzZWQgYnkgdGhpcyBjb21wb25lbnQgdG8gc3RvcmUgdW5pcXVlIGVsZW1lbnQgaWRzLlxyXG4gICAgICogaWQgdmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgYmUgdGhlIEBzZWUgQmFzZUNvbXBvbmVudCBzdXBlciBjbGFzcy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUlkQmFnKCk6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGdyb3VwOiAnJyxcclxuICAgICAgICAgICAgb3B0aW9uOiAnJ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uT3ZlcmxheUNsaWNrKGxheWVyOiBScGNEaWFsb2dPdmVybGF5RGF0YSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxheWVyUnBjID0gdGhpcy5hcHBDb250ZXh0LnJwYy5ycGNNYW5hZ2VyLnJwY0NoYW5uZWwuZ2V0UnBjPFJwY091dGJvdW5kPihcclxuICAgICAgICAgICAgbGF5ZXIuc291cmNlTmFtZSxcclxuICAgICAgICAgICAgbGF5ZXIuc291cmNlU3ViTmFtZSxcclxuICAgICAgICAgICAgUnBjVHlwZS5PdXRib3VuZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZnJvbShScGNPdmVybGF5Q2xvc2VDbGllbnQub3ZlcmxheUNsb3NlKHRoaXMuYXBwQ29udGV4dC5ycGMsIHsgb3ZlcmxheTogZmFsc2UsIGRpYWxvZ0lkOiBsYXllci5kaWFsb2dJZCB9LCBsYXllclJwYykpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Lm92ZXJsYXlDbG9zZWQgJiYgdGhpcy5sYXllcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheWVycy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHRoaXMuYXBwQ29udGV4dC5ub3RpZmljYXRpb24uY3JlYXRlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5zaG93RXJyb3IodGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLk92ZXJsYXkuY2xvc2VFcnJvclRpdGxlLCBOZXQuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGF5ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBjb250cm9sIGFuZCBhbGwgaXRzIGNoaWxkcmVuIHJlY3Vyc2l2ZWxseSxcclxuICAgICAqIGluY2x1ZGluZyBkaXNhYmxlZCBjb250cm9scy5cclxuICAgICAqXHJcbiAgICAgKiBXb3JrYXJvdW5kIGZvciBtaXNzaW5nIGZ1bmN0aW9uYWxpdHkgYWRkZWQgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgYW5ndWxhclxyXG4gICAgICogQ3VycmVudGx5IGdldFJhd1ZhbHVlIG9ubHkgcmV0dXJucyB0aGUgdmFsdWUgb2YgaHRlIGN1cnJlbnQgY29udHJvbCBkaXNhYmxlZFxyXG4gICAgICogY2hpbGRyZW4gYnV0IG9ubHkgZW5hYmxlZCBjb250cm9scyBvZiBvdGhlciBkZXNjZW5kYW50czpcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvY29tbWl0LzFlY2U3MzY2YzhiNjdmMzg3ZmJlMTNmOGQxMjhjMTlmNGM1MGRkMTlcclxuICAgICAqXHJcbiAgICAgKiBPbmNlIHdlIHVwZ3JhZGUgYW5ndWxhciB2ZXJzaW9uIHdlIGNhbiByZW1vdmUgdGhpcyBjb2RlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBmb3JtQ29udHJvbCBUaGUgZm9ybSBjb250cm9sIHRvIGdldCB0aGUgdmFsdWUgZnJvbVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFJhd1ZhbHVlUmVjdXJzaXZlKGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBhbnkge1xyXG4gICAgICAgIGlmIChmb3JtQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHt9O1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtQ29udHJvbC5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFsdWVba2V5XSA9IHRoaXMuZ2V0UmF3VmFsdWVSZWN1cnNpdmUoZm9ybUNvbnRyb2wuY29udHJvbHNba2V5XSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKGZvcm1Db250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JtQ29udHJvbC5jb250cm9scy5tYXAoKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmF3VmFsdWVSZWN1cnNpdmUoY29udHJvbCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoaXMuc2VsZWN0ZWRTZXR0aW5nIHRvIHRoZSBuZXdseSBzZWxlY3RlZCBTZXR0aW5ncyBpdGVtIHdoZW4gdXNlciBuYXZpZ2F0ZSB0byBhIG5ldyBTZXR0aW5ncyBpdGVtXHJcbiAgICAgKiBBbHNvIGNhbGwgdGhlIGNoaWxkIGNvbXBvbmVudCB0aGlzLnNldHRpbmdzQ29tcG9uZW50IHRvIHVwZGF0ZSB0aGUgc2V0dGluZ3NUaXRsZSB0byByZWZsZWN0IHRoZSB0aXRsZVxyXG4gICAgICogb2YgdGhlIG5ld2x5IHNlbGVjdGVkIFNldHRpbmdzIGl0ZW1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmV3U2V0dGluZyBUaGUgbmV3bHkgc2VsZWN0ZWQgU2V0dGluZ3MgaXRlbVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TbWVSb3V0ZXJMaW5rQWN0aXZhdGVkKG5ld1NldHRpbmc6IENvbW1vblNldHRpbmdzTmF2aWdhdGlvbkl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU2V0dGluZyA9IG5ld1NldHRpbmc7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc0NvbXBvbmVudC51cGRhdGVTZWxlY3RlZFNldHRpbmdUaXRsZShuZXdTZXR0aW5nLmxhYmVsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgc2VhcmNoIGZpZWxkXHJcbiAgICAqL1xyXG4gICAgcHVibGljIG9uU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dEJveC5zZWFyY2hpbmcgPSB0cnVlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1lbnUoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXh0Qm94LnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaWx0ZXIgb3V0IHRoZSBzZXR0aW5ncyBJdGVtIGJhc2VkIG9uIHRoaXMuZmlsdGVyIHN0cmluZyBhbmQgbWF0Y2ggdGhlIHRpdGxlIG9mIFNldHRpbmdzIEl0ZW1zXHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJTZXR0aW5nKCk6IENvbW1vblNldHRpbmdzTmF2aWdhdGlvbkl0ZW1bXSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncztcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0dGluZ3M7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBsb2NhbEZpbHRlciA9IHRoaXMuZmlsdGVyLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXR0aW5ncy5maWx0ZXIoc2V0dGluZyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmxhYmVsLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZihsb2NhbEZpbHRlcikgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCI8c21lLXNldHRpbmdzIFtzZXR0aW5nc1RpdGxlXT1cImhhY2tUb29sSGVhZGVyID8gJycgOiBzZXR0aW5nc1RpdGxlXCI+XHJcbiAgPHNtZS1zZXR0aW5ncy1uYXZpZ2F0aW9uIGNsYXNzPVwic21lLXBvc2l0aW9uLXN0cmV0Y2hcIj5cclxuICAgIDxoZWFkZXIgY2xhc3M9XCJzbWUtbGF5b3V0LXRvb2wtaGVhZGVyXCIgKm5nSWY9XCJoYWNrVG9vbEhlYWRlclwiPlxyXG4gICAgICA8aDIgY2xhc3M9XCJzbWUtcG9zaXRpb24tZmxleC1ub25lIHNtZS1mb250LWgzXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJzZXR0aW5nc1RpdGxlXCI+e3tzZXR0aW5nc1RpdGxlfX08L2gyPlxyXG4gICAgPC9oZWFkZXI+XHJcbiAgICA8ZGl2IHJvbGU9XCJyZWdpb25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInNldHRpbmdzVGl0bGVcIiBjbGFzcz1cInNtZS1wb3NpdGlvbi1zdHJldGNoIHNtZS1hcnJhbmdlLXN0YWNrLXZcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS1wb3NpdGlvbi1mbGV4LW5vbmUgc21lLWZvY3VzLXpvbmVcIj5cclxuICAgICAgICA8Zm9ybSBjbGFzcz1cInNtZS1tYXJnaW4tc3F1aXNoLXYtc21cIj5cclxuICAgICAgICAgIDxzbWUtZm9ybS1maWVsZCAjc2VhcmNoVGV4dEJveCB0eXBlPVwic2VhcmNoXCIgbmFtZT1cInRvb2xzTGlzdFNlYXJjaFwiIFsobmdNb2RlbCldPVwiZmlsdGVyXCIgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFRpdGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cInRydWVcIiBbY291bnRdPVwiZmlsdGVyZWRTZXR0aW5ncyA/IGZpbHRlcmVkU2V0dGluZ3MubGVuZ3RoIDogMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlYXJjaCk9XCJvblNlYXJjaCgpXCI+PC9zbWUtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmF2IHJvbGU9XCJ0YWJsaXN0XCIgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay12IHNtZS1mb2N1cy16b25lXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cInNjcm9sbGFibGVTZWNvbmRhcnlOYXYgPyAnc21lLXBvc2l0aW9uLWZsZXgtYXV0byBzbWUtYXJyYW5nZS1vdmVyZmxvdy1hdXRvLXknIDogJydcIj5cclxuICAgICAgICA8dWwgY2xhc3M9XCJzbWUtcG9zaXRpb24tZmxleC1hdXRvIHNtZS1hcnJhbmdlLXN0YWNrLXYgc21lLWFycmFuZ2Utb3ZlcmZsb3ctaGlkZS14IHNtZS1hcnJhbmdlLW92ZXJmbG93LWF1dG8teVwiXHJcbiAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3VwVG9vbHM7IGxldCBqID0gaW5kZXhcIiBjbGFzcz1cInNtZS1tYXJnaW4taW5zZXQtbm9uZVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgPGg0IFtpZF09XCJpZEJhZy5ncm91cCArICctJyArIGpcIiBjbGFzcz1cInNtZS1mb250LWg0IHNtZS1mb250LWg0LXNldHRpbmdzXCIgKm5nSWY9XCJncm91cC5ncm91cCE9PWRlZmF1bHRHcm91cFwiXHJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImdyb3VwLmdyb3VwXCI+e3tncm91cC5ncm91cH19PC9oND5cclxuICAgICAgICAgICAgPGEgKm5nRm9yPVwibGV0IHNldHRpbmcgb2YgZ3JvdXAub3B0aW9uczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtcGFkZGluZy1zcXVpc2gtdi1zbSBzbWUtYXJyYW5nZS1zdGFjay1oIHNtZS1zY2hlbWUtbmF2LWxpc3QtaXRlbVwiIHJvbGU9XCJ0YWJcIlxyXG4gICAgICAgICAgICAgIGhyZWY9XCJzZXR0aW5nLnJvdXRlUGFyYW1zLmV4dHJhcyAmJiBzZXR0aW5nLnJvdXRlUGFyYW1zLmV4dHJhcy5yZXBsYWNlVXJsXCJcclxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInNlbGVjdGVkU2V0dGluZyA9PT0gc2V0dGluZ1wiXHJcbiAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwic2V0dGluZy5yb3V0ZVBhcmFtcy5jb21tYW5kc1wiIHJvdXRlckxpbmtBY3RpdmU9XCJzbWUtYWN0aXZlXCJcclxuICAgICAgICAgICAgICAoc21lUm91dGVyTGlua0FjdGl2YXRlZCk9XCJvblNtZVJvdXRlckxpbmtBY3RpdmF0ZWQoc2V0dGluZylcIlxyXG4gICAgICAgICAgICAgIFtwcmVzZXJ2ZUZyYWdtZW50XT1cInNldHRpbmcucm91dGVQYXJhbXMuZXh0cmFzICYmIHNldHRpbmcucm91dGVQYXJhbXMuZXh0cmFzLnByZXNlcnZlRnJhZ21lbnRcIlxyXG4gICAgICAgICAgICAgIFtza2lwTG9jYXRpb25DaGFuZ2VdPVwic2V0dGluZy5yb3V0ZVBhcmFtcy5leHRyYXMgJiYgc2V0dGluZy5yb3V0ZVBhcmFtcy5leHRyYXMuc2tpcExvY2F0aW9uQ2hhbmdlXCJcclxuICAgICAgICAgICAgICBbcmVwbGFjZVVybF09XCJzZXR0aW5nLnJvdXRlUGFyYW1zLmV4dHJhcyAmJiBzZXR0aW5nLnJvdXRlUGFyYW1zLmV4dHJhcy5yZXBsYWNlVXJsXCJcclxuICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwic2V0dGluZy5yb3V0ZVBhcmFtcy5leHRyYXMgJiYgc2V0dGluZy5yb3V0ZVBhcmFtcy5leHRyYXMucXVlcnlQYXJhbXNcIlxyXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJzZXR0aW5nLmxhYmVsXCIgYXR0ci5hcmlhLWxhYmVsbGVkYnk9XCJ7e2lkQmFnLm9wdGlvbn19LXt7an19LXt7aX19IHt7aWRCYWcuZ3JvdXB9fS17e2p9fVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtaWNvbiBzbWUtbWFyZ2luLXJpZ2h0LXhzXCIgW25nQ2xhc3NdPVwiZ2V0U21lSWNvbkNsYXNzKHNldHRpbmcpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1wb3NpdGlvbi1mbGV4LWF1dG9cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIFtpZF09XCJpZEJhZy5vcHRpb24gKyAnLScgKyBqICsgJy0nICsgaVwiIFtjbGFzcy5zbWUtZGlydHldPVwiISEoc2V0dGluZy5mb3JtICYmIHNldHRpbmcuZm9ybS5kaXJ0eSlcIlxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc21lLXByaXN0aW5lXT1cIiEoc2V0dGluZy5mb3JtICYmIHNldHRpbmcuZm9ybS5kaXJ0eSlcIj57e3NldHRpbmcubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L25hdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cImhhY2tTaG93T3ZlcmxheVwiPlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBsYXllciBvZiBsYXllcnNcIlxyXG4gICAgICAgIGNsYXNzPVwic21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24taW5zZXQtbm9uZSBzbWUtbGF5ZXItYWJvdmUgc21lLXNjaGVtZS1iYWNrZHJvcC1vcGFxdWVcIlxyXG4gICAgICAgIChjbGljayk9XCJvbk92ZXJsYXlDbGljayhsYXllcilcIj48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvc21lLXNldHRpbmdzLW5hdmlnYXRpb24+XHJcbiAgPHNtZS1zZXR0aW5ncy1oZWFkZXIgKm5nSWY9XCIhIXNob3dIZWFkZXJcIj5cclxuICAgIDxoMyBpZD1cInNtZS1zaGVsbC1zZXR0aW5nLXNlbGVjdGVkVGl0bGVcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInNlbGVjdGVkU2V0dGluZy5sYWJlbFwiICpuZ0lmPVwiISFzZWxlY3RlZFNldHRpbmdcIj5cclxuICAgICAge3sgc2VsZWN0ZWRTZXR0aW5nLmxhYmVsIH19PC9oMz5cclxuICA8L3NtZS1zZXR0aW5ncy1oZWFkZXI+XHJcbiAgPHNtZS1zZXR0aW5ncy1jb250ZW50PlxyXG4gICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxyXG4gIDwvc21lLXNldHRpbmdzLWNvbnRlbnQ+XHJcbiAgPHNtZS1zZXR0aW5ncy1mb290ZXI+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgPC9zbWUtc2V0dGluZ3MtZm9vdGVyPlxyXG48L3NtZS1zZXR0aW5ncz5cclxuIl19