@decaf-ts/for-angular 0.0.11 → 0.0.12

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 (97) hide show
  1. package/dist/for-angular/cli/cli-module.d.ts +22 -0
  2. package/dist/for-angular/cli/cli-module.d.ts.map +1 -0
  3. package/dist/for-angular/cli/cli-module.js +131 -0
  4. package/dist/for-angular/cli/cli-module.js.map +1 -0
  5. package/dist/lib/components/component-renderer/component-renderer.component.d.ts +1 -0
  6. package/dist/lib/components/component-renderer/component-renderer.component.d.ts.map +1 -0
  7. package/dist/lib/components/crud-field/crud-field.component.d.ts +1 -0
  8. package/dist/lib/components/crud-field/crud-field.component.d.ts.map +1 -0
  9. package/dist/lib/components/crud-form/constants.d.ts +1 -0
  10. package/dist/lib/components/crud-form/constants.d.ts.map +1 -0
  11. package/dist/lib/components/crud-form/crud-form.component.d.ts +1 -0
  12. package/dist/lib/components/crud-form/crud-form.component.d.ts.map +1 -0
  13. package/dist/lib/components/crud-form/types.d.ts +1 -0
  14. package/dist/lib/components/crud-form/types.d.ts.map +1 -0
  15. package/dist/lib/components/empty-state/empty-state.component.d.ts +1 -0
  16. package/dist/lib/components/empty-state/empty-state.component.d.ts.map +1 -0
  17. package/dist/lib/components/fieldset/fieldset.component.d.ts +1 -0
  18. package/dist/lib/components/fieldset/fieldset.component.d.ts.map +1 -0
  19. package/dist/lib/components/filter/filter.component.d.ts +1 -0
  20. package/dist/lib/components/filter/filter.component.d.ts.map +1 -0
  21. package/dist/lib/components/for-angular-components.module.d.ts +1 -0
  22. package/dist/lib/components/for-angular-components.module.d.ts.map +1 -0
  23. package/dist/lib/components/index.d.ts +1 -0
  24. package/dist/lib/components/index.d.ts.map +1 -0
  25. package/dist/lib/components/layout/layout.component.d.ts +1 -0
  26. package/dist/lib/components/layout/layout.component.d.ts.map +1 -0
  27. package/dist/lib/components/list/constants.d.ts +1 -0
  28. package/dist/lib/components/list/constants.d.ts.map +1 -0
  29. package/dist/lib/components/list/list.component.d.ts +1 -0
  30. package/dist/lib/components/list/list.component.d.ts.map +1 -0
  31. package/dist/lib/components/list-item/list-item.component.d.ts +1 -0
  32. package/dist/lib/components/list-item/list-item.component.d.ts.map +1 -0
  33. package/dist/lib/components/model-renderer/model-renderer.component.d.ts +1 -0
  34. package/dist/lib/components/model-renderer/model-renderer.component.d.ts.map +1 -0
  35. package/dist/lib/components/pagination/constants.d.ts +1 -0
  36. package/dist/lib/components/pagination/constants.d.ts.map +1 -0
  37. package/dist/lib/components/pagination/pagination.component.d.ts +1 -0
  38. package/dist/lib/components/pagination/pagination.component.d.ts.map +1 -0
  39. package/dist/lib/components/searchbar/searchbar.component.d.ts +1 -0
  40. package/dist/lib/components/searchbar/searchbar.component.d.ts.map +1 -0
  41. package/dist/lib/decaf-ts-for-angular.d.ts.map +1 -0
  42. package/dist/lib/directives/collapsable.directive.d.ts +1 -0
  43. package/dist/lib/directives/collapsable.directive.d.ts.map +1 -0
  44. package/dist/lib/directives/index.d.ts +1 -0
  45. package/dist/lib/directives/index.d.ts.map +1 -0
  46. package/dist/lib/engine/DynamicModule.d.ts +1 -0
  47. package/dist/lib/engine/DynamicModule.d.ts.map +1 -0
  48. package/dist/lib/engine/NgxBaseComponent.d.ts +1 -0
  49. package/dist/lib/engine/NgxBaseComponent.d.ts.map +1 -0
  50. package/dist/lib/engine/NgxCrudFormField.d.ts +1 -0
  51. package/dist/lib/engine/NgxCrudFormField.d.ts.map +1 -0
  52. package/dist/lib/engine/NgxFormService.d.ts +1 -0
  53. package/dist/lib/engine/NgxFormService.d.ts.map +1 -0
  54. package/dist/lib/engine/NgxRenderingEngine.d.ts +1 -0
  55. package/dist/lib/engine/NgxRenderingEngine.d.ts.map +1 -0
  56. package/dist/lib/engine/NgxRenderingEngine2.d.ts +1 -0
  57. package/dist/lib/engine/NgxRenderingEngine2.d.ts.map +1 -0
  58. package/dist/lib/engine/ValidatorFactory.d.ts +1 -0
  59. package/dist/lib/engine/ValidatorFactory.d.ts.map +1 -0
  60. package/dist/lib/engine/constants.d.ts +1 -0
  61. package/dist/lib/engine/constants.d.ts.map +1 -0
  62. package/dist/lib/engine/decorators.d.ts +1 -0
  63. package/dist/lib/engine/decorators.d.ts.map +1 -0
  64. package/dist/lib/engine/index.d.ts +1 -0
  65. package/dist/lib/engine/index.d.ts.map +1 -0
  66. package/dist/lib/engine/types.d.ts +1 -0
  67. package/dist/lib/engine/types.d.ts.map +1 -0
  68. package/dist/lib/esm2022/components/component-renderer/component-renderer.component.mjs +70 -24
  69. package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +271 -116
  70. package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +170 -37
  71. package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +103 -41
  72. package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +41 -16
  73. package/dist/lib/esm2022/components/filter/filter.component.mjs +248 -31
  74. package/dist/lib/esm2022/components/for-angular-components.module.mjs +38 -37
  75. package/dist/lib/esm2022/components/layout/layout.component.mjs +84 -15
  76. package/dist/lib/esm2022/components/list/list.component.mjs +252 -83
  77. package/dist/lib/esm2022/components/list-item/list-item.component.mjs +250 -46
  78. package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +66 -22
  79. package/dist/lib/esm2022/components/pagination/pagination.component.mjs +58 -17
  80. package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +66 -56
  81. package/dist/lib/esm2022/directives/collapsable.directive.mjs +10 -10
  82. package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +53 -46
  83. package/dist/lib/esm2022/for-angular.module.mjs +40 -39
  84. package/dist/lib/fesm2022/decaf-ts-for-angular.mjs +1805 -621
  85. package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
  86. package/dist/lib/for-angular.module.d.ts +1 -0
  87. package/dist/lib/for-angular.module.d.ts.map +1 -0
  88. package/dist/lib/helpers/index.d.ts +1 -0
  89. package/dist/lib/helpers/index.d.ts.map +1 -0
  90. package/dist/lib/helpers/utils.d.ts +1 -0
  91. package/dist/lib/helpers/utils.d.ts.map +1 -0
  92. package/dist/lib/index.d.ts +1 -0
  93. package/dist/lib/interfaces.d.ts +1 -0
  94. package/dist/lib/interfaces.d.ts.map +1 -0
  95. package/dist/lib/public-apis.d.ts +1 -0
  96. package/dist/lib/public-apis.d.ts.map +1 -0
  97. package/package.json +3 -2
@@ -20,6 +20,150 @@ import * as i0 from "@angular/core";
20
20
  import * as i1 from "@ionic/angular/standalone";
21
21
  import * as i2 from "@angular/common";
22
22
  import * as i3 from "@ngx-translate/core";
23
+ const _c0 = ["*"];
24
+ const _c1 = (a0, a1, a2) => ({ item: a0, mapper: a1, route: a2 });
25
+ function ListComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
26
+ const _r1 = i0.ɵɵgetCurrentView();
27
+ i0.ɵɵelementStart(0, "ion-refresher", 2);
28
+ i0.ɵɵlistener("ionRefresh", function ListComponent_Conditional_0_Template_ion_refresher_ionRefresh_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.handleRefresh($event)); });
29
+ i0.ɵɵelement(1, "ion-refresher-content");
30
+ i0.ɵɵelementEnd();
31
+ } if (rf & 2) {
32
+ i0.ɵɵproperty("pullFactor", 1)("pullMin", 100)("pullMax", 200);
33
+ } }
34
+ function ListComponent_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
35
+ const _r3 = i0.ɵɵgetCurrentView();
36
+ i0.ɵɵelementStart(0, "ngx-decaf-filter", 5);
37
+ i0.ɵɵlistener("filterEvent", function ListComponent_Conditional_1_Conditional_0_Template_ngx_decaf_filter_filterEvent_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.handleFilter($event)); })("searchEvent", function ListComponent_Conditional_1_Conditional_0_Template_ngx_decaf_filter_searchEvent_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.handleSearch($event)); });
38
+ i0.ɵɵelementEnd();
39
+ } if (rf & 2) {
40
+ const ctx_r1 = i0.ɵɵnextContext(2);
41
+ i0.ɵɵproperty("model", ctx_r1.model)("sortDirection", ctx_r1.sortDirection)("disableSort", ctx_r1.disableSort);
42
+ } }
43
+ function ListComponent_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
44
+ const _r4 = i0.ɵɵgetCurrentView();
45
+ i0.ɵɵelementStart(0, "ngx-decaf-searchbar", 6);
46
+ i0.ɵɵlistener("searchEvent", function ListComponent_Conditional_1_Conditional_1_Template_ngx_decaf_searchbar_searchEvent_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.handleSearch($event)); });
47
+ i0.ɵɵelementEnd();
48
+ } if (rf & 2) {
49
+ i0.ɵɵproperty("emitEventToWindow", false)("debounce", 500);
50
+ } }
51
+ function ListComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
52
+ i0.ɵɵtemplate(0, ListComponent_Conditional_1_Conditional_0_Template, 1, 3, "ngx-decaf-filter", 3)(1, ListComponent_Conditional_1_Conditional_1_Template, 1, 2, "ngx-decaf-searchbar", 4);
53
+ } if (rf & 2) {
54
+ const ctx_r1 = i0.ɵɵnextContext();
55
+ i0.ɵɵconditional(ctx_r1.model && ctx_r1.enableFilter ? 0 : 1);
56
+ } }
57
+ function ListComponent_Conditional_2_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
58
+ const _r5 = i0.ɵɵgetCurrentView();
59
+ i0.ɵɵelementStart(0, "ngx-decaf-component-renderer", 9);
60
+ i0.ɵɵlistener("listenEvent", function ListComponent_Conditional_2_Conditional_2_For_1_Template_ngx_decaf_component_renderer_listenEvent_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.handleEvent($event)); });
61
+ i0.ɵɵelementEnd();
62
+ } if (rf & 2) {
63
+ const child_r6 = ctx.$implicit;
64
+ const ctx_r1 = i0.ɵɵnextContext(3);
65
+ i0.ɵɵproperty("tag", ctx_r1.item.tag)("globals", i0.ɵɵpureFunction3(2, _c1, child_r6, ctx_r1.mapper, ctx_r1.route));
66
+ } }
67
+ function ListComponent_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵrepeaterCreate(0, ListComponent_Conditional_2_Conditional_2_For_1_Template, 1, 6, "ngx-decaf-component-renderer", 8, i0.ɵɵcomponentInstance().trackItemFn, true);
69
+ } if (rf & 2) {
70
+ const ctx_r1 = i0.ɵɵnextContext(2);
71
+ i0.ɵɵrepeater(ctx_r1.items);
72
+ } }
73
+ function ListComponent_Conditional_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
74
+ i0.ɵɵprojection(0);
75
+ } }
76
+ function ListComponent_Conditional_2_Conditional_4_Conditional_0_Template(rf, ctx) { if (rf & 1) {
77
+ const _r7 = i0.ɵɵgetCurrentView();
78
+ i0.ɵɵelementStart(0, "ngx-decaf-pagination", 12);
79
+ i0.ɵɵlistener("clickEvent", function ListComponent_Conditional_2_Conditional_4_Conditional_0_Template_ngx_decaf_pagination_clickEvent_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.handlePaginate($event)); });
80
+ i0.ɵɵelementEnd();
81
+ } if (rf & 2) {
82
+ const ctx_r1 = i0.ɵɵnextContext(3);
83
+ i0.ɵɵproperty("totalPages", ctx_r1.pages)("current", ctx_r1.page);
84
+ } }
85
+ function ListComponent_Conditional_2_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
86
+ const _r8 = i0.ɵɵgetCurrentView();
87
+ i0.ɵɵelementStart(0, "ion-infinite-scroll", 13);
88
+ i0.ɵɵlistener("ionInfinite", function ListComponent_Conditional_2_Conditional_4_Conditional_1_Template_ion_infinite_scroll_ionInfinite_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.handleRefresh($event)); });
89
+ i0.ɵɵelement(1, "ion-infinite-scroll-content", 14);
90
+ i0.ɵɵelementEnd();
91
+ } if (rf & 2) {
92
+ const ctx_r1 = i0.ɵɵnextContext(3);
93
+ i0.ɵɵclassMap((ctx_r1.searchValue == null ? null : ctx_r1.searchValue.length) ? "dcf-hidden" : "");
94
+ i0.ɵɵproperty("position", ctx_r1.scrollPosition)("threshold", ctx_r1.scrollThreshold);
95
+ i0.ɵɵadvance();
96
+ i0.ɵɵproperty("loadingSpinner", ctx_r1.loadingSpinner)("loadingText", ctx_r1.loadingText);
97
+ } }
98
+ function ListComponent_Conditional_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
99
+ i0.ɵɵtemplate(0, ListComponent_Conditional_2_Conditional_4_Conditional_0_Template, 1, 2, "ngx-decaf-pagination", 10)(1, ListComponent_Conditional_2_Conditional_4_Conditional_1_Template, 2, 6, "ion-infinite-scroll", 11);
100
+ } if (rf & 2) {
101
+ const ctx_r1 = i0.ɵɵnextContext(2);
102
+ i0.ɵɵconditional(ctx_r1.pages > 0 && ctx_r1.type === "paginated" && !(ctx_r1.searchValue == null ? null : ctx_r1.searchValue.length) ? 0 : 1);
103
+ } }
104
+ function ListComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
105
+ i0.ɵɵelementStart(0, "ion-list", 7, 0);
106
+ i0.ɵɵtemplate(2, ListComponent_Conditional_2_Conditional_2_Template, 2, 0)(3, ListComponent_Conditional_2_Conditional_3_Template, 1, 0);
107
+ i0.ɵɵelementEnd();
108
+ i0.ɵɵtemplate(4, ListComponent_Conditional_2_Conditional_4_Template, 2, 1);
109
+ } if (rf & 2) {
110
+ const ctx_r1 = i0.ɵɵnextContext();
111
+ i0.ɵɵproperty("inset", ctx_r1.inset)("lines", ctx_r1.lines);
112
+ i0.ɵɵadvance(2);
113
+ i0.ɵɵconditional((ctx_r1.item == null ? null : ctx_r1.item.tag) ? 2 : 3);
114
+ i0.ɵɵadvance(2);
115
+ i0.ɵɵconditional(ctx_r1.loadMoreData ? 4 : -1);
116
+ } }
117
+ function ListComponent_Conditional_3_Conditional_0_ion_item_0_Template(rf, ctx) { if (rf & 1) {
118
+ i0.ɵɵelementStart(0, "ion-item")(1, "ion-thumbnail", 16);
119
+ i0.ɵɵelement(2, "ion-skeleton-text", 17);
120
+ i0.ɵɵelementEnd();
121
+ i0.ɵɵelementStart(3, "ion-label");
122
+ i0.ɵɵelement(4, "ion-skeleton-text", 17);
123
+ i0.ɵɵelementStart(5, "ion-text", 18);
124
+ i0.ɵɵelement(6, "ion-skeleton-text", 17);
125
+ i0.ɵɵelementEnd()()();
126
+ } if (rf & 2) {
127
+ i0.ɵɵadvance(2);
128
+ i0.ɵɵproperty("animated", true);
129
+ i0.ɵɵadvance(2);
130
+ i0.ɵɵproperty("animated", true);
131
+ i0.ɵɵadvance(2);
132
+ i0.ɵɵproperty("animated", true);
133
+ } }
134
+ function ListComponent_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
135
+ i0.ɵɵtemplate(0, ListComponent_Conditional_3_Conditional_0_ion_item_0_Template, 7, 3, "ion-item", 15);
136
+ } if (rf & 2) {
137
+ const ctx_r1 = i0.ɵɵnextContext(2);
138
+ i0.ɵɵproperty("ngForOf", ctx_r1.skeletonData);
139
+ } }
140
+ function ListComponent_Conditional_3_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
141
+ i0.ɵɵelement(0, "ngx-decaf-empty-state", 19);
142
+ i0.ɵɵpipe(1, "translate");
143
+ i0.ɵɵpipe(2, "translate");
144
+ i0.ɵɵpipe(3, "translate");
145
+ } if (rf & 2) {
146
+ const ctx_r1 = i0.ɵɵnextContext(3);
147
+ i0.ɵɵproperty("title", i0.ɵɵpipeBind1(1, 4, ctx_r1.locale + "." + ctx_r1.empty.title))("subtitle", i0.ɵɵpipeBind1(2, 6, ctx_r1.locale + "." + ctx_r1.empty.subtitle))("buttonText", ctx_r1.empty.showButton ? i0.ɵɵpipeBind1(3, 8, ctx_r1.locale + "." + ctx_r1.empty.button) : "")("buttonLink", ctx_r1.empty.showButton ? ctx_r1.empty.route : "");
148
+ } }
149
+ function ListComponent_Conditional_3_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
150
+ i0.ɵɵelement(0, "ngx-decaf-empty-state", 20);
151
+ } if (rf & 2) {
152
+ const ctx_r1 = i0.ɵɵnextContext(3);
153
+ i0.ɵɵproperty("translatable", true)("searchValue", ctx_r1.searchValue);
154
+ } }
155
+ function ListComponent_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
156
+ i0.ɵɵtemplate(0, ListComponent_Conditional_3_Conditional_1_Conditional_0_Template, 4, 10, "ngx-decaf-empty-state", 19)(1, ListComponent_Conditional_3_Conditional_1_Conditional_1_Template, 1, 2, "ngx-decaf-empty-state", 20);
157
+ } if (rf & 2) {
158
+ const ctx_r1 = i0.ɵɵnextContext(2);
159
+ i0.ɵɵconditional(!(ctx_r1.searchValue == null ? null : ctx_r1.searchValue.length) ? 0 : 1);
160
+ } }
161
+ function ListComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
162
+ i0.ɵɵtemplate(0, ListComponent_Conditional_3_Conditional_0_Template, 1, 1, "ion-item")(1, ListComponent_Conditional_3_Conditional_1_Template, 2, 1);
163
+ } if (rf & 2) {
164
+ const ctx_r1 = i0.ɵɵnextContext();
165
+ i0.ɵɵconditional(ctx_r1.refreshing ? 0 : 1);
166
+ } }
23
167
  /**
24
168
  * @description A versatile list component that supports various data display modes.
25
169
  * @summary This component provides a flexible way to display lists of data with support
@@ -1145,92 +1289,117 @@ let ListComponent = class ListComponent extends NgxBaseComponent {
1145
1289
  return accum;
1146
1290
  }, []);
1147
1291
  }
1148
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1149
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ListComponent, isStandalone: true, selector: "ngx-decaf-list", inputs: { type: "type", translatable: "translatable", showSearchbar: "showSearchbar", data: "data", source: "source", start: "start", limit: "limit", loadMoreData: "loadMoreData", lines: "lines", inset: "inset", scrollThreshold: "scrollThreshold", scrollPosition: "scrollPosition", loadingText: "loadingText", showRefresher: "showRefresher", loadingSpinner: "loadingSpinner", enableFilter: "enableFilter", sortDirection: "sortDirection", sortBy: "sortBy", disableSort: "disableSort", emptyIcon: "emptyIcon", empty: "empty" }, outputs: { refreshEvent: "refreshEvent", clickEvent: "clickEvent" }, host: { listeners: { "window:ListItemClickEvent": "handleClick($event)", "window:searchbarEvent": "handleSearch($event)", "window:BackButtonNavigationEndEvent": "refresh($event)" } }, usesInheritance: true, ngImport: i0, template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n <ion-item *ngFor=\"let skl of skeletonData\">\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll-content ion-spinner{--color: var(--ion-color-primary)}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: PaginationComponent, selector: "ngx-decaf-pagination", inputs: ["totalPages", "current"], outputs: ["clickEvent"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonThumbnail, selector: "ion-thumbnail" }, { kind: "component", type: IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { kind: "component", type: SearchbarComponent, selector: "ngx-decaf-searchbar", inputs: ["autocomplete", "autocorrect", "animated", "buttonCancelText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value", "queryKeys", "isVisible", "wrapper", "wrapperColor", "emitEventToWindow"], outputs: ["searchEvent"] }, { kind: "component", type: EmptyStateComponent, selector: "ngx-decaf-empty-state", inputs: ["title", "titleColor", "subtitle", "subtitleColor", "showIcon", "icon", "iconSize", "iconColor", "buttonLink", "buttonText", "buttonFill", "buttonColor", "buttonSize", "searchValue"] }, { kind: "component", type: FilterComponent, selector: "ngx-decaf-filter", inputs: ["indexes", "conditions", "sortBy", "disableSort"], outputs: ["filterEvent", "searchEvent"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "model", "parent"], outputs: ["listenEvent"] }] }); }
1292
+ static { this.ɵfac = function ListComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListComponent)(); }; }
1293
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListComponent, selectors: [["ngx-decaf-list"]], hostBindings: function ListComponent_HostBindings(rf, ctx) { if (rf & 1) {
1294
+ i0.ɵɵlistener("ListItemClickEvent", function ListComponent_ListItemClickEvent_HostBindingHandler($event) { return ctx.handleClick($event); }, false, i0.ɵɵresolveWindow)("searchbarEvent", function ListComponent_searchbarEvent_HostBindingHandler($event) { return ctx.handleSearch($event); }, false, i0.ɵɵresolveWindow)("BackButtonNavigationEndEvent", function ListComponent_BackButtonNavigationEndEvent_HostBindingHandler($event) { return ctx.refresh($event); }, false, i0.ɵɵresolveWindow);
1295
+ } }, inputs: { type: "type", translatable: "translatable", showSearchbar: "showSearchbar", data: "data", source: "source", start: "start", limit: "limit", loadMoreData: "loadMoreData", lines: "lines", inset: "inset", scrollThreshold: "scrollThreshold", scrollPosition: "scrollPosition", loadingText: "loadingText", showRefresher: "showRefresher", loadingSpinner: "loadingSpinner", enableFilter: "enableFilter", sortDirection: "sortDirection", sortBy: "sortBy", disableSort: "disableSort", emptyIcon: "emptyIcon", empty: "empty" }, outputs: { refreshEvent: "refreshEvent", clickEvent: "clickEvent" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], ngContentSelectors: _c0, decls: 4, vars: 3, consts: [["component", ""], ["slot", "fixed", 3, "pullFactor", "pullMin", "pullMax"], ["slot", "fixed", 3, "ionRefresh", "pullFactor", "pullMin", "pullMax"], [3, "model", "sortDirection", "disableSort"], [3, "emitEventToWindow", "debounce"], [3, "filterEvent", "searchEvent", "model", "sortDirection", "disableSort"], [3, "searchEvent", "emitEventToWindow", "debounce"], [3, "inset", "lines"], [3, "tag", "globals"], [3, "listenEvent", "tag", "globals"], [3, "totalPages", "current"], [3, "class", "position", "threshold"], [3, "clickEvent", "totalPages", "current"], [3, "ionInfinite", "position", "threshold"], [3, "loadingSpinner", "loadingText"], [4, "ngFor", "ngForOf"], ["slot", "start"], [3, "animated"], [1, "date", 2, "width", "20%"], [3, "title", "subtitle", "buttonText", "buttonLink"], ["icon", "search-outline", "ngClass", "empty-search", "title", "search.title", "subtitle", "search.subtitle", 3, "translatable", "searchValue"]], template: function ListComponent_Template(rf, ctx) { if (rf & 1) {
1296
+ i0.ɵɵprojectionDef();
1297
+ i0.ɵɵtemplate(0, ListComponent_Conditional_0_Template, 2, 3, "ion-refresher", 1)(1, ListComponent_Conditional_1_Template, 2, 1)(2, ListComponent_Conditional_2_Template, 5, 4)(3, ListComponent_Conditional_3_Template, 2, 1);
1298
+ } if (rf & 2) {
1299
+ i0.ɵɵconditional(ctx.showRefresher ? 0 : -1);
1300
+ i0.ɵɵadvance();
1301
+ i0.ɵɵconditional(ctx.showSearchbar ? 1 : -1);
1302
+ i0.ɵɵadvance();
1303
+ i0.ɵɵconditional((ctx.data == null ? null : ctx.data.length) ? 2 : 3);
1304
+ } }, dependencies: [ForAngularModule, i1.IonText, i2.NgClass, i2.NgForOf, i3.TranslatePipe, IonRefresher,
1305
+ PaginationComponent,
1306
+ IonList,
1307
+ IonItem,
1308
+ IonThumbnail,
1309
+ IonSkeletonText,
1310
+ IonLabel,
1311
+ IonRefresherContent,
1312
+ IonInfiniteScroll,
1313
+ IonInfiniteScrollContent,
1314
+ SearchbarComponent,
1315
+ EmptyStateComponent,
1316
+ FilterComponent,
1317
+ ComponentRendererComponent], styles: ["ion-infinite-scroll-content[_ngcontent-%COMP%] ion-spinner[_ngcontent-%COMP%]{--color: var(--ion-color-primary)}@media (max-width: 768px){#end[_ngcontent-%COMP%], [slot=end][_ngcontent-%COMP%]{display:none!important}}"] }); }
1150
1318
  };
1151
1319
  ListComponent = __decorate([
1152
1320
  Dynamic(),
1153
1321
  __metadata("design:paramtypes", [])
1154
1322
  ], ListComponent);
1155
1323
  export { ListComponent };
1156
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListComponent, decorators: [{
1157
- type: Component,
1158
- args: [{ selector: 'ngx-decaf-list', standalone: true, imports: [
1159
- ForAngularModule,
1160
- IonRefresher,
1161
- IonLoading,
1162
- PaginationComponent,
1163
- IonList,
1164
- IonItem,
1165
- IonThumbnail,
1166
- IonSkeletonText,
1167
- IonLabel,
1168
- IonText,
1169
- IonRefresherContent,
1170
- IonInfiniteScroll,
1171
- IonInfiniteScrollContent,
1172
- IonThumbnail,
1173
- IonSkeletonText,
1174
- SearchbarComponent,
1175
- EmptyStateComponent,
1176
- ListItemComponent,
1177
- FilterComponent,
1178
- ComponentRendererComponent
1179
- ], template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n <ion-item *ngFor=\"let skl of skeletonData\">\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll-content ion-spinner{--color: var(--ion-color-primary)}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"] }]
1180
- }], ctorParameters: () => [], propDecorators: { type: [{
1181
- type: Input
1182
- }], translatable: [{
1183
- type: Input
1184
- }], showSearchbar: [{
1185
- type: Input
1186
- }], data: [{
1187
- type: Input
1188
- }], source: [{
1189
- type: Input
1190
- }], start: [{
1191
- type: Input
1192
- }], limit: [{
1193
- type: Input
1194
- }], loadMoreData: [{
1195
- type: Input
1196
- }], lines: [{
1197
- type: Input
1198
- }], inset: [{
1199
- type: Input
1200
- }], scrollThreshold: [{
1201
- type: Input
1202
- }], scrollPosition: [{
1203
- type: Input
1204
- }], loadingText: [{
1205
- type: Input
1206
- }], showRefresher: [{
1207
- type: Input
1208
- }], loadingSpinner: [{
1209
- type: Input
1210
- }], enableFilter: [{
1211
- type: Input
1212
- }], sortDirection: [{
1213
- type: Input
1214
- }], sortBy: [{
1215
- type: Input
1216
- }], disableSort: [{
1217
- type: Input
1218
- }], emptyIcon: [{
1219
- type: Input
1220
- }], empty: [{
1221
- type: Input
1222
- }], refreshEvent: [{
1223
- type: Output
1224
- }], clickEvent: [{
1225
- type: Output
1226
- }], handleClick: [{
1227
- type: HostListener,
1228
- args: ['window:ListItemClickEvent', ['$event']]
1229
- }], handleSearch: [{
1230
- type: HostListener,
1231
- args: ['window:searchbarEvent', ['$event']]
1232
- }], refresh: [{
1233
- type: HostListener,
1234
- args: ['window:BackButtonNavigationEndEvent', ['$event']]
1235
- }] } });
1236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9saXN0L2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLE9BQU8sRUFDUCxZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBWSxjQUFjLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBRUwsT0FBTyxFQUNQLGNBQWMsRUFDZCxrQkFBa0IsRUFLbkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxD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c0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3kgIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50LCBSZWZyZXNoZXJDdXN0b21FdmVudCwgU3Bpbm5lclR5cGVzIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtcbiAgSW9uSW5maW5pdGVTY3JvbGwsXG4gIElvbkluZmluaXRlU2Nyb2xsQ29udGVudCxcbiAgSW9uSXRlbSxcbiAgSW9uTGFiZWwsXG4gIElvbkxpc3QsXG4gIElvblJlZnJlc2hlcixcbiAgSW9uUmVmcmVzaGVyQ29udGVudCxcbiAgSW9uU2tlbGV0b25UZXh0LFxuICBJb25UZXh0LFxuICBJb25UaHVtYm5haWwsXG4gIElvbkxvYWRpbmdcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBNb2RlbCwgUHJpbWl0aXZlcyB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBDb25kaXRpb24sIE9ic2VydmVyLCBPcmRlckRpcmVjdGlvbiwgUGFnaW5hdG9yIH0gZnJvbSAnQGRlY2FmLXRzL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmFzZUN1c3RvbUV2ZW50LFxuICBEeW5hbWljLFxuICBFdmVudENvbnN0YW50cyxcbiAgQ29tcG9uZW50c1RhZ05hbWVzLFxuICBSZW5kZXJlckN1c3RvbUV2ZW50LFxuICBTdHJpbmdPckJvb2xlYW4sXG4gIEtleVZhbHVlLFxuICBMaXN0SXRlbUN1c3RvbUV2ZW50XG59IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBGb3JBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi4vLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IE5neEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4QmFzZUNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBzdHJpbmdUb0Jvb2xlYW4sXG4gIGZvcm1hdERhdGUsXG4gIGlzVmFsaWREYXRlXG59IGZyb20gJy4uLy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgU2VhcmNoYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoYmFyL3NlYXJjaGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2xpc3QtaXRlbS9saXN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LXJlbmRlcmVyL2NvbXBvbmVudC1yZW5kZXJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vcGFnaW5hdGlvbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSUxpc3RFbXB0eVJlc3VsdCwgTGlzdENvbXBvbmVudHNUeXBlcywgRGVjYWZSZXBvc2l0b3J5IH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRnVuY3Rpb25MaWtlLCBJRmlsdGVyUXVlcnksIElGaWx0ZXJRdWVyeUl0ZW0gfSBmcm9tICcuLi8uLi9lbmdpbmUvdHlwZXMnO1xuaW1wb3J0IHsgRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsdGVyL2ZpbHRlci5jb21wb25lbnQnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHZlcnNhdGlsZSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHZhcmlvdXMgZGF0YSBkaXNwbGF5IG1vZGVzLlxuICogQHN1bW1hcnkgVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmbGV4aWJsZSB3YXkgdG8gZGlzcGxheSBsaXN0cyBvZiBkYXRhIHdpdGggc3VwcG9ydFxuICogZm9yIGluZmluaXRlIHNjcm9sbGluZywgcGFnaW5hdGlvbiwgc2VhcmNoaW5nLCBhbmQgY3VzdG9tIGl0ZW0gcmVuZGVyaW5nLiBJdCBjYW4gZmV0Y2hcbiAqIGRhdGEgZnJvbSB2YXJpb3VzIHNvdXJjZXMgaW5jbHVkaW5nIG1vZGVscywgZnVuY3Rpb25zLCBvciBkaXJlY3QgZGF0YSBpbnB1dC5cbiAqXG4gKiBUaGUgY29tcG9uZW50IHN1cHBvcnRzIHR3byBtYWluIGRpc3BsYXkgdHlwZXM6XG4gKiAxLiBJbmZpbml0ZSBzY3JvbGxpbmcgLSBMb2FkcyBtb3JlIGRhdGEgYXMgdGhlIHVzZXIgc2Nyb2xsc1xuICogMi4gUGFnaW5hdGlvbiAtIERpc3BsYXlzIGRhdGEgaW4gcGFnZXMgd2l0aCBuYXZpZ2F0aW9uIGNvbnRyb2xzXG4gKlxuICogQWRkaXRpb25hbCBmZWF0dXJlcyBpbmNsdWRlOlxuICogLSBQdWxsLXRvLXJlZnJlc2ggZnVuY3Rpb25hbGl0eVxuICogLSBTZWFyY2ggZmlsdGVyaW5nXG4gKiAtIEVtcHR5IHN0YXRlIGN1c3RvbWl6YXRpb25cbiAqIC0gQ3VzdG9tIGl0ZW0gcmVuZGVyaW5nXG4gKiAtIEV2ZW50IGVtaXNzaW9uIGZvciBpbnRlcmFjdGlvbnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RDb21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEYXRhIFNvdXJjZVxuICogICBwYXJ0aWNpcGFudCBFIGFzIEV4dGVybmFsIENvbXBvbmVudHNcbiAqXG4gKiAgIFUtPj5MOiBJbml0aWFsaXplIGNvbXBvbmVudFxuICogICBMLT4+TDogbmdPbkluaXQoKVxuICogICBMLT4+RDogUmVxdWVzdCBpbml0aWFsIGRhdGFcbiAqICAgRC0tPj5MOiBSZXR1cm4gZGF0YVxuICogICBMLT4+TDogUHJvY2VzcyBhbmQgZGlzcGxheSBkYXRhXG4gKlxuICogICBhbHQgVXNlciBzY3JvbGxzIChJbmZpbml0ZSBtb2RlKVxuICogICAgIFUtPj5MOiBTY3JvbGwgdG8gYm90dG9tXG4gKiAgICAgTC0+PkQ6IFJlcXVlc3QgbW9yZSBkYXRhXG4gKiAgICAgRC0tPj5MOiBSZXR1cm4gYWRkaXRpb25hbCBkYXRhXG4gKiAgICAgTC0+Pkw6IEFwcGVuZCB0byBleGlzdGluZyBkYXRhXG4gKiAgIGVsc2UgVXNlciBjaGFuZ2VzIHBhZ2UgKFBhZ2luYXRlZCBtb2RlKVxuICogICAgIFUtPj5MOiBDbGljayBwYWdlIG51bWJlclxuICogICAgIEwtPj5MOiBoYW5kbGVQYWdpbmF0ZSgpXG4gKiAgICAgTC0+PkQ6IFJlcXVlc3QgZGF0YSBmb3IgcGFnZVxuICogICAgIEQtLT4+TDogUmV0dXJuIHBhZ2UgZGF0YVxuICogICAgIEwtPj5MOiBSZXBsYWNlIGRpc3BsYXllZCBkYXRhXG4gKiAgIGVuZFxuICpcbiAqICAgYWx0IFVzZXIgc2VhcmNoZXNcbiAqICAgICBVLT4+TDogRW50ZXIgc2VhcmNoIHRlcm1cbiAqICAgICBMLT4+TDogaGFuZGxlU2VhcmNoKClcbiAqICAgICBMLT4+RDogRmlsdGVyIGRhdGEgYnkgc2VhcmNoIHRlcm1cbiAqICAgICBELS0+Pkw6IFJldHVybiBmaWx0ZXJlZCBkYXRhXG4gKiAgICAgTC0+Pkw6IFVwZGF0ZSBkaXNwbGF5ZWQgZGF0YVxuICogICBlbmRcbiAqXG4gKiAgIGFsdCBVc2VyIGNsaWNrcyBpdGVtXG4gKiAgICAgVS0+Pkw6IENsaWNrIGxpc3QgaXRlbVxuICogICAgIEwtPj5MOiBoYW5kbGVDbGljaygpXG4gKiAgICAgTC0+PkU6IEVtaXQgY2xpY2tFdmVudFxuICogICBlbmRcbiAqXG4gKiBAZXhhbXBsZVxuICogPG5neC1kZWNhZi1saXN0XG4gKiAgIFtzb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gKiAgIFtsaW1pdF09XCIxMFwiXG4gKiAgIFt0eXBlXT1cIidpbmZpbml0ZSdcIlxuICogICBbc2hvd1NlYXJjaGJhcl09XCJ0cnVlXCJcbiAqICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlSXRlbUNsaWNrKCRldmVudClcIlxuICogICAocmVmcmVzaEV2ZW50KT1cImhhbmRsZVJlZnJlc2goJGV2ZW50KVwiPlxuICogPC9uZ3gtZGVjYWYtbGlzdD5cbiAqXG4gKiBAZXh0ZW5kcyB7Tmd4QmFzZUNvbXBvbmVudH1cbiAqIEBpbXBsZW1lbnRzIHtPbkluaXR9XG4gKi9cbkBEeW5hbWljKClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1kZWNhZi1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3JBbmd1bGFyTW9kdWxlLFxuICAgIElvblJlZnJlc2hlcixcbiAgICBJb25Mb2FkaW5nLFxuICAgIFBhZ2luYXRpb25Db21wb25lbnQsXG4gICAgSW9uTGlzdCxcbiAgICBJb25JdGVtLFxuICAgIElvblRodW1ibmFpbCxcbiAgICBJb25Ta2VsZXRvblRleHQsXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uVGV4dCxcbiAgICBJb25SZWZyZXNoZXJDb250ZW50LFxuICAgIElvbkluZmluaXRlU2Nyb2xsLFxuICAgIElvbkluZmluaXRlU2Nyb2xsQ29udGVudCxcbiAgICBJb25UaHVtYm5haWwsXG4gICAgSW9uU2tlbGV0b25UZXh0LFxuICAgIFNlYXJjaGJhckNvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIExpc3RJdGVtQ29tcG9uZW50LFxuICAgIEZpbHRlckNvbXBvbmVudCxcbiAgICBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpc3RDb21wb25lbnQgZXh0ZW5kcyBOZ3hCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGRpc3BsYXkgbW9kZSBmb3IgdGhlIGxpc3QgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGhvdyB0aGUgbGlzdCBkYXRhIGlzIGxvYWRlZCBhbmQgZGlzcGxheWVkLiBPcHRpb25zIGluY2x1ZGU6XG4gICAqIC0gSU5GSU5JVEU6IExvYWRzIG1vcmUgZGF0YSBhcyB0aGUgdXNlciBzY3JvbGxzIChpbmZpbml0ZSBzY3JvbGxpbmcpXG4gICAqIC0gUEFHSU5BVEVEOiBEaXNwbGF5cyBkYXRhIGluIHBhZ2VzIHdpdGggbmF2aWdhdGlvbiBjb250cm9sc1xuICAgKlxuICAgKiBAdHlwZSB7TGlzdENvbXBvbmVudHNUeXBlc31cbiAgICogQGRlZmF1bHQgTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdHlwZTogTGlzdENvbXBvbmVudHNUeXBlcyA9IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSBjb21wb25lbnQgdXNlcyB0cmFuc2xhdGlvbiBzZXJ2aWNlcy5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGF0dGVtcHQgdG8gdXNlIHRyYW5zbGF0aW9uIHNlcnZpY2VzXG4gICAqIGZvciBhbnkgdGV4dCBjb250ZW50LiBUaGlzIGFsbG93cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gb2YgdGhlIGxpc3QgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSB0cmFuc2xhdGFibGU6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc2VhcmNoIGJhci5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZGlzcGxheXMgYSBzZWFyY2ggYmFyIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QgdGhhdCBhbGxvd3NcbiAgICogdXNlcnMgdG8gZmlsdGVyIHRoZSBsaXN0IGl0ZW1zLiBUaGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgd29ya3MgYnkgZmlsdGVyaW5nIHRoZVxuICAgKiBleGlzdGluZyBkYXRhIG9yIGJ5IHRyaWdnZXJpbmcgYSBuZXcgZGF0YSBmZXRjaCB3aXRoIHNlYXJjaCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzaG93U2VhcmNoYmFyOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGlyZWN0IGRhdGEgaW5wdXQgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSB3YXkgdG8gZGlyZWN0bHkgcGFzcyBkYXRhIHRvIHRoZSBsaXN0IGNvbXBvbmVudCBpbnN0ZWFkIG9mXG4gICAqIGZldGNoaW5nIGl0IGZyb20gYSBzb3VyY2UuIFdoZW4gYm90aCBkYXRhIGFuZCBzb3VyY2UgYXJlIHByb3ZpZGVkLCB0aGUgY29tcG9uZW50XG4gICAqIHdpbGwgdXNlIHRoZSBzb3VyY2UgdG8gZmV0Y2ggZGF0YSBvbmx5IGlmIHRoZSBkYXRhIGFycmF5IGlzIGVtcHR5LlxuICAgKlxuICAgKiBAdHlwZSB7S2V5VmFsdWVbXSB8IHVuZGVmaW5lZH1cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBkYXRhPzogS2V5VmFsdWVbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGxpc3QgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hlcmUgdGhlIGxpc3Qgc2hvdWxkIGZldGNoIGl0cyBkYXRhIGZyb20uIFRoaXMgY2FuIGJlIGVpdGhlcjpcbiAgICogLSBBIHN0cmluZyBVUkwgb3IgZW5kcG9pbnQgaWRlbnRpZmllclxuICAgKiAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGRhdGEgd2hlbiBjYWxsZWRcbiAgICogVGhlIGNvbXBvbmVudCB3aWxsIGNhbGwgdGhpcyBzb3VyY2Ugd2hlbiBpdCBuZWVkcyB0byBsb2FkIG9yIHJlZnJlc2ggZGF0YS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IEZ1bmN0aW9uTGlrZX1cbiAgICogQHJlcXVpcmVkXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzb3VyY2UhOiBzdHJpbmcgfCBGdW5jdGlvbkxpa2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc3RhcnRpbmcgaW5kZXggZm9yIGRhdGEgZmV0Y2hpbmcuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgaW5kZXggZnJvbSB3aGljaCB0byBzdGFydCBmZXRjaGluZyBkYXRhLiBUaGlzIGlzIHVzZWRcbiAgICogZm9yIHBhZ2luYXRpb24gYW5kIGluZmluaXRlIHNjcm9sbGluZyB0byBkZXRlcm1pbmUgd2hpY2ggc3Vic2V0IG9mIGRhdGEgdG8gbG9hZC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc3RhcnQ6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGZldGNoIHBlciBwYWdlIG9yIGxvYWQgb3BlcmF0aW9uLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGhvdyBtYW55IGl0ZW1zIGFyZSBsb2FkZWQgYXQgb25jZSBkdXJpbmcgcGFnaW5hdGlvbiBvclxuICAgKiBpbmZpbml0ZSBzY3JvbGxpbmcuIFRoaXMgYWZmZWN0cyB0aGUgc2l6ZSBvZiBkYXRhIGNodW5rcyByZXF1ZXN0ZWQgZnJvbSB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAxMFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbGltaXQ6IG51bWJlciA9IDEwO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBtb3JlIGRhdGEgY2FuIGJlIGxvYWRlZC5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGFsbG93IGxvYWRpbmcgYWRkaXRpb25hbCBkYXRhXG4gICAqIHRocm91Z2ggaW5maW5pdGUgc2Nyb2xsaW5nIG9yIHBhZ2luYXRpb24uIFdoZW4gZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBub3RcbiAgICogYXR0ZW1wdCB0byBsb2FkIG1vcmUgZGF0YSBiZXlvbmQgd2hhdCBpcyBpbml0aWFsbHkgZGlzcGxheWVkLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsb2FkTW9yZURhdGE6IFN0cmluZ09yQm9vbGVhbiA9IHRydWVcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdHlsZSBvZiBkaXZpZGluZyBsaW5lcyBiZXR3ZWVuIGxpc3QgaXRlbXMuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaG93IGRpdmlkaW5nIGxpbmVzIGFwcGVhciBiZXR3ZWVuIGxpc3QgaXRlbXMuIE9wdGlvbnMgaW5jbHVkZTpcbiAgICogLSBcImluc2V0XCI6IExpbmVzIGFyZSBpbnNldCBmcm9tIHRoZSBlZGdlc1xuICAgKiAtIFwiZnVsbFwiOiBMaW5lcyBleHRlbmQgdGhlIGZ1bGwgd2lkdGhcbiAgICogLSBcIm5vbmVcIjogTm8gZGl2aWRpbmcgbGluZXNcbiAgICpcbiAgICogQHR5cGUge1wiaW5zZXRcIiB8IFwiZnVsbFwiIHwgXCJub25lXCJ9XG4gICAqIEBkZWZhdWx0IFwiZnVsbFwiXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsaW5lczogXCJpbnNldFwiIHwgXCJmdWxsXCIgfCBcIm5vbmVcIiA9IFwiZnVsbFwiO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgbGlzdCBoYXMgaW5zZXQgc3R5bGluZy5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGxpc3Qgd2lsbCBoYXZlIGluc2V0IHN0eWxpbmcgd2l0aCByb3VuZGVkIGNvcm5lcnNcbiAgICogYW5kIG1hcmdpbiBhcm91bmQgdGhlIGVkZ2VzLiBUaGlzIGNyZWF0ZXMgYSBjYXJkLWxpa2UgYXBwZWFyYW5jZSBmb3IgdGhlIGxpc3QuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpbnNldDogU3RyaW5nT3JCb29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdGhyZXNob2xkIGZvciB0cmlnZ2VyaW5nIGluZmluaXRlIHNjcm9sbCBsb2FkaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGNsb3NlIHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QgdGhlIHVzZXIgbXVzdCBzY3JvbGxcbiAgICogYmVmb3JlIHRoZSBjb21wb25lbnQgdHJpZ2dlcnMgbG9hZGluZyBvZiBhZGRpdGlvbmFsIGRhdGEuIFRoaXMgaXMgZXhwcmVzc2VkXG4gICAqIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgbGlzdCBoZWlnaHQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IFwiMTUlXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNjcm9sbFRocmVzaG9sZDogc3RyaW5nID0gXCIxNSVcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwb3NpdGlvbiB3aGVyZSBuZXcgaXRlbXMgYXJlIGFkZGVkIGR1cmluZyBpbmZpbml0ZSBzY3JvbGxpbmcuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciBuZXcgaXRlbXMgYXJlIGFkZGVkIHRvIHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBsaXN0XG4gICAqIHdoZW4gbG9hZGluZyBtb3JlIGRhdGEgdGhyb3VnaCBpbmZpbml0ZSBzY3JvbGxpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtcImJvdHRvbVwiIHwgXCJ0b3BcIn1cbiAgICogQGRlZmF1bHQgXCJib3R0b21cIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2Nyb2xsUG9zaXRpb246IFwiYm90dG9tXCIgfCBcInRvcFwiID0gXCJib3R0b21cIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1c3RvbSB0ZXh0IHRvIGRpc3BsYXkgZHVyaW5nIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSB0ZXh0IHNob3duIGluIHRoZSBsb2FkaW5nIGluZGljYXRvciB3aGVuIHRoZSBjb21wb25lbnRcbiAgICogaXMgZmV0Y2hpbmcgZGF0YS4gSWYgbm90IHByb3ZpZGVkLCBhIGRlZmF1bHQgbG9hZGluZyBtZXNzYWdlIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmdUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHB1bGwtdG8tcmVmcmVzaCBmZWF0dXJlLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCBlbmFibGVzIHRoZSBwdWxsLXRvLXJlZnJlc2ggZnVuY3Rpb25hbGl0eSB0aGF0IGFsbG93c1xuICAgKiB1c2VycyB0byByZWZyZXNoIHRoZSBsaXN0IGRhdGEgYnkgcHVsbGluZyBkb3duIGZyb20gdGhlIHRvcCBvZiB0aGUgbGlzdC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2hvd1JlZnJlc2hlcjogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0eXBlIG9mIHNwaW5uZXIgdG8gZGlzcGxheSBkdXJpbmcgbG9hZGluZyBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgbG9hZGluZyBzcGlubmVyIHNob3duIGR1cmluZyBkYXRhXG4gICAqIGZldGNoaW5nIG9wZXJhdGlvbnMuIFVzZXMgSW9uaWMncyBwcmVkZWZpbmVkIHNwaW5uZXIgdHlwZXMuXG4gICAqXG4gICAqIEB0eXBlIHtTcGlubmVyVHlwZXN9XG4gICAqIEBkZWZhdWx0IFwiY2lyY3VsYXJcIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9hZGluZ1NwaW5uZXI6IFNwaW5uZXJUeXBlcyA9IFwiY2lyY3VsYXJcIjtcblxuICAvLyAvKipcbiAgLy8gICogQGRlc2NyaXB0aW9uIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGRhdGEgZmV0Y2hpbmcuXG4gIC8vICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgZGF0YSBmcm9tXG4gIC8vICAqIHRoZSBzb3VyY2UuIFRoaXMgY2FuIGJlIHByb3ZpZGVkIGFzIGEgc3RyaW5nIChKU09OKSBvciBhIGRpcmVjdCBvYmplY3QuXG4gIC8vICAqXG4gIC8vICAqIEB0eXBlIHtzdHJpbmcgfCBLZXlWYWx1ZSB8IHVuZGVmaW5lZH1cbiAgLy8gICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgLy8gICovXG4gIC8vIEBJbnB1dCgpXG4gIC8vIHF1ZXJ5Pzogc3RyaW5nIHwgS2V5VmFsdWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSBmaWx0ZXJpbmcgZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCBlbmFibGVzIHRoZSBmaWx0ZXIgY29tcG9uZW50IHRoYXQgYWxsb3dzIHVzZXJzIHRvIGNyZWF0ZVxuICAgKiBjb21wbGV4IHNlYXJjaCBjcml0ZXJpYSB3aXRoIG11bHRpcGxlIGZpZWxkIGZpbHRlcnMsIGNvbmRpdGlvbnMsIGFuZCB2YWx1ZXMuXG4gICAqIFdoZW4gZmFsc2UsIGRpc2FibGVzIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIGVudGlyZWx5LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbmFibGVGaWx0ZXI6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTb3J0aW5nIHBhcmFtZXRlcnMgZm9yIGRhdGEgZmV0Y2hpbmcuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgdGhlIGZldGNoZWQgZGF0YSBzaG91bGQgYmUgc29ydGVkLiBUaGlzIGNhbiBiZSBwcm92aWRlZFxuICAgKiBhcyBhIHN0cmluZyAoZmllbGQgbmFtZSB3aXRoIG9wdGlvbmFsIGRpcmVjdGlvbikgb3IgYSBkaXJlY3Qgb2JqZWN0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgS2V5VmFsdWUgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzb3J0RGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkRTQztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU29ydGluZyBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IHRoZSBmZXRjaGVkIGRhdGEgc2hvdWxkIGJlIHNvcnRlZC4gVGhpcyBjYW4gYmUgcHJvdmlkZWRcbiAgICogYXMgYSBzdHJpbmcgKGZpZWxkIG5hbWUgd2l0aCBvcHRpb25hbCBkaXJlY3Rpb24pIG9yIGEgZGlyZWN0IG9iamVjdC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IEtleVZhbHVlIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc29ydEJ5ITogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHNvcnRpbmcgZnVuY3Rpb25hbGl0eSBpcyBkaXNhYmxlZC5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgdGhlIHNvcnQgY29udHJvbHMgYW5kIHByZXZlbnRzIHVzZXJzIGZyb21cbiAgICogY2hhbmdpbmcgdGhlIHNvcnQgb3JkZXIgb3IgZmllbGQuIFRoZSBsaXN0IHdpbGwgbWFpbnRhaW4gaXRzIGRlZmF1bHQgb3JcbiAgICogcHJvZ3JhbW1hdGljYWxseSBzZXQgc29ydCBjb25maWd1cmF0aW9uIHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGRpc2FibGVTb3J0OiBTdHJpbmdPckJvb2xlYW4gPSBmYWxzZTtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSWNvbiB0byBkaXNwbGF5IHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgaWNvbiBzaG93biBpbiB0aGUgZW1wdHkgc3RhdGUgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICogVGhpcyBjYW4gYmUgYW55IGljb24gbmFtZSBzdXBwb3J0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uJ3MgaWNvbiBzeXN0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0ICd0aS1kYXRhYmFzZS1leGNsYW1hdGlvbidcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGVtcHR5SWNvbj86IHN0cmluZyA9ICd0aS1kYXRhYmFzZS1leGNsYW1hdGlvbic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZvciB0aGUgZW1wdHkgc3RhdGUgZGlzcGxheS5cbiAgICogQHN1bW1hcnkgQ3VzdG9taXplcyBob3cgdGhlIGVtcHR5IHN0YXRlIGlzIGRpc3BsYXllZCB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgKiBUaGlzIGluY2x1ZGVzIHRoZSB0aXRsZSwgc3VidGl0bGUsIGJ1dHRvbiB0ZXh0LCBpY29uLCBhbmQgbmF2aWdhdGlvbiBsaW5rLlxuICAgKlxuICAgKiBAdHlwZSB7UGFydGlhbDxJTGlzdEVtcHR5UmVzdWx0Pn1cbiAgICogQGRlZmF1bHQge1xuICAgKiAgIHRpdGxlOiAnZW1wdHkudGl0bGUnLFxuICAgKiAgIHN1YnRpdGxlOiAnZW1wdHkuc3VidGl0bGUnLFxuICAgKiAgIHNob3dCdXR0b246IGZhbHNlLFxuICAgKiAgIGljb246ICdhbGVydC1jaXJjbGUtb3V0bGluZScsXG4gICAqICAgYnV0dG9uVGV4dDogJ2xvY2FsZS5lbXB0eS5idXR0b24nLFxuICAgKiAgIGxpbms6ICcnXG4gICAqIH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGVtcHR5OiBQYXJ0aWFsPElMaXN0RW1wdHlSZXN1bHQ+ID0ge1xuICAgIHRpdGxlOiAnZW1wdHkudGl0bGUnLFxuICAgIHN1YnRpdGxlOiAnZW1wdHkuc3VidGl0bGUnLFxuICAgIHNob3dCdXR0b246IGZhbHNlLFxuICAgIGljb246ICdhbGVydC1jaXJjbGUtb3V0bGluZScsXG4gICAgYnV0dG9uVGV4dDogJ2xvY2FsZS5lbXB0eS5idXR0b24nLFxuICAgIGxpbms6ICcnXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyIGluIHBhZ2luYXRlZCBtb2RlLlxuICAgKiBAc3VtbWFyeSBUcmFja3Mgd2hpY2ggcGFnZSBpcyBjdXJyZW50bHkgYmVpbmcgZGlzcGxheWVkIHdoZW4gdGhlIGNvbXBvbmVudFxuICAgKiBpcyBpbiBwYWdpbmF0ZWQgbW9kZS4gVGhpcyBpcyB1c2VkIGZvciBwYWdpbmF0aW9uIGNvbnRyb2xzIGFuZCBkYXRhIGZldGNoaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAxXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwYWdlOiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY2FsY3VsYXRlZCB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYmFzZWQgb24gdGhlIGRhdGEgc2l6ZVxuICAgKiBhbmQgbGltaXQuIFRoaXMgaXMgdXNlZCBmb3IgcGFnaW5hdGlvbiBjb250cm9scyBhbmQgYm91bmRhcnkgY2hlY2tpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwYWdlcyE6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIGEgcmVmcmVzaCBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhlIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgZmV0Y2hpbmcgbmV3IGRhdGEuIFRoaXMgaXMgdXNlZFxuICAgKiB0byBjb250cm9sIGxvYWRpbmcgaW5kaWNhdG9ycyBhbmQgcHJldmVudCBkdXBsaWNhdGUgcmVmcmVzaCBvcGVyYXRpb25zIGZyb21cbiAgICogYmVpbmcgdHJpZ2dlcmVkIHNpbXVsdGFuZW91c2x5LlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHJlZnJlc2hpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IHVzZWQgZm9yIHJlbmRlcmluZyBza2VsZXRvbiBsb2FkaW5nIHBsYWNlaG9sZGVycy5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMgcGxhY2Vob2xkZXIgaXRlbXMgdGhhdCBhcmUgZGlzcGxheWVkIGR1cmluZyBkYXRhIGxvYWRpbmcuXG4gICAqIFRoZSBsZW5ndGggb2YgdGhpcyBhcnJheSBkZXRlcm1pbmVzIGhvdyBtYW55IHNrZWxldG9uIGl0ZW1zIGFyZSBzaG93bi5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgKiBAZGVmYXVsdCBuZXcgQXJyYXkoMilcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHNrZWxldG9uRGF0YTogc3RyaW5nW10gPSBuZXcgQXJyYXkoMik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcHJvY2Vzc2VkIGxpc3QgaXRlbXMgcmVhZHkgZm9yIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBzZXQgb2YgaXRlbXMgYmVpbmcgZGlzcGxheWVkIGluIHRoZSBsaXN0IGFmdGVyXG4gICAqIHByb2Nlc3NpbmcgZnJvbSB0aGUgcmF3IGRhdGEgc291cmNlLiBUaGlzIG1heSBiZSBhIHN1YnNldCBvZiB0aGUgZnVsbCBkYXRhXG4gICAqIHdoZW4gdXNpbmcgcGFnaW5hdGlvbiBvciBpbmZpbml0ZSBzY3JvbGxpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtLZXlWYWx1ZVtdfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaXRlbXMhOiBLZXlWYWx1ZVtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGN1cnJlbnQgc2VhcmNoIHF1ZXJ5IHZhbHVlLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGUgc2VhcmNoIGJhci4gVGhpcyBpcyB1c2VkIHRvIGZpbHRlclxuICAgKiB0aGUgbGlzdCBkYXRhIG9yIHRvIHNlbmQgYXMgYSBzZWFyY2ggcGFyYW1ldGVyIHdoZW4gZmV0Y2hpbmcgbmV3IGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBzZWFyY2hWYWx1ZT86IHN0cmluZyB8IElGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEEgcGFnaW5hdG9yIG9iamVjdCBmb3IgaGFuZGxpbmcgcGFnaW5hdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHBhZ2luYXRvciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbmQgbmF2aWdhdGVcbiAgICogdGhyb3VnaCBkYXRhIGluIGNodW5rcywgcmVkdWNpbmcgbWVtb3J5IHVzYWdlIGFuZCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UuXG4gICAqXG4gICAqIFRoZSBwYWdpbmF0b3Igb2JqZWN0IGlzIGluaXRpYWxpemVkIGluIHRoZSBgbmdPbkluaXRgIGxpZmVjeWNsZSBob29rIGFuZCBpc1xuICAgKiB1c2VkIHRvIGZldGNoIGFuZCBkaXNwbGF5IGRhdGEgaW4gdGhlIHBhZ2luYXRpb24gY29tcG9uZW50LiBJdCBpcyBhbiBpbnN0YW5jZVxuICAgKiBvZiB0aGUgYFBhZ2luYXRvcmAgY2xhc3MgZnJvbSB0aGUgYEBkZWNhZi10cy9jb3JlYCBwYWNrYWdlLCB3aGljaCBwcm92aWRlc1xuICAgKiBtZXRob2RzIGZvciBxdWVyeWluZyBhbmQgbWFuaXB1bGF0aW5nIHBhZ2luYXRlZCBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7UGFnaW5hdG9yPE1vZGVsPn1cbiAgICogQG1lbWJlck9mIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICovXG4gIHBhZ2luYXRvciE6IFBhZ2luYXRvcjxNb2RlbD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGFzdCBwYWdlIG51bWJlciB0aGF0IHdhcyBkaXNwbGF5ZWQuXG4gICAqIEBzdW1tYXJ5IEtlZXBzIHRyYWNrIG9mIHRoZSBwcmV2aW91c2x5IGRpc3BsYXllZCBwYWdlIG51bWJlciwgd2hpY2ggaXMgdXNlZnVsXG4gICAqIGZvciBoYW5kbGluZyBuYXZpZ2F0aW9uIGFuZCBzZWFyY2ggb3BlcmF0aW9ucyBpbiBwYWdpbmF0ZWQgbW9kZS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgbGFzdFBhZ2U6IG51bWJlciA9IDFcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGVtaXR0ZXIgZm9yIHJlZnJlc2ggb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgbGlzdCBkYXRhIGlzIHJlZnJlc2hlZCwgZWl0aGVyIHRocm91Z2ggcHVsbC10by1yZWZyZXNoXG4gICAqIG9yIHByb2dyYW1tYXRpYyByZWZyZXNoLiBUaGUgZXZlbnQgaW5jbHVkZXMgdGhlIHJlZnJlc2hlZCBkYXRhIGFuZCBjb21wb25lbnQgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICByZWZyZXNoRXZlbnQ6IEV2ZW50RW1pdHRlcjxCYXNlQ3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxCYXNlQ3VzdG9tRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBpdGVtIGNsaWNrIGludGVyYWN0aW9ucy5cbiAgICogQHN1bW1hcnkgRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLiBUaGUgZXZlbnQgaW5jbHVkZXMgdGhlIGRhdGFcbiAgICogb2YgdGhlIGNsaWNrZWQgaXRlbSwgYWxsb3dpbmcgcGFyZW50IGNvbXBvbmVudHMgdG8gcmVzcG9uZCB0byB0aGUgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8S2V5VmFsdWU+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGNsaWNrRXZlbnQ6ICBFdmVudEVtaXR0ZXI8TGlzdEl0ZW1DdXN0b21FdmVudHxSZW5kZXJlckN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8TGlzdEl0ZW1DdXN0b21FdmVudHxSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3ViamVjdCBmb3IgZGVib3VuY2luZyBjbGljayBldmVudHMuXG4gICAqIEBzdW1tYXJ5IFVzZXMgUnhKUyBTdWJqZWN0IHRvIGNvbGxlY3QgY2xpY2sgZXZlbnRzIGFuZCBlbWl0IHRoZW0gYWZ0ZXIgYSBkZWJvdW5jZVxuICAgKiBwZXJpb2QuIFRoaXMgcHJldmVudHMgbXVsdGlwbGUgcmFwaWQgY2xpY2tzIGZyb20gdHJpZ2dlcmluZyBtdWx0aXBsZSBldmVudHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtTdWJqZWN0PEN1c3RvbUV2ZW50IHwgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBjbGlja0l0ZW1TdWJqZWN0OiBTdWJqZWN0PEN1c3RvbUV2ZW50IHwgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQ+ID0gbmV3IFN1YmplY3Q8Q3VzdG9tRXZlbnQgfCBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3ViamVjdCBmb3IgZGVib3VuY2luZyByZXBvc2l0b3J5IG9ic2VydmF0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgUnhKUyBTdWJqZWN0IHRoYXQgY29sbGVjdHMgcmVwb3NpdG9yeSBjaGFuZ2UgZXZlbnRzIGFuZCBlbWl0cyB0aGVtIGFmdGVyXG4gICAqIGEgZGVib3VuY2UgcGVyaW9kLiBUaGlzIHByZXZlbnRzIG11bHRpcGxlIHJhcGlkIHJlcG9zaXRvcnkgY2hhbmdlcyBmcm9tIHRyaWdnZXJpbmdcbiAgICogbXVsdGlwbGUgbGlzdCByZWZyZXNoIG9wZXJhdGlvbnMsIGltcHJvdmluZyBwZXJmb3JtYW5jZSBhbmQgdXNlciBleHBlcmllbmNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7U3ViamVjdDxhbnk+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBvYnNlcnZlclN1YmpldDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT2JzZXJ2ZXIgb2JqZWN0IGZvciByZXBvc2l0b3J5IGNoYW5nZSBub3RpZmljYXRpb25zLlxuICAgKiBAc3VtbWFyeSBJbXBsZW1lbnRzIHRoZSBPYnNlcnZlciBpbnRlcmZhY2UgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gdGhlXG4gICAqIHVuZGVybHlpbmcgZGF0YSByZXBvc2l0b3J5IGNoYW5nZXMuIFRoaXMgZW5hYmxlcyBhdXRvbWF0aWMgbGlzdCB1cGRhdGVzIHdoZW5cbiAgICogZGF0YSBpcyBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkIHRocm91Z2ggdGhlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtPYnNlcnZlcn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgb2JzZXJ2ZXI6IE9ic2VydmVyID0geyByZWZyZXNoOiBhc3luYyAoLi4uIGFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dm9pZD4gPT4gdGhpcy5vYnNlcnZlUmVwb3NpdG9yeSguLi5hcmdzKX1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgYXZhaWxhYmxlIGluZGV4ZXMgZm9yIGRhdGEgcXVlcnlpbmcgYW5kIGZpbHRlcmluZy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBsaXN0IG9mIGluZGV4IG5hbWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3B0aW1pemUgZGF0YSBxdWVyeWluZyBhbmQgZmlsdGVyaW5nXG4gICAqIG9wZXJhdGlvbnMsIGVzcGVjaWFsbHkgaW4gc2NlbmFyaW9zIHdpdGggbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEluZGV4ZXMgY2FuIHNpZ25pZmljYW50bHkgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgZGF0YSByZXRyaWV2YWwgYnkgYWxsb3dpbmcgdGhlIGRhdGFiYXNlXG4gICAqIHRvIHF1aWNrbHkgbG9jYXRlIGFuZCByZXRyaWV2ZSByZWxldmFudCBkYXRhIGJhc2VkIG9uIGluZGV4ZWQgZmllbGRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nW119XG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBpbmRleGVzITogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgTGlzdENvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBMaXN0Q29tcG9uZW50IGFuZCBzZXRzIHVwIHRoZSBiYXNlIGNvbXBvbmVudCB3aXRoIHRoZSBhcHByb3ByaWF0ZVxuICAgKiBjb21wb25lbnQgbmFtZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2hlbiBBbmd1bGFyIGluc3RhbnRpYXRlcyB0aGUgY29tcG9uZW50IGFuZFxuICAgKiBiZWZvcmUgYW55IGlucHV0IHByb3BlcnRpZXMgYXJlIHNldC4gSXQgcGFzc2VzIHRoZSBjb21wb25lbnQgbmFtZSB0byB0aGUgcGFyZW50IGNsYXNzXG4gICAqIGNvbnN0cnVjdG9yIHRvIGVuYWJsZSBwcm9wZXIgbG9jYWxpemF0aW9uIGFuZCBjb21wb25lbnQgaWRlbnRpZmljYXRpb24uXG4gICAqXG4gICAqIFRoZSBjb25zdHJ1Y3RvciBpcyBpbnRlbnRpb25hbGx5IG1pbmltYWwsIHdpdGggbW9zdCBpbml0aWFsaXphdGlvbiBsb2dpYyBkZWZlcnJlZCB0b1xuICAgKiB0aGUgbmdPbkluaXQgbGlmZWN5Y2xlIGhvb2suIFRoaXMgZm9sbG93cyBBbmd1bGFyIGJlc3QgcHJhY3RpY2VzIGJ5IGtlZXBpbmcgdGhlIGNvbnN0cnVjdG9yXG4gICAqIGZvY3VzZWQgb24gZGVwZW5kZW5jeSBpbmplY3Rpb24gYW5kIGJhc2ljIHNldHVwLCB3aGlsZSBjb21wbGV4IGluaXRpYWxpemF0aW9uIHRoYXQgZGVwZW5kc1xuICAgKiBvbiBpbnB1dCBwcm9wZXJ0aWVzIGlzIGhhbmRsZWQgaW4gbmdPbkluaXQuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIkxpc3RDb21wb25lbnRcIik7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCBhZnRlciBBbmd1bGFyIHNldHMgdGhlIGlucHV0IHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgdGhlIGNvbXBvbmVudCBieSBpbml0aWFsaXppbmcgZXZlbnQgc3Vic2NyaXB0aW9ucywgcHJvY2Vzc2luZyBib29sZWFuXG4gICAqIGlucHV0cywgYW5kIGxvYWRpbmcgdGhlIGluaXRpYWwgZGF0YS4gVGhpcyBtZXRob2QgcHJlcGFyZXMgdGhlIGNvbXBvbmVudCBmb3IgdXNlclxuICAgKiBpbnRlcmFjdGlvbiBieSBlbnN1cmluZyBhbGwgcHJvcGVydGllcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYW5kIGRhdGEgaXMgbG9hZGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyIExpZmVjeWNsZVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTGlzdENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRGF0YSBTb3VyY2VcbiAgICpcbiAgICogICBBLT4+TDogbmdPbkluaXQoKVxuICAgKiAgIEwtPj5MOiBTZXQgdXAgY2xpY2sgZXZlbnQgZGVib3VuY2luZ1xuICAgKiAgIEwtPj5MOiBQcm9jZXNzIGJvb2xlYW4gaW5wdXRzXG4gICAqICAgTC0+Pkw6IENvbmZpZ3VyZSBjb21wb25lbnQgYmFzZWQgb24gaW5wdXRzXG4gICAqICAgTC0+Pkw6IHJlZnJlc2goKVxuICAgKiAgIEwtPj5EOiBSZXF1ZXN0IGluaXRpYWwgZGF0YVxuICAgKiAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAgICogICBMLT4+TDogUHJvY2VzcyBhbmQgZGlzcGxheSBkYXRhXG4gICAqICAgTC0+Pkw6IENvbmZpZ3VyZSBlbXB0eSBzdGF0ZSBpZiBuZWVkZWRcbiAgICogICBMLT4+TDogaW5pdGlhbGl6ZSgpXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsaWNrSXRlbVN1YmplY3QucGlwZShkZWJvdW5jZVRpbWUoMTAwKSkuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuY2xpY2tFdmVudEVtaXQoZXZlbnQgYXMgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpKTtcbiAgICB0aGlzLm9ic2VydmVyU3ViamV0LnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLnN1YnNjcmliZShhcmdzID0+IHRoaXMuaGFuZGxlT2JzZXJ2ZUV2ZW50KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pKTtcbiAgICB0aGlzLmVuYWJsZUZpbHRlciA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLmVuYWJsZUZpbHRlcik7XG4gICAgdGhpcy5saW1pdCA9IE51bWJlcih0aGlzLmxpbWl0KTtcbiAgICB0aGlzLnN0YXJ0ID0gTnVtYmVyKHRoaXMuc3RhcnQpO1xuICAgIHRoaXMuaW5zZXQgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5pbnNldCk7XG4gICAgdGhpcy5zaG93UmVmcmVzaGVyID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuc2hvd1JlZnJlc2hlcik7XG4gICAgdGhpcy5sb2FkTW9yZURhdGEgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5sb2FkTW9yZURhdGEpO1xuICAgIHRoaXMuc2hvd1NlYXJjaGJhciA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLnNob3dTZWFyY2hiYXIpO1xuICAgIHRoaXMuZGlzYWJsZVNvcnQgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5kaXNhYmxlU29ydCk7XG4gICAgaWYodHlwZW9mIHRoaXMuaXRlbT8uWyd0YWcnXSA9PT0gJ2Jvb2xlYW4nICYmIHRoaXMuaXRlbT8uWyd0YWcnXSA9PT0gdHJ1ZSlcbiAgICAgIHRoaXMuaXRlbVsndGFnJ10gPSBDb21wb25lbnRzVGFnTmFtZXMuTElTVF9JVEVNIGFzIHN0cmluZztcblxuICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuXG4gICAgaWYodGhpcy5vcGVyYXRpb25zLmluY2x1ZGVzKE9wZXJhdGlvbktleXMuQ1JFQVRFKSAmJiB0aGlzLnJvdXRlKVxuICAgICAgdGhpcy5lbXB0eS5saW5rID0gYCR7dGhpcy5yb3V0ZX0vJHtPcGVyYXRpb25LZXlzLkNSRUFURX1gO1xuXG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG5cbiAgICBpZih0aGlzLm1vZGVsIGluc3RhbmNlb2YgTW9kZWwgJiYgdGhpcy5fcmVwb3NpdG9yeSlcbiAgICAgIHRoaXMuX3JlcG9zaXRvcnkub2JzZXJ2ZSh0aGlzLm9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYW5zIHVwIHJlc291cmNlcyB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLlxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBjbGVhbnVwIG9wZXJhdGlvbnMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgRE9NLlxuICAgKiBUaGlzIGluY2x1ZGVzIGNsZWFyaW5nIHJlZmVyZW5jZXMgdG8gbW9kZWxzIGFuZCBkYXRhIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmKHRoaXMuX3JlcG9zaXRvcnkpXG4gICAgICB0aGlzLl9yZXBvc2l0b3J5LnVuT2JzZXJ2ZSh0aGlzLm9ic2VydmVyKTtcbiAgICB0aGlzLmRhdGEgPSAgdGhpcy5tb2RlbCA9IHRoaXMuX3JlcG9zaXRvcnkgPSB0aGlzLnBhZ2luYXRvciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyByZXBvc2l0b3J5IG9ic2VydmF0aW9uIGV2ZW50cyB3aXRoIGRlYm91bmNpbmcuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyByZXBvc2l0b3J5IGNoYW5nZSBub3RpZmljYXRpb25zIGFuZCByb3V0ZXMgdGhlbSBhcHByb3ByaWF0ZWx5LlxuICAgKiBGb3IgQ1JFQVRFIGV2ZW50cyB3aXRoIGEgVUlELCBoYW5kbGVzIHRoZW0gaW1tZWRpYXRlbHkuIEZvciBvdGhlciBldmVudHMsXG4gICAqIHBhc3NlcyB0aGVtIHRvIHRoZSBkZWJvdW5jZWQgb2JzZXJ2ZXIgc3ViamVjdCB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB1cGRhdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLnVua25vd25bXX0gYXJncyAtIFRoZSByZXBvc2l0b3J5IGV2ZW50IGFyZ3VtZW50cyBpbmNsdWRpbmcgdGFibGUsIGV2ZW50IHR5cGUsIGFuZCBVSURcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBvYnNlcnZlUmVwb3NpdG9yeSguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBbdGFibGUsIGV2ZW50LCB1aWRdID0gYXJncztcbiAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUgJiYgISF1aWQpXG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVPYnNlcnZlRXZlbnQodGFibGUgYXMgc3RyaW5nLCBldmVudCwgdWlkIGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJTdWJqZXQubmV4dChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzcGVjaWZpYyByZXBvc2l0b3J5IGV2ZW50cyBhbmQgdXBkYXRlcyB0aGUgbGlzdCBhY2NvcmRpbmdseS5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIHJlcG9zaXRvcnkgY2hhbmdlIGV2ZW50cyAoQ1JFQVRFLCBVUERBVEUsIERFTEVURSkgYW5kIHBlcmZvcm1zXG4gICAqIHRoZSBhcHByb3ByaWF0ZSBsaXN0IG9wZXJhdGlvbnMuIFRoaXMgaW5jbHVkZXMgYWRkaW5nIG5ldyBpdGVtcywgdXBkYXRpbmcgZXhpc3RpbmdcbiAgICogb25lcywgb3IgcmVtb3ZpbmcgZGVsZXRlZCBpdGVtcyBmcm9tIHRoZSBsaXN0IGRpc3BsYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZS9tb2RlbCBuYW1lIHRoYXQgY2hhbmdlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIChDUkVBVEUsIFVQREFURSwgREVMRVRFKVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdWlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhZmZlY3RlZCBpdGVtXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlT2JzZXJ2ZUV2ZW50KHRhYmxlOiBzdHJpbmcsIGV2ZW50OiBPcGVyYXRpb25LZXlzLCB1aWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKGV2ZW50ID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSkge1xuICAgICAgaWYodWlkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ3JlYXRlKHVpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKGV2ZW50ID09PSBPcGVyYXRpb25LZXlzLlVQREFURSlcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVVcGRhdGUodWlkKTtcbiAgICAgIGlmKGV2ZW50ID09PSBPcGVyYXRpb25LZXlzLkRFTEVURSlcbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGUodWlkKTtcbiAgICAgIHRoaXMucmVmcmVzaEV2ZW50RW1pdCgpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiBmb3IgdHJhY2tpbmcgaXRlbXMgaW4gdGhlIGxpc3QuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgdHJhY2tpbmcgZnVuY3Rpb24gZm9yIHRoZSBgKm5nRm9yYCBkaXJlY3RpdmUgaW4gdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZS5cbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZCBjb250cm9sIHRoZSByZW5kZXJpbmcgb2YgaXRlbXMgaW4gdGhlIGxpc3QsXG4gICAqIHByZXZlbnRpbmcgZHVwbGljYXRlIG9yIHVubmVjZXNzYXJ5IHJlbmRlcmluZy5cbiAgICpcbiAgICogVGhlIGB0cmFja0l0ZW1GbmAgZnVuY3Rpb24gdGFrZXMgdHdvIHBhcmFtZXRlcnM6IGBpbmRleGAgKHRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgbGlzdClcbiAgICogYW5kIGBpdGVtYCAodGhlIGFjdHVhbCBpdGVtIGZyb20gdGhlIGxpc3QpLiBJdCByZXR1cm5zIHRoZSB0cmFja2luZyBrZXksIHdoaWNoIGluIHRoaXMgY2FzZVxuICAgKiBpcyB0aGUgdW5pb24gb2YgdGhlIGB1aWRgIG9mIHRoZSBpdGVtIHdpdGggdGhlIG1vZGVsIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgbGlzdC5cblxuICAgKiBAcGFyYW0ge0tleVZhbHVlIHwgc3RyaW5nIHwgbnVtYmVyfSBpdGVtIC0gVGhlIGFjdHVhbCBpdGVtIGZyb20gdGhlIGxpc3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXJ9IFRoZSB0cmFja2luZyBrZXkgZm9yIHRoZSBpdGVtLlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgb3ZlcnJpZGUgdHJhY2tJdGVtRm4oaW5kZXg6IG51bWJlciwgaXRlbTogS2V5VmFsdWUgfCBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBgJHsgKGl0ZW0gYXMgS2V5VmFsdWUpPy5bJ3VpZCddIHx8IChpdGVtIGFzIEtleVZhbHVlKT8uW3RoaXMucGtdfS0ke2luZGV4fWA7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQgZnJvbSB0aGUgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSBJRCBvZiB0aGUgaXRlbSB0byBjcmVhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpdGVtIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBsaXN0LlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ3JlYXRlKHVpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcmVwb3NpdG9yeT8ucmVhZCh1aWQpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1hcFJlc3VsdHMoW3Jlc3VsdCBhcyBLZXlWYWx1ZV0pWzBdO1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGEgPSBbaXRlbSwgLi4udGhpcy5pdGVtcyB8fCBbXV07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB0aGUgdXBkYXRlIGV2ZW50IGZyb20gdGhlIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgdGhlIGxpc3QgaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgYmFzZWQgb24gdGhlIG5ldyBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdWlkIC0gVGhlIElEIG9mIHRoZSBpdGVtIHRvIHVwZGF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZVVwZGF0ZSh1aWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGl0ZW06IEtleVZhbHVlID0gdGhpcy5pdGVtTWFwcGVyKGF3YWl0IHRoaXMuX3JlcG9zaXRvcnk/LnJlYWQodWlkKSB8fCB7fSwgdGhpcy5tYXBwZXIpO1xuICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgIGZvcihjb25zdCBrZXkgaW4gdGhpcy5pdGVtcyBhcyBLZXlWYWx1ZVtdKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5pdGVtc1trZXldIGFzIEtleVZhbHVlO1xuICAgICAgICBpZihjaGlsZFsndWlkJ10gPT09IGl0ZW1bJ3VpZCddKSB7XG4gICAgICAgICAgdGhpcy5pdGVtc1trZXldID0gT2JqZWN0LmFzc2lnbih7fSwgY2hpbGQsIGl0ZW0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhID0gWyAuLi50aGlzLml0ZW1zXTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGxpc3QgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IEZpbHRlcnMgb3V0IGFuIGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIElEIGZyb20gdGhlIGRhdGEgYXJyYXkgYW5kXG4gICAqIHJlZnJlc2hlcyB0aGUgbGlzdCBkaXNwbGF5LiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGFmdGVyIGEgZGVsZXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVpZCAtIFRoZSBJRCBvZiB0aGUgaXRlbSB0byBkZWxldGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gVGhlIHByaW1hcnkga2V5IGZpZWxkIG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVEZWxldGUodWlkOiBzdHJpbmcgfCBudW1iZXIsIHBrPzogc3RyaW5nKTogdm9pZCAge1xuICAgIGlmKCFwaylcbiAgICAgIHBrID0gdGhpcy5waztcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhPy5maWx0ZXIoKGl0ZW06IEtleVZhbHVlKSA9PiBpdGVtWyd1aWQnXSAhPT0gdWlkKSB8fCBbXTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGNsaWNrIGV2ZW50cyBmcm9tIGxpc3QgaXRlbXMuXG4gICAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGdsb2JhbCBMaXN0SXRlbUNsaWNrRXZlbnQgZXZlbnRzIGFuZCBwYXNzZXMgdGhlbSB0byB0aGVcbiAgICogZGVib3VuY2VkIGNsaWNrIHN1YmplY3QuIFRoaXMgYWxsb3dzIHRoZSBjb21wb25lbnQgdG8gcmVzcG9uZCB0byBjbGlja3Mgb25cbiAgICogbGlzdCBpdGVtcyByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZXkgb3JpZ2luYXRlIGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSB7TGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIGNsaWNrIGV2ZW50XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93Okxpc3RJdGVtQ2xpY2tFdmVudCcsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tJdGVtU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzZWFyY2ggZXZlbnRzIGZyb20gdGhlIHNlYXJjaCBiYXIuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBzZWFyY2ggcXVlcmllcyBmcm9tIHRoZSBzZWFyY2ggYmFyIGNvbXBvbmVudCwgdXBkYXRpbmcgdGhlXG4gICAqIGRpc3BsYXllZCBkYXRhIGJhc2VkIG9uIHRoZSBzZWFyY2ggdGVybS4gVGhlIGJlaGF2aW9yIGRpZmZlcnMgYmV0d2VlbiBpbmZpbml0ZVxuICAgKiBhbmQgcGFnaW5hdGVkIG1vZGVzIHRvIHByb3ZpZGUgdGhlIGJlc3QgdXNlciBleHBlcmllbmNlIGZvciBlYWNoIG1vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIFRoZSBzZWFyY2ggdGVybSBvciB1bmRlZmluZWQgdG8gY2xlYXIgc2VhcmNoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBmbG93Y2hhcnQgVERcbiAgICogICBBW1NlYXJjaCBFdmVudF0gLS0+IEJ7VHlwZSBpcyBJbmZpbml0ZT99XG4gICAqICAgQiAtLT58WWVzfCBDW0Rpc2FibGUgbG9hZE1vcmVEYXRhXVxuICAgKiAgIEIgLS0+fE5vfCBEW0VuYWJsZSBsb2FkTW9yZURhdGFdXG4gICAqICAgQyAtLT4gRXtTZWFyY2ggdmFsdWUgdW5kZWZpbmVkP31cbiAgICogICBFIC0tPnxZZXN8IEZbRW5hYmxlIGxvYWRNb3JlRGF0YV1cbiAgICogICBFIC0tPnxOb3wgR1tTdG9yZSBzZWFyY2ggdmFsdWVdXG4gICAqICAgRCAtLT4gR1xuICAgKiAgIEYgLS0+IEhbUmVzZXQgcGFnZSB0byAxXVxuICAgKiAgIEcgLS0+IElbUmVmcmVzaCBkYXRhXVxuICAgKiAgIEggLS0+IElcbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzZWFyY2hiYXJFdmVudCcsIFsnJGV2ZW50J10pXG4gIGFzeW5jIGhhbmRsZVNlYXJjaCh2YWx1ZTogc3RyaW5nIHwgSUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYodGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFKSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IHRydWU7XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRoaXMucGFnZSA9IHRoaXMubGFzdFBhZ2U7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZmlsdGVyIGV2ZW50cyBmcm9tIHRoZSBmaWx0ZXIgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgZmlsdGVyIHF1ZXJpZXMgZnJvbSB0aGUgZmlsdGVyIGNvbXBvbmVudCBhbmQgYXBwbGllcyB0aGVtXG4gICAqIHRvIHRoZSBsaXN0IGRhdGEuIFRoaXMgbWV0aG9kIGFjdHMgYXMgYSBicmlkZ2UgYmV0d2VlbiB0aGUgZmlsdGVyIGNvbXBvbmVudFxuICAgKiBhbmQgdGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5LCBjb252ZXJ0aW5nIGZpbHRlciBxdWVyaWVzIGludG8gc2VhcmNoIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7SUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkfSB2YWx1ZSAtIFRoZSBmaWx0ZXIgcXVlcnkgb2JqZWN0IG9yIHVuZGVmaW5lZCB0byBjbGVhciBmaWx0ZXJzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlRmlsdGVyKHZhbHVlOiBJRmlsdGVyUXVlcnkgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVNlYXJjaCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFycyB0aGUgY3VycmVudCBzZWFyY2ggYW5kIHJlc2V0cyB0aGUgbGlzdC5cbiAgICogQHN1bW1hcnkgQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY2xlYXJzIHRoZSBzZWFyY2ggYnkgY2FsbGluZyBoYW5kbGVTZWFyY2hcbiAgICogd2l0aCB1bmRlZmluZWQuIFRoaXMgcmVzZXRzIHRoZSBsaXN0IHRvIHNob3cgYWxsIGRhdGEgd2l0aG91dCBmaWx0ZXJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgY2xlYXJTZWFyY2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVTZWFyY2godW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW1pdHMgYSByZWZyZXNoIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgZGF0YS5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgZW1pdHMgYSByZWZyZXNoIGV2ZW50IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgbGlzdCBkYXRhLlxuICAgKiBUaGlzIG5vdGlmaWVzIHBhcmVudCBjb21wb25lbnRzIHRoYXQgdGhlIGxpc3QgZGF0YSBoYXMgYmVlbiByZWZyZXNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5VmFsdWVbXX0gW2RhdGFdIC0gT3B0aW9uYWwgZGF0YSB0byBpbmNsdWRlIGluIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHJlZnJlc2hFdmVudEVtaXQoZGF0YT86IEtleVZhbHVlW10pOiB2b2lkIHtcbiAgICBpZighZGF0YSlcbiAgICAgIGRhdGEgPSB0aGlzLml0ZW1zO1xuICAgIHRoaXMuc2tlbGV0b25EYXRhID0gbmV3IEFycmF5KGRhdGE/Lmxlbmd0aCB8fCAyKTtcbiAgICB0aGlzLnJlZnJlc2hFdmVudC5lbWl0KHtcbiAgICAgIG5hbWU6IEV2ZW50Q29uc3RhbnRzLlJFRlJFU0hfRVZFTlQsXG4gICAgICBkYXRhOiBkYXRhIHx8IFtdLFxuICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudE5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW1pdHMgYSBjbGljayBldmVudCBmb3IgYSBsaXN0IGl0ZW0uXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhbmQgZW1pdHMgYSBjbGljayBldmVudCB3aGVuIGEgbGlzdCBpdGVtIGlzIGNsaWNrZWQuXG4gICAqIFRoaXMgZXh0cmFjdHMgdGhlIHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgZXZlbnQgYW5kIHBhc3NlcyBpdCB0byBwYXJlbnQgY29tcG9uZW50cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgY2xpY2sgZXZlbnRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGNsaWNrRXZlbnRFbWl0KGV2ZW50OiBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmcmVzaGVzIHRoZSBsaXN0IGRhdGEgZnJvbSB0aGUgY29uZmlndXJlZCBzb3VyY2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBpbml0aWFsIGRhdGEgbG9hZGluZyBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMsXG4gICAqIGluY2x1ZGluZyBwdWxsLXRvLXJlZnJlc2ggYW5kIGluZmluaXRlIHNjcm9sbGluZy4gSXQgbWFuYWdlcyB0aGUgZGF0YSBmZXRjaGluZyBwcm9jZXNzLFxuICAgKiB1cGRhdGVzIHRoZSBjb21wb25lbnQncyBzdGF0ZSwgYW5kIGhhbmRsZXMgcGFnaW5hdGlvbiBvciBpbmZpbml0ZSBzY3JvbGxpbmcgbG9naWMgYmFzZWRcbiAgICogb24gdGhlIGNvbXBvbmVudCdzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFRoZSBtZXRob2QgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgICogMS4gU2V0cyB0aGUgcmVmcmVzaGluZyBmbGFnIHRvIGluZGljYXRlIGEgZGF0YSBmZXRjaCBpcyBpbiBwcm9ncmVzc1xuICAgKiAyLiBDYWxjdWxhdGVzIHRoZSBhcHByb3ByaWF0ZSBzdGFydCBhbmQgbGltaXQgdmFsdWVzIGJhc2VkIG9uIHBhZ2luYXRpb24gc2V0dGluZ3NcbiAgICogMy4gRmV0Y2hlcyBkYXRhIGZyb20gdGhlIGFwcHJvcHJpYXRlIHNvdXJjZSAobW9kZWwgb3IgcmVxdWVzdClcbiAgICogNC4gVXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBhbmQgZW1pdHMgYSByZWZyZXNoIGV2ZW50XG4gICAqIDUuIEhhbmRsZXMgcGFnaW5hdGlvbiBvciBpbmZpbml0ZSBzY3JvbGxpbmcgc3RhdGUgdXBkYXRlc1xuICAgKiA2LiBDb21wbGV0ZXMgYW55IHByb3ZpZGVkIGV2ZW50IChsaWtlIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpXG4gICAqXG4gICAqIEBwYXJhbSB7SW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IFJlZnJlc2hlckN1c3RvbUV2ZW50IHwgYm9vbGVhbn0gZXZlbnQgLSBUaGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHJlZnJlc2gsXG4gICAqIG9yIGEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGhpcyBpcyBhIGZvcmNlZCByZWZyZXNoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWZyZXNoIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIERhdGEgU291cmNlXG4gICAqICAgcGFydGljaXBhbnQgRSBhcyBFdmVudCBTeXN0ZW1cbiAgICpcbiAgICogICBMLT4+TDogcmVmcmVzaChldmVudClcbiAgICogICBMLT4+TDogU2V0IHJlZnJlc2hpbmcgZmxhZ1xuICAgKiAgIEwtPj5MOiBDYWxjdWxhdGUgc3RhcnQgYW5kIGxpbWl0XG4gICAqICAgYWx0IFVzaW5nIG1vZGVsXG4gICAqICAgICBMLT4+RDogZ2V0RnJvbU1vZGVsKGZvcmNlLCBzdGFydCwgbGltaXQpXG4gICAqICAgICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgZWxzZSBVc2luZyByZXF1ZXN0XG4gICAqICAgICBMLT4+RDogZ2V0RnJvbVJlcXVlc3QoZm9yY2UsIHN0YXJ0LCBsaW1pdClcbiAgICogICAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAgICogICBlbmRcbiAgICogICBMLT4+RTogcmVmcmVzaEV2ZW50RW1pdCgpXG4gICAqICAgYWx0IEluZmluaXRlIHNjcm9sbGluZyBtb2RlXG4gICAqICAgICBMLT4+TDogQ2hlY2sgaWYgcmVhY2hlZCBsYXN0IHBhZ2VcbiAgICogICAgIGFsdCBMYXN0IHBhZ2UgcmVhY2hlZFxuICAgKiAgICAgICBMLT4+TDogQ29tcGxldGUgc2Nyb2xsIGV2ZW50XG4gICAqICAgICAgIEwtPj5MOiBEaXNhYmxlIGxvYWRNb3JlRGF0YVxuICAgKiAgICAgZWxzZSBNb3JlIHBhZ2VzIGF2YWlsYWJsZVxuICAgKiAgICAgICBMLT4+TDogSW5jcmVtZW50IHBhZ2UgbnVtYmVyXG4gICAqICAgICAgIEwtPj5MOiBDb21wbGV0ZSBzY3JvbGwgZXZlbnQgYWZ0ZXIgZGVsYXlcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgUGFnaW5hdGVkIG1vZGVcbiAgICogICAgIEwtPj5MOiBDbGVhciByZWZyZXNoaW5nIGZsYWcgYWZ0ZXIgZGVsYXlcbiAgICogICBlbmRcbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpCYWNrQnV0dG9uTmF2aWdhdGlvbkVuZEV2ZW50JywgWyckZXZlbnQnXSlcbiAgYXN5bmMgcmVmcmVzaChldmVudDogSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IFJlZnJlc2hlckN1c3RvbUV2ZW50IHwgYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gIGlmKHR5cGVvZiBmb3JjZSAhPT0gJ2Jvb2xlYW4nICYmIGZvcmNlLnR5cGUgPT09IEV2ZW50Q29uc3RhbnRzLkJBQ0tfQlVUVE9OX05BVklHQVRJT04pIHtcbiAgICAvLyAgICBjb25zdCB7cmVmcmVzaH0gPSAoZm9yY2UgYXMgQ3VzdG9tRXZlbnQpLmRldGFpbDtcbiAgICAvLyAgICBpZighcmVmcmVzaClcbiAgICAvLyAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgfVxuXG4gICAgdGhpcy5yZWZyZXNoaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBzdGFydDogbnVtYmVyID0gdGhpcy5wYWdlID4gMSA/ICh0aGlzLnBhZ2UgLSAxKSAqIHRoaXMubGltaXQgOiB0aGlzLnN0YXJ0O1xuICAgIGNvbnN0IGxpbWl0OiBudW1iZXIgPSAodGhpcy5wYWdlICogKHRoaXMubGltaXQgPiAxMiA/IDEyIDogdGhpcy5saW1pdCkpO1xuXG4gICAgdGhpcy5kYXRhID0gIXRoaXMubW9kZWwgP1xuICAgICAgYXdhaXQgdGhpcy5nZXRGcm9tUmVxdWVzdCghIWV2ZW50LCBzdGFydCwgbGltaXQpXG4gICAgICA6IGF3YWl0IHRoaXMuZ2V0RnJvbU1vZGVsKCEhZXZlbnQpIGFzIEtleVZhbHVlW107XG5cbiAgICB0aGlzLnJlZnJlc2hFdmVudEVtaXQoKTtcblxuICAgIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSkge1xuICAgICAgaWYodGhpcy5wYWdlID09PSB0aGlzLnBhZ2VzKSB7XG4gICAgICAgIGlmKChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KT8udGFyZ2V0KVxuICAgICAgICAgIChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KS50YXJnZXQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGFnZSArPSAxO1xuICAgICAgICB0aGlzLnJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZigoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCk/LnRhcmdldCAmJiAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQpPy50eXBlICE9PSBFdmVudENvbnN0YW50cy5CQUNLX0JVVFRPTl9OQVZJR0FUSU9OKVxuICAgICAgICAgICAgICAoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCkudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICAgIH0sIDIwMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBhZ2luYXRpb24gZXZlbnRzIGZyb20gdGhlIHBhZ2luYXRpb24gY29tcG9uZW50LlxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIHBhZ2luYXRpb24gZXZlbnRzIGJ5IHVwZGF0aW5nIHRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyIGFuZFxuICogcmVmcmVzaGluZyB0aGUgbGlzdCBkYXRhIHRvIGRpc3BsYXkgdGhlIHNlbGVjdGVkIHBhZ2UuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICogd2hlbiBhIHVzZXIgaW50ZXJhY3RzIHdpdGggdGhlIHBhZ2luYXRpb24gY29udHJvbHMgdG8gbmF2aWdhdGUgYmV0d2VlbiBwYWdlcy5cbiAqXG4gKiBAcGFyYW0ge1BhZ2luYXRpb25DdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgcGFnaW5hdGlvbiBldmVudCBjb250YWluaW5nIHBhZ2UgaW5mb3JtYXRpb25cbiAqIEByZXR1cm5zIHt2b2lkfVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmhhbmRsZVBhZ2luYXRlKGV2ZW50OiBQYWdpbmF0aW9uQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgY29uc3QgeyBwYWdlfSA9IGV2ZW50LmRhdGE7XG4gIHRoaXMucGFnZSA9IHBhZ2U7XG4gIHRoaXMucmVmcmVzaCh0cnVlKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwdWxsLXRvLXJlZnJlc2ggZXZlbnRzIGZyb20gdGhlIHJlZnJlc2hlciBjb21wb25lbnQuXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgcmVmcmVzaCBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHB1bGxpbmcgZG93biBvbiB0aGUgbGlzdFxuICogb3IgYnkgcHJvZ3JhbW1hdGljIHJlZnJlc2ggcmVxdWVzdHMuIFRoaXMgbWV0aG9kIHJlZnJlc2hlcyB0aGUgbGlzdCBkYXRhIGFuZFxuICogY29tcGxldGVzIHRoZSByZWZyZXNoZXIgYW5pbWF0aW9uIHdoZW4gdGhlIGRhdGEgaXMgbG9hZGVkLlxuICpcbiAqIEBwYXJhbSB7SW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IEN1c3RvbUV2ZW50fSBbZXZlbnRdIC0gVGhlIHJlZnJlc2ggZXZlbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWZyZXNoIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmFzeW5jIGhhbmRsZVJlZnJlc2goZXZlbnQ/OiBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50IHwgQ3VzdG9tRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgdGhpcy5yZWZyZXNoKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfHwgdHJ1ZSk7XG4gIGlmKGV2ZW50IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBBbnkgY2FsbHMgdG8gbG9hZCBkYXRhIGdvIGhlcmVcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTElvblJlZnJlc2hlckVsZW1lbnQpLmNvbXBsZXRlKCk7XG4gICAgfSwgNDAwKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmlsdGVycyBkYXRhIGJhc2VkIG9uIGEgc2VhcmNoIHN0cmluZy5cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyB0aGUgY3VycmVudCBkYXRhIGFycmF5IHRvIGZpbmQgaXRlbXMgdGhhdCBtYXRjaCB0aGUgcHJvdmlkZWRcbiAqIHNlYXJjaCBzdHJpbmcuIFRoaXMgdXNlcyB0aGUgYXJyYXlRdWVyeUJ5U3RyaW5nIHV0aWxpdHkgdG8gcGVyZm9ybSB0aGUgZmlsdGVyaW5nXG4gKiBhY3Jvc3MgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7S2V5VmFsdWVbXX0gcmVzdWx0cyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBzZWFyY2ggdGhyb3VnaFxuICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaCAtIFRoZSBzZWFyY2ggc3RyaW5nIHRvIGZpbHRlciBieVxuICogQHJldHVybnMge0tleVZhbHVlW119IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaWx0ZXJlZCBhcnJheSBvZiBpdGVtc1xuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbiAgcGFyc2VTZWFyY2hSZXN1bHRzKHJlc3VsdHM6IEtleVZhbHVlW10sIHNlYXJjaDogc3RyaW5nKTogS2V5VmFsdWVbXSB7XG4gICAgcmV0dXJuIHJlc3VsdHMuZmlsdGVyKChpdGVtOiBLZXlWYWx1ZSkgPT5cbiAgICAgIE9iamVjdC52YWx1ZXMoaXRlbSkuc29tZSh2YWx1ZSA9PlxuICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygoc2VhcmNoIGFzIHN0cmluZyk/LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgIClcbiAgICApO1xuICB9XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZldGNoZXMgZGF0YSBmcm9tIGEgcmVxdWVzdCBzb3VyY2UuXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgZGF0YSBmcm9tIHRoZSBjb25maWd1cmVkIHNvdXJjZSBmdW5jdGlvbiBvciBVUkwsIHByb2Nlc3NlcyBpdCxcbiAqIGFuZCB1cGRhdGVzIHRoZSBjb21wb25lbnQncyBkYXRhIHN0YXRlLiBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggaW5pdGlhbCBkYXRhIGxvYWRpbmdcbiAqIGFuZCBzdWJzZXF1ZW50IHJlZnJlc2ggb3BlcmF0aW9ucyB3aGVuIHVzaW5nIGFuIGV4dGVybmFsIGRhdGEgc291cmNlIHJhdGhlciB0aGFuIGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIFdoZXRoZXIgdG8gZm9yY2UgYSByZWZyZXNoIGV2ZW4gaWYgZGF0YSBhbHJlYWR5IGV4aXN0c1xuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gVGhlIHN0YXJ0aW5nIGluZGV4IGZvciBwYWdpbmF0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0cmlldmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEtleVZhbHVlW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZmV0Y2hlZCBkYXRhXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuYXN5bmMgZ2V0RnJvbVJlcXVlc3QoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSwgc3RhcnQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8S2V5VmFsdWVbXT4ge1xuICBsZXQgcmVxdWVzdDogS2V5VmFsdWVbXSA9IFtdO1xuICBpZighdGhpcy5kYXRhPy5sZW5ndGggfHwgZm9yY2UgfHwgKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKT8ubGVuZ3RoIHx8ICEhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgIC8vIChzZWxmLmRhdGEgYXMgTGlzdEl0ZW1bXSkgPSBbXTtcbiAgICBpZighKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKT8ubGVuZ3RoICYmICEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgICBpZighdGhpcy5zb3VyY2UgJiYgIXRoaXMuZGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ05vIGRhdGEgYW5kIHNvdXJjZSBwYXNzZWQgdG8gaW5maW5pdGUgbGlzdCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGlmKHRoaXMuc291cmNlIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLnNvdXJjZSgpO1xuXG4gICAgICBpZighQXJyYXkuaXNBcnJheShyZXF1ZXN0KSlcbiAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3Q/LlsncmVzcG9uc2UnXT8uWydkYXRhJ10gfHwgcmVxdWVzdD8uWydyZXN1bHRzJ10gfHwgW107XG4gICAgICB0aGlzLmRhdGEgPSBbLi4uIGF3YWl0IHRoaXMucGFyc2VSZXN1bHQocmVxdWVzdCldO1xuICAgICAgaWYodGhpcy5kYXRhPy5sZW5ndGgpXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUgP1xuICAgICAgICAgICh0aGlzLml0ZW1zIHx8IFtdKS5jb25jYXQoWy4uLnRoaXMuZGF0YS5zbGljZShzdGFydCwgbGltaXQpXSkgOiBbLi4ucmVxdWVzdC5zbGljZShzdGFydCwgbGltaXQpIGFzIEtleVZhbHVlW11dO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLnBhcnNlU2VhcmNoUmVzdWx0cyh0aGlzLmRhdGEgYXMgW10sIHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGE7XG4gICAgfVxuICB9XG5cbiAgaWYodGhpcy5sb2FkTW9yZURhdGEgJiYgdGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLlBBR0lOQVRFRClcbiAgICB0aGlzLmdldE1vcmVEYXRhKHRoaXMuZGF0YT8ubGVuZ3RoIHx8IDApO1xuICByZXR1cm4gdGhpcy5kYXRhIHx8IFtdIGFzIEtleVZhbHVlW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZldGNoZXMgZGF0YSBmcm9tIGEgbW9kZWwgc291cmNlLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgY29uZmlndXJlZCBtb2RlbCB1c2luZyBpdHMgcGFnaW5hdGlvbiBvciBmaW5kIG1ldGhvZHMsXG4gKiBwcm9jZXNzZXMgaXQsIGFuZCB1cGRhdGVzIHRoZSBjb21wb25lbnQncyBkYXRhIHN0YXRlLiBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggaW5pdGlhbFxuICogZGF0YSBsb2FkaW5nIGFuZCBzdWJzZXF1ZW50IHJlZnJlc2ggb3BlcmF0aW9ucyB3aGVuIHVzaW5nIGEgbW9kZWwgYXMgdGhlIGRhdGEgc291cmNlLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBXaGV0aGVyIHRvIGZvcmNlIGEgcmVmcmVzaCBldmVuIGlmIGRhdGEgYWxyZWFkeSBleGlzdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFRoZSBzdGFydGluZyBpbmRleCBmb3IgcGFnaW5hdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHJpZXZlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlWYWx1ZVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZldGNoZWQgZGF0YVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmFzeW5jIGdldEZyb21Nb2RlbChmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxLZXlWYWx1ZVtdPiB7XG4gIGxldCBkYXRhID0gWyAuLi4gdGhpcy5kYXRhIHx8IFtdXTtcbiAgbGV0IHJlcXVlc3Q6IEtleVZhbHVlW10gPSBbXTtcblxuICAvLyBnZXR0aW5nIG1vZGVsIHJlcG9zaXRvcnlcbiAgaWYoIXRoaXMuX3JlcG9zaXRvcnkpXG4gICAgdGhpcy5fcmVwb3NpdG9yeSA9IHRoaXMucmVwb3NpdG9yeTtcbiAgY29uc3QgcmVwbyA9IHRoaXMuX3JlcG9zaXRvcnkgYXMgRGVjYWZSZXBvc2l0b3J5PE1vZGVsPjtcbiAgaWYoIXRoaXMuZGF0YT8ubGVuZ3RoIHx8IGZvcmNlIHx8ICh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCB8fCAhISh0aGlzLnNlYXJjaFZhbHVlIGFzIElGaWx0ZXJRdWVyeSkpIHtcbiAgICB0cnkge1xuICAgICBpZighKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKT8ubGVuZ3RoICYmICEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgICAgICh0aGlzLmRhdGEgYXMgS2V5VmFsdWVbXSkgPSBbXTtcbiAgICAgICAgLy8gY29uc3QgcmF3UXVlcnkgPSB0aGlzLnBhcnNlUXVlcnkoc2VsZi5tb2RlbCBhcyBSZXBvc2l0b3J5PE1vZGVsPiwgc3RhcnQsIGxpbWl0KTtcbiAgICAgICAgLy8gcmVxdWVzdCA9IHRoaXMucGFyc2VSZXN1bHQoYXdhaXQgKHRoaXMubW9kZWwgYXMgYW55KT8ucGFnaW5hdGUoc3RhcnQsIGxpbWl0KSk7XG4gICAgICAgICAgaWYoIXRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRvciA9IGF3YWl0IHJlcG9cbiAgICAgICAgICAgICAgLnNlbGVjdCgpXG4gICAgICAgICAgICAgIC5vcmRlckJ5KFt0aGlzLnBrIGFzIGtleW9mIE1vZGVsLCB0aGlzLnNvcnREaXJlY3Rpb25dKVxuICAgICAgICAgICAgICAucGFnaW5hdGUodGhpcy5saW1pdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLnBhcnNlUmVzdWx0KHRoaXMucGFnaW5hdG9yKTtcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYoIXRoaXMuaW5kZXhlcylcbiAgICAgICAgICB0aGlzLmluZGV4ZXMgPSAoT2JqZWN0LnZhbHVlcyh0aGlzLm1hcHBlcikgfHwgW3RoaXMucGtdKTtcblxuICAgICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLnBhcnNlQ29uZGl0aW9ucyh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyB8IG51bWJlciB8IElGaWx0ZXJRdWVyeSk7XG4gICAgICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLnBhcnNlUmVzdWx0KGF3YWl0IHJlcG8ucXVlcnkoY29uZGl0aW9uLCAodGhpcy5zb3J0QnkgfHwgdGhpcy5waykgYXMga2V5b2YgTW9kZWwsIHRoaXMuc29ydERpcmVjdGlvbikpO1xuICAgICAgICBkYXRhID0gW107XG4gICAgICB9XG4gICAgICBkYXRhID0gdGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFID8gWy4uLiAoZGF0YSkuY29uY2F0KHJlcXVlc3QpXSA6IFsuLi5yZXF1ZXN0XTtcbiAgICB9IGNhdGNoKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IGBVbmFibGUgdG8gZmluZCAke3RoaXMubW9kZWx9IG9uIHJlZ2lzdHJ5LiBSZXR1cm4gZW1wdHkgYXJyYXkgZnJvbSBjb21wb25lbnRgKTtcbiAgICB9XG4gIH1cblxuICBpZihkYXRhPy5sZW5ndGgpIHtcbiAgICBpZih0aGlzLnNlYXJjaFZhbHVlKSB7XG4gICAgICB0aGlzLml0ZW1zID0gWy4uLmRhdGFdO1xuICAgICAgaWYodGhpcy5pdGVtcz8ubGVuZ3RoIDw9IHRoaXMubGltaXQpXG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbXMgPSBbLi4uZGF0YV07XG4gICAgfVxuICB9XG4gIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5QQUdJTkFURUQgJiYgdGhpcy5wYWdpbmF0b3IpXG4gICAgICB0aGlzLmdldE1vcmVEYXRhKHRoaXMucGFnaW5hdG9yLnRvdGFsKTtcbiAgcmV0dXJuIGRhdGEgfHwgW10gYXMgS2V5VmFsdWVbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgc2VhcmNoIHZhbHVlcyBvciBmaWx0ZXIgcXVlcmllcyBpbnRvIGRhdGFiYXNlIGNvbmRpdGlvbnMuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHNlYXJjaCBpbnB1dCBvciBjb21wbGV4IGZpbHRlciBxdWVyaWVzIGludG8gQ29uZGl0aW9uIG9iamVjdHNcbiAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRhdGFiYXNlIHF1ZXJ5aW5nLiBIYW5kbGVzIGJvdGggc2ltcGxlIHN0cmluZy9udW1iZXIgc2VhcmNoZXNcbiAqIGFjcm9zcyBpbmRleGVkIGZpZWxkcyBhbmQgY29tcGxleCBmaWx0ZXIgcXVlcmllcyB3aXRoIG11bHRpcGxlIGNyaXRlcmlhLlxuICpcbiAqIEZvciBzaW1wbGUgc2VhcmNoZXMgKHN0cmluZy9udW1iZXIpOlxuICogLSBDcmVhdGVzIGNvbmRpdGlvbnMgdGhhdCBzZWFyY2ggYWNyb3NzIGFsbCBpbmRleGVkIGZpZWxkc1xuICogLSBVc2VzIGVxdWFsaXR5IGZvciBudW1lcmljIHZhbHVlcyBhbmQgcmVnZXggZm9yIHN0cmluZyB2YWx1ZXNcbiAqIC0gQ29tYmluZXMgY29uZGl0aW9ucyB3aXRoIE9SIGxvZ2ljIHRvIHNlYXJjaCBtdWx0aXBsZSBmaWVsZHNcbiAqXG4gKiBGb3IgY29tcGxleCBmaWx0ZXIgcXVlcmllczpcbiAqIC0gUHJvY2Vzc2VzIGVhY2ggZmlsdGVyIGl0ZW0gd2l0aCBpdHMgc3BlY2lmaWMgY29uZGl0aW9uIHR5cGVcbiAqIC0gU3VwcG9ydHMgRXF1YWwsIE5vdCBFcXVhbCwgQ29udGFpbnMsIE5vdCBDb250YWlucywgR3JlYXRlciBUaGFuLCBMZXNzIFRoYW5cbiAqIC0gVXBkYXRlcyBzb3J0IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIGZpbHRlciBxdWVyeVxuICogLSBDb21iaW5lcyBtdWx0aXBsZSBmaWx0ZXIgY29uZGl0aW9ucyB3aXRoIE9SIGxvZ2ljXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBJRmlsdGVyUXVlcnl9IHZhbHVlIC0gVGhlIHNlYXJjaCB2YWx1ZSBvciBmaWx0ZXIgcXVlcnkgb2JqZWN0XG4gKiBAcmV0dXJucyB7Q29uZGl0aW9uPE1vZGVsPn0gQSBDb25kaXRpb24gb2JqZWN0IGZvciBkYXRhYmFzZSBxdWVyeWluZ1xuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucGFyc2VDb25kaXRpb25zKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBJRmlsdGVyUXVlcnkpOiBDb25kaXRpb248TW9kZWw+IHtcbiAgbGV0IF9jb25kaXRpb246IENvbmRpdGlvbjxNb2RlbD47XG4gIGlmKHR5cGVvZiB2YWx1ZSA9PT0gUHJpbWl0aXZlcy5TVFJJTkcgfHwgdHlwZW9mIHZhbHVlID09PSBQcmltaXRpdmVzLk5VTUJFUikge1xuICAgIF9jb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPih0aGlzLnBrIGFzIGtleW9mIE1vZGVsKS5lcSghaXNOYU4odmFsdWUgYXMgbnVtYmVyKSA/IE51bWJlcih2YWx1ZSkgOiB2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB0aGlzLmluZGV4ZXMpIHtcbiAgICAgICAgaWYoaW5kZXggPT09IHRoaXMucGspXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxldCBvckNvbmRpdGlvbjtcbiAgICAgICAgaWYoIWlzTmFOKHZhbHVlIGFzIG51bWJlcikpIHtcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5lcShOdW1iZXIodmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5yZWdleHAodmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBfY29uZGl0aW9uID0gX2NvbmRpdGlvbi5vcihvckNvbmRpdGlvbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHtxdWVyeSwgc29ydH0gPSB2YWx1ZSBhcyBJRmlsdGVyUXVlcnk7XG4gICAgX2NvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KHRoaXMucGsgYXMga2V5b2YgTW9kZWwpLmRpZignbnVsbCcpO1xuXG4gICAgaWYocXVlcnk/Lmxlbmd0aClcbiAgICAgIF9jb25kaXRpb24gPSB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBDb25kaXRpb248TW9kZWw+O1xuXG4gICAgKHF1ZXJ5IHx8IFtdKS5mb3JFYWNoKChpdGVtOiBJRmlsdGVyUXVlcnlJdGVtKSA9PiB7XG4gICAgICBjb25zdCB7dmFsdWUsIGNvbmRpdGlvbiwgaW5kZXh9ID0gaXRlbTtcbiAgICAgIGxldCB2YWwgPSB2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBpZihpbmRleCA9PT0gdGhpcy5wayB8fCAhaXNOYU4odmFsIGFzIG51bWJlcikpXG4gICAgICAgIHZhbCA9IE51bWJlcih2YWwpO1xuICAgICAgbGV0IG9yQ29uZGl0aW9uO1xuICAgICAgc3dpdGNoIChjb25kaXRpb24pIHtcbiAgICAgICAgY2FzZSBcIkVxdWFsXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZXEodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk5vdCBFcXVhbFwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmRpZih2YWwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTm90IENvbnRhaW5zXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSAhQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLnJlZ2V4cChuZXcgUmVnRXhwKGBeKD8hLioke3ZhbH0pLiokYCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQ29udGFpbnNcIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5yZWdleHAodmFsIGFzIHN0cmluZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJHcmVhdGVyIFRoYW5cIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5ndGUodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkxlc3MgVGhhblwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmx0ZSh2YWwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgX2NvbmRpdGlvbiA9ICghX2NvbmRpdGlvbiA/XG4gICAgICAgIG9yQ29uZGl0aW9uIDogX2NvbmRpdGlvbi5hbmQob3JDb25kaXRpb24gYXMgdW5rbm93biBhcyBDb25kaXRpb248TW9kZWw+KSkgYXMgQ29uZGl0aW9uPE1vZGVsPjtcbiAgICB9KTtcblxuICAgIHRoaXMuc29ydEJ5ID0gc29ydD8udmFsdWUgYXMga2V5b2YgTW9kZWwgfHwgdGhpcy5waztcbiAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSBzb3J0Py5kaXJlY3Rpb24gfHwgdGhpcy5zb3J0RGlyZWN0aW9uO1xuICB9XG4gIGNvbnNvbGUubG9nKF9jb25kaXRpb24pO1xuICByZXR1cm4gX2NvbmRpdGlvbiBhcyBDb25kaXRpb248TW9kZWw+O1xuXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBxdWVyeSByZXN1bHRzIGludG8gYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LlxuICogQHN1bW1hcnkgSGFuZGxlcyBkaWZmZXJlbnQgcmVzdWx0IGZvcm1hdHMgZnJvbSB2YXJpb3VzIGRhdGEgc291cmNlcywgZXh0cmFjdGluZ1xuICogcGFnaW5hdGlvbiBpbmZvcm1hdGlvbiB3aGVuIGF2YWlsYWJsZSBhbmQgYXBwbHlpbmcgYW55IGNvbmZpZ3VyZWQgZGF0YSBtYXBwaW5nLlxuICogVGhpcyBlbnN1cmVzIGNvbnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB0aGUgc291cmNlLlxuICpcbiAqIEBwcm90ZWN0ZWRcbiAqIEBwYXJhbSB7S2V5VmFsdWVbXSB8IFBhZ2luYXRvcn0gcmVzdWx0IC0gVGhlIHJhdyBxdWVyeSByZXN1bHRcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBUaGUgcHJvY2Vzc2VkIGFycmF5IG9mIGl0ZW1zXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucHJvdGVjdGVkIGFzeW5jIHBhcnNlUmVzdWx0KHJlc3VsdDogS2V5VmFsdWVbXSB8IFBhZ2luYXRvcjxNb2RlbD4pOiBQcm9taXNlPEtleVZhbHVlW10+IHtcbiAgaWYoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiAoJ3BhZ2UnIGluIHJlc3VsdCAmJiAndG90YWwnIGluIHJlc3VsdCkpIHtcbiAgICBjb25zdCBwYWdpbmF0b3IgPSByZXN1bHQgYXMgUGFnaW5hdG9yPE1vZGVsPjtcbiAgICByZXN1bHQgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSh0aGlzLnBhZ2UpO1xuICAgIC8vIFRPRE86IENoYWdlIGZvciByZXN1bHQudG90YWw7XG4gICAgdGhpcy5nZXRNb3JlRGF0YShwYWdpbmF0b3IudG90YWwpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZ2V0TW9yZURhdGEoKHJlc3VsdCBhcyBLZXlWYWx1ZVtdKT8ubGVuZ3RoIHx8IDApO1xuICB9XG4gIHJldHVybiAoT2JqZWN0LmtleXModGhpcy5tYXBwZXIgfHwge30pLmxlbmd0aCkgP1xuICAgIHRoaXMubWFwUmVzdWx0cyhyZXN1bHQpIDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHBhZ2luYXRpb24gc3RhdGUgYmFzZWQgb24gZGF0YSBsZW5ndGguXG4gKiBAc3VtbWFyeSBDYWxjdWxhdGVzIHdoZXRoZXIgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSBhbmQgaG93IG1hbnkgcGFnZXMgZXhpc3RcbiAqIGJhc2VkIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgYW5kIHRoZSBjb25maWd1cmVkIGxpbWl0IHBlciBwYWdlLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGNvbnRyb2wgcGFnaW5hdGlvbiBVSSBhbmQgaW5maW5pdGUgc2Nyb2xsaW5nIGJlaGF2aW9yLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBUaGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGF2YWlsYWJsZVxuICogQHJldHVybnMge3ZvaWR9XG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuZ2V0TW9yZURhdGEobGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYodGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFKSB7XG4gICAgaWYodGhpcy5wYWdpbmF0b3IpXG4gICAgICBsZW5ndGggPSBsZW5ndGggKiB0aGlzLmxpbWl0O1xuICAgIGlmKGxlbmd0aCA8PSB0aGlzLmxpbWl0KSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VzID0gTWF0aC5mbG9vcihsZW5ndGggLyB0aGlzLmxpbWl0KTtcbiAgICAgIGlmKCh0aGlzLnBhZ2VzICogdGhpcy5saW1pdCkgPCBsZW5ndGgpXG4gICAgICAgIHRoaXMucGFnZXMgKz0gMTtcbiAgICAgIGlmKHRoaXMucGFnZXMgPT09IDEpXG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMucGFnZXMgPSBsZW5ndGg7XG4gICAgaWYodGhpcy5wYWdlcyA9PT0gMSlcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBhIHNpbmdsZSBpdGVtIHVzaW5nIHRoZSBjb25maWd1cmVkIG1hcHBlci5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgYSBkYXRhIGl0ZW0gYWNjb3JkaW5nIHRvIHRoZSBtYXBwaW5nIGNvbmZpZ3VyYXRpb24sXG4gKiBleHRyYWN0aW5nIG5lc3RlZCBwcm9wZXJ0aWVzIGFuZCBmb3JtYXR0aW5nIHZhbHVlcyBhcyBuZWVkZWQuIFRoaXMgYWxsb3dzXG4gKiB0aGUgY29tcG9uZW50IHRvIGRpc3BsYXkgZGF0YSBpbiBhIGZvcm1hdCBkaWZmZXJlbnQgZnJvbSBob3cgaXQncyBzdG9yZWQuXG4gKlxuICogQHByb3RlY3RlZFxuICogQHBhcmFtIHtLZXlWYWx1ZX0gaXRlbSAtIFRoZSBpdGVtIHRvIG1hcFxuICogQHBhcmFtIHtLZXlWYWx1ZX0gbWFwcGVyIC0gVGhlIG1hcHBpbmcgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtLZXlWYWx1ZX0gW3Byb3BzXSAtIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBpbmNsdWRlXG4gKiBAcmV0dXJucyB7S2V5VmFsdWV9IFRoZSBtYXBwZWQgaXRlbVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbnByb3RlY3RlZCBpdGVtTWFwcGVyKGl0ZW06IEtleVZhbHVlLCBtYXBwZXI6IEtleVZhbHVlLCBwcm9wcz86IEtleVZhbHVlKTogS2V5VmFsdWUge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWFwcGVyKS5yZWR1Y2UoKGFjY3VtOiBLZXlWYWx1ZSwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3QgYXJyYXlWYWx1ZSA9IHZhbHVlLnNwbGl0KCcuJyk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJyYXlWYWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdmFsdWUgPSBpdGVtPy5bdmFsdWVdIHx8IHZhbHVlO1xuICAgICAgICBpZihpc1ZhbGlkRGF0ZSh2YWx1ZSkpXG4gICAgICAgICAgdmFsdWUgPSBgJHtmb3JtYXREYXRlKHZhbHVlKX1gO1xuICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdmFsO1xuXG4gICAgICAgIGZvciAoY29uc3QgX3ZhbHVlIG9mIGFycmF5VmFsdWUpXG4gICAgICAgICAgdmFsID0gIXZhbFxuICAgICAgICAgICAgPyBpdGVtW192YWx1ZV1cbiAgICAgICAgICAgIDogKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZSh2YWwpIDogdmFsKVtfdmFsdWVdO1xuXG5cbiAgICAgICAgaWYgKGlzVmFsaWREYXRlKG5ldyBEYXRlKHZhbCkpKVxuICAgICAgICAgIHZhbCA9IGAke2Zvcm1hdERhdGUodmFsKX1gO1xuXG4gICAgICAgIGFjY3VtW2tleV0gPSB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHByb3BzIHx8IHt9LCBhY2N1bSk7XG4gIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBhbGwgcmVzdWx0IGl0ZW1zIHVzaW5nIHRoZSBjb25maWd1cmVkIG1hcHBlci5cbiAqIEBzdW1tYXJ5IEFwcGxpZXMgdGhlIGl0ZW1NYXBwZXIgdG8gZWFjaCBpdGVtIGluIHRoZSByZXN1bHQgc2V0LCBhZGRpbmdcbiAqIGNvbW1vbiBwcm9wZXJ0aWVzIGxpa2Ugb3BlcmF0aW9ucyBhbmQgcm91dGUgaW5mb3JtYXRpb24uIFRoaXMgdHJhbnNmb3Jtc1xuICogdGhlIHJhdyBkYXRhIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSB0aGUgbGlzdCBpdGVtIGNvbXBvbmVudHMuXG4gKlxuICogQHBhcmFtIHtLZXlWYWx1ZVtdfSBkYXRhIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIG1hcFxuICogQHJldHVybnMge0tleVZhbHVlW119IFRoZSBhcnJheSBvZiBtYXBwZWQgaXRlbXNcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG4gIG1hcFJlc3VsdHMoZGF0YTogS2V5VmFsdWVbXSk6IEtleVZhbHVlW10ge1xuICAgIGlmKCFkYXRhIHx8ICFkYXRhLmxlbmd0aClcbiAgICAgIHJldHVybiBbXTtcbiAgICAvLyBwYXNzaW5nIHVpZCBhcyBwcm9wIHRvIG1hcHBlclxuICAgIHRoaXMubWFwcGVyID0gey4uLiB0aGlzLm1hcHBlciwgLi4uIHt1aWQ6IHRoaXMucGt9fTtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgb3BlcmF0aW9uczogdGhpcy5vcGVyYXRpb25zLFxuICAgICAgcm91dGU6IHRoaXMucm91dGUsXG4gICAgICAuLi4gIE9iamVjdC5rZXlzKHRoaXMuaXRlbSkucmVkdWNlKChhY2M6IEtleVZhbHVlLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IHRoaXMuaXRlbVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pLFxuICAgICAgLy8gLi4uICghdGhpcy5pdGVtLnJlbmRlciA/IHt9IDogIE9iamVjdC5rZXlzKHRoaXMuaXRlbSkucmVkdWNlKChhY2M6IEtleVZhbHVlLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgLy8gICBhY2Nba2V5XSA9IHRoaXMuaXRlbVtrZXkgYXMga2V5b2YgSUxpc3RJdGVtUHJvcF07XG4gICAgICAvLyAgIHJldHVybiBhY2M7XG4gICAgICAvLyB9LCB7fSkpXG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGEucmVkdWNlKChhY2N1bTogS2V5VmFsdWVbXSwgY3VycikgPT4ge1xuICAgICAgICBhY2N1bS5wdXNoKHsuLi4gdGhpcy5pdGVtTWFwcGVyKGN1cnIsIHRoaXMubWFwcGVyIGFzIEtleVZhbHVlLCBwcm9wcyksIC4uLiB7cGs6IHRoaXMucGt9fSk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gIH1cbn1cblxuIiwiXG5AaWYoc2hvd1JlZnJlc2hlcikge1xuICA8aW9uLXJlZnJlc2hlciBzbG90PVwiZml4ZWRcIiBbcHVsbEZhY3Rvcl09XCIxXCIgW3B1bGxNaW5dPVwiMTAwXCIgW3B1bGxNYXhdPVwiMjAwXCIgKGlvblJlZnJlc2gpPVwiaGFuZGxlUmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgPGlvbi1yZWZyZXNoZXItY29udGVudCAvPlxuICA8L2lvbi1yZWZyZXNoZXI+XG59XG5cbkBpZihzaG93U2VhcmNoYmFyKSB7XG4gIEBpZihtb2RlbCAmJiBlbmFibGVGaWx0ZXIpIHtcbiAgICA8bmd4LWRlY2FmLWZpbHRlclxuICAgICAgW21vZGVsXT1cIm1vZGVsXCJcbiAgICAgIFtzb3J0RGlyZWN0aW9uXT1cInNvcnREaXJlY3Rpb25cIlxuICAgICAgW2Rpc2FibGVTb3J0XT1cImRpc2FibGVTb3J0XCJcbiAgICAgIChmaWx0ZXJFdmVudCk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXG4gICAgICAoc2VhcmNoRXZlbnQpPVwiaGFuZGxlU2VhcmNoKCRldmVudClcIlxuICAgIC8+XG4gIH0gQGVsc2Uge1xuICAgIDxuZ3gtZGVjYWYtc2VhcmNoYmFyIFtlbWl0RXZlbnRUb1dpbmRvd109XCJmYWxzZVwiIFtkZWJvdW5jZV09XCI1MDBcIiAoc2VhcmNoRXZlbnQpPVwiaGFuZGxlU2VhcmNoKCRldmVudClcIiAvPlxuICB9XG59XG5cbkBpZihkYXRhPy5sZW5ndGgpIHtcbiAgPGlvbi1saXN0IFtpbnNldF09XCJpbnNldFwiIFtsaW5lc109XCJsaW5lc1wiICNjb21wb25lbnQ+XG4gICAgQGlmKGl0ZW0/LnRhZykge1xuICAgICAgQGZvcihjaGlsZCBvZiBpdGVtczsgdHJhY2sgdHJhY2tJdGVtRm4oJGluZGV4LCBjaGlsZCkpIHtcbiAgICAgICAgPG5neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXJcbiAgICAgICAgICBbdGFnXT1cIml0ZW0udGFnXCJcbiAgICAgICAgICAobGlzdGVuRXZlbnQpPVwiaGFuZGxlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgW2dsb2JhbHNdPSd7XG4gICAgICAgICAgICBpdGVtOiBjaGlsZCxcbiAgICAgICAgICAgIG1hcHBlcjogbWFwcGVyLFxuICAgICAgICAgICAgcm91dGU6IHJvdXRlXG4gICAgICAgICAgfSc+XG4gICAgICAgICAgPC9uZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyPlxuICAgICAgICB9XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgfVxuICA8L2lvbi1saXN0PlxuXG4gIEBpZihsb2FkTW9yZURhdGEpIHtcbiAgICBAaWYocGFnZXMgPiAwICYmIHR5cGUgPT09ICdwYWdpbmF0ZWQnICYmICFzZWFyY2hWYWx1ZT8ubGVuZ3RoKSB7XG4gICAgICA8bmd4LWRlY2FmLXBhZ2luYXRpb25cbiAgICAgICAgW3RvdGFsUGFnZXNdPVwicGFnZXNcIlxuICAgICAgICBbY3VycmVudF09XCJwYWdlXCJcbiAgICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlUGFnaW5hdGUoJGV2ZW50KVwiXG4gICAgICAvPlxuXG4gICAgfSBAZWxzZSB7XG4gICAgICA8aW9uLWluZmluaXRlLXNjcm9sbFxuICAgICAgICBbY2xhc3NdPVwic2VhcmNoVmFsdWU/Lmxlbmd0aCA/ICdkY2YtaGlkZGVuJyA6ICcnXCJcbiAgICAgICAgW3Bvc2l0aW9uXT1cInNjcm9sbFBvc2l0aW9uXCJcbiAgICAgICAgW3RocmVzaG9sZF09XCJzY3JvbGxUaHJlc2hvbGRcIlxuICAgICAgICAoaW9uSW5maW5pdGUpPVwiaGFuZGxlUmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgICAgIDxpb24taW5maW5pdGUtc2Nyb2xsLWNvbnRlbnQgW2xvYWRpbmdTcGlubmVyXT1cImxvYWRpbmdTcGlubmVyXCIgW2xvYWRpbmdUZXh0XT1cImxvYWRpbmdUZXh0XCIgLz5cbiAgICAgIDwvaW9uLWluZmluaXRlLXNjcm9sbD5cbiAgICB9XG4gIH1cbn0gQGVsc2Uge1xuICBAaWYocmVmcmVzaGluZykge1xuICAgIDxpb24taXRlbSAqbmdGb3I9XCJsZXQgc2tsIG9mIHNrZWxldG9uRGF0YVwiPlxuICAgICAgPGlvbi10aHVtYm5haWwgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICA8L2lvbi10aHVtYm5haWw+XG4gICAgICA8aW9uLWxhYmVsPlxuICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJkYXRlXCIgc3R5bGU9XCJ3aWR0aDogMjAlO1wiPjxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+PC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWxhYmVsPlxuICAgIDwvaW9uLWl0ZW0+XG4gIH0gQGVsc2Uge1xuICAgIEBpZighc2VhcmNoVmFsdWU/Lmxlbmd0aCkge1xuICAgICAgPG5neC1kZWNhZi1lbXB0eS1zdGF0ZVxuICAgICAgICBbdGl0bGVdPVwiKGxvY2FsZSArICcuJysgZW1wdHkudGl0bGUpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cIihsb2NhbGUgKyAnLicrIGVtcHR5LnN1YnRpdGxlKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtidXR0b25UZXh0XT1cImVtcHR5LnNob3dCdXR0b24gPyAobG9jYWxlICsgJy4nKyBlbXB0eS5idXR0b24gfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbYnV0dG9uTGlua109XCJlbXB0eS5zaG93QnV0dG9uID8gZW1wdHkucm91dGUgOiAnJ1wiXG4gICAgICAvPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5neC1kZWNhZi1lbXB0eS1zdGF0ZVxuICAgICAgICBpY29uPVwic2VhcmNoLW91dGxpbmVcIlxuICAgICAgICBuZ0NsYXNzPVwiZW1wdHktc2VhcmNoXCJcbiAgICAgICAgW3RyYW5zbGF0YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgdGl0bGU9XCJzZWFyY2gudGl0bGVcIlxuICAgICAgICBzdWJ0aXRsZT1cInNlYXJjaC5zdWJ0aXRsZVwiXG4gICAgICAgIFtzZWFyY2hWYWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAvPlxuICAgIH1cbiAgfVxufVxuXG4iXX0=
1324
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListComponent, [{
1325
+ type: Component,
1326
+ args: [{ selector: 'ngx-decaf-list', standalone: true, imports: [
1327
+ ForAngularModule,
1328
+ IonRefresher,
1329
+ IonLoading,
1330
+ PaginationComponent,
1331
+ IonList,
1332
+ IonItem,
1333
+ IonThumbnail,
1334
+ IonSkeletonText,
1335
+ IonLabel,
1336
+ IonText,
1337
+ IonRefresherContent,
1338
+ IonInfiniteScroll,
1339
+ IonInfiniteScrollContent,
1340
+ IonThumbnail,
1341
+ IonSkeletonText,
1342
+ SearchbarComponent,
1343
+ EmptyStateComponent,
1344
+ ListItemComponent,
1345
+ FilterComponent,
1346
+ ComponentRendererComponent
1347
+ ], template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n <ion-item *ngFor=\"let skl of skeletonData\">\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll-content ion-spinner{--color: var(--ion-color-primary)}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"] }]
1348
+ }], () => [], { type: [{
1349
+ type: Input
1350
+ }], translatable: [{
1351
+ type: Input
1352
+ }], showSearchbar: [{
1353
+ type: Input
1354
+ }], data: [{
1355
+ type: Input
1356
+ }], source: [{
1357
+ type: Input
1358
+ }], start: [{
1359
+ type: Input
1360
+ }], limit: [{
1361
+ type: Input
1362
+ }], loadMoreData: [{
1363
+ type: Input
1364
+ }], lines: [{
1365
+ type: Input
1366
+ }], inset: [{
1367
+ type: Input
1368
+ }], scrollThreshold: [{
1369
+ type: Input
1370
+ }], scrollPosition: [{
1371
+ type: Input
1372
+ }], loadingText: [{
1373
+ type: Input
1374
+ }], showRefresher: [{
1375
+ type: Input
1376
+ }], loadingSpinner: [{
1377
+ type: Input
1378
+ }], enableFilter: [{
1379
+ type: Input
1380
+ }], sortDirection: [{
1381
+ type: Input
1382
+ }], sortBy: [{
1383
+ type: Input
1384
+ }], disableSort: [{
1385
+ type: Input
1386
+ }], emptyIcon: [{
1387
+ type: Input
1388
+ }], empty: [{
1389
+ type: Input
1390
+ }], refreshEvent: [{
1391
+ type: Output
1392
+ }], clickEvent: [{
1393
+ type: Output
1394
+ }], handleClick: [{
1395
+ type: HostListener,
1396
+ args: ['window:ListItemClickEvent', ['$event']]
1397
+ }], handleSearch: [{
1398
+ type: HostListener,
1399
+ args: ['window:searchbarEvent', ['$event']]
1400
+ }], refresh: [{
1401
+ type: HostListener,
1402
+ args: ['window:BackButtonNavigationEndEvent', ['$event']]
1403
+ }] }); })();
1404
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListComponent, { className: "ListComponent", filePath: "components/list/list.component.ts", lineNumber: 146 }); })();
1405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9saXN0L2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLE9BQU8sRUFDUCxZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBWSxjQUFjLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBRUwsT0FBTyxFQUNQLGNBQWMsRUFDZCxrQkFBa0IsRUFLbkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxD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O2tCQURKLEtBQUs7WUFhTixLQUFLO2tCQURKLEtBQUs7WUFjTixlQUFlO2tCQURkLEtBQUs7WUFhTixjQUFjO2tCQURiLEtBQUs7WUFZTixXQUFXO2tCQURWLEtBQUs7WUFhTixhQUFhO2tCQURaLEtBQUs7WUFhTixjQUFjO2tCQURiLEtBQUs7WUF5Qk4sWUFBWTtrQkFEWCxLQUFLO1lBWU4sYUFBYTtrQkFEWixLQUFLO1lBYU4sTUFBTTtrQkFETCxLQUFLO1lBZU4sV0FBVztrQkFEVixLQUFLO1lBY04sU0FBUztrQkFEUixLQUFLO1lBb0JOLEtBQUs7a0JBREosS0FBSztZQThHTixZQUFZO2tCQURYLE1BQU07WUFZUCxVQUFVO2tCQURULE1BQU07WUFpUlAsV0FBVztrQkFEVixZQUFZO21CQUFDLDJCQUEyQixFQUFFLENBQUMsUUFBUSxDQUFDO1lBOEIvQyxZQUFZO2tCQURqQixZQUFZO21CQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDO1lBc0kzQyxPQUFPO2tCQURaLFlBQVk7bUJBQUMscUNBQXFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7O2tGQWwwQnBELGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBIb3N0TGlzdGVuZXIsIE9uRGVzdHJveSAgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQsIFJlZnJlc2hlckN1c3RvbUV2ZW50LCBTcGlubmVyVHlwZXMgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge1xuICBJb25JbmZpbml0ZVNjcm9sbCxcbiAgSW9uSW5maW5pdGVTY3JvbGxDb250ZW50LFxuICBJb25JdGVtLFxuICBJb25MYWJlbCxcbiAgSW9uTGlzdCxcbiAgSW9uUmVmcmVzaGVyLFxuICBJb25SZWZyZXNoZXJDb250ZW50LFxuICBJb25Ta2VsZXRvblRleHQsXG4gIElvblRleHQsXG4gIElvblRodW1ibmFpbCxcbiAgSW9uTG9hZGluZ1xufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IE1vZGVsLCBQcmltaXRpdmVzIH0gZnJvbSAnQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uJztcbmltcG9ydCB7IENvbmRpdGlvbiwgT2JzZXJ2ZXIsIE9yZGVyRGlyZWN0aW9uLCBQYWdpbmF0b3IgfSBmcm9tICdAZGVjYWYtdHMvY29yZSc7XG5pbXBvcnQge1xuICBCYXNlQ3VzdG9tRXZlbnQsXG4gIER5bmFtaWMsXG4gIEV2ZW50Q29uc3RhbnRzLFxuICBDb21wb25lbnRzVGFnTmFtZXMsXG4gIFJlbmRlcmVyQ3VzdG9tRXZlbnQsXG4gIFN0cmluZ09yQm9vbGVhbixcbiAgS2V5VmFsdWUsXG4gIExpc3RJdGVtQ3VzdG9tRXZlbnRcbn0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUgfSBmcm9tICcuLi8uLi9mb3ItYW5ndWxhci5tb2R1bGUnO1xuaW1wb3J0IHsgTmd4QmFzZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VuZ2luZS9OZ3hCYXNlQ29tcG9uZW50JztcbmltcG9ydCB7XG4gIHN0cmluZ1RvQm9vbGVhbixcbiAgZm9ybWF0RGF0ZSxcbiAgaXNWYWxpZERhdGVcbn0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBTZWFyY2hiYXJDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2hiYXIvc2VhcmNoYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGlzdC1pdGVtL2xpc3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi9wYWdpbmF0aW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJTGlzdEVtcHR5UmVzdWx0LCBMaXN0Q29tcG9uZW50c1R5cGVzLCBEZWNhZlJlcG9zaXRvcnkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGdW5jdGlvbkxpa2UsIElGaWx0ZXJRdWVyeSwgSUZpbHRlclF1ZXJ5SXRlbSB9IGZyb20gJy4uLy4uL2VuZ2luZS90eXBlcyc7XG5pbXBvcnQgeyBGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgdmVyc2F0aWxlIGxpc3QgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgdmFyaW91cyBkYXRhIGRpc3BsYXkgbW9kZXMuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZsZXhpYmxlIHdheSB0byBkaXNwbGF5IGxpc3RzIG9mIGRhdGEgd2l0aCBzdXBwb3J0XG4gKiBmb3IgaW5maW5pdGUgc2Nyb2xsaW5nLCBwYWdpbmF0aW9uLCBzZWFyY2hpbmcsIGFuZCBjdXN0b20gaXRlbSByZW5kZXJpbmcuIEl0IGNhbiBmZXRjaFxuICogZGF0YSBmcm9tIHZhcmlvdXMgc291cmNlcyBpbmNsdWRpbmcgbW9kZWxzLCBmdW5jdGlvbnMsIG9yIGRpcmVjdCBkYXRhIGlucHV0LlxuICpcbiAqIFRoZSBjb21wb25lbnQgc3VwcG9ydHMgdHdvIG1haW4gZGlzcGxheSB0eXBlczpcbiAqIDEuIEluZmluaXRlIHNjcm9sbGluZyAtIExvYWRzIG1vcmUgZGF0YSBhcyB0aGUgdXNlciBzY3JvbGxzXG4gKiAyLiBQYWdpbmF0aW9uIC0gRGlzcGxheXMgZGF0YSBpbiBwYWdlcyB3aXRoIG5hdmlnYXRpb24gY29udHJvbHNcbiAqXG4gKiBBZGRpdGlvbmFsIGZlYXR1cmVzIGluY2x1ZGU6XG4gKiAtIFB1bGwtdG8tcmVmcmVzaCBmdW5jdGlvbmFsaXR5XG4gKiAtIFNlYXJjaCBmaWx0ZXJpbmdcbiAqIC0gRW1wdHkgc3RhdGUgY3VzdG9taXphdGlvblxuICogLSBDdXN0b20gaXRlbSByZW5kZXJpbmdcbiAqIC0gRXZlbnQgZW1pc3Npb24gZm9yIGludGVyYWN0aW9uc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gKiAgIHBhcnRpY2lwYW50IEwgYXMgTGlzdENvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBEIGFzIERhdGEgU291cmNlXG4gKiAgIHBhcnRpY2lwYW50IEUgYXMgRXh0ZXJuYWwgQ29tcG9uZW50c1xuICpcbiAqICAgVS0+Pkw6IEluaXRpYWxpemUgY29tcG9uZW50XG4gKiAgIEwtPj5MOiBuZ09uSW5pdCgpXG4gKiAgIEwtPj5EOiBSZXF1ZXN0IGluaXRpYWwgZGF0YVxuICogICBELS0+Pkw6IFJldHVybiBkYXRhXG4gKiAgIEwtPj5MOiBQcm9jZXNzIGFuZCBkaXNwbGF5IGRhdGFcbiAqXG4gKiAgIGFsdCBVc2VyIHNjcm9sbHMgKEluZmluaXRlIG1vZGUpXG4gKiAgICAgVS0+Pkw6IFNjcm9sbCB0byBib3R0b21cbiAqICAgICBMLT4+RDogUmVxdWVzdCBtb3JlIGRhdGFcbiAqICAgICBELS0+Pkw6IFJldHVybiBhZGRpdGlvbmFsIGRhdGFcbiAqICAgICBMLT4+TDogQXBwZW5kIHRvIGV4aXN0aW5nIGRhdGFcbiAqICAgZWxzZSBVc2VyIGNoYW5nZXMgcGFnZSAoUGFnaW5hdGVkIG1vZGUpXG4gKiAgICAgVS0+Pkw6IENsaWNrIHBhZ2UgbnVtYmVyXG4gKiAgICAgTC0+Pkw6IGhhbmRsZVBhZ2luYXRlKClcbiAqICAgICBMLT4+RDogUmVxdWVzdCBkYXRhIGZvciBwYWdlXG4gKiAgICAgRC0tPj5MOiBSZXR1cm4gcGFnZSBkYXRhXG4gKiAgICAgTC0+Pkw6IFJlcGxhY2UgZGlzcGxheWVkIGRhdGFcbiAqICAgZW5kXG4gKlxuICogICBhbHQgVXNlciBzZWFyY2hlc1xuICogICAgIFUtPj5MOiBFbnRlciBzZWFyY2ggdGVybVxuICogICAgIEwtPj5MOiBoYW5kbGVTZWFyY2goKVxuICogICAgIEwtPj5EOiBGaWx0ZXIgZGF0YSBieSBzZWFyY2ggdGVybVxuICogICAgIEQtLT4+TDogUmV0dXJuIGZpbHRlcmVkIGRhdGFcbiAqICAgICBMLT4+TDogVXBkYXRlIGRpc3BsYXllZCBkYXRhXG4gKiAgIGVuZFxuICpcbiAqICAgYWx0IFVzZXIgY2xpY2tzIGl0ZW1cbiAqICAgICBVLT4+TDogQ2xpY2sgbGlzdCBpdGVtXG4gKiAgICAgTC0+Pkw6IGhhbmRsZUNsaWNrKClcbiAqICAgICBMLT4+RTogRW1pdCBjbGlja0V2ZW50XG4gKiAgIGVuZFxuICpcbiAqIEBleGFtcGxlXG4gKiA8bmd4LWRlY2FmLWxpc3RcbiAqICAgW3NvdXJjZV09XCJkYXRhU291cmNlXCJcbiAqICAgW2xpbWl0XT1cIjEwXCJcbiAqICAgW3R5cGVdPVwiJ2luZmluaXRlJ1wiXG4gKiAgIFtzaG93U2VhcmNoYmFyXT1cInRydWVcIlxuICogICAoY2xpY2tFdmVudCk9XCJoYW5kbGVJdGVtQ2xpY2soJGV2ZW50KVwiXG4gKiAgIChyZWZyZXNoRXZlbnQpPVwiaGFuZGxlUmVmcmVzaCgkZXZlbnQpXCI+XG4gKiA8L25neC1kZWNhZi1saXN0PlxuICpcbiAqIEBleHRlbmRzIHtOZ3hCYXNlQ29tcG9uZW50fVxuICogQGltcGxlbWVudHMge09uSW5pdH1cbiAqL1xuQER5bmFtaWMoKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvckFuZ3VsYXJNb2R1bGUsXG4gICAgSW9uUmVmcmVzaGVyLFxuICAgIElvbkxvYWRpbmcsXG4gICAgUGFnaW5hdGlvbkNvbXBvbmVudCxcbiAgICBJb25MaXN0LFxuICAgIElvbkl0ZW0sXG4gICAgSW9uVGh1bWJuYWlsLFxuICAgIElvblNrZWxldG9uVGV4dCxcbiAgICBJb25MYWJlbCxcbiAgICBJb25UZXh0LFxuICAgIElvblJlZnJlc2hlckNvbnRlbnQsXG4gICAgSW9uSW5maW5pdGVTY3JvbGwsXG4gICAgSW9uSW5maW5pdGVTY3JvbGxDb250ZW50LFxuICAgIElvblRodW1ibmFpbCxcbiAgICBJb25Ta2VsZXRvblRleHQsXG4gICAgU2VhcmNoYmFyQ29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgTGlzdEl0ZW1Db21wb25lbnQsXG4gICAgRmlsdGVyQ29tcG9uZW50LFxuICAgIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlzdENvbXBvbmVudCBleHRlbmRzIE5neEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGlzcGxheSBtb2RlIGZvciB0aGUgbGlzdCBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaG93IHRoZSBsaXN0IGRhdGEgaXMgbG9hZGVkIGFuZCBkaXNwbGF5ZWQuIE9wdGlvbnMgaW5jbHVkZTpcbiAgICogLSBJTkZJTklURTogTG9hZHMgbW9yZSBkYXRhIGFzIHRoZSB1c2VyIHNjcm9sbHMgKGluZmluaXRlIHNjcm9sbGluZylcbiAgICogLSBQQUdJTkFURUQ6IERpc3BsYXlzIGRhdGEgaW4gcGFnZXMgd2l0aCBuYXZpZ2F0aW9uIGNvbnRyb2xzXG4gICAqXG4gICAqIEB0eXBlIHtMaXN0Q29tcG9uZW50c1R5cGVzfVxuICAgKiBAZGVmYXVsdCBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0eXBlOiBMaXN0Q29tcG9uZW50c1R5cGVzID0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCB1c2VzIHRyYW5zbGF0aW9uIHNlcnZpY2VzLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCB0aGUgY29tcG9uZW50IHdpbGwgYXR0ZW1wdCB0byB1c2UgdHJhbnNsYXRpb24gc2VydmljZXNcbiAgICogZm9yIGFueSB0ZXh0IGNvbnRlbnQuIFRoaXMgYWxsb3dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiBvZiB0aGUgbGlzdCBjb21wb25lbnQuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHRyYW5zbGF0YWJsZTogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzZWFyY2ggYmFyLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCBkaXNwbGF5cyBhIHNlYXJjaCBiYXIgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdCB0aGF0IGFsbG93c1xuICAgKiB1c2VycyB0byBmaWx0ZXIgdGhlIGxpc3QgaXRlbXMuIFRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSB3b3JrcyBieSBmaWx0ZXJpbmcgdGhlXG4gICAqIGV4aXN0aW5nIGRhdGEgb3IgYnkgdHJpZ2dlcmluZyBhIG5ldyBkYXRhIGZldGNoIHdpdGggc2VhcmNoIHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNob3dTZWFyY2hiYXI6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEaXJlY3QgZGF0YSBpbnB1dCBmb3IgdGhlIGxpc3QgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHdheSB0byBkaXJlY3RseSBwYXNzIGRhdGEgdG8gdGhlIGxpc3QgY29tcG9uZW50IGluc3RlYWQgb2ZcbiAgICogZmV0Y2hpbmcgaXQgZnJvbSBhIHNvdXJjZS4gV2hlbiBib3RoIGRhdGEgYW5kIHNvdXJjZSBhcmUgcHJvdmlkZWQsIHRoZSBjb21wb25lbnRcbiAgICogd2lsbCB1c2UgdGhlIHNvdXJjZSB0byBmZXRjaCBkYXRhIG9ubHkgaWYgdGhlIGRhdGEgYXJyYXkgaXMgZW1wdHkuXG4gICAqXG4gICAqIEB0eXBlIHtLZXlWYWx1ZVtdIHwgdW5kZWZpbmVkfVxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGRhdGE/OiBLZXlWYWx1ZVtdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGRhdGEgc291cmNlIGZvciB0aGUgbGlzdCBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGVyZSB0aGUgbGlzdCBzaG91bGQgZmV0Y2ggaXRzIGRhdGEgZnJvbS4gVGhpcyBjYW4gYmUgZWl0aGVyOlxuICAgKiAtIEEgc3RyaW5nIFVSTCBvciBlbmRwb2ludCBpZGVudGlmaWVyXG4gICAqIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgZGF0YSB3aGVuIGNhbGxlZFxuICAgKiBUaGUgY29tcG9uZW50IHdpbGwgY2FsbCB0aGlzIHNvdXJjZSB3aGVuIGl0IG5lZWRzIHRvIGxvYWQgb3IgcmVmcmVzaCBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgRnVuY3Rpb25MaWtlfVxuICAgKiBAcmVxdWlyZWRcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNvdXJjZSE6IHN0cmluZyB8IEZ1bmN0aW9uTGlrZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdGFydGluZyBpbmRleCBmb3IgZGF0YSBmZXRjaGluZy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBpbmRleCBmcm9tIHdoaWNoIHRvIHN0YXJ0IGZldGNoaW5nIGRhdGEuIFRoaXMgaXMgdXNlZFxuICAgKiBmb3IgcGFnaW5hdGlvbiBhbmQgaW5maW5pdGUgc2Nyb2xsaW5nIHRvIGRldGVybWluZSB3aGljaCBzdWJzZXQgb2YgZGF0YSB0byBsb2FkLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAwXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzdGFydDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBudW1iZXIgb2YgaXRlbXMgdG8gZmV0Y2ggcGVyIHBhZ2Ugb3IgbG9hZCBvcGVyYXRpb24uXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaG93IG1hbnkgaXRlbXMgYXJlIGxvYWRlZCBhdCBvbmNlIGR1cmluZyBwYWdpbmF0aW9uIG9yXG4gICAqIGluZmluaXRlIHNjcm9sbGluZy4gVGhpcyBhZmZlY3RzIHRoZSBzaXplIG9mIGRhdGEgY2h1bmtzIHJlcXVlc3RlZCBmcm9tIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDEwXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsaW1pdDogbnVtYmVyID0gMTA7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIG1vcmUgZGF0YSBjYW4gYmUgbG9hZGVkLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCB0aGUgY29tcG9uZW50IHdpbGwgYWxsb3cgbG9hZGluZyBhZGRpdGlvbmFsIGRhdGFcbiAgICogdGhyb3VnaCBpbmZpbml0ZSBzY3JvbGxpbmcgb3IgcGFnaW5hdGlvbi4gV2hlbiBmYWxzZSwgdGhlIGNvbXBvbmVudCB3aWxsIG5vdFxuICAgKiBhdHRlbXB0IHRvIGxvYWQgbW9yZSBkYXRhIGJleW9uZCB3aGF0IGlzIGluaXRpYWxseSBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvYWRNb3JlRGF0YTogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0eWxlIG9mIGRpdmlkaW5nIGxpbmVzIGJldHdlZW4gbGlzdCBpdGVtcy5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBob3cgZGl2aWRpbmcgbGluZXMgYXBwZWFyIGJldHdlZW4gbGlzdCBpdGVtcy4gT3B0aW9ucyBpbmNsdWRlOlxuICAgKiAtIFwiaW5zZXRcIjogTGluZXMgYXJlIGluc2V0IGZyb20gdGhlIGVkZ2VzXG4gICAqIC0gXCJmdWxsXCI6IExpbmVzIGV4dGVuZCB0aGUgZnVsbCB3aWR0aFxuICAgKiAtIFwibm9uZVwiOiBObyBkaXZpZGluZyBsaW5lc1xuICAgKlxuICAgKiBAdHlwZSB7XCJpbnNldFwiIHwgXCJmdWxsXCIgfCBcIm5vbmVcIn1cbiAgICogQGRlZmF1bHQgXCJmdWxsXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxpbmVzOiBcImluc2V0XCIgfCBcImZ1bGxcIiB8IFwibm9uZVwiID0gXCJmdWxsXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSBsaXN0IGhhcyBpbnNldCBzdHlsaW5nLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCB0aGUgbGlzdCB3aWxsIGhhdmUgaW5zZXQgc3R5bGluZyB3aXRoIHJvdW5kZWQgY29ybmVyc1xuICAgKiBhbmQgbWFyZ2luIGFyb3VuZCB0aGUgZWRnZXMuIFRoaXMgY3JlYXRlcyBhIGNhcmQtbGlrZSBhcHBlYXJhbmNlIGZvciB0aGUgbGlzdC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGluc2V0OiBTdHJpbmdPckJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0aHJlc2hvbGQgZm9yIHRyaWdnZXJpbmcgaW5maW5pdGUgc2Nyb2xsIGxvYWRpbmcuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgY2xvc2UgdG8gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdCB0aGUgdXNlciBtdXN0IHNjcm9sbFxuICAgKiBiZWZvcmUgdGhlIGNvbXBvbmVudCB0cmlnZ2VycyBsb2FkaW5nIG9mIGFkZGl0aW9uYWwgZGF0YS4gVGhpcyBpcyBleHByZXNzZWRcbiAgICogYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBsaXN0IGhlaWdodC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgXCIxNSVcIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2Nyb2xsVGhyZXNob2xkOiBzdHJpbmcgPSBcIjE1JVwiO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHBvc2l0aW9uIHdoZXJlIG5ldyBpdGVtcyBhcmUgYWRkZWQgZHVyaW5nIGluZmluaXRlIHNjcm9sbGluZy5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB3aGV0aGVyIG5ldyBpdGVtcyBhcmUgYWRkZWQgdG8gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGxpc3RcbiAgICogd2hlbiBsb2FkaW5nIG1vcmUgZGF0YSB0aHJvdWdoIGluZmluaXRlIHNjcm9sbGluZy5cbiAgICpcbiAgICogQHR5cGUge1wiYm90dG9tXCIgfCBcInRvcFwifVxuICAgKiBAZGVmYXVsdCBcImJvdHRvbVwiXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzY3JvbGxQb3NpdGlvbjogXCJib3R0b21cIiB8IFwidG9wXCIgPSBcImJvdHRvbVwiO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VzdG9tIHRleHQgdG8gZGlzcGxheSBkdXJpbmcgbG9hZGluZyBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHRleHQgc2hvd24gaW4gdGhlIGxvYWRpbmcgaW5kaWNhdG9yIHdoZW4gdGhlIGNvbXBvbmVudFxuICAgKiBpcyBmZXRjaGluZyBkYXRhLiBJZiBub3QgcHJvdmlkZWQsIGEgZGVmYXVsdCBsb2FkaW5nIG1lc3NhZ2Ugd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9hZGluZ1RleHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgcHVsbC10by1yZWZyZXNoIGZlYXR1cmUuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIGVuYWJsZXMgdGhlIHB1bGwtdG8tcmVmcmVzaCBmdW5jdGlvbmFsaXR5IHRoYXQgYWxsb3dzXG4gICAqIHVzZXJzIHRvIHJlZnJlc2ggdGhlIGxpc3QgZGF0YSBieSBwdWxsaW5nIGRvd24gZnJvbSB0aGUgdG9wIG9mIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzaG93UmVmcmVzaGVyOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHR5cGUgb2Ygc3Bpbm5lciB0byBkaXNwbGF5IGR1cmluZyBsb2FkaW5nIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgdmlzdWFsIHN0eWxlIG9mIHRoZSBsb2FkaW5nIHNwaW5uZXIgc2hvd24gZHVyaW5nIGRhdGFcbiAgICogZmV0Y2hpbmcgb3BlcmF0aW9ucy4gVXNlcyBJb25pYydzIHByZWRlZmluZWQgc3Bpbm5lciB0eXBlcy5cbiAgICpcbiAgICogQHR5cGUge1NwaW5uZXJUeXBlc31cbiAgICogQGRlZmF1bHQgXCJjaXJjdWxhclwiXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsb2FkaW5nU3Bpbm5lcjogU3Bpbm5lclR5cGVzID0gXCJjaXJjdWxhclwiO1xuXG4gIC8vIC8qKlxuICAvLyAgKiBAZGVzY3JpcHRpb24gUXVlcnkgcGFyYW1ldGVycyBmb3IgZGF0YSBmZXRjaGluZy5cbiAgLy8gICogQHN1bW1hcnkgU3BlY2lmaWVzIGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBmZXRjaGluZyBkYXRhIGZyb21cbiAgLy8gICogdGhlIHNvdXJjZS4gVGhpcyBjYW4gYmUgcHJvdmlkZWQgYXMgYSBzdHJpbmcgKEpTT04pIG9yIGEgZGlyZWN0IG9iamVjdC5cbiAgLy8gICpcbiAgLy8gICogQHR5cGUge3N0cmluZyB8IEtleVZhbHVlIHwgdW5kZWZpbmVkfVxuICAvLyAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAvLyAgKi9cbiAgLy8gQElucHV0KClcbiAgLy8gcXVlcnk/OiBzdHJpbmcgfCBLZXlWYWx1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGZpbHRlcmluZyBmdW5jdGlvbmFsaXR5IGlzIGVuYWJsZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIGVuYWJsZXMgdGhlIGZpbHRlciBjb21wb25lbnQgdGhhdCBhbGxvd3MgdXNlcnMgdG8gY3JlYXRlXG4gICAqIGNvbXBsZXggc2VhcmNoIGNyaXRlcmlhIHdpdGggbXVsdGlwbGUgZmllbGQgZmlsdGVycywgY29uZGl0aW9ucywgYW5kIHZhbHVlcy5cbiAgICogV2hlbiBmYWxzZSwgZGlzYWJsZXMgdGhlIGZpbHRlciBpbnRlcmZhY2UgZW50aXJlbHkuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGVuYWJsZUZpbHRlcjogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNvcnRpbmcgcGFyYW1ldGVycyBmb3IgZGF0YSBmZXRjaGluZy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyB0aGUgZmV0Y2hlZCBkYXRhIHNob3VsZCBiZSBzb3J0ZWQuIFRoaXMgY2FuIGJlIHByb3ZpZGVkXG4gICAqIGFzIGEgc3RyaW5nIChmaWVsZCBuYW1lIHdpdGggb3B0aW9uYWwgZGlyZWN0aW9uKSBvciBhIGRpcmVjdCBvYmplY3QuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBLZXlWYWx1ZSB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNvcnREaXJlY3Rpb246IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uRFNDO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTb3J0aW5nIHBhcmFtZXRlcnMgZm9yIGRhdGEgZmV0Y2hpbmcuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgdGhlIGZldGNoZWQgZGF0YSBzaG91bGQgYmUgc29ydGVkLiBUaGlzIGNhbiBiZSBwcm92aWRlZFxuICAgKiBhcyBhIHN0cmluZyAoZmllbGQgbmFtZSB3aXRoIG9wdGlvbmFsIGRpcmVjdGlvbikgb3IgYSBkaXJlY3Qgb2JqZWN0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgS2V5VmFsdWUgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzb3J0QnkhOiBzdHJpbmc7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgc29ydGluZyBmdW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCBkaXNhYmxlcyB0aGUgc29ydCBjb250cm9scyBhbmQgcHJldmVudHMgdXNlcnMgZnJvbVxuICAgKiBjaGFuZ2luZyB0aGUgc29ydCBvcmRlciBvciBmaWVsZC4gVGhlIGxpc3Qgd2lsbCBtYWludGFpbiBpdHMgZGVmYXVsdCBvclxuICAgKiBwcm9ncmFtbWF0aWNhbGx5IHNldCBzb3J0IGNvbmZpZ3VyYXRpb24gd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZGlzYWJsZVNvcnQ6IFN0cmluZ09yQm9vbGVhbiA9IGZhbHNlO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJY29uIHRvIGRpc3BsYXkgd2hlbiB0aGUgbGlzdCBpcyBlbXB0eS5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBpY29uIHNob3duIGluIHRoZSBlbXB0eSBzdGF0ZSB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgKiBUaGlzIGNhbiBiZSBhbnkgaWNvbiBuYW1lIHN1cHBvcnRlZCBieSB0aGUgYXBwbGljYXRpb24ncyBpY29uIHN5c3RlbS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQGRlZmF1bHQgJ3RpLWRhdGFiYXNlLWV4Y2xhbWF0aW9uJ1xuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZW1wdHlJY29uPzogc3RyaW5nID0gJ3RpLWRhdGFiYXNlLWV4Y2xhbWF0aW9uJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBlbXB0eSBzdGF0ZSBkaXNwbGF5LlxuICAgKiBAc3VtbWFyeSBDdXN0b21pemVzIGhvdyB0aGUgZW1wdHkgc3RhdGUgaXMgZGlzcGxheWVkIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUuXG4gICAqIFRoaXMgaW5jbHVkZXMgdGhlIHRpdGxlLCBzdWJ0aXRsZSwgYnV0dG9uIHRleHQsIGljb24sIGFuZCBuYXZpZ2F0aW9uIGxpbmsuXG4gICAqXG4gICAqIEB0eXBlIHtQYXJ0aWFsPElMaXN0RW1wdHlSZXN1bHQ+fVxuICAgKiBAZGVmYXVsdCB7XG4gICAqICAgdGl0bGU6ICdlbXB0eS50aXRsZScsXG4gICAqICAgc3VidGl0bGU6ICdlbXB0eS5zdWJ0aXRsZScsXG4gICAqICAgc2hvd0J1dHRvbjogZmFsc2UsXG4gICAqICAgaWNvbjogJ2FsZXJ0LWNpcmNsZS1vdXRsaW5lJyxcbiAgICogICBidXR0b25UZXh0OiAnbG9jYWxlLmVtcHR5LmJ1dHRvbicsXG4gICAqICAgbGluazogJydcbiAgICogfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZW1wdHk6IFBhcnRpYWw8SUxpc3RFbXB0eVJlc3VsdD4gPSB7XG4gICAgdGl0bGU6ICdlbXB0eS50aXRsZScsXG4gICAgc3VidGl0bGU6ICdlbXB0eS5zdWJ0aXRsZScsXG4gICAgc2hvd0J1dHRvbjogZmFsc2UsXG4gICAgaWNvbjogJ2FsZXJ0LWNpcmNsZS1vdXRsaW5lJyxcbiAgICBidXR0b25UZXh0OiAnbG9jYWxlLmVtcHR5LmJ1dHRvbicsXG4gICAgbGluazogJydcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGN1cnJlbnQgcGFnZSBudW1iZXIgaW4gcGFnaW5hdGVkIG1vZGUuXG4gICAqIEBzdW1tYXJ5IFRyYWNrcyB3aGljaCBwYWdlIGlzIGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQgd2hlbiB0aGUgY29tcG9uZW50XG4gICAqIGlzIGluIHBhZ2luYXRlZCBtb2RlLiBUaGlzIGlzIHVzZWQgZm9yIHBhZ2luYXRpb24gY29udHJvbHMgYW5kIGRhdGEgZmV0Y2hpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHBhZ2U6IG51bWJlciA9IDE7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGF2YWlsYWJsZS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjYWxjdWxhdGVkIHRvdGFsIG51bWJlciBvZiBwYWdlcyBiYXNlZCBvbiB0aGUgZGF0YSBzaXplXG4gICAqIGFuZCBsaW1pdC4gVGhpcyBpcyB1c2VkIGZvciBwYWdpbmF0aW9uIGNvbnRyb2xzIGFuZCBib3VuZGFyeSBjaGVja2luZy5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHBhZ2VzITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIHdoZXRoZXIgYSByZWZyZXNoIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy5cbiAgICogQHN1bW1hcnkgV2hlbiB0cnVlLCB0aGUgY29tcG9uZW50IGlzIGN1cnJlbnRseSBmZXRjaGluZyBuZXcgZGF0YS4gVGhpcyBpcyB1c2VkXG4gICAqIHRvIGNvbnRyb2wgbG9hZGluZyBpbmRpY2F0b3JzIGFuZCBwcmV2ZW50IGR1cGxpY2F0ZSByZWZyZXNoIG9wZXJhdGlvbnMgZnJvbVxuICAgKiBiZWluZyB0cmlnZ2VyZWQgc2ltdWx0YW5lb3VzbHkuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcmVmcmVzaGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXJyYXkgdXNlZCBmb3IgcmVuZGVyaW5nIHNrZWxldG9uIGxvYWRpbmcgcGxhY2Vob2xkZXJzLlxuICAgKiBAc3VtbWFyeSBDb250YWlucyBwbGFjZWhvbGRlciBpdGVtcyB0aGF0IGFyZSBkaXNwbGF5ZWQgZHVyaW5nIGRhdGEgbG9hZGluZy5cbiAgICogVGhlIGxlbmd0aCBvZiB0aGlzIGFycmF5IGRldGVybWluZXMgaG93IG1hbnkgc2tlbGV0b24gaXRlbXMgYXJlIHNob3duLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nW119XG4gICAqIEBkZWZhdWx0IG5ldyBBcnJheSgyKVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgc2tlbGV0b25EYXRhOiBzdHJpbmdbXSA9IG5ldyBBcnJheSgyKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwcm9jZXNzZWQgbGlzdCBpdGVtcyByZWFkeSBmb3IgZGlzcGxheS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHNldCBvZiBpdGVtcyBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYWZ0ZXJcbiAgICogcHJvY2Vzc2luZyBmcm9tIHRoZSByYXcgZGF0YSBzb3VyY2UuIFRoaXMgbWF5IGJlIGEgc3Vic2V0IG9mIHRoZSBmdWxsIGRhdGFcbiAgICogd2hlbiB1c2luZyBwYWdpbmF0aW9uIG9yIGluZmluaXRlIHNjcm9sbGluZy5cbiAgICpcbiAgICogQHR5cGUge0tleVZhbHVlW119XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBpdGVtcyE6IEtleVZhbHVlW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudCBzZWFyY2ggcXVlcnkgdmFsdWUuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgdGV4dCBlbnRlcmVkIGluIHRoZSBzZWFyY2ggYmFyLiBUaGlzIGlzIHVzZWQgdG8gZmlsdGVyXG4gICAqIHRoZSBsaXN0IGRhdGEgb3IgdG8gc2VuZCBhcyBhIHNlYXJjaCBwYXJhbWV0ZXIgd2hlbiBmZXRjaGluZyBuZXcgZGF0YS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHNlYXJjaFZhbHVlPzogc3RyaW5nIHwgSUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQSBwYWdpbmF0b3Igb2JqZWN0IGZvciBoYW5kbGluZyBwYWdpbmF0aW9uIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgcGFnaW5hdG9yIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFuZCBuYXZpZ2F0ZVxuICAgKiB0aHJvdWdoIGRhdGEgaW4gY2h1bmtzLCByZWR1Y2luZyBtZW1vcnkgdXNhZ2UgYW5kIGltcHJvdmluZyBwZXJmb3JtYW5jZS5cbiAgICpcbiAgICogVGhlIHBhZ2luYXRvciBvYmplY3QgaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGBuZ09uSW5pdGAgbGlmZWN5Y2xlIGhvb2sgYW5kIGlzXG4gICAqIHVzZWQgdG8gZmV0Y2ggYW5kIGRpc3BsYXkgZGF0YSBpbiB0aGUgcGFnaW5hdGlvbiBjb21wb25lbnQuIEl0IGlzIGFuIGluc3RhbmNlXG4gICAqIG9mIHRoZSBgUGFnaW5hdG9yYCBjbGFzcyBmcm9tIHRoZSBgQGRlY2FmLXRzL2NvcmVgIHBhY2thZ2UsIHdoaWNoIHByb3ZpZGVzXG4gICAqIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIGFuZCBtYW5pcHVsYXRpbmcgcGFnaW5hdGVkIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtQYWdpbmF0b3I8TW9kZWw+fVxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgcGFnaW5hdG9yITogUGFnaW5hdG9yPE1vZGVsPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBsYXN0IHBhZ2UgbnVtYmVyIHRoYXQgd2FzIGRpc3BsYXllZC5cbiAgICogQHN1bW1hcnkgS2VlcHMgdHJhY2sgb2YgdGhlIHByZXZpb3VzbHkgZGlzcGxheWVkIHBhZ2UgbnVtYmVyLCB3aGljaCBpcyB1c2VmdWxcbiAgICogZm9yIGhhbmRsaW5nIG5hdmlnYXRpb24gYW5kIHNlYXJjaCBvcGVyYXRpb25zIGluIHBhZ2luYXRlZCBtb2RlLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAxXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBsYXN0UGFnZTogbnVtYmVyID0gMVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgcmVmcmVzaCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBsaXN0IGRhdGEgaXMgcmVmcmVzaGVkLCBlaXRoZXIgdGhyb3VnaCBwdWxsLXRvLXJlZnJlc2hcbiAgICogb3IgcHJvZ3JhbW1hdGljIHJlZnJlc2guIFRoZSBldmVudCBpbmNsdWRlcyB0aGUgcmVmcmVzaGVkIGRhdGEgYW5kIGNvbXBvbmVudCBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxCYXNlQ3VzdG9tRXZlbnQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHJlZnJlc2hFdmVudDogRXZlbnRFbWl0dGVyPEJhc2VDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEJhc2VDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGVtaXR0ZXIgZm9yIGl0ZW0gY2xpY2sgaW50ZXJhY3Rpb25zLlxuICAgKiBAc3VtbWFyeSBFbWl0cyBhbiBldmVudCB3aGVuIGEgbGlzdCBpdGVtIGlzIGNsaWNrZWQuIFRoZSBldmVudCBpbmNsdWRlcyB0aGUgZGF0YVxuICAgKiBvZiB0aGUgY2xpY2tlZCBpdGVtLCBhbGxvd2luZyBwYXJlbnQgY29tcG9uZW50cyB0byByZXNwb25kIHRvIHRoZSBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxLZXlWYWx1ZT59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgY2xpY2tFdmVudDogIEV2ZW50RW1pdHRlcjxMaXN0SXRlbUN1c3RvbUV2ZW50fFJlbmRlcmVyQ3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0SXRlbUN1c3RvbUV2ZW50fFJlbmRlcmVyQ3VzdG9tRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdWJqZWN0IGZvciBkZWJvdW5jaW5nIGNsaWNrIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgVXNlcyBSeEpTIFN1YmplY3QgdG8gY29sbGVjdCBjbGljayBldmVudHMgYW5kIGVtaXQgdGhlbSBhZnRlciBhIGRlYm91bmNlXG4gICAqIHBlcmlvZC4gVGhpcyBwcmV2ZW50cyBtdWx0aXBsZSByYXBpZCBjbGlja3MgZnJvbSB0cmlnZ2VyaW5nIG11bHRpcGxlIGV2ZW50cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1N1YmplY3Q8Q3VzdG9tRXZlbnQgfCBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGNsaWNrSXRlbVN1YmplY3Q6IFN1YmplY3Q8Q3VzdG9tRXZlbnQgfCBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudD4gPSBuZXcgU3ViamVjdDxDdXN0b21FdmVudCB8IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdWJqZWN0IGZvciBkZWJvdW5jaW5nIHJlcG9zaXRvcnkgb2JzZXJ2YXRpb24gZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBSeEpTIFN1YmplY3QgdGhhdCBjb2xsZWN0cyByZXBvc2l0b3J5IGNoYW5nZSBldmVudHMgYW5kIGVtaXRzIHRoZW0gYWZ0ZXJcbiAgICogYSBkZWJvdW5jZSBwZXJpb2QuIFRoaXMgcHJldmVudHMgbXVsdGlwbGUgcmFwaWQgcmVwb3NpdG9yeSBjaGFuZ2VzIGZyb20gdHJpZ2dlcmluZ1xuICAgKiBtdWx0aXBsZSBsaXN0IHJlZnJlc2ggb3BlcmF0aW9ucywgaW1wcm92aW5nIHBlcmZvcm1hbmNlIGFuZCB1c2VyIGV4cGVyaWVuY2UuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtTdWJqZWN0PGFueT59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIG9ic2VydmVyU3ViamV0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPYnNlcnZlciBvYmplY3QgZm9yIHJlcG9zaXRvcnkgY2hhbmdlIG5vdGlmaWNhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEltcGxlbWVudHMgdGhlIE9ic2VydmVyIGludGVyZmFjZSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGVcbiAgICogdW5kZXJseWluZyBkYXRhIHJlcG9zaXRvcnkgY2hhbmdlcy4gVGhpcyBlbmFibGVzIGF1dG9tYXRpYyBsaXN0IHVwZGF0ZXMgd2hlblxuICAgKiBkYXRhIGlzIGNyZWF0ZWQsIHVwZGF0ZWQsIG9yIGRlbGV0ZWQgdGhyb3VnaCB0aGUgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge09ic2VydmVyfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBvYnNlcnZlcjogT2JzZXJ2ZXIgPSB7IHJlZnJlc2g6IGFzeW5jICguLi4gYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLm9ic2VydmVSZXBvc2l0b3J5KC4uLmFyZ3MpfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdCBvZiBhdmFpbGFibGUgaW5kZXhlcyBmb3IgZGF0YSBxdWVyeWluZyBhbmQgZmlsdGVyaW5nLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIGxpc3Qgb2YgaW5kZXggbmFtZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSBkYXRhIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmdcbiAgICogb3BlcmF0aW9ucywgZXNwZWNpYWxseSBpbiBzY2VuYXJpb3Mgd2l0aCBsYXJnZSBkYXRhc2V0cy5cbiAgICpcbiAgICogSW5kZXhlcyBjYW4gc2lnbmlmaWNhbnRseSBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiBkYXRhIHJldHJpZXZhbCBieSBhbGxvd2luZyB0aGUgZGF0YWJhc2VcbiAgICogdG8gcXVpY2tseSBsb2NhdGUgYW5kIHJldHJpZXZlIHJlbGV2YW50IGRhdGEgYmFzZWQgb24gaW5kZXhlZCBmaWVsZHMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICogQGRlZmF1bHQgW11cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGluZGV4ZXMhOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBMaXN0Q29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IExpc3RDb21wb25lbnQgYW5kIHNldHMgdXAgdGhlIGJhc2UgY29tcG9uZW50IHdpdGggdGhlIGFwcHJvcHJpYXRlXG4gICAqIGNvbXBvbmVudCBuYW1lLiBUaGlzIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCB3aGVuIEFuZ3VsYXIgaW5zdGFudGlhdGVzIHRoZSBjb21wb25lbnQgYW5kXG4gICAqIGJlZm9yZSBhbnkgaW5wdXQgcHJvcGVydGllcyBhcmUgc2V0LiBJdCBwYXNzZXMgdGhlIGNvbXBvbmVudCBuYW1lIHRvIHRoZSBwYXJlbnQgY2xhc3NcbiAgICogY29uc3RydWN0b3IgdG8gZW5hYmxlIHByb3BlciBsb2NhbGl6YXRpb24gYW5kIGNvbXBvbmVudCBpZGVudGlmaWNhdGlvbi5cbiAgICpcbiAgICogVGhlIGNvbnN0cnVjdG9yIGlzIGludGVudGlvbmFsbHkgbWluaW1hbCwgd2l0aCBtb3N0IGluaXRpYWxpemF0aW9uIGxvZ2ljIGRlZmVycmVkIHRvXG4gICAqIHRoZSBuZ09uSW5pdCBsaWZlY3ljbGUgaG9vay4gVGhpcyBmb2xsb3dzIEFuZ3VsYXIgYmVzdCBwcmFjdGljZXMgYnkga2VlcGluZyB0aGUgY29uc3RydWN0b3JcbiAgICogZm9jdXNlZCBvbiBkZXBlbmRlbmN5IGluamVjdGlvbiBhbmQgYmFzaWMgc2V0dXAsIHdoaWxlIGNvbXBsZXggaW5pdGlhbGl6YXRpb24gdGhhdCBkZXBlbmRzXG4gICAqIG9uIGlucHV0IHByb3BlcnRpZXMgaXMgaGFuZGxlZCBpbiBuZ09uSW5pdC5cbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiTGlzdENvbXBvbmVudFwiKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IGFmdGVyIEFuZ3VsYXIgc2V0cyB0aGUgaW5wdXQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgU2V0cyB1cCB0aGUgY29tcG9uZW50IGJ5IGluaXRpYWxpemluZyBldmVudCBzdWJzY3JpcHRpb25zLCBwcm9jZXNzaW5nIGJvb2xlYW5cbiAgICogaW5wdXRzLCBhbmQgbG9hZGluZyB0aGUgaW5pdGlhbCBkYXRhLiBUaGlzIG1ldGhvZCBwcmVwYXJlcyB0aGUgY29tcG9uZW50IGZvciB1c2VyXG4gICAqIGludGVyYWN0aW9uIGJ5IGVuc3VyaW5nIGFsbCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBhbmQgZGF0YSBpcyBsb2FkZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFuZ3VsYXIgTGlmZWN5Y2xlXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMaXN0Q29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBEYXRhIFNvdXJjZVxuICAgKlxuICAgKiAgIEEtPj5MOiBuZ09uSW5pdCgpXG4gICAqICAgTC0+Pkw6IFNldCB1cCBjbGljayBldmVudCBkZWJvdW5jaW5nXG4gICAqICAgTC0+Pkw6IFByb2Nlc3MgYm9vbGVhbiBpbnB1dHNcbiAgICogICBMLT4+TDogQ29uZmlndXJlIGNvbXBvbmVudCBiYXNlZCBvbiBpbnB1dHNcbiAgICogICBMLT4+TDogcmVmcmVzaCgpXG4gICAqICAgTC0+PkQ6IFJlcXVlc3QgaW5pdGlhbCBkYXRhXG4gICAqICAgRC0tPj5MOiBSZXR1cm4gZGF0YVxuICAgKiAgIEwtPj5MOiBQcm9jZXNzIGFuZCBkaXNwbGF5IGRhdGFcbiAgICogICBMLT4+TDogQ29uZmlndXJlIGVtcHR5IHN0YXRlIGlmIG5lZWRlZFxuICAgKiAgIEwtPj5MOiBpbml0aWFsaXplKClcbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2xpY2tJdGVtU3ViamVjdC5waXBlKGRlYm91bmNlVGltZSgxMDApKS5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5jbGlja0V2ZW50RW1pdChldmVudCBhcyBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudCkpO1xuICAgIHRoaXMub2JzZXJ2ZXJTdWJqZXQucGlwZShkZWJvdW5jZVRpbWUoMTAwKSkuc3Vic2NyaWJlKGFyZ3MgPT4gdGhpcy5oYW5kbGVPYnNlcnZlRXZlbnQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSkpO1xuICAgIHRoaXMuZW5hYmxlRmlsdGVyID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuZW5hYmxlRmlsdGVyKTtcbiAgICB0aGlzLmxpbWl0ID0gTnVtYmVyKHRoaXMubGltaXQpO1xuICAgIHRoaXMuc3RhcnQgPSBOdW1iZXIodGhpcy5zdGFydCk7XG4gICAgdGhpcy5pbnNldCA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLmluc2V0KTtcbiAgICB0aGlzLnNob3dSZWZyZXNoZXIgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5zaG93UmVmcmVzaGVyKTtcbiAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLmxvYWRNb3JlRGF0YSk7XG4gICAgdGhpcy5zaG93U2VhcmNoYmFyID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuc2hvd1NlYXJjaGJhcik7XG4gICAgdGhpcy5kaXNhYmxlU29ydCA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLmRpc2FibGVTb3J0KTtcbiAgICBpZih0eXBlb2YgdGhpcy5pdGVtPy5bJ3RhZyddID09PSAnYm9vbGVhbicgJiYgdGhpcy5pdGVtPy5bJ3RhZyddID09PSB0cnVlKVxuICAgICAgdGhpcy5pdGVtWyd0YWcnXSA9IENvbXBvbmVudHNUYWdOYW1lcy5MSVNUX0lURU0gYXMgc3RyaW5nO1xuXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG5cbiAgICBpZih0aGlzLm9wZXJhdGlvbnMuaW5jbHVkZXMoT3BlcmF0aW9uS2V5cy5DUkVBVEUpICYmIHRoaXMucm91dGUpXG4gICAgICB0aGlzLmVtcHR5LmxpbmsgPSBgJHt0aGlzLnJvdXRlfS8ke09wZXJhdGlvbktleXMuQ1JFQVRFfWA7XG5cbiAgICB0aGlzLmluaXRpYWxpemUoKTtcblxuICAgIGlmKHRoaXMubW9kZWwgaW5zdGFuY2VvZiBNb2RlbCAmJiB0aGlzLl9yZXBvc2l0b3J5KVxuICAgICAgdGhpcy5fcmVwb3NpdG9yeS5vYnNlcnZlKHRoaXMub2JzZXJ2ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbGVhbnMgdXAgcmVzb3VyY2VzIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGNsZWFudXAgb3BlcmF0aW9ucyB3aGVuIHRoZSBjb21wb25lbnQgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBET00uXG4gICAqIFRoaXMgaW5jbHVkZXMgY2xlYXJpbmcgcmVmZXJlbmNlcyB0byBtb2RlbHMgYW5kIGRhdGEgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYodGhpcy5fcmVwb3NpdG9yeSlcbiAgICAgIHRoaXMuX3JlcG9zaXRvcnkudW5PYnNlcnZlKHRoaXMub2JzZXJ2ZXIpO1xuICAgIHRoaXMuZGF0YSA9ICB0aGlzLm1vZGVsID0gdGhpcy5fcmVwb3NpdG9yeSA9IHRoaXMucGFnaW5hdG9yID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHJlcG9zaXRvcnkgb2JzZXJ2YXRpb24gZXZlbnRzIHdpdGggZGVib3VuY2luZy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIHJlcG9zaXRvcnkgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIHJvdXRlcyB0aGVtIGFwcHJvcHJpYXRlbHkuXG4gICAqIEZvciBDUkVBVEUgZXZlbnRzIHdpdGggYSBVSUQsIGhhbmRsZXMgdGhlbSBpbW1lZGlhdGVseS4gRm9yIG90aGVyIGV2ZW50cyxcbiAgICogcGFzc2VzIHRoZW0gdG8gdGhlIGRlYm91bmNlZCBvYnNlcnZlciBzdWJqZWN0IHRvIHByZXZlbnQgZXhjZXNzaXZlIHVwZGF0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4udW5rbm93bltdfSBhcmdzIC0gVGhlIHJlcG9zaXRvcnkgZXZlbnQgYXJndW1lbnRzIGluY2x1ZGluZyB0YWJsZSwgZXZlbnQgdHlwZSwgYW5kIFVJRFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIG9ic2VydmVSZXBvc2l0b3J5KC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IFt0YWJsZSwgZXZlbnQsIHVpZF0gPSBhcmdzO1xuICAgIGlmKGV2ZW50ID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSAmJiAhIXVpZClcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZU9ic2VydmVFdmVudCh0YWJsZSBhcyBzdHJpbmcsIGV2ZW50LCB1aWQgYXMgc3RyaW5nIHwgbnVtYmVyKTtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlclN1YmpldC5uZXh0KGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHNwZWNpZmljIHJlcG9zaXRvcnkgZXZlbnRzIGFuZCB1cGRhdGVzIHRoZSBsaXN0IGFjY29yZGluZ2x5LlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgcmVwb3NpdG9yeSBjaGFuZ2UgZXZlbnRzIChDUkVBVEUsIFVQREFURSwgREVMRVRFKSBhbmQgcGVyZm9ybXNcbiAgICogdGhlIGFwcHJvcHJpYXRlIGxpc3Qgb3BlcmF0aW9ucy4gVGhpcyBpbmNsdWRlcyBhZGRpbmcgbmV3IGl0ZW1zLCB1cGRhdGluZyBleGlzdGluZ1xuICAgKiBvbmVzLCBvciByZW1vdmluZyBkZWxldGVkIGl0ZW1zIGZyb20gdGhlIGxpc3QgZGlzcGxheS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlL21vZGVsIG5hbWUgdGhhdCBjaGFuZ2VkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gKENSRUFURSwgVVBEQVRFLCBERUxFVEUpXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB1aWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFmZmVjdGVkIGl0ZW1cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBoYW5kbGVPYnNlcnZlRXZlbnQodGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMsIHVpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYoZXZlbnQgPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFKSB7XG4gICAgICBpZih1aWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDcmVhdGUodWlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZXZlbnQgPT09IE9wZXJhdGlvbktleXMuVVBEQVRFKVxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVVwZGF0ZSh1aWQpO1xuICAgICAgaWYoZXZlbnQgPT09IE9wZXJhdGlvbktleXMuREVMRVRFKVxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0ZSh1aWQpO1xuICAgICAgdGhpcy5yZWZyZXNoRXZlbnRFbWl0KCk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIGZvciB0cmFja2luZyBpdGVtcyBpbiB0aGUgbGlzdC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSB0cmFja2luZyBmdW5jdGlvbiBmb3IgdGhlIGAqbmdGb3JgIGRpcmVjdGl2ZSBpbiB0aGUgY29tcG9uZW50IHRlbXBsYXRlLlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kIGNvbnRyb2wgdGhlIHJlbmRlcmluZyBvZiBpdGVtcyBpbiB0aGUgbGlzdCxcbiAgICogcHJldmVudGluZyBkdXBsaWNhdGUgb3IgdW5uZWNlc3NhcnkgcmVuZGVyaW5nLlxuICAgKlxuICAgKiBUaGUgYHRyYWNrSXRlbUZuYCBmdW5jdGlvbiB0YWtlcyB0d28gcGFyYW1ldGVyczogYGluZGV4YCAodGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBsaXN0KVxuICAgKiBhbmQgYGl0ZW1gICh0aGUgYWN0dWFsIGl0ZW0gZnJvbSB0aGUgbGlzdCkuIEl0IHJldHVybnMgdGhlIHRyYWNraW5nIGtleSwgd2hpY2ggaW4gdGhpcyBjYXNlXG4gICAqIGlzIHRoZSB1bmlvbiBvZiB0aGUgYHVpZGAgb2YgdGhlIGl0ZW0gd2l0aCB0aGUgbW9kZWwgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBsaXN0LlxuXG4gICAqIEBwYXJhbSB7S2V5VmFsdWUgfCBzdHJpbmcgfCBudW1iZXJ9IGl0ZW0gLSBUaGUgYWN0dWFsIGl0ZW0gZnJvbSB0aGUgbGlzdC5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlcn0gVGhlIHRyYWNraW5nIGtleSBmb3IgdGhlIGl0ZW0uXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBvdmVycmlkZSB0cmFja0l0ZW1GbihpbmRleDogbnVtYmVyLCBpdGVtOiBLZXlWYWx1ZSB8IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuIGAkeyAoaXRlbSBhcyBLZXlWYWx1ZSk/LlsndWlkJ10gfHwgKGl0ZW0gYXMgS2V5VmFsdWUpPy5bdGhpcy5wa119LSR7aW5kZXh9YDtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNyZWF0ZSBldmVudCBmcm9tIHRoZSByZXBvc2l0b3J5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdWlkIC0gVGhlIElEIG9mIHRoZSBpdGVtIHRvIGNyZWF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGl0ZW0gaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlIGxpc3QuXG4gICAqL1xuICBhc3luYyBoYW5kbGVDcmVhdGUodWlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9yZXBvc2l0b3J5Py5yZWFkKHVpZCk7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMubWFwUmVzdWx0cyhbcmVzdWx0IGFzIEtleVZhbHVlXSlbMF07XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuZGF0YSA9IFtpdGVtLCAuLi50aGlzLml0ZW1zIHx8IFtdXTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHRoZSB1cGRhdGUgZXZlbnQgZnJvbSB0aGUgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyB0aGUgbGlzdCBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBJRCBiYXNlZCBvbiB0aGUgbmV3IGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB1aWQgLSBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gdXBkYXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlVXBkYXRlKHVpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaXRlbTogS2V5VmFsdWUgPSB0aGlzLml0ZW1NYXBwZXIoYXdhaXQgdGhpcy5fcmVwb3NpdG9yeT8ucmVhZCh1aWQpIHx8IHt9LCB0aGlzLm1hcHBlcik7XG4gICAgdGhpcy5kYXRhID0gW107XG4gICAgZm9yKGNvbnN0IGtleSBpbiB0aGlzLml0ZW1zIGFzIEtleVZhbHVlW10pIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLml0ZW1zW2tleV0gYXMgS2V5VmFsdWU7XG4gICAgICAgIGlmKGNoaWxkWyd1aWQnXSA9PT0gaXRlbVsndWlkJ10pIHtcbiAgICAgICAgICB0aGlzLml0ZW1zW2tleV0gPSBPYmplY3QuYXNzaWduKHt9LCBjaGlsZCwgaXRlbSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRhdGEgPSBbIC4uLnRoaXMuaXRlbXNdO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgbGlzdCBieSBJRC5cbiAgICogQHN1bW1hcnkgRmlsdGVycyBvdXQgYW4gaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZnJvbSB0aGUgZGF0YSBhcnJheSBhbmRcbiAgICogcmVmcmVzaGVzIHRoZSBsaXN0IGRpc3BsYXkuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgYWZ0ZXIgYSBkZWxldGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdWlkIC0gVGhlIElEIG9mIHRoZSBpdGVtIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGsgLSBUaGUgcHJpbWFyeSBrZXkgZmllbGQgbmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZURlbGV0ZSh1aWQ6IHN0cmluZyB8IG51bWJlciwgcGs/OiBzdHJpbmcpOiB2b2lkICB7XG4gICAgaWYoIXBrKVxuICAgICAgcGsgPSB0aGlzLnBrO1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGE/LmZpbHRlcigoaXRlbTogS2V5VmFsdWUpID0+IGl0ZW1bJ3VpZCddICE9PSB1aWQpIHx8IFtdO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgY2xpY2sgZXZlbnRzIGZyb20gbGlzdCBpdGVtcy5cbiAgICogQHN1bW1hcnkgTGlzdGVucyBmb3IgZ2xvYmFsIExpc3RJdGVtQ2xpY2tFdmVudCBldmVudHMgYW5kIHBhc3NlcyB0aGVtIHRvIHRoZVxuICAgKiBkZWJvdW5jZWQgY2xpY2sgc3ViamVjdC4gVGhpcyBhbGxvd3MgdGhlIGNvbXBvbmVudCB0byByZXNwb25kIHRvIGNsaWNrcyBvblxuICAgKiBsaXN0IGl0ZW1zIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhleSBvcmlnaW5hdGUgZnJvbS5cbiAgICpcbiAgICogQHBhcmFtIHtMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgY2xpY2sgZXZlbnRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6TGlzdEl0ZW1DbGlja0V2ZW50JywgWyckZXZlbnQnXSlcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGlja0l0ZW1TdWJqZWN0Lm5leHQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHNlYXJjaCBldmVudHMgZnJvbSB0aGUgc2VhcmNoIGJhci5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIHNlYXJjaCBxdWVyaWVzIGZyb20gdGhlIHNlYXJjaCBiYXIgY29tcG9uZW50LCB1cGRhdGluZyB0aGVcbiAgICogZGlzcGxheWVkIGRhdGEgYmFzZWQgb24gdGhlIHNlYXJjaCB0ZXJtLiBUaGUgYmVoYXZpb3IgZGlmZmVycyBiZXR3ZWVuIGluZmluaXRlXG4gICAqIGFuZCBwYWdpbmF0ZWQgbW9kZXMgdG8gcHJvdmlkZSB0aGUgYmVzdCB1c2VyIGV4cGVyaWVuY2UgZm9yIGVhY2ggbW9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gVGhlIHNlYXJjaCB0ZXJtIG9yIHVuZGVmaW5lZCB0byBjbGVhciBzZWFyY2hcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIGZsb3djaGFydCBURFxuICAgKiAgIEFbU2VhcmNoIEV2ZW50XSAtLT4gQntUeXBlIGlzIEluZmluaXRlP31cbiAgICogICBCIC0tPnxZZXN8IENbRGlzYWJsZSBsb2FkTW9yZURhdGFdXG4gICAqICAgQiAtLT58Tm98IERbRW5hYmxlIGxvYWRNb3JlRGF0YV1cbiAgICogICBDIC0tPiBFe1NlYXJjaCB2YWx1ZSB1bmRlZmluZWQ/fVxuICAgKiAgIEUgLS0+fFllc3wgRltFbmFibGUgbG9hZE1vcmVEYXRhXVxuICAgKiAgIEUgLS0+fE5vfCBHW1N0b3JlIHNlYXJjaCB2YWx1ZV1cbiAgICogICBEIC0tPiBHXG4gICAqICAgRiAtLT4gSFtSZXNldCBwYWdlIHRvIDFdXG4gICAqICAgRyAtLT4gSVtSZWZyZXNoIGRhdGFdXG4gICAqICAgSCAtLT4gSVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNlYXJjaGJhckV2ZW50JywgWyckZXZlbnQnXSlcbiAgYXN5bmMgaGFuZGxlU2VhcmNoKHZhbHVlOiBzdHJpbmcgfCBJRmlsdGVyUXVlcnkgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUpIHtcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWdlID0gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSB0cnVlO1xuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhpcy5wYWdlID0gdGhpcy5sYXN0UGFnZTtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBmaWx0ZXIgZXZlbnRzIGZyb20gdGhlIGZpbHRlciBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBmaWx0ZXIgcXVlcmllcyBmcm9tIHRoZSBmaWx0ZXIgY29tcG9uZW50IGFuZCBhcHBsaWVzIHRoZW1cbiAgICogdG8gdGhlIGxpc3QgZGF0YS4gVGhpcyBtZXRob2QgYWN0cyBhcyBhIGJyaWRnZSBiZXR3ZWVuIHRoZSBmaWx0ZXIgY29tcG9uZW50XG4gICAqIGFuZCB0aGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHksIGNvbnZlcnRpbmcgZmlsdGVyIHF1ZXJpZXMgaW50byBzZWFyY2ggb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtJRmlsdGVyUXVlcnkgfCB1bmRlZmluZWR9IHZhbHVlIC0gVGhlIGZpbHRlciBxdWVyeSBvYmplY3Qgb3IgdW5kZWZpbmVkIHRvIGNsZWFyIGZpbHRlcnNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBoYW5kbGVGaWx0ZXIodmFsdWU6IElGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VhcmNoKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYXJzIHRoZSBjdXJyZW50IHNlYXJjaCBhbmQgcmVzZXRzIHRoZSBsaXN0LlxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBjbGVhcnMgdGhlIHNlYXJjaCBieSBjYWxsaW5nIGhhbmRsZVNlYXJjaFxuICAgKiB3aXRoIHVuZGVmaW5lZC4gVGhpcyByZXNldHMgdGhlIGxpc3QgdG8gc2hvdyBhbGwgZGF0YSB3aXRob3V0IGZpbHRlcmluZy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBjbGVhclNlYXJjaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVNlYXJjaCh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbWl0cyBhIHJlZnJlc2ggZXZlbnQgd2l0aCB0aGUgY3VycmVudCBkYXRhLlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGFuZCBlbWl0cyBhIHJlZnJlc2ggZXZlbnQgY29udGFpbmluZyB0aGUgY3VycmVudCBsaXN0IGRhdGEuXG4gICAqIFRoaXMgbm90aWZpZXMgcGFyZW50IGNvbXBvbmVudHMgdGhhdCB0aGUgbGlzdCBkYXRhIGhhcyBiZWVuIHJlZnJlc2hlZC5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlWYWx1ZVtdfSBbZGF0YV0gLSBPcHRpb25hbCBkYXRhIHRvIGluY2x1ZGUgaW4gdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcmVmcmVzaEV2ZW50RW1pdChkYXRhPzogS2V5VmFsdWVbXSk6IHZvaWQge1xuICAgIGlmKCFkYXRhKVxuICAgICAgZGF0YSA9IHRoaXMuaXRlbXM7XG4gICAgdGhpcy5za2VsZXRvbkRhdGEgPSBuZXcgQXJyYXkoZGF0YT8ubGVuZ3RoIHx8IDIpO1xuICAgIHRoaXMucmVmcmVzaEV2ZW50LmVtaXQoe1xuICAgICAgbmFtZTogRXZlbnRDb25zdGFudHMuUkVGUkVTSF9FVkVOVCxcbiAgICAgIGRhdGE6IGRhdGEgfHwgW10sXG4gICAgICBjb21wb25lbnQ6IHRoaXMuY29tcG9uZW50TmFtZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbWl0cyBhIGNsaWNrIGV2ZW50IGZvciBhIGxpc3QgaXRlbS5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGFuZCBlbWl0cyBhIGNsaWNrIGV2ZW50IHdoZW4gYSBsaXN0IGl0ZW0gaXMgY2xpY2tlZC5cbiAgICogVGhpcyBleHRyYWN0cyB0aGUgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBldmVudCBhbmQgcGFzc2VzIGl0IHRvIHBhcmVudCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0xpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBjbGljayBldmVudFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY2xpY2tFdmVudEVtaXQoZXZlbnQ6IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZyZXNoZXMgdGhlIGxpc3QgZGF0YSBmcm9tIHRoZSBjb25maWd1cmVkIHNvdXJjZS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIGluaXRpYWwgZGF0YSBsb2FkaW5nIGFuZCBzdWJzZXF1ZW50IHJlZnJlc2ggb3BlcmF0aW9ucyxcbiAgICogaW5jbHVkaW5nIHB1bGwtdG8tcmVmcmVzaCBhbmQgaW5maW5pdGUgc2Nyb2xsaW5nLiBJdCBtYW5hZ2VzIHRoZSBkYXRhIGZldGNoaW5nIHByb2Nlc3MsXG4gICAqIHVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIHN0YXRlLCBhbmQgaGFuZGxlcyBwYWdpbmF0aW9uIG9yIGluZmluaXRlIHNjcm9sbGluZyBsb2dpYyBiYXNlZFxuICAgKiBvbiB0aGUgY29tcG9uZW50J3MgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVGhlIG1ldGhvZCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuICAgKiAxLiBTZXRzIHRoZSByZWZyZXNoaW5nIGZsYWcgdG8gaW5kaWNhdGUgYSBkYXRhIGZldGNoIGlzIGluIHByb2dyZXNzXG4gICAqIDIuIENhbGN1bGF0ZXMgdGhlIGFwcHJvcHJpYXRlIHN0YXJ0IGFuZCBsaW1pdCB2YWx1ZXMgYmFzZWQgb24gcGFnaW5hdGlvbiBzZXR0aW5nc1xuICAgKiAzLiBGZXRjaGVzIGRhdGEgZnJvbSB0aGUgYXBwcm9wcmlhdGUgc291cmNlIChtb2RlbCBvciByZXF1ZXN0KVxuICAgKiA0LiBVcGRhdGVzIHRoZSBjb21wb25lbnQncyBkYXRhIGFuZCBlbWl0cyBhIHJlZnJlc2ggZXZlbnRcbiAgICogNS4gSGFuZGxlcyBwYWdpbmF0aW9uIG9yIGluZmluaXRlIHNjcm9sbGluZyBzdGF0ZSB1cGRhdGVzXG4gICAqIDYuIENvbXBsZXRlcyBhbnkgcHJvdmlkZWQgZXZlbnQgKGxpa2UgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudClcbiAgICpcbiAgICogQHBhcmFtIHtJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50IHwgUmVmcmVzaGVyQ3VzdG9tRXZlbnQgfCBib29sZWFufSBldmVudCAtIFRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgcmVmcmVzaCxcbiAgICogb3IgYSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIGlzIGEgZm9yY2VkIHJlZnJlc2hcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlZnJlc2ggb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTGlzdENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRGF0YSBTb3VyY2VcbiAgICogICBwYXJ0aWNpcGFudCBFIGFzIEV2ZW50IFN5c3RlbVxuICAgKlxuICAgKiAgIEwtPj5MOiByZWZyZXNoKGV2ZW50KVxuICAgKiAgIEwtPj5MOiBTZXQgcmVmcmVzaGluZyBmbGFnXG4gICAqICAgTC0+Pkw6IENhbGN1bGF0ZSBzdGFydCBhbmQgbGltaXRcbiAgICogICBhbHQgVXNpbmcgbW9kZWxcbiAgICogICAgIEwtPj5EOiBnZXRGcm9tTW9kZWwoZm9yY2UsIHN0YXJ0LCBsaW1pdClcbiAgICogICAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAgICogICBlbHNlIFVzaW5nIHJlcXVlc3RcbiAgICogICAgIEwtPj5EOiBnZXRGcm9tUmVxdWVzdChmb3JjZSwgc3RhcnQsIGxpbWl0KVxuICAgKiAgICAgRC0tPj5MOiBSZXR1cm4gZGF0YVxuICAgKiAgIGVuZFxuICAgKiAgIEwtPj5FOiByZWZyZXNoRXZlbnRFbWl0KClcbiAgICogICBhbHQgSW5maW5pdGUgc2Nyb2xsaW5nIG1vZGVcbiAgICogICAgIEwtPj5MOiBDaGVjayBpZiByZWFjaGVkIGxhc3QgcGFnZVxuICAgKiAgICAgYWx0IExhc3QgcGFnZSByZWFjaGVkXG4gICAqICAgICAgIEwtPj5MOiBDb21wbGV0ZSBzY3JvbGwgZXZlbnRcbiAgICogICAgICAgTC0+Pkw6IERpc2FibGUgbG9hZE1vcmVEYXRhXG4gICAqICAgICBlbHNlIE1vcmUgcGFnZXMgYXZhaWxhYmxlXG4gICAqICAgICAgIEwtPj5MOiBJbmNyZW1lbnQgcGFnZSBudW1iZXJcbiAgICogICAgICAgTC0+Pkw6IENvbXBsZXRlIHNjcm9sbCBldmVudCBhZnRlciBkZWxheVxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBQYWdpbmF0ZWQgbW9kZVxuICAgKiAgICAgTC0+Pkw6IENsZWFyIHJlZnJlc2hpbmcgZmxhZyBhZnRlciBkZWxheVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OkJhY2tCdXR0b25OYXZpZ2F0aW9uRW5kRXZlbnQnLCBbJyRldmVudCddKVxuICBhc3luYyByZWZyZXNoKGV2ZW50OiBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50IHwgUmVmcmVzaGVyQ3VzdG9tRXZlbnQgfCBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyAgaWYodHlwZW9mIGZvcmNlICE9PSAnYm9vbGVhbicgJiYgZm9yY2UudHlwZSA9PT0gRXZlbnRDb25zdGFudHMuQkFDS19CVVRUT05fTkFWSUdBVElPTikge1xuICAgIC8vICAgIGNvbnN0IHtyZWZyZXNofSA9IChmb3JjZSBhcyBDdXN0b21FdmVudCkuZGV0YWlsO1xuICAgIC8vICAgIGlmKCFyZWZyZXNoKVxuICAgIC8vICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vICB9XG5cbiAgICB0aGlzLnJlZnJlc2hpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHN0YXJ0OiBudW1iZXIgPSB0aGlzLnBhZ2UgPiAxID8gKHRoaXMucGFnZSAtIDEpICogdGhpcy5saW1pdCA6IHRoaXMuc3RhcnQ7XG4gICAgY29uc3QgbGltaXQ6IG51bWJlciA9ICh0aGlzLnBhZ2UgKiAodGhpcy5saW1pdCA+IDEyID8gMTIgOiB0aGlzLmxpbWl0KSk7XG5cbiAgICB0aGlzLmRhdGEgPSAhdGhpcy5tb2RlbCA/XG4gICAgICBhd2FpdCB0aGlzLmdldEZyb21SZXF1ZXN0KCEhZXZlbnQsIHN0YXJ0LCBsaW1pdClcbiAgICAgIDogYXdhaXQgdGhpcy5nZXRGcm9tTW9kZWwoISFldmVudCkgYXMgS2V5VmFsdWVbXTtcblxuICAgIHRoaXMucmVmcmVzaEV2ZW50RW1pdCgpO1xuXG4gICAgaWYodGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFKSB7XG4gICAgICBpZih0aGlzLnBhZ2UgPT09IHRoaXMucGFnZXMpIHtcbiAgICAgICAgaWYoKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpPy50YXJnZXQpXG4gICAgICAgICAgKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpLnRhcmdldC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYWdlICs9IDE7XG4gICAgICAgIHRoaXMucmVmcmVzaGluZyA9IGZhbHNlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmKChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KT8udGFyZ2V0ICYmIChldmVudCBhcyBDdXN0b21FdmVudCk/LnR5cGUgIT09IEV2ZW50Q29uc3RhbnRzLkJBQ0tfQlVUVE9OX05BVklHQVRJT04pXG4gICAgICAgICAgICAgIChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KS50YXJnZXQuY29tcGxldGUoKTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVmcmVzaGluZyA9IGZhbHNlO1xuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcGFnaW5hdGlvbiBldmVudHMgZnJvbSB0aGUgcGFnaW5hdGlvbiBjb21wb25lbnQuXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgcGFnaW5hdGlvbiBldmVudHMgYnkgdXBkYXRpbmcgdGhlIGN1cnJlbnQgcGFnZSBudW1iZXIgYW5kXG4gKiByZWZyZXNoaW5nIHRoZSBsaXN0IGRhdGEgdG8gZGlzcGxheSB0aGUgc2VsZWN0ZWQgcGFnZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkXG4gKiB3aGVuIGEgdXNlciBpbnRlcmFjdHMgd2l0aCB0aGUgcGFnaW5hdGlvbiBjb250cm9scyB0byBuYXZpZ2F0ZSBiZXR3ZWVuIHBhZ2VzLlxuICpcbiAqIEBwYXJhbSB7UGFnaW5hdGlvbkN1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBwYWdpbmF0aW9uIGV2ZW50IGNvbnRhaW5pbmcgcGFnZSBpbmZvcm1hdGlvblxuICogQHJldHVybnMge3ZvaWR9XG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuaGFuZGxlUGFnaW5hdGUoZXZlbnQ6IFBhZ2luYXRpb25DdXN0b21FdmVudCk6IHZvaWQge1xuICBjb25zdCB7IHBhZ2V9ID0gZXZlbnQuZGF0YTtcbiAgdGhpcy5wYWdlID0gcGFnZTtcbiAgdGhpcy5yZWZyZXNoKHRydWUpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHB1bGwtdG8tcmVmcmVzaCBldmVudHMgZnJvbSB0aGUgcmVmcmVzaGVyIGNvbXBvbmVudC5cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyByZWZyZXNoIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgcHVsbGluZyBkb3duIG9uIHRoZSBsaXN0XG4gKiBvciBieSBwcm9ncmFtbWF0aWMgcmVmcmVzaCByZXF1ZXN0cy4gVGhpcyBtZXRob2QgcmVmcmVzaGVzIHRoZSBsaXN0IGRhdGEgYW5kXG4gKiBjb21wbGV0ZXMgdGhlIHJlZnJlc2hlciBhbmltYXRpb24gd2hlbiB0aGUgZGF0YSBpcyBsb2FkZWQuXG4gKlxuICogQHBhcmFtIHtJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50IHwgQ3VzdG9tRXZlbnR9IFtldmVudF0gLSBUaGUgcmVmcmVzaCBldmVudFxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlZnJlc2ggb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuYXN5bmMgaGFuZGxlUmVmcmVzaChldmVudD86IEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBDdXN0b21FdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB0aGlzLnJlZnJlc2goZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8fCB0cnVlKTtcbiAgaWYoZXZlbnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudClcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIEFueSBjYWxscyB0byBsb2FkIGRhdGEgZ28gaGVyZVxuICAgICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MSW9uUmVmcmVzaGVyRWxlbWVudCkuY29tcGxldGUoKTtcbiAgICB9LCA0MDApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGaWx0ZXJzIGRhdGEgYmFzZWQgb24gYSBzZWFyY2ggc3RyaW5nLlxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIHRoZSBjdXJyZW50IGRhdGEgYXJyYXkgdG8gZmluZCBpdGVtcyB0aGF0IG1hdGNoIHRoZSBwcm92aWRlZFxuICogc2VhcmNoIHN0cmluZy4gVGhpcyB1c2VzIHRoZSBhcnJheVF1ZXJ5QnlTdHJpbmcgdXRpbGl0eSB0byBwZXJmb3JtIHRoZSBmaWx0ZXJpbmdcbiAqIGFjcm9zcyBhbGwgcHJvcGVydGllcyBvZiB0aGUgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtLZXlWYWx1ZVtdfSByZXN1bHRzIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIHNlYXJjaCB0aHJvdWdoXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoIC0gVGhlIHNlYXJjaCBzdHJpbmcgdG8gZmlsdGVyIGJ5XG4gKiBAcmV0dXJucyB7S2V5VmFsdWVbXX0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbHRlcmVkIGFycmF5IG9mIGl0ZW1zXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuICBwYXJzZVNlYXJjaFJlc3VsdHMocmVzdWx0czogS2V5VmFsdWVbXSwgc2VhcmNoOiBzdHJpbmcpOiBLZXlWYWx1ZVtdIHtcbiAgICByZXR1cm4gcmVzdWx0cy5maWx0ZXIoKGl0ZW06IEtleVZhbHVlKSA9PlxuICAgICAgT2JqZWN0LnZhbHVlcyhpdGVtKS5zb21lKHZhbHVlID0+XG4gICAgICAgICAgdmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKChzZWFyY2ggYXMgc3RyaW5nKT8udG9Mb3dlckNhc2UoKSlcbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmV0Y2hlcyBkYXRhIGZyb20gYSByZXF1ZXN0IHNvdXJjZS5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyZWQgc291cmNlIGZ1bmN0aW9uIG9yIFVSTCwgcHJvY2Vzc2VzIGl0LFxuICogYW5kIHVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGRhdGEgc3RhdGUuIFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBpbml0aWFsIGRhdGEgbG9hZGluZ1xuICogYW5kIHN1YnNlcXVlbnQgcmVmcmVzaCBvcGVyYXRpb25zIHdoZW4gdXNpbmcgYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UgcmF0aGVyIHRoYW4gYSBtb2RlbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gV2hldGhlciB0byBmb3JjZSBhIHJlZnJlc2ggZXZlbiBpZiBkYXRhIGFscmVhZHkgZXhpc3RzXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBUaGUgc3RhcnRpbmcgaW5kZXggZm9yIHBhZ2luYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXRyaWV2ZVxuICogQHJldHVybnMge1Byb21pc2U8S2V5VmFsdWVbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmZXRjaGVkIGRhdGFcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5hc3luYyBnZXRGcm9tUmVxdWVzdChmb3JjZTogYm9vbGVhbiA9IGZhbHNlLCBzdGFydDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxLZXlWYWx1ZVtdPiB7XG4gIGxldCByZXF1ZXN0OiBLZXlWYWx1ZVtdID0gW107XG4gIGlmKCF0aGlzLmRhdGE/Lmxlbmd0aCB8fCBmb3JjZSB8fCAodGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcpPy5sZW5ndGggfHwgISEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgLy8gKHNlbGYuZGF0YSBhcyBMaXN0SXRlbVtdKSA9IFtdO1xuICAgIGlmKCEodGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcpPy5sZW5ndGggJiYgISh0aGlzLnNlYXJjaFZhbHVlIGFzIElGaWx0ZXJRdWVyeSkpIHtcbiAgICAgIGlmKCF0aGlzLnNvdXJjZSAmJiAhdGhpcy5kYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnTm8gZGF0YSBhbmQgc291cmNlIHBhc3NlZCB0byBpbmZpbml0ZSBsaXN0Jyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgaWYodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBGdW5jdGlvbilcbiAgICAgICAgcmVxdWVzdCA9IGF3YWl0IHRoaXMuc291cmNlKCk7XG5cbiAgICAgIGlmKCFBcnJheS5pc0FycmF5KHJlcXVlc3QpKVxuICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdD8uWydyZXNwb25zZSddPy5bJ2RhdGEnXSB8fCByZXF1ZXN0Py5bJ3Jlc3VsdHMnXSB8fCBbXTtcbiAgICAgIHRoaXMuZGF0YSA9IFsuLi4gYXdhaXQgdGhpcy5wYXJzZVJlc3VsdChyZXF1ZXN0KV07XG4gICAgICBpZih0aGlzLmRhdGE/Lmxlbmd0aClcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSA/XG4gICAgICAgICAgKHRoaXMuaXRlbXMgfHwgW10pLmNvbmNhdChbLi4udGhpcy5kYXRhLnNsaWNlKHN0YXJ0LCBsaW1pdCldKSA6IFsuLi5yZXF1ZXN0LnNsaWNlKHN0YXJ0LCBsaW1pdCkgYXMgS2V5VmFsdWVbXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMucGFyc2VTZWFyY2hSZXN1bHRzKHRoaXMuZGF0YSBhcyBbXSwgdGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuZGF0YTtcbiAgICB9XG4gIH1cblxuICBpZih0aGlzLmxvYWRNb3JlRGF0YSAmJiB0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuUEFHSU5BVEVEKVxuICAgIHRoaXMuZ2V0TW9yZURhdGEodGhpcy5kYXRhPy5sZW5ndGggfHwgMCk7XG4gIHJldHVybiB0aGlzLmRhdGEgfHwgW10gYXMgS2V5VmFsdWVbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmV0Y2hlcyBkYXRhIGZyb20gYSBtb2RlbCBzb3VyY2UuXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgZGF0YSBmcm9tIHRoZSBjb25maWd1cmVkIG1vZGVsIHVzaW5nIGl0cyBwYWdpbmF0aW9uIG9yIGZpbmQgbWV0aG9kcyxcbiAqIHByb2Nlc3NlcyBpdCwgYW5kIHVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGRhdGEgc3RhdGUuIFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBpbml0aWFsXG4gKiBkYXRhIGxvYWRpbmcgYW5kIHN1YnNlcXVlbnQgcmVmcmVzaCBvcGVyYXRpb25zIHdoZW4gdXNpbmcgYSBtb2RlbCBhcyB0aGUgZGF0YSBzb3VyY2UuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIFdoZXRoZXIgdG8gZm9yY2UgYSByZWZyZXNoIGV2ZW4gaWYgZGF0YSBhbHJlYWR5IGV4aXN0c1xuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gVGhlIHN0YXJ0aW5nIGluZGV4IGZvciBwYWdpbmF0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0cmlldmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEtleVZhbHVlW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZmV0Y2hlZCBkYXRhXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuYXN5bmMgZ2V0RnJvbU1vZGVsKGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEtleVZhbHVlW10+IHtcbiAgbGV0IGRhdGEgPSBbIC4uLiB0aGlzLmRhdGEgfHwgW11dO1xuICBsZXQgcmVxdWVzdDogS2V5VmFsdWVbXSA9IFtdO1xuXG4gIC8vIGdldHRpbmcgbW9kZWwgcmVwb3NpdG9yeVxuICBpZighdGhpcy5fcmVwb3NpdG9yeSlcbiAgICB0aGlzLl9yZXBvc2l0b3J5ID0gdGhpcy5yZXBvc2l0b3J5O1xuICBjb25zdCByZXBvID0gdGhpcy5fcmVwb3NpdG9yeSBhcyBEZWNhZlJlcG9zaXRvcnk8TW9kZWw+O1xuICBpZighdGhpcy5kYXRhPy5sZW5ndGggfHwgZm9yY2UgfHwgKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKT8ubGVuZ3RoIHx8ICEhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgIHRyeSB7XG4gICAgIGlmKCEodGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcpPy5sZW5ndGggJiYgISh0aGlzLnNlYXJjaFZhbHVlIGFzIElGaWx0ZXJRdWVyeSkpIHtcbiAgICAgICAgKHRoaXMuZGF0YSBhcyBLZXlWYWx1ZVtdKSA9IFtdO1xuICAgICAgICAvLyBjb25zdCByYXdRdWVyeSA9IHRoaXMucGFyc2VRdWVyeShzZWxmLm1vZGVsIGFzIFJlcG9zaXRvcnk8TW9kZWw+LCBzdGFydCwgbGltaXQpO1xuICAgICAgICAvLyByZXF1ZXN0ID0gdGhpcy5wYXJzZVJlc3VsdChhd2FpdCAodGhpcy5tb2RlbCBhcyBhbnkpPy5wYWdpbmF0ZShzdGFydCwgbGltaXQpKTtcbiAgICAgICAgICBpZighdGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yID0gYXdhaXQgcmVwb1xuICAgICAgICAgICAgICAuc2VsZWN0KClcbiAgICAgICAgICAgICAgLm9yZGVyQnkoW3RoaXMucGsgYXMga2V5b2YgTW9kZWwsIHRoaXMuc29ydERpcmVjdGlvbl0pXG4gICAgICAgICAgICAgIC5wYWdpbmF0ZSh0aGlzLmxpbWl0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVxdWVzdCA9IGF3YWl0IHRoaXMucGFyc2VSZXN1bHQodGhpcy5wYWdpbmF0b3IpO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpZighdGhpcy5pbmRleGVzKVxuICAgICAgICAgIHRoaXMuaW5kZXhlcyA9IChPYmplY3QudmFsdWVzKHRoaXMubWFwcGVyKSB8fCBbdGhpcy5wa10pO1xuXG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMucGFyc2VDb25kaXRpb25zKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyIHwgSUZpbHRlclF1ZXJ5KTtcbiAgICAgICAgcmVxdWVzdCA9IGF3YWl0IHRoaXMucGFyc2VSZXN1bHQoYXdhaXQgcmVwby5xdWVyeShjb25kaXRpb24sICh0aGlzLnNvcnRCeSB8fCB0aGlzLnBrKSBhcyBrZXlvZiBNb2RlbCwgdGhpcy5zb3J0RGlyZWN0aW9uKSk7XG4gICAgICAgIGRhdGEgPSBbXTtcbiAgICAgIH1cbiAgICAgIGRhdGEgPSB0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUgPyBbLi4uIChkYXRhKS5jb25jYXQocmVxdWVzdCldIDogWy4uLnJlcXVlc3RdO1xuICAgIH0gY2F0Y2goZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKChlcnJvciBhcyBFcnJvcik/Lm1lc3NhZ2UgfHwgYFVuYWJsZSB0byBmaW5kICR7dGhpcy5tb2RlbH0gb24gcmVnaXN0cnkuIFJldHVybiBlbXB0eSBhcnJheSBmcm9tIGNvbXBvbmVudGApO1xuICAgIH1cbiAgfVxuXG4gIGlmKGRhdGE/Lmxlbmd0aCkge1xuICAgIGlmKHRoaXMuc2VhcmNoVmFsdWUpIHtcbiAgICAgIHRoaXMuaXRlbXMgPSBbLi4uZGF0YV07XG4gICAgICBpZih0aGlzLml0ZW1zPy5sZW5ndGggPD0gdGhpcy5saW1pdClcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pdGVtcyA9IFsuLi5kYXRhXTtcbiAgICB9XG4gIH1cbiAgaWYodGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLlBBR0lOQVRFRCAmJiB0aGlzLnBhZ2luYXRvcilcbiAgICAgIHRoaXMuZ2V0TW9yZURhdGEodGhpcy5wYWdpbmF0b3IudG90YWwpO1xuICByZXR1cm4gZGF0YSB8fCBbXSBhcyBLZXlWYWx1ZVtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBzZWFyY2ggdmFsdWVzIG9yIGZpbHRlciBxdWVyaWVzIGludG8gZGF0YWJhc2UgY29uZGl0aW9ucy5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgc2VhcmNoIGlucHV0IG9yIGNvbXBsZXggZmlsdGVyIHF1ZXJpZXMgaW50byBDb25kaXRpb24gb2JqZWN0c1xuICogdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGF0YWJhc2UgcXVlcnlpbmcuIEhhbmRsZXMgYm90aCBzaW1wbGUgc3RyaW5nL251bWJlciBzZWFyY2hlc1xuICogYWNyb3NzIGluZGV4ZWQgZmllbGRzIGFuZCBjb21wbGV4IGZpbHRlciBxdWVyaWVzIHdpdGggbXVsdGlwbGUgY3JpdGVyaWEuXG4gKlxuICogRm9yIHNpbXBsZSBzZWFyY2hlcyAoc3RyaW5nL251bWJlcik6XG4gKiAtIENyZWF0ZXMgY29uZGl0aW9ucyB0aGF0IHNlYXJjaCBhY3Jvc3MgYWxsIGluZGV4ZWQgZmllbGRzXG4gKiAtIFVzZXMgZXF1YWxpdHkgZm9yIG51bWVyaWMgdmFsdWVzIGFuZCByZWdleCBmb3Igc3RyaW5nIHZhbHVlc1xuICogLSBDb21iaW5lcyBjb25kaXRpb25zIHdpdGggT1IgbG9naWMgdG8gc2VhcmNoIG11bHRpcGxlIGZpZWxkc1xuICpcbiAqIEZvciBjb21wbGV4IGZpbHRlciBxdWVyaWVzOlxuICogLSBQcm9jZXNzZXMgZWFjaCBmaWx0ZXIgaXRlbSB3aXRoIGl0cyBzcGVjaWZpYyBjb25kaXRpb24gdHlwZVxuICogLSBTdXBwb3J0cyBFcXVhbCwgTm90IEVxdWFsLCBDb250YWlucywgTm90IENvbnRhaW5zLCBHcmVhdGVyIFRoYW4sIExlc3MgVGhhblxuICogLSBVcGRhdGVzIHNvcnQgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgZmlsdGVyIHF1ZXJ5XG4gKiAtIENvbWJpbmVzIG11bHRpcGxlIGZpbHRlciBjb25kaXRpb25zIHdpdGggT1IgbG9naWNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IElGaWx0ZXJRdWVyeX0gdmFsdWUgLSBUaGUgc2VhcmNoIHZhbHVlIG9yIGZpbHRlciBxdWVyeSBvYmplY3RcbiAqIEByZXR1cm5zIHtDb25kaXRpb248TW9kZWw+fSBBIENvbmRpdGlvbiBvYmplY3QgZm9yIGRhdGFiYXNlIHF1ZXJ5aW5nXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5wYXJzZUNvbmRpdGlvbnModmFsdWU6IHN0cmluZyB8IG51bWJlciB8IElGaWx0ZXJRdWVyeSk6IENvbmRpdGlvbjxNb2RlbD4ge1xuICBsZXQgX2NvbmRpdGlvbjogQ29uZGl0aW9uPE1vZGVsPjtcbiAgaWYodHlwZW9mIHZhbHVlID09PSBQcmltaXRpdmVzLlNUUklORyB8fCB0eXBlb2YgdmFsdWUgPT09IFByaW1pdGl2ZXMuTlVNQkVSKSB7XG4gICAgX2NvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KHRoaXMucGsgYXMga2V5b2YgTW9kZWwpLmVxKCFpc05hTih2YWx1ZSBhcyBudW1iZXIpID8gTnVtYmVyKHZhbHVlKSA6IHZhbHVlKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHRoaXMuaW5kZXhlcykge1xuICAgICAgICBpZihpbmRleCA9PT0gdGhpcy5waylcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IG9yQ29uZGl0aW9uO1xuICAgICAgICBpZighaXNOYU4odmFsdWUgYXMgbnVtYmVyKSkge1xuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmVxKE51bWJlcih2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLnJlZ2V4cCh2YWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIF9jb25kaXRpb24gPSBfY29uZGl0aW9uLm9yKG9yQ29uZGl0aW9uKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qge3F1ZXJ5LCBzb3J0fSA9IHZhbHVlIGFzIElGaWx0ZXJRdWVyeTtcbiAgICBfY29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4odGhpcy5wayBhcyBrZXlvZiBNb2RlbCkuZGlmKCdudWxsJyk7XG5cbiAgICBpZihxdWVyeT8ubGVuZ3RoKVxuICAgICAgX2NvbmRpdGlvbiA9IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIENvbmRpdGlvbjxNb2RlbD47XG5cbiAgICAocXVlcnkgfHwgW10pLmZvckVhY2goKGl0ZW06IElGaWx0ZXJRdWVyeUl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHt2YWx1ZSwgY29uZGl0aW9uLCBpbmRleH0gPSBpdGVtO1xuICAgICAgbGV0IHZhbCA9IHZhbHVlIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmKGluZGV4ID09PSB0aGlzLnBrIHx8ICFpc05hTih2YWwgYXMgbnVtYmVyKSlcbiAgICAgICAgdmFsID0gTnVtYmVyKHZhbCk7XG4gICAgICBsZXQgb3JDb25kaXRpb247XG4gICAgICBzd2l0Y2ggKGNvbmRpdGlvbikge1xuICAgICAgICBjYXNlIFwiRXF1YWxcIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5lcSh2YWwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTm90IEVxdWFsXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZGlmKHZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJOb3QgQ29udGFpbnNcIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9ICFDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkucmVnZXhwKG5ldyBSZWdFeHAoYF4oPyEuKiR7dmFsfSkuKiRgKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJDb250YWluc1wiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLnJlZ2V4cCh2YWwgYXMgc3RyaW5nKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkdyZWF0ZXIgVGhhblwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmd0ZSh2YWwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTGVzcyBUaGFuXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkubHRlKHZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBfY29uZGl0aW9uID0gKCFfY29uZGl0aW9uID9cbiAgICAgICAgb3JDb25kaXRpb24gOiBfY29uZGl0aW9uLmFuZChvckNvbmRpdGlvbiBhcyB1bmtub3duIGFzIENvbmRpdGlvbjxNb2RlbD4pKSBhcyBDb25kaXRpb248TW9kZWw+O1xuICAgIH0pO1xuXG4gICAgdGhpcy5zb3J0QnkgPSBzb3J0Py52YWx1ZSBhcyBrZXlvZiBNb2RlbCB8fCB0aGlzLnBrO1xuICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IHNvcnQ/LmRpcmVjdGlvbiB8fCB0aGlzLnNvcnREaXJlY3Rpb247XG4gIH1cbiAgY29uc29sZS5sb2coX2NvbmRpdGlvbik7XG4gIHJldHVybiBfY29uZGl0aW9uIGFzIENvbmRpdGlvbjxNb2RlbD47XG5cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHF1ZXJ5IHJlc3VsdHMgaW50byBhIHN0YW5kYXJkaXplZCBmb3JtYXQuXG4gKiBAc3VtbWFyeSBIYW5kbGVzIGRpZmZlcmVudCByZXN1bHQgZm9ybWF0cyBmcm9tIHZhcmlvdXMgZGF0YSBzb3VyY2VzLCBleHRyYWN0aW5nXG4gKiBwYWdpbmF0aW9uIGluZm9ybWF0aW9uIHdoZW4gYXZhaWxhYmxlIGFuZCBhcHBseWluZyBhbnkgY29uZmlndXJlZCBkYXRhIG1hcHBpbmcuXG4gKiBUaGlzIGVuc3VyZXMgY29uc2lzdGVudCBkYXRhIHN0cnVjdHVyZSByZWdhcmRsZXNzIG9mIHRoZSBzb3VyY2UuXG4gKlxuICogQHByb3RlY3RlZFxuICogQHBhcmFtIHtLZXlWYWx1ZVtdIHwgUGFnaW5hdG9yfSByZXN1bHQgLSBUaGUgcmF3IHF1ZXJ5IHJlc3VsdFxuICogQHJldHVybnMge0tleVZhbHVlW119IFRoZSBwcm9jZXNzZWQgYXJyYXkgb2YgaXRlbXNcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5wcm90ZWN0ZWQgYXN5bmMgcGFyc2VSZXN1bHQocmVzdWx0OiBLZXlWYWx1ZVtdIHwgUGFnaW5hdG9yPE1vZGVsPik6IFByb21pc2U8S2V5VmFsdWVbXT4ge1xuICBpZighQXJyYXkuaXNBcnJheShyZXN1bHQpICYmICgncGFnZScgaW4gcmVzdWx0ICYmICd0b3RhbCcgaW4gcmVzdWx0KSkge1xuICAgIGNvbnN0IHBhZ2luYXRvciA9IHJlc3VsdCBhcyBQYWdpbmF0b3I8TW9kZWw+O1xuICAgIHJlc3VsdCA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKHRoaXMucGFnZSk7XG4gICAgLy8gVE9ETzogQ2hhZ2UgZm9yIHJlc3VsdC50b3RhbDtcbiAgICB0aGlzLmdldE1vcmVEYXRhKHBhZ2luYXRvci50b3RhbCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5nZXRNb3JlRGF0YSgocmVzdWx0IGFzIEtleVZhbHVlW10pPy5sZW5ndGggfHwgMCk7XG4gIH1cbiAgcmV0dXJuIChPYmplY3Qua2V5cyh0aGlzLm1hcHBlciB8fCB7fSkubGVuZ3RoKSA/XG4gICAgdGhpcy5tYXBSZXN1bHRzKHJlc3VsdCkgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgcGFnaW5hdGlvbiBzdGF0ZSBiYXNlZCBvbiBkYXRhIGxlbmd0aC5cbiAqIEBzdW1tYXJ5IENhbGN1bGF0ZXMgd2hldGhlciBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBob3cgbWFueSBwYWdlcyBleGlzdFxuICogYmFzZWQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBhbmQgdGhlIGNvbmZpZ3VyZWQgbGltaXQgcGVyIHBhZ2UuXG4gKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gY29udHJvbCBwYWdpbmF0aW9uIFVJIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcgYmVoYXZpb3IuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5nZXRNb3JlRGF0YShsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUpIHtcbiAgICBpZih0aGlzLnBhZ2luYXRvcilcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCAqIHRoaXMubGltaXQ7XG4gICAgaWYobGVuZ3RoIDw9IHRoaXMubGltaXQpIHtcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZXMgPSBNYXRoLmZsb29yKGxlbmd0aCAvIHRoaXMubGltaXQpO1xuICAgICAgaWYoKHRoaXMucGFnZXMgKiB0aGlzLmxpbWl0KSA8IGxlbmd0aClcbiAgICAgICAgdGhpcy5wYWdlcyArPSAxO1xuICAgICAgaWYodGhpcy5wYWdlcyA9PT0gMSlcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5wYWdlcyA9IGxlbmd0aDtcbiAgICBpZih0aGlzLnBhZ2VzID09PSAxKVxuICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIGEgc2luZ2xlIGl0ZW0gdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWFwcGVyLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyBhIGRhdGEgaXRlbSBhY2NvcmRpbmcgdG8gdGhlIG1hcHBpbmcgY29uZmlndXJhdGlvbixcbiAqIGV4dHJhY3RpbmcgbmVzdGVkIHByb3BlcnRpZXMgYW5kIGZvcm1hdHRpbmcgdmFsdWVzIGFzIG5lZWRlZC4gVGhpcyBhbGxvd3NcbiAqIHRoZSBjb21wb25lbnQgdG8gZGlzcGxheSBkYXRhIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIGhvdyBpdCdzIHN0b3JlZC5cbiAqXG4gKiBAcHJvdGVjdGVkXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBpdGVtIC0gVGhlIGl0ZW0gdG8gbWFwXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBtYXBwZXIgLSBUaGUgbWFwcGluZyBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBbcHJvcHNdIC0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGluY2x1ZGVcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZX0gVGhlIG1hcHBlZCBpdGVtXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucHJvdGVjdGVkIGl0ZW1NYXBwZXIoaXRlbTogS2V5VmFsdWUsIG1hcHBlcjogS2V5VmFsdWUsIHByb3BzPzogS2V5VmFsdWUpOiBLZXlWYWx1ZSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwZXIpLnJlZHVjZSgoYWNjdW06IEtleVZhbHVlLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBhcnJheVZhbHVlID0gdmFsdWUuc3BsaXQoJy4nKTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcnJheVZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB2YWx1ZSA9IGl0ZW0/Llt2YWx1ZV0gfHwgdmFsdWU7XG4gICAgICAgIGlmKGlzVmFsaWREYXRlKHZhbHVlKSlcbiAgICAgICAgICB2YWx1ZSA9IGAke2Zvcm1hdERhdGUodmFsdWUpfWA7XG4gICAgICAgIGFjY3VtW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB2YWw7XG5cbiAgICAgICAgZm9yIChjb25zdCBfdmFsdWUgb2YgYXJyYXlWYWx1ZSlcbiAgICAgICAgICB2YWwgPSAhdmFsXG4gICAgICAgICAgICA/IGl0ZW1bX3ZhbHVlXVxuICAgICAgICAgICAgOiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHZhbCkgOiB2YWwpW192YWx1ZV07XG5cblxuICAgICAgICBpZiAoaXNWYWxpZERhdGUobmV3IERhdGUodmFsKSkpXG4gICAgICAgICAgdmFsID0gYCR7Zm9ybWF0RGF0ZSh2YWwpfWA7XG5cbiAgICAgICAgYWNjdW1ba2V5XSA9IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIGFjY3VtKTtcbiAgfSwge30pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIGFsbCByZXN1bHQgaXRlbXMgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWFwcGVyLlxuICogQHN1bW1hcnkgQXBwbGllcyB0aGUgaXRlbU1hcHBlciB0byBlYWNoIGl0ZW0gaW4gdGhlIHJlc3VsdCBzZXQsIGFkZGluZ1xuICogY29tbW9uIHByb3BlcnRpZXMgbGlrZSBvcGVyYXRpb25zIGFuZCByb3V0ZSBpbmZvcm1hdGlvbi4gVGhpcyB0cmFuc2Zvcm1zXG4gKiB0aGUgcmF3IGRhdGEgaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSBsaXN0IGl0ZW0gY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0ge0tleVZhbHVlW119IGRhdGEgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gbWFwXG4gKiBAcmV0dXJucyB7S2V5VmFsdWVbXX0gVGhlIGFycmF5IG9mIG1hcHBlZCBpdGVtc1xuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbiAgbWFwUmVzdWx0cyhkYXRhOiBLZXlWYWx1ZVtdKTogS2V5VmFsdWVbXSB7XG4gICAgaWYoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKVxuICAgICAgcmV0dXJuIFtdO1xuICAgIC8vIHBhc3NpbmcgdWlkIGFzIHByb3AgdG8gbWFwcGVyXG4gICAgdGhpcy5tYXBwZXIgPSB7Li4uIHRoaXMubWFwcGVyLCAuLi4ge3VpZDogdGhpcy5wa319O1xuICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBvcGVyYXRpb25zOiB0aGlzLm9wZXJhdGlvbnMsXG4gICAgICByb3V0ZTogdGhpcy5yb3V0ZSxcbiAgICAgIC4uLiAgT2JqZWN0LmtleXModGhpcy5pdGVtKS5yZWR1Y2UoKGFjYzogS2V5VmFsdWUsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gdGhpcy5pdGVtW2tleV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSksXG4gICAgICAvLyAuLi4gKCF0aGlzLml0ZW0ucmVuZGVyID8ge30gOiAgT2JqZWN0LmtleXModGhpcy5pdGVtKS5yZWR1Y2UoKGFjYzogS2V5VmFsdWUsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAvLyAgIGFjY1trZXldID0gdGhpcy5pdGVtW2tleSBhcyBrZXlvZiBJTGlzdEl0ZW1Qcm9wXTtcbiAgICAgIC8vICAgcmV0dXJuIGFjYztcbiAgICAgIC8vIH0sIHt9KSlcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YS5yZWR1Y2UoKGFjY3VtOiBLZXlWYWx1ZVtdLCBjdXJyKSA9PiB7XG4gICAgICAgIGFjY3VtLnB1c2goey4uLiB0aGlzLml0ZW1NYXBwZXIoY3VyciwgdGhpcy5tYXBwZXIgYXMgS2V5VmFsdWUsIHByb3BzKSwgLi4uIHtwazogdGhpcy5wa319KTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxufVxuXG4iLCJcbkBpZihzaG93UmVmcmVzaGVyKSB7XG4gIDxpb24tcmVmcmVzaGVyIHNsb3Q9XCJmaXhlZFwiIFtwdWxsRmFjdG9yXT1cIjFcIiBbcHVsbE1pbl09XCIxMDBcIiBbcHVsbE1heF09XCIyMDBcIiAoaW9uUmVmcmVzaCk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAgICA8aW9uLXJlZnJlc2hlci1jb250ZW50IC8+XG4gIDwvaW9uLXJlZnJlc2hlcj5cbn1cblxuQGlmKHNob3dTZWFyY2hiYXIpIHtcbiAgQGlmKG1vZGVsICYmIGVuYWJsZUZpbHRlcikge1xuICAgIDxuZ3gtZGVjYWYtZmlsdGVyXG4gICAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgICAgW3NvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiXG4gICAgICBbZGlzYWJsZVNvcnRdPVwiZGlzYWJsZVNvcnRcIlxuICAgICAgKGZpbHRlckV2ZW50KT1cImhhbmRsZUZpbHRlcigkZXZlbnQpXCJcbiAgICAgIChzZWFyY2hFdmVudCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiXG4gICAgLz5cbiAgfSBAZWxzZSB7XG4gICAgPG5neC1kZWNhZi1zZWFyY2hiYXIgW2VtaXRFdmVudFRvV2luZG93XT1cImZhbHNlXCIgW2RlYm91bmNlXT1cIjUwMFwiIChzZWFyY2hFdmVudCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiIC8+XG4gIH1cbn1cblxuQGlmKGRhdGE/Lmxlbmd0aCkge1xuICA8aW9uLWxpc3QgW2luc2V0XT1cImluc2V0XCIgW2xpbmVzXT1cImxpbmVzXCIgI2NvbXBvbmVudD5cbiAgICBAaWYoaXRlbT8udGFnKSB7XG4gICAgICBAZm9yKGNoaWxkIG9mIGl0ZW1zOyB0cmFjayB0cmFja0l0ZW1GbigkaW5kZXgsIGNoaWxkKSkge1xuICAgICAgICA8bmd4LWRlY2FmLWNvbXBvbmVudC1yZW5kZXJlclxuICAgICAgICAgIFt0YWddPVwiaXRlbS50YWdcIlxuICAgICAgICAgIChsaXN0ZW5FdmVudCk9XCJoYW5kbGVFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICBbZ2xvYmFsc109J3tcbiAgICAgICAgICAgIGl0ZW06IGNoaWxkLFxuICAgICAgICAgICAgbWFwcGVyOiBtYXBwZXIsXG4gICAgICAgICAgICByb3V0ZTogcm91dGVcbiAgICAgICAgICB9Jz5cbiAgICAgICAgICA8L25neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXI+XG4gICAgICAgIH1cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICB9XG4gIDwvaW9uLWxpc3Q+XG5cbiAgQGlmKGxvYWRNb3JlRGF0YSkge1xuICAgIEBpZihwYWdlcyA+IDAgJiYgdHlwZSA9PT0gJ3BhZ2luYXRlZCcgJiYgIXNlYXJjaFZhbHVlPy5sZW5ndGgpIHtcbiAgICAgIDxuZ3gtZGVjYWYtcGFnaW5hdGlvblxuICAgICAgICBbdG90YWxQYWdlc109XCJwYWdlc1wiXG4gICAgICAgIFtjdXJyZW50XT1cInBhZ2VcIlxuICAgICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVQYWdpbmF0ZSgkZXZlbnQpXCJcbiAgICAgIC8+XG5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxpb24taW5maW5pdGUtc2Nyb2xsXG4gICAgICAgIFtjbGFzc109XCJzZWFyY2hWYWx1ZT8ubGVuZ3RoID8gJ2RjZi1oaWRkZW4nIDogJydcIlxuICAgICAgICBbcG9zaXRpb25dPVwic2Nyb2xsUG9zaXRpb25cIlxuICAgICAgICBbdGhyZXNob2xkXT1cInNjcm9sbFRocmVzaG9sZFwiXG4gICAgICAgIChpb25JbmZpbml0ZSk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAgICAgICAgPGlvbi1pbmZpbml0ZS1zY3JvbGwtY29udGVudCBbbG9hZGluZ1NwaW5uZXJdPVwibG9hZGluZ1NwaW5uZXJcIiBbbG9hZGluZ1RleHRdPVwibG9hZGluZ1RleHRcIiAvPlxuICAgICAgPC9pb24taW5maW5pdGUtc2Nyb2xsPlxuICAgIH1cbiAgfVxufSBAZWxzZSB7XG4gIEBpZihyZWZyZXNoaW5nKSB7XG4gICAgPGlvbi1pdGVtICpuZ0Zvcj1cImxldCBza2wgb2Ygc2tlbGV0b25EYXRhXCI+XG4gICAgICA8aW9uLXRodW1ibmFpbCBzbG90PVwic3RhcnRcIj5cbiAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgIDwvaW9uLXRodW1ibmFpbD5cbiAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImRhdGVcIiBzdHlsZT1cIndpZHRoOiAyMCU7XCI+PGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD48L2lvbi10ZXh0PlxuICAgICAgPC9pb24tbGFiZWw+XG4gICAgPC9pb24taXRlbT5cbiAgfSBAZWxzZSB7XG4gICAgQGlmKCFzZWFyY2hWYWx1ZT8ubGVuZ3RoKSB7XG4gICAgICA8bmd4LWRlY2FmLWVtcHR5LXN0YXRlXG4gICAgICAgIFt0aXRsZV09XCIobG9jYWxlICsgJy4nKyBlbXB0eS50aXRsZSkgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbc3VidGl0bGVdPVwiKGxvY2FsZSArICcuJysgZW1wdHkuc3VidGl0bGUpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2J1dHRvblRleHRdPVwiZW1wdHkuc2hvd0J1dHRvbiA/IChsb2NhbGUgKyAnLicrIGVtcHR5LmJ1dHRvbiB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgIFtidXR0b25MaW5rXT1cImVtcHR5LnNob3dCdXR0b24gPyBlbXB0eS5yb3V0ZSA6ICcnXCJcbiAgICAgIC8+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmd4LWRlY2FmLWVtcHR5LXN0YXRlXG4gICAgICAgIGljb249XCJzZWFyY2gtb3V0bGluZVwiXG4gICAgICAgIG5nQ2xhc3M9XCJlbXB0eS1zZWFyY2hcIlxuICAgICAgICBbdHJhbnNsYXRhYmxlXT1cInRydWVcIlxuICAgICAgICB0aXRsZT1cInNlYXJjaC50aXRsZVwiXG4gICAgICAgIHN1YnRpdGxlPVwic2VhcmNoLnN1YnRpdGxlXCJcbiAgICAgICAgW3NlYXJjaFZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgIC8+XG4gICAgfVxuICB9XG59XG5cbiJdfQ==