@hailin-zheng/editor-core 1.0.14 → 1.0.20

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 (290) hide show
  1. package/lib/doc-ruler.d.ts +1 -0
  2. package/lib/doc-ruler.d.ts.map +1 -0
  3. package/lib/framework/common-util.d.ts +1 -0
  4. package/lib/framework/common-util.d.ts.map +1 -0
  5. package/lib/framework/document-change.d.ts +1 -0
  6. package/lib/framework/document-change.d.ts.map +1 -0
  7. package/lib/framework/document-combine.d.ts +1 -0
  8. package/lib/framework/document-combine.d.ts.map +1 -0
  9. package/lib/framework/document-comment.d.ts +1 -0
  10. package/lib/framework/document-comment.d.ts.map +1 -0
  11. package/lib/framework/document-context.d.ts +1 -0
  12. package/lib/framework/document-context.d.ts.map +1 -0
  13. package/lib/framework/document-eval-func.d.ts +1 -0
  14. package/lib/framework/document-eval-func.d.ts.map +1 -0
  15. package/lib/framework/document-event.d.ts +1 -0
  16. package/lib/framework/document-event.d.ts.map +1 -0
  17. package/lib/framework/document-history.d.ts +1 -0
  18. package/lib/framework/document-history.d.ts.map +1 -0
  19. package/lib/framework/document-images-loader.d.ts +1 -0
  20. package/lib/framework/document-images-loader.d.ts.map +1 -0
  21. package/lib/framework/document-input-cursor.d.ts +1 -0
  22. package/lib/framework/document-input-cursor.d.ts.map +1 -0
  23. package/lib/framework/document-paint.d.ts +1 -0
  24. package/lib/framework/document-paint.d.ts.map +1 -0
  25. package/lib/framework/document-print-offscreen.d.ts +1 -0
  26. package/lib/framework/document-print-offscreen.d.ts.map +1 -0
  27. package/lib/framework/document-print.d.ts +1 -0
  28. package/lib/framework/document-print.d.ts.map +1 -0
  29. package/lib/framework/document-segmenter.d.ts +1 -0
  30. package/lib/framework/document-segmenter.d.ts.map +1 -0
  31. package/lib/framework/document-selection.d.ts +1 -0
  32. package/lib/framework/document-selection.d.ts.map +1 -0
  33. package/lib/framework/document-template.d.ts +1 -0
  34. package/lib/framework/document-template.d.ts.map +1 -0
  35. package/lib/framework/document-textline-mode.d.ts +1 -0
  36. package/lib/framework/document-textline-mode.d.ts.map +1 -0
  37. package/lib/framework/element-define.d.ts +1 -0
  38. package/lib/framework/element-define.d.ts.map +1 -0
  39. package/lib/framework/element-event-define.d.ts +1 -0
  40. package/lib/framework/element-event-define.d.ts.map +1 -0
  41. package/lib/framework/element-measure.d.ts +1 -0
  42. package/lib/framework/element-measure.d.ts.map +1 -0
  43. package/lib/framework/element-paint.d.ts +1 -0
  44. package/lib/framework/element-paint.d.ts.map +1 -0
  45. package/lib/framework/element-props.d.ts +2 -1
  46. package/lib/framework/element-props.d.ts.map +1 -0
  47. package/lib/framework/element-reader.d.ts +1 -0
  48. package/lib/framework/element-reader.d.ts.map +1 -0
  49. package/lib/framework/element-render-cut.d.ts +1 -0
  50. package/lib/framework/element-render-cut.d.ts.map +1 -0
  51. package/lib/framework/element-serialize.d.ts +1 -0
  52. package/lib/framework/element-serialize.d.ts.map +1 -0
  53. package/lib/framework/element-util.d.ts +1 -0
  54. package/lib/framework/element-util.d.ts.map +1 -0
  55. package/lib/framework/impl/checkbox/checkbox-impl.d.ts +1 -0
  56. package/lib/framework/impl/checkbox/checkbox-impl.d.ts.map +1 -0
  57. package/lib/framework/impl/comments/comment-content-impl.d.ts +1 -0
  58. package/lib/framework/impl/comments/comment-content-impl.d.ts.map +1 -0
  59. package/lib/framework/impl/comments/comment-element-impl.d.ts +1 -0
  60. package/lib/framework/impl/comments/comment-element-impl.d.ts.map +1 -0
  61. package/lib/framework/impl/comments/comments-container-impl.d.ts +1 -0
  62. package/lib/framework/impl/comments/comments-container-impl.d.ts.map +1 -0
  63. package/lib/framework/impl/comments/comments-util.d.ts +1 -0
  64. package/lib/framework/impl/comments/comments-util.d.ts.map +1 -0
  65. package/lib/framework/impl/comments/validate-msg-impl.d.ts +1 -0
  66. package/lib/framework/impl/comments/validate-msg-impl.d.ts.map +1 -0
  67. package/lib/framework/impl/data-element/data-decorate-impl.d.ts +1 -0
  68. package/lib/framework/impl/data-element/data-decorate-impl.d.ts.map +1 -0
  69. package/lib/framework/impl/data-element/data-element-barcode.d.ts +1 -0
  70. package/lib/framework/impl/data-element/data-element-barcode.d.ts.map +1 -0
  71. package/lib/framework/impl/data-element/data-element-base-impl.d.ts +1 -0
  72. package/lib/framework/impl/data-element/data-element-base-impl.d.ts.map +1 -0
  73. package/lib/framework/impl/data-element/data-element-check-impl.d.ts +1 -0
  74. package/lib/framework/impl/data-element/data-element-check-impl.d.ts.map +1 -0
  75. package/lib/framework/impl/data-element/data-element-date-impl.d.ts +1 -0
  76. package/lib/framework/impl/data-element/data-element-date-impl.d.ts.map +1 -0
  77. package/lib/framework/impl/data-element/data-element-group-impl.d.ts +1 -0
  78. package/lib/framework/impl/data-element/data-element-group-impl.d.ts.map +1 -0
  79. package/lib/framework/impl/data-element/data-element-image-impl.d.ts +1 -0
  80. package/lib/framework/impl/data-element/data-element-image-impl.d.ts.map +1 -0
  81. package/lib/framework/impl/data-element/data-element-list-impl.d.ts +1 -0
  82. package/lib/framework/impl/data-element/data-element-list-impl.d.ts.map +1 -0
  83. package/lib/framework/impl/data-element/data-element-text-impl.d.ts +1 -0
  84. package/lib/framework/impl/data-element/data-element-text-impl.d.ts.map +1 -0
  85. package/lib/framework/impl/decorate/fill-null-space-imple.d.ts +1 -0
  86. package/lib/framework/impl/decorate/fill-null-space-imple.d.ts.map +1 -0
  87. package/lib/framework/impl/document/doc-body-impl.d.ts +1 -0
  88. package/lib/framework/impl/document/doc-body-impl.d.ts.map +1 -0
  89. package/lib/framework/impl/document/doc-body-part-impl.d.ts +1 -0
  90. package/lib/framework/impl/document/doc-body-part-impl.d.ts.map +1 -0
  91. package/lib/framework/impl/document/doc-container-impl.d.ts +1 -0
  92. package/lib/framework/impl/document/doc-container-impl.d.ts.map +1 -0
  93. package/lib/framework/impl/document/doc-footer-impl.d.ts +1 -0
  94. package/lib/framework/impl/document/doc-footer-impl.d.ts.map +1 -0
  95. package/lib/framework/impl/document/doc-header-impl.d.ts +1 -0
  96. package/lib/framework/impl/document/doc-header-impl.d.ts.map +1 -0
  97. package/lib/framework/impl/document/doc-impl.d.ts +1 -0
  98. package/lib/framework/impl/document/doc-impl.d.ts.map +1 -0
  99. package/lib/framework/impl/index.d.ts +37 -0
  100. package/lib/framework/impl/index.d.ts.map +1 -0
  101. package/lib/framework/impl/media-formula/menstrual-history.d.ts +1 -0
  102. package/lib/framework/impl/media-formula/menstrual-history.d.ts.map +1 -0
  103. package/lib/framework/impl/paragraph/p-impl.d.ts +1 -0
  104. package/lib/framework/impl/paragraph/p-impl.d.ts.map +1 -0
  105. package/lib/framework/impl/picture/image-impl.d.ts +1 -0
  106. package/lib/framework/impl/picture/image-impl.d.ts.map +1 -0
  107. package/lib/framework/impl/radio/radio-impl.d.ts +1 -0
  108. package/lib/framework/impl/radio/radio-impl.d.ts.map +1 -0
  109. package/lib/framework/impl/symbol/br-symbol-impl.d.ts +1 -0
  110. package/lib/framework/impl/symbol/br-symbol-impl.d.ts.map +1 -0
  111. package/lib/framework/impl/symbol/p-symbol-impl.d.ts +1 -0
  112. package/lib/framework/impl/symbol/p-symbol-impl.d.ts.map +1 -0
  113. package/lib/framework/impl/table/table-cell-impl.d.ts +1 -0
  114. package/lib/framework/impl/table/table-cell-impl.d.ts.map +1 -0
  115. package/lib/framework/impl/table/table-impl.d.ts +1 -0
  116. package/lib/framework/impl/table/table-impl.d.ts.map +1 -0
  117. package/lib/framework/impl/table/table-row-impl.d.ts +1 -0
  118. package/lib/framework/impl/table/table-row-impl.d.ts.map +1 -0
  119. package/lib/framework/impl/table/table-split-cell-patch.d.ts +1 -0
  120. package/lib/framework/impl/table/table-split-cell-patch.d.ts.map +1 -0
  121. package/lib/framework/impl/table/table-split-cell.d.ts +1 -0
  122. package/lib/framework/impl/table/table-split-cell.d.ts.map +1 -0
  123. package/lib/framework/impl/table/table-util.d.ts +1 -0
  124. package/lib/framework/impl/table/table-util.d.ts.map +1 -0
  125. package/lib/framework/impl/text/text-impl.d.ts +1 -0
  126. package/lib/framework/impl/text/text-impl.d.ts.map +1 -0
  127. package/lib/framework/impl/text/track-run-impl.d.ts +1 -0
  128. package/lib/framework/impl/text/track-run-impl.d.ts.map +1 -0
  129. package/lib/framework/notify.d.ts +1 -0
  130. package/lib/framework/notify.d.ts.map +1 -0
  131. package/lib/framework/range-util.d.ts +1 -0
  132. package/lib/framework/range-util.d.ts.map +1 -0
  133. package/lib/framework/render-context.d.ts +1 -0
  134. package/lib/framework/render-context.d.ts.map +1 -0
  135. package/lib/framework/render-define.d.ts +1 -0
  136. package/lib/framework/render-define.d.ts.map +1 -0
  137. package/lib/framework/selection-overlays.d.ts +1 -0
  138. package/lib/framework/selection-overlays.d.ts.map +1 -0
  139. package/lib/index.d.ts +35 -0
  140. package/lib/index.d.ts.map +1 -0
  141. package/lib/index.js +15671 -0
  142. package/lib/texteditor.d.ts +3 -2
  143. package/lib/texteditor.d.ts.map +1 -0
  144. package/lib/util/subject.d.ts +1 -0
  145. package/lib/util/subject.d.ts.map +1 -0
  146. package/lib/util/table-bind.d.ts +1 -0
  147. package/lib/util/table-bind.d.ts.map +1 -0
  148. package/package.json +14 -8
  149. package/lib/doc-ruler.js +0 -313
  150. package/lib/doc-ruler.js.map +0 -1
  151. package/lib/framework/common-util.js +0 -178
  152. package/lib/framework/common-util.js.map +0 -1
  153. package/lib/framework/document-change.js +0 -1342
  154. package/lib/framework/document-change.js.map +0 -1
  155. package/lib/framework/document-combine.js +0 -40
  156. package/lib/framework/document-combine.js.map +0 -1
  157. package/lib/framework/document-comment.js +0 -148
  158. package/lib/framework/document-comment.js.map +0 -1
  159. package/lib/framework/document-context.js +0 -330
  160. package/lib/framework/document-context.js.map +0 -1
  161. package/lib/framework/document-eval-func.js +0 -48
  162. package/lib/framework/document-eval-func.js.map +0 -1
  163. package/lib/framework/document-event.js +0 -1054
  164. package/lib/framework/document-event.js.map +0 -1
  165. package/lib/framework/document-history.js +0 -65
  166. package/lib/framework/document-history.js.map +0 -1
  167. package/lib/framework/document-images-loader.js +0 -66
  168. package/lib/framework/document-images-loader.js.map +0 -1
  169. package/lib/framework/document-input-cursor.js +0 -239
  170. package/lib/framework/document-input-cursor.js.map +0 -1
  171. package/lib/framework/document-paint.js +0 -103
  172. package/lib/framework/document-paint.js.map +0 -1
  173. package/lib/framework/document-print-offscreen.js +0 -128
  174. package/lib/framework/document-print-offscreen.js.map +0 -1
  175. package/lib/framework/document-print.js +0 -203
  176. package/lib/framework/document-print.js.map +0 -1
  177. package/lib/framework/document-segmenter.js +0 -106
  178. package/lib/framework/document-segmenter.js.map +0 -1
  179. package/lib/framework/document-selection.js +0 -358
  180. package/lib/framework/document-selection.js.map +0 -1
  181. package/lib/framework/document-template.js +0 -20
  182. package/lib/framework/document-template.js.map +0 -1
  183. package/lib/framework/document-textline-mode.js +0 -30
  184. package/lib/framework/document-textline-mode.js.map +0 -1
  185. package/lib/framework/element-define.js +0 -579
  186. package/lib/framework/element-define.js.map +0 -1
  187. package/lib/framework/element-event-define.js +0 -108
  188. package/lib/framework/element-event-define.js.map +0 -1
  189. package/lib/framework/element-measure.js +0 -551
  190. package/lib/framework/element-measure.js.map +0 -1
  191. package/lib/framework/element-paint.js +0 -170
  192. package/lib/framework/element-paint.js.map +0 -1
  193. package/lib/framework/element-props.js +0 -809
  194. package/lib/framework/element-props.js.map +0 -1
  195. package/lib/framework/element-reader.js +0 -151
  196. package/lib/framework/element-reader.js.map +0 -1
  197. package/lib/framework/element-render-cut.js +0 -449
  198. package/lib/framework/element-render-cut.js.map +0 -1
  199. package/lib/framework/element-serialize.js +0 -113
  200. package/lib/framework/element-serialize.js.map +0 -1
  201. package/lib/framework/element-util.js +0 -1463
  202. package/lib/framework/element-util.js.map +0 -1
  203. package/lib/framework/impl/checkbox/checkbox-impl.js +0 -64
  204. package/lib/framework/impl/checkbox/checkbox-impl.js.map +0 -1
  205. package/lib/framework/impl/comments/comment-content-impl.js +0 -105
  206. package/lib/framework/impl/comments/comment-content-impl.js.map +0 -1
  207. package/lib/framework/impl/comments/comment-element-impl.js +0 -62
  208. package/lib/framework/impl/comments/comment-element-impl.js.map +0 -1
  209. package/lib/framework/impl/comments/comments-container-impl.js +0 -62
  210. package/lib/framework/impl/comments/comments-container-impl.js.map +0 -1
  211. package/lib/framework/impl/comments/comments-util.js +0 -67
  212. package/lib/framework/impl/comments/comments-util.js.map +0 -1
  213. package/lib/framework/impl/comments/validate-msg-impl.js +0 -83
  214. package/lib/framework/impl/comments/validate-msg-impl.js.map +0 -1
  215. package/lib/framework/impl/data-element/data-decorate-impl.js +0 -91
  216. package/lib/framework/impl/data-element/data-decorate-impl.js.map +0 -1
  217. package/lib/framework/impl/data-element/data-element-barcode.js +0 -115
  218. package/lib/framework/impl/data-element/data-element-barcode.js.map +0 -1
  219. package/lib/framework/impl/data-element/data-element-base-impl.js +0 -205
  220. package/lib/framework/impl/data-element/data-element-base-impl.js.map +0 -1
  221. package/lib/framework/impl/data-element/data-element-check-impl.js +0 -133
  222. package/lib/framework/impl/data-element/data-element-check-impl.js.map +0 -1
  223. package/lib/framework/impl/data-element/data-element-date-impl.js +0 -111
  224. package/lib/framework/impl/data-element/data-element-date-impl.js.map +0 -1
  225. package/lib/framework/impl/data-element/data-element-group-impl.js +0 -130
  226. package/lib/framework/impl/data-element/data-element-group-impl.js.map +0 -1
  227. package/lib/framework/impl/data-element/data-element-image-impl.js +0 -137
  228. package/lib/framework/impl/data-element/data-element-image-impl.js.map +0 -1
  229. package/lib/framework/impl/data-element/data-element-list-impl.js +0 -131
  230. package/lib/framework/impl/data-element/data-element-list-impl.js.map +0 -1
  231. package/lib/framework/impl/data-element/data-element-text-impl.js +0 -103
  232. package/lib/framework/impl/data-element/data-element-text-impl.js.map +0 -1
  233. package/lib/framework/impl/decorate/fill-null-space-imple.js +0 -43
  234. package/lib/framework/impl/decorate/fill-null-space-imple.js.map +0 -1
  235. package/lib/framework/impl/document/doc-body-impl.js +0 -79
  236. package/lib/framework/impl/document/doc-body-impl.js.map +0 -1
  237. package/lib/framework/impl/document/doc-body-part-impl.js +0 -94
  238. package/lib/framework/impl/document/doc-body-part-impl.js.map +0 -1
  239. package/lib/framework/impl/document/doc-container-impl.js +0 -21
  240. package/lib/framework/impl/document/doc-container-impl.js.map +0 -1
  241. package/lib/framework/impl/document/doc-footer-impl.js +0 -77
  242. package/lib/framework/impl/document/doc-footer-impl.js.map +0 -1
  243. package/lib/framework/impl/document/doc-header-impl.js +0 -83
  244. package/lib/framework/impl/document/doc-header-impl.js.map +0 -1
  245. package/lib/framework/impl/document/doc-impl.js +0 -209
  246. package/lib/framework/impl/document/doc-impl.js.map +0 -1
  247. package/lib/framework/impl/media-formula/menstrual-history.js +0 -153
  248. package/lib/framework/impl/media-formula/menstrual-history.js.map +0 -1
  249. package/lib/framework/impl/paragraph/p-impl.js +0 -156
  250. package/lib/framework/impl/paragraph/p-impl.js.map +0 -1
  251. package/lib/framework/impl/picture/image-impl.js +0 -124
  252. package/lib/framework/impl/picture/image-impl.js.map +0 -1
  253. package/lib/framework/impl/radio/radio-impl.js +0 -72
  254. package/lib/framework/impl/radio/radio-impl.js.map +0 -1
  255. package/lib/framework/impl/symbol/br-symbol-impl.js +0 -54
  256. package/lib/framework/impl/symbol/br-symbol-impl.js.map +0 -1
  257. package/lib/framework/impl/symbol/p-symbol-impl.js +0 -54
  258. package/lib/framework/impl/symbol/p-symbol-impl.js.map +0 -1
  259. package/lib/framework/impl/table/table-cell-impl.js +0 -145
  260. package/lib/framework/impl/table/table-cell-impl.js.map +0 -1
  261. package/lib/framework/impl/table/table-impl.js +0 -363
  262. package/lib/framework/impl/table/table-impl.js.map +0 -1
  263. package/lib/framework/impl/table/table-row-impl.js +0 -75
  264. package/lib/framework/impl/table/table-row-impl.js.map +0 -1
  265. package/lib/framework/impl/table/table-split-cell-patch.js +0 -89
  266. package/lib/framework/impl/table/table-split-cell-patch.js.map +0 -1
  267. package/lib/framework/impl/table/table-split-cell.js +0 -464
  268. package/lib/framework/impl/table/table-split-cell.js.map +0 -1
  269. package/lib/framework/impl/table/table-util.js +0 -678
  270. package/lib/framework/impl/table/table-util.js.map +0 -1
  271. package/lib/framework/impl/text/text-impl.js +0 -149
  272. package/lib/framework/impl/text/text-impl.js.map +0 -1
  273. package/lib/framework/impl/text/track-run-impl.js +0 -112
  274. package/lib/framework/impl/text/track-run-impl.js.map +0 -1
  275. package/lib/framework/notify.js +0 -116
  276. package/lib/framework/notify.js.map +0 -1
  277. package/lib/framework/range-util.js +0 -312
  278. package/lib/framework/range-util.js.map +0 -1
  279. package/lib/framework/render-context.js +0 -384
  280. package/lib/framework/render-context.js.map +0 -1
  281. package/lib/framework/render-define.js +0 -195
  282. package/lib/framework/render-define.js.map +0 -1
  283. package/lib/framework/selection-overlays.js +0 -124
  284. package/lib/framework/selection-overlays.js.map +0 -1
  285. package/lib/texteditor.js +0 -913
  286. package/lib/texteditor.js.map +0 -1
  287. package/lib/util/subject.js +0 -88
  288. package/lib/util/subject.js.map +0 -1
  289. package/lib/util/table-bind.js +0 -6
  290. package/lib/util/table-bind.js.map +0 -1
@@ -1,1342 +0,0 @@
1
- import { SelectionRange } from "./document-selection";
2
- import { ElementUtil } from "./element-util";
3
- import { BlockContainerElement, BlockContentElement, BranchElement, DocMode, InlineGroupElement, LeafElement } from "./element-define";
4
- import { TextGroupElement } from "./impl/text/text-impl";
5
- import { PSymbolElement } from "./impl/symbol/p-symbol-impl";
6
- import { ParagraphElement } from "./impl/paragraph/p-impl";
7
- import { RangeUtil } from "./range-util";
8
- import { TableElement } from "./impl/table/table-impl";
9
- import { DocumentEvent } from "./document-event";
10
- import { KeyboradElementEvent } from "./element-event-define";
11
- import { ElementSerialize } from "./element-serialize";
12
- import { BreakElement } from "./impl/symbol/br-symbol-impl";
13
- import { DataDecorateElement } from "./impl/data-element/data-decorate-impl";
14
- import { DataElementInlineGroup, InlineGroupInputElement, IsInSideDataElement, IsInSideInlineGroupInputElement } from "./impl/data-element/data-element-base-impl";
15
- import { CommentElement } from "./impl/comments/comment-element-impl";
16
- import { nanoid } from "nanoid";
17
- import { CommContentElement } from "./impl/comments/comment-content-impl";
18
- import { ValidateElement } from "./impl/comments/validate-msg-impl";
19
- import { CommonUtil } from "./common-util";
20
- import { TrackRunElement, TrackRunTypeEnum } from "./impl/text/track-run-impl";
21
- import { DocumentBodyElement } from "./impl/document/doc-body-impl";
22
- /**
23
- * 文档内容改变
24
- */
25
- export class DocumentChange {
26
- selectionState;
27
- viewOptions;
28
- eleReader;
29
- docCtx;
30
- docComment;
31
- constructor(selectionState, viewOptions, eleReader, docCtx, docComment) {
32
- this.selectionState = selectionState;
33
- this.viewOptions = viewOptions;
34
- this.eleReader = eleReader;
35
- this.docCtx = docCtx;
36
- this.docComment = docComment;
37
- }
38
- newInput(data) {
39
- const { startControl, startOffset, collapsed, enableTrackChanges } = this.selectionState;
40
- if (!collapsed) {
41
- this.onInputBySelection(data);
42
- return;
43
- }
44
- //判断是否需要创建新的留痕区域
45
- if (enableTrackChanges && !this.isInCorrectTrackRegion(startControl, TrackRunTypeEnum.Inserted)) {
46
- this.newInputTrackChanges(data, startControl, startOffset);
47
- return;
48
- }
49
- //当前输入节点是在留痕区域中,但是当前关闭了审阅模式,需要拆分留痕区域,创建新输入节点
50
- if (!enableTrackChanges && this.isInTrackBlock(startControl)) {
51
- const newInput = this.splitTrackElement(startControl, startOffset);
52
- const comp = data.compositionStartInfo;
53
- comp.element = newInput;
54
- comp.offset = 0;
55
- this.inputTextGroup(newInput, data);
56
- return;
57
- }
58
- if (!(startControl instanceof TextGroupElement)) {
59
- if (!data.compositionStartInfo) {
60
- throw new Error('compositionStartInfo is null');
61
- }
62
- const siblingTextEle = startOffset === 1 ? ElementUtil.getNextSiblingElement(startControl) : ElementUtil.getPrevSiblingElement(startControl);
63
- if (siblingTextEle instanceof TextGroupElement) {
64
- data.compositionStartInfo.offset = startOffset === 0 ? siblingTextEle.text.length : 0;
65
- this.inputTextGroup(siblingTextEle, data);
66
- }
67
- else {
68
- const inputTextProps = this.getDefaultTextProps(startControl, startOffset);
69
- const newTextGroup = ElementUtil.getNewTextGroup(inputTextProps);
70
- startControl.parent.addChild(newTextGroup, startControl.getIndex() + startOffset);
71
- this.inputTextGroup(newTextGroup, data);
72
- }
73
- return;
74
- }
75
- this.inputTextGroup(startControl, data);
76
- }
77
- /**
78
- * 选中区域后进行输入
79
- * 需要处理将选中的区域删除后,进行输入的情况
80
- */
81
- onInputBySelection(data) {
82
- this.onRangeDelete();
83
- this.selectionState.afterSelectionChanged = (newVal) => {
84
- const { startControl, startOffset, editable } = newVal;
85
- if (!editable) {
86
- return false;
87
- }
88
- const comp = data.compositionStartInfo;
89
- comp.element = startControl;
90
- comp.offset = startOffset;
91
- this.newInput(data);
92
- return true;
93
- };
94
- }
95
- /**
96
- * 当前元素是否在正确的留痕区域(ins-run、del-run),情况分为以下情况
97
- * 1.留痕块类型为新增,但是留痕块的创建者为其他用户,此时需要拆分留痕区域
98
- * 2.留痕块为当前用户创建,但是创建时间大于有效的时间,此时需要拆分留痕区域
99
- * @param startControl
100
- * @param trackType
101
- * @returns
102
- */
103
- isInCorrectTrackRegion(startControl, trackType) {
104
- const parent = startControl.parent;
105
- return parent instanceof TrackRunElement
106
- && parent.props.userId === this.viewOptions.editUser.id
107
- && parent.type === trackType
108
- && CommonUtil.getNowDiffSeconds(parent.props.date) <= this.viewOptions.trackChangePeriod;
109
- }
110
- /**
111
- * 当前元素是否在留痕区域(ins-run、del-run)中
112
- * @param target
113
- * @param trackType
114
- * @returns
115
- */
116
- isInTrackBlock(target, trackType = null) {
117
- return target.parent instanceof TrackRunElement && (trackType === null || target.parent.type === trackType);
118
- }
119
- /**
120
- * 留痕输入
121
- * @param data
122
- * @param startControl
123
- * @param startOffset
124
- * @returns
125
- */
126
- newInputTrackChanges(data, startControl, startOffset) {
127
- const userId = this.viewOptions.editUser.id;
128
- const compInfo = data.compositionStartInfo;
129
- if (this.isInCorrectTrackRegion(startControl, TrackRunTypeEnum.Inserted)) {
130
- return;
131
- }
132
- if (this.isInTrackBlock(startControl)) {
133
- const newInput = this.createNewTrackInput(startControl, startOffset, TrackRunTypeEnum.Inserted);
134
- compInfo.offset = 0;
135
- compInfo.element = newInput;
136
- this.inputTextGroup(newInput, data);
137
- return;
138
- }
139
- else {
140
- const { trackElement, newTextGroup } = this.createTextTrackElement(startControl, null, TrackRunTypeEnum.Inserted);
141
- this.insertElement(startControl, startOffset, [trackElement]);
142
- compInfo.offset = 0;
143
- compInfo.element = newTextGroup;
144
- this.inputTextGroup(newTextGroup, data);
145
- return;
146
- }
147
- }
148
- /**
149
- * 创建新的留痕块,并返回留痕块输入定位文本
150
- * @param startControl
151
- * @param startOffset
152
- * @param trackType
153
- * @returns
154
- */
155
- createNewTrackInput(startControl, startOffset, trackType) {
156
- const textProps = this.getDefaultTextProps(startControl, startOffset);
157
- const currTrackEle = startControl.parent;
158
- if (startControl instanceof TextGroupElement && startOffset > 0 && startOffset < startControl.textMeasures.length) {
159
- const splitText = startControl.spliceText(startOffset, startControl.textMeasures.length, true);
160
- startControl.parent.addChild(splitText, startControl.getIndex() + 1);
161
- startOffset = startControl.textMeasures.length;
162
- }
163
- startOffset = startOffset > 0 ? 1 : 0;
164
- const index = startControl.getIndex() + startOffset;
165
- //切割留痕块
166
- if (index > 0 && index < currTrackEle.length) {
167
- const splitTrack = currTrackEle.split(startControl.getIndex() + startOffset);
168
- currTrackEle.parent.addChild(splitTrack, currTrackEle.getIndex() + 1);
169
- const { trackElement, newTextGroup } = this.createTextTrackElement(startControl, textProps, trackType);
170
- currTrackEle.parent.addChild(trackElement, currTrackEle.getIndex() + 1);
171
- return newTextGroup;
172
- }
173
- else {
174
- const { trackElement, newTextGroup } = this.createTextTrackElement(startControl, textProps, trackType);
175
- currTrackEle.parent.addChild(trackElement, currTrackEle.getIndex() + (index === 0 ? 0 : 1));
176
- return newTextGroup;
177
- }
178
- }
179
- /**
180
- * 获取当前输入节点的文本属性
181
- * @param startControl
182
- * @returns
183
- */
184
- getDefaultTextProps(startControl, offset) {
185
- const para = ElementUtil.getParentByType(startControl, ParagraphElement);
186
- let textProps = para.props.textProps;
187
- if (startControl instanceof TextGroupElement) {
188
- textProps = startControl.props;
189
- }
190
- const dataEle = ElementUtil.getDataElement(startControl);
191
- if (dataEle && IsInSideDataElement(startControl, offset)) {
192
- return dataEle.props.valueTextProps;
193
- }
194
- return textProps;
195
- }
196
- /**
197
- * 当前元素位于留痕区域内,但是当前编辑模式为非留痕模式,需要将当前留痕元素分割开来,插入新普通文本元素对象,并返回
198
- * @param startControl
199
- * @param startOffset
200
- * @returns
201
- */
202
- splitTrackElement(startControl, startOffset) {
203
- if (!(startControl.parent instanceof TrackRunElement) && startControl instanceof TextGroupElement) {
204
- return startControl;
205
- }
206
- const textProps = this.getDefaultTextProps(startControl, startOffset);
207
- const currTrackEle = startControl.parent;
208
- if (startControl instanceof TextGroupElement && startOffset > 0 && startOffset < startControl.textMeasures.length) {
209
- const splitText = startControl.spliceText(startOffset, startControl.textMeasures.length, true);
210
- startControl.parent.addChild(splitText, startControl.getIndex() + 1);
211
- startOffset = startControl.textMeasures.length;
212
- }
213
- startOffset = startOffset > 0 ? 1 : 0;
214
- const index = startControl.getIndex() + startOffset;
215
- if (index > 0 && index < currTrackEle.length) {
216
- const splitTrack = currTrackEle.split(startControl.getIndex() + startOffset);
217
- currTrackEle.parent.addChild(splitTrack, currTrackEle.getIndex() + 1);
218
- const newInput = ElementUtil.getNewTextGroup(textProps);
219
- currTrackEle.parent.addChild(newInput, currTrackEle.getIndex() + 1);
220
- return this.splitTrackElement(newInput, 0);
221
- }
222
- else {
223
- const newInput = ElementUtil.getNewTextGroup(textProps);
224
- currTrackEle.parent.addChild(newInput, currTrackEle.getIndex() + (index === 0 ? 0 : 1));
225
- return this.splitTrackElement(newInput, 0);
226
- }
227
- }
228
- /**
229
- * 创建插入(ins-run) 留痕,并且返回留痕的文本元素对象
230
- * @param startControl
231
- * @returns
232
- */
233
- createTextTrackElement(startControl, textProps, trackType) {
234
- const para = ElementUtil.getParentByType(startControl, ParagraphElement);
235
- const trackElement = this.createTrackElement(trackType);
236
- textProps = textProps || para.props.textProps;
237
- const newTextGroup = ElementUtil.getNewTextGroup(textProps);
238
- newTextGroup.props.color = '#ff4d4f';
239
- trackElement.addChild(newTextGroup);
240
- return {
241
- trackElement,
242
- newTextGroup
243
- };
244
- }
245
- createTrackElement(trackType) {
246
- const trackElement = new TrackRunElement(trackType);
247
- trackElement.props.userId = this.viewOptions.editUser.id;
248
- trackElement.props.userName = this.viewOptions.editUser.name;
249
- trackElement.props.date = CommonUtil.formatNow('YYYY-MM-DD HH:mm:ss');
250
- trackElement.props.id = nanoid(5);
251
- return trackElement;
252
- }
253
- inputTextGroup(text, data) {
254
- const prevInputData = data.prevInputData || '';
255
- const prevInputDataLength = prevInputData.length;
256
- if (!data.compositionStartInfo) {
257
- throw new Error('compositionStartInfo is null');
258
- }
259
- const { element, offset } = data.compositionStartInfo;
260
- let startInputOffset = offset;
261
- //startInputOffset -= prevInputDataLength;
262
- if (!(element instanceof TextGroupElement)) {
263
- //当前选中元素位于输入元素是起始还是结束位置,如果位于起始位置,则输入偏移量为0,否则为未变更之前的内容length
264
- if (ElementUtil.getNextSiblingElement(element) === text) {
265
- startInputOffset = 0;
266
- }
267
- else {
268
- startInputOffset = text.textMeasures.length - prevInputDataLength;
269
- }
270
- }
271
- text.splice(startInputOffset, prevInputDataLength, data.data);
272
- //输入后撤销,导致文本组内为空
273
- if (!text.text.length) {
274
- this.removeEmptyText(text);
275
- }
276
- else {
277
- this.selectionState.resetRange(text, startInputOffset + data.data.length);
278
- }
279
- }
280
- /**
281
- * backspace,向前删除
282
- */
283
- onBackspace(evt) {
284
- const { startControl, startOffset, collapsed } = this.selectionState;
285
- if (!startControl) {
286
- throw new Error('startControl is null');
287
- }
288
- const eventElement = new KeyboradElementEvent(this.docCtx);
289
- eventElement.key = 'backspace';
290
- eventElement.source = startControl;
291
- eventElement.sourceEvent = evt;
292
- eventElement.sourceOffset = startOffset;
293
- const res = DocumentEvent.invokeEvent('BackspaceKey', startControl, eventElement, 'Capture', this.docCtx);
294
- if (res && res.isCancel) {
295
- return;
296
- }
297
- this.docComment.updateComments();
298
- if (collapsed) {
299
- this.onBackspaceElement(startControl, startOffset);
300
- }
301
- else {
302
- this.onRangeDelete();
303
- }
304
- }
305
- /**
306
- * delete,向后删除
307
- * @param evt
308
- */
309
- onDeleteKeyHandler(evt) {
310
- const { startControl, startOffset, collapsed } = this.selectionState;
311
- const eventElement = new KeyboradElementEvent(this.docCtx);
312
- eventElement.key = 'delete';
313
- eventElement.source = startControl;
314
- eventElement.sourceEvent = evt;
315
- eventElement.sourceOffset = startOffset;
316
- const res = DocumentEvent.invokeEvent('DeleteKey', startControl, eventElement, 'Capture', this.docCtx);
317
- if (res && res.isCancel) {
318
- return;
319
- }
320
- if (collapsed) {
321
- this.onKeyDeleteElement(startControl, startOffset);
322
- }
323
- else {
324
- this.onRangeDelete();
325
- }
326
- }
327
- /**
328
- * 根据选择范围删除
329
- */
330
- onRangeDelete() {
331
- const { selectedRange } = this.selectionState;
332
- if (!selectedRange) {
333
- throw new Error('selectionRange is null');
334
- }
335
- //用于刷新后定位光标
336
- let startPointElement;
337
- let startPointOffset = 0;
338
- if (selectedRange.isFullSelected) {
339
- //某个容器的内容被全部选中
340
- if (selectedRange.target instanceof BlockContainerElement) {
341
- startPointElement = selectedRange.target;
342
- startPointOffset = 0;
343
- }
344
- //内容块被选中,需要向上寻找内容块容器
345
- else if (selectedRange.target instanceof BlockContentElement) {
346
- const parentContainer = ElementUtil.getParent(selectedRange.target, (item) => item instanceof BlockContainerElement);
347
- if (parentContainer) {
348
- startPointElement = parentContainer;
349
- startPointOffset = 0;
350
- }
351
- else {
352
- throw new Error('未能向上寻找到定位的内容块容器');
353
- }
354
- }
355
- else {
356
- throw new Error('未知条件区间');
357
- }
358
- }
359
- else {
360
- const startRange = RangeUtil.getStartRangeTarget(selectedRange);
361
- const endRange = RangeUtil.getEndRangeTarget(selectedRange);
362
- if (startRange.isFullSelected) {
363
- startPointElement = ElementUtil.getRecursionPrevSiblingElement(startRange.target, false, true);
364
- startPointOffset = -1;
365
- //判断结束选区和开始选区是否在一个段落中,尽量落在同一段落中
366
- if (!startPointElement || ElementUtil.isInSameParagraph(startRange.target, endRange.target)) {
367
- if (!endRange.isFullSelected) {
368
- startPointElement = endRange.target;
369
- startPointOffset = 0;
370
- }
371
- }
372
- }
373
- else {
374
- startPointElement = startRange.target;
375
- startPointOffset = startRange.startOffset;
376
- }
377
- }
378
- if (this.viewOptions.docMode === DocMode.FormEdit) {
379
- this.deleteRangeInFormEdit(selectedRange);
380
- }
381
- else {
382
- this.deleteRange(selectedRange);
383
- }
384
- this.selectionState.resetRange(startPointElement, startPointOffset);
385
- return { cursorEle: startPointElement, cursorOffset: startPointOffset };
386
- }
387
- /**
388
- * backspace删除
389
- * @param control
390
- * @param offset
391
- * @returns
392
- */
393
- onBackspaceElement(control, offset) {
394
- this.selectionState.clear();
395
- if (offset === 0) {
396
- const prevEle = ElementUtil.getRecursionPrevSiblingElement(control, false, true);
397
- if (!prevEle) {
398
- this.selectionState.resetRange(control, 0);
399
- return;
400
- }
401
- if (ElementUtil.isInSameParagraph(control, prevEle)) {
402
- if (ElementUtil.getPrevSiblingElement(control) === prevEle) {
403
- this.onBackspaceElement(prevEle, ElementUtil.getElementEndOffset(prevEle));
404
- }
405
- else {
406
- this.selectionState.resetRange(prevEle, -1);
407
- }
408
- }
409
- else {
410
- //需要判断是否是兄弟段落,兄弟段落,需要合并
411
- const prevPara = ElementUtil.getParentByType(prevEle, ParagraphElement);
412
- const currPara = ElementUtil.getParentByType(control, ParagraphElement);
413
- //表明是紧挨着的两个段落,要进行段落合并
414
- if (ElementUtil.getPrevSiblingElement(currPara) === prevPara) {
415
- if (this.selectionState.enableTrackChanges) {
416
- this.selectionState.resetRange(prevEle, -1);
417
- return;
418
- }
419
- this.combineParagraph(prevPara, currPara, control);
420
- }
421
- else {
422
- //不是紧挨着的段落,则前一个段落是位于另一个容器里,例如:处于单元格内的段落
423
- //则不向前定位
424
- this.selectionState.resetRange(control, offset);
425
- }
426
- }
427
- }
428
- else {
429
- if (control instanceof TextGroupElement) {
430
- this.onDeleteText(control, offset - 1, 1);
431
- if (!control.textMeasures.length) {
432
- this.removeEmptyText(control);
433
- }
434
- else {
435
- this.selectionState.resetRange(control, offset - 1);
436
- }
437
- }
438
- else {
439
- if (control.parent instanceof InlineGroupInputElement && control instanceof DataDecorateElement) {
440
- const dataEle = control.parent;
441
- //空数据元,并且当前光标处于数据元开始位置
442
- if (this.canDeleteInlineGroup(dataEle)) {
443
- this.setCurosrForDeleteAction(dataEle);
444
- dataEle.remove();
445
- return;
446
- }
447
- if (control.isPrefix && this.viewOptions.docMode === DocMode.FormEdit) {
448
- if (this.jumpToPrevDataElement(dataEle)) {
449
- return;
450
- }
451
- }
452
- }
453
- if (control.isDecorate) {
454
- this.onBackspaceElement(control, 0);
455
- return;
456
- }
457
- this.removeElement(control);
458
- }
459
- }
460
- }
461
- /**
462
- * 跳到上一个数据元中
463
- * @param currEle
464
- */
465
- jumpToPrevDataElement(currEle) {
466
- if (this.viewOptions.docMode !== DocMode.FormEdit) {
467
- return false;
468
- }
469
- const prevEle = ElementUtil.getPrevDataElement(this.docCtx, currEle);
470
- if (!prevEle) {
471
- return false;
472
- }
473
- if (prevEle) {
474
- this.selectionState.resetRange(prevEle.endDecorate, 0);
475
- return true;
476
- }
477
- return false;
478
- }
479
- /**
480
- * delete删除
481
- * @param control
482
- * @param offset
483
- * @returns
484
- */
485
- onKeyDeleteElement(control, offset) {
486
- this.selectionState.clear();
487
- if (offset === ElementUtil.getElementEndOffset(control)) {
488
- const nextEle = ElementUtil.getRecursionNextSiblingElement(control, false, true);
489
- if (!nextEle) {
490
- this.selectionState.resetRange(control, -1);
491
- return;
492
- }
493
- if (ElementUtil.isInSameParagraph(control, nextEle)) {
494
- if (ElementUtil.getNextSiblingElement(control) === nextEle) {
495
- this.onKeyDeleteElement(nextEle, 0);
496
- }
497
- else {
498
- this.selectionState.resetRange(nextEle, 0);
499
- }
500
- }
501
- else {
502
- //需要判断是否是兄弟段落,兄弟段落,需要合并
503
- const nextPara = ElementUtil.getParentByType(nextEle, ParagraphElement);
504
- const currPara = ElementUtil.getParentByType(control, ParagraphElement);
505
- //表明是紧挨着的两个段落,要进行段落合并
506
- if (ElementUtil.getNextSiblingElement(currPara) === nextPara) {
507
- if (this.selectionState.enableTrackChanges) {
508
- this.selectionState.resetRange(nextEle, 0);
509
- return;
510
- }
511
- this.combineParagraph(nextPara, currPara, control);
512
- }
513
- else {
514
- //不是紧挨着的段落,则前一个段落是位于另一个容器里,例如:处于单元格内的段落
515
- //则不向前定位
516
- this.selectionState.resetRange(control, offset);
517
- }
518
- }
519
- }
520
- else {
521
- if (control instanceof TextGroupElement) {
522
- this.onDeleteText(control, offset, 1);
523
- if (!control.textMeasures.length) {
524
- this.removeEmptyText(control);
525
- }
526
- else {
527
- this.selectionState.resetRange(control, offset);
528
- }
529
- }
530
- else {
531
- if (control.parent instanceof DataElementInlineGroup && control instanceof DataDecorateElement) {
532
- const dataEle = control.parent;
533
- //空数据元,并且当前光标处于数据元开始位置
534
- if (control.isPrefix) {
535
- if (this.canDeleteInlineGroup(dataEle)) {
536
- this.setCurosrForDeleteAction(dataEle);
537
- dataEle.remove();
538
- }
539
- else {
540
- this.selectionState.resetRange(control, -1);
541
- }
542
- return;
543
- }
544
- else if (!control.isPrefix && dataEle.length === 2) {
545
- this.selectionState.resetRange(dataEle.endDecorate, -1);
546
- return;
547
- }
548
- }
549
- if (control.isDecorate) {
550
- //this.onKeyDeleteElement(control, -1);
551
- return;
552
- }
553
- this.removeElement(control);
554
- }
555
- }
556
- }
557
- /**
558
- * 判断是否可以删除数据组
559
- * @param dataEle
560
- * @private
561
- */
562
- canDeleteInlineGroup(dataEle) {
563
- if (this.viewOptions.docMode === DocMode.FormEdit) {
564
- return false;
565
- }
566
- return dataEle.length === 2;
567
- }
568
- onDeleteText(text, offset, len) {
569
- if (this.selectionState.enableTrackChanges) {
570
- this.updateDeletedTrackText(text, offset, len);
571
- }
572
- else {
573
- text.splice(offset, len);
574
- }
575
- }
576
- onDeleteItem(item) {
577
- if (this.selectionState.enableTrackChanges) {
578
- //删除符号不进行留痕
579
- if (item.type === 'psym') {
580
- return;
581
- }
582
- this.onTrackDeleteElement(item);
583
- }
584
- else {
585
- item.remove();
586
- item.destroy();
587
- }
588
- }
589
- /**
590
- * 当前元素是否在留痕元素内
591
- * @param target
592
- * @param trackType
593
- * @returns
594
- */
595
- isInCurrentUserTrack(target, trackType) {
596
- if (target.parent instanceof TrackRunElement && target.parent.type === trackType && target.parent.props.userId === this.viewOptions.editUser.id) {
597
- return true;
598
- }
599
- return false;
600
- }
601
- isInTrackElement(target, trackType) {
602
- if (target.parent instanceof TrackRunElement && target.parent.type === trackType) {
603
- return true;
604
- }
605
- return false;
606
- }
607
- /**
608
- * 留痕除文本以外的其他元素
609
- * @param control
610
- */
611
- onTrackDeleteElement(target) {
612
- const parent = target.parent;
613
- if (this.isInTrackElement(target, TrackRunTypeEnum.Deleted)) {
614
- return;
615
- }
616
- //当前用户增加的内容,内容直接删除不需要留痕
617
- if (this.isInCurrentUserTrack(target, TrackRunTypeEnum.Inserted)) {
618
- target.remove();
619
- this.removeEmtpyInlineBlock(parent);
620
- return;
621
- }
622
- //target.remove();
623
- const trackEle = this.getNextTrackElement(target, TrackRunTypeEnum.Deleted);
624
- trackEle.addChild(target.clone(true), 0);
625
- target.remove();
626
- this.removeEmtpyInlineBlock(parent);
627
- }
628
- /**
629
- * 更新文本删除留痕
630
- */
631
- updateDeletedTrackText(target, offset, len) {
632
- if (this.isInTrackElement(target, TrackRunTypeEnum.Deleted)) {
633
- return;
634
- }
635
- //当前用户增加的内容,当前用户删除时不需要留痕
636
- if (this.isInCurrentUserTrack(target, TrackRunTypeEnum.Inserted)) {
637
- target.splice(offset, len);
638
- return;
639
- }
640
- //全部被删除
641
- if (offset === 0 && len === target.textMeasures.length) {
642
- const trackInputText = this.getNextTrackInputElement(target, TrackRunTypeEnum.Deleted);
643
- trackInputText.text = target.text + trackInputText.text;
644
- target.splice(0, target.textMeasures.length);
645
- //target.remove();
646
- return;
647
- }
648
- const { leftElement } = this.splitText(target, offset + len);
649
- target = leftElement;
650
- let trackText = this.getNextTrackInputElement(target, TrackRunTypeEnum.Deleted);
651
- const spText = target.spliceText(target.textMeasures.length - len, target.textMeasures.length, true);
652
- trackText.splice(0, 0, spText?.text);
653
- }
654
- getNextTrackInputElement(target, trackType) {
655
- const trackElement = ElementUtil.getNextSiblingTrackElement(target, trackType, this.viewOptions.editUser.id);
656
- if (trackElement) {
657
- const firstEle = trackElement.getChild(0);
658
- if (firstEle && firstEle instanceof TextGroupElement) {
659
- return firstEle;
660
- }
661
- else {
662
- const newInput = new TextGroupElement();
663
- trackElement.addChild(newInput, 0);
664
- target.props.clone(newInput.props);
665
- return newInput;
666
- }
667
- }
668
- else {
669
- const { trackElement, newTextGroup } = this.createTextTrackElement(target, target.props, TrackRunTypeEnum.Deleted);
670
- target.parent.addChild(trackElement, target.getIndex() + 1);
671
- return newTextGroup;
672
- }
673
- }
674
- getNextTrackElement(target, trackType) {
675
- let trackElement = ElementUtil.getNextSiblingTrackElement(target, trackType, this.viewOptions.editUser.id);
676
- if (!trackElement) {
677
- trackElement = this.createTrackElement(trackType);
678
- target.parent.addChild(trackElement, target.getIndex() + 1);
679
- }
680
- return trackElement;
681
- }
682
- /**
683
- * 删除元素并定位光标
684
- * @param control
685
- * @returns
686
- */
687
- removeElement(control) {
688
- const prevEle = ElementUtil.getRecursionPrevSiblingElement(control, false, true);
689
- if (!prevEle) {
690
- const nextEle = ElementUtil.getRecursionNextSiblingElement(control, true, true);
691
- if (nextEle) {
692
- this.selectionState.resetRange(nextEle, 0);
693
- control.remove();
694
- return;
695
- }
696
- return;
697
- }
698
- if (ElementUtil.isInSameParagraph(control, prevEle)) {
699
- this.selectionState.resetRange(prevEle, -1);
700
- control.remove();
701
- return;
702
- }
703
- else {
704
- const nextEle = ElementUtil.getRecursionNextSiblingElement(control, true, true);
705
- if (nextEle && ElementUtil.getPrevSiblingElement(nextEle) === control) {
706
- this.selectionState.resetRange(nextEle, 0);
707
- control.remove();
708
- return;
709
- }
710
- else {
711
- this.selectionState.resetRange(prevEle, -1);
712
- control.remove();
713
- return;
714
- }
715
- }
716
- }
717
- /**
718
- * 回车事件
719
- */
720
- onEnter() {
721
- const { startControl } = this.selectionState;
722
- const paragraph = ElementUtil.getParentByType(startControl, ParagraphElement);
723
- const breakPara = this.splitCurrentParagraph();
724
- //选中的是一个元素
725
- if (breakPara === paragraph) {
726
- const clonePara = paragraph.clone(false);
727
- breakPara.parent.addChild(clonePara, breakPara.getIndex());
728
- }
729
- this.selectionState.resetRange(breakPara, 0);
730
- }
731
- /**
732
- * 插入表格
733
- * @param tb
734
- * @returns
735
- */
736
- insertTable(tb) {
737
- const breakPara = this.splitCurrentParagraph();
738
- breakPara.parent.addChild(tb, breakPara.getIndex());
739
- this.selectionState.resetRange(tb, 0);
740
- }
741
- /**
742
- * 分割当前段落用于插入表格或者粘贴的内容
743
- * @param insertItems 分割后插入的内容,内容需要是block或者表格对象
744
- */
745
- splitCurrentParagraph() {
746
- const { startControl, startOffset } = this.selectionState;
747
- const paragraph = ElementUtil.getParentByType(startControl, ParagraphElement);
748
- const paraContainer = paragraph.parent;
749
- //如果选中的是段落第一个元素
750
- const firstLeaf = ElementUtil.getFirstLeafElement(paragraph);
751
- if ((startControl === firstLeaf && startOffset === 0) || (startControl === firstLeaf && startControl instanceof PSymbolElement)) {
752
- //this.selectionState.resetRange(paragraph, 0);
753
- return paragraph;
754
- }
755
- const last = ElementUtil.getLastLeafElement(paragraph);
756
- const selectedParaRange = RangeUtil.getSelctionRange(startControl, startOffset, last, 1, paragraph);
757
- selectedParaRange.isFullSelected = false;
758
- const breakPara = ElementUtil.cloneRange(selectedParaRange, true);
759
- ElementUtil.fixParagraphContent(paragraph);
760
- ElementUtil.fixParagraphContent(breakPara);
761
- paraContainer.addChild(breakPara, paragraph.getIndex() + 1);
762
- //paraContainer.addChild(tb, breakPara.getIndex());
763
- //this.selectionState.resetRange(breakPara, 0);
764
- return breakPara;
765
- }
766
- /**
767
- * 合并段落
768
- */
769
- combineParagraph(prevPara, currPara, currElement) {
770
- const prevParaLength = prevPara.length;
771
- for (let i = 0; i < currPara.length; i++) {
772
- const child = currPara.getChild(i).clone(true);
773
- prevPara.addChild(child);
774
- }
775
- //currPara.remove();
776
- const currParaContainer = currPara.parent;
777
- currPara.destroy();
778
- currParaContainer.removeChild(currPara);
779
- this.selectionState.resetRange(prevPara.getChild(prevParaLength), 0);
780
- }
781
- /**
782
- * 删除选中的区域内容
783
- * @param range
784
- */
785
- deleteRange(range) {
786
- const { selectedChildren } = range;
787
- for (let i = selectedChildren.length - 1; i >= 0; i--) {
788
- const childRange = selectedChildren[i];
789
- const { target: childTarget, isFullSelected: childFullSelected } = childRange;
790
- if (childTarget instanceof LeafElement && !childTarget.isDecorate) {
791
- if (childFullSelected) {
792
- this.onDeleteItem(childTarget);
793
- }
794
- else if (childTarget instanceof TextGroupElement) {
795
- const { startOffset, endOffset } = childRange;
796
- this.onDeleteText(childTarget, startOffset, endOffset - startOffset);
797
- }
798
- }
799
- else if (childTarget instanceof BranchElement) {
800
- //留痕模式
801
- if (this.selectionState.enableTrackChanges) {
802
- this.deleteRange(childRange);
803
- }
804
- else {
805
- //表格全选状态时,执行删除操作
806
- if (childTarget instanceof TableElement && childFullSelected) {
807
- childTarget.remove();
808
- childTarget.destroy();
809
- }
810
- //段落全选状态时,执行删除操作
811
- else if (childTarget instanceof BlockContentElement && childFullSelected) {
812
- childTarget.remove();
813
- childTarget.destroy();
814
- }
815
- else if (childTarget instanceof InlineGroupElement && childFullSelected) {
816
- childTarget.remove();
817
- childTarget.destroy();
818
- }
819
- else {
820
- this.deleteRange(childRange);
821
- }
822
- }
823
- }
824
- }
825
- }
826
- /**
827
- * 表单区域删除处理
828
- * @param range
829
- * @returns
830
- */
831
- deleteRangeInFormEdit(range) {
832
- const dataElement = ElementUtil.getDataElement(range.target);
833
- //在数据元内删除,调用普通的删除处理
834
- if (dataElement) {
835
- this.deleteRange(range);
836
- return;
837
- }
838
- //在数据元外删除
839
- else {
840
- this.loopForDelDataEleRange(range);
841
- }
842
- }
843
- /**
844
- * 表单模式:删除选中的区域内容
845
- */
846
- loopForDelDataEleRange(range) {
847
- const { selectedChildren } = range;
848
- for (let i = selectedChildren.length - 1; i >= 0; i--) {
849
- const childRange = selectedChildren[i];
850
- const { target: childTarget } = childRange;
851
- if (childTarget instanceof BranchElement) {
852
- if (childTarget instanceof DataElementInlineGroup) {
853
- const dataEleProps = childTarget.props;
854
- //数据元可编辑
855
- if (dataEleProps.editable) {
856
- this.deleteRange(childRange);
857
- }
858
- }
859
- else {
860
- this.loopForDelDataEleRange(childRange);
861
- }
862
- }
863
- }
864
- }
865
- /**
866
- * 向目标移动元素
867
- * @param sourceElement
868
- * @param moveElement
869
- */
870
- moveElement(targetElement, targetOffset, moveElement, moveOffset, ss) {
871
- moveElement.remove();
872
- if (targetElement instanceof TextGroupElement) {
873
- const { leftElement, rightElement } = this.splitText(targetElement, targetOffset);
874
- if (leftElement) {
875
- leftElement.parent.addChild(moveElement, leftElement.getIndex() + 1);
876
- }
877
- else if (rightElement) {
878
- rightElement.parent.addChild(moveElement, rightElement.getIndex());
879
- }
880
- }
881
- else {
882
- targetElement.parent.addChild(moveElement, targetElement.getIndex() + targetOffset);
883
- }
884
- ss.resetRange(moveElement, moveOffset);
885
- }
886
- /**
887
- * 向指定的目标插入元素
888
- * @param targetElement
889
- * @param targetOffset
890
- * @param destEleArray
891
- */
892
- insertElement(targetElement, targetOffset, destEleArray) {
893
- let lastEle;
894
- if (targetElement instanceof TextGroupElement) {
895
- const { leftElement, rightElement } = this.splitText(targetElement, targetOffset);
896
- if (leftElement) {
897
- for (let i = 0; i < destEleArray.length; i++) {
898
- lastEle = destEleArray[i];
899
- leftElement.parent.addChild(lastEle, leftElement.getIndex() + 1 + i);
900
- }
901
- }
902
- else if (rightElement) {
903
- for (let i = 0; i < destEleArray.length; i++) {
904
- lastEle = destEleArray[i];
905
- rightElement.parent.addChild(lastEle, rightElement.getIndex());
906
- }
907
- }
908
- }
909
- else {
910
- for (let i = 0; i < destEleArray.length; i++) {
911
- lastEle = destEleArray[i];
912
- targetElement.parent.addChild(lastEle, targetElement.getIndex() + targetOffset);
913
- }
914
- }
915
- return lastEle;
916
- }
917
- /**
918
- * 根据开始位置和结束位置,将字符切割成指定的区间
919
- * @param splitTextUnit
920
- * @param start
921
- * @param end
922
- * @returns
923
- */
924
- static splitTextGroupByRange(text, start, end) {
925
- end = end === -1 ? text.textMeasures.length : end;
926
- if (start === end) {
927
- return null;
928
- }
929
- if (start === 0 && end === text.textMeasures.length) {
930
- return text;
931
- }
932
- if (start === text.textMeasures.length) {
933
- return null;
934
- }
935
- let lastTextGroup = text.spliceText(end, -1, true);
936
- let middleTextGroup = text.spliceText(start, -1, true);
937
- if (lastTextGroup) {
938
- text.parent.addChild(lastTextGroup, text.getIndex() + 1);
939
- }
940
- if (!middleTextGroup) {
941
- throw new Error('middleText is null');
942
- }
943
- text.parent.addChild(middleTextGroup, text.getIndex() + 1);
944
- if (text.textMeasures.length === 0) {
945
- text.remove();
946
- text.destroy();
947
- }
948
- return middleTextGroup;
949
- }
950
- splitText(text, offset) {
951
- offset = offset == -1 ? text.textMeasures.length : offset;
952
- if (offset === text.textMeasures.length) {
953
- return {
954
- leftElement: text,
955
- rightElement: null
956
- };
957
- }
958
- if (offset === 0) {
959
- return {
960
- leftElement: null,
961
- rightElement: text
962
- };
963
- }
964
- const rightText = text.spliceText(offset, -1, true);
965
- if (rightText) {
966
- text.parent.addChild(rightText, text.getIndex() + 1);
967
- }
968
- let leftText = text;
969
- if (text.textMeasures.length === 0) {
970
- text.remove();
971
- leftText = null;
972
- }
973
- return {
974
- leftElement: leftText,
975
- rightElement: rightText
976
- };
977
- }
978
- /**
979
- * 设置选中的文本样式
980
- * @param ss
981
- * @param setterFunc
982
- * @returns
983
- */
984
- static setTextStyle(ss, setterFunc) {
985
- const range = ss.selectedRange;
986
- if (!range || ss.collapsed) {
987
- return;
988
- }
989
- const newSelectionRange = new SelectionRange();
990
- const startRange = ElementUtil.getFirstSelectedRange(range);
991
- const endRange = ElementUtil.getLastSelectedRange(range);
992
- this.recursionSetRangeTextStyle(range, setterFunc);
993
- if (startRange === endRange) {
994
- if (startRange.isFullSelected) {
995
- newSelectionRange.setStart(startRange.target, 0);
996
- newSelectionRange.setEnd(startRange.target, -1);
997
- }
998
- if (startRange.target instanceof TextGroupElement) {
999
- const startSelectedOffset = ss.startOffset;
1000
- const endSelectedOffset = ss.endOffset;
1001
- const middleElement = this.splitTextGroupByRange(startRange.target, startSelectedOffset, endSelectedOffset);
1002
- if (middleElement) {
1003
- setterFunc(middleElement.props);
1004
- newSelectionRange.setStart(middleElement, 0);
1005
- newSelectionRange.setEnd(middleElement, -1);
1006
- }
1007
- }
1008
- }
1009
- else {
1010
- if (startRange.isFullSelected) {
1011
- newSelectionRange.setStart(startRange.target, 0);
1012
- }
1013
- else {
1014
- if (startRange.target instanceof TextGroupElement) {
1015
- const middleElement = this.splitTextGroupByRange(startRange.target, startRange.startOffset, -1);
1016
- if (middleElement) {
1017
- setterFunc(middleElement.props);
1018
- newSelectionRange.setStart(middleElement, 0);
1019
- }
1020
- else {
1021
- newSelectionRange.setStart(startRange.target, 0);
1022
- }
1023
- }
1024
- else {
1025
- newSelectionRange.setStart(startRange.target, startRange.startOffset);
1026
- }
1027
- }
1028
- if (endRange.isFullSelected) {
1029
- newSelectionRange.setEnd(endRange.target, -1);
1030
- }
1031
- else {
1032
- if (endRange.target instanceof TextGroupElement) {
1033
- const middleElement = this.splitTextGroupByRange(endRange.target, 0, endRange.endOffset);
1034
- if (middleElement) {
1035
- setterFunc(middleElement.props);
1036
- newSelectionRange.setEnd(middleElement, -1);
1037
- }
1038
- else {
1039
- newSelectionRange.setStart(endRange.target, 0);
1040
- }
1041
- }
1042
- else {
1043
- newSelectionRange.setEnd(endRange.target, endRange.endOffset);
1044
- }
1045
- }
1046
- }
1047
- ss.addRange(newSelectionRange);
1048
- }
1049
- static recursionSetRangeTextStyle(range, setterFunc) {
1050
- RangeUtil.recursionTraversalRangeHandler(range, (itemRange) => {
1051
- if (itemRange.target instanceof TextGroupElement && itemRange.isFullSelected) {
1052
- setterFunc(itemRange.target.props);
1053
- }
1054
- });
1055
- }
1056
- static setParaAlign(ss, setterFunc) {
1057
- if (ss.collapsed && ss.startControl) {
1058
- const para = ElementUtil.getParentByType(ss.startControl, ParagraphElement);
1059
- if (para) {
1060
- setterFunc(para.props);
1061
- }
1062
- }
1063
- else {
1064
- const range = ss.selectedRange;
1065
- if (!range) {
1066
- return;
1067
- }
1068
- RangeUtil.recursionTraversalRangeHandler(range, (itemRange) => {
1069
- if (itemRange.target instanceof ParagraphElement) {
1070
- setterFunc(itemRange.target.props);
1071
- }
1072
- });
1073
- }
1074
- }
1075
- /**
1076
- * 复制
1077
- * @param evt
1078
- * @returns
1079
- */
1080
- onCopy(evt) {
1081
- evt.preventDefault();
1082
- const copySerializeStr = ElementSerialize.getSelectedJSON(this.selectionState, this.viewOptions);
1083
- if (!copySerializeStr) {
1084
- return;
1085
- }
1086
- evt.clipboardData?.setData('doc/plain', copySerializeStr);
1087
- const copyStr = ElementSerialize.getSelectedText(this.selectionState, this.viewOptions);
1088
- evt.clipboardData?.setData('text/plain', copyStr);
1089
- }
1090
- /**
1091
- * 剪切
1092
- * @param evt
1093
- */
1094
- onCut(evt) {
1095
- this.onCopy(evt);
1096
- this.onRangeDelete();
1097
- }
1098
- /**
1099
- * 粘贴
1100
- * @param evt
1101
- * @returns
1102
- */
1103
- onPaste(evt) {
1104
- evt.preventDefault();
1105
- let pasteText = evt.clipboardData?.getData('text/plain');
1106
- const pasteData = evt.clipboardData?.getData('doc/plain');
1107
- if (!pasteData) {
1108
- if (pasteText) {
1109
- this.pastePlainText(pasteText);
1110
- }
1111
- return;
1112
- }
1113
- const pasteElement = this.eleReader.readElement(JSON.parse(pasteData));
1114
- if (!pasteElement) {
1115
- console.log('粘贴反序列化数据失败', pasteData);
1116
- return;
1117
- }
1118
- const { collapsed } = this.selectionState;
1119
- let { startControl, startOffset } = this.selectionState;
1120
- if (!collapsed) {
1121
- //TODO:如果一个容器内的元素被全部删除,则返回 null
1122
- // const { cursorEle, cursorOffset } = this.onRangeDelete();
1123
- // startControl = cursorEle;
1124
- // startOffset = cursorOffset;
1125
- }
1126
- if (!startControl) {
1127
- return;
1128
- }
1129
- //表单模式:如果复制的是单格式的文本,需要序列化为纯文本处理
1130
- if (this.viewOptions.docMode === DocMode.FormEdit) {
1131
- const pasteString = ElementSerialize.serializeString(pasteElement, { all: false });
1132
- if (pasteString) {
1133
- this.pastePlainText(pasteString);
1134
- }
1135
- return;
1136
- }
1137
- if (pasteElement instanceof ParagraphElement || pasteElement instanceof InlineGroupElement) {
1138
- const children = [];
1139
- if (pasteElement instanceof ParagraphElement) {
1140
- children.push(...ElementUtil.getChildrenElements(pasteElement));
1141
- }
1142
- else if (pasteElement instanceof InlineGroupElement) {
1143
- children.push(pasteElement);
1144
- }
1145
- if (!children.length) {
1146
- throw new Error('段落子元素为空');
1147
- }
1148
- const lastEle = this.insertElement(startControl, startOffset, children);
1149
- this.selectionState.resetRange(lastEle, -1);
1150
- return;
1151
- }
1152
- console.log('粘贴:' + pasteData);
1153
- }
1154
- insertSoftBr() {
1155
- let { startControl, startOffset } = this.selectionState;
1156
- const lastEle = this.insertElement(startControl, startOffset, [new BreakElement()]);
1157
- const focusEle = ElementUtil.getNextSiblingElement(lastEle);
1158
- if (focusEle) {
1159
- this.selectionState.resetRange(focusEle, 0);
1160
- }
1161
- }
1162
- /**
1163
- * 处理黏贴的纯文本
1164
- * @param text
1165
- */
1166
- pastePlainText(text) {
1167
- const textItems = text.split(/\r?\n/);
1168
- const { startControl, startOffset } = this.selectionState;
1169
- if (this.viewOptions.docMode === DocMode.FormEdit || textItems.length === 1 || IsInSideInlineGroupInputElement(startControl, startOffset)) {
1170
- text = text.replace(/[\n\r]/g, '');
1171
- this.newInput({
1172
- data: text,
1173
- compositionStartInfo: {
1174
- element: startControl,
1175
- offset: startOffset
1176
- }
1177
- });
1178
- }
1179
- else {
1180
- const breakPara = this.splitCurrentParagraph();
1181
- for (let i = 0; i < textItems.length; i++) {
1182
- const newPara = breakPara.clone(false);
1183
- const inputTextProps = newPara.props.textProps;
1184
- const newTextEle = ElementUtil.getNewTextGroup(inputTextProps);
1185
- newTextEle.text = textItems[i];
1186
- newPara.addChild(newTextEle, 0);
1187
- breakPara.parent.addChild(newPara, breakPara.getIndex());
1188
- }
1189
- this.selectionState.resetRange(breakPara, 0);
1190
- }
1191
- }
1192
- /**
1193
- * 设置当前段落项目符号类型
1194
- */
1195
- setParagraphNumberType() {
1196
- const { startControl } = this.selectionState;
1197
- if (!startControl) {
1198
- return;
1199
- }
1200
- const para = ElementUtil.getParentByType(startControl, ParagraphElement);
1201
- if (para.props.numberType >= 0) {
1202
- para.props.numberType = -1;
1203
- para.props.indent = 0;
1204
- }
1205
- else {
1206
- para.props.numberType = 0;
1207
- para.props.indent = 15;
1208
- }
1209
- }
1210
- /**
1211
- * 插入批注
1212
- */
1213
- insertComment() {
1214
- const { startControl, startOffset, endControl, endOffset, collapsed } = this.selectionState;
1215
- if (collapsed || !startControl || !endControl) {
1216
- return;
1217
- }
1218
- const id = nanoid(5);
1219
- const startCommMark = new CommentElement();
1220
- startCommMark.props.id = id;
1221
- startCommMark.props.markType = 'start';
1222
- const endCommMark = new CommentElement();
1223
- endCommMark.props.id = id;
1224
- endCommMark.props.markType = 'end';
1225
- this.insertElement(endControl, endOffset, [endCommMark]);
1226
- this.insertElement(startControl, startOffset, [startCommMark]);
1227
- const commContent = new CommContentElement();
1228
- commContent.props.id = id;
1229
- commContent.props.createId = this.viewOptions.editUser.id;
1230
- commContent.props.createName = this.viewOptions.editUser.name;
1231
- commContent.props.createDate = new Date();
1232
- const pos = this.docComment.getCommMarkIndex(startCommMark);
1233
- if (pos < 0) {
1234
- throw new Error('获取插入的批注位置不正确');
1235
- }
1236
- this.docCtx.document.commentsContainerElement.addChild(commContent, pos);
1237
- this.selectionState.clear();
1238
- this.docComment.afterCommentsChanged();
1239
- }
1240
- validate() {
1241
- const dataEleList = this.docCtx.document.treeFilter(item => item instanceof DataElementInlineGroup);
1242
- const errorEleList = dataEleList.map(item => ({ error: item.validate(), ele: item })).filter(item => item.error);
1243
- if (!errorEleList.length) {
1244
- return true;
1245
- }
1246
- errorEleList.forEach(item => {
1247
- const id = nanoid(5);
1248
- const startCommMark = new CommentElement();
1249
- startCommMark.props.id = id;
1250
- startCommMark.props.markType = 'start';
1251
- const endCommMark = new CommentElement();
1252
- endCommMark.props.id = id;
1253
- endCommMark.props.markType = 'end';
1254
- item.ele.addChild(startCommMark, 0);
1255
- item.ele.addChild(endCommMark, item.ele.length);
1256
- const caption = CommonUtil.nullToString(item.ele.props.caption);
1257
- const validateElement = new ValidateElement();
1258
- validateElement.props.title = caption + '验证';
1259
- validateElement.props.id = id;
1260
- validateElement.setContent(item.error);
1261
- const pos = this.docComment.getCommMarkIndex(startCommMark);
1262
- this.docCtx.document.commentsContainerElement.addChild(validateElement, pos);
1263
- });
1264
- this.docCtx.selectionState.clear();
1265
- this.docComment.afterCommentsChanged();
1266
- return false;
1267
- }
1268
- /**
1269
- * 移除空字符串
1270
- * @param text
1271
- */
1272
- removeEmptyText(text) {
1273
- //const nextLeafElementInPara = ElementUtil.getRecursionNextSiblingElement(text, true, true); getComputedStyle
1274
- this.setCurosrForDeleteAction(text);
1275
- const parent = text.parent;
1276
- text.remove();
1277
- this.removeEmtpyInlineBlock(parent);
1278
- }
1279
- setCurosrForDeleteAction(control) {
1280
- const cursorInfo = this.getCursorElementByDeleteAction(control);
1281
- if (cursorInfo) {
1282
- this.selectionState.resetRange(cursorInfo.ele, cursorInfo.offset);
1283
- }
1284
- else {
1285
- this.selectionState.clear();
1286
- }
1287
- }
1288
- getCursorElementByDeleteAction(control) {
1289
- const prevLeafElementInPara = ElementUtil.getRecursionPrevSiblingElement(control, false, true);
1290
- //判断是否为同一段落
1291
- if (prevLeafElementInPara && ElementUtil.isInSameParagraph(prevLeafElementInPara, control)) {
1292
- return {
1293
- ele: prevLeafElementInPara,
1294
- offset: ElementUtil.getElementEndOffset(prevLeafElementInPara)
1295
- };
1296
- }
1297
- //同一段落其他元素
1298
- const nextLeafElementInPara = ElementUtil.getRecursionNextSiblingElement(control, true, true);
1299
- if (nextLeafElementInPara) {
1300
- return {
1301
- ele: nextLeafElementInPara,
1302
- offset: 0
1303
- };
1304
- }
1305
- //上一段落
1306
- if (prevLeafElementInPara) {
1307
- return {
1308
- ele: prevLeafElementInPara,
1309
- offset: prevLeafElementInPara instanceof PSymbolElement ? 0 : ElementUtil.getElementEndOffset(prevLeafElementInPara)
1310
- };
1311
- }
1312
- return null;
1313
- }
1314
- /**
1315
- * 移除空行内标签
1316
- * @param ele
1317
- */
1318
- removeEmtpyInlineBlock(ele) {
1319
- if (ele instanceof InlineGroupElement && ele.length === 0) {
1320
- const parent = ele.parent;
1321
- ele.remove();
1322
- this.removeEmtpyInlineBlock(parent);
1323
- }
1324
- }
1325
- /**
1326
- * 插入强制换页符号
1327
- */
1328
- insertPageBreakPara() {
1329
- const { startControl } = this.selectionState;
1330
- const currPara = ElementUtil.getParentByType(startControl, ParagraphElement);
1331
- if (!currPara) {
1332
- return;
1333
- }
1334
- if (currPara.parent instanceof DocumentBodyElement) {
1335
- const pageBreak = new ParagraphElement();
1336
- pageBreak.props.pageBreak = true;
1337
- pageBreak.props.textAlign = 'center';
1338
- pageBreak.parent.addChild(pageBreak);
1339
- }
1340
- }
1341
- }
1342
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtY2hhbmdlLmpzIiwic291cmNlUm9vdCI6ImxpYi8iLCJzb3VyY2VzIjpbImZyYW1ld29yay9kb2N1bWVudC1jaGFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBa0IsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUNILHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLE9BQU8sRUFFUCxrQkFBa0IsRUFDbEIsV0FBVyxFQUdkLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFN0UsT0FBTyxFQUNILHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsbUJBQW1CLEVBQ25CLCtCQUErQixFQUNsQyxNQUFNLDRDQUE0QyxDQUFDO0FBRXBELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVwRTs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQ0g7SUFBd0M7SUFBa0M7SUFBa0M7SUFBK0I7SUFBL0osWUFBb0IsY0FBOEIsRUFBVSxXQUF3QixFQUFVLFNBQXdCLEVBQVUsTUFBcUIsRUFBVSxVQUEyQjtRQUF0SyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQVUsZUFBVSxHQUFWLFVBQVUsQ0FBaUI7SUFDMUwsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFlO1FBQ3BCLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDekYsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNaLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixPQUFPO1NBQ1Y7UUFDRCxnQkFBZ0I7UUFDaEIsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUF1QixFQUFFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3hHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsWUFBMkIsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMxRSxPQUFPO1NBQ1Y7UUFDRCw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNuRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQTZDLENBQUM7WUFDaEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEMsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLENBQUMsWUFBWSxZQUFZLGdCQUFnQixDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO2FBQ25EO1lBQ0QsTUFBTSxjQUFjLEdBQUcsV0FBVyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0ksSUFBSSxjQUFjLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsV0FBVyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDN0M7aUJBQU07Z0JBQ0gsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDM0UsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDakUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQztnQkFDbEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDM0M7WUFDRCxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsa0JBQWtCLENBQUMsSUFBZTtRQUM5QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ25ELE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQztZQUN2RCxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNYLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUE2QyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO1lBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQyxDQUFDO0lBRU4sQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxzQkFBc0IsQ0FBQyxZQUFxQixFQUFFLFNBQTJCO1FBQ3JFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDbkMsT0FBTyxNQUFNLFlBQVksZUFBZTtlQUNqQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2VBQ3BELE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUztlQUN6QixVQUFVLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDO0lBQ2pHLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxNQUFlLEVBQUUsWUFBcUMsSUFBSTtRQUNyRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLFlBQVksZUFBZSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQztJQUNoSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsb0JBQW9CLENBQUMsSUFBZSxFQUFFLFlBQXlCLEVBQUUsV0FBbUI7UUFDaEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBNkMsQ0FBQztRQUNwRSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDdEUsT0FBTztTQUNWO1FBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1lBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLE9BQU87U0FDVjthQUFNO1lBQ0gsTUFBTSxFQUNGLFlBQVksRUFDWixZQUFZLEVBQ2YsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBO1lBQzdELFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hDLE9BQU87U0FDVjtJQUNMLENBQUM7SUFHRDs7Ozs7O09BTUc7SUFDSCxtQkFBbUIsQ0FBQyxZQUF5QixFQUFFLFdBQW1CLEVBQUUsU0FBMkI7UUFDM0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RSxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBeUIsQ0FBQztRQUM1RCxJQUFJLFlBQVksWUFBWSxnQkFBZ0IsSUFBSSxXQUFXLEdBQUcsQ0FBQyxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUMvRyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQXFCLENBQUM7WUFDbkgsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNyRSxXQUFXLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7U0FDbEQ7UUFDRCxXQUFXLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUNwRCxPQUFPO1FBQ1AsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQzFDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLFdBQVcsQ0FBb0IsQ0FBQztZQUNoRyxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdkcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4RSxPQUFPLFlBQVksQ0FBQztTQUN2QjthQUFNO1lBQ0gsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RyxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVGLE9BQU8sWUFBWSxDQUFDO1NBQ3ZCO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxZQUF5QixFQUFFLE1BQWM7UUFDekQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQXFCLENBQUM7UUFDN0YsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDckMsSUFBSSxZQUFZLFlBQVksZ0JBQWdCLEVBQUU7WUFDMUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7U0FDbEM7UUFDRCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBMkIsQ0FBQztRQUNuRixJQUFJLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDdEQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztTQUN2QztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGlCQUFpQixDQUFDLFlBQXlCLEVBQUUsV0FBbUI7UUFDNUQsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sWUFBWSxlQUFlLENBQUMsSUFBSSxZQUFZLFlBQVksZ0JBQWdCLEVBQUU7WUFDL0YsT0FBTyxZQUFZLENBQUM7U0FDdkI7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUF5QixDQUFDO1FBQzVELElBQUksWUFBWSxZQUFZLGdCQUFnQixJQUFJLFdBQVcsR0FBRyxDQUFDLElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQy9HLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBcUIsQ0FBQztZQUNuSCxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLFdBQVcsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztTQUNsRDtRQUNELFdBQVcsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsV0FBVyxDQUFDO1FBQ3BELElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUMxQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxXQUFXLENBQW9CLENBQUM7WUFDaEcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RSxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hELFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEUsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDSCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hELFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEYsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxzQkFBc0IsQ0FBQyxZQUFxQixFQUFFLFNBQTJCLEVBQUUsU0FBMkI7UUFDMUcsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQXFCLENBQUM7UUFDN0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELFNBQVMsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDOUMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1RCxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDckMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxPQUFPO1lBQ0gsWUFBWTtZQUNaLFlBQVk7U0FDZixDQUFBO0lBRUwsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFNBQTJCO1FBQ2xELE1BQU0sWUFBWSxHQUFHLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN6RCxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDN0QsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RFLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRU8sY0FBYyxDQUFDLElBQXNCLEVBQUUsSUFBZTtRQUMxRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUMvQyxNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7U0FDbEQ7UUFFRCxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUN0RCxJQUFJLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztRQUM5QiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLGdCQUFnQixDQUFDLEVBQUU7WUFDeEMsMkRBQTJEO1lBQzNELElBQUksV0FBVyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDckQsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNILGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDO2FBQ3JFO1NBQ0o7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7YUFBTTtZQUNILElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzdFO0lBQ0wsQ0FBQztJQUdEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLEdBQWtCO1FBQzFCLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDckUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtTQUMxQztRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELFlBQVksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDO1FBQy9CLFlBQVksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBQ25DLFlBQVksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQy9CLFlBQVksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQ3JCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakMsSUFBSSxTQUFTLEVBQUU7WUFDWCxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQ3REO2FBQU07WUFDSCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDeEI7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCLENBQUMsR0FBa0I7UUFDakMsTUFBTSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNyRSxNQUFNLFlBQVksR0FBRyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxZQUFZLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQztRQUM1QixZQUFZLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztRQUNuQyxZQUFZLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUMvQixZQUFZLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUN4QyxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNyQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLFNBQVMsRUFBRTtZQUNYLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN4QjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGFBQWE7UUFDakIsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUE7U0FDNUM7UUFDRCxXQUFXO1FBQ1gsSUFBSSxpQkFBMEIsQ0FBQztRQUMvQixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUN6QixJQUFJLGFBQWEsQ0FBQyxjQUFjLEVBQUU7WUFDOUIsY0FBYztZQUNkLElBQUksYUFBYSxDQUFDLE1BQU0sWUFBWSxxQkFBcUIsRUFBRTtnQkFDdkQsaUJBQWlCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztnQkFDekMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO2FBQ3hCO1lBQ0Qsb0JBQW9CO2lCQUNmLElBQUksYUFBYSxDQUFDLE1BQU0sWUFBWSxtQkFBbUIsRUFBRTtnQkFDMUQsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFlBQVkscUJBQXFCLENBQTBCLENBQUM7Z0JBQzlJLElBQUksZUFBZSxFQUFFO29CQUNqQixpQkFBaUIsR0FBRyxlQUFlLENBQUM7b0JBQ3BDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztpQkFDeEI7cUJBQU07b0JBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO2lCQUNyQzthQUNKO2lCQUFNO2dCQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7YUFDNUI7U0FDSjthQUFNO1lBQ0gsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBMEIsQ0FBQztZQUN6RixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUEwQixDQUFDO1lBQ3JGLElBQUksVUFBVSxDQUFDLGNBQWMsRUFBRTtnQkFDM0IsaUJBQWlCLEdBQUcsV0FBVyxDQUFDLDhCQUE4QixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBZ0IsQ0FBQztnQkFDOUcsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLCtCQUErQjtnQkFDL0IsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDekYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUU7d0JBQzFCLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7d0JBQ3BDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztxQkFDeEI7aUJBQ0o7YUFDSjtpQkFBTTtnQkFDSCxpQkFBaUIsR0FBRyxVQUFVLENBQUMsTUFBcUIsQ0FBQztnQkFDckQsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQzthQUM3QztTQUNKO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQy9DLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtTQUM1QzthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNuQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxrQkFBa0IsQ0FBQyxPQUFvQixFQUFFLE1BQWM7UUFDM0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QixJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDZCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNWLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsT0FBTzthQUNWO1lBQ0QsSUFBSSxXQUFXLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO2dCQUNqRCxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxPQUFPLEVBQUU7b0JBQ3hELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQzlFO3FCQUFNO29CQUNILElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMvQzthQUNKO2lCQUFNO2dCQUNILHVCQUF1QjtnQkFDdkIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQXFCLENBQUM7Z0JBQzVGLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFxQixDQUFDO2dCQUM1RixxQkFBcUI7Z0JBQ3JCLElBQUksV0FBVyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsRUFBRTtvQkFDMUQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFO3dCQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDNUMsT0FBTztxQkFDVjtvQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDdEQ7cUJBQU07b0JBQ0gsdUNBQXVDO29CQUN2QyxRQUFRO29CQUNSLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQTtpQkFDbEQ7YUFDSjtTQUNKO2FBQU07WUFDSCxJQUFJLE9BQU8sWUFBWSxnQkFBZ0IsRUFBRTtnQkFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO29CQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNqQztxQkFBTTtvQkFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUN2RDthQUNKO2lCQUFNO2dCQUNILElBQUksT0FBTyxDQUFDLE1BQU0sWUFBWSx1QkFBdUIsSUFBSSxPQUFPLFlBQVksbUJBQW1CLEVBQUU7b0JBQzdGLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQy9CLHNCQUFzQjtvQkFDdEIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ3BDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdkMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNqQixPQUFPO3FCQUNWO29CQUNELElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsUUFBUSxFQUFFO3dCQUNuRSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRTs0QkFDckMsT0FBTzt5QkFDVjtxQkFDSjtpQkFDSjtnQkFDRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3BDLE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMvQjtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHFCQUFxQixDQUFDLE9BQWdDO1FBQzFELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUMvQyxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQWlDLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLE9BQU8sRUFBRTtZQUNULElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGtCQUFrQixDQUFDLE9BQW9CLEVBQUUsTUFBYztRQUMzRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLElBQUksTUFBTSxLQUFLLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNyRCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNWLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxPQUFPO2FBQ1Y7WUFDRCxJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ2pELElBQUksV0FBVyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxLQUFLLE9BQU8sRUFBRTtvQkFDeEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDdkM7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUM5QzthQUNKO2lCQUFNO2dCQUNILHVCQUF1QjtnQkFDdkIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQXFCLENBQUM7Z0JBQzVGLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFxQixDQUFDO2dCQUM1RixxQkFBcUI7Z0JBQ3JCLElBQUksV0FBVyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsRUFBRTtvQkFDMUQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFO3dCQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzNDLE9BQU87cUJBQ1Y7b0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ3REO3FCQUFNO29CQUNILHVDQUF1QztvQkFDdkMsUUFBUTtvQkFDUixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7aUJBQ2xEO2FBQ0o7U0FDSjthQUFNO1lBQ0gsSUFBSSxPQUFPLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO29CQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNqQztxQkFBTTtvQkFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQ25EO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxPQUFPLENBQUMsTUFBTSxZQUFZLHNCQUFzQixJQUFJLE9BQU8sWUFBWSxtQkFBbUIsRUFBRTtvQkFDNUYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQWdDLENBQUM7b0JBQ3pELHNCQUFzQjtvQkFDdEIsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO3dCQUNsQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRTs0QkFDcEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUN2QyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7eUJBQ3BCOzZCQUFNOzRCQUNILElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUMvQzt3QkFDRCxPQUFPO3FCQUNWO3lCQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO3dCQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3hELE9BQU87cUJBQ1Y7aUJBQ0o7Z0JBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO29CQUNwQix1Q0FBdUM7b0JBQ3ZDLE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMvQjtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxvQkFBb0IsQ0FBQyxPQUFnQztRQUN6RCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDL0MsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBc0IsRUFBRSxNQUFjLEVBQUUsR0FBVztRQUNwRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUU7WUFDeEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUE7U0FDakQ7YUFBTTtZQUNILElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1NBQzNCO0lBQ0wsQ0FBQztJQUVPLFlBQVksQ0FBQyxJQUFpQjtRQUNsQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUU7WUFDeEMsV0FBVztZQUNYLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQ3RCLE9BQU07YUFDVDtZQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQzthQUFNO1lBQ0gsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xCO0lBQ0wsQ0FBQztJQUdEOzs7OztPQUtHO0lBQ0ssb0JBQW9CLENBQUMsTUFBZSxFQUFFLFNBQTJCO1FBQ3JFLElBQUksTUFBTSxDQUFDLE1BQU0sWUFBWSxlQUFlLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDN0ksT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxNQUFlLEVBQUUsU0FBMkI7UUFDakUsSUFBSSxNQUFNLENBQUMsTUFBTSxZQUFZLGVBQWUsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDOUUsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFHRDs7O09BR0c7SUFDSyxvQkFBb0IsQ0FBQyxNQUFtQjtRQUM1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6RCxPQUFPO1NBQ1Y7UUFDRCx1QkFBdUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzlELE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEMsT0FBTztTQUNWO1FBQ0Qsa0JBQWtCO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssc0JBQXNCLENBQUMsTUFBd0IsRUFBRSxNQUFjLEVBQUUsR0FBVztRQUNoRixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekQsT0FBTztTQUNWO1FBQ0Qsd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM5RCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQixPQUFPO1NBQ1Y7UUFDRCxPQUFPO1FBQ1AsSUFBSSxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNwRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZGLGNBQWMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ3hELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0Msa0JBQWtCO1lBQ2xCLE9BQU87U0FDVjtRQUNELE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDN0QsTUFBTSxHQUFHLFdBQW9CLENBQUM7UUFDOUIsSUFBSSxTQUFTLEdBQXFCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEcsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBR08sd0JBQXdCLENBQUMsTUFBZSxFQUFFLFNBQTJCO1FBQ3pFLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzVHLElBQUksWUFBWSxFQUFFO1lBQ2QsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLFFBQVEsSUFBSSxRQUFRLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ2xELE9BQU8sUUFBUSxDQUFDO2FBQ25CO2lCQUFNO2dCQUNILE1BQU0sUUFBUSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDeEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsT0FBTyxRQUFRLENBQUM7YUFDbkI7U0FDSjthQUFNO1lBQ0gsTUFBTSxFQUNGLFlBQVksRUFDWixZQUFZLEVBQ2YsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1RCxPQUFPLFlBQVksQ0FBQztTQUN2QjtJQUNMLENBQUM7SUFHTyxtQkFBbUIsQ0FBQyxNQUFlLEVBQUUsU0FBMkI7UUFDcEUsSUFBSSxZQUFZLEdBQUcsV0FBVyxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDMUcsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNmLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUMvRDtRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7SUFHRDs7OztPQUlHO0lBQ0ssYUFBYSxDQUFDLE9BQW9CO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDVixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRixJQUFJLE9BQU8sRUFBRTtnQkFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakIsT0FBTzthQUNWO1lBQ0QsT0FBTztTQUNWO1FBQ0QsSUFBSSxXQUFXLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixPQUFPO1NBQ1Y7YUFBTTtZQUNILE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hGLElBQUksT0FBTyxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxPQUFPLEVBQUU7Z0JBQ25FLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqQixPQUFPO2FBQ1Y7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakIsT0FBTzthQUNWO1NBQ0o7SUFDTCxDQUFDO0lBR0Q7O09BRUc7SUFDSCxPQUFPO1FBQ0gsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQXFCLENBQUM7UUFDbEcsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDL0MsVUFBVTtRQUNWLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUN6QixNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM5RDtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxFQUFnQjtRQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUI7UUFDekIsTUFBTSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzFELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFxQixDQUFDO1FBQ2xHLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDdkMsZUFBZTtRQUNmLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLFlBQVksWUFBWSxjQUFjLENBQUMsRUFBRTtZQUM3SCwrQ0FBK0M7WUFDL0MsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFDRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFnQixDQUFDO1FBQ3RFLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRyxpQkFBaUIsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFxQixDQUFDO1FBQ3RGLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsYUFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELG1EQUFtRDtRQUNuRCwrQ0FBK0M7UUFDL0MsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsUUFBMEIsRUFBRSxRQUEwQixFQUFFLFdBQW9CO1FBQ3pGLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1QjtRQUNELG9CQUFvQjtRQUNwQixNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDMUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsS0FBNEI7UUFDcEMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25ELE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLFVBQVUsQ0FBQztZQUM5RSxJQUFJLFdBQVcsWUFBWSxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO2dCQUMvRCxJQUFJLGlCQUFpQixFQUFFO29CQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUNsQztxQkFBTSxJQUFJLFdBQVcsWUFBWSxnQkFBZ0IsRUFBRTtvQkFDaEQsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxVQUFVLENBQUM7b0JBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUM7aUJBQ3hFO2FBQ0o7aUJBQU0sSUFBSSxXQUFXLFlBQVksYUFBYSxFQUFFO2dCQUM3QyxNQUFNO2dCQUNOLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRTtvQkFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDaEM7cUJBQU07b0JBQ0gsZ0JBQWdCO29CQUNoQixJQUFJLFdBQVcsWUFBWSxZQUFZLElBQUksaUJBQWlCLEVBQUU7d0JBQzFELFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDckIsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUN6QjtvQkFDRCxnQkFBZ0I7eUJBQ1gsSUFBSSxXQUFXLFlBQVksbUJBQW1CLElBQUksaUJBQWlCLEVBQUU7d0JBQ3RFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDckIsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUN6Qjt5QkFBTSxJQUFJLFdBQVcsWUFBWSxrQkFBa0IsSUFBSSxpQkFBaUIsRUFBRTt3QkFDdkUsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNyQixXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7cUJBQ3pCO3lCQUFNO3dCQUNILElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ2hDO2lCQUNKO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFHRDs7OztPQUlHO0lBQ0sscUJBQXFCLENBQUMsS0FBNEI7UUFDdEQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0QsbUJBQW1CO1FBQ25CLElBQUksV0FBVyxFQUFFO1lBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixPQUFPO1NBQ1Y7UUFDRCxTQUFTO2FBQ0o7WUFDRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxzQkFBc0IsQ0FBQyxLQUE0QjtRQUN2RCxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxVQUFVLENBQUM7WUFDM0MsSUFBSSxXQUFXLFlBQVksYUFBYSxFQUFFO2dCQUN0QyxJQUFJLFdBQVcsWUFBWSxzQkFBc0IsRUFBRTtvQkFDL0MsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLEtBQXlCLENBQUM7b0JBQzNELFFBQVE7b0JBQ1IsSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFO3dCQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUNoQztpQkFDSjtxQkFBTTtvQkFDSCxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUE7aUJBQzFDO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFHRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLGFBQXNCLEVBQUUsWUFBb0IsRUFBRSxXQUFvQixFQUFFLFVBQWtCLEVBQUUsRUFBa0I7UUFDbEgsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLElBQUksYUFBYSxZQUFZLGdCQUFnQixFQUFFO1lBQzNDLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDbEYsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTthQUN2RTtpQkFBTSxJQUFJLFlBQVksRUFBRTtnQkFDckIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO2FBQ3JFO1NBQ0o7YUFBTTtZQUNILGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7U0FDdkY7UUFDRCxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsYUFBc0IsRUFBRSxZQUFvQixFQUFFLFlBQTRCO1FBQ3BGLElBQUksT0FBd0IsQ0FBQztRQUM3QixJQUFJLGFBQWEsWUFBWSxnQkFBZ0IsRUFBRTtZQUMzQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2xGLElBQUksV0FBVyxFQUFFO2dCQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMxQyxPQUFPLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxQixXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDeEU7YUFDSjtpQkFBTSxJQUFJLFlBQVksRUFBRTtnQkFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzFDLE9BQU8sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7b0JBQ3pCLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztpQkFDbEU7YUFDSjtTQUNKO2FBQU07WUFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDekIsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQzthQUNuRjtTQUNKO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUdEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFzQixFQUFFLEtBQWEsRUFBRSxHQUFXO1FBQzNFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDbEQsSUFBSSxLQUFLLEtBQUssR0FBRyxFQUFFO1lBQ2YsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDakQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLGFBQWEsRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDNUQ7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUN6QztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFM0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFzQixFQUFFLE1BQWM7UUFDNUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUMxRCxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNyQyxPQUFPO2dCQUNILFdBQVcsRUFBRSxJQUFJO2dCQUNqQixZQUFZLEVBQUUsSUFBSTthQUNyQixDQUFBO1NBQ0o7UUFDRCxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDZCxPQUFPO2dCQUNILFdBQVcsRUFBRSxJQUFJO2dCQUNqQixZQUFZLEVBQUUsSUFBSTthQUNyQixDQUFBO1NBQ0o7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLFNBQVMsRUFBRTtZQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDeEQ7UUFDRCxJQUFJLFFBQVEsR0FBNEIsSUFBSSxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDbkI7UUFDRCxPQUFPO1lBQ0gsV0FBVyxFQUFFLFFBQVE7WUFDckIsWUFBWSxFQUFFLFNBQVM7U0FDMUIsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBa0IsRUFBRSxVQUFtQztRQUN2RSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRTtZQUN4QixPQUFPO1NBQ1Y7UUFDRCxNQUFNLGlCQUFpQixHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDL0MsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELElBQUksVUFBVSxLQUFLLFFBQVEsRUFBRTtZQUN6QixJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUU7Z0JBQzNCLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25EO1lBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxZQUFZLGdCQUFnQixFQUFFO2dCQUMvQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7Z0JBQzNDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDdkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDNUcsSUFBSSxhQUFhLEVBQUU7b0JBQ2YsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDN0MsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMvQzthQUNKO1NBQ0o7YUFBTTtZQUNILElBQUksVUFBVSxDQUFDLGNBQWMsRUFBRTtnQkFDM0IsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDcEQ7aUJBQU07Z0JBQ0gsSUFBSSxVQUFVLENBQUMsTUFBTSxZQUFZLGdCQUFnQixFQUFFO29CQUMvQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hHLElBQUksYUFBYSxFQUFFO3dCQUNmLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ2hDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQ2hEO3lCQUFNO3dCQUNILGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUNwRDtpQkFDSjtxQkFBTTtvQkFDSCxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ3pFO2FBQ0o7WUFDRCxJQUFJLFFBQVEsQ0FBQyxjQUFjLEVBQUU7Z0JBQ3pCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakQ7aUJBQU07Z0JBQ0gsSUFBSSxRQUFRLENBQUMsTUFBTSxZQUFZLGdCQUFnQixFQUFFO29CQUM3QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN6RixJQUFJLGFBQWEsRUFBRTt3QkFDZixVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNoQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQy9DO3lCQUFNO3dCQUNILGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUNsRDtpQkFFSjtxQkFBTTtvQkFDSCxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ2pFO2FBQ0o7U0FDSjtRQUNELEVBQUUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU8sTUFBTSxDQUFDLDBCQUEwQixDQUFDLEtBQTRCLEVBQUUsVUFBbUM7UUFDdkcsU0FBUyxDQUFDLDhCQUE4QixDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzFELElBQUksU0FBUyxDQUFDLE1BQU0sWUFBWSxnQkFBZ0IsSUFBSSxTQUFTLENBQUMsY0FBYyxFQUFFO2dCQUMxRSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUNyQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUdELE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBa0IsRUFBRSxVQUF3QztRQUM1RSxJQUFJLEVBQUUsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLFlBQVksRUFBRTtZQUNqQyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUM1RSxJQUFJLElBQUksRUFBRTtnQkFDTixVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzFCO1NBQ0o7YUFBTTtZQUNILE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDL0IsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDUixPQUFPO2FBQ1Y7WUFDRCxTQUFTLENBQUMsOEJBQThCLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQzFELElBQUksU0FBUyxDQUFDLE1BQU0sWUFBWSxnQkFBZ0IsRUFBRTtvQkFDOUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3RDO1lBQ0wsQ0FBQyxDQUFDLENBQUE7U0FDTDtJQUVMLENBQUM7SUFHRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEdBQW1CO1FBQ3RCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQixNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDbkIsT0FBTztTQUNWO1FBQ0QsR0FBRyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hGLEdBQUcsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEdBQW1CO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLEdBQW1CO1FBQ3ZCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQixJQUFJLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ1osSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNsQztZQUNELE9BQU87U0FDVjtRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDckMsT0FBTztTQUNWO1FBQ0QsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDMUMsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3hELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWiwrQkFBK0I7WUFDL0IsNERBQTREO1lBQzVELDRCQUE0QjtZQUM1Qiw4QkFBOEI7U0FDakM7UUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2YsT0FBTztTQUNWO1FBQ0QsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUMvQyxNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbkYsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNwQztZQUNELE9BQU87U0FDVjtRQUNELElBQUksWUFBWSxZQUFZLGdCQUFnQixJQUFJLFlBQVksWUFBWSxrQkFBa0IsRUFBRTtZQUN4RixNQUFNLFFBQVEsR0FBbUIsRUFBRSxDQUFDO1lBQ3BDLElBQUksWUFBWSxZQUFZLGdCQUFnQixFQUFFO2dCQUMxQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7YUFDbkU7aUJBQU0sSUFBSSxZQUFZLFlBQVksa0JBQWtCLEVBQUU7Z0JBQ25ELFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDL0I7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtnQkFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM5QjtZQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQVksQ0FBQztZQUNuRixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxPQUFPO1NBQ1Y7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsWUFBWTtRQUNSLElBQUksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUN4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDLENBQVksQ0FBQztRQUMvRixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUQsSUFBSSxRQUFRLEVBQUU7WUFDVixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDL0M7SUFFTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYyxDQUFDLElBQVk7UUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxNQUFNLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDMUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLCtCQUErQixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsRUFBRTtZQUN2SSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDVixJQUFJLEVBQUUsSUFBSTtnQkFDVixvQkFBb0IsRUFBRTtvQkFDbEIsT0FBTyxFQUFFLFlBQVk7b0JBQ3JCLE1BQU0sRUFBRSxXQUFXO2lCQUN0QjthQUNKLENBQUMsQ0FBQTtTQUNMO2FBQU07WUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQXFCLENBQUM7Z0JBQzNELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUMvQyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMvRCxVQUFVLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUM1RDtZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNoRDtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILHNCQUFzQjtRQUNsQixNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2YsT0FBTztTQUNWO1FBQ0QsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQXFCLENBQUM7UUFDN0YsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCO2FBQU07WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1NBQzFCO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYTtRQUNULE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM1RixJQUFJLFNBQVMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUMzQyxPQUFPO1NBQ1Y7UUFDRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsTUFBTSxhQUFhLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMzQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDNUIsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBRXZDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDekMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzFCLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUVuQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ3hELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7UUFFOUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQzdDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUMxQixXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDMUQsV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzlELFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7WUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTVCLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsUUFBUTtRQUNKLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksWUFBWSxzQkFBc0IsQ0FBa0MsQ0FBQztRQUNySSxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakgsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sYUFBYSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7WUFDM0MsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQzVCLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUV2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ3pDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUMxQixXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFFbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQy9DLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUM5QyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQzdDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUM5QixlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV2QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFHakYsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFdkMsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWUsQ0FBQyxJQUFzQjtRQUNsQyw4R0FBOEc7UUFDOUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxPQUFnQjtRQUNyQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEUsSUFBSSxVQUFVLEVBQUU7WUFDWixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyRTthQUFNO1lBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMvQjtJQUNMLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxPQUFnQjtRQUMzQyxNQUFNLHFCQUFxQixHQUFHLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9GLFdBQVc7UUFDWCxJQUFJLHFCQUFxQixJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUN4RixPQUFPO2dCQUNILEdBQUcsRUFBRSxxQkFBcUI7Z0JBQzFCLE1BQU0sRUFBRSxXQUFXLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUM7YUFDakUsQ0FBQTtTQUNKO1FBQ0QsVUFBVTtRQUNWLE1BQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUYsSUFBSSxxQkFBcUIsRUFBRTtZQUN2QixPQUFPO2dCQUNILEdBQUcsRUFBRSxxQkFBcUI7Z0JBQzFCLE1BQU0sRUFBRSxDQUFDO2FBQ1osQ0FBQTtTQUNKO1FBQ0QsTUFBTTtRQUNOLElBQUkscUJBQXFCLEVBQUU7WUFDdkIsT0FBTztnQkFDSCxHQUFHLEVBQUUscUJBQXFCO2dCQUMxQixNQUFNLEVBQUUscUJBQXFCLFlBQVksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQzthQUN2SCxDQUFBO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsc0JBQXNCLENBQUMsR0FBWTtRQUMvQixJQUFJLEdBQUcsWUFBWSxrQkFBa0IsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2QztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQjtRQUNmLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDNUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNYLE9BQU87U0FDVjtRQUNELElBQUksUUFBUSxDQUFDLE1BQU0sWUFBWSxtQkFBbUIsRUFBRTtZQUNoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDekMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztZQUNyQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN4QztJQUNMLENBQUM7Q0FHSiJ9