@ai-table/grid 0.0.73 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/angular-konva/components/container.component.d.ts.map +1 -1
  2. package/angular-konva/components/shape.component.d.ts.map +1 -1
  3. package/angular-konva/components/stage.component.d.ts.map +1 -1
  4. package/components/cell-editors/abstract-cell-editor.component.d.ts.map +1 -1
  5. package/components/cell-editors/date/date-editor.component.d.ts.map +1 -1
  6. package/components/cell-editors/link/edit-link/edit-link.component.d.ts.map +1 -1
  7. package/components/cell-editors/link/link-editor.component.d.ts.map +1 -1
  8. package/components/cell-editors/number/number-editor.component.d.ts.map +1 -1
  9. package/components/cell-editors/select/select-editor.component.d.ts.map +1 -1
  10. package/components/cell-editors/text/text-editor.component.d.ts.map +1 -1
  11. package/components/cell-views/select/option.component.d.ts.map +1 -1
  12. package/components/context-menu/context-menu.component.d.ts.map +1 -1
  13. package/components/drag/drag.component.d.ts.map +1 -1
  14. package/components/field-menu/field-menu.component.d.ts.map +1 -1
  15. package/components/field-setting/field-setting.component.d.ts.map +1 -1
  16. package/core/context.d.ts +2 -0
  17. package/core/context.d.ts.map +1 -1
  18. package/core/types/ai-table.d.ts.map +1 -1
  19. package/core/utils/field.d.ts.map +1 -1
  20. package/core/utils/queries.d.ts.map +1 -1
  21. package/core/utils/short-id.d.ts.map +1 -1
  22. package/dom-grid.component.d.ts.map +1 -1
  23. package/fesm2022/ai-table-grid.mjs +322 -310
  24. package/fesm2022/ai-table-grid.mjs.map +1 -1
  25. package/grid-base.component.d.ts +3 -1
  26. package/grid-base.component.d.ts.map +1 -1
  27. package/grid.component.d.ts +1 -1
  28. package/grid.component.d.ts.map +1 -1
  29. package/package.json +3 -5
  30. package/pipes/grid.pipe.d.ts.map +1 -1
  31. package/renderer/components/action-icon.component.d.ts.map +1 -1
  32. package/renderer/components/add-field-column.component.d.ts.map +1 -1
  33. package/renderer/components/cells/attachment.component.d.ts.map +1 -1
  34. package/renderer/components/cells/link.component.d.ts.map +1 -1
  35. package/renderer/components/cells/progress.component.d.ts.map +1 -1
  36. package/renderer/components/cells/rate.component.d.ts.map +1 -1
  37. package/renderer/components/cells/rich-text.component.d.ts.map +1 -1
  38. package/renderer/components/cells.component.d.ts.map +1 -1
  39. package/renderer/components/field-head.component.d.ts +2 -2
  40. package/renderer/components/field-head.component.d.ts.map +1 -1
  41. package/renderer/components/field-icon.component.d.ts.map +1 -1
  42. package/renderer/components/frozen-cells.component.d.ts.map +1 -1
  43. package/renderer/components/frozen-heads.component.d.ts +1 -1
  44. package/renderer/components/frozen-heads.component.d.ts.map +1 -1
  45. package/renderer/components/frozen-placeholder-cells.component.d.ts.map +1 -1
  46. package/renderer/components/heads.component.d.ts +1 -1
  47. package/renderer/components/heads.component.d.ts.map +1 -1
  48. package/renderer/components/hover-cell.component.d.ts.map +1 -1
  49. package/renderer/components/hover-row-heads.component.d.ts.map +1 -1
  50. package/renderer/components/icon.component.d.ts.map +1 -1
  51. package/renderer/components/other-rows.component.d.ts.map +1 -1
  52. package/renderer/components/placeholder-cells.component.d.ts.map +1 -1
  53. package/renderer/components/text.component.d.ts.map +1 -1
  54. package/renderer/creations/create-active-cell-border.d.ts.map +1 -1
  55. package/renderer/creations/create-cells.d.ts.map +1 -1
  56. package/renderer/creations/create-heads.d.ts.map +1 -1
  57. package/renderer/drawers/add-row-layout-drawer.d.ts +1 -1
  58. package/renderer/drawers/add-row-layout-drawer.d.ts.map +1 -1
  59. package/renderer/drawers/cell-drawer.d.ts.map +1 -1
  60. package/renderer/drawers/drawer.d.ts +1 -1
  61. package/renderer/renderer.component.d.ts +5 -4
  62. package/renderer/renderer.component.d.ts.map +1 -1
  63. package/types/cell.d.ts +2 -0
  64. package/types/cell.d.ts.map +1 -1
  65. package/types/component-config.d.ts +2 -0
  66. package/types/component-config.d.ts.map +1 -1
  67. package/types/grid.d.ts +4 -0
  68. package/types/grid.d.ts.map +1 -1
  69. package/types/row.d.ts +1 -0
  70. package/types/row.d.ts.map +1 -1
  71. package/utils/build.d.ts.map +1 -1
  72. package/utils/clipboard/clipboard.d.ts.map +1 -1
  73. package/utils/clipboard/copy.d.ts.map +1 -1
  74. package/utils/clipboard/paste.d.ts +5 -1
  75. package/utils/clipboard/paste.d.ts.map +1 -1
  76. package/utils/common.d.ts.map +1 -1
  77. package/utils/field/model/date.d.ts.map +1 -1
  78. package/utils/field/model/link.d.ts.map +1 -1
  79. package/utils/field/model/progress.d.ts.map +1 -1
  80. package/utils/field/model/text.d.ts.map +1 -1
  81. package/utils/get-text-width.d.ts.map +1 -1
  82. package/utils/i18n.d.ts +2 -0
  83. package/utils/i18n.d.ts.map +1 -1
  84. package/utils/match-keywords.d.ts.map +1 -1
  85. package/utils/position.d.ts.map +1 -1
  86. package/utils/style.d.ts.map +1 -1
  87. package/utils/text-measure.d.ts.map +1 -1
  88. package/utils/visible-range.d.ts.map +1 -1
  89. package/esm2022/ai-table-grid.mjs +0 -5
  90. package/esm2022/angular-konva/components/container.component.mjs +0 -29
  91. package/esm2022/angular-konva/components/container.token.mjs +0 -3
  92. package/esm2022/angular-konva/components/index.mjs +0 -4
  93. package/esm2022/angular-konva/components/shape.component.mjs +0 -142
  94. package/esm2022/angular-konva/components/stage.component.mjs +0 -123
  95. package/esm2022/angular-konva/index.mjs +0 -5
  96. package/esm2022/angular-konva/interfaces/component.mjs +0 -4
  97. package/esm2022/angular-konva/interfaces/config.mjs +0 -2
  98. package/esm2022/angular-konva/interfaces/event-object.mjs +0 -2
  99. package/esm2022/angular-konva/interfaces/index.mjs +0 -5
  100. package/esm2022/angular-konva/interfaces/shape.mjs +0 -42
  101. package/esm2022/angular-konva/utils/apply-node-props.mjs +0 -67
  102. package/esm2022/angular-konva/utils/common.mjs +0 -48
  103. package/esm2022/angular-konva/utils/index.mjs +0 -5
  104. package/esm2022/angular-konva/utils/types.mjs +0 -2
  105. package/esm2022/angular-konva/utils/update-picture.mjs +0 -7
  106. package/esm2022/components/cell-editors/abstract-cell-editor.component.mjs +0 -56
  107. package/esm2022/components/cell-editors/date/date-editor.component.mjs +0 -87
  108. package/esm2022/components/cell-editors/link/edit-link/edit-link.component.mjs +0 -81
  109. package/esm2022/components/cell-editors/link/link-editor.component.mjs +0 -122
  110. package/esm2022/components/cell-editors/number/number-editor.component.mjs +0 -41
  111. package/esm2022/components/cell-editors/select/select-editor.component.mjs +0 -74
  112. package/esm2022/components/cell-editors/text/text-editor.component.mjs +0 -76
  113. package/esm2022/components/cell-views/select/option.component.mjs +0 -28
  114. package/esm2022/components/context-menu/context-menu.component.mjs +0 -42
  115. package/esm2022/components/drag/drag.component.mjs +0 -300
  116. package/esm2022/components/field-menu/field-menu.component.mjs +0 -47
  117. package/esm2022/components/field-setting/field-setting.component.mjs +0 -142
  118. package/esm2022/components/index.mjs +0 -10
  119. package/esm2022/constants/colors.mjs +0 -19
  120. package/esm2022/constants/editor.mjs +0 -11
  121. package/esm2022/constants/file-icon.mjs +0 -342
  122. package/esm2022/constants/grid.mjs +0 -35
  123. package/esm2022/constants/icon.mjs +0 -30
  124. package/esm2022/constants/index.mjs +0 -7
  125. package/esm2022/constants/table.mjs +0 -78
  126. package/esm2022/constants/text.mjs +0 -23
  127. package/esm2022/core/constants/field.mjs +0 -107
  128. package/esm2022/core/context.mjs +0 -29
  129. package/esm2022/core/coordinate.mjs +0 -222
  130. package/esm2022/core/index.mjs +0 -6
  131. package/esm2022/core/types/ai-table.mjs +0 -57
  132. package/esm2022/core/types/core.mjs +0 -2
  133. package/esm2022/core/types/index.mjs +0 -3
  134. package/esm2022/core/utils/common.mjs +0 -45
  135. package/esm2022/core/utils/field.mjs +0 -64
  136. package/esm2022/core/utils/id-creator.mjs +0 -21
  137. package/esm2022/core/utils/index.mjs +0 -5
  138. package/esm2022/core/utils/queries.mjs +0 -80
  139. package/esm2022/core/utils/short-id.mjs +0 -53
  140. package/esm2022/dom-grid.component.mjs +0 -80
  141. package/esm2022/grid-base.component.mjs +0 -145
  142. package/esm2022/grid.component.mjs +0 -649
  143. package/esm2022/index.mjs +0 -2
  144. package/esm2022/pipes/grid.pipe.mjs +0 -110
  145. package/esm2022/pipes/index.mjs +0 -2
  146. package/esm2022/public-api.mjs +0 -12
  147. package/esm2022/renderer/components/action-icon.component.mjs +0 -117
  148. package/esm2022/renderer/components/add-field-column.component.mjs +0 -88
  149. package/esm2022/renderer/components/cells/attachment.component.mjs +0 -107
  150. package/esm2022/renderer/components/cells/cells.mjs +0 -6
  151. package/esm2022/renderer/components/cells/index.mjs +0 -7
  152. package/esm2022/renderer/components/cells/link.component.mjs +0 -89
  153. package/esm2022/renderer/components/cells/progress.component.mjs +0 -268
  154. package/esm2022/renderer/components/cells/rate.component.mjs +0 -153
  155. package/esm2022/renderer/components/cells/rich-text.component.mjs +0 -95
  156. package/esm2022/renderer/components/cells.component.mjs +0 -35
  157. package/esm2022/renderer/components/field-head.component.mjs +0 -146
  158. package/esm2022/renderer/components/field-icon.component.mjs +0 -72
  159. package/esm2022/renderer/components/frozen-cells.component.mjs +0 -36
  160. package/esm2022/renderer/components/frozen-heads.component.mjs +0 -214
  161. package/esm2022/renderer/components/frozen-placeholder-cells.component.mjs +0 -38
  162. package/esm2022/renderer/components/heads.component.mjs +0 -38
  163. package/esm2022/renderer/components/hover-cell.component.mjs +0 -104
  164. package/esm2022/renderer/components/hover-row-heads.component.mjs +0 -132
  165. package/esm2022/renderer/components/icon.component.mjs +0 -84
  166. package/esm2022/renderer/components/index.mjs +0 -15
  167. package/esm2022/renderer/components/other-rows.component.mjs +0 -68
  168. package/esm2022/renderer/components/placeholder-cells.component.mjs +0 -33
  169. package/esm2022/renderer/components/text.component.mjs +0 -67
  170. package/esm2022/renderer/creations/create-active-cell-border.mjs +0 -70
  171. package/esm2022/renderer/creations/create-cells.mjs +0 -190
  172. package/esm2022/renderer/creations/create-heads.mjs +0 -51
  173. package/esm2022/renderer/drawers/add-row-layout-drawer.mjs +0 -98
  174. package/esm2022/renderer/drawers/cell-drawer.mjs +0 -673
  175. package/esm2022/renderer/drawers/drawer.mjs +0 -947
  176. package/esm2022/renderer/drawers/layout-drawer.mjs +0 -64
  177. package/esm2022/renderer/drawers/record-row-layout-drawer.mjs +0 -131
  178. package/esm2022/renderer/index.mjs +0 -4
  179. package/esm2022/renderer/interfaces/hover-cell.mjs +0 -4
  180. package/esm2022/renderer/interfaces/index.mjs +0 -2
  181. package/esm2022/renderer/renderer.component.mjs +0 -197
  182. package/esm2022/services/event.service.mjs +0 -241
  183. package/esm2022/services/field.service.mjs +0 -56
  184. package/esm2022/services/index.mjs +0 -4
  185. package/esm2022/services/selection.service.mjs +0 -151
  186. package/esm2022/types/avatar.mjs +0 -27
  187. package/esm2022/types/canvas.mjs +0 -2
  188. package/esm2022/types/cell.mjs +0 -2
  189. package/esm2022/types/clipboard.mjs +0 -2
  190. package/esm2022/types/component-config.mjs +0 -7
  191. package/esm2022/types/field.mjs +0 -2
  192. package/esm2022/types/grid.mjs +0 -17
  193. package/esm2022/types/index.mjs +0 -10
  194. package/esm2022/types/layout.mjs +0 -2
  195. package/esm2022/types/row.mjs +0 -6
  196. package/esm2022/utils/build.mjs +0 -39
  197. package/esm2022/utils/cell.mjs +0 -80
  198. package/esm2022/utils/clear-cells.mjs +0 -23
  199. package/esm2022/utils/clipboard/clipboard.mjs +0 -88
  200. package/esm2022/utils/clipboard/copy.mjs +0 -99
  201. package/esm2022/utils/clipboard/extract.mjs +0 -38
  202. package/esm2022/utils/clipboard/index.mjs +0 -5
  203. package/esm2022/utils/clipboard/paste.mjs +0 -188
  204. package/esm2022/utils/common.mjs +0 -50
  205. package/esm2022/utils/field/field-operable.mjs +0 -2
  206. package/esm2022/utils/field/field.mjs +0 -20
  207. package/esm2022/utils/field/index.mjs +0 -4
  208. package/esm2022/utils/field/model/attachment.mjs +0 -56
  209. package/esm2022/utils/field/model/date.mjs +0 -141
  210. package/esm2022/utils/field/model/index.mjs +0 -12
  211. package/esm2022/utils/field/model/link.mjs +0 -56
  212. package/esm2022/utils/field/model/member.mjs +0 -81
  213. package/esm2022/utils/field/model/number.mjs +0 -59
  214. package/esm2022/utils/field/model/progress.mjs +0 -69
  215. package/esm2022/utils/field/model/rate.mjs +0 -58
  216. package/esm2022/utils/field/model/rich-text.mjs +0 -39
  217. package/esm2022/utils/field/model/select.mjs +0 -131
  218. package/esm2022/utils/field/model/text.mjs +0 -32
  219. package/esm2022/utils/field/operate.mjs +0 -73
  220. package/esm2022/utils/file.mjs +0 -116
  221. package/esm2022/utils/get-placeholder-cells.mjs +0 -66
  222. package/esm2022/utils/get-text-width.mjs +0 -30
  223. package/esm2022/utils/hover-cell.mjs +0 -25
  224. package/esm2022/utils/i18n.mjs +0 -87
  225. package/esm2022/utils/image-cache.mjs +0 -57
  226. package/esm2022/utils/index.mjs +0 -19
  227. package/esm2022/utils/match-keywords.mjs +0 -15
  228. package/esm2022/utils/os.mjs +0 -16
  229. package/esm2022/utils/position.mjs +0 -48
  230. package/esm2022/utils/style.mjs +0 -37
  231. package/esm2022/utils/text-measure.mjs +0 -122
  232. package/esm2022/utils/visible-range.mjs +0 -42
@@ -1,947 +0,0 @@
1
- import GraphemeSplitter from 'grapheme-splitter';
2
- import { AI_TABLE_OFFSET, AI_TABLE_TAG_FONT_SIZE, AI_TABLE_TAG_PADDING, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_FONT_WEIGHT, DEFAULT_TEXT_ALIGN_CENTER, DEFAULT_TEXT_ALIGN_LEFT, DEFAULT_TEXT_DECORATION, DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE, DEFAULT_TEXT_VERTICAL_ALIGN_TOP, DEFAULT_WRAP_TEXT_MAX_ROW, FONT_SIZE_SM, WebOutlinedPath } from '../../constants';
3
- import { AITable } from '../../core';
4
- import { AITableAvatarSize, AITableAvatarType } from '../../types';
5
- import { getTextWidth, imageCache, textDataCache, TextMeasure } from '../../utils';
6
- // 用于正确地分割字符串,包括表情符号
7
- export const graphemeSplitter = new GraphemeSplitter();
8
- /**
9
- * 用于在 Canvas 上进行的各种绘图操作,包含了文本绘制、矩形绘制、路径绘制以及一些几何计算等功能
10
- */
11
- export class Drawer {
12
- constructor() {
13
- this.ctx = TextMeasure().context;
14
- this.needDraw = false;
15
- this.colors = AITable.getColors();
16
- }
17
- initCtx(ctx) {
18
- this.needDraw = Boolean(ctx);
19
- this.ctx = ctx || TextMeasure().context;
20
- /**
21
- * textBaseline 指定为 middle,兼容浏览器差异
22
- */
23
- this.ctx.textBaseline = DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE;
24
- }
25
- // 设置样式
26
- setStyle(options) {
27
- const { fontSize, fontWeight, fillStyle, strokeStyle } = options;
28
- if (fontSize || fontWeight) {
29
- this.ctx.font = `${fontWeight || DEFAULT_FONT_WEIGHT} ${fontSize || DEFAULT_FONT_SIZE}px ${DEFAULT_FONT_FAMILY}`;
30
- }
31
- if (fillStyle) {
32
- this.ctx.fillStyle = fillStyle;
33
- }
34
- if (strokeStyle) {
35
- this.ctx.strokeStyle = strokeStyle;
36
- }
37
- }
38
- // 文本省略
39
- textEllipsis(options) {
40
- const { text, maxWidth, fontSize = DEFAULT_FONT_SIZE, fontWeight = DEFAULT_FONT_WEIGHT } = options;
41
- if (text == null)
42
- return {
43
- text: '',
44
- textWidth: 0,
45
- isEllipsis: false
46
- };
47
- const fontStyle = `${fontWeight} ${fontSize}px ${DEFAULT_FONT_FAMILY}`;
48
- if (!maxWidth) {
49
- return {
50
- text,
51
- textWidth: getTextWidth(this.ctx, text, fontStyle),
52
- isEllipsis: false
53
- };
54
- }
55
- const ellipsis = '…';
56
- const textSize = text.length;
57
- // 预先确定传入文本的阈值宽度
58
- let guessSize = Math.ceil(maxWidth / fontSize);
59
- let guessText = text.substr(0, guessSize);
60
- let guessWidth = getTextWidth(this.ctx, guessText, fontStyle);
61
- while (guessWidth <= maxWidth) {
62
- if (textSize <= guessSize) {
63
- return {
64
- text,
65
- textWidth: guessWidth,
66
- isEllipsis: false
67
- };
68
- }
69
- guessSize++;
70
- guessText = text.substr(0, guessSize);
71
- guessWidth = getTextWidth(this.ctx, guessText, fontStyle);
72
- }
73
- const ellipsisWidth = getTextWidth(this.ctx, ellipsis, fontStyle);
74
- while (guessSize >= 0 && guessWidth + ellipsisWidth > maxWidth) {
75
- guessSize--;
76
- guessText = text.substr(0, guessSize);
77
- guessWidth = getTextWidth(this.ctx, guessText, fontStyle);
78
- }
79
- return {
80
- text: `${guessText || text[0]}${ellipsis}`,
81
- textWidth: maxWidth,
82
- isEllipsis: true
83
- };
84
- }
85
- // 绘制线段
86
- line(options) {
87
- const { x, y, points, stroke, closed = false } = options;
88
- const length = points.length;
89
- this.ctx.save();
90
- this.ctx.beginPath();
91
- if (stroke)
92
- this.ctx.strokeStyle = stroke;
93
- this.ctx.lineWidth = 1;
94
- this.ctx.translate(x, y);
95
- this.ctx.moveTo(points[0], points[1]);
96
- for (let n = 2; n < length; n += 2) {
97
- this.ctx.lineTo(points[n], points[n + 1]);
98
- }
99
- if (closed) {
100
- this.ctx.closePath();
101
- }
102
- this.ctx.stroke();
103
- this.ctx.restore();
104
- }
105
- // 绘制圆
106
- arc(options) {
107
- const { x, y, stroke, fill, radius } = options;
108
- this.ctx.beginPath();
109
- if (fill)
110
- this.setStyle({ fillStyle: fill });
111
- if (stroke)
112
- this.setStyle({ strokeStyle: stroke });
113
- this.ctx.arc(x, y, radius, 0, 2 * Math.PI, false);
114
- if (fill) {
115
- this.ctx.fill();
116
- }
117
- if (stroke) {
118
- this.ctx.stroke();
119
- }
120
- }
121
- // 绘制矩形
122
- rect(options) {
123
- const { x, y, width, height, radius, fill, stroke } = options;
124
- this.ctx.beginPath();
125
- if (fill)
126
- this.setStyle({ fillStyle: fill });
127
- if (stroke)
128
- this.setStyle({ strokeStyle: stroke });
129
- if (!radius) {
130
- this.ctx.rect(x, y, width, height);
131
- }
132
- else {
133
- let topLeft = 0;
134
- let topRight = 0;
135
- let bottomLeft = 0;
136
- let bottomRight = 0;
137
- if (typeof radius === 'number') {
138
- topLeft = topRight = bottomLeft = bottomRight = Math.min(radius, width / 2, height / 2);
139
- }
140
- else {
141
- topLeft = Math.min(radius[0] || 0, width / 2, height / 2);
142
- topRight = Math.min(radius[1] || 0, width / 2, height / 2);
143
- bottomRight = Math.min(radius[2] || 0, width / 2, height / 2);
144
- bottomLeft = Math.min(radius[3] || 0, width / 2, height / 2);
145
- }
146
- this.ctx.moveTo(x + topLeft, y);
147
- this.ctx.lineTo(x + width - topRight, y);
148
- this.ctx.arc(x + width - topRight, y + topRight, topRight, (Math.PI * 3) / 2, 0, false);
149
- this.ctx.lineTo(x + width, y + height - bottomRight);
150
- this.ctx.arc(x + width - bottomRight, y + height - bottomRight, bottomRight, 0, Math.PI / 2, false);
151
- this.ctx.lineTo(x + bottomLeft, y + height);
152
- this.ctx.arc(x + bottomLeft, y + height - bottomLeft, bottomLeft, Math.PI / 2, Math.PI, false);
153
- this.ctx.lineTo(x, y + topLeft);
154
- this.ctx.arc(x + topLeft, y + topLeft, topLeft, Math.PI, (Math.PI * 3) / 2, false);
155
- }
156
- this.ctx.closePath();
157
- if (fill) {
158
- this.ctx.fill();
159
- }
160
- if (stroke) {
161
- this.ctx.stroke();
162
- }
163
- }
164
- customRect(options) {
165
- const { x, y, width, height, fill, strokes } = options;
166
- if (fill)
167
- this.setStyle({ fillStyle: fill });
168
- this.ctx.fillRect(x, y, width, height);
169
- if (strokes) {
170
- const { top, right, bottom, left } = strokes;
171
- // 上边框
172
- this.ctx.beginPath();
173
- this.setStyle({ strokeStyle: top ?? this.colors.transparent });
174
- this.ctx.moveTo(x, y);
175
- this.ctx.lineTo(x + width, y);
176
- this.ctx.stroke();
177
- // 右边框
178
- this.ctx.beginPath();
179
- this.setStyle({ strokeStyle: right ?? this.colors.transparent });
180
- this.ctx.moveTo(x + width, y);
181
- this.ctx.lineTo(x + width, y + height);
182
- this.ctx.stroke();
183
- // 下边框
184
- this.ctx.beginPath();
185
- this.setStyle({ strokeStyle: bottom ?? this.colors.transparent });
186
- this.ctx.moveTo(x, y + height);
187
- this.ctx.lineTo(x + width, y + height);
188
- this.ctx.stroke();
189
- // 左边框
190
- this.ctx.beginPath();
191
- this.setStyle({ strokeStyle: left ?? this.colors.transparent });
192
- this.ctx.moveTo(x, y);
193
- this.ctx.lineTo(x, y + height);
194
- this.ctx.stroke();
195
- }
196
- }
197
- // 换行文本绘制
198
- wrapText(options) {
199
- const { x, y, text, maxWidth, lineHeight, maxRow = DEFAULT_WRAP_TEXT_MAX_ROW, fontSize = DEFAULT_FONT_SIZE, fillStyle = this.colors.gray800, textAlign = DEFAULT_TEXT_ALIGN_LEFT, verticalAlign = DEFAULT_TEXT_VERTICAL_ALIGN_TOP, fontWeight = DEFAULT_FONT_WEIGHT, textDecoration = DEFAULT_TEXT_DECORATION, fieldType, needDraw = false } = options;
200
- let offsetX = 0;
201
- let offsetY = 0;
202
- const fontStyle = `${fontWeight} ${fontSize}px ${DEFAULT_FONT_FAMILY}`;
203
- const baselineOffset = verticalAlign === DEFAULT_TEXT_VERTICAL_ALIGN_TOP ? fontSize / 2 : 0;
204
- const fontStyleKey = `${fontWeight}-${fontSize}px`;
205
- const isUnderline = textDecoration === 'underline';
206
- this.ctx.font = fontStyle;
207
- const textRenderer = (textDataList) => {
208
- textDataList.forEach((data) => {
209
- const { offsetX, offsetY, text, width, linkUrl } = data;
210
- this.ctx.fillText(text, x + offsetX, y + offsetY + baselineOffset);
211
- if (linkUrl || isUnderline) {
212
- this.line({
213
- x: x + offsetX,
214
- y: y + offsetY + AI_TABLE_OFFSET,
215
- points: [0, fontSize, width, fontSize],
216
- stroke: fillStyle
217
- });
218
- }
219
- });
220
- };
221
- if (fillStyle)
222
- this.setStyle({ fillStyle });
223
- this.ctx.textAlign = textAlign;
224
- const cacheKey = `${fontStyleKey}-${maxRow}-${maxWidth || 0}-${fieldType}-${text}`;
225
- const cacheTextData = textDataCache.get(cacheKey);
226
- if (cacheTextData) {
227
- if (this.needDraw && needDraw) {
228
- textRenderer(cacheTextData.data);
229
- }
230
- return cacheTextData;
231
- }
232
- const resultData = [];
233
- // 准确切分包含表情符号的字符串
234
- const arrText = graphemeSplitter.splitGraphemes(text);
235
- const textLength = arrText.length;
236
- const ellipsisWidth = this.ctx.measureText('…').width;
237
- let showText = ''; // 每个片段显示的文本
238
- let showTextWidth = 0; // 每段的宽度
239
- let showLineWidth = 0; // 当前每行显示文字的宽度
240
- let rowCount = 0;
241
- const isEllipsis = this.textEllipsis({ text, maxWidth: maxWidth }).isEllipsis;
242
- for (let n = 0; n < textLength; n++) {
243
- const curText = arrText[n];
244
- const isLineBreak = ['\n', '\r'].includes(curText);
245
- const singleText = isLineBreak ? '' : curText;
246
- const composeText = showText + singleText;
247
- const isLimitRow = maxRow ? rowCount >= maxRow - 1 : false;
248
- const singleTextWidth = isLineBreak ? 0 : this.ctx.measureText(singleText).width;
249
- showLineWidth += singleTextWidth;
250
- const diffWidth = isLimitRow ? showLineWidth + (isEllipsis ? ellipsisWidth : 0) : showLineWidth;
251
- const isLineEnd = diffWidth > maxWidth;
252
- // 遇到换行符或行尾
253
- if ((isLineEnd || isLineBreak) && rowCount < maxRow) {
254
- const isLastLetter = n === arrText.length - 1;
255
- resultData.push({
256
- offsetX,
257
- offsetY,
258
- width: Math.ceil(showTextWidth),
259
- text: isLimitRow ? (isLastLetter ? composeText : `${showText}…`) : showText
260
- });
261
- showText = singleText;
262
- offsetX = 0;
263
- showTextWidth = singleTextWidth;
264
- showLineWidth = singleTextWidth;
265
- if (isLimitRow) {
266
- showText = '';
267
- break;
268
- }
269
- rowCount++;
270
- offsetY += lineHeight;
271
- continue;
272
- }
273
- showText = composeText;
274
- showTextWidth += singleTextWidth;
275
- }
276
- if (showText) {
277
- resultData.push({
278
- offsetX,
279
- offsetY,
280
- width: Math.ceil(showTextWidth),
281
- text: showText
282
- });
283
- }
284
- if (this.needDraw && needDraw) {
285
- textRenderer(resultData);
286
- }
287
- const res = {
288
- height: rowCount < maxRow ? offsetY + lineHeight : offsetY,
289
- data: resultData
290
- };
291
- textDataCache.set(cacheKey, res);
292
- return res;
293
- }
294
- // 绘制单行文本
295
- text(options) {
296
- const { x, y, text, fontSize = DEFAULT_FONT_SIZE, fillStyle = this.colors.gray800, textAlign = DEFAULT_TEXT_ALIGN_LEFT, verticalAlign = DEFAULT_TEXT_VERTICAL_ALIGN_TOP, fontWeight = DEFAULT_FONT_WEIGHT, textDecoration = DEFAULT_TEXT_DECORATION } = options;
297
- const fontStyle = `${fontWeight} ${fontSize}px ${DEFAULT_FONT_FAMILY}`;
298
- if (textDecoration === 'underline') {
299
- const textWidth = getTextWidth(this.ctx, text, fontStyle);
300
- this.line({
301
- x: x,
302
- y: y + AI_TABLE_OFFSET,
303
- points: [0, fontSize, textWidth, fontSize],
304
- stroke: fillStyle
305
- });
306
- }
307
- const baselineOffset = verticalAlign === DEFAULT_TEXT_VERTICAL_ALIGN_TOP ? fontSize / 2 : 0;
308
- if (fillStyle)
309
- this.setStyle({ fillStyle });
310
- this.ctx.textAlign = textAlign;
311
- this.ctx.font = fontStyle;
312
- this.ctx.fillText(text, x, y + baselineOffset);
313
- }
314
- // 绘制标签
315
- tag(options) {
316
- const { x, y, width, height, text, radius, background, color = this.colors.gray800, fontSize = AI_TABLE_TAG_FONT_SIZE, fontWeight = DEFAULT_FONT_WEIGHT, stroke } = options;
317
- // 背景
318
- this.rect({
319
- x,
320
- y,
321
- width,
322
- height,
323
- radius,
324
- fill: background,
325
- stroke
326
- });
327
- this.text({
328
- x: x + AI_TABLE_TAG_PADDING,
329
- y: y + (height - fontSize) / 2,
330
- text,
331
- fillStyle: color,
332
- fontSize,
333
- fontWeight
334
- });
335
- return {
336
- width,
337
- height
338
- };
339
- }
340
- image(options, crossOrigin, allowDefault) {
341
- const { x, y, url, width, height, opacity = 1, clipFunc } = options;
342
- const colors = AITable.getColors();
343
- if (!url) {
344
- return;
345
- }
346
- const image = imageCache.getImage(url);
347
- // Not loaded successfully
348
- if (image === false) {
349
- if (allowDefault) {
350
- this.path({
351
- x,
352
- y: y + 2,
353
- data: WebOutlinedPath,
354
- size: 16,
355
- fill: colors.gray600
356
- });
357
- }
358
- else {
359
- imageCache.imageMapOnload(() => {
360
- this.image(options, crossOrigin, allowDefault);
361
- });
362
- }
363
- return;
364
- }
365
- // Unloaded
366
- if (image == null) {
367
- imageCache.loadImage(url, url, { crossOrigin });
368
- imageCache.imageMapOnload(() => {
369
- this.image(options, crossOrigin, allowDefault);
370
- });
371
- return;
372
- }
373
- const isOrigin = opacity === 1;
374
- if (!clipFunc && isOrigin) {
375
- return this.ctx.drawImage(image, x, y, width, height);
376
- }
377
- if (!clipFunc && !isOrigin) {
378
- this.ctx.save();
379
- this.ctx.globalAlpha = opacity;
380
- this.ctx.drawImage(image, x, y, width, height);
381
- this.ctx.restore();
382
- return;
383
- }
384
- if (clipFunc) {
385
- this.ctx.save();
386
- this.ctx.beginPath();
387
- clipFunc(this.ctx);
388
- this.ctx.clip();
389
- this.ctx.globalAlpha = opacity;
390
- this.ctx.drawImage(image, x, y, width, height);
391
- this.ctx.restore();
392
- }
393
- }
394
- avatar(options) {
395
- const { x = 0, y = 0, id, url, title, bgColor = this.colors.white, size = AITableAvatarSize.size36, type = AITableAvatarType.member, opacity = 1 } = options;
396
- if (title == null || id == null)
397
- return null;
398
- const colors = AITable.getColors();
399
- const avatarSrc = url || '';
400
- const avatarName = title;
401
- const avatarBg = avatarSrc ? colors.white : bgColor;
402
- switch (type) {
403
- case AITableAvatarType.member: {
404
- const radius = size / 2;
405
- if (!avatarSrc) {
406
- this.ctx.fillStyle = avatarBg;
407
- this.ctx.beginPath();
408
- this.ctx.arc(x + radius, y + radius, radius, 0, Math.PI * 2, false);
409
- this.ctx.closePath();
410
- this.ctx.fill();
411
- return this.text({
412
- x: x + radius,
413
- y: y + radius,
414
- text: avatarName,
415
- textAlign: DEFAULT_TEXT_ALIGN_CENTER,
416
- verticalAlign: DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE,
417
- fontSize: FONT_SIZE_SM,
418
- fillStyle: colors.white
419
- });
420
- }
421
- return this.image({
422
- name: avatarSrc,
423
- x,
424
- y,
425
- url: avatarSrc,
426
- width: size,
427
- height: size,
428
- clipFunc: (ctx) => {
429
- ctx.fillStyle = avatarBg;
430
- ctx.arc(x + radius, y + radius, radius, 0, Math.PI * 2, false);
431
- ctx.fill();
432
- },
433
- opacity
434
- });
435
- }
436
- }
437
- }
438
- /**
439
- * 方法将椭圆弧的端点参数化形式转换为中心参数化形式
440
- * 接受弧线的端点参数,并计算出弧线的中心点坐标、起始角度、终止角度等参数
441
- * 返回值:一个包含中心点坐标、半径、旋转角度、起始角度以及角度差的对象,这些参数可以直接用于绘制椭圆弧
442
- * @returns [cx, cy, rx, ry, theta, dTheta, psi, fs]
443
- */
444
- convertEndpointToCenterParameterization(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg) {
445
- const psi = psiDeg * (Math.PI / 180.0);
446
- const xp = (Math.cos(psi) * (x1 - x2)) / 2.0 + (Math.sin(psi) * (y1 - y2)) / 2.0;
447
- const yp = (-1 * Math.sin(psi) * (x1 - x2)) / 2.0 + (Math.cos(psi) * (y1 - y2)) / 2.0;
448
- const lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);
449
- if (lambda > 1) {
450
- rx *= Math.sqrt(lambda);
451
- ry *= Math.sqrt(lambda);
452
- }
453
- let f = Math.sqrt((rx * rx * (ry * ry) - rx * rx * (yp * yp) - ry * ry * (xp * xp)) / (rx * rx * (yp * yp) + ry * ry * (xp * xp)));
454
- if (fa === fs) {
455
- f *= -1;
456
- }
457
- if (isNaN(f)) {
458
- f = 0;
459
- }
460
- const cxp = (f * rx * yp) / ry;
461
- const cyp = (f * -ry * xp) / rx;
462
- const cx = (x1 + x2) / 2.0 + Math.cos(psi) * cxp - Math.sin(psi) * cyp;
463
- const cy = (y1 + y2) / 2.0 + Math.sin(psi) * cxp + Math.cos(psi) * cyp;
464
- const vMag = function (v) {
465
- return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
466
- };
467
- const vRatio = function (u, v) {
468
- return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));
469
- };
470
- const vAngle = function (u, v) {
471
- return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v));
472
- };
473
- const theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]);
474
- const u = [(xp - cxp) / rx, (yp - cyp) / ry];
475
- const v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];
476
- let dTheta = vAngle(u, v);
477
- if (vRatio(u, v) <= -1) {
478
- dTheta = Math.PI;
479
- }
480
- if (vRatio(u, v) >= 1) {
481
- dTheta = 0;
482
- }
483
- if (fs === 0 && dTheta > 0) {
484
- dTheta = dTheta - 2 * Math.PI;
485
- }
486
- if (fs === 1 && dTheta < 0) {
487
- dTheta = dTheta + 2 * Math.PI;
488
- }
489
- return [cx, cy, rx, ry, theta, dTheta, psi, fs];
490
- }
491
- /**
492
- * 计算两个点 (x1, y1) 和 (x2, y2) 之间的直线距离
493
- * @returns 两个点 (x1, y1) 和 (x2, y2) 之间的直线距离,单位与输入的坐标值相同
494
- */
495
- getLineLength(x1, y1, x2, y2) {
496
- return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
497
- }
498
- /**
499
- * 计算三次贝塞尔曲线上给定参数 t 对应的点的坐标.
500
- * 可以在指定的 t 参数下计算出曲线上精确的一个点,这个点可以用于绘制平滑曲线的一部分
501
- * @param pct - 0 到 1 之间的参数,用于指定曲线上的点的位置
502
- * @param P1x - 曲线的起点 x 坐标
503
- * @param P1y - 曲线的起点 y 坐标
504
- * @param P2x - 曲线的第一个控制点 x 坐标
505
- * @param P2y - 曲线的第一个控制点 y 坐标
506
- * @param P3x - 曲线的第二个控制点 x 坐标
507
- * @param P3y - 曲线的第二个控制点 y 坐标
508
- * @param P4x - 曲线的终点 x 坐标
509
- * @param P4y - 曲线的终点 y 坐标
510
- * @returns
511
- */
512
- getPointOnCubicBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y, P4x, P4y) {
513
- function CB1(t) {
514
- return t * t * t;
515
- }
516
- function CB2(t) {
517
- return 3 * t * t * (1 - t);
518
- }
519
- function CB3(t) {
520
- return 3 * t * (1 - t) * (1 - t);
521
- }
522
- function CB4(t) {
523
- return (1 - t) * (1 - t) * (1 - t);
524
- }
525
- const x = P4x * CB1(pct) + P3x * CB2(pct) + P2x * CB3(pct) + P1x * CB4(pct);
526
- const y = P4y * CB1(pct) + P3y * CB2(pct) + P2y * CB3(pct) + P1y * CB4(pct);
527
- return {
528
- x: x,
529
- y: y
530
- };
531
- }
532
- /**
533
- * 计算二次贝塞尔曲线上给定参数 t 对应的点的坐标
534
- * @param pct - 0 到 1 之间的参数,用于指定曲线上的点的位置
535
- * @param P1x - 曲线的起点 x 坐标
536
- * @param P1y - 曲线的起点 y 坐标
537
- * @param P2x - 曲线的控制点 x 坐标
538
- * @param P2y - 曲线的控制点 y 坐标
539
- * @param P3x - 曲线的终点 x 坐标
540
- * @param P3y - 曲线的终点 y 坐标
541
- * @returns
542
- */
543
- getPointOnQuadraticBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y) {
544
- function QB1(t) {
545
- return t * t;
546
- }
547
- function QB2(t) {
548
- return 2 * t * (1 - t);
549
- }
550
- function QB3(t) {
551
- return (1 - t) * (1 - t);
552
- }
553
- const x = P3x * QB1(pct) + P2x * QB2(pct) + P1x * QB3(pct);
554
- const y = P3y * QB1(pct) + P2y * QB2(pct) + P1y * QB3(pct);
555
- return {
556
- x: x,
557
- y: y
558
- };
559
- }
560
- /**
561
- * 计算椭圆弧上给定角度 θ 对应的点的坐标
562
- * @param cx - 椭圆的中心点 x 坐标
563
- * @param cy - 椭圆的中心点 y 坐标
564
- * @param rx - 椭圆的 x 轴半径
565
- * @param ry - 椭圆的 y 轴半径
566
- * @param theta - 椭圆弧的起始角度
567
- * @param psi - 椭圆弧的旋转角度
568
- * @returns
569
- */
570
- getPointOnEllipticalArc(cx, cy, rx, ry, theta, psi) {
571
- const cosPsi = Math.cos(psi);
572
- const sinPsi = Math.sin(psi);
573
- const pt = {
574
- x: rx * Math.cos(theta),
575
- y: ry * Math.sin(theta)
576
- };
577
- return {
578
- x: cx + (pt.x * cosPsi - pt.y * sinPsi),
579
- y: cy + (pt.x * sinPsi + pt.y * cosPsi)
580
- };
581
- }
582
- /**
583
- * 计算基于不同路径命令的长度
584
- * @param x - 起点 x 坐标
585
- * @param y - 起点 y 坐标
586
- * @param cmd - 路径命令
587
- * @param points - 与路径命令相关的点的坐标或控制参数
588
- * @returns
589
- */
590
- calcLength(x, y, cmd, points) {
591
- let len, p1, p2, t;
592
- switch (cmd) {
593
- case 'L':
594
- return this.getLineLength(x, y, points[0], points[1]);
595
- case 'C':
596
- len = 0.0;
597
- p1 = this.getPointOnCubicBezier(0, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);
598
- for (t = 0.01; t <= 1; t += 0.01) {
599
- p2 = this.getPointOnCubicBezier(t, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);
600
- len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
601
- p1 = p2;
602
- }
603
- return len;
604
- case 'Q':
605
- len = 0.0;
606
- p1 = this.getPointOnQuadraticBezier(0, x, y, points[0], points[1], points[2], points[3]);
607
- for (t = 0.01; t <= 1; t += 0.01) {
608
- p2 = this.getPointOnQuadraticBezier(t, x, y, points[0], points[1], points[2], points[3]);
609
- len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
610
- p1 = p2;
611
- }
612
- return len;
613
- case 'A':
614
- len = 0.0;
615
- const start = points[4];
616
- const dTheta = points[5];
617
- const end = points[4] + dTheta;
618
- let inc = Math.PI / 180.0;
619
- if (Math.abs(start - end) < inc) {
620
- inc = Math.abs(start - end);
621
- }
622
- p1 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], start, 0);
623
- if (dTheta < 0) {
624
- for (t = start - inc; t > end; t -= inc) {
625
- p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);
626
- len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
627
- p1 = p2;
628
- }
629
- }
630
- else {
631
- for (t = start + inc; t < end; t += inc) {
632
- p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);
633
- len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
634
- p1 = p2;
635
- }
636
- }
637
- p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], end, 0);
638
- len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
639
- return len;
640
- }
641
- return 0;
642
- }
643
- /**
644
- * 解析 SVG 路径数据字符串,将其转换为一个包含路径命令和坐标点的数组对象
645
- * @param data - SVG 路径数据字符串
646
- * @returns
647
- */
648
- parsePathData(data) {
649
- if (!data) {
650
- return [];
651
- }
652
- let cs = data;
653
- const cc = ['m', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z', 'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'];
654
- cs = cs.replace(new RegExp(' ', 'g'), ',');
655
- for (let n = 0; n < cc.length; n++) {
656
- cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);
657
- }
658
- const arr = cs.split('|');
659
- const ca = [];
660
- const coords = [];
661
- let cpx = 0;
662
- let cpy = 0;
663
- const re = /([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/gi;
664
- let match;
665
- for (let n = 1; n < arr.length; n++) {
666
- let str = arr[n];
667
- let c = str.charAt(0);
668
- str = str.slice(1);
669
- coords.length = 0;
670
- while ((match = re.exec(str))) {
671
- coords.push(match[0]);
672
- }
673
- const p = [];
674
- for (let j = 0, jlen = coords.length; j < jlen; j++) {
675
- if (coords[j] === '00') {
676
- p.push(0, 0);
677
- continue;
678
- }
679
- const parsed = parseFloat(coords[j]);
680
- if (!isNaN(parsed)) {
681
- p.push(parsed);
682
- }
683
- else {
684
- p.push(0);
685
- }
686
- }
687
- while (p.length > 0) {
688
- if (isNaN(p[0])) {
689
- break;
690
- }
691
- let cmd = null;
692
- let points = [];
693
- const startX = cpx;
694
- const startY = cpy;
695
- let prevCmd, ctlPtx, ctlPty;
696
- let rx, ry, psi, fa, fs, x1, y1;
697
- switch (c) {
698
- case 'l':
699
- cpx += p.shift();
700
- cpy += p.shift();
701
- cmd = 'L';
702
- points.push(cpx, cpy);
703
- break;
704
- case 'L':
705
- cpx = p.shift();
706
- cpy = p.shift();
707
- points.push(cpx, cpy);
708
- break;
709
- case 'm':
710
- const dx = p.shift();
711
- const dy = p.shift();
712
- cpx += dx;
713
- cpy += dy;
714
- cmd = 'M';
715
- if (ca.length > 2 && ca[ca.length - 1].command === 'z') {
716
- for (let idx = ca.length - 2; idx >= 0; idx--) {
717
- if (ca[idx].command === 'M') {
718
- cpx = ca[idx].points[0] + dx;
719
- cpy = ca[idx].points[1] + dy;
720
- break;
721
- }
722
- }
723
- }
724
- points.push(cpx, cpy);
725
- c = 'l';
726
- break;
727
- case 'M':
728
- cpx = p.shift();
729
- cpy = p.shift();
730
- cmd = 'M';
731
- points.push(cpx, cpy);
732
- c = 'L';
733
- break;
734
- case 'h':
735
- cpx += p.shift();
736
- cmd = 'L';
737
- points.push(cpx, cpy);
738
- break;
739
- case 'H':
740
- cpx = p.shift();
741
- cmd = 'L';
742
- points.push(cpx, cpy);
743
- break;
744
- case 'v':
745
- cpy += p.shift();
746
- cmd = 'L';
747
- points.push(cpx, cpy);
748
- break;
749
- case 'V':
750
- cpy = p.shift();
751
- cmd = 'L';
752
- points.push(cpx, cpy);
753
- break;
754
- case 'C':
755
- points.push(p.shift(), p.shift(), p.shift(), p.shift());
756
- cpx = p.shift();
757
- cpy = p.shift();
758
- points.push(cpx, cpy);
759
- break;
760
- case 'c':
761
- points.push(cpx + p.shift(), cpy + p.shift(), cpx + p.shift(), cpy + p.shift());
762
- cpx += p.shift();
763
- cpy += p.shift();
764
- cmd = 'C';
765
- points.push(cpx, cpy);
766
- break;
767
- case 'S':
768
- ctlPtx = cpx;
769
- ctlPty = cpy;
770
- prevCmd = ca[ca.length - 1];
771
- if (prevCmd.command === 'C') {
772
- ctlPtx = cpx + (cpx - prevCmd.points[2]);
773
- ctlPty = cpy + (cpy - prevCmd.points[3]);
774
- }
775
- points.push(ctlPtx, ctlPty, p.shift(), p.shift());
776
- cpx = p.shift();
777
- cpy = p.shift();
778
- cmd = 'C';
779
- points.push(cpx, cpy);
780
- break;
781
- case 's':
782
- ctlPtx = cpx;
783
- ctlPty = cpy;
784
- prevCmd = ca[ca.length - 1];
785
- if (prevCmd.command === 'C') {
786
- ctlPtx = cpx + (cpx - prevCmd.points[2]);
787
- ctlPty = cpy + (cpy - prevCmd.points[3]);
788
- }
789
- points.push(ctlPtx, ctlPty, cpx + p.shift(), cpy + p.shift());
790
- cpx += p.shift();
791
- cpy += p.shift();
792
- cmd = 'C';
793
- points.push(cpx, cpy);
794
- break;
795
- case 'Q':
796
- points.push(p.shift(), p.shift());
797
- cpx = p.shift();
798
- cpy = p.shift();
799
- points.push(cpx, cpy);
800
- break;
801
- case 'q':
802
- points.push(cpx + p.shift(), cpy + p.shift());
803
- cpx += p.shift();
804
- cpy += p.shift();
805
- cmd = 'Q';
806
- points.push(cpx, cpy);
807
- break;
808
- case 'T':
809
- ctlPtx = cpx;
810
- ctlPty = cpy;
811
- prevCmd = ca[ca.length - 1];
812
- if (prevCmd.command === 'Q') {
813
- ctlPtx = cpx + (cpx - prevCmd.points[0]);
814
- ctlPty = cpy + (cpy - prevCmd.points[1]);
815
- }
816
- cpx = p.shift();
817
- cpy = p.shift();
818
- cmd = 'Q';
819
- points.push(ctlPtx, ctlPty, cpx, cpy);
820
- break;
821
- case 't':
822
- ctlPtx = cpx;
823
- ctlPty = cpy;
824
- prevCmd = ca[ca.length - 1];
825
- if (prevCmd.command === 'Q') {
826
- ctlPtx = cpx + (cpx - prevCmd.points[0]);
827
- ctlPty = cpy + (cpy - prevCmd.points[1]);
828
- }
829
- cpx += p.shift();
830
- cpy += p.shift();
831
- cmd = 'Q';
832
- points.push(ctlPtx, ctlPty, cpx, cpy);
833
- break;
834
- case 'A':
835
- rx = p.shift();
836
- ry = p.shift();
837
- psi = p.shift();
838
- fa = p.shift();
839
- fs = p.shift();
840
- x1 = cpx;
841
- y1 = cpy;
842
- cpx = p.shift();
843
- cpy = p.shift();
844
- cmd = 'A';
845
- points = this.convertEndpointToCenterParameterization(x1, y1, cpx, cpy, fa, fs, rx, ry, psi);
846
- break;
847
- case 'a':
848
- rx = p.shift();
849
- ry = p.shift();
850
- psi = p.shift();
851
- fa = p.shift();
852
- fs = p.shift();
853
- x1 = cpx;
854
- y1 = cpy;
855
- cpx += p.shift();
856
- cpy += p.shift();
857
- cmd = 'A';
858
- points = this.convertEndpointToCenterParameterization(x1, y1, cpx, cpy, fa, fs, rx, ry, psi);
859
- break;
860
- }
861
- ca.push({
862
- command: cmd || c,
863
- points: points,
864
- start: {
865
- x: startX,
866
- y: startY
867
- },
868
- pathLength: this.calcLength(startX, startY, cmd || c, points)
869
- });
870
- }
871
- if (c === 'z' || c === 'Z') {
872
- ca.push({
873
- command: 'z',
874
- points: [],
875
- start: undefined,
876
- pathLength: 0
877
- });
878
- }
879
- }
880
- return ca;
881
- }
882
- /**
883
- * 根据传入的路径数据 data 在画布上绘制路径
884
- * @param options
885
- */
886
- path(options) {
887
- const { x, y, scaleX = 1, scaleY = 1, data, fill } = options;
888
- const dataArray = this.parsePathData(data);
889
- this.ctx.save();
890
- this.ctx.beginPath();
891
- this.ctx.fillStyle = fill;
892
- this.ctx.translate(x, y);
893
- this.ctx.scale(scaleX, scaleY);
894
- let isClosed = false;
895
- for (let n = 0; n < dataArray.length; n++) {
896
- const c = dataArray[n].command;
897
- const p = dataArray[n].points;
898
- switch (c) {
899
- case 'L':
900
- this.ctx.lineTo(p[0], p[1]);
901
- break;
902
- case 'M':
903
- this.ctx.moveTo(p[0], p[1]);
904
- break;
905
- case 'C':
906
- this.ctx.bezierCurveTo(p[0], p[1], p[2], p[3], p[4], p[5]);
907
- break;
908
- case 'Q':
909
- this.ctx.quadraticCurveTo(p[0], p[1], p[2], p[3]);
910
- break;
911
- case 'A':
912
- const cx = p[0];
913
- const cy = p[1];
914
- const rx = p[2];
915
- const ry = p[3];
916
- const theta = p[4];
917
- const dTheta = p[5];
918
- const psi = p[6];
919
- const fs = p[7];
920
- const r = rx > ry ? rx : ry;
921
- const scaleX = rx > ry ? 1 : rx / ry;
922
- const scaleY = rx > ry ? ry / rx : 1;
923
- this.ctx.translate(cx, cy);
924
- this.ctx.rotate(psi);
925
- this.ctx.scale(scaleX, scaleY);
926
- this.ctx.arc(0, 0, r, theta, theta + dTheta, (1 - fs));
927
- this.ctx.scale(1 / scaleX, 1 / scaleY);
928
- this.ctx.rotate(-psi);
929
- this.ctx.translate(-cx, -cy);
930
- break;
931
- case 'z':
932
- isClosed = true;
933
- this.ctx.closePath();
934
- break;
935
- }
936
- }
937
- if (!isClosed) {
938
- this.ctx.stroke();
939
- }
940
- else {
941
- this.ctx.fill();
942
- }
943
- this.ctx.restore();
944
- }
945
- }
946
- export const drawer = new Drawer();
947
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JpZC9zcmMvcmVuZGVyZXIvZHJhd2Vycy9kcmF3ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxnQkFBZ0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQ0gsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qix1QkFBdUIsRUFDdkIsa0NBQWtDLEVBQ2xDLCtCQUErQixFQUMvQix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLGVBQWUsRUFDbEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFFSCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBVXBCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbkYsb0JBQW9CO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztBQUV2RDs7R0FFRztBQUNILE1BQU0sT0FBTyxNQUFNO0lBQW5CO1FBQ0ksUUFBRyxHQUE2QixXQUFXLEVBQUUsQ0FBQyxPQUFRLENBQUM7UUFDdkQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixXQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBNGpDakMsQ0FBQztJQTFqQ1UsT0FBTyxDQUFDLEdBQTZCO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLFdBQVcsRUFB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QUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7WUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsUUFBUSxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3hGLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxHQUFHLENB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R0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUV0RixNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUU3RCxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNiLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkksSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDWixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDWixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNYLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMvQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFaEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3ZFLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUV2RSxNQUFNLElBQUksR0FBRyxVQUFVLENBQVc7WUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBVyxFQUFFLENBQVc7WUFDN0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBVyxFQUFFLENBQVc7WUFDN0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFMUIsSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFD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RyxHQUFHLENBQUM7d0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3RCLE1BQU07b0JBQ1YsS0FBSyxHQUFHO3dCQUNKLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2hCLEdBQUcsR0FBRyxHQUFHLENBQUM7d0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3RCLE1BQU07b0JBQ1YsS0FBSyxHQUFHO3dCQUNKLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2pCLEdBQUcsR0FBRyxHQUFHLENBQUM7d0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3RCLE1BQU07b0JBQ1YsS0FBSyxHQUFHO3dCQUNKLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2hCLEdBQUcsR0FBRyxHQUFHLENBQUM7d0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3RCLE1BQU07b0JBQ1YsS0FBSyxHQUFHO3dCQUNKLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7d0JBQ3hELEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2hCLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QixNQUFNO29CQUNWLEtBQUssR0FBRzt3QkFDSixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQzt3QkFDaEYsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDakIsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDakIsR0FBRyxHQUFHLEdBQUcsQ0FBQzt3QkFDVixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDdEIsTUFBTTtvQkFDVixLQUFLLEdBQUc7d0JBQ0osTUFBTSxHQUFHLEdBQUcsQ0FBQzt3QkFDYixNQUFNLEdBQUcsR0FBRyxDQUFDO3dCQUNiLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDNUIsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLEdBQUcsRUFBRSxDQUFDOzRCQUMxQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDekMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzdDLENBQUM7d0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQzt3QkFDbEQsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDaEIsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDaEIsR0FBRyxHQUFHLEdBQUcsQ0FBQzt3QkFDVixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDdEIsTUFBTTtvQkFDVixLQUFLLEdBQUc7d0JBQ0osTUFBTSxHQUFHLEdBQUcsQ0FBQzt3QkFDYixNQUFNLEdBQUcsR0FBRyxDQUFDO3dCQUNiLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDNUIsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLEdBQUcsRUFBRSxDQUFDOzRCQUMxQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDekMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzdDLENBQUM7d0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO3dCQUM5RCxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNqQixHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNqQixHQUFHLEdBQUcsR0FBRyxDQUFDO3dCQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QixNQUFNO29CQUNWLEtBQUssR0FBRzt3QkFDSixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQzt3QkFDbEMsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDaEIsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3RCLE1BQU07b0JBQ1YsS0FBSyxHQUFHO3dCQUNKLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7d0JBQzlDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2pCLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2pCLEdBQUcsR0FBRyxHQUFHLENBQUM7d0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3RCLE1BQU07b0JBQ1YsS0FBSyxHQUFHO3dCQUNKLE1BQU0sR0FBRyxHQUFHLENBQUM7d0JBQ2IsTUFBTSxHQUFHLEdBQUcsQ0FBQzt3QkFDYixPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQzVCLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQzs0QkFDMUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3pDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3QyxDQUFDO3dCQUNELEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2hCLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2hCLEdBQUcsR0FBRyxHQUFHLENBQUM7d0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDdEMsTUFBTTtvQkFDVixLQUFLLEdBQUc7d0JBQ0osTUFBTSxHQUFHLEdBQUcsQ0FBQzt3QkFDYixNQUFNLEdBQUcsR0FBRyxDQUFDO3dCQUNiLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDNUIsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLEdBQUcsRUFBRSxDQUFDOzRCQUMxQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDekMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzdDLENBQUM7d0JBQ0QsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDakIsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDakIsR0FBRyxHQUFHLEdBQUcsQ0FBQzt3QkFDVixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QyxNQUFNO29CQUNWLEtBQUssR0FBRzt3QkFDSixFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2YsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNmLEVBQUUsR0FBRyxHQUFHLENBQUM7d0JBQ1QsRUFBRSxHQUFHLEdBQUcsQ0FBQzt3QkFDVCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNoQixHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNoQixHQUFHLEdBQUcsR0FBRyxDQUFDO3dCQUNWLE1BQU0sR0FBRyxJQUFJLENBQUMsdUNBQXVDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDN0YsTUFBTTtvQkFDVixLQUFLLEdBQUc7d0JBQ0osRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNmLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixFQUFFLEdBQUcsR0FBRyxDQUFDO3dCQUNULEVBQUUsR0FBRyxHQUFHLENBQUM7d0JBQ1QsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDakIsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDakIsR0FBRyxHQUFHLEdBQUcsQ0FBQzt3QkFDVixNQUFNLEdBQUcsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQzdGLE1BQU07Z0JBQ2QsQ0FBQztnQkFFRCxFQUFFLENBQUMsSUFBSSxDQUFDO29CQUNKLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztvQkFDakIsTUFBTSxFQUFFLE1BQU07b0JBQ2QsS0FBSyxFQUFFO3dCQUNILENBQUMsRUFBRSxNQUFNO3dCQUNULENBQUMsRUFBRSxNQUFNO3FCQUNaO29CQUNELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7aUJBQ2hFLENBQUMsQ0FBQztZQUNQLENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUN6QixFQUFFLENBQUMsSUFBSSxDQUFDO29CQUNKLE9BQU8sRUFBRSxHQUFHO29CQUNaLE1BQU0sRUFBRSxFQUFFO29CQUNWLEtBQUssRUFBRSxTQUFTO29CQUNoQixVQUFVLEVBQUUsQ0FBQztpQkFDaEIsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSSxJQUFJLENBQUMsT0FBOEc7UUFDdEgsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0IsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUMvQixNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ1IsS0FBSyxHQUFHO29CQUNKLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUIsTUFBTTtnQkFDVixLQUFLLEdBQUc7b0JBQ0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1QixNQUFNO2dCQUNWLEtBQUssR0FBRztvQkFDSixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzRCxNQUFNO2dCQUNWLEtBQUssR0FBRztvQkFDSixJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxNQUFNO2dCQUNWLEtBQUssR0FBRztvQkFDSixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbkIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNwQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2pCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzVCLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztvQkFDckMsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUVyQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBUSxDQUFDLENBQUM7b0JBQzlELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO29CQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUU3QixNQUFNO2dCQUNWLEtBQUssR0FBRztvQkFDSixRQUFRLEdBQUcsSUFBSSxDQUFDO29CQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNyQixNQUFNO1lBQ2QsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN2QixDQUFDO0NBQ0o7QUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHcmFwaGVtZVNwbGl0dGVyIGZyb20gJ2dyYXBoZW1lLXNwbGl0dGVyJztcbmltcG9ydCB7XG4gICAgQUlfVEFCTEVfT0ZGU0VULFxuICAgIEFJX1RBQkxFX1RBR19GT05UX1NJWkUsXG4gICAgQUlfVEFCTEVfVEFHX1BBRERJTkcsXG4gICAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgICBERUZBVUxUX0ZPTlRfU0laRSxcbiAgICBERUZBVUxUX0ZPTlRfV0VJR0hULFxuICAgIERFRkFVTFRfVEVYVF9BTElHTl9DRU5URVIsXG4gICAgREVGQVVMVF9URVhUX0FMSUdOX0xFRlQsXG4gICAgREVGQVVMVF9URVhUX0RFQ09SQVRJT04sXG4gICAgREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX01JRERMRSxcbiAgICBERUZBVUxUX1RFWFRfVkVSVElDQUxfQUxJR05fVE9QLFxuICAgIERFRkFVTFRfV1JBUF9URVhUX01BWF9ST1csXG4gICAgRk9OVF9TSVpFX1NNLFxuICAgIFdlYk91dGxpbmVkUGF0aFxufSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQUlUYWJsZSB9IGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBSVRhYmxlQXJjLFxuICAgIEFJVGFibGVBdmF0YXJTaXplLFxuICAgIEFJVGFibGVBdmF0YXJUeXBlLFxuICAgIEFJVGFibGVDdHhTdHlsZSxcbiAgICBBSVRhYmxlSW1hZ2UsXG4gICAgQUlUYWJsZUxhYmVsLFxuICAgIEFJVGFibGVMaW5lLFxuICAgIEFJVGFibGVSZWN0LFxuICAgIEFJVGFibGVUZXh0LFxuICAgIEFJVGFibGVUZXh0RWxsaXBzaXMsXG4gICAgQUlUYWJsZVdyYXBUZXh0LFxuICAgIEFJVGFibGVXcmFwVGV4dERhdGFcbn0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0VGV4dFdpZHRoLCBpbWFnZUNhY2hlLCB0ZXh0RGF0YUNhY2hlLCBUZXh0TWVhc3VyZSB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuLy8g55So5LqO5q2j56Gu5Zyw5YiG5Ymy5a2X56ym5Liy77yM5YyF5ous6KGo5oOF56ym5Y+3XG5leHBvcnQgY29uc3QgZ3JhcGhlbWVTcGxpdHRlciA9IG5ldyBHcmFwaGVtZVNwbGl0dGVyKCk7XG5cbi8qKlxuICog55So5LqO5ZyoIENhbnZhcyDkuIrov5vooYznmoTlkITnp43nu5jlm77mk43kvZzvvIzljIXlkKvkuobmlofmnKznu5jliLbjgIHnn6nlvaLnu5jliLbjgIHot6/lvoTnu5jliLbku6Xlj4rkuIDkupvlh6DkvZXorqHnrpfnrYnlip/og71cbiAqL1xuZXhwb3J0IGNsYXNzIERyYXdlciB7XG4gICAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBUZXh0TWVhc3VyZSgpLmNvbnRleHQhO1xuICAgIG5lZWREcmF3ID0gZmFsc2U7XG4gICAgY29sb3JzID0gQUlUYWJsZS5nZXRDb2xvcnMoKTtcblxuICAgIHB1YmxpYyBpbml0Q3R4KGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSB7XG4gICAgICAgIHRoaXMubmVlZERyYXcgPSBCb29sZWFuKGN0eCk7XG4gICAgICAgIHRoaXMuY3R4ID0gY3R4IHx8IFRleHRNZWFzdXJlKCkuY29udGV4dCE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0ZXh0QmFzZWxpbmUg5oyH5a6a5Li6IG1pZGRsZe+8jOWFvOWuuea1j+iniOWZqOW3ruW8glxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jdHgudGV4dEJhc2VsaW5lID0gREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX01JRERMRTtcbiAgICB9XG5cbiAgICAvLyDorr7nva7moLflvI9cbiAgICBwdWJsaWMgc2V0U3R5bGUob3B0aW9uczogQUlUYWJsZUN0eFN0eWxlKSB7XG4gICAgICAgIGNvbnN0IHsgZm9udFNpemUsIGZvbnRXZWlnaHQsIGZpbGxTdHlsZSwgc3Ryb2tlU3R5bGUgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKGZvbnRTaXplIHx8IGZvbnRXZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LmZvbnQgPSBgJHtmb250V2VpZ2h0IHx8IERFRkFVTFRfRk9OVF9XRUlHSFR9ICR7Zm9udFNpemUgfHwgREVGQVVMVF9GT05UX1NJWkV9cHggJHtERUZBVUxUX0ZPTlRfRkFNSUxZfWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGxTdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gZmlsbFN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJva2VTdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOaWh+acrOecgeeVpVxuICAgIHB1YmxpYyB0ZXh0RWxsaXBzaXMob3B0aW9uczogQUlUYWJsZVRleHRFbGxpcHNpcykge1xuICAgICAgICBjb25zdCB7IHRleHQsIG1heFdpZHRoLCBmb250U2l6ZSA9IERFRkFVTFRfRk9OVF9TSVpFLCBmb250V2VpZ2h0ID0gREVGQVVMVF9GT05UX1dFSUdIVCB9ID0gb3B0aW9ucztcblxuICAgICAgICBpZiAodGV4dCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICAgICAgICB0ZXh0V2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgaXNFbGxpcHNpczogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZvbnRTdHlsZSA9IGAke2ZvbnRXZWlnaHR9ICR7Zm9udFNpemV9cHggJHtERUZBVUxUX0ZPTlRfRkFNSUxZfWA7XG5cbiAgICAgICAgaWYgKCFtYXhXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgIHRleHRXaWR0aDogZ2V0VGV4dFdpZHRoKHRoaXMuY3R4LCB0ZXh0LCBmb250U3R5bGUpLFxuICAgICAgICAgICAgICAgIGlzRWxsaXBzaXM6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxsaXBzaXMgPSAn4oCmJztcbiAgICAgICAgY29uc3QgdGV4dFNpemUgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgLy8g6aKE5YWI56Gu5a6a5Lyg5YWl5paH5pys55qE6ZiI5YC85a695bqmXG4gICAgICAgIGxldCBndWVzc1NpemUgPSBNYXRoLmNlaWwobWF4V2lkdGggLyBmb250U2l6ZSk7XG4gICAgICAgIGxldCBndWVzc1RleHQgPSB0ZXh0LnN1YnN0cigwLCBndWVzc1NpemUpO1xuICAgICAgICBsZXQgZ3Vlc3NXaWR0aCA9IGdldFRleHRXaWR0aCh0aGlzLmN0eCwgZ3Vlc3NUZXh0LCBmb250U3R5bGUpO1xuXG4gICAgICAgIHdoaWxlIChndWVzc1dpZHRoIDw9IG1heFdpZHRoKSB7XG4gICAgICAgICAgICBpZiAodGV4dFNpemUgPD0gZ3Vlc3NTaXplKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dFdpZHRoOiBndWVzc1dpZHRoLFxuICAgICAgICAgICAgICAgICAgICBpc0VsbGlwc2lzOiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBndWVzc1NpemUrKztcbiAgICAgICAgICAgIGd1ZXNzVGV4dCA9IHRleHQuc3Vic3RyKDAsIGd1ZXNzU2l6ZSk7XG4gICAgICAgICAgICBndWVzc1dpZHRoID0gZ2V0VGV4dFdpZHRoKHRoaXMuY3R4LCBndWVzc1RleHQsIGZvbnRTdHlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGxpcHNpc1dpZHRoID0gZ2V0VGV4dFdpZHRoKHRoaXMuY3R4LCBlbGxpcHNpcywgZm9udFN0eWxlKTtcbiAgICAgICAgd2hpbGUgKGd1ZXNzU2l6ZSA+PSAwICYmIGd1ZXNzV2lkdGggKyBlbGxpcHNpc1dpZHRoID4gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGd1ZXNzU2l6ZS0tO1xuICAgICAgICAgICAgZ3Vlc3NUZXh0ID0gdGV4dC5zdWJzdHIoMCwgZ3Vlc3NTaXplKTtcbiAgICAgICAgICAgIGd1ZXNzV2lkdGggPSBnZXRUZXh0V2lkdGgodGhpcy5jdHgsIGd1ZXNzVGV4dCwgZm9udFN0eWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0OiBgJHtndWVzc1RleHQgfHwgdGV4dFswXX0ke2VsbGlwc2lzfWAsXG4gICAgICAgICAgICB0ZXh0V2lkdGg6IG1heFdpZHRoLFxuICAgICAgICAgICAgaXNFbGxpcHNpczogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIOe7mOWItue6v+autVxuICAgIHB1YmxpYyBsaW5lKG9wdGlvbnM6IEFJVGFibGVMaW5lKSB7XG4gICAgICAgIGNvbnN0IHsgeCwgeSwgcG9pbnRzLCBzdHJva2UsIGNsb3NlZCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBwb2ludHMubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGlmIChzdHJva2UpIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gc3Ryb2tlO1xuICAgICAgICB0aGlzLmN0eC5saW5lV2lkdGggPSAxO1xuICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUoeCwgeSk7XG4gICAgICAgIHRoaXMuY3R4Lm1vdmVUbyhwb2ludHNbMF0sIHBvaW50c1sxXSk7XG5cbiAgICAgICAgZm9yIChsZXQgbiA9IDI7IG4gPCBsZW5ndGg7IG4gKz0gMikge1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHBvaW50c1tuXSwgcG9pbnRzW24gKyAxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgIH1cblxuICAgIC8vIOe7mOWItuWchlxuICAgIHB1YmxpYyBhcmMob3B0aW9uczogQUlUYWJsZUFyYykge1xuICAgICAgICBjb25zdCB7IHgsIHksIHN0cm9rZSwgZmlsbCwgcmFkaXVzIH0gPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgaWYgKGZpbGwpIHRoaXMuc2V0U3R5bGUoeyBmaWxsU3R5bGU6IGZpbGwgfSk7XG4gICAgICAgIGlmIChzdHJva2UpIHRoaXMuc2V0U3R5bGUoeyBzdHJva2VTdHlsZTogc3Ryb2tlIH0pO1xuICAgICAgICB0aGlzLmN0eC5hcmMoeCwgeSwgcmFkaXVzLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgICBpZiAoZmlsbCkge1xuICAgICAgICAgICAgdGhpcy5jdHguZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJva2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g57uY5Yi255+p5b2iXG4gICAgcHVibGljIHJlY3Qob3B0aW9uczogQUlUYWJsZVJlY3QpIHtcbiAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMsIGZpbGwsIHN0cm9rZSB9ID0gb3B0aW9ucztcblxuICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgaWYgKGZpbGwpIHRoaXMuc2V0U3R5bGUoeyBmaWxsU3R5bGU6IGZpbGwgfSk7XG4gICAgICAgIGlmIChzdHJva2UpIHRoaXMuc2V0U3R5bGUoeyBzdHJva2VTdHlsZTogc3Ryb2tlIH0pO1xuXG4gICAgICAgIGlmICghcmFkaXVzKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRvcExlZnQgPSAwO1xuICAgICAgICAgICAgbGV0IHRvcFJpZ2h0ID0gMDtcbiAgICAgICAgICAgIGxldCBib3R0b21MZWZ0ID0gMDtcbiAgICAgICAgICAgIGxldCBib3R0b21SaWdodCA9IDA7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmFkaXVzID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRvcExlZnQgPSB0b3BSaWdodCA9IGJvdHRvbUxlZnQgPSBib3R0b21SaWdodCA9IE1hdGgubWluKHJhZGl1cywgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9wTGVmdCA9IE1hdGgubWluKHJhZGl1c1swXSB8fCAwLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgIHRvcFJpZ2h0ID0gTWF0aC5taW4ocmFkaXVzWzFdIHx8IDAsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgYm90dG9tUmlnaHQgPSBNYXRoLm1pbihyYWRpdXNbMl0gfHwgMCwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICAgICAgICAgICAgICBib3R0b21MZWZ0ID0gTWF0aC5taW4ocmFkaXVzWzNdIHx8IDAsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY3R4Lm1vdmVUbyh4ICsgdG9wTGVmdCwgeSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8oeCArIHdpZHRoIC0gdG9wUmlnaHQsIHkpO1xuICAgICAgICAgICAgdGhpcy5jdHguYXJjKHggKyB3aWR0aCAtIHRvcFJpZ2h0LCB5ICsgdG9wUmlnaHQsIHRvcFJpZ2h0LCAoTWF0aC5QSSAqIDMpIC8gMiwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIGJvdHRvbVJpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmFyYyh4ICsgd2lkdGggLSBib3R0b21SaWdodCwgeSArIGhlaWdodCAtIGJvdHRvbVJpZ2h0LCBib3R0b21SaWdodCwgMCwgTWF0aC5QSSAvIDIsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmxpbmVUbyh4ICsgYm90dG9tTGVmdCwgeSArIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5hcmMoeCArIGJvdHRvbUxlZnQsIHkgKyBoZWlnaHQgLSBib3R0b21MZWZ0LCBib3R0b21MZWZ0LCBNYXRoLlBJIC8gMiwgTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHgsIHkgKyB0b3BMZWZ0KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmFyYyh4ICsgdG9wTGVmdCwgeSArIHRvcExlZnQsIHRvcExlZnQsIE1hdGguUEksIChNYXRoLlBJICogMykgLyAyLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN0eC5jbG9zZVBhdGgoKTtcblxuICAgICAgICBpZiAoZmlsbCkge1xuICAgICAgICAgICAgdGhpcy5jdHguZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJva2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGN1c3RvbVJlY3Qob3B0aW9uczogQUlUYWJsZVJlY3QpIHtcbiAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsLCBzdHJva2VzIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoZmlsbCkgdGhpcy5zZXRTdHlsZSh7IGZpbGxTdHlsZTogZmlsbCB9KTtcbiAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGlmIChzdHJva2VzKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCB9ID0gc3Ryb2tlcztcbiAgICAgICAgICAgIC8vIOS4iui+ueahhlxuICAgICAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0eWxlKHsgc3Ryb2tlU3R5bGU6IHRvcCA/PyB0aGlzLmNvbG9ycy50cmFuc3BhcmVudCB9KTtcbiAgICAgICAgICAgIHRoaXMuY3R4Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmxpbmVUbyh4ICsgd2lkdGgsIHkpO1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAvLyDlj7PovrnmoYZcbiAgICAgICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdHlsZSh7IHN0cm9rZVN0eWxlOiByaWdodCA/PyB0aGlzLmNvbG9ycy50cmFuc3BhcmVudCB9KTtcbiAgICAgICAgICAgIHRoaXMuY3R4Lm1vdmVUbyh4ICsgd2lkdGgsIHkpO1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgIC8vIOS4i+i+ueahhlxuICAgICAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0eWxlKHsgc3Ryb2tlU3R5bGU6IGJvdHRvbSA/PyB0aGlzLmNvbG9ycy50cmFuc3BhcmVudCB9KTtcbiAgICAgICAgICAgIHRoaXMuY3R4Lm1vdmVUbyh4LCB5ICsgaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmxpbmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAvLyDlt6bovrnmoYZcbiAgICAgICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdHlsZSh7IHN0cm9rZVN0eWxlOiBsZWZ0ID8/IHRoaXMuY29sb3JzLnRyYW5zcGFyZW50IH0pO1xuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHgsIHkgKyBoZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDmjaLooYzmlofmnKznu5jliLZcbiAgICBwdWJsaWMgd3JhcFRleHQob3B0aW9uczogQUlUYWJsZVdyYXBUZXh0KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICAgICAgbGluZUhlaWdodCxcbiAgICAgICAgICAgIG1heFJvdyA9IERFRkFVTFRfV1JBUF9URVhUX01BWF9ST1csXG4gICAgICAgICAgICBmb250U2l6ZSA9IERFRkFVTFRfRk9OVF9TSVpFLFxuICAgICAgICAgICAgZmlsbFN0eWxlID0gdGhpcy5jb2xvcnMuZ3JheTgwMCxcbiAgICAgICAgICAgIHRleHRBbGlnbiA9IERFRkFVTFRfVEVYVF9BTElHTl9MRUZULFxuICAgICAgICAgICAgdmVydGljYWxBbGlnbiA9IERFRkFVTFRfVEVYVF9WRVJUSUNBTF9BTElHTl9UT1AsXG4gICAgICAgICAgICBmb250V2VpZ2h0ID0gREVGQVVMVF9GT05UX1dFSUdIVCxcbiAgICAgICAgICAgIHRleHREZWNvcmF0aW9uID0gREVGQVVMVF9URVhUX0RFQ09SQVRJT04sXG4gICAgICAgICAgICBmaWVsZFR5cGUsXG4gICAgICAgICAgICBuZWVkRHJhdyA9IGZhbHNlXG4gICAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXRZID0gMDtcbiAgICAgICAgY29uc3QgZm9udFN0eWxlID0gYCR7Zm9udFdlaWdodH0gJHtmb250U2l6ZX1weCAke0RFRkFVTFRfRk9OVF9GQU1JTFl9YDtcbiAgICAgICAgY29uc3QgYmFzZWxpbmVPZmZzZXQgPSB2ZXJ0aWNhbEFsaWduID09PSBERUZBVUxUX1RFWFRfVkVSVElDQUxfQUxJR05fVE9QID8gZm9udFNpemUgLyAyIDogMDtcbiAgICAgICAgY29uc3QgZm9udFN0eWxlS2V5ID0gYCR7Zm9udFdlaWdodH0tJHtmb250U2l6ZX1weGA7XG4gICAgICAgIGNvbnN0IGlzVW5kZXJsaW5lID0gdGV4dERlY29yYXRpb24gPT09ICd1bmRlcmxpbmUnO1xuICAgICAgICB0aGlzLmN0eC5mb250ID0gZm9udFN0eWxlO1xuICAgICAgICBjb25zdCB0ZXh0UmVuZGVyZXIgPSAodGV4dERhdGFMaXN0OiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgdGV4dERhdGFMaXN0LmZvckVhY2goKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG9mZnNldFgsIG9mZnNldFksIHRleHQsIHdpZHRoLCBsaW5rVXJsIH0gPSBkYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuY3R4LmZpbGxUZXh0KHRleHQsIHggKyBvZmZzZXRYLCB5ICsgb2Zmc2V0WSArIGJhc2VsaW5lT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBpZiAobGlua1VybCB8fCBpc1VuZGVybGluZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogeCArIG9mZnNldFgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiB5ICsgb2Zmc2V0WSArIEFJX1RBQkxFX09GRlNFVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50czogWzAsIGZvbnRTaXplLCB3aWR0aCwgZm9udFNpemVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBmaWxsU3R5bGVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGZpbGxTdHlsZSkgdGhpcy5zZXRTdHlsZSh7IGZpbGxTdHlsZSB9KTtcbiAgICAgICAgdGhpcy5jdHgudGV4dEFsaWduID0gdGV4dEFsaWduO1xuICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2ZvbnRTdHlsZUtleX0tJHttYXhSb3d9LSR7bWF4V2lkdGggfHwgMH0tJHtmaWVsZFR5cGV9LSR7dGV4dH1gO1xuICAgICAgICBjb25zdCBjYWNoZVRleHREYXRhID0gdGV4dERhdGFDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICBpZiAoY2FjaGVUZXh0RGF0YSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmVlZERyYXcgJiYgbmVlZERyYXcpIHtcbiAgICAgICAgICAgICAgICB0ZXh0UmVuZGVyZXIoY2FjaGVUZXh0RGF0YS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjYWNoZVRleHREYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0RGF0YTogQUlUYWJsZVdyYXBUZXh0RGF0YSA9IFtdO1xuICAgICAgICAvLyDlh4bnoa7liIfliIbljIXlkKvooajmg4XnrKblj7fnmoTlrZfnrKbkuLJcbiAgICAgICAgY29uc3QgYXJyVGV4dCA9IGdyYXBoZW1lU3BsaXR0ZXIuc3BsaXRHcmFwaGVtZXModGV4dCk7XG4gICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSBhcnJUZXh0Lmxlbmd0aDtcbiAgICAgICAgY29uc3QgZWxsaXBzaXNXaWR0aCA9IHRoaXMuY3R4Lm1lYXN1cmVUZXh0KCfigKYnKS53aWR0aDtcbiAgICAgICAgbGV0IHNob3dUZXh0ID0gJyc7IC8vIOavj+S4queJh+auteaYvuekuueahOaWh+acrFxuICAgICAgICBsZXQgc2hvd1RleHRXaWR0aCA9IDA7IC8vIOavj+auteeahOWuveW6plxuICAgICAgICBsZXQgc2hvd0xpbmVXaWR0aCA9IDA7IC8vIOW9k+WJjeavj+ihjOaYvuekuuaWh+Wtl+eahOWuveW6plxuICAgICAgICBsZXQgcm93Q291bnQgPSAwO1xuXG4gICAgICAgIGNvbnN0IGlzRWxsaXBzaXMgPSB0aGlzLnRleHRFbGxpcHNpcyh7IHRleHQsIG1heFdpZHRoOiBtYXhXaWR0aCB9KS5pc0VsbGlwc2lzO1xuXG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGV4dExlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJUZXh0ID0gYXJyVGV4dFtuXTtcbiAgICAgICAgICAgIGNvbnN0IGlzTGluZUJyZWFrID0gWydcXG4nLCAnXFxyJ10uaW5jbHVkZXMoY3VyVGV4dCk7XG4gICAgICAgICAgICBjb25zdCBzaW5nbGVUZXh0ID0gaXNMaW5lQnJlYWsgPyAnJyA6IGN1clRleHQ7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NlVGV4dCA9IHNob3dUZXh0ICsgc2luZ2xlVGV4dDtcbiAgICAgICAgICAgIGNvbnN0IGlzTGltaXRSb3cgPSBtYXhSb3cgPyByb3dDb3VudCA+PSBtYXhSb3cgLSAxIDogZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBzaW5nbGVUZXh0V2lkdGggPSBpc0xpbmVCcmVhayA/IDAgOiB0aGlzLmN0eC5tZWFzdXJlVGV4dChzaW5nbGVUZXh0KS53aWR0aDtcbiAgICAgICAgICAgIHNob3dMaW5lV2lkdGggKz0gc2luZ2xlVGV4dFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgZGlmZldpZHRoID0gaXNMaW1pdFJvdyA/IHNob3dMaW5lV2lkdGggKyAoaXNFbGxpcHNpcyA/IGVsbGlwc2lzV2lkdGggOiAwKSA6IHNob3dMaW5lV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBpc0xpbmVFbmQgPSBkaWZmV2lkdGggPiBtYXhXaWR0aDtcblxuICAgICAgICAgICAgLy8g6YGH5Yiw5o2i6KGM56ym5oiW6KGM5bC+XG4gICAgICAgICAgICBpZiAoKGlzTGluZUVuZCB8fCBpc0xpbmVCcmVhaykgJiYgcm93Q291bnQgPCBtYXhSb3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0xhc3RMZXR0ZXIgPSBuID09PSBhcnJUZXh0Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgcmVzdWx0RGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IE1hdGguY2VpbChzaG93VGV4dFdpZHRoKSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogaXNMaW1pdFJvdyA/IChpc0xhc3RMZXR0ZXIgPyBjb21wb3NlVGV4dCA6IGAke3Nob3dUZXh0feKApmApIDogc2hvd1RleHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzaG93VGV4dCA9IHNpbmdsZVRleHQ7XG4gICAgICAgICAgICAgICAgb2Zmc2V0WCA9IDA7XG4gICAgICAgICAgICAgICAgc2hvd1RleHRXaWR0aCA9IHNpbmdsZVRleHRXaWR0aDtcbiAgICAgICAgICAgICAgICBzaG93TGluZVdpZHRoID0gc2luZ2xlVGV4dFdpZHRoO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTGltaXRSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd1RleHQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJvd0NvdW50Kys7XG4gICAgICAgICAgICAgICAgb2Zmc2V0WSArPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaG93VGV4dCA9IGNvbXBvc2VUZXh0O1xuICAgICAgICAgICAgc2hvd1RleHRXaWR0aCArPSBzaW5nbGVUZXh0V2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvd1RleHQpIHtcbiAgICAgICAgICAgIHJlc3VsdERhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgICAgICAgICBvZmZzZXRZLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBNYXRoLmNlaWwoc2hvd1RleHRXaWR0aCksXG4gICAgICAgICAgICAgICAgdGV4dDogc2hvd1RleHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmVlZERyYXcgJiYgbmVlZERyYXcpIHtcbiAgICAgICAgICAgIHRleHRSZW5kZXJlcihyZXN1bHREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgICAgIGhlaWdodDogcm93Q291bnQgPCBtYXhSb3cgPyBvZmZzZXRZICsgbGluZUhlaWdodCA6IG9mZnNldFksXG4gICAgICAgICAgICBkYXRhOiByZXN1bHREYXRhXG4gICAgICAgIH07XG5cbiAgICAgICAgdGV4dERhdGFDYWNoZS5zZXQoY2FjaGVLZXksIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8g57uY5Yi25Y2V6KGM5paH5pysXG4gICAgcHVibGljIHRleHQob3B0aW9uczogQUlUYWJsZVRleHQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHksXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgZm9udFNpemUgPSBERUZBVUxUX0ZPTlRfU0laRSxcbiAgICAgICAgICAgIGZpbGxTdHlsZSA9IHRoaXMuY29sb3JzLmdyYXk4MDAsXG4gICAgICAgICAgICB0ZXh0QWxpZ24gPSBERUZBVUxUX1RFWFRfQUxJR05fTEVGVCxcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ24gPSBERUZBVUxUX1RFWFRfVkVSVElDQUxfQUxJR05fVE9QLFxuICAgICAgICAgICAgZm9udFdlaWdodCA9IERFRkFVTFRfRk9OVF9XRUlHSFQsXG4gICAgICAgICAgICB0ZXh0RGVjb3JhdGlvbiA9IERFRkFVTFRfVEVYVF9ERUNPUkFUSU9OXG4gICAgICAgIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGNvbnN0IGZvbnRTdHlsZSA9IGAke2ZvbnRXZWlnaHR9ICR7Zm9udFNpemV9cHggJHtERUZBVUxUX0ZPTlRfRkFNSUxZfWA7XG5cbiAgICAgICAgaWYgKHRleHREZWNvcmF0aW9uID09PSAndW5kZXJsaW5lJykge1xuICAgICAgICAgICAgY29uc3QgdGV4dFdpZHRoID0gZ2V0VGV4dFdpZHRoKHRoaXMuY3R4LCB0ZXh0LCBmb250U3R5bGUpO1xuICAgICAgICAgICAgdGhpcy5saW5lKHtcbiAgICAgICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgICAgIHk6IHkgKyBBSV9UQUJMRV9PRkZTRVQsXG4gICAgICAgICAgICAgICAgcG9pbnRzOiBbMCwgZm9udFNpemUsIHRleHRXaWR0aCwgZm9udFNpemVdLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogZmlsbFN0eWxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lT2Zmc2V0ID0gdmVydGljYWxBbGlnbiA9PT0gREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX1RPUCA/IGZvbnRTaXplIC8gMiA6IDA7XG4gICAgICAgIGlmIChmaWxsU3R5bGUpIHRoaXMuc2V0U3R5bGUoeyBmaWxsU3R5bGUgfSk7XG4gICAgICAgIHRoaXMuY3R4LnRleHRBbGlnbiA9IHRleHRBbGlnbjtcbiAgICAgICAgdGhpcy5jdHguZm9udCA9IGZvbnRTdHlsZTtcbiAgICAgICAgdGhpcy5jdHguZmlsbFRleHQodGV4dCwgeCwgeSArIGJhc2VsaW5lT2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyDnu5jliLbmoIfnrb5cbiAgICBwdWJsaWMgdGFnKG9wdGlvbnM6IEFJVGFibGVMYWJlbCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgcmFkaXVzLFxuICAgICAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgICAgICAgIGNvbG9yID0gdGhpcy5jb2xvcnMuZ3JheTgwMCxcbiAgICAgICAgICAgIGZvbnRTaXplID0gQUlfVEFCTEVfVEFHX0ZPTlRfU0laRSxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQgPSBERUZBVUxUX0ZPTlRfV0VJR0hULFxuICAgICAgICAgICAgc3Ryb2tlXG4gICAgICAgIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIOiDjOaZr1xuICAgICAgICB0aGlzLnJlY3Qoe1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHksXG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIHJhZGl1cyxcbiAgICAgICAgICAgIGZpbGw6IGJhY2tncm91bmQsXG4gICAgICAgICAgICBzdHJva2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50ZXh0KHtcbiAgICAgICAgICAgIHg6IHggKyBBSV9UQUJMRV9UQUdfUEFERElORyxcbiAgICAgICAgICAgIHk6IHkgKyAoaGVpZ2h0IC0gZm9udFNpemUpIC8gMixcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICBmaWxsU3R5bGU6IGNvbG9yLFxuICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICBmb250V2VpZ2h0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBpbWFnZShvcHRpb25zOiBBSVRhYmxlSW1hZ2UsIGNyb3NzT3JpZ2luPzogYm9vbGVhbiwgYWxsb3dEZWZhdWx0PzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCB7IHgsIHksIHVybCwgd2lkdGgsIGhlaWdodCwgb3BhY2l0eSA9IDEsIGNsaXBGdW5jIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBjb2xvcnMgPSBBSVRhYmxlLmdldENvbG9ycygpO1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGltYWdlID0gaW1hZ2VDYWNoZS5nZXRJbWFnZSh1cmwpO1xuICAgICAgICAvLyBOb3QgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICBpZiAoaW1hZ2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoYWxsb3dEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXRoKHtcbiAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgeTogeSArIDIsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFdlYk91dGxpbmVkUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogMTYsXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IGNvbG9ycy5ncmF5NjAwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGltYWdlQ2FjaGUuaW1hZ2VNYXBPbmxvYWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlKG9wdGlvbnMsIGNyb3NzT3JpZ2luLCBhbGxvd0RlZmF1bHQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVubG9hZGVkXG4gICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpbWFnZUNhY2hlLmxvYWRJbWFnZSh1cmwsIHVybCwgeyBjcm9zc09yaWdpbiB9KTtcbiAgICAgICAgICAgIGltYWdlQ2FjaGUuaW1hZ2VNYXBPbmxvYWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2Uob3B0aW9ucywgY3Jvc3NPcmlnaW4sIGFsbG93RGVmYXVsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc09yaWdpbiA9IG9wYWNpdHkgPT09IDE7XG5cbiAgICAgICAgaWYgKCFjbGlwRnVuYyAmJiBpc09yaWdpbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3R4LmRyYXdJbWFnZShpbWFnZSwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNsaXBGdW5jICYmICFpc09yaWdpbikge1xuICAgICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSBvcGFjaXR5O1xuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKGltYWdlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbGlwRnVuYykge1xuICAgICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICBjbGlwRnVuYyh0aGlzLmN0eCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5jbGlwKCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG4gICAgICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGF2YXRhcihvcHRpb25zOiB7XG4gICAgICAgIHg6IG51bWJlcjtcbiAgICAgICAgeTogbnVtYmVyO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgdGl0bGU6IHN0cmluZztcbiAgICAgICAgdHlwZT86IEFJVGFibGVBdmF0YXJUeXBlO1xuICAgICAgICBzaXplPzogQUlUYWJsZUF2YXRhclNpemU7XG4gICAgICAgIG9wYWNpdHk/OiBudW1iZXI7XG4gICAgICAgIGJnQ29sb3I/OiBzdHJpbmc7XG4gICAgfSkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB4ID0gMCxcbiAgICAgICAgICAgIHkgPSAwLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIGJnQ29sb3IgPSB0aGlzLmNvbG9ycy53aGl0ZSxcbiAgICAgICAgICAgIHNpemUgPSBBSVRhYmxlQXZhdGFyU2l6ZS5zaXplMzYsXG4gICAgICAgICAgICB0eXBlID0gQUlUYWJsZUF2YXRhclR5cGUubWVtYmVyLFxuICAgICAgICAgICAgb3BhY2l0eSA9IDFcbiAgICAgICAgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKHRpdGxlID09IG51bGwgfHwgaWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGNvbG9ycyA9IEFJVGFibGUuZ2V0Q29sb3JzKCk7XG4gICAgICAgIGNvbnN0IGF2YXRhclNyYyA9IHVybCB8fCAnJztcbiAgICAgICAgY29uc3QgYXZhdGFyTmFtZSA9IHRpdGxlO1xuICAgICAgICBjb25zdCBhdmF0YXJCZyA9IGF2YXRhclNyYyA/IGNvbG9ycy53aGl0ZSA6IGJnQ29sb3I7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVBdmF0YXJUeXBlLm1lbWJlcjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IHNpemUgLyAyO1xuICAgICAgICAgICAgICAgIGlmICghYXZhdGFyU3JjKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGF2YXRhckJnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguYXJjKHggKyByYWRpdXMsIHkgKyByYWRpdXMsIHJhZGl1cywgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmZpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiB4ICsgcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogeSArIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGF2YXRhck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246IERFRkFVTFRfVEVYVF9BTElHTl9DRU5URVIsXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBERUZBVUxUX1RFWFRfVkVSVElDQUxfQUxJR05fTUlERExFLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IEZPTlRfU0laRV9TTSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogY29sb3JzLndoaXRlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbWFnZSh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGF2YXRhclNyYyxcbiAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBhdmF0YXJTcmMsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzaXplLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHNpemUsXG4gICAgICAgICAgICAgICAgICAgIGNsaXBGdW5jOiAoY3R4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gYXZhdGFyQmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYXJjKHggKyByYWRpdXMsIHkgKyByYWRpdXMsIHJhZGl1cywgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaWueazleWwhuakreWchuW8p+eahOerr+eCueWPguaVsOWMluW9ouW8j+i9rOaNouS4uuS4reW/g+WPguaVsOWMluW9ouW8j1xuICAgICAqIOaOpeWPl+W8p+e6v+eahOerr+eCueWPguaVsO+8jOW5tuiuoeeul+WHuuW8p+e6v+eahOS4reW/g+eCueWdkOagh+OAgei1t+Wni+inkuW6puOAgee7iOatouinkuW6puetieWPguaVsFxuICAgICAqIOi/lOWbnuWAvO+8muS4gOS4quWMheWQq+S4reW/g+eCueWdkOagh+OAgeWNiuW+hOOAgeaXi+i9rOinkuW6puOAgei1t+Wni+inkuW6puS7peWPiuinkuW6puW3rueahOWvueixoe+8jOi/meS6m+WPguaVsOWPr+S7peebtOaOpeeUqOS6jue7mOWItuakreWchuW8p1xuICAgICAqIEByZXR1cm5zIFtjeCwgY3ksIHJ4LCByeSwgdGhldGEsIGRUaGV0YSwgcHNpLCBmc11cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnZlcnRFbmRwb2ludFRvQ2VudGVyUGFyYW1ldGVyaXphdGlvbihcbiAgICAgICAgeDE6IG51bWJlcixcbiAgICAgICAgeTE6IG51bWJlcixcbiAgICAgICAgeDI6IG51bWJlcixcbiAgICAgICAgeTI6IG51bWJlcixcbiAgICAgICAgZmE6IGFueSxcbiAgICAgICAgZnM6IG51bWJlcixcbiAgICAgICAgcng6IG51bWJlcixcbiAgICAgICAgcnk6IG51bWJlcixcbiAgICAgICAgcHNpRGVnOiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgY29uc3QgcHNpID0gcHNpRGVnICogKE1hdGguUEkgLyAxODAuMCk7XG4gICAgICAgIGNvbnN0IHhwID0gKE1hdGguY29zKHBzaSkgKiAoeDEgLSB4MikpIC8gMi4wICsgKE1hdGguc2luKHBzaSkgKiAoeTEgLSB5MikpIC8gMi4wO1xuICAgICAgICBjb25zdCB5cCA9ICgtMSAqIE1hdGguc2luKHBzaSkgKiAoeDEgLSB4MikpIC8gMi4wICsgKE1hdGguY29zKHBzaSkgKiAoeTEgLSB5MikpIC8gMi4wO1xuXG4gICAgICAgIGNvbnN0IGxhbWJkYSA9ICh4cCAqIHhwKSAvIChyeCAqIHJ4KSArICh5cCAqIHlwKSAvIChyeSAqIHJ5KTtcblxuICAgICAgICBpZiAobGFtYmRhID4gMSkge1xuICAgICAgICAgICAgcnggKj0gTWF0aC5zcXJ0KGxhbWJkYSk7XG4gICAgICAgICAgICByeSAqPSBNYXRoLnNxcnQobGFtYmRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmID0gTWF0aC5zcXJ0KChyeCAqIHJ4ICogKHJ5ICogcnkpIC0gcnggKiByeCAqICh5cCAqIHlwKSAtIHJ5ICogcnkgKiAoeHAgKiB4cCkpIC8gKHJ4ICogcnggKiAoeXAgKiB5cCkgKyByeSAqIHJ5ICogKHhwICogeHApKSk7XG5cbiAgICAgICAgaWYgKGZhID09PSBmcykge1xuICAgICAgICAgICAgZiAqPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOYU4oZikpIHtcbiAgICAgICAgICAgIGYgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3hwID0gKGYgKiByeCAqIHlwKSAvIHJ5O1xuICAgICAgICBjb25zdCBjeXAgPSAoZiAqIC1yeSAqIHhwKSAvIHJ4O1xuXG4gICAgICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMi4wICsgTWF0aC5jb3MocHNpKSAqIGN4cCAtIE1hdGguc2luKHBzaSkgKiBjeXA7XG4gICAgICAgIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMi4wICsgTWF0aC5zaW4ocHNpKSAqIGN4cCArIE1hdGguY29zKHBzaSkgKiBjeXA7XG5cbiAgICAgICAgY29uc3Qgdk1hZyA9IGZ1bmN0aW9uICh2OiBudW1iZXJbXSkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydCh2WzBdICogdlswXSArIHZbMV0gKiB2WzFdKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdlJhdGlvID0gZnVuY3Rpb24gKHU6IG51bWJlcltdLCB2OiBudW1iZXJbXSkge1xuICAgICAgICAgICAgcmV0dXJuICh1WzBdICogdlswXSArIHVbMV0gKiB2WzFdKSAvICh2TWFnKHUpICogdk1hZyh2KSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHZBbmdsZSA9IGZ1bmN0aW9uICh1OiBudW1iZXJbXSwgdjogbnVtYmVyW10pIHtcbiAgICAgICAgICAgIHJldHVybiAodVswXSAqIHZbMV0gPCB1WzFdICogdlswXSA/IC0xIDogMSkgKiBNYXRoLmFjb3ModlJhdGlvKHUsIHYpKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdGhldGEgPSB2QW5nbGUoWzEsIDBdLCBbKHhwIC0gY3hwKSAvIHJ4LCAoeXAgLSBjeXApIC8gcnldKTtcbiAgICAgICAgY29uc3QgdSA9IFsoeHAgLSBjeHApIC8gcngsICh5cCAtIGN5cCkgLyByeV07XG4gICAgICAgIGNvbnN0IHYgPSBbKC0xICogeHAgLSBjeHApIC8gcngsICgtMSAqIHlwIC0gY3lwKSAvIHJ5XTtcbiAgICAgICAgbGV0IGRUaGV0YSA9IHZBbmdsZSh1LCB2KTtcblxuICAgICAgICBpZiAodlJhdGlvKHUsIHYpIDw9IC0xKSB7XG4gICAgICAgICAgICBkVGhldGEgPSBNYXRoLlBJO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2UmF0aW8odSwgdikgPj0gMSkge1xuICAgICAgICAgICAgZFRoZXRhID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnMgPT09IDAgJiYgZFRoZXRhID4gMCkge1xuICAgICAgICAgICAgZFRoZXRhID0gZFRoZXRhIC0gMiAqIE1hdGguUEk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZzID09PSAxICYmIGRUaGV0YSA8IDApIHtcbiAgICAgICAgICAgIGRUaGV0YSA9IGRUaGV0YSArIDIgKiBNYXRoLlBJO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY3gsIGN5LCByeCwgcnksIHRoZXRhLCBkVGhldGEsIHBzaSwgZnNdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+S4pOS4queCuSAoeDEsIHkxKSDlkowgKHgyLCB5Mikg5LmL6Ze055qE55u057q/6Led56a7XG4gICAgICogQHJldHVybnMg5Lik5Liq54K5ICh4MSwgeTEpIOWSjCAoeDIsIHkyKSDkuYvpl7TnmoTnm7Tnur/ot53nprvvvIzljZXkvY3kuI7ovpPlhaXnmoTlnZDmoIflgLznm7jlkIxcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldExpbmVMZW5ndGgoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KCh4MiAtIHgxKSAqICh4MiAtIHgxKSArICh5MiAtIHkxKSAqICh5MiAtIHkxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X5LiJ5qyh6LSd5aGe5bCU5puy57q/5LiK57uZ5a6a5Y+C5pWwIHQg5a+55bqU55qE54K555qE5Z2Q5qCHLlxuICAgICAqIOWPr+S7peWcqOaMh+WumueahCB0IOWPguaVsOS4i+iuoeeul+WHuuabsue6v+S4iueyvuehrueahOS4gOS4queCue+8jOi/meS4queCueWPr+S7peeUqOS6jue7mOWItuW5s+a7keabsue6v+eahOS4gOmDqOWIhlxuICAgICAqIEBwYXJhbSBwY3QgLSAwIOWIsCAxIOS5i+mXtOeahOWPguaVsO+8jOeUqOS6juaMh+Wumuabsue6v+S4iueahOeCueeahOS9jee9rlxuICAgICAqIEBwYXJhbSBQMXggLSDmm7Lnur/nmoTotbfngrkgeCDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDF5IC0g5puy57q/55qE6LW354K5IHkg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFAyeCAtIOabsue6v+eahOesrOS4gOS4quaOp+WItueCuSB4IOWdkOagh1xuICAgICAqIEBwYXJhbSBQMnkgLSDmm7Lnur/nmoTnrKzkuIDkuKrmjqfliLbngrkgeSDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDN4IC0g5puy57q/55qE56ys5LqM5Liq5o6n5Yi254K5IHgg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFAzeSAtIOabsue6v+eahOesrOS6jOS4quaOp+WItueCuSB5IOWdkOagh1xuICAgICAqIEBwYXJhbSBQNHggLSDmm7Lnur/nmoTnu4jngrkgeCDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDR5IC0g5puy57q/55qE57uI54K5IHkg5Z2Q5qCHXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFBvaW50T25DdWJpY0JlemllcihcbiAgICAgICAgcGN0OiBudW1iZXIsXG4gICAgICAgIFAxeDogbnVtYmVyLFxuICAgICAgICBQMXk6IG51bWJlcixcbiAgICAgICAgUDJ4OiBudW1iZXIsXG4gICAgICAgIFAyeTogbnVtYmVyLFxuICAgICAgICBQM3g6IG51bWJlcixcbiAgICAgICAgUDN5OiBudW1iZXIsXG4gICAgICAgIFA0eDogbnVtYmVyLFxuICAgICAgICBQNHk6IG51bWJlclxuICAgICkge1xuICAgICAgICBmdW5jdGlvbiBDQjEodDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdCAqIHQgKiB0O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gQ0IyKHQ6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIDMgKiB0ICogdCAqICgxIC0gdCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBDQjModDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gMyAqIHQgKiAoMSAtIHQpICogKDEgLSB0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIENCNCh0OiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoMSAtIHQpICogKDEgLSB0KSAqICgxIC0gdCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4ID0gUDR4ICogQ0IxKHBjdCkgKyBQM3ggKiBDQjIocGN0KSArIFAyeCAqIENCMyhwY3QpICsgUDF4ICogQ0I0KHBjdCk7XG4gICAgICAgIGNvbnN0IHkgPSBQNHkgKiBDQjEocGN0KSArIFAzeSAqIENCMihwY3QpICsgUDJ5ICogQ0IzKHBjdCkgKyBQMXkgKiBDQjQocGN0KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfkuozmrKHotJ3loZ7lsJTmm7Lnur/kuIrnu5nlrprlj4LmlbAgdCDlr7nlupTnmoTngrnnmoTlnZDmoIdcbiAgICAgKiBAcGFyYW0gcGN0IC0gMCDliLAgMSDkuYvpl7TnmoTlj4LmlbDvvIznlKjkuo7mjIflrprmm7Lnur/kuIrnmoTngrnnmoTkvY3nva5cbiAgICAgKiBAcGFyYW0gUDF4IC0g5puy57q/55qE6LW354K5IHgg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFAxeSAtIOabsue6v+eahOi1t+eCuSB5IOWdkOagh1xuICAgICAqIEBwYXJhbSBQMnggLSDmm7Lnur/nmoTmjqfliLbngrkgeCDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDJ5IC0g5puy57q/55qE5o6n5Yi254K5IHkg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFAzeCAtIOabsue6v+eahOe7iOeCuSB4IOWdkOagh1xuICAgICAqIEBwYXJhbSBQM3kgLSDmm7Lnur/nmoTnu4jngrkgeSDlnZDmoIdcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UG9pbnRPblF1YWRyYXRpY0JlemllcihwY3Q6IG51bWJlciwgUDF4OiBudW1iZXIsIFAxeTogbnVtYmVyLCBQMng6IG51bWJlciwgUDJ5OiBudW1iZXIsIFAzeDogbnVtYmVyLCBQM3k6IG51bWJlcikge1xuICAgICAgICBmdW5jdGlvbiBRQjEodDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdCAqIHQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBRQjIodDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gMiAqIHQgKiAoMSAtIHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gUUIzKHQ6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuICgxIC0gdCkgKiAoMSAtIHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeCA9IFAzeCAqIFFCMShwY3QpICsgUDJ4ICogUUIyKHBjdCkgKyBQMXggKiBRQjMocGN0KTtcbiAgICAgICAgY29uc3QgeSA9IFAzeSAqIFFCMShwY3QpICsgUDJ5ICogUUIyKHBjdCkgKyBQMXkgKiBRQjMocGN0KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfmpK3lnIblvKfkuIrnu5nlrprop5LluqYgzrgg5a+55bqU55qE54K555qE5Z2Q5qCHXG4gICAgICogQHBhcmFtIGN4IC0g5qSt5ZyG55qE5Lit5b+D54K5IHgg5Z2Q5qCHXG4gICAgICogQHBhcmFtIGN5IC0g5qSt5ZyG55qE5Lit5b+D54K5IHkg5Z2Q5qCHXG4gICAgICogQHBhcmFtIHJ4IC0g5qSt5ZyG55qEIHgg6L205Y2K5b6EXG4gICAgICogQHBhcmFtIHJ5IC0g5qSt5ZyG55qEIHkg6L205Y2K5b6EXG4gICAgICogQHBhcmFtIHRoZXRhIC0g5qSt5ZyG5byn55qE6LW35aeL6KeS5bqmXG4gICAgICogQHBhcmFtIHBzaSAtIOakreWchuW8p+eahOaXi+i9rOinkuW6plxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRQb2ludE9uRWxsaXB0aWNhbEFyYyhjeDogbnVtYmVyLCBjeTogbnVtYmVyLCByeDogbnVtYmVyLCByeTogbnVtYmVyLCB0aGV0YTogbnVtYmVyLCBwc2k6IG51bWJlcikge1xuICAgICAgICBjb25zdCBjb3NQc2kgPSBNYXRoLmNvcyhwc2kpO1xuICAgICAgICBjb25zdCBzaW5Qc2kgPSBNYXRoLnNpbihwc2kpO1xuICAgICAgICBjb25zdCBwdCA9IHtcbiAgICAgICAgICAgIHg6IHJ4ICogTWF0aC5jb3ModGhldGEpLFxuICAgICAgICAgICAgeTogcnkgKiBNYXRoLnNpbih0aGV0YSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IGN4ICsgKHB0LnggKiBjb3NQc2kgLSBwdC55ICogc2luUHNpKSxcbiAgICAgICAgICAgIHk6IGN5ICsgKHB0LnggKiBzaW5Qc2kgKyBwdC55ICogY29zUHNpKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+WfuuS6juS4jeWQjOi3r+W+hOWRveS7pOeahOmVv+W6plxuICAgICAqIEBwYXJhbSB4IC0g6LW354K5IHgg5Z2Q5qCHXG4gICAgICogQHBhcmFtIHkgLSDotbfngrkgeSDlnZDmoIdcbiAgICAgKiBAcGFyYW0gY21kIC0g6Lev5b6E5ZG95LukXG4gICAgICogQHBhcmFtIHBvaW50cyAtIOS4jui3r+W+hOWRveS7pOebuOWFs+eahOeCueeahOWdkOagh+aIluaOp+WItuWPguaVsFxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWxjTGVuZ3RoKHg6IG51bWJlciwgeTogbnVtYmVyLCBjbWQ6IHN0cmluZywgcG9pbnRzOiBudW1iZXJbXSkge1xuICAgICAgICBsZXQgbGVuLCBwMSwgcDIsIHQ7XG5cbiAgICAgICAgc3dpdGNoIChjbWQpIHtcbiAgICAgICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExpbmVMZW5ndGgoeCwgeSwgcG9pbnRzWzBdLCBwb2ludHNbMV0pO1xuICAgICAgICAgICAgY2FzZSAnQyc6XG4gICAgICAgICAgICAgICAgbGVuID0gMC4wO1xuICAgICAgICAgICAgICAgIHAxID0gdGhpcy5nZXRQb2ludE9uQ3ViaWNCZXppZXIoMCwgeCwgeSwgcG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBwb2ludHNbNF0sIHBvaW50c1s1XSk7XG4gICAgICAgICAgICAgICAgZm9yICh0ID0gMC4wMTsgdCA8PSAxOyB0ICs9IDAuMDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcDIgPSB0aGlzLmdldFBvaW50T25DdWJpY0Jlemllcih0LCB4LCB5LCBwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2ludHNbM10sIHBvaW50c1s0XSwgcG9pbnRzWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgbGVuICs9IHRoaXMuZ2V0TGluZUxlbmd0aChwMS54LCBwMS55LCBwMi54LCBwMi55KTtcbiAgICAgICAgICAgICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbjtcbiAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGxlbiA9IDAuMDtcbiAgICAgICAgICAgICAgICBwMSA9IHRoaXMuZ2V0UG9pbnRPblF1YWRyYXRpY0JlemllcigwLCB4LCB5LCBwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2ludHNbM10pO1xuICAgICAgICAgICAgICAgIGZvciAodCA9IDAuMDE7IHQgPD0gMTsgdCArPSAwLjAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHAyID0gdGhpcy5nZXRQb2ludE9uUXVhZHJhdGljQmV6aWVyKHQsIHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7XG4gICAgICAgICAgICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgICAgICAgICAgIHAxID0gcDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBsZW47XG4gICAgICAgICAgICBjYXNlICdBJzpcbiAgICAgICAgICAgICAgICBsZW4gPSAwLjA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwb2ludHNbNF07XG4gICAgICAgICAgICAgICAgY29uc3QgZFRoZXRhID0gcG9pbnRzWzVdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IHBvaW50c1s0XSArIGRUaGV0YTtcbiAgICAgICAgICAgICAgICBsZXQgaW5jID0gTWF0aC5QSSAvIDE4MC4wO1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhzdGFydCAtIGVuZCkgPCBpbmMpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5jID0gTWF0aC5hYnMoc3RhcnQgLSBlbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwMSA9IHRoaXMuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBzdGFydCwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKGRUaGV0YSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gc3RhcnQgLSBpbmM7IHQgPiBlbmQ7IHQgLT0gaW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCB0LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwMSA9IHAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gc3RhcnQgKyBpbmM7IHQgPCBlbmQ7IHQgKz0gaW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCB0LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwMSA9IHAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHAyID0gdGhpcy5nZXRQb2ludE9uRWxsaXB0aWNhbEFyYyhwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2ludHNbM10sIGVuZCwgMCk7XG4gICAgICAgICAgICAgICAgbGVuICs9IHRoaXMuZ2V0TGluZUxlbmd0aChwMS54LCBwMS55LCBwMi54LCBwMi55KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOino+aekCBTVkcg6Lev5b6E5pWw5o2u5a2X56ym5Liy77yM5bCG5YW26L2s5o2i5Li65LiA5Liq5YyF5ZCr6Lev5b6E5ZG95Luk5ZKM5Z2Q5qCH54K555qE5pWw57uE5a+56LGhXG4gICAgICogQHBhcmFtIGRhdGEgLSBTVkcg6Lev5b6E5pWw5o2u5a2X56ym5LiyXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlUGF0aERhdGEoZGF0YTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNzID0gZGF0YTtcbiAgICAgICAgY29uc3QgY2MgPSBbJ20nLCAnTScsICdsJywgJ0wnLCAndicsICdWJywgJ2gnLCAnSCcsICd6JywgJ1onLCAnYycsICdDJywgJ3EnLCAnUScsICd0JywgJ1QnLCAncycsICdTJywgJ2EnLCAnQSddO1xuXG4gICAgICAgIGNzID0gY3MucmVwbGFjZShuZXcgUmVnRXhwKCcgJywgJ2cnKSwgJywnKTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBjYy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgY3MgPSBjcy5yZXBsYWNlKG5ldyBSZWdFeHAoY2Nbbl0sICdnJyksICd8JyArIGNjW25dKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnIgPSBjcy5zcGxpdCgnfCcpO1xuICAgICAgICBjb25zdCBjYTogYW55ID0gW107XG4gICAgICAgIGNvbnN0IGNvb3JkczogYW55ID0gW107XG4gICAgICAgIGxldCBjcHggPSAwO1xuICAgICAgICBsZXQgY3B5ID0gMDtcblxuICAgICAgICBjb25zdCByZSA9IC8oWy0rXT8oKFxcZCtcXC5cXGQrKXwoKFxcZCspfChcXC5cXGQrKSkpKD86ZVstK10/XFxkKyk/KS9naTtcbiAgICAgICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgICAgICBmb3IgKGxldCBuID0gMTsgbiA8IGFyci5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgbGV0IHN0ciA9IGFycltuXTtcbiAgICAgICAgICAgIGxldCBjID0gc3RyLmNoYXJBdCgwKTtcbiAgICAgICAgICAgIHN0ciA9IHN0ci5zbGljZSgxKTtcblxuICAgICAgICAgICAgY29vcmRzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoKG1hdGNoID0gcmUuZXhlYyhzdHIpKSkge1xuICAgICAgICAgICAgICAgIGNvb3Jkcy5wdXNoKG1hdGNoWzBdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcDogYW55ID0gW107XG5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBqbGVuID0gY29vcmRzLmxlbmd0aDsgaiA8IGpsZW47IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChjb29yZHNbal0gPT09ICcwMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcC5wdXNoKDAsIDApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdChjb29yZHNbal0pO1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgICAgICAgICAgICBwLnB1c2gocGFyc2VkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwLnB1c2goMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAocC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHBbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBjbWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBwb2ludHM6IGFueSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0WCA9IGNweDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFkgPSBjcHk7XG4gICAgICAgICAgICAgICAgbGV0IHByZXZDbWQsIGN0bFB0eCwgY3RsUHR5O1xuICAgICAgICAgICAgICAgIGxldCByeCwgcnksIHBzaSwgZmEsIGZzLCB4MSwgeTE7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdMJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweCA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR4ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggKz0gZHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgKz0gZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnTSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2EubGVuZ3RoID4gMiAmJiBjYVtjYS5sZW5ndGggLSAxXS5jb21tYW5kID09PSAneicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHggPSBjYS5sZW5ndGggLSAyOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhW2lkeF0uY29tbWFuZCA9PT0gJ00nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBjYVtpZHhdLnBvaW50c1swXSArIGR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B5ID0gY2FbaWR4XS5wb2ludHNbMV0gKyBkeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweCA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdNJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnTCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweCArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnTCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnTCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndic6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0wnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1YnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0wnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2gocC5zaGlmdCgpLCBwLnNoaWZ0KCksIHAuc2hpZnQoKSwgcC5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweCA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCArIHAuc2hpZnQoKSwgY3B5ICsgcC5zaGlmdCgpLCBjcHggKyBwLnNoaWZ0KCksIGNweSArIHAuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdDJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eCA9IGNweDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eSA9IGNweTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDbWQgPSBjYVtjYS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Q21kLmNvbW1hbmQgPT09ICdDJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eCA9IGNweCArIChjcHggLSBwcmV2Q21kLnBvaW50c1syXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR5ID0gY3B5ICsgKGNweSAtIHByZXZDbWQucG9pbnRzWzNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGN0bFB0eCwgY3RsUHR5LCBwLnNoaWZ0KCksIHAuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnQyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHkgPSBjcHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q21kID0gY2FbY2EubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkNtZC5jb21tYW5kID09PSAnQycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHggKyAoY3B4IC0gcHJldkNtZC5wb2ludHNbMl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eSA9IGNweSArIChjcHkgLSBwcmV2Q21kLnBvaW50c1szXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjdGxQdHgsIGN0bFB0eSwgY3B4ICsgcC5zaGlmdCgpLCBjcHkgKyBwLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnQyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChwLnNoaWZ0KCksIHAuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHggKyBwLnNoaWZ0KCksIGNweSArIHAuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdRJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eCA9IGNweDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eSA9IGNweTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDbWQgPSBjYVtjYS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Q21kLmNvbW1hbmQgPT09ICdRJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eCA9IGNweCArIChjcHggLSBwcmV2Q21kLnBvaW50c1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR5ID0gY3B5ICsgKGNweSAtIHByZXZDbWQucG9pbnRzWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNweCA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdRJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGN0bFB0eCwgY3RsUHR5LCBjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHkgPSBjcHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q21kID0gY2FbY2EubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkNtZC5jb21tYW5kID09PSAnUScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHggKyAoY3B4IC0gcHJldkNtZC5wb2ludHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eSA9IGNweSArIChjcHkgLSBwcmV2Q21kLnBvaW50c1sxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdRJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGN0bFB0eCwgY3RsUHR5LCBjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICAgICAgICAgICAgICByeCA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHNpID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmEgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcyA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgxID0gY3B4O1xuICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSBjcHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnQSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSB0aGlzLmNvbnZlcnRFbmRwb2ludFRvQ2VudGVyUGFyYW1ldGVyaXphdGlvbih4MSwgeTEsIGNweCwgY3B5LCBmYSwgZnMsIHJ4LCByeSwgcHNpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ4ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwc2kgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSBjcHg7XG4gICAgICAgICAgICAgICAgICAgICAgICB5MSA9IGNweTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweCArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0EnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gdGhpcy5jb252ZXJ0RW5kcG9pbnRUb0NlbnRlclBhcmFtZXRlcml6YXRpb24oeDEsIHkxLCBjcHgsIGNweSwgZmEsIGZzLCByeCwgcnksIHBzaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogY21kIHx8IGMsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50czogcG9pbnRzLFxuICAgICAgICAgICAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogc3RhcnRYLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogc3RhcnRZXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHBhdGhMZW5ndGg6IHRoaXMuY2FsY0xlbmd0aChzdGFydFgsIHN0YXJ0WSwgY21kIHx8IGMsIHBvaW50cylcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMgPT09ICd6JyB8fCBjID09PSAnWicpIHtcbiAgICAgICAgICAgICAgICBjYS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogJ3onLFxuICAgICAgICAgICAgICAgICAgICBwb2ludHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBwYXRoTGVuZ3RoOiAwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2E7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5qC55o2u5Lyg5YWl55qE6Lev5b6E5pWw5o2uIGRhdGEg5Zyo55S75biD5LiK57uY5Yi26Lev5b6EXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF0aChvcHRpb25zOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBkYXRhOiBzdHJpbmc7IHNpemU/OiBudW1iZXI7IHNjYWxlWD86IG51bWJlcjsgc2NhbGVZPzogbnVtYmVyOyBmaWxsOiBzdHJpbmcgfSkge1xuICAgICAgICBjb25zdCB7IHgsIHksIHNjYWxlWCA9IDEsIHNjYWxlWSA9IDEsIGRhdGEsIGZpbGwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGRhdGFBcnJheSA9IHRoaXMucGFyc2VQYXRoRGF0YShkYXRhKTtcblxuICAgICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBmaWxsO1xuICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUoeCwgeSk7XG4gICAgICAgIHRoaXMuY3R4LnNjYWxlKHNjYWxlWCwgc2NhbGVZKTtcbiAgICAgICAgbGV0IGlzQ2xvc2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgZGF0YUFycmF5Lmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gZGF0YUFycmF5W25dLmNvbW1hbmQ7XG4gICAgICAgICAgICBjb25zdCBwID0gZGF0YUFycmF5W25dLnBvaW50cztcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8ocFswXSwgcFsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5tb3ZlVG8ocFswXSwgcFsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5iZXppZXJDdXJ2ZVRvKHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgucXVhZHJhdGljQ3VydmVUbyhwWzBdLCBwWzFdLCBwWzJdLCBwWzNdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gcFswXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3kgPSBwWzFdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByeCA9IHBbMl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ5ID0gcFszXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhldGEgPSBwWzRdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkVGhldGEgPSBwWzVdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwc2kgPSBwWzZdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcyA9IHBbN107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSByeCA+IHJ5ID8gcnggOiByeTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NhbGVYID0gcnggPiByeSA/IDEgOiByeCAvIHJ5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY2FsZVkgPSByeCA+IHJ5ID8gcnkgLyByeCA6IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKGN4LCBjeSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnJvdGF0ZShwc2kpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5zY2FsZShzY2FsZVgsIHNjYWxlWSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmFyYygwLCAwLCByLCB0aGV0YSwgdGhldGEgKyBkVGhldGEsICgxIC0gZnMpIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNjYWxlKDEgLyBzY2FsZVgsIDEgLyBzY2FsZVkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yb3RhdGUoLXBzaSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnRyYW5zbGF0ZSgtY3gsIC1jeSk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAneic6XG4gICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Nsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRyYXdlciA9IG5ldyBEcmF3ZXIoKTtcbiJdfQ==