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.
Files changed (120) hide show
  1. package/README.md +24 -0
  2. package/esm2020/client-core-services.mjs +5 -0
  3. package/esm2020/lib/my-lib.module.mjs +98 -0
  4. package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
  5. package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
  6. package/esm2020/lib/services/api/api.service.mjs +611 -0
  7. package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
  8. package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
  9. package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
  10. package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
  11. package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
  12. package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
  13. package/esm2020/lib/services/chart/chart.service.mjs +166 -0
  14. package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
  15. package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
  16. package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
  17. package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
  18. package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
  19. package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
  20. package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
  21. package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
  22. package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
  23. package/esm2020/lib/services/download/download.service.mjs +151 -0
  24. package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
  25. package/esm2020/lib/services/env/env.service.mjs +232 -0
  26. package/esm2020/lib/services/env/serverHostList.mjs +56 -0
  27. package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
  28. package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
  29. package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
  30. package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
  31. package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
  32. package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
  33. package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
  34. package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
  35. package/esm2020/lib/services/loader/loader.service.mjs +17 -0
  36. package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
  37. package/esm2020/lib/services/model/model.service.mjs +30 -0
  38. package/esm2020/lib/services/notify/notification.service.mjs +84 -0
  39. package/esm2020/lib/services/operator/operator.service.mjs +58 -0
  40. package/esm2020/lib/services/permission/permission.service.mjs +88 -0
  41. package/esm2020/lib/services/router/router.service.mjs +78 -0
  42. package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
  43. package/esm2020/lib/services/storage/storage.service.mjs +749 -0
  44. package/esm2020/lib/services/tree-component/interface.mjs +6 -0
  45. package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
  46. package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
  47. package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
  48. package/esm2020/lib/shared/configuration/config.mjs +76 -0
  49. package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
  50. package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
  51. package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
  52. package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
  53. package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
  54. package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
  55. package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
  56. package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
  57. package/esm2020/lib/shared/platform.mjs +2 -0
  58. package/esm2020/public-api.mjs +53 -0
  59. package/fesm2015/client-core-services.mjs +15487 -0
  60. package/fesm2015/client-core-services.mjs.map +1 -0
  61. package/fesm2020/client-core-services.mjs +15482 -0
  62. package/fesm2020/client-core-services.mjs.map +1 -0
  63. package/index.d.ts +5 -0
  64. package/lib/my-lib.module.d.ts +18 -0
  65. package/lib/services/api/api-call/api-call.service.d.ts +60 -0
  66. package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
  67. package/lib/services/api/api.service.d.ts +88 -0
  68. package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
  69. package/lib/services/api/auth/auth.service.d.ts +50 -0
  70. package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
  71. package/lib/services/api/common-api/common-api.service.d.ts +22 -0
  72. package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
  73. package/lib/services/api/public-api/public-api.service.d.ts +14 -0
  74. package/lib/services/chart/chart.service.d.ts +21 -0
  75. package/lib/services/check-if/check-if.service.d.ts +50 -0
  76. package/lib/services/common-utils/common-function.service.d.ts +84 -0
  77. package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
  78. package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
  79. package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
  80. package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
  81. package/lib/services/data-share/data-share.service.d.ts +174 -0
  82. package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
  83. package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
  84. package/lib/services/download/download.service.d.ts +35 -0
  85. package/lib/services/encryption/encryption.service.d.ts +8 -0
  86. package/lib/services/env/env.service.d.ts +44 -0
  87. package/lib/services/env/serverHostList.d.ts +9 -0
  88. package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
  89. package/lib/services/form/form-control/form-control.service.d.ts +44 -0
  90. package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
  91. package/lib/services/form/form-value/form-value.service.d.ts +32 -0
  92. package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
  93. package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
  94. package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
  95. package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
  96. package/lib/services/loader/loader.service.d.ts +8 -0
  97. package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
  98. package/lib/services/model/model.service.d.ts +11 -0
  99. package/lib/services/notify/notification.service.d.ts +22 -0
  100. package/lib/services/operator/operator.service.d.ts +27 -0
  101. package/lib/services/permission/permission.service.d.ts +18 -0
  102. package/lib/services/router/router.service.d.ts +14 -0
  103. package/lib/services/storage/cookies.service.d.ts +11 -0
  104. package/lib/services/storage/storage.service.d.ts +132 -0
  105. package/lib/services/tree-component/interface.d.ts +13 -0
  106. package/lib/services/tree-component/tree-component.service.d.ts +38 -0
  107. package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
  108. package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
  109. package/lib/shared/configuration/config.d.ts +144 -0
  110. package/lib/shared/configuration/editor-config.d.ts +72 -0
  111. package/lib/shared/enums/common.enum.d.ts +16 -0
  112. package/lib/shared/enums/config.enum.d.ts +54 -0
  113. package/lib/shared/enums/end-point.enum.d.ts +66 -0
  114. package/lib/shared/enums/flags.enum.d.ts +18 -0
  115. package/lib/shared/enums/keycodes.enum.d.ts +120 -0
  116. package/lib/shared/enums/operator_type.enum.d.ts +9 -0
  117. package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
  118. package/lib/shared/platform.d.ts +1 -0
  119. package/package.json +40 -0
  120. package/public-api.d.ts +49 -0
@@ -0,0 +1,346 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../common-utils/common-function.service";
4
+ import * as i2 from "../../common-utils/core-function/core-function.service";
5
+ import * as i3 from "./../../api/api.service";
6
+ import * as i4 from "../../check-if/check-if.service";
7
+ import * as i5 from "./../../grid/grid-common-function/grid-common-function.service";
8
+ import * as i6 from "./../../api/api-call/api-call.service";
9
+ export class MultipleFormService {
10
+ constructor(commonFunctionService, coreFunctionService, apiService, checkIfService, gridCommonFunctionService, apiCallService) {
11
+ this.commonFunctionService = commonFunctionService;
12
+ this.coreFunctionService = coreFunctionService;
13
+ this.apiService = apiService;
14
+ this.checkIfService = checkIfService;
15
+ this.gridCommonFunctionService = gridCommonFunctionService;
16
+ this.apiCallService = apiCallService;
17
+ }
18
+ setPreviousFormTargetFieldData(multipleFormCollection, formValueWithCust) {
19
+ let result = {
20
+ multipleFormCollection: multipleFormCollection
21
+ };
22
+ if (result.multipleFormCollection.length > 0) {
23
+ const previousFormIndex = result.multipleFormCollection.length - 1;
24
+ const previousFormData = result.multipleFormCollection[previousFormIndex];
25
+ const previousFormField = previousFormData.current_field;
26
+ const formData = previousFormData.next_form_data;
27
+ if (previousFormField && previousFormField.add_new_target_field) {
28
+ const targateFieldName = previousFormField.add_new_target_field;
29
+ const currentFormValue = formValueWithCust;
30
+ const currentTargetFieldValue = currentFormValue[targateFieldName];
31
+ formData[targateFieldName] = currentTargetFieldValue;
32
+ }
33
+ result.multipleFormCollection[previousFormIndex]['next_form_data'] = formData;
34
+ }
35
+ return result.multipleFormCollection;
36
+ }
37
+ getNextFormObject(nextFormData, next) {
38
+ const form = nextFormData.formName;
39
+ const field_name = nextFormData.field_name;
40
+ const form_field_name = nextFormData.form_field_name;
41
+ const field = {
42
+ 'add_new_form': form,
43
+ 'add_next_form_button': next,
44
+ 'field_name': field_name,
45
+ 'type': 'hidden',
46
+ 'form_field_name': form_field_name,
47
+ 'form_value_index': 0,
48
+ 'moveFieldsToNewForm': ['employee_name#add_assignments.resource_name']
49
+ };
50
+ return field;
51
+ }
52
+ getNextFormData(formData, listOfFieldsUpdateIndex) {
53
+ let result = {
54
+ updateAddNew: false,
55
+ payload: {}
56
+ };
57
+ if (formData) {
58
+ let parent = '';
59
+ let child = '';
60
+ if (formData['parent_field']) {
61
+ parent = formData['parent_field'];
62
+ }
63
+ if (formData['current_field']) {
64
+ child = formData['current_field'];
65
+ }
66
+ let formValue = formData['data'];
67
+ let fieldValue = '';
68
+ if (parent != '') {
69
+ if (parent.type == 'list_of_fields') {
70
+ fieldValue = formValue[parent.field_name][listOfFieldsUpdateIndex][child.field_name];
71
+ }
72
+ else {
73
+ fieldValue = formValue[parent.field_name][child.field_name];
74
+ }
75
+ }
76
+ else {
77
+ fieldValue = formValue[child.field_name];
78
+ }
79
+ if (fieldValue && fieldValue._id && fieldValue._id != '') {
80
+ //console.log(fieldValue._id);
81
+ const params = child.api_params;
82
+ if (params && params != '') {
83
+ const criteria = ["_id;eq;" + fieldValue._id + ";STATIC"];
84
+ const crList = this.apiCallService.getCriteriaList(criteria, {});
85
+ const payload = this.apiCallService.getDataForGrid(1, {}, { 'name': params }, [], {}, '');
86
+ payload.data.crList = crList;
87
+ //this.apiService.getGridData(payload);
88
+ result.updateAddNew = true;
89
+ result.payload = payload;
90
+ }
91
+ }
92
+ }
93
+ return result;
94
+ }
95
+ storeFormDetails(parent_field, field, formValue, formValueWithCustomData, updateMode, nextFormData, lastTypeaheadTypeValue, multipleFormCollection, currentMenu, pForm, listOfFieldUpdateMode, listOfFieldsUpdateIndex, addNewRecord, enableNextButton, index) {
96
+ let result = {
97
+ multipleFormCollection: multipleFormCollection,
98
+ form: {},
99
+ id: "",
100
+ addNewRecord: addNewRecord,
101
+ criteria: [''],
102
+ params: ''
103
+ };
104
+ let targetFieldName = {};
105
+ targetFieldName['form'] = {};
106
+ targetFieldName['custom'] = [];
107
+ let formData = JSON.parse(JSON.stringify(formValueWithCustomData));
108
+ if (field && field.form_field_name) {
109
+ const nextFormReference = {
110
+ '_id': nextFormData._id,
111
+ 'name': nextFormData.name
112
+ };
113
+ formData[field.form_field_name] = nextFormReference;
114
+ updateMode = true;
115
+ }
116
+ if (this.coreFunctionService.isNotBlank(field.add_new_target_field)) {
117
+ targetFieldName['form'][field.add_new_target_field] = lastTypeaheadTypeValue;
118
+ }
119
+ else if (field) {
120
+ switch (field.type) {
121
+ case "list_of_fields":
122
+ case "grid_selection":
123
+ let currentFieldData = formData[field.field_name];
124
+ if (currentFieldData && Array.isArray(currentFieldData)) {
125
+ if (index != undefined && index >= 0) {
126
+ targetFieldName['form'] = currentFieldData[index];
127
+ targetFieldName['updataModeInPopupType'] = true;
128
+ }
129
+ else {
130
+ targetFieldName['custom'] = currentFieldData;
131
+ }
132
+ }
133
+ break;
134
+ default:
135
+ break;
136
+ }
137
+ }
138
+ if (this.coreFunctionService.isNotBlank(field.moveFieldsToNewForm)) {
139
+ if (field.moveFieldsToNewForm && field.moveFieldsToNewForm.length > 0) {
140
+ field.moveFieldsToNewForm.forEach((keyValue) => {
141
+ const sourceTarget = keyValue.split("#");
142
+ let key = sourceTarget[0];
143
+ let valueField = sourceTarget[1];
144
+ let multiCollection = JSON.parse(JSON.stringify(result.multipleFormCollection));
145
+ let formValueWithMulticollection = this.commonFunctionService.getFormDataInMultiformCollection(multiCollection, formValue);
146
+ let value = this.commonFunctionService.getObjectValue(valueField, formValueWithMulticollection);
147
+ targetFieldName['form'][key] = value;
148
+ });
149
+ }
150
+ }
151
+ let data = {
152
+ "collection_name": currentMenu.name,
153
+ "data": formData,
154
+ "form": pForm,
155
+ "parent_field": parent_field,
156
+ "current_field": field,
157
+ "next_form_data": targetFieldName,
158
+ "updateMode": updateMode,
159
+ "form_value": JSON.parse(JSON.stringify(formValue)),
160
+ "index": -1,
161
+ "listOfFieldUpdateMode": listOfFieldUpdateMode,
162
+ "listOfFieldsUpdateIndex": listOfFieldsUpdateIndex
163
+ };
164
+ if (field) {
165
+ const type = field.type;
166
+ switch (type) {
167
+ case "list_of_fields":
168
+ case "grid_selection":
169
+ if (index != undefined) {
170
+ data['index'] = index;
171
+ }
172
+ break;
173
+ default:
174
+ break;
175
+ }
176
+ }
177
+ result.multipleFormCollection.push(data);
178
+ if (field && field.type == "list_of_fields") {
179
+ let buttonLabel = "";
180
+ if (index != undefined && index >= 0) {
181
+ buttonLabel = 'Update';
182
+ }
183
+ else {
184
+ buttonLabel = 'Add';
185
+ }
186
+ if (field.list_of_fields && field.list_of_fields.length > 0) {
187
+ let fieldList = JSON.parse(JSON.stringify(field.list_of_fields));
188
+ if (fieldList && fieldList.length > 0 && index == undefined) {
189
+ let curField = JSON.parse(JSON.stringify(field));
190
+ curField['add_list_field'] = 'add';
191
+ fieldList.push(curField);
192
+ }
193
+ result.form = {
194
+ "details": {
195
+ "class": "",
196
+ "collection_name": "",
197
+ "bulk_update": false
198
+ },
199
+ "tab_list_buttons": [
200
+ {
201
+ "label": buttonLabel,
202
+ "onclick": {
203
+ "api": "add",
204
+ "action_name": "",
205
+ "close_form_on_succes": false
206
+ },
207
+ "type": "button",
208
+ "field_name": "save",
209
+ "api_params": "",
210
+ "show_if": "",
211
+ "disable_if": ""
212
+ },
213
+ {
214
+ "label": "Ok",
215
+ "onclick": {
216
+ "api": "close",
217
+ "action_name": "",
218
+ "close_form_on_succes": false
219
+ },
220
+ "type": "button",
221
+ "field_name": "",
222
+ "api_params": "",
223
+ "show_if": "",
224
+ "disable_if": ""
225
+ }
226
+ ],
227
+ "tableFields": fieldList,
228
+ "api_params": null,
229
+ "label": field.label
230
+ };
231
+ }
232
+ else {
233
+ if (field.form && field.form._id) {
234
+ result.id = field.form._id;
235
+ }
236
+ }
237
+ }
238
+ else {
239
+ if (field.add_new_form && field.add_new_form._id) {
240
+ result.id = field.add_new_form._id;
241
+ }
242
+ result.addNewRecord = false;
243
+ if (!enableNextButton && field && field.find_child_form) {
244
+ let cri = "collection.name;eq;" + currentMenu.name + ";STATIC";
245
+ result.criteria = [];
246
+ result.criteria.push(cri);
247
+ result.params = 'scheduled_task_form';
248
+ }
249
+ }
250
+ return result;
251
+ }
252
+ getDataForNextForm(reqParams, reqCriteria) {
253
+ const request = this.apiCallService.getDataForGrid(1, {}, { 'name': reqParams }, [], {}, '');
254
+ const crList = this.apiCallService.getCriteriaList(reqCriteria, {});
255
+ request.data.crList = crList;
256
+ this.apiService.getNextFormData(request);
257
+ }
258
+ getNextFormById(id) {
259
+ const params = "form";
260
+ const criteria = ["_id;eq;" + id + ";STATIC"];
261
+ const payload = this.apiCallService.getPaylodWithCriteria(params, '', criteria, {});
262
+ this.apiService.GetNestedForm(payload);
263
+ }
264
+ updateNextFormData(multipleFormCollection, nextFormUpdateMode, form, custmizedFormValue, editedRowIndex, previousFormFocusField, tableFields) {
265
+ let result = {
266
+ nextFormData: {},
267
+ cdata: {},
268
+ fData: {},
269
+ nextFormUpdateMode: nextFormUpdateMode,
270
+ custmizedFormValue: custmizedFormValue,
271
+ fieldName: "",
272
+ previousFormFocusField: previousFormFocusField,
273
+ editFunction: false,
274
+ updateFormFunction: false,
275
+ getStaticData: false
276
+ };
277
+ let nextFormData = {};
278
+ if (multipleFormCollection.length > 0) {
279
+ nextFormData = multipleFormCollection[multipleFormCollection.length - 1];
280
+ }
281
+ if (nextFormData && nextFormData['next_form_data'] && nextFormData['next_form_data']['custom']) {
282
+ result.cdata = nextFormData['next_form_data']['custom'];
283
+ }
284
+ if (result.nextFormData && nextFormData['next_form_data'] && nextFormData['next_form_data']['form']) {
285
+ result.fData = nextFormData['next_form_data']['form'];
286
+ }
287
+ if (nextFormData['index'] != undefined && nextFormData['index'] >= 0) {
288
+ result.nextFormUpdateMode = true;
289
+ }
290
+ if (nextFormData && nextFormData['current_field'] && nextFormData['current_field']['type'] && (nextFormData['index'] == undefined || nextFormData['index'] == -1)) {
291
+ switch (nextFormData['current_field']['type']) {
292
+ case 'list_of_fields':
293
+ case 'grid_selection':
294
+ if (Array.isArray(result.cdata)) {
295
+ if (form && form.buttons) {
296
+ if (!this.checkIfService.checkAddNewButtonOnGridSelection(form.buttons)) {
297
+ result.fieldName = nextFormData['current_field']['field_name'];
298
+ result.custmizedFormValue[result.fieldName] = result.cdata;
299
+ //this.modifyCustmizedValue(fieldName);
300
+ }
301
+ }
302
+ }
303
+ break;
304
+ default:
305
+ break;
306
+ }
307
+ }
308
+ if (nextFormData && nextFormData['next_form_data'] && nextFormData['next_form_data']['updataModeInPopupType']) {
309
+ result.editFunction = true;
310
+ //this.editedRowData(fData);
311
+ }
312
+ else {
313
+ result.updateFormFunction = true;
314
+ //this.updateDataOnFormField(fData);
315
+ if (editedRowIndex >= 0 || Object.keys(result.fData).length > 0) {
316
+ result.getStaticData = true;
317
+ //this.getStaticDataWithDependentData();
318
+ }
319
+ }
320
+ let nextFormFocusedFieldname = '';
321
+ for (let key in result.fData) {
322
+ nextFormFocusedFieldname = key;
323
+ break;
324
+ }
325
+ if (tableFields && tableFields.length > 0) {
326
+ for (let i = 0; i < tableFields.length; i++) {
327
+ const element = tableFields[i];
328
+ if (nextFormFocusedFieldname == element.field_name) {
329
+ result.previousFormFocusField = element;
330
+ break;
331
+ }
332
+ }
333
+ }
334
+ result.nextFormData = nextFormData;
335
+ return result;
336
+ }
337
+ }
338
+ MultipleFormService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MultipleFormService, deps: [{ token: i1.CommonFunctionService }, { token: i2.CoreFunctionService }, { token: i3.ApiService }, { token: i4.CheckIfService }, { token: i5.GridCommonFunctionService }, { token: i6.ApiCallService }], target: i0.ɵɵFactoryTarget.Injectable });
339
+ MultipleFormService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MultipleFormService, providedIn: 'root' });
340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MultipleFormService, decorators: [{
341
+ type: Injectable,
342
+ args: [{
343
+ providedIn: 'root'
344
+ }]
345
+ }], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.CoreFunctionService }, { type: i3.ApiService }, { type: i4.CheckIfService }, { type: i5.GridCommonFunctionService }, { type: i6.ApiCallService }]; } });
346
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlwbGUtZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9mb3JtL211bHRpcGxlLWZvcm0vbXVsdGlwbGUtZm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBUTNDLE1BQU0sT0FBTyxtQkFBbUI7SUFFOUIsWUFDVSxxQkFBMkMsRUFDM0MsbUJBQXVDLEVBQ3ZDLFVBQXFCLEVBQ3JCLGNBQTZCLEVBQzdCLHlCQUFtRCxFQUNuRCxjQUE2QjtRQUw3QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXNCO1FBQzNDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFDdkMsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3Qiw4QkFBeUIsR0FBekIseUJBQXlCLENBQTBCO1FBQ25ELG1CQUFjLEdBQWQsY0FBYyxDQUFlO0lBQ25DLENBQUM7SUFHTCw4QkFBOEIsQ0FBQyxzQkFBMEIsRUFBQyxpQkFBcUI7UUFDN0UsSUFBSSxNQUFNLEdBQUc7WUFDWCxzQkFBc0IsRUFBQyxzQkFBc0I7U0FDOUMsQ0FBQTtRQUNELElBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7WUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNuRSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzFFLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDO1lBQ3pELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLGNBQWMsQ0FBQztZ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TUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcGlDYWxsU2VydmljZSB9IGZyb20gJy4vLi4vLi4vYXBpL2FwaS1jYWxsL2FwaS1jYWxsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHcmlkQ29tbW9uRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9ncmlkL2dyaWQtY29tbW9uLWZ1bmN0aW9uL2dyaWQtY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9hcGkvYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbkZ1bmN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi11dGlscy9jb21tb24tZnVuY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENvcmVGdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24tdXRpbHMvY29yZS1mdW5jdGlvbi9jb3JlLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDaGVja0lmU2VydmljZSB9IGZyb20gJy4uLy4uL2NoZWNrLWlmL2NoZWNrLWlmLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVGb3JtU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjb21tb25GdW5jdGlvblNlcnZpY2U6Q29tbW9uRnVuY3Rpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb3JlRnVuY3Rpb25TZXJ2aWNlOkNvcmVGdW5jdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwaVNlcnZpY2U6QXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgY2hlY2tJZlNlcnZpY2U6Q2hlY2tJZlNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdyaWRDb21tb25GdW5jdGlvblNlcnZpY2U6R3JpZENvbW1vbkZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpQ2FsbFNlcnZpY2U6QXBpQ2FsbFNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuXHJcbiAgc2V0UHJldmlvdXNGb3JtVGFyZ2V0RmllbGREYXRhKG11bHRpcGxlRm9ybUNvbGxlY3Rpb246YW55LGZvcm1WYWx1ZVdpdGhDdXN0OmFueSl7XHJcbiAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICBtdWx0aXBsZUZvcm1Db2xsZWN0aW9uOm11bHRpcGxlRm9ybUNvbGxlY3Rpb25cclxuICAgIH1cclxuICAgIGlmKHJlc3VsdC5tdWx0aXBsZUZvcm1Db2xsZWN0aW9uLmxlbmd0aCA+IDApe1xyXG4gICAgICBjb25zdCBwcmV2aW91c0Zvcm1JbmRleCA9IHJlc3VsdC5tdWx0aXBsZUZvcm1Db2xsZWN0aW9uLmxlbmd0aCAtIDE7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzRm9ybURhdGEgPSByZXN1bHQubXVsdGlwbGVGb3JtQ29sbGVjdGlvbltwcmV2aW91c0Zvcm1JbmRleF07XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzRm9ybUZpZWxkID0gcHJldmlvdXNGb3JtRGF0YS5jdXJyZW50X2ZpZWxkO1xyXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IHByZXZpb3VzRm9ybURhdGEubmV4dF9mb3JtX2RhdGE7XHJcbiAgICAgIGlmKHByZXZpb3VzRm9ybUZpZWxkICYmIHByZXZpb3VzRm9ybUZpZWxkLmFkZF9uZXdfdGFyZ2V0X2ZpZWxkKXtcclxuICAgICAgICBjb25zdCB0YXJnYXRlRmllbGROYW1lID0gcHJldmlvdXNGb3JtRmllbGQuYWRkX25ld190YXJnZXRfZmllbGQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudEZvcm1WYWx1ZSA9IGZvcm1WYWx1ZVdpdGhDdXN0O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXRGaWVsZFZhbHVlID0gY3VycmVudEZvcm1WYWx1ZVt0YXJnYXRlRmllbGROYW1lXVxyXG4gICAgICAgIGZvcm1EYXRhW3RhcmdhdGVGaWVsZE5hbWVdID0gY3VycmVudFRhcmdldEZpZWxkVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0Lm11bHRpcGxlRm9ybUNvbGxlY3Rpb25bcHJldmlvdXNGb3JtSW5kZXhdWyduZXh0X2Zvcm1fZGF0YSddID0gZm9ybURhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0Lm11bHRpcGxlRm9ybUNvbGxlY3Rpb247XHJcbiAgfVxyXG4gIGdldE5leHRGb3JtT2JqZWN0KG5leHRGb3JtRGF0YTphbnksbmV4dDphbnkpe1xyXG4gICAgY29uc3QgZm9ybSA9IG5leHRGb3JtRGF0YS5mb3JtTmFtZTtcclxuICAgIGNvbnN0IGZpZWxkX25hbWUgPSBuZXh0Rm9ybURhdGEuZmllbGRfbmFtZTtcclxuICAgIGNvbnN0IGZvcm1fZmllbGRfbmFtZSA9IG5leHRGb3JtRGF0YS5mb3JtX2ZpZWxkX25hbWU7XHJcbiAgICBjb25zdCBmaWVsZCA9IHtcclxuICAgICAgJ2FkZF9uZXdfZm9ybSc6IGZvcm0sXHJcbiAgICAgICdhZGRfbmV4dF9mb3JtX2J1dHRvbic6IG5leHQsXHJcbiAgICAgICdmaWVsZF9uYW1lJzogZmllbGRfbmFtZSxcclxuICAgICAgJ3R5cGUnOiAnaGlkZGVuJyxcclxuICAgICAgJ2Zvcm1fZmllbGRfbmFtZSc6IGZvcm1fZmllbGRfbmFtZSxcclxuICAgICAgJ2Zvcm1fdmFsdWVfaW5kZXgnIDogMCxcclxuICAgICAgJ21vdmVGaWVsZHNUb05ld0Zvcm0nIDogWydlbXBsb3llZV9uYW1lI2FkZF9hc3NpZ25tZW50cy5yZXNvdXJjZV9uYW1lJ11cclxuICAgIH07XHJcbiAgICByZXR1cm4gZmllbGQ7XHJcbiAgfVxyXG4gIGdldE5leHRGb3JtRGF0YShmb3JtRGF0YTphbnksbGlzdE9mRmllbGRzVXBkYXRlSW5kZXg6YW55KXtcclxuICAgIGxldCByZXN1bHQgPXtcclxuICAgICAgdXBkYXRlQWRkTmV3OmZhbHNlLFxyXG4gICAgICBwYXlsb2FkOnt9XHJcbiAgICB9XHJcbiAgICBpZihmb3JtRGF0YSl7XHJcbiAgICAgIGxldCBwYXJlbnQ6YW55ID0gJyc7XHJcbiAgICAgIGxldCBjaGlsZDphbnkgPSAnJztcclxuICAgICAgaWYoZm9ybURhdGFbJ3BhcmVudF9maWVsZCddKXtcclxuICAgICAgICBwYXJlbnQgPSBmb3JtRGF0YVsncGFyZW50X2ZpZWxkJ107XHJcbiAgICAgIH1cclxuICAgICAgaWYoZm9ybURhdGFbJ2N1cnJlbnRfZmllbGQnXSl7XHJcbiAgICAgICAgY2hpbGQgPSBmb3JtRGF0YVsnY3VycmVudF9maWVsZCddO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBmb3JtVmFsdWUgPSBmb3JtRGF0YVsnZGF0YSddO1xyXG4gICAgICBsZXQgZmllbGRWYWx1ZTphbnkgPSAnJztcclxuICAgICAgaWYocGFyZW50ICE9ICcnKXtcclxuICAgICAgICBpZihwYXJlbnQudHlwZSA9PSAnbGlzdF9vZl9maWVsZHMnKXtcclxuICAgICAgICAgIGZpZWxkVmFsdWUgPSBmb3JtVmFsdWVbcGFyZW50LmZpZWxkX25hbWVdW2xpc3RPZkZpZWxkc1VwZGF0ZUluZGV4XVtjaGlsZC5maWVsZF9uYW1lXTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGZpZWxkVmFsdWUgPSBmb3JtVmFsdWVbcGFyZW50LmZpZWxkX25hbWVdW2NoaWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgZmllbGRWYWx1ZSA9IGZvcm1WYWx1ZVtjaGlsZC5maWVsZF9uYW1lXTtcclxuICAgICAgfVxyXG4gICAgICBpZihmaWVsZFZhbHVlICYmIGZpZWxkVmFsdWUuX2lkICYmIGZpZWxkVmFsdWUuX2lkICE9ICcnKXtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGZpZWxkVmFsdWUuX2lkKTtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSBjaGlsZC5hcGlfcGFyYW1zO1xyXG4gICAgICAgIGlmKHBhcmFtcyAmJiBwYXJhbXMgIT0gJycpe1xyXG4gICAgICAgICAgY29uc3QgY3JpdGVyaWEgPSBbXCJfaWQ7ZXE7XCIrZmllbGRWYWx1ZS5faWQrXCI7U1RBVElDXCJdXHJcbiAgICAgICAgICBjb25zdCBjckxpc3QgPSB0aGlzLmFwaUNhbGxTZXJ2aWNlLmdldENyaXRlcmlhTGlzdChjcml0ZXJpYSx7fSk7XHJcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5hcGlDYWxsU2VydmljZS5nZXREYXRhRm9yR3JpZCgxLHt9LHsnbmFtZSc6cGFyYW1zfSxbXSx7fSwnJyk7XHJcbiAgICAgICAgICBwYXlsb2FkLmRhdGEuY3JMaXN0ID0gY3JMaXN0O1xyXG4gICAgICAgICAgLy90aGlzLmFwaVNlcnZpY2UuZ2V0R3JpZERhdGEocGF5bG9hZCk7XHJcbiAgICAgICAgICByZXN1bHQudXBkYXRlQWRkTmV3ID0gdHJ1ZTtcclxuICAgICAgICAgIHJlc3VsdC5wYXlsb2FkID0gcGF5bG9hZDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG4gIHN0b3JlRm9ybURldGFpbHMocGFyZW50X2ZpZWxkOmFueSxmaWVsZDphbnksZm9ybVZhbHVlOmFueSxmb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YTphbnksdXBkYXRlTW9kZTpib29sZWFuLG5leHRGb3JtRGF0YTphbnksbGFzdFR5cGVhaGVhZFR5cGVWYWx1ZTphbnksbXVsdGlwbGVGb3JtQ29sbGVjdGlvbjphbnksY3VycmVudE1lbnU6YW55LHBGb3JtOmFueSxsaXN0T2ZGaWVsZFVwZGF0ZU1vZGU6YW55LGxpc3RPZkZpZWxkc1VwZGF0ZUluZGV4OmFueSxhZGROZXdSZWNvcmQ6YW55LGVuYWJsZU5leHRCdXR0b246YW55LGluZGV4PzpudW1iZXIpe1xyXG4gICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgbXVsdGlwbGVGb3JtQ29sbGVjdGlvbjptdWx0aXBsZUZvcm1Db2xsZWN0aW9uLFxyXG4gICAgICBmb3JtOnt9LFxyXG4gICAgICBpZDpcIlwiLFxyXG4gICAgICBhZGROZXdSZWNvcmQ6YWRkTmV3UmVjb3JkLFxyXG4gICAgICBjcml0ZXJpYTpbJyddLFxyXG4gICAgICBwYXJhbXM6JydcclxuICAgIH1cclxuICAgIGxldCB0YXJnZXRGaWVsZE5hbWU6YW55ID17fVxyXG4gICAgdGFyZ2V0RmllbGROYW1lWydmb3JtJ10gPSB7fVxyXG4gICAgdGFyZ2V0RmllbGROYW1lWydjdXN0b20nXSA9IFtdO1xyXG4gICAgbGV0IGZvcm1EYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShmb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YSkpO1xyXG4gICAgaWYoZmllbGQgJiYgZmllbGQuZm9ybV9maWVsZF9uYW1lKXtcclxuICAgICAgY29uc3QgbmV4dEZvcm1SZWZlcmVuY2UgPSB7XHJcbiAgICAgICAgJ19pZCc6bmV4dEZvcm1EYXRhLl9pZCxcclxuICAgICAgICAnbmFtZSc6bmV4dEZvcm1EYXRhLm5hbWVcclxuICAgICAgfVxyXG4gICAgICBmb3JtRGF0YVtmaWVsZC5mb3JtX2ZpZWxkX25hbWVdID0gbmV4dEZvcm1SZWZlcmVuY2U7XHJcbiAgICAgIHVwZGF0ZU1vZGUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZmllbGQuYWRkX25ld190YXJnZXRfZmllbGQpKXtcclxuICAgICAgdGFyZ2V0RmllbGROYW1lWydmb3JtJ11bZmllbGQuYWRkX25ld190YXJnZXRfZmllbGRdID0gbGFzdFR5cGVhaGVhZFR5cGVWYWx1ZVxyXG4gICAgfWVsc2UgaWYoZmllbGQpe1xyXG4gICAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcclxuICAgICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgICBjYXNlIFwiZ3JpZF9zZWxlY3Rpb25cIjpcclxuICAgICAgICAgIGxldCBjdXJyZW50RmllbGREYXRhID0gZm9ybURhdGFbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICBpZihjdXJyZW50RmllbGREYXRhICYmIEFycmF5LmlzQXJyYXkoY3VycmVudEZpZWxkRGF0YSkpe1xyXG4gICAgICAgICAgICAgIGlmKGluZGV4ICE9IHVuZGVmaW5lZCAmJiBpbmRleCA+PSAwKXtcclxuICAgICAgICAgICAgICAgIHRhcmdldEZpZWxkTmFtZVsnZm9ybSddID0gY3VycmVudEZpZWxkRGF0YVtpbmRleF07XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRGaWVsZE5hbWVbJ3VwZGF0YU1vZGVJblBvcHVwVHlwZSddID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRGaWVsZE5hbWVbJ2N1c3RvbSddID0gY3VycmVudEZpZWxkRGF0YTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGZpZWxkLm1vdmVGaWVsZHNUb05ld0Zvcm0pKXtcclxuICAgICAgaWYoZmllbGQubW92ZUZpZWxkc1RvTmV3Rm9ybSAmJiBmaWVsZC5tb3ZlRmllbGRzVG9OZXdGb3JtLmxlbmd0aCA+IDApe1xyXG4gICAgICAgIGZpZWxkLm1vdmVGaWVsZHNUb05ld0Zvcm0uZm9yRWFjaCgoa2V5VmFsdWU6YW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzb3VyY2VUYXJnZXQgPSBrZXlWYWx1ZS5zcGxpdChcIiNcIik7XHJcbiAgICAgICAgICBsZXQga2V5ID0gc291cmNlVGFyZ2V0WzBdO1xyXG4gICAgICAgICAgbGV0IHZhbHVlRmllbGQgPSBzb3VyY2VUYXJnZXRbMV07XHJcbiAgICAgICAgICBsZXQgbXVsdGlDb2xsZWN0aW9uID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXN1bHQubXVsdGlwbGVGb3JtQ29sbGVjdGlvbikpO1xyXG4gICAgICAgICAgbGV0IGZvcm1WYWx1ZVdpdGhNdWx0aWNvbGxlY3Rpb24gPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRGb3JtRGF0YUluTXVsdGlmb3JtQ29sbGVjdGlvbihtdWx0aUNvbGxlY3Rpb24sZm9ybVZhbHVlKTtcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldE9iamVjdFZhbHVlKHZhbHVlRmllbGQsZm9ybVZhbHVlV2l0aE11bHRpY29sbGVjdGlvbik7XHJcbiAgICAgICAgICB0YXJnZXRGaWVsZE5hbWVbJ2Zvcm0nXVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBcImNvbGxlY3Rpb25fbmFtZVwiOmN1cnJlbnRNZW51Lm5hbWUsXHJcbiAgICAgIFwiZGF0YVwiOmZvcm1EYXRhLFxyXG4gICAgICBcImZvcm1cIjpwRm9ybSxcclxuICAgICAgXCJwYXJlbnRfZmllbGRcIjpwYXJlbnRfZmllbGQsXHJcbiAgICAgIFwiY3VycmVudF9maWVsZFwiOmZpZWxkLFxyXG4gICAgICBcIm5leHRfZm9ybV9kYXRhXCI6dGFyZ2V0RmllbGROYW1lLFxyXG4gICAgICBcInVwZGF0ZU1vZGVcIiA6IHVwZGF0ZU1vZGUsXHJcbiAgICAgIFwiZm9ybV92YWx1ZVwiIDogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShmb3JtVmFsdWUpKSxcclxuICAgICAgXCJpbmRleFwiOiAtMSxcclxuICAgICAgXCJsaXN0T2ZGaWVsZFVwZGF0ZU1vZGVcIjpsaXN0T2ZGaWVsZFVwZGF0ZU1vZGUsXHJcbiAgICAgIFwibGlzdE9mRmllbGRzVXBkYXRlSW5kZXhcIjpsaXN0T2ZGaWVsZHNVcGRhdGVJbmRleFxyXG4gICAgfVxyXG4gICAgaWYoZmllbGQpe1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBmaWVsZC50eXBlO1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBcImxpc3Rfb2ZfZmllbGRzXCI6XHJcbiAgICAgICAgICBjYXNlIFwiZ3JpZF9zZWxlY3Rpb25cIjpcclxuICAgICAgICAgICAgaWYoaW5kZXggIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICBkYXRhWydpbmRleCddID0gaW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgcmVzdWx0Lm11bHRpcGxlRm9ybUNvbGxlY3Rpb24ucHVzaChkYXRhKTtcclxuICAgIGlmKGZpZWxkICYmIGZpZWxkLnR5cGUgPT0gXCJsaXN0X29mX2ZpZWxkc1wiKXtcclxuICAgICAgbGV0IGJ1dHRvbkxhYmVsID0gXCJcIjtcclxuICAgICAgaWYoaW5kZXggIT0gdW5kZWZpbmVkICYmIGluZGV4ID49IDApe1xyXG4gICAgICAgIGJ1dHRvbkxhYmVsID0gJ1VwZGF0ZSc7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIGJ1dHRvbkxhYmVsID0gJ0FkZCc7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZmllbGQubGlzdF9vZl9maWVsZHMgJiYgZmllbGQubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgbGV0IGZpZWxkTGlzdDphbnkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZpZWxkLmxpc3Rfb2ZfZmllbGRzKSk7XHJcbiAgICAgICAgaWYoZmllbGRMaXN0ICYmIGZpZWxkTGlzdC5sZW5ndGggPiAwICYmIGluZGV4ID09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICBsZXQgY3VyRmllbGQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZpZWxkKSk7XHJcbiAgICAgICAgICBjdXJGaWVsZFsnYWRkX2xpc3RfZmllbGQnXSA9ICdhZGQnO1xyXG4gICAgICAgICAgZmllbGRMaXN0LnB1c2goY3VyRmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQuZm9ybSA9IHtcclxuICAgICAgICAgIFwiZGV0YWlsc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJjbGFzc1wiOiBcIlwiLFxyXG4gICAgICAgICAgICAgIFwiY29sbGVjdGlvbl9uYW1lXCI6XCJcIixcclxuICAgICAgICAgICAgICBcImJ1bGtfdXBkYXRlXCI6ZmFsc2VcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0YWJfbGlzdF9idXR0b25zXCI6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogYnV0dG9uTGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgIFwib25jbGlja1wiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhcGlcIjogXCJhZGRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvbl9uYW1lXCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjbG9zZV9mb3JtX29uX3N1Y2Nlc1wiOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwiZmllbGRfbmFtZVwiOiBcInNhdmVcIixcclxuICAgICAgICAgICAgICAgICAgXCJhcGlfcGFyYW1zXCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwic2hvd19pZlwiOlwiXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwiZGlzYWJsZV9pZlwiOlwiXCJcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCJPa1wiLFxyXG4gICAgICAgICAgICAgICAgXCJvbmNsaWNrXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcGlcIjogXCJjbG9zZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvbl9uYW1lXCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2xvc2VfZm9ybV9vbl9zdWNjZXNcIjogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICBcImZpZWxkX25hbWVcIjogXCJcIixcclxuICAgICAgICAgICAgICAgIFwiYXBpX3BhcmFtc1wiOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgXCJzaG93X2lmXCI6XCJcIixcclxuICAgICAgICAgICAgICAgIFwiZGlzYWJsZV9pZlwiOlwiXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIFwidGFibGVGaWVsZHNcIjogZmllbGRMaXN0LFxyXG4gICAgICAgICAgXCJhcGlfcGFyYW1zXCI6IG51bGwsXHJcbiAgICAgICAgICBcImxhYmVsXCI6IGZpZWxkLmxhYmVsXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIGlmKGZpZWxkLmZvcm0gJiYgZmllbGQuZm9ybS5faWQpe1xyXG4gICAgICAgICAgcmVzdWx0LmlkID0gZmllbGQuZm9ybS5faWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgaWYoZmllbGQuYWRkX25ld19mb3JtICYmIGZpZWxkLmFkZF9uZXdfZm9ybS5faWQpe1xyXG4gICAgICAgIHJlc3VsdC5pZCA9IGZpZWxkLmFkZF9uZXdfZm9ybS5faWQ7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0LmFkZE5ld1JlY29yZCA9IGZhbHNlO1xyXG4gICAgICBpZighZW5hYmxlTmV4dEJ1dHRvbiAmJiBmaWVsZCAmJiBmaWVsZC5maW5kX2NoaWxkX2Zvcm0pe1xyXG4gICAgICAgIGxldCBjcmkgPSBcImNvbGxlY3Rpb24ubmFtZTtlcTtcIiArIGN1cnJlbnRNZW51Lm5hbWUgKyBcIjtTVEFUSUNcIjtcclxuICAgICAgICByZXN1bHQuY3JpdGVyaWEgPSBbXVxyXG4gICAgICAgIHJlc3VsdC5jcml0ZXJpYS5wdXNoKGNyaSk7XHJcbiAgICAgICAgcmVzdWx0LnBhcmFtcyA9ICdzY2hlZHVsZWRfdGFza19mb3JtJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGdldERhdGFGb3JOZXh0Rm9ybShyZXFQYXJhbXM6c3RyaW5nLHJlcUNyaXRlcmlhOmFueSkge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0RGF0YUZvckdyaWQoMSwge30sIHsgJ25hbWUnOiByZXFQYXJhbXMgfSwgW10sIHt9LCAnJyk7XHJcbiAgICBjb25zdCBjckxpc3QgPSB0aGlzLmFwaUNhbGxTZXJ2aWNlLmdldENyaXRlcmlhTGlzdChyZXFDcml0ZXJpYSwge30pO1xyXG4gICAgcmVxdWVzdC5kYXRhLmNyTGlzdCA9IGNyTGlzdDtcclxuICAgIHRoaXMuYXBpU2VydmljZS5nZXROZXh0Rm9ybURhdGEocmVxdWVzdCk7XHJcbiAgfVxyXG4gIGdldE5leHRGb3JtQnlJZChpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBcImZvcm1cIjtcclxuICAgIGNvbnN0IGNyaXRlcmlhID0gW1wiX2lkO2VxO1wiICsgaWQgKyBcIjtTVEFUSUNcIl07XHJcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5hcGlDYWxsU2VydmljZS5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEocGFyYW1zLCAnJywgY3JpdGVyaWEsIHt9KTtcclxuICAgIHRoaXMuYXBpU2VydmljZS5HZXROZXN0ZWRGb3JtKHBheWxvYWQpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlTmV4dEZvcm1EYXRhKG11bHRpcGxlRm9ybUNvbGxlY3Rpb246YW55LG5leHRGb3JtVXBkYXRlTW9kZTpib29sZWFuLGZvcm06YW55LGN1c3RtaXplZEZvcm1WYWx1ZTphbnksZWRpdGVkUm93SW5kZXg6YW55LHByZXZpb3VzRm9ybUZvY3VzRmllbGQ6YW55LHRhYmxlRmllbGRzOmFueSl7XHJcbiAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICBuZXh0Rm9ybURhdGE6IHt9LFxyXG4gICAgICBjZGF0YTp7fSxcclxuICAgICAgZkRhdGE6e30sXHJcbiAgICAgIG5leHRGb3JtVXBkYXRlTW9kZTpuZXh0Rm9ybVVwZGF0ZU1vZGUsXHJcbiAgICAgIGN1c3RtaXplZEZvcm1WYWx1ZTpjdXN0bWl6ZWRGb3JtVmFsdWUsXHJcbiAgICAgIGZpZWxkTmFtZTpcIlwiLFxyXG4gICAgICBwcmV2aW91c0Zvcm1Gb2N1c0ZpZWxkOnByZXZpb3VzRm9ybUZvY3VzRmllbGQsXHJcbiAgICAgIGVkaXRGdW5jdGlvbjpmYWxzZSxcclxuICAgICAgdXBkYXRlRm9ybUZ1bmN0aW9uOmZhbHNlLFxyXG4gICAgICBnZXRTdGF0aWNEYXRhOmZhbHNlXHJcbiAgICB9XHJcbiAgICBsZXQgbmV4dEZvcm1EYXRhOmFueSA9IHt9XHJcbiAgICBpZihtdWx0aXBsZUZvcm1Db2xsZWN0aW9uLmxlbmd0aCA+IDApe1xyXG4gICAgICBuZXh0Rm9ybURhdGEgPSBtdWx0aXBsZUZvcm1Db2xsZWN0aW9uW211bHRpcGxlRm9ybUNvbGxlY3Rpb24ubGVuZ3RoIC0xXTtcclxuICAgIH1cclxuICAgIGlmKG5leHRGb3JtRGF0YSAmJiBuZXh0Rm9ybURhdGFbJ25leHRfZm9ybV9kYXRhJ10gJiYgbmV4dEZvcm1EYXRhWyduZXh0X2Zvcm1fZGF0YSddWydjdXN0b20nXSl7XHJcbiAgICAgIHJlc3VsdC5jZGF0YSA9IG5leHRGb3JtRGF0YVsnbmV4dF9mb3JtX2RhdGEnXVsnY3VzdG9tJ107XHJcbiAgICB9XHJcbiAgICBpZihyZXN1bHQubmV4dEZvcm1EYXRhICYmIG5leHRGb3JtRGF0YVsnbmV4dF9mb3JtX2RhdGEnXSAmJiBuZXh0Rm9ybURhdGFbJ25leHRfZm9ybV9kYXRhJ11bJ2Zvcm0nXSl7XHJcbiAgICAgIHJlc3VsdC5mRGF0YSA9IG5leHRGb3JtRGF0YVsnbmV4dF9mb3JtX2RhdGEnXVsnZm9ybSddO1xyXG4gICAgfVxyXG4gICAgaWYobmV4dEZvcm1EYXRhWydpbmRleCddICE9IHVuZGVmaW5lZCAmJiBuZXh0Rm9ybURhdGFbJ2luZGV4J10gPj0gMCl7XHJcbiAgICAgIHJlc3VsdC5uZXh0Rm9ybVVwZGF0ZU1vZGUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYobmV4dEZvcm1EYXRhICYmIG5leHRGb3JtRGF0YVsnY3VycmVudF9maWVsZCddICYmIG5leHRGb3JtRGF0YVsnY3VycmVudF9maWVsZCddWyd0eXBlJ10gJiYgKG5leHRGb3JtRGF0YVsnaW5kZXgnXSA9PSB1bmRlZmluZWQgfHwgbmV4dEZvcm1EYXRhWydpbmRleCddID09IC0xKSl7XHJcbiAgICAgIHN3aXRjaCAobmV4dEZvcm1EYXRhWydjdXJyZW50X2ZpZWxkJ11bJ3R5cGUnXSkge1xyXG4gICAgICAgIGNhc2UgJ2xpc3Rfb2ZfZmllbGRzJzpcclxuICAgICAgICBjYXNlICdncmlkX3NlbGVjdGlvbic6XHJcbiAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3VsdC5jZGF0YSkpe1xyXG4gICAgICAgICAgICBpZihmb3JtICYmIGZvcm0uYnV0dG9ucyl7XHJcbiAgICAgICAgICAgICAgaWYoIXRoaXMuY2hlY2tJZlNlcnZpY2UuY2hlY2tBZGROZXdCdXR0b25PbkdyaWRTZWxlY3Rpb24oZm9ybS5idXR0b25zKSl7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZmllbGROYW1lID0gbmV4dEZvcm1EYXRhWydjdXJyZW50X2ZpZWxkJ11bJ2ZpZWxkX25hbWUnXTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5jdXN0bWl6ZWRGb3JtVmFsdWVbcmVzdWx0LmZpZWxkTmFtZV0gPSByZXN1bHQuY2RhdGE7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMubW9kaWZ5Q3VzdG1pemVkVmFsdWUoZmllbGROYW1lKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYobmV4dEZvcm1EYXRhICYmIG5leHRGb3JtRGF0YVsnbmV4dF9mb3JtX2RhdGEnXSAmJiBuZXh0Rm9ybURhdGFbJ25leHRfZm9ybV9kYXRhJ11bJ3VwZGF0YU1vZGVJblBvcHVwVHlwZSddKXtcclxuICAgICAgcmVzdWx0LmVkaXRGdW5jdGlvbiA9IHRydWU7XHJcbiAgICAgIC8vdGhpcy5lZGl0ZWRSb3dEYXRhKGZEYXRhKTtcclxuICAgIH1lbHNle1xyXG4gICAgICByZXN1bHQudXBkYXRlRm9ybUZ1bmN0aW9uPXRydWU7XHJcbiAgICAgIC8vdGhpcy51cGRhdGVEYXRhT25Gb3JtRmllbGQoZkRhdGEpO1xyXG4gICAgICBpZihlZGl0ZWRSb3dJbmRleCA+PSAwIHx8IE9iamVjdC5rZXlzKHJlc3VsdC5mRGF0YSkubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgcmVzdWx0LmdldFN0YXRpY0RhdGEgPSB0cnVlO1xyXG4gICAgICAgIC8vdGhpcy5nZXRTdGF0aWNEYXRhV2l0aERlcGVuZGVudERhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IG5leHRGb3JtRm9jdXNlZEZpZWxkbmFtZSA9ICcnO1xyXG4gICAgZm9yIChsZXQga2V5IGluIHJlc3VsdC5mRGF0YSkge1xyXG4gICAgICBuZXh0Rm9ybUZvY3VzZWRGaWVsZG5hbWUgPSBrZXk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgaWYgKHRhYmxlRmllbGRzICYmIHRhYmxlRmllbGRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZUZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0YWJsZUZpZWxkc1tpXTtcclxuICAgICAgICBpZihuZXh0Rm9ybUZvY3VzZWRGaWVsZG5hbWUgPT0gZWxlbWVudC5maWVsZF9uYW1lKXtcclxuICAgICAgICAgIHJlc3VsdC5wcmV2aW91c0Zvcm1Gb2N1c0ZpZWxkID0gZWxlbWVudDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlc3VsdC5uZXh0Rm9ybURhdGEgPSBuZXh0Rm9ybURhdGE7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufVxyXG4iXX0=