client-core-services 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2020/client-core-services.mjs +5 -0
- package/esm2020/lib/my-lib.module.mjs +98 -0
- package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
- package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
- package/esm2020/lib/services/api/api.service.mjs +611 -0
- package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
- package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
- package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
- package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
- package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
- package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
- package/esm2020/lib/services/chart/chart.service.mjs +166 -0
- package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
- package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
- package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
- package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
- package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
- package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
- package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
- package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
- package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
- package/esm2020/lib/services/download/download.service.mjs +151 -0
- package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
- package/esm2020/lib/services/env/env.service.mjs +232 -0
- package/esm2020/lib/services/env/serverHostList.mjs +56 -0
- package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
- package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
- package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
- package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
- package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
- package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
- package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
- package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
- package/esm2020/lib/services/loader/loader.service.mjs +17 -0
- package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
- package/esm2020/lib/services/model/model.service.mjs +30 -0
- package/esm2020/lib/services/notify/notification.service.mjs +84 -0
- package/esm2020/lib/services/operator/operator.service.mjs +58 -0
- package/esm2020/lib/services/permission/permission.service.mjs +88 -0
- package/esm2020/lib/services/router/router.service.mjs +78 -0
- package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
- package/esm2020/lib/services/storage/storage.service.mjs +749 -0
- package/esm2020/lib/services/tree-component/interface.mjs +6 -0
- package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
- package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
- package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
- package/esm2020/lib/shared/configuration/config.mjs +76 -0
- package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
- package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
- package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
- package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
- package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
- package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
- package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
- package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
- package/esm2020/lib/shared/platform.mjs +2 -0
- package/esm2020/public-api.mjs +53 -0
- package/fesm2015/client-core-services.mjs +15487 -0
- package/fesm2015/client-core-services.mjs.map +1 -0
- package/fesm2020/client-core-services.mjs +15482 -0
- package/fesm2020/client-core-services.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/my-lib.module.d.ts +18 -0
- package/lib/services/api/api-call/api-call.service.d.ts +60 -0
- package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
- package/lib/services/api/api.service.d.ts +88 -0
- package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
- package/lib/services/api/auth/auth.service.d.ts +50 -0
- package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
- package/lib/services/api/common-api/common-api.service.d.ts +22 -0
- package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
- package/lib/services/api/public-api/public-api.service.d.ts +14 -0
- package/lib/services/chart/chart.service.d.ts +21 -0
- package/lib/services/check-if/check-if.service.d.ts +50 -0
- package/lib/services/common-utils/common-function.service.d.ts +84 -0
- package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
- package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
- package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
- package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
- package/lib/services/data-share/data-share.service.d.ts +174 -0
- package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
- package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
- package/lib/services/download/download.service.d.ts +35 -0
- package/lib/services/encryption/encryption.service.d.ts +8 -0
- package/lib/services/env/env.service.d.ts +44 -0
- package/lib/services/env/serverHostList.d.ts +9 -0
- package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
- package/lib/services/form/form-control/form-control.service.d.ts +44 -0
- package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
- package/lib/services/form/form-value/form-value.service.d.ts +32 -0
- package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
- package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
- package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
- package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
- package/lib/services/loader/loader.service.d.ts +8 -0
- package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
- package/lib/services/model/model.service.d.ts +11 -0
- package/lib/services/notify/notification.service.d.ts +22 -0
- package/lib/services/operator/operator.service.d.ts +27 -0
- package/lib/services/permission/permission.service.d.ts +18 -0
- package/lib/services/router/router.service.d.ts +14 -0
- package/lib/services/storage/cookies.service.d.ts +11 -0
- package/lib/services/storage/storage.service.d.ts +132 -0
- package/lib/services/tree-component/interface.d.ts +13 -0
- package/lib/services/tree-component/tree-component.service.d.ts +38 -0
- package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
- package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
- package/lib/shared/configuration/config.d.ts +144 -0
- package/lib/shared/configuration/editor-config.d.ts +72 -0
- package/lib/shared/enums/common.enum.d.ts +16 -0
- package/lib/shared/enums/config.enum.d.ts +54 -0
- package/lib/shared/enums/end-point.enum.d.ts +66 -0
- package/lib/shared/enums/flags.enum.d.ts +18 -0
- package/lib/shared/enums/keycodes.enum.d.ts +120 -0
- package/lib/shared/enums/operator_type.enum.d.ts +9 -0
- package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
- package/lib/shared/platform.d.ts +1 -0
- package/package.json +40 -0
- package/public-api.d.ts +49 -0
|
@@ -0,0 +1,766 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Common } from '../../../shared/enums/common.enum';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../common-utils/common-function.service";
|
|
5
|
+
import * as i2 from "../../storage/storage.service";
|
|
6
|
+
import * as i3 from "../../common-utils/core-function/core-function.service";
|
|
7
|
+
import * as i4 from "../../api/api.service";
|
|
8
|
+
import * as i5 from "./../../check-if/check-if.service";
|
|
9
|
+
import * as i6 from "../../model/model.service";
|
|
10
|
+
export class ApiCallService {
|
|
11
|
+
constructor(commonFunctionService, storageService, coreFunctionService, apiService, checkIfService, modalService) {
|
|
12
|
+
this.commonFunctionService = commonFunctionService;
|
|
13
|
+
this.storageService = storageService;
|
|
14
|
+
this.coreFunctionService = coreFunctionService;
|
|
15
|
+
this.apiService = apiService;
|
|
16
|
+
this.checkIfService = checkIfService;
|
|
17
|
+
this.modalService = modalService;
|
|
18
|
+
this.pageNumber = Common.PAGE_NO;
|
|
19
|
+
this.itemNumOfGrid = Common.ITEM_NUM_OF_GRID;
|
|
20
|
+
}
|
|
21
|
+
getOnchangePayload(tableFields, formValue, formValueWithCustomData) {
|
|
22
|
+
let staticModal = [];
|
|
23
|
+
if (tableFields && tableFields.length > 0) {
|
|
24
|
+
tableFields.forEach((element) => {
|
|
25
|
+
if (element.field_name && element.field_name != '') {
|
|
26
|
+
if (element.onchange_api_params && element.onchange_call_back_field && !element.do_not_auto_trigger_on_edit) {
|
|
27
|
+
const checkFormGroup = element.onchange_call_back_field.indexOf("FORM_GROUP");
|
|
28
|
+
const checkCLTFN = element.onchange_api_params.indexOf('CLTFN');
|
|
29
|
+
if (checkFormGroup == -1 && checkCLTFN == -1) {
|
|
30
|
+
const payload = this.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, formValueWithCustomData);
|
|
31
|
+
if (element.onchange_api_params.indexOf('QTMP') >= 0) {
|
|
32
|
+
if (element && element.formValueAsObjectForQtmp) {
|
|
33
|
+
payload["data"] = formValue;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
payload["data"] = formValueWithCustomData;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
staticModal.push(payload);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
switch (element.type) {
|
|
43
|
+
case "stepper":
|
|
44
|
+
if (element.list_of_fields.length > 0) {
|
|
45
|
+
element.list_of_fields.forEach((step) => {
|
|
46
|
+
if (step.list_of_fields.length > 0) {
|
|
47
|
+
step.list_of_fields.forEach((data) => {
|
|
48
|
+
if (data.onchange_api_params && data.onchange_call_back_field && !data.do_not_auto_trigger_on_edit) {
|
|
49
|
+
const checkFormGroup = data.onchange_call_back_field.indexOf("FORM_GROUP");
|
|
50
|
+
if (checkFormGroup == -1) {
|
|
51
|
+
const payload = this.getPaylodWithCriteria(data.onchange_api_params, data.onchange_call_back_field, data.onchange_api_params_criteria, formValueWithCustomData);
|
|
52
|
+
if (data.onchange_api_params.indexOf('QTMP') >= 0) {
|
|
53
|
+
if (element && element.formValueAsObjectForQtmp) {
|
|
54
|
+
payload["data"] = formValue;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
payload["data"] = formValueWithCustomData;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
staticModal.push(payload);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (data.tree_view_object && data.tree_view_object.field_name != "") {
|
|
64
|
+
let editeTreeModifyData = JSON.parse(JSON.stringify(data.tree_view_object));
|
|
65
|
+
if (editeTreeModifyData.onchange_api_params && editeTreeModifyData.onchange_call_back_field) {
|
|
66
|
+
staticModal.push(this.getPaylodWithCriteria(editeTreeModifyData.onchange_api_params, editeTreeModifyData.onchange_call_back_field, editeTreeModifyData.onchange_api_params_criteria, formValueWithCustomData));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
if (element.tree_view_object && element.tree_view_object.field_name != "") {
|
|
76
|
+
let editeTreeModifyData = JSON.parse(JSON.stringify(element.tree_view_object));
|
|
77
|
+
if (editeTreeModifyData.onchange_api_params && editeTreeModifyData.onchange_call_back_field) {
|
|
78
|
+
staticModal.push(this.getPaylodWithCriteria(editeTreeModifyData.onchange_api_params, editeTreeModifyData.onchange_call_back_field, editeTreeModifyData.onchange_api_params_criteria, formValueWithCustomData));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (element.type && element.type == 'pdf_view') {
|
|
83
|
+
staticModal.push(this.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, formValueWithCustomData));
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return staticModal;
|
|
88
|
+
}
|
|
89
|
+
getStaticDataPayload(staticModal, object, formDataObject, multipleFormCollection, tableFields, formFieldButtons, tab, form, saveResponceData, editedRowIndex) {
|
|
90
|
+
let formValue = object;
|
|
91
|
+
if (multipleFormCollection && multipleFormCollection.length > 0) {
|
|
92
|
+
let multiCollection = JSON.parse(JSON.stringify(multipleFormCollection));
|
|
93
|
+
formValue = this.commonFunctionService.getFormDataInMultiformCollection(multiCollection, object);
|
|
94
|
+
}
|
|
95
|
+
let staticModalG = this.commanApiPayload([], tableFields, formFieldButtons, formValue);
|
|
96
|
+
if (staticModalG && staticModalG.length > 0) {
|
|
97
|
+
staticModalG.forEach((element) => {
|
|
98
|
+
staticModal.push(element);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (tab && tab.api_params && tab.api_params != null && tab.api_params != "" && tab.api_params != undefined) {
|
|
102
|
+
let criteria = [];
|
|
103
|
+
if (tab.api_params_criteria && tab.api_params_criteria != null) {
|
|
104
|
+
criteria = tab.api_params_criteria;
|
|
105
|
+
}
|
|
106
|
+
staticModal.push(this.getPaylodWithCriteria(tab.api_params, tab.call_back_field, criteria, {}));
|
|
107
|
+
}
|
|
108
|
+
if (form && form.api_params && form.api_params != null && form.api_params != "" && form.api_params != undefined) {
|
|
109
|
+
if (form.api_params == 'QTMP:EMAIL_WITH_TEMP:QUOTATION_LETTER') {
|
|
110
|
+
object = saveResponceData;
|
|
111
|
+
}
|
|
112
|
+
let criteria = [];
|
|
113
|
+
if (form.api_params_criteria && form.api_params_criteria != null) {
|
|
114
|
+
criteria = form.api_params_criteria;
|
|
115
|
+
}
|
|
116
|
+
if (editedRowIndex > -1) {
|
|
117
|
+
formDataObject = formValue;
|
|
118
|
+
}
|
|
119
|
+
staticModal.push(this.getPaylodWithCriteria(form.api_params, form.call_back_field, criteria, formDataObject));
|
|
120
|
+
}
|
|
121
|
+
return staticModal;
|
|
122
|
+
}
|
|
123
|
+
getOnClickLoadDataPayloads(field, multipleFormCollection, formValue, formValueWithCustomData) {
|
|
124
|
+
let api_params = field.onClickApiParams;
|
|
125
|
+
let callBackfield = field.onClickCallBackField;
|
|
126
|
+
let criteria = field.onClickApiParamsCriteria;
|
|
127
|
+
const payload = this.getPaylodWithCriteria(api_params, callBackfield, criteria, formValue);
|
|
128
|
+
let payloads = [];
|
|
129
|
+
payloads.push(this.checkQtmpApi(api_params, field, payload, multipleFormCollection, formValue, formValueWithCustomData));
|
|
130
|
+
return payloads;
|
|
131
|
+
}
|
|
132
|
+
getPaylodWithCriteria(params, callback, criteria, object, data_template) {
|
|
133
|
+
const tabName = this.storageService.GetActiveMenu();
|
|
134
|
+
let activeRole = this.storageService.getActiveRole();
|
|
135
|
+
let tab = '';
|
|
136
|
+
let roleName = "";
|
|
137
|
+
if (tabName && tabName.name && tabName.name != '') {
|
|
138
|
+
tab = tabName.name;
|
|
139
|
+
}
|
|
140
|
+
if (activeRole && activeRole.name != '') {
|
|
141
|
+
roleName = activeRole.name;
|
|
142
|
+
}
|
|
143
|
+
let staticModal = {
|
|
144
|
+
"key": this.commonFunctionService.getRefcode(),
|
|
145
|
+
"key2": this.storageService.getAppId(),
|
|
146
|
+
"value": params,
|
|
147
|
+
"log": this.storageService.getUserLog(),
|
|
148
|
+
"crList": [],
|
|
149
|
+
"module": this.storageService.getModule(),
|
|
150
|
+
"tab": tab
|
|
151
|
+
};
|
|
152
|
+
if (roleName != '') {
|
|
153
|
+
staticModal['role'] = roleName;
|
|
154
|
+
}
|
|
155
|
+
if (data_template) {
|
|
156
|
+
staticModal['data_template'] = data_template;
|
|
157
|
+
}
|
|
158
|
+
if (callback && callback != '') {
|
|
159
|
+
staticModal['key3'] = callback;
|
|
160
|
+
}
|
|
161
|
+
if (params.indexOf("FORM_GROUP") >= 0 || params.indexOf("QTMP") >= 0) {
|
|
162
|
+
staticModal["data"] = object;
|
|
163
|
+
}
|
|
164
|
+
if (criteria && criteria.length > 0) {
|
|
165
|
+
const crList = this.getCriteriaList(criteria, object);
|
|
166
|
+
if (crList && crList.length > 0) {
|
|
167
|
+
crList.forEach((element) => {
|
|
168
|
+
staticModal.crList.push(element);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return staticModal;
|
|
173
|
+
}
|
|
174
|
+
getCriteriaList(criteria, object) {
|
|
175
|
+
const crList = [];
|
|
176
|
+
criteria.forEach((element) => {
|
|
177
|
+
const criteria = element.split(";");
|
|
178
|
+
const fValue = criteria[2];
|
|
179
|
+
let fvalue = '';
|
|
180
|
+
if (criteria[3] && criteria[3] == 'STATIC') {
|
|
181
|
+
fvalue = fValue;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
fvalue = this.commonFunctionService.getObjectValue(fValue, object);
|
|
185
|
+
}
|
|
186
|
+
const list = {
|
|
187
|
+
"fName": criteria[0],
|
|
188
|
+
"fValue": fvalue,
|
|
189
|
+
"operator": criteria[1]
|
|
190
|
+
};
|
|
191
|
+
if (this.coreFunctionService.isNotBlank(fvalue)) {
|
|
192
|
+
crList.push(list);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
return crList;
|
|
196
|
+
}
|
|
197
|
+
getTabsPayloadForCountList(tabs) {
|
|
198
|
+
let payloads = [];
|
|
199
|
+
if (tabs && tabs.length >= 1) {
|
|
200
|
+
tabs.forEach((tab) => {
|
|
201
|
+
if (tab.grid) {
|
|
202
|
+
let grid_api_params_criteria = [];
|
|
203
|
+
if (this.checkIfService.isGridFieldExist(tab, "api_params_criteria")) {
|
|
204
|
+
grid_api_params_criteria = tab.grid.api_params_criteria;
|
|
205
|
+
}
|
|
206
|
+
const payload = this.getPaylodWithCriteria(tab.tab_name, tab.tab_name + "_" + tab.name, grid_api_params_criteria, {});
|
|
207
|
+
payload['countOnly'] = true;
|
|
208
|
+
payloads.push(payload);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
return payloads;
|
|
213
|
+
}
|
|
214
|
+
getTabsCountPyload(tabs) {
|
|
215
|
+
let payloads = this.getTabsPayloadForCountList(tabs);
|
|
216
|
+
if (payloads && payloads.length > 0) {
|
|
217
|
+
this.apiService.getGridCountData(payloads);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
commanApiPayload(headElement, tableField, actionButton, object) {
|
|
221
|
+
const staticModalGroup = [];
|
|
222
|
+
let staticModal = {};
|
|
223
|
+
if (headElement.length > 0) {
|
|
224
|
+
headElement.forEach((element) => {
|
|
225
|
+
if (element.api_params && element.api_params != '') {
|
|
226
|
+
let call_back_field = '';
|
|
227
|
+
let criteria = [];
|
|
228
|
+
if (element.call_back_field && element.call_back_field != '') {
|
|
229
|
+
call_back_field = element.call_back_field;
|
|
230
|
+
}
|
|
231
|
+
if (element.api_params_criteria && element.api_params_criteria != '') {
|
|
232
|
+
criteria = element.api_params_criteria;
|
|
233
|
+
}
|
|
234
|
+
staticModal = this.getPaylodWithCriteria(element.api_params, call_back_field, criteria, object ? object : {});
|
|
235
|
+
if (element.adkey && element.adkey != '' && element.adkey != null) {
|
|
236
|
+
staticModal['adkeys'] = element.adkey;
|
|
237
|
+
staticModalGroup.push(staticModal);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
staticModalGroup.push(staticModal);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
if (actionButton.length > 0) {
|
|
246
|
+
actionButton.forEach((element) => {
|
|
247
|
+
if (element.api_params && element.api_params != '') {
|
|
248
|
+
let call_back_field = '';
|
|
249
|
+
let criteria = [];
|
|
250
|
+
if (element.call_back_field && element.call_back_field != '') {
|
|
251
|
+
call_back_field = element.call_back_field;
|
|
252
|
+
}
|
|
253
|
+
if (element.api_params_criteria && element.api_params_criteria != '') {
|
|
254
|
+
criteria = element.api_params_criteria;
|
|
255
|
+
}
|
|
256
|
+
const staticModal = this.getPaylodWithCriteria(element.api_params, call_back_field, criteria, object ? object : {});
|
|
257
|
+
staticModalGroup.push(staticModal);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
if (tableField.length > 0) {
|
|
262
|
+
tableField.forEach((element) => {
|
|
263
|
+
let call_back_field = '';
|
|
264
|
+
let criteria = [];
|
|
265
|
+
if (element.api_params && element.api_params != '' && element.type != "typeahead") {
|
|
266
|
+
if (element.call_back_field && element.call_back_field != '') {
|
|
267
|
+
call_back_field = element.call_back_field;
|
|
268
|
+
}
|
|
269
|
+
if (element.api_params_criteria && element.api_params_criteria != '') {
|
|
270
|
+
criteria = element.api_params_criteria;
|
|
271
|
+
}
|
|
272
|
+
const staticModal = this.getPaylodWithCriteria(element.api_params, call_back_field, criteria, object ? object : {}, element.data_template);
|
|
273
|
+
if (element.api_params.indexOf("html_view") >= 0) {
|
|
274
|
+
staticModal["data"] = object;
|
|
275
|
+
}
|
|
276
|
+
staticModalGroup.push(staticModal);
|
|
277
|
+
}
|
|
278
|
+
switch (element.type) {
|
|
279
|
+
case "list_of_fields":
|
|
280
|
+
case "group_of_fields":
|
|
281
|
+
if (element.list_of_fields && element.list_of_fields.length > 0) {
|
|
282
|
+
element.list_of_fields.forEach((data) => {
|
|
283
|
+
if (data && data != null) {
|
|
284
|
+
let call_back_field = '';
|
|
285
|
+
let criteria = [];
|
|
286
|
+
if (data.api_params && data.api_params != '' && data.type != "typeahead") {
|
|
287
|
+
if (data.call_back_field && data.call_back_field != '') {
|
|
288
|
+
call_back_field = data.call_back_field;
|
|
289
|
+
}
|
|
290
|
+
if (data.api_params_criteria && data.api_params_criteria != '') {
|
|
291
|
+
criteria = data.api_params_criteria;
|
|
292
|
+
}
|
|
293
|
+
const staticModalListOfFields = this.getPaylodWithCriteria(data.api_params, call_back_field, criteria, object ? object : {}, element.data_template);
|
|
294
|
+
if (data.api_params.indexOf("html_view") >= 0) {
|
|
295
|
+
staticModalListOfFields["data"] = object;
|
|
296
|
+
}
|
|
297
|
+
staticModalGroup.push(staticModalListOfFields);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
break;
|
|
303
|
+
case "stepper":
|
|
304
|
+
if (element.list_of_fields && element.list_of_fields.length > 0) {
|
|
305
|
+
element.list_of_fields.forEach((step) => {
|
|
306
|
+
step.list_of_fields.forEach((data) => {
|
|
307
|
+
let call_back_field = '';
|
|
308
|
+
let criteria = [];
|
|
309
|
+
if (data.api_params && data.api_params != '' && data.type != "typeahead") {
|
|
310
|
+
if (data.call_back_field && data.call_back_field != '') {
|
|
311
|
+
call_back_field = data.call_back_field;
|
|
312
|
+
}
|
|
313
|
+
if (data.api_params_criteria && data.api_params_criteria != '') {
|
|
314
|
+
criteria = data.api_params_criteria;
|
|
315
|
+
}
|
|
316
|
+
const staticModalListOfFields = this.getPaylodWithCriteria(data.api_params, call_back_field, criteria, object ? object : {}, element.data_template);
|
|
317
|
+
if (data.api_params.indexOf("html_view") >= 0) {
|
|
318
|
+
staticModalListOfFields["data"] = object;
|
|
319
|
+
}
|
|
320
|
+
staticModalGroup.push(staticModalListOfFields);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
break;
|
|
326
|
+
default:
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
return staticModalGroup;
|
|
332
|
+
}
|
|
333
|
+
getfilterCrlist(headElements, formValue) {
|
|
334
|
+
const filterList = [];
|
|
335
|
+
if (formValue != undefined && headElements && headElements.length > 0) {
|
|
336
|
+
const criteria = [];
|
|
337
|
+
headElements.forEach((element) => {
|
|
338
|
+
if (element != null && element.type != null) {
|
|
339
|
+
let fieldName = element.field_name;
|
|
340
|
+
let value = formValue[element.field_name];
|
|
341
|
+
switch (element.type.toLowerCase()) {
|
|
342
|
+
case "button":
|
|
343
|
+
case "text":
|
|
344
|
+
case "tree_view_selection":
|
|
345
|
+
case "dropdown":
|
|
346
|
+
if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
|
|
347
|
+
if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0 && element.type != 'dropdown') {
|
|
348
|
+
element.api_params_criteria.forEach((cri) => {
|
|
349
|
+
criteria.push(cri);
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
else if (element.multi_select && element.datatype == "object") {
|
|
353
|
+
let fvalue = '';
|
|
354
|
+
if (value && value.length > 0) {
|
|
355
|
+
value.forEach((vl, i) => {
|
|
356
|
+
if ((value.length - 1) == i) {
|
|
357
|
+
fvalue = fvalue + vl;
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
fvalue = fvalue + vl + ":";
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
filterList.push({
|
|
365
|
+
"fName": fieldName,
|
|
366
|
+
"fValue": fvalue,
|
|
367
|
+
"operator": "in"
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
filterList.push({
|
|
372
|
+
"fName": fieldName,
|
|
373
|
+
"fValue": this.getValueForDotFieldName(value, fieldName),
|
|
374
|
+
"operator": this.storageService.getDefaultSearchOperator()
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
break;
|
|
379
|
+
case "number":
|
|
380
|
+
if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
|
|
381
|
+
if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
|
|
382
|
+
element.api_params_criteria.forEach((cri) => {
|
|
383
|
+
criteria.push(cri);
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
filterList.push({
|
|
388
|
+
"fName": fieldName,
|
|
389
|
+
"fValue": this.commonFunctionService.getddnDisplayVal(value),
|
|
390
|
+
"operator": "eq"
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
break;
|
|
395
|
+
case "typeahead":
|
|
396
|
+
if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
|
|
397
|
+
if (this.commonFunctionService.isArray(element.dataFilterCriteria) && element.dataFilterCriteria.length > 0) {
|
|
398
|
+
element.dataFilterCriteria.forEach((cri) => {
|
|
399
|
+
criteria.push(cri);
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
filterList.push({
|
|
404
|
+
"fName": fieldName,
|
|
405
|
+
"fValue": this.getValueForDotFieldName(value, fieldName),
|
|
406
|
+
"operator": this.storageService.getDefaultSearchOperator()
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
break;
|
|
411
|
+
case "info":
|
|
412
|
+
if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
|
|
413
|
+
if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
|
|
414
|
+
element.api_params_criteria.forEach((cri) => {
|
|
415
|
+
criteria.push(cri);
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
filterList.push({
|
|
420
|
+
"fName": fieldName,
|
|
421
|
+
"fValue": this.commonFunctionService.getddnDisplayVal(value),
|
|
422
|
+
"operator": this.storageService.getDefaultSearchOperator()
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
break;
|
|
427
|
+
case "reference_names":
|
|
428
|
+
case "chips":
|
|
429
|
+
if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
|
|
430
|
+
if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
|
|
431
|
+
element.api_params_criteria.forEach((cri) => {
|
|
432
|
+
criteria.push(cri);
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
filterList.push({
|
|
437
|
+
"fName": fieldName + ".name",
|
|
438
|
+
"fValue": this.commonFunctionService.getddnDisplayVal(value),
|
|
439
|
+
"operator": this.storageService.getDefaultSearchOperator()
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
break;
|
|
444
|
+
case "date":
|
|
445
|
+
case "datetime":
|
|
446
|
+
if (formValue && formValue[fieldName] && formValue[fieldName] != '') {
|
|
447
|
+
if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
|
|
448
|
+
element.api_params_criteria.forEach((cri) => {
|
|
449
|
+
criteria.push(cri);
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
filterList.push({
|
|
454
|
+
"fName": fieldName,
|
|
455
|
+
"fValue": this.commonFunctionService.dateFormat(value),
|
|
456
|
+
"operator": "eq"
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
break;
|
|
461
|
+
case "daterange":
|
|
462
|
+
if (formValue && formValue[fieldName] && formValue[fieldName].start != '' && formValue[fieldName].end != null) {
|
|
463
|
+
if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
|
|
464
|
+
element.api_params_criteria.forEach((cri) => {
|
|
465
|
+
criteria.push(cri);
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
filterList.push({
|
|
470
|
+
"fName": fieldName,
|
|
471
|
+
"fValue": this.commonFunctionService.dateFormat(value.start),
|
|
472
|
+
"operator": "gte"
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
if (formValue && formValue[fieldName] && formValue[fieldName].end != '' && formValue[fieldName].end != null) {
|
|
477
|
+
if (this.commonFunctionService.isArray(element.api_params_criteria) && element.api_params_criteria.length > 0) {
|
|
478
|
+
element.api_params_criteria.forEach((cri) => {
|
|
479
|
+
criteria.push(cri);
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
filterList.push({
|
|
484
|
+
"fName": fieldName,
|
|
485
|
+
"fValue": this.commonFunctionService.dateFormat(value.end),
|
|
486
|
+
"operator": "lte"
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
break;
|
|
491
|
+
default:
|
|
492
|
+
break;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
if (criteria && criteria.length > 0) {
|
|
497
|
+
const crList = this.getCriteriaList(criteria, formValue);
|
|
498
|
+
if (crList && crList.length > 0) {
|
|
499
|
+
crList.forEach((element) => {
|
|
500
|
+
filterList.push(element);
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return filterList;
|
|
506
|
+
}
|
|
507
|
+
getValueForDotFieldName(value, fieldName) {
|
|
508
|
+
let crValue = "";
|
|
509
|
+
if (typeof value == "string") {
|
|
510
|
+
crValue = value;
|
|
511
|
+
}
|
|
512
|
+
else if (typeof value == "object") {
|
|
513
|
+
let fName = fieldName.indexOf('.') != -1 ? (fieldName).split('.')[0] : fieldName;
|
|
514
|
+
let objectValue = {};
|
|
515
|
+
objectValue[fName] = value;
|
|
516
|
+
crValue = fieldName.indexOf('.') != -1 ? this.commonFunctionService.getObjectValue(fieldName, objectValue) : this.commonFunctionService.getddnDisplayVal(value);
|
|
517
|
+
}
|
|
518
|
+
return crValue;
|
|
519
|
+
}
|
|
520
|
+
getUserPrefrerence(user) {
|
|
521
|
+
let criteria = "userId._id;eq;" + user._id + ";STATIC";
|
|
522
|
+
let myData = this.setPageNoAndSize(this.getPaylodWithCriteria("user_preference", "", [criteria], {}), 1);
|
|
523
|
+
const payloadData = {
|
|
524
|
+
path: null,
|
|
525
|
+
data: myData
|
|
526
|
+
};
|
|
527
|
+
this.apiService.getFavouriteData(payloadData);
|
|
528
|
+
}
|
|
529
|
+
getUserNotification(pageNo) {
|
|
530
|
+
let user = this.storageService.GetUserInfo();
|
|
531
|
+
const userId = user._id;
|
|
532
|
+
if (userId && userId != null && userId != '') {
|
|
533
|
+
let criteraiList = [];
|
|
534
|
+
criteraiList.push("userId._id;eq;" + userId + ";STATIC");
|
|
535
|
+
criteraiList.push("notificationStatus;eq;UNREAD;STATIC");
|
|
536
|
+
const payload = this.setPageNoAndSize(this.getPaylodWithCriteria('user_notification_master', '', criteraiList, {}), pageNo);
|
|
537
|
+
const callPayload = {
|
|
538
|
+
"path": null,
|
|
539
|
+
"data": payload
|
|
540
|
+
};
|
|
541
|
+
this.apiService.getUserNotification(callPayload);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
getUserNotificationSetting() {
|
|
545
|
+
this.apiService.getUserNotificationSetting();
|
|
546
|
+
}
|
|
547
|
+
getApplicationAllSettings() {
|
|
548
|
+
const payload1 = this.setPageNoAndSize(this.getPaylodWithCriteria("application_setting", "", [], {}), 1);
|
|
549
|
+
this.apiService.getAplicationsSetting(payload1);
|
|
550
|
+
const payload = this.setPageNoAndSize(this.getPaylodWithCriteria("application_theme_setting", "", [], {}), 1);
|
|
551
|
+
this.apiService.getAplicationsThemeSetting(payload);
|
|
552
|
+
}
|
|
553
|
+
getDataForGrid(page, tab, currentMenu, headElements, filterForm, selectContact) {
|
|
554
|
+
// let grid_api_params_criteria = [];
|
|
555
|
+
// if(tab.grid && tab.grid.grid_page_size && tab.grid.grid_page_size != null && tab.grid.grid_page_size != ''){
|
|
556
|
+
// this.itemNumOfGrid = tab.grid.grid_page_size;
|
|
557
|
+
// }
|
|
558
|
+
// if(this.checkIfService.isGridFieldExist(tab,"api_params_criteria")){
|
|
559
|
+
// grid_api_params_criteria = tab.grid.api_params_criteria;
|
|
560
|
+
// }
|
|
561
|
+
//const data = this.setPageNoAndSize(this.getPaylodWithCriteria(currentMenu.name,'',grid_api_params_criteria,''),page);
|
|
562
|
+
//let crList=[];
|
|
563
|
+
// this.getfilterCrlist(headElements,filterForm).forEach((element: any) => {
|
|
564
|
+
// crList.push(element);
|
|
565
|
+
// });
|
|
566
|
+
let payload = this.getDataForGridFilter(page, tab, currentMenu, headElements, filterForm);
|
|
567
|
+
if (selectContact != '') {
|
|
568
|
+
const tabFilterCrlist = {
|
|
569
|
+
"fName": 'account._id',
|
|
570
|
+
"fValue": selectContact,
|
|
571
|
+
"operator": 'eq'
|
|
572
|
+
};
|
|
573
|
+
if (payload?.data?.crList.length > 0)
|
|
574
|
+
payload.data.crList.push(tabFilterCrlist);
|
|
575
|
+
}
|
|
576
|
+
return payload;
|
|
577
|
+
// const getFilterData = {
|
|
578
|
+
// data: data,
|
|
579
|
+
// path: null
|
|
580
|
+
// }
|
|
581
|
+
// return getFilterData;
|
|
582
|
+
}
|
|
583
|
+
preparePayloadWithCrlist(tab, currentMenu, headElements, filterForm) {
|
|
584
|
+
let grid_api_params_criteria = [];
|
|
585
|
+
if (this.checkIfService.isGridFieldExist(tab, "api_params_criteria")) {
|
|
586
|
+
grid_api_params_criteria = tab.grid.api_params_criteria;
|
|
587
|
+
}
|
|
588
|
+
const payload = this.getPaylodWithCriteria(currentMenu.name, '', grid_api_params_criteria, '');
|
|
589
|
+
let crList = [];
|
|
590
|
+
this.getfilterCrlist(headElements, filterForm).forEach((element) => {
|
|
591
|
+
crList.push(element);
|
|
592
|
+
});
|
|
593
|
+
//advanced filter crlist get or add in crlist
|
|
594
|
+
let advancedCrlist = JSON.parse(sessionStorage.getItem("ADVANCE_CRITERIA_LIST"));
|
|
595
|
+
if (advancedCrlist) {
|
|
596
|
+
if (advancedCrlist[currentMenu.name]) {
|
|
597
|
+
let list = advancedCrlist[currentMenu.name];
|
|
598
|
+
if (list && list.length > 0) {
|
|
599
|
+
list.forEach((adCriteria) => {
|
|
600
|
+
crList.push(adCriteria);
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
if (crList && crList.length > 0) {
|
|
606
|
+
if (payload && payload?.crList && payload.crList.length > 0) {
|
|
607
|
+
crList.forEach((cr) => {
|
|
608
|
+
payload.crList.push(cr);
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
else {
|
|
612
|
+
payload.crList = crList;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
return payload;
|
|
616
|
+
}
|
|
617
|
+
getDataForGridFilter(page, tab, currentMenu, headElements, filterForm) {
|
|
618
|
+
const data = this.preparePayloadWithCrlist(tab, currentMenu, headElements, filterForm);
|
|
619
|
+
if (tab && tab?.grid && tab?.grid?.grid_page_size) {
|
|
620
|
+
this.itemNumOfGrid = tab.grid.grid_page_size;
|
|
621
|
+
}
|
|
622
|
+
this.setPageNoAndSize(data, page);
|
|
623
|
+
const getFilterData = {
|
|
624
|
+
data: data,
|
|
625
|
+
path: null
|
|
626
|
+
};
|
|
627
|
+
return getFilterData;
|
|
628
|
+
}
|
|
629
|
+
getPage(page, tab, currentMenu, headElements, filterForm, selectContact) {
|
|
630
|
+
return this.getDataForGrid(page, tab, currentMenu, headElements, filterForm, selectContact);
|
|
631
|
+
}
|
|
632
|
+
getRealTimeGridData(currentMenu, object) {
|
|
633
|
+
let grid_api_params_criteria = [];
|
|
634
|
+
let page = 1;
|
|
635
|
+
let criteria = "_id;eq;" + object._id + ";STATIC";
|
|
636
|
+
grid_api_params_criteria.push(criteria);
|
|
637
|
+
const data = this.setPageNoAndSize(this.getPaylodWithCriteria(currentMenu.name, '', grid_api_params_criteria, ''), page);
|
|
638
|
+
const getFilterData = {
|
|
639
|
+
data: data,
|
|
640
|
+
path: null
|
|
641
|
+
};
|
|
642
|
+
this.apiService.getGridRunningData(getFilterData);
|
|
643
|
+
}
|
|
644
|
+
getFormForTds(data, currentMenu, object) {
|
|
645
|
+
let payloadData = {};
|
|
646
|
+
if (currentMenu != '') {
|
|
647
|
+
payloadData = this.getPaylodWithCriteria(currentMenu, '', [], '');
|
|
648
|
+
payloadData['data'] = object;
|
|
649
|
+
}
|
|
650
|
+
const getFormData = {
|
|
651
|
+
_id: data._id,
|
|
652
|
+
data: payloadData
|
|
653
|
+
};
|
|
654
|
+
return getFormData;
|
|
655
|
+
}
|
|
656
|
+
getPdf(data, currentMenu) {
|
|
657
|
+
let payloadData = {};
|
|
658
|
+
if (currentMenu != '') {
|
|
659
|
+
payloadData = this.getPaylodWithCriteria(currentMenu, '', [], '');
|
|
660
|
+
}
|
|
661
|
+
const getFileData = {
|
|
662
|
+
_id: data._id,
|
|
663
|
+
data: payloadData,
|
|
664
|
+
responce: { responseType: "arraybuffer" }
|
|
665
|
+
};
|
|
666
|
+
let fileName = currentMenu;
|
|
667
|
+
fileName = fileName.charAt(0).toUpperCase() + fileName.slice(1);
|
|
668
|
+
const downloadPdfCheck = fileName + '-' + new Date().toLocaleDateString();
|
|
669
|
+
if (getFileData._id && getFileData._id != undefined && getFileData._id != null && getFileData._id != '') {
|
|
670
|
+
getFileData.data['data'] = data;
|
|
671
|
+
this.apiService.GetFileData(getFileData);
|
|
672
|
+
}
|
|
673
|
+
return downloadPdfCheck;
|
|
674
|
+
}
|
|
675
|
+
downloadPdf(data, currentMenu) {
|
|
676
|
+
let payloadData = {};
|
|
677
|
+
if (currentMenu != '') {
|
|
678
|
+
payloadData = this.getPaylodWithCriteria(currentMenu, '', [], '');
|
|
679
|
+
}
|
|
680
|
+
const getPdfData = {
|
|
681
|
+
_id: data._id,
|
|
682
|
+
data: payloadData,
|
|
683
|
+
responce: { responseType: "arraybuffer" }
|
|
684
|
+
};
|
|
685
|
+
let fileName = currentMenu;
|
|
686
|
+
fileName = fileName.charAt(0).toUpperCase() + fileName.slice(1);
|
|
687
|
+
const downloadPdfCheck = fileName + '-' + new Date().toLocaleDateString();
|
|
688
|
+
if (getPdfData._id && getPdfData._id != undefined && getPdfData._id != null && getPdfData._id != '') {
|
|
689
|
+
getPdfData.data['data'] = data;
|
|
690
|
+
this.apiService.GetPdfData(getPdfData);
|
|
691
|
+
}
|
|
692
|
+
return downloadPdfCheck;
|
|
693
|
+
}
|
|
694
|
+
getTemData(tempName) {
|
|
695
|
+
//const params = "form_template";
|
|
696
|
+
//const criteria = ["name;eq;"+tempName+";STATIC"];
|
|
697
|
+
//const payload = this.getPaylodWithCriteria(params,'',criteria,{});
|
|
698
|
+
// const getTemplates = {
|
|
699
|
+
// crList: [{
|
|
700
|
+
// "fName": "name",
|
|
701
|
+
// "fValue": tempName,
|
|
702
|
+
// "operator": "eq"
|
|
703
|
+
// }],
|
|
704
|
+
// key2: this.storageService.getAppId(),
|
|
705
|
+
// refCode: this.getRefcode(),
|
|
706
|
+
// log: this.storageService.getUserLog(),
|
|
707
|
+
// value: "form_template"
|
|
708
|
+
// }
|
|
709
|
+
const payload = this.getTempPayload(tempName, 'eq');
|
|
710
|
+
return payload;
|
|
711
|
+
}
|
|
712
|
+
getTempPayload(value, operator) {
|
|
713
|
+
const params = "form_template";
|
|
714
|
+
const criteria = ["name;" + operator + ";" + value + ";STATIC"];
|
|
715
|
+
const payload = this.getPaylodWithCriteria(params, '', criteria, {});
|
|
716
|
+
return payload;
|
|
717
|
+
}
|
|
718
|
+
setPageNoAndSize(payload, page) {
|
|
719
|
+
payload['pageNo'] = page - 1;
|
|
720
|
+
payload['pageSize'] = this.itemNumOfGrid;
|
|
721
|
+
return payload;
|
|
722
|
+
}
|
|
723
|
+
checkQtmpApi(params, field, payload, multipleFormCollection, object, objectWithCustom) {
|
|
724
|
+
if (params.indexOf("FORM_GROUP") >= 0 || params.indexOf("QTMP") >= 0) {
|
|
725
|
+
let multiCollection = JSON.parse(JSON.stringify(multipleFormCollection));
|
|
726
|
+
if (field && field.formValueAsObjectForQtmp) {
|
|
727
|
+
let formValue = this.commonFunctionService.getFormDataInMultiformCollection(multiCollection, object);
|
|
728
|
+
payload["data"] = formValue;
|
|
729
|
+
}
|
|
730
|
+
else {
|
|
731
|
+
let formValue = this.commonFunctionService.getFormDataInMultiformCollection(multiCollection, objectWithCustom);
|
|
732
|
+
payload["data"] = formValue;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
return payload;
|
|
736
|
+
}
|
|
737
|
+
previewModal(gridData, currentMenu, modalId) {
|
|
738
|
+
const getpreviewHtml = {
|
|
739
|
+
_id: gridData._id,
|
|
740
|
+
data: this.getPaylodWithCriteria(currentMenu.name, '', [], '')
|
|
741
|
+
};
|
|
742
|
+
this.apiService.GetPreviewHtml(getpreviewHtml);
|
|
743
|
+
const alertData = {
|
|
744
|
+
gridData: gridData,
|
|
745
|
+
currentPage: currentMenu.name
|
|
746
|
+
};
|
|
747
|
+
this.modalService.open(modalId, alertData);
|
|
748
|
+
}
|
|
749
|
+
preview(gridData, currentMenu, modalId) {
|
|
750
|
+
const getpreviewHtml = {
|
|
751
|
+
_id: gridData._id,
|
|
752
|
+
data: this.getPaylodWithCriteria(currentMenu.name, '', [], '')
|
|
753
|
+
};
|
|
754
|
+
getpreviewHtml.data['data'] = gridData;
|
|
755
|
+
this.apiService.GetPreviewHtml(getpreviewHtml);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
ApiCallService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiCallService, deps: [{ token: i1.CommonFunctionService }, { token: i2.StorageService }, { token: i3.CoreFunctionService }, { token: i4.ApiService }, { token: i5.CheckIfService }, { token: i6.ModelService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
759
|
+
ApiCallService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiCallService, providedIn: 'root' });
|
|
760
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiCallService, decorators: [{
|
|
761
|
+
type: Injectable,
|
|
762
|
+
args: [{
|
|
763
|
+
providedIn: 'root'
|
|
764
|
+
}]
|
|
765
|
+
}], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.StorageService }, { type: i3.CoreFunctionService }, { type: i4.ApiService }, { type: i5.CheckIfService }, { type: i6.ModelService }]; } });
|
|
766
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNhbGwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvYXBpL2FwaS1jYWxsL2FwaS1jYWxsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUszQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7O0FBTTNELE1BQU0sT0FBTyxjQUFjO0lBSXpCLFlBQ1UscUJBQTJDLEVBQzNDLGNBQTZCLEVBQzdCLG1CQUF1QyxFQUN2QyxVQUFxQixFQUNyQixjQUE2QixFQUM3QixZQUEwQjtRQUwxQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXNCO1FBQzNDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFDdkMsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQVRwQyxlQUFVLEdBQVcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxrQkFBYSxHQUFRLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztJQVN6QyxDQUFDO0lBRUwsa0JBQWtCLENBQUMsV0FBZSxFQUFDLFNBQWEsRUFBQyx1QkFBMkI7UUFDMUUsSUFBSSxXQUFXLEdBQU8sRUFBRSxDQUFBO1FBQ3hCLElBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQ3ZDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTtnQkFDbEMsSUFBRyxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFDO29CQUNoRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsSUFB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QUFjLEdBQUc7WUFDckIsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO1lBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUMvRCxDQUFBO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0MsTUFBTSxTQUFTLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxJQUFJO1NBQzlCLENBQUE7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE9BQU8sQ0FBQyxRQUFZLEVBQUUsV0FBZSxFQUFFLE9BQVc7UUFDaEQsTUFBTSxjQUFjLEdBQUc7WUFDckIsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO1lBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUMvRCxDQUFBO1FBQ0QsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakQsQ0FBQzs7NEdBN3ZCVSxjQUFjO2dIQUFkLGNBQWMsY0FGYixNQUFNOzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hlY2tJZlNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL2NoZWNrLWlmL2NoZWNrLWlmLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbkZ1bmN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi11dGlscy9jb21tb24tZnVuY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JlRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uLXV0aWxzL2NvcmUtZnVuY3Rpb24vY29yZS1mdW5jdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL2FwaS9hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbW1vbiB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9lbnVtcy9jb21tb24uZW51bSc7XHJcbmltcG9ydCB7IE1vZGVsU2VydmljZSB9IGZyb20gJy4uLy4uL21vZGVsL21vZGVsLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBpQ2FsbFNlcnZpY2Uge1xyXG4gIHBhZ2VOdW1iZXI6IG51bWJlciA9IENvbW1vbi5QQUdFX05PO1xyXG4gIGl0ZW1OdW1PZkdyaWQ6IGFueSA9IENvbW1vbi5JVEVNX05VTV9PRl9HUklEO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29tbW9uRnVuY3Rpb25TZXJ2aWNlOkNvbW1vbkZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6U3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvcmVGdW5jdGlvblNlcnZpY2U6Q29yZUZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTpBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjaGVja0lmU2VydmljZTpDaGVja0lmU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RlbFNlcnZpY2UsXHJcbiAgKSB7IH1cclxuXHJcbiAgZ2V0T25jaGFuZ2VQYXlsb2FkKHRhYmxlRmllbGRzOmFueSxmb3JtVmFsdWU6YW55LGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhOmFueSl7XHJcbiAgICBsZXQgc3RhdGljTW9kYWw6YW55ID0gW11cclxuICAgIGlmKHRhYmxlRmllbGRzICYmIHRhYmxlRmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICB0YWJsZUZpZWxkcy5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIGlmKGVsZW1lbnQuZmllbGRfbmFtZSAmJiBlbGVtZW50LmZpZWxkX25hbWUgIT0gJycpe1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtcyAmJiBlbGVtZW50Lm9uY2hhbmdlX2NhbGxfYmFja19maWVsZCAmJiAhZWxlbWVudC5kb19ub3RfYXV0b190cmlnZ2VyX29uX2VkaXQpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hlY2tGb3JtR3JvdXAgPSBlbGVtZW50Lm9uY2hhbmdlX2NhbGxfYmFja19maWVsZC5pbmRleE9mKFwiRk9STV9HUk9VUFwiKTtcclxuICAgICAgICAgICAgY29uc3QgY2hlY2tDTFRGTiA9IGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtcy5pbmRleE9mKCdDTFRGTicpXHJcbiAgICAgICAgICAgIGlmKGNoZWNrRm9ybUdyb3VwID09IC0xICYmIGNoZWNrQ0xURk4gPT0gLTEpe1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLCBlbGVtZW50Lm9uY2hhbmdlX2NhbGxfYmFja19maWVsZCwgZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLCBmb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YSlcclxuICAgICAgICAgICAgICBpZihlbGVtZW50Lm9uY2hhbmdlX2FwaV9wYXJhbXMuaW5kZXhPZignUVRNUCcpID49IDApe1xyXG4gICAgICAgICAgICAgICAgaWYoZWxlbWVudCAmJiBlbGVtZW50LmZvcm1WYWx1ZUFzT2JqZWN0Rm9yUXRtcCl7XHJcbiAgICAgICAgICAgICAgICAgIHBheWxvYWRbXCJkYXRhXCJdPWZvcm1WYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICBwYXlsb2FkW1wiZGF0YVwiXT1mb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgc3RhdGljTW9kYWwucHVzaChwYXlsb2FkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcInN0ZXBwZXJcIjpcclxuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKHN0ZXA6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChzdGVwLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zICYmIGRhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkICYmICFkYXRhLmRvX25vdF9hdXRvX3RyaWdnZXJfb25fZWRpdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0Zvcm1Hcm91cCA9IGRhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkLmluZGV4T2YoXCJGT1JNX0dST1VQXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjaGVja0Zvcm1Hcm91cCA9PSAtMSl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShkYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXMsIGRhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkLCBkYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXNfY3JpdGVyaWEsIGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEub25jaGFuZ2VfYXBpX3BhcmFtcy5pbmRleE9mKCdRVE1QJykgPj0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQuZm9ybVZhbHVlQXNPYmplY3RGb3JRdG1wKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFtcImRhdGFcIl09Zm9ybVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRbXCJkYXRhXCJdPWZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNNb2RhbC5wdXNoKHBheWxvYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLnRyZWVfdmlld19vYmplY3QgJiYgZGF0YS50cmVlX3ZpZXdfb2JqZWN0LmZpZWxkX25hbWUgIT0gXCJcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZGl0ZVRyZWVNb2RpZnlEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhLnRyZWVfdmlld19vYmplY3QpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRlVHJlZU1vZGlmeURhdGEub25jaGFuZ2VfYXBpX3BhcmFtcyAmJiBlZGl0ZVRyZWVNb2RpZnlEYXRhLm9uY2hhbmdlX2NhbGxfYmFja19maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY01vZGFsLnB1c2godGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoZWRpdGVUcmVlTW9kaWZ5RGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zLCBlZGl0ZVRyZWVNb2RpZnlEYXRhLm9uY2hhbmdlX2NhbGxfYmFja19maWVsZCwgZWRpdGVUcmVlTW9kaWZ5RGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLCBmb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGVsZW1lbnQudHJlZV92aWV3X29iamVjdCAmJiBlbGVtZW50LnRyZWVfdmlld19vYmplY3QuZmllbGRfbmFtZSAhPSBcIlwiKXtcclxuICAgICAgICAgICAgbGV0IGVkaXRlVHJlZU1vZGlmeURhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVsZW1lbnQudHJlZV92aWV3X29iamVjdCkpO1xyXG4gICAgICAgICAgICBpZiAoZWRpdGVUcmVlTW9kaWZ5RGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zICYmIGVkaXRlVHJlZU1vZGlmeURhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgc3RhdGljTW9kYWwucHVzaCh0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShlZGl0ZVRyZWVNb2RpZnlEYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXMsIGVkaXRlVHJlZU1vZGlmeURhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkLCBlZGl0ZVRyZWVNb2RpZnlEYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXNfY3JpdGVyaWEsIGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZSA9PSAncGRmX3ZpZXcnKXtcclxuICAgICAgICAgIHN0YXRpY01vZGFsLnB1c2godGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLGVsZW1lbnQub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkLGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtc19jcml0ZXJpYSxmb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YSkpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdGF0aWNNb2RhbDtcclxuICB9XHJcbiAgZ2V0U3RhdGljRGF0YVBheWxvYWQoc3RhdGljTW9kYWw6YW55LG9iamVjdDphbnksZm9ybURhdGFPYmplY3Q6YW55LG11bHRpcGxlRm9ybUNvbGxlY3Rpb246YW55LHRhYmxlRmllbGRzOmFueSxmb3JtRmllbGRCdXR0b25zOmFueSx0YWI6YW55LGZvcm06YW55LHNhdmVSZXNwb25jZURhdGE6YW55LGVkaXRlZFJvd0luZGV4OmFueSl7XHJcbiAgICBsZXQgZm9ybVZhbHVlID0gb2JqZWN0O1xyXG4gICAgaWYobXVsdGlwbGVGb3JtQ29sbGVjdGlvbiAmJiBtdWx0aXBsZUZvcm1Db2xsZWN0aW9uLmxlbmd0aCA+IDApe1xyXG4gICAgICBsZXQgbXVsdGlDb2xsZWN0aW9uID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtdWx0aXBsZUZvcm1Db2xsZWN0aW9uKSk7XHJcbiAgICAgIGZvcm1WYWx1ZSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldEZvcm1EYXRhSW5NdWx0aWZvcm1Db2xsZWN0aW9uKG11bHRpQ29sbGVjdGlvbixvYmplY3QpO1xyXG4gICAgfVxyXG4gICAgbGV0IHN0YXRpY01vZGFsRyA9IHRoaXMuY29tbWFuQXBpUGF5bG9hZChbXSx0YWJsZUZpZWxkcyxmb3JtRmllbGRCdXR0b25zLGZvcm1WYWx1ZSk7XHJcbiAgICBpZihzdGF0aWNNb2RhbEcgJiYgc3RhdGljTW9kYWxHLmxlbmd0aCA+IDApe1xyXG4gICAgICBzdGF0aWNNb2RhbEcuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBzdGF0aWNNb2RhbC5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmKHRhYiAmJiB0YWIuYXBpX3BhcmFtcyAmJiB0YWIuYXBpX3BhcmFtcyAhPSBudWxsICYmIHRhYi5hcGlfcGFyYW1zICE9IFwiXCIgJiYgdGFiLmFwaV9wYXJhbXMgIT0gdW5kZWZpbmVkKXtcclxuICAgICAgbGV0IGNyaXRlcmlhID0gW107XHJcbiAgICAgIGlmKHRhYi5hcGlfcGFyYW1zX2NyaXRlcmlhICYmIHRhYi5hcGlfcGFyYW1zX2NyaXRlcmlhICE9IG51bGwpe1xyXG4gICAgICAgIGNyaXRlcmlhPXRhYi5hcGlfcGFyYW1zX2NyaXRlcmlhXHJcbiAgICAgIH1cclxuICAgICAgc3RhdGljTW9kYWwucHVzaCh0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYSh0YWIuYXBpX3BhcmFtcyx0YWIuY2FsbF9iYWNrX2ZpZWxkLGNyaXRlcmlhLHt9KSlcclxuXHJcbiAgICB9XHJcbiAgICBpZihmb3JtICYmIGZvcm0uYXBpX3BhcmFtcyAmJiBmb3JtLmFwaV9wYXJhbXMgIT0gbnVsbCAmJiBmb3JtLmFwaV9wYXJhbXMgIT0gXCJcIiAmJiBmb3JtLmFwaV9wYXJhbXMgIT0gdW5kZWZpbmVkKXtcclxuICAgICAgaWYoZm9ybS5hcGlfcGFyYW1zID09ICdRVE1QOkVNQUlMX1dJVEhfVEVNUDpRVU9UQVRJT05fTEVUVEVSJyl7XHJcbiAgICAgICAgb2JqZWN0ID0gc2F2ZVJlc3BvbmNlRGF0YTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgY3JpdGVyaWEgPSBbXTtcclxuICAgICAgaWYoZm9ybS5hcGlfcGFyYW1zX2NyaXRlcmlhICYmIGZvcm0uYXBpX3BhcmFtc19jcml0ZXJpYSAhPSBudWxsKXtcclxuICAgICAgICBjcml0ZXJpYT1mb3JtLmFwaV9wYXJhbXNfY3JpdGVyaWFcclxuICAgICAgfVxyXG4gICAgICBpZihlZGl0ZWRSb3dJbmRleCA+IC0xKXtcclxuICAgICAgICBmb3JtRGF0YU9iamVjdCA9IGZvcm1WYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBzdGF0aWNNb2RhbC5wdXNoKHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGZvcm0uYXBpX3BhcmFtcyxmb3JtLmNhbGxfYmFja19maWVsZCxjcml0ZXJpYSxmb3JtRGF0YU9iamVjdCkpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RhdGljTW9kYWw7XHJcbiAgfVxyXG4gIGdldE9uQ2xpY2tMb2FkRGF0YVBheWxvYWRzKGZpZWxkOmFueSxtdWx0aXBsZUZvcm1Db2xsZWN0aW9uOmFueSxmb3JtVmFsdWU6YW55LGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhOmFueSl7XHJcbiAgICBsZXQgYXBpX3BhcmFtcyA9IGZpZWxkLm9uQ2xpY2tBcGlQYXJhbXM7XHJcbiAgICBsZXQgY2FsbEJhY2tmaWVsZCA9IGZpZWxkLm9uQ2xpY2tDYWxsQmFja0ZpZWxkO1xyXG4gICAgbGV0IGNyaXRlcmlhID0gZmllbGQub25DbGlja0FwaVBhcmFtc0NyaXRlcmlhXHJcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoYXBpX3BhcmFtcyxjYWxsQmFja2ZpZWxkLGNyaXRlcmlhLGZvcm1WYWx1ZSk7XHJcbiAgICBsZXQgcGF5bG9hZHMgPSBbXTtcclxuICAgIHBheWxvYWRzLnB1c2godGhpcy5jaGVja1F0bXBBcGkoYXBpX3BhcmFtcyxmaWVsZCxwYXlsb2FkLG11bHRpcGxlRm9ybUNvbGxlY3Rpb24sZm9ybVZhbHVlLGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhKSk7XHJcbiAgICByZXR1cm4gcGF5bG9hZHM7XHJcbiAgfVxyXG4gIGdldFBheWxvZFdpdGhDcml0ZXJpYShwYXJhbXM6YW55LCBjYWxsYmFjazphbnksIGNyaXRlcmlhOmFueSwgb2JqZWN0OmFueSxkYXRhX3RlbXBsYXRlPzphbnkpIHtcclxuICAgIGNvbnN0IHRhYk5hbWUgPSAgdGhpcy5zdG9yYWdlU2VydmljZS5HZXRBY3RpdmVNZW51KCk7XHJcbiAgICBsZXQgYWN0aXZlUm9sZSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0QWN0aXZlUm9sZSgpO1xyXG4gICAgbGV0IHRhYiA9ICcnO1xyXG4gICAgbGV0IHJvbGVOYW1lID0gXCJcIjtcclxuICAgIGlmKHRhYk5hbWUgJiYgdGFiTmFtZS5uYW1lICYmIHRhYk5hbWUubmFtZSAhPSAnJyl7XHJcbiAgICAgIHRhYiA9IHRhYk5hbWUubmFtZTtcclxuICAgIH1cclxuICAgIGlmKGFjdGl2ZVJvbGUgJiYgYWN0aXZlUm9sZS5uYW1lICE9ICcnKXtcclxuICAgICAgcm9sZU5hbWUgPSBhY3RpdmVSb2xlLm5hbWU7XHJcbiAgICB9XHJcbiAgICBsZXQgc3RhdGljTW9kYWw6YW55ID0ge1xyXG4gICAgICBcImtleVwiOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZjb2RlKCksXHJcbiAgICAgIFwia2V5MlwiOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFwcElkKCksXHJcbiAgICAgIFwidmFsdWVcIjogcGFyYW1zLFxyXG4gICAgICBcImxvZ1wiOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJMb2coKSxcclxuICAgICAgXCJjckxpc3RcIjogW10sXHJcbiAgICAgIFwibW9kdWxlXCI6IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0TW9kdWxlKCksXHJcbiAgICAgIFwidGFiXCI6IHRhYlxyXG4gICAgfVxyXG4gICAgaWYocm9sZU5hbWUgIT0gJycpe1xyXG4gICAgICBzdGF0aWNNb2RhbFsncm9sZSddID0gcm9sZU5hbWU7XHJcbiAgICB9XHJcbiAgICBpZihkYXRhX3RlbXBsYXRlKXtcclxuICAgICAgc3RhdGljTW9kYWxbJ2RhdGFfdGVtcGxhdGUnXSA9IGRhdGFfdGVtcGxhdGU7XHJcbiAgICB9XHJcbiAgICBpZihjYWxsYmFjayAmJiBjYWxsYmFjayAhPSAnJyl7XHJcbiAgICAgIHN0YXRpY01vZGFsWydrZXkzJ10gPSBjYWxsYmFjaztcclxuICAgIH1cclxuICAgIGlmKHBhcmFtcy5pbmRleE9mKFwiRk9STV9HUk9VUFwiKSA+PSAwIHx8IHBhcmFtcy5pbmRleE9mKFwiUVRNUFwiKSA+PSAwKXtcclxuICAgICAgc3RhdGljTW9kYWxbXCJkYXRhXCJdPW9iamVjdDtcclxuICAgIH1cclxuICAgIGlmIChjcml0ZXJpYSAmJiBjcml0ZXJpYS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGNyTGlzdCA9IHRoaXMuZ2V0Q3JpdGVyaWFMaXN0KGNyaXRlcmlhLG9iamVjdCk7XHJcbiAgICAgIGlmKGNyTGlzdCAmJiBjckxpc3QubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgY3JMaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgc3RhdGljTW9kYWwuY3JMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdGF0aWNNb2RhbDtcclxuICB9XHJcbiAgZ2V0Q3JpdGVyaWFMaXN0KGNyaXRlcmlhOmFueSxvYmplY3Q6YW55KXtcclxuICAgIGNvbnN0IGNyTGlzdDphbnkgPSBbXTtcclxuICAgIGNyaXRlcmlhLmZvckVhY2goKGVsZW1lbnQ6IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCBjcml0ZXJpYSA9IGVsZW1lbnQuc3BsaXQoXCI7XCIpO1xyXG4gICAgICBjb25zdCBmVmFsdWUgPSBjcml0ZXJpYVsyXVxyXG4gICAgICBsZXQgZnZhbHVlID0nJztcclxuICAgICAgaWYoY3JpdGVyaWFbM10gJiYgY3JpdGVyaWFbM10gPT0gJ1NUQVRJQycpe1xyXG4gICAgICAgIGZ2YWx1ZSA9IGZWYWx1ZTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgZnZhbHVlID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0T2JqZWN0VmFsdWUoZlZhbHVlLCBvYmplY3QpXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbGlzdCA9IHtcclxuICAgICAgICBcImZOYW1lXCI6IGNyaXRlcmlhWzBdLFxyXG4gICAgICAgIFwiZlZhbHVlXCI6IGZ2YWx1ZSxcclxuICAgICAgICBcIm9wZXJhdG9yXCI6IGNyaXRlcmlhWzFdXHJcbiAgICAgIH1cclxuICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZnZhbHVlKSl7XHJcbiAgICAgICAgY3JMaXN0LnB1c2gobGlzdCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNyTGlzdDtcclxuICB9XHJcbiAgZ2V0VGFic1BheWxvYWRGb3JDb3VudExpc3QodGFiczphbnkpe1xyXG4gICAgbGV0IHBheWxvYWRzOmFueSA9IFtdO1xyXG4gICAgaWYodGFicyAmJiB0YWJzLmxlbmd0aCA+PSAxKXtcclxuICAgICAgdGFicy5mb3JFYWNoKCh0YWI6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmKHRhYi5ncmlkKXtcclxuICAgICAgICAgIGxldCBncmlkX2FwaV9wYXJhbXNfY3JpdGVyaWEgPSBbXTtcclxuICAgICAgICAgIGlmKHRoaXMuY2hlY2tJZlNlcnZpY2UuaXNHcmlkRmllbGRFeGlzdCh0YWIsXCJhcGlfcGFyYW1zX2NyaXRlcmlhXCIpKXtcclxuICAgICAgICAgICAgZ3JpZF9hcGlfcGFyYW1zX2NyaXRlcmlhID0gdGFiLmdyaWQuYXBpX3BhcmFtc19jcml0ZXJpYTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYSh0YWIudGFiX25hbWUsdGFiLnRhYl9uYW1lK1wiX1wiK3RhYi5uYW1lLGdyaWRfYXBpX3BhcmFtc19jcml0ZXJpYSx7fSk7XHJcbiAgICAgICAgICBwYXlsb2FkWydjb3VudE9ubHknXSA9IHRydWU7XHJcbiAgICAgICAgICBwYXlsb2Fkcy5wdXNoKHBheWxvYWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGF5bG9hZHM7XHJcbiAgfVxyXG4gIGdldFRhYnNDb3VudFB5bG9hZCh0YWJzOmFueSl7XHJcbiAgICBsZXQgcGF5bG9hZHMgPSB0aGlzLmdldFRhYnNQYXlsb2FkRm9yQ291bnRMaXN0KHRhYnMpO1xyXG4gICAgaWYocGF5bG9hZHMgJiYgcGF5bG9hZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRHcmlkQ291bnREYXRhKHBheWxvYWRzKTtcclxuICAgIH1cclxuICB9XHJcbiAgY29tbWFuQXBpUGF5bG9hZChoZWFkRWxlbWVudDphbnksdGFibGVGaWVsZDphbnksYWN0aW9uQnV0dG9uOmFueSxvYmplY3Q/OmFueSl7XHJcbiAgICBjb25zdCBzdGF0aWNNb2RhbEdyb3VwOmFueSA9IFtdO1xyXG4gICAgbGV0IHN0YXRpY01vZGFsOmFueSA9IHt9O1xyXG4gICAgaWYoaGVhZEVsZW1lbnQubGVuZ3RoID4gMCl7XHJcbiAgICAgIGhlYWRFbGVtZW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChlbGVtZW50LmFwaV9wYXJhbXMgJiYgZWxlbWVudC5hcGlfcGFyYW1zICE9ICcnKSB7XHJcbiAgICAgICAgICBsZXQgY2FsbF9iYWNrX2ZpZWxkID0gICcnO1xyXG4gICAgICAgICAgbGV0IGNyaXRlcmlhID0gW107XHJcbiAgICAgICAgICBpZihlbGVtZW50LmNhbGxfYmFja19maWVsZCAmJiBlbGVtZW50LmNhbGxfYmFja19maWVsZCAhPSAnJyl7XHJcbiAgICAgICAgICAgIGNhbGxfYmFja19maWVsZCA9ICBlbGVtZW50LmNhbGxfYmFja19maWVsZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYSAmJiBlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEgIT0gJycpe1xyXG4gICAgICAgICAgICBjcml0ZXJpYSA9ICBlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzdGF0aWNNb2RhbCA9IHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGVsZW1lbnQuYXBpX3BhcmFtcyxjYWxsX2JhY2tfZmllbGQsY3JpdGVyaWEsb2JqZWN0P29iamVjdDp7fSk7XHJcbiAgICAgICAgICBpZihlbGVtZW50LmFka2V5ICYmIGVsZW1lbnQuYWRrZXkgIT0gJycgJiYgZWxlbWVudC5hZGtleSAhPSBudWxsKXtcclxuICAgICAgICAgICAgc3RhdGljTW9kYWxbJ2Fka2V5cyddID0gZWxlbWVudC5hZGtleTtcclxuICAgICAgICAgICAgc3RhdGljTW9kYWxHcm91cC5wdXNoKHN0YXRpY01vZGFsKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBzdGF0aWNNb2RhbEdyb3VwLnB1c2goc3RhdGljTW9kYWwpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZihhY3Rpb25CdXR0b24ubGVuZ3RoID4gMCl7XHJcbiAgICAgIGFjdGlvbkJ1dHRvbi5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZWxlbWVudC5hcGlfcGFyYW1zICYmIGVsZW1lbnQuYXBpX3BhcmFtcyAhPSAnJykge1xyXG4gICAgICAgICAgbGV0IGNhbGxfYmFja19maWVsZCA9ICAnJztcclxuICAgICAgICAgIGxldCBjcml0ZXJpYSA9IFtdO1xyXG4gICAgICAgICAgaWYoZWxlbWVudC5jYWxsX2JhY2tfZmllbGQgJiYgZWxlbWVudC5jYWxsX2JhY2tfZmllbGQgIT0gJycpe1xyXG4gICAgICAgICAgICBjYWxsX2JhY2tfZmllbGQgPSAgZWxlbWVudC5jYWxsX2JhY2tfZmllbGQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEgJiYgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhICE9ICcnKXtcclxuICAgICAgICAgICAgY3JpdGVyaWEgPSAgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3Qgc3RhdGljTW9kYWwgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShlbGVtZW50LmFwaV9wYXJhbXMsY2FsbF9iYWNrX2ZpZWxkLGNyaXRlcmlhLG9iamVjdD9vYmplY3Q6e30pO1xyXG5cclxuICAgICAgICAgIHN0YXRpY01vZGFsR3JvdXAucHVzaChzdGF0aWNNb2RhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0YWJsZUZpZWxkLmxlbmd0aCA+IDApe1xyXG5cclxuICAgICAgdGFibGVGaWVsZC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIGxldCBjYWxsX2JhY2tfZmllbGQgPSAgJyc7XHJcbiAgICAgICAgbGV0IGNyaXRlcmlhID0gW107XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuYXBpX3BhcmFtcyAmJiBlbGVtZW50LmFwaV9wYXJhbXMgIT0gJycgJiYgZWxlbWVudC50eXBlICE9IFwidHlwZWFoZWFkXCIpIHtcclxuICAgICAgICAgIGlmKGVsZW1lbnQuY2FsbF9iYWNrX2ZpZWxkICYmIGVsZW1lbnQuY2FsbF9iYWNrX2ZpZWxkICE9ICcnKXtcclxuICAgICAgICAgICAgY2FsbF9iYWNrX2ZpZWxkID0gIGVsZW1lbnQuY2FsbF9iYWNrX2ZpZWxkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYoZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhICYmIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYSAhPSAnJyl7XHJcbiAgICAgICAgICAgIGNyaXRlcmlhID0gIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHN0YXRpY01vZGFsID0gdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoZWxlbWVudC5hcGlfcGFyYW1zLGNhbGxfYmFja19maWVsZCxjcml0ZXJpYSxvYmplY3Q/b2JqZWN0Ont9LGVsZW1lbnQuZGF0YV90ZW1wbGF0ZSk7XHJcbiAgICAgICAgICBpZihlbGVtZW50LmFwaV9wYXJhbXMuaW5kZXhPZihcImh0bWxfdmlld1wiKSA+PSAwKXtcclxuICAgICAgICAgICAgc3RhdGljTW9kYWxbXCJkYXRhXCJdPW9iamVjdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHN0YXRpY01vZGFsR3JvdXAucHVzaChzdGF0aWNNb2RhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgICAgIGNhc2UgXCJncm91cF9vZl9maWVsZHNcIjpcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubGlzdF9vZl9maWVsZHMgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoZGF0YSAmJiBkYXRhICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2FsbF9iYWNrX2ZpZWxkID0gICcnO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY3JpdGVyaWEgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXBpX3BhcmFtcyAmJiBkYXRhLmFwaV9wYXJhbXMgIT0gJycgJiYgZGF0YS50eXBlICE9IFwidHlwZWFoZWFkXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jYWxsX2JhY2tfZmllbGQgJiYgZGF0YS5jYWxsX2JhY2tfZmllbGQgIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbF9iYWNrX2ZpZWxkID0gIGRhdGEuY2FsbF9iYWNrX2ZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmFwaV9wYXJhbXNfY3JpdGVyaWEgJiYgZGF0YS5hcGlfcGFyYW1zX2NyaXRlcmlhICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhID0gIGRhdGEuYXBpX3BhcmFtc19jcml0ZXJpYTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljTW9kYWxMaXN0T2ZGaWVsZHMgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShkYXRhLmFwaV9wYXJhbXMsY2FsbF9iYWNrX2ZpZWxkLGNyaXRlcmlhLG9iamVjdD9vYmplY3Q6e30sZWxlbWVudC5kYXRhX3RlbXBsYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmFwaV9wYXJhbXMuaW5kZXhPZihcImh0bWxfdmlld1wiKSA+PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY01vZGFsTGlzdE9mRmllbGRzW1wiZGF0YVwiXT1vYmplY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY01vZGFsR3JvdXAucHVzaChzdGF0aWNNb2RhbExpc3RPZkZpZWxkcyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInN0ZXBwZXJcIjpcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubGlzdF9vZl9maWVsZHMgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChzdGVwOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2FsbF9iYWNrX2ZpZWxkID0gICcnO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY3JpdGVyaWEgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXBpX3BhcmFtcyAmJiBkYXRhLmFwaV9wYXJhbXMgIT0gJycgJiYgZGF0YS50eXBlICE9IFwidHlwZWFoZWFkXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jYWxsX2JhY2tfZmllbGQgJiYgZGF0YS5jYWxsX2JhY2tfZmllbGQgIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbF9iYWNrX2ZpZWxkID0gIGRhdGEuY2FsbF9iYWNrX2ZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmFwaV9wYXJhbXNfY3JpdGVyaWEgJiYgZGF0YS5hcGlfcGFyYW1zX2NyaXRlcmlhICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhID0gIGRhdGEuYXBpX3BhcmFtc19jcml0ZXJpYTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljTW9kYWxMaXN0T2ZGaWVsZHMgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShkYXRhLmFwaV9wYXJhbXMsY2FsbF9iYWNrX2ZpZWxkLGNyaXRlcmlhLG9iamVjdD9vYmplY3Q6e30sZWxlbWVudC5kYXRhX3RlbXBsYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmFwaV9wYXJhbXMuaW5kZXhPZihcImh0bWxfdmlld1wiKSA+PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY01vZGFsTGlzdE9mRmllbGRzW1wiZGF0YVwiXT1vYmplY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY01vZGFsR3JvdXAucHVzaChzdGF0aWNNb2RhbExpc3RPZkZpZWxkcyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdGF0aWNNb2RhbEdyb3VwO1xyXG4gIH1cclxuICBnZXRmaWx0ZXJDcmxpc3QoaGVhZEVsZW1lbnRzOmFueSxmb3JtVmFsdWU6YW55KSB7XHJcbiAgICBjb25zdCBmaWx0ZXJMaXN0OmFueSA9IFtdXHJcbiAgICBpZihmb3JtVmFsdWUgIT0gdW5kZWZpbmVkICYmIGhlYWRFbGVtZW50cyAmJiBoZWFkRWxlbWVudHMubGVuZ3RoID4gMCl7XHJcbiAgICAgIGNvbnN0IGNyaXRlcmlhOmFueSA9IFtdO1xyXG4gICAgICBoZWFkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQudHlwZSAhPSBudWxsKXtcclxuICAgICAgICAgIGxldCBmaWVsZE5hbWUgPSBlbGVtZW50LmZpZWxkX25hbWU7XHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXTtcclxuICAgICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcImJ1dHRvblwiOlxyXG4gICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxyXG4gICAgICAgICAgICBjYXNlIFwidHJlZV92aWV3X3NlbGVjdGlvblwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiZHJvcGRvd25cIjpcclxuICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuaXNBcnJheShlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEpICYmIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5sZW5ndGggPiAwICYmIGVsZW1lbnQudHlwZSAhPSAnZHJvcGRvd24nKXtcclxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhLmZvckVhY2goKGNyaTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEucHVzaChjcmkpXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYgKGVsZW1lbnQubXVsdGlfc2VsZWN0ICYmIGVsZW1lbnQuZGF0YXR5cGUgPT0gXCJvYmplY3RcIil7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBmdmFsdWUgPSAnJztcclxuICAgICAgICAgICAgICAgICAgaWYodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgodmw6IHN0cmluZywgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZigodmFsdWUubGVuZ3RoIC0gMSkgPT0gaSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZnZhbHVlID0gZnZhbHVlICsgdmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmdmFsdWUgPSBmdmFsdWUgKyB2bCArIFwiOlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlckxpc3QucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZk5hbWVcIjogZmllbGROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZWYWx1ZVwiOiBmdmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JcIjogXCJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgZmlsdGVyTGlzdC5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIFwiZk5hbWVcIjogZmllbGROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJmVmFsdWVcIjogdGhpcy5nZXRWYWx1ZUZvckRvdEZpZWxkTmFtZSh2YWx1ZSxmaWVsZE5hbWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJvcGVyYXRvclwiOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldERlZmF1bHRTZWFyY2hPcGVyYXRvcigpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICBpZih0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5pc0FycmF5KGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYSkgJiYgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5mb3JFYWNoKChjcmk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEucHVzaChjcmkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckxpc3QucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmTmFtZVwiOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZlZhbHVlXCI6IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldGRkbkRpc3BsYXlWYWwodmFsdWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm9wZXJhdG9yXCI6IFwiZXFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0eXBlYWhlYWRcIjpcclxuICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuaXNBcnJheShlbGVtZW50LmRhdGFGaWx0ZXJDcml0ZXJpYSkgJiYgZWxlbWVudC5kYXRhRmlsdGVyQ3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YUZpbHRlckNyaXRlcmlhLmZvckVhY2goKGNyaTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEucHVzaChjcmkpXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlckxpc3QucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZOYW1lXCI6IGZpZWxkTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwiZlZhbHVlXCI6IHRoaXMuZ2V0VmFsdWVGb3JEb3RGaWVsZE5hbWUodmFsdWUsZmllbGROYW1lKSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JcIjogdGhpcy5zdG9yYWdlU2VydmljZS5nZXREZWZhdWx0U2VhcmNoT3BlcmF0b3IoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImluZm9cIjpcclxuICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuaXNBcnJheShlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEpICYmIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhLmZvckVhY2goKGNyaTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEucHVzaChjcmkpXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlckxpc3QucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZOYW1lXCI6IGZpZWxkTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwiZlZhbHVlXCI6IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldGRkbkRpc3BsYXlWYWwodmFsdWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJvcGVyYXRvclwiOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldERlZmF1bHRTZWFyY2hPcGVyYXRvcigpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgXCJyZWZlcmVuY2VfbmFtZXNcIjpcclxuICAgICAgICAgICAgICBjYXNlIFwiY2hpcHNcIjpcclxuICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuaXNBcnJheShlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEpICYmIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhLmZvckVhY2goKGNyaTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEucHVzaChjcmkpXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlckxpc3QucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZOYW1lXCI6IGZpZWxkTmFtZStcIi5uYW1lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZWYWx1ZVwiOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRkZG5EaXNwbGF5VmFsKHZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JcIjogdGhpcy5zdG9yYWdlU2VydmljZS5nZXREZWZhdWx0U2VhcmNoT3BlcmF0b3IoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImRhdGVcIjpcclxuICAgICAgICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XHJcbiAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkoZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhKSAmJiBlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5mb3JFYWNoKChjcmk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhLnB1c2goY3JpKVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJMaXN0LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJmTmFtZVwiOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZWYWx1ZVwiOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5kYXRlRm9ybWF0KHZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JcIjogXCJlcVwiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGF0ZXJhbmdlXCI6XHJcbiAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdLnN0YXJ0ICE9ICcnICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdLmVuZCAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkoZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhKSAmJiBlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5mb3JFYWNoKChjcmk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhLnB1c2goY3JpKVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJMaXN0LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJmTmFtZVwiOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZWYWx1ZVwiOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5kYXRlRm9ybWF0KHZhbHVlLnN0YXJ0KSxcclxuICAgICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JcIjogXCJndGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZihmb3JtVmFsdWUgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0uZW5kICE9ICcnICYmIGZvcm1WYWx1ZVtmaWVsZE5hbWVdLmVuZCAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkoZWxlbWVudC5hcGlfcGFyYW1zX2NyaXRlcmlhKSAmJiBlbGVtZW50LmFwaV9wYXJhbXNfY3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBpX3BhcmFtc19jcml0ZXJpYS5mb3JFYWNoKChjcmk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhLnB1c2goY3JpKVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJMaXN0LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJmTmFtZVwiOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBcImZWYWx1ZVwiOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5kYXRlRm9ybWF0KHZhbHVlLmVuZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIm9wZXJhdG9yXCI6IFwibHRlXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYoY3JpdGVyaWEgJiYgY3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgY29uc3QgY3JMaXN0ID0gdGhpcy5nZXRDcml0ZXJpYUxpc3QoY3JpdGVyaWEsZm9ybVZhbHVlKTtcclxuICAgICAgICBpZihjckxpc3QgJiYgY3JMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgY3JMaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBmaWx0ZXJMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmaWx0ZXJMaXN0O1xyXG4gIH1cclxuICBnZXRWYWx1ZUZvckRvdEZpZWxkTmFtZSh2YWx1ZTphbnksZmllbGROYW1lOmFueSl7XHJcbiAgICBsZXQgY3JWYWx1ZSA9IFwiXCI7XHJcbiAgICBpZih0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIil7XHJcbiAgICAgIGNyVmFsdWUgPSB2YWx1ZTtcclxuICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiKXtcclxuICAgICAgbGV0IGZOYW1lID0gZmllbGROYW1lLmluZGV4T2YoJy4nKSAhPSAtMSA/IChmaWVsZE5hbWUpLnNwbGl0KCcuJylbMF06ZmllbGROYW1lO1xyXG4gICAgICBsZXQgb2JqZWN0VmFsdWU6YW55ID0ge307XHJcbiAgICAgIG9iamVjdFZhbHVlW2ZOYW1lXSA9ICB2YWx1ZVxyXG4gICAgICBjclZhbHVlID0gZmllbGROYW1lLmluZGV4T2YoJy4nKSAhPSAtMSA/dGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0T2JqZWN0VmFsdWUoZmllbGROYW1lLG9iamVjdFZhbHVlKTogdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0ZGRuRGlzcGxheVZhbCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3JWYWx1ZTtcclxuICB9XHJcblxyXG4gZ2V0VXNlclByZWZyZXJlbmNlKHVzZXI6YW55KSB7XHJcbiAgICBsZXQgY3JpdGVyaWEgPSBcInVzZXJJZC5faWQ7ZXE7XCIrdXNlci5faWQrXCI7U1RBVElDXCI7XHJcbiAgICBsZXQgbXlEYXRhID0gdGhpcy5zZXRQYWdlTm9BbmRTaXplKHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKFwidXNlcl9wcmVmZXJlbmNlXCIsIFwiXCIsIFtjcml0ZXJpYV0sIHt9KSwxKTtcclxuICAgIGNvbnN0IHBheWxvYWREYXRhID0ge1xyXG4gICAgICBwYXRoOiBudWxsLFxyXG4gICAgICBkYXRhIDogbXlEYXRhXHJcbiAgICB9XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuZ2V0RmF2b3VyaXRlRGF0YShwYXlsb2FkRGF0YSk7XHJcbiAgfVxyXG4gIGdldFVzZXJOb3RpZmljYXRpb24ocGFnZU5vOmFueSl7XHJcbiAgICBsZXQgdXNlciA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0VXNlckluZm8oKTtcclxuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXIuX2lkO1xyXG4gICAgaWYodXNlcklkICYmIHVzZXJJZCAhPSBudWxsICYmIHVzZXJJZCAhPSAnJyl7XHJcbiAgICAgIGxldCBjcml0ZXJhaUxpc3Q6YW55PVtdO1xyXG4gICAgICBjcml0ZXJhaUxpc3QucHVzaChcInVzZXJJZC5faWQ7ZXE7XCIrdXNlcklkK1wiO1NUQVRJQ1wiKTtcclxuICAgICAgY3JpdGVyYWlMaXN0LnB1c2goXCJub3RpZmljYXRpb25TdGF0dXM7ZXE7VU5SRUFEO1NUQVRJQ1wiKTtcclxuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuc2V0UGFnZU5vQW5kU2l6ZSh0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYSgndXNlcl9ub3RpZmljYXRpb25fbWFzdGVyJywnJyxjcml0ZXJhaUxpc3Qse30pLHBhZ2VObyk7XHJcbiAgICAgIGNvbnN0IGNhbGxQYXlsb2FkID0ge1xyXG4gICAgICAgIFwicGF0aFwiIDogbnVsbCxcclxuICAgICAgICBcImRhdGFcIjogcGF5bG9hZFxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYXBpU2VydmljZS5nZXRVc2VyTm90aWZpY2F0aW9uKGNhbGxQYXlsb2FkKTtcclxuICAgIH1cclxuICB9XHJcbiAgICBnZXRVc2VyTm90aWZpY2F0aW9uU2V0dGluZygpe1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldFVzZXJOb3RpZmljYXRpb25TZXR0aW5nKCk7XHJcbiAgfVxyXG5cclxuICBnZXRBcHBsaWNhdGlvbkFsbFNldHRpbmdzKCkge1xyXG4gICAgY29uc3QgcGF5bG9hZDEgPSB0aGlzLnNldFBhZ2VOb0FuZFNpemUodGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoXCJhcHBsaWNhdGlvbl9zZXR0aW5nXCIsIFwiXCIsIFtdLCB7fSksIDEpO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldEFwbGljYXRpb25zU2V0dGluZyhwYXlsb2FkMSk7XHJcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5zZXRQYWdlTm9BbmRTaXplKHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKFwiYXBwbGljYXRpb25fdGhlbWVfc2V0dGluZ1wiLCBcIlwiLCBbXSwge30pLCAxKTtcclxuICAgIHRoaXMuYXBpU2VydmljZS5nZXRBcGxpY2F0aW9uc1RoZW1lU2V0dGluZyhwYXlsb2FkKTtcclxuICB9XHJcbiAgZ2V0RGF0YUZvckdyaWQocGFnZTphbnksdGFiOmFueSxjdXJyZW50TWVudTphbnksaGVhZEVsZW1lbnRzOmFueSxmaWx0ZXJGb3JtOmFueSxzZWxlY3RDb250YWN0OmFueSl7XHJcbiAgICAvLyBsZXQgZ3JpZF9hcGlfcGFyYW1zX2NyaXRlcmlhID0gW107XHJcbiAgICAvLyBpZih0YWIuZ3JpZCAmJiB0YWIuZ3JpZC5ncmlkX3BhZ2Vfc2l6ZSAmJiB0YWIuZ3JpZC5ncmlkX3BhZ2Vfc2l6ZSAhPSBudWxsICYmIHRhYi5ncmlkLmdyaWRfcGFnZV9zaXplICE9ICcnKXtcclxuICAgIC8vICAgdGhpcy5pdGVtTnVtT2ZHcmlkID0gdGFiLmdyaWQuZ3JpZF9wYWdlX3NpemU7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBpZih0aGlzLmNoZWNrSWZTZXJ2aWNlLmlzR3JpZEZpZWxkRXhpc3QodGFiLFwiYXBpX3BhcmFtc19jcml0ZXJpYVwiKSl7XHJcbiAgICAvLyAgIGdyaWRfYXBpX3BhcmFtc19jcml0ZXJpYSA9IHRhYi5ncmlkLmFwaV9wYXJhbXNfY3JpdGVyaWE7XHJcbiAgICAvLyB9XHJcbiAgICAvL2NvbnN0IGRhdGEgPSB0aGlzLnNldFBhZ2VOb0FuZFNpemUodGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoY3VycmVudE1lbnUubmFtZSwnJyxncmlkX2FwaV9wYXJhbXNfY3JpdGVyaWEsJycpLHBhZ2UpO1xyXG4gICAgLy9sZXQgIGNyTGlzdD1bXTtcclxuICAgIC8vIHRoaXMuZ2V0ZmlsdGVyQ3JsaXN0KGhlYWRFbGVtZW50cyxmaWx0ZXJGb3JtKS5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgIC8vICAgY3JMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAvLyB9KTtcclxuICAgIGxldCBwYXlsb2FkID0gdGhpcy5nZXREYXRhRm9yR3JpZEZpbHRlcihwYWdlLHRhYixjdXJyZW50TWVudSxoZWFkRWxlbWVudHMsZmlsdGVyRm9ybSk7XHJcbiAgICBpZihzZWxlY3RDb250YWN0ICE9ICcnKXtcclxuICAgICAgY29uc3QgdGFiRmlsdGVyQ3JsaXN0ID0ge1xyXG4gICAgICAgIFwiZk5hbWVcIjogJ2FjY291bnQuX2lkJyxcclxuICAgICAgICBcImZWYWx1ZVwiOiBzZWxlY3RDb250YWN0LFxyXG4gICAgICAgIFwib3BlcmF0b3JcIjogJ2VxJ1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHBheWxvYWQ/LmRhdGE/LmNyTGlzdC5sZW5ndGggPiAwKSBwYXlsb2FkLmRhdGEuY3JMaXN0LnB1c2godGFiRmlsdGVyQ3JsaXN0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXlsb2FkO1xyXG4gICAgLy8gY29uc3QgZ2V0RmlsdGVyRGF0YSA9IHtcclxuICAgIC8vICAgZGF0YTogZGF0YSxcclxuICAgIC8vICAgcGF0aDogbnVsbFxyXG4gICAgLy8gfVxyXG4gICAgLy8gcmV0dXJuIGdldEZpbHRlckRhdGE7XHJcbiAgfVxyXG4gIHByZXBhcmVQYXlsb2FkV2l0aENybGlzdCh0YWI6YW55LGN1cnJlbnRNZW51OmFueSxoZWFkRWxlbWVudHM6YW55LGZpbHRlckZvcm06YW55KXtcclxuICAgIGxldCBncmlkX2FwaV9wYXJhbXNfY3JpdGVyaWEgPSBbXTtcclxuICAgIGlmKHRoaXMuY2hlY2tJZlNlcnZpY2UuaXNHcmlkRmllbGRFeGlzdCh0YWIsXCJhcGlfcGFyYW1zX2NyaXRlcmlhXCIpKXtcclxuICAgICAgZ3JpZF9hcGlfcGFyYW1zX2NyaXRlcmlhID0gdGFiLmdyaWQuYXBpX3BhcmFtc19jcml0ZXJpYTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShjdXJyZW50TWVudS5uYW1lLCcnLGdyaWRfYXBpX3BhcmFtc19jcml0ZXJpYSwnJyk7XHJcbiAgICBsZXQgY3JMaXN0OmFueSA9IFtdO1xyXG4gICAgdGhpcy5nZXRmaWx0ZXJDcmxpc3QoaGVhZEVsZW1lbnRzLGZpbHRlckZvcm0pLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBjckxpc3QucHVzaChlbGVtZW50KTtcclxuICAgIH0pO1xyXG4gICAgLy9hZHZhbmNlZCBmaWx0ZXIgY3JsaXN0IGdldCBvciBhZGQgaW4gY3JsaXN0XHJcbiAgICBsZXQgYWR2YW5jZWRDcmxpc3QgPSBKU09OLnBhcnNlKDxhbnk+c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkFEVkFOQ0VfQ1JJVEVSSUFfTElTVFwiKSk7XHJcbiAgICBpZihhZHZhbmNlZENybGlzdCl7XHJcbiAgICAgIGlmKGFkdmFuY2VkQ3JsaXN0W2N1cnJlbnRNZW51Lm5hbWVdKXtcclxuICAgICAgICBsZXQgbGlzdCA9IGFkdmFuY2VkQ3JsaXN0W2N1cnJlbnRNZW51Lm5hbWVdO1xyXG4gICAgICAgIGlmKGxpc3QgJiYgbGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIGxpc3QuZm9yRWFjaCgoYWRDcml0ZXJpYTphbnkpID0+IHtcclxuICAgICAgICAgICAgY3JMaXN0LnB1c2goYWRDcml0ZXJpYSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKGNyTGlzdCAmJiBjckxpc3QubGVuZ3RoPjApe1xyXG4gICAgICBpZihwYXlsb2FkICYmIHBheWxvYWQ/LmNyTGlzdCAmJiBwYXlsb2FkLmNyTGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgICBjckxpc3QuZm9yRWFjaCgoY3I6YW55KSA9PiB7XHJcbiAgICAgICAgICBwYXlsb2FkLmNyTGlzdC5wdXNoKGNyKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgcGF5bG9hZC5jckxpc3QgPSBjckxpc3Q7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwYXlsb2FkO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldERhdGFGb3JHcmlkRmlsdGVyKHBhZ2U6YW55LHRhYjphbnksY3VycmVudE1lbnU6YW55LGhlYWRFbGVtZW50czphbnksZmlsdGVyRm9ybTphbnkpe1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMucHJlcGFyZVBheWxvYWRXaXRoQ3JsaXN0KHRhYixjdXJyZW50TWVudSxoZWFkRWxlbWVudHMsZmlsdGVyRm9ybSk7XHJcbiAgICBpZih0YWIgJiYgdGFiPy5ncmlkICYmIHRhYj8uZ3JpZD8uZ3JpZF9wYWdlX3NpemUpe1xyXG4gICAgICB0aGlzLml0ZW1OdW1PZkdyaWQgPSB0YWIuZ3JpZC5ncmlkX3BhZ2Vfc2l6ZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0UGFnZU5vQW5kU2l6ZShkYXRhLHBhZ2UpO1xyXG4gICAgY29uc3QgZ2V0RmlsdGVyRGF0YSA9IHtcclxuICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgcGF0aDogbnVsbFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdldEZpbHRlckRhdGE7XHJcbiAgfVxyXG4gIGdldFBhZ2UocGFnZTogbnVtYmVyLHRhYjphbnksY3VycmVudE1lbnU6c3RyaW5nLGhlYWRFbGVtZW50czpvYmplY3QsZmlsdGVyRm9ybTpvYmplY3Qsc2VsZWN0Q29udGFjdDphbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmdldERhdGFGb3JHcmlkKHBhZ2UsdGFiLGN1cnJlbnRNZW51LGhlYWRFbGVtZW50cyxmaWx0ZXJGb3JtLHNlbGVjdENvbnRhY3QpO1xyXG4gIH1cclxuICBnZXRSZWFsVGltZUdyaWREYXRhKGN1cnJlbnRNZW51OmFueSwgb2JqZWN0OmFueSkge1xyXG4gICAgbGV0IGdyaWRfYXBpX3BhcmFtc19jcml0ZXJpYSA9IFtdO1xyXG4gICAgbGV0IHBhZ2UgPSAxO1xyXG4gICAgbGV0IGNyaXRlcmlhID0gXCJfaWQ7ZXE7XCIgKyBvYmplY3QuX2lkICsgXCI7U1RBVElDXCI7XHJcbiAgICBncmlkX2FwaV9wYXJhbXNfY3JpdGVyaWEucHVzaChjcml0ZXJpYSk7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5zZXRQYWdlTm9BbmRTaXplKHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGN1cnJlbnRNZW51Lm5hbWUsJycsZ3JpZF9hcGlfcGFyYW1zX2NyaXRlcmlhLCcnKSxwYWdlKTtcclxuICAgIGNvbnN0IGdldEZpbHRlckRhdGEgPSB7XHJcbiAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgIHBhdGg6IG51bGxcclxuICAgIH1cclxuICAgIHRoaXMuYXBpU2VydmljZS5nZXRHcmlkUnVubmluZ0RhdGEoZ2V0RmlsdGVyRGF0YSk7XHJcbiAgfVxyXG5cclxuICBnZXRGb3JtRm9yVGRzKGRhdGE6YW55LGN1cnJlbnRNZW51OmFueSwgb2JqZWN0OmFueSl7XHJcbiAgICBsZXQgcGF5bG9hZERhdGE6YW55ID0ge307XHJcbiAgICBpZihjdXJyZW50TWVudSAhPSAnJyl7XHJcbiAgICAgIHBheWxvYWREYXRhID0gdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoY3VycmVudE1lbnUsICcnLCBbXSwgJycpXHJcbiAgICAgIHBheWxvYWREYXRhWydkYXRhJ109b2JqZWN0XHJcbiAgICB9XHJcbiAgICBjb25zdCBnZXRGb3JtRGF0YSA9IHtcclxuICAgICAgX2lkIDogZGF0YS5faWQsXHJcbiAgICAgIGRhdGE6IHBheWxvYWREYXRhXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ2V0Rm9ybURhdGE7XHJcbiAgfVxyXG4gIGdldFBkZihkYXRhOmFueSxjdXJyZW50TWVudTphbnkpIHtcclxuICAgIGxldCBwYXlsb2FkRGF0YSA9IHt9O1xyXG4gICAgaWYoY3VycmVudE1lbnUgIT0gJycpe1xyXG4gICAgICBwYXlsb2FkRGF0YSA9IHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGN1cnJlbnRNZW51LCAnJywgW10sICcnKVxyXG4gICAgfVxyXG4gICAgY29uc3QgZ2V0RmlsZURhdGE6YW55ID0ge1xyXG4gICAgICBfaWQ6IGRhdGEuX2lkLFxyXG4gICAgICBkYXRhOiBwYXlsb2FkRGF0YSxcclxuICAgICAgcmVzcG9uY2U6IHsgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVOYW1lID0gY3VycmVudE1lbnU7XHJcbiAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZmlsZU5hbWUuc2xpY2UoMSlcclxuICAgIGNvbnN0IGRvd25sb2FkUGRmQ2hlY2sgPSBmaWxlTmFtZSArICctJyArIG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XHJcbiAgICBpZihnZXRGaWxlRGF0YS5faWQgJiYgZ2V0RmlsZURhdGEuX2lkICE9IHVuZGVmaW5lZCAmJiBnZXRGaWxlRGF0YS5faWQgIT0gbnVsbCAmJiBnZXRGaWxlRGF0YS5faWQgIT0gJycpe1xyXG4gICAgICBnZXRGaWxlRGF0YS5kYXRhWydkYXRhJ109ZGF0YTtcclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLkdldEZpbGVEYXRhKGdldEZpbGVEYXRhKTtcclxuICAgIH1cclxuICAgIHJldHVybiAgZG93bmxvYWRQZGZDaGVjaztcclxuICB9XHJcbiAgZG93bmxvYWRQZGYoZGF0YTphbnksIGN1cnJlbnRNZW51OmFueSkge1xyXG4gICAgbGV0IHBheWxvYWREYXRhID0ge307XHJcbiAgICBpZiAoY3VycmVudE1lbnUgIT0gJycpIHtcclxuICAgICAgcGF5bG9hZERhdGEgPSB0aGlzLmdldFBheWxvZFdpdGhDcml0ZXJpYShjdXJyZW50TWVudSwgJycsIFtdLCAnJylcclxuICAgIH1cclxuICAgIGNvbnN0IGdldFBkZkRhdGE6YW55ID0ge1xyXG4gICAgICBfaWQ6IGRhdGEuX2lkLFxyXG4gICAgICBkYXRhOiBwYXlsb2FkRGF0YSxcclxuICAgICAgcmVzcG9uY2U6IHsgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVOYW1lID0gY3VycmVudE1lbnU7XHJcbiAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZmlsZU5hbWUuc2xpY2UoMSlcclxuICAgIGNvbnN0IGRvd25sb2FkUGRmQ2hlY2sgPSBmaWxlTmFtZSArICctJyArIG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XHJcbiAgICBpZiAoZ2V0UGRmRGF0YS5faWQgJiYgZ2V0UGRmRGF0YS5faWQgIT0gdW5kZWZpbmVkICYmIGdldFBkZkRhdGEuX2lkICE9IG51bGwgJiYgZ2V0UGRmRGF0YS5faWQgIT0gJycpIHtcclxuICAgICAgZ2V0UGRmRGF0YS5kYXRhWydkYXRhJ10gPSBkYXRhO1xyXG4gICAgICB0aGlzLmFwaVNlcnZpY2UuR2V0UGRmRGF0YShnZXRQZGZEYXRhKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkb3dubG9hZFBkZkNoZWNrO1xyXG4gIH1cclxuICBnZXRUZW1EYXRhKHRlbXBOYW1lOmFueSkge1xyXG4gICAgLy9jb25zdCBwYXJhbXMgPSBcImZvcm1fdGVtcGxhdGVcIjtcclxuICAgIC8vY29uc3QgY3JpdGVyaWEgPSBbXCJuYW1lO2VxO1wiK3RlbXBOYW1lK1wiO1NUQVRJQ1wiXTtcclxuICAgIC8vY29uc3QgcGF5bG9hZCA9IHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKHBhcmFtcywnJyxjcml0ZXJpYSx7fSk7XHJcbiAgICAvLyBjb25zdCBnZXRUZW1wbGF0ZXMgPSB7XHJcbiAgICAvLyAgIGNyTGlzdDogW3tcclxuICAgIC8vICAgICBcImZOYW1lXCI6IFwibmFtZVwiLFxyXG4gICAgLy8gICAgIFwiZlZhbHVlXCI6IHRlbXBOYW1lLFxyXG4gICAgLy8gICAgIFwib3BlcmF0b3JcIjogXCJlcVwiXHJcbiAgICAvLyAgIH1dLFxyXG4gICAgLy8gICBrZXkyOiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFwcElkKCksXHJcbiAgICAvLyAgIHJlZkNvZGU6IHRoaXMuZ2V0UmVmY29kZSgpLFxyXG4gICAgLy8gICBsb2c6IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckxvZygpLFxyXG4gICAgLy8gICB2YWx1ZTogXCJmb3JtX3RlbXBsYXRlXCJcclxuICAgIC8vIH1cclxuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldFRlbXBQYXlsb2FkKHRlbXBOYW1lLCdlcScpO1xyXG4gICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgfVxyXG4gIGdldFRlbXBQYXlsb2FkKHZhbHVlOmFueSxvcGVyYXRvcjpzdHJpbmcpe1xyXG4gICAgY29uc3QgcGFyYW1zID0gXCJmb3JtX3RlbXBsYXRlXCI7XHJcbiAgICBjb25zdCBjcml0ZXJpYSA9IFtcIm5hbWU7XCIrb3BlcmF0b3IrXCI7XCIrdmFsdWUrXCI7U1RBVElDXCJdO1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKHBhcmFtcywnJyxjcml0ZXJpYSx7fSk7XHJcbiAgICByZXR1cm4gcGF5bG9hZDtcclxuICB9XHJcbiAgc2V0UGFnZU5vQW5kU2l6ZShwYXlsb2FkOmFueSxwYWdlOm51bWJlcil7XHJcbiAgICBwYXlsb2FkWydwYWdlTm8nXSA9IHBhZ2UgLSAxO1xyXG4gICAgcGF5bG9hZFsncGFnZVNpemUnXSA9IHRoaXMuaXRlbU51bU9mR3JpZDtcclxuICAgIHJldHVybiBwYXlsb2FkO1xyXG4gIH1cclxuICBjaGVja1F0bXBBcGkocGFyYW1zOmFueSxmaWVsZDphbnkscGF5bG9hZDphbnksbXVsdGlwbGVGb3JtQ29sbGVjdGlvbjphbnksb2JqZWN0OmFueSxvYmplY3RXaXRoQ3VzdG9tOmFueSl7XHJcbiAgICBpZihwYXJhbXMuaW5kZXhPZihcIkZPUk1fR1JPVVBcIikgPj0gMCB8fCBwYXJhbXMuaW5kZXhPZihcIlFUTVBcIikgPj0gMCl7XHJcbiAgICAgIGxldCBtdWx0aUNvbGxlY3Rpb24gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG11bHRpcGxlRm9ybUNvbGxlY3Rpb24pKTtcclxuICAgICAgaWYoZmllbGQgJiYgZmllbGQuZm9ybVZhbHVlQXNPYmplY3RGb3JRdG1wKXtcclxuICAgICAgICBsZXQgZm9ybVZhbHVlID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0Rm9ybURhdGFJbk11bHRpZm9ybUNvbGxlY3Rpb24obXVsdGlDb2xsZWN0aW9uLG9iamVjdCk7XHJcbiAgICAgICAgcGF5bG9hZFtcImRhdGFcIl09Zm9ybVZhbHVlO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBsZXQgZm9ybVZhbHVlID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0Rm9ybURhdGFJbk11bHRpZm9ybUNvbGxlY3Rpb24obXVsdGlDb2xsZWN0aW9uLG9iamVjdFdpdGhDdXN0b20pO1xyXG4gICAgICAgIHBheWxvYWRbXCJkYXRhXCJdPWZvcm1WYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgfVxyXG4gIHByZXZpZXdNb2RhbChncmlkRGF0YTphbnksIGN1cnJlbnRNZW51OmFueSwgbW9kYWxJZDphbnkpIHtcclxuICAgIGNvbnN0IGdldHByZXZpZXdIdG1sID0ge1xyXG4gICAgICBfaWQ6IGdyaWREYXRhLl9pZCxcclxuICAgICAgZGF0YTogdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoY3VycmVudE1lbnUubmFtZSwgJycsIFtdLCAnJylcclxuICAgIH1cclxuICAgIHRoaXMuYXBpU2VydmljZS5HZXRQcmV2aWV3SHRtbChnZXRwcmV2aWV3SHRtbCk7XHJcbiAgICBjb25zdCBhbGVydERhdGEgPSB7XHJcbiAgICAgIGdyaWREYXRhOiBncmlkRGF0YSxcclxuICAgICAgY3VycmVudFBhZ2U6IGN1cnJlbnRNZW51Lm5hbWVcclxuICAgIH1cclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4obW9kYWxJZCwgYWxlcnREYXRhKTtcclxuICB9XHJcbiAgcHJldmlldyhncmlkRGF0YTphbnksIGN1cnJlbnRNZW51OmFueSwgbW9kYWxJZDphbnkpIHtcclxuICAgIGNvbnN0IGdldHByZXZpZXdIdG1sID0ge1xyXG4gICAgICBfaWQ6IGdyaWREYXRhLl9pZCxcclxuICAgICAgZGF0YTogdGhpcy5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoY3VycmVudE1lbnUubmFtZSwgJycsIFtdLCAnJylcclxuICAgIH1cclxuICAgIGdldHByZXZpZXdIdG1sLmRhdGFbJ2RhdGEnXSA9IGdyaWREYXRhO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLkdldFByZXZpZXdIdG1sKGdldHByZXZpZXdIdG1sKTtcclxuICB9XHJcbn1cclxuIl19
|