mmhglobal-dynamicform 1.2.3 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +14 -2
  2. package/esm2020/lib/directives/fieldelement.directive.mjs +16 -0
  3. package/esm2020/lib/directives/scrollbar.theme.directive.mjs +43 -0
  4. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +464 -0
  5. package/esm2020/lib/services/main.service.mjs +752 -0
  6. package/esm2020/lib/services/zcomponent.debug.service.mjs +621 -0
  7. package/esm2020/lib/services/zcomponent.service.mjs +81 -0
  8. package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +265 -0
  9. package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +67 -0
  10. package/esm2020/lib/uicontent/uicontent.component.mjs +41 -0
  11. package/esm2020/lib/uiheader/uiheader.component.mjs +66 -0
  12. package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +35 -0
  13. package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +37 -0
  14. package/{esm2015/lib/uipage/uipage.component.js → esm2020/lib/uipage/uipage.component.mjs} +12 -13
  15. package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +41 -0
  16. package/esm2020/lib/zbullet/zbullet.component.mjs +74 -0
  17. package/esm2020/lib/zbuttons/zbuttons.component.mjs +171 -0
  18. package/esm2020/lib/zcard/zcard.component.mjs +72 -0
  19. package/esm2020/lib/zchart/zchart.component.mjs +201 -0
  20. package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +166 -0
  21. package/esm2020/lib/zchip/zchip.component.mjs +121 -0
  22. package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +169 -0
  23. package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +60 -0
  24. package/esm2020/lib/zdaterange/zdaterange.component.mjs +70 -0
  25. package/esm2020/lib/zdatetime/dateParser.pipe.mjs +30 -0
  26. package/esm2020/lib/zdatetime/zdatetime.component.mjs +285 -0
  27. package/esm2020/lib/zdiv/zdiv.component.mjs +50 -0
  28. package/esm2020/lib/zdiv/zdiv.pipe.mjs +31 -0
  29. package/esm2020/lib/zform/zform.component.mjs +147 -0
  30. package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +49 -0
  31. package/esm2020/lib/zgauge/zgauge.component.mjs +148 -0
  32. package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +135 -0
  33. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +490 -0
  34. package/esm2020/lib/zgrid/zgrid.component.mjs +847 -0
  35. package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +17 -0
  36. package/esm2020/lib/zimg/zimg.component.mjs +121 -0
  37. package/esm2020/lib/zkcard/zkcard.component.mjs +367 -0
  38. package/esm2020/lib/zlabel/zlabel.component.mjs +62 -0
  39. package/esm2020/lib/zmfb/zmfb.component.mjs +215 -0
  40. package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +120 -0
  41. package/esm2020/lib/zmodal/zmodal.component.mjs +125 -0
  42. package/esm2020/lib/znumeric/znumeric.component.mjs +119 -0
  43. package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +352 -0
  44. package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +204 -0
  45. package/esm2020/lib/zreport/zreport.component.mjs +105 -0
  46. package/esm2020/lib/zreport/zreport.config.mjs +117 -0
  47. package/esm2020/lib/zscheduler/zscheduler.component.mjs +267 -0
  48. package/{esm2015/lib/zscheduler/zscheduler.toolbar.component.js → esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs} +55 -19
  49. package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +577 -0
  50. package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +35 -0
  51. package/esm2020/lib/ztab/ztab.component.mjs +187 -0
  52. package/esm2020/lib/ztab/ztab.pipe.mjs +26 -0
  53. package/esm2020/lib/ztext/ztext.component.mjs +297 -0
  54. package/esm2020/lib/ztextarea/ztextarea.component.mjs +109 -0
  55. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +57 -0
  56. package/esm2020/lib/ztree/ztree.component.mjs +380 -0
  57. package/esm2020/lib/ztreelist/ztreelist.component.mjs +544 -0
  58. package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +92 -0
  59. package/esm2020/lib/zudf/zudf.component.mjs +205 -0
  60. package/esm2020/lib/zunknown/zunknown.component.mjs +20 -0
  61. package/esm2020/lib/zupload/zupload.component.mjs +359 -0
  62. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +216 -0
  63. package/esm2020/mmhglobal-dynamicform.mjs +5 -0
  64. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  65. package/fesm2015/mmhglobal-dynamicform.mjs +10790 -0
  66. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -0
  67. package/fesm2020/mmhglobal-dynamicform.mjs +10779 -0
  68. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -0
  69. package/lib/directives/fieldelement.directive.d.ts +3 -0
  70. package/lib/directives/scrollbar.theme.directive.d.ts +3 -0
  71. package/lib/mmhglobal-dynamicform.module.d.ts +92 -0
  72. package/lib/services/main.service.d.ts +3 -0
  73. package/lib/services/zcomponent.debug.service.d.ts +8 -5
  74. package/lib/services/zcomponent.service.d.ts +7 -2
  75. package/lib/uiactionbutton/uiactionbutton.component.d.ts +3 -0
  76. package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +3 -0
  77. package/lib/uicontent/uicontent.component.d.ts +3 -0
  78. package/lib/uiheader/uiheader.component.d.ts +3 -0
  79. package/lib/uimenubutton/uimenubutton.component.d.ts +3 -0
  80. package/lib/uimenucontent/uimenucontent.component.d.ts +3 -0
  81. package/lib/uipage/uipage.component.d.ts +3 -0
  82. package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +3 -0
  83. package/lib/zbullet/zbullet.component.d.ts +3 -0
  84. package/lib/zbuttons/zbuttons.component.d.ts +3 -0
  85. package/lib/zcard/zcard.component.d.ts +3 -0
  86. package/lib/zchart/zchart.component.d.ts +3 -0
  87. package/lib/zcheckbox/zcheckbox.component.d.ts +3 -0
  88. package/lib/zchip/zchip.component.d.ts +3 -0
  89. package/lib/zcodeeditor/zcodeeditor.component.d.ts +3 -0
  90. package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +3 -0
  91. package/lib/zdaterange/zdaterange.component.d.ts +3 -0
  92. package/lib/zdatetime/dateParser.pipe.d.ts +3 -0
  93. package/lib/zdatetime/zdatetime.component.d.ts +3 -0
  94. package/lib/zdiv/zdiv.component.d.ts +3 -0
  95. package/lib/zdiv/zdiv.pipe.d.ts +3 -0
  96. package/lib/zform/zform.component.d.ts +3 -0
  97. package/lib/zformcontrol/zformcontrol.component.d.ts +3 -0
  98. package/lib/zgauge/zgauge.component.d.ts +3 -0
  99. package/lib/zgrid/date-range-cell-filter.component.d.ts +3 -0
  100. package/lib/zgrid/zgrid.binding.directive.d.ts +3 -0
  101. package/lib/zgrid/zgrid.component.d.ts +4 -1
  102. package/lib/zgrid/zgrid.popup.anchor-target.directive.d.ts +3 -0
  103. package/lib/zimg/zimg.component.d.ts +3 -0
  104. package/lib/zkcard/zkcard.component.d.ts +3 -0
  105. package/lib/zlabel/zlabel.component.d.ts +3 -0
  106. package/lib/zmfb/zmfb.component.d.ts +3 -0
  107. package/lib/zmodal/zmodal-mobile.component.d.ts +3 -0
  108. package/lib/zmodal/zmodal.component.d.ts +3 -0
  109. package/lib/znumeric/znumeric.component.d.ts +3 -0
  110. package/lib/zpostselectinput/zpostselectinput.component.d.ts +3 -0
  111. package/lib/zquerybuilder/zquerybuilder.component.d.ts +3 -0
  112. package/lib/zreport/zreport.component.d.ts +3 -0
  113. package/lib/zreport/zreport.config.d.ts +3 -0
  114. package/lib/zscheduler/zscheduler.component.d.ts +3 -0
  115. package/lib/zscheduler/zscheduler.toolbar.component.d.ts +3 -0
  116. package/lib/zselectmultiple/zselectmultiple.component.d.ts +3 -0
  117. package/lib/zselectmultiple/zselectmultiple.directive.d.ts +3 -0
  118. package/lib/ztab/ztab.component.d.ts +3 -0
  119. package/lib/ztab/ztab.pipe.d.ts +3 -0
  120. package/lib/ztext/ztext.component.d.ts +3 -0
  121. package/lib/ztextarea/ztextarea.component.d.ts +3 -0
  122. package/lib/ztexteditor/ztexteditor.component.d.ts +3 -0
  123. package/lib/ztree/ztree.component.d.ts +3 -0
  124. package/lib/ztreelist/ztreelist.component.d.ts +3 -0
  125. package/lib/ztrendcard/ztrendcard.component.d.ts +3 -0
  126. package/lib/zudf/zudf.component.d.ts +3 -0
  127. package/lib/zunknown/zunknown.component.d.ts +3 -0
  128. package/lib/zupload/zupload.component.d.ts +3 -0
  129. package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +3 -0
  130. package/mmhglobal-dynamicform.d.ts +1 -2
  131. package/package.json +20 -11
  132. package/bundles/mmhglobal-dynamicform.umd.js +0 -11360
  133. package/bundles/mmhglobal-dynamicform.umd.js.map +0 -1
  134. package/bundles/mmhglobal-dynamicform.umd.min.js +0 -16
  135. package/bundles/mmhglobal-dynamicform.umd.min.js.map +0 -1
  136. package/esm2015/lib/directives/fieldelement.directive.js +0 -15
  137. package/esm2015/lib/directives/scrollbar.theme.directive.js +0 -42
  138. package/esm2015/lib/mmhglobal-dynamicform.module.js +0 -314
  139. package/esm2015/lib/services/main.service.js +0 -766
  140. package/esm2015/lib/services/zcomponent.debug.service.js +0 -626
  141. package/esm2015/lib/services/zcomponent.service.js +0 -167
  142. package/esm2015/lib/uiactionbutton/uiactionbutton.component.js +0 -271
  143. package/esm2015/lib/uiappmenucontent/uiappmenucontent.component.js +0 -69
  144. package/esm2015/lib/uicontent/uicontent.component.js +0 -41
  145. package/esm2015/lib/uiheader/uiheader.component.js +0 -65
  146. package/esm2015/lib/uimenubutton/uimenubutton.component.js +0 -40
  147. package/esm2015/lib/uimenucontent/uimenucontent.component.js +0 -34
  148. package/esm2015/lib/uivalidationmessage/uivalidationmessage.component.js +0 -39
  149. package/esm2015/lib/zbullet/zbullet.component.js +0 -71
  150. package/esm2015/lib/zbuttons/zbuttons.component.js +0 -168
  151. package/esm2015/lib/zcard/zcard.component.js +0 -68
  152. package/esm2015/lib/zchart/zchart.component.js +0 -199
  153. package/esm2015/lib/zcheckbox/zcheckbox.component.js +0 -158
  154. package/esm2015/lib/zchip/zchip.component.js +0 -117
  155. package/esm2015/lib/zcodeeditor/zcodeeditor.component.js +0 -163
  156. package/esm2015/lib/zcodeeditor/zcodeeditor.pipe.js +0 -56
  157. package/esm2015/lib/zdaterange/zdaterange.component.js +0 -63
  158. package/esm2015/lib/zdatetime/dateParser.pipe.js +0 -26
  159. package/esm2015/lib/zdatetime/zdatetime.component.js +0 -279
  160. package/esm2015/lib/zdiv/zdiv.component.js +0 -48
  161. package/esm2015/lib/zdiv/zdiv.pipe.js +0 -27
  162. package/esm2015/lib/zform/zform.component.js +0 -148
  163. package/esm2015/lib/zformcontrol/zformcontrol.component.js +0 -49
  164. package/esm2015/lib/zgauge/zgauge.component.js +0 -146
  165. package/esm2015/lib/zgrid/date-range-cell-filter.component.js +0 -102
  166. package/esm2015/lib/zgrid/zgrid.binding.directive.js +0 -493
  167. package/esm2015/lib/zgrid/zgrid.component.js +0 -834
  168. package/esm2015/lib/zgrid/zgrid.popup.anchor-target.directive.js +0 -16
  169. package/esm2015/lib/zimg/zimg.component.js +0 -123
  170. package/esm2015/lib/zkcard/zkcard.component.js +0 -372
  171. package/esm2015/lib/zlabel/zlabel.component.js +0 -59
  172. package/esm2015/lib/zmfb/zmfb.component.js +0 -215
  173. package/esm2015/lib/zmodal/zmodal-mobile.component.js +0 -119
  174. package/esm2015/lib/zmodal/zmodal.component.js +0 -130
  175. package/esm2015/lib/znumeric/znumeric.component.js +0 -114
  176. package/esm2015/lib/zpostselectinput/zpostselectinput.component.js +0 -345
  177. package/esm2015/lib/zquerybuilder/zquerybuilder.component.js +0 -196
  178. package/esm2015/lib/zreport/zreport.component.js +0 -104
  179. package/esm2015/lib/zreport/zreport.config.js +0 -115
  180. package/esm2015/lib/zscheduler/zscheduler.component.js +0 -268
  181. package/esm2015/lib/zselectmultiple/zselectmultiple.component.js +0 -565
  182. package/esm2015/lib/zselectmultiple/zselectmultiple.directive.js +0 -28
  183. package/esm2015/lib/ztab/ztab.component.js +0 -180
  184. package/esm2015/lib/ztab/ztab.pipe.js +0 -22
  185. package/esm2015/lib/ztext/ztext.component.js +0 -286
  186. package/esm2015/lib/ztextarea/ztextarea.component.js +0 -104
  187. package/esm2015/lib/ztexteditor/ztexteditor.component.js +0 -52
  188. package/esm2015/lib/ztree/ztree.component.js +0 -374
  189. package/esm2015/lib/ztreelist/ztreelist.component.js +0 -539
  190. package/esm2015/lib/ztrendcard/ztrendcard.component.js +0 -89
  191. package/esm2015/lib/zudf/zudf.component.js +0 -206
  192. package/esm2015/lib/zunknown/zunknown.component.js +0 -20
  193. package/esm2015/lib/zupload/zupload.component.js +0 -358
  194. package/esm2015/lib/zworkflowbuttons/zworkflowbuttons.component.js +0 -215
  195. package/esm2015/mmhglobal-dynamicform.js +0 -7
  196. package/fesm2015/mmhglobal-dynamicform.js +0 -10729
  197. package/fesm2015/mmhglobal-dynamicform.js.map +0 -1
  198. package/mmhglobal-dynamicform.metadata.json +0 -1
@@ -1,766 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- /********** Angular **********/
3
- import { Injectable } from '@angular/core';
4
- import { Router } from '@angular/router';
5
- /********** Ionic **********/
6
- import { ModalController, NavController } from '@ionic/angular';
7
- /********** Plugin **********/
8
- import { BehaviorSubject, of } from 'rxjs';
9
- import { tap, switchMap, map } from 'rxjs/operators';
10
- /********** Component & Service **********/
11
- import { MESSAGETYPE, AlertService, CacheService, FieldService, ResourceApiService, ToastService, WebApiService, ZComponentHelper, ZCoreService } from 'mmhglobal-zcore';
12
- import { ModalService } from 'mmhglobal-zmodal';
13
- // import { ModalService } from '../zmodal/modal.service';
14
- import { ZComponentDebugService } from './zcomponent.debug.service';
15
- import { ZmodalComponent } from '../zmodal/zmodal.component';
16
- import { ZmodalMobileComponent } from '../zmodal/zmodal-mobile.component';
17
- import * as i0 from "@angular/core";
18
- import * as i1 from "@angular/router";
19
- import * as i2 from "@ionic/angular";
20
- import * as i3 from "mmhglobal-zcore";
21
- import * as i4 from "mmhglobal-zmodal";
22
- import * as i5 from "./zcomponent.debug.service";
23
- // import { ZmodalPage } from '../zmodal/zmodal.page';
24
- // import { ZComponentHelper, ZComponentOutputEvent, ModalPageParams, ZGrid } from '../dynamicform/zcomponent.model';
25
- // import { ZGroup, ZField } from '../model/zgroup.model';
26
- export class MainService {
27
- constructor(router, modalCtrl, navController, alertService, cacheService, fieldService, resourceApiService, toastService, webApiService, zcoreService, modalService, debugService) {
28
- this.router = router;
29
- this.modalCtrl = modalCtrl;
30
- this.navController = navController;
31
- this.alertService = alertService;
32
- this.cacheService = cacheService;
33
- this.fieldService = fieldService;
34
- this.resourceApiService = resourceApiService;
35
- this.toastService = toastService;
36
- this.webApiService = webApiService;
37
- this.zcoreService = zcoreService;
38
- this.modalService = modalService;
39
- this.debugService = debugService;
40
- console.log('MainService constructor');
41
- this.oauthEnvironmentUrl = this.zcoreService.getEnvironment().e1OauthUrl + '/';
42
- }
43
- startUp() {
44
- console.log('At main.service (StartUp) ...');
45
- }
46
- setGroup(group) {
47
- this.group = group;
48
- this.fieldService.setGroup(group);
49
- this.resourceApiService.setGroup(group);
50
- this.webApiService.setGroup(group);
51
- const isDebugging = this.zcoreService.isDebugSession() || false;
52
- if (isDebugging) {
53
- this.debugService.onInitDebugger(group, this);
54
- }
55
- }
56
- getResourceServerData() {
57
- return this.resourceApiService.loadData();
58
- }
59
- getGroupFields(ctrlName, formType, group, propertyName) {
60
- return this.fieldService.getFormFieldCode(ctrlName, formType, group, propertyName);
61
- }
62
- initializeGroup(group, ctrlName, pageName, me) {
63
- if (me.subscription) {
64
- me.subscription.unsubscribe();
65
- }
66
- const resourceName = group.resourceURLName || ctrlName;
67
- group.resourceURLName = resourceName;
68
- Object.assign(group, {
69
- resourceURL: this.resourceApiService.getURL(resourceName),
70
- gridColumnFields: this.fieldService.getFormFieldCode(ctrlName, "FormField", null, null),
71
- ctrlScope: me,
72
- pageName,
73
- ctrlName,
74
- // createModelURL: "/create" + ctrlName.toLowerCase(),
75
- editModelURL: ctrlName.toLowerCase(),
76
- // listModelURL: "/list" + ctrlName.toLowerCase(),
77
- // formHeader: "...",
78
- isLoading: true,
79
- fields: [],
80
- zModel: {},
81
- zComponents: {},
82
- zData: {},
83
- subject: new BehaviorSubject(null),
84
- // form: null as FormGroup, // removed for bug fix.
85
- cancelButtonName: "Close",
86
- zButtonsCount: 0,
87
- // topRightActionButton: [],
88
- // onAction: this.onAction.bind(this),
89
- backNavigation: this.backNavigation.bind(this),
90
- historyBack: this.historyBack.bind(this),
91
- refreshPage: this.refreshPage,
92
- refreshGrid: this.refreshGrid.bind(this),
93
- updateModel: this.updateModel.bind(this),
94
- createModel: this.createModel.bind(this),
95
- cloneNewModel: this.cloneNewModel.bind(this),
96
- deleteModel: this.deleteModel.bind(this),
97
- newModel: this.newModel.bind(this),
98
- });
99
- me.subscription = group.subject.subscribe((event) => this.subjectEvent(event, group, me));
100
- return me.subscription;
101
- }
102
- getModel$(group, id) {
103
- const recId = id || group.referenceId;
104
- return this.webApiService
105
- .httpGet$(group.resourceURL + "/" + recId, null)
106
- .pipe(tap((zmodel) => {
107
- group.zModel = zmodel;
108
- if (group.parentReferenceField &&
109
- Object.keys(zmodel).indexOf(group.parentReferenceField) !== -1 &&
110
- !group.backNavigationPage.endsWith(".edit")) {
111
- group.backNavigationPage =
112
- group.backNavigationPage +
113
- "/" +
114
- zmodel[group.parentReferenceField].toString() +
115
- "/edit";
116
- }
117
- }), switchMap(() => {
118
- if (group.afterGetModelSuccess) {
119
- return this.afterGetModelSuccess(group);
120
- }
121
- return of([]);
122
- }));
123
- }
124
- canExit(form) {
125
- if (!form || !form.dirty) {
126
- return true;
127
- }
128
- if (form['skipDirtyCheck']) {
129
- return true;
130
- }
131
- return this.alertService
132
- .show("Data not save yet", "Are you sure want to discard the changes?", [
133
- "Cancel",
134
- "Discard Changes",
135
- ])
136
- .pipe(switchMap((reply) => {
137
- if (reply === "Discard Changes") {
138
- return of(true);
139
- }
140
- return of(false);
141
- }));
142
- // const replySub = new Subject<boolean>();
143
- // this.alertCtrl
144
- // .create({
145
- // header: "Data not save yet",
146
- // // subHeader: 'SubHeader statement here',
147
- // message: "Are you sure want to discard the changes?",
148
- // buttons: [
149
- // {
150
- // text: "Cancel",
151
- // role: "cancel",
152
- // cssClass: "secondary",
153
- // handler: () => {
154
- // replySub.next(false);
155
- // }
156
- // },
157
- // {
158
- // text: "Discard Changes",
159
- // cssClass: "warning",
160
- // handler: () => {
161
- // replySub.next(true);
162
- // }
163
- // }
164
- // ]
165
- // })
166
- // .then(alertElement => {
167
- // alertElement.present();
168
- // });
169
- // return replySub.asObservable().pipe(take(1));
170
- }
171
- // async openModalForm(modalParams: ModalPageParams) {
172
- // // console.log("openModalForm");
173
- // console.error(
174
- // "Please use ModalService.show instead of MainService.openModalForm!"
175
- // );
176
- // // const modal = this.modalService.show(modalParams.colFields$ || modalParams.controllerName, modalParams.parentGroup,
177
- // // modalParams.formHeader, modalParams.zModel, modalParams.referId);
178
- // const modal = await this.modalCtrl.create({
179
- // component: ZmodalPage,
180
- // backdropDismiss: true,
181
- // componentProps: {
182
- // modalParams,
183
- // },
184
- // });
185
- // modal.present();
186
- // return modal;
187
- // // .onWillDismiss((zmodel: any) => {
188
- // // this.
189
- // // });
190
- // }
191
- closeModalForm() {
192
- this.modalCtrl.dismiss();
193
- }
194
- subjectEvent(event, group, me) {
195
- if (!event || !event.target || event.target.startsWith("modalGroup.")) {
196
- return;
197
- }
198
- console.log(">> SubjectEvent", event);
199
- let callFunc;
200
- try {
201
- callFunc = ZComponentHelper.getGroupEvalValue.call(group.ctrlScope, event.target, group);
202
- // ZComponentHelper.getGroupValue(event.Target, group);
203
- }
204
- catch (error) {
205
- console.warn("Error when getGroupValue: ", event.target, " > Error: ", error);
206
- }
207
- // callFunc(event);
208
- if (typeof callFunc === "function") {
209
- const newFunc = callFunc.bind(me);
210
- newFunc(event, group, me);
211
- }
212
- else if (typeof callFunc === "string") {
213
- if (event.type.endsWith("onNavigateTo")) {
214
- const nUrl = event.target.replace("/:id", "/" + event.data);
215
- this.router.navigate([nUrl]);
216
- return;
217
- }
218
- if (event.type === "zgrid-cellClick") {
219
- // (callFunc.startsWith('edit')) { zgrid-cellClick
220
- const cName = callFunc.slice(4);
221
- // // debugger;
222
- // const modalGroupParam: ModalPageParams = {};
223
- // modalGroupParam.controllerName = cName;
224
- // modalGroupParam.referId = event.data.Id;
225
- // modalGroupParam.colFields$ = event.columnFields$;
226
- // modalGroupParam.parentGroup = me.group;
227
- // this.openModalForm(modalGroupParam);
228
- this.modalService.show(event.columnFields$ || cName, group, "", {}, event.data.Id);
229
- }
230
- }
231
- else if (typeof callFunc === "object") {
232
- if (event.type === "zgrid-cellClick") {
233
- if (callFunc.navigateUrl) {
234
- const url = callFunc.navigateUrl.replace(":id", event.data.Id);
235
- this.router.navigate([url]);
236
- return;
237
- }
238
- const modalGroupParam = {};
239
- modalGroupParam.controllerName = callFunc.ctrlName;
240
- modalGroupParam.referId = event.data.Id;
241
- modalGroupParam.colFields$ = event.columnFields$;
242
- modalGroupParam.parentGroup = me.group;
243
- modalGroupParam.formHeader = callFunc.formHeader;
244
- if (callFunc.formHeader) {
245
- // this.openModalForm(modalGroupParam);
246
- this.modalService.show(event.columnFields$ || callFunc.ctrlName, group, callFunc.formHeader, {}, event.data.Id);
247
- return;
248
- }
249
- console.warn("Invalid callFunc type: ", callFunc, " event.Target: ", event.target);
250
- }
251
- // this.openModalFormByComponent(callFunc.type, event.Data.Id);
252
- }
253
- else {
254
- console.warn("Function not defined in group for: ", event.target, ", Event: ", event);
255
- }
256
- }
257
- handleSuccess(res, successMsg) {
258
- this.group.isTriggered = false;
259
- if (res) {
260
- if (res.ProcessingStatus) {
261
- this.webApiService.showHttpResponseMessage(MESSAGETYPE.Success, successMsg, null);
262
- }
263
- return res;
264
- }
265
- }
266
- handleError(res) {
267
- this.group.isTriggered = false;
268
- return this.webApiService.handleError(res);
269
- }
270
- backNavigation(event, group, me) {
271
- if (group.beforeBackNavigationPage) {
272
- group.beforeBackNavigationPage(group).subscribe(() => {
273
- group['isTriggered'] = false;
274
- this.router.navigate([group.backNavigationPage]);
275
- //if (group['reload']) {
276
- // group['isTriggered'] = false;
277
- // this.router.routeReuseStrategy.shouldReuseRoute = function () {
278
- // return false;
279
- // }
280
- // this.router.onSameUrlNavigation = 'reload';
281
- //}
282
- //this.router.navigate([group.backNavigationPage],);
283
- });
284
- }
285
- else {
286
- group['isTriggered'] = false;
287
- //this.router.routeReuseStrategy.shouldReuseRoute = function () {
288
- // return false;
289
- //}
290
- //this.router.onSameUrlNavigation = 'reload';
291
- this.router.navigate([group.backNavigationPage]);
292
- }
293
- }
294
- historyBack() {
295
- this.group.isTriggered = false;
296
- this.navController.pop();
297
- }
298
- refreshGrid(event, group, me, gridOptionName) {
299
- gridOptionName = gridOptionName || "gridOptions";
300
- if (event && event.target) {
301
- const gridOption = event.target
302
- .trim()
303
- .replace("(", "")
304
- .replace(")", "")
305
- .replace("group.refreshGrid", "");
306
- if (gridOption.length > 0) {
307
- gridOptionName = gridOption;
308
- }
309
- }
310
- const zgridControl = group[gridOptionName];
311
- if (zgridControl) {
312
- zgridControl.getData();
313
- }
314
- group['isTriggered'] = false;
315
- }
316
- refreshPage() {
317
- if (this.group) {
318
- this.group.isTriggered = false;
319
- }
320
- location.reload();
321
- // this.router.routeReuseStrategy.shouldReuseRoute = () => false;
322
- // this.router.onSameUrlNavigation = 'reload';
323
- // console.log('Path: ', this.activatedRoute['_routerState'].snapshot.url);
324
- // this.router.navigate(['/crm/customer']);
325
- }
326
- getCloneNewCacheZModel(group) {
327
- const cacheZModel = this.cacheService.getCache("cloneNewModel");
328
- if (cacheZModel) {
329
- this.cacheService.clearCache("cloneNewModel");
330
- group.zModel = cacheZModel;
331
- group.zModel.Id = 0;
332
- }
333
- group.isTriggered = false;
334
- }
335
- newModel(event, group) {
336
- let _group = group;
337
- if (event) {
338
- if (event.data && event.data.SubType) {
339
- _group = group['_' + event.data.SubType];
340
- }
341
- }
342
- of([])
343
- .pipe(switchMap((zmodel) => {
344
- console.log("Before new, zModel:", zmodel);
345
- return this.beforeNewModel(_group);
346
- }), tap(() => {
347
- const referenceId = group.parentReferenceId || "0";
348
- console.log("current url: ", this.router.url);
349
- const pathSegment = this.router.url.split("/");
350
- const lastSegment = pathSegment[pathSegment.length - 1];
351
- if (lastSegment === "edit") {
352
- const newPath = pathSegment.slice(0, pathSegment.length - 2);
353
- newPath.push(referenceId);
354
- newPath.push("new");
355
- const cacheZModel = this.cacheService.getCache("cloneNewModel");
356
- if (!cacheZModel) {
357
- // Skip if it CloneNew
358
- this.router.navigateByUrl(this.group.backNavigationPage, { skipLocationChange: true }).then(() => {
359
- this.group.zModel = {};
360
- this.group.isEdit = false;
361
- this.group.isNew = true;
362
- this.group.isTriggered = false;
363
- this.router.navigate(newPath);
364
- });
365
- }
366
- else {
367
- this.router.navigate(newPath);
368
- }
369
- }
370
- else if (lastSegment === "new") {
371
- group.zModel = {};
372
- group.form.reset();
373
- //group.form.markAsPristine();
374
- group.isEdit = false;
375
- group.isNew = true;
376
- group.isTriggered = false;
377
- group.zModel[group.parentReferenceField] = group.parentReferenceId.toString();
378
- }
379
- else {
380
- group.isTriggered = false;
381
- this.router.navigate([group.editModelURL, referenceId, "new"], {
382
- relativeTo: group.ctrlScope.activatedRoute,
383
- });
384
- //this.router.navigate([group.editModelURL, referenceId, "new"]);
385
- }
386
- }))
387
- .subscribe();
388
- }
389
- createModel(event, group) {
390
- let createModelres = null;
391
- let fg = group.form;
392
- let _group = group;
393
- if (event) {
394
- if (event.data && event.data.SubType) {
395
- fg = group['_' + event.data.SubType].form;
396
- _group = group['_' + event.data.SubType];
397
- }
398
- }
399
- if (!fg.dirty) {
400
- console.warn("Form is not dirty hence record is not save.");
401
- return;
402
- }
403
- if (!fg.valid) {
404
- const errors = ZComponentHelper.getFormGroupErrors(fg, this.alertService, group);
405
- console.warn("Form Validation got error(s):", errors);
406
- return;
407
- }
408
- of(_group.zModel)
409
- .pipe(switchMap((zmodel) => {
410
- console.log("Before create, zModel:", zmodel);
411
- return this.beforeCreateModel(_group);
412
- }), tap(() => {
413
- Object.assign(_group.zModel, fg.value);
414
- }), switchMap(() => {
415
- const newModel = Object.assign({}, _group.zModel);
416
- ZComponentHelper.removeNullFields(newModel);
417
- // Object.keys(newModel).forEach((key) => {
418
- // if (newModel[key] === null) {
419
- // delete newModel[key];
420
- // }
421
- // });
422
- // if (!newModel.Id) {
423
- // newModel.Id = 0;
424
- // }
425
- return this.webApiService
426
- .httpPost$(_group.resourceURL, // + "/" + group.zModel.Id,
427
- newModel)
428
- .pipe(tap((resp) => {
429
- createModelres = resp;
430
- return resp;
431
- }), map((res) => this.handleSuccess(res, "Record is created successfully.")));
432
- }), switchMap((zmodel) => {
433
- console.log("After created, zModel:", zmodel);
434
- if (zmodel) {
435
- //support old and new webapi method
436
- if (zmodel.Data) {
437
- Object.assign(_group.zModel, zmodel.Data);
438
- fg.patchValue(zmodel.Data);
439
- }
440
- else if (zmodel["Id"]) {
441
- Object.assign(_group.zModel, zmodel);
442
- fg.patchValue(zmodel);
443
- }
444
- _group.referenceId = _group.zModel.Id;
445
- fg.markAsPristine();
446
- }
447
- return this.afterCreateModel(_group);
448
- }), tap((resp) => {
449
- if (createModelres.ProcessingStatus == null || createModelres.ProcessingStatus == true) {
450
- if (resp && _group.zModel.Id !== 0) {
451
- _group.isNew = false;
452
- _group.isEdit = true;
453
- _group.isTriggered = false;
454
- _group.cancelButtonName = "Close";
455
- Object.assign(_group.zModel, resp);
456
- fg.patchValue(resp);
457
- }
458
- fg.markAsPristine();
459
- }
460
- else {
461
- fg.markAsDirty();
462
- }
463
- // console.log("Done updateModel updated zModel:", fg.value);
464
- // this.toastService.show("Record is created successfully.");
465
- }))
466
- .subscribe();
467
- }
468
- updateModel(event, group) {
469
- let fg = group.form;
470
- let _group = group;
471
- if (event) {
472
- if (event.data && event.data.SubType) {
473
- fg = group['_' + event.data.SubType].form;
474
- _group = group['_' + event.data.SubType];
475
- }
476
- }
477
- if (!fg.dirty) {
478
- console.warn("Form is not dirty hence record is not save.");
479
- return;
480
- }
481
- if (!fg.valid) {
482
- const errors = ZComponentHelper.getFormGroupErrors(fg, this.alertService, group);
483
- console.warn("Form Validation got error(s):", errors);
484
- return;
485
- }
486
- of(_group.zModel)
487
- .pipe(switchMap((zmodel) => {
488
- console.log("Before update, zModel:", zmodel);
489
- return this.beforeUpdateModel(_group);
490
- }), tap(() => {
491
- Object.assign(_group.zModel, fg.value);
492
- }), switchMap(() => {
493
- return this.webApiService
494
- .httpPut$(_group.resourceURL + "/" + _group.zModel.Id, _group.zModel)
495
- .pipe(map((res) => this.handleSuccess(res, "Record is updated successfully.")));
496
- }), switchMap((zmodel) => {
497
- console.log("After updated, zModel:", zmodel);
498
- if (zmodel && zmodel.Data) {
499
- Object.assign(_group.zModel, zmodel.Data);
500
- fg.patchValue(zmodel.Data);
501
- // console.log("Done updateModel updated zModel:", fg.value);
502
- }
503
- else if (zmodel && zmodel["Id"]) {
504
- Object.assign(_group.zModel, zmodel);
505
- fg.patchValue(zmodel);
506
- // console.log("Done updateModel updated zModel:", fg.value);
507
- }
508
- group.isTriggered = false;
509
- _group.isTriggered = false;
510
- fg.markAsPristine();
511
- return this.afterUpdateModel(_group);
512
- }))
513
- .subscribe();
514
- // Object.assign(group.zModel, fg.value);
515
- // this.webApiService
516
- // .httpPut$(group.resourceURL + "/" + group.zModel.Id, group.zModel)
517
- // .subscribe(resp => {
518
- // Object.assign(group.zModel, resp);
519
- // fg.patchValue(resp);
520
- // fg.markAsPristine();
521
- // console.log("Done updateModel updated zModel:", fg.value);
522
- // });
523
- }
524
- cloneNewModel(event, group) {
525
- let _group = group;
526
- if (event) {
527
- if (event.data && event.data.SubType) {
528
- _group = group['_' + event.data.SubType];
529
- }
530
- }
531
- Object.assign(_group.zModel, _group.form.value);
532
- _group.zModel.Id = 0;
533
- const clearFields = ["WFS_DocumentId", "WFS_StatusCode", "WFS_StatusName"];
534
- clearFields.forEach((field) => {
535
- if (_group.zModel.hasOwnProperty(field)) {
536
- _group.zModel[field] = null;
537
- }
538
- });
539
- this.cacheService.setCache("cloneNewModel", group.zModel);
540
- this.newModel(null, group);
541
- group.isTriggered = false;
542
- _group.isTriggered = false;
543
- }
544
- deleteModel(event, group) {
545
- let fg = group.form;
546
- let _group = group;
547
- if (event) {
548
- if (event.data && event.data.SubType) {
549
- fg = group['_' + event.data.SubType].form;
550
- _group = group['_' + event.data.SubType];
551
- }
552
- }
553
- of(_group.zModel)
554
- .pipe(switchMap((zmodel) => {
555
- console.log("Before delete, zModel:", zmodel);
556
- return this.beforeDeleteModel(_group);
557
- }), switchMap(() => {
558
- group.isTriggered = false;
559
- _group.isTriggered = false;
560
- return this.alertService.show("Delete Record", "Are you sure?", [
561
- { text: "No", cssClass: "secondary" },
562
- { text: "Yes", cssClass: "primary" }
563
- ]);
564
- }), switchMap((reply) => {
565
- if (reply === "Yes") {
566
- Object.assign(_group.zModel, fg.value);
567
- _group.zModel.Disabled = true;
568
- return this.webApiService
569
- .httpPut$(_group.resourceURL + "/" + _group.zModel.Id, _group.zModel)
570
- .pipe(map((res) => this.handleSuccess(res, "Record is deleted successfully.")), switchMap((zmodel) => {
571
- console.log("After deleted, zModel:", zmodel);
572
- return this.afterDeleteModel(_group);
573
- }), tap((resp) => {
574
- this.historyBack();
575
- }));
576
- }
577
- else {
578
- return of([]);
579
- }
580
- }))
581
- .subscribe();
582
- }
583
- beforeUpdateModel(group) {
584
- if (!group.beforeUpdateModel) {
585
- console.warn("group.beforeUpdateModel is undefined");
586
- return of({});
587
- }
588
- return group.beforeUpdateModel(group);
589
- }
590
- beforeDeleteModel(group) {
591
- if (!group.beforeDeleteModel) {
592
- console.warn("group.beforeUpdateModel is undefined");
593
- return of({});
594
- }
595
- return group.beforeDeleteModel(group);
596
- }
597
- beforeNewModel(group) {
598
- if (!group.beforeNewModel) {
599
- console.warn("group.beforeNewodel is undefined");
600
- return of({});
601
- }
602
- return group.beforeNewModel(group);
603
- }
604
- beforeCreateModel(group) {
605
- if (!group.beforeCreateModel) {
606
- console.warn("group.beforeUpdateModel is undefined");
607
- return of({});
608
- }
609
- return group.beforeCreateModel(group);
610
- }
611
- beforePageInitialise(group) {
612
- if (!group.beforePageInitialise) {
613
- console.warn("group.beforePageInitialise is undefined");
614
- return of({});
615
- }
616
- return group.beforePageInitialise(group);
617
- }
618
- afterGetModelSuccess(group) {
619
- if (!group.zModel.Id) {
620
- console.warn("zModel.Id is not defined", group.zModel);
621
- return of({});
622
- }
623
- if (!group.afterGetModelSuccess) {
624
- console.warn("group.afterGetModelSuccess is not defined");
625
- return of({});
626
- }
627
- return group.afterGetModelSuccess(group);
628
- }
629
- afterNewModel(group) {
630
- if (!group.afterNewModel) {
631
- console.warn("group.afterNewModel is not defined");
632
- return of({});
633
- }
634
- return group.afterNewModel(group);
635
- }
636
- afterCreateModel(group) {
637
- if (!group.afterCreateModel) {
638
- console.warn("group.afterCreateModel is not defined");
639
- return of({});
640
- }
641
- return group.afterCreateModel(group);
642
- }
643
- afterUpdateModel(group) {
644
- if (!group.afterUpdateModel) {
645
- console.warn("group.afterUpdateModel is not defined");
646
- return of({});
647
- }
648
- return group.afterUpdateModel(group);
649
- }
650
- afterDeleteModel(group) {
651
- if (!group.afterDeleteModel) {
652
- console.warn("group.afterDeleteModel is not defined");
653
- return of({});
654
- }
655
- return group.afterDeleteModel(group);
656
- }
657
- afterPageInitialise(group) {
658
- if (!group.afterPageInitialise) {
659
- console.warn("group.afterPageInitialise is undefined");
660
- return of({});
661
- }
662
- return group.afterPageInitialise(group);
663
- }
664
- // private onAction(group: ZGroup) {
665
- // this.actionSheetCtrl
666
- // .create({
667
- // header: "Choose an Action",
668
- // buttons: group.topRightActionButton
669
- // })
670
- // .then(actionSheetEl => {
671
- // actionSheetEl.present();
672
- // });
673
- // }
674
- // setModelValue(propertyName: string, value: any, group: ZGroup) {
675
- // group.zModel[propertyName] = value;
676
- // if (group.isLoading) {
677
- // return;
678
- // }
679
- // const fg = group.form as FormGroup;
680
- // if (!fg) {
681
- // eslint-disable-next-line , no-debugger
682
- // debugger;
683
- // }
684
- // const fc = fg.controls[propertyName];
685
- // if (!fc) {
686
- // eslint-disable-next-line no-debugger
687
- // debugger;
688
- // }
689
- // fc.setValue(value);
690
- // fc.markAsDirty();
691
- // }
692
- showzModal(colFields$, parentGroup, formHeader, zModel, referId, componentSize, skipIsDirtyCheck) {
693
- return __awaiter(this, void 0, void 0, function* () {
694
- const modalcomponent = ZmodalComponent;
695
- const modalmobilecomponent = ZmodalMobileComponent;
696
- if (parentGroup) {
697
- // disable isTriggered before display the popup.
698
- parentGroup.isTriggered = false;
699
- }
700
- return yield this.modalService.show(colFields$, parentGroup, formHeader, modalcomponent, modalmobilecomponent, zModel, referId, componentSize, skipIsDirtyCheck);
701
- //const modal = await this.modalService.show();
702
- });
703
- }
704
- cookieStorePost(name, value) {
705
- // for Post to CookieStore
706
- const cookieStoreURL = this.oauthEnvironmentUrl + "api/CookieStores";
707
- const cookieStoreValue = {
708
- 'Name': name,
709
- 'Value': JSON.stringify(value)
710
- };
711
- return this.webApiService.httpPost$(cookieStoreURL, cookieStoreValue).pipe(map(res => {
712
- if (res) {
713
- console.log("grid config saved(" + res.status + "): ", res);
714
- return res;
715
- }
716
- }));
717
- }
718
- cookieStoreGet(name, accessToken) {
719
- const cookieStoreURL = this.oauthEnvironmentUrl + "api/CookieStores/?name=" + name;
720
- return this.webApiService.httpGet$(cookieStoreURL, { headers: accessToken }).pipe(map(res => {
721
- if (res) {
722
- return res;
723
- }
724
- }));
725
- }
726
- cookieStoreDeleteMultiple(name) {
727
- // for Post to CookieStore
728
- const cookieStoreURL = this.oauthEnvironmentUrl + "Admin/DeleteMultipleCookies";
729
- const cookieStoreValue = {
730
- 'containName': name
731
- };
732
- return this.webApiService.httpPost$(cookieStoreURL, cookieStoreValue).pipe(map(res => {
733
- if (res) {
734
- return res;
735
- }
736
- }));
737
- }
738
- }
739
- MainService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MainService_Factory() { return new MainService(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i2.ModalController), i0.ɵɵinject(i2.NavController), i0.ɵɵinject(i3.AlertService), i0.ɵɵinject(i3.CacheService), i0.ɵɵinject(i3.FieldService), i0.ɵɵinject(i3.ResourceApiService), i0.ɵɵinject(i3.ToastService), i0.ɵɵinject(i3.WebApiService), i0.ɵɵinject(i3.ZCoreService), i0.ɵɵinject(i4.ModalService), i0.ɵɵinject(i5.ZComponentDebugService)); }, token: MainService, providedIn: "root" });
740
- MainService.decorators = [
741
- { type: Injectable, args: [{
742
- providedIn: 'root',
743
- },] }
744
- ];
745
- MainService.ctorParameters = () => [
746
- { type: Router },
747
- { type: ModalController },
748
- { type: NavController },
749
- { type: AlertService },
750
- { type: CacheService },
751
- { type: FieldService },
752
- { type: ResourceApiService },
753
- { type: ToastService },
754
- { type: WebApiService },
755
- { type: ZCoreService },
756
- { type: ModalService },
757
- { type: ZComponentDebugService }
758
- ];
759
- export function refreshGrid(group) {
760
- const zgridControl = group["gridOptions"];
761
- if (zgridControl) {
762
- zgridControl.getData();
763
- }
764
- group.isTriggered = false;
765
- }
766
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekMsNkJBQTZCO0FBQzdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsOEJBQThCO0FBQzlCLE9BQU8sRUFBYyxlQUFlLEVBQWdCLEVBQUUsRUFBUSxNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBUSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUNRLFdBQVcsRUFDeEIsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFDekYsZ0JBQWdCLEVBQXlDLFlBQVksRUFDdEUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsWUFBWSxFQUFpQixNQUFNLGtCQUFrQixDQUFDO0FBQy9ELDBEQUEwRDtBQUMxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7QUFFMUUsc0RBQXNEO0FBRXRELHFIQUFxSDtBQUNySCwwREFBMEQ7QUFLMUQsTUFBTSxPQUFPLFdBQVc7SUFJdEIsWUFDVSxNQUFjLEVBQ2QsU0FBMEIsRUFDMUIsYUFBNEIs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V0FBVyxHQUFHLEtBQUssQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcbmltcG9ydCB7IE1vZGFsQ29udHJvbGxlciwgTmF2Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgb2YsIGZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCBzd2l0Y2hNYXAsIHRha2UsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHtcclxuICBBbGVydEJ1dHRvbiwgTUVTU0FHRVRZUEUsIE1vZGFsUGFnZVBhcmFtcyxcclxuICBBbGVydFNlcnZpY2UsIENhY2hlU2VydmljZSwgRmllbGRTZXJ2aWNlLCBSZXNvdXJjZUFwaVNlcnZpY2UsIFRvYXN0U2VydmljZSwgV2ViQXBpU2VydmljZSxcclxuICBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpDb21wb25lbnRTaXplLCBaQ29yZVNlcnZpY2UsIFpGaWVsZCwgWkdyb3VwXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlLCBNb2RhbFJlc3BvbnNlIH0gZnJvbSAnbW1oZ2xvYmFsLXptb2RhbCc7XHJcbi8vIGltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uL3ptb2RhbC9tb2RhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWkNvbXBvbmVudERlYnVnU2VydmljZSB9IGZyb20gJy4vemNvbXBvbmVudC5kZWJ1Zy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWm1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vem1vZGFsL3ptb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBabW9kYWxNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuLi96bW9kYWwvem1vZGFsLW1vYmlsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBaR3JpZCB9IGZyb20gJy4uL3pncmlkL3pncmlkLmNvbXBvbmVudCc7XHJcbi8vIGltcG9ydCB7IFptb2RhbFBhZ2UgfSBmcm9tICcuLi96bW9kYWwvem1vZGFsLnBhZ2UnO1xyXG5cclxuLy8gaW1wb3J0IHsgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LCBNb2RhbFBhZ2VQYXJhbXMsIFpHcmlkIH0gZnJvbSAnLi4vZHluYW1pY2Zvcm0vemNvbXBvbmVudC5tb2RlbCc7XHJcbi8vIGltcG9ydCB7IFpHcm91cCwgWkZpZWxkIH0gZnJvbSAnLi4vbW9kZWwvemdyb3VwLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYWluU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBncm91cDogWkdyb3VwO1xyXG4gIHByaXZhdGUgb2F1dGhFbnZpcm9ubWVudFVybDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdlYkFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpjb3JlU2VydmljZTogWkNvcmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgZGVidWdTZXJ2aWNlOiBaQ29tcG9uZW50RGVidWdTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBjb25zb2xlLmxvZygnTWFpblNlcnZpY2UgY29uc3RydWN0b3InKTtcclxuICAgIHRoaXMub2F1dGhFbnZpcm9ubWVudFVybCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCkuZTFPYXV0aFVybCArICcvJztcclxuICB9XHJcblxyXG4gIHN0YXJ0VXAoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnQXQgbWFpbi5zZXJ2aWNlIChTdGFydFVwKSAuLi4nKTtcclxuICB9XHJcblxyXG4gIHNldEdyb3VwKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIHRoaXMuZ3JvdXAgPSBncm91cDtcclxuICAgIHRoaXMuZmllbGRTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIHRoaXMud2ViQXBpU2VydmljZS5zZXRHcm91cChncm91cCk7XHJcbiAgICBjb25zdCBpc0RlYnVnZ2luZyA9IHRoaXMuemNvcmVTZXJ2aWNlLmlzRGVidWdTZXNzaW9uKCkgfHwgZmFsc2U7XHJcbiAgICBpZiAoaXNEZWJ1Z2dpbmcpIHtcclxuICAgICAgdGhpcy5kZWJ1Z1NlcnZpY2Uub25Jbml0RGVidWdnZXIoZ3JvdXAsIHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UmVzb3VyY2VTZXJ2ZXJEYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmxvYWREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBnZXRHcm91cEZpZWxkcyhcclxuICAgIGN0cmxOYW1lOiBzdHJpbmcsXHJcbiAgICBmb3JtVHlwZTogXCJMaXN0RmllbGRcIiB8IFwiRm9ybUZpZWxkXCIsXHJcbiAgICBncm91cDogWkdyb3VwLFxyXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmdcclxuICApIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKFxyXG4gICAgICBjdHJsTmFtZSxcclxuICAgICAgZm9ybVR5cGUsXHJcbiAgICAgIGdyb3VwLFxyXG4gICAgICBwcm9wZXJ0eU5hbWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplR3JvdXAoXHJcbiAgICBncm91cDogWkdyb3VwLFxyXG4gICAgY3RybE5hbWU6IHN0cmluZyxcclxuICAgIHBhZ2VOYW1lOiBzdHJpbmcsXHJcbiAgICBtZTogYW55XHJcbiAgKTogU3Vic2NyaXB0aW9uIHtcclxuICAgIGlmIChtZS5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgbWUuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBncm91cC5yZXNvdXJjZVVSTE5hbWUgfHwgY3RybE5hbWU7XHJcbiAgICBncm91cC5yZXNvdXJjZVVSTE5hbWUgPSByZXNvdXJjZU5hbWU7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cCwge1xyXG4gICAgICByZXNvdXJjZVVSTDogdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKHJlc291cmNlTmFtZSksXHJcbiAgICAgIGdyaWRDb2x1bW5GaWVsZHM6IHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgICAgY3RybE5hbWUsXHJcbiAgICAgICAgXCJGb3JtRmllbGRcIixcclxuICAgICAgICBudWxsLFxyXG4gICAgICAgIG51bGxcclxuICAgICAgKSxcclxuICAgICAgY3RybFNjb3BlOiBtZSxcclxuICAgICAgcGFnZU5hbWUsXHJcbiAgICAgIGN0cmxOYW1lLFxyXG4gICAgICAvLyBjcmVhdGVNb2RlbFVSTDogXCIvY3JlYXRlXCIgKyBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICBlZGl0TW9kZWxVUkw6IGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIC8vIGxpc3RNb2RlbFVSTDogXCIvbGlzdFwiICsgY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgLy8gZm9ybUhlYWRlcjogXCIuLi5cIixcclxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxyXG4gICAgICBmaWVsZHM6IFtdLFxyXG4gICAgICB6TW9kZWw6IHt9LFxyXG4gICAgICB6Q29tcG9uZW50czoge30sXHJcbiAgICAgIHpEYXRhOiB7fSxcclxuICAgICAgc3ViamVjdDogbmV3IEJlaGF2aW9yU3ViamVjdDxaQ29tcG9uZW50T3V0cHV0RXZlbnQ+KG51bGwpLFxyXG4gICAgICAvLyBmb3JtOiBudWxsIGFzIEZvcm1Hcm91cCwgLy8gcmVtb3ZlZCBmb3IgYnVnIGZpeC5cclxuICAgICAgY2FuY2VsQnV0dG9uTmFtZTogXCJDbG9zZVwiLFxyXG4gICAgICB6QnV0dG9uc0NvdW50OiAwLFxyXG4gICAgICAvLyB0b3BSaWdodEFjdGlvbkJ1dHRvbjogW10sXHJcbiAgICAgIC8vIG9uQWN0aW9uOiB0aGlzLm9uQWN0aW9uLmJpbmQodGhpcyksXHJcbiAgICAgIGJhY2tOYXZpZ2F0aW9uOiB0aGlzLmJhY2tOYXZpZ2F0aW9uLmJpbmQodGhpcyksXHJcbiAgICAgIGhpc3RvcnlCYWNrOiB0aGlzLmhpc3RvcnlCYWNrLmJpbmQodGhpcyksXHJcbiAgICAgIHJlZnJlc2hQYWdlOiB0aGlzLnJlZnJlc2hQYWdlLFxyXG4gICAgICByZWZyZXNoR3JpZDogdGhpcy5yZWZyZXNoR3JpZC5iaW5kKHRoaXMpLFxyXG4gICAgICB1cGRhdGVNb2RlbDogdGhpcy51cGRhdGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBjcmVhdGVNb2RlbDogdGhpcy5jcmVhdGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBjbG9uZU5ld01vZGVsOiB0aGlzLmNsb25lTmV3TW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgZGVsZXRlTW9kZWw6IHRoaXMuZGVsZXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgbmV3TW9kZWw6IHRoaXMubmV3TW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgLy8gX2lzRGVidWdnaW5nOiBlbnZpcm9ubWVudC5kZWJ1Z1Nlc3Npb24gfHwgZmFsc2UsXHJcbiAgICAgIC8vIF9kZWJ1Zzoge1xyXG4gICAgICAvLyAgIHpEYXRhOiAgeyBjb2xsZWN0ZWRBY3Rpdml0aWVzOiBbXSwgYWN0aXZpdHlDb3VudDogMCB9XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3M6IG51bGwsXHJcbiAgICAgIC8vIGJlZm9yZVVwZGF0ZU1vZGVsOiBudWxsLFxyXG4gICAgICAvLyBpc0VkaXQ6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICBtZS5zdWJzY3JpcHRpb24gPSBncm91cC5zdWJqZWN0LnN1YnNjcmliZSgoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCkgPT5cclxuICAgICAgdGhpcy5zdWJqZWN0RXZlbnQoZXZlbnQsIGdyb3VwLCBtZSlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG1lLnN1YnNjcmlwdGlvbjtcclxuICB9XHJcblxyXG4gIGdldE1vZGVsJChncm91cDogWkdyb3VwLCBpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHJlY0lkID0gaWQgfHwgZ3JvdXAucmVmZXJlbmNlSWQ7XHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgIC5odHRwR2V0JChncm91cC5yZXNvdXJjZVVSTCArIFwiL1wiICsgcmVjSWQsIG51bGwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBncm91cC56TW9kZWwgPSB6bW9kZWw7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGdyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkICYmXHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHptb2RlbCkuaW5kZXhPZihncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZCkgIT09IC0xICYmXHJcbiAgICAgICAgICAgICFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UuZW5kc1dpdGgoXCIuZWRpdFwiKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSA9XHJcbiAgICAgICAgICAgICAgZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlICtcclxuICAgICAgICAgICAgICBcIi9cIiArXHJcbiAgICAgICAgICAgICAgem1vZGVsW2dyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkXS50b1N0cmluZygpICtcclxuICAgICAgICAgICAgICBcIi9lZGl0XCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIGlmIChncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBjYW5FeGl0KGZvcm06IEZvcm1Hcm91cCk6IGJvb2xlYW4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIGlmICghZm9ybSB8fCAhZm9ybS5kaXJ0eSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZm9ybVsnc2tpcERpcnR5Q2hlY2snXSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5hbGVydFNlcnZpY2VcclxuICAgICAgLnNob3coXCJEYXRhIG5vdCBzYXZlIHlldFwiLCBcIkFyZSB5b3Ugc3VyZSB3YW50IHRvIGRpc2NhcmQgdGhlIGNoYW5nZXM/XCIsIFtcclxuICAgICAgICBcIkNhbmNlbFwiLFxyXG4gICAgICAgIFwiRGlzY2FyZCBDaGFuZ2VzXCIsXHJcbiAgICAgIF0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgocmVwbHkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJEaXNjYXJkIENoYW5nZXNcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICAvLyBjb25zdCByZXBseVN1YiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgICAvLyB0aGlzLmFsZXJ0Q3RybFxyXG4gICAgLy8gICAuY3JlYXRlKHtcclxuICAgIC8vICAgICBoZWFkZXI6IFwiRGF0YSBub3Qgc2F2ZSB5ZXRcIixcclxuICAgIC8vICAgICAvLyBzdWJIZWFkZXI6ICdTdWJIZWFkZXIgc3RhdGVtZW50IGhlcmUnLFxyXG4gICAgLy8gICAgIG1lc3NhZ2U6IFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGlzY2FyZCB0aGUgY2hhbmdlcz9cIixcclxuICAgIC8vICAgICBidXR0b25zOiBbXHJcbiAgICAvLyAgICAgICB7XHJcbiAgICAvLyAgICAgICAgIHRleHQ6IFwiQ2FuY2VsXCIsXHJcbiAgICAvLyAgICAgICAgIHJvbGU6IFwiY2FuY2VsXCIsXHJcbiAgICAvLyAgICAgICAgIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiLFxyXG4gICAgLy8gICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgcmVwbHlTdWIubmV4dChmYWxzZSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgIH0sXHJcbiAgICAvLyAgICAgICB7XHJcbiAgICAvLyAgICAgICAgIHRleHQ6IFwiRGlzY2FyZCBDaGFuZ2VzXCIsXHJcbiAgICAvLyAgICAgICAgIGNzc0NsYXNzOiBcIndhcm5pbmdcIixcclxuICAgIC8vICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgIHJlcGx5U3ViLm5leHQodHJ1ZSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICBdXHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyAgIC50aGVuKGFsZXJ0RWxlbWVudCA9PiB7XHJcbiAgICAvLyAgICAgYWxlcnRFbGVtZW50LnByZXNlbnQoKTtcclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyByZXR1cm4gcmVwbHlTdWIuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlKDEpKTtcclxuICB9XHJcblxyXG4gIC8vIGFzeW5jIG9wZW5Nb2RhbEZvcm0obW9kYWxQYXJhbXM6IE1vZGFsUGFnZVBhcmFtcykge1xyXG4gIC8vICAgLy8gY29uc29sZS5sb2coXCJvcGVuTW9kYWxGb3JtXCIpO1xyXG4gIC8vICAgY29uc29sZS5lcnJvcihcclxuICAvLyAgICAgXCJQbGVhc2UgdXNlIE1vZGFsU2VydmljZS5zaG93IGluc3RlYWQgb2YgTWFpblNlcnZpY2Uub3Blbk1vZGFsRm9ybSFcIlxyXG4gIC8vICAgKTtcclxuICAvLyAgIC8vIGNvbnN0IG1vZGFsID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhtb2RhbFBhcmFtcy5jb2xGaWVsZHMkIHx8IG1vZGFsUGFyYW1zLmNvbnRyb2xsZXJOYW1lLCBtb2RhbFBhcmFtcy5wYXJlbnRHcm91cCxcclxuICAvLyAgIC8vICAgbW9kYWxQYXJhbXMuZm9ybUhlYWRlciwgbW9kYWxQYXJhbXMuek1vZGVsLCBtb2RhbFBhcmFtcy5yZWZlcklkKTtcclxuICAvLyAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbEN0cmwuY3JlYXRlKHtcclxuICAvLyAgICAgY29tcG9uZW50OiBabW9kYWxQYWdlLFxyXG4gIC8vICAgICBiYWNrZHJvcERpc21pc3M6IHRydWUsXHJcbiAgLy8gICAgIGNvbXBvbmVudFByb3BzOiB7XHJcbiAgLy8gICAgICAgbW9kYWxQYXJhbXMsXHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICB9KTtcclxuICAvLyAgIG1vZGFsLnByZXNlbnQoKTtcclxuICAvLyAgIHJldHVybiBtb2RhbDtcclxuICAvLyAgIC8vIC5vbldpbGxEaXNtaXNzKCh6bW9kZWw6IGFueSkgPT4ge1xyXG4gIC8vICAgLy8gICB0aGlzLlxyXG4gIC8vICAgLy8gfSk7XHJcbiAgLy8gfVxyXG5cclxuICBjbG9zZU1vZGFsRm9ybSgpIHtcclxuICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3MoKTtcclxuICB9XHJcblxyXG4gIHN1YmplY3RFdmVudChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC50YXJnZXQgfHwgZXZlbnQudGFyZ2V0LnN0YXJ0c1dpdGgoXCJtb2RhbEdyb3VwLlwiKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcIj4+IFN1YmplY3RFdmVudFwiLCBldmVudCk7XHJcbiAgICBsZXQgY2FsbEZ1bmM7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY2FsbEZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwoXHJcbiAgICAgICAgZ3JvdXAuY3RybFNjb3BlLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBncm91cFxyXG4gICAgICApO1xyXG4gICAgICAvLyBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZXZlbnQuVGFyZ2V0LCBncm91cCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJFcnJvciB3aGVuIGdldEdyb3VwVmFsdWU6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiA+IEVycm9yOiBcIixcclxuICAgICAgICBlcnJvclxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNhbGxGdW5jKGV2ZW50KTtcclxuICAgIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBjb25zdCBuZXdGdW5jID0gY2FsbEZ1bmMuYmluZChtZSk7XHJcbiAgICAgIG5ld0Z1bmMoZXZlbnQsIGdyb3VwLCBtZSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZS5lbmRzV2l0aChcIm9uTmF2aWdhdGVUb1wiKSkge1xyXG4gICAgICAgIGNvbnN0IG5VcmwgPSBldmVudC50YXJnZXQucmVwbGFjZShcIi86aWRcIiwgXCIvXCIgKyBldmVudC5kYXRhKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbblVybF0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICAvLyAoY2FsbEZ1bmMuc3RhcnRzV2l0aCgnZWRpdCcpKSB7ICB6Z3JpZC1jZWxsQ2xpY2tcclxuICAgICAgICBjb25zdCBjTmFtZSA9IGNhbGxGdW5jLnNsaWNlKDQpO1xyXG4gICAgICAgIC8vIC8vIGRlYnVnZ2VyO1xyXG4gICAgICAgIC8vIGNvbnN0IG1vZGFsR3JvdXBQYXJhbTogTW9kYWxQYWdlUGFyYW1zID0ge307XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLmNvbnRyb2xsZXJOYW1lID0gY05hbWU7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnJlZmVySWQgPSBldmVudC5kYXRhLklkO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb2xGaWVsZHMkID0gZXZlbnQuY29sdW1uRmllbGRzJDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0ucGFyZW50R3JvdXAgPSBtZS5ncm91cDtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhcclxuICAgICAgICAgIGV2ZW50LmNvbHVtbkZpZWxkcyQgfHwgY05hbWUsXHJcbiAgICAgICAgICBncm91cCxcclxuICAgICAgICAgIFwiXCIsXHJcbiAgICAgICAgICB7fSxcclxuICAgICAgICAgIGV2ZW50LmRhdGEuSWRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ6Z3JpZC1jZWxsQ2xpY2tcIikge1xyXG4gICAgICAgIGlmIChjYWxsRnVuYy5uYXZpZ2F0ZVVybCkge1xyXG4gICAgICAgICAgY29uc3QgdXJsID0gY2FsbEZ1bmMubmF2aWdhdGVVcmwucmVwbGFjZShcIjppZFwiLCBldmVudC5kYXRhLklkKTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZGFsR3JvdXBQYXJhbTogTW9kYWxQYWdlUGFyYW1zID0ge307XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLmNvbnRyb2xsZXJOYW1lID0gY2FsbEZ1bmMuY3RybE5hbWU7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLnJlZmVySWQgPSBldmVudC5kYXRhLklkO1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5jb2xGaWVsZHMkID0gZXZlbnQuY29sdW1uRmllbGRzJDtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0ucGFyZW50R3JvdXAgPSBtZS5ncm91cDtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0uZm9ybUhlYWRlciA9IGNhbGxGdW5jLmZvcm1IZWFkZXI7XHJcblxyXG4gICAgICAgIGlmIChjYWxsRnVuYy5mb3JtSGVhZGVyKSB7XHJcbiAgICAgICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm0obW9kYWxHcm91cFBhcmFtKTtcclxuICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNob3coXHJcbiAgICAgICAgICAgIGV2ZW50LmNvbHVtbkZpZWxkcyQgfHwgY2FsbEZ1bmMuY3RybE5hbWUsXHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBjYWxsRnVuYy5mb3JtSGVhZGVyLFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5JZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgXCJJbnZhbGlkIGNhbGxGdW5jIHR5cGU6IFwiLFxyXG4gICAgICAgICAgY2FsbEZ1bmMsXHJcbiAgICAgICAgICBcIiBldmVudC5UYXJnZXQ6IFwiLFxyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm1CeUNvbXBvbmVudChjYWxsRnVuYy50eXBlLCBldmVudC5EYXRhLklkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBcIkZ1bmN0aW9uIG5vdCBkZWZpbmVkIGluIGdyb3VwIGZvcjogXCIsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgIFwiLCBFdmVudDogXCIsXHJcbiAgICAgICAgZXZlbnRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVN1Y2Nlc3MocmVzOiBSZXNwb25zZSB8IGFueSwgc3VjY2Vzc01zZzogc3RyaW5nKTogUmVzcG9uc2Uge1xyXG4gICAgdGhpcy5ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChyZXMpIHtcclxuICAgICAgaWYgKHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNob3dIdHRwUmVzcG9uc2VNZXNzYWdlKFxyXG4gICAgICAgICAgTUVTU0FHRVRZUEUuU3VjY2VzcyxcclxuICAgICAgICAgIHN1Y2Nlc3NNc2csXHJcbiAgICAgICAgICBudWxsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXJyb3IocmVzOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5oYW5kbGVFcnJvcihyZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiYWNrTmF2aWdhdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBpZiAoZ3JvdXAuYmVmb3JlQmFja05hdmlnYXRpb25QYWdlKSB7XHJcbiAgICAgIGdyb3VwLmJlZm9yZUJhY2tOYXZpZ2F0aW9uUGFnZShncm91cCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5iYWNrTmF2aWdhdGlvblBhZ2VdKTtcclxuXHJcbiAgICAgICAgLy9pZiAoZ3JvdXBbJ3JlbG9hZCddKSB7XHJcbiAgICAgICAgLy8gIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcbiAgICAgICAgLy8gIHRoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAvLyAgfVxyXG4gICAgICAgIC8vICB0aGlzLnJvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XHJcbiAgICAgICAgLy99XHJcbiAgICAgICAgLy90aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlXSwpO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcbiAgICAgIFxyXG4gICAgICAvL3RoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAvLyAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAvL31cclxuICAgICAgLy90aGlzLnJvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XHJcblxyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpc3RvcnlCYWNrKCkge1xyXG4gICAgdGhpcy5ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5uYXZDb250cm9sbGVyLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hHcmlkKFxyXG4gICAgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCxcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBtZTogYW55LFxyXG4gICAgZ3JpZE9wdGlvbk5hbWU/OiBzdHJpbmdcclxuICApIHtcclxuICAgIGdyaWRPcHRpb25OYW1lID0gZ3JpZE9wdGlvbk5hbWUgfHwgXCJncmlkT3B0aW9uc1wiO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCkge1xyXG4gICAgICBjb25zdCBncmlkT3B0aW9uID0gZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgLnRyaW0oKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKFwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKVwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiZ3JvdXAucmVmcmVzaEdyaWRcIiwgXCJcIik7XHJcbiAgICAgIGlmIChncmlkT3B0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBncmlkT3B0aW9uTmFtZSA9IGdyaWRPcHRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtncmlkT3B0aW9uTmFtZV0gYXMgWkdyaWQ7XHJcbiAgICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgICB9XHJcbiAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoUGFnZSgpIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIucm91dGVSZXVzZVN0cmF0ZWd5LnNob3VsZFJldXNlUm91dGUgPSAoKSA9PiBmYWxzZTtcclxuICAgIC8vIHRoaXMucm91dGVyLm9uU2FtZVVybE5hdmlnYXRpb24gPSAncmVsb2FkJztcclxuICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoOiAnLCB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY3JtL2N1c3RvbWVyJ10pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xvbmVOZXdDYWNoZVpNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBjYWNoZVpNb2RlbCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKFwiY2xvbmVOZXdNb2RlbFwiKTtcclxuICAgIGlmIChjYWNoZVpNb2RlbCkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKFwiY2xvbmVOZXdNb2RlbFwiKTtcclxuICAgICAgZ3JvdXAuek1vZGVsID0gY2FjaGVaTW9kZWw7XHJcbiAgICAgIGdyb3VwLnpNb2RlbC5JZCA9IDA7XHJcbiAgICB9XHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuZXdNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7ICBcclxuICAgIGxldCBfZ3JvdXA6IFpHcm91cCA9IGdyb3VwO1xyXG5cclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBpZiAoZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLlN1YlR5cGUpIHtcclxuICAgICAgICBfZ3JvdXAgPSBncm91cFsnXycgKyBldmVudC5kYXRhLlN1YlR5cGVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb2YoW10pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBuZXcsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZU5ld01vZGVsKF9ncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZ3JvdXAucGFyZW50UmVmZXJlbmNlSWQgfHwgXCIwXCI7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImN1cnJlbnQgdXJsOiBcIiwgdGhpcy5yb3V0ZXIudXJsKTtcclxuICAgICAgICAgIGNvbnN0IHBhdGhTZWdtZW50ID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAgIGNvbnN0IGxhc3RTZWdtZW50ID0gcGF0aFNlZ21lbnRbcGF0aFNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICBpZiAobGFzdFNlZ21lbnQgPT09IFwiZWRpdFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXRoU2VnbWVudC5zbGljZSgwLCBwYXRoU2VnbWVudC5sZW5ndGggLSAyKTtcclxuICAgICAgICAgICAgbmV3UGF0aC5wdXNoKHJlZmVyZW5jZUlkKTtcclxuICAgICAgICAgICAgbmV3UGF0aC5wdXNoKFwibmV3XCIpO1xyXG4gICAgICAgICAgICBjb25zdCBjYWNoZVpNb2RlbCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKFwiY2xvbmVOZXdNb2RlbFwiKTtcclxuICAgICAgICAgICAgaWYgKCFjYWNoZVpNb2RlbCkge1xyXG4gICAgICAgICAgICAgIC8vIFNraXAgaWYgaXQgQ2xvbmVOZXdcclxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlLCB7IHNraXBMb2NhdGlvbkNoYW5nZTogdHJ1ZSB9KS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuek1vZGVsID0ge307XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwLmlzRWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cC5pc05ldyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShuZXdQYXRoKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShuZXdQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChsYXN0U2VnbWVudCA9PT0gXCJuZXdcIikge1xyXG4gICAgICAgICAgICBncm91cC56TW9kZWwgPSB7fTtcclxuICAgICAgICAgICAgZ3JvdXAuZm9ybS5yZXNldCgpO1xyXG4gICAgICAgICAgICAvL2dyb3VwLmZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzTmV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuek1vZGVsW1xyXG4gICAgICAgICAgICAgIGdyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkXHJcbiAgICAgICAgICAgIF0gPSBncm91cC5wYXJlbnRSZWZlcmVuY2VJZC50b1N0cmluZygpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2dyb3VwLmVkaXRNb2RlbFVSTCwgcmVmZXJlbmNlSWQsIFwibmV3XCJdLCB7XHJcbiAgICAgICAgICAgICAgcmVsYXRpdmVUbzogZ3JvdXAuY3RybFNjb3BlLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy90aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuZWRpdE1vZGVsVVJMLCByZWZlcmVuY2VJZCwgXCJuZXdcIl0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZU1vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGxldCBjcmVhdGVNb2RlbHJlcyA9IG51bGw7XHJcbiAgICBsZXQgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgbGV0IF9ncm91cDogWkdyb3VwID0gZ3JvdXA7XHJcblxyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGlmIChldmVudC5kYXRhICYmIGV2ZW50LmRhdGEuU3ViVHlwZSkge1xyXG4gICAgICAgIGZnID0gZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXS5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBfZ3JvdXAgPSBncm91cFsnXycgKyBldmVudC5kYXRhLlN1YlR5cGVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAgXHJcbiAgICBpZiAoIWZnLmRpcnR5KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIkZvcm0gaXMgbm90IGRpcnR5IGhlbmNlIHJlY29yZCBpcyBub3Qgc2F2ZS5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIGNvbnN0IGVycm9ycyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Rm9ybUdyb3VwRXJyb3JzKGZnLCB0aGlzLmFsZXJ0U2VydmljZSwgZ3JvdXApO1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJGb3JtIFZhbGlkYXRpb24gZ290IGVycm9yKHMpOlwiLCBlcnJvcnMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgb2YoX2dyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGNyZWF0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlQ3JlYXRlTW9kZWwoX2dyb3VwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihfZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG5ld01vZGVsID0gT2JqZWN0LmFzc2lnbih7fSwgX2dyb3VwLnpNb2RlbCk7XHJcbiAgICAgICAgICBaQ29tcG9uZW50SGVscGVyLnJlbW92ZU51bGxGaWVsZHMobmV3TW9kZWwpO1xyXG4gICAgICAgICAgLy8gT2JqZWN0LmtleXMobmV3TW9kZWwpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgLy8gICBpZiAobmV3TW9kZWxba2V5XSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8gICAgIGRlbGV0ZSBuZXdNb2RlbFtrZXldO1xyXG4gICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgIC8vIGlmICghbmV3TW9kZWwuSWQpIHtcclxuICAgICAgICAgIC8vICAgbmV3TW9kZWwuSWQgPSAwO1xyXG4gICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2VcclxuICAgICAgICAgICAgLmh0dHBQb3N0JChcclxuICAgICAgICAgICAgICBfZ3JvdXAucmVzb3VyY2VVUkwsIC8vICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsXHJcbiAgICAgICAgICAgICAgbmV3TW9kZWxcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgIGNyZWF0ZU1vZGVscmVzID0gcmVzcDtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgIG1hcCgocmVzKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgXCJSZWNvcmQgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCIpXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApOyBcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbDogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciBjcmVhdGVkLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICBpZiAoem1vZGVsKSB7XHJcblxyXG4gICAgICAgICAgICAvL3N1cHBvcnQgb2xkIGFuZCBuZXcgd2ViYXBpIG1ldGhvZFxyXG4gICAgICAgICAgICBpZiAoem1vZGVsLkRhdGEpIHtcclxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIHptb2RlbC5EYXRhKTtcclxuICAgICAgICAgICAgICBmZy5wYXRjaFZhbHVlKHptb2RlbC5EYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh6bW9kZWxbXCJJZFwiXSkge1xyXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2dyb3VwLnpNb2RlbCwgem1vZGVsKTtcclxuICAgICAgICAgICAgICBmZy5wYXRjaFZhbHVlKHptb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIF9ncm91cC5yZWZlcmVuY2VJZCA9IF9ncm91cC56TW9kZWwuSWQ7XHJcbiAgICAgICAgICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJDcmVhdGVNb2RlbChfZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNyZWF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMgPT0gbnVsbCB8fCBjcmVhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzID09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3AgJiYgX2dyb3VwLnpNb2RlbC5JZCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgIF9ncm91cC5pc05ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIF9ncm91cC5pc0VkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIF9ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIF9ncm91cC5jYW5jZWxCdXR0b25OYW1lID0gXCJDbG9zZVwiO1xyXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2dyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZShyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZmcubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRG9uZSB1cGRhdGVNb2RlbCB1cGRhdGVkIHpNb2RlbDpcIiwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgLy8gdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcIlJlY29yZCBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5cIik7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkgeyAgXHJcbiAgICBsZXQgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgbGV0IF9ncm91cDogWkdyb3VwID0gZ3JvdXA7XHJcblxyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGlmIChldmVudC5kYXRhICYmIGV2ZW50LmRhdGEuU3ViVHlwZSkge1xyXG4gICAgICAgIGZnID0gZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXS5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBfZ3JvdXAgPSBncm91cFsnXycgKyBldmVudC5kYXRhLlN1YlR5cGVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy5kaXJ0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJGb3JtIGlzIG5vdCBkaXJ0eSBoZW5jZSByZWNvcmQgaXMgbm90IHNhdmUuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICBjb25zdCBlcnJvcnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEZvcm1Hcm91cEVycm9ycyhmZywgdGhpcy5hbGVydFNlcnZpY2UsIGdyb3VwKTtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBWYWxpZGF0aW9uIGdvdCBlcnJvcihzKTpcIiwgZXJyb3JzKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIG9mKF9ncm91cC56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSB1cGRhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZVVwZGF0ZU1vZGVsKF9ncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2dyb3VwLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5odHRwUHV0JChfZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIF9ncm91cC56TW9kZWwuSWQsIF9ncm91cC56TW9kZWwpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgIG1hcCgocmVzKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgXCJSZWNvcmQgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCIpXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgdXBkYXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgaWYgKHptb2RlbCAmJiB6bW9kZWwuRGF0YSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIHptb2RlbC5EYXRhKTtcclxuICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZSh6bW9kZWwuRGF0YSk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRG9uZSB1cGRhdGVNb2RlbCB1cGRhdGVkIHpNb2RlbDpcIiwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoem1vZGVsICYmIHptb2RlbFtcIklkXCJdKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2dyb3VwLnpNb2RlbCwgem1vZGVsKTtcclxuICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZSh6bW9kZWwpO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRvbmUgdXBkYXRlTW9kZWwgdXBkYXRlZCB6TW9kZWw6XCIsIGZnLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgX2dyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyVXBkYXRlTW9kZWwoX2dyb3VwKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgIC8vIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAvLyB0aGlzLndlYkFwaVNlcnZpY2VcclxuICAgIC8vICAgLmh0dHBQdXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsIGdyb3VwLnpNb2RlbClcclxuICAgIC8vICAgLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgIC8vICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAvLyAgICAgZmcucGF0Y2hWYWx1ZShyZXNwKTtcclxuICAgIC8vICAgICBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwiRG9uZSB1cGRhdGVNb2RlbCB1cGRhdGVkIHpNb2RlbDpcIiwgZmcudmFsdWUpO1xyXG4gICAgLy8gICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvbmVOZXdNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7IFxyXG4gICAgbGV0IF9ncm91cDogWkdyb3VwID0gZ3JvdXA7XHJcblxyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGlmIChldmVudC5kYXRhICYmIGV2ZW50LmRhdGEuU3ViVHlwZSkge1xyXG4gICAgICAgIF9ncm91cCA9IGdyb3VwWydfJyArIGV2ZW50LmRhdGEuU3ViVHlwZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIF9ncm91cC5mb3JtLnZhbHVlKTtcclxuICAgIF9ncm91cC56TW9kZWwuSWQgPSAwO1xyXG5cclxuICAgIGNvbnN0IGNsZWFyRmllbGRzID0gW1wiV0ZTX0RvY3VtZW50SWRcIiwgXCJXRlNfU3RhdHVzQ29kZVwiLCBcIldGU19TdGF0dXNOYW1lXCJdO1xyXG4gICAgY2xlYXJGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKF9ncm91cC56TW9kZWwuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7XHJcbiAgICAgICAgX2dyb3VwLnpNb2RlbFtmaWVsZF0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhY2hlU2VydmljZS5zZXRDYWNoZShcImNsb25lTmV3TW9kZWxcIiwgZ3JvdXAuek1vZGVsKTtcclxuICAgIHRoaXMubmV3TW9kZWwobnVsbCwgZ3JvdXApO1xyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgIF9ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWxldGVNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7IFxyXG4gICAgbGV0IGZnOiBGb3JtR3JvdXAgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGxldCBfZ3JvdXA6IFpHcm91cCA9IGdyb3VwO1xyXG5cclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBpZiAoZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLlN1YlR5cGUpIHtcclxuICAgICAgICBmZyA9IGdyb3VwWydfJyArIGV2ZW50LmRhdGEuU3ViVHlwZV0uZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgX2dyb3VwID0gZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgIFxyXG4gICAgb2YoX2dyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGRlbGV0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlRGVsZXRlTW9kZWwoX2dyb3VwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgIF9ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJEZWxldGUgUmVjb3JkXCIsIFwiQXJlIHlvdSBzdXJlP1wiLFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJZZXNcIikge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICAgICAgX2dyb3VwLnpNb2RlbC5EaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgLmh0dHBQdXQkKF9ncm91cC5yZXNvdXJjZVVSTCArIFwiL1wiICsgX2dyb3VwLnpNb2RlbC5JZCwgX2dyb3VwLnpNb2RlbClcclxuICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcCgocmVzKSA9PlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCBcIlJlY29yZCBpcyBkZWxldGVkIHN1Y2Nlc3NmdWxseS5cIilcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIGRlbGV0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJEZWxldGVNb2RlbChfZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5QmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVVcGRhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVVcGRhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVEZWxldGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZURlbGV0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVEZWxldGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZU5ld01vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlTmV3b2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVDcmVhdGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZUNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBiZWZvcmVQYWdlSW5pdGlhbGlzZShncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZShncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC56TW9kZWwuSWQpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiek1vZGVsLklkIGlzIG5vdCBkZWZpbmVkXCIsIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGFmdGVyTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJOZXdNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlck5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJDcmVhdGVNb2RlbChncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckNyZWF0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlclVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlclVwZGF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyVXBkYXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyRGVsZXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckRlbGV0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBvbkFjdGlvbihncm91cDogWkdyb3VwKSB7XHJcbiAgLy8gICB0aGlzLmFjdGlvblNoZWV0Q3RybFxyXG4gIC8vICAgICAuY3JlYXRlKHtcclxuICAvLyAgICAgICBoZWFkZXI6IFwiQ2hvb3NlIGFuIEFjdGlvblwiLFxyXG4gIC8vICAgICAgIGJ1dHRvbnM6IGdyb3VwLnRvcFJpZ2h0QWN0aW9uQnV0dG9uXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIC50aGVuKGFjdGlvblNoZWV0RWwgPT4ge1xyXG4gIC8vICAgICAgIGFjdGlvblNoZWV0RWwucHJlc2VudCgpO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldE1vZGVsVmFsdWUocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAvLyAgIGdyb3VwLnpNb2RlbFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XHJcbiAgLy8gICBpZiAoZ3JvdXAuaXNMb2FkaW5nKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGZnID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgLy8gICBpZiAoIWZnKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICwgbm8tZGVidWdnZXJcclxuICAvLyAgICAgZGVidWdnZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBmYyA9IGZnLmNvbnRyb2xzW3Byb3BlcnR5TmFtZV07XHJcbiAgLy8gICBpZiAoIWZjKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgLy8gICAgIGRlYnVnZ2VyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZmMuc2V0VmFsdWUodmFsdWUpO1xyXG4gIC8vICAgZmMubWFya0FzRGlydHkoKTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzaG93ek1vZGFsKFxyXG4gICAgY29sRmllbGRzJDogc3RyaW5nIHwgT2JzZXJ2YWJsZTxBcnJheTxaRmllbGQ+PixcclxuICAgIHBhcmVudEdyb3VwOiBaR3JvdXAsXHJcbiAgICBmb3JtSGVhZGVyOiBzdHJpbmcsXHJcbiAgICB6TW9kZWw/OiBhbnksXHJcbiAgICByZWZlcklkPzogc3RyaW5nLFxyXG4gICAgY29tcG9uZW50U2l6ZT86IFpDb21wb25lbnRTaXplLFxyXG4gICAgc2tpcElzRGlydHlDaGVjaz86IGJvb2xlYW5cclxuICApIHtcclxuICAgIGNvbnN0IG1vZGFsY29tcG9uZW50ID0gWm1vZGFsQ29tcG9uZW50O1xyXG4gICAgY29uc3QgbW9kYWxtb2JpbGVjb21wb25lbnQgPSBabW9kYWxNb2JpbGVDb21wb25lbnQ7XHJcblxyXG4gICAgaWYgKHBhcmVudEdyb3VwKSB7XHJcbiAgICAgIC8vIGRpc2FibGUgaXNUcmlnZ2VyZWQgYmVmb3JlIGRpc3BsYXkgdGhlIHBvcHVwLlxyXG4gICAgICBwYXJlbnRHcm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coY29sRmllbGRzJCwgcGFyZW50R3JvdXAsIGZvcm1IZWFkZXIsIG1vZGFsY29tcG9uZW50LCBtb2RhbG1vYmlsZWNvbXBvbmVudCwgek1vZGVsLCByZWZlcklkLCBjb21wb25lbnRTaXplLCBza2lwSXNEaXJ0eUNoZWNrKVxyXG4gICAgLy9jb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coKTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVQb3N0KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdOYW1lJzogbmFtZSxcclxuICAgICAgJ1ZhbHVlJzogSlNPTi5zdHJpbmdpZnkodmFsdWUpXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKGNvb2tpZVN0b3JlVVJMLCBjb29raWVTdG9yZVZhbHVlKS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJncmlkIGNvbmZpZyBzYXZlZChcIiArIHJlcy5zdGF0dXMgKyBcIik6IFwiLCByZXMpO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTsgXHJcbiAgfSBcclxuXHJcbiAgcHVibGljIGNvb2tpZVN0b3JlR2V0KG5hbWU6IHN0cmluZywgYWNjZXNzVG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBjb29raWVTdG9yZVVSTCA9IHRoaXMub2F1dGhFbnZpcm9ubWVudFVybCArIFwiYXBpL0Nvb2tpZVN0b3Jlcy8/bmFtZT1cIiArIG5hbWU7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwR2V0JChjb29raWVTdG9yZVVSTCwgeyBoZWFkZXJzOiBhY2Nlc3NUb2tlbiB9KS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7IFxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTsgXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVEZWxldGVNdWx0aXBsZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZm9yIFBvc3QgdG8gQ29va2llU3RvcmVcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJBZG1pbi9EZWxldGVNdWx0aXBsZUNvb2tpZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdjb250YWluTmFtZSc6IG5hbWVcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoY29va2llU3RvcmVVUkwsIGNvb2tpZVN0b3JlVmFsdWUpLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHsgXHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2hHcmlkKGdyb3VwOiBaR3JvdXApIHtcclxuICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtcImdyaWRPcHRpb25zXCJdIGFzIFpHcmlkO1xyXG4gIGlmICh6Z3JpZENvbnRyb2wpIHtcclxuICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgfVxyXG4gIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbn1cclxuIl19