@researchdatabox/sails-ng-common 0.0.1-beta.8936

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 (220) hide show
  1. package/README.md +5 -0
  2. package/dist/src/config/base-field-component.model.d.ts +26 -0
  3. package/dist/src/config/base-field-component.model.js +29 -0
  4. package/dist/src/config/base-field-component.outline.d.ts +100 -0
  5. package/dist/src/config/base-field-component.outline.js +3 -0
  6. package/dist/src/config/component/accordion.model.d.ts +103 -0
  7. package/dist/src/config/component/accordion.model.js +127 -0
  8. package/dist/src/config/component/accordion.outline.d.ts +150 -0
  9. package/dist/src/config/component/accordion.outline.js +13 -0
  10. package/dist/src/config/component/action-row-layout.model.d.ts +28 -0
  11. package/dist/src/config/component/action-row-layout.model.js +35 -0
  12. package/dist/src/config/component/action-row-layout.outline.d.ts +36 -0
  13. package/dist/src/config/component/action-row-layout.outline.js +6 -0
  14. package/dist/src/config/component/cancel-button.model.d.ts +46 -0
  15. package/dist/src/config/component/cancel-button.model.js +56 -0
  16. package/dist/src/config/component/cancel-button.outline.d.ts +69 -0
  17. package/dist/src/config/component/cancel-button.outline.js +6 -0
  18. package/dist/src/config/component/checkbox-input.model.d.ts +65 -0
  19. package/dist/src/config/component/checkbox-input.model.js +78 -0
  20. package/dist/src/config/component/checkbox-input.outline.d.ts +85 -0
  21. package/dist/src/config/component/checkbox-input.outline.js +8 -0
  22. package/dist/src/config/component/checkbox-tree.model.d.ts +66 -0
  23. package/dist/src/config/component/checkbox-tree.model.js +79 -0
  24. package/dist/src/config/component/checkbox-tree.outline.d.ts +96 -0
  25. package/dist/src/config/component/checkbox-tree.outline.js +8 -0
  26. package/dist/src/config/component/content.model.d.ts +45 -0
  27. package/dist/src/config/component/content.model.js +55 -0
  28. package/dist/src/config/component/content.outline.d.ts +64 -0
  29. package/dist/src/config/component/content.outline.js +6 -0
  30. package/dist/src/config/component/data-location.model.d.ts +82 -0
  31. package/dist/src/config/component/data-location.model.js +94 -0
  32. package/dist/src/config/component/data-location.outline.d.ts +117 -0
  33. package/dist/src/config/component/data-location.outline.js +6 -0
  34. package/dist/src/config/component/date-input.model.d.ts +66 -0
  35. package/dist/src/config/component/date-input.model.js +79 -0
  36. package/dist/src/config/component/date-input.outline.d.ts +81 -0
  37. package/dist/src/config/component/date-input.outline.js +8 -0
  38. package/dist/src/config/component/default-layout.model.d.ts +22 -0
  39. package/dist/src/config/component/default-layout.model.js +30 -0
  40. package/dist/src/config/component/default-layout.outline.d.ts +29 -0
  41. package/dist/src/config/component/default-layout.outline.js +5 -0
  42. package/dist/src/config/component/delete-button.model.d.ts +46 -0
  43. package/dist/src/config/component/delete-button.model.js +48 -0
  44. package/dist/src/config/component/delete-button.outline.d.ts +55 -0
  45. package/dist/src/config/component/delete-button.outline.js +5 -0
  46. package/dist/src/config/component/dropdown-input.model.d.ts +64 -0
  47. package/dist/src/config/component/dropdown-input.model.js +77 -0
  48. package/dist/src/config/component/dropdown-input.outline.d.ts +84 -0
  49. package/dist/src/config/component/dropdown-input.outline.js +8 -0
  50. package/dist/src/config/component/file-upload.model.d.ts +67 -0
  51. package/dist/src/config/component/file-upload.model.js +81 -0
  52. package/dist/src/config/component/file-upload.outline.d.ts +93 -0
  53. package/dist/src/config/component/file-upload.outline.js +8 -0
  54. package/dist/src/config/component/group.model.d.ts +61 -0
  55. package/dist/src/config/component/group.model.js +75 -0
  56. package/dist/src/config/component/group.outline.d.ts +77 -0
  57. package/dist/src/config/component/group.outline.js +8 -0
  58. package/dist/src/config/component/inline-layout.model.d.ts +22 -0
  59. package/dist/src/config/component/inline-layout.model.js +29 -0
  60. package/dist/src/config/component/inline-layout.outline.d.ts +29 -0
  61. package/dist/src/config/component/inline-layout.outline.js +5 -0
  62. package/dist/src/config/component/map.model.d.ts +68 -0
  63. package/dist/src/config/component/map.model.js +85 -0
  64. package/dist/src/config/component/map.outline.d.ts +102 -0
  65. package/dist/src/config/component/map.outline.js +8 -0
  66. package/dist/src/config/component/pdf-list.model.d.ts +68 -0
  67. package/dist/src/config/component/pdf-list.model.js +71 -0
  68. package/dist/src/config/component/pdf-list.outline.d.ts +91 -0
  69. package/dist/src/config/component/pdf-list.outline.js +6 -0
  70. package/dist/src/config/component/publish-data-location-refresh.model.d.ts +38 -0
  71. package/dist/src/config/component/publish-data-location-refresh.model.js +51 -0
  72. package/dist/src/config/component/publish-data-location-refresh.outline.d.ts +47 -0
  73. package/dist/src/config/component/publish-data-location-refresh.outline.js +5 -0
  74. package/dist/src/config/component/publish-data-location-selector.model.d.ts +74 -0
  75. package/dist/src/config/component/publish-data-location-selector.model.js +100 -0
  76. package/dist/src/config/component/publish-data-location-selector.outline.d.ts +99 -0
  77. package/dist/src/config/component/publish-data-location-selector.outline.js +6 -0
  78. package/dist/src/config/component/question-tree.helper.d.ts +61 -0
  79. package/dist/src/config/component/question-tree.helper.js +298 -0
  80. package/dist/src/config/component/question-tree.model.d.ts +64 -0
  81. package/dist/src/config/component/question-tree.model.js +80 -0
  82. package/dist/src/config/component/question-tree.outline.d.ts +305 -0
  83. package/dist/src/config/component/question-tree.outline.js +9 -0
  84. package/dist/src/config/component/radio-input.model.d.ts +63 -0
  85. package/dist/src/config/component/radio-input.model.js +76 -0
  86. package/dist/src/config/component/radio-input.outline.d.ts +83 -0
  87. package/dist/src/config/component/radio-input.outline.js +8 -0
  88. package/dist/src/config/component/record-metadata-retriever.model.d.ts +41 -0
  89. package/dist/src/config/component/record-metadata-retriever.model.js +57 -0
  90. package/dist/src/config/component/record-metadata-retriever.outline.d.ts +47 -0
  91. package/dist/src/config/component/record-metadata-retriever.outline.js +5 -0
  92. package/dist/src/config/component/record-selector.model.d.ts +60 -0
  93. package/dist/src/config/component/record-selector.model.js +60 -0
  94. package/dist/src/config/component/record-selector.outline.d.ts +84 -0
  95. package/dist/src/config/component/record-selector.outline.js +6 -0
  96. package/dist/src/config/component/repeatable.model.d.ts +90 -0
  97. package/dist/src/config/component/repeatable.model.js +109 -0
  98. package/dist/src/config/component/repeatable.outline.d.ts +108 -0
  99. package/dist/src/config/component/repeatable.outline.js +10 -0
  100. package/dist/src/config/component/reusable.model.d.ts +42 -0
  101. package/dist/src/config/component/reusable.model.js +57 -0
  102. package/dist/src/config/component/reusable.outline.d.ts +49 -0
  103. package/dist/src/config/component/reusable.outline.js +6 -0
  104. package/dist/src/config/component/rich-text-editor.model.d.ts +65 -0
  105. package/dist/src/config/component/rich-text-editor.model.js +79 -0
  106. package/dist/src/config/component/rich-text-editor.outline.d.ts +86 -0
  107. package/dist/src/config/component/rich-text-editor.outline.js +8 -0
  108. package/dist/src/config/component/save-button.model.d.ts +45 -0
  109. package/dist/src/config/component/save-button.model.js +55 -0
  110. package/dist/src/config/component/save-button.outline.d.ts +65 -0
  111. package/dist/src/config/component/save-button.outline.js +6 -0
  112. package/dist/src/config/component/save-status.model.d.ts +42 -0
  113. package/dist/src/config/component/save-status.model.js +60 -0
  114. package/dist/src/config/component/save-status.outline.d.ts +52 -0
  115. package/dist/src/config/component/save-status.outline.js +6 -0
  116. package/dist/src/config/component/simple-input.model.d.ts +62 -0
  117. package/dist/src/config/component/simple-input.model.js +75 -0
  118. package/dist/src/config/component/simple-input.outline.d.ts +80 -0
  119. package/dist/src/config/component/simple-input.outline.js +9 -0
  120. package/dist/src/config/component/tab-content.model.d.ts +63 -0
  121. package/dist/src/config/component/tab-content.model.js +77 -0
  122. package/dist/src/config/component/tab-content.outline.d.ts +92 -0
  123. package/dist/src/config/component/tab-content.outline.js +8 -0
  124. package/dist/src/config/component/tab-nav-button.model.d.ts +45 -0
  125. package/dist/src/config/component/tab-nav-button.model.js +55 -0
  126. package/dist/src/config/component/tab-nav-button.outline.d.ts +64 -0
  127. package/dist/src/config/component/tab-nav-button.outline.js +6 -0
  128. package/dist/src/config/component/tab.model.d.ts +71 -0
  129. package/dist/src/config/component/tab.model.js +84 -0
  130. package/dist/src/config/component/tab.outline.d.ts +106 -0
  131. package/dist/src/config/component/tab.outline.js +9 -0
  132. package/dist/src/config/component/text-area.model.d.ts +63 -0
  133. package/dist/src/config/component/text-area.model.js +76 -0
  134. package/dist/src/config/component/text-area.outline.d.ts +81 -0
  135. package/dist/src/config/component/text-area.outline.js +8 -0
  136. package/dist/src/config/component/typeahead-input.model.d.ts +78 -0
  137. package/dist/src/config/component/typeahead-input.model.js +91 -0
  138. package/dist/src/config/component/typeahead-input.outline.d.ts +107 -0
  139. package/dist/src/config/component/typeahead-input.outline.js +8 -0
  140. package/dist/src/config/component/validation-summary.model.d.ts +42 -0
  141. package/dist/src/config/component/validation-summary.model.js +60 -0
  142. package/dist/src/config/component/validation-summary.outline.d.ts +57 -0
  143. package/dist/src/config/component/validation-summary.outline.js +6 -0
  144. package/dist/src/config/dictionary.model.d.ts +624 -0
  145. package/dist/src/config/dictionary.model.js +175 -0
  146. package/dist/src/config/dictionary.outline.d.ts +94 -0
  147. package/dist/src/config/dictionary.outline.js +3 -0
  148. package/dist/src/config/field-component.model.d.ts +7 -0
  149. package/dist/src/config/field-component.model.js +11 -0
  150. package/dist/src/config/field-component.outline.d.ts +20 -0
  151. package/dist/src/config/field-component.outline.js +3 -0
  152. package/dist/src/config/field-layout.model.d.ts +19 -0
  153. package/dist/src/config/field-layout.model.js +23 -0
  154. package/dist/src/config/field-layout.outline.d.ts +42 -0
  155. package/dist/src/config/field-layout.outline.js +3 -0
  156. package/dist/src/config/field-model.model.d.ts +22 -0
  157. package/dist/src/config/field-model.model.js +25 -0
  158. package/dist/src/config/field-model.outline.d.ts +63 -0
  159. package/dist/src/config/field-model.outline.js +3 -0
  160. package/dist/src/config/field.model.d.ts +12 -0
  161. package/dist/src/config/field.model.js +12 -0
  162. package/dist/src/config/field.outline.d.ts +19 -0
  163. package/dist/src/config/field.outline.js +3 -0
  164. package/dist/src/config/form-behaviour.outline.d.ts +128 -0
  165. package/dist/src/config/form-behaviour.outline.js +40 -0
  166. package/dist/src/config/form-component.model.d.ts +38 -0
  167. package/dist/src/config/form-component.model.js +36 -0
  168. package/dist/src/config/form-component.outline.d.ts +257 -0
  169. package/dist/src/config/form-component.outline.js +24 -0
  170. package/dist/src/config/form-config.model.d.ts +33 -0
  171. package/dist/src/config/form-config.model.js +36 -0
  172. package/dist/src/config/form-config.outline.d.ts +109 -0
  173. package/dist/src/config/form-config.outline.js +3 -0
  174. package/dist/src/config/form-override.model.d.ts +116 -0
  175. package/dist/src/config/form-override.model.js +1209 -0
  176. package/dist/src/config/form-override.outline.d.ts +15 -0
  177. package/dist/src/config/form-override.outline.js +3 -0
  178. package/dist/src/config/form-types.model.d.ts +6 -0
  179. package/dist/src/config/form-types.model.js +23 -0
  180. package/dist/src/config/form-types.outline.d.ts +48 -0
  181. package/dist/src/config/form-types.outline.js +137 -0
  182. package/dist/src/config/helpers.d.ts +23 -0
  183. package/dist/src/config/helpers.js +105 -0
  184. package/dist/src/config/names/naming-helpers.d.ts +71 -0
  185. package/dist/src/config/names/naming-helpers.js +72 -0
  186. package/dist/src/config/names/query-helpers.d.ts +43 -0
  187. package/dist/src/config/names/query-helpers.js +64 -0
  188. package/dist/src/config/shared.outline.d.ts +54 -0
  189. package/dist/src/config/shared.outline.js +41 -0
  190. package/dist/src/config/visitor/base.model.d.ts +137 -0
  191. package/dist/src/config/visitor/base.model.js +323 -0
  192. package/dist/src/config/visitor/base.outline.d.ts +140 -0
  193. package/dist/src/config/visitor/base.outline.js +3 -0
  194. package/dist/src/config/visitor/common.model.d.ts +119 -0
  195. package/dist/src/config/visitor/common.model.js +421 -0
  196. package/dist/src/handlebars-helpers.d.ts +224 -0
  197. package/dist/src/handlebars-helpers.js +558 -0
  198. package/dist/src/index.d.ts +109 -0
  199. package/dist/src/index.js +136 -0
  200. package/dist/src/logger.interface.d.ts +14 -0
  201. package/dist/src/logger.interface.js +3 -0
  202. package/dist/src/record.model.d.ts +35 -0
  203. package/dist/src/record.model.js +21 -0
  204. package/dist/src/report.model.d.ts +21 -0
  205. package/dist/src/report.model.js +19 -0
  206. package/dist/src/status.model.d.ts +22 -0
  207. package/dist/src/status.model.js +28 -0
  208. package/dist/src/template.outline.d.ts +49 -0
  209. package/dist/src/template.outline.js +13 -0
  210. package/dist/src/translation-helpers.d.ts +10 -0
  211. package/dist/src/translation-helpers.js +30 -0
  212. package/dist/src/validation/form.model.d.ts +247 -0
  213. package/dist/src/validation/form.model.js +31 -0
  214. package/dist/src/validation/helpers.d.ts +14 -0
  215. package/dist/src/validation/helpers.js +68 -0
  216. package/dist/src/validation/validators-support.d.ts +41 -0
  217. package/dist/src/validation/validators-support.js +141 -0
  218. package/dist/src/validation/validators.d.ts +23 -0
  219. package/dist/src/validation/validators.js +427 -0
  220. package/package.json +95 -0
@@ -0,0 +1,1209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FormOverride = void 0;
4
+ const simple_input_outline_1 = require("./component/simple-input.outline");
5
+ const content_outline_1 = require("./component/content.outline");
6
+ const text_area_outline_1 = require("./component/text-area.outline");
7
+ const checkbox_input_outline_1 = require("./component/checkbox-input.outline");
8
+ const radio_input_outline_1 = require("./component/radio-input.outline");
9
+ const date_input_outline_1 = require("./component/date-input.outline");
10
+ const lodash_1 = require("lodash");
11
+ const dropdown_input_outline_1 = require("./component/dropdown-input.outline");
12
+ const tab_content_outline_1 = require("./component/tab-content.outline");
13
+ const reusable_outline_1 = require("./component/reusable.outline");
14
+ const form_types_outline_1 = require("./form-types.outline");
15
+ const common_model_1 = require("./visitor/common.model");
16
+ const content_model_1 = require("./component/content.model");
17
+ const question_tree_outline_1 = require("./component/question-tree.outline");
18
+ const tab_outline_1 = require("./component/tab.outline");
19
+ const accordion_outline_1 = require("./component/accordion.outline");
20
+ const accordion_model_1 = require("./component/accordion.model");
21
+ const repeatable_outline_1 = require("./component/repeatable.outline");
22
+ const group_outline_1 = require("./component/group.outline");
23
+ const checkbox_tree_outline_1 = require("./component/checkbox-tree.outline");
24
+ const typeahead_input_outline_1 = require("./component/typeahead-input.outline");
25
+ const rich_text_editor_outline_1 = require("./component/rich-text-editor.outline");
26
+ const map_outline_1 = require("./component/map.outline");
27
+ const file_upload_outline_1 = require("./component/file-upload.outline");
28
+ const pdf_list_outline_1 = require("./component/pdf-list.outline");
29
+ const data_location_outline_1 = require("./component/data-location.outline");
30
+ const publish_data_location_selector_outline_1 = require("./component/publish-data-location-selector.outline");
31
+ const question_tree_helper_1 = require("./component/question-tree.helper");
32
+ class FormOverride {
33
+ logName = "FormOverride";
34
+ propertiesHelper;
35
+ logger;
36
+ activeReusableFormDefs;
37
+ reusableFragmentSlotNames = new Set([
38
+ 'rootExpr',
39
+ 'headersHtml',
40
+ 'cellsHtml',
41
+ 'rowsHtml',
42
+ 'itemBodyHtml',
43
+ 'labelHtml',
44
+ 'valueHtml',
45
+ 'valueExpr',
46
+ 'typeHeaderHtml',
47
+ 'locationHeaderHtml',
48
+ 'notesHeaderCellHtml',
49
+ 'iscHeaderCellHtml',
50
+ 'notesCellHtml',
51
+ 'iscCellHtml',
52
+ ]);
53
+ reusableViewTemplateKeys = {
54
+ leafPlain: 'view-template-leaf-plain',
55
+ leafDate: 'view-template-leaf-date',
56
+ leafOptionEmpty: 'view-template-leaf-option-empty',
57
+ leafOptionSingle: 'view-template-leaf-option-single',
58
+ leafOptionMulti: 'view-template-leaf-option-multi',
59
+ leafRichText: 'view-template-leaf-rich-text',
60
+ leafFileUpload: 'view-template-leaf-file-upload',
61
+ leafPDFList: 'view-template-leaf-pdf-list',
62
+ leafDataLocation: 'view-template-leaf-data-location',
63
+ leafPublishDataLocationSelector: 'view-template-leaf-publish-data-location-selector',
64
+ leafCheckboxTree: 'view-template-leaf-checkbox-tree',
65
+ groupContainer: 'view-template-group-container',
66
+ groupRowWithLabel: 'view-template-group-row-with-label',
67
+ groupRowNoLabel: 'view-template-group-row-no-label',
68
+ repeatableTable: 'view-template-repeatable-table',
69
+ repeatableList: 'view-template-repeatable-list',
70
+ };
71
+ dataLocationLeafFallbackTemplate = `{{#if [[valueExpr]]}}<div class="table-responsive mt-2"><table class="table table-bordered table-striped table-hover mb-0 rb-view-data-location"><thead><tr><th width="15%">[[typeHeaderHtml]]</th><th width="40%">[[locationHeaderHtml]]</th>[[notesHeaderCellHtml]][[iscHeaderCellHtml]]</tr></thead><tbody>{{#each [[valueExpr]]}}<tr><td>{{default this.typeLabel this.type}}</td><td>{{#if (or (eq this.type "url") (eq this.type "attachment"))}}<a href="{{default this.url this.location}}" target="_blank" rel="noopener noreferrer">{{default this.name this.location}}</a>{{else}}<span>{{default this.name this.location}}</span>{{/if}}</td>[[notesCellHtml]][[iscCellHtml]]</tr>{{/each}}</tbody></table></div>{{/if}}`;
72
+ pdfListLeafFallbackTemplate = `{{#if [[valueExpr]]}}<ul class="rb-view-pdf-list">{{#each [[valueExpr]]}}<li>{{default this.fileName this.label}}</li>{{/each}}</ul>{{/if}}`;
73
+ publishDataLocationSelectorLeafFallbackTemplate = `{{#if [[valueExpr]]}}<div class="table-responsive mt-2"><table class="table table-bordered table-striped table-hover mb-0 rb-view-publish-data-location-selector"><thead><tr><th width="15%">[[typeHeaderHtml]]</th><th width="35%">[[locationHeaderHtml]]</th>[[notesHeaderCellHtml]][[iscHeaderCellHtml]]</tr></thead><tbody>{{#each [[valueExpr]]}}{{#if this.selected}}<tr><td>{{default this.typeLabel this.type}}</td><td>{{#if (or (eq this.type "url") (eq this.type "attachment"))}}<a href="{{default this.url this.location}}" target="_blank" rel="noopener noreferrer">{{default this.name this.location}}</a>{{else}}<span>{{default this.name this.location}}</span>{{/if}}</td>[[notesCellHtml]][[iscCellHtml]]</tr>{{/if}}{{/each}}</tbody></table></div>{{/if}}`;
74
+ questionTreeHelper;
75
+ forcedViewTransformOverrideKey = '__forceViewTransform';
76
+ constructor(logger) {
77
+ this.logger = logger;
78
+ this.propertiesHelper = new common_model_1.PropertiesHelper();
79
+ this.activeReusableFormDefs = {};
80
+ this.questionTreeHelper = new question_tree_helper_1.QuestionTreeHelper(logger);
81
+ }
82
+ /**
83
+ * Defines the known transforms between two form components.
84
+ * @private
85
+ */
86
+ knownTransforms = {
87
+ [simple_input_outline_1.SimpleInputComponentName]: {
88
+ [content_outline_1.ContentComponentName]: this.sourceSimpleInputComponentTargetContentComponent,
89
+ },
90
+ [text_area_outline_1.TextAreaComponentName]: {
91
+ [content_outline_1.ContentComponentName]: this.sourceTextAreaComponentTargetContentComponent,
92
+ },
93
+ [dropdown_input_outline_1.DropdownInputComponentName]: {
94
+ [content_outline_1.ContentComponentName]: this.sourceDropdownInputComponentTargetContentComponent,
95
+ },
96
+ [checkbox_input_outline_1.CheckboxInputComponentName]: {
97
+ [content_outline_1.ContentComponentName]: this.sourceCheckboxInputComponentTargetContentComponent,
98
+ },
99
+ [radio_input_outline_1.RadioInputComponentName]: {
100
+ [content_outline_1.ContentComponentName]: this.sourceRadioInputComponentTargetContentComponent,
101
+ },
102
+ [date_input_outline_1.DateInputComponentName]: {
103
+ [content_outline_1.ContentComponentName]: this.sourceDateInputComponentTargetContentComponent,
104
+ },
105
+ [typeahead_input_outline_1.TypeaheadInputComponentName]: {
106
+ [content_outline_1.ContentComponentName]: this.sourceTypeaheadInputComponentTargetContentComponent,
107
+ },
108
+ [rich_text_editor_outline_1.RichTextEditorComponentName]: {
109
+ [content_outline_1.ContentComponentName]: this.sourceRichTextEditorComponentTargetContentComponent,
110
+ },
111
+ [file_upload_outline_1.FileUploadComponentName]: {
112
+ [content_outline_1.ContentComponentName]: this.sourceFileUploadComponentTargetContentComponent,
113
+ },
114
+ [pdf_list_outline_1.PDFListComponentName]: {
115
+ [content_outline_1.ContentComponentName]: this.sourcePDFListComponentTargetContentComponent,
116
+ },
117
+ [data_location_outline_1.DataLocationComponentName]: {
118
+ [content_outline_1.ContentComponentName]: this.sourceDataLocationComponentTargetContentComponent,
119
+ },
120
+ [publish_data_location_selector_outline_1.PublishDataLocationSelectorComponentName]: {
121
+ [content_outline_1.ContentComponentName]: this.sourcePublishDataLocationSelectorComponentTargetContentComponent,
122
+ },
123
+ [repeatable_outline_1.RepeatableComponentName]: {
124
+ [content_outline_1.ContentComponentName]: this.sourceRepeatableComponentTargetContentComponent,
125
+ },
126
+ [group_outline_1.GroupFieldComponentName]: {
127
+ [content_outline_1.ContentComponentName]: this.sourceGroupComponentTargetContentComponent,
128
+ },
129
+ [tab_outline_1.TabComponentName]: {
130
+ [accordion_outline_1.AccordionComponentName]: this.sourceTabComponentTargetAccordionComponent,
131
+ },
132
+ [checkbox_tree_outline_1.CheckboxTreeComponentName]: {
133
+ [content_outline_1.ContentComponentName]: this.sourceCheckboxTreeComponentTargetContentComponent,
134
+ },
135
+ [question_tree_outline_1.QuestionTreeComponentName]: {
136
+ [content_outline_1.ContentComponentName]: this.sourceQuestionTreeComponentTargetContentComponent,
137
+ },
138
+ };
139
+ /**
140
+ * Specifies the 'default' transforms that will be done without needing to be specified.
141
+ * The defaults can be overridden by specifying the transform in overrides.formModeClasses.
142
+ * @private
143
+ */
144
+ defaultTransforms = {
145
+ [simple_input_outline_1.SimpleInputComponentName]: {
146
+ view: {
147
+ component: content_outline_1.ContentComponentName,
148
+ },
149
+ },
150
+ [text_area_outline_1.TextAreaComponentName]: {
151
+ view: {
152
+ component: content_outline_1.ContentComponentName,
153
+ },
154
+ },
155
+ [dropdown_input_outline_1.DropdownInputComponentName]: {
156
+ view: {
157
+ component: content_outline_1.ContentComponentName,
158
+ },
159
+ },
160
+ [checkbox_input_outline_1.CheckboxInputComponentName]: {
161
+ view: {
162
+ component: content_outline_1.ContentComponentName,
163
+ },
164
+ },
165
+ [radio_input_outline_1.RadioInputComponentName]: {
166
+ view: {
167
+ component: content_outline_1.ContentComponentName,
168
+ },
169
+ },
170
+ [date_input_outline_1.DateInputComponentName]: {
171
+ view: {
172
+ component: content_outline_1.ContentComponentName,
173
+ },
174
+ },
175
+ [typeahead_input_outline_1.TypeaheadInputComponentName]: {
176
+ view: {
177
+ component: content_outline_1.ContentComponentName,
178
+ },
179
+ },
180
+ [rich_text_editor_outline_1.RichTextEditorComponentName]: {
181
+ view: {
182
+ component: content_outline_1.ContentComponentName,
183
+ },
184
+ },
185
+ [file_upload_outline_1.FileUploadComponentName]: {
186
+ view: {
187
+ component: content_outline_1.ContentComponentName,
188
+ },
189
+ },
190
+ [pdf_list_outline_1.PDFListComponentName]: {
191
+ view: {
192
+ component: content_outline_1.ContentComponentName,
193
+ },
194
+ },
195
+ [data_location_outline_1.DataLocationComponentName]: {
196
+ view: {
197
+ component: content_outline_1.ContentComponentName,
198
+ },
199
+ },
200
+ [publish_data_location_selector_outline_1.PublishDataLocationSelectorComponentName]: {
201
+ view: {
202
+ component: content_outline_1.ContentComponentName,
203
+ },
204
+ },
205
+ [repeatable_outline_1.RepeatableComponentName]: {
206
+ view: {
207
+ component: content_outline_1.ContentComponentName,
208
+ },
209
+ },
210
+ [group_outline_1.GroupFieldComponentName]: {
211
+ view: {
212
+ component: content_outline_1.ContentComponentName,
213
+ },
214
+ },
215
+ [tab_outline_1.TabComponentName]: {
216
+ view: {
217
+ component: accordion_outline_1.AccordionComponentName,
218
+ layout: accordion_outline_1.AccordionLayoutName,
219
+ },
220
+ },
221
+ [checkbox_tree_outline_1.CheckboxTreeComponentName]: {
222
+ view: {
223
+ component: content_outline_1.ContentComponentName,
224
+ },
225
+ },
226
+ [question_tree_outline_1.QuestionTreeComponentName]: {
227
+ view: {
228
+ component: content_outline_1.ContentComponentName,
229
+ },
230
+ },
231
+ };
232
+ tableCompatibleLeafComponentNames = new Set([
233
+ simple_input_outline_1.SimpleInputComponentName,
234
+ text_area_outline_1.TextAreaComponentName,
235
+ date_input_outline_1.DateInputComponentName,
236
+ dropdown_input_outline_1.DropdownInputComponentName,
237
+ checkbox_input_outline_1.CheckboxInputComponentName,
238
+ radio_input_outline_1.RadioInputComponentName,
239
+ typeahead_input_outline_1.TypeaheadInputComponentName,
240
+ rich_text_editor_outline_1.RichTextEditorComponentName,
241
+ map_outline_1.MapComponentName,
242
+ content_outline_1.ContentComponentName,
243
+ checkbox_tree_outline_1.CheckboxTreeComponentName,
244
+ data_location_outline_1.DataLocationComponentName,
245
+ publish_data_location_selector_outline_1.PublishDataLocationSelectorComponentName,
246
+ ]);
247
+ /**
248
+ * Apply any reusable form configs in the form component definitions.
249
+ * @param items The form component definitions.
250
+ * @param reusableFormDefs
251
+ * @protected
252
+ */
253
+ applyOverridesReusable(items, reusableFormDefs, visitedReusableFormNames = new Set()) {
254
+ const reusableFormDefNames = Object.keys(reusableFormDefs ?? {}).sort();
255
+ // Expanding the reusable form name to the associated form config requires replacing the item in the array.
256
+ // Changing the array that's currently being iterated can result in unstable or undefined behaviour.
257
+ // Instead, find the index of the first item that is a reusable component.
258
+ const index = items.findIndex(item => (0, form_types_outline_1.isTypeReusableComponent)(item, reusableFormDefNames));
259
+ // When there are no more items to expand, return the updated items array.
260
+ if (index === -1) {
261
+ return items;
262
+ }
263
+ // Update the items array to remove the reusable component and replace it with the form config it represents.
264
+ const item = items[index];
265
+ if ((0, form_types_outline_1.isTypeReusableComponent)(item, reusableFormDefNames)) {
266
+ const expandedItems = this.applyOverrideReusableExpand(item, reusableFormDefs, visitedReusableFormNames);
267
+ const newItems = [...items];
268
+ newItems.splice(index, 1, ...expandedItems);
269
+ items = newItems;
270
+ }
271
+ else {
272
+ throw new Error(`Somehow the isReusableComponent was true earlier, but is now false, for the same item. Logic error?`);
273
+ }
274
+ // Continue until there are no more reusable components to expand.
275
+ return this.applyOverridesReusable(items, reusableFormDefs, visitedReusableFormNames);
276
+ }
277
+ /**
278
+ * Expand a reusable form config definition to the actual form component definition(s).
279
+ * @param item The reusable form component definition.
280
+ * @param reusableFormDefs
281
+ * @protected
282
+ */
283
+ applyOverrideReusableExpand(item, reusableFormDefs, visitedReusableFormNames = new Set()) {
284
+ const reusableFormName = item?.overrides?.reusableFormName ?? '';
285
+ if (visitedReusableFormNames.has(reusableFormName)) {
286
+ const visitedPath = [...visitedReusableFormNames, reusableFormName].join(' -> ');
287
+ throw new Error(`Circular reusable form reference detected for '${reusableFormName}'. Expansion path: ${visitedPath}.`);
288
+ }
289
+ visitedReusableFormNames.add(reusableFormName);
290
+ const expandedItemsRaw = Object.keys(reusableFormDefs).includes(reusableFormName)
291
+ ? reusableFormDefs[reusableFormName]
292
+ : [];
293
+ try {
294
+ const expandedItems = this.applyOverridesReusable(expandedItemsRaw, reusableFormDefs, visitedReusableFormNames);
295
+ const additionalItemsRaw = item.component.config?.componentDefinitions ?? [];
296
+ const additionalItems = this.applyOverridesReusable(additionalItemsRaw, reusableFormDefs, visitedReusableFormNames);
297
+ const expandedItemNames = expandedItems.map(i => i.name);
298
+ const extraAdditionalItems = additionalItems.filter(i => !expandedItemNames.includes(i.name));
299
+ if (extraAdditionalItems.length > 0) {
300
+ throw new Error('Invalid usage of reusable form config. ' +
301
+ `Each item in the ${reusable_outline_1.ReusableComponentName} componentDefinitions must have a name that matches an item in the reusable form config '${reusableFormName}'. ` +
302
+ `Names '${extraAdditionalItems.map(i => i.name)}' did not match any reusable form config items. ` +
303
+ `Available names are '${expandedItems
304
+ .map(i => i.name)
305
+ .sort()
306
+ .join(', ')}'.`);
307
+ }
308
+ const preserveWrapperExpressions = expandedItems.length === 1 && item.expressions !== undefined;
309
+ const result = [];
310
+ for (const expandedItem of expandedItems) {
311
+ const additionalItemsMatched = additionalItems.filter(additionalItem => expandedItem.name === additionalItem.name);
312
+ if (additionalItemsMatched.length > 1) {
313
+ throw new Error('Invalid usage of reusable form config. ' +
314
+ `Each item in the ${reusable_outline_1.ReusableComponentName} componentDefinitions must have a unique name. ` +
315
+ `These names were not unique '${Array.from(new Set(additionalItemsMatched.map(i => i.name)))
316
+ .sort()
317
+ .join(', ')}'.`);
318
+ }
319
+ if (additionalItemsMatched.length === 1) {
320
+ const additionalItem = additionalItemsMatched[0];
321
+ const known = {
322
+ component: { reusable: expandedItem.component.class, additional: additionalItem.component.class },
323
+ model: { reusable: expandedItem.model?.class, additional: additionalItem.model?.class },
324
+ layout: { reusable: expandedItem.layout?.class, additional: additionalItem.layout?.class },
325
+ };
326
+ for (const [key, values] of Object.entries(known)) {
327
+ const reusableValue = values.reusable;
328
+ const additionalValue = values.additional;
329
+ if (reusableValue && additionalValue && reusableValue !== additionalValue) {
330
+ throw new Error('Invalid usage of reusable form config. The class must match the reusable form config. ' +
331
+ "To change the class, use 'formModeClasses'. " +
332
+ `The ${key} class in reusable form config '${reusableFormName}' item '${expandedItem.name}' ` +
333
+ `is '${reusableValue}' given class was '${additionalValue}'.`);
334
+ }
335
+ }
336
+ }
337
+ const newItem = (0, lodash_1.mergeWith)({}, expandedItem, additionalItemsMatched.length === 1 ? additionalItemsMatched[0] : {}, (objValue, srcValue, key) => {
338
+ if (key === 'expressions' && Array.isArray(srcValue)) {
339
+ return srcValue;
340
+ }
341
+ return undefined;
342
+ });
343
+ if (preserveWrapperExpressions) {
344
+ newItem.expressions = item.expressions;
345
+ }
346
+ // Apply replaceName during reusable expansion so downstream data-model path binding
347
+ // uses the final component name rather than the reusable template name.
348
+ if (additionalItemsMatched.length === 1 && additionalItemsMatched[0].overrides?.replaceName !== undefined) {
349
+ newItem.name = additionalItemsMatched[0].overrides?.replaceName;
350
+ }
351
+ result.push(newItem);
352
+ }
353
+ return result;
354
+ }
355
+ finally {
356
+ visitedReusableFormNames.delete(reusableFormName);
357
+ }
358
+ }
359
+ /**
360
+ * Apply any overrides that transform a component into another component.
361
+ * @param source The original component.
362
+ * @param formMode The current form mode.
363
+ * @returns The transformed form component.
364
+ */
365
+ applyOverrideTransform(source, formMode, options) {
366
+ const original = (0, lodash_1.cloneDeep)(source);
367
+ const phase = options?.phase ?? 'construct';
368
+ this.activeReusableFormDefs = options?.reusableFormDefs ?? {};
369
+ // Get the component class name, this is also used as the form component identifier.
370
+ const originalComponentClassName = original.component.class;
371
+ // Get the provided transforms for the provided form mode.
372
+ let transforms = original?.overrides?.formModeClasses?.[formMode] ?? {};
373
+ // Apply any default transform for the provided form mode.
374
+ const deferViewModeContentFlatteningAtConstruct = phase === 'construct' &&
375
+ formMode === 'view' &&
376
+ new Set([repeatable_outline_1.RepeatableComponentName, group_outline_1.GroupFieldComponentName]).has(originalComponentClassName);
377
+ const shouldForceViewTransform = original?.overrides?.[this.forcedViewTransformOverrideKey] === true;
378
+ const skipAutomaticViewTransform = formMode === 'view' &&
379
+ !shouldForceViewTransform &&
380
+ this.hasExplicitAllowedMode(original?.constraints, 'view');
381
+ if (originalComponentClassName in this.defaultTransforms &&
382
+ !deferViewModeContentFlatteningAtConstruct &&
383
+ !skipAutomaticViewTransform) {
384
+ const defaultTransform = this.defaultTransforms[originalComponentClassName] ?? {};
385
+ if (formMode in defaultTransform) {
386
+ const defaultTransformClasses = defaultTransform[formMode] ?? {};
387
+ transforms = (0, lodash_1.merge)({}, defaultTransformClasses, transforms);
388
+ }
389
+ }
390
+ const transformComponentClassName = transforms?.component;
391
+ // Check that the transform is valid.
392
+ if (!transformComponentClassName && (transforms.model || transforms.layout)) {
393
+ throw new Error('A transform must specify the component class when specifying other classes.' +
394
+ `Form component name '${source.name}' model class '${transforms.model}' layout class '${transforms.layout}'.`);
395
+ }
396
+ // Get the known transformations for the source form component definition.
397
+ const sourceKnownTransforms = this.knownTransforms[originalComponentClassName] ?? {};
398
+ // Return the source unmodified if there are no transforms specified.
399
+ // Return the source unmodified if the transformation is to the same component
400
+ const isTransformExpected = transformComponentClassName &&
401
+ transformComponentClassName !== originalComponentClassName &&
402
+ Object.keys(transforms).length > 0;
403
+ // If a transform was provided, check that it is a known transform.
404
+ if (isTransformExpected && !(transformComponentClassName in sourceKnownTransforms)) {
405
+ throw new Error(`Invalid form config override config. ` +
406
+ `The source component class '${originalComponentClassName}' does ` +
407
+ `not define a transform to target component class '${transformComponentClassName}'.`);
408
+ }
409
+ // Check the transform function specified.
410
+ const transformFunc = isTransformExpected ? sourceKnownTransforms[transformComponentClassName] : null;
411
+ if (isTransformExpected && !transformFunc) {
412
+ throw new Error('The known form mode override component class transforms are invalid. ' +
413
+ `The function to execute must be provided for source component class '${originalComponentClassName}' ` +
414
+ `and target component class '${transformComponentClassName}'.`);
415
+ }
416
+ // Apply the transform.
417
+ const hasTransform = !!transformComponentClassName && !!transformFunc;
418
+ const result = hasTransform ? transformFunc.call(this, original, formMode) : original;
419
+ // Use 'replaceName' to update the form component name.
420
+ if (original.overrides?.replaceName !== undefined) {
421
+ result.name = original.overrides?.replaceName;
422
+ }
423
+ // Remove the 'overrides' property, as it has been applied and so should not be present in the form config.
424
+ if ('overrides' in result) {
425
+ delete result['overrides'];
426
+ }
427
+ if (isTransformExpected) {
428
+ this.logger.info(`Component '${source?.name}' ${hasTransform ? 'transformed' : 'unmodified'} ` +
429
+ `from '${originalComponentClassName}' to '${transformComponentClassName}'.`);
430
+ }
431
+ return result;
432
+ }
433
+ /* Additional Question Tree */
434
+ /**
435
+ * Create reusable components from the question tree questions DSL.
436
+ * @param name The form component name.
437
+ * @param lineagePath The form component lineage path.
438
+ * @param item The question tree component.
439
+ * @private
440
+ */
441
+ applyQuestionTreeDsl(name, lineagePath, item) {
442
+ const availableOutcomeValues = (item.config?.availableOutcomes ?? []).map(i => i.value);
443
+ const availableMeta = item.config?.availableMeta ?? {};
444
+ const questions = item.config?.questions ?? [];
445
+ // Prepare question and answer info to assist checking for valid structure
446
+ const { errors, questionAnswerValuesMap } = this.questionTreeHelper.validateQuestions(questions);
447
+ const result = [];
448
+ questions.forEach((question, questionIndex) => {
449
+ // validate
450
+ errors.push(...this.questionTreeHelper.validateQuestion(question, questionIndex, availableOutcomeValues, availableMeta, questionAnswerValuesMap));
451
+ // Transform rules DSL to expressions.
452
+ result.push(this.questionTreeHelper.transformQuestionConfig(name, lineagePath, item, question));
453
+ });
454
+ if (errors.length > 0) {
455
+ throw new Error(`${this.logName}: Question tree is not valid: ${errors.join(' ')}`);
456
+ }
457
+ // Add hidden inputs for outcome info.
458
+ // This component allows the outcome and details to be stored within the question tree data model.
459
+ const outcomeComponent = {
460
+ name: question_tree_outline_1.QuestionTreeOutcomeInfoKey,
461
+ component: { class: "SimpleInputComponent", config: { type: "hidden", visible: false } },
462
+ layout: { class: "DefaultLayout", config: { visible: false } },
463
+ };
464
+ result.push(outcomeComponent);
465
+ return result;
466
+ }
467
+ /**
468
+ * Check that only the allowed form component frames have been used.
469
+ * @param items The form components after reusable components have been applied.
470
+ * @private
471
+ */
472
+ applyQuestionTreeFrames(items) {
473
+ const result = [];
474
+ for (const item of items) {
475
+ if ((0, form_types_outline_1.isTypeFormComponentDefinitionName)(item, simple_input_outline_1.SimpleInputComponentName)) {
476
+ result.push(item);
477
+ continue;
478
+ }
479
+ if ((0, form_types_outline_1.isTypeFormComponentDefinitionName)(item, checkbox_input_outline_1.CheckboxInputComponentName)) {
480
+ result.push(item);
481
+ continue;
482
+ }
483
+ if ((0, form_types_outline_1.isTypeFormComponentDefinitionName)(item, radio_input_outline_1.RadioInputComponentName)) {
484
+ result.push(item);
485
+ continue;
486
+ }
487
+ if ((0, form_types_outline_1.isTypeFormComponentDefinitionName)(item, reusable_outline_1.ReusableComponentName)) {
488
+ result.push(item);
489
+ continue;
490
+ }
491
+ throw new Error(`${this.logName}: Invalid form component frame ${item.name} class ${item.component.class} in Question Tree.`);
492
+ }
493
+ return result;
494
+ }
495
+ /* Transforms between components */
496
+ resolveReusableViewTemplate(templateKey, fallbackTemplate) {
497
+ const reusableDefs = this.activeReusableFormDefs ?? {};
498
+ const reusableEntry = reusableDefs[templateKey];
499
+ if (!Array.isArray(reusableEntry)) {
500
+ this.logger.debug(`Reusable view template key '${templateKey}' missing, using fallback template.`);
501
+ return fallbackTemplate;
502
+ }
503
+ if (reusableEntry.length !== 1) {
504
+ this.logger.debug(`Reusable view template key '${templateKey}' must contain exactly one component definition, found ${reusableEntry.length}. Using fallback template.`);
505
+ return fallbackTemplate;
506
+ }
507
+ const reusableDef = reusableEntry[0];
508
+ const reusableClassName = reusableDef?.component?.class;
509
+ if (reusableClassName !== content_outline_1.ContentComponentName) {
510
+ this.logger.debug(`Reusable view template key '${templateKey}' expected class '${content_outline_1.ContentComponentName}', got '${reusableClassName ?? ''}'. Using fallback template.`);
511
+ return fallbackTemplate;
512
+ }
513
+ const template = reusableDef.component.config?.template?.trim?.() ?? '';
514
+ if (template.length === 0) {
515
+ this.logger.debug(`Reusable view template key '${templateKey}' has empty ContentComponent template, using fallback template.`);
516
+ return fallbackTemplate;
517
+ }
518
+ return template;
519
+ }
520
+ substituteReusableTemplateSlots(template, slots) {
521
+ let resolved = template;
522
+ for (const [slot, value] of Object.entries(slots)) {
523
+ if (!this.reusableFragmentSlotNames.has(slot)) {
524
+ continue;
525
+ }
526
+ resolved = resolved.split(`[[${slot}]]`).join(value);
527
+ resolved = resolved.split(`{{${slot}}}`).join(value);
528
+ resolved = resolved.split(`{{{${slot}}}}`).join(value);
529
+ }
530
+ return resolved;
531
+ }
532
+ sourceSimpleInputComponentTargetContentComponent(source, formMode) {
533
+ const target = this.commonContentComponent(source, formMode);
534
+ this.commonContentPlain(source, target);
535
+ return target;
536
+ }
537
+ sourceTextAreaComponentTargetContentComponent(source, formMode) {
538
+ const target = this.commonContentComponent(source, formMode);
539
+ this.commonContentPlain(source, target);
540
+ return target;
541
+ }
542
+ sourceDropdownInputComponentTargetContentComponent(source, formMode) {
543
+ const target = this.commonContentComponent(source, formMode);
544
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
545
+ const value = source.model.config.value;
546
+ const options = source.component.config?.options ?? [];
547
+ const values = value === null || value === undefined
548
+ ? []
549
+ : Array.isArray(value)
550
+ ? value.map(item => String(item))
551
+ : [String(value)];
552
+ this.commonContentOptionList(target, values, options);
553
+ }
554
+ return target;
555
+ }
556
+ sourceCheckboxInputComponentTargetContentComponent(source, formMode) {
557
+ const target = this.commonContentComponent(source, formMode);
558
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
559
+ // Checkbox value can be string, null, array. If string or array, get the labels.
560
+ // Can have 0, 1, or more values.
561
+ const values = source.model.config.value === null
562
+ ? []
563
+ : Array.isArray(source.model.config.value)
564
+ ? source.model.config.value
565
+ : [source.model.config.value];
566
+ const options = source.component.config?.options ?? [];
567
+ this.commonContentOptionList(target, values, options);
568
+ }
569
+ return target;
570
+ }
571
+ sourceRadioInputComponentTargetContentComponent(source, formMode) {
572
+ const target = this.commonContentComponent(source, formMode);
573
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
574
+ // Radio value can be string, null, array. If string or array, get the labels.
575
+ // Can have 0 or 1 values.
576
+ const values = source.model.config.value === null
577
+ ? []
578
+ : Array.isArray(source.model.config.value)
579
+ ? source.model.config.value
580
+ : [source.model.config.value];
581
+ const options = source.component.config?.options ?? [];
582
+ this.commonContentOptionList(target, values, options);
583
+ }
584
+ return target;
585
+ }
586
+ sourceDateInputComponentTargetContentComponent(source, formMode) {
587
+ const target = this.commonContentComponent(source, formMode);
588
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
589
+ const configuredDateFormat = source.component?.config?.dateFormat?.trim?.() || 'YYYY/MM/DD';
590
+ target.component.config.content = source.model.config.value;
591
+ target.component.config.template = `<span data-value="{{content}}">{{formatDate content "${configuredDateFormat}"}}</span>`;
592
+ }
593
+ return target;
594
+ }
595
+ sourceTypeaheadInputComponentTargetContentComponent(source, formMode) {
596
+ const target = this.commonContentComponent(source, formMode);
597
+ if (!target.component.config || source.model?.config?.value === undefined) {
598
+ return target;
599
+ }
600
+ const value = source.model.config.value;
601
+ const displayValue = value && typeof value === 'object' && 'label' in value
602
+ ? value.label
603
+ : typeof value === 'string'
604
+ ? value
605
+ : '';
606
+ target.component.config.content = displayValue;
607
+ target.component.config.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPlain, `<span>{{content}}</span>`);
608
+ return target;
609
+ }
610
+ sourceRichTextEditorComponentTargetContentComponent(source, formMode) {
611
+ const target = this.commonContentComponent(source, formMode);
612
+ const outputFormat = source.component?.config?.outputFormat ?? 'html';
613
+ if (!target.component.config || source.model?.config?.value === undefined) {
614
+ return target;
615
+ }
616
+ target.component.config.content = source.model.config.value;
617
+ const fallbackTemplate = `{{{markdownToHtml content "${this.escapeForHandlebarsLiteral(outputFormat)}"}}}`;
618
+ target.component.config.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafRichText, fallbackTemplate);
619
+ target.component.config = {
620
+ ...target.component.config,
621
+ outputFormat,
622
+ };
623
+ return target;
624
+ }
625
+ sourceFileUploadComponentTargetContentComponent(source, formMode) {
626
+ const target = this.commonContentComponent(source, formMode);
627
+ if (!target.component.config || source.model?.config?.value === undefined) {
628
+ return target;
629
+ }
630
+ target.component.config.content = source.model.config.value;
631
+ const uploadTemplate = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafFileUpload, `<ul class="rb-view-file-upload">{{#each [[valueExpr]]}<li>{{default this.name this.fileId}}</li>{{/each}}</ul>`);
632
+ target.component.config.template = this.substituteReusableTemplateSlots(uploadTemplate, { valueExpr: 'content' });
633
+ return target;
634
+ }
635
+ sourceDataLocationComponentTargetContentComponent(source, formMode) {
636
+ const target = this.commonContentComponent(source, formMode);
637
+ if (!target.component.config || source.model?.config?.value === undefined) {
638
+ return target;
639
+ }
640
+ target.component.config.content = source.model.config.value;
641
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafDataLocation, this.dataLocationLeafFallbackTemplate);
642
+ const componentConfig = source.component?.config;
643
+ const typeHeader = componentConfig?.typeHeader ?? 'Type';
644
+ const locationHeader = componentConfig?.locationHeader ?? 'Location';
645
+ const notesHeader = componentConfig?.notesHeader ?? 'Notes';
646
+ const iscHeader = componentConfig?.iscHeader ?? 'Information Security Classification';
647
+ const notesEnabled = componentConfig?.notesEnabled !== false;
648
+ const iscEnabled = componentConfig?.iscEnabled === true;
649
+ target.component.config.template = this.substituteReusableTemplateSlots(template, {
650
+ valueExpr: 'content',
651
+ typeHeaderHtml: `{{t "${this.escapeForHandlebarsLiteral(typeHeader)}"}}`,
652
+ locationHeaderHtml: `{{t "${this.escapeForHandlebarsLiteral(locationHeader)}"}}`,
653
+ notesHeaderCellHtml: notesEnabled ? `<th width="20%">{{t "${this.escapeForHandlebarsLiteral(notesHeader)}"}}</th>` : '',
654
+ iscHeaderCellHtml: iscEnabled ? `<th width="20%">{{t "${this.escapeForHandlebarsLiteral(iscHeader)}"}}</th>` : '',
655
+ notesCellHtml: notesEnabled ? `<td>{{default this.notes ""}}</td>` : '',
656
+ iscCellHtml: iscEnabled ? `<td>{{default this.isc ""}}</td>` : '',
657
+ });
658
+ return target;
659
+ }
660
+ sourcePDFListComponentTargetContentComponent(source, formMode) {
661
+ const target = this.commonContentComponent(source, formMode);
662
+ if (!target.component.config || source.model?.config?.value === undefined) {
663
+ return target;
664
+ }
665
+ target.component.config.content = source.model.config.value;
666
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPDFList, this.pdfListLeafFallbackTemplate);
667
+ target.component.config.template = this.substituteReusableTemplateSlots(template, {
668
+ valueExpr: 'content',
669
+ });
670
+ return target;
671
+ }
672
+ sourcePublishDataLocationSelectorComponentTargetContentComponent(source, formMode) {
673
+ const target = this.commonContentComponent(source, formMode);
674
+ if (!target.component.config || source.model?.config?.value === undefined) {
675
+ return target;
676
+ }
677
+ target.component.config.content = source.model.config.value;
678
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPublishDataLocationSelector, this.publishDataLocationSelectorLeafFallbackTemplate);
679
+ const componentConfig = source.component?.config;
680
+ const typeHeader = componentConfig?.typeHeader ?? 'Type';
681
+ const locationHeader = componentConfig?.locationHeader ?? 'Location';
682
+ const notesHeader = componentConfig?.notesHeader ?? 'Notes';
683
+ const iscHeader = componentConfig?.iscHeader ?? 'Information Security Classification';
684
+ const notesEnabled = componentConfig?.notesEnabled !== false;
685
+ const iscEnabled = componentConfig?.iscEnabled === true;
686
+ target.component.config.template = this.substituteReusableTemplateSlots(template, {
687
+ valueExpr: 'content',
688
+ typeHeaderHtml: `{{t "${this.escapeForHandlebarsLiteral(typeHeader)}"}}`,
689
+ locationHeaderHtml: `{{t "${this.escapeForHandlebarsLiteral(locationHeader)}"}}`,
690
+ notesHeaderCellHtml: notesEnabled ? `<th width="20%">{{t "${this.escapeForHandlebarsLiteral(notesHeader)}"}}</th>` : '',
691
+ iscHeaderCellHtml: iscEnabled ? `<th width="20%">{{t "${this.escapeForHandlebarsLiteral(iscHeader)}"}}</th>` : '',
692
+ notesCellHtml: notesEnabled ? `<td>{{default this.notes ""}}</td>` : '',
693
+ iscCellHtml: iscEnabled ? `<td>{{default this.isc ""}}</td>` : '',
694
+ });
695
+ return target;
696
+ }
697
+ sourceCheckboxTreeComponentTargetContentComponent(source, formMode) {
698
+ const target = this.commonContentComponent(source, formMode);
699
+ if (!target.component.config) {
700
+ return target;
701
+ }
702
+ if (source.model?.config?.value !== undefined) {
703
+ target.component.config.content = source.model.config.value;
704
+ }
705
+ target.component.config.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafCheckboxTree, `<ul>{{#each content}}<li>{{default this.label this.notation}}</li>{{/each}}</ul>`);
706
+ return target;
707
+ }
708
+ sourceQuestionTreeComponentTargetContentComponent(source, formMode) {
709
+ const target = this.commonContentComponent(source, formMode);
710
+ if (!target.component.config) {
711
+ return target;
712
+ }
713
+ const answers = this.buildQuestionTreeViewRows(source);
714
+ target.component.config.content = answers;
715
+ target.component.config.template =
716
+ '{{#if content}}<div class="rb-view-group">{{#each content}}<div class="rb-view-row"><div class="rb-view-label">{{#with @root}}{{t ../questionLabel}}{{/with}}</div><div class="rb-view-value">{{#if answerLabels}}<ul>{{#each answerLabels}}<li>{{#with @root}}{{t ../label}}{{/with}}</li>{{/each}}</ul>{{else}}{{#with @root}}{{t ../answerLabel}}{{/with}}{{/if}}</div></div>{{/each}}</div>{{/if}}';
717
+ return target;
718
+ }
719
+ isDeepEmpty(value) {
720
+ if (value === null || value === undefined || value === '') {
721
+ return true;
722
+ }
723
+ if (Array.isArray(value)) {
724
+ return value.every(item => this.isDeepEmpty(item));
725
+ }
726
+ if (typeof value === 'object') {
727
+ return Object.values(value).every(val => this.isDeepEmpty(val));
728
+ }
729
+ return false;
730
+ }
731
+ buildQuestionTreeViewRows(source) {
732
+ const questions = source.component?.config?.questions ?? [];
733
+ const valueMap = (source.model?.config?.value ?? {});
734
+ const childComponentMap = new Map((source.component?.config?.componentDefinitions ?? []).map((componentDefinition) => [componentDefinition.name, componentDefinition]));
735
+ const rows = [];
736
+ for (const question of questions) {
737
+ const childComponent = childComponentMap.get(question.id);
738
+ const selectedValues = this.normaliseQuestionTreeAnswerValues(valueMap[question.id] ??
739
+ childComponent?.model?.config?.value ??
740
+ childComponent?.component?.config?.content);
741
+ if (selectedValues.length === 0) {
742
+ continue;
743
+ }
744
+ const answerLabels = selectedValues.map((value) => this.resolveQuestionTreeAnswerLabel(source.name, question, childComponent, value));
745
+ if (answerLabels.length === 0) {
746
+ continue;
747
+ }
748
+ rows.push({
749
+ questionLabel: this.resolveQuestionTreeQuestionLabel(source.name, question),
750
+ ...(answerLabels.length === 1 ? { answerLabel: answerLabels[0] } : { answerLabels: answerLabels.map((label) => ({ label })) }),
751
+ });
752
+ }
753
+ return rows;
754
+ }
755
+ normaliseQuestionTreeAnswerValues(value) {
756
+ if (Array.isArray(value)) {
757
+ return value.filter((item) => typeof item === 'string' && item.trim().length > 0);
758
+ }
759
+ if (typeof value === 'string' && value.trim().length > 0) {
760
+ return [value];
761
+ }
762
+ return [];
763
+ }
764
+ resolveQuestionTreeQuestionLabel(componentName, question) {
765
+ if (typeof question.label === 'string' && question.label.trim().length > 0) {
766
+ return question.label;
767
+ }
768
+ const keyPrefix = (componentName ?? '').trim().replace(/^@+/, '') || 'questiontree';
769
+ return `@${keyPrefix}-item-${question.id}-label`;
770
+ }
771
+ resolveQuestionTreeAnswerLabel(componentName, question, childComponent, answerValue) {
772
+ const generatedOptionLabel = childComponent?.component?.config
773
+ ?.options
774
+ ?.find((option) => option.value === answerValue)?.label;
775
+ if (typeof generatedOptionLabel === 'string' && generatedOptionLabel.trim().length > 0) {
776
+ return generatedOptionLabel;
777
+ }
778
+ const matchedAnswer = question.answers.find((answer) => answer.value === answerValue);
779
+ if (!matchedAnswer) {
780
+ return answerValue;
781
+ }
782
+ return this.resolveQuestionTreeAnswerLabelFromConfig(componentName, question.id, matchedAnswer);
783
+ }
784
+ resolveQuestionTreeAnswerLabelFromConfig(componentName, questionId, answer) {
785
+ if (typeof answer.label === 'string' && answer.label.trim().length > 0) {
786
+ return answer.label;
787
+ }
788
+ const keyPrefix = (componentName ?? '').trim().replace(/^@+/, '') || 'questiontree';
789
+ return `@${keyPrefix}-${questionId}-${answer.value}`;
790
+ }
791
+ sourceRepeatableComponentTargetContentComponent(source, formMode) {
792
+ const target = this.commonContentComponent(source, formMode);
793
+ if (target.component.config) {
794
+ const rawArray = Array.isArray(source.model?.config?.value) ? source.model?.config?.value : [];
795
+ target.component.config.content = rawArray.filter(item => !this.isDeepEmpty(item));
796
+ target.component.config.template = this.generateTemplateForComponent(source, 'content');
797
+ }
798
+ return target;
799
+ }
800
+ extractDescendantValues(component) {
801
+ const values = {};
802
+ const traverse = (comp) => {
803
+ if (comp.name) {
804
+ let valueToSet = '';
805
+ if (comp.model && comp.model.config) {
806
+ const modelValue = comp.model.config.value;
807
+ const defaultValue = comp.model.config.defaultValue;
808
+ valueToSet = modelValue !== undefined ? modelValue : (defaultValue !== undefined ? defaultValue : '');
809
+ }
810
+ values[comp.name] = valueToSet;
811
+ }
812
+ const config = comp.component?.config;
813
+ if (config) {
814
+ if (Array.isArray(config.componentDefinitions)) {
815
+ config.componentDefinitions.forEach(traverse);
816
+ }
817
+ if (Array.isArray(config.tabs)) {
818
+ config.tabs.forEach(traverse);
819
+ }
820
+ if (Array.isArray(config.panels)) {
821
+ config.panels.forEach(traverse);
822
+ }
823
+ // Reusable component elements within a group
824
+ if (config.elementTemplate) {
825
+ traverse(config.elementTemplate);
826
+ }
827
+ }
828
+ };
829
+ // Do not capture the group's own value, just start traversing its children.
830
+ // (If the group had a value, we wouldn't need to rebuild it from descendants).
831
+ const rootConfig = component.component?.config;
832
+ if (rootConfig) {
833
+ if (Array.isArray(rootConfig.componentDefinitions)) {
834
+ rootConfig.componentDefinitions.forEach(traverse);
835
+ }
836
+ if (Array.isArray(rootConfig.tabs)) {
837
+ rootConfig.tabs.forEach(traverse);
838
+ }
839
+ if (Array.isArray(rootConfig.panels)) {
840
+ rootConfig.panels.forEach(traverse);
841
+ }
842
+ }
843
+ return values;
844
+ }
845
+ sourceGroupComponentTargetContentComponent(source, formMode) {
846
+ const target = this.commonContentComponent(source, formMode);
847
+ if (target.component.config) {
848
+ const contentValue = source.model?.config?.value;
849
+ target.component.config.content =
850
+ contentValue && typeof contentValue === 'object' && !this.isDeepEmpty(contentValue)
851
+ ? contentValue
852
+ : this.extractDescendantValues(source);
853
+ target.component.config.template = this.generateTemplateForComponent(source, 'content');
854
+ }
855
+ return target;
856
+ }
857
+ generateTemplateForComponent(component, rootExpr) {
858
+ const className = component?.component?.class;
859
+ if (className === repeatable_outline_1.RepeatableComponentName) {
860
+ return this.generateRepeatableTemplate(component, rootExpr);
861
+ }
862
+ if (className === group_outline_1.GroupFieldComponentName) {
863
+ return this.generateGroupTemplate(component, rootExpr);
864
+ }
865
+ return this.renderLeafValue(component, rootExpr, []);
866
+ }
867
+ generateRepeatableTemplate(component, rootExpr) {
868
+ const elementTemplate = component?.component?.config?.elementTemplate;
869
+ if (!elementTemplate) {
870
+ return `<div class="rb-view-repeatable rb-view-repeatable-list"></div>`;
871
+ }
872
+ const groupChildren = this.getGroupChildren(elementTemplate);
873
+ const tableEligible = !!groupChildren && this.isTableEligibleGroupChildren(groupChildren);
874
+ this.logger.debug(`Repeatable view transform '${component.name}' using ${tableEligible ? 'table' : 'fallback'} layout.`);
875
+ if (tableEligible && groupChildren) {
876
+ return this.renderRepeatableTable(groupChildren, rootExpr);
877
+ }
878
+ return this.renderRepeatableFallback(elementTemplate, rootExpr);
879
+ }
880
+ generateGroupTemplate(component, rootExpr) {
881
+ const children = component?.component?.config?.componentDefinitions ?? [];
882
+ const rows = children.map(child => this.renderLabelValueRow(child, rootExpr)).join('');
883
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.groupContainer, `<div class="rb-view-group">[[rowsHtml]]</div>`);
884
+ return this.substituteReusableTemplateSlots(template, { rowsHtml: rows });
885
+ }
886
+ renderRepeatableTable(children, rootExpr) {
887
+ const headers = children.map(child => `<th>${this.resolveTranslatedLabel(child)}</th>`).join('');
888
+ const cells = children.map(child => `<td>${this.renderLeafValue(child, 'this', [child.name])}</td>`).join('');
889
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.repeatableTable, `{{#if [[rootExpr]]}}<div class="rb-view-repeatable rb-view-repeatable-table-wrapper"><table class="table table-striped table-sm rb-view-repeatable-table"><thead><tr>[[headersHtml]]</tr></thead><tbody>{{#each [[rootExpr]]}}<tr>[[cellsHtml]]</tr>{{/each}}</tbody></table></div>{{/if}}`);
890
+ return this.substituteReusableTemplateSlots(template, { rootExpr, headersHtml: headers, cellsHtml: cells });
891
+ }
892
+ renderRepeatableFallback(elementTemplate, rootExpr) {
893
+ const itemBody = this.renderComponentBody(elementTemplate, 'this');
894
+ const elementClassName = elementTemplate?.component?.class ?? '';
895
+ const itemClass = elementClassName === group_outline_1.GroupFieldComponentName || elementClassName === repeatable_outline_1.RepeatableComponentName
896
+ ? 'rb-view-repeatable-card'
897
+ : 'rb-view-repeatable-card rb-view-repeatable-card--leaf';
898
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.repeatableList, `{{#if [[rootExpr]]}}<div class="rb-view-repeatable rb-view-repeatable-list">{{#each [[rootExpr]]}}<div class="[[itemClass]]">[[itemBodyHtml]]</div>{{/each}}</div>{{/if}}`);
899
+ return this.substituteReusableTemplateSlots(template, { rootExpr, itemBodyHtml: itemBody, itemClass });
900
+ }
901
+ renderComponentBody(component, rootExpr) {
902
+ const className = component?.component?.class;
903
+ if (className === group_outline_1.GroupFieldComponentName) {
904
+ const children = this.getGroupChildren(component) ?? [];
905
+ return children.map(child => this.renderLabelValueRow(child, rootExpr)).join('');
906
+ }
907
+ if (className === repeatable_outline_1.RepeatableComponentName) {
908
+ const nestedRoot = this.buildNestedExpression(rootExpr, component?.name);
909
+ return this.generateRepeatableTemplate(component, nestedRoot);
910
+ }
911
+ return this.renderLeafValue(component, rootExpr, component?.name ? [component.name] : []);
912
+ }
913
+ renderLabelValueRow(component, rootExpr) {
914
+ const label = this.resolveTranslatedLabel(component);
915
+ const valueExpr = this.renderComponentBody(component, rootExpr);
916
+ if (label.trim().length === 0) {
917
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.groupRowNoLabel, `<div class="rb-view-row"><div class="rb-view-value">[[valueHtml]]</div></div>`);
918
+ return this.substituteReusableTemplateSlots(template, { valueHtml: valueExpr });
919
+ }
920
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.groupRowWithLabel, `<div class="rb-view-row"><div class="rb-view-label">[[labelHtml]]</div><div class="rb-view-value">[[valueHtml]]</div></div>`);
921
+ return this.substituteReusableTemplateSlots(template, { labelHtml: label, valueHtml: valueExpr });
922
+ }
923
+ renderLeafValue(component, rootExpr, pathParts) {
924
+ const className = component?.component?.class ?? '';
925
+ const expression = this.safeValueExpression(rootExpr, pathParts);
926
+ if (className === file_upload_outline_1.FileUploadComponentName) {
927
+ const fileTemplate = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafFileUpload, `<ul class="rb-view-file-upload">{{#each [[valueExpr]]}<li>{{default this.name this.fileId}}</li>{{/each}}</ul>`);
928
+ return this.substituteReusableTemplateSlots(fileTemplate, { valueExpr: expression });
929
+ }
930
+ if (className === pdf_list_outline_1.PDFListComponentName) {
931
+ const pdfListTemplate = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPDFList, this.pdfListLeafFallbackTemplate);
932
+ return this.substituteReusableTemplateSlots(pdfListTemplate, { valueExpr: expression });
933
+ }
934
+ if (className === data_location_outline_1.DataLocationComponentName) {
935
+ const dataLocationTemplate = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafDataLocation, this.dataLocationLeafFallbackTemplate);
936
+ return this.substituteReusableTemplateSlots(dataLocationTemplate, { valueExpr: expression });
937
+ }
938
+ if (className === publish_data_location_selector_outline_1.PublishDataLocationSelectorComponentName) {
939
+ const publishDataLocationSelectorTemplate = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPublishDataLocationSelector, this.publishDataLocationSelectorLeafFallbackTemplate);
940
+ return this.substituteReusableTemplateSlots(publishDataLocationSelectorTemplate, { valueExpr: expression });
941
+ }
942
+ if (className === content_outline_1.ContentComponentName) {
943
+ const template = component?.component?.config && 'template' in component.component.config
944
+ ? component.component.config.template
945
+ : undefined;
946
+ const trimmedTemplate = (template ?? '').trim();
947
+ if (trimmedTemplate === this.reusableViewTemplateKeys.leafCheckboxTree ||
948
+ trimmedTemplate === 'view-template-leaf-checkbox-tree' ||
949
+ trimmedTemplate.includes('<ul>{{#each content}}<li>{{default this.label this.notation}}</li>{{/each}}</ul>')) {
950
+ return `<ul>{{#each ${expression}}}<li>{{default this.label this.notation}}</li>{{/each}}</ul>`;
951
+ }
952
+ if (trimmedTemplate === this.reusableViewTemplateKeys.leafDate ||
953
+ trimmedTemplate === 'view-template-leaf-date' ||
954
+ trimmedTemplate.includes('{{formatDate content')) {
955
+ const formatMatch = trimmedTemplate.match(/\{\{\s*formatDate\s+content\s+"([^"]+)"\s*\}\}/);
956
+ const templateFormat = formatMatch?.[1];
957
+ const dateValueTemplate = `{{default ${expression} ""}}`;
958
+ if (templateFormat) {
959
+ return `<span data-value="${dateValueTemplate}">{{formatDate ${expression} "${templateFormat}"}}</span>`;
960
+ }
961
+ return `<span data-value="${dateValueTemplate}">{{formatDate ${expression}}}</span>`;
962
+ }
963
+ if (trimmedTemplate === '{{content}}' ||
964
+ trimmedTemplate === '{{{content}}}' ||
965
+ trimmedTemplate === '<span>{{content}}</span>') {
966
+ return `{{default ${expression} ""}}`;
967
+ }
968
+ return `{{default ${expression} ""}}`;
969
+ }
970
+ if (className === checkbox_tree_outline_1.CheckboxTreeComponentName) {
971
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafCheckboxTree, `<ul>{{#each [[valueExpr]]}}<li>{{default this.label this.notation}}</li>{{/each}}</ul>`);
972
+ return this.substituteReusableTemplateSlots(template, { valueExpr: expression });
973
+ }
974
+ return `{{default ${expression} ""}}`;
975
+ }
976
+ getGroupChildren(component) {
977
+ if (component?.component?.class !== group_outline_1.GroupFieldComponentName) {
978
+ return null;
979
+ }
980
+ const componentDefinitions = component?.component?.config && 'componentDefinitions' in component.component.config
981
+ ? component.component.config
982
+ .componentDefinitions
983
+ : [];
984
+ return componentDefinitions ?? [];
985
+ }
986
+ isTableEligibleGroupChildren(children) {
987
+ const names = new Set();
988
+ for (const child of children) {
989
+ const childName = child?.name?.trim?.() ?? '';
990
+ if (childName.length === 0 || names.has(childName)) {
991
+ this.logger.debug(`Repeatable view transform table eligibility failed due to duplicate/empty child name '${child?.name ?? ''}'.`);
992
+ return false;
993
+ }
994
+ names.add(childName);
995
+ const className = child?.component?.class ?? '';
996
+ if (!this.tableCompatibleLeafComponentNames.has(className) || className === file_upload_outline_1.FileUploadComponentName) {
997
+ this.logger.debug(`Repeatable view transform table eligibility failed for class '${className}'.`);
998
+ return false;
999
+ }
1000
+ }
1001
+ return children.length > 0;
1002
+ }
1003
+ resolveTranslatedLabel(component) {
1004
+ const layoutConfig = component?.layout?.config;
1005
+ const componentConfig = component?.component?.config;
1006
+ const rawLabel = componentConfig?.label ?? layoutConfig?.label;
1007
+ const label = typeof rawLabel === 'string' ? rawLabel.trim() : '';
1008
+ if (label.length > 0) {
1009
+ return `{{t "${this.escapeForHandlebarsLiteral(label)}"}}`;
1010
+ }
1011
+ const name = typeof component?.name === 'string' ? component.name.trim() : '';
1012
+ return this.escapeForHandlebarsLiteral(name);
1013
+ }
1014
+ safeValueExpression(rootExpr, pathParts) {
1015
+ const cleanedParts = (pathParts ?? []).filter(part => typeof part === 'string' && part.trim().length > 0);
1016
+ if (cleanedParts.length === 0) {
1017
+ return rootExpr;
1018
+ }
1019
+ return `(get ${rootExpr} "${this.escapeForHandlebarsLiteral(cleanedParts.join('.'))}" "")`;
1020
+ }
1021
+ buildNestedExpression(rootExpr, part) {
1022
+ if (!part || part.trim().length === 0) {
1023
+ return rootExpr;
1024
+ }
1025
+ return `(get ${rootExpr} "${this.escapeForHandlebarsLiteral(part)}" "")`;
1026
+ }
1027
+ escapeForHandlebarsLiteral(value) {
1028
+ return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
1029
+ }
1030
+ sourceTabComponentTargetAccordionComponent(source, formMode) {
1031
+ const frame = {
1032
+ name: source.name,
1033
+ component: {
1034
+ class: accordion_outline_1.AccordionComponentName,
1035
+ config: {
1036
+ panels: [],
1037
+ startingOpenMode: 'all-open',
1038
+ },
1039
+ },
1040
+ layout: {
1041
+ class: accordion_outline_1.AccordionLayoutName,
1042
+ config: {},
1043
+ },
1044
+ module: source.module,
1045
+ expressions: source.expressions,
1046
+ constraints: source.constraints,
1047
+ overrides: source.overrides,
1048
+ };
1049
+ const target = this.propertiesHelper.sharedConstructFormComponent(frame);
1050
+ if (!(0, form_types_outline_1.isTypeFormComponentDefinitionName)(target, accordion_outline_1.AccordionComponentName)) {
1051
+ throw new Error(`Could not create class for form component class name '${accordion_outline_1.AccordionComponentName}': ${JSON.stringify(target)}.`);
1052
+ }
1053
+ target.component.config = new accordion_model_1.AccordionFieldComponentConfig();
1054
+ if (!target.layout) {
1055
+ throw new Error(`Could not create layout class for '${accordion_outline_1.AccordionComponentName}'.`);
1056
+ }
1057
+ target.layout.config = target.layout.config ?? new accordion_model_1.AccordionFieldLayoutConfig();
1058
+ this.propertiesHelper.sharedPopulateFieldComponentConfig(target.component.config, source.component?.config);
1059
+ this.propertiesHelper.sharedPopulateFieldLayoutConfig(target.layout.config, source.layout?.config);
1060
+ target.component.config.startingOpenMode = 'all-open';
1061
+ target.component.config.panels = [];
1062
+ const tabs = source.component?.config?.tabs ?? [];
1063
+ tabs.forEach((tab, index) => {
1064
+ if (!(0, form_types_outline_1.isTypeFormComponentDefinitionName)(tab, tab_content_outline_1.TabContentComponentName)) {
1065
+ this.logger.warn(`Tab to accordion transform skipped invalid tab at index ${index} for component '${source.name}'.`);
1066
+ return;
1067
+ }
1068
+ if (!this.isModeAllowed(tab.constraints, formMode)) {
1069
+ return;
1070
+ }
1071
+ const buttonLabelCandidate = tab.layout?.config?.buttonLabel;
1072
+ const tabNameCandidate = tab.name;
1073
+ const buttonLabel = typeof buttonLabelCandidate === 'string' && buttonLabelCandidate.trim().length > 0
1074
+ ? buttonLabelCandidate
1075
+ : typeof tabNameCandidate === 'string' && tabNameCandidate.trim().length > 0
1076
+ ? tabNameCandidate
1077
+ : `${index}`;
1078
+ const panelFrame = {
1079
+ name: tab.name ?? `panel-${index}`,
1080
+ constraints: tab.constraints,
1081
+ component: {
1082
+ class: accordion_outline_1.AccordionPanelComponentName,
1083
+ config: {
1084
+ componentDefinitions: tab.component?.config?.componentDefinitions ?? [],
1085
+ },
1086
+ },
1087
+ layout: {
1088
+ class: accordion_outline_1.AccordionPanelLayoutName,
1089
+ config: {
1090
+ buttonLabel,
1091
+ },
1092
+ },
1093
+ };
1094
+ const panel = this.propertiesHelper.sharedConstructFormComponent(panelFrame);
1095
+ if (!(0, form_types_outline_1.isTypeFormComponentDefinitionName)(panel, accordion_outline_1.AccordionPanelComponentName)) {
1096
+ this.logger.warn(`Tab to accordion transform skipped panel at index ${index} for component '${source.name}'.`);
1097
+ return;
1098
+ }
1099
+ panel.component.config = panel.component.config ?? new accordion_model_1.AccordionPanelFieldComponentConfig();
1100
+ if (!panel.layout) {
1101
+ throw new Error(`Could not create layout class for '${accordion_outline_1.AccordionPanelComponentName}'.`);
1102
+ }
1103
+ panel.layout.config = panel.layout.config ?? new accordion_model_1.AccordionPanelFieldLayoutConfig();
1104
+ this.propertiesHelper.sharedPopulateFieldComponentConfig(panel.component.config, panelFrame.component.config);
1105
+ // sharedPopulateFieldComponentConfig only maps common fields, so preserve panel children explicitly.
1106
+ panel.component.config.componentDefinitions = (panelFrame.component.config?.componentDefinitions ??
1107
+ []);
1108
+ this.propertiesHelper.sharedPopulateFieldLayoutConfig(panel.layout.config, panelFrame.layout?.config);
1109
+ this.propertiesHelper.setPropOverride('buttonLabel', panel.layout.config, panelFrame.layout?.config);
1110
+ target.component.config?.panels.push(panel);
1111
+ });
1112
+ return target;
1113
+ }
1114
+ isModeAllowed(constraints, formMode) {
1115
+ const allowModes = constraints?.allowModes;
1116
+ if (!Array.isArray(allowModes) || allowModes.length === 0) {
1117
+ return true;
1118
+ }
1119
+ return allowModes.includes(formMode);
1120
+ }
1121
+ hasExplicitAllowedMode(constraints, mode) {
1122
+ const allowModes = constraints?.allowModes;
1123
+ return Array.isArray(allowModes) && allowModes.includes(mode);
1124
+ }
1125
+ forceAllowModeForTransformedTree(componentDefinition, formMode) {
1126
+ if (!componentDefinition || typeof componentDefinition !== 'object') {
1127
+ return;
1128
+ }
1129
+ const constraints = componentDefinition.constraints ?? { authorization: { allowRoles: [] }, allowModes: [] };
1130
+ constraints.allowModes = Array.isArray(constraints.allowModes) ? constraints.allowModes : [];
1131
+ if (!constraints.allowModes.includes(formMode)) {
1132
+ constraints.allowModes.push(formMode);
1133
+ }
1134
+ componentDefinition.constraints = constraints;
1135
+ const nested = componentDefinition?.component?.config;
1136
+ if (!nested || typeof nested !== 'object') {
1137
+ return;
1138
+ }
1139
+ (nested.componentDefinitions ?? []).forEach((child) => this.forceAllowModeForTransformedTree(child, formMode));
1140
+ (nested.tabs ?? []).forEach((child) => this.forceAllowModeForTransformedTree(child, formMode));
1141
+ (nested.panels ?? []).forEach((child) => this.forceAllowModeForTransformedTree(child, formMode));
1142
+ if (nested.elementTemplate) {
1143
+ this.forceAllowModeForTransformedTree(nested.elementTemplate, formMode);
1144
+ }
1145
+ }
1146
+ commonContentComponent(source, formMode) {
1147
+ const frame = {
1148
+ name: source.name,
1149
+ component: {
1150
+ class: 'ContentComponent',
1151
+ config: {},
1152
+ },
1153
+ module: source.module,
1154
+ expressions: source.expressions,
1155
+ constraints: source.constraints,
1156
+ overrides: source.overrides,
1157
+ };
1158
+ // Set the optional properties only if the source has them.
1159
+ if (source.layout) {
1160
+ frame.layout = source.layout;
1161
+ }
1162
+ const target = this.propertiesHelper.sharedConstructFormComponent(frame);
1163
+ if (!(0, form_types_outline_1.isTypeFormComponentDefinitionName)(target, content_outline_1.ContentComponentName)) {
1164
+ throw new Error(`Could not create class for form component class name 'ContentComponent': ${JSON.stringify(target)}.`);
1165
+ }
1166
+ target.component.config = new content_model_1.ContentFieldComponentConfig();
1167
+ // TODO: does it make sense to copy all shared properties? The css classes might need to be different?
1168
+ this.propertiesHelper.sharedPopulateFieldComponentConfig(target.component.config, source.component.config);
1169
+ if (target.layout) {
1170
+ target.layout.config = target.layout.config ?? {};
1171
+ this.propertiesHelper.sharedPopulateFieldLayoutConfig(target.layout.config, source.layout?.config);
1172
+ }
1173
+ return target;
1174
+ }
1175
+ commonContentOptionList(target, values, options) {
1176
+ if (!target.component.config) {
1177
+ return;
1178
+ }
1179
+ const targetCompConf = target.component.config;
1180
+ if (values.length === 0) {
1181
+ // Empty
1182
+ targetCompConf.content = undefined;
1183
+ targetCompConf.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafOptionEmpty, `<span></span>`);
1184
+ }
1185
+ else if (values.length === 1) {
1186
+ // One value
1187
+ const value = values[0];
1188
+ const label = options?.find(option => option.value === value)?.label ?? value;
1189
+ targetCompConf.content = { value, label };
1190
+ targetCompConf.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafOptionSingle, `<span data-value="{{content.value}}">{{#with @root}}{{t content.label}}{{/with}}</span>`);
1191
+ }
1192
+ else {
1193
+ // More than one value
1194
+ targetCompConf.content = values.map(value => options?.find(option => option.value === value) ?? {
1195
+ label: value,
1196
+ value: value,
1197
+ });
1198
+ targetCompConf.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafOptionMulti, `<ul>{{#each content}}<li data-value="{{this.value}}">{{#with @root}}{{t ../label}}{{/with}}</li>{{/each}}</ul>`);
1199
+ }
1200
+ }
1201
+ commonContentPlain(source, target) {
1202
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
1203
+ target.component.config.content = source.model.config.value;
1204
+ target.component.config.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPlain, `<span>{{content}}</span>`);
1205
+ }
1206
+ }
1207
+ }
1208
+ exports.FormOverride = FormOverride;
1209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1vdmVycmlkZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb25maWcvZm9ybS1vdmVycmlkZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyRUFBdUg7QUFDdkgsaUVBSXFDO0FBTXJDLHFFQUE4RztBQUM5RywrRUFJNEM7QUFDNUMseUVBSXlDO0FBQ3pDLHVFQUFpSDtBQUVqSCxtQ0FBMkY7QUFFM0YsK0VBRzRDO0FBQzVDLHlFQUEwRTtBQUUxRSxtRUFBMkc7QUFFM0csNkRBQWtHO0FBQ2xHLHlEQUEwRDtBQUUxRCw2REFBd0U7QUFDeEUsNkVBTzJDO0FBQzNDLHlEQUE4RjtBQUM5RixxRUFTdUM7QUFDdkMsaUVBS3FDO0FBQ3JDLHVFQUFtSDtBQUNuSCw2REFBeUc7QUFDekcsNkVBQTBIO0FBQzFILGlGQUFnSTtBQUNoSSxtRkFBaUk7QUFDakkseURBQTJEO0FBQzNELHlFQUFvSDtBQUNwSCxtRUFBMkc7QUFDM0csNkVBQTBIO0FBQzFILCtHQUc0RDtBQUs1RCwyRUFBb0U7QUFFcEUsTUFBYSxZQUFZO0lBQ2IsT0FBTyxHQUFHLGNBQWMsQ0FBQztJQUMzQixnQkFBZ0IsQ0FBbUI7SUFDbkMsTUFBTSxDQUFVO0lBQ2hCLHNCQUFzQixDQUEwQjtJQUN2Qyx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBUztRQUMzRCxVQUFVO1FBQ1YsYUFBYTtRQUNiLFdBQVc7UUFDWCxVQUFVO1FBQ1YsY0FBYztRQUNkLFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLGdCQUFnQjtRQUNoQixvQkFBb0I7UUFDcEIscUJBQXFCO1FBQ3JCLG1CQUFtQjtRQUNuQixlQUFlO1FBQ2YsYUFBYTtLQUNkLENBQUMsQ0FBQztJQUNjLHdCQUF3QixHQUFHO1FBQzFDLFNBQVMsRUFBRSwwQkFBMEI7UUFDckMsUUFBUSxFQUFFLHlCQUF5QjtRQUNuQyxlQUFlLEVBQUUsaUNBQWlDO1FBQ2xELGdCQUFnQixFQUFFLGtDQUFrQztRQUNwRCxlQUFlLEVBQUUsaUNBQWlDO1FBQ2xELFlBQVksRUFBRSw4QkFBOEI7UUFDNUMsY0FBYyxFQUFFLGdDQUFnQztRQUNoRCxXQUFXLEVBQUUsNkJBQTZCO1FBQzFDLGdCQUFnQixFQUFFLGtDQUFrQztRQUNwRCwrQkFBK0IsRUFBRSxtREFBbUQ7UUFDcEYsZ0JBQWdCLEVBQUUsa0NBQWtDO1FBQ3BELGNBQWMsRUFBRSwrQkFBK0I7UUFDL0MsaUJBQWlCLEVBQUUsb0NBQW9DO1FBQ3ZELGVBQWUsRUFBRSxrQ0FBa0M7UUFDbkQsZUFBZSxFQUFFLGdDQUFnQztRQUNqRCxjQUFjLEVBQUUsK0JBQStCO0tBQ3ZDLENBQUM7SUFDTSxnQ0FBZ0MsR0FDL0Msc3NCQUFzc0IsQ0FBQztJQUN4ckIsMkJBQTJCLEdBQzFDLDZJQUE2SSxDQUFDO0lBQy9ILCtDQUErQyxHQUM5RCxtdkJBQW12QixDQUFDO0lBQ3J1QixrQkFBa0IsQ0FBcUI7SUFDdkMsOEJBQThCLEdBQUcsc0JBQXNCLENBQUM7SUFFekUsWUFBWSxNQUFlO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLCtCQUFnQixFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSx5Q0FBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZUFBZSxHQUF3QjtRQUM3QyxDQUFDLCtDQUF3QixDQUFDLEVBQUU7WUFDMUIsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxnREFBZ0Q7U0FDOUU7UUFDRCxDQUFDLHlDQUFxQixDQUFDLEVBQUU7WUFDdkIsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyw2Q0FBNkM7U0FDM0U7UUFDRCxDQUFDLG1EQUEwQixDQUFDLEVBQUU7WUFDNUIsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxrREFBa0Q7U0FDaEY7UUFDRCxDQUFDLG1EQUEwQixDQUFDLEVBQUU7WUFDNUIsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxrREFBa0Q7U0FDaEY7UUFDRCxDQUFDLDZDQUF1QixDQUFDLEVBQUU7WUFDekIsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQywrQ0FBK0M7U0FDN0U7UUFDRCxDQUFDLDJDQUFzQixDQUFDLEVBQUU7WUFDeEIsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyw4Q0FBOEM7U0FDNUU7UUFDRCxDQUFDLHFEQUEyQixDQUFDLEVBQUU7WUFDN0IsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxtREFBbUQ7U0FDakY7UUFDRCxDQUFDLHNEQUEyQixDQUFDLEVBQUU7WUFDN0IsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxtREFBbUQ7U0FDakY7UUFDRCxDQUFDLDZDQUF1QixDQUFDLEVBQUU7WUFDekIsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQywrQ0FBK0M7U0FDN0U7UUFDRCxDQUFDLHVDQUFvQixDQUFDLEVBQUU7WUFDdEIsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyw0Q0FBNEM7U0FDMUU7UUFDRCxDQUFDLGlEQUF5QixDQUFDLEVBQUU7WUFDM0IsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxpREFBaUQ7U0FDL0U7UUFDRCxDQUFDLGlGQUF3QyxDQUFDLEVBQUU7WUFDMUMsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxnRUFBZ0U7U0FDOUY7UUFDRCxDQUFDLDRDQUF1QixDQUFDLEVBQUU7WUFDekIsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQywrQ0FBK0M7U0FDN0U7UUFDRCxDQUFDLHVDQUF1QixDQUFDLEVBQUU7WUFDekIsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQywwQ0FBMEM7U0FDeEU7UUFDRCxDQUFDLDhCQUFnQixDQUFDLEVBQUU7WUFDbEIsQ0FBQywwQ0FBc0IsQ0FBQyxFQUFFLElBQUksQ0FBQywwQ0FBMEM7U0FDMUU7UUFDRCxDQUFDLGlEQUF5QixDQUFDLEVBQUU7WUFDM0IsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxpREFBaUQ7U0FDL0U7UUFDRCxDQUFDLGlEQUF5QixDQUFDLEVBQUU7WUFDM0IsQ0FBQyxzQ0FBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxpREFBaUQ7U0FDL0U7S0FDRixDQUFDO0lBRUY7Ozs7T0FJRztJQUNLLGlCQUFpQixHQUEwQjtRQUNqRCxDQUFDLCtDQUF3QixDQUFDLEVBQUU7WUFDMUIsSUFBSSxFQUFFO2dCQUNKLFNBQVMsRUFBRSxzQ0FBb0I7YUFDaEM7U0FDRjtRQUNELENBQUMseUNBQXFCLENBQUMsRUFBRTtZQUN2QixJQUFJLEVBQUU7Z0JBQ0osU0FBUyxFQUFFLHNDQUFvQjthQUNoQztTQUNGO1FBQ0QsQ0FBQyxtREFBMEIsQ0FBQyxFQUFFO1lBQzVCLElBQUksRUFBRTtnQkFDSixTQUFTLEVBQUUsc0NBQW9CO2FBQ2hDO1NBQ0Y7UUFDRCxDQUFDLG1EQUEwQixDQUFDLEVBQUU7WUFDNUIsSUFBSSxFQUFFO2dCQUNKLFNBQVMsRUFBRSxzQ0FBb0I7YUFDaEM7U0FDRjtRQUNELENBQUMsNkNBQXVCLENBQUMsRUFBRTtZQUN6QixJQUFJLEVBQUU7Z0JBQ0osU0FBUyxFQUFFLHNDQUFvQjthQUNoQztTQUNGO1FBQ0QsQ0FBQywyQ0FBc0IsQ0FBQyxFQUFFO1lBQ3hCLElBQUksRUFBRTtnQkFDSixTQUFTLEVBQUUsc0NBQW9CO2FBQ2hDO1NBQ0Y7UUFDRCxDQUFDLHFEQUEyQixDQUFDLEVBQUU7WUFDN0IsSUFBSSxFQUFFO2dCQUNKLFNBQVMsRUFBRSxzQ0FBb0I7YUFDaEM7U0FDRjtRQUNELENBQUMsc0RBQTJCLENBQUMsRUFBRTtZQUM3QixJQUFJLEVBQUU7Z0JBQ0osU0FBUyxFQUFFLHNDQUFvQjthQUNoQztTQUNGO1FBQ0QsQ0FBQyw2Q0FBdUIsQ0FBQyxFQUFFO1lBQ3pCLElBQUksRUFBRTtnQkFDSixTQUFTLEVBQUUsc0NBQW9CO2FBQ2hDO1NBQ0Y7UUFDRCxDQUFDLHVDQUFvQixDQUFDLEVBQUU7WUFDdEIsSUFBSSxFQUFFO2dCQUNKLFNBQVMsRUFBRSxzQ0FBb0I7YUFDaEM7U0FDRjtRQUNELENBQUMsaURBQXlCLENBQUMsRUFBRTtZQUMzQixJQUFJLEVBQUU7Z0JBQ0osU0FBUyxFQUFFLHNDQUFvQjthQUNoQztTQUNGO1FBQ0QsQ0FBQyxpRkFBd0MsQ0FBQyxFQUFFO1lBQzFDLElBQUksRUFBRTtnQkFDSixTQUFTLEVBQUUsc0NBQW9CO2FBQ2hDO1NBQ0Y7UUFDRCxDQUFDLDRDQUF1QixDQUFDLEVBQUU7WUFDekIsSUFBSSxFQUFFO2dCQUNKLFNBQVMsRUFBRSxzQ0FBb0I7YUFDaEM7U0FDRjtRQUNELENBQUMsdUNBQXVCLENBQUMsRUFBRTtZQUN6QixJQUFJLEVBQUU7Z0JBQ0osU0FBUyxFQUFFLHNDQUFvQjthQUNoQztTQUNGO1FBQ0QsQ0FBQyw4QkFBZ0IsQ0FBQyxFQUFFO1lBQ2xCLElBQUksRUFBRTtnQkFDSixTQUFTLEVBQUUsMENBQXNCO2dCQUNqQyxNQUFNLEVBQUUsdUNBQW1CO2FBQzVCO1NBQ0Y7UUFDRCxDQUFDLGlEQUF5QixDQUFDLEVBQUU7WUFDM0IsSUFBSSxFQUFFO2dCQUNKLFNBQVMsRUFBRSxzQ0FBb0I7YUFDaEM7U0FDRjtRQUNELENBQUMsaURBQXlCLENBQUMsRUFBRTtZQUMzQixJQUFJLEVBQUU7Z0JBQ0osU0FBUyxFQUFFLHNDQUFvQjthQUNoQztTQUNGO0tBQ0YsQ0FBQztJQUVlLGlDQUFpQyxHQUFHLElBQUksR0FBRyxDQUFTO1FBQ25FLCtDQUF3QjtRQUN4Qix5Q0FBcUI7UUFDckIsMkNBQXNCO1FBQ3RCLG1EQUEwQjtRQUMxQixtREFBMEI7UUFDMUIsNkNBQXVCO1FBQ3ZCLHFEQUEyQjtRQUMzQixzREFBMkI7UUFDM0IsOEJBQWdCO1FBQ2hCLHNDQUFvQjtRQUNwQixpREFBeUI7UUFDekIsaURBQXlCO1FBQ3pCLGlGQUF3QztLQUN6QyxDQUFDLENBQUM7SUFFSDs7Ozs7T0FLRztJQUNJLHNCQUFzQixDQUMzQixLQUErQyxFQUMvQyxnQkFBeUMsRUFDekMsMkJBQXdDLElBQUksR0FBRyxFQUFVO1FBRXpELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RSwyR0FBMkc7UUFDM0csb0dBQW9HO1FBQ3BHLDBFQUEwRTtRQUMxRSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBQSw0Q0FBdUIsRUFBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBRTNGLDBFQUEwRTtRQUMxRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELDZHQUE2RztRQUM3RyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxJQUFBLDRDQUF1QixFQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7WUFDeEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3pHLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUM1QixRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsQ0FBQztZQUM1QyxLQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixxR0FBcUcsQ0FDdEcsQ0FBQztRQUNKLENBQUM7UUFFRCxrRUFBa0U7UUFDbEUsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sMkJBQTJCLENBQ25DLElBQTBDLEVBQzFDLGdCQUF5QyxFQUN6QywyQkFBd0MsSUFBSSxHQUFHLEVBQVU7UUFFekQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztRQUVqRSxJQUFJLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLHdCQUF3QixFQUFFLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtELGdCQUFnQixzQkFBc0IsV0FBVyxHQUFHLENBQ3ZHLENBQUM7UUFDSixDQUFDO1FBRUQsd0JBQXdCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFL0MsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1lBQy9FLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsSUFBSSxDQUFDO1lBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLHdCQUF3QixDQUFDLENBQUM7WUFDaEgsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsSUFBSSxFQUFFLENBQUM7WUFDN0UsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLHdCQUF3QixDQUFDLENBQUM7WUFFcEgsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pELE1BQU0sb0JBQW9CLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlGLElBQUksb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLElBQUksS0FBSyxDQUNiLHlDQUF5QztvQkFDekMsb0JBQW9CLHdDQUFxQiw0RkFBNEYsZ0JBQWdCLEtBQUs7b0JBQzFKLFVBQVUsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrREFBa0Q7b0JBQ2pHLHdCQUF3QixhQUFhO3lCQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3lCQUNoQixJQUFJLEVBQUU7eUJBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ2xCLENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSwwQkFBMEIsR0FBRyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQztZQUNoRyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDbEIsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxzQkFBc0IsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUNuRCxjQUFjLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLElBQUksQ0FDNUQsQ0FBQztnQkFDRixJQUFJLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxJQUFJLEtBQUssQ0FDYix5Q0FBeUM7d0JBQ3pDLG9CQUFvQix3Q0FBcUIsaURBQWlEO3dCQUMxRixnQ0FBZ0MsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs2QkFDekYsSUFBSSxFQUFFOzZCQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNsQixDQUFDO2dCQUNKLENBQUM7Z0JBRUQsSUFBSSxzQkFBc0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3hDLE1BQU0sY0FBYyxHQUFHLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqRCxNQUFNLEtBQUssR0FBRzt3QkFDWixTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO3dCQUNqRyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFO3dCQUN2RixNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO3FCQUMzRixDQUFDO29CQUNGLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ2xELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7d0JBQ3RDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7d0JBQzFDLElBQUksYUFBYSxJQUFJLGVBQWUsSUFBSSxhQUFhLEtBQUssZUFBZSxFQUFFLENBQUM7NEJBQzFFLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0ZBQXdGO2dDQUN4Riw4Q0FBOEM7Z0NBQzlDLE9BQU8sR0FBRyxtQ0FBbUMsZ0JBQWdCLFdBQVcsWUFBWSxDQUFDLElBQUksSUFBSTtnQ0FDN0YsT0FBTyxhQUFhLHNCQUFzQixlQUFlLElBQUksQ0FDOUQsQ0FBQzt3QkFDSixDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxNQUFNLE9BQU8sR0FBRyxJQUFBLGtCQUFVLEVBQ3hCLEVBQUUsRUFDRixZQUFZLEVBQ1osc0JBQXNCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDcEUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUMxQixJQUFJLEdBQUcsS0FBSyxhQUFhLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUNyRCxPQUFPLFFBQVEsQ0FBQztvQkFDbEIsQ0FBQztvQkFDRCxPQUFPLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQyxDQUNGLENBQUM7Z0JBQ0YsSUFBSSwwQkFBMEIsRUFBRSxDQUFDO29CQUMvQixPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ3pDLENBQUM7Z0JBQ0Qsb0ZBQW9GO2dCQUNwRix3RUFBd0U7Z0JBQ3hFLElBQUksc0JBQXNCLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUMxRyxPQUFPLENBQUMsSUFBSSxHQUFHLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUM7Z0JBQ2xFLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztnQkFBUyxDQUFDO1lBQ1Qsd0JBQXdCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLHNCQUFzQixDQUMzQixNQUEwQyxFQUMxQyxRQUF5QixFQUN6QixPQUF3RjtRQUV4RixNQUFNLFFBQVEsR0FBdUMsSUFBQSxrQkFBVSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksV0FBVyxDQUFDO1FBQzVDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksRUFBRSxDQUFDO1FBRTlELG9GQUFvRjtRQUNwRixNQUFNLDBCQUEwQixHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBRTVELDBEQUEwRDtRQUMxRCxJQUFJLFVBQVUsR0FBRyxRQUFRLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4RSwwREFBMEQ7UUFDMUQsTUFBTSx5Q0FBeUMsR0FDN0MsS0FBSyxLQUFLLFdBQVc7WUFDckIsUUFBUSxLQUFLLE1BQU07WUFDbkIsSUFBSSxHQUFHLENBQVMsQ0FBQyw0Q0FBdUIsRUFBRSx1Q0FBdUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDdEcsTUFBTSx3QkFBd0IsR0FDM0IsUUFBUSxFQUFFLFNBQWlELEVBQUUsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDL0csTUFBTSwwQkFBMEIsR0FDOUIsUUFBUSxLQUFLLE1BQU07WUFDbkIsQ0FBQyx3QkFBd0I7WUFDekIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFN0QsSUFDRSwwQkFBMEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCO1lBQ3BELENBQUMseUNBQXlDO1lBQzFDLENBQUMsMEJBQTBCLEVBQzNCLENBQUM7WUFDRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRixJQUFJLFFBQVEsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLHVCQUF1QixHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakUsVUFBVSxHQUFHLElBQUEsY0FBTSxFQUFDLEVBQUUsRUFBRSx1QkFBdUIsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sMkJBQTJCLEdBQUcsVUFBVSxFQUFFLFNBQVMsQ0FBQztRQUUxRCxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLDJCQUEyQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1RSxNQUFNLElBQUksS0FBSyxDQUNiLDZFQUE2RTtnQkFDN0Usd0JBQXdCLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixVQUFVLENBQUMsS0FBSyxtQkFBbUIsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUM5RyxDQUFDO1FBQ0osQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFckYscUVBQXFFO1FBQ3JFLDhFQUE4RTtRQUM5RSxNQUFNLG1CQUFtQixHQUN2QiwyQkFBMkI7WUFDM0IsMkJBQTJCLEtBQUssMEJBQTBCO1lBQzFELE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVyQyxtRUFBbUU7UUFDbkUsSUFBSSxtQkFBbUIsSUFBSSxDQUFDLENBQUMsMkJBQTJCLElBQUkscUJBQXFCLENBQUMsRUFBRSxDQUFDO1lBQ25GLE1BQU0sSUFBSSxLQUFLLENBQ2IsdUNBQXVDO2dCQUN2QywrQkFBK0IsMEJBQTBCLFNBQVM7Z0JBQ2xFLHFEQUFxRCwyQkFBMkIsSUFBSSxDQUNyRixDQUFDO1FBQ0osQ0FBQztRQUVELDBDQUEwQztRQUMxQyxNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3RHLElBQUksbUJBQW1CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksS0FBSyxDQUNiLHVFQUF1RTtnQkFDdkUsd0VBQXdFLDBCQUEwQixJQUFJO2dCQUN0RywrQkFBK0IsMkJBQTJCLElBQUksQ0FDL0QsQ0FBQztRQUNKLENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLDJCQUEyQixJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDdEUsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUV0Rix1REFBdUQ7UUFDdkQsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsRCxNQUFNLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO1FBQ2hELENBQUM7UUFFRCwyR0FBMkc7UUFDM0csSUFBSSxXQUFXLElBQUksTUFBTSxFQUFFLENBQUM7WUFDMUIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCxjQUFjLE1BQU0sRUFBRSxJQUFJLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRztnQkFDN0UsU0FBUywwQkFBMEIsU0FBUywyQkFBMkIsSUFBSSxDQUM1RSxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFHQyw4QkFBOEI7SUFFaEM7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CLENBQ3pCLElBQW1CLEVBQ25CLFdBQXlCLEVBQ3pCLElBQWlEO1FBRWpELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO1FBRS9DLDBFQUEwRTtRQUMxRSxNQUFNLEVBQUMsTUFBTSxFQUFFLHVCQUF1QixFQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRS9GLE1BQU0sTUFBTSxHQUE2QyxFQUFFLENBQUM7UUFDNUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsRUFBRTtZQUM1QyxXQUFXO1lBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7WUFFbEosc0NBQXNDO1lBQ3RDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEcsQ0FBQyxDQUFDLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLGlDQUFpQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRUgsc0NBQXNDO1FBQ3RDLGtHQUFrRztRQUNsRyxNQUFNLGdCQUFnQixHQUEyQztZQUMvRCxJQUFJLEVBQUUsa0RBQTBCO1lBQ2hDLFNBQVMsRUFBRSxFQUFDLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBQztZQUNwRixNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBQztTQUMzRCxDQUFDO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTVCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFSDs7OztPQUlHO0lBQ0ksdUJBQXVCLENBQUMsS0FBK0M7UUFDNUUsTUFBTSxNQUFNLEdBQTZDLEVBQUUsQ0FBQztRQUM1RCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBQSxzREFBaUMsRUFBMEMsSUFBSSxFQUFFLCtDQUF3QixDQUFDLEVBQUUsQ0FBQztnQkFDL0csTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLElBQUEsc0RBQWlDLEVBQTRDLElBQUksRUFBRSxtREFBMEIsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ILE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxJQUFBLHNEQUFpQyxFQUF5QyxJQUFJLEVBQUUsNkNBQXVCLENBQUMsRUFBRSxDQUFDO2dCQUM3RyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksSUFBQSxzREFBaUMsRUFBdUMsSUFBSSxFQUFFLHdDQUFxQixDQUFDLEVBQUUsQ0FBQztnQkFDekcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIsU0FBUztZQUNYLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sa0NBQWtDLElBQUksQ0FBQyxJQUFJLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLG9CQUFvQixDQUFDLENBQUM7UUFDaEksQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxtQ0FBbUM7SUFFM0IsMkJBQTJCLENBQUMsV0FBbUIsRUFBRSxnQkFBd0I7UUFDL0UsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQztRQUN2RCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsV0FBVyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ25HLE9BQU8sZ0JBQWdCLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZiwrQkFBK0IsV0FBVywwREFBMEQsYUFBYSxDQUFDLE1BQU0sNEJBQTRCLENBQ3JKLENBQUM7WUFDRixPQUFPLGdCQUFnQixDQUFDO1FBQzFCLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQztRQUN4RCxJQUFJLGlCQUFpQixLQUFLLHNDQUFvQixFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YsK0JBQStCLFdBQVcscUJBQXFCLHNDQUFvQixXQUFXLGlCQUFpQixJQUFJLEVBQUUsNkJBQTZCLENBQ25KLENBQUM7WUFDRixPQUFPLGdCQUFnQixDQUFDO1FBQzFCLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBSSxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQTRDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQy9HLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZiwrQkFBK0IsV0FBVyxpRUFBaUUsQ0FDNUcsQ0FBQztZQUNGLE9BQU8sZ0JBQWdCLENBQUM7UUFDMUIsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTywrQkFBK0IsQ0FBQyxRQUFnQixFQUFFLEtBQTZCO1FBQ3JGLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN4QixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLFNBQVM7WUFDWCxDQUFDO1lBQ0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxnREFBZ0QsQ0FDdEQsTUFBaUQsRUFDakQsUUFBeUI7UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyw2Q0FBNkMsQ0FDbkQsTUFBOEMsRUFDOUMsUUFBeUI7UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxrREFBa0QsQ0FDeEQsTUFBbUQsRUFDbkQsUUFBeUI7UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkYsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3hDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDdkQsTUFBTSxNQUFNLEdBQ1YsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUztnQkFDbkMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUNwQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDakMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxrREFBa0QsQ0FDeEQsTUFBbUQsRUFDbkQsUUFBeUI7UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU3RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkYsaUZBQWlGO1lBQ2pGLGlDQUFpQztZQUNqQyxNQUFNLE1BQU0sR0FDVixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSTtnQkFDaEMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUN4QyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSztvQkFDM0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUV2RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLCtDQUErQyxDQUNyRCxNQUFnRCxFQUNoRCxRQUF5QjtRQUV6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTdELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2Riw4RUFBOEU7WUFDOUUsMEJBQTBCO1lBQzFCLE1BQU0sTUFBTSxHQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJO2dCQUNoQyxDQUFDLENBQUMsRUFBRTtnQkFDSixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQ3hDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLO29CQUMzQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1lBRXZELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sOENBQThDLENBQ3BELE1BQStDLEVBQy9DLFFBQXlCO1FBRXpCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFN0QsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZGLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksWUFBWSxDQUFDO1lBQzVGLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDNUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLHdEQUF3RCxvQkFBb0IsWUFBWSxDQUFDO1FBQzlILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sbURBQW1ELENBQ3pELE1BQW9ELEVBQ3BELFFBQXlCO1FBRXpCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxRSxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3hDLE1BQU0sWUFBWSxHQUNoQixLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLO1lBQ3BELENBQUMsQ0FBRSxLQUF3QyxDQUFDLEtBQUs7WUFDakQsQ0FBQyxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ3pCLENBQUMsQ0FBQyxLQUFLO2dCQUNQLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQ2pFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQ3ZDLDBCQUEwQixDQUMzQixDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLG1EQUFtRCxDQUN6RCxNQUFvRCxFQUNwRCxRQUF5QjtRQUV6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdELE1BQU0sWUFBWSxHQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBNkQsRUFBRSxZQUFZLElBQUksTUFBTSxDQUFDO1FBQzlILElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUUsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDNUQsTUFBTSxnQkFBZ0IsR0FBRyw4QkFBOEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDM0csTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FDakUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFlBQVksRUFDMUMsZ0JBQWdCLENBQ2pCLENBQUM7UUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRztZQUN4QixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTTtZQUMxQixZQUFZO1NBQ2IsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTywrQ0FBK0MsQ0FDckQsTUFBZ0QsRUFDaEQsUUFBeUI7UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFFLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FDckQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGNBQWMsRUFDNUMsZ0hBQWdILENBQ2pILENBQUM7UUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2xILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxpREFBaUQsQ0FDdkQsTUFBa0QsRUFDbEQsUUFBeUI7UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFFLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FDL0MsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixFQUM5QyxJQUFJLENBQUMsZ0NBQWdDLENBQ3RDLENBQUM7UUFDRixNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BTzdCLENBQUM7UUFDZCxNQUFNLFVBQVUsR0FBRyxlQUFlLEVBQUUsVUFBVSxJQUFJLE1BQU0sQ0FBQztRQUN6RCxNQUFNLGNBQWMsR0FBRyxlQUFlLEVBQUUsY0FBYyxJQUFJLFVBQVUsQ0FBQztRQUNyRSxNQUFNLFdBQVcsR0FBRyxlQUFlLEVBQUUsV0FBVyxJQUFJLE9BQU8sQ0FBQztRQUM1RCxNQUFNLFNBQVMsR0FBRyxlQUFlLEVBQUUsU0FBUyxJQUFJLHFDQUFxQyxDQUFDO1FBQ3RGLE1BQU0sWUFBWSxHQUFHLGVBQWUsRUFBRSxZQUFZLEtBQUssS0FBSyxDQUFDO1FBQzdELE1BQU0sVUFBVSxHQUFHLGVBQWUsRUFBRSxVQUFVLEtBQUssSUFBSSxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsUUFBUSxFQUFFO1lBQ2hGLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLGNBQWMsRUFBRSxRQUFRLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsS0FBSztZQUN4RSxrQkFBa0IsRUFBRSxRQUFRLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLENBQUMsS0FBSztZQUNoRixtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN2SCxpQkFBaUIsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixJQUFJLENBQUMsMEJBQTBCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNqSCxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN2RSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUNsRSxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sNENBQTRDLENBQ2xELE1BQTZDLEVBQzdDLFFBQXlCO1FBRXpCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUF1RCxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUUsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUMvQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUN6QyxJQUFJLENBQUMsMkJBQTJCLENBQ2pDLENBQUM7UUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLFFBQVEsRUFBRTtZQUNoRixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sZ0VBQWdFLENBQ3RFLE1BQWlFLEVBQ2pFLFFBQXlCO1FBRXpCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUF1RCxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUUsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUMvQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsK0JBQStCLEVBQzdELElBQUksQ0FBQywrQ0FBK0MsQ0FDckQsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFPN0IsQ0FBQztRQUNkLE1BQU0sVUFBVSxHQUFHLGVBQWUsRUFBRSxVQUFVLElBQUksTUFBTSxDQUFDO1FBQ3pELE1BQU0sY0FBYyxHQUFHLGVBQWUsRUFBRSxjQUFjLElBQUksVUFBVSxDQUFDO1FBQ3JFLE1BQU0sV0FBVyxHQUFHLGVBQWUsRUFBRSxXQUFXLElBQUksT0FBTyxDQUFDO1FBQzVELE1BQU0sU0FBUyxHQUFHLGVBQWUsRUFBRSxTQUFTLElBQUkscUNBQXFDLENBQUM7UUFDdEYsTUFBTSxZQUFZLEdBQUcsZUFBZSxFQUFFLFlBQVksS0FBSyxLQUFLLENBQUM7UUFDN0QsTUFBTSxVQUFVLEdBQUcsZUFBZSxFQUFFLFVBQVUsS0FBSyxJQUFJLENBQUM7UUFDeEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxRQUFRLEVBQUU7WUFDaEYsU0FBUyxFQUFFLFNBQVM7WUFDcEIsY0FBYyxFQUFFLFFBQVEsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxLQUFLO1lBQ3hFLGtCQUFrQixFQUFFLFFBQVEsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxLQUFLO1lBQ2hGLG1CQUFtQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsd0JBQXdCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3ZILGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pILGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3ZFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ2xFLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxpREFBaUQsQ0FDdkQsTUFBa0QsRUFDbEQsUUFBeUI7UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUM5RCxDQUFDO1FBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FDakUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixFQUM5QyxrRkFBa0YsQ0FDbkYsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxpREFBaUQsQ0FDdkQsTUFBa0QsRUFDbEQsUUFBeUI7UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQXVELEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFDOUIsd1lBQXdZLENBQUM7UUFDM1ksT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFVO1FBQzVCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUMxRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8seUJBQXlCLENBQUMsTUFBa0Q7UUFLbEYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQTRCLENBQUM7UUFDaEYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FDL0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUNySSxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQW9HLEVBQUUsQ0FBQztRQUVqSCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUMzRCxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsY0FBYyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSztnQkFDbkMsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUE0QyxFQUFFLE9BQU8sQ0FDcEYsQ0FBQztZQUNGLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsU0FBUztZQUNYLENBQUM7WUFFRCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDaEQsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FDbEYsQ0FBQztZQUNGLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsU0FBUztZQUNYLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNSLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUM7Z0JBQzNFLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUMvSCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8saUNBQWlDLENBQUMsS0FBYztRQUN0RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwRyxDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVPLGdDQUFnQyxDQUFDLGFBQWlDLEVBQUUsUUFBOEI7UUFDeEcsSUFBSSxPQUFPLFFBQVEsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNFLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUM7UUFDcEYsT0FBTyxJQUFJLFNBQVMsU0FBUyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDbkQsQ0FBQztJQUVPLDhCQUE4QixDQUNwQyxhQUFpQyxFQUNqQyxRQUE4QixFQUM5QixjQUF1RyxFQUN2RyxXQUFtQjtRQUVuQixNQUFNLG9CQUFvQixHQUFJLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBcUY7WUFDNUksRUFBRSxPQUFPO1lBQ1QsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQzFELElBQUksT0FBTyxvQkFBb0IsS0FBSyxRQUFRLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZGLE9BQU8sb0JBQW9CLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsd0NBQXdDLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVPLHdDQUF3QyxDQUM5QyxhQUFpQyxFQUNqQyxVQUFrQixFQUNsQixNQUFrQztRQUVsQyxJQUFJLE9BQU8sTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLGNBQWMsQ0FBQztRQUNwRixPQUFPLElBQUksU0FBUyxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVPLCtDQUErQyxDQUNyRCxNQUFnRCxFQUNoRCxRQUF5QjtRQUV6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMvRixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25GLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sdUJBQXVCLENBQUMsU0FBNkM7UUFDM0UsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQXdDLEVBQUUsRUFBRTtZQUM1RCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxJQUFJLFVBQVUsR0FBUSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQzNDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztvQkFDcEQsVUFBVSxHQUFHLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RyxDQUFDO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQTZDLENBQUM7WUFDN0UsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztvQkFDOUMsTUFBTSxDQUFDLG9CQUE2RCxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUYsQ0FBQztnQkFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxJQUE2QyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUUsQ0FBQztnQkFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sQ0FBQyxNQUErQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDNUUsQ0FBQztnQkFDRCw2Q0FBNkM7Z0JBQzdDLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUMzQixRQUFRLENBQUMsTUFBTSxDQUFDLGVBQXFELENBQUMsQ0FBQztnQkFDekUsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRiw0RUFBNEU7UUFDNUUsK0VBQStFO1FBQy9FLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBNkMsQ0FBQztRQUN0RixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELFVBQVUsQ0FBQyxvQkFBNkQsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUYsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsVUFBVSxDQUFDLElBQTZDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlFLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLFVBQVUsQ0FBQyxNQUErQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoRixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTywwQ0FBMEMsQ0FDaEQsTUFBMkMsRUFDM0MsUUFBeUI7UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQzdCLFlBQVksSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztvQkFDakYsQ0FBQyxDQUFDLFlBQVk7b0JBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLDRCQUE0QixDQUFDLFNBQTZDLEVBQUUsUUFBZ0I7UUFDbEcsTUFBTSxTQUFTLEdBQUcsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUM7UUFDOUMsSUFBSSxTQUFTLEtBQUssNENBQXVCLEVBQUUsQ0FBQztZQUMxQyxPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFxRCxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFHLENBQUM7UUFDRCxJQUFJLFNBQVMsS0FBSyx1Q0FBdUIsRUFBRSxDQUFDO1lBQzFDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQWdELEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTywwQkFBMEIsQ0FBQyxTQUFtRCxFQUFFLFFBQWdCO1FBQ3RHLE1BQU0sZUFBZSxHQUFHLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQztRQUN0RSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsT0FBTyxnRUFBZ0UsQ0FBQztRQUMxRSxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLDRCQUE0QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLDhCQUE4QixTQUFTLENBQUMsSUFBSSxXQUFXLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLFVBQVUsQ0FDdEcsQ0FBQztRQUVGLElBQUksYUFBYSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxTQUE4QyxFQUFFLFFBQWdCO1FBQzVGLE1BQU0sUUFBUSxHQUFHLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztRQUMxRSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQy9DLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxjQUFjLEVBQzVDLCtDQUErQyxDQUNoRCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVPLHFCQUFxQixDQUFDLFFBQThDLEVBQUUsUUFBZ0I7UUFDNUYsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakcsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQy9DLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQzdDLDRSQUE0UixDQUM3UixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDOUcsQ0FBQztJQUVPLHdCQUF3QixDQUFDLGVBQW1ELEVBQUUsUUFBZ0I7UUFDcEcsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRSxNQUFNLGdCQUFnQixHQUFHLGVBQWUsRUFBRSxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNqRSxNQUFNLFNBQVMsR0FDYixnQkFBZ0IsS0FBSyx1Q0FBdUIsSUFBSSxnQkFBZ0IsS0FBSyw0Q0FBdUI7WUFDMUYsQ0FBQyxDQUFDLHlCQUF5QjtZQUMzQixDQUFDLENBQUMsdURBQXVELENBQUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUMvQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsY0FBYyxFQUM1QywyS0FBMkssQ0FDNUssQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUVPLG1CQUFtQixDQUFDLFNBQTZDLEVBQUUsUUFBZ0I7UUFDekYsTUFBTSxTQUFTLEdBQUcsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUM7UUFDOUMsSUFBSSxTQUFTLEtBQUssdUNBQXVCLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUNELElBQUksU0FBUyxLQUFLLDRDQUF1QixFQUFFLENBQUM7WUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekUsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsU0FBcUQsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1RyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxTQUE2QyxFQUFFLFFBQWdCO1FBQ3pGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQy9DLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQzdDLCtFQUErRSxDQUNoRixDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FDL0MsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixFQUMvQyw2SEFBNkgsQ0FDOUgsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVPLGVBQWUsQ0FDckIsU0FBNkMsRUFDN0MsUUFBZ0IsRUFDaEIsU0FBbUI7UUFFbkIsTUFBTSxTQUFTLEdBQUcsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakUsSUFBSSxTQUFTLEtBQUssNkNBQXVCLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQ25ELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxjQUFjLEVBQzVDLGdIQUFnSCxDQUNqSCxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELElBQUksU0FBUyxLQUFLLHVDQUFvQixFQUFFLENBQUM7WUFDdkMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUN0RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUN6QyxJQUFJLENBQUMsMkJBQTJCLENBQ2pDLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxlQUFlLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsSUFBSSxTQUFTLEtBQUssaURBQXlCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FDM0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixFQUM5QyxJQUFJLENBQUMsZ0NBQWdDLENBQ3RDLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFDRCxJQUFJLFNBQVMsS0FBSyxpRkFBd0MsRUFBRSxDQUFDO1lBQzNELE1BQU0sbUNBQW1DLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUMxRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsK0JBQStCLEVBQzdELElBQUksQ0FBQywrQ0FBK0MsQ0FDckQsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLG1DQUFtQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDOUcsQ0FBQztRQUNELElBQUksU0FBUyxLQUFLLHNDQUFvQixFQUFFLENBQUM7WUFDdkMsTUFBTSxRQUFRLEdBQ1osU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLElBQUksVUFBVSxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTTtnQkFDdEUsQ0FBQyxDQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBZ0MsQ0FBQyxRQUFRO2dCQUNoRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hCLE1BQU0sZUFBZSxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRWhELElBQ0UsZUFBZSxLQUFLLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0I7Z0JBQ2xFLGVBQWUsS0FBSyxrQ0FBa0M7Z0JBQ3RELGVBQWUsQ0FBQyxRQUFRLENBQUMsa0ZBQWtGLENBQUMsRUFDNUcsQ0FBQztnQkFDRCxPQUFPLGVBQWUsVUFBVSwrREFBK0QsQ0FBQztZQUNsRyxDQUFDO1lBRUQsSUFDRSxlQUFlLEtBQUssSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVE7Z0JBQzFELGVBQWUsS0FBSyx5QkFBeUI7Z0JBQzdDLGVBQWUsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFDaEQsQ0FBQztnQkFDRCxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7Z0JBQzVGLE1BQU0sY0FBYyxHQUFHLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLGlCQUFpQixHQUFHLGFBQWEsVUFBVSxPQUFPLENBQUM7Z0JBQ3pELElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ25CLE9BQU8scUJBQXFCLGlCQUFpQixrQkFBa0IsVUFBVSxLQUFLLGNBQWMsWUFBWSxDQUFDO2dCQUMzRyxDQUFDO2dCQUNELE9BQU8scUJBQXFCLGlCQUFpQixrQkFBa0IsVUFBVSxXQUFXLENBQUM7WUFDdkYsQ0FBQztZQUVELElBQ0UsZUFBZSxLQUFLLGFBQWE7Z0JBQ2pDLGVBQWUsS0FBSyxlQUFlO2dCQUNuQyxlQUFlLEtBQUssMEJBQTBCLEVBQzlDLENBQUM7Z0JBQ0QsT0FBTyxhQUFhLFVBQVUsT0FBTyxDQUFDO1lBQ3hDLENBQUM7WUFDRCxPQUFPLGFBQWEsVUFBVSxPQUFPLENBQUM7UUFDeEMsQ0FBQztRQUNELElBQUksU0FBUyxLQUFLLGlEQUF5QixFQUFFLENBQUM7WUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUMvQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLEVBQzlDLHdGQUF3RixDQUN6RixDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUNELE9BQU8sYUFBYSxVQUFVLE9BQU8sQ0FBQztJQUN4QyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsU0FBNkM7UUFDcEUsSUFBSSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssS0FBSyx1Q0FBdUIsRUFBRSxDQUFDO1lBQzVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sb0JBQW9CLEdBQ3hCLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLHNCQUFzQixJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTTtZQUNsRixDQUFDLENBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUEwRTtpQkFDOUYsb0JBQW9CO1lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDVCxPQUFPLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU8sNEJBQTRCLENBQUMsUUFBOEM7UUFDakYsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNoQyxLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzdCLE1BQU0sU0FBUyxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDOUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLHlGQUF5RixLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUMvRyxDQUFDO2dCQUNGLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFckIsTUFBTSxTQUFTLEdBQUcsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsS0FBSyw2Q0FBdUIsRUFBRSxDQUFDO2dCQUNwRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpRUFBaUUsU0FBUyxJQUFJLENBQUMsQ0FBQztnQkFDbEcsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLHNCQUFzQixDQUFDLFNBQTZDO1FBQzFFLE1BQU0sWUFBWSxHQUFHLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBd0MsQ0FBQztRQUNqRixNQUFNLGVBQWUsR0FBRyxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQXdDLENBQUM7UUFDdkYsTUFBTSxRQUFRLEdBQUcsZUFBZSxFQUFFLEtBQUssSUFBSSxZQUFZLEVBQUUsS0FBSyxDQUFDO1FBQy9ELE1BQU0sS0FBSyxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEUsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sUUFBUSxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUM3RCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsT0FBTyxTQUFTLEVBQUUsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlFLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxRQUFnQixFQUFFLFNBQW1CO1FBQy9ELE1BQU0sWUFBWSxHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFHLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5QixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQ0QsT0FBTyxRQUFRLFFBQVEsS0FBSyxJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDN0YsQ0FBQztJQUVPLHFCQUFxQixDQUFDLFFBQWdCLEVBQUUsSUFBYTtRQUMzRCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELE9BQU8sUUFBUSxRQUFRLEtBQUssSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDM0UsQ0FBQztJQUVPLDBCQUEwQixDQUFDLEtBQWE7UUFDOUMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTywwQ0FBMEMsQ0FDaEQsTUFBeUMsRUFDekMsUUFBeUI7UUFFekIsTUFBTSxLQUFLLEdBQTBDO1lBQ25ELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixTQUFTLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFLDBDQUFzQjtnQkFDN0IsTUFBTSxFQUFFO29CQUNOLE1BQU0sRUFBRSxFQUFFO29CQUNWLGdCQUFnQixFQUFFLFVBQVU7aUJBQzdCO2FBQ0Y7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sS0FBSyxFQUFFLHVDQUFtQjtnQkFDMUIsTUFBTSxFQUFFLEVBQUU7YUFDWDtZQUNELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDL0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1lBQy9CLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM1QixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxJQUFBLHNEQUFpQyxFQUEwQyxNQUFNLEVBQUUsMENBQXNCLENBQUMsRUFBRSxDQUFDO1lBQ2hILE1BQU0sSUFBSSxLQUFLLENBQ2IseURBQXlELDBDQUFzQixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDL0csQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLCtDQUE2QixFQUFFLENBQUM7UUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQywwQ0FBc0IsSUFBSSxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksNENBQTBCLEVBQUUsQ0FBQztRQUVoRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0NBQWtDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsK0JBQStCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLENBQUM7UUFDdEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVwQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLElBQUEsc0RBQWlDLEVBQUMsR0FBRyxFQUFFLDZDQUF1QixDQUFDLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsMkRBQTJELEtBQUssbUJBQW1CLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FDbkcsQ0FBQztnQkFDRixPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQztZQUM3RCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQ2YsT0FBTyxvQkFBb0IsS0FBSyxRQUFRLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ2hGLENBQUMsQ0FBQyxvQkFBb0I7Z0JBQ3RCLENBQUMsQ0FBQyxPQUFPLGdCQUFnQixLQUFLLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDMUUsQ0FBQyxDQUFDLGdCQUFnQjtvQkFDbEIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDbkIsTUFBTSxVQUFVLEdBQStDO2dCQUM3RCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxTQUFTLEtBQUssRUFBRTtnQkFDbEMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO2dCQUM1QixTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFLCtDQUEyQjtvQkFDbEMsTUFBTSxFQUFFO3dCQUNOLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixJQUFJLEVBQUU7cUJBQ3hFO2lCQUNGO2dCQUNELE1BQU0sRUFBRTtvQkFDTixLQUFLLEVBQUUsNENBQXdCO29CQUMvQixNQUFNLEVBQUU7d0JBQ04sV0FBVztxQkFDWjtpQkFDRjthQUNGLENBQUM7WUFFRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsNEJBQTRCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0UsSUFDRSxDQUFDLElBQUEsc0RBQWlDLEVBQ2hDLEtBQUssRUFDTCwrQ0FBMkIsQ0FDNUIsRUFDRCxDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxLQUFLLG1CQUFtQixNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztnQkFDL0csT0FBTztZQUNULENBQUM7WUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxJQUFJLG9EQUFrQyxFQUFFLENBQUM7WUFDNUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsK0NBQTJCLElBQUksQ0FBQyxDQUFDO1lBQ3pGLENBQUM7WUFDRCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLGlEQUErQixFQUFFLENBQUM7WUFFbkYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtDQUFrQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUcscUdBQXFHO1lBQ3JHLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLG9CQUFvQixHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsb0JBQW9CO2dCQUM5RixFQUFFLENBQXVELENBQUM7WUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLCtCQUErQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVyRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxXQUFvRCxFQUFFLFFBQXlCO1FBQ25HLE1BQU0sVUFBVSxHQUFHLFdBQVcsRUFBRSxVQUFVLENBQUM7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLHNCQUFzQixDQUM1QixXQUFvRCxFQUNwRCxJQUFxQjtRQUVyQixNQUFNLFVBQVUsR0FBRyxXQUFXLEVBQUUsVUFBVSxDQUFDO1FBQzNDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxtQkFBd0IsRUFBRSxRQUF5QjtRQUMxRixJQUFJLENBQUMsbUJBQW1CLElBQUksT0FBTyxtQkFBbUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNwRSxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDLFdBQVcsSUFBSSxFQUFFLGFBQWEsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDN0csV0FBVyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdGLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQy9DLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBRTlDLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUM7UUFDdEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMxQyxPQUFPO1FBQ1QsQ0FBQztRQUVELENBQUMsTUFBTSxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3BILENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNwRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdEcsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFTyxzQkFBc0IsQ0FDNUIsTUFBMEMsRUFDMUMsUUFBeUI7UUFFekIsTUFBTSxLQUFLLEdBQXdDO1lBQ2pELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixTQUFTLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFLGtCQUFrQjtnQkFDekIsTUFBTSxFQUFFLEVBQUU7YUFDWDtZQUNELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDL0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1lBQy9CLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM1QixDQUFDO1FBQ0YsMkRBQTJEO1FBQzNELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxJQUFBLHNEQUFpQyxFQUF3QyxNQUFNLEVBQUUsc0NBQW9CLENBQUMsRUFBRSxDQUFDO1lBQzVHLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEVBQTRFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDdEcsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLDJDQUEyQixFQUFFLENBQUM7UUFFNUQsc0dBQXNHO1FBQ3RHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQ0FBa0MsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNHLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsK0JBQStCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRyxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLHVCQUF1QixDQUM3QixNQUE2QyxFQUM3QyxNQUFnQixFQUNoQixPQUE0QztRQUU1QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBRS9DLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixRQUFRO1lBQ1IsY0FBYyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDbkMsY0FBYyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM3SCxDQUFDO2FBQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLFlBQVk7WUFDWixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJLEtBQUssQ0FBQztZQUM5RSxjQUFjLENBQUMsT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUN4RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLEVBQzlDLHlGQUF5RixDQUMxRixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixzQkFBc0I7WUFDdEIsY0FBYyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUNqQyxLQUFLLENBQUMsRUFBRSxDQUNOLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUFJO2dCQUNqRCxLQUFLLEVBQUUsS0FBSztnQkFDWixLQUFLLEVBQUUsS0FBSzthQUNiLENBQ0osQ0FBQztZQUNGLGNBQWMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUN4RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxFQUM3QyxnSEFBZ0gsQ0FDakgsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQ3hCLE1BQTBDLEVBQzFDLE1BQTZDO1FBRTdDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2RixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzVELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQ2pFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQ3ZDLDBCQUEwQixDQUMzQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQXRoREQsb0NBc2hEQyJ9