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,880 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { UntypedFormControl, Validators } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../common-utils/common-function.service";
5
+ import * as i2 from "../../env/env.service";
6
+ import * as i3 from "../../storage/storage.service";
7
+ import * as i4 from "@angular/forms";
8
+ import * as i5 from "../../customvalidation/customvalidation.service";
9
+ import * as i6 from "./../../api/api-call/api-call.service";
10
+ import * as i7 from "../../check-if/check-if.service";
11
+ import * as i8 from "../../model/model.service";
12
+ export class FormCreationService {
13
+ constructor(commonFunctionService, envService, storageService, formBuilder, customvalidationService, apiCallService, checkifService, modalService) {
14
+ this.commonFunctionService = commonFunctionService;
15
+ this.envService = envService;
16
+ this.storageService = storageService;
17
+ this.formBuilder = formBuilder;
18
+ this.customvalidationService = customvalidationService;
19
+ this.apiCallService = apiCallService;
20
+ this.checkifService = checkifService;
21
+ this.modalService = modalService;
22
+ const currentYear = new Date().getFullYear();
23
+ this.minDate = new Date(currentYear - 100, 0, 1);
24
+ this.maxDate = new Date(currentYear + 25, 11, 31);
25
+ }
26
+ getTempData(tempData, tabIndex, currentMenu, formName, dinamic_form) {
27
+ let responce = {
28
+ tab: {},
29
+ currentMenu: currentMenu,
30
+ grid_view_mode: "",
31
+ form: {},
32
+ forms: {}
33
+ };
34
+ if (tempData[0].templateTabs) {
35
+ responce.tab = tempData[0].templateTabs[tabIndex];
36
+ }
37
+ let tab = responce.tab;
38
+ if (tab && tab.tab_name != "" && tab.tab_name != null && tab.tab_name != undefined) {
39
+ if (currentMenu && currentMenu.name && currentMenu.name != undefined && currentMenu.name != null) {
40
+ const menu = { "name": tab.tab_name };
41
+ this.storageService.SetActiveMenu(menu);
42
+ responce.currentMenu.name = tab.tab_name;
43
+ }
44
+ }
45
+ if (tab && tab.grid != null && tab.grid != undefined) {
46
+ if (tab.grid.grid_view != null && tab.grid.grid_view != undefined && tab.grid.grid_view != '') {
47
+ responce.grid_view_mode = tab.grid.grid_view;
48
+ }
49
+ else {
50
+ responce.grid_view_mode = 'tableView';
51
+ }
52
+ }
53
+ if (tab && formName != '') {
54
+ if (formName == 'DINAMIC_FORM') {
55
+ responce.form = dinamic_form;
56
+ }
57
+ else if (tab.forms != null && tab.forms != undefined) {
58
+ responce.forms = tab.forms;
59
+ let gridActionButtons = [];
60
+ if (tab.grid && tab.grid.action_buttons) {
61
+ gridActionButtons = tab.grid.action_buttons;
62
+ }
63
+ responce.form = this.commonFunctionService.getForm(responce.forms, formName, gridActionButtons);
64
+ if (formName == 'clone_object') {
65
+ responce.form['api_params'] = "QTMP:CLONE_OBJECT";
66
+ }
67
+ //this.setForm();
68
+ }
69
+ else {
70
+ responce.form = {};
71
+ }
72
+ }
73
+ return responce;
74
+ }
75
+ checkFormDetails(form, tab, currentMenu) {
76
+ let responce = {
77
+ currentMenu: currentMenu,
78
+ bulkupdates: false,
79
+ getLocation: false,
80
+ headerFiledsData: [],
81
+ tableFields: [],
82
+ formFieldButtons: [],
83
+ getTableField: true
84
+ };
85
+ if (form) {
86
+ if (form.details) {
87
+ if (form.details.collection_name && form.details.collection_name != '' && (responce.currentMenu != undefined || this.envService.getRequestType() == 'PUBLIC')) {
88
+ if (responce.currentMenu == undefined) {
89
+ responce.currentMenu = {};
90
+ }
91
+ responce.currentMenu['name'] = form.details.collection_name;
92
+ if (tab && tab.tab_name && tab.tab_name != '') {
93
+ responce.currentMenu['tab_name'] = tab.tab_name;
94
+ }
95
+ }
96
+ if (form.details.bulk_update) {
97
+ responce.bulkupdates = true;
98
+ }
99
+ else {
100
+ responce.bulkupdates = false;
101
+ }
102
+ }
103
+ if (form.getLocation) {
104
+ responce.getLocation = form.getLocation;
105
+ }
106
+ else {
107
+ responce.getLocation = false;
108
+ }
109
+ if (form.headerFields) {
110
+ responce.headerFiledsData = form.headerFields;
111
+ }
112
+ if (form['tableFields'] && form['tableFields'] != undefined && form['tableFields'] != null) {
113
+ responce.tableFields = JSON.parse(JSON.stringify(form['tableFields']));
114
+ responce.getTableField = false;
115
+ }
116
+ else {
117
+ responce.tableFields = [];
118
+ }
119
+ if (form.tab_list_buttons && form.tab_list_buttons != undefined && form.tab_list_buttons.length > 0) {
120
+ responce.formFieldButtons = form.tab_list_buttons;
121
+ }
122
+ }
123
+ return responce;
124
+ }
125
+ createFormControl(forControl, field, object, type) {
126
+ let disabled = field.is_disabled ? true : ((field.disable_if != undefined && field.disable_if != '') ? true : false);
127
+ switch (type) {
128
+ case "list":
129
+ forControl[field.field_name] = this.formBuilder.array(object, this.validator(field));
130
+ break;
131
+ case 'checkbox':
132
+ forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field));
133
+ break;
134
+ case "text":
135
+ switch (field.type) {
136
+ case "gst_number":
137
+ forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field), this.customvalidationService.isValidGSTNumber.bind(this.customvalidationService));
138
+ break;
139
+ case "api":
140
+ switch (field.api_call_name) {
141
+ case "gst_number":
142
+ forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field), this.customvalidationService.isValidGSTNumber.bind(this.customvalidationService));
143
+ break;
144
+ default:
145
+ forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field));
146
+ break;
147
+ }
148
+ forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field), this.customvalidationService.isValidGSTNumber.bind(this.customvalidationService));
149
+ break;
150
+ case "typeahead":
151
+ switch (field.datatype) {
152
+ case 'object':
153
+ forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field), this.customvalidationService.isValidData.bind(this.customvalidationService));
154
+ break;
155
+ default:
156
+ forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field));
157
+ break;
158
+ }
159
+ break;
160
+ default:
161
+ forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field));
162
+ break;
163
+ }
164
+ break;
165
+ case "group":
166
+ forControl[field.field_name] = this.formBuilder.group(object);
167
+ break;
168
+ default:
169
+ break;
170
+ }
171
+ }
172
+ validator(field) {
173
+ const validator = [];
174
+ if (field.is_mandatory != undefined && field.is_mandatory) {
175
+ switch (field.type) {
176
+ case "grid_selection":
177
+ case "list_of_string":
178
+ break;
179
+ case "typeahead":
180
+ if (field.datatype != 'list_of_object' && field.datatype != 'chips') {
181
+ validator.push(Validators.required);
182
+ }
183
+ break;
184
+ case 'checkbox':
185
+ validator.push(Validators.requiredTrue);
186
+ break;
187
+ case "email":
188
+ validator.push(Validators.required);
189
+ validator.push(Validators.email);
190
+ break;
191
+ default:
192
+ validator.push(Validators.required);
193
+ break;
194
+ }
195
+ }
196
+ else {
197
+ switch (field.type) {
198
+ case "email":
199
+ validator.push(Validators.email);
200
+ break;
201
+ default:
202
+ break;
203
+ }
204
+ }
205
+ if (field.min_length != undefined && field.min_length != null && field.min_length != '' && Number(field.min_length) && field.min_length > 0) {
206
+ validator.push(Validators.minLength(field.min_length));
207
+ }
208
+ if (field.max_length != undefined && field.max_length != null && field.max_length != '' && Number(field.max_length) && field.max_length > 0) {
209
+ validator.push(Validators.maxLength(field.max_length));
210
+ }
211
+ return validator;
212
+ }
213
+ setNewForm(tableFields, formFieldButtons, form, elements, selectedRowIndex) {
214
+ let responce = {
215
+ calculationFieldList: [],
216
+ showIfFieldList: [],
217
+ buttonIfList: [],
218
+ disableIfFieldList: [],
219
+ mendetoryIfFieldList: [],
220
+ gridSelectionMendetoryList: [],
221
+ customValidationFiels: [],
222
+ editorTypeFieldList: [],
223
+ checkBoxFieldListValue: [],
224
+ filePreviewFields: [],
225
+ staticModal: [],
226
+ forControl: {},
227
+ showGridData: {},
228
+ isStepper: false,
229
+ blankField: { fieldName: '', index: -1 }
230
+ };
231
+ for (let index = 0; index < tableFields.length; index++) {
232
+ const element = tableFields[index];
233
+ if (element == null) {
234
+ responce.blankField.fieldName = form.name;
235
+ responce.blankField.index = index + 1;
236
+ //this.notifyFieldValueIsNull(form.name,index+1);
237
+ break;
238
+ }
239
+ if (element.type == 'pdf_view') {
240
+ if (selectedRowIndex && selectedRowIndex != -1 && elements && elements.length > 0) {
241
+ const object = elements[selectedRowIndex];
242
+ responce.staticModal.push(this.apiCallService.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, object));
243
+ }
244
+ responce.editorTypeFieldList.push(element);
245
+ }
246
+ if (element.type == 'info_html' || element.type == 'html_view') {
247
+ responce.editorTypeFieldList.push(element);
248
+ responce.filePreviewFields.push(element);
249
+ }
250
+ if (element.field_name && element.field_name != '') {
251
+ switch (element.type) {
252
+ case "list_of_checkbox":
253
+ this.createFormControl(responce.forControl, element, [], "list");
254
+ responce.checkBoxFieldListValue.push(element);
255
+ break;
256
+ case "checkbox":
257
+ this.createFormControl(responce.forControl, element, false, "checkbox");
258
+ break;
259
+ case "date":
260
+ let currentYear = new Date().getFullYear();
261
+ let value = "";
262
+ if (element.defaultValue && element.defaultValue != null && element.defaultValue != '') {
263
+ value = this.setDefaultDate(element);
264
+ }
265
+ if (element.datatype == 'object') {
266
+ this.minDate = new Date();
267
+ if (element.etc_fields && element.etc_fields != null) {
268
+ if (element.etc_fields.minDate) {
269
+ if (element.etc_fields.minDate == '-1') {
270
+ this.minDate = new Date(currentYear - 100, 0, 1);
271
+ }
272
+ else {
273
+ this.minDate.setDate(new Date().getDate() - Number(element.etc_fields.minDate));
274
+ }
275
+ }
276
+ }
277
+ this.maxDate = new Date();
278
+ if (element.etc_fields && element.etc_fields != null) {
279
+ if (element.etc_fields.maxDate) {
280
+ if (element.etc_fields.maxDate == '-1') {
281
+ this.maxDate = new Date(currentYear + 25, 11, 31);
282
+ }
283
+ else {
284
+ this.maxDate.setDate(new Date().getDate() + Number(element.etc_fields.maxDate));
285
+ }
286
+ }
287
+ }
288
+ }
289
+ else {
290
+ this.minDate = new Date(currentYear - 100, 0, 1);
291
+ this.maxDate = new Date(currentYear + 25, 11, 31);
292
+ }
293
+ element['minDate'] = this.minDate;
294
+ element['maxDate'] = this.maxDate;
295
+ this.createFormControl(responce.forControl, element, value, "text");
296
+ break;
297
+ case "daterange":
298
+ const date_range = {};
299
+ let list_of_dates = [
300
+ { field_name: 'start' },
301
+ { field_name: 'end' }
302
+ ];
303
+ if (list_of_dates.length > 0) {
304
+ list_of_dates.forEach((data) => {
305
+ this.createFormControl(date_range, data, '', "text");
306
+ });
307
+ }
308
+ this.createFormControl(responce.forControl, element, date_range, "group");
309
+ break;
310
+ case "list_of_fields":
311
+ case "group_of_fields":
312
+ const list_of_fields = {};
313
+ if (element) {
314
+ if (element.list_of_fields && element.list_of_fields.length > 0) {
315
+ for (let j = 0; j < element.list_of_fields.length; j++) {
316
+ const data = element.list_of_fields[j];
317
+ if (data == null) {
318
+ responce.blankField.fieldName = element.name;
319
+ responce.blankField.index = index + 1 + "->" + j + 1;
320
+ //this.notifyFieldValueIsNull(element.name,j+1);
321
+ break;
322
+ }
323
+ if (element.type == 'list_of_fields' && element.datatype != 'key_value') {
324
+ data['notDisplay'] = false;
325
+ }
326
+ let modifyData = JSON.parse(JSON.stringify(data));
327
+ modifyData['parent'] = element.field_name;
328
+ //show if handling
329
+ if (data.show_if && data.show_if != '') {
330
+ modifyData['parentIndex'] = index;
331
+ modifyData['currentIndex'] = j;
332
+ responce.showIfFieldList.push(modifyData);
333
+ }
334
+ //Mendetory If handling
335
+ if (data.mandatory_if && data.mandatory_if != '') {
336
+ responce.mendetoryIfFieldList.push(modifyData);
337
+ }
338
+ //disable if handling
339
+ if ((data.disable_if && data.disable_if != '') || (data.disable_on_update && data.disable_on_update != '' && data.disable_on_update != undefined && data.disable_on_update != null) || (data.disable_on_add && data.disable_on_add != '' && data.disable_on_add != undefined && data.disable_on_add != null)) {
340
+ responce.disableIfFieldList.push(modifyData);
341
+ }
342
+ if (element.type == 'list_of_fields') {
343
+ modifyData.is_mandatory = false;
344
+ }
345
+ if (data.field_name && data.field_name != '' && element.datatype != "list_of_object_with_popup") {
346
+ // Calculation onChange handling
347
+ if (element.onchange_function && element.onchange_function_param && element.onchange_function_param != "") {
348
+ responce.calculationFieldList.push(element);
349
+ }
350
+ switch (data.type) {
351
+ case "list_of_checkbox":
352
+ this.createFormControl(list_of_fields, modifyData, [], "list");
353
+ responce.checkBoxFieldListValue.push(modifyData);
354
+ break;
355
+ case "checkbox":
356
+ this.createFormControl(list_of_fields, modifyData, false, "checkbox");
357
+ break;
358
+ case "date":
359
+ let currentYear = new Date().getFullYear();
360
+ if (data.datatype == 'object') {
361
+ this.minDate = new Date();
362
+ if (data.etc_fields && data.etc_fields != null) {
363
+ if (data.etc_fields.minDate) {
364
+ if (data.etc_fields.minDate == '-1') {
365
+ this.minDate = new Date(currentYear - 100, 0, 1);
366
+ }
367
+ else {
368
+ this.minDate.setDate(new Date().getDate() - Number(data.etc_fields.minDate));
369
+ }
370
+ }
371
+ }
372
+ this.maxDate = new Date();
373
+ if (data.etc_fields && data.etc_fields != null) {
374
+ if (data.etc_fields.maxDate) {
375
+ if (data.etc_fields.maxDate == '-1') {
376
+ this.maxDate = new Date(currentYear + 25, 11, 31);
377
+ }
378
+ else {
379
+ this.maxDate.setDate(new Date().getDate() + Number(data.etc_fields.maxDate));
380
+ }
381
+ }
382
+ }
383
+ }
384
+ else {
385
+ this.minDate = new Date(currentYear - 100, 0, 1);
386
+ this.maxDate = new Date(currentYear + 25, 11, 31);
387
+ }
388
+ data['minDate'] = this.minDate;
389
+ data['maxDate'] = this.maxDate;
390
+ this.createFormControl(list_of_fields, modifyData, '', "text");
391
+ break;
392
+ default:
393
+ this.createFormControl(list_of_fields, modifyData, '', "text");
394
+ break;
395
+ }
396
+ }
397
+ data.field_class = this.commonFunctionService.getDivClass(data, (tableFields.length + element.list_of_fields.length));
398
+ }
399
+ }
400
+ }
401
+ this.createFormControl(responce.forControl, element, list_of_fields, "group");
402
+ // if(element.type == 'list_of_fields'){
403
+ // this.list_of_fields.push(element);
404
+ // }
405
+ break;
406
+ // case 'html_view':
407
+ // const field = {
408
+ // field_name : 'html_view_1'
409
+ // }
410
+ // this.createFormControl(forControl, element, '', "text")
411
+ // break;
412
+ case "stepper":
413
+ if (element.list_of_fields && element.list_of_fields.length > 0) {
414
+ element.list_of_fields.forEach((step) => {
415
+ if (step.list_of_fields != undefined && step.list_of_fields.length > 0) {
416
+ const stepper_of_fields = {};
417
+ step.list_of_fields.forEach((data) => {
418
+ let modifyData = JSON.parse(JSON.stringify(data));
419
+ modifyData.parent = step.field_name;
420
+ //show if handling
421
+ if (data.show_if && data.show_if != '') {
422
+ responce.showIfFieldList.push(modifyData);
423
+ }
424
+ //mendetory if handling
425
+ if (data.mandatory_if && data.mandatory_if != '') {
426
+ responce.mendetoryIfFieldList.push(modifyData);
427
+ }
428
+ //disable if handling
429
+ if ((data.disable_if && data.disable_if != '') || (data.disable_on_update && data.disable_on_update != '' && data.disable_on_update != undefined && data.disable_on_update != null) || (data.disable_on_add && data.disable_on_add != '' && data.disable_on_add != undefined && data.disable_on_add != null)) {
430
+ responce.disableIfFieldList.push(modifyData);
431
+ }
432
+ // Calculation onChange handling
433
+ if (element.onchange_function && element.onchange_function_param && element.onchange_function_param != "") {
434
+ responce.calculationFieldList.push(element);
435
+ }
436
+ this.createFormControl(stepper_of_fields, modifyData, '', "text");
437
+ if (data.tree_view_object && data.tree_view_object.field_name != "") {
438
+ let treeModifyData = JSON.parse(JSON.stringify(data.tree_view_object));
439
+ treeModifyData.is_mandatory = false;
440
+ this.createFormControl(stepper_of_fields, treeModifyData, '', "text");
441
+ }
442
+ });
443
+ this.createFormControl(responce.forControl, step, stepper_of_fields, "group");
444
+ }
445
+ });
446
+ responce.isStepper = true;
447
+ }
448
+ break;
449
+ case "pdf_view":
450
+ if (selectedRowIndex && selectedRowIndex != -1 && elements && elements.length > 0) {
451
+ const object = elements[selectedRowIndex];
452
+ responce.staticModal.push(this.apiCallService.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, object));
453
+ }
454
+ break;
455
+ case "input_with_uploadfile":
456
+ element.is_disabled = true;
457
+ this.createFormControl(responce.forControl, element, '', "text");
458
+ break;
459
+ case "grid_selection":
460
+ if (element && element.gridColumns && element.gridColumns.length > 0) {
461
+ let colParField = JSON.parse(JSON.stringify(element));
462
+ colParField['mendetory_fields'] = [];
463
+ element.gridColumns.forEach((colField) => {
464
+ if (colField && colField.is_mandatory) {
465
+ colParField['mendetory_fields'].push(colField);
466
+ }
467
+ });
468
+ if (colParField && colParField['mendetory_fields'] && colParField['mendetory_fields'].length > 0) {
469
+ responce.gridSelectionMendetoryList.push(colParField);
470
+ element['mendetory_fields'] = colParField['mendetory_fields'];
471
+ }
472
+ responce.showGridData[element.field_name] = true;
473
+ }
474
+ if (element && element.addNewButtonIf && element.addNewButtonIf != '') {
475
+ element['fieldIndex'] = index;
476
+ responce.buttonIfList.push(element);
477
+ }
478
+ element['showButton'] = this.checkGridSelectionButtonCondition(element, 'add', {}, {});
479
+ this.createFormControl(responce.forControl, element, '', "text");
480
+ break;
481
+ case "tree_view":
482
+ // this.treeControl[element.field_name] = new FlatTreeControl<TodoItemFlatNode>(this.getLevel, this.isExpandable);
483
+ // this.dataSource[element.field_name] = new MatTreeFlatDataSource(this.treeControl[element.field_name], this.treeFlattener);
484
+ this.createFormControl(responce.forControl, element, '', "text");
485
+ break;
486
+ default:
487
+ if (element.defaultValue && element.defaultValue != null && element.defaultValue != '') {
488
+ const value = element.defaultValue;
489
+ this.createFormControl(responce.forControl, element, value, "text");
490
+ }
491
+ else {
492
+ this.createFormControl(responce.forControl, element, '', "text");
493
+ }
494
+ break;
495
+ }
496
+ if (element.tree_view_object && element.tree_view_object.field_name != "") {
497
+ let treeModifyData = JSON.parse(JSON.stringify(element.tree_view_object));
498
+ treeModifyData.is_mandatory = false;
499
+ this.createFormControl(responce.forControl, treeModifyData, '', "text");
500
+ }
501
+ }
502
+ //show if handling
503
+ if (element.show_if && element.show_if != '') {
504
+ responce.showIfFieldList.push(element);
505
+ }
506
+ //mendatory if handling
507
+ if (element.mandatory_if && element.mandatory_if != '') {
508
+ responce.mendetoryIfFieldList.push(element);
509
+ }
510
+ //Customvalidation handling
511
+ if (element.compareFieldName && element.compareFieldName != '') {
512
+ responce.customValidationFiels.push(element);
513
+ }
514
+ //disable if handling
515
+ if ((element.disable_if && element.disable_if != '') || (element.disable_on_update && element.disable_on_update != '' && element.disable_on_update != undefined && element.disable_on_update != null) || (element.disable_on_add && element.disable_on_add != '' && element.disable_on_add != undefined && element.disable_on_add != null)) {
516
+ responce.disableIfFieldList.push(element);
517
+ }
518
+ // Calculation onChange handling
519
+ if (element.onchange_function && element.onchange_function_param && element.onchange_function_param != "") {
520
+ responce.calculationFieldList.push(element);
521
+ }
522
+ element.field_class = this.commonFunctionService.getDivClass(element, tableFields.length);
523
+ }
524
+ if (formFieldButtons && formFieldButtons.length > 0) {
525
+ formFieldButtons.forEach((element) => {
526
+ if (element.field_name && element.field_name != '') {
527
+ switch (element.type) {
528
+ case "dropdown":
529
+ this.createFormControl(responce.forControl, element, '', "text");
530
+ break;
531
+ default:
532
+ break;
533
+ }
534
+ }
535
+ if (element.show_if && element.show_if != '') {
536
+ responce.showIfFieldList.push(element);
537
+ }
538
+ if (element.mandatory_if && element.mandatory_if != '') {
539
+ responce.mendetoryIfFieldList.push(element);
540
+ }
541
+ if ((element.disable_if && element.disable_if != '') || (element.disable_on_update && element.disable_on_update != '' && element.disable_on_update != undefined && element.disable_on_update != null) || (element.disable_on_add && element.disable_on_add != '' && element.disable_on_add != undefined && element.disable_on_add != null)) {
542
+ responce.disableIfFieldList.push(element);
543
+ }
544
+ });
545
+ }
546
+ return responce;
547
+ }
548
+ checkFieldButtonCondition(tableFields) {
549
+ let responce = {
550
+ tempVal: {}
551
+ };
552
+ tableFields.forEach((element) => {
553
+ switch (element.type) {
554
+ case "typeahead":
555
+ if (element.datatype == 'list_of_object') {
556
+ responce.tempVal[element.field_name + "_add_button"] = true;
557
+ }
558
+ break;
559
+ case "list_of_string":
560
+ responce.tempVal[element.field_name + "_add_button"] = true;
561
+ break;
562
+ case "list_of_fields":
563
+ case "group_of_fields":
564
+ if (element.list_of_fields != undefined && element.list_of_fields != null && element.list_of_fields.length > 0) {
565
+ element.list_of_fields.forEach((child) => {
566
+ if (child && child != null) {
567
+ switch (child.type) {
568
+ case "typeahead":
569
+ if (child.datatype == 'list_of_object') {
570
+ responce.tempVal[element.field_name + '_' + child.field_name + "_add_button"] = true;
571
+ }
572
+ break;
573
+ case "list_of_string":
574
+ responce.tempVal[element.field_name + '_' + child.field_name + "_add_button"] = true;
575
+ break;
576
+ default:
577
+ break;
578
+ }
579
+ }
580
+ });
581
+ }
582
+ break;
583
+ case "stepper":
584
+ if (element.list_of_fields != undefined && element.list_of_fields != null && element.list_of_fields.length > 0) {
585
+ element.list_of_fields.forEach((step) => {
586
+ if (step.list_of_fields != undefined && step.list_of_fields != null && step.list_of_fields.length > 0) {
587
+ step.list_of_fields.forEach((child) => {
588
+ switch (child.type) {
589
+ case "typeahead":
590
+ if (child.datatype == 'list_of_object') {
591
+ responce.tempVal[step.field_name + '_' + child.field_name + "_add_button"] = true;
592
+ }
593
+ break;
594
+ case "list_of_string":
595
+ responce.tempVal[step.field_name + '_' + child.field_name + "_add_button"] = true;
596
+ break;
597
+ default:
598
+ break;
599
+ }
600
+ });
601
+ }
602
+ });
603
+ }
604
+ break;
605
+ default:
606
+ break;
607
+ }
608
+ });
609
+ return responce;
610
+ }
611
+ updateSelectContact(selectContact, tabFilterData, tableFields, templateForm, formValueWithCustomData, staticModal) {
612
+ let account = {};
613
+ let contact = {};
614
+ let payload = {};
615
+ let selectContactObject = {};
616
+ if (selectContact) {
617
+ selectContactObject = selectContact;
618
+ }
619
+ if (tabFilterData && tabFilterData.length > 0) {
620
+ tabFilterData.forEach((element) => {
621
+ if (element && element._id) {
622
+ if (element._id == selectContact) {
623
+ selectContactObject = element;
624
+ }
625
+ }
626
+ });
627
+ }
628
+ if (selectContactObject) {
629
+ if (selectContactObject['_id']) {
630
+ contact = {
631
+ "_id": selectContactObject['_id'],
632
+ "name": selectContactObject['name'],
633
+ "code": selectContactObject['serialId']
634
+ };
635
+ }
636
+ if (selectContactObject['lead']) {
637
+ account = selectContactObject['lead'];
638
+ }
639
+ }
640
+ if (tableFields && tableFields.length > 0) {
641
+ tableFields.forEach((element) => {
642
+ if (element && element.field_name && element.field_name != '') {
643
+ let fieldName = element.field_name;
644
+ if (fieldName == 'account') {
645
+ if (account && Object.keys(account).length > 0) {
646
+ templateForm.controls['account'].setValue(account);
647
+ }
648
+ if (element.onchange_api_params && element.onchange_call_back_field && !element.do_not_auto_trigger_on_edit) {
649
+ payload = this.apiCallService.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, formValueWithCustomData);
650
+ if (element.onchange_api_params.indexOf("FORM_GROUP") >= 0 || element.onchange_api_params.indexOf("QTMP") >= 0) {
651
+ payload["data"] = formValueWithCustomData;
652
+ }
653
+ staticModal.push(payload);
654
+ }
655
+ }
656
+ if (element.field_name == 'contact') {
657
+ if (contact && Object.keys(contact).length > 0) {
658
+ templateForm.controls['contact'].setValue(contact);
659
+ }
660
+ if (element.onchange_api_params && element.onchange_call_back_field && !element.do_not_auto_trigger_on_edit) {
661
+ payload = this.apiCallService.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, formValueWithCustomData);
662
+ if (element.onchange_api_params.indexOf("FORM_GROUP") >= 0 || element.onchange_api_params.indexOf("QTMP") >= 0) {
663
+ payload["data"] = formValueWithCustomData;
664
+ }
665
+ staticModal.push(payload);
666
+ }
667
+ }
668
+ if (element.type == 'stepper' && element.list_of_fields && element.list_of_fields.length > 0) {
669
+ element.list_of_fields.forEach((stepData) => {
670
+ if (stepData && stepData.list_of_fields && stepData.list_of_fields.length > 0) {
671
+ stepData.list_of_fields.forEach((data) => {
672
+ let fieldName = stepData.field_name;
673
+ if (data.field_name == 'account') {
674
+ templateForm.controls[fieldName].controls['account'].setValue(account);
675
+ //this.templateForm.get(stepData.field_name).get('account').setValue(account);
676
+ if (data.onchange_api_params && data.onchange_call_back_field && !data.do_not_auto_trigger_on_edit) {
677
+ payload = this.apiCallService.getPaylodWithCriteria(data.onchange_api_params, data.onchange_call_back_field, data.onchange_api_params_criteria, formValueWithCustomData);
678
+ if (data.onchange_api_params.indexOf("FORM_GROUP") >= 0 || data.onchange_api_params.indexOf("QTMP") >= 0) {
679
+ payload["data"] = formValueWithCustomData;
680
+ }
681
+ staticModal.push(payload);
682
+ }
683
+ }
684
+ if (data.field_name == 'contact') {
685
+ templateForm.controls[fieldName].controls['contact'].setValue(contact);
686
+ if (data.onchange_api_params && data.onchange_call_back_field && !data.do_not_auto_trigger_on_edit) {
687
+ payload = this.apiCallService.getPaylodWithCriteria(data.onchange_api_params, data.onchange_call_back_field, data.onchange_api_params_criteria, formValueWithCustomData);
688
+ if (data.onchange_api_params.indexOf("FORM_GROUP") >= 0 || data.onchange_api_params.indexOf("QTMP") >= 0) {
689
+ payload["data"] = formValueWithCustomData;
690
+ }
691
+ staticModal.push(payload);
692
+ }
693
+ }
694
+ });
695
+ }
696
+ });
697
+ }
698
+ }
699
+ });
700
+ }
701
+ return staticModal;
702
+ }
703
+ checkGridSelectionButtonCondition(field, button, selectedRow, formValue) {
704
+ let check = true;
705
+ switch (button) {
706
+ case 'add':
707
+ if (field && field.addNewButtonIf && field.addNewButtonIf != '') {
708
+ let modifyedField = {};
709
+ modifyedField['show_if'] = field.addNewButtonIf;
710
+ check = this.checkifService.checkShowIf(modifyedField, selectedRow, formValue);
711
+ }
712
+ break;
713
+ default:
714
+ break;
715
+ }
716
+ return check;
717
+ }
718
+ setDefaultDate(element) {
719
+ let value = "";
720
+ let today = new Date();
721
+ today.setHours(0, 0, 0, 0);
722
+ let yesterday = new Date(today);
723
+ yesterday.setDate(yesterday.getDate() - 1);
724
+ yesterday.setHours(0, 0, 0, 0);
725
+ switch (element.defaultValue) {
726
+ case "Today":
727
+ value = today;
728
+ break;
729
+ case "Yesterday":
730
+ value = yesterday;
731
+ break;
732
+ default:
733
+ break;
734
+ }
735
+ return value;
736
+ }
737
+ getFocusField(previousFormFocusField, tableFields, templateForm, focusFieldParent, checkFormFieldAutfocus) {
738
+ let responce = {
739
+ checkFormFieldAutfocus: checkFormFieldAutfocus,
740
+ previousFormFocusField: previousFormFocusField,
741
+ focusFieldParent: focusFieldParent,
742
+ id: ""
743
+ };
744
+ if (previousFormFocusField && previousFormFocusField._id) {
745
+ responce = this.focusField("", previousFormFocusField, templateForm, focusFieldParent, checkFormFieldAutfocus, previousFormFocusField, responce);
746
+ }
747
+ else {
748
+ if (previousFormFocusField == undefined || previousFormFocusField._id == undefined) {
749
+ for (const key of tableFields) {
750
+ if (key.type == "stepper") {
751
+ if (key.list_of_fields && key.list_of_fields != null && key.list_of_fields.length > 0) {
752
+ for (const step of key.list_of_fields) {
753
+ if (step.list_of_fields && step.list_of_fields != null && step.list_of_fields.length > 0) {
754
+ for (const field of step.list_of_fields) {
755
+ if (field.field_name) {
756
+ responce = this.focusField(step, field, templateForm, focusFieldParent, checkFormFieldAutfocus, previousFormFocusField, responce);
757
+ break;
758
+ }
759
+ }
760
+ }
761
+ }
762
+ }
763
+ }
764
+ else if (key.field_name) {
765
+ if (key.type == 'text') {
766
+ responce = this.focusField("", key, templateForm, focusFieldParent, checkFormFieldAutfocus, previousFormFocusField, responce);
767
+ break;
768
+ }
769
+ else {
770
+ responce.checkFormFieldAutfocus = false;
771
+ break;
772
+ }
773
+ }
774
+ }
775
+ }
776
+ }
777
+ return responce;
778
+ }
779
+ focusField(parent, key, templateForm, focusFieldParent, checkFormFieldAutfocus, previousFormFocusField, responce) {
780
+ responce.id = key._id + "_" + key.field_name;
781
+ let field = {};
782
+ if (parent == '') {
783
+ if (focusFieldParent && focusFieldParent.field_name && focusFieldParent.field_name != '') {
784
+ parent = focusFieldParent;
785
+ }
786
+ }
787
+ if (parent != "") {
788
+ field = templateForm.controls[parent.field_name].controls[key.field_name];
789
+ }
790
+ else {
791
+ field = templateForm.controls[key.field_name];
792
+ }
793
+ if (field && field.touched) {
794
+ responce.checkFormFieldAutfocus = false;
795
+ if (previousFormFocusField && previousFormFocusField._id) {
796
+ responce.previousFormFocusField = {};
797
+ responce.focusFieldParent = {};
798
+ }
799
+ }
800
+ else if (field == undefined) {
801
+ responce.previousFormFocusField = {};
802
+ responce.focusFieldParent = {};
803
+ }
804
+ return responce;
805
+ }
806
+ getDonotResetFields(tableFields, donotResetFieldLists, FormValue) {
807
+ tableFields.forEach((tablefield) => {
808
+ if (tablefield.do_not_refresh_on_add && tablefield.type != "list_of_fields" && tablefield.type != "group_of_fields" && tablefield.type != "stepper") {
809
+ donotResetFieldLists[tablefield.field_name] = FormValue[tablefield.field_name];
810
+ }
811
+ else if (tablefield.type == "group_of_fields") {
812
+ if (tablefield.list_of_fields && tablefield.list_of_fields.length > 0) {
813
+ tablefield.list_of_fields.forEach((field) => {
814
+ if (field.do_not_refresh_on_add) {
815
+ donotResetFieldLists[tablefield.field_name][field.field_name] = FormValue[tablefield.field_name][field.field_name];
816
+ }
817
+ });
818
+ }
819
+ }
820
+ else if (tablefield.type == "stepper") {
821
+ if (tablefield.list_of_fields && tablefield.list_of_fields.length > 0) {
822
+ tablefield.list_of_fields.forEach((step) => {
823
+ if (step.list_of_fields && step.list_of_fields.length > 0) {
824
+ step.list_of_fields.forEach((field) => {
825
+ if (field.do_not_refresh_on_add) {
826
+ donotResetFieldLists[step.field_name][field.field_name] = FormValue[step.field_name][field.field_name];
827
+ }
828
+ });
829
+ }
830
+ });
831
+ }
832
+ }
833
+ });
834
+ return donotResetFieldLists;
835
+ }
836
+ addNewForm(selectTabIndex, isBulkUpdate, bulkuploadList, selectedRowIndex, formName, selectContactAdd) {
837
+ let formData = {};
838
+ formData['tabIndex'] = selectTabIndex;
839
+ formData['bulkUpdate'] = isBulkUpdate;
840
+ formData['bulkDataList'] = bulkuploadList;
841
+ formData['editedRowIndex'] = selectedRowIndex;
842
+ formData['formName'] = formName;
843
+ formData['selectContact'] = selectContactAdd;
844
+ this.modalService.open('form-modal', formData);
845
+ }
846
+ getFieldsFromForms(tab, formName, dinamic_form, gridButtons, tableFields, actionButtons) {
847
+ let responce = {
848
+ "fields": tableFields,
849
+ "buttons": actionButtons
850
+ };
851
+ let form = null;
852
+ if (formName != 'DINAMIC_FORM' && tab && tab.forms) {
853
+ form = this.commonFunctionService.getForm(tab.forms, formName, gridButtons);
854
+ }
855
+ else if (formName == 'DINAMIC_FORM') {
856
+ form = dinamic_form;
857
+ }
858
+ else {
859
+ form = null;
860
+ }
861
+ if (form != null) {
862
+ if (form?.['tableFields'] && form?.['tableFields']?.length > 0) {
863
+ responce.fields = form['tableFields'];
864
+ }
865
+ if (form?.['tab_list_buttons'] && form?.['tab_list_buttons']?.length > 0) {
866
+ responce.buttons = form['tab_list_buttons'];
867
+ }
868
+ }
869
+ return responce;
870
+ }
871
+ }
872
+ FormCreationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormCreationService, deps: [{ token: i1.CommonFunctionService }, { token: i2.EnvService }, { token: i3.StorageService }, { token: i4.UntypedFormBuilder }, { token: i5.CustomvalidationService }, { token: i6.ApiCallService }, { token: i7.CheckIfService }, { token: i8.ModelService }], target: i0.ɵɵFactoryTarget.Injectable });
873
+ FormCreationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormCreationService, providedIn: 'root' });
874
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormCreationService, decorators: [{
875
+ type: Injectable,
876
+ args: [{
877
+ providedIn: 'root'
878
+ }]
879
+ }], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.EnvService }, { type: i3.StorageService }, { type: i4.UntypedFormBuilder }, { type: i5.CustomvalidationService }, { type: i6.ApiCallService }, { type: i7.CheckIfService }, { type: i8.ModelService }]; } });
880
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jcmVhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9mb3JtL2Zvcm0tY3JlYXRpb24vZm9ybS1jcmVhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUF3QyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQVN0RyxNQUFNLE9BQU8sbUJBQW1CO0lBSzlCLFlBQ1UscUJBQTJDLEVBQzNDLFVBQXFCLEVBQ3JCLGNBQTZCLEVBQzdCLFdBQStCLEVBQy9CLHVCQUErQyxFQUMvQyxjQUE2QixFQUM3QixjQUE2QixFQUM3QixZQUF5QjtRQVB6QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXNCO1FBQzNDLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDckIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBd0I7UUFDL0MsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsaUJBQVksR0FBWixZQUFZLENBQWE7UUFFL0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELFdBQVcsQ0FBQyxRQUFZLEVBQUMsUUFBWSxFQUFDLFdBQWUsRUFBQyxRQUFZLEVBQUMsWUFBZ0I7UUFDakYsSUFBSSxRQUFRLEdBQUs7WUFDZixHQUFHLEVBQUMsRUFBRTtZQUNOLFdBQVcsRUFBQyxXQUFXO1lBQ3ZCLGNBQWMsRUFBQyxFQUFFO1lBQ2pCLElBQUksRUFBQyxFQUFFO1lBQ1AsS0FBSyxFQUFDLEVBQUU7U0FDVCxDQUFBO1FBQ0QsSUFBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFDO1lBQzFCLFFBQVEsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUE7UUFDdEIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxTQUFTLEVBQUU7WUFDbEYsSUFBRyxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLElBQUksRUFBQztnQkFDOUYsTUFBTSxJQUFJLEdBQUcsRUFBQyxNQUFNLEVBQUMsR0FBRyxDQUFDLFFBQVEsRUFBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUMxQztTQUNGO1FBQ0QsSUFBRyxHQUFHLElBQUssR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUU7WUFDcEQsSUFBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBQztnQkFDM0YsUUFBUSxDQUFDLGNBQWMsR0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUM1QztpQkFBSTtnQkFDSCxRQUFRLENBQUMsY0FBYyxHQUFDLFdBQVcsQ0FBQzthQUNyQztTQUNGO1FBRUQsSUFBRyxHQUFHLElBQUksUUFBUSxJQUFJLEVBQUUsRUFBQztZQUN2QixJQUFHLFFBQVEsSUFBSSxjQUFjLEVBQUM7Z0JBQzVCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFBO2FBQzdCO2lCQUFLLElBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxTQUFTLEVBQUU7Z0JBQ3BELFFBQVEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDM0IsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7Z0JBQzNCLElBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBQztvQkFDckMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7aUJBQzdDO2dCQUNELFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxpQkFBaUIsQ0FBQyxDQUFBO2dCQUM3RixJQUFHLFFBQVEsSUFBSSxjQUFjLEVBQUM7b0JBQzVCLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsbUJBQW1CLENBQUM7aUJBQ25EO2dCQUNELGlCQUFpQjthQUNsQjtpQkFBSTtnQkFDSCxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQzthQUNwQjtTQUNGO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVEsRUFBQyxHQUFPLEVBQUMsV0FBZTtRQUMvQyxJQUFJLFFBQVEsR0FBSztZQUNmLFdBQVcsRUFBQyxXQUFXO1lBQ3ZCLFdBQVcsRUFBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBQyxLQUFLO1lBQ2pCLGdCQUFnQixFQUFDLEVBQUU7WUFDbkIsV0FBVyxFQUFDLEVBQUU7WUFDZCxnQkFBZ0IsRUFBQyxFQUFFO1lBQ25CLGFBQWEsRUFBQyxJQUFJO1NBQ25CLENBQUE7UUFDRCxJQUFHLElBQUksRUFBQztZQUNOLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztnQkFDZCxJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLElBQUksUUFBUSxDQUFDLEVBQUM7b0JBQzNKLElBQUcsUUFBUSxDQUFDLFdBQVcsSUFBSSxTQUFTLEVBQUM7d0JBQ25DLFFBQVEsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO3FCQUMzQjtvQkFDRCxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO29CQUM1RCxJQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFDO3dCQUMzQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7cUJBQ2pEO2lCQUNGO2dCQUNELElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUM7b0JBQzFCLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2lCQUM3QjtxQkFBSTtvQkFDSCxRQUFRLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztpQkFDOUI7YUFDRjtZQUNELElBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQztnQkFDbEIsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2FBQ3pDO2lCQUFJO2dCQUNILFFBQVEsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2FBQzlCO1lBQ0QsSUFBRyxJQUFJLENBQUMsWUFBWSxFQUFDO2dCQUNuQixRQUFRLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUMvQztZQUNELElBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksRUFBQztnQkFDeEYsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkUsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7YUFDaEM7aUJBQUk7Z0JBQ0gsUUFBUSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7YUFDM0I7WUFDRCxJQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO2dCQUNqRyxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2FBQ25EO1NBQ0Y7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUVsQixDQUFDO0lBQ0QsaUJBQWlCLENBQUMsVUFBYyxFQUFFLEtBQVMsRUFBRSxNQUFVLEVBQUUsSUFBVztRQUNsRSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JILFFBQVEsSUFBSSxFQUFFO1lBQ1osS0FBSyxNQUFNO2dCQUNULFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtnQkFDcEYsTUFBTTtZQUNOLEtBQUssVUFBVTtnQkFDYixVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7Z0JBQ25ILE1BQU07WUFDVixLQUFLLE1BQU07Z0JBQ1QsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFO29CQUNsQixLQUFLLFlBQVk7d0JBQ2YsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUE7d0JBQ25NLE1BQU07b0JBQ1IsS0FBSyxLQUFLO3dCQUNSLFFBQVEsS0FBSyxDQUFDLGFBQWEsRUFBRTs0QkFDM0IsS0FBSyxZQUFZO2dDQUNmLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFBO2dDQUNuTSxNQUFNOzRCQUNSO2dDQUNFLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtnQ0FDbkgsTUFBTTt5QkFDVDt3QkFDQyxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQTt3QkFDbk0sTUFBTTtvQkFDVixLQUFLLFdBQVc7d0JBQ2QsUUFBUSxLQUFLLENBQUMsUUFBUSxFQUFFOzRCQUN0QixLQUFLLFFBQVE7Z0NBQ1gsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFBO2dDQUM5TCxNQUFNOzRCQUNSO2dDQUNFLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtnQ0FDbkgsTUFBTTt5QkFDVDt3QkFDRCxNQUFNO29CQUNSO3dCQUNFLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTt3QkFDbkgsTUFBTTtpQkFDVDtnQkFDRCxNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQzdELE1BQU07WUFDUjtnQkFDRSxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBQ0QsU0FBUyxDQUFDLEtBQVM7UUFDakIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFBO1FBQ3BCLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxTQUFTLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtZQUN6RCxRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xCLEtBQUssZ0JBQWdCLENBQUM7Z0JBQ3RCLEtBQUssZ0JBQWdCO29CQUNuQixNQUFNO2dCQUNSLEtBQUssV0FBVztvQkFDZCxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksZ0JBQWdCLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUU7d0JBQ25FLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO3FCQUNwQztvQkFDRCxNQUFNO2dCQUNSLEtBQUssVUFBVTtvQkFDYixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtvQkFDdkMsTUFBTTtnQkFDUixLQUFLLE9BQU87b0JBQ1YsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7b0JBQ25DLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNqQyxNQUFNO2dCQUNSO29CQUNFLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO29CQUNuQyxNQUFNO2FBQ1Q7U0FDRjthQUFJO1lBQ0gsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFDO2dCQUNqQixLQUFLLE9BQU87b0JBQ1YsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2pDLE1BQU07Z0JBQ1I7b0JBQ0UsTUFBTTthQUNUO1NBQ0Y7UUFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDM0ksU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1NBQ3ZEO1FBQ0QsSUFBRyxLQUFLLENBQUMsVUFBVSxJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFDO1lBQ3pJLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtTQUN2RDtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxVQUFVLENBQUMsV0FBZSxFQUFDLGdCQUFvQixFQUFDLElBQVEsRUFBQyxRQUFZLEVBQUMsZ0JBQXVCO1FBQzNGLElBQUksUUFBUSxHQUFPO1lBQ2pCLG9CQUFvQixFQUFDLEVBQUU7WUFDdkIsZUFBZSxFQUFDLEVBQUU7WUFDbEIsWUFBWSxFQUFDLEVBQUU7WUFDZixrQkFBa0IsRUFBQyxFQUFFO1lBQ3JCLG9CQUFvQixFQUFHLEVBQUU7WUFDekIsMEJBQTBCLEVBQUMsRUFBRTtZQUM3QixxQkFBcUIsRUFBRyxFQUFFO1lBQzFCLG1CQUFtQixFQUFHLEVBQUU7WUFDeEIsc0JBQXNCLEVBQUMsRUFBRTtZQUN6QixpQkFBaUIsRUFBQyxFQUFFO1lBQ3BCLFdBQVcsRUFBQyxFQUFFO1lBQ2QsVUFBVSxFQUFDLEVBQUU7WUFDYixZQUFZLEVBQUMsRUFBRTtZQUNmLFNBQVMsRUFBQyxLQUFLO1lBQ2YsVUFBVSxFQUFDLEVBQUMsU0FBUyxFQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLEVBQUM7U0FDbkMsQ0FBQTtRQUNELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxJQUFHLE9BQU8sSUFBSSxJQUFJLEVBQUM7Z0JBQ2pCLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQzFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBQyxDQUFDLENBQUM7Z0JBQ3BDLGlEQUFpRDtnQkFDakQsTUFBTTthQUNQO1lBQ0QsSUFBRyxPQUFPLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBQztnQkFDNUIsSUFBRyxnQkFBZ0IsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7b0JBQy9FLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUMxQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUMsT0FBTyxDQUFDLDRCQUE0QixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQ2hMO2dCQUNELFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDNUM7WUFDRCxJQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksV0FBVyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFO2dCQUM3RCxRQUFRLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzFDO1lBQ0QsSUFBRyxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFDO2dCQUNoRCxRQUFRLE9BQU8sQ0FBQyxJQUFJLEVBQUU7b0JBQ3BCLEtBQUssa0JBQWtCO3dCQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFBO3dCQUNoRSxRQUFRLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUM5QyxNQUFNO29CQUNSLEtBQUssVUFBVTt3QkFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFBO3dCQUN2RSxNQUFNO29CQUNSLEtBQUssTUFBTTt3QkFDVCxJQUFJLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUMzQyxJQUFJLEtBQUssR0FBTyxFQUFFLENBQUM7d0JBQ25CLElBQUcsT0FBTyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUUsRUFBQzs0QkFDcEYsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ3RDO3dCQUNELElBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxRQUFRLEVBQUM7NEJBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzs0QkFDMUIsSUFBRyxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFDO2dDQUNsRCxJQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFDO29DQUM1QixJQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLElBQUksRUFBQzt3Q0FDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztxQ0FDbEQ7eUNBQUk7d0NBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3FDQUNqRjtpQ0FDRjs2QkFDRjs0QkFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7NEJBQzFCLElBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLElBQUksRUFBQztnQ0FDbEQsSUFBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBQztvQ0FDNUIsSUFBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUM7d0NBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7cUNBQ25EO3lDQUFJO3dDQUNILElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztxQ0FDakY7aUNBQ0Y7NkJBQ0Y7eUJBQ0Y7NkJBQUk7NEJBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzt5QkFDbkQ7d0JBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUE7d0JBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO3dCQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO3dCQUNuRSxNQUFNO29CQUNSLEtBQUssV0FBVzt3QkFDZCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7d0JBQ3RCLElBQUksYUFBYSxHQUFHOzRCQUNsQixFQUFDLFVBQVUsRUFBRyxPQUFPLEVBQUM7NEJBQ3RCLEVBQUMsVUFBVSxFQUFHLEtBQUssRUFBQzt5QkFDckIsQ0FBQTt3QkFDRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUM1QixhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0NBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQTs0QkFDdEQsQ0FBQyxDQUFDLENBQUM7eUJBQ0o7d0JBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQTt3QkFDekUsTUFBTTtvQkFDUixLQUFLLGdCQUFnQixDQUFDO29CQUN0QixLQUFLLGlCQUFpQjt3QkFDcEIsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO3dCQUMxQixJQUFHLE9BQU8sRUFBQzs0QkFDVCxJQUFJLE9BQU8sQ0FBQyxjQUFjLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dDQUMvRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0NBQ3RELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7b0NBQ3ZDLElBQUcsSUFBSSxJQUFJLElBQUksRUFBQzt3Q0FDZCxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO3dDQUM3QyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUMsQ0FBQyxHQUFDLElBQUksR0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDO3dDQUM3QyxnREFBZ0Q7d0NBQ2hELE1BQU07cUNBQ1A7b0NBQ0QsSUFBRyxPQUFPLENBQUMsSUFBSSxJQUFJLGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksV0FBVyxFQUFDO3dDQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSyxDQUFDO3FDQUM1QjtvQ0FDRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQ0FDbEQsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7b0NBQzFDLGtCQUFrQjtvQ0FDbEIsSUFBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFDO3dDQUNwQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDO3dDQUNsQyxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dDQUMvQixRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztxQ0FDM0M7b0NBQ0QsdUJBQXVCO29DQUN2QixJQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLEVBQUM7d0NBQzlDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUNBQ2hEO29DQUNELHFCQUFxQjtvQ0FDckIsSUFBRyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxFQUFDO3dDQUMxUyxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FDQUM5QztvQ0FDRCxJQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUM7d0NBQ2xDLFVBQVUsQ0FBQyxZQUFZLEdBQUMsS0FBSyxDQUFDO3FDQUMvQjtvQ0FDRCxJQUFHLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSwyQkFBMkIsRUFBQzt3Q0FDN0YsZ0NBQWdDO3dDQUNoQyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsdUJBQXVCLElBQUksT0FBTyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsRUFBQzs0Q0FDeEcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt5Q0FDN0M7d0NBQ0QsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFOzRDQUNqQixLQUFLLGtCQUFrQjtnREFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFBO2dEQUM5RCxRQUFRLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dEQUNqRCxNQUFNOzRDQUNSLEtBQUssVUFBVTtnREFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUE7Z0RBQ3JFLE1BQU07NENBQ1IsS0FBSyxNQUFNO2dEQUNULElBQUksV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0RBQzNDLElBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLEVBQUM7b0RBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztvREFDMUIsSUFBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFDO3dEQUM1QyxJQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFDOzREQUN6QixJQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLElBQUksRUFBQztnRUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs2REFDbEQ7aUVBQUk7Z0VBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOzZEQUM5RTt5REFDRjtxREFDRjtvREFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7b0RBQzFCLElBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBQzt3REFDNUMsSUFBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBQzs0REFDekIsSUFBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUM7Z0VBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7NkRBQ25EO2lFQUFJO2dFQUNILElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzs2REFDOUU7eURBQ0Y7cURBQ0Y7aURBQ0Y7cURBQUk7b0RBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvREFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztpREFDbkQ7Z0RBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUE7Z0RBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2dEQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7Z0RBQzlELE1BQU07NENBQ1I7Z0RBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFBO2dEQUM5RCxNQUFNO3lDQUNUO3FDQUNGO29DQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztpQ0FDdEg7NkJBQ0Y7eUJBQ0Y7d0JBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQTt3QkFDN0Usd0NBQXdDO3dCQUN4Qyx1Q0FBdUM7d0JBQ3ZDLElBQUk7d0JBQ0osTUFBTTtvQkFDUixvQkFBb0I7b0JBQ3BCLG9CQUFvQjtvQkFDcEIsaUNBQWlDO29CQUNqQyxNQUFNO29CQUNOLDREQUE0RDtvQkFDNUQsV0FBVztvQkFDWCxLQUFLLFNBQVM7d0JBQ1osSUFBRyxPQUFPLENBQUMsY0FBYyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDOUQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFRLEVBQUUsRUFBRTtnQ0FDMUMsSUFBRyxJQUFJLENBQUMsY0FBYyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7b0NBQ3BFLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO29DQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVEsRUFBRSxFQUFFO3dDQUN2QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzt3Q0FDbEQsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO3dDQUNwQyxrQkFBa0I7d0NBQ2xCLElBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBQzs0Q0FDcEMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7eUNBQzNDO3dDQUNELHVCQUF1Qjt3Q0FDdkIsSUFBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxFQUFDOzRDQUM5QyxRQUFRLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3lDQUNoRDt3Q0FDRCxxQkFBcUI7d0NBQ3JCLElBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsRUFBQzs0Q0FDMVMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzt5Q0FDOUM7d0NBQ0QsZ0NBQWdDO3dDQUNoQyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsdUJBQXVCLElBQUksT0FBTyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsRUFBQzs0Q0FDeEcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt5Q0FDN0M7d0NBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7d0NBQ2pFLElBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFDOzRDQUNqRSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQzs0Q0FDdkUsY0FBYyxDQUFDLFlBQVksR0FBQyxLQUFLLENBQUM7NENBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLEVBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFBO3lDQUN2RTtvQ0FDSCxDQUFDLENBQUMsQ0FBQztvQ0FDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUE7aUNBQzlFOzRCQUNILENBQUMsQ0FBQyxDQUFDOzRCQUNILFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO3lCQUMzQjt3QkFDRCxNQUFNO29CQUNSLEtBQUssVUFBVTt3QkFDYixJQUFHLGdCQUFnQixJQUFJLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQzs0QkFDL0UsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7NEJBQzFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBQyxPQUFPLENBQUMsNEJBQTRCLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzt5QkFDaEw7d0JBQ0QsTUFBTTtvQkFDUixLQUFLLHVCQUF1Qjt3QkFDMUIsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7d0JBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7d0JBQ2hFLE1BQU07b0JBQ1IsS0FBSyxnQkFBZ0I7d0JBQ25CLElBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDOzRCQUNsRSxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzs0QkFDdEQsV0FBVyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUNyQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVksRUFBRSxFQUFFO2dDQUMzQyxJQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFDO29DQUNuQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUNBQ2hEOzRCQUNILENBQUMsQ0FBQyxDQUFDOzRCQUNILElBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7Z0NBQzlGLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0NBQ3RELE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDOzZCQUMvRDs0QkFDRCxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7eUJBQ2xEO3dCQUNELElBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxjQUFjLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxFQUFFLEVBQUM7NEJBQ25FLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUM7NEJBQzlCLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3lCQUNyQzt3QkFDRCxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE9BQU8sRUFBQyxLQUFLLEVBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNwRixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO3dCQUNqRSxNQUFNO29CQUNSLEtBQUssV0FBVzt3QkFDZCxrSEFBa0g7d0JBQ2xILDZIQUE2SDt3QkFDN0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDakUsTUFBTTtvQkFDUjt3QkFDRSxJQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxFQUFFLEVBQUM7NEJBQ3BGLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7NEJBQ25DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7eUJBQ3JFOzZCQUFJOzRCQUNILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7eUJBQ2xFO3dCQUNELE1BQU07aUJBQ1Q7Z0JBQ0QsSUFBRyxPQUFPLENBQUMsZ0JBQWdCLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUM7b0JBQ3ZFLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO29CQUMxRSxjQUFjLENBQUMsWUFBWSxHQUFDLEtBQUssQ0FBQztvQkFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQTtpQkFDekU7YUFDRjtZQUNELGtCQUFrQjtZQUNsQixJQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUM7Z0JBQzFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3hDO1lBQ0QsdUJBQXVCO1lBQ3ZCLElBQUcsT0FBTyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUUsRUFBQztnQkFDcEQsUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3QztZQUNELDJCQUEyQjtZQUMzQixJQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLElBQUksRUFBRSxFQUFDO2dCQUM1RCxRQUFRLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzlDO1lBQ0QscUJBQXFCO1lBQ3JCLElBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLElBQUksT0FBTyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsSUFBSSxPQUFPLENBQUMsaUJBQWlCLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxFQUFFLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsRUFBQztnQkFDeFUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMzQztZQUNELGdDQUFnQztZQUNoQyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsdUJBQXVCLElBQUksT0FBTyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsRUFBQztnQkFDeEcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3QztZQUNELE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzFGO1FBQ0QsSUFBRyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQ2pELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVcsRUFBRSxFQUFFO2dCQUN2QyxJQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUM7b0JBQ2hELFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRTt3QkFDcEIsS0FBSyxVQUFVOzRCQUNiLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7NEJBQ2hFLE1BQU07d0JBQ1I7NEJBQ0UsTUFBTTtxQkFDVDtpQkFDRjtnQkFDRCxJQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUM7b0JBQzFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN4QztnQkFDRCxJQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxFQUFFLEVBQUM7b0JBQ3BELFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQzdDO2dCQUNELElBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLElBQUksT0FBTyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsSUFBSSxPQUFPLENBQUMsaUJBQWlCLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxFQUFFLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsRUFBQztvQkFDeFUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDM0M7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELHlCQUF5QixDQUFDLFdBQWU7UUFDdkMsSUFBSSxRQUFRLEdBQUs7WUFDZixPQUFPLEVBQUMsRUFBRTtTQUNYLENBQUE7UUFDRCxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBVyxFQUFFLEVBQUU7WUFDbEMsUUFBUSxPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUNwQixLQUFLLFdBQVc7b0JBQ2QsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLGdCQUFnQixFQUFFO3dCQUN4QyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO3FCQUM3RDtvQkFDRCxNQUFNO2dCQUNSLEtBQUssZ0JBQWdCO29CQUNuQixRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUM1RCxNQUFNO2dCQUNSLEtBQUssZ0JBQWdCLENBQUM7Z0JBQ3RCLEtBQUssaUJBQWlCO29CQUNwQixJQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxjQUFjLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQzt3QkFDNUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRTs0QkFDM0MsSUFBRyxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksRUFBQztnQ0FDeEIsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFO29DQUNsQixLQUFLLFdBQVc7d0NBQ2QsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLGdCQUFnQixFQUFFOzRDQUN0QyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO3lDQUN0Rjt3Q0FDRCxNQUFNO29DQUNSLEtBQUssZ0JBQWdCO3dDQUNuQixRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO3dDQUNyRixNQUFNO29DQUNSO3dDQUNFLE1BQU07aUNBQ1Q7NkJBQ0Y7d0JBQ0gsQ0FBQyxDQUFDLENBQUM7cUJBQ0o7b0JBQ0QsTUFBTTtnQkFDUixLQUFLLFNBQVM7b0JBQ1osSUFBRyxPQUFPLENBQUMsY0FBYyxJQUFJLFNBQVMsSUFBSSxPQUFPLENBQUMsY0FBYyxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7d0JBQzVHLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUSxFQUFFLEVBQUU7NEJBQzFDLElBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO2dDQUNuRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVMsRUFBRSxFQUFFO29DQUN4QyxRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUU7d0NBQ2xCLEtBQUssV0FBVzs0Q0FDZCxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksZ0JBQWdCLEVBQUU7Z0RBQ3RDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUM7NkNBQ25GOzRDQUNELE1BQU07d0NBQ1IsS0FBSyxnQkFBZ0I7NENBQ25CLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUM7NENBQ2xGLE1BQU07d0NBQ1I7NENBQ0UsTUFBTTtxQ0FDVDtnQ0FDSCxDQUFDLENBQUMsQ0FBQzs2QkFDSjt3QkFDSCxDQUFDLENBQUMsQ0FBQztxQkFDSjtvQkFDRCxNQUFNO2dCQUNSO29CQUNFLE1BQU07YUFDVDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELG1CQUFtQixDQUFDLGFBQWlCLEVBQUMsYUFBaUIsRUFBQyxXQUFlLEVBQUMsWUFBNkIsRUFBQyx1QkFBMkIsRUFBQyxXQUFlO1FBQy9JLElBQUksT0FBTyxHQUFDLEVBQUUsQ0FBQztRQUNmLElBQUksT0FBTyxHQUFDLEVBQUUsQ0FBQztRQUNmLElBQUksT0FBTyxHQUFPLEVBQUUsQ0FBQztRQUNyQixJQUFJLG1CQUFtQixHQUFPLEVBQUUsQ0FBQztRQUNqQyxJQUFHLGFBQWEsRUFBQztZQUNmLG1CQUFtQixHQUFHLGFBQWEsQ0FBQztTQUNyQztRQUNELElBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQzNDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTtnQkFDcEMsSUFBRyxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBQztvQkFDeEIsSUFBRyxPQUFPLENBQUMsR0FBRyxJQUFJLGFBQWEsRUFBQzt3QkFDOUIsbUJBQW1CLEdBQUcsT0FBTyxDQUFDO3FCQUMvQjtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFHLG1CQUFtQixFQUFDO1lBQ3JCLElBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUM7Z0JBQzVCLE9BQU8sR0FBRztvQkFDUixLQUFLLEVBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO29CQUNoQyxNQUFNLEVBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDO29CQUNsQyxNQUFNLEVBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDO2lCQUN2QyxDQUFBO2FBQ0Y7WUFDRCxJQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFDO2dCQUM3QixPQUFPLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdkM7U0FDRjtRQUNELElBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQ3ZDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTtnQkFDbEMsSUFBRyxPQUFPLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFBQztvQkFDM0QsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztvQkFDbkMsSUFBRyxTQUFTLElBQUksU0FBUyxFQUFDO3dCQUN4QixJQUFHLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7NEJBQzVDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3lCQUNwRDt3QkFDRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxPQUFPLENBQUMsd0JBQXdCLElBQUksQ0FBQyxPQUFPLENBQUMsMkJBQTJCLEVBQUU7NEJBQzNHLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLDRCQUE0QixFQUFFLHVCQUF1QixDQUFDLENBQUE7NEJBQ2pMLElBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUM7Z0NBQzVHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBQyx1QkFBdUIsQ0FBQzs2QkFDekM7NEJBQ0QsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt5QkFDM0I7cUJBQ0Y7b0JBQ0QsSUFBRyxPQUFPLENBQUMsVUFBVSxJQUFJLFNBQVMsRUFBQzt3QkFDakMsSUFBRyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDOzRCQUM1QyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzt5QkFDcEQ7d0JBQ0QsSUFBSSxPQUFPLENBQUMsbUJBQW1CLElBQUksT0FBTyxDQUFDLHdCQUF3QixJQUFJLENBQUMsT0FBTyxDQUFDLDJCQUEyQixFQUFFOzRCQUMzRyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRSx1QkFBdUIsQ0FBQyxDQUFBOzRCQUNqTCxJQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDO2dDQUM1RyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUMsdUJBQXVCLENBQUM7NkJBQ3pDOzRCQUNELFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQzNCO3FCQUNGO29CQUNELElBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7d0JBQzFGLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBWSxFQUFFLEVBQUU7NEJBQzlDLElBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxjQUFjLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO2dDQUMzRSxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVEsRUFBRSxFQUFFO29DQUMzQyxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO29DQUNwQyxJQUFHLElBQUksQ0FBQyxVQUFVLElBQUksU0FBUyxFQUFDO3dDQUNYLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3Q0FDM0YsOEVBQThFO3dDQUM5RSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7NENBQ2xHLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLDRCQUE0QixFQUFFLHVCQUF1QixDQUFDLENBQUE7NENBQ3hLLElBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUM7Z0RBQ3RHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBQyx1QkFBdUIsQ0FBQzs2Q0FDekM7NENBQ0QsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt5Q0FDM0I7cUNBQ0Y7b0NBQ0QsSUFBRyxJQUFJLENBQUMsVUFBVSxJQUFJLFNBQVMsRUFBQzt3Q0FDWCxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7d0NBQzNGLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRTs0Q0FDbEcsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsdUJBQXVCLENBQUMsQ0FBQTs0Q0FDeEssSUFBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBQztnREFDdEcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFDLHVCQUF1QixDQUFDOzZDQUN6Qzs0Q0FDRCxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3lDQUMzQjtxQ0FDRjtnQ0FDSCxDQUFDLENBQUMsQ0FBQzs2QkFDSjt3QkFDSCxDQUFDLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsaUNBQWlDLENBQUMsS0FBUyxFQUFDLE1BQVUsRUFBQyxXQUFlLEVBQUMsU0FBYTtRQUNsRixJQUFJLEtBQUssR0FBTyxJQUFJLENBQUM7UUFDckIsUUFBUSxNQUFNLEVBQUU7WUFDZCxLQUFLLEtBQUs7Z0JBQ1IsSUFBRyxLQUFLLElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBQztvQkFDN0QsSUFBSSxhQUFhLEdBQU8sRUFBRSxDQUFDO29CQUMzQixhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztvQkFDaEQsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBQyxXQUFXLEVBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzlFO2dCQUNELE1BQU07WUFDUjtnQkFDRSxNQUFNO1NBQ1Q7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxjQUFjLENBQUMsT0FBVztRQUN4QixJQUFJLEtBQUssR0FBTyxFQUFFLENBQUM7UUFDbkIsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsUUFBUSxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQzVCLEtBQUssT0FBTztnQkFDVixLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUNkLE1BQU07WUFDUixLQUFLLFdBQVc7Z0JBQ2QsS0FBSyxHQUFHLFNBQVMsQ0FBQztnQkFDbEIsTUFBTTtZQUNSO2dCQUNFLE1BQU07U0FDVDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELGFBQWEsQ0FBQyxzQkFBMEIsRUFBQyxXQUFlLEVBQUMsWUFBNkIsRUFBQyxnQkFBb0IsRUFBQyxzQkFBMEI7UUFDcEksSUFBSSxRQUFRLEdBQUs7WUFDZixzQkFBc0IsRUFBQyxzQkFBc0I7WUFDN0Msc0JBQXNCLEVBQUMsc0JBQXNCO1lBQzdDLGdCQUFnQixFQUFDLGdCQUFnQjtZQUNqQyxFQUFFLEVBQUMsRUFBRTtTQUNOLENBQUE7UUFDRCxJQUFHLHNCQUFzQixJQUFJLHNCQUFzQixDQUFDLEdBQUcsRUFBQztZQUN0RCxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUMsc0JBQXNCLEVBQUMsWUFBWSxFQUFDLGdCQUFnQixFQUFDLHNCQUFzQixFQUFDLHNCQUFzQixFQUFDLFFBQVEsQ0FBQyxDQUFBO1NBQzNJO2FBQUk7WUFDSCxJQUFHLHNCQUFzQixJQUFJLFNBQVMsSUFBSSxzQkFBc0IsQ0FBQyxHQUFHLElBQUksU0FBUyxFQUFDO2dCQUNoRixLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRTtvQkFDN0IsSUFBRyxHQUFHLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBQzt3QkFDdkIsSUFBRyxHQUFHLENBQUMsY0FBYyxJQUFJLEdBQUcsQ0FBQyxjQUFjLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQzs0QkFDbkYsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsY0FBYyxFQUFFO2dDQUNyQyxJQUFHLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO29DQUN0RixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7d0NBQ3ZDLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTs0Q0FDcEIsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxZQUFZLEVBQUMsZ0JBQWdCLEVBQUMsc0JBQXNCLEVBQUMsc0JBQXNCLEVBQUMsUUFBUSxDQUFDLENBQUM7NENBQzVILE1BQU07eUNBQ1A7cUNBQ0Y7aUNBQ0Y7NkJBQ0Y7eUJBQ0Y7cUJBQ0Y7eUJBQUssSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO3dCQUN4QixJQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksTUFBTSxFQUFDOzRCQUNwQixRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLFlBQVksRUFBQyxnQkFBZ0IsRUFBQyxzQkFBc0IsRUFBQyxzQkFBc0IsRUFBQyxRQUFRLENBQUMsQ0FBQzs0QkFDeEgsTUFBTTt5QkFDUDs2QkFBSTs0QkFDSCxRQUFRLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDOzRCQUN4QyxNQUFNO3lCQUNQO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxVQUFVLENBQUMsTUFBVSxFQUFDLEdBQU8sRUFBQyxZQUE2QixFQUFDLGdCQUFvQixFQUFDLHNCQUEwQixFQUFDLHNCQUEwQixFQUFDLFFBQVk7UUFDakosUUFBUSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQzdDLElBQUksS0FBSyxHQUFPLEVBQUUsQ0FBQztRQUNuQixJQUFHLE1BQU0sSUFBSSxFQUFFLEVBQUM7WUFDZCxJQUFHLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFDO2dCQUN0RixNQUFNLEdBQUcsZ0JBQWdCLENBQUM7YUFDM0I7U0FDRjtRQUNELElBQUcsTUFBTSxJQUFJLEVBQUUsRUFBQztZQUNkLEtBQUssR0FBc0IsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMvRjthQUFJO1lBQ0gsS0FBSyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsSUFBRyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBQztZQUN4QixRQUFRLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1lBQ3hDLElBQUcsc0JBQXNCLElBQUksc0JBQXNCLENBQUMsR0FBRyxFQUFDO2dCQUN0RCxRQUFRLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO2dCQUNyQyxRQUFRLENBQUMsZ0JBQWdCLEdBQUMsRUFBRSxDQUFDO2FBQzlCO1NBQ0Y7YUFBSyxJQUFHLEtBQUssSUFBSSxTQUFTLEVBQUM7WUFDMUIsUUFBUSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztZQUNyQyxRQUFRLENBQUMsZ0JBQWdCLEdBQUMsRUFBRSxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELG1CQUFtQixDQUFDLFdBQWUsRUFBQyxvQkFBd0IsRUFBQyxTQUFhO1FBQ3hFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFjLEVBQUUsRUFBRTtZQUNyQyxJQUFHLFVBQVUsQ0FBQyxxQkFBcUIsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGdCQUFnQixJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksaUJBQWlCLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUM7Z0JBQ2pKLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2hGO2lCQUFLLElBQUcsVUFBVSxDQUFDLElBQUksSUFBSSxpQkFBaUIsRUFBQztnQkFDNUMsSUFBRyxVQUFVLENBQUMsY0FBYyxJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQztvQkFDbkUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRTt3QkFDOUMsSUFBRyxLQUFLLENBQUMscUJBQXFCLEVBQUM7NEJBQzdCLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7eUJBQ3BIO29CQUNILENBQUMsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7aUJBQUssSUFBRyxVQUFVLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBQztnQkFDcEMsSUFBRyxVQUFVLENBQUMsY0FBYyxJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQztvQkFDbkUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFRLEVBQUUsRUFBRTt3QkFDN0MsSUFBRyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQzs0QkFDdkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRTtnQ0FDeEMsSUFBRyxLQUFLLENBQUMscUJBQXFCLEVBQUM7b0NBQzdCLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7aUNBQ3hHOzRCQUNILENBQUMsQ0FBQyxDQUFDO3lCQUNKO29CQUNILENBQUMsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUNELFVBQVUsQ0FBQyxjQUFxQixFQUFDLFlBQW9CLEVBQUMsY0FBa0IsRUFBQyxnQkFBdUIsRUFBQyxRQUFlLEVBQUMsZ0JBQW9CO1FBQ25JLElBQUksUUFBUSxHQUFPLEVBQUUsQ0FBQTtRQUNyQixRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxZQUFZLENBQUM7UUFDdEMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLGNBQWMsQ0FBQztRQUMxQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztRQUM5QyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ2hDLFFBQVEsQ0FBQyxlQUFlLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUMsUUFBUSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUNELGtCQUFrQixDQUFDLEdBQU8sRUFBQyxRQUFlLEVBQUMsWUFBZ0IsRUFBQyxXQUFlLEVBQUMsV0FBZSxFQUFDLGFBQWlCO1FBQzNHLElBQUksUUFBUSxHQUFHO1lBQ2IsUUFBUSxFQUFHLFdBQVc7WUFDdEIsU0FBUyxFQUFHLGFBQWE7U0FDMUIsQ0FBQTtRQUNELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFHLFFBQVEsSUFBSSxjQUFjLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUM7WUFDaEQsSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsV0FBVyxDQUFDLENBQUM7U0FDM0U7YUFBSyxJQUFHLFFBQVEsSUFBSSxjQUFjLEVBQUM7WUFDbEMsSUFBSSxHQUFHLFlBQVksQ0FBQztTQUNyQjthQUFJO1lBQ0gsSUFBSSxHQUFHLElBQUksQ0FBQTtTQUNaO1FBQ0QsSUFBRyxJQUFJLElBQUksSUFBSSxFQUFDO1lBQ2QsSUFBRyxJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFDO2dCQUM1RCxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN2QztZQUNELElBQUcsSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUM7Z0JBQ3RFLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDN0M7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7O2lIQTcwQlUsbUJBQW1CO3FIQUFuQixtQkFBbUIsY0FGbEIsTUFBTTs0RkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpQ2FsbFNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL2FwaS9hcGktY2FsbC9hcGktY2FsbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24tdXRpbHMvY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnZTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZW52L2Vudi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b212YWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2N1c3RvbXZhbGlkYXRpb24vY3VzdG9tdmFsaWRhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2hlY2tJZlNlcnZpY2UgfSBmcm9tICcuLi8uLi9jaGVjay1pZi9jaGVjay1pZi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvbW9kZWwuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtQ3JlYXRpb25TZXJ2aWNlIHtcclxuXHJcbiAgbWluRGF0ZTogRGF0ZTtcclxuICBtYXhEYXRlOiBEYXRlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29tbW9uRnVuY3Rpb25TZXJ2aWNlOkNvbW1vbkZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZW52U2VydmljZTpFbnZTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTpTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgY3VzdG9tdmFsaWRhdGlvblNlcnZpY2U6Q3VzdG9tdmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwaUNhbGxTZXJ2aWNlOkFwaUNhbGxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjaGVja2lmU2VydmljZTpDaGVja0lmU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOk1vZGVsU2VydmljZVxyXG4gICkge1xyXG4gICAgICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgLSAxMDAsIDAsIDEpO1xyXG4gICAgICB0aGlzLm1heERhdGUgPSBuZXcgRGF0ZShjdXJyZW50WWVhciArIDI1LCAxMSwgMzEpO1xyXG4gIH1cclxuICBnZXRUZW1wRGF0YSh0ZW1wRGF0YTphbnksdGFiSW5kZXg6YW55LGN1cnJlbnRNZW51OmFueSxmb3JtTmFtZTphbnksZGluYW1pY19mb3JtOmFueSl7XHJcbiAgICBsZXQgcmVzcG9uY2U6YW55PXtcclxuICAgICAgdGFiOnt9LFxyXG4gICAgICBjdXJyZW50TWVudTpjdXJyZW50TWVudSxcclxuICAgICAgZ3JpZF92aWV3X21vZGU6XCJcIixcclxuICAgICAgZm9ybTp7fSxcclxuICAgICAgZm9ybXM6e31cclxuICAgIH1cclxuICAgIGlmKHRlbXBEYXRhWzBdLnRlbXBsYXRlVGFicyl7XHJcbiAgICAgIHJlc3BvbmNlLnRhYiA9IHRlbXBEYXRhWzBdLnRlbXBsYXRlVGFic1t0YWJJbmRleF07XHJcbiAgICB9XHJcbiAgICBsZXQgdGFiID0gcmVzcG9uY2UudGFiXHJcbiAgICBpZiAodGFiICYmIHRhYi50YWJfbmFtZSAhPSBcIlwiICYmIHRhYi50YWJfbmFtZSAhPSBudWxsICYmIHRhYi50YWJfbmFtZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYoY3VycmVudE1lbnUgJiYgY3VycmVudE1lbnUubmFtZSAmJiBjdXJyZW50TWVudS5uYW1lICE9IHVuZGVmaW5lZCAmJiBjdXJyZW50TWVudS5uYW1lICE9IG51bGwpe1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSB7XCJuYW1lXCI6dGFiLnRhYl9uYW1lfTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLlNldEFjdGl2ZU1lbnUobWVudSk7XHJcbiAgICAgICAgcmVzcG9uY2UuY3VycmVudE1lbnUubmFtZSA9IHRhYi50YWJfbmFtZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYodGFiICAmJiB0YWIuZ3JpZCAhPSBudWxsICYmIHRhYi5ncmlkICE9IHVuZGVmaW5lZCApe1xyXG4gICAgICBpZih0YWIuZ3JpZC5ncmlkX3ZpZXcgIT0gbnVsbCAmJiB0YWIuZ3JpZC5ncmlkX3ZpZXcgIT0gdW5kZWZpbmVkICYmIHRhYi5ncmlkLmdyaWRfdmlldyAhPSAnJyl7XHJcbiAgICAgICAgcmVzcG9uY2UuZ3JpZF92aWV3X21vZGU9dGFiLmdyaWQuZ3JpZF92aWV3O1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICByZXNwb25jZS5ncmlkX3ZpZXdfbW9kZT0ndGFibGVWaWV3JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHRhYiAmJiBmb3JtTmFtZSAhPSAnJyl7XHJcbiAgICAgIGlmKGZvcm1OYW1lID09ICdESU5BTUlDX0ZPUk0nKXtcclxuICAgICAgICByZXNwb25jZS5mb3JtID0gZGluYW1pY19mb3JtXHJcbiAgICAgIH1lbHNlIGlmKHRhYi5mb3JtcyAhPSBudWxsICYmIHRhYi5mb3JtcyAhPSB1bmRlZmluZWQgKXtcclxuICAgICAgICByZXNwb25jZS5mb3JtcyA9IHRhYi5mb3JtcztcclxuICAgICAgICBsZXQgZ3JpZEFjdGlvbkJ1dHRvbnMgPSBbXTtcclxuICAgICAgICBpZih0YWIuZ3JpZCAmJiB0YWIuZ3JpZC5hY3Rpb25fYnV0dG9ucyl7XHJcbiAgICAgICAgICBncmlkQWN0aW9uQnV0dG9ucyA9IHRhYi5ncmlkLmFjdGlvbl9idXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNwb25jZS5mb3JtID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0Rm9ybShyZXNwb25jZS5mb3Jtcyxmb3JtTmFtZSxncmlkQWN0aW9uQnV0dG9ucylcclxuICAgICAgICBpZihmb3JtTmFtZSA9PSAnY2xvbmVfb2JqZWN0Jyl7XHJcbiAgICAgICAgICByZXNwb25jZS5mb3JtWydhcGlfcGFyYW1zJ10gPSBcIlFUTVA6Q0xPTkVfT0JKRUNUXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5zZXRGb3JtKCk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHJlc3BvbmNlLmZvcm0gPSB7fTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbmNlO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tGb3JtRGV0YWlscyhmb3JtOmFueSx0YWI6YW55LGN1cnJlbnRNZW51OmFueSl7XHJcbiAgICBsZXQgcmVzcG9uY2U6YW55PXtcclxuICAgICAgY3VycmVudE1lbnU6Y3VycmVudE1lbnUsXHJcbiAgICAgIGJ1bGt1cGRhdGVzOmZhbHNlLFxyXG4gICAgICBnZXRMb2NhdGlvbjpmYWxzZSxcclxuICAgICAgaGVhZGVyRmlsZWRzRGF0YTpbXSxcclxuICAgICAgdGFibGVGaWVsZHM6W10sXHJcbiAgICAgIGZvcm1GaWVsZEJ1dHRvbnM6W10sXHJcbiAgICAgIGdldFRhYmxlRmllbGQ6dHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYoZm9ybSl7XHJcbiAgICAgIGlmKGZvcm0uZGV0YWlscyl7XHJcbiAgICAgICAgaWYoZm9ybS5kZXRhaWxzLmNvbGxlY3Rpb25fbmFtZSAmJiBmb3JtLmRldGFpbHMuY29sbGVjdGlvbl9uYW1lICE9ICcnICYmIChyZXNwb25jZS5jdXJyZW50TWVudSAhPSB1bmRlZmluZWQgfHwgdGhpcy5lbnZTZXJ2aWNlLmdldFJlcXVlc3RUeXBlKCkgPT0gJ1BVQkxJQycpKXtcclxuICAgICAgICAgIGlmKHJlc3BvbmNlLmN1cnJlbnRNZW51ID09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgIHJlc3BvbmNlLmN1cnJlbnRNZW51ID0ge307XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNwb25jZS5jdXJyZW50TWVudVsnbmFtZSddID0gZm9ybS5kZXRhaWxzLmNvbGxlY3Rpb25fbmFtZTtcclxuICAgICAgICAgIGlmKHRhYiAmJiB0YWIudGFiX25hbWUgJiYgdGFiLnRhYl9uYW1lICE9ICcnKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UuY3VycmVudE1lbnVbJ3RhYl9uYW1lJ10gPSB0YWIudGFiX25hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGZvcm0uZGV0YWlscy5idWxrX3VwZGF0ZSl7XHJcbiAgICAgICAgICByZXNwb25jZS5idWxrdXBkYXRlcyA9IHRydWU7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICByZXNwb25jZS5idWxrdXBkYXRlcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZihmb3JtLmdldExvY2F0aW9uKXtcclxuICAgICAgICByZXNwb25jZS5nZXRMb2NhdGlvbiA9IGZvcm0uZ2V0TG9jYXRpb247XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHJlc3BvbmNlLmdldExvY2F0aW9uID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZm9ybS5oZWFkZXJGaWVsZHMpe1xyXG4gICAgICAgIHJlc3BvbmNlLmhlYWRlckZpbGVkc0RhdGEgPSBmb3JtLmhlYWRlckZpZWxkcztcclxuICAgICAgfVxyXG4gICAgICBpZihmb3JtWyd0YWJsZUZpZWxkcyddICYmIGZvcm1bJ3RhYmxlRmllbGRzJ10gIT0gdW5kZWZpbmVkICYmIGZvcm1bJ3RhYmxlRmllbGRzJ10gIT0gbnVsbCl7XHJcbiAgICAgICAgcmVzcG9uY2UudGFibGVGaWVsZHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZvcm1bJ3RhYmxlRmllbGRzJ10pKTtcclxuICAgICAgICByZXNwb25jZS5nZXRUYWJsZUZpZWxkID0gZmFsc2U7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHJlc3BvbmNlLnRhYmxlRmllbGRzID0gW107XHJcbiAgICAgIH1cclxuICAgICAgaWYoZm9ybS50YWJfbGlzdF9idXR0b25zICYmIGZvcm0udGFiX2xpc3RfYnV0dG9ucyAhPSB1bmRlZmluZWQgJiYgZm9ybS50YWJfbGlzdF9idXR0b25zLmxlbmd0aCA+IDApe1xyXG4gICAgICAgIHJlc3BvbmNlLmZvcm1GaWVsZEJ1dHRvbnMgPSBmb3JtLnRhYl9saXN0X2J1dHRvbnM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25jZTtcclxuXHJcbiAgfVxyXG4gIGNyZWF0ZUZvcm1Db250cm9sKGZvckNvbnRyb2w6YW55LCBmaWVsZDphbnksIG9iamVjdDphbnksIHR5cGU6c3RyaW5nKSB7XHJcbiAgICBsZXQgZGlzYWJsZWQgPSBmaWVsZC5pc19kaXNhYmxlZCA/IHRydWUgOiAoKGZpZWxkLmRpc2FibGVfaWYgIT0gdW5kZWZpbmVkICYmIGZpZWxkLmRpc2FibGVfaWYgIT0gJycpID8gdHJ1ZSA6IGZhbHNlKTtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlIFwibGlzdFwiOlxyXG4gICAgICAgIGZvckNvbnRyb2xbZmllbGQuZmllbGRfbmFtZV0gPSB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KG9iamVjdCwgdGhpcy52YWxpZGF0b3IoZmllbGQpKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcclxuICAgICAgICAgIGZvckNvbnRyb2xbZmllbGQuZmllbGRfbmFtZV0gPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IG9iamVjdCwgZGlzYWJsZWQ6IGRpc2FibGVkIH0sIHRoaXMudmFsaWRhdG9yKGZpZWxkKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwidGV4dFwiOlxyXG4gICAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBcImdzdF9udW1iZXJcIjpcclxuICAgICAgICAgICAgZm9yQ29udHJvbFtmaWVsZC5maWVsZF9uYW1lXSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogb2JqZWN0LCBkaXNhYmxlZDogZGlzYWJsZWQgfSx0aGlzLnZhbGlkYXRvcihmaWVsZCksdGhpcy5jdXN0b212YWxpZGF0aW9uU2VydmljZS5pc1ZhbGlkR1NUTnVtYmVyLmJpbmQodGhpcy5jdXN0b212YWxpZGF0aW9uU2VydmljZSkpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxyXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmFwaV9jYWxsX25hbWUpIHtcclxuICAgICAgICAgICAgICBjYXNlIFwiZ3N0X251bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgZm9yQ29udHJvbFtmaWVsZC5maWVsZF9uYW1lXSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogb2JqZWN0LCBkaXNhYmxlZDogZGlzYWJsZWQgfSx0aGlzLnZhbGlkYXRvcihmaWVsZCksdGhpcy5jdXN0b212YWxpZGF0aW9uU2VydmljZS5pc1ZhbGlkR1NUTnVtYmVyLmJpbmQodGhpcy5jdXN0b212YWxpZGF0aW9uU2VydmljZSkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgZm9yQ29udHJvbFtmaWVsZC5maWVsZF9uYW1lXSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogb2JqZWN0LCBkaXNhYmxlZDogZGlzYWJsZWQgfSwgdGhpcy52YWxpZGF0b3IoZmllbGQpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBmb3JDb250cm9sW2ZpZWxkLmZpZWxkX25hbWVdID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBvYmplY3QsIGRpc2FibGVkOiBkaXNhYmxlZCB9LHRoaXMudmFsaWRhdG9yKGZpZWxkKSx0aGlzLmN1c3RvbXZhbGlkYXRpb25TZXJ2aWNlLmlzVmFsaWRHU1ROdW1iZXIuYmluZCh0aGlzLmN1c3RvbXZhbGlkYXRpb25TZXJ2aWNlKSlcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJ0eXBlYWhlYWRcIjpcclxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5kYXRhdHlwZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XHJcbiAgICAgICAgICAgICAgICBmb3JDb250cm9sW2ZpZWxkLmZpZWxkX25hbWVdID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBvYmplY3QsIGRpc2FibGVkOiBkaXNhYmxlZCB9LHRoaXMudmFsaWRhdG9yKGZpZWxkKSx0aGlzLmN1c3RvbXZhbGlkYXRpb25TZXJ2aWNlLmlzVmFsaWREYXRhLmJpbmQodGhpcy5jdXN0b212YWxpZGF0aW9uU2VydmljZSkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgZm9yQ29udHJvbFtmaWVsZC5maWVsZF9uYW1lXSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogb2JqZWN0LCBkaXNhYmxlZDogZGlzYWJsZWQgfSwgdGhpcy52YWxpZGF0b3IoZmllbGQpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBmb3JDb250cm9sW2ZpZWxkLmZpZWxkX25hbWVdID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBvYmplY3QsIGRpc2FibGVkOiBkaXNhYmxlZCB9LCB0aGlzLnZhbGlkYXRvcihmaWVsZCkpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImdyb3VwXCI6XHJcbiAgICAgICAgZm9yQ29udHJvbFtmaWVsZC5maWVsZF9uYW1lXSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAob2JqZWN0KVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICB2YWxpZGF0b3IoZmllbGQ6YW55KSB7XHJcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBbXVxyXG4gICAgaWYgKGZpZWxkLmlzX21hbmRhdG9yeSAhPSB1bmRlZmluZWQgJiYgZmllbGQuaXNfbWFuZGF0b3J5KSB7XHJcbiAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJncmlkX3NlbGVjdGlvblwiOlxyXG4gICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgaWYgKGZpZWxkLmRhdGF0eXBlICE9ICdsaXN0X29mX29iamVjdCcgJiYgZmllbGQuZGF0YXR5cGUgIT0gJ2NoaXBzJykge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3IucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxyXG4gICAgICAgICAgdmFsaWRhdG9yLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZFRydWUpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiZW1haWxcIjpcclxuICAgICAgICAgIHZhbGlkYXRvci5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICAgICAgICB2YWxpZGF0b3IucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB2YWxpZGF0b3IucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1lbHNle1xyXG4gICAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpe1xyXG4gICAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgICAgdmFsaWRhdG9yLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChmaWVsZC5taW5fbGVuZ3RoICE9IHVuZGVmaW5lZCAmJiBmaWVsZC5taW5fbGVuZ3RoICE9IG51bGwgJiYgZmllbGQubWluX2xlbmd0aCAhPSAnJyAmJiBOdW1iZXIoZmllbGQubWluX2xlbmd0aCkgJiYgZmllbGQubWluX2xlbmd0aCA+IDApIHtcclxuICAgICAgdmFsaWRhdG9yLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoZmllbGQubWluX2xlbmd0aCkpXHJcbiAgICB9XHJcbiAgICBpZihmaWVsZC5tYXhfbGVuZ3RoICE9IHVuZGVmaW5lZCAmJiBmaWVsZC5tYXhfbGVuZ3RoICE9IG51bGwgJiYgZmllbGQubWF4X2xlbmd0aCAhPSAnJyAmJiBOdW1iZXIoZmllbGQubWF4X2xlbmd0aCkgJiYgZmllbGQubWF4X2xlbmd0aCA+IDApe1xyXG4gICAgICB2YWxpZGF0b3IucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aChmaWVsZC5tYXhfbGVuZ3RoKSlcclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZGF0b3I7XHJcbiAgfVxyXG4gIHNldE5ld0Zvcm0odGFibGVGaWVsZHM6YW55LGZvcm1GaWVsZEJ1dHRvbnM6YW55LGZvcm06YW55LGVsZW1lbnRzOmFueSxzZWxlY3RlZFJvd0luZGV4Om51bWJlcil7XHJcbiAgICBsZXQgcmVzcG9uY2U6YW55ID0ge1xyXG4gICAgICBjYWxjdWxhdGlvbkZpZWxkTGlzdDpbXSxcclxuICAgICAgc2hvd0lmRmllbGRMaXN0OltdLFxyXG4gICAgICBidXR0b25JZkxpc3Q6W10sXHJcbiAgICAgIGRpc2FibGVJZkZpZWxkTGlzdDpbXSxcclxuICAgICAgbWVuZGV0b3J5SWZGaWVsZExpc3QgOiBbXSxcclxuICAgICAgZ3JpZFNlbGVjdGlvbk1lbmRldG9yeUxpc3Q6W10sXHJcbiAgICAgIGN1c3RvbVZhbGlkYXRpb25GaWVscyA6IFtdLFxyXG4gICAgICBlZGl0b3JUeXBlRmllbGRMaXN0IDogW10sXHJcbiAgICAgIGNoZWNrQm94RmllbGRMaXN0VmFsdWU6W10sXHJcbiAgICAgIGZpbGVQcmV2aWV3RmllbGRzOltdLFxyXG4gICAgICBzdGF0aWNNb2RhbDpbXSxcclxuICAgICAgZm9yQ29udHJvbDp7fSxcclxuICAgICAgc2hvd0dyaWREYXRhOnt9LFxyXG4gICAgICBpc1N0ZXBwZXI6ZmFsc2UsXHJcbiAgICAgIGJsYW5rRmllbGQ6e2ZpZWxkTmFtZTonJyxpbmRleDotMX1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YWJsZUZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IHRhYmxlRmllbGRzW2luZGV4XTtcclxuICAgICAgaWYoZWxlbWVudCA9PSBudWxsKXtcclxuICAgICAgICByZXNwb25jZS5ibGFua0ZpZWxkLmZpZWxkTmFtZSA9IGZvcm0ubmFtZTtcclxuICAgICAgICByZXNwb25jZS5ibGFua0ZpZWxkLmluZGV4ID0gaW5kZXgrMTtcclxuICAgICAgICAvL3RoaXMubm90aWZ5RmllbGRWYWx1ZUlzTnVsbChmb3JtLm5hbWUsaW5kZXgrMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZWxlbWVudC50eXBlID09ICdwZGZfdmlldycpe1xyXG4gICAgICAgIGlmKHNlbGVjdGVkUm93SW5kZXggJiYgc2VsZWN0ZWRSb3dJbmRleCAhPSAtMSAmJiBlbGVtZW50cyAmJiBlbGVtZW50cy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIGNvbnN0IG9iamVjdCA9IGVsZW1lbnRzW3NlbGVjdGVkUm93SW5kZXhdO1xyXG4gICAgICAgICAgcmVzcG9uY2Uuc3RhdGljTW9kYWwucHVzaCh0aGlzLmFwaUNhbGxTZXJ2aWNlLmdldFBheWxvZFdpdGhDcml0ZXJpYShlbGVtZW50Lm9uY2hhbmdlX2FwaV9wYXJhbXMsZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQsZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLG9iamVjdCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNwb25jZS5lZGl0b3JUeXBlRmllbGRMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZWxlbWVudC50eXBlID09ICdpbmZvX2h0bWwnIHx8IGVsZW1lbnQudHlwZSA9PSAnaHRtbF92aWV3Jykge1xyXG4gICAgICAgIHJlc3BvbmNlLmVkaXRvclR5cGVGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgICByZXNwb25jZS5maWxlUHJldmlld0ZpZWxkcy5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGVsZW1lbnQuZmllbGRfbmFtZSAmJiBlbGVtZW50LmZpZWxkX25hbWUgIT0gJycpe1xyXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIFwibGlzdF9vZl9jaGVja2JveFwiOlxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsIFtdLCBcImxpc3RcIilcclxuICAgICAgICAgICAgcmVzcG9uY2UuY2hlY2tCb3hGaWVsZExpc3RWYWx1ZS5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsIGZhbHNlLCBcImNoZWNrYm94XCIpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImRhdGVcIjpcclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICBsZXQgdmFsdWU6YW55ID0gXCJcIjtcclxuICAgICAgICAgICAgaWYoZWxlbWVudC5kZWZhdWx0VmFsdWUgJiYgZWxlbWVudC5kZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBlbGVtZW50LmRlZmF1bHRWYWx1ZSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnNldERlZmF1bHREYXRlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKGVsZW1lbnQuZGF0YXR5cGUgPT0gJ29iamVjdCcpe1xyXG4gICAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudC5ldGNfZmllbGRzICYmIGVsZW1lbnQuZXRjX2ZpZWxkcyAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQuZXRjX2ZpZWxkcy5taW5EYXRlKXtcclxuICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudC5ldGNfZmllbGRzLm1pbkRhdGUgPT0gJy0xJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgLSAxMDAsIDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbkRhdGUuc2V0RGF0ZShuZXcgRGF0ZSgpLmdldERhdGUoKSAtIE51bWJlcihlbGVtZW50LmV0Y19maWVsZHMubWluRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudC5ldGNfZmllbGRzICYmIGVsZW1lbnQuZXRjX2ZpZWxkcyAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQuZXRjX2ZpZWxkcy5tYXhEYXRlKXtcclxuICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudC5ldGNfZmllbGRzLm1heERhdGUgPT0gJy0xJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhEYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgKyAyNSwgMTEsIDMxKTtcclxuICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhEYXRlLnNldERhdGUobmV3IERhdGUoKS5nZXREYXRlKCkgKyBOdW1iZXIoZWxlbWVudC5ldGNfZmllbGRzLm1heERhdGUpKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgLSAxMDAsIDAsIDEpO1xyXG4gICAgICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyICsgMjUsIDExLCAzMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxlbWVudFsnbWluRGF0ZSddID0gdGhpcy5taW5EYXRlXHJcbiAgICAgICAgICAgIGVsZW1lbnRbJ21heERhdGUnXSA9IHRoaXMubWF4RGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChyZXNwb25jZS5mb3JDb250cm9sLCBlbGVtZW50LCB2YWx1ZSwgXCJ0ZXh0XCIpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImRhdGVyYW5nZVwiOlxyXG4gICAgICAgICAgICBjb25zdCBkYXRlX3JhbmdlID0ge307XHJcbiAgICAgICAgICAgIGxldCBsaXN0X29mX2RhdGVzID0gW1xyXG4gICAgICAgICAgICAgIHtmaWVsZF9uYW1lIDogJ3N0YXJ0J30sXHJcbiAgICAgICAgICAgICAge2ZpZWxkX25hbWUgOiAnZW5kJ31cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICBpZiAobGlzdF9vZl9kYXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgbGlzdF9vZl9kYXRlcy5mb3JFYWNoKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKGRhdGVfcmFuZ2UsIGRhdGEsICcnLCBcInRleHRcIilcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsIGRhdGVfcmFuZ2UsIFwiZ3JvdXBcIilcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgICAgIGNhc2UgXCJncm91cF9vZl9maWVsZHNcIjpcclxuICAgICAgICAgICAgY29uc3QgbGlzdF9vZl9maWVsZHMgPSB7fTtcclxuICAgICAgICAgICAgaWYoZWxlbWVudCl7XHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubGlzdF9vZl9maWVsZHMgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVsZW1lbnQubGlzdF9vZl9maWVsZHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGVsZW1lbnQubGlzdF9vZl9maWVsZHNbal07XHJcbiAgICAgICAgICAgICAgICAgIGlmKGRhdGEgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2UuYmxhbmtGaWVsZC5maWVsZE5hbWUgPSBlbGVtZW50Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2UuYmxhbmtGaWVsZC5pbmRleCA9IGluZGV4KzErXCItPlwiK2orMTtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMubm90aWZ5RmllbGRWYWx1ZUlzTnVsbChlbGVtZW50Lm5hbWUsaisxKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZihlbGVtZW50LnR5cGUgPT0gJ2xpc3Rfb2ZfZmllbGRzJyAmJiBlbGVtZW50LmRhdGF0eXBlICE9ICdrZXlfdmFsdWUnKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhWydub3REaXNwbGF5J10gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBsZXQgbW9kaWZ5RGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICBtb2RpZnlEYXRhWydwYXJlbnQnXSA9IGVsZW1lbnQuZmllbGRfbmFtZTtcclxuICAgICAgICAgICAgICAgICAgLy9zaG93IGlmIGhhbmRsaW5nXHJcbiAgICAgICAgICAgICAgICAgIGlmKGRhdGEuc2hvd19pZiAmJiBkYXRhLnNob3dfaWYgIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGlmeURhdGFbJ3BhcmVudEluZGV4J10gPSBpbmRleDtcclxuICAgICAgICAgICAgICAgICAgICBtb2RpZnlEYXRhWydjdXJyZW50SW5kZXgnXSA9IGo7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2Uuc2hvd0lmRmllbGRMaXN0LnB1c2gobW9kaWZ5RGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgLy9NZW5kZXRvcnkgSWYgaGFuZGxpbmdcclxuICAgICAgICAgICAgICAgICAgaWYoZGF0YS5tYW5kYXRvcnlfaWYgJiYgZGF0YS5tYW5kYXRvcnlfaWYgIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLm1lbmRldG9yeUlmRmllbGRMaXN0LnB1c2gobW9kaWZ5RGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgLy9kaXNhYmxlIGlmIGhhbmRsaW5nXHJcbiAgICAgICAgICAgICAgICAgIGlmKChkYXRhLmRpc2FibGVfaWYgJiYgZGF0YS5kaXNhYmxlX2lmICE9ICcnKSB8fCAoZGF0YS5kaXNhYmxlX29uX3VwZGF0ZSAmJiBkYXRhLmRpc2FibGVfb25fdXBkYXRlICE9ICcnICYmIGRhdGEuZGlzYWJsZV9vbl91cGRhdGUgIT0gdW5kZWZpbmVkICYmIGRhdGEuZGlzYWJsZV9vbl91cGRhdGUgIT0gbnVsbCkgfHwgKGRhdGEuZGlzYWJsZV9vbl9hZGQgJiYgZGF0YS5kaXNhYmxlX29uX2FkZCAhPSAnJyAmJiBkYXRhLmRpc2FibGVfb25fYWRkICE9IHVuZGVmaW5lZCAmJiBkYXRhLmRpc2FibGVfb25fYWRkICE9IG51bGwpKXtcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5kaXNhYmxlSWZGaWVsZExpc3QucHVzaChtb2RpZnlEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZihlbGVtZW50LnR5cGUgPT0gJ2xpc3Rfb2ZfZmllbGRzJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZ5RGF0YS5pc19tYW5kYXRvcnk9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYoZGF0YS5maWVsZF9uYW1lICYmIGRhdGEuZmllbGRfbmFtZSAhPSAnJyAmJiBlbGVtZW50LmRhdGF0eXBlICE9IFwibGlzdF9vZl9vYmplY3Rfd2l0aF9wb3B1cFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGlvbiBvbkNoYW5nZSBoYW5kbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm9uY2hhbmdlX2Z1bmN0aW9uICYmIGVsZW1lbnQub25jaGFuZ2VfZnVuY3Rpb25fcGFyYW0gJiYgZWxlbWVudC5vbmNoYW5nZV9mdW5jdGlvbl9wYXJhbSAhPSBcIlwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmNhbGN1bGF0aW9uRmllbGRMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9jaGVja2JveFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKGxpc3Rfb2ZfZmllbGRzLCBtb2RpZnlEYXRhLCBbXSwgXCJsaXN0XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmNoZWNrQm94RmllbGRMaXN0VmFsdWUucHVzaChtb2RpZnlEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChsaXN0X29mX2ZpZWxkcywgbW9kaWZ5RGF0YSwgZmFsc2UsIFwiY2hlY2tib3hcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZGF0YXR5cGUgPT0gJ29iamVjdCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5ldGNfZmllbGRzICYmIGRhdGEuZXRjX2ZpZWxkcyAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZXRjX2ZpZWxkcy5taW5EYXRlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5ldGNfZmllbGRzLm1pbkRhdGUgPT0gJy0xJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgLSAxMDAsIDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbkRhdGUuc2V0RGF0ZShuZXcgRGF0ZSgpLmdldERhdGUoKSAtIE51bWJlcihkYXRhLmV0Y19maWVsZHMubWluRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5ldGNfZmllbGRzICYmIGRhdGEuZXRjX2ZpZWxkcyAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZXRjX2ZpZWxkcy5tYXhEYXRlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5ldGNfZmllbGRzLm1heERhdGUgPT0gJy0xJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhEYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgKyAyNSwgMTEsIDMxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhEYXRlLnNldERhdGUobmV3IERhdGUoKS5nZXREYXRlKCkgKyBOdW1iZXIoZGF0YS5ldGNfZmllbGRzLm1heERhdGUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgLSAxMDAsIDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyICsgMjUsIDExLCAzMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsnbWluRGF0ZSddID0gdGhpcy5taW5EYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ21heERhdGUnXSA9IHRoaXMubWF4RGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChsaXN0X29mX2ZpZWxkcywgbW9kaWZ5RGF0YSwgJycsIFwidGV4dFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2wobGlzdF9vZl9maWVsZHMsIG1vZGlmeURhdGEsICcnLCBcInRleHRcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGRhdGEuZmllbGRfY2xhc3MgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXREaXZDbGFzcyhkYXRhLCh0YWJsZUZpZWxkcy5sZW5ndGggKyBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsIGxpc3Rfb2ZfZmllbGRzLCBcImdyb3VwXCIpXHJcbiAgICAgICAgICAgIC8vIGlmKGVsZW1lbnQudHlwZSA9PSAnbGlzdF9vZl9maWVsZHMnKXtcclxuICAgICAgICAgICAgLy8gICB0aGlzLmxpc3Rfb2ZfZmllbGRzLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAvLyBjYXNlICdodG1sX3ZpZXcnOlxyXG4gICAgICAgICAgLy8gICBjb25zdCBmaWVsZCA9IHtcclxuICAgICAgICAgIC8vICAgICBmaWVsZF9uYW1lIDogJ2h0bWxfdmlld18xJ1xyXG4gICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAvLyAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2woZm9yQ29udHJvbCwgZWxlbWVudCwgJycsIFwidGV4dFwiKVxyXG4gICAgICAgICAgLy8gICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJzdGVwcGVyXCI6XHJcbiAgICAgICAgICAgIGlmKGVsZW1lbnQubGlzdF9vZl9maWVsZHMgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChzdGVwOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoc3RlcC5saXN0X29mX2ZpZWxkcyAhPSB1bmRlZmluZWQgJiYgc3RlcC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcHBlcl9vZl9maWVsZHMgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgc3RlcC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChkYXRhOmFueSkgPT57XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGlmeURhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICBtb2RpZnlEYXRhLnBhcmVudCA9IHN0ZXAuZmllbGRfbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAvL3Nob3cgaWYgaGFuZGxpbmdcclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLnNob3dfaWYgJiYgZGF0YS5zaG93X2lmICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLnNob3dJZkZpZWxkTGlzdC5wdXNoKG1vZGlmeURhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvL21lbmRldG9yeSBpZiBoYW5kbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGEubWFuZGF0b3J5X2lmICYmIGRhdGEubWFuZGF0b3J5X2lmICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLm1lbmRldG9yeUlmRmllbGRMaXN0LnB1c2gobW9kaWZ5RGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vZGlzYWJsZSBpZiBoYW5kbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKChkYXRhLmRpc2FibGVfaWYgJiYgZGF0YS5kaXNhYmxlX2lmICE9ICcnKSB8fCAoZGF0YS5kaXNhYmxlX29uX3VwZGF0ZSAmJiBkYXRhLmRpc2FibGVfb25fdXBkYXRlICE9ICcnICYmIGRhdGEuZGlzYWJsZV9vbl91cGRhdGUgIT0gdW5kZWZpbmVkICYmIGRhdGEuZGlzYWJsZV9vbl91cGRhdGUgIT0gbnVsbCkgfHwgKGRhdGEuZGlzYWJsZV9vbl9hZGQgJiYgZGF0YS5kaXNhYmxlX29uX2FkZCAhPSAnJyAmJiBkYXRhLmRpc2FibGVfb25fYWRkICE9IHVuZGVmaW5lZCAmJiBkYXRhLmRpc2FibGVfb25fYWRkICE9IG51bGwpKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmRpc2FibGVJZkZpZWxkTGlzdC5wdXNoKG1vZGlmeURhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGlvbiBvbkNoYW5nZSBoYW5kbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm9uY2hhbmdlX2Z1bmN0aW9uICYmIGVsZW1lbnQub25jaGFuZ2VfZnVuY3Rpb25fcGFyYW0gJiYgZWxlbWVudC5vbmNoYW5nZV9mdW5jdGlvbl9wYXJhbSAhPSBcIlwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmNhbGN1bGF0aW9uRmllbGRMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHN0ZXBwZXJfb2ZfZmllbGRzLCBtb2RpZnlEYXRhLCAnJywgXCJ0ZXh0XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS50cmVlX3ZpZXdfb2JqZWN0ICYmIGRhdGEudHJlZV92aWV3X29iamVjdC5maWVsZF9uYW1lICE9IFwiXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHRyZWVNb2RpZnlEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhLnRyZWVfdmlld19vYmplY3QpKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRyZWVNb2RpZnlEYXRhLmlzX21hbmRhdG9yeT1mYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2woc3RlcHBlcl9vZl9maWVsZHMsIHRyZWVNb2RpZnlEYXRhICwgJycsIFwidGV4dFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2wocmVzcG9uY2UuZm9yQ29udHJvbCwgc3RlcCwgc3RlcHBlcl9vZl9maWVsZHMsIFwiZ3JvdXBcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICByZXNwb25jZS5pc1N0ZXBwZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcInBkZl92aWV3XCIgOlxyXG4gICAgICAgICAgICBpZihzZWxlY3RlZFJvd0luZGV4ICYmIHNlbGVjdGVkUm93SW5kZXggIT0gLTEgJiYgZWxlbWVudHMgJiYgZWxlbWVudHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0gZWxlbWVudHNbc2VsZWN0ZWRSb3dJbmRleF07XHJcbiAgICAgICAgICAgICAgcmVzcG9uY2Uuc3RhdGljTW9kYWwucHVzaCh0aGlzLmFwaUNhbGxTZXJ2aWNlLmdldFBheWxvZFdpdGhDcml0ZXJpYShlbGVtZW50Lm9uY2hhbmdlX2FwaV9wYXJhbXMsZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQsZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLG9iamVjdCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImlucHV0X3dpdGhfdXBsb2FkZmlsZVwiOlxyXG4gICAgICAgICAgICBlbGVtZW50LmlzX2Rpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChyZXNwb25jZS5mb3JDb250cm9sLCBlbGVtZW50LCAnJywgXCJ0ZXh0XCIpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImdyaWRfc2VsZWN0aW9uXCI6XHJcbiAgICAgICAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudC5ncmlkQ29sdW1ucyAmJiBlbGVtZW50LmdyaWRDb2x1bW5zLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIGxldCBjb2xQYXJGaWVsZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpO1xyXG4gICAgICAgICAgICAgIGNvbFBhckZpZWxkWydtZW5kZXRvcnlfZmllbGRzJ10gPSBbXTtcclxuICAgICAgICAgICAgICBlbGVtZW50LmdyaWRDb2x1bW5zLmZvckVhY2goKGNvbEZpZWxkOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoY29sRmllbGQgJiYgY29sRmllbGQuaXNfbWFuZGF0b3J5KXtcclxuICAgICAgICAgICAgICAgICAgY29sUGFyRmllbGRbJ21lbmRldG9yeV9maWVsZHMnXS5wdXNoKGNvbEZpZWxkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBpZihjb2xQYXJGaWVsZCAmJiBjb2xQYXJGaWVsZFsnbWVuZGV0b3J5X2ZpZWxkcyddICYmIGNvbFBhckZpZWxkWydtZW5kZXRvcnlfZmllbGRzJ10ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICByZXNwb25jZS5ncmlkU2VsZWN0aW9uTWVuZGV0b3J5TGlzdC5wdXNoKGNvbFBhckZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ21lbmRldG9yeV9maWVsZHMnXSA9IGNvbFBhckZpZWxkWydtZW5kZXRvcnlfZmllbGRzJ107XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJlc3BvbmNlLnNob3dHcmlkRGF0YVtlbGVtZW50LmZpZWxkX25hbWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQuYWRkTmV3QnV0dG9uSWYgJiYgZWxlbWVudC5hZGROZXdCdXR0b25JZiAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgZWxlbWVudFsnZmllbGRJbmRleCddID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgcmVzcG9uY2UuYnV0dG9uSWZMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxlbWVudFsnc2hvd0J1dHRvbiddID0gdGhpcy5jaGVja0dyaWRTZWxlY3Rpb25CdXR0b25Db25kaXRpb24oZWxlbWVudCwnYWRkJyx7fSx7fSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2wocmVzcG9uY2UuZm9yQ29udHJvbCwgZWxlbWVudCwgJycsIFwidGV4dFwiKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwidHJlZV92aWV3XCI6XHJcbiAgICAgICAgICAgIC8vIHRoaXMudHJlZUNvbnRyb2xbZWxlbWVudC5maWVsZF9uYW1lXSA9IG5ldyBGbGF0VHJlZUNvbnRyb2w8VG9kb0l0ZW1GbGF0Tm9kZT4odGhpcy5nZXRMZXZlbCwgdGhpcy5pc0V4cGFuZGFibGUpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmRhdGFTb3VyY2VbZWxlbWVudC5maWVsZF9uYW1lXSA9IG5ldyBNYXRUcmVlRmxhdERhdGFTb3VyY2UodGhpcy50cmVlQ29udHJvbFtlbGVtZW50LmZpZWxkX25hbWVdLCB0aGlzLnRyZWVGbGF0dGVuZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsICcnLCBcInRleHRcIik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgaWYoZWxlbWVudC5kZWZhdWx0VmFsdWUgJiYgZWxlbWVudC5kZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBlbGVtZW50LmRlZmF1bHRWYWx1ZSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsIHZhbHVlLCBcInRleHRcIik7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2wocmVzcG9uY2UuZm9yQ29udHJvbCwgZWxlbWVudCwgJycsIFwidGV4dFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZWxlbWVudC50cmVlX3ZpZXdfb2JqZWN0ICYmIGVsZW1lbnQudHJlZV92aWV3X29iamVjdC5maWVsZF9uYW1lICE9IFwiXCIpe1xyXG4gICAgICAgICAgbGV0IHRyZWVNb2RpZnlEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbGVtZW50LnRyZWVfdmlld19vYmplY3QpKTtcclxuICAgICAgICAgIHRyZWVNb2RpZnlEYXRhLmlzX21hbmRhdG9yeT1mYWxzZTtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2wocmVzcG9uY2UuZm9yQ29udHJvbCwgdHJlZU1vZGlmeURhdGEgLCAnJywgXCJ0ZXh0XCIpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vc2hvdyBpZiBoYW5kbGluZ1xyXG4gICAgICBpZihlbGVtZW50LnNob3dfaWYgJiYgZWxlbWVudC5zaG93X2lmICE9ICcnKXtcclxuICAgICAgICByZXNwb25jZS5zaG93SWZGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICAvL21lbmRhdG9yeSBpZiBoYW5kbGluZ1xyXG4gICAgICBpZihlbGVtZW50Lm1hbmRhdG9yeV9pZiAmJiBlbGVtZW50Lm1hbmRhdG9yeV9pZiAhPSAnJyl7XHJcbiAgICAgICAgcmVzcG9uY2UubWVuZGV0b3J5SWZGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICAvL0N1c3RvbXZhbGlkYXRpb24gaGFuZGxpbmdcclxuICAgICAgaWYoZWxlbWVudC5jb21wYXJlRmllbGROYW1lICYmIGVsZW1lbnQuY29tcGFyZUZpZWxkTmFtZSAhPSAnJyl7XHJcbiAgICAgICAgcmVzcG9uY2UuY3VzdG9tVmFsaWRhdGlvbkZpZWxzLnB1c2goZWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgICAgLy9kaXNhYmxlIGlmIGhhbmRsaW5nXHJcbiAgICAgIGlmKChlbGVtZW50LmRpc2FibGVfaWYgJiYgZWxlbWVudC5kaXNhYmxlX2lmICE9ICcnKSB8fCAoZWxlbWVudC5kaXNhYmxlX29uX3VwZGF0ZSAmJiBlbGVtZW50LmRpc2FibGVfb25fdXBkYXRlICE9ICcnICYmIGVsZW1lbnQuZGlzYWJsZV9vbl91cGRhdGUgIT0gdW5kZWZpbmVkICYmIGVsZW1lbnQuZGlzYWJsZV9vbl91cGRhdGUgIT0gbnVsbCkgfHwgKGVsZW1lbnQuZGlzYWJsZV9vbl9hZGQgJiYgZWxlbWVudC5kaXNhYmxlX29uX2FkZCAhPSAnJyAmJiBlbGVtZW50LmRpc2FibGVfb25fYWRkICE9IHVuZGVmaW5lZCAmJiBlbGVtZW50LmRpc2FibGVfb25fYWRkICE9IG51bGwpKXtcclxuICAgICAgICByZXNwb25jZS5kaXNhYmxlSWZGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBDYWxjdWxhdGlvbiBvbkNoYW5nZSBoYW5kbGluZ1xyXG4gICAgICBpZiAoZWxlbWVudC5vbmNoYW5nZV9mdW5jdGlvbiAmJiBlbGVtZW50Lm9uY2hhbmdlX2Z1bmN0aW9uX3BhcmFtICYmIGVsZW1lbnQub25jaGFuZ2VfZnVuY3Rpb25fcGFyYW0gIT0gXCJcIil7XHJcbiAgICAgICAgcmVzcG9uY2UuY2FsY3VsYXRpb25GaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICBlbGVtZW50LmZpZWxkX2NsYXNzID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0RGl2Q2xhc3MoZWxlbWVudCx0YWJsZUZpZWxkcy5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgaWYoZm9ybUZpZWxkQnV0dG9ucyAmJiBmb3JtRmllbGRCdXR0b25zLmxlbmd0aCA+IDApe1xyXG4gICAgICBmb3JtRmllbGRCdXR0b25zLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYoZWxlbWVudC5maWVsZF9uYW1lICYmIGVsZW1lbnQuZmllbGRfbmFtZSAhPSAnJyl7XHJcbiAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiZHJvcGRvd25cIjpcclxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsICcnLCBcInRleHRcIilcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZWxlbWVudC5zaG93X2lmICYmIGVsZW1lbnQuc2hvd19pZiAhPSAnJyl7XHJcbiAgICAgICAgICByZXNwb25jZS5zaG93SWZGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZWxlbWVudC5tYW5kYXRvcnlfaWYgJiYgZWxlbWVudC5tYW5kYXRvcnlfaWYgIT0gJycpe1xyXG4gICAgICAgICAgcmVzcG9uY2UubWVuZGV0b3J5SWZGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoKGVsZW1lbnQuZGlzYWJsZV9pZiAmJiBlbGVtZW50LmRpc2FibGVfaWYgIT0gJycpIHx8IChlbGVtZW50LmRpc2FibGVfb25fdXBkYXRlICYmIGVsZW1lbnQuZGlzYWJsZV9vbl91cGRhdGUgIT0gJycgJiYgZWxlbWVudC5kaXNhYmxlX29uX3VwZGF0ZSAhPSB1bmRlZmluZWQgJiYgZWxlbWVudC5kaXNhYmxlX29uX3VwZGF0ZSAhPSBudWxsKSB8fCAoZWxlbWVudC5kaXNhYmxlX29uX2FkZCAmJiBlbGVtZW50LmRpc2FibGVfb25fYWRkICE9ICcnICYmIGVsZW1lbnQuZGlzYWJsZV9vbl9hZGQgIT0gdW5kZWZpbmVkICYmIGVsZW1lbnQuZGlzYWJsZV9vbl9hZGQgIT0gbnVsbCkpe1xyXG4gICAgICAgICAgcmVzcG9uY2UuZGlzYWJsZUlmRmllbGRMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25jZTtcclxuICB9XHJcbiAgY2hlY2tGaWVsZEJ1dHRvbkNvbmRpdGlvbih0YWJsZUZpZWxkczphbnkpe1xyXG4gICAgbGV0IHJlc3BvbmNlOmFueT17XHJcbiAgICAgIHRlbXBWYWw6e31cclxuICAgIH1cclxuICAgIHRhYmxlRmllbGRzLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXR5cGUgPT0gJ2xpc3Rfb2Zfb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXNwb25jZS50ZW1wVmFsW2VsZW1lbnQuZmllbGRfbmFtZSArIFwiX2FkZF9idXR0b25cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImxpc3Rfb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgICByZXNwb25jZS50ZW1wVmFsW2VsZW1lbnQuZmllbGRfbmFtZSArIFwiX2FkZF9idXR0b25cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImxpc3Rfb2ZfZmllbGRzXCI6XHJcbiAgICAgICAgY2FzZSBcImdyb3VwX29mX2ZpZWxkc1wiOlxyXG4gICAgICAgICAgaWYoZWxlbWVudC5saXN0X29mX2ZpZWxkcyAhPSB1bmRlZmluZWQgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcyAhPSBudWxsICYmIGVsZW1lbnQubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGVsZW1lbnQubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoY2hpbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYoY2hpbGQgJiYgY2hpbGQgIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kYXRhdHlwZSA9PSAnbGlzdF9vZl9vYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZS50ZW1wVmFsW2VsZW1lbnQuZmllbGRfbmFtZSArICdfJyArIGNoaWxkLmZpZWxkX25hbWUgKyBcIl9hZGRfYnV0dG9uXCJdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLnRlbXBWYWxbZWxlbWVudC5maWVsZF9uYW1lICsgJ18nICsgY2hpbGQuZmllbGRfbmFtZSArIFwiX2FkZF9idXR0b25cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwic3RlcHBlclwiOlxyXG4gICAgICAgICAgaWYoZWxlbWVudC5saXN0X29mX2ZpZWxkcyAhPSB1bmRlZmluZWQgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcyAhPSBudWxsICYmIGVsZW1lbnQubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGVsZW1lbnQubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoc3RlcDphbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZihzdGVwLmxpc3Rfb2ZfZmllbGRzICE9IHVuZGVmaW5lZCAmJiBzdGVwLmxpc3Rfb2ZfZmllbGRzICE9IG51bGwgJiYgc3RlcC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIHN0ZXAubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoY2hpbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0eXBlYWhlYWRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kYXRhdHlwZSA9PSAnbGlzdF9vZl9vYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLnRlbXBWYWxbc3RlcC5maWVsZF9uYW1lICsgJ18nICsgY2hpbGQuZmllbGRfbmFtZSArIFwiX2FkZF9idXR0b25cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rfb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZS50ZW1wVmFsW3N0ZXAuZmllbGRfbmFtZSArICdfJyArIGNoaWxkLmZpZWxkX25hbWUgKyBcIl9hZGRfYnV0dG9uXCJdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzcG9uY2U7XHJcbiAgfVxyXG4gIHVwZGF0ZVNlbGVjdENvbnRhY3Qoc2VsZWN0Q29udGFjdDphbnksdGFiRmlsdGVyRGF0YTphbnksdGFibGVGaWVsZHM6YW55LHRlbXBsYXRlRm9ybTpVbnR5cGVkRm9ybUdyb3VwLGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhOmFueSxzdGF0aWNNb2RhbDphbnkpe1xyXG4gICAgbGV0IGFjY291bnQ9e307XHJcbiAgICBsZXQgY29udGFjdD17fTtcclxuICAgIGxldCBwYXlsb2FkOmFueSA9IHt9O1xyXG4gICAgbGV0IHNlbGVjdENvbnRhY3RPYmplY3Q6YW55ID0ge307XHJcbiAgICBpZihzZWxlY3RDb250YWN0KXtcclxuICAgICAgc2VsZWN0Q29udGFjdE9iamVjdCA9IHNlbGVjdENvbnRhY3Q7XHJcbiAgICB9XHJcbiAgICBpZih0YWJGaWx0ZXJEYXRhICYmIHRhYkZpbHRlckRhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgIHRhYkZpbHRlckRhdGEuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQuX2lkKXtcclxuICAgICAgICAgIGlmKGVsZW1lbnQuX2lkID09IHNlbGVjdENvbnRhY3Qpe1xyXG4gICAgICAgICAgICBzZWxlY3RDb250YWN0T2JqZWN0ID0gZWxlbWVudDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYoc2VsZWN0Q29udGFjdE9iamVjdCl7XHJcbiAgICAgIGlmKHNlbGVjdENvbnRhY3RPYmplY3RbJ19pZCddKXtcclxuICAgICAgICBjb250YWN0ID0ge1xyXG4gICAgICAgICAgXCJfaWRcIjpzZWxlY3RDb250YWN0T2JqZWN0WydfaWQnXSxcclxuICAgICAgICAgIFwibmFtZVwiOnNlbGVjdENvbnRhY3RPYmplY3RbJ25hbWUnXSxcclxuICAgICAgICAgIFwiY29kZVwiOnNlbGVjdENvbnRhY3RPYmplY3RbJ3NlcmlhbElkJ11cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoc2VsZWN0Q29udGFjdE9iamVjdFsnbGVhZCddKXtcclxuICAgICAgICBhY2NvdW50ID0gc2VsZWN0Q29udGFjdE9iamVjdFsnbGVhZCddO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZih0YWJsZUZpZWxkcyAmJiB0YWJsZUZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgdGFibGVGaWVsZHMuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQuZmllbGRfbmFtZSAmJiBlbGVtZW50LmZpZWxkX25hbWUgIT0gJycpe1xyXG4gICAgICAgICAgbGV0IGZpZWxkTmFtZSA9IGVsZW1lbnQuZmllbGRfbmFtZTtcclxuICAgICAgICAgIGlmKGZpZWxkTmFtZSA9PSAnYWNjb3VudCcpe1xyXG4gICAgICAgICAgICBpZihhY2NvdW50ICYmIE9iamVjdC5rZXlzKGFjY291bnQpLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIHRlbXBsYXRlRm9ybS5jb250cm9sc1snYWNjb3VudCddLnNldFZhbHVlKGFjY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm9uY2hhbmdlX2FwaV9wYXJhbXMgJiYgZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQgJiYgIWVsZW1lbnQuZG9fbm90X2F1dG9fdHJpZ2dlcl9vbl9lZGl0KSB7XHJcbiAgICAgICAgICAgICAgcGF5bG9hZCA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtcywgZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQsIGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtc19jcml0ZXJpYSwgZm9ybVZhbHVlV2l0aEN1c3RvbURhdGEpXHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLmluZGV4T2YoXCJGT1JNX0dST1VQXCIpID49IDAgfHwgZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLmluZGV4T2YoXCJRVE1QXCIpID49IDApe1xyXG4gICAgICAgICAgICAgICAgcGF5bG9hZFtcImRhdGFcIl09Zm9ybVZhbHVlV2l0aEN1c3RvbURhdGE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHN0YXRpY01vZGFsLnB1c2gocGF5bG9hZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGVsZW1lbnQuZmllbGRfbmFtZSA9PSAnY29udGFjdCcpe1xyXG4gICAgICAgICAgICBpZihjb250YWN0ICYmIE9iamVjdC5rZXlzKGNvbnRhY3QpLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIHRlbXBsYXRlRm9ybS5jb250cm9sc1snY29udGFjdCddLnNldFZhbHVlKGNvbnRhY3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm9uY2hhbmdlX2FwaV9wYXJhbXMgJiYgZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQgJiYgIWVsZW1lbnQuZG9fbm90X2F1dG9fdHJpZ2dlcl9vbl9lZGl0KSB7XHJcbiAgICAgICAgICAgICAgcGF5bG9hZCA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtcywgZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQsIGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtc19jcml0ZXJpYSwgZm9ybVZhbHVlV2l0aEN1c3RvbURhdGEpXHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLmluZGV4T2YoXCJGT1JNX0dST1VQXCIpID49IDAgfHwgZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLmluZGV4T2YoXCJRVE1QXCIpID49IDApe1xyXG4gICAgICAgICAgICAgICAgcGF5bG9hZFtcImRhdGFcIl09Zm9ybVZhbHVlV2l0aEN1c3RvbURhdGE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHN0YXRpY01vZGFsLnB1c2gocGF5bG9hZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGVsZW1lbnQudHlwZSA9PSAnc3RlcHBlcicgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcyAmJiBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKHN0ZXBEYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmKHN0ZXBEYXRhICYmIHN0ZXBEYXRhLmxpc3Rfb2ZfZmllbGRzICYmIHN0ZXBEYXRhLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgc3RlcERhdGEubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkTmFtZSA9IHN0ZXBEYXRhLmZpZWxkX25hbWU7XHJcbiAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZmllbGRfbmFtZSA9PSAnYWNjb3VudCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbJ2FjY291bnQnXS5zZXRWYWx1ZShhY2NvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMudGVtcGxhdGVGb3JtLmdldChzdGVwRGF0YS5maWVsZF9uYW1lKS5nZXQoJ2FjY291bnQnKS5zZXRWYWx1ZShhY2NvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zICYmIGRhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkICYmICFkYXRhLmRvX25vdF9hdXRvX3RyaWdnZXJfb25fZWRpdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGRhdGEub25jaGFuZ2VfYXBpX3BhcmFtcywgZGF0YS5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQsIGRhdGEub25jaGFuZ2VfYXBpX3BhcmFtc19jcml0ZXJpYSwgZm9ybVZhbHVlV2l0aEN1c3RvbURhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXMuaW5kZXhPZihcIkZPUk1fR1JPVVBcIikgPj0gMCB8fCBkYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXMuaW5kZXhPZihcIlFUTVBcIikgPj0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRbXCJkYXRhXCJdPWZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljTW9kYWwucHVzaChwYXlsb2FkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYoZGF0YS5maWVsZF9uYW1lID09ICdjb250YWN0Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1snY29udGFjdCddLnNldFZhbHVlKGNvbnRhY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXMgJiYgZGF0YS5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQgJiYgIWRhdGEuZG9fbm90X2F1dG9fdHJpZ2dlcl9vbl9lZGl0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gdGhpcy5hcGlDYWxsU2VydmljZS5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoZGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zLCBkYXRhLm9uY2hhbmdlX2NhbGxfYmFja19maWVsZCwgZGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLCBmb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEub25jaGFuZ2VfYXBpX3BhcmFtcy5pbmRleE9mKFwiRk9STV9HUk9VUFwiKSA+PSAwIHx8IGRhdGEub25jaGFuZ2VfYXBpX3BhcmFtcy5pbmRleE9mKFwiUVRNUFwiKSA+PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFtcImRhdGFcIl09Zm9ybVZhbHVlV2l0aEN1c3RvbURhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNNb2RhbC5wdXNoKHBheWxvYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0YXRpY01vZGFsO1xyXG4gIH1cclxuICBjaGVja0dyaWRTZWxlY3Rpb25CdXR0b25Db25kaXRpb24oZmllbGQ6YW55LGJ1dHRvbjphbnksc2VsZWN0ZWRSb3c6YW55LGZvcm1WYWx1ZTphbnkpe1xyXG4gICAgbGV0IGNoZWNrOmFueSA9IHRydWU7XHJcbiAgICBzd2l0Y2ggKGJ1dHRvbikge1xyXG4gICAgICBjYXNlICdhZGQnOlxyXG4gICAgICAgIGlmKGZpZWxkICYmIGZpZWxkLmFkZE5ld0J1dHRvbklmICYmIGZpZWxkLmFkZE5ld0J1dHRvbklmICE9ICcnKXtcclxuICAgICAgICAgIGxldCBtb2RpZnllZEZpZWxkOmFueSA9IHt9O1xyXG4gICAgICAgICAgbW9kaWZ5ZWRGaWVsZFsnc2hvd19pZiddID0gZmllbGQuYWRkTmV3QnV0dG9uSWY7XHJcbiAgICAgICAgICBjaGVjayA9IHRoaXMuY2hlY2tpZlNlcnZpY2UuY2hlY2tTaG93SWYobW9kaWZ5ZWRGaWVsZCxzZWxlY3RlZFJvdyxmb3JtVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBjaGVjaztcclxuICB9XHJcblxyXG4gIHNldERlZmF1bHREYXRlKGVsZW1lbnQ6YW55KXtcclxuICAgIGxldCB2YWx1ZTphbnkgPSBcIlwiO1xyXG4gICAgbGV0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIHRvZGF5LnNldEhvdXJzKDAsMCwwLDApO1xyXG4gICAgbGV0IHllc3RlcmRheSA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIHllc3RlcmRheS5zZXREYXRlKHllc3RlcmRheS5nZXREYXRlKCkgLSAxKTtcclxuICAgIHllc3RlcmRheS5zZXRIb3VycygwLDAsMCwwKTtcclxuICAgIHN3aXRjaCAoZWxlbWVudC5kZWZhdWx0VmFsdWUpIHtcclxuICAgICAgY2FzZSBcIlRvZGF5XCI6XHJcbiAgICAgICAgdmFsdWUgPSB0b2RheTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIlllc3RlcmRheVwiOlxyXG4gICAgICAgIHZhbHVlID0geWVzdGVyZGF5O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuICBnZXRGb2N1c0ZpZWxkKHByZXZpb3VzRm9ybUZvY3VzRmllbGQ6YW55LHRhYmxlRmllbGRzOmFueSx0ZW1wbGF0ZUZvcm06VW50eXBlZEZvcm1Hcm91cCxmb2N1c0ZpZWxkUGFyZW50OmFueSxjaGVja0Zvcm1GaWVsZEF1dGZvY3VzOmFueSl7XHJcbiAgICBsZXQgcmVzcG9uY2U6YW55PXtcclxuICAgICAgY2hlY2tGb3JtRmllbGRBdXRmb2N1czpjaGVja0Zvcm1GaWVsZEF1dGZvY3VzLFxyXG4gICAgICBwcmV2aW91c0Zvcm1Gb2N1c0ZpZWxkOnByZXZpb3VzRm9ybUZvY3VzRmllbGQsXHJcbiAgICAgIGZvY3VzRmllbGRQYXJlbnQ6Zm9jdXNGaWVsZFBhcmVudCxcclxuICAgICAgaWQ6XCJcIlxyXG4gICAgfVxyXG4gICAgaWYocHJldmlvdXNGb3JtRm9jdXNGaWVsZCAmJiBwcmV2aW91c0Zvcm1Gb2N1c0ZpZWxkLl9pZCl7XHJcbiAgICAgIHJlc3BvbmNlID0gdGhpcy5mb2N1c0ZpZWxkKFwiXCIscHJldmlvdXNGb3JtRm9jdXNGaWVsZCx0ZW1wbGF0ZUZvcm0sZm9jdXNGaWVsZFBhcmVudCxjaGVja0Zvcm1GaWVsZEF1dGZvY3VzLHByZXZpb3VzRm9ybUZvY3VzRmllbGQscmVzcG9uY2UpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgaWYocHJldmlvdXNGb3JtRm9jdXNGaWVsZCA9PSB1bmRlZmluZWQgfHwgcHJldmlvdXNGb3JtRm9jdXNGaWVsZC5faWQgPT0gdW5kZWZpbmVkKXtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0YWJsZUZpZWxkcykge1xyXG4gICAgICAgICAgaWYoa2V5LnR5cGUgPT0gXCJzdGVwcGVyXCIpe1xyXG4gICAgICAgICAgICBpZihrZXkubGlzdF9vZl9maWVsZHMgJiYga2V5Lmxpc3Rfb2ZfZmllbGRzICE9IG51bGwgJiYga2V5Lmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBrZXkubGlzdF9vZl9maWVsZHMpIHtcclxuICAgICAgICAgICAgICAgIGlmKHN0ZXAubGlzdF9vZl9maWVsZHMgJiYgc3RlcC5saXN0X29mX2ZpZWxkcyAhPSBudWxsICYmIHN0ZXAubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc3RlcC5saXN0X29mX2ZpZWxkcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5maWVsZF9uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZSA9IHRoaXMuZm9jdXNGaWVsZChzdGVwLGZpZWxkLHRlbXBsYXRlRm9ybSxmb2N1c0ZpZWxkUGFyZW50LGNoZWNrRm9ybUZpZWxkQXV0Zm9jdXMscHJldmlvdXNGb3JtRm9jdXNGaWVsZCxyZXNwb25jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNlIGlmIChrZXkuZmllbGRfbmFtZSkge1xyXG4gICAgICAgICAgICBpZihrZXkudHlwZSA9PSAndGV4dCcpe1xyXG4gICAgICAgICAgICAgIHJlc3BvbmNlID0gdGhpcy5mb2N1c0ZpZWxkKFwiXCIsa2V5LHRlbXBsYXRlRm9ybSxmb2N1c0ZpZWxkUGFyZW50LGNoZWNrRm9ybUZpZWxkQXV0Zm9jdXMscHJldmlvdXNGb3JtRm9jdXNGaWVsZCxyZXNwb25jZSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHJlc3BvbmNlLmNoZWNrRm9ybUZpZWxkQXV0Zm9jdXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbmNlO1xyXG4gIH1cclxuICBmb2N1c0ZpZWxkKHBhcmVudDphbnksa2V5OmFueSx0ZW1wbGF0ZUZvcm06VW50eXBlZEZvcm1Hcm91cCxmb2N1c0ZpZWxkUGFyZW50OmFueSxjaGVja0Zvcm1GaWVsZEF1dGZvY3VzOmFueSxwcmV2aW91c0Zvcm1Gb2N1c0ZpZWxkOmFueSxyZXNwb25jZTphbnkpe1xyXG4gICAgcmVzcG9uY2UuaWQgPSBrZXkuX2lkICsgXCJfXCIgKyBrZXkuZmllbGRfbmFtZTtcclxuICAgIGxldCBmaWVsZDphbnkgPSB7fTtcclxuICAgIGlmKHBhcmVudCA9PSAnJyl7XHJcbiAgICAgIGlmKGZvY3VzRmllbGRQYXJlbnQgJiYgZm9jdXNGaWVsZFBhcmVudC5maWVsZF9uYW1lICYmIGZvY3VzRmllbGRQYXJlbnQuZmllbGRfbmFtZSAhPSAnJyl7XHJcbiAgICAgICAgcGFyZW50ID0gZm9jdXNGaWVsZFBhcmVudDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYocGFyZW50ICE9IFwiXCIpe1xyXG4gICAgICBmaWVsZCA9ICg8VW50eXBlZEZvcm1Hcm91cD50ZW1wbGF0ZUZvcm0uY29udHJvbHNbcGFyZW50LmZpZWxkX25hbWVdKS5jb250cm9sc1trZXkuZmllbGRfbmFtZV07XHJcbiAgICB9ZWxzZXtcclxuICAgICAgZmllbGQgPSB0ZW1wbGF0ZUZvcm0uY29udHJvbHNba2V5LmZpZWxkX25hbWVdO1xyXG4gICAgfVxyXG4gICAgaWYoZmllbGQgJiYgZmllbGQudG91Y2hlZCl7XHJcbiAgICAgIHJlc3BvbmNlLmNoZWNrRm9ybUZpZWxkQXV0Zm9jdXMgPSBmYWxzZTtcclxuICAgICAgaWYocHJldmlvdXNGb3JtRm9jdXNGaWVsZCAmJiBwcmV2aW91c0Zvcm1Gb2N1c0ZpZWxkLl9pZCl7XHJcbiAgICAgICAgcmVzcG9uY2UucHJldmlvdXNGb3JtRm9jdXNGaWVsZCA9IHt9O1xyXG4gICAgICAgIHJlc3BvbmNlLmZvY3VzRmllbGRQYXJlbnQ9e307XHJcbiAgICAgIH1cclxuICAgIH1lbHNlIGlmKGZpZWxkID09IHVuZGVmaW5lZCl7XHJcbiAgICAgIHJlc3BvbmNlLnByZXZpb3VzRm9ybUZvY3VzRmllbGQgPSB7fTtcclxuICAgICAgcmVzcG9uY2UuZm9jdXNGaWVsZFBhcmVudD17fTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25jZTtcclxuICB9XHJcbiAgZ2V0RG9ub3RSZXNldEZpZWxkcyh0YWJsZUZpZWxkczphbnksZG9ub3RSZXNldEZpZWxkTGlzdHM6YW55LEZvcm1WYWx1ZTphbnkpe1xyXG4gICAgdGFibGVGaWVsZHMuZm9yRWFjaCgodGFibGVmaWVsZDphbnkpID0+IHtcclxuICAgICAgaWYodGFibGVmaWVsZC5kb19ub3RfcmVmcmVzaF9vbl9hZGQgJiYgdGFibGVmaWVsZC50eXBlICE9IFwibGlzdF9vZl9maWVsZHNcIiAmJiB0YWJsZWZpZWxkLnR5cGUgIT0gXCJncm91cF9vZl9maWVsZHNcIiAmJiB0YWJsZWZpZWxkLnR5cGUgIT0gXCJzdGVwcGVyXCIpe1xyXG4gICAgICAgIGRvbm90UmVzZXRGaWVsZExpc3RzW3RhYmxlZmllbGQuZmllbGRfbmFtZV0gPSBGb3JtVmFsdWVbdGFibGVmaWVsZC5maWVsZF9uYW1lXTtcclxuICAgICAgfWVsc2UgaWYodGFibGVmaWVsZC50eXBlID09IFwiZ3JvdXBfb2ZfZmllbGRzXCIpe1xyXG4gICAgICAgIGlmKHRhYmxlZmllbGQubGlzdF9vZl9maWVsZHMgJiYgdGFibGVmaWVsZC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIHRhYmxlZmllbGQubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoZmllbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGZpZWxkLmRvX25vdF9yZWZyZXNoX29uX2FkZCl7XHJcbiAgICAgICAgICAgICAgZG9ub3RSZXNldEZpZWxkTGlzdHNbdGFibGVmaWVsZC5maWVsZF9uYW1lXVtmaWVsZC5maWVsZF9uYW1lXSA9IEZvcm1WYWx1ZVt0YWJsZWZpZWxkLmZpZWxkX25hbWVdW2ZpZWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1lbHNlIGlmKHRhYmxlZmllbGQudHlwZSA9PSBcInN0ZXBwZXJcIil7XHJcbiAgICAgICAgaWYodGFibGVmaWVsZC5saXN0X29mX2ZpZWxkcyAmJiB0YWJsZWZpZWxkLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgdGFibGVmaWVsZC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChzdGVwOmFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZihzdGVwLmxpc3Rfb2ZfZmllbGRzICYmIHN0ZXAubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgc3RlcC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChmaWVsZDphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGZpZWxkLmRvX25vdF9yZWZyZXNoX29uX2FkZCl7XHJcbiAgICAgICAgICAgICAgICAgIGRvbm90UmVzZXRGaWVsZExpc3RzW3N0ZXAuZmllbGRfbmFtZV1bZmllbGQuZmllbGRfbmFtZV0gPSBGb3JtVmFsdWVbc3RlcC5maWVsZF9uYW1lXVtmaWVsZC5maWVsZF9uYW1lXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkb25vdFJlc2V0RmllbGRMaXN0cztcclxuICB9XHJcbiAgYWRkTmV3Rm9ybShzZWxlY3RUYWJJbmRleDpudW1iZXIsaXNCdWxrVXBkYXRlOmJvb2xlYW4sYnVsa3VwbG9hZExpc3Q6YW55LHNlbGVjdGVkUm93SW5kZXg6bnVtYmVyLGZvcm1OYW1lOnN0cmluZyxzZWxlY3RDb250YWN0QWRkOmFueSl7XHJcbiAgICBsZXQgZm9ybURhdGE6YW55ID0ge31cclxuICAgIGZvcm1EYXRhWyd0YWJJbmRleCddID0gc2VsZWN0VGFiSW5kZXg7XHJcbiAgICBmb3JtRGF0YVsnYnVsa1VwZGF0ZSddID0gaXNCdWxrVXBkYXRlO1xyXG4gICAgZm9ybURhdGFbJ2J1bGtEYXRhTGlzdCddID0gYnVsa3VwbG9hZExpc3Q7XHJcbiAgICBmb3JtRGF0YVsnZWRpdGVkUm93SW5kZXgnXSA9IHNlbGVjdGVkUm93SW5kZXg7XHJcbiAgICBmb3JtRGF0YVsnZm9ybU5hbWUnXSA9IGZvcm1OYW1lO1xyXG4gICAgZm9ybURhdGFbJ3NlbGVjdENvbnRhY3QnXSA9IHNlbGVjdENvbnRhY3RBZGQ7XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKCdmb3JtLW1vZGFsJyxmb3JtRGF0YSlcclxuICB9XHJcbiAgZ2V0RmllbGRzRnJvbUZvcm1zKHRhYjphbnksZm9ybU5hbWU6c3RyaW5nLGRpbmFtaWNfZm9ybTphbnksZ3JpZEJ1dHRvbnM6YW55LHRhYmxlRmllbGRzOmFueSxhY3Rpb25CdXR0b25zOmFueSl7XHJcbiAgICBsZXQgcmVzcG9uY2UgPSB7XHJcbiAgICAgIFwiZmllbGRzXCIgOiB0YWJsZUZpZWxkcyxcclxuICAgICAgXCJidXR0b25zXCIgOiBhY3Rpb25CdXR0b25zXHJcbiAgICB9XHJcbiAgICBsZXQgZm9ybSA9IG51bGw7XHJcbiAgICBpZihmb3JtTmFtZSAhPSAnRElOQU1JQ19GT1JNJyAmJiB0YWIgJiYgdGFiLmZvcm1zKXtcclxuICAgICAgZm9ybSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldEZvcm0odGFiLmZvcm1zLGZvcm1OYW1lLGdyaWRCdXR0b25zKTtcclxuICAgIH1lbHNlIGlmKGZvcm1OYW1lID09ICdESU5BTUlDX0ZPUk0nKXtcclxuICAgICAgZm9ybSA9IGRpbmFtaWNfZm9ybTtcclxuICAgIH1lbHNle1xyXG4gICAgICBmb3JtID0gbnVsbFxyXG4gICAgfVxyXG4gICAgaWYoZm9ybSAhPSBudWxsKXtcclxuICAgICAgaWYoZm9ybT8uWyd0YWJsZUZpZWxkcyddICYmIGZvcm0/LlsndGFibGVGaWVsZHMnXT8ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgcmVzcG9uY2UuZmllbGRzID0gZm9ybVsndGFibGVGaWVsZHMnXTtcclxuICAgICAgfVxyXG4gICAgICBpZihmb3JtPy5bJ3RhYl9saXN0X2J1dHRvbnMnXSAmJiBmb3JtPy5bJ3RhYl9saXN0X2J1dHRvbnMnXT8ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgcmVzcG9uY2UuYnV0dG9ucyA9IGZvcm1bJ3RhYl9saXN0X2J1dHRvbnMnXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbmNlO1xyXG4gIH1cclxuXHJcbn1cclxuIl19