@tetacom/ng-components 1.0.21 → 1.0.25

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 (1799) hide show
  1. package/.browserslistrc +16 -0
  2. package/dist/README.md +24 -0
  3. package/dist/assets/color-icons.svg +339 -0
  4. package/dist/assets/icons.svg +669 -0
  5. package/dist/assets/intersect.svg +3 -0
  6. package/dist/assets/lithotype-icons.svg +429 -0
  7. package/{common → dist/common}/contract/auto-close-ignore-case.d.ts +0 -0
  8. package/{common → dist/common}/contract/constructor-type.d.ts +0 -0
  9. package/{common → dist/common}/contract/dynamic-data.d.ts +0 -0
  10. package/{common → dist/common}/contract/i-dictionary.d.ts +0 -0
  11. package/{common → dist/common}/contract/i-id-name.d.ts +0 -0
  12. package/{common → dist/common}/contract/i-rect.d.ts +0 -0
  13. package/{common → dist/common}/contract/i-tree-data.d.ts +0 -0
  14. package/{common → dist/common}/contract/public-api.d.ts +0 -0
  15. package/{common → dist/common}/contract/teta-content-ref.d.ts +0 -0
  16. package/{common → dist/common}/enum/align.enum.d.ts +0 -0
  17. package/{common → dist/common}/enum/public-api.d.ts +0 -0
  18. package/{common → dist/common}/enum/teta-size.enum.d.ts +0 -0
  19. package/{common → dist/common}/enum/vertical-align.enum.d.ts +0 -0
  20. package/{common → dist/common}/public-api.d.ts +0 -0
  21. package/{common → dist/common}/service/click.service.d.ts +0 -0
  22. package/{common → dist/common}/service/dynamic-component.service.d.ts +0 -0
  23. package/{common → dist/common}/service/overlay-container.service.d.ts +0 -0
  24. package/{common → dist/common}/service/public-api.d.ts +0 -0
  25. package/{common → dist/common}/util/array-util.d.ts +0 -0
  26. package/{common → dist/common}/util/dom-util.d.ts +0 -0
  27. package/{common → dist/common}/util/position-util.d.ts +0 -0
  28. package/{common → dist/common}/util/public-api.d.ts +0 -0
  29. package/{component → dist/component}/accordion/accordion/accordion.component.d.ts +0 -0
  30. package/{component → dist/component}/accordion/accordion-content.directive.d.ts +0 -0
  31. package/{component → dist/component}/accordion/accordion-head/accordion-head.component.d.ts +0 -0
  32. package/{component → dist/component}/accordion/accordion-item/accordion-item.component.d.ts +0 -0
  33. package/{component → dist/component}/accordion/accordion.module.d.ts +0 -0
  34. package/{component → dist/component}/accordion/public-api.d.ts +0 -0
  35. package/{component → dist/component}/button/button/button.component.d.ts +0 -0
  36. package/{component → dist/component}/button/button.module.d.ts +0 -0
  37. package/{component → dist/component}/button/public-api.d.ts +0 -0
  38. package/{component → dist/component}/chart/chart/chart.component.d.ts +0 -0
  39. package/{component → dist/component}/chart/chart.module.d.ts +0 -0
  40. package/dist/component/chart/core/axis-creator.d.ts +29 -0
  41. package/{component → dist/component}/chart/core/chart.d.ts +0 -0
  42. package/{component → dist/component}/chart/core/public-api.d.ts +0 -0
  43. package/{component → dist/component}/chart/drawer/area-drawer.d.ts +0 -0
  44. package/{component → dist/component}/chart/drawer/bar-drawer.d.ts +0 -0
  45. package/{component → dist/component}/chart/drawer/contour-drawer.d.ts +0 -0
  46. package/{component → dist/component}/chart/drawer/default-drawer-mapping.d.ts +0 -0
  47. package/{component → dist/component}/chart/drawer/line-drawer.d.ts +0 -0
  48. package/{component → dist/component}/chart/drawer/pie-drawer.d.ts +0 -0
  49. package/{component → dist/component}/chart/drawer/public-api.d.ts +0 -0
  50. package/{component → dist/component}/chart/drawer/scatter-drawer.d.ts +0 -0
  51. package/{component → dist/component}/chart/drawer/spline-drawer.d.ts +0 -0
  52. package/{component → dist/component}/chart/legend-drawer/default-drawer-legend-mapping.d.ts +0 -0
  53. package/{component → dist/component}/chart/legend-drawer/gradient-drawer.d.ts +0 -0
  54. package/{component → dist/component}/chart/legend-drawer/swatch-drawer.d.ts +0 -0
  55. package/{component → dist/component}/chart/model/annotation.d.ts +0 -0
  56. package/{component → dist/component}/chart/model/axis-options.d.ts +0 -0
  57. package/{component → dist/component}/chart/model/chart-bounds.d.ts +0 -0
  58. package/{component → dist/component}/chart/model/chart-options.d.ts +0 -0
  59. package/{component → dist/component}/chart/model/enum/axis-type.d.ts +0 -0
  60. package/{component → dist/component}/chart/model/enum/dispatch-type.d.ts +0 -0
  61. package/{component → dist/component}/chart/model/enum/drag-point-type.d.ts +0 -0
  62. package/{component → dist/component}/chart/model/enum/legend-type.d.ts +0 -0
  63. package/{component → dist/component}/chart/model/enum/public-api.d.ts +0 -0
  64. package/dist/component/chart/model/enum/scale-type.d.ts +7 -0
  65. package/{component → dist/component}/chart/model/enum/scale.d.ts +0 -0
  66. package/{component → dist/component}/chart/model/enum/series-type.d.ts +0 -0
  67. package/{component → dist/component}/chart/model/enum/zoom-type.d.ts +0 -0
  68. package/{component → dist/component}/chart/model/i-drag-event.d.ts +0 -0
  69. package/{component → dist/component}/chart/model/i-drawer-legend.d.ts +0 -0
  70. package/{component → dist/component}/chart/model/i-drawer.d.ts +0 -0
  71. package/{component → dist/component}/chart/model/i-zoom-event.d.ts +0 -0
  72. package/{component → dist/component}/chart/model/plot-band.d.ts +0 -0
  73. package/{component → dist/component}/chart/model/plot-line.d.ts +0 -0
  74. package/{component → dist/component}/chart/model/point/bar-point.d.ts +0 -0
  75. package/{component → dist/component}/chart/model/point/base-point.d.ts +0 -0
  76. package/{component → dist/component}/chart/model/point/contour-point.d.ts +0 -0
  77. package/{component → dist/component}/chart/model/point/marker-options.d.ts +0 -0
  78. package/{component → dist/component}/chart/model/point/public-api.d.ts +0 -0
  79. package/{component → dist/component}/chart/model/point/scatter-point.d.ts +0 -0
  80. package/{component → dist/component}/chart/model/public-api.d.ts +0 -0
  81. package/dist/component/chart/model/series.d.ts +62 -0
  82. package/{component → dist/component}/chart/model/tooltip-options.d.ts +0 -0
  83. package/{component → dist/component}/chart/public-api.d.ts +0 -0
  84. package/{component → dist/component}/chart-3d/chart-3d.module.d.ts +0 -0
  85. package/{component → dist/component}/chart-3d/chart3d/chart3d.component.d.ts +0 -0
  86. package/{component → dist/component}/chart-3d/model/base-3d-point.d.ts +0 -0
  87. package/{component → dist/component}/chart-3d/model/chart-3d-options.d.ts +0 -0
  88. package/{component → dist/component}/chart-3d/model/public-api.d.ts +0 -0
  89. package/{component → dist/component}/chart-3d/model/series-3d.d.ts +0 -0
  90. package/{component → dist/component}/chart-3d/public-api.d.ts +0 -0
  91. package/{component → dist/component}/checkbox/checkbox/checkbox.component.d.ts +0 -0
  92. package/{component → dist/component}/checkbox/checkbox.module.d.ts +0 -0
  93. package/{component → dist/component}/checkbox/public-api.d.ts +0 -0
  94. package/dist/component/date-picker/date-picker/date-picker.component.d.ts +77 -0
  95. package/{component → dist/component}/date-picker/date-picker.module.d.ts +0 -0
  96. package/{component → dist/component}/date-picker/day-select/day-select.component.d.ts +0 -0
  97. package/{component → dist/component}/date-picker/model/date-period.d.ts +0 -0
  98. package/{component → dist/component}/date-picker/model/date-picker-mode.enum.d.ts +0 -0
  99. package/{component → dist/component}/date-picker/model/day-model.d.ts +0 -0
  100. package/{component → dist/component}/date-picker/model/picker-locale-model.d.ts +0 -0
  101. package/{component → dist/component}/date-picker/month-picker/month-picker.component.d.ts +0 -0
  102. package/{component → dist/component}/date-picker/month-select/month-select.component.d.ts +0 -0
  103. package/{component → dist/component}/date-picker/public-api.d.ts +0 -0
  104. package/{component → dist/component}/date-picker/service/picker-locale.service.d.ts +0 -0
  105. package/{component → dist/component}/date-picker/service/picker-touch.service.d.ts +0 -0
  106. package/{component → dist/component}/date-picker/time-part-control/time-part-control.component.d.ts +0 -0
  107. package/{component → dist/component}/date-picker/util/date-picker-util.d.ts +0 -0
  108. package/{component → dist/component}/date-picker/year-select/year-select.component.d.ts +0 -0
  109. package/{component → dist/component}/delimiter/delimiter/delimiter.component.d.ts +0 -0
  110. package/{component → dist/component}/delimiter/delimiter.module.d.ts +0 -0
  111. package/{component → dist/component}/delimiter/public-api.d.ts +0 -0
  112. package/{component → dist/component}/dropdown/dropdown/dropdown.component.d.ts +0 -0
  113. package/{component → dist/component}/dropdown/dropdown-base.d.ts +0 -0
  114. package/{component → dist/component}/dropdown/dropdown-content.directive.d.ts +0 -0
  115. package/{component → dist/component}/dropdown/dropdown-head.directive.d.ts +0 -0
  116. package/{component → dist/component}/dropdown/dropdown.directive.d.ts +0 -0
  117. package/{component → dist/component}/dropdown/dropdown.module.d.ts +0 -0
  118. package/{component → dist/component}/dropdown/public-api.d.ts +0 -0
  119. package/{component → dist/component}/dynamic-component/dynamic-component.module.d.ts +0 -0
  120. package/{component → dist/component}/dynamic-component/popup-content/popup-content.component.d.ts +0 -0
  121. package/{component → dist/component}/dynamic-component/public-api.d.ts +0 -0
  122. package/{component → dist/component}/expand-panel/expand-panel/expand-panel.component.d.ts +0 -0
  123. package/{component → dist/component}/expand-panel/expand-panel-content.directive.d.ts +0 -0
  124. package/{component → dist/component}/expand-panel/expand-panel-head.directive.d.ts +0 -0
  125. package/{component → dist/component}/expand-panel/expand-panel.module.d.ts +0 -0
  126. package/{component → dist/component}/expand-panel/public-api.d.ts +0 -0
  127. package/{component → dist/component}/file-upload/file-item/file-item.component.d.ts +0 -0
  128. package/{component → dist/component}/file-upload/file-upload-area/file-upload-area.component.d.ts +0 -0
  129. package/{component → dist/component}/file-upload/file-upload.module.d.ts +0 -0
  130. package/{component → dist/component}/file-upload/public-api.d.ts +0 -0
  131. package/{component → dist/component}/filter/base/filter-base.d.ts +0 -0
  132. package/{component → dist/component}/filter/base/filter-component-base.d.ts +0 -0
  133. package/{component → dist/component}/filter/boolean-filter/boolean-filter.component.d.ts +0 -0
  134. package/{component → dist/component}/filter/contarct/boolean-filter.d.ts +0 -0
  135. package/{component → dist/component}/filter/contarct/date-filter-value.d.ts +0 -0
  136. package/{component → dist/component}/filter/contarct/date-filter.d.ts +0 -0
  137. package/{component → dist/component}/filter/contarct/filter-component-map.d.ts +0 -0
  138. package/{component → dist/component}/filter/contarct/filter-item.d.ts +0 -0
  139. package/{component → dist/component}/filter/contarct/filter-state.d.ts +0 -0
  140. package/{component → dist/component}/filter/contarct/i-filter.d.ts +0 -0
  141. package/{component → dist/component}/filter/contarct/list-filter.d.ts +0 -0
  142. package/{component → dist/component}/filter/contarct/numeric-filter-value.d.ts +0 -0
  143. package/{component → dist/component}/filter/contarct/numeric-filter.d.ts +0 -0
  144. package/{component → dist/component}/filter/contarct/sort-param.d.ts +0 -0
  145. package/{component → dist/component}/filter/contarct/string-filter.d.ts +0 -0
  146. package/{component → dist/component}/filter/date-filter/date-filter.component.d.ts +0 -0
  147. package/{component → dist/component}/filter/enum/filter-type.enum.d.ts +0 -0
  148. package/{component → dist/component}/filter/enum/list-filter-type.enum.d.ts +0 -0
  149. package/{component → dist/component}/filter/enum/string-filter-type.enum.d.ts +0 -0
  150. package/{component → dist/component}/filter/filter-host/filter-host.component.d.ts +0 -0
  151. package/{component → dist/component}/filter/filter-panel/filter-panel.component.d.ts +0 -0
  152. package/{component → dist/component}/filter/filter.module.d.ts +0 -0
  153. package/{component → dist/component}/filter/list-filter/list-filter.component.d.ts +0 -0
  154. package/{component → dist/component}/filter/numeric-filter/numeric-filter.component.d.ts +0 -0
  155. package/{component → dist/component}/filter/public-api.d.ts +0 -0
  156. package/{component → dist/component}/filter/string-filter/string-filter.component.d.ts +0 -0
  157. package/{component → dist/component}/icon/icon/icon.component.d.ts +0 -0
  158. package/{component → dist/component}/icon/icon-sprite.directive.d.ts +0 -0
  159. package/{component → dist/component}/icon/icon.module.d.ts +0 -0
  160. package/{component → dist/component}/icon/icon.service.d.ts +0 -0
  161. package/{component → dist/component}/icon/public-api.d.ts +0 -0
  162. package/{component → dist/component}/input/form-group-title/form-group-title.component.d.ts +0 -0
  163. package/{component → dist/component}/input/input/input.component.d.ts +0 -0
  164. package/{component → dist/component}/input/input.module.d.ts +0 -0
  165. package/{component → dist/component}/input/public-api.d.ts +0 -0
  166. package/{component → dist/component}/input/text-field/text-field.component.d.ts +0 -0
  167. package/{component → dist/component}/message/message/message.component.d.ts +0 -0
  168. package/{component → dist/component}/message/message-host/message-host.component.d.ts +0 -0
  169. package/{component → dist/component}/message/message.module.d.ts +0 -0
  170. package/{component → dist/component}/message/message.service.d.ts +0 -0
  171. package/{component → dist/component}/message/model/message.d.ts +0 -0
  172. package/{component → dist/component}/message/public-api.d.ts +0 -0
  173. package/{component → dist/component}/modal/dialog/dialog.component.d.ts +0 -0
  174. package/{component → dist/component}/modal/dialog.service.d.ts +0 -0
  175. package/{component → dist/component}/modal/modal-container/modal-container.component.d.ts +0 -0
  176. package/{component → dist/component}/modal/modal.module.d.ts +0 -0
  177. package/{component → dist/component}/modal/modal.service.d.ts +0 -0
  178. package/{component → dist/component}/modal/model/current-modal.d.ts +0 -0
  179. package/{component → dist/component}/modal/model/i-modal-config.d.ts +0 -0
  180. package/{component → dist/component}/modal/model/i-modal-result.d.ts +0 -0
  181. package/{component → dist/component}/modal/model/modal-close-reason.enum.d.ts +0 -0
  182. package/{component → dist/component}/modal/model/modal-instance.d.ts +0 -0
  183. package/{component → dist/component}/modal/public-api.d.ts +0 -0
  184. package/{component → dist/component}/pager/model/pager-state.d.ts +0 -0
  185. package/{component → dist/component}/pager/pager/pager.component.d.ts +0 -0
  186. package/{component → dist/component}/pager/pager.module.d.ts +0 -0
  187. package/{component → dist/component}/pager/public-api.d.ts +0 -0
  188. package/{component → dist/component}/pager/util/pager-util.d.ts +0 -0
  189. package/{component → dist/component}/panel/panel/panel.component.d.ts +0 -0
  190. package/{component → dist/component}/panel/panel.module.d.ts +0 -0
  191. package/{component → dist/component}/panel/public-api.d.ts +0 -0
  192. package/{component → dist/component}/progress-bar/progress-bar/progress-bar.component.d.ts +0 -0
  193. package/{component → dist/component}/progress-bar/progress-bar.module.d.ts +0 -0
  194. package/{component → dist/component}/progress-bar/public-api.d.ts +0 -0
  195. package/{component → dist/component}/property-grid/default/date-item-default/date-item-default.component.d.ts +0 -0
  196. package/{component → dist/component}/property-grid/default/list-item-default/list-item-default.component.d.ts +0 -0
  197. package/{component → dist/component}/property-grid/default/numeric-item-default/numeric-item-default.component.d.ts +0 -0
  198. package/{component → dist/component}/property-grid/default/string-item-default/string-item-default.component.d.ts +0 -0
  199. package/{component → dist/component}/property-grid/property-grid/property-grid-group/property-grid-group.component.d.ts +0 -0
  200. package/dist/component/property-grid/property-grid/property-grid-item/property-grid-item.component.d.ts +34 -0
  201. package/{component → dist/component}/property-grid/property-grid/property-grid.component.d.ts +0 -0
  202. package/dist/component/property-grid/property-grid.module.d.ts +23 -0
  203. package/{component → dist/component}/property-grid/public-api.d.ts +0 -0
  204. package/{component → dist/component}/public-api.d.ts +0 -0
  205. package/{component → dist/component}/radio/public-api.d.ts +0 -0
  206. package/{component → dist/component}/radio/radio/radio.component.d.ts +0 -0
  207. package/{component → dist/component}/radio/radio-button/radio-button.component.d.ts +0 -0
  208. package/{component → dist/component}/radio/radio.module.d.ts +0 -0
  209. package/{component → dist/component}/resize-panel/public-api.d.ts +0 -0
  210. package/{component → dist/component}/resize-panel/resize-panel/resize-panel.component.d.ts +0 -0
  211. package/{component → dist/component}/resize-panel/resize-panel.module.d.ts +0 -0
  212. package/{component → dist/component}/select/public-api.d.ts +0 -0
  213. package/{component → dist/component}/select/select/select.component.d.ts +0 -0
  214. package/{component → dist/component}/select/select-option.directive.d.ts +0 -0
  215. package/{component → dist/component}/select/select-value.directive.d.ts +0 -0
  216. package/{component → dist/component}/select/select.module.d.ts +0 -0
  217. package/{component → dist/component}/sidebar/public-api.d.ts +0 -0
  218. package/{component → dist/component}/sidebar/sidebar/sidebar.component.d.ts +0 -0
  219. package/{component → dist/component}/sidebar/sidebar-position.enum.d.ts +0 -0
  220. package/{component → dist/component}/sidebar/sidebar.module.d.ts +0 -0
  221. package/{component → dist/component}/switch/public-api.d.ts +0 -0
  222. package/{component → dist/component}/switch/switch/switch.component.d.ts +0 -0
  223. package/{component → dist/component}/switch/switch-button/switch-button.component.d.ts +0 -0
  224. package/{component → dist/component}/switch/switch.module.d.ts +0 -0
  225. package/{component → dist/component}/switch/switch.service.d.ts +0 -0
  226. package/{component → dist/component}/table/base/cell-component-base.d.ts +0 -0
  227. package/{component → dist/component}/table/base/detail-component-base.d.ts +0 -0
  228. package/{component → dist/component}/table/base/group-row-component-base.d.ts +0 -0
  229. package/{component → dist/component}/table/base/head-cell-component-base.d.ts +0 -0
  230. package/{component → dist/component}/table/cell/cell.component.d.ts +0 -0
  231. package/{component → dist/component}/table/cell-host/cell-host.component.d.ts +0 -0
  232. package/{component → dist/component}/table/contract/cell-components-map.d.ts +0 -0
  233. package/{component → dist/component}/table/contract/column-reorder-event.d.ts +0 -0
  234. package/{component → dist/component}/table/contract/column-resize-event.d.ts +0 -0
  235. package/{component → dist/component}/table/contract/i-cell-coordinates.d.ts +0 -0
  236. package/{component → dist/component}/table/contract/i-cell-event.d.ts +0 -0
  237. package/{component → dist/component}/table/contract/i-cell-value.d.ts +0 -0
  238. package/{component → dist/component}/table/contract/public-api.d.ts +0 -0
  239. package/{component → dist/component}/table/contract/sort-event.d.ts +0 -0
  240. package/{component → dist/component}/table/contract/table-column-store.d.ts +0 -0
  241. package/dist/component/table/contract/table-column.d.ts +142 -0
  242. package/{component → dist/component}/table/contract/table-context-menu-config.d.ts +0 -0
  243. package/{component → dist/component}/table/contract/table-row.d.ts +0 -0
  244. package/{component → dist/component}/table/default/boolean-cell/boolean-cell.component.d.ts +0 -0
  245. package/{component → dist/component}/table/default/date-cell/date-cell.component.d.ts +0 -0
  246. package/{component → dist/component}/table/default/date-time-cell/date-time-cell.component.d.ts +0 -0
  247. package/{component → dist/component}/table/default/default-head-cell/default-head-cell.component.d.ts +0 -0
  248. package/{component → dist/component}/table/default/group-row/group-row.component.d.ts +0 -0
  249. package/{component → dist/component}/table/default/list-cell/list-cell.component.d.ts +0 -0
  250. package/{component → dist/component}/table/default/numeric-cell/numeric-cell.component.d.ts +0 -0
  251. package/{component → dist/component}/table/default/string-cell/string-cell.component.d.ts +0 -0
  252. package/{component → dist/component}/table/enum/aggregation-type.enum.d.ts +0 -0
  253. package/{component → dist/component}/table/enum/edit-event.enum.d.ts +0 -0
  254. package/{component → dist/component}/table/enum/edit-type.enum.d.ts +0 -0
  255. package/{component → dist/component}/table/enum/public-api.d.ts +0 -0
  256. package/{component → dist/component}/table/enum/select-type.enum.d.ts +0 -0
  257. package/{component → dist/component}/table/head-cell/head-cell.component.d.ts +0 -0
  258. package/dist/component/table/head-cell-dropdown/head-cell-dropdown.component.d.ts +59 -0
  259. package/{component → dist/component}/table/head-cell-host/head-cell-host.component.d.ts +0 -0
  260. package/{component → dist/component}/table/public-api.d.ts +0 -0
  261. package/{component → dist/component}/table/selection-cell/selection-cell.component.d.ts +0 -0
  262. package/{component → dist/component}/table/selection-head-cell/selection-head-cell.component.d.ts +0 -0
  263. package/dist/component/table/service/table.service.d.ts +118 -0
  264. package/dist/component/table/table/table.component.d.ts +98 -0
  265. package/{component → dist/component}/table/table-body/table-body.component.d.ts +0 -0
  266. package/{component → dist/component}/table/table-head/table-head.component.d.ts +0 -0
  267. package/{component → dist/component}/table/table-head-group/table-head-group.component.d.ts +0 -0
  268. package/{component → dist/component}/table/table.module.d.ts +0 -0
  269. package/{component → dist/component}/table/util/public-api.d.ts +0 -0
  270. package/{component → dist/component}/table/util/state-util.d.ts +0 -0
  271. package/{component → dist/component}/table/util/table-util.d.ts +0 -0
  272. package/{component → dist/component}/tabs/public-api.d.ts +0 -0
  273. package/{component → dist/component}/tabs/tab/tab.component.d.ts +0 -0
  274. package/{component → dist/component}/tabs/tab-content.directive.d.ts +0 -0
  275. package/{component → dist/component}/tabs/tab-title.directive.d.ts +0 -0
  276. package/{component → dist/component}/tabs/tabs/tabs.component.d.ts +0 -0
  277. package/{component → dist/component}/tabs/tabs.module.d.ts +0 -0
  278. package/{component → dist/component}/theme-switch/public-api.d.ts +0 -0
  279. package/{component → dist/component}/theme-switch/theme-switch/theme-switch.component.d.ts +0 -0
  280. package/{component → dist/component}/theme-switch/theme-switch.module.d.ts +0 -0
  281. package/{component → dist/component}/theme-switch/theme-switch.service.d.ts +0 -0
  282. package/{component → dist/component}/toggle/public-api.d.ts +0 -0
  283. package/{component → dist/component}/toggle/toggle/toggle.component.d.ts +0 -0
  284. package/{component → dist/component}/toggle/toggle.module.d.ts +0 -0
  285. package/{component → dist/component}/toolbar/public-api.d.ts +0 -0
  286. package/{component → dist/component}/toolbar/toolbar/toolbar.component.d.ts +0 -0
  287. package/{component → dist/component}/toolbar/toolbar.module.d.ts +0 -0
  288. package/{component → dist/component}/tree/public-api.d.ts +0 -0
  289. package/{component → dist/component}/tree/tree/tree.component.d.ts +0 -0
  290. package/{component → dist/component}/tree/tree-item/tree-item.component.d.ts +0 -0
  291. package/{component → dist/component}/tree/tree-item-toggle/tree-item-toggle.component.d.ts +0 -0
  292. package/{component → dist/component}/tree/tree.module.d.ts +0 -0
  293. package/{component → dist/component}/tree/tree.service.d.ts +0 -0
  294. package/{directive → dist/directive}/click-outside/click-outside.directive.d.ts +0 -0
  295. package/{directive → dist/directive}/click-outside/click-outside.module.d.ts +0 -0
  296. package/{directive → dist/directive}/click-outside/public-api.d.ts +0 -0
  297. package/{directive → dist/directive}/context-menu/context-menu.directive.d.ts +0 -0
  298. package/{directive → dist/directive}/context-menu/context-menu.module.d.ts +0 -0
  299. package/{directive → dist/directive}/context-menu/public-api.d.ts +0 -0
  300. package/{directive → dist/directive}/disable-control/disable-control.directive.d.ts +0 -0
  301. package/{directive → dist/directive}/disable-control/disable-control.module.d.ts +0 -0
  302. package/{directive → dist/directive}/disable-control/public-api.d.ts +0 -0
  303. package/{directive → dist/directive}/drag-sort/drag-sort-container.directive.d.ts +0 -0
  304. package/{directive → dist/directive}/drag-sort/drag-sort-event.d.ts +0 -0
  305. package/{directive → dist/directive}/drag-sort/drag-sort-item.directive.d.ts +0 -0
  306. package/{directive → dist/directive}/drag-sort/drag-sort.module.d.ts +0 -0
  307. package/{directive → dist/directive}/drag-sort/public-api.d.ts +0 -0
  308. package/{directive → dist/directive}/dynamic-content-base.directive.d.ts +0 -0
  309. package/{directive → dist/directive}/highlight/highlight.directive.d.ts +0 -0
  310. package/{directive → dist/directive}/highlight/highlight.module.d.ts +0 -0
  311. package/{directive → dist/directive}/highlight/public-api.d.ts +0 -0
  312. package/{directive → dist/directive}/hint/hint.directive.d.ts +0 -0
  313. package/{directive → dist/directive}/hint/hint.module.d.ts +0 -0
  314. package/{directive → dist/directive}/hint/public-api.d.ts +0 -0
  315. package/{directive → dist/directive}/loader/loader.directive.d.ts +0 -0
  316. package/{directive → dist/directive}/loader/loader.module.d.ts +0 -0
  317. package/{directive → dist/directive}/loader/public-api.d.ts +0 -0
  318. package/{directive → dist/directive}/no-autofill/no-autofill.directive.d.ts +0 -0
  319. package/{directive → dist/directive}/no-autofill/no-autofill.module.d.ts +0 -0
  320. package/{directive → dist/directive}/no-autofill/public-api.d.ts +0 -0
  321. package/{directive → dist/directive}/only-number/only-number.directive.d.ts +0 -0
  322. package/{directive → dist/directive}/only-number/only-number.module.d.ts +0 -0
  323. package/{directive → dist/directive}/only-number/public-api.d.ts +0 -0
  324. package/{directive → dist/directive}/public-api.d.ts +0 -0
  325. package/{directive → dist/directive}/resize-drag/public-api.d.ts +0 -0
  326. package/{directive → dist/directive}/resize-drag/resize-drag.directive.d.ts +0 -0
  327. package/{directive → dist/directive}/resize-drag/resize-drag.module.d.ts +0 -0
  328. package/{directive → dist/directive}/teta-template/public-api.d.ts +0 -0
  329. package/{directive → dist/directive}/teta-template/teta-template.directive.d.ts +0 -0
  330. package/{directive → dist/directive}/teta-template/teta-template.module.d.ts +0 -0
  331. package/{directive → dist/directive}/tooltip/public-api.d.ts +0 -0
  332. package/{directive → dist/directive}/tooltip/tooltip.directive.d.ts +0 -0
  333. package/{directive → dist/directive}/tooltip/tooltip.module.d.ts +0 -0
  334. package/dist/esm2020/common/contract/auto-close-ignore-case.mjs +2 -0
  335. package/dist/esm2020/common/contract/constructor-type.mjs +2 -0
  336. package/dist/esm2020/common/contract/dynamic-data.mjs +10 -0
  337. package/dist/esm2020/common/contract/i-dictionary.mjs +2 -0
  338. package/dist/esm2020/common/contract/i-id-name.mjs +2 -0
  339. package/dist/esm2020/common/contract/i-rect.mjs +2 -0
  340. package/dist/esm2020/common/contract/i-tree-data.mjs +2 -0
  341. package/dist/esm2020/common/contract/public-api.mjs +9 -0
  342. package/dist/esm2020/common/contract/teta-content-ref.mjs +8 -0
  343. package/dist/esm2020/common/enum/align.enum.mjs +10 -0
  344. package/dist/esm2020/common/enum/public-api.mjs +4 -0
  345. package/dist/esm2020/common/enum/teta-size.enum.mjs +9 -0
  346. package/dist/esm2020/common/enum/vertical-align.enum.mjs +8 -0
  347. package/dist/esm2020/common/public-api.mjs +5 -0
  348. package/dist/esm2020/common/service/click.service.mjs +23 -0
  349. package/dist/esm2020/common/service/dynamic-component.service.mjs +93 -0
  350. package/dist/esm2020/common/service/overlay-container.service.mjs +41 -0
  351. package/dist/esm2020/common/service/public-api.mjs +4 -0
  352. package/dist/esm2020/common/util/array-util.mjs +119 -0
  353. package/dist/esm2020/common/util/dom-util.mjs +16 -0
  354. package/dist/esm2020/common/util/position-util.mjs +96 -0
  355. package/dist/esm2020/common/util/public-api.mjs +4 -0
  356. package/dist/esm2020/component/accordion/accordion/accordion.component.mjs +18 -0
  357. package/dist/esm2020/component/accordion/accordion-content.directive.mjs +16 -0
  358. package/dist/esm2020/component/accordion/accordion-head/accordion-head.component.mjs +52 -0
  359. package/dist/esm2020/component/accordion/accordion-item/accordion-item.component.mjs +43 -0
  360. package/dist/esm2020/component/accordion/accordion.module.mjs +29 -0
  361. package/dist/esm2020/component/accordion/public-api.mjs +6 -0
  362. package/dist/esm2020/component/button/button/button.component.mjs +40 -0
  363. package/dist/esm2020/component/button/button.module.mjs +24 -0
  364. package/dist/esm2020/component/button/public-api.mjs +3 -0
  365. package/dist/esm2020/component/chart/chart/chart.component.mjs +164 -0
  366. package/dist/esm2020/component/chart/chart.module.mjs +18 -0
  367. package/dist/esm2020/component/chart/core/axis-creator.mjs +82 -0
  368. package/dist/esm2020/component/chart/core/chart.mjs +1339 -0
  369. package/dist/esm2020/component/chart/core/public-api.mjs +3 -0
  370. package/dist/esm2020/component/chart/drawer/area-drawer.mjs +20 -0
  371. package/dist/esm2020/component/chart/drawer/bar-drawer.mjs +23 -0
  372. package/dist/esm2020/component/chart/drawer/contour-drawer.mjs +29 -0
  373. package/dist/esm2020/component/chart/drawer/default-drawer-mapping.mjs +17 -0
  374. package/dist/esm2020/component/chart/drawer/line-drawer.mjs +152 -0
  375. package/dist/esm2020/component/chart/drawer/pie-drawer.mjs +4 -0
  376. package/dist/esm2020/component/chart/drawer/public-api.mjs +7 -0
  377. package/dist/esm2020/component/chart/drawer/scatter-drawer.mjs +93 -0
  378. package/dist/esm2020/component/chart/drawer/spline-drawer.mjs +23 -0
  379. package/dist/esm2020/component/chart/legend-drawer/default-drawer-legend-mapping.mjs +7 -0
  380. package/dist/esm2020/component/chart/legend-drawer/gradient-drawer.mjs +45 -0
  381. package/dist/esm2020/component/chart/legend-drawer/swatch-drawer.mjs +62 -0
  382. package/dist/esm2020/component/chart/model/annotation.mjs +30 -0
  383. package/dist/esm2020/component/chart/model/axis-options.mjs +26 -0
  384. package/dist/esm2020/component/chart/model/chart-bounds.mjs +13 -0
  385. package/dist/esm2020/component/chart/model/chart-options.mjs +37 -0
  386. package/dist/esm2020/component/chart/model/enum/axis-type.mjs +6 -0
  387. package/dist/esm2020/component/chart/model/enum/dispatch-type.mjs +6 -0
  388. package/dist/esm2020/component/chart/model/enum/drag-point-type.mjs +7 -0
  389. package/dist/esm2020/component/chart/model/enum/legend-type.mjs +6 -0
  390. package/dist/esm2020/component/chart/model/enum/public-api.mjs +8 -0
  391. package/dist/esm2020/component/chart/model/enum/scale-type.mjs +9 -0
  392. package/dist/esm2020/component/chart/model/enum/scale.mjs +7 -0
  393. package/dist/esm2020/component/chart/model/enum/series-type.mjs +12 -0
  394. package/dist/esm2020/component/chart/model/enum/zoom-type.mjs +7 -0
  395. package/dist/esm2020/component/chart/model/i-drag-event.mjs +2 -0
  396. package/dist/esm2020/component/chart/model/i-drawer-legend.mjs +2 -0
  397. package/dist/esm2020/component/chart/model/i-drawer.mjs +2 -0
  398. package/dist/esm2020/component/chart/model/i-zoom-event.mjs +2 -0
  399. package/dist/esm2020/component/chart/model/plot-band.mjs +18 -0
  400. package/dist/esm2020/component/chart/model/plot-line.mjs +13 -0
  401. package/dist/esm2020/component/chart/model/point/bar-point.mjs +2 -0
  402. package/dist/esm2020/component/chart/model/point/base-point.mjs +2 -0
  403. package/dist/esm2020/component/chart/model/point/contour-point.mjs +2 -0
  404. package/dist/esm2020/component/chart/model/point/marker-options.mjs +2 -0
  405. package/dist/esm2020/component/chart/model/point/public-api.mjs +4 -0
  406. package/dist/esm2020/component/chart/model/point/scatter-point.mjs +2 -0
  407. package/dist/esm2020/component/chart/model/public-api.mjs +16 -0
  408. package/dist/esm2020/component/chart/model/series.mjs +27 -0
  409. package/dist/esm2020/component/chart/model/tooltip-options.mjs +19 -0
  410. package/dist/esm2020/component/chart/public-api.mjs +6 -0
  411. package/dist/esm2020/component/chart-3d/chart-3d.module.mjs +18 -0
  412. package/dist/esm2020/component/chart-3d/chart3d/chart3d.component.mjs +232 -0
  413. package/dist/esm2020/component/chart-3d/model/base-3d-point.mjs +2 -0
  414. package/dist/esm2020/component/chart-3d/model/chart-3d-options.mjs +7 -0
  415. package/dist/esm2020/component/chart-3d/model/public-api.mjs +3 -0
  416. package/dist/esm2020/component/chart-3d/model/series-3d.mjs +7 -0
  417. package/dist/esm2020/component/chart-3d/public-api.mjs +4 -0
  418. package/dist/esm2020/component/checkbox/checkbox/checkbox.component.mjs +134 -0
  419. package/dist/esm2020/component/checkbox/checkbox.module.mjs +28 -0
  420. package/dist/esm2020/component/checkbox/public-api.mjs +3 -0
  421. package/dist/esm2020/component/date-picker/date-picker/date-picker.component.mjs +279 -0
  422. package/dist/esm2020/component/date-picker/date-picker.module.mjs +67 -0
  423. package/dist/esm2020/component/date-picker/day-select/day-select.component.mjs +166 -0
  424. package/dist/esm2020/component/date-picker/model/date-period.mjs +7 -0
  425. package/dist/esm2020/component/date-picker/model/date-picker-mode.enum.mjs +7 -0
  426. package/dist/esm2020/component/date-picker/model/day-model.mjs +13 -0
  427. package/dist/esm2020/component/date-picker/model/picker-locale-model.mjs +13 -0
  428. package/dist/esm2020/component/date-picker/month-picker/month-picker.component.mjs +250 -0
  429. package/dist/esm2020/component/date-picker/month-select/month-select.component.mjs +147 -0
  430. package/dist/esm2020/component/date-picker/public-api.mjs +6 -0
  431. package/dist/esm2020/component/date-picker/service/picker-locale.service.mjs +30 -0
  432. package/dist/esm2020/component/date-picker/service/picker-touch.service.mjs +34 -0
  433. package/dist/esm2020/component/date-picker/time-part-control/time-part-control.component.mjs +73 -0
  434. package/dist/esm2020/component/date-picker/util/date-picker-util.mjs +142 -0
  435. package/dist/esm2020/component/date-picker/year-select/year-select.component.mjs +189 -0
  436. package/dist/esm2020/component/delimiter/delimiter/delimiter.component.mjs +63 -0
  437. package/dist/esm2020/component/delimiter/delimiter.module.mjs +22 -0
  438. package/dist/esm2020/component/delimiter/public-api.mjs +3 -0
  439. package/dist/esm2020/component/dropdown/dropdown/dropdown.component.mjs +29 -0
  440. package/dist/esm2020/component/dropdown/dropdown-base.mjs +204 -0
  441. package/dist/esm2020/component/dropdown/dropdown-content.directive.mjs +17 -0
  442. package/dist/esm2020/component/dropdown/dropdown-head.directive.mjs +18 -0
  443. package/dist/esm2020/component/dropdown/dropdown.directive.mjs +37 -0
  444. package/dist/esm2020/component/dropdown/dropdown.module.mjs +41 -0
  445. package/dist/esm2020/component/dropdown/public-api.mjs +6 -0
  446. package/dist/esm2020/component/dynamic-component/dynamic-component.module.mjs +22 -0
  447. package/dist/esm2020/component/dynamic-component/popup-content/popup-content.component.mjs +59 -0
  448. package/dist/esm2020/component/dynamic-component/public-api.mjs +3 -0
  449. package/dist/esm2020/component/expand-panel/expand-panel/expand-panel.component.mjs +65 -0
  450. package/dist/esm2020/component/expand-panel/expand-panel-content.directive.mjs +16 -0
  451. package/dist/esm2020/component/expand-panel/expand-panel-head.directive.mjs +16 -0
  452. package/dist/esm2020/component/expand-panel/expand-panel.module.mjs +52 -0
  453. package/dist/esm2020/component/expand-panel/public-api.mjs +5 -0
  454. package/dist/esm2020/component/file-upload/file-item/file-item.component.mjs +13 -0
  455. package/dist/esm2020/component/file-upload/file-upload-area/file-upload-area.component.mjs +77 -0
  456. package/dist/esm2020/component/file-upload/file-upload.module.mjs +21 -0
  457. package/dist/esm2020/component/file-upload/public-api.mjs +4 -0
  458. package/dist/esm2020/component/filter/base/filter-base.mjs +9 -0
  459. package/dist/esm2020/component/filter/base/filter-component-base.mjs +3 -0
  460. package/dist/esm2020/component/filter/boolean-filter/boolean-filter.component.mjs +53 -0
  461. package/dist/esm2020/component/filter/contarct/boolean-filter.mjs +10 -0
  462. package/dist/esm2020/component/filter/contarct/date-filter-value.mjs +9 -0
  463. package/dist/esm2020/component/filter/contarct/date-filter.mjs +11 -0
  464. package/dist/esm2020/component/filter/contarct/filter-component-map.mjs +17 -0
  465. package/dist/esm2020/component/filter/contarct/filter-item.mjs +33 -0
  466. package/dist/esm2020/component/filter/contarct/filter-state.mjs +145 -0
  467. package/dist/esm2020/component/filter/contarct/i-filter.mjs +2 -0
  468. package/dist/esm2020/component/filter/contarct/list-filter.mjs +12 -0
  469. package/dist/esm2020/component/filter/contarct/numeric-filter-value.mjs +10 -0
  470. package/dist/esm2020/component/filter/contarct/numeric-filter.mjs +11 -0
  471. package/dist/esm2020/component/filter/contarct/sort-param.mjs +13 -0
  472. package/dist/esm2020/component/filter/contarct/string-filter.mjs +12 -0
  473. package/dist/esm2020/component/filter/date-filter/date-filter.component.mjs +54 -0
  474. package/dist/esm2020/component/filter/enum/filter-type.enum.mjs +10 -0
  475. package/dist/esm2020/component/filter/enum/list-filter-type.enum.mjs +6 -0
  476. package/dist/esm2020/component/filter/enum/string-filter-type.enum.mjs +20 -0
  477. package/dist/esm2020/component/filter/filter-host/filter-host.component.mjs +73 -0
  478. package/dist/esm2020/component/filter/filter-panel/filter-panel.component.mjs +13 -0
  479. package/dist/esm2020/component/filter/filter.module.mjs +80 -0
  480. package/dist/esm2020/component/filter/list-filter/list-filter.component.mjs +86 -0
  481. package/dist/esm2020/component/filter/numeric-filter/numeric-filter.component.mjs +53 -0
  482. package/dist/esm2020/component/filter/public-api.mjs +25 -0
  483. package/dist/esm2020/component/filter/string-filter/string-filter.component.mjs +54 -0
  484. package/dist/esm2020/component/icon/icon/icon.component.mjs +37 -0
  485. package/dist/esm2020/component/icon/icon-sprite.directive.mjs +32 -0
  486. package/dist/esm2020/component/icon/icon.module.mjs +35 -0
  487. package/dist/esm2020/component/icon/icon.service.mjs +59 -0
  488. package/dist/esm2020/component/icon/public-api.mjs +5 -0
  489. package/dist/esm2020/component/input/form-group-title/form-group-title.component.mjs +18 -0
  490. package/dist/esm2020/component/input/input/input.component.mjs +31 -0
  491. package/dist/esm2020/component/input/input.module.mjs +23 -0
  492. package/dist/esm2020/component/input/public-api.mjs +5 -0
  493. package/dist/esm2020/component/input/text-field/text-field.component.mjs +94 -0
  494. package/dist/esm2020/component/message/message/message.component.mjs +74 -0
  495. package/dist/esm2020/component/message/message-host/message-host.component.mjs +88 -0
  496. package/dist/esm2020/component/message/message.module.mjs +31 -0
  497. package/dist/esm2020/component/message/message.service.mjs +35 -0
  498. package/dist/esm2020/component/message/model/message.mjs +21 -0
  499. package/dist/esm2020/component/message/public-api.mjs +6 -0
  500. package/dist/esm2020/component/modal/dialog/dialog.component.mjs +44 -0
  501. package/dist/esm2020/component/modal/dialog.service.mjs +39 -0
  502. package/dist/esm2020/component/modal/modal-container/modal-container.component.mjs +84 -0
  503. package/dist/esm2020/component/modal/modal.module.mjs +52 -0
  504. package/dist/esm2020/component/modal/modal.service.mjs +121 -0
  505. package/dist/esm2020/component/modal/model/current-modal.mjs +3 -0
  506. package/dist/esm2020/component/modal/model/i-modal-config.mjs +2 -0
  507. package/dist/esm2020/component/modal/model/i-modal-result.mjs +2 -0
  508. package/dist/esm2020/component/modal/model/modal-close-reason.enum.mjs +8 -0
  509. package/dist/esm2020/component/modal/model/modal-instance.mjs +32 -0
  510. package/dist/esm2020/component/modal/public-api.mjs +11 -0
  511. package/dist/esm2020/component/pager/model/pager-state.mjs +50 -0
  512. package/dist/esm2020/component/pager/pager/pager.component.mjs +13 -0
  513. package/dist/esm2020/component/pager/pager.module.mjs +26 -0
  514. package/dist/esm2020/component/pager/public-api.mjs +5 -0
  515. package/dist/esm2020/component/pager/util/pager-util.mjs +6 -0
  516. package/dist/esm2020/component/panel/panel/panel.component.mjs +51 -0
  517. package/dist/esm2020/component/panel/panel.module.mjs +22 -0
  518. package/dist/esm2020/component/panel/public-api.mjs +3 -0
  519. package/dist/esm2020/component/progress-bar/progress-bar/progress-bar.component.mjs +131 -0
  520. package/dist/esm2020/component/progress-bar/progress-bar.module.mjs +22 -0
  521. package/dist/esm2020/component/progress-bar/public-api.mjs +3 -0
  522. package/dist/esm2020/component/property-grid/default/date-item-default/date-item-default.component.mjs +13 -0
  523. package/dist/esm2020/component/property-grid/default/list-item-default/list-item-default.component.mjs +13 -0
  524. package/dist/esm2020/component/property-grid/default/numeric-item-default/numeric-item-default.component.mjs +13 -0
  525. package/dist/esm2020/component/property-grid/default/string-item-default/string-item-default.component.mjs +13 -0
  526. package/dist/esm2020/component/property-grid/property-grid/property-grid-group/property-grid-group.component.mjs +34 -0
  527. package/dist/esm2020/component/property-grid/property-grid/property-grid-item/property-grid-item.component.mjs +103 -0
  528. package/dist/esm2020/component/property-grid/property-grid/property-grid.component.mjs +59 -0
  529. package/dist/esm2020/component/property-grid/property-grid.module.mjs +94 -0
  530. package/dist/esm2020/component/property-grid/public-api.mjs +3 -0
  531. package/dist/esm2020/component/public-api.mjs +61 -0
  532. package/dist/esm2020/component/radio/public-api.mjs +4 -0
  533. package/dist/esm2020/component/radio/radio/radio.component.mjs +245 -0
  534. package/dist/esm2020/component/radio/radio-button/radio-button.component.mjs +63 -0
  535. package/dist/esm2020/component/radio/radio.module.mjs +20 -0
  536. package/dist/esm2020/component/resize-panel/public-api.mjs +3 -0
  537. package/dist/esm2020/component/resize-panel/resize-panel/resize-panel.component.mjs +162 -0
  538. package/dist/esm2020/component/resize-panel/resize-panel.module.mjs +20 -0
  539. package/dist/esm2020/component/select/public-api.mjs +5 -0
  540. package/dist/esm2020/component/select/select/select.component.mjs +234 -0
  541. package/dist/esm2020/component/select/select-option.directive.mjs +16 -0
  542. package/dist/esm2020/component/select/select-value.directive.mjs +16 -0
  543. package/dist/esm2020/component/select/select.module.mjs +48 -0
  544. package/dist/esm2020/component/sidebar/public-api.mjs +4 -0
  545. package/dist/esm2020/component/sidebar/sidebar/sidebar.component.mjs +54 -0
  546. package/dist/esm2020/component/sidebar/sidebar-position.enum.mjs +8 -0
  547. package/dist/esm2020/component/sidebar/sidebar.module.mjs +30 -0
  548. package/dist/esm2020/component/switch/public-api.mjs +4 -0
  549. package/dist/esm2020/component/switch/switch/switch.component.mjs +52 -0
  550. package/dist/esm2020/component/switch/switch-button/switch-button.component.mjs +47 -0
  551. package/dist/esm2020/component/switch/switch.module.mjs +23 -0
  552. package/dist/esm2020/component/switch/switch.service.mjs +21 -0
  553. package/dist/esm2020/component/table/base/cell-component-base.mjs +103 -0
  554. package/dist/esm2020/component/table/base/detail-component-base.mjs +3 -0
  555. package/dist/esm2020/component/table/base/group-row-component-base.mjs +3 -0
  556. package/dist/esm2020/component/table/base/head-cell-component-base.mjs +17 -0
  557. package/dist/esm2020/component/table/cell/cell.component.mjs +33 -0
  558. package/dist/esm2020/component/table/cell-host/cell-host.component.mjs +50 -0
  559. package/dist/esm2020/component/table/contract/cell-components-map.mjs +17 -0
  560. package/dist/esm2020/component/table/contract/column-reorder-event.mjs +7 -0
  561. package/dist/esm2020/component/table/contract/column-resize-event.mjs +7 -0
  562. package/dist/esm2020/component/table/contract/i-cell-coordinates.mjs +2 -0
  563. package/dist/esm2020/component/table/contract/i-cell-event.mjs +2 -0
  564. package/dist/esm2020/component/table/contract/i-cell-value.mjs +2 -0
  565. package/dist/esm2020/component/table/contract/public-api.mjs +12 -0
  566. package/dist/esm2020/component/table/contract/sort-event.mjs +7 -0
  567. package/dist/esm2020/component/table/contract/table-column-store.mjs +12 -0
  568. package/dist/esm2020/component/table/contract/table-column.mjs +43 -0
  569. package/dist/esm2020/component/table/contract/table-context-menu-config.mjs +17 -0
  570. package/dist/esm2020/component/table/contract/table-row.mjs +40 -0
  571. package/dist/esm2020/component/table/default/boolean-cell/boolean-cell.component.mjs +45 -0
  572. package/dist/esm2020/component/table/default/date-cell/date-cell.component.mjs +47 -0
  573. package/dist/esm2020/component/table/default/date-time-cell/date-time-cell.component.mjs +46 -0
  574. package/dist/esm2020/component/table/default/default-head-cell/default-head-cell.component.mjs +28 -0
  575. package/dist/esm2020/component/table/default/group-row/group-row.component.mjs +20 -0
  576. package/dist/esm2020/component/table/default/list-cell/list-cell.component.mjs +66 -0
  577. package/dist/esm2020/component/table/default/numeric-cell/numeric-cell.component.mjs +46 -0
  578. package/dist/esm2020/component/table/default/string-cell/string-cell.component.mjs +44 -0
  579. package/dist/esm2020/component/table/enum/aggregation-type.enum.mjs +9 -0
  580. package/dist/esm2020/component/table/enum/edit-event.enum.mjs +7 -0
  581. package/dist/esm2020/component/table/enum/edit-type.enum.mjs +6 -0
  582. package/dist/esm2020/component/table/enum/public-api.mjs +5 -0
  583. package/dist/esm2020/component/table/enum/select-type.enum.mjs +7 -0
  584. package/dist/esm2020/component/table/head-cell/head-cell.component.mjs +136 -0
  585. package/dist/esm2020/component/table/head-cell-dropdown/head-cell-dropdown.component.mjs +198 -0
  586. package/dist/esm2020/component/table/head-cell-host/head-cell-host.component.mjs +36 -0
  587. package/dist/esm2020/component/table/public-api.mjs +43 -0
  588. package/dist/esm2020/component/table/selection-cell/selection-cell.component.mjs +46 -0
  589. package/dist/esm2020/component/table/selection-head-cell/selection-head-cell.component.mjs +45 -0
  590. package/dist/esm2020/component/table/service/table.service.mjs +434 -0
  591. package/dist/esm2020/component/table/table/table.component.mjs +422 -0
  592. package/dist/esm2020/component/table/table-body/table-body.component.mjs +240 -0
  593. package/dist/esm2020/component/table/table-head/table-head.component.mjs +98 -0
  594. package/dist/esm2020/component/table/table-head-group/table-head-group.component.mjs +59 -0
  595. package/dist/esm2020/component/table/table.module.mjs +176 -0
  596. package/dist/esm2020/component/table/util/public-api.mjs +3 -0
  597. package/dist/esm2020/component/table/util/state-util.mjs +139 -0
  598. package/dist/esm2020/component/table/util/table-util.mjs +131 -0
  599. package/dist/esm2020/component/tabs/public-api.mjs +12 -0
  600. package/dist/esm2020/component/tabs/tab/tab.component.mjs +42 -0
  601. package/dist/esm2020/component/tabs/tab-content.directive.mjs +16 -0
  602. package/dist/esm2020/component/tabs/tab-title.directive.mjs +16 -0
  603. package/dist/esm2020/component/tabs/tabs/tabs.component.mjs +70 -0
  604. package/dist/esm2020/component/tabs/tabs.module.mjs +41 -0
  605. package/dist/esm2020/component/theme-switch/public-api.mjs +4 -0
  606. package/dist/esm2020/component/theme-switch/theme-switch/theme-switch.component.mjs +28 -0
  607. package/dist/esm2020/component/theme-switch/theme-switch.module.mjs +30 -0
  608. package/dist/esm2020/component/theme-switch/theme-switch.service.mjs +34 -0
  609. package/dist/esm2020/component/toggle/public-api.mjs +3 -0
  610. package/dist/esm2020/component/toggle/toggle/toggle.component.mjs +79 -0
  611. package/dist/esm2020/component/toggle/toggle.module.mjs +19 -0
  612. package/dist/esm2020/component/toolbar/public-api.mjs +6 -0
  613. package/dist/esm2020/component/toolbar/toolbar/toolbar.component.mjs +26 -0
  614. package/dist/esm2020/component/toolbar/toolbar.module.mjs +22 -0
  615. package/dist/esm2020/component/tree/public-api.mjs +5 -0
  616. package/dist/esm2020/component/tree/tree/tree.component.mjs +76 -0
  617. package/dist/esm2020/component/tree/tree-item/tree-item.component.mjs +80 -0
  618. package/dist/esm2020/component/tree/tree-item-toggle/tree-item-toggle.component.mjs +28 -0
  619. package/dist/esm2020/component/tree/tree.module.mjs +22 -0
  620. package/dist/esm2020/component/tree/tree.service.mjs +35 -0
  621. package/dist/esm2020/directive/click-outside/click-outside.directive.mjs +60 -0
  622. package/dist/esm2020/directive/click-outside/click-outside.module.mjs +22 -0
  623. package/dist/esm2020/directive/click-outside/public-api.mjs +3 -0
  624. package/dist/esm2020/directive/context-menu/context-menu.directive.mjs +94 -0
  625. package/dist/esm2020/directive/context-menu/context-menu.module.mjs +26 -0
  626. package/dist/esm2020/directive/context-menu/public-api.mjs +3 -0
  627. package/dist/esm2020/directive/disable-control/disable-control.directive.mjs +29 -0
  628. package/dist/esm2020/directive/disable-control/disable-control.module.mjs +24 -0
  629. package/dist/esm2020/directive/disable-control/public-api.mjs +3 -0
  630. package/dist/esm2020/directive/drag-sort/drag-sort-container.directive.mjs +64 -0
  631. package/dist/esm2020/directive/drag-sort/drag-sort-event.mjs +2 -0
  632. package/dist/esm2020/directive/drag-sort/drag-sort-item.directive.mjs +115 -0
  633. package/dist/esm2020/directive/drag-sort/drag-sort.module.mjs +19 -0
  634. package/dist/esm2020/directive/drag-sort/public-api.mjs +5 -0
  635. package/dist/esm2020/directive/dynamic-content-base.directive.mjs +81 -0
  636. package/dist/esm2020/directive/highlight/highlight.directive.mjs +72 -0
  637. package/dist/esm2020/directive/highlight/highlight.module.mjs +22 -0
  638. package/dist/esm2020/directive/highlight/public-api.mjs +3 -0
  639. package/dist/esm2020/directive/hint/hint.directive.mjs +97 -0
  640. package/dist/esm2020/directive/hint/hint.module.mjs +26 -0
  641. package/dist/esm2020/directive/hint/public-api.mjs +3 -0
  642. package/dist/esm2020/directive/loader/loader.directive.mjs +63 -0
  643. package/dist/esm2020/directive/loader/loader.module.mjs +22 -0
  644. package/dist/esm2020/directive/loader/public-api.mjs +3 -0
  645. package/dist/esm2020/directive/no-autofill/no-autofill.directive.mjs +30 -0
  646. package/dist/esm2020/directive/no-autofill/no-autofill.module.mjs +18 -0
  647. package/dist/esm2020/directive/no-autofill/public-api.mjs +3 -0
  648. package/dist/esm2020/directive/only-number/only-number.directive.mjs +175 -0
  649. package/dist/esm2020/directive/only-number/only-number.module.mjs +18 -0
  650. package/dist/esm2020/directive/only-number/public-api.mjs +3 -0
  651. package/dist/esm2020/directive/public-api.mjs +15 -0
  652. package/dist/esm2020/directive/resize-drag/public-api.mjs +3 -0
  653. package/dist/esm2020/directive/resize-drag/resize-drag.directive.mjs +71 -0
  654. package/dist/esm2020/directive/resize-drag/resize-drag.module.mjs +18 -0
  655. package/dist/esm2020/directive/teta-template/public-api.mjs +3 -0
  656. package/dist/esm2020/directive/teta-template/teta-template.directive.mjs +22 -0
  657. package/dist/esm2020/directive/teta-template/teta-template.module.mjs +26 -0
  658. package/dist/esm2020/directive/tooltip/public-api.mjs +3 -0
  659. package/dist/esm2020/directive/tooltip/tooltip.directive.mjs +76 -0
  660. package/dist/esm2020/directive/tooltip/tooltip.module.mjs +20 -0
  661. package/dist/esm2020/pipe/number-pipe/number-pipe.module.mjs +24 -0
  662. package/dist/esm2020/pipe/number-pipe/number.pipe.mjs +24 -0
  663. package/dist/esm2020/pipe/number-pipe/public-api.mjs +3 -0
  664. package/dist/esm2020/pipe/prepend-zero/prepend-zero.module.mjs +18 -0
  665. package/dist/esm2020/pipe/prepend-zero/prepend-zero.pipe.mjs +21 -0
  666. package/dist/esm2020/pipe/public-api.mjs +2 -0
  667. package/dist/esm2020/pipe/util/number-helper.mjs +25 -0
  668. package/dist/esm2020/public-api.mjs +21 -0
  669. package/dist/esm2020/tetacom-ng-components.mjs +5 -0
  670. package/dist/esm2020/util/date-util.mjs +195 -0
  671. package/dist/esm2020/util/forms-util.mjs +61 -0
  672. package/dist/esm2020/util/public-api.mjs +4 -0
  673. package/dist/esm2020/util/string-util.mjs +7 -0
  674. package/dist/fesm2015/tetacom-ng-components.mjs +13342 -0
  675. package/dist/fesm2015/tetacom-ng-components.mjs.map +1 -0
  676. package/dist/fesm2020/tetacom-ng-components.mjs +13234 -0
  677. package/dist/fesm2020/tetacom-ng-components.mjs.map +1 -0
  678. package/dist/package.json +35 -0
  679. package/{pipe → dist/pipe}/number-pipe/number-pipe.module.d.ts +0 -0
  680. package/{pipe → dist/pipe}/number-pipe/number.pipe.d.ts +0 -0
  681. package/{pipe → dist/pipe}/number-pipe/public-api.d.ts +0 -0
  682. package/{pipe → dist/pipe}/prepend-zero/prepend-zero.module.d.ts +0 -0
  683. package/{pipe → dist/pipe}/prepend-zero/prepend-zero.pipe.d.ts +0 -0
  684. package/{pipe → dist/pipe}/public-api.d.ts +0 -0
  685. package/{pipe → dist/pipe}/util/number-helper.d.ts +0 -0
  686. package/{public-api.d.ts → dist/public-api.d.ts} +0 -0
  687. package/dist/style/accordion.scss +47 -0
  688. package/dist/style/assembly-library.scss +36 -0
  689. package/dist/style/assembly-presets.scss +5 -0
  690. package/dist/style/assembly.scss +4 -0
  691. package/dist/style/border.scss +24 -0
  692. package/dist/style/button.scss +43 -0
  693. package/dist/style/checkbox.scss +31 -0
  694. package/dist/style/chips.scss +23 -0
  695. package/dist/style/color.scss +42 -0
  696. package/dist/style/common.scss +1 -0
  697. package/dist/style/datepicker.scss +106 -0
  698. package/dist/style/drag.scss +40 -0
  699. package/dist/style/dropdown.scss +30 -0
  700. package/dist/style/font.scss +7 -0
  701. package/dist/style/hint.scss +13 -0
  702. package/dist/style/icon.scss +12 -0
  703. package/dist/style/input.scss +162 -0
  704. package/dist/style/layout.scss +109 -0
  705. package/dist/style/library.scss +208 -0
  706. package/dist/style/list.scss +70 -0
  707. package/dist/style/loader.scss +40 -0
  708. package/dist/style/message.scss +51 -0
  709. package/dist/style/modal.scss +29 -0
  710. package/dist/style/navigation.scss +26 -0
  711. package/dist/style/presets/color-presets.scss +151 -0
  712. package/dist/style/presets/font-presets.scss +132 -0
  713. package/dist/style/presets/layout-presets.scss +1 -0
  714. package/dist/style/presets/shadow-presets.scss +16 -0
  715. package/dist/style/presets/spacing-presets.scss +2 -0
  716. package/dist/style/progress.scss +28 -0
  717. package/dist/style/radio.scss +56 -0
  718. package/dist/style/reset.scss +35 -0
  719. package/dist/style/resize-panel.scss +58 -0
  720. package/dist/style/scroll.scss +60 -0
  721. package/dist/style/select.scss +108 -0
  722. package/dist/style/shadow.scss +23 -0
  723. package/dist/style/sidebar.scss +40 -0
  724. package/dist/style/sizing.scss +12 -0
  725. package/dist/style/spacing.scss +45 -0
  726. package/dist/style/switch.scss +36 -0
  727. package/dist/style/table.scss +226 -0
  728. package/dist/style/tabs.scss +64 -0
  729. package/dist/style/toggle.scss +70 -0
  730. package/dist/style/toolbar.scss +23 -0
  731. package/dist/style/tooltip.scss +60 -0
  732. package/dist/style/tree.scss +60 -0
  733. package/dist/style/util/button-util.scss +58 -0
  734. package/dist/style/util/color-util.scss +3 -0
  735. package/dist/style/util/font-util.scss +11 -0
  736. package/dist/style/util/scroll-util.scss +4 -0
  737. package/dist/style/util/shadow-util.scss +3 -0
  738. package/{tetacom-ng-components.d.ts → dist/tetacom-ng-components.d.ts} +0 -0
  739. package/{util → dist/util}/date-util.d.ts +0 -0
  740. package/{util → dist/util}/forms-util.d.ts +0 -0
  741. package/{util → dist/util}/public-api.d.ts +0 -0
  742. package/{util → dist/util}/string-util.d.ts +0 -0
  743. package/karma.conf.js +44 -0
  744. package/ng-package.json +11 -0
  745. package/package.json +2 -22
  746. package/src/Introduction.stories.mdx +178 -0
  747. package/src/common/contract/auto-close-ignore-case.ts +1 -0
  748. package/src/common/contract/constructor-type.ts +1 -0
  749. package/src/common/contract/dynamic-data.ts +11 -0
  750. package/src/common/contract/i-dictionary.ts +3 -0
  751. package/src/common/contract/i-id-name.ts +6 -0
  752. package/src/common/contract/i-rect.ts +8 -0
  753. package/src/common/contract/i-tree-data.ts +4 -0
  754. package/src/common/contract/public-api.ts +8 -0
  755. package/src/common/contract/teta-content-ref.ts +6 -0
  756. package/src/common/enum/align.enum.ts +8 -0
  757. package/src/common/enum/public-api.ts +3 -0
  758. package/src/common/enum/teta-size.enum.ts +7 -0
  759. package/src/common/enum/vertical-align.enum.ts +6 -0
  760. package/src/common/public-api.ts +4 -0
  761. package/src/common/service/click.service.spec.ts +16 -0
  762. package/src/common/service/click.service.ts +16 -0
  763. package/src/common/service/dynamic-component.service.spec.ts +16 -0
  764. package/src/common/service/dynamic-component.service.ts +134 -0
  765. package/src/common/service/overlay-container.service.spec.ts +16 -0
  766. package/src/common/service/overlay-container.service.ts +37 -0
  767. package/src/common/service/public-api.ts +3 -0
  768. package/src/common/util/array-util.ts +140 -0
  769. package/src/common/util/dom-util.ts +16 -0
  770. package/src/common/util/position-util.ts +112 -0
  771. package/src/common/util/public-api.ts +3 -0
  772. package/src/component/accordion/Accordion.stories.ts +49 -0
  773. package/src/component/accordion/accordion/accordion.component.html +1 -0
  774. package/src/component/accordion/accordion/accordion.component.scss +0 -0
  775. package/src/component/accordion/accordion/accordion.component.spec.ts +25 -0
  776. package/src/component/accordion/accordion/accordion.component.ts +20 -0
  777. package/src/component/accordion/accordion-content.directive.spec.ts +8 -0
  778. package/src/component/accordion/accordion-content.directive.ts +9 -0
  779. package/src/component/accordion/accordion-head/accordion-head.component.html +6 -0
  780. package/src/component/accordion/accordion-head/accordion-head.component.scss +0 -0
  781. package/src/component/accordion/accordion-head/accordion-head.component.spec.ts +25 -0
  782. package/src/component/accordion/accordion-head/accordion-head.component.ts +54 -0
  783. package/src/component/accordion/accordion-item/accordion-item.component.html +4 -0
  784. package/src/component/accordion/accordion-item/accordion-item.component.scss +0 -0
  785. package/src/component/accordion/accordion-item/accordion-item.component.spec.ts +25 -0
  786. package/src/component/accordion/accordion-item/accordion-item.component.ts +48 -0
  787. package/src/component/accordion/accordion.module.ts +18 -0
  788. package/src/component/accordion/public-api.ts +5 -0
  789. package/src/component/button/Button.stories.ts +61 -0
  790. package/src/component/button/button/button.component.html +1 -0
  791. package/src/component/button/button/button.component.scss +0 -0
  792. package/src/component/button/button/button.component.spec.ts +25 -0
  793. package/src/component/button/button/button.component.ts +42 -0
  794. package/src/component/button/button.module.ts +16 -0
  795. package/src/component/button/public-api.ts +2 -0
  796. package/src/component/chart/Chart.stories.ts +97 -0
  797. package/src/component/chart/chart/chart.component.html +9 -0
  798. package/src/component/chart/chart/chart.component.scss +70 -0
  799. package/src/component/chart/chart/chart.component.spec.ts +25 -0
  800. package/src/component/chart/chart/chart.component.ts +241 -0
  801. package/src/component/chart/chart-data.ts +653 -0
  802. package/src/component/chart/chart.module.ts +10 -0
  803. package/src/component/chart/color-list.ts +22 -0
  804. package/src/component/chart/core/axis-creator.ts +130 -0
  805. package/src/component/chart/core/chart.ts +1831 -0
  806. package/src/component/chart/core/public-api.ts +2 -0
  807. package/src/component/chart/drawer/area-drawer.ts +30 -0
  808. package/src/component/chart/drawer/bar-drawer.ts +36 -0
  809. package/src/component/chart/drawer/contour-drawer.ts +47 -0
  810. package/src/component/chart/drawer/default-drawer-mapping.ts +19 -0
  811. package/src/component/chart/drawer/line-drawer.ts +203 -0
  812. package/src/component/chart/drawer/pie-drawer.ts +13 -0
  813. package/src/component/chart/drawer/public-api.ts +6 -0
  814. package/src/component/chart/drawer/scatter-drawer.ts +138 -0
  815. package/src/component/chart/drawer/spline-drawer.ts +33 -0
  816. package/src/component/chart/legend-drawer/default-drawer-legend-mapping.ts +8 -0
  817. package/src/component/chart/legend-drawer/gradient-drawer.ts +65 -0
  818. package/src/component/chart/legend-drawer/swatch-drawer.ts +81 -0
  819. package/src/component/chart/model/annotation.ts +96 -0
  820. package/src/component/chart/model/axis-options.ts +65 -0
  821. package/src/component/chart/model/chart-bounds.ts +18 -0
  822. package/src/component/chart/model/chart-options.ts +79 -0
  823. package/src/component/chart/model/enum/axis-type.ts +4 -0
  824. package/src/component/chart/model/enum/dispatch-type.ts +4 -0
  825. package/src/component/chart/model/enum/drag-point-type.ts +5 -0
  826. package/src/component/chart/model/enum/legend-type.ts +4 -0
  827. package/src/component/chart/model/enum/public-api.ts +7 -0
  828. package/src/component/chart/model/enum/scale-type.ts +7 -0
  829. package/src/component/chart/model/enum/scale.ts +5 -0
  830. package/src/component/chart/model/enum/series-type.ts +10 -0
  831. package/src/component/chart/model/enum/zoom-type.ts +5 -0
  832. package/src/component/chart/model/i-drag-event.ts +5 -0
  833. package/src/component/chart/model/i-drawer-legend.ts +14 -0
  834. package/src/component/chart/model/i-drawer.ts +19 -0
  835. package/src/component/chart/model/i-zoom-event.ts +9 -0
  836. package/src/component/chart/model/plot-band.ts +43 -0
  837. package/src/component/chart/model/plot-line.ts +30 -0
  838. package/src/component/chart/model/point/bar-point.ts +7 -0
  839. package/src/component/chart/model/point/base-point.ts +10 -0
  840. package/src/component/chart/model/point/contour-point.ts +5 -0
  841. package/src/component/chart/model/point/marker-options.ts +12 -0
  842. package/src/component/chart/model/point/public-api.ts +3 -0
  843. package/src/component/chart/model/point/scatter-point.ts +6 -0
  844. package/src/component/chart/model/public-api.ts +16 -0
  845. package/src/component/chart/model/series.ts +85 -0
  846. package/src/component/chart/model/tooltip-options.ts +35 -0
  847. package/src/component/chart/public-api.ts +6 -0
  848. package/src/component/chart-3d/chart-3d.module.ts +10 -0
  849. package/src/component/chart-3d/chart3d/chart3d.component.html +1 -0
  850. package/src/component/chart-3d/chart3d/chart3d.component.scss +5 -0
  851. package/src/component/chart-3d/chart3d/chart3d.component.spec.ts +25 -0
  852. package/src/component/chart-3d/chart3d/chart3d.component.ts +336 -0
  853. package/src/component/chart-3d/model/base-3d-point.ts +5 -0
  854. package/src/component/chart-3d/model/chart-3d-options.ts +15 -0
  855. package/src/component/chart-3d/model/public-api.ts +2 -0
  856. package/src/component/chart-3d/model/series-3d.ts +11 -0
  857. package/src/component/chart-3d/public-api.ts +3 -0
  858. package/src/component/checkbox/Checkbox.mdx +18 -0
  859. package/src/component/checkbox/Checkbox.stories.ts +92 -0
  860. package/src/component/checkbox/checkbox/checkbox.component.html +6 -0
  861. package/src/component/checkbox/checkbox/checkbox.component.scss +0 -0
  862. package/src/component/checkbox/checkbox/checkbox.component.spec.ts +25 -0
  863. package/src/component/checkbox/checkbox/checkbox.component.ts +149 -0
  864. package/src/component/checkbox/checkbox.module.ts +17 -0
  865. package/src/component/checkbox/public-api.ts +2 -0
  866. package/src/component/date-picker/DatePicker.stories.ts +51 -0
  867. package/src/component/date-picker/MonthPicker.stories.ts +32 -0
  868. package/src/component/date-picker/date-picker/date-picker.component.html +91 -0
  869. package/src/component/date-picker/date-picker/date-picker.component.scss +0 -0
  870. package/src/component/date-picker/date-picker/date-picker.component.spec.ts +25 -0
  871. package/src/component/date-picker/date-picker/date-picker.component.ts +305 -0
  872. package/src/component/date-picker/date-picker.module.ts +38 -0
  873. package/src/component/date-picker/day-select/day-select.component.html +23 -0
  874. package/src/component/date-picker/day-select/day-select.component.scss +0 -0
  875. package/src/component/date-picker/day-select/day-select.component.spec.ts +25 -0
  876. package/src/component/date-picker/day-select/day-select.component.ts +216 -0
  877. package/src/component/date-picker/model/date-period.ts +9 -0
  878. package/src/component/date-picker/model/date-picker-mode.enum.ts +5 -0
  879. package/src/component/date-picker/model/day-model.ts +26 -0
  880. package/src/component/date-picker/model/picker-locale-model.ts +26 -0
  881. package/src/component/date-picker/month-picker/month-picker.component.html +64 -0
  882. package/src/component/date-picker/month-picker/month-picker.component.scss +0 -0
  883. package/src/component/date-picker/month-picker/month-picker.component.spec.ts +25 -0
  884. package/src/component/date-picker/month-picker/month-picker.component.ts +278 -0
  885. package/src/component/date-picker/month-select/month-select.component.html +15 -0
  886. package/src/component/date-picker/month-select/month-select.component.scss +3 -0
  887. package/src/component/date-picker/month-select/month-select.component.spec.ts +25 -0
  888. package/src/component/date-picker/month-select/month-select.component.ts +193 -0
  889. package/src/component/date-picker/public-api.ts +5 -0
  890. package/src/component/date-picker/service/picker-locale.service.spec.ts +14 -0
  891. package/src/component/date-picker/service/picker-locale.service.ts +27 -0
  892. package/src/component/date-picker/service/picker-touch.service.spec.ts +16 -0
  893. package/src/component/date-picker/service/picker-touch.service.ts +38 -0
  894. package/src/component/date-picker/time-part-control/time-part-control.component.html +9 -0
  895. package/src/component/date-picker/time-part-control/time-part-control.component.scss +4 -0
  896. package/src/component/date-picker/time-part-control/time-part-control.component.spec.ts +25 -0
  897. package/src/component/date-picker/time-part-control/time-part-control.component.ts +86 -0
  898. package/src/component/date-picker/util/date-picker-util.spec.ts +7 -0
  899. package/src/component/date-picker/util/date-picker-util.ts +227 -0
  900. package/src/component/date-picker/year-select/year-select.component.html +11 -0
  901. package/src/component/date-picker/year-select/year-select.component.scss +3 -0
  902. package/src/component/date-picker/year-select/year-select.component.spec.ts +25 -0
  903. package/src/component/date-picker/year-select/year-select.component.ts +229 -0
  904. package/src/component/delimiter/Delimiter.stories.ts +54 -0
  905. package/src/component/delimiter/delimiter/delimiter.component.html +0 -0
  906. package/src/component/delimiter/delimiter/delimiter.component.scss +3 -0
  907. package/src/component/delimiter/delimiter/delimiter.component.spec.ts +25 -0
  908. package/src/component/delimiter/delimiter/delimiter.component.ts +56 -0
  909. package/src/component/delimiter/delimiter.module.ts +13 -0
  910. package/src/component/delimiter/public-api.ts +2 -0
  911. package/src/component/dropdown/Dropdown.stories.ts +167 -0
  912. package/src/component/dropdown/dropdown/dropdown.component.html +1 -0
  913. package/src/component/dropdown/dropdown/dropdown.component.scss +0 -0
  914. package/src/component/dropdown/dropdown/dropdown.component.spec.ts +25 -0
  915. package/src/component/dropdown/dropdown/dropdown.component.ts +41 -0
  916. package/src/component/dropdown/dropdown-base.spec.ts +7 -0
  917. package/src/component/dropdown/dropdown-base.ts +225 -0
  918. package/src/component/dropdown/dropdown-content.directive.spec.ts +8 -0
  919. package/src/component/dropdown/dropdown-content.directive.ts +12 -0
  920. package/src/component/dropdown/dropdown-head.directive.spec.ts +8 -0
  921. package/src/component/dropdown/dropdown-head.directive.ts +9 -0
  922. package/src/component/dropdown/dropdown.directive.spec.ts +8 -0
  923. package/src/component/dropdown/dropdown.directive.ts +39 -0
  924. package/src/component/dropdown/dropdown.module.ts +26 -0
  925. package/src/component/dropdown/public-api.ts +5 -0
  926. package/src/component/dynamic-component/dynamic-component.module.ts +13 -0
  927. package/src/component/dynamic-component/popup-content/popup-content.component.html +1 -0
  928. package/src/component/dynamic-component/popup-content/popup-content.component.scss +0 -0
  929. package/src/component/dynamic-component/popup-content/popup-content.component.spec.ts +25 -0
  930. package/src/component/dynamic-component/popup-content/popup-content.component.ts +56 -0
  931. package/src/component/dynamic-component/public-api.ts +2 -0
  932. package/src/component/expand-panel/ExpandPanel.stories.ts +22 -0
  933. package/src/component/expand-panel/expand-panel/expand-panel.component.html +36 -0
  934. package/src/component/expand-panel/expand-panel/expand-panel.component.scss +9 -0
  935. package/src/component/expand-panel/expand-panel/expand-panel.component.spec.ts +25 -0
  936. package/src/component/expand-panel/expand-panel/expand-panel.component.ts +65 -0
  937. package/src/component/expand-panel/expand-panel-content.directive.spec.ts +8 -0
  938. package/src/component/expand-panel/expand-panel-content.directive.ts +8 -0
  939. package/src/component/expand-panel/expand-panel-head.directive.spec.ts +8 -0
  940. package/src/component/expand-panel/expand-panel-head.directive.ts +8 -0
  941. package/src/component/expand-panel/expand-panel.module.ts +30 -0
  942. package/src/component/expand-panel/public-api.ts +4 -0
  943. package/src/component/file-upload/File.stories.ts +36 -0
  944. package/src/component/file-upload/file-item/file-item.component.html +1 -0
  945. package/src/component/file-upload/file-item/file-item.component.scss +0 -0
  946. package/src/component/file-upload/file-item/file-item.component.spec.ts +25 -0
  947. package/src/component/file-upload/file-item/file-item.component.ts +12 -0
  948. package/src/component/file-upload/file-upload-area/file-upload-area.component.html +16 -0
  949. package/src/component/file-upload/file-upload-area/file-upload-area.component.scss +3 -0
  950. package/src/component/file-upload/file-upload-area/file-upload-area.component.spec.ts +25 -0
  951. package/src/component/file-upload/file-upload-area/file-upload-area.component.ts +75 -0
  952. package/src/component/file-upload/file-upload.module.ts +13 -0
  953. package/src/component/file-upload/public-api.ts +3 -0
  954. package/src/component/filter/base/filter-base.spec.ts +7 -0
  955. package/src/component/filter/base/filter-base.ts +17 -0
  956. package/src/component/filter/base/filter-component-base.spec.ts +7 -0
  957. package/src/component/filter/base/filter-component-base.ts +13 -0
  958. package/src/component/filter/boolean-filter/boolean-filter.component.html +7 -0
  959. package/src/component/filter/boolean-filter/boolean-filter.component.scss +0 -0
  960. package/src/component/filter/boolean-filter/boolean-filter.component.spec.ts +25 -0
  961. package/src/component/filter/boolean-filter/boolean-filter.component.ts +71 -0
  962. package/src/component/filter/contarct/boolean-filter.ts +12 -0
  963. package/src/component/filter/contarct/date-filter-value.ts +20 -0
  964. package/src/component/filter/contarct/date-filter.ts +17 -0
  965. package/src/component/filter/contarct/filter-component-map.ts +24 -0
  966. package/src/component/filter/contarct/filter-item.ts +95 -0
  967. package/src/component/filter/contarct/filter-state.ts +172 -0
  968. package/src/component/filter/contarct/i-filter.ts +5 -0
  969. package/src/component/filter/contarct/list-filter.ts +20 -0
  970. package/src/component/filter/contarct/numeric-filter-value.ts +26 -0
  971. package/src/component/filter/contarct/numeric-filter.ts +20 -0
  972. package/src/component/filter/contarct/sort-param.ts +29 -0
  973. package/src/component/filter/contarct/string-filter.ts +21 -0
  974. package/src/component/filter/date-filter/date-filter.component.html +14 -0
  975. package/src/component/filter/date-filter/date-filter.component.scss +0 -0
  976. package/src/component/filter/date-filter/date-filter.component.spec.ts +25 -0
  977. package/src/component/filter/date-filter/date-filter.component.ts +68 -0
  978. package/src/component/filter/enum/filter-type.enum.ts +8 -0
  979. package/src/component/filter/enum/list-filter-type.enum.ts +4 -0
  980. package/src/component/filter/enum/string-filter-type.enum.ts +18 -0
  981. package/src/component/filter/filter-host/filter-host.component.html +1 -0
  982. package/src/component/filter/filter-host/filter-host.component.scss +0 -0
  983. package/src/component/filter/filter-host/filter-host.component.spec.ts +25 -0
  984. package/src/component/filter/filter-host/filter-host.component.ts +90 -0
  985. package/src/component/filter/filter-panel/filter-panel.component.html +1 -0
  986. package/src/component/filter/filter-panel/filter-panel.component.scss +0 -0
  987. package/src/component/filter/filter-panel/filter-panel.component.spec.ts +25 -0
  988. package/src/component/filter/filter-panel/filter-panel.component.ts +13 -0
  989. package/src/component/filter/filter.module.ts +46 -0
  990. package/src/component/filter/list-filter/list-filter.component.html +21 -0
  991. package/src/component/filter/list-filter/list-filter.component.scss +7 -0
  992. package/src/component/filter/list-filter/list-filter.component.spec.ts +25 -0
  993. package/src/component/filter/list-filter/list-filter.component.ts +109 -0
  994. package/src/component/filter/numeric-filter/numeric-filter.component.html +14 -0
  995. package/src/component/filter/numeric-filter/numeric-filter.component.scss +0 -0
  996. package/src/component/filter/numeric-filter/numeric-filter.component.spec.ts +25 -0
  997. package/src/component/filter/numeric-filter/numeric-filter.component.ts +72 -0
  998. package/src/component/filter/public-api.ts +27 -0
  999. package/src/component/filter/string-filter/string-filter.component.html +6 -0
  1000. package/src/component/filter/string-filter/string-filter.component.scss +0 -0
  1001. package/src/component/filter/string-filter/string-filter.component.spec.ts +25 -0
  1002. package/src/component/filter/string-filter/string-filter.component.ts +73 -0
  1003. package/src/component/icon/Icon.stories.ts +46 -0
  1004. package/src/component/icon/icon/icon.component.html +3 -0
  1005. package/src/component/icon/icon/icon.component.scss +0 -0
  1006. package/src/component/icon/icon/icon.component.spec.ts +25 -0
  1007. package/src/component/icon/icon/icon.component.ts +39 -0
  1008. package/src/component/icon/icon-sprite.directive.spec.ts +8 -0
  1009. package/src/component/icon/icon-sprite.directive.ts +24 -0
  1010. package/src/component/icon/icon.module.ts +23 -0
  1011. package/src/component/icon/icon.service.spec.ts +16 -0
  1012. package/src/component/icon/icon.service.ts +57 -0
  1013. package/src/component/icon/icons-list.ts +173 -0
  1014. package/src/component/icon/public-api.ts +4 -0
  1015. package/src/component/input/Input.stories.ts +142 -0
  1016. package/src/component/input/form-group-title/form-group-title.component.html +4 -0
  1017. package/src/component/input/form-group-title/form-group-title.component.scss +0 -0
  1018. package/src/component/input/form-group-title/form-group-title.component.spec.ts +25 -0
  1019. package/src/component/input/form-group-title/form-group-title.component.ts +20 -0
  1020. package/src/component/input/input/input.component.html +12 -0
  1021. package/src/component/input/input/input.component.scss +6 -0
  1022. package/src/component/input/input/input.component.spec.ts +25 -0
  1023. package/src/component/input/input/input.component.ts +33 -0
  1024. package/src/component/input/input.module.ts +15 -0
  1025. package/src/component/input/public-api.ts +4 -0
  1026. package/src/component/input/sample-input/sample-input/sample-input.component.html +28 -0
  1027. package/src/component/input/sample-input/sample-input/sample-input.component.scss +25 -0
  1028. package/src/component/input/sample-input/sample-input/sample-input.component.spec.ts +25 -0
  1029. package/src/component/input/sample-input/sample-input/sample-input.component.ts +38 -0
  1030. package/src/component/input/sample-input/sample-input.module.ts +22 -0
  1031. package/src/component/input/text-field/text-field.component.html +19 -0
  1032. package/src/component/input/text-field/text-field.component.scss +0 -0
  1033. package/src/component/input/text-field/text-field.component.spec.ts +25 -0
  1034. package/src/component/input/text-field/text-field.component.ts +84 -0
  1035. package/src/component/list/List.stories.ts +56 -0
  1036. package/src/component/list/list.module.ts +12 -0
  1037. package/src/component/message/Message.stories.ts +20 -0
  1038. package/src/component/message/message/message.component.html +18 -0
  1039. package/src/component/message/message/message.component.scss +0 -0
  1040. package/src/component/message/message/message.component.spec.ts +25 -0
  1041. package/src/component/message/message/message.component.ts +80 -0
  1042. package/src/component/message/message-host/message-host.component.html +6 -0
  1043. package/src/component/message/message-host/message-host.component.scss +0 -0
  1044. package/src/component/message/message-host/message-host.component.spec.ts +25 -0
  1045. package/src/component/message/message-host/message-host.component.ts +94 -0
  1046. package/src/component/message/message-samples/message-sample/message-sample.component.html +31 -0
  1047. package/src/component/message/message-samples/message-sample/message-sample.component.scss +0 -0
  1048. package/src/component/message/message-samples/message-sample/message-sample.component.spec.ts +25 -0
  1049. package/src/component/message/message-samples/message-sample/message-sample.component.ts +40 -0
  1050. package/src/component/message/message-samples/message-samples.module.ts +19 -0
  1051. package/src/component/message/message.module.ts +18 -0
  1052. package/src/component/message/message.service.spec.ts +16 -0
  1053. package/src/component/message/message.service.ts +38 -0
  1054. package/src/component/message/model/message.spec.ts +7 -0
  1055. package/src/component/message/model/message.ts +38 -0
  1056. package/src/component/message/public-api.ts +5 -0
  1057. package/src/component/modal/Modal.stories.ts +43 -0
  1058. package/src/component/modal/dialog/dialog.component.html +20 -0
  1059. package/src/component/modal/dialog/dialog.component.scss +5 -0
  1060. package/src/component/modal/dialog/dialog.component.spec.ts +25 -0
  1061. package/src/component/modal/dialog/dialog.component.ts +33 -0
  1062. package/src/component/modal/dialog.service.spec.ts +16 -0
  1063. package/src/component/modal/dialog.service.ts +59 -0
  1064. package/src/component/modal/modal-container/modal-container.component.html +3 -0
  1065. package/src/component/modal/modal-container/modal-container.component.scss +0 -0
  1066. package/src/component/modal/modal-container/modal-container.component.spec.ts +25 -0
  1067. package/src/component/modal/modal-container/modal-container.component.ts +76 -0
  1068. package/src/component/modal/modal-samples/alert-sample/alert-sample.component.html +13 -0
  1069. package/src/component/modal/modal-samples/alert-sample/alert-sample.component.scss +0 -0
  1070. package/src/component/modal/modal-samples/alert-sample/alert-sample.component.spec.ts +25 -0
  1071. package/src/component/modal/modal-samples/alert-sample/alert-sample.component.ts +31 -0
  1072. package/src/component/modal/modal-samples/modal-example/modal-example.component.html +24 -0
  1073. package/src/component/modal/modal-samples/modal-example/modal-example.component.scss +0 -0
  1074. package/src/component/modal/modal-samples/modal-example/modal-example.component.spec.ts +25 -0
  1075. package/src/component/modal/modal-samples/modal-example/modal-example.component.ts +18 -0
  1076. package/src/component/modal/modal-samples/modal-from-component/modal-from-component.component.html +3 -0
  1077. package/src/component/modal/modal-samples/modal-from-component/modal-from-component.component.scss +0 -0
  1078. package/src/component/modal/modal-samples/modal-from-component/modal-from-component.component.spec.ts +25 -0
  1079. package/src/component/modal/modal-samples/modal-from-component/modal-from-component.component.ts +31 -0
  1080. package/src/component/modal/modal-samples/modal-from-template/modal-from-template.component.html +31 -0
  1081. package/src/component/modal/modal-samples/modal-from-template/modal-from-template.component.scss +0 -0
  1082. package/src/component/modal/modal-samples/modal-from-template/modal-from-template.component.spec.ts +25 -0
  1083. package/src/component/modal/modal-samples/modal-from-template/modal-from-template.component.ts +34 -0
  1084. package/src/component/modal/modal-samples/modal-samples.module.ts +43 -0
  1085. package/src/component/modal/modal.module.ts +28 -0
  1086. package/src/component/modal/modal.service.spec.ts +16 -0
  1087. package/src/component/modal/modal.service.ts +153 -0
  1088. package/src/component/modal/model/current-modal.ts +5 -0
  1089. package/src/component/modal/model/i-modal-config.ts +12 -0
  1090. package/src/component/modal/model/i-modal-result.ts +13 -0
  1091. package/src/component/modal/model/modal-close-reason.enum.ts +6 -0
  1092. package/src/component/modal/model/modal-instance.ts +44 -0
  1093. package/src/component/modal/public-api.ts +11 -0
  1094. package/src/component/pager/Pager.stories.ts +19 -0
  1095. package/src/component/pager/model/pager-state.spec.ts +7 -0
  1096. package/src/component/pager/model/pager-state.ts +80 -0
  1097. package/src/component/pager/pager/pager.component.html +1 -0
  1098. package/src/component/pager/pager/pager.component.scss +0 -0
  1099. package/src/component/pager/pager/pager.component.spec.ts +25 -0
  1100. package/src/component/pager/pager/pager.component.ts +13 -0
  1101. package/src/component/pager/pager.module.ts +15 -0
  1102. package/src/component/pager/public-api.ts +4 -0
  1103. package/src/component/pager/util/pager-util.spec.ts +7 -0
  1104. package/src/component/pager/util/pager-util.ts +7 -0
  1105. package/src/component/panel/panel/panel.component.html +1 -0
  1106. package/src/component/panel/panel/panel.component.scss +0 -0
  1107. package/src/component/panel/panel/panel.component.spec.ts +25 -0
  1108. package/src/component/panel/panel/panel.component.ts +42 -0
  1109. package/src/component/panel/panel.module.ts +13 -0
  1110. package/src/component/panel/public-api.ts +2 -0
  1111. package/src/component/progress-bar/ProgressBar.stories.ts +29 -0
  1112. package/src/component/progress-bar/progress-bar/progress-bar.component.html +7 -0
  1113. package/src/component/progress-bar/progress-bar/progress-bar.component.scss +0 -0
  1114. package/src/component/progress-bar/progress-bar/progress-bar.component.spec.ts +25 -0
  1115. package/src/component/progress-bar/progress-bar/progress-bar.component.ts +158 -0
  1116. package/src/component/progress-bar/progress-bar.module.ts +13 -0
  1117. package/src/component/progress-bar/public-api.ts +2 -0
  1118. package/src/component/property-grid/PropertyGrid.stories.ts +110 -0
  1119. package/src/component/property-grid/default/date-item-default/date-item-default.component.html +1 -0
  1120. package/src/component/property-grid/default/date-item-default/date-item-default.component.scss +0 -0
  1121. package/src/component/property-grid/default/date-item-default/date-item-default.component.spec.ts +25 -0
  1122. package/src/component/property-grid/default/date-item-default/date-item-default.component.ts +13 -0
  1123. package/src/component/property-grid/default/list-item-default/list-item-default.component.html +1 -0
  1124. package/src/component/property-grid/default/list-item-default/list-item-default.component.scss +0 -0
  1125. package/src/component/property-grid/default/list-item-default/list-item-default.component.spec.ts +25 -0
  1126. package/src/component/property-grid/default/list-item-default/list-item-default.component.ts +13 -0
  1127. package/src/component/property-grid/default/numeric-item-default/numeric-item-default.component.html +1 -0
  1128. package/src/component/property-grid/default/numeric-item-default/numeric-item-default.component.scss +0 -0
  1129. package/src/component/property-grid/default/numeric-item-default/numeric-item-default.component.spec.ts +25 -0
  1130. package/src/component/property-grid/default/numeric-item-default/numeric-item-default.component.ts +13 -0
  1131. package/src/component/property-grid/default/string-item-default/string-item-default.component.html +1 -0
  1132. package/src/component/property-grid/default/string-item-default/string-item-default.component.scss +0 -0
  1133. package/src/component/property-grid/default/string-item-default/string-item-default.component.spec.ts +25 -0
  1134. package/src/component/property-grid/default/string-item-default/string-item-default.component.ts +13 -0
  1135. package/src/component/property-grid/property-grid/property-grid-group/property-grid-group.component.html +20 -0
  1136. package/src/component/property-grid/property-grid/property-grid-group/property-grid-group.component.scss +0 -0
  1137. package/src/component/property-grid/property-grid/property-grid-group/property-grid-group.component.spec.ts +25 -0
  1138. package/src/component/property-grid/property-grid/property-grid-group/property-grid-group.component.ts +31 -0
  1139. package/src/component/property-grid/property-grid/property-grid-item/property-grid-item.component.html +39 -0
  1140. package/src/component/property-grid/property-grid/property-grid-item/property-grid-item.component.scss +0 -0
  1141. package/src/component/property-grid/property-grid/property-grid-item/property-grid-item.component.spec.ts +24 -0
  1142. package/src/component/property-grid/property-grid/property-grid-item/property-grid-item.component.ts +122 -0
  1143. package/src/component/property-grid/property-grid/property-grid.component.html +18 -0
  1144. package/src/component/property-grid/property-grid/property-grid.component.scss +3 -0
  1145. package/src/component/property-grid/property-grid/property-grid.component.spec.ts +25 -0
  1146. package/src/component/property-grid/property-grid/property-grid.component.ts +62 -0
  1147. package/src/component/property-grid/property-grid.module.ts +53 -0
  1148. package/src/component/property-grid/public-api.ts +2 -0
  1149. package/src/component/public-api.ts +89 -0
  1150. package/src/component/radio/Radio.stories.ts +28 -0
  1151. package/src/component/radio/public-api.ts +3 -0
  1152. package/src/component/radio/radio/radio.component.html +1 -0
  1153. package/src/component/radio/radio/radio.component.scss +0 -0
  1154. package/src/component/radio/radio/radio.component.spec.ts +26 -0
  1155. package/src/component/radio/radio/radio.component.ts +264 -0
  1156. package/src/component/radio/radio-button/radio-button.component.html +4 -0
  1157. package/src/component/radio/radio-button/radio-button.component.scss +0 -0
  1158. package/src/component/radio/radio-button/radio-button.component.spec.ts +26 -0
  1159. package/src/component/radio/radio-button/radio-button.component.ts +71 -0
  1160. package/src/component/radio/radio.module.ts +12 -0
  1161. package/src/component/resize-panel/Resize.stories.ts +83 -0
  1162. package/src/component/resize-panel/public-api.ts +2 -0
  1163. package/src/component/resize-panel/resize-panel/resize-panel.component.html +9 -0
  1164. package/src/component/resize-panel/resize-panel/resize-panel.component.scss +0 -0
  1165. package/src/component/resize-panel/resize-panel/resize-panel.component.spec.ts +25 -0
  1166. package/src/component/resize-panel/resize-panel/resize-panel.component.ts +210 -0
  1167. package/src/component/resize-panel/resize-panel.module.ts +12 -0
  1168. package/src/component/select/Select.stories.ts +254 -0
  1169. package/src/component/select/public-api.ts +4 -0
  1170. package/src/component/select/select/select.component.html +92 -0
  1171. package/src/component/select/select/select.component.scss +0 -0
  1172. package/src/component/select/select/select.component.spec.ts +25 -0
  1173. package/src/component/select/select/select.component.ts +222 -0
  1174. package/src/component/select/select-option.directive.spec.ts +8 -0
  1175. package/src/component/select/select-option.directive.ts +9 -0
  1176. package/src/component/select/select-value.directive.spec.ts +8 -0
  1177. package/src/component/select/select-value.directive.ts +9 -0
  1178. package/src/component/select/select.module.ts +26 -0
  1179. package/src/component/sidebar/Sidebar.stories.ts +61 -0
  1180. package/src/component/sidebar/public-api.ts +3 -0
  1181. package/src/component/sidebar/sidebar/sidebar.component.html +14 -0
  1182. package/src/component/sidebar/sidebar/sidebar.component.scss +0 -0
  1183. package/src/component/sidebar/sidebar/sidebar.component.spec.ts +25 -0
  1184. package/src/component/sidebar/sidebar/sidebar.component.ts +47 -0
  1185. package/src/component/sidebar/sidebar-position.enum.ts +6 -0
  1186. package/src/component/sidebar/sidebar.module.ts +16 -0
  1187. package/src/component/switch/Switch.stories.ts +37 -0
  1188. package/src/component/switch/public-api.ts +3 -0
  1189. package/src/component/switch/switch/switch.component.html +1 -0
  1190. package/src/component/switch/switch/switch.component.scss +0 -0
  1191. package/src/component/switch/switch/switch.component.spec.ts +25 -0
  1192. package/src/component/switch/switch/switch.component.ts +70 -0
  1193. package/src/component/switch/switch-button/switch-button.component.html +1 -0
  1194. package/src/component/switch/switch-button/switch-button.component.scss +0 -0
  1195. package/src/component/switch/switch-button/switch-button.component.spec.ts +25 -0
  1196. package/src/component/switch/switch-button/switch-button.component.ts +55 -0
  1197. package/src/component/switch/switch.module.ts +15 -0
  1198. package/src/component/switch/switch.service.spec.ts +16 -0
  1199. package/src/component/switch/switch.service.ts +18 -0
  1200. package/src/component/table/Table.stories.ts +102 -0
  1201. package/src/component/table/base/cell-component-base.ts +146 -0
  1202. package/src/component/table/base/detail-component-base.ts +13 -0
  1203. package/src/component/table/base/group-row-component-base.ts +13 -0
  1204. package/src/component/table/base/head-cell-component-base.ts +12 -0
  1205. package/src/component/table/cell/cell.component.html +4 -0
  1206. package/src/component/table/cell/cell.component.scss +0 -0
  1207. package/src/component/table/cell/cell.component.spec.ts +25 -0
  1208. package/src/component/table/cell/cell.component.ts +37 -0
  1209. package/src/component/table/cell-host/cell-host.component.html +1 -0
  1210. package/src/component/table/cell-host/cell-host.component.scss +0 -0
  1211. package/src/component/table/cell-host/cell-host.component.spec.ts +25 -0
  1212. package/src/component/table/cell-host/cell-host.component.ts +67 -0
  1213. package/src/component/table/contract/cell-components-map.ts +24 -0
  1214. package/src/component/table/contract/column-reorder-event.ts +11 -0
  1215. package/src/component/table/contract/column-resize-event.ts +11 -0
  1216. package/src/component/table/contract/i-cell-coordinates.ts +8 -0
  1217. package/src/component/table/contract/i-cell-event.ts +5 -0
  1218. package/src/component/table/contract/i-cell-value.ts +6 -0
  1219. package/src/component/table/contract/public-api.ts +11 -0
  1220. package/src/component/table/contract/sort-event.ts +11 -0
  1221. package/src/component/table/contract/table-column-store.ts +24 -0
  1222. package/src/component/table/contract/table-column.ts +172 -0
  1223. package/src/component/table/contract/table-context-menu-config.ts +23 -0
  1224. package/src/component/table/contract/table-row.ts +51 -0
  1225. package/src/component/table/default/boolean-cell/boolean-cell.component.html +10 -0
  1226. package/src/component/table/default/boolean-cell/boolean-cell.component.scss +0 -0
  1227. package/src/component/table/default/boolean-cell/boolean-cell.component.spec.ts +25 -0
  1228. package/src/component/table/default/boolean-cell/boolean-cell.component.ts +54 -0
  1229. package/src/component/table/default/date-cell/date-cell.component.html +11 -0
  1230. package/src/component/table/default/date-cell/date-cell.component.scss +0 -0
  1231. package/src/component/table/default/date-cell/date-cell.component.spec.ts +25 -0
  1232. package/src/component/table/default/date-cell/date-cell.component.ts +59 -0
  1233. package/src/component/table/default/date-time-cell/date-time-cell.component.html +10 -0
  1234. package/src/component/table/default/date-time-cell/date-time-cell.component.scss +0 -0
  1235. package/src/component/table/default/date-time-cell/date-time-cell.component.spec.ts +25 -0
  1236. package/src/component/table/default/date-time-cell/date-time-cell.component.ts +56 -0
  1237. package/src/component/table/default/default-head-cell/default-head-cell.component.html +8 -0
  1238. package/src/component/table/default/default-head-cell/default-head-cell.component.scss +6 -0
  1239. package/src/component/table/default/default-head-cell/default-head-cell.component.spec.ts +25 -0
  1240. package/src/component/table/default/default-head-cell/default-head-cell.component.ts +38 -0
  1241. package/src/component/table/default/group-row/group-row.component.html +2 -0
  1242. package/src/component/table/default/group-row/group-row.component.scss +0 -0
  1243. package/src/component/table/default/group-row/group-row.component.spec.ts +25 -0
  1244. package/src/component/table/default/group-row/group-row.component.ts +29 -0
  1245. package/src/component/table/default/list-cell/list-cell.component.html +15 -0
  1246. package/src/component/table/default/list-cell/list-cell.component.scss +0 -0
  1247. package/src/component/table/default/list-cell/list-cell.component.spec.ts +25 -0
  1248. package/src/component/table/default/list-cell/list-cell.component.ts +85 -0
  1249. package/src/component/table/default/numeric-cell/numeric-cell.component.html +11 -0
  1250. package/src/component/table/default/numeric-cell/numeric-cell.component.scss +3 -0
  1251. package/src/component/table/default/numeric-cell/numeric-cell.component.spec.ts +25 -0
  1252. package/src/component/table/default/numeric-cell/numeric-cell.component.ts +57 -0
  1253. package/src/component/table/default/string-cell/string-cell.component.html +11 -0
  1254. package/src/component/table/default/string-cell/string-cell.component.scss +0 -0
  1255. package/src/component/table/default/string-cell/string-cell.component.spec.ts +25 -0
  1256. package/src/component/table/default/string-cell/string-cell.component.ts +54 -0
  1257. package/src/component/table/enum/aggregation-type.enum.ts +7 -0
  1258. package/src/component/table/enum/edit-event.enum.ts +5 -0
  1259. package/src/component/table/enum/edit-type.enum.ts +4 -0
  1260. package/src/component/table/enum/public-api.ts +4 -0
  1261. package/src/component/table/enum/select-type.enum.ts +5 -0
  1262. package/src/component/table/head-cell/head-cell.component.html +45 -0
  1263. package/src/component/table/head-cell/head-cell.component.scss +16 -0
  1264. package/src/component/table/head-cell/head-cell.component.spec.ts +25 -0
  1265. package/src/component/table/head-cell/head-cell.component.ts +150 -0
  1266. package/src/component/table/head-cell-dropdown/head-cell-dropdown.component.html +145 -0
  1267. package/src/component/table/head-cell-dropdown/head-cell-dropdown.component.scss +6 -0
  1268. package/src/component/table/head-cell-dropdown/head-cell-dropdown.component.spec.ts +25 -0
  1269. package/src/component/table/head-cell-dropdown/head-cell-dropdown.component.ts +240 -0
  1270. package/src/component/table/head-cell-host/head-cell-host.component.html +1 -0
  1271. package/src/component/table/head-cell-host/head-cell-host.component.scss +3 -0
  1272. package/src/component/table/head-cell-host/head-cell-host.component.spec.ts +25 -0
  1273. package/src/component/table/head-cell-host/head-cell-host.component.ts +50 -0
  1274. package/src/component/table/public-api.ts +48 -0
  1275. package/src/component/table/selection-cell/selection-cell.component.html +4 -0
  1276. package/src/component/table/selection-cell/selection-cell.component.scss +5 -0
  1277. package/src/component/table/selection-cell/selection-cell.component.spec.ts +25 -0
  1278. package/src/component/table/selection-cell/selection-cell.component.ts +50 -0
  1279. package/src/component/table/selection-head-cell/selection-head-cell.component.html +5 -0
  1280. package/src/component/table/selection-head-cell/selection-head-cell.component.scss +5 -0
  1281. package/src/component/table/selection-head-cell/selection-head-cell.component.spec.ts +25 -0
  1282. package/src/component/table/selection-head-cell/selection-head-cell.component.ts +49 -0
  1283. package/src/component/table/service/table.service.spec.ts +16 -0
  1284. package/src/component/table/service/table.service.ts +570 -0
  1285. package/src/component/table/table/table.component.html +68 -0
  1286. package/src/component/table/table/table.component.scss +0 -0
  1287. package/src/component/table/table/table.component.spec.ts +25 -0
  1288. package/src/component/table/table/table.component.ts +444 -0
  1289. package/src/component/table/table-body/table-body.component.html +121 -0
  1290. package/src/component/table/table-body/table-body.component.scss +0 -0
  1291. package/src/component/table/table-body/table-body.component.spec.ts +25 -0
  1292. package/src/component/table/table-body/table-body.component.ts +280 -0
  1293. package/src/component/table/table-demo/table-demo/table-demo.component.html +28 -0
  1294. package/src/component/table/table-demo/table-demo/table-demo.component.scss +6 -0
  1295. package/src/component/table/table-demo/table-demo/table-demo.component.spec.ts +25 -0
  1296. package/src/component/table/table-demo/table-demo/table-demo.component.ts +136 -0
  1297. package/src/component/table/table-demo/table-demo.module.ts +23 -0
  1298. package/src/component/table/table-head/table-head.component.html +21 -0
  1299. package/src/component/table/table-head/table-head.component.scss +0 -0
  1300. package/src/component/table/table-head/table-head.component.spec.ts +25 -0
  1301. package/src/component/table/table-head/table-head.component.ts +118 -0
  1302. package/src/component/table/table-head-group/table-head-group.component.html +24 -0
  1303. package/src/component/table/table-head-group/table-head-group.component.scss +0 -0
  1304. package/src/component/table/table-head-group/table-head-group.component.spec.ts +25 -0
  1305. package/src/component/table/table-head-group/table-head-group.component.ts +73 -0
  1306. package/src/component/table/table.module.ts +100 -0
  1307. package/src/component/table/util/public-api.ts +2 -0
  1308. package/src/component/table/util/state-util.spec.ts +7 -0
  1309. package/src/component/table/util/state-util.ts +182 -0
  1310. package/src/component/table/util/table-util.spec.ts +7 -0
  1311. package/src/component/table/util/table-util.ts +150 -0
  1312. package/src/component/tabs/Tabs.stories.ts +55 -0
  1313. package/src/component/tabs/public-api.ts +13 -0
  1314. package/src/component/tabs/tab/tab.component.html +1 -0
  1315. package/src/component/tabs/tab/tab.component.scss +0 -0
  1316. package/src/component/tabs/tab/tab.component.spec.ts +25 -0
  1317. package/src/component/tabs/tab/tab.component.ts +46 -0
  1318. package/src/component/tabs/tab-content.directive.spec.ts +8 -0
  1319. package/src/component/tabs/tab-content.directive.ts +9 -0
  1320. package/src/component/tabs/tab-title.directive.spec.ts +8 -0
  1321. package/src/component/tabs/tab-title.directive.ts +9 -0
  1322. package/src/component/tabs/tabs/tabs.component.html +24 -0
  1323. package/src/component/tabs/tabs/tabs.component.scss +0 -0
  1324. package/src/component/tabs/tabs/tabs.component.spec.ts +25 -0
  1325. package/src/component/tabs/tabs/tabs.component.ts +85 -0
  1326. package/src/component/tabs/tabs.module.ts +26 -0
  1327. package/src/component/theme-switch/public-api.ts +3 -0
  1328. package/src/component/theme-switch/theme-switch/theme-switch.component.html +3 -0
  1329. package/src/component/theme-switch/theme-switch/theme-switch.component.scss +4 -0
  1330. package/src/component/theme-switch/theme-switch/theme-switch.component.spec.ts +25 -0
  1331. package/src/component/theme-switch/theme-switch/theme-switch.component.ts +31 -0
  1332. package/src/component/theme-switch/theme-switch.module.ts +17 -0
  1333. package/src/component/theme-switch/theme-switch.service.spec.ts +16 -0
  1334. package/src/component/theme-switch/theme-switch.service.ts +34 -0
  1335. package/src/component/toggle/Toggle.stories.ts +34 -0
  1336. package/src/component/toggle/public-api.ts +2 -0
  1337. package/src/component/toggle/toggle/toggle.component.html +6 -0
  1338. package/src/component/toggle/toggle/toggle.component.scss +0 -0
  1339. package/src/component/toggle/toggle/toggle.component.spec.ts +25 -0
  1340. package/src/component/toggle/toggle/toggle.component.ts +95 -0
  1341. package/src/component/toggle/toggle.module.ts +11 -0
  1342. package/src/component/toolbar/Toolbar.stories.ts +110 -0
  1343. package/src/component/toolbar/public-api.ts +6 -0
  1344. package/src/component/toolbar/toolbar/toolbar.component.html +1 -0
  1345. package/src/component/toolbar/toolbar/toolbar.component.scss +0 -0
  1346. package/src/component/toolbar/toolbar/toolbar.component.spec.ts +25 -0
  1347. package/src/component/toolbar/toolbar/toolbar.component.ts +29 -0
  1348. package/src/component/toolbar/toolbar.module.ts +13 -0
  1349. package/src/component/tree/Tree.stories.ts +93 -0
  1350. package/src/component/tree/public-api.ts +4 -0
  1351. package/src/component/tree/tree/tree.component.html +8 -0
  1352. package/src/component/tree/tree/tree.component.scss +0 -0
  1353. package/src/component/tree/tree/tree.component.spec.ts +25 -0
  1354. package/src/component/tree/tree/tree.component.ts +92 -0
  1355. package/src/component/tree/tree-item/tree-item.component.html +12 -0
  1356. package/src/component/tree/tree-item/tree-item.component.scss +0 -0
  1357. package/src/component/tree/tree-item/tree-item.component.spec.ts +25 -0
  1358. package/src/component/tree/tree-item/tree-item.component.ts +84 -0
  1359. package/src/component/tree/tree-item-toggle/tree-item-toggle.component.html +2 -0
  1360. package/src/component/tree/tree-item-toggle/tree-item-toggle.component.scss +4 -0
  1361. package/src/component/tree/tree-item-toggle/tree-item-toggle.component.spec.ts +25 -0
  1362. package/src/component/tree/tree-item-toggle/tree-item-toggle.component.ts +37 -0
  1363. package/src/component/tree/tree.module.ts +14 -0
  1364. package/src/component/tree/tree.service.spec.ts +16 -0
  1365. package/src/component/tree/tree.service.ts +41 -0
  1366. package/src/directive/click-outside/click-outside.directive.spec.ts +8 -0
  1367. package/src/directive/click-outside/click-outside.directive.ts +64 -0
  1368. package/src/directive/click-outside/click-outside.module.ts +13 -0
  1369. package/src/directive/click-outside/public-api.ts +2 -0
  1370. package/src/directive/context-menu/ContextMenu.stories.ts +65 -0
  1371. package/src/directive/context-menu/context-menu.directive.spec.ts +8 -0
  1372. package/src/directive/context-menu/context-menu.directive.ts +136 -0
  1373. package/src/directive/context-menu/context-menu.module.ts +15 -0
  1374. package/src/directive/context-menu/public-api.ts +2 -0
  1375. package/src/directive/disable-control/disable-control.directive.spec.ts +8 -0
  1376. package/src/directive/disable-control/disable-control.directive.ts +20 -0
  1377. package/src/directive/disable-control/disable-control.module.ts +16 -0
  1378. package/src/directive/disable-control/public-api.ts +2 -0
  1379. package/src/directive/drag-sort/DragSort.stories.ts +60 -0
  1380. package/src/directive/drag-sort/drag-sort-container.directive.spec.ts +8 -0
  1381. package/src/directive/drag-sort/drag-sort-container.directive.ts +71 -0
  1382. package/src/directive/drag-sort/drag-sort-event.spec.ts +7 -0
  1383. package/src/directive/drag-sort/drag-sort-event.ts +7 -0
  1384. package/src/directive/drag-sort/drag-sort-item.directive.spec.ts +8 -0
  1385. package/src/directive/drag-sort/drag-sort-item.directive.ts +119 -0
  1386. package/src/directive/drag-sort/drag-sort.module.ts +11 -0
  1387. package/src/directive/drag-sort/public-api.ts +4 -0
  1388. package/src/directive/dynamic-content-base.directive.ts +113 -0
  1389. package/src/directive/highlight/highlight.directive.spec.ts +8 -0
  1390. package/src/directive/highlight/highlight.directive.ts +68 -0
  1391. package/src/directive/highlight/highlight.module.ts +13 -0
  1392. package/src/directive/highlight/public-api.ts +2 -0
  1393. package/src/directive/hint/Hint.stories.ts +111 -0
  1394. package/src/directive/hint/hint.directive.spec.ts +8 -0
  1395. package/src/directive/hint/hint.directive.ts +117 -0
  1396. package/src/directive/hint/hint.module.ts +15 -0
  1397. package/src/directive/hint/public-api.ts +2 -0
  1398. package/src/directive/loader/Loader.stories.ts +21 -0
  1399. package/src/directive/loader/loader.directive.spec.ts +8 -0
  1400. package/src/directive/loader/loader.directive.ts +80 -0
  1401. package/src/directive/loader/loader.module.ts +13 -0
  1402. package/src/directive/loader/public-api.ts +2 -0
  1403. package/src/directive/no-autofill/no-autofill.directive.spec.ts +8 -0
  1404. package/src/directive/no-autofill/no-autofill.directive.ts +28 -0
  1405. package/src/directive/no-autofill/no-autofill.module.ts +10 -0
  1406. package/src/directive/no-autofill/public-api.ts +2 -0
  1407. package/src/directive/only-number/OnlyNumber.stories.ts +29 -0
  1408. package/src/directive/only-number/only-number.directive.spec.ts +8 -0
  1409. package/src/directive/only-number/only-number.directive.ts +174 -0
  1410. package/src/directive/only-number/only-number.module.ts +10 -0
  1411. package/src/directive/only-number/public-api.ts +2 -0
  1412. package/src/directive/public-api.ts +14 -0
  1413. package/src/directive/resize-drag/public-api.ts +2 -0
  1414. package/src/directive/resize-drag/resize-drag.directive.spec.ts +8 -0
  1415. package/src/directive/resize-drag/resize-drag.directive.ts +62 -0
  1416. package/src/directive/resize-drag/resize-drag.module.ts +10 -0
  1417. package/src/directive/teta-template/public-api.ts +2 -0
  1418. package/src/directive/teta-template/teta-template.directive.spec.ts +8 -0
  1419. package/src/directive/teta-template/teta-template.directive.ts +15 -0
  1420. package/src/directive/teta-template/teta-template.module.ts +18 -0
  1421. package/src/directive/tooltip/Tooltip.stories.ts +96 -0
  1422. package/src/directive/tooltip/public-api.ts +2 -0
  1423. package/src/directive/tooltip/tooltip.directive.spec.ts +8 -0
  1424. package/src/directive/tooltip/tooltip.directive.ts +116 -0
  1425. package/src/directive/tooltip/tooltip.module.ts +12 -0
  1426. package/src/pipe/number-pipe/number-pipe.module.ts +15 -0
  1427. package/src/pipe/number-pipe/number.pipe.spec.ts +8 -0
  1428. package/src/pipe/number-pipe/number.pipe.ts +26 -0
  1429. package/src/pipe/number-pipe/public-api.ts +2 -0
  1430. package/src/pipe/prepend-zero/prepend-zero.module.ts +10 -0
  1431. package/src/pipe/prepend-zero/prepend-zero.pipe.spec.ts +8 -0
  1432. package/src/pipe/prepend-zero/prepend-zero.pipe.ts +15 -0
  1433. package/src/pipe/prepend-zero/public-api.ts +2 -0
  1434. package/src/pipe/public-api.ts +1 -0
  1435. package/src/pipe/util/number-helper.ts +37 -0
  1436. package/src/public-api.ts +25 -0
  1437. package/src/test.ts +26 -0
  1438. package/src/util/date-util.ts +247 -0
  1439. package/src/util/forms-util.ts +83 -0
  1440. package/src/util/public-api.ts +3 -0
  1441. package/src/util/string-util.ts +5 -0
  1442. package/style/tabs.scss +1 -1
  1443. package/tsconfig.lib.json +18 -0
  1444. package/tsconfig.lib.prod.json +10 -0
  1445. package/tsconfig.spec.json +17 -0
  1446. package/component/chart/core/axis-creator.d.ts +0 -28
  1447. package/component/chart/model/enum/scale-type.d.ts +0 -6
  1448. package/component/chart/model/series.d.ts +0 -62
  1449. package/component/date-picker/date-picker/date-picker.component.d.ts +0 -73
  1450. package/component/property-grid/property-grid/property-grid-item/property-grid-item.component.d.ts +0 -32
  1451. package/component/property-grid/property-grid.module.d.ts +0 -22
  1452. package/component/table/contract/table-column.d.ts +0 -135
  1453. package/component/table/head-cell-dropdown/head-cell-dropdown.component.d.ts +0 -58
  1454. package/component/table/service/table.service.d.ts +0 -119
  1455. package/component/table/table/table.component.d.ts +0 -99
  1456. package/esm2020/common/contract/auto-close-ignore-case.mjs +0 -2
  1457. package/esm2020/common/contract/constructor-type.mjs +0 -2
  1458. package/esm2020/common/contract/dynamic-data.mjs +0 -10
  1459. package/esm2020/common/contract/i-dictionary.mjs +0 -2
  1460. package/esm2020/common/contract/i-id-name.mjs +0 -2
  1461. package/esm2020/common/contract/i-rect.mjs +0 -2
  1462. package/esm2020/common/contract/i-tree-data.mjs +0 -2
  1463. package/esm2020/common/contract/public-api.mjs +0 -9
  1464. package/esm2020/common/contract/teta-content-ref.mjs +0 -8
  1465. package/esm2020/common/enum/align.enum.mjs +0 -10
  1466. package/esm2020/common/enum/public-api.mjs +0 -4
  1467. package/esm2020/common/enum/teta-size.enum.mjs +0 -9
  1468. package/esm2020/common/enum/vertical-align.enum.mjs +0 -8
  1469. package/esm2020/common/public-api.mjs +0 -5
  1470. package/esm2020/common/service/click.service.mjs +0 -23
  1471. package/esm2020/common/service/dynamic-component.service.mjs +0 -93
  1472. package/esm2020/common/service/overlay-container.service.mjs +0 -41
  1473. package/esm2020/common/service/public-api.mjs +0 -4
  1474. package/esm2020/common/util/array-util.mjs +0 -119
  1475. package/esm2020/common/util/dom-util.mjs +0 -16
  1476. package/esm2020/common/util/position-util.mjs +0 -96
  1477. package/esm2020/common/util/public-api.mjs +0 -4
  1478. package/esm2020/component/accordion/accordion/accordion.component.mjs +0 -18
  1479. package/esm2020/component/accordion/accordion-content.directive.mjs +0 -16
  1480. package/esm2020/component/accordion/accordion-head/accordion-head.component.mjs +0 -52
  1481. package/esm2020/component/accordion/accordion-item/accordion-item.component.mjs +0 -43
  1482. package/esm2020/component/accordion/accordion.module.mjs +0 -29
  1483. package/esm2020/component/accordion/public-api.mjs +0 -6
  1484. package/esm2020/component/button/button/button.component.mjs +0 -40
  1485. package/esm2020/component/button/button.module.mjs +0 -24
  1486. package/esm2020/component/button/public-api.mjs +0 -3
  1487. package/esm2020/component/chart/chart/chart.component.mjs +0 -164
  1488. package/esm2020/component/chart/chart.module.mjs +0 -18
  1489. package/esm2020/component/chart/core/axis-creator.mjs +0 -82
  1490. package/esm2020/component/chart/core/chart.mjs +0 -1339
  1491. package/esm2020/component/chart/core/public-api.mjs +0 -3
  1492. package/esm2020/component/chart/drawer/area-drawer.mjs +0 -20
  1493. package/esm2020/component/chart/drawer/bar-drawer.mjs +0 -23
  1494. package/esm2020/component/chart/drawer/contour-drawer.mjs +0 -29
  1495. package/esm2020/component/chart/drawer/default-drawer-mapping.mjs +0 -17
  1496. package/esm2020/component/chart/drawer/line-drawer.mjs +0 -152
  1497. package/esm2020/component/chart/drawer/pie-drawer.mjs +0 -4
  1498. package/esm2020/component/chart/drawer/public-api.mjs +0 -7
  1499. package/esm2020/component/chart/drawer/scatter-drawer.mjs +0 -93
  1500. package/esm2020/component/chart/drawer/spline-drawer.mjs +0 -23
  1501. package/esm2020/component/chart/legend-drawer/default-drawer-legend-mapping.mjs +0 -7
  1502. package/esm2020/component/chart/legend-drawer/gradient-drawer.mjs +0 -45
  1503. package/esm2020/component/chart/legend-drawer/swatch-drawer.mjs +0 -62
  1504. package/esm2020/component/chart/model/annotation.mjs +0 -30
  1505. package/esm2020/component/chart/model/axis-options.mjs +0 -26
  1506. package/esm2020/component/chart/model/chart-bounds.mjs +0 -13
  1507. package/esm2020/component/chart/model/chart-options.mjs +0 -37
  1508. package/esm2020/component/chart/model/enum/axis-type.mjs +0 -6
  1509. package/esm2020/component/chart/model/enum/dispatch-type.mjs +0 -6
  1510. package/esm2020/component/chart/model/enum/drag-point-type.mjs +0 -7
  1511. package/esm2020/component/chart/model/enum/legend-type.mjs +0 -6
  1512. package/esm2020/component/chart/model/enum/public-api.mjs +0 -8
  1513. package/esm2020/component/chart/model/enum/scale-type.mjs +0 -8
  1514. package/esm2020/component/chart/model/enum/scale.mjs +0 -7
  1515. package/esm2020/component/chart/model/enum/series-type.mjs +0 -12
  1516. package/esm2020/component/chart/model/enum/zoom-type.mjs +0 -7
  1517. package/esm2020/component/chart/model/i-drag-event.mjs +0 -2
  1518. package/esm2020/component/chart/model/i-drawer-legend.mjs +0 -2
  1519. package/esm2020/component/chart/model/i-drawer.mjs +0 -2
  1520. package/esm2020/component/chart/model/i-zoom-event.mjs +0 -2
  1521. package/esm2020/component/chart/model/plot-band.mjs +0 -18
  1522. package/esm2020/component/chart/model/plot-line.mjs +0 -13
  1523. package/esm2020/component/chart/model/point/bar-point.mjs +0 -2
  1524. package/esm2020/component/chart/model/point/base-point.mjs +0 -2
  1525. package/esm2020/component/chart/model/point/contour-point.mjs +0 -2
  1526. package/esm2020/component/chart/model/point/marker-options.mjs +0 -2
  1527. package/esm2020/component/chart/model/point/public-api.mjs +0 -4
  1528. package/esm2020/component/chart/model/point/scatter-point.mjs +0 -2
  1529. package/esm2020/component/chart/model/public-api.mjs +0 -16
  1530. package/esm2020/component/chart/model/series.mjs +0 -27
  1531. package/esm2020/component/chart/model/tooltip-options.mjs +0 -19
  1532. package/esm2020/component/chart/public-api.mjs +0 -6
  1533. package/esm2020/component/chart-3d/chart-3d.module.mjs +0 -18
  1534. package/esm2020/component/chart-3d/chart3d/chart3d.component.mjs +0 -232
  1535. package/esm2020/component/chart-3d/model/base-3d-point.mjs +0 -2
  1536. package/esm2020/component/chart-3d/model/chart-3d-options.mjs +0 -7
  1537. package/esm2020/component/chart-3d/model/public-api.mjs +0 -3
  1538. package/esm2020/component/chart-3d/model/series-3d.mjs +0 -7
  1539. package/esm2020/component/chart-3d/public-api.mjs +0 -4
  1540. package/esm2020/component/checkbox/checkbox/checkbox.component.mjs +0 -134
  1541. package/esm2020/component/checkbox/checkbox.module.mjs +0 -28
  1542. package/esm2020/component/checkbox/public-api.mjs +0 -3
  1543. package/esm2020/component/date-picker/date-picker/date-picker.component.mjs +0 -268
  1544. package/esm2020/component/date-picker/date-picker.module.mjs +0 -67
  1545. package/esm2020/component/date-picker/day-select/day-select.component.mjs +0 -166
  1546. package/esm2020/component/date-picker/model/date-period.mjs +0 -7
  1547. package/esm2020/component/date-picker/model/date-picker-mode.enum.mjs +0 -7
  1548. package/esm2020/component/date-picker/model/day-model.mjs +0 -13
  1549. package/esm2020/component/date-picker/model/picker-locale-model.mjs +0 -13
  1550. package/esm2020/component/date-picker/month-picker/month-picker.component.mjs +0 -250
  1551. package/esm2020/component/date-picker/month-select/month-select.component.mjs +0 -147
  1552. package/esm2020/component/date-picker/public-api.mjs +0 -6
  1553. package/esm2020/component/date-picker/service/picker-locale.service.mjs +0 -30
  1554. package/esm2020/component/date-picker/service/picker-touch.service.mjs +0 -34
  1555. package/esm2020/component/date-picker/time-part-control/time-part-control.component.mjs +0 -73
  1556. package/esm2020/component/date-picker/util/date-picker-util.mjs +0 -142
  1557. package/esm2020/component/date-picker/year-select/year-select.component.mjs +0 -189
  1558. package/esm2020/component/delimiter/delimiter/delimiter.component.mjs +0 -63
  1559. package/esm2020/component/delimiter/delimiter.module.mjs +0 -22
  1560. package/esm2020/component/delimiter/public-api.mjs +0 -3
  1561. package/esm2020/component/dropdown/dropdown/dropdown.component.mjs +0 -29
  1562. package/esm2020/component/dropdown/dropdown-base.mjs +0 -204
  1563. package/esm2020/component/dropdown/dropdown-content.directive.mjs +0 -17
  1564. package/esm2020/component/dropdown/dropdown-head.directive.mjs +0 -18
  1565. package/esm2020/component/dropdown/dropdown.directive.mjs +0 -37
  1566. package/esm2020/component/dropdown/dropdown.module.mjs +0 -41
  1567. package/esm2020/component/dropdown/public-api.mjs +0 -6
  1568. package/esm2020/component/dynamic-component/dynamic-component.module.mjs +0 -22
  1569. package/esm2020/component/dynamic-component/popup-content/popup-content.component.mjs +0 -59
  1570. package/esm2020/component/dynamic-component/public-api.mjs +0 -3
  1571. package/esm2020/component/expand-panel/expand-panel/expand-panel.component.mjs +0 -65
  1572. package/esm2020/component/expand-panel/expand-panel-content.directive.mjs +0 -16
  1573. package/esm2020/component/expand-panel/expand-panel-head.directive.mjs +0 -16
  1574. package/esm2020/component/expand-panel/expand-panel.module.mjs +0 -52
  1575. package/esm2020/component/expand-panel/public-api.mjs +0 -5
  1576. package/esm2020/component/file-upload/file-item/file-item.component.mjs +0 -13
  1577. package/esm2020/component/file-upload/file-upload-area/file-upload-area.component.mjs +0 -77
  1578. package/esm2020/component/file-upload/file-upload.module.mjs +0 -21
  1579. package/esm2020/component/file-upload/public-api.mjs +0 -4
  1580. package/esm2020/component/filter/base/filter-base.mjs +0 -9
  1581. package/esm2020/component/filter/base/filter-component-base.mjs +0 -3
  1582. package/esm2020/component/filter/boolean-filter/boolean-filter.component.mjs +0 -53
  1583. package/esm2020/component/filter/contarct/boolean-filter.mjs +0 -10
  1584. package/esm2020/component/filter/contarct/date-filter-value.mjs +0 -9
  1585. package/esm2020/component/filter/contarct/date-filter.mjs +0 -11
  1586. package/esm2020/component/filter/contarct/filter-component-map.mjs +0 -17
  1587. package/esm2020/component/filter/contarct/filter-item.mjs +0 -33
  1588. package/esm2020/component/filter/contarct/filter-state.mjs +0 -145
  1589. package/esm2020/component/filter/contarct/i-filter.mjs +0 -2
  1590. package/esm2020/component/filter/contarct/list-filter.mjs +0 -12
  1591. package/esm2020/component/filter/contarct/numeric-filter-value.mjs +0 -10
  1592. package/esm2020/component/filter/contarct/numeric-filter.mjs +0 -11
  1593. package/esm2020/component/filter/contarct/sort-param.mjs +0 -13
  1594. package/esm2020/component/filter/contarct/string-filter.mjs +0 -12
  1595. package/esm2020/component/filter/date-filter/date-filter.component.mjs +0 -54
  1596. package/esm2020/component/filter/enum/filter-type.enum.mjs +0 -10
  1597. package/esm2020/component/filter/enum/list-filter-type.enum.mjs +0 -6
  1598. package/esm2020/component/filter/enum/string-filter-type.enum.mjs +0 -20
  1599. package/esm2020/component/filter/filter-host/filter-host.component.mjs +0 -73
  1600. package/esm2020/component/filter/filter-panel/filter-panel.component.mjs +0 -13
  1601. package/esm2020/component/filter/filter.module.mjs +0 -80
  1602. package/esm2020/component/filter/list-filter/list-filter.component.mjs +0 -86
  1603. package/esm2020/component/filter/numeric-filter/numeric-filter.component.mjs +0 -53
  1604. package/esm2020/component/filter/public-api.mjs +0 -25
  1605. package/esm2020/component/filter/string-filter/string-filter.component.mjs +0 -54
  1606. package/esm2020/component/icon/icon/icon.component.mjs +0 -37
  1607. package/esm2020/component/icon/icon-sprite.directive.mjs +0 -32
  1608. package/esm2020/component/icon/icon.module.mjs +0 -35
  1609. package/esm2020/component/icon/icon.service.mjs +0 -59
  1610. package/esm2020/component/icon/public-api.mjs +0 -5
  1611. package/esm2020/component/input/form-group-title/form-group-title.component.mjs +0 -18
  1612. package/esm2020/component/input/input/input.component.mjs +0 -31
  1613. package/esm2020/component/input/input.module.mjs +0 -23
  1614. package/esm2020/component/input/public-api.mjs +0 -5
  1615. package/esm2020/component/input/text-field/text-field.component.mjs +0 -94
  1616. package/esm2020/component/message/message/message.component.mjs +0 -74
  1617. package/esm2020/component/message/message-host/message-host.component.mjs +0 -88
  1618. package/esm2020/component/message/message.module.mjs +0 -31
  1619. package/esm2020/component/message/message.service.mjs +0 -35
  1620. package/esm2020/component/message/model/message.mjs +0 -21
  1621. package/esm2020/component/message/public-api.mjs +0 -6
  1622. package/esm2020/component/modal/dialog/dialog.component.mjs +0 -44
  1623. package/esm2020/component/modal/dialog.service.mjs +0 -39
  1624. package/esm2020/component/modal/modal-container/modal-container.component.mjs +0 -84
  1625. package/esm2020/component/modal/modal.module.mjs +0 -52
  1626. package/esm2020/component/modal/modal.service.mjs +0 -121
  1627. package/esm2020/component/modal/model/current-modal.mjs +0 -3
  1628. package/esm2020/component/modal/model/i-modal-config.mjs +0 -2
  1629. package/esm2020/component/modal/model/i-modal-result.mjs +0 -2
  1630. package/esm2020/component/modal/model/modal-close-reason.enum.mjs +0 -8
  1631. package/esm2020/component/modal/model/modal-instance.mjs +0 -32
  1632. package/esm2020/component/modal/public-api.mjs +0 -11
  1633. package/esm2020/component/pager/model/pager-state.mjs +0 -50
  1634. package/esm2020/component/pager/pager/pager.component.mjs +0 -13
  1635. package/esm2020/component/pager/pager.module.mjs +0 -26
  1636. package/esm2020/component/pager/public-api.mjs +0 -5
  1637. package/esm2020/component/pager/util/pager-util.mjs +0 -6
  1638. package/esm2020/component/panel/panel/panel.component.mjs +0 -51
  1639. package/esm2020/component/panel/panel.module.mjs +0 -22
  1640. package/esm2020/component/panel/public-api.mjs +0 -3
  1641. package/esm2020/component/progress-bar/progress-bar/progress-bar.component.mjs +0 -131
  1642. package/esm2020/component/progress-bar/progress-bar.module.mjs +0 -22
  1643. package/esm2020/component/progress-bar/public-api.mjs +0 -3
  1644. package/esm2020/component/property-grid/default/date-item-default/date-item-default.component.mjs +0 -13
  1645. package/esm2020/component/property-grid/default/list-item-default/list-item-default.component.mjs +0 -13
  1646. package/esm2020/component/property-grid/default/numeric-item-default/numeric-item-default.component.mjs +0 -13
  1647. package/esm2020/component/property-grid/default/string-item-default/string-item-default.component.mjs +0 -13
  1648. package/esm2020/component/property-grid/property-grid/property-grid-group/property-grid-group.component.mjs +0 -34
  1649. package/esm2020/component/property-grid/property-grid/property-grid-item/property-grid-item.component.mjs +0 -100
  1650. package/esm2020/component/property-grid/property-grid/property-grid.component.mjs +0 -59
  1651. package/esm2020/component/property-grid/property-grid.module.mjs +0 -90
  1652. package/esm2020/component/property-grid/public-api.mjs +0 -3
  1653. package/esm2020/component/public-api.mjs +0 -61
  1654. package/esm2020/component/radio/public-api.mjs +0 -4
  1655. package/esm2020/component/radio/radio/radio.component.mjs +0 -245
  1656. package/esm2020/component/radio/radio-button/radio-button.component.mjs +0 -63
  1657. package/esm2020/component/radio/radio.module.mjs +0 -20
  1658. package/esm2020/component/resize-panel/public-api.mjs +0 -3
  1659. package/esm2020/component/resize-panel/resize-panel/resize-panel.component.mjs +0 -162
  1660. package/esm2020/component/resize-panel/resize-panel.module.mjs +0 -20
  1661. package/esm2020/component/select/public-api.mjs +0 -5
  1662. package/esm2020/component/select/select/select.component.mjs +0 -234
  1663. package/esm2020/component/select/select-option.directive.mjs +0 -16
  1664. package/esm2020/component/select/select-value.directive.mjs +0 -16
  1665. package/esm2020/component/select/select.module.mjs +0 -48
  1666. package/esm2020/component/sidebar/public-api.mjs +0 -4
  1667. package/esm2020/component/sidebar/sidebar/sidebar.component.mjs +0 -54
  1668. package/esm2020/component/sidebar/sidebar-position.enum.mjs +0 -8
  1669. package/esm2020/component/sidebar/sidebar.module.mjs +0 -30
  1670. package/esm2020/component/switch/public-api.mjs +0 -4
  1671. package/esm2020/component/switch/switch/switch.component.mjs +0 -52
  1672. package/esm2020/component/switch/switch-button/switch-button.component.mjs +0 -47
  1673. package/esm2020/component/switch/switch.module.mjs +0 -23
  1674. package/esm2020/component/switch/switch.service.mjs +0 -21
  1675. package/esm2020/component/table/base/cell-component-base.mjs +0 -94
  1676. package/esm2020/component/table/base/detail-component-base.mjs +0 -3
  1677. package/esm2020/component/table/base/group-row-component-base.mjs +0 -3
  1678. package/esm2020/component/table/base/head-cell-component-base.mjs +0 -17
  1679. package/esm2020/component/table/cell/cell.component.mjs +0 -33
  1680. package/esm2020/component/table/cell-host/cell-host.component.mjs +0 -50
  1681. package/esm2020/component/table/contract/cell-components-map.mjs +0 -17
  1682. package/esm2020/component/table/contract/column-reorder-event.mjs +0 -7
  1683. package/esm2020/component/table/contract/column-resize-event.mjs +0 -7
  1684. package/esm2020/component/table/contract/i-cell-coordinates.mjs +0 -2
  1685. package/esm2020/component/table/contract/i-cell-event.mjs +0 -2
  1686. package/esm2020/component/table/contract/i-cell-value.mjs +0 -2
  1687. package/esm2020/component/table/contract/public-api.mjs +0 -12
  1688. package/esm2020/component/table/contract/sort-event.mjs +0 -7
  1689. package/esm2020/component/table/contract/table-column-store.mjs +0 -12
  1690. package/esm2020/component/table/contract/table-column.mjs +0 -42
  1691. package/esm2020/component/table/contract/table-context-menu-config.mjs +0 -17
  1692. package/esm2020/component/table/contract/table-row.mjs +0 -40
  1693. package/esm2020/component/table/default/boolean-cell/boolean-cell.component.mjs +0 -45
  1694. package/esm2020/component/table/default/date-cell/date-cell.component.mjs +0 -47
  1695. package/esm2020/component/table/default/date-time-cell/date-time-cell.component.mjs +0 -46
  1696. package/esm2020/component/table/default/default-head-cell/default-head-cell.component.mjs +0 -28
  1697. package/esm2020/component/table/default/group-row/group-row.component.mjs +0 -20
  1698. package/esm2020/component/table/default/list-cell/list-cell.component.mjs +0 -66
  1699. package/esm2020/component/table/default/numeric-cell/numeric-cell.component.mjs +0 -46
  1700. package/esm2020/component/table/default/string-cell/string-cell.component.mjs +0 -44
  1701. package/esm2020/component/table/enum/aggregation-type.enum.mjs +0 -9
  1702. package/esm2020/component/table/enum/edit-event.enum.mjs +0 -7
  1703. package/esm2020/component/table/enum/edit-type.enum.mjs +0 -6
  1704. package/esm2020/component/table/enum/public-api.mjs +0 -5
  1705. package/esm2020/component/table/enum/select-type.enum.mjs +0 -7
  1706. package/esm2020/component/table/head-cell/head-cell.component.mjs +0 -136
  1707. package/esm2020/component/table/head-cell-dropdown/head-cell-dropdown.component.mjs +0 -198
  1708. package/esm2020/component/table/head-cell-host/head-cell-host.component.mjs +0 -36
  1709. package/esm2020/component/table/public-api.mjs +0 -43
  1710. package/esm2020/component/table/selection-cell/selection-cell.component.mjs +0 -46
  1711. package/esm2020/component/table/selection-head-cell/selection-head-cell.component.mjs +0 -45
  1712. package/esm2020/component/table/service/table.service.mjs +0 -429
  1713. package/esm2020/component/table/table/table.component.mjs +0 -425
  1714. package/esm2020/component/table/table-body/table-body.component.mjs +0 -240
  1715. package/esm2020/component/table/table-head/table-head.component.mjs +0 -98
  1716. package/esm2020/component/table/table-head-group/table-head-group.component.mjs +0 -59
  1717. package/esm2020/component/table/table.module.mjs +0 -176
  1718. package/esm2020/component/table/util/public-api.mjs +0 -3
  1719. package/esm2020/component/table/util/state-util.mjs +0 -139
  1720. package/esm2020/component/table/util/table-util.mjs +0 -131
  1721. package/esm2020/component/tabs/public-api.mjs +0 -12
  1722. package/esm2020/component/tabs/tab/tab.component.mjs +0 -42
  1723. package/esm2020/component/tabs/tab-content.directive.mjs +0 -16
  1724. package/esm2020/component/tabs/tab-title.directive.mjs +0 -16
  1725. package/esm2020/component/tabs/tabs/tabs.component.mjs +0 -70
  1726. package/esm2020/component/tabs/tabs.module.mjs +0 -41
  1727. package/esm2020/component/theme-switch/public-api.mjs +0 -4
  1728. package/esm2020/component/theme-switch/theme-switch/theme-switch.component.mjs +0 -28
  1729. package/esm2020/component/theme-switch/theme-switch.module.mjs +0 -30
  1730. package/esm2020/component/theme-switch/theme-switch.service.mjs +0 -34
  1731. package/esm2020/component/toggle/public-api.mjs +0 -3
  1732. package/esm2020/component/toggle/toggle/toggle.component.mjs +0 -79
  1733. package/esm2020/component/toggle/toggle.module.mjs +0 -19
  1734. package/esm2020/component/toolbar/public-api.mjs +0 -6
  1735. package/esm2020/component/toolbar/toolbar/toolbar.component.mjs +0 -26
  1736. package/esm2020/component/toolbar/toolbar.module.mjs +0 -22
  1737. package/esm2020/component/tree/public-api.mjs +0 -5
  1738. package/esm2020/component/tree/tree/tree.component.mjs +0 -76
  1739. package/esm2020/component/tree/tree-item/tree-item.component.mjs +0 -80
  1740. package/esm2020/component/tree/tree-item-toggle/tree-item-toggle.component.mjs +0 -28
  1741. package/esm2020/component/tree/tree.module.mjs +0 -22
  1742. package/esm2020/component/tree/tree.service.mjs +0 -35
  1743. package/esm2020/directive/click-outside/click-outside.directive.mjs +0 -60
  1744. package/esm2020/directive/click-outside/click-outside.module.mjs +0 -22
  1745. package/esm2020/directive/click-outside/public-api.mjs +0 -3
  1746. package/esm2020/directive/context-menu/context-menu.directive.mjs +0 -94
  1747. package/esm2020/directive/context-menu/context-menu.module.mjs +0 -26
  1748. package/esm2020/directive/context-menu/public-api.mjs +0 -3
  1749. package/esm2020/directive/disable-control/disable-control.directive.mjs +0 -29
  1750. package/esm2020/directive/disable-control/disable-control.module.mjs +0 -24
  1751. package/esm2020/directive/disable-control/public-api.mjs +0 -3
  1752. package/esm2020/directive/drag-sort/drag-sort-container.directive.mjs +0 -64
  1753. package/esm2020/directive/drag-sort/drag-sort-event.mjs +0 -2
  1754. package/esm2020/directive/drag-sort/drag-sort-item.directive.mjs +0 -115
  1755. package/esm2020/directive/drag-sort/drag-sort.module.mjs +0 -19
  1756. package/esm2020/directive/drag-sort/public-api.mjs +0 -5
  1757. package/esm2020/directive/dynamic-content-base.directive.mjs +0 -81
  1758. package/esm2020/directive/highlight/highlight.directive.mjs +0 -72
  1759. package/esm2020/directive/highlight/highlight.module.mjs +0 -22
  1760. package/esm2020/directive/highlight/public-api.mjs +0 -3
  1761. package/esm2020/directive/hint/hint.directive.mjs +0 -97
  1762. package/esm2020/directive/hint/hint.module.mjs +0 -26
  1763. package/esm2020/directive/hint/public-api.mjs +0 -3
  1764. package/esm2020/directive/loader/loader.directive.mjs +0 -63
  1765. package/esm2020/directive/loader/loader.module.mjs +0 -22
  1766. package/esm2020/directive/loader/public-api.mjs +0 -3
  1767. package/esm2020/directive/no-autofill/no-autofill.directive.mjs +0 -30
  1768. package/esm2020/directive/no-autofill/no-autofill.module.mjs +0 -18
  1769. package/esm2020/directive/no-autofill/public-api.mjs +0 -3
  1770. package/esm2020/directive/only-number/only-number.directive.mjs +0 -175
  1771. package/esm2020/directive/only-number/only-number.module.mjs +0 -18
  1772. package/esm2020/directive/only-number/public-api.mjs +0 -3
  1773. package/esm2020/directive/public-api.mjs +0 -15
  1774. package/esm2020/directive/resize-drag/public-api.mjs +0 -3
  1775. package/esm2020/directive/resize-drag/resize-drag.directive.mjs +0 -71
  1776. package/esm2020/directive/resize-drag/resize-drag.module.mjs +0 -18
  1777. package/esm2020/directive/teta-template/public-api.mjs +0 -3
  1778. package/esm2020/directive/teta-template/teta-template.directive.mjs +0 -22
  1779. package/esm2020/directive/teta-template/teta-template.module.mjs +0 -26
  1780. package/esm2020/directive/tooltip/public-api.mjs +0 -3
  1781. package/esm2020/directive/tooltip/tooltip.directive.mjs +0 -76
  1782. package/esm2020/directive/tooltip/tooltip.module.mjs +0 -20
  1783. package/esm2020/pipe/number-pipe/number-pipe.module.mjs +0 -24
  1784. package/esm2020/pipe/number-pipe/number.pipe.mjs +0 -24
  1785. package/esm2020/pipe/number-pipe/public-api.mjs +0 -3
  1786. package/esm2020/pipe/prepend-zero/prepend-zero.module.mjs +0 -18
  1787. package/esm2020/pipe/prepend-zero/prepend-zero.pipe.mjs +0 -21
  1788. package/esm2020/pipe/public-api.mjs +0 -2
  1789. package/esm2020/pipe/util/number-helper.mjs +0 -25
  1790. package/esm2020/public-api.mjs +0 -21
  1791. package/esm2020/tetacom-ng-components.mjs +0 -5
  1792. package/esm2020/util/date-util.mjs +0 -195
  1793. package/esm2020/util/forms-util.mjs +0 -61
  1794. package/esm2020/util/public-api.mjs +0 -4
  1795. package/esm2020/util/string-util.mjs +0 -7
  1796. package/fesm2015/tetacom-ng-components.mjs +0 -13315
  1797. package/fesm2015/tetacom-ng-components.mjs.map +0 -1
  1798. package/fesm2020/tetacom-ng-components.mjs +0 -13207
  1799. package/fesm2020/tetacom-ng-components.mjs.map +0 -1
@@ -0,0 +1,1339 @@
1
+ import { Subject } from 'rxjs';
2
+ import * as d3 from 'd3';
3
+ import { zoomIdentity } from 'd3';
4
+ import * as d3annotation from 'd3-svg-annotation';
5
+ import { Scale } from '../model/enum/scale';
6
+ import { SeriesType } from '../model/enum/series-type';
7
+ import { defaultDrawerMapping } from '../drawer/default-drawer-mapping';
8
+ import { defaultLegendDrawerMapping } from '../legend-drawer/default-drawer-legend-mapping';
9
+ import { LegendType } from '../model/enum/legend-type';
10
+ import { Axis } from './axis-creator';
11
+ import { AxisType } from '../model/enum/axis-type';
12
+ import { ScaleType } from '../model/enum/scale-type';
13
+ import { ZoomType } from '../model/enum/zoom-type';
14
+ import { DispatchType } from '../model/enum/dispatch-type';
15
+ export class TetaChart {
16
+ constructor(options, element) {
17
+ this.plotLinesMove$ = new Subject();
18
+ this.plotBandsMove$ = new Subject();
19
+ this.seriesMove$ = new Subject();
20
+ this.pointMove$ = new Subject();
21
+ this.zoom$ = new Subject();
22
+ this._container = null;
23
+ this._width = 0;
24
+ this._height = 0;
25
+ this._zoomYCache = new Map();
26
+ this._zoomXCache = new Map();
27
+ this._zoom = d3.zoom();
28
+ this.visibleChartWindowWidth = 0;
29
+ this._xScales = new Map();
30
+ this._yScales = new Map();
31
+ this._clonedX = new Map();
32
+ this._clonedY = new Map();
33
+ this.offsetOpposite = 0;
34
+ this.offsetNonOpposite = 0;
35
+ this._zoomAdded = false;
36
+ this._options = options;
37
+ this.selectNode(element);
38
+ this.createTooltip();
39
+ this.plotLinesMove = this.plotLinesMove$.asObservable();
40
+ this.plotBandsMove = this.plotBandsMove$.asObservable();
41
+ this.seriesMove = this.seriesMove$.asObservable();
42
+ this.pointMove = this.pointMove$.asObservable();
43
+ this.zoom = this.zoom$.asObservable();
44
+ }
45
+ redraw(options) {
46
+ if (options) {
47
+ this._options = options;
48
+ }
49
+ this.createAxis();
50
+ this.createScales();
51
+ this.createMarkers();
52
+ this.createVisibleWindow();
53
+ this._redraw();
54
+ this.drawLegend();
55
+ if (this._commonZoomTransform) {
56
+ this._chart.call(this._zoom.transform, this._commonZoomTransform);
57
+ }
58
+ if (!this._zoomAdded) {
59
+ this.addZoom();
60
+ this._zoomAdded = true;
61
+ }
62
+ this.addAxesZoom();
63
+ }
64
+ setZoom(zoom) {
65
+ if (!this._zoom) {
66
+ return;
67
+ }
68
+ this._chart.call(this._zoom.transform, zoom?.zoomTransform ?? zoomIdentity);
69
+ }
70
+ setSize(size = { width: 0, height: 0 }) {
71
+ this._height = size.height;
72
+ this._width = size.width;
73
+ this._chart.attr('width', this._width).attr('height', this._height);
74
+ this._canvas.attr('width', this._width).attr('height', this._height);
75
+ const extent = [
76
+ [
77
+ this.offsetNonOpposite
78
+ ? this.offsetNonOpposite
79
+ : this._options.bounds.left,
80
+ this._options.bounds.top,
81
+ ],
82
+ [
83
+ this._width -
84
+ (this.offsetOpposite
85
+ ? this.offsetOpposite
86
+ : this._options.bounds.right),
87
+ this._height - this._options.bounds.bottom,
88
+ ],
89
+ ];
90
+ this._zoom
91
+ .scaleExtent([1, Infinity])
92
+ .translateExtent(extent)
93
+ .extent(extent);
94
+ }
95
+ createVisibleWindow() {
96
+ this.uniqId = (Date.now() + Math.random()).toString(36);
97
+ this._chart.selectAll('defs').remove();
98
+ this._chart
99
+ .append('defs')
100
+ .append('clipPath')
101
+ .attr('id', `draw-window-${this.uniqId}`)
102
+ .append('rect')
103
+ .attr('x', this.offsetNonOpposite === 0
104
+ ? this._options.bounds.left
105
+ : this.offsetNonOpposite)
106
+ .attr('y', this._options.bounds.top)
107
+ .attr('width', this.visibleChartWindowWidth + 1)
108
+ .attr('height', this._height -
109
+ this._options.bounds.bottom -
110
+ this._options.bounds.top +
111
+ 1 >
112
+ 0
113
+ ? this._height -
114
+ this._options.bounds.bottom -
115
+ this._options.bounds.top +
116
+ 1
117
+ : 0);
118
+ }
119
+ createAxis() {
120
+ this._xAxisList = this._options.xAxis.map((_, index) => new Axis({
121
+ type: AxisType.abscissa,
122
+ index,
123
+ chartOptions: this._options,
124
+ }));
125
+ this._yAxisList = this._options.yAxis.map((_, index) => {
126
+ const axis = new Axis({
127
+ type: AxisType.ordinatus,
128
+ index,
129
+ chartOptions: this._options,
130
+ height: this._height,
131
+ });
132
+ return axis;
133
+ });
134
+ const nonTitleOffset = 6;
135
+ this.offsetNonOpposite = d3.reduce(this._yAxisList.filter((_) => _.options?.opposite !== true && _.options?.visible), (sum, axis) => {
136
+ const offset = sum +
137
+ axis.width +
138
+ (axis?.options?.title ? Axis.offsetFactor : nonTitleOffset);
139
+ axis.setOffset(offset);
140
+ return offset;
141
+ }, 0);
142
+ this.offsetOpposite = d3.reduce(this._yAxisList.filter((_) => _.options?.opposite === true && _.options?.visible), (sum, axis) => {
143
+ const offset = sum +
144
+ axis.width +
145
+ (axis?.options?.title ? Axis.offsetFactor : nonTitleOffset);
146
+ axis.setOffset(offset);
147
+ return offset;
148
+ }, 0);
149
+ this.visibleChartWindowWidth = this.caluclateChartWidth();
150
+ }
151
+ _redraw() {
152
+ this.drawPlotBands();
153
+ this.drawPlotLines();
154
+ this.drawChart();
155
+ this.drawAxis();
156
+ this.drawGridLines();
157
+ this.drawAnnotations();
158
+ }
159
+ addZoom() {
160
+ if (this._options?.zoom?.enable) {
161
+ const hasXZoom = [ZoomType.x, ZoomType.xy].includes(this._options.zoom.zoomType);
162
+ const hasYZoom = [ZoomType.y, ZoomType.xy].includes(this._options.zoom.zoomType);
163
+ this._chart.call(this._zoom.on('start end zoom', (event) => {
164
+ if (hasXZoom) {
165
+ for (const [key, value] of this._clonedX.entries()) {
166
+ const rescaled = event.transform.rescaleX(value);
167
+ this._xScales.set(key, rescaled);
168
+ if (event.sourceEvent) {
169
+ this.zoom$.next({
170
+ domain: rescaled.domain(),
171
+ zoomTransform: event.transform,
172
+ zoomType: ZoomType.x,
173
+ event,
174
+ });
175
+ }
176
+ }
177
+ }
178
+ if (hasYZoom) {
179
+ for (const [key, value] of this._clonedY.entries()) {
180
+ const rescaled = event.transform.rescaleY(value);
181
+ this._yScales.set(key, rescaled);
182
+ if (event.type === 'zoom') {
183
+ if (event.sourceEvent) {
184
+ this.zoom$.next({
185
+ domain: rescaled.domain(),
186
+ zoomTransform: event.transform,
187
+ zoomType: ZoomType.y,
188
+ event,
189
+ });
190
+ }
191
+ }
192
+ }
193
+ }
194
+ if (event.type === 'end') {
195
+ this._commonZoomTransform = event.transform;
196
+ }
197
+ this._redraw();
198
+ }));
199
+ }
200
+ }
201
+ addAxesZoom() {
202
+ this._chart.selectAll('.zoom-behavior').remove();
203
+ [...this._yAxisList, ...this._xAxisList]
204
+ .filter((axis) => axis.options.visible && axis.options.zoom)
205
+ .forEach((axis) => {
206
+ const foundNode = this._chart
207
+ .select(`[data-${axis.type === AxisType.abscissa ? 'x' : 'y'}-scale-id='${axis.index}']`)
208
+ .node();
209
+ if (!foundNode) {
210
+ return;
211
+ }
212
+ const bBox = foundNode.getBBox();
213
+ const translateX = axis.type === AxisType.abscissa
214
+ ? this.offsetNonOpposite
215
+ ? this.offsetNonOpposite
216
+ : this._options.bounds.left + this.offsetNonOpposite
217
+ : axis.options.opposite
218
+ ? this._width - axis.offset
219
+ : axis.offset - bBox.width;
220
+ const zoom = d3
221
+ .zoom()
222
+ .scaleExtent([1, Infinity])
223
+ .on('zoom end', (event) => {
224
+ if (axis.type === AxisType.abscissa) {
225
+ const scale = this._clonedX.get(axis.index);
226
+ this._xScales.set(axis.index, event.transform.rescaleX(scale));
227
+ }
228
+ else {
229
+ const scale = this._clonedY.get(axis.index);
230
+ this._yScales.set(axis.index, event.transform.rescaleY(scale));
231
+ }
232
+ if (event.type === 'end') {
233
+ if (axis.type === AxisType.ordinatus) {
234
+ this._zoomYCache.set(axis.index, event.transform);
235
+ }
236
+ if (axis.type === AxisType.abscissa) {
237
+ this._zoomXCache.set(axis.index, event.transform);
238
+ this._chart.call(this._zoom.transform, event.transform);
239
+ }
240
+ }
241
+ this._redraw();
242
+ });
243
+ const restoredTransform = axis.type === AxisType.ordinatus
244
+ ? this._zoomYCache.get(axis.index)
245
+ : this._zoomXCache.get(axis.index);
246
+ this._chart
247
+ .append('rect')
248
+ .attr('class', 'zoom-behavior')
249
+ .attr('height', bBox.height)
250
+ .attr('width', bBox.width)
251
+ .attr('transform', `translate(${translateX}, ${axis.type === AxisType.abscissa
252
+ ? this._height - this._options.bounds.bottom
253
+ : this._options.bounds.top})`)
254
+ .style('opacity', '0')
255
+ .style('pointer-events', 'all')
256
+ .call(zoom.transform, restoredTransform ?? d3.zoomIdentity)
257
+ .call(zoom);
258
+ });
259
+ }
260
+ selectNode(element) {
261
+ this._container = element;
262
+ d3.select(element.nativeElement).selectAll('.tooltip-chart').remove();
263
+ d3.select(element.nativeElement).selectAll('svg').remove();
264
+ d3.select(element.nativeElement).selectAll('canvas').remove();
265
+ this._chart = d3
266
+ .select(element.nativeElement)
267
+ .append('svg')
268
+ .attr('position', 'relative')
269
+ .style('z-index', 0);
270
+ this._canvas = d3
271
+ .select(element.nativeElement)
272
+ .append('canvas')
273
+ .attr('class', 'main-canvas')
274
+ .style('transform', 'translate(35, 0)')
275
+ .style('position', 'absolute')
276
+ .style('z-index', 1);
277
+ }
278
+ drawAnnotations() {
279
+ this._chart.selectAll('.annotations').remove();
280
+ const annotations = this._options.annotations?.map((annotation) => {
281
+ const x = this._xScales.get(annotation.xAxisIndex);
282
+ const y = this._yScales.get(annotation.yAxisIndex);
283
+ return {
284
+ note: annotation.note,
285
+ connector: annotation.connector,
286
+ x: x(annotation.point?.x),
287
+ y: y(annotation.point?.y),
288
+ dx: annotation.dx,
289
+ dy: annotation.dy,
290
+ type: annotation.type,
291
+ className: annotation.className,
292
+ };
293
+ });
294
+ const makeAnnotations = d3annotation
295
+ .annotation()
296
+ .annotations(annotations ?? []);
297
+ this._chart
298
+ .append('g')
299
+ .attr('class', 'annotations')
300
+ .attr('clip-path', `url(#draw-window-${this.uniqId})`)
301
+ .call(makeAnnotations)
302
+ .lower();
303
+ }
304
+ drawPlotLines() {
305
+ this._chart.selectAll('.plotlines').remove();
306
+ const plotlineGroup = this._chart
307
+ .append('g')
308
+ .attr('class', 'plotlines')
309
+ .style('shape-rendering', 'crispEdges')
310
+ .attr('clip-path', `url(#draw-window-${this.uniqId})`);
311
+ this._xAxisList
312
+ .filter((_) => _.options.plotLines.length > 0)
313
+ .forEach((axis) => {
314
+ const [min, max] = axis.extent;
315
+ const x = this._xScales.get(axis.index);
316
+ const plotlinesPoints = axis.options.plotLines;
317
+ const getTextCenterPointPx = (d, idx) => x((d?.value +
318
+ (plotlinesPoints[idx - 1]
319
+ ? plotlinesPoints[idx - 1]?.value
320
+ : 0)) /
321
+ 2);
322
+ const opacity = (d, idx) => {
323
+ const displayWidth = 20;
324
+ const width = x(d?.value) -
325
+ x(plotlinesPoints[idx - 1] ? plotlinesPoints[idx - 1]?.value : 0);
326
+ return width <= displayWidth ? 0 : 1;
327
+ };
328
+ plotlineGroup
329
+ .selectAll('.label')
330
+ .data(plotlinesPoints)
331
+ .join('text')
332
+ .attr('class', 'label font-body-3 fill-text-70')
333
+ .attr('x', getTextCenterPointPx)
334
+ .attr('y', (d) => this._height / 2)
335
+ .attr('text-anchor', 'middle')
336
+ .attr('dominant-baseline', 'central')
337
+ .attr('transform', (d, idx) => `rotate(-90, ${getTextCenterPointPx(d, idx)}, ${this._height / 2})`)
338
+ .text((d) => d?.label ?? '')
339
+ .style('opacity', opacity);
340
+ plotlineGroup
341
+ .selectAll('.plotline')
342
+ .data(plotlinesPoints)
343
+ .join('line')
344
+ .attr('class', 'plotline')
345
+ .attr('data-plotline-id', (d) => d.id)
346
+ .attr('x1', (d) => x(d.value))
347
+ .attr('x2', (d) => x(d.value))
348
+ .attr('y1', 0)
349
+ .attr('y2', this._height -
350
+ this._options.bounds.top -
351
+ this._options.bounds.bottom)
352
+ .attr('transform', `translate(0, ${this._options.bounds.top})`)
353
+ .style('stroke-width', (d) => d.width)
354
+ .style('stroke', (d) => d.color)
355
+ .style('stroke-dasharray', (d) => (d.dashed ? '8, 8' : '0, 0'));
356
+ const emit = (event, plotLine) => {
357
+ this.plotLinesMove$.next({ event, target: plotLine });
358
+ };
359
+ plotlineGroup
360
+ .selectAll('.drag-plotline')
361
+ .data(plotlinesPoints)
362
+ .join('line')
363
+ .attr('class', 'drag-plotline')
364
+ .attr('x1', (d) => x(d.value))
365
+ .attr('x2', (d) => x(d.value))
366
+ .attr('y1', 0)
367
+ .attr('y2', this._height -
368
+ this._options.bounds.top -
369
+ this._options.bounds.bottom)
370
+ .attr('transform', `translate(0, ${this._options.bounds.top})`)
371
+ .style('stroke-width', 8)
372
+ .style('stroke', 'rgba(0, 0, 0, 0)')
373
+ .style('cursor', 'col-resize')
374
+ .call(d3
375
+ .drag()
376
+ .on('drag', function (event, d) {
377
+ const group = d3.select(this).node().parentElement;
378
+ const draggedPlotLine = d3
379
+ .select(group)
380
+ .select(`[data-plotline-id='${d.id}']`);
381
+ d.value = x.invert(event.x);
382
+ const minValue = d.min ?? min;
383
+ const maxValue = d.max ?? max;
384
+ const borderLeftReached = d.value <= minValue;
385
+ const borderRightReached = d.value >= maxValue;
386
+ if (borderLeftReached) {
387
+ d.value = minValue;
388
+ }
389
+ if (borderRightReached) {
390
+ d.value = maxValue;
391
+ }
392
+ d3.select(this).attr('x1', x(d.value)).attr('x2', x(d.value));
393
+ draggedPlotLine.attr('x1', x(d.value)).attr('x2', x(d.value));
394
+ emit(event, d);
395
+ })
396
+ .on('end', (event, d) => {
397
+ emit(event, d);
398
+ }));
399
+ });
400
+ this._yAxisList
401
+ .filter((_) => _.options.plotLines.length > 0)
402
+ .forEach((axis) => {
403
+ const [min, max] = axis.extent;
404
+ const y = this._yScales.get(axis.index);
405
+ const plotlinesPoints = axis.options.plotLines;
406
+ plotlineGroup
407
+ .selectAll('.plotline')
408
+ .data(plotlinesPoints)
409
+ .join('line')
410
+ .attr('class', 'plotline')
411
+ .attr('data-plotline-id', (d) => d.id)
412
+ .attr('y1', (d) => y(d.value))
413
+ .attr('y2', (d) => y(d.value))
414
+ .attr('x1', 0)
415
+ .attr('x2', this._width - this._options.bounds.left - this._options.bounds.right)
416
+ .attr('transform', `translate(${this._options.bounds.left}, 0)`)
417
+ .style('stroke-width', (d) => d.width)
418
+ .style('stroke', (d) => d.color)
419
+ .style('stroke-dasharray', (d) => (d.dashed ? '8, 8' : '0, 0'));
420
+ const emit = (event, plotLine) => {
421
+ this.plotLinesMove$.next({ event, target: plotLine });
422
+ };
423
+ plotlineGroup
424
+ .selectAll('.drag-plotline')
425
+ .data(plotlinesPoints)
426
+ .join('line')
427
+ .attr('class', 'drag-plotline')
428
+ .attr('y1', (d) => y(d.value))
429
+ .attr('y2', (d) => y(d.value))
430
+ .attr('x1', 0)
431
+ .attr('x2', this._width - this._options.bounds.left - this._options.bounds.right)
432
+ .attr('transform', `translate(${this._options.bounds.left}, 0)`)
433
+ .style('stroke-width', 8)
434
+ .style('stroke', 'rgba(0, 0, 0, 0)')
435
+ .style('cursor', 'row-resize')
436
+ .call(d3
437
+ .drag()
438
+ .on('drag', function (event, d) {
439
+ const group = d3.select(this).node().parentElement;
440
+ const draggedPlotLine = d3
441
+ .select(group)
442
+ .select(`[data-plotline-id='${d.id}']`);
443
+ d.value = y.invert(event.y);
444
+ const minValue = d.min ?? min;
445
+ const maxValue = d.max ?? max;
446
+ const borderTopReached = d.value <= minValue;
447
+ const borderBottomReached = d.value >= maxValue;
448
+ if (borderTopReached) {
449
+ d.value = minValue;
450
+ }
451
+ if (borderBottomReached) {
452
+ d.value = maxValue;
453
+ }
454
+ d3.select(this).attr('y1', y(d.value)).attr('y2', y(d.value));
455
+ draggedPlotLine.attr('y1', y(d.value)).attr('y2', y(d.value));
456
+ emit(event, d);
457
+ })
458
+ .on('end', (event, d) => {
459
+ emit(event, d);
460
+ }));
461
+ });
462
+ }
463
+ drawPlotBands() {
464
+ this._chart.selectAll('.plotbands').remove();
465
+ const plotBandGroup = this._chart
466
+ .append('g')
467
+ .attr('class', 'plotbands')
468
+ .attr('clip-path', `url(#draw-window-${this.uniqId})`);
469
+ this._xAxisList
470
+ .filter((_) => _.options.plotBands.length > 0)
471
+ .forEach((axis) => {
472
+ const x = this._xScales.get(axis.index);
473
+ const [min, max] = axis.extent;
474
+ const plotband = plotBandGroup
475
+ .append('g')
476
+ .style('shape-rendering', 'crispEdges');
477
+ const plotBandHeight = this._height - this._options.bounds.top - this._options.bounds.bottom;
478
+ const emit = (event, plotBand) => {
479
+ this.plotBandsMove$.next({
480
+ event,
481
+ target: plotBand,
482
+ });
483
+ };
484
+ plotband
485
+ .selectAll('rect')
486
+ .data(axis.options.plotBands)
487
+ .on('start', (_) => {
488
+ this._chart.selectAll('.marker').style('display', 'none');
489
+ d3.select(this._container.nativeElement)
490
+ .select('.tooltip-chart')
491
+ .style('display', 'none');
492
+ })
493
+ .join('rect')
494
+ .attr('data-plotband-id', (d) => d.id)
495
+ .attr('x', (d) => x(d.from))
496
+ .attr('y', 0)
497
+ .attr('width', (d) => Math.abs(x(d.to) - x(d.from)))
498
+ .attr('fill', (d) => {
499
+ if (d.image) {
500
+ return `url(#${d.image})`;
501
+ }
502
+ return d.color;
503
+ })
504
+ .style('opacity', (d) => d.opacity ?? 1)
505
+ .attr('height', plotBandHeight > 0 ? plotBandHeight : 0)
506
+ .attr('transform', `translate(0, ${this._options.bounds.top})`);
507
+ plotband
508
+ .selectAll('.line-left')
509
+ .data(axis.options.plotBands)
510
+ .join('line')
511
+ .attr('data-line-left-id', (d) => d.id)
512
+ .attr('class', 'line-left')
513
+ .attr('x1', (d) => x(d.from))
514
+ .attr('x2', (d) => x(d.from))
515
+ .attr('y1', 0)
516
+ .attr('y2', this._height -
517
+ this._options.bounds.top -
518
+ this._options.bounds.bottom)
519
+ .attr('transform', `translate(0, ${this._options.bounds.top})`)
520
+ .style('stroke-width', 1)
521
+ .style('stroke-dasharray', '8, 8')
522
+ .style('stroke', 'var(--color-text-90)')
523
+ .style('opacity', (d) => (d.showGrabbers ? 1 : 0));
524
+ plotband
525
+ .selectAll('.drag-left')
526
+ .data(axis.options.plotBands)
527
+ .join('line')
528
+ .attr('x1', (d) => x(d.from))
529
+ .attr('x2', (d) => x(d.from))
530
+ .attr('y1', 0)
531
+ .attr('y2', this._height -
532
+ this._options.bounds.top -
533
+ this._options.bounds.bottom)
534
+ .style('display', (d) => (d?.resizable ? 'unset' : 'none'))
535
+ .attr('transform', `translate(0, ${this._options.bounds.top})`)
536
+ .style('stroke-width', 8)
537
+ .style('stroke', 'rgba(0, 0, 0, 0)')
538
+ .style('cursor', 'col-resize')
539
+ .call(d3
540
+ .drag()
541
+ .on('drag', function (event, d) {
542
+ const group = d3.select(this).node().parentElement;
543
+ const draggedBand = d3
544
+ .select(group)
545
+ .select(`[data-plotband-id='${d.id}']`);
546
+ const draggedLine = d3
547
+ .select(group)
548
+ .select(`[data-line-left-id='${d.id}']`);
549
+ d.from = x.invert(event.x);
550
+ const minValue = d.min ?? min;
551
+ const borderReached = d.from <= minValue;
552
+ if (borderReached) {
553
+ d.from = minValue;
554
+ }
555
+ if (d.from >= d.to) {
556
+ d.from = d.to;
557
+ }
558
+ d3.select(this).attr('x1', x(d.from)).attr('x2', x(d.from));
559
+ draggedBand
560
+ .attr('x', x(d.from))
561
+ .attr('width', x(d.to) - x(d.from));
562
+ draggedLine.attr('x1', x(d.from)).attr('x2', x(d.from));
563
+ emit(event, d);
564
+ })
565
+ .on('end', (event, d) => emit(event, d)));
566
+ plotband
567
+ .selectAll('.line-right')
568
+ .data(axis.options.plotBands)
569
+ .join('line')
570
+ .attr('data-line-right-id', (d) => d.id)
571
+ .attr('class', 'line-right')
572
+ .attr('x1', (d) => x(d.to))
573
+ .attr('x2', (d) => x(d.to))
574
+ .attr('y1', 0)
575
+ .attr('y2', this._height -
576
+ this._options.bounds.top -
577
+ this._options.bounds.bottom)
578
+ .attr('transform', `translate(0, ${this._options.bounds.top})`)
579
+ .style('stroke-width', 1)
580
+ .style('stroke-dasharray', '8, 8')
581
+ .style('stroke', 'var(--color-text-90)')
582
+ .style('opacity', (d) => (d.showGrabbers ? 1 : 0));
583
+ plotband
584
+ .selectAll('.drag-right')
585
+ .data(axis.options.plotBands)
586
+ .join('line')
587
+ .attr('class', 'drag-right')
588
+ .style('display', (d) => (d?.resizable ? 'unset' : 'none'))
589
+ .attr('x1', (d) => x(d.to))
590
+ .attr('x2', (d) => x(d.to))
591
+ .attr('y1', 0)
592
+ .attr('y2', this._height -
593
+ this._options.bounds.top -
594
+ this._options.bounds.bottom)
595
+ .attr('transform', `translate(0, ${this._options.bounds.top})`)
596
+ .style('stroke-width', 8)
597
+ .style('stroke', 'rgba(0, 0, 0, 0)')
598
+ .style('cursor', 'col-resize')
599
+ .call(d3
600
+ .drag()
601
+ .on('drag', function (event, d) {
602
+ const group = d3.select(this).node().parentElement;
603
+ const draggedBand = d3
604
+ .select(group)
605
+ .select(`[data-plotband-id='${d.id}']`);
606
+ const draggedLine = d3
607
+ .select(group)
608
+ .select(`[data-line-right-id='${d.id}']`);
609
+ d.to = x.invert(event.x);
610
+ const maxValue = d.max ?? max;
611
+ const borderReached = d.to >= maxValue;
612
+ if (borderReached) {
613
+ d.to = maxValue;
614
+ }
615
+ if (d.to <= d.from) {
616
+ d.to = d.from;
617
+ }
618
+ d3.select(this).attr('x1', x(d.to)).attr('x2', x(d.to));
619
+ draggedBand.attr('width', x(d.to) - x(d.from));
620
+ draggedLine.attr('x1', x(d.to)).attr('x2', x(d.to));
621
+ emit(event, d);
622
+ })
623
+ .on('end', (event, d) => emit(event, d)));
624
+ });
625
+ this._yAxisList
626
+ .filter((_) => _.options.plotBands.length > 0)
627
+ .forEach((axis) => {
628
+ const y = this._yScales.get(axis.index);
629
+ const [min, max] = axis.extent;
630
+ const plotband = plotBandGroup
631
+ .append('g')
632
+ .style('shape-rendering', 'crispEdges');
633
+ const plotBandWidth = this._width - this._options.bounds.left - this._options.bounds.right; // TODO add multiaxis support width
634
+ const emit = (event, plotBand) => {
635
+ this.plotBandsMove$.next({
636
+ event,
637
+ target: plotBand,
638
+ });
639
+ };
640
+ const dragPlotband = d3
641
+ .drag()
642
+ .subject(function () {
643
+ const element = d3.select(this);
644
+ return { y: element.attr('y') };
645
+ })
646
+ .on('start drag end', function (event, d) {
647
+ const element = d3.select(this);
648
+ const height = parseFloat(element.attr('height'));
649
+ d.to = y.invert(event.y + height);
650
+ d.from = y.invert(event.y);
651
+ const minValue = d.min ?? min;
652
+ const maxValue = d.max ?? max;
653
+ const borderReachedMin = d.from <= minValue;
654
+ const borderReachedMax = d.to >= maxValue;
655
+ if (borderReachedMin) {
656
+ d.to = y.invert(y(minValue) + height);
657
+ d.from = minValue;
658
+ }
659
+ if (borderReachedMax) {
660
+ d.to = maxValue;
661
+ d.from = y.invert(y(maxValue) - height);
662
+ }
663
+ element.attr('y', y(d.from));
664
+ const group = element.node().parentElement;
665
+ d3.select(group)
666
+ .select(`[data-line-left-id='${d.id}']`)
667
+ .attr('y1', y(d.from))
668
+ .attr('y2', y(d.from));
669
+ d3.select(group)
670
+ .select(`[data-grab-left-id='${d.id}']`)
671
+ .attr('y1', y(d.from))
672
+ .attr('y2', y(d.from));
673
+ d3.select(group)
674
+ .select(`[data-line-right-id='${d.id}']`)
675
+ .attr('y1', y(d.to))
676
+ .attr('y2', y(d.to));
677
+ d3.select(group)
678
+ .select(`[data-grab-right-id='${d.id}']`)
679
+ .attr('y1', y(d.to))
680
+ .attr('y2', y(d.to));
681
+ emit(event, d);
682
+ });
683
+ const leftGrabDrag = d3
684
+ .drag()
685
+ .on('drag', function (event, d) {
686
+ const group = d3.select(this).node().parentElement;
687
+ const draggedBand = d3
688
+ .select(group)
689
+ .select(`[data-plotband-id='${d.id}']`);
690
+ const draggedLine = d3
691
+ .select(group)
692
+ .select(`[data-line-left-id='${d.id}']`);
693
+ d.from = y.invert(event.y);
694
+ const minValue = d.min ?? min;
695
+ const borderReached = d.from <= minValue;
696
+ if (borderReached) {
697
+ d.from = minValue;
698
+ }
699
+ if (d.from >= d.to) {
700
+ d.from = d.to;
701
+ }
702
+ d3.select(this).attr('y1', y(d.from)).attr('y2', y(d.from));
703
+ draggedBand
704
+ .attr('y', y(d.from))
705
+ .attr('height', Math.abs(y(d.to) - y(d.from)));
706
+ draggedLine.attr('y1', y(d.from)).attr('y2', y(d.from));
707
+ emit(event, d);
708
+ })
709
+ .on('end', (event, d) => emit(event, d));
710
+ const rightGrabDrag = d3
711
+ .drag()
712
+ .on('drag', function (event, d) {
713
+ const group = d3.select(this).node().parentElement;
714
+ const draggedBand = d3
715
+ .select(group)
716
+ .select(`[data-plotband-id='${d.id}']`);
717
+ const draggedLine = d3
718
+ .select(group)
719
+ .select(`[data-line-right-id='${d.id}']`);
720
+ d.to = y.invert(event.y);
721
+ const maxValue = d.max ?? max;
722
+ const borderReached = d.to >= maxValue;
723
+ if (borderReached) {
724
+ d.to = maxValue;
725
+ }
726
+ if (d.to <= d.from) {
727
+ d.to = d.from;
728
+ }
729
+ d3.select(this).attr('y1', y(d.to)).attr('y2', y(d.to));
730
+ draggedBand
731
+ .attr('y', y(d.from))
732
+ .attr('height', Math.abs(y(d.to) - y(d.from)));
733
+ draggedLine.attr('y1', y(d.to)).attr('y2', y(d.to));
734
+ emit(event, d);
735
+ })
736
+ .on('end', (event, d) => emit(event, d));
737
+ plotband
738
+ .selectAll('rect')
739
+ .data(axis.options.plotBands)
740
+ .join('rect')
741
+ .attr('data-plotband-id', (d) => d.id)
742
+ .attr('x', 0)
743
+ .attr('y', (d) => y(d.from))
744
+ .attr('width', (d) => plotBandWidth)
745
+ .attr('fill', (d) => {
746
+ if (d.image) {
747
+ return `url(#${d.image})`;
748
+ }
749
+ return d.color;
750
+ })
751
+ .style('opacity', (d) => d.opacity ?? 1)
752
+ .attr('height', (d) => Math.abs(y(d.to) - y(d.from)))
753
+ .attr('cursor', (d) => (d.draggable ? 'move' : 'default'));
754
+ plotband
755
+ .selectAll('.line-left')
756
+ .data(axis.options.plotBands.filter((d) => d.resizable))
757
+ .join('line')
758
+ .attr('data-line-left-id', (d) => d.id)
759
+ .attr('class', 'line-left')
760
+ .attr('y1', (d) => y(d.from))
761
+ .attr('y2', (d) => y(d.from))
762
+ .attr('x1', 0)
763
+ .attr('x2', plotBandWidth)
764
+ .style('stroke-width', 1)
765
+ .style('stroke-dasharray', '8, 8')
766
+ .style('stroke', 'var(--color-text-90)')
767
+ .style('opacity', (d) => (d.showGrabbers ? 1 : 0));
768
+ plotband
769
+ .selectAll('.drag-left')
770
+ .data(axis.options.plotBands.filter((d) => d.resizable))
771
+ .join('line')
772
+ .attr('data-grab-left-id', (d) => d.id)
773
+ .attr('y1', (d) => y(d.from))
774
+ .attr('y2', (d) => y(d.from))
775
+ .attr('x1', 0)
776
+ .attr('x2', plotBandWidth)
777
+ .style('stroke-width', 8)
778
+ .style('stroke', 'rgba(0, 0, 0, 0)')
779
+ .style('cursor', (d) => (d.resizable ? 'row-resize' : 'default'));
780
+ plotband
781
+ .selectAll('.line-right')
782
+ .data(axis.options.plotBands.filter((d) => d.resizable))
783
+ .join('line')
784
+ .attr('data-line-right-id', (d) => d.id)
785
+ .attr('class', 'line-right')
786
+ .attr('y1', (d) => y(d.to))
787
+ .attr('y2', (d) => y(d.to))
788
+ .attr('x1', 0)
789
+ .attr('x2', plotBandWidth)
790
+ .style('stroke-width', 1)
791
+ .style('stroke-dasharray', '8, 8')
792
+ .style('stroke', 'var(--color-text-90)')
793
+ .style('opacity', (d) => (d.showGrabbers ? 1 : 0));
794
+ plotband
795
+ .selectAll('.drag-right')
796
+ .data(axis.options.plotBands.filter((d) => d.resizable))
797
+ .join('line')
798
+ .attr('class', 'drag-right')
799
+ .attr('data-grab-right-id', (d) => d.id)
800
+ .attr('y1', (d) => y(d.to))
801
+ .attr('y2', (d) => y(d.to))
802
+ .attr('x1', 0)
803
+ .attr('x2', plotBandWidth)
804
+ .style('stroke-width', 8)
805
+ .style('stroke', 'rgba(0, 0, 0, 0)')
806
+ .style('cursor', (d) => (d.resizable ? 'row-resize' : 'default'));
807
+ axis.options.plotBands.forEach((_) => {
808
+ if (_.draggable) {
809
+ plotband.select(`[data-plotband-id='${_.id}']`).call(dragPlotband);
810
+ }
811
+ if (_.resizable) {
812
+ plotband.select(`[data-grab-left-id='${_.id}']`).call(leftGrabDrag);
813
+ plotband
814
+ .select(`[data-grab-right-id='${_.id}']`)
815
+ .call(rightGrabDrag);
816
+ }
817
+ });
818
+ });
819
+ }
820
+ drawChart() {
821
+ const series = this._options.series?.filter((_) => _.visible);
822
+ this._chart.selectAll('.series').remove();
823
+ if (!series || series.length < 1) {
824
+ d3.select(this._container.nativeElement)
825
+ .select('canvas')
826
+ .style('display', 'none');
827
+ }
828
+ const group = this._chart
829
+ .append('g')
830
+ .attr('class', 'series')
831
+ .attr('clip-path', `url(#draw-window-${this.uniqId})`);
832
+ series?.forEach((seriesItem, index) => {
833
+ if (seriesItem.renderTo === 'canvas') {
834
+ d3.select(this._container.nativeElement)
835
+ .select('canvas')
836
+ .style('display', null);
837
+ d3.select(this._container.nativeElement)
838
+ .select('svg')
839
+ .style('position', 'absolute');
840
+ }
841
+ else {
842
+ d3.select(this._container.nativeElement)
843
+ .select('canvas')
844
+ .style('display', 'none');
845
+ }
846
+ if (!this._xScales.has(seriesItem.xAxisIndex) ||
847
+ !this._yScales.has(seriesItem.yAxisIndex)) {
848
+ return;
849
+ }
850
+ const foundX = this._xScales.get(seriesItem.xAxisIndex);
851
+ const foundY = this._yScales.get(seriesItem.yAxisIndex);
852
+ const drawer = seriesItem.drawer != null
853
+ ? seriesItem.drawer
854
+ : defaultDrawerMapping.get(seriesItem.type);
855
+ if (!drawer) {
856
+ throw new Error(`No drawer for series ${seriesItem.name}, type ${SeriesType[seriesItem.type]}`);
857
+ }
858
+ if (seriesItem.renderTo === 'canvas') {
859
+ const context = this._canvas.node().getContext('2d');
860
+ context.clearRect(0, 0, this._width, this._height);
861
+ }
862
+ let [xMin, xMax] = foundX.domain();
863
+ let [yMin, yMax] = foundY.domain();
864
+ xMin = xMin instanceof Date ? xMin.getTime() : xMin;
865
+ xMax = xMax instanceof Date ? xMax.getTime() : xMax;
866
+ yMin = yMin instanceof Date ? yMin.getTime() : yMin;
867
+ yMax = yMax instanceof Date ? yMax.getTime() : yMax;
868
+ const visiblePoints = (point, idx, arr) => (point.x <= xMax ||
869
+ point.x1 <= xMax ||
870
+ (arr[idx - 1] && arr[idx - 1].x <= xMax) ||
871
+ (arr[idx - 1] && arr[idx - 1].x1 <= xMax)) &&
872
+ (point.x >= xMin ||
873
+ point.x1 >= xMin ||
874
+ (arr[idx + 1] && arr[idx + 1].x >= xMin) ||
875
+ (arr[idx + 1] && arr[idx + 1].x1 >= xMin)) &&
876
+ (point.y <= yMax ||
877
+ point.y1 <= yMax ||
878
+ (arr[idx - 1] && arr[idx - 1].y <= yMax) ||
879
+ (arr[idx - 1] && arr[idx - 1].y1 <= yMax)) &&
880
+ (point.y >= yMin ||
881
+ point.y1 >= yMin ||
882
+ (arr[idx + 1] && arr[idx + 1].y >= yMin) ||
883
+ (arr[idx + 1] && arr[idx + 1].y1 >= yMin));
884
+ const filteredData = seriesItem.data; //.filter(visiblePoints);
885
+ const serie = {
886
+ ...seriesItem,
887
+ data: filteredData,
888
+ };
889
+ drawer.draw(serie, seriesItem.renderTo === 'canvas' ? this._canvas : group, foundX, foundY, this._options);
890
+ const emit = (event) => {
891
+ this.seriesMove$.next(event);
892
+ };
893
+ const emitPoint = (event) => {
894
+ this.pointMove$.next(event);
895
+ };
896
+ drawer?.dispatch?.on(DispatchType.moveLine, function () {
897
+ emit(this);
898
+ });
899
+ drawer?.dispatch?.on(DispatchType.movePoint, function () {
900
+ emitPoint(this);
901
+ });
902
+ });
903
+ }
904
+ createTooltip() {
905
+ d3.select(this._container.nativeElement)
906
+ .append('div')
907
+ .attr('class', 'tooltip-chart color-text-90 bg-background-50 shadow-2')
908
+ .style('position', 'fixed')
909
+ .style('top', 'unset')
910
+ .style('right', 'unset')
911
+ .style('bottom', 'unset')
912
+ .style('left', 'unset')
913
+ .style('pointer-events', 'none')
914
+ .style('display', 'none');
915
+ }
916
+ handleMouseMove(options) {
917
+ const mouse = d3.pointer(options.event);
918
+ const { top, right, bottom, left } = this.tooltipPosition(options.event);
919
+ const tooltipsData = [];
920
+ this._chart
921
+ .select('.marker-line')
922
+ .attr('transform', `translate(${0}, ${mouse[1] - 2})`);
923
+ this._chart
924
+ .selectAll('.marker')
925
+ .attr('transform', (d) => {
926
+ if (!d.data.length) {
927
+ return;
928
+ }
929
+ if (!this._xScales.has(d.xAxisIndex) ||
930
+ !this._yScales.has(d.yAxisIndex)) {
931
+ return;
932
+ }
933
+ const foundX = this._xScales.get(d.xAxisIndex);
934
+ const foundY = this._yScales.get(d.yAxisIndex);
935
+ if (this._options.tooltip.tracking === 'x') {
936
+ const [min, max] = foundX.domain();
937
+ const filteredData = d.data.filter((point) => point.x <= max && point.x >= min);
938
+ const sorted = [...filteredData].sort((a, b) => d3.ascending(a.x, b.x));
939
+ const bisect = d3.bisector((dd) => dd.x).left;
940
+ const x0 = foundX.invert(mouse[0]);
941
+ const index = bisect(sorted, x0);
942
+ const data = sorted[index] ? sorted[index] : sorted[index - 1];
943
+ tooltipsData.push({
944
+ point: data,
945
+ color: d.color,
946
+ name: d.name,
947
+ });
948
+ return `translate(${!isNaN(data?.x) && data?.x != null ? foundX(data.x) : -10}, ${!isNaN(data?.y) && data?.y != null ? foundY(data.y) : -10})`;
949
+ }
950
+ if (this._options.tooltip.tracking === 'y') {
951
+ const sorted = [...d.data].sort((a, b) => d3.ascending(a.y, b.y));
952
+ const bisect = d3.bisector((dd) => dd.y).left;
953
+ const y0 = foundY.invert(mouse[1]);
954
+ const index = bisect(sorted, y0, 0);
955
+ const data = sorted[index] ? sorted[index] : sorted[index - 1];
956
+ tooltipsData.push({
957
+ point: data,
958
+ color: d.color,
959
+ name: d.name,
960
+ });
961
+ return `translate(${!isNaN(data?.x) && data?.x != null ? foundX(data.x) : -10}, ${!isNaN(data?.y) && data?.y != null ? foundY(data.y) : -10})`;
962
+ }
963
+ });
964
+ if (this._options.tooltip?.format) {
965
+ const formatted = this._options.tooltip?.format(tooltipsData);
966
+ d3.select(this._container.nativeElement)
967
+ .select('.tooltip-chart')
968
+ .style('top', top)
969
+ .style('right', right)
970
+ .style('bottom', bottom)
971
+ .style('left', left)
972
+ .html(formatted);
973
+ }
974
+ }
975
+ tooltipPosition(event) {
976
+ const centerX = this._width / 2;
977
+ const centerY = this._height / 2;
978
+ const padding = { x: 10, y: 10 };
979
+ const scene = {
980
+ left: event.pageX > centerX ? 'initial' : `${event.pageX + padding.x}px`,
981
+ top: event.pageY > centerY ? 'initial' : `${event.pageY + padding.y}px`,
982
+ bottom: event.pageY > centerY
983
+ ? `${window.innerHeight - event.pageY}px`
984
+ : 'initial',
985
+ right: event.pageX > centerX
986
+ ? `${window.innerWidth - event.pageX + padding.x}px`
987
+ : 'initial',
988
+ };
989
+ return scene;
990
+ }
991
+ createMarkers() {
992
+ if (this._options.tooltip === undefined) {
993
+ return;
994
+ }
995
+ if (!this._options.tooltip.enable) {
996
+ return;
997
+ }
998
+ this._chart.selectAll('.marker').remove();
999
+ this._chart.select('.marker-line').remove();
1000
+ this._chart
1001
+ .append('line')
1002
+ .attr('class', 'marker-line')
1003
+ .attr('x1', 35)
1004
+ .attr('x2', this._width)
1005
+ .style('stroke-width', 0.5)
1006
+ .style('stroke', 'var(--color-text-40)')
1007
+ .style('display', 'none');
1008
+ const { series } = this._options;
1009
+ if (!series) {
1010
+ return;
1011
+ }
1012
+ const markers = this._chart
1013
+ .selectAll()
1014
+ .data(series.filter((_) => _.visible));
1015
+ markers
1016
+ .enter()
1017
+ .append('circle')
1018
+ .attr('class', 'marker')
1019
+ .attr('pointer-events', 'none')
1020
+ .attr('r', 3)
1021
+ .attr('fill', (_, i) => _.color)
1022
+ .style('display', 'none');
1023
+ const mouseoutEvent = () => {
1024
+ this._chart.selectAll('.marker').style('display', 'none');
1025
+ this._chart.select('.marker-line').style('display', 'none');
1026
+ d3.select(this._container.nativeElement)
1027
+ .select('.tooltip-chart')
1028
+ .style('display', 'none');
1029
+ };
1030
+ const mouseMoveEvent = (event) => {
1031
+ const options = {
1032
+ event,
1033
+ series,
1034
+ };
1035
+ this.handleMouseMove(options);
1036
+ };
1037
+ const mouseOverEvent = () => {
1038
+ if (this._options.tooltip.showMarkers) {
1039
+ this._chart
1040
+ .selectAll('.marker')
1041
+ .style('display', (d) => {
1042
+ if (d.data.length) {
1043
+ return null;
1044
+ }
1045
+ return 'none';
1046
+ });
1047
+ }
1048
+ if (this._options.tooltip.showLine) {
1049
+ this._chart.select('.marker-line').style('display', null);
1050
+ }
1051
+ d3.select(this._container.nativeElement)
1052
+ .select('.tooltip-chart')
1053
+ .style('display', null);
1054
+ };
1055
+ this._chart
1056
+ .on('mouseover', mouseOverEvent)
1057
+ .on('mousemove', mouseMoveEvent)
1058
+ .on('mouseleave', mouseoutEvent);
1059
+ }
1060
+ drawLegend() {
1061
+ if (this._options.legend?.visible === false) {
1062
+ return;
1063
+ }
1064
+ this._chart.selectAll('.legend').remove();
1065
+ const drawer = this._options.legend?.type
1066
+ ? defaultLegendDrawerMapping.get(this._options.legend.type)
1067
+ : defaultLegendDrawerMapping.get(LegendType.swatches);
1068
+ const context = this._container.nativeElement;
1069
+ if (!drawer) {
1070
+ throw new Error(`No drawer for legend
1071
+ }`);
1072
+ }
1073
+ drawer.draw({
1074
+ context,
1075
+ series: this._options.series.filter((_) => _.showInLegend),
1076
+ width: this._width,
1077
+ height: this._height,
1078
+ });
1079
+ }
1080
+ caluclateChartWidth() {
1081
+ let width = -this._width;
1082
+ if (this.offsetOpposite > 0) {
1083
+ width = -this._width + this.offsetOpposite + this.offsetNonOpposite;
1084
+ }
1085
+ if (this.offsetNonOpposite > 0) {
1086
+ width =
1087
+ -this._width + this._options.bounds.right + this.offsetNonOpposite;
1088
+ }
1089
+ if (this.offsetOpposite >= Axis.offsetFactor &&
1090
+ this.offsetNonOpposite === 0) {
1091
+ width = -this._width + this.offsetOpposite + this._options.bounds.left;
1092
+ }
1093
+ if (this.offsetOpposite > 0 && this.offsetNonOpposite > 0) {
1094
+ width = -this._width + this.offsetOpposite + this.offsetNonOpposite;
1095
+ }
1096
+ return Math.abs(width);
1097
+ }
1098
+ drawGridLines() {
1099
+ if (this._options.gridLines === false) {
1100
+ return;
1101
+ }
1102
+ const translateX = this.offsetNonOpposite > 0
1103
+ ? this.offsetNonOpposite
1104
+ : this._options.bounds.left + this.offsetNonOpposite;
1105
+ this._chart.selectAll('.grid').remove();
1106
+ const yList = this._yAxisList.filter((_) => _.options.visible && !_.options.opposite);
1107
+ const y = yList?.length > 0
1108
+ ? this._yScales.get(yList[yList.length - 1].index)
1109
+ : this._yScales.get(0);
1110
+ const x = this._xScales.get(0);
1111
+ if (!y || !x) {
1112
+ return;
1113
+ }
1114
+ const TICK_HEIGHT = 40;
1115
+ const TICK_WIDTH = 60;
1116
+ const tickCount = Math.round(this._height / TICK_HEIGHT);
1117
+ const tickCountX = Math.round(this._width / TICK_WIDTH);
1118
+ const gridY = this._chart
1119
+ .append('g')
1120
+ .attr('class', 'grid color-text-10')
1121
+ .style('shape-rendering', 'crispEdges');
1122
+ const gridlinesY = d3
1123
+ .axisLeft(y)
1124
+ .tickFormat('')
1125
+ .tickSize(-this.visibleChartWindowWidth);
1126
+ const hasBarSeriesType = this._options.series.some((_) => _.type === SeriesType.bar);
1127
+ if (!hasBarSeriesType) {
1128
+ const gridX = this._chart
1129
+ .append('g')
1130
+ .attr('class', 'grid color-text-10')
1131
+ .style('shape-rendering', 'crispEdges');
1132
+ const gridlinesX = d3
1133
+ .axisBottom(x)
1134
+ .ticks(tickCountX)
1135
+ .tickFormat('')
1136
+ .tickSize(this._height - this._options.bounds.bottom - this._options.bounds.top);
1137
+ gridX
1138
+ .call(gridlinesX)
1139
+ .attr('transform', `translate(0, ${this._options.bounds.top})`)
1140
+ .lower();
1141
+ }
1142
+ gridY
1143
+ .call(gridlinesY)
1144
+ .attr('transform', `translate(${translateX}, ${0})`)
1145
+ .lower();
1146
+ this._chart.selectAll('.grid path').remove();
1147
+ }
1148
+ createScales() {
1149
+ this._xScales.clear();
1150
+ this._yScales.clear();
1151
+ const defaultScaleMapping = new Map()
1152
+ .set(ScaleType.linear, d3.scaleLinear)
1153
+ .set(ScaleType.log, d3.scaleLog)
1154
+ .set(ScaleType.sqrt, d3.scaleSqrt)
1155
+ .set(ScaleType.pow, d3.scalePow);
1156
+ const xRange = [
1157
+ this.offsetNonOpposite
1158
+ ? this.offsetNonOpposite
1159
+ : this._options.bounds.left,
1160
+ this._width -
1161
+ (this.offsetOpposite
1162
+ ? this.offsetOpposite
1163
+ : this._options.bounds.right),
1164
+ ];
1165
+ const yRange = [
1166
+ this._height - this._options.bounds.bottom,
1167
+ this._options.bounds.top,
1168
+ ];
1169
+ this._xAxisList.forEach((axis, index) => {
1170
+ let scale = null;
1171
+ if (axis.options.type === Scale.time) {
1172
+ scale = d3
1173
+ .scaleTime()
1174
+ .domain(axis.extent)
1175
+ .range(axis.options.inverted ? [...xRange].reverse() : xRange);
1176
+ }
1177
+ if (axis.options.type === Scale.number) {
1178
+ scale = defaultScaleMapping
1179
+ .get(axis.options.scaleOptions.type)()
1180
+ .domain(axis.extent)
1181
+ .range(axis.options.inverted ? [...xRange].reverse() : xRange);
1182
+ }
1183
+ if (axis.options.niceTicks) {
1184
+ scale.nice();
1185
+ }
1186
+ if (axis.options.scaleOptions.type === ScaleType.log) {
1187
+ scale.base(axis.options.scaleOptions.base);
1188
+ }
1189
+ if (axis.options.scaleOptions.type === ScaleType.pow) {
1190
+ scale.exponent(axis.options.scaleOptions.base);
1191
+ }
1192
+ this._xScales.set(index, scale);
1193
+ });
1194
+ this._yAxisList.forEach((axis, index) => {
1195
+ let scale = null;
1196
+ if (axis.options.type === Scale.number) {
1197
+ scale = defaultScaleMapping
1198
+ .get(axis.options.scaleOptions.type)()
1199
+ .domain(axis.extent)
1200
+ .range(axis.options.inverted ? [...yRange].reverse() : yRange);
1201
+ }
1202
+ if (axis.options.type === Scale.time) {
1203
+ scale = d3
1204
+ .scaleTime()
1205
+ .domain(axis.extent)
1206
+ .range(axis.options.inverted ? [...yRange].reverse() : yRange);
1207
+ }
1208
+ if (axis.options.niceTicks) {
1209
+ scale.nice();
1210
+ }
1211
+ if (axis.options.scaleOptions.type === ScaleType.log) {
1212
+ scale.base(axis.options.scaleOptions.base);
1213
+ }
1214
+ if (axis.options.scaleOptions.type === ScaleType.pow) {
1215
+ scale.exponent(axis.options.scaleOptions.base);
1216
+ }
1217
+ this._yScales.set(index, scale);
1218
+ });
1219
+ for (const [key, value] of this._yScales) {
1220
+ this._clonedY.set(key, value.copy());
1221
+ }
1222
+ for (const [key, value] of this._xScales) {
1223
+ this._clonedX.set(key, value.copy());
1224
+ }
1225
+ }
1226
+ drawAxis() {
1227
+ const hasVisibleAxis = [...this._xAxisList, ...this._yAxisList].filter((axis) => axis.options.visible);
1228
+ if (!hasVisibleAxis) {
1229
+ return;
1230
+ }
1231
+ const negative = false;
1232
+ this._chart.selectAll('.axes').remove();
1233
+ const axes = this._chart
1234
+ .append('g')
1235
+ .attr('class', 'axes')
1236
+ .style('shape-rendering', 'crispEdges');
1237
+ const TICK_HEIGHT = 40;
1238
+ const TICK_WIDTH = 60;
1239
+ const tickCount = Math.round(this._height / TICK_HEIGHT);
1240
+ const tickCountX = Math.round(this._width / TICK_WIDTH);
1241
+ this._xAxisList.forEach((axis) => {
1242
+ const options = axis.options;
1243
+ const translate = `translate(${0}, ${this._height - this._options.bounds.bottom})`;
1244
+ const x = this._xScales.get(axis.index);
1245
+ const xAxis = d3.axisBottom(x).ticks(tickCountX);
1246
+ if (axis.options?.tickFormat) {
1247
+ xAxis.tickFormat(axis.options.tickFormat);
1248
+ }
1249
+ if (options.visible !== false) {
1250
+ const translateX = this.offsetNonOpposite
1251
+ ? this.offsetNonOpposite
1252
+ : this._options.bounds.left + this.offsetNonOpposite;
1253
+ axes
1254
+ .append('g')
1255
+ .attr('class', 'x-axis-label')
1256
+ .append('text')
1257
+ .style('fill', 'var(--color-text-50)')
1258
+ .attr('transform', 'translate(' +
1259
+ this._width / 2 +
1260
+ ' ,' +
1261
+ (this._height - this._options.bounds.bottom) +
1262
+ ')')
1263
+ .style('text-anchor', 'middle')
1264
+ .attr('dy', '3em')
1265
+ .text(options.title ?? '');
1266
+ axes
1267
+ .append('g')
1268
+ .attr('class', 'x-axis font-caption')
1269
+ .attr('data-x-scale-id', axis.index)
1270
+ .attr('transform', translate)
1271
+ .style('pointer-events', 'none')
1272
+ .call(xAxis)
1273
+ .call((_) => {
1274
+ _.select('.domain').remove();
1275
+ _.selectAll('.tick').attr('class', 'color-text-50');
1276
+ if (negative) {
1277
+ _.append('line')
1278
+ .attr('y1', 0)
1279
+ .attr('y2', this._height)
1280
+ .attr('transform', `translate(${x(0)}, -${this._height})`)
1281
+ .style('stroke-width', 0.5)
1282
+ .style('stroke', 'var(--color-text-50)');
1283
+ }
1284
+ _.append('line')
1285
+ .attr('x1', 0)
1286
+ .attr('x2', this.visibleChartWindowWidth)
1287
+ .attr('transform', `translate(${translateX}, ${0})`)
1288
+ .style('stroke-width', 0.5)
1289
+ .style('stroke', 'var(--color-text-50)');
1290
+ });
1291
+ }
1292
+ });
1293
+ this._yAxisList.forEach((axis) => {
1294
+ const translate = axis.options.opposite
1295
+ ? `translate(${this._width - axis.offset}, ${0})`
1296
+ : `translate(${axis.offset}, ${0})`;
1297
+ const y = this._yScales.get(axis.index);
1298
+ const yAxis = axis.options.opposite ? d3.axisRight(y) : d3.axisLeft(y);
1299
+ if (axis.options.visible !== false) {
1300
+ const labelOffset = axis.options.opposite
1301
+ ? this._width - axis.offset + axis.width
1302
+ : axis.offset - axis.width;
1303
+ axes
1304
+ .append('g')
1305
+ .attr('class', 'y-axis-label')
1306
+ .append('text')
1307
+ .style('fill', 'var(--color-text-50)')
1308
+ .attr('transform', 'rotate(-90)')
1309
+ .attr('y', labelOffset)
1310
+ .attr('x', 0 - this._height / 2)
1311
+ .attr('dy', axis.options.opposite ? '12px' : '-3px')
1312
+ .style('text-anchor', 'middle')
1313
+ .text(axis.options.title ?? '');
1314
+ axes
1315
+ .append('g')
1316
+ .attr('class', 'y-axis font-caption')
1317
+ .attr('data-y-scale-id', axis.index)
1318
+ .attr('transform', translate)
1319
+ .call(yAxis)
1320
+ .style('pointer-events', 'none')
1321
+ .call((_) => {
1322
+ _.select('.domain').remove();
1323
+ _.selectAll('.tick').attr('class', 'color-text-50');
1324
+ if (!negative) {
1325
+ _.append('line')
1326
+ .attr('y1', 0)
1327
+ .attr('y2', this._height -
1328
+ this._options.bounds.top -
1329
+ this._options.bounds.bottom)
1330
+ .attr('transform', `translate(${0}, ${this._options.bounds.top})`)
1331
+ .style('stroke-width', 0.5)
1332
+ .style('stroke', 'var(--color-text-50)');
1333
+ }
1334
+ });
1335
+ }
1336
+ });
1337
+ }
1338
+ }
1339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50L2NoYXJ0L2NvcmUvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEVBQWUsWUFBWSxFQUFpQixNQUFNLElBQUksQ0FBQztBQUM5RCxPQUFPLEtBQUssWUFBWSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUs1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDeEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFLM0QsTUFBTSxPQUFPLFNBQVM7SUE4RHBCLFlBQVksT0FBcUIsRUFBRSxPQUFtQjtRQXREOUMsbUJBQWMsR0FBa0MsSUFBSSxPQUFPLEVBRWhFLENBQUM7UUFDSSxtQkFBYyxHQUFrQyxJQUFJLE9BQU8sRUFFaEUsQ0FBQztRQUVJLGdCQUFXLEdBQTJDLElBQUksT0FBTyxFQUV0RSxDQUFDO1FBRUksZUFBVSxH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O3dCQUNiLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDOzZCQUNiLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDOzZCQUNiLElBQUksQ0FDSCxJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU87NEJBQ1YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRzs0QkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUM5Qjs2QkFDQSxJQUFJLENBQ0gsV0FBVyxFQUNYLGFBQWEsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUMvQzs2QkFDQSxLQUFLLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQzs2QkFDMUIsS0FBSyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO3FCQUM1QztnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNOO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBEM1pvb21FdmVudCwgem9vbUlkZW50aXR5LCBab29tVHJhbnNmb3JtIH0gZnJvbSAnZDMnO1xuaW1wb3J0ICogYXMgZDNhbm5vdGF0aW9uIGZyb20gJ2QzLXN2Zy1hbm5vdGF0aW9uJztcbmltcG9ydCB7IFNjYWxlIH0gZnJvbSAnLi4vbW9kZWwvZW51bS9zY2FsZSc7XG5pbXBvcnQgeyBDaGFydE9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbC9jaGFydC1vcHRpb25zJztcbmltcG9ydCB7IEF4aXNPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWwvYXhpcy1vcHRpb25zJztcbmltcG9ydCB7IFNlcmllcyB9IGZyb20gJy4uL21vZGVsL3Nlcmllcyc7XG5pbXBvcnQgeyBCYXNlUG9pbnQgfSBmcm9tICcuLi9tb2RlbC9wb2ludC9iYXNlLXBvaW50JztcbmltcG9ydCB7IFNlcmllc1R5cGUgfSBmcm9tICcuLi9tb2RlbC9lbnVtL3Nlcmllcy10eXBlJztcbmltcG9ydCB7IGRlZmF1bHREcmF3ZXJNYXBwaW5nIH0gZnJvbSAnLi4vZHJhd2VyL2RlZmF1bHQtZHJhd2VyLW1hcHBpbmcnO1xuaW1wb3J0IHsgZGVmYXVsdExlZ2VuZERyYXdlck1hcHBpbmcgfSBmcm9tICcuLi9sZWdlbmQtZHJhd2VyL2RlZmF1bHQtZHJhd2VyLWxlZ2VuZC1tYXBwaW5nJztcbmltcG9ydCB7IExlZ2VuZFR5cGUgfSBmcm9tICcuLi9tb2RlbC9lbnVtL2xlZ2VuZC10eXBlJztcbmltcG9ydCB7IEF4aXMgfSBmcm9tICcuL2F4aXMtY3JlYXRvcic7XG5pbXBvcnQgeyBBeGlzVHlwZSB9IGZyb20gJy4uL21vZGVsL2VudW0vYXhpcy10eXBlJztcbmltcG9ydCB7IFBsb3RMaW5lIH0gZnJvbSAnLi4vbW9kZWwvcGxvdC1saW5lJztcbmltcG9ydCB7IFBsb3RCYW5kIH0gZnJvbSAnLi4vbW9kZWwvcGxvdC1iYW5kJztcbmltcG9ydCB7IFNjYWxlVHlwZSB9IGZyb20gJy4uL21vZGVsL2VudW0vc2NhbGUtdHlwZSc7XG5pbXBvcnQgeyBab29tVHlwZSB9IGZyb20gJy4uL21vZGVsL2VudW0vem9vbS10eXBlJztcbmltcG9ydCB7IElEcmFnRXZlbnQgfSBmcm9tICcuLi9tb2RlbC9pLWRyYWctZXZlbnQnO1xuaW1wb3J0IHsgRGlzcGF0Y2hUeXBlIH0gZnJvbSAnLi4vbW9kZWwvZW51bS9kaXNwYXRjaC10eXBlJztcbmltcG9ydCB7IElab29tRXZlbnQgfSBmcm9tICcuLi9tb2RlbC9pLXpvb20tZXZlbnQnO1xuXG50eXBlIENoYXJ0U2l6ZSA9IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfTtcblxuZXhwb3J0IGNsYXNzIFRldGFDaGFydCB7XG4gIHBsb3RMaW5lc01vdmU6IE9ic2VydmFibGU8SURyYWdFdmVudDxQbG90TGluZT4+O1xuICBwbG90QmFuZHNNb3ZlOiBPYnNlcnZhYmxlPElEcmFnRXZlbnQ8UGxvdEJhbmQ+PjtcblxuICB6b29tOiBPYnNlcnZhYmxlPElab29tRXZlbnQ+O1xuICBzZXJpZXNNb3ZlOiBPYnNlcnZhYmxlPElEcmFnRXZlbnQ8U2VyaWVzPEJhc2VQb2ludD4+PjtcbiAgcG9pbnRNb3ZlOiBPYnNlcnZhYmxlPElEcmFnRXZlbnQ8U2VyaWVzPEJhc2VQb2ludD4+PjtcblxuICBwcml2YXRlIHBsb3RMaW5lc01vdmUkOiBTdWJqZWN0PElEcmFnRXZlbnQ8UGxvdExpbmU+PiA9IG5ldyBTdWJqZWN0PFxuICAgIElEcmFnRXZlbnQ8UGxvdExpbmU+XG4gID4oKTtcbiAgcHJpdmF0ZSBwbG90QmFuZHNNb3ZlJDogU3ViamVjdDxJRHJhZ0V2ZW50PFBsb3RCYW5kPj4gPSBuZXcgU3ViamVjdDxcbiAgICBJRHJhZ0V2ZW50PFBsb3RCYW5kPlxuICA+KCk7XG5cbiAgcHJpdmF0ZSBzZXJpZXNNb3ZlJDogU3ViamVjdDxJRHJhZ0V2ZW50PFNlcmllczxCYXNlUG9pbnQ+Pj4gPSBuZXcgU3ViamVjdDxcbiAgICBJRHJhZ0V2ZW50PFNlcmllczxCYXNlUG9pbnQ+PlxuICA+KCk7XG5cbiAgcHJpdmF0ZSBwb2ludE1vdmUkOiBTdWJqZWN0PElEcmFnRXZlbnQ8U2VyaWVzPEJhc2VQb2ludD4+PiA9IG5ldyBTdWJqZWN0PFxuICAgIElEcmFnRXZlbnQ8U2VyaWVzPEJhc2VQb2ludD4+XG4gID4oKTtcblxuICBwcml2YXRlIHpvb20kOiBTdWJqZWN0PElab29tRXZlbnQ+ID0gbmV3IFN1YmplY3Q8SVpvb21FdmVudD4oKTtcblxuICBwcml2YXRlIF9jb250YWluZXI6IEVsZW1lbnRSZWYgPSBudWxsO1xuICBwcml2YXRlIF9jYW52YXM6IGFueTtcbiAgcHJpdmF0ZSBfd2lkdGggPSAwO1xuICBwcml2YXRlIF9oZWlnaHQgPSAwO1xuXG4gIHByaXZhdGUgX3pvb21ZQ2FjaGU6IE1hcDxudW1iZXIsIFpvb21UcmFuc2Zvcm0+ID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgWm9vbVRyYW5zZm9ybVxuICA+KCk7XG5cbiAgcHJpdmF0ZSBfem9vbVhDYWNoZTogTWFwPG51bWJlciwgWm9vbVRyYW5zZm9ybT4gPSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICBab29tVHJhbnNmb3JtXG4gID4oKTtcblxuICBwcml2YXRlIF96b29tID0gZDMuem9vbSgpO1xuICBwcml2YXRlIF9jb21tb25ab29tVHJhbnNmb3JtOiBab29tVHJhbnNmb3JtO1xuXG4gIHByaXZhdGUgdmlzaWJsZUNoYXJ0V2luZG93V2lkdGggPSAwO1xuXG4gIHByaXZhdGUgX29wdGlvbnM6IENoYXJ0T3B0aW9ucztcbiAgcHJpdmF0ZSBfeEF4aXNMaXN0OiBBeGlzW107XG4gIHByaXZhdGUgX3lBeGlzTGlzdDogQXhpc1tdO1xuICBwcml2YXRlIF94U2NhbGVzOiBNYXA8bnVtYmVyLCBhbnk+ID0gbmV3IE1hcDxudW1iZXIsIGFueT4oKTtcbiAgcHJpdmF0ZSBfeVNjYWxlczogTWFwPG51bWJlciwgYW55PiA9IG5ldyBNYXA8bnVtYmVyLCBhbnk+KCk7XG5cbiAgcHJpdmF0ZSBfY2xvbmVkWCA9IG5ldyBNYXA8bnVtYmVyLCBhbnk+KCk7XG4gIHByaXZhdGUgX2Nsb25lZFkgPSBuZXcgTWFwPG51bWJlciwgYW55PigpO1xuXG4gIHByaXZhdGUgX2NoYXJ0OiBkMy5TZWxlY3Rpb248YW55LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+O1xuXG4gIHByaXZhdGUgb2Zmc2V0T3Bwb3NpdGUgPSAwO1xuICBwcml2YXRlIG9mZnNldE5vbk9wcG9zaXRlID0gMDtcblxuICBwcml2YXRlIHVuaXFJZDogc3RyaW5nO1xuICBwcml2YXRlIF96b29tQWRkZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDaGFydE9wdGlvbnMsIGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnNlbGVjdE5vZGUoZWxlbWVudCk7XG4gICAgdGhpcy5jcmVhdGVUb29sdGlwKCk7XG5cbiAgICB0aGlzLnBsb3RMaW5lc01vdmUgPSB0aGlzLnBsb3RMaW5lc01vdmUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMucGxvdEJhbmRzTW92ZSA9IHRoaXMucGxvdEJhbmRzTW92ZSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5zZXJpZXNNb3ZlID0gdGhpcy5zZXJpZXNNb3ZlJC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnBvaW50TW92ZSA9IHRoaXMucG9pbnRNb3ZlJC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnpvb20gPSB0aGlzLnpvb20kLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIHJlZHJhdyhvcHRpb25zPzogQ2hhcnRPcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cblxuICAgIHRoaXMuY3JlYXRlQXhpcygpO1xuICAgIHRoaXMuY3JlYXRlU2NhbGVzKCk7XG4gICAgdGhpcy5jcmVhdGVNYXJrZXJzKCk7XG4gICAgdGhpcy5jcmVhdGVWaXNpYmxlV2luZG93KCk7XG4gICAgdGhpcy5fcmVkcmF3KCk7XG4gICAgdGhpcy5kcmF3TGVnZW5kKCk7XG5cbiAgICBpZiAodGhpcy5fY29tbW9uWm9vbVRyYW5zZm9ybSkge1xuICAgICAgdGhpcy5fY2hhcnQuY2FsbCh0aGlzLl96b29tLnRyYW5zZm9ybSwgdGhpcy5fY29tbW9uWm9vbVRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl96b29tQWRkZWQpIHtcbiAgICAgIHRoaXMuYWRkWm9vbSgpO1xuICAgICAgdGhpcy5fem9vbUFkZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZEF4ZXNab29tKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9vbSh6b29tOiBJWm9vbUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl96b29tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NoYXJ0LmNhbGwodGhpcy5fem9vbS50cmFuc2Zvcm0sIHpvb20/Lnpvb21UcmFuc2Zvcm0gPz8gem9vbUlkZW50aXR5KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTaXplKHNpemU6IENoYXJ0U2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9KSB7XG4gICAgdGhpcy5faGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XG4gICAgdGhpcy5fd2lkdGggPSBzaXplLndpZHRoO1xuXG4gICAgdGhpcy5fY2hhcnQuYXR0cignd2lkdGgnLCB0aGlzLl93aWR0aCkuYXR0cignaGVpZ2h0JywgdGhpcy5faGVpZ2h0KTtcbiAgICB0aGlzLl9jYW52YXMuYXR0cignd2lkdGgnLCB0aGlzLl93aWR0aCkuYXR0cignaGVpZ2h0JywgdGhpcy5faGVpZ2h0KTtcblxuICAgIGNvbnN0IGV4dGVudCA9IFtcbiAgICAgIFtcbiAgICAgICAgdGhpcy5vZmZzZXROb25PcHBvc2l0ZVxuICAgICAgICAgID8gdGhpcy5vZmZzZXROb25PcHBvc2l0ZVxuICAgICAgICAgIDogdGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdCxcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgdGhpcy5fd2lkdGggLVxuICAgICAgICAgICh0aGlzLm9mZnNldE9wcG9zaXRlXG4gICAgICAgICAgICA/IHRoaXMub2Zmc2V0T3Bwb3NpdGVcbiAgICAgICAgICAgIDogdGhpcy5fb3B0aW9ucy5ib3VuZHMucmlnaHQpLFxuICAgICAgICB0aGlzLl9oZWlnaHQgLSB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b20sXG4gICAgICBdLFxuICAgIF0gYXMgYW55O1xuXG4gICAgdGhpcy5fem9vbVxuICAgICAgLnNjYWxlRXh0ZW50KFsxLCBJbmZpbml0eV0pXG4gICAgICAudHJhbnNsYXRlRXh0ZW50KGV4dGVudClcbiAgICAgIC5leHRlbnQoZXh0ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVmlzaWJsZVdpbmRvdygpIHtcbiAgICB0aGlzLnVuaXFJZCA9IChEYXRlLm5vdygpICsgTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMzYpO1xuXG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0QWxsKCdkZWZzJykucmVtb3ZlKCk7XG5cbiAgICB0aGlzLl9jaGFydFxuICAgICAgLmFwcGVuZCgnZGVmcycpXG4gICAgICAuYXBwZW5kKCdjbGlwUGF0aCcpXG4gICAgICAuYXR0cignaWQnLCBgZHJhdy13aW5kb3ctJHt0aGlzLnVuaXFJZH1gKVxuICAgICAgLmFwcGVuZCgncmVjdCcpXG4gICAgICAuYXR0cihcbiAgICAgICAgJ3gnLFxuICAgICAgICB0aGlzLm9mZnNldE5vbk9wcG9zaXRlID09PSAwXG4gICAgICAgICAgPyB0aGlzLl9vcHRpb25zLmJvdW5kcy5sZWZ0XG4gICAgICAgICAgOiB0aGlzLm9mZnNldE5vbk9wcG9zaXRlXG4gICAgICApXG4gICAgICAuYXR0cigneScsIHRoaXMuX29wdGlvbnMuYm91bmRzLnRvcClcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMudmlzaWJsZUNoYXJ0V2luZG93V2lkdGggKyAxKVxuICAgICAgLmF0dHIoXG4gICAgICAgICdoZWlnaHQnLFxuICAgICAgICB0aGlzLl9oZWlnaHQgLVxuICAgICAgICAgIHRoaXMuX29wdGlvbnMuYm91bmRzLmJvdHRvbSAtXG4gICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wICtcbiAgICAgICAgICAxID5cbiAgICAgICAgICAwXG4gICAgICAgICAgPyB0aGlzLl9oZWlnaHQgLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b20gLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy50b3AgK1xuICAgICAgICAgICAgICAxXG4gICAgICAgICAgOiAwXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBeGlzKCkge1xuICAgIHRoaXMuX3hBeGlzTGlzdCA9IHRoaXMuX29wdGlvbnMueEF4aXMubWFwKFxuICAgICAgKF8sIGluZGV4KSA9PlxuICAgICAgICBuZXcgQXhpcyh7XG4gICAgICAgICAgdHlwZTogQXhpc1R5cGUuYWJzY2lzc2EsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgY2hhcnRPcHRpb25zOiB0aGlzLl9vcHRpb25zLFxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLl95QXhpc0xpc3QgPSB0aGlzLl9vcHRpb25zLnlBeGlzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGF4aXMgPSBuZXcgQXhpcyh7XG4gICAgICAgIHR5cGU6IEF4aXNUeXBlLm9yZGluYXR1cyxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIGNoYXJ0T3B0aW9uczogdGhpcy5fb3B0aW9ucyxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBheGlzO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgbm9uVGl0bGVPZmZzZXQgPSA2O1xuXG4gICAgdGhpcy5vZmZzZXROb25PcHBvc2l0ZSA9IGQzLnJlZHVjZShcbiAgICAgIHRoaXMuX3lBeGlzTGlzdC5maWx0ZXIoXG4gICAgICAgIChfKSA9PiBfLm9wdGlvbnM/Lm9wcG9zaXRlICE9PSB0cnVlICYmIF8ub3B0aW9ucz8udmlzaWJsZVxuICAgICAgKSxcbiAgICAgIChzdW0sIGF4aXMpID0+IHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgICAgICBzdW0gK1xuICAgICAgICAgIGF4aXMud2lkdGggK1xuICAgICAgICAgIChheGlzPy5vcHRpb25zPy50aXRsZSA/IEF4aXMub2Zmc2V0RmFjdG9yIDogbm9uVGl0bGVPZmZzZXQpO1xuICAgICAgICBheGlzLnNldE9mZnNldChvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgfSxcbiAgICAgIDBcbiAgICApO1xuXG4gICAgdGhpcy5vZmZzZXRPcHBvc2l0ZSA9IGQzLnJlZHVjZShcbiAgICAgIHRoaXMuX3lBeGlzTGlzdC5maWx0ZXIoXG4gICAgICAgIChfKSA9PiBfLm9wdGlvbnM/Lm9wcG9zaXRlID09PSB0cnVlICYmIF8ub3B0aW9ucz8udmlzaWJsZVxuICAgICAgKSxcbiAgICAgIChzdW0sIGF4aXMpID0+IHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgICAgICBzdW0gK1xuICAgICAgICAgIGF4aXMud2lkdGggK1xuICAgICAgICAgIChheGlzPy5vcHRpb25zPy50aXRsZSA/IEF4aXMub2Zmc2V0RmFjdG9yIDogbm9uVGl0bGVPZmZzZXQpO1xuICAgICAgICBheGlzLnNldE9mZnNldChvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgfSxcbiAgICAgIDBcbiAgICApO1xuXG4gICAgdGhpcy52aXNpYmxlQ2hhcnRXaW5kb3dXaWR0aCA9IHRoaXMuY2FsdWNsYXRlQ2hhcnRXaWR0aCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVkcmF3KCkge1xuICAgIHRoaXMuZHJhd1Bsb3RCYW5kcygpO1xuICAgIHRoaXMuZHJhd1Bsb3RMaW5lcygpO1xuXG4gICAgdGhpcy5kcmF3Q2hhcnQoKTtcbiAgICB0aGlzLmRyYXdBeGlzKCk7XG4gICAgdGhpcy5kcmF3R3JpZExpbmVzKCk7XG5cbiAgICB0aGlzLmRyYXdBbm5vdGF0aW9ucygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRab29tKCkge1xuICAgIGlmICh0aGlzLl9vcHRpb25zPy56b29tPy5lbmFibGUpIHtcbiAgICAgIGNvbnN0IGhhc1hab29tID0gW1pvb21UeXBlLngsIFpvb21UeXBlLnh5XS5pbmNsdWRlcyhcbiAgICAgICAgdGhpcy5fb3B0aW9ucy56b29tLnpvb21UeXBlXG4gICAgICApO1xuICAgICAgY29uc3QgaGFzWVpvb20gPSBbWm9vbVR5cGUueSwgWm9vbVR5cGUueHldLmluY2x1ZGVzKFxuICAgICAgICB0aGlzLl9vcHRpb25zLnpvb20uem9vbVR5cGVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX2NoYXJ0LmNhbGwoXG4gICAgICAgIHRoaXMuX3pvb20ub24oJ3N0YXJ0IGVuZCB6b29tJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGhhc1hab29tKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9jbG9uZWRYLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICBjb25zdCByZXNjYWxlZCA9IGV2ZW50LnRyYW5zZm9ybS5yZXNjYWxlWCh2YWx1ZSk7XG4gICAgICAgICAgICAgIHRoaXMuX3hTY2FsZXMuc2V0KGtleSwgcmVzY2FsZWQpO1xuXG4gICAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2VFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuem9vbSQubmV4dCh7XG4gICAgICAgICAgICAgICAgICBkb21haW46IHJlc2NhbGVkLmRvbWFpbigpLFxuICAgICAgICAgICAgICAgICAgem9vbVRyYW5zZm9ybTogZXZlbnQudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgem9vbVR5cGU6IFpvb21UeXBlLngsXG4gICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNZWm9vbSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fY2xvbmVkWS5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzY2FsZWQgPSBldmVudC50cmFuc2Zvcm0ucmVzY2FsZVkodmFsdWUpO1xuICAgICAgICAgICAgICB0aGlzLl95U2NhbGVzLnNldChrZXksIHJlc2NhbGVkKTtcblxuICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3pvb20nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnpvb20kLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBkb21haW46IHJlc2NhbGVkLmRvbWFpbigpLFxuICAgICAgICAgICAgICAgICAgICB6b29tVHJhbnNmb3JtOiBldmVudC50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgIHpvb21UeXBlOiBab29tVHlwZS55LFxuICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudC50eXBlID09PSAnZW5kJykge1xuICAgICAgICAgICAgdGhpcy5fY29tbW9uWm9vbVRyYW5zZm9ybSA9IGV2ZW50LnRyYW5zZm9ybTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9yZWRyYXcoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRBeGVzWm9vbSgpIHtcbiAgICB0aGlzLl9jaGFydC5zZWxlY3RBbGwoJy56b29tLWJlaGF2aW9yJykucmVtb3ZlKCk7XG5cbiAgICBbLi4udGhpcy5feUF4aXNMaXN0LCAuLi50aGlzLl94QXhpc0xpc3RdXG4gICAgICAuZmlsdGVyKChheGlzKSA9PiBheGlzLm9wdGlvbnMudmlzaWJsZSAmJiBheGlzLm9wdGlvbnMuem9vbSlcbiAgICAgIC5mb3JFYWNoKChheGlzKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvdW5kTm9kZSA9IHRoaXMuX2NoYXJ0XG4gICAgICAgICAgLnNlbGVjdChcbiAgICAgICAgICAgIGBbZGF0YS0ke2F4aXMudHlwZSA9PT0gQXhpc1R5cGUuYWJzY2lzc2EgPyAneCcgOiAneSd9LXNjYWxlLWlkPScke1xuICAgICAgICAgICAgICBheGlzLmluZGV4XG4gICAgICAgICAgICB9J11gXG4gICAgICAgICAgKVxuICAgICAgICAgIC5ub2RlKCkgYXMgYW55O1xuXG4gICAgICAgIGlmICghZm91bmROb2RlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYkJveCA9IGZvdW5kTm9kZS5nZXRCQm94KCk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlWCA9XG4gICAgICAgICAgYXhpcy50eXBlID09PSBBeGlzVHlwZS5hYnNjaXNzYVxuICAgICAgICAgICAgPyB0aGlzLm9mZnNldE5vbk9wcG9zaXRlXG4gICAgICAgICAgICAgID8gdGhpcy5vZmZzZXROb25PcHBvc2l0ZVxuICAgICAgICAgICAgICA6IHRoaXMuX29wdGlvbnMuYm91bmRzLmxlZnQgKyB0aGlzLm9mZnNldE5vbk9wcG9zaXRlXG4gICAgICAgICAgICA6IGF4aXMub3B0aW9ucy5vcHBvc2l0ZVxuICAgICAgICAgICAgPyB0aGlzLl93aWR0aCAtIGF4aXMub2Zmc2V0XG4gICAgICAgICAgICA6IGF4aXMub2Zmc2V0IC0gYkJveC53aWR0aDtcblxuICAgICAgICBjb25zdCB6b29tID0gZDNcbiAgICAgICAgICAuem9vbSgpXG4gICAgICAgICAgLnNjYWxlRXh0ZW50KFsxLCBJbmZpbml0eV0pXG4gICAgICAgICAgLm9uKCd6b29tIGVuZCcsIChldmVudDogRDNab29tRXZlbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgICAgICAgICBpZiAoYXhpcy50eXBlID09PSBBeGlzVHlwZS5hYnNjaXNzYSkge1xuICAgICAgICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX2Nsb25lZFguZ2V0KGF4aXMuaW5kZXgpO1xuICAgICAgICAgICAgICB0aGlzLl94U2NhbGVzLnNldChheGlzLmluZGV4LCBldmVudC50cmFuc2Zvcm0ucmVzY2FsZVgoc2NhbGUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5fY2xvbmVkWS5nZXQoYXhpcy5pbmRleCk7XG4gICAgICAgICAgICAgIHRoaXMuX3lTY2FsZXMuc2V0KGF4aXMuaW5kZXgsIGV2ZW50LnRyYW5zZm9ybS5yZXNjYWxlWShzY2FsZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgaWYgKGF4aXMudHlwZSA9PT0gQXhpc1R5cGUub3JkaW5hdHVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fem9vbVlDYWNoZS5zZXQoYXhpcy5pbmRleCwgZXZlbnQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChheGlzLnR5cGUgPT09IEF4aXNUeXBlLmFic2Npc3NhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fem9vbVhDYWNoZS5zZXQoYXhpcy5pbmRleCwgZXZlbnQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFydC5jYWxsKHRoaXMuX3pvb20udHJhbnNmb3JtLCBldmVudC50cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3JlZHJhdygpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3RvcmVkVHJhbnNmb3JtOiBab29tVHJhbnNmb3JtID1cbiAgICAgICAgICBheGlzLnR5cGUgPT09IEF4aXNUeXBlLm9yZGluYXR1c1xuICAgICAgICAgICAgPyB0aGlzLl96b29tWUNhY2hlLmdldChheGlzLmluZGV4KVxuICAgICAgICAgICAgOiB0aGlzLl96b29tWENhY2hlLmdldChheGlzLmluZGV4KTtcblxuICAgICAgICB0aGlzLl9jaGFydFxuICAgICAgICAgIC5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICd6b29tLWJlaGF2aW9yJylcbiAgICAgICAgICAuYXR0cignaGVpZ2h0JywgYkJveC5oZWlnaHQpXG4gICAgICAgICAgLmF0dHIoJ3dpZHRoJywgYkJveC53aWR0aClcbiAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9LCAke1xuICAgICAgICAgICAgICBheGlzLnR5cGUgPT09IEF4aXNUeXBlLmFic2Npc3NhXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9oZWlnaHQgLSB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b21cbiAgICAgICAgICAgICAgICA6IHRoaXMuX29wdGlvbnMuYm91bmRzLnRvcFxuICAgICAgICAgICAgfSlgXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwJylcbiAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpXG4gICAgICAgICAgLmNhbGwoem9vbS50cmFuc2Zvcm0sIHJlc3RvcmVkVHJhbnNmb3JtID8/IGQzLnpvb21JZGVudGl0eSlcbiAgICAgICAgICAuY2FsbCh6b29tKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3ROb2RlKGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICB0aGlzLl9jb250YWluZXIgPSBlbGVtZW50O1xuXG4gICAgZDMuc2VsZWN0KGVsZW1lbnQubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCcudG9vbHRpcC1jaGFydCcpLnJlbW92ZSgpO1xuXG4gICAgZDMuc2VsZWN0KGVsZW1lbnQubmF0aXZlRWxlbWVudCkuc2VsZWN0QWxsKCdzdmcnKS5yZW1vdmUoKTtcbiAgICBkMy5zZWxlY3QoZWxlbWVudC5uYXRpdmVFbGVtZW50KS5zZWxlY3RBbGwoJ2NhbnZhcycpLnJlbW92ZSgpO1xuXG4gICAgdGhpcy5fY2hhcnQgPSBkM1xuICAgICAgLnNlbGVjdChlbGVtZW50Lm5hdGl2ZUVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJylcbiAgICAgIC5zdHlsZSgnei1pbmRleCcsIDApO1xuXG4gICAgdGhpcy5fY2FudmFzID0gZDNcbiAgICAgIC5zZWxlY3QoZWxlbWVudC5uYXRpdmVFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnY2FudmFzJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdtYWluLWNhbnZhcycpXG4gICAgICAuc3R5bGUoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMzUsIDApJylcbiAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgLnN0eWxlKCd6LWluZGV4JywgMSk7XG4gIH1cblxuICBwcml2YXRlIGRyYXdBbm5vdGF0aW9ucygpIHtcbiAgICB0aGlzLl9jaGFydC5zZWxlY3RBbGwoJy5hbm5vdGF0aW9ucycpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSB0aGlzLl9vcHRpb25zLmFubm90YXRpb25zPy5tYXAoKGFubm90YXRpb24pID0+IHtcbiAgICAgIGNvbnN0IHggPSB0aGlzLl94U2NhbGVzLmdldChhbm5vdGF0aW9uLnhBeGlzSW5kZXgpO1xuICAgICAgY29uc3QgeSA9IHRoaXMuX3lTY2FsZXMuZ2V0KGFubm90YXRpb24ueUF4aXNJbmRleCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vdGU6IGFubm90YXRpb24ubm90ZSxcbiAgICAgICAgY29ubmVjdG9yOiBhbm5vdGF0aW9uLmNvbm5lY3RvcixcbiAgICAgICAgeDogeChhbm5vdGF0aW9uLnBvaW50Py54KSxcbiAgICAgICAgeTogeShhbm5vdGF0aW9uLnBvaW50Py55KSxcbiAgICAgICAgZHg6IGFubm90YXRpb24uZHgsXG4gICAgICAgIGR5OiBhbm5vdGF0aW9uLmR5LFxuICAgICAgICB0eXBlOiBhbm5vdGF0aW9uLnR5cGUsXG4gICAgICAgIGNsYXNzTmFtZTogYW5ub3RhdGlvbi5jbGFzc05hbWUsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgbWFrZUFubm90YXRpb25zID0gZDNhbm5vdGF0aW9uXG4gICAgICAuYW5ub3RhdGlvbigpXG4gICAgICAuYW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMgPz8gW10pO1xuXG4gICAgdGhpcy5fY2hhcnRcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2Fubm90YXRpb25zJylcbiAgICAgIC5hdHRyKCdjbGlwLXBhdGgnLCBgdXJsKCNkcmF3LXdpbmRvdy0ke3RoaXMudW5pcUlkfSlgKVxuICAgICAgLmNhbGwobWFrZUFubm90YXRpb25zIGFzIGFueSlcbiAgICAgIC5sb3dlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3UGxvdExpbmVzKCkge1xuICAgIHRoaXMuX2NoYXJ0LnNlbGVjdEFsbCgnLnBsb3RsaW5lcycpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgcGxvdGxpbmVHcm91cCA9IHRoaXMuX2NoYXJ0XG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdwbG90bGluZXMnKVxuICAgICAgLnN0eWxlKCdzaGFwZS1yZW5kZXJpbmcnLCAnY3Jpc3BFZGdlcycpXG4gICAgICAuYXR0cignY2xpcC1wYXRoJywgYHVybCgjZHJhdy13aW5kb3ctJHt0aGlzLnVuaXFJZH0pYCk7XG5cbiAgICB0aGlzLl94QXhpc0xpc3RcbiAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy5wbG90TGluZXMubGVuZ3RoID4gMClcbiAgICAgIC5mb3JFYWNoKChheGlzKSA9PiB7XG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBheGlzLmV4dGVudDtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMuX3hTY2FsZXMuZ2V0KGF4aXMuaW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IHBsb3RsaW5lc1BvaW50cyA9IGF4aXMub3B0aW9ucy5wbG90TGluZXM7XG5cbiAgICAgICAgY29uc3QgZ2V0VGV4dENlbnRlclBvaW50UHggPSAoZDogUGxvdExpbmUsIGlkeDogbnVtYmVyKSA9PlxuICAgICAgICAgIHgoXG4gICAgICAgICAgICAoZD8udmFsdWUgK1xuICAgICAgICAgICAgICAocGxvdGxpbmVzUG9pbnRzW2lkeCAtIDFdXG4gICAgICAgICAgICAgICAgPyBwbG90bGluZXNQb2ludHNbaWR4IC0gMV0/LnZhbHVlXG4gICAgICAgICAgICAgICAgOiAwKSkgL1xuICAgICAgICAgICAgICAyXG4gICAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBvcGFjaXR5ID0gKGQ6IFBsb3RMaW5lLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXlXaWR0aCA9IDIwO1xuXG4gICAgICAgICAgY29uc3Qgd2lkdGggPVxuICAgICAgICAgICAgeChkPy52YWx1ZSkgLVxuICAgICAgICAgICAgeChwbG90bGluZXNQb2ludHNbaWR4IC0gMV0gPyBwbG90bGluZXNQb2ludHNbaWR4IC0gMV0/LnZhbHVlIDogMCk7XG4gICAgICAgICAgcmV0dXJuIHdpZHRoIDw9IGRpc3BsYXlXaWR0aCA/IDAgOiAxO1xuICAgICAgICB9O1xuXG4gICAgICAgIHBsb3RsaW5lR3JvdXBcbiAgICAgICAgICAuc2VsZWN0QWxsKCcubGFiZWwnKVxuICAgICAgICAgIC5kYXRhKHBsb3RsaW5lc1BvaW50cylcbiAgICAgICAgICAuam9pbigndGV4dCcpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xhYmVsIGZvbnQtYm9keS0zIGZpbGwtdGV4dC03MCcpXG4gICAgICAgICAgLmF0dHIoJ3gnLCBnZXRUZXh0Q2VudGVyUG9pbnRQeClcbiAgICAgICAgICAuYXR0cigneScsIChkKSA9PiB0aGlzLl9oZWlnaHQgLyAyKVxuICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAgIC5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdjZW50cmFsJylcbiAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgKGQsIGlkeCkgPT5cbiAgICAgICAgICAgICAgYHJvdGF0ZSgtOTAsICR7Z2V0VGV4dENlbnRlclBvaW50UHgoZCwgaWR4KX0sICR7XG4gICAgICAgICAgICAgICAgdGhpcy5faGVpZ2h0IC8gMlxuICAgICAgICAgICAgICB9KWBcbiAgICAgICAgICApXG4gICAgICAgICAgLnRleHQoKGQpID0+IGQ/LmxhYmVsID8/ICcnKVxuICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIG9wYWNpdHkpO1xuXG4gICAgICAgIHBsb3RsaW5lR3JvdXBcbiAgICAgICAgICAuc2VsZWN0QWxsKCcucGxvdGxpbmUnKVxuICAgICAgICAgIC5kYXRhKHBsb3RsaW5lc1BvaW50cylcbiAgICAgICAgICAuam9pbignbGluZScpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3Bsb3RsaW5lJylcbiAgICAgICAgICAuYXR0cignZGF0YS1wbG90bGluZS1pZCcsIChkKSA9PiBkLmlkKVxuICAgICAgICAgIC5hdHRyKCd4MScsIChkKSA9PiB4KGQudmFsdWUpKVxuICAgICAgICAgIC5hdHRyKCd4MicsIChkKSA9PiB4KGQudmFsdWUpKVxuICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAneTInLFxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0IC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wIC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMuYm90dG9tXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7dGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wfSlgKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgKGQpID0+IGQud2lkdGgpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAoZCkgPT4gZC5jb2xvcilcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAoZCkgPT4gKGQuZGFzaGVkID8gJzgsIDgnIDogJzAsIDAnKSk7XG5cbiAgICAgICAgY29uc3QgZW1pdCA9IChldmVudDogRHJhZ0V2ZW50LCBwbG90TGluZTogUGxvdExpbmUpID0+IHtcbiAgICAgICAgICB0aGlzLnBsb3RMaW5lc01vdmUkLm5leHQoeyBldmVudCwgdGFyZ2V0OiBwbG90TGluZSB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBwbG90bGluZUdyb3VwXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLmRyYWctcGxvdGxpbmUnKVxuICAgICAgICAgIC5kYXRhKHBsb3RsaW5lc1BvaW50cylcbiAgICAgICAgICAuam9pbignbGluZScpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RyYWctcGxvdGxpbmUnKVxuICAgICAgICAgIC5hdHRyKCd4MScsIChkKSA9PiB4KGQudmFsdWUpKVxuICAgICAgICAgIC5hdHRyKCd4MicsIChkKSA9PiB4KGQudmFsdWUpKVxuICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAneTInLFxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0IC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wIC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMuYm90dG9tXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7dGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wfSlgKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgOClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdyZ2JhKDAsIDAsIDAsIDApJylcbiAgICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdjb2wtcmVzaXplJylcbiAgICAgICAgICAuY2FsbChcbiAgICAgICAgICAgIGQzXG4gICAgICAgICAgICAgIC5kcmFnKClcbiAgICAgICAgICAgICAgLm9uKCdkcmFnJywgZnVuY3Rpb24gKGV2ZW50LCBkOiBQbG90TGluZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gZDMuc2VsZWN0KHRoaXMpLm5vZGUoKS5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dlZFBsb3RMaW5lID0gZDNcbiAgICAgICAgICAgICAgICAgIC5zZWxlY3QoZ3JvdXApXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0KGBbZGF0YS1wbG90bGluZS1pZD0nJHtkLmlkfSddYCk7XG5cbiAgICAgICAgICAgICAgICBkLnZhbHVlID0geC5pbnZlcnQoZXZlbnQueCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtaW5WYWx1ZSA9IGQubWluID8/IG1pbjtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IGQubWF4ID8/IG1heDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlckxlZnRSZWFjaGVkID0gZC52YWx1ZSA8PSBtaW5WYWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJSaWdodFJlYWNoZWQgPSBkLnZhbHVlID49IG1heFZhbHVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJvcmRlckxlZnRSZWFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICBkLnZhbHVlID0gbWluVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGJvcmRlclJpZ2h0UmVhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgZC52YWx1ZSA9IG1heFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5hdHRyKCd4MScsIHgoZC52YWx1ZSkpLmF0dHIoJ3gyJywgeChkLnZhbHVlKSk7XG5cbiAgICAgICAgICAgICAgICBkcmFnZ2VkUGxvdExpbmUuYXR0cigneDEnLCB4KGQudmFsdWUpKS5hdHRyKCd4MicsIHgoZC52YWx1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZW1pdChldmVudCwgZCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5vbignZW5kJywgKGV2ZW50OiBEcmFnRXZlbnQsIGQ6IFBsb3RMaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgZW1pdChldmVudCwgZCk7XG4gICAgICAgICAgICAgIH0pIGFzIGFueVxuICAgICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX3lBeGlzTGlzdFxuICAgICAgLmZpbHRlcigoXykgPT4gXy5vcHRpb25zLnBsb3RMaW5lcy5sZW5ndGggPiAwKVxuICAgICAgLmZvckVhY2goKGF4aXMpID0+IHtcbiAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGF4aXMuZXh0ZW50O1xuICAgICAgICBjb25zdCB5ID0gdGhpcy5feVNjYWxlcy5nZXQoYXhpcy5pbmRleCk7XG5cbiAgICAgICAgY29uc3QgcGxvdGxpbmVzUG9pbnRzID0gYXhpcy5vcHRpb25zLnBsb3RMaW5lcztcblxuICAgICAgICBwbG90bGluZUdyb3VwXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLnBsb3RsaW5lJylcbiAgICAgICAgICAuZGF0YShwbG90bGluZXNQb2ludHMpXG4gICAgICAgICAgLmpvaW4oJ2xpbmUnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdwbG90bGluZScpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEtcGxvdGxpbmUtaWQnLCAoZCkgPT4gZC5pZClcbiAgICAgICAgICAuYXR0cigneTEnLCAoZCkgPT4geShkLnZhbHVlKSlcbiAgICAgICAgICAuYXR0cigneTInLCAoZCkgPT4geShkLnZhbHVlKSlcbiAgICAgICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgJ3gyJyxcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoIC0gdGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdCAtIHRoaXMuX29wdGlvbnMuYm91bmRzLnJpZ2h0XG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdH0sIDApYClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIChkKSA9PiBkLndpZHRoKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgKGQpID0+IGQuY29sb3IpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgKGQpID0+IChkLmRhc2hlZCA/ICc4LCA4JyA6ICcwLCAwJykpO1xuXG4gICAgICAgIGNvbnN0IGVtaXQgPSAoZXZlbnQ6IERyYWdFdmVudCwgcGxvdExpbmU6IFBsb3RMaW5lKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbG90TGluZXNNb3ZlJC5uZXh0KHsgZXZlbnQsIHRhcmdldDogcGxvdExpbmUgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcGxvdGxpbmVHcm91cFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5kcmFnLXBsb3RsaW5lJylcbiAgICAgICAgICAuZGF0YShwbG90bGluZXNQb2ludHMpXG4gICAgICAgICAgLmpvaW4oJ2xpbmUnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdkcmFnLXBsb3RsaW5lJylcbiAgICAgICAgICAuYXR0cigneTEnLCAoZCkgPT4geShkLnZhbHVlKSlcbiAgICAgICAgICAuYXR0cigneTInLCAoZCkgPT4geShkLnZhbHVlKSlcbiAgICAgICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgJ3gyJyxcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoIC0gdGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdCAtIHRoaXMuX29wdGlvbnMuYm91bmRzLnJpZ2h0XG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdH0sIDApYClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDgpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAncmdiYSgwLCAwLCAwLCAwKScpXG4gICAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncm93LXJlc2l6ZScpXG4gICAgICAgICAgLmNhbGwoXG4gICAgICAgICAgICBkM1xuICAgICAgICAgICAgICAuZHJhZygpXG4gICAgICAgICAgICAgIC5vbignZHJhZycsIGZ1bmN0aW9uIChldmVudCwgZDogUGxvdExpbmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGQzLnNlbGVjdCh0aGlzKS5ub2RlKCkucGFyZW50RWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdnZWRQbG90TGluZSA9IGQzXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0KGdyb3VwKVxuICAgICAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtcGxvdGxpbmUtaWQ9JyR7ZC5pZH0nXWApO1xuXG4gICAgICAgICAgICAgICAgZC52YWx1ZSA9IHkuaW52ZXJ0KGV2ZW50LnkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWluVmFsdWUgPSBkLm1pbiA/PyBtaW47XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4VmFsdWUgPSBkLm1heCA/PyBtYXg7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJUb3BSZWFjaGVkID0gZC52YWx1ZSA8PSBtaW5WYWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJCb3R0b21SZWFjaGVkID0gZC52YWx1ZSA+PSBtYXhWYWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChib3JkZXJUb3BSZWFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICBkLnZhbHVlID0gbWluVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGJvcmRlckJvdHRvbVJlYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgIGQudmFsdWUgPSBtYXhWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuYXR0cigneTEnLCB5KGQudmFsdWUpKS5hdHRyKCd5MicsIHkoZC52YWx1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZHJhZ2dlZFBsb3RMaW5lLmF0dHIoJ3kxJywgeShkLnZhbHVlKSkuYXR0cigneTInLCB5KGQudmFsdWUpKTtcblxuICAgICAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAub24oJ2VuZCcsIChldmVudDogRHJhZ0V2ZW50LCBkOiBQbG90TGluZSkgPT4ge1xuICAgICAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgICAgICB9KSBhcyBhbnlcbiAgICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRyYXdQbG90QmFuZHMoKSB7XG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0QWxsKCcucGxvdGJhbmRzJykucmVtb3ZlKCk7XG5cbiAgICBjb25zdCBwbG90QmFuZEdyb3VwID0gdGhpcy5fY2hhcnRcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3Bsb3RiYW5kcycpXG4gICAgICAuYXR0cignY2xpcC1wYXRoJywgYHVybCgjZHJhdy13aW5kb3ctJHt0aGlzLnVuaXFJZH0pYCk7XG5cbiAgICB0aGlzLl94QXhpc0xpc3RcbiAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy5wbG90QmFuZHMubGVuZ3RoID4gMClcbiAgICAgIC5mb3JFYWNoKChheGlzKSA9PiB7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLl94U2NhbGVzLmdldChheGlzLmluZGV4KTtcblxuICAgICAgICBjb25zdCBbbWluLCBtYXhdID0gYXhpcy5leHRlbnQ7XG5cbiAgICAgICAgY29uc3QgcGxvdGJhbmQgPSBwbG90QmFuZEdyb3VwXG4gICAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgICAgLnN0eWxlKCdzaGFwZS1yZW5kZXJpbmcnLCAnY3Jpc3BFZGdlcycpO1xuXG4gICAgICAgIGNvbnN0IHBsb3RCYW5kSGVpZ2h0ID1cbiAgICAgICAgICB0aGlzLl9oZWlnaHQgLSB0aGlzLl9vcHRpb25zLmJvdW5kcy50b3AgLSB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b207XG5cbiAgICAgICAgY29uc3QgZW1pdCA9IChldmVudDogRHJhZ0V2ZW50LCBwbG90QmFuZDogUGxvdEJhbmQpID0+IHtcbiAgICAgICAgICB0aGlzLnBsb3RCYW5kc01vdmUkLm5leHQoe1xuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICB0YXJnZXQ6IHBsb3RCYW5kLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHBsb3RiYW5kXG4gICAgICAgICAgLnNlbGVjdEFsbCgncmVjdCcpXG4gICAgICAgICAgLmRhdGEoYXhpcy5vcHRpb25zLnBsb3RCYW5kcylcbiAgICAgICAgICAub24oJ3N0YXJ0JywgKF8pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnNlbGVjdEFsbCgnLm1hcmtlcicpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzLl9jb250YWluZXIubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgLnNlbGVjdCgnLnRvb2x0aXAtY2hhcnQnKVxuICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpvaW4oJ3JlY3QnKVxuICAgICAgICAgIC5hdHRyKCdkYXRhLXBsb3RiYW5kLWlkJywgKGQpID0+IGQuaWQpXG4gICAgICAgICAgLmF0dHIoJ3gnLCAoZCkgPT4geChkLmZyb20pKVxuICAgICAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgICAgICAuYXR0cignd2lkdGgnLCAoZCkgPT4gTWF0aC5hYnMoeChkLnRvKSAtIHgoZC5mcm9tKSkpXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGQuaW1hZ2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGB1cmwoIyR7ZC5pbWFnZX0pYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkLmNvbG9yO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgKGQpID0+IGQub3BhY2l0eSA/PyAxKVxuICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBwbG90QmFuZEhlaWdodCA+IDAgPyBwbG90QmFuZEhlaWdodCA6IDApXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHt0aGlzLl9vcHRpb25zLmJvdW5kcy50b3B9KWApO1xuXG4gICAgICAgIHBsb3RiYW5kXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLmxpbmUtbGVmdCcpXG4gICAgICAgICAgLmRhdGEoYXhpcy5vcHRpb25zLnBsb3RCYW5kcylcbiAgICAgICAgICAuam9pbignbGluZScpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEtbGluZS1sZWZ0LWlkJywgKGQpID0+IGQuaWQpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpbmUtbGVmdCcpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgKGQpID0+IHgoZC5mcm9tKSlcbiAgICAgICAgICAuYXR0cigneDInLCAoZCkgPT4geChkLmZyb20pKVxuICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAneTInLFxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0IC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wIC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMuYm90dG9tXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7dGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wfSlgKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgMSlcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnOCwgOCcpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY29sb3ItdGV4dC05MCknKVxuICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIChkKSA9PiAoZC5zaG93R3JhYmJlcnMgPyAxIDogMCkpO1xuXG4gICAgICAgIHBsb3RiYW5kXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLmRyYWctbGVmdCcpXG4gICAgICAgICAgLmRhdGEoYXhpcy5vcHRpb25zLnBsb3RCYW5kcylcbiAgICAgICAgICAuam9pbignbGluZScpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgKGQpID0+IHgoZC5mcm9tKSlcbiAgICAgICAgICAuYXR0cigneDInLCAoZCkgPT4geChkLmZyb20pKVxuICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAneTInLFxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0IC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wIC1cbiAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMuYm90dG9tXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsIChkKSA9PiAoZD8ucmVzaXphYmxlID8gJ3Vuc2V0JyA6ICdub25lJykpXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHt0aGlzLl9vcHRpb25zLmJvdW5kcy50b3B9KWApXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCA4KVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3JnYmEoMCwgMCwgMCwgMCknKVxuICAgICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ2NvbC1yZXNpemUnKVxuICAgICAgICAgIC5jYWxsKFxuICAgICAgICAgICAgZDNcbiAgICAgICAgICAgICAgLmRyYWcoKVxuICAgICAgICAgICAgICAub24oJ2RyYWcnLCBmdW5jdGlvbiAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGQzLnNlbGVjdCh0aGlzKS5ub2RlKCkucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBkcmFnZ2VkQmFuZCA9IGQzXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0KGdyb3VwKVxuICAgICAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtcGxvdGJhbmQtaWQ9JyR7ZC5pZH0nXWApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dlZExpbmUgPSBkM1xuICAgICAgICAgICAgICAgICAgLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgICAgIC5zZWxlY3QoYFtkYXRhLWxpbmUtbGVmdC1pZD0nJHtkLmlkfSddYCk7XG5cbiAgICAgICAgICAgICAgICBkLmZyb20gPSB4LmludmVydChldmVudC54KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1pblZhbHVlID0gZC5taW4gPz8gbWluO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm9yZGVyUmVhY2hlZCA9IGQuZnJvbSA8PSBtaW5WYWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChib3JkZXJSZWFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICBkLmZyb20gPSBtaW5WYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZC5mcm9tID49IGQudG8pIHtcbiAgICAgICAgICAgICAgICAgIGQuZnJvbSA9IGQudG87XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3gxJywgeChkLmZyb20pKS5hdHRyKCd4MicsIHgoZC5mcm9tKSk7XG5cbiAgICAgICAgICAgICAgICBkcmFnZ2VkQmFuZFxuICAgICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB4KGQuZnJvbSkpXG4gICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB4KGQudG8pIC0geChkLmZyb20pKTtcblxuICAgICAgICAgICAgICAgIGRyYWdnZWRMaW5lLmF0dHIoJ3gxJywgeChkLmZyb20pKS5hdHRyKCd4MicsIHgoZC5mcm9tKSk7XG5cbiAgICAgICAgICAgICAgICBlbWl0KGV2ZW50LCBkKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpID0+XG4gICAgICAgICAgICAgICAgZW1pdChldmVudCwgZClcbiAgICAgICAgICAgICAgKSBhcyBhbnlcbiAgICAgICAgICApO1xuXG4gICAgICAgIHBsb3RiYW5kXG4gICAgICAgICAgLnNlbGVjdEFsbCgnLmxpbmUtcmlnaHQnKVxuICAgICAgICAgIC5kYXRhKGF4aXMub3B0aW9ucy5wbG90QmFuZHMpXG4gICAgICAgICAgLmpvaW4oJ2xpbmUnKVxuICAgICAgICAgIC5hdHRyKCdkYXRhLWxpbmUtcmlnaHQtaWQnLCAoZCkgPT4gZC5pZClcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGluZS1yaWdodCcpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgKGQpID0+IHgoZC50bykpXG4gICAgICAgICAgLmF0dHIoJ3gyJywgKGQpID0+IHgoZC50bykpXG4gICAgICAgICAgLmF0dHIoJ3kxJywgMClcbiAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICd5MicsXG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy50b3AgLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b21cbiAgICAgICAgICApXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHt0aGlzLl9vcHRpb25zLmJvdW5kcy50b3B9KWApXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAxKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc4LCA4JylcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jb2xvci10ZXh0LTkwKScpXG4gICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgKGQpID0+IChkLnNob3dHcmFiYmVycyA/IDEgOiAwKSk7XG5cbiAgICAgICAgcGxvdGJhbmRcbiAgICAgICAgICAuc2VsZWN0QWxsKCcuZHJhZy1yaWdodCcpXG4gICAgICAgICAgLmRhdGEoYXhpcy5vcHRpb25zLnBsb3RCYW5kcylcbiAgICAgICAgICAuam9pbignbGluZScpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RyYWctcmlnaHQnKVxuICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsIChkKSA9PiAoZD8ucmVzaXphYmxlID8gJ3Vuc2V0JyA6ICdub25lJykpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgKGQpID0+IHgoZC50bykpXG4gICAgICAgICAgLmF0dHIoJ3gyJywgKGQpID0+IHgoZC50bykpXG4gICAgICAgICAgLmF0dHIoJ3kxJywgMClcbiAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICd5MicsXG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy50b3AgLVxuICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmJvdW5kcy5ib3R0b21cbiAgICAgICAgICApXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHt0aGlzLl9vcHRpb25zLmJvdW5kcy50b3B9KWApXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCA4KVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3JnYmEoMCwgMCwgMCwgMCknKVxuICAgICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ2NvbC1yZXNpemUnKVxuICAgICAgICAgIC5jYWxsKFxuICAgICAgICAgICAgZDNcbiAgICAgICAgICAgICAgLmRyYWcoKVxuICAgICAgICAgICAgICAub24oJ2RyYWcnLCBmdW5jdGlvbiAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGQzLnNlbGVjdCh0aGlzKS5ub2RlKCkucGFyZW50RWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdnZWRCYW5kID0gZDNcbiAgICAgICAgICAgICAgICAgIC5zZWxlY3QoZ3JvdXApXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0KGBbZGF0YS1wbG90YmFuZC1pZD0nJHtkLmlkfSddYCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkcmFnZ2VkTGluZSA9IGQzXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0KGdyb3VwKVxuICAgICAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtbGluZS1yaWdodC1pZD0nJHtkLmlkfSddYCk7XG5cbiAgICAgICAgICAgICAgICBkLnRvID0geC5pbnZlcnQoZXZlbnQueCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IGQubWF4ID8/IG1heDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlclJlYWNoZWQgPSBkLnRvID49IG1heFZhbHVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJvcmRlclJlYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgIGQudG8gPSBtYXhWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZC50byA8PSBkLmZyb20pIHtcbiAgICAgICAgICAgICAgICAgIGQudG8gPSBkLmZyb207XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3gxJywgeChkLnRvKSkuYXR0cigneDInLCB4KGQudG8pKTtcbiAgICAgICAgICAgICAgICBkcmFnZ2VkQmFuZC5hdHRyKCd3aWR0aCcsIHgoZC50bykgLSB4KGQuZnJvbSkpO1xuICAgICAgICAgICAgICAgIGRyYWdnZWRMaW5lLmF0dHIoJ3gxJywgeChkLnRvKSkuYXR0cigneDInLCB4KGQudG8pKTtcblxuICAgICAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAub24oJ2VuZCcsIChldmVudDogRHJhZ0V2ZW50LCBkOiBQbG90QmFuZCkgPT5cbiAgICAgICAgICAgICAgICBlbWl0KGV2ZW50LCBkKVxuICAgICAgICAgICAgICApIGFzIGFueVxuICAgICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX3lBeGlzTGlzdFxuICAgICAgLmZpbHRlcigoXykgPT4gXy5vcHRpb25zLnBsb3RCYW5kcy5sZW5ndGggPiAwKVxuICAgICAgLmZvckVhY2goKGF4aXMpID0+IHtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuX3lTY2FsZXMuZ2V0KGF4aXMuaW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBheGlzLmV4dGVudDtcblxuICAgICAgICBjb25zdCBwbG90YmFuZCA9IHBsb3RCYW5kR3JvdXBcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuc3R5bGUoJ3NoYXBlLXJlbmRlcmluZycsICdjcmlzcEVkZ2VzJyk7XG5cbiAgICAgICAgY29uc3QgcGxvdEJhbmRXaWR0aCA9XG4gICAgICAgICAgdGhpcy5fd2lkdGggLSB0aGlzLl9vcHRpb25zLmJvdW5kcy5sZWZ0IC0gdGhpcy5fb3B0aW9ucy5ib3VuZHMucmlnaHQ7IC8vIFRPRE8gYWRkIG11bHRpYXhpcyBzdXBwb3J0IHdpZHRoXG5cbiAgICAgICAgY29uc3QgZW1pdCA9IChldmVudDogRHJhZ0V2ZW50LCBwbG90QmFuZDogUGxvdEJhbmQpID0+IHtcbiAgICAgICAgICB0aGlzLnBsb3RCYW5kc01vdmUkLm5leHQoe1xuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICB0YXJnZXQ6IHBsb3RCYW5kLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRyYWdQbG90YmFuZCA9IGQzXG4gICAgICAgICAgLmRyYWcoKVxuICAgICAgICAgIC5zdWJqZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkMy5zZWxlY3QodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4geyB5OiBlbGVtZW50LmF0dHIoJ3knKSB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdzdGFydCBkcmFnIGVuZCcsIGZ1bmN0aW9uIChldmVudDogYW55LCBkOiBQbG90QmFuZCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGQzLnNlbGVjdCh0aGlzKTtcblxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VGbG9hdChlbGVtZW50LmF0dHIoJ2hlaWdodCcpKTtcblxuICAgICAgICAgICAgZC50byA9IHkuaW52ZXJ0KGV2ZW50LnkgKyBoZWlnaHQpO1xuICAgICAgICAgICAgZC5mcm9tID0geS5pbnZlcnQoZXZlbnQueSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1pblZhbHVlID0gZC5taW4gPz8gbWluO1xuICAgICAgICAgICAgY29uc3QgbWF4VmFsdWUgPSBkLm1heCA/PyBtYXg7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvcmRlclJlYWNoZWRNaW4gPSBkLmZyb20gPD0gbWluVmFsdWU7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJSZWFjaGVkTWF4ID0gZC50byA+PSBtYXhWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGJvcmRlclJlYWNoZWRNaW4pIHtcbiAgICAgICAgICAgICAgZC50byA9IHkuaW52ZXJ0KHkobWluVmFsdWUpICsgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgZC5mcm9tID0gbWluVmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChib3JkZXJSZWFjaGVkTWF4KSB7XG4gICAgICAgICAgICAgIGQudG8gPSBtYXhWYWx1ZTtcbiAgICAgICAgICAgICAgZC5mcm9tID0geS5pbnZlcnQoeShtYXhWYWx1ZSkgLSBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbGVtZW50LmF0dHIoJ3knLCB5KGQuZnJvbSkpO1xuXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IGVsZW1lbnQubm9kZSgpLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGQzLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtbGluZS1sZWZ0LWlkPScke2QuaWR9J11gKVxuICAgICAgICAgICAgICAuYXR0cigneTEnLCB5KGQuZnJvbSkpXG4gICAgICAgICAgICAgIC5hdHRyKCd5MicsIHkoZC5mcm9tKSk7XG5cbiAgICAgICAgICAgIGQzLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtZ3JhYi1sZWZ0LWlkPScke2QuaWR9J11gKVxuICAgICAgICAgICAgICAuYXR0cigneTEnLCB5KGQuZnJvbSkpXG4gICAgICAgICAgICAgIC5hdHRyKCd5MicsIHkoZC5mcm9tKSk7XG5cbiAgICAgICAgICAgIGQzLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtbGluZS1yaWdodC1pZD0nJHtkLmlkfSddYClcbiAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgeShkLnRvKSlcbiAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgeShkLnRvKSk7XG5cbiAgICAgICAgICAgIGQzLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtZ3JhYi1yaWdodC1pZD0nJHtkLmlkfSddYClcbiAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgeShkLnRvKSlcbiAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgeShkLnRvKSk7XG5cbiAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgIH0pIGFzIGFueTtcblxuICAgICAgICBjb25zdCBsZWZ0R3JhYkRyYWcgPSBkM1xuICAgICAgICAgIC5kcmFnKClcbiAgICAgICAgICAub24oJ2RyYWcnLCBmdW5jdGlvbiAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gZDMuc2VsZWN0KHRoaXMpLm5vZGUoKS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgZHJhZ2dlZEJhbmQgPSBkM1xuICAgICAgICAgICAgICAuc2VsZWN0KGdyb3VwKVxuICAgICAgICAgICAgICAuc2VsZWN0KGBbZGF0YS1wbG90YmFuZC1pZD0nJHtkLmlkfSddYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRyYWdnZWRMaW5lID0gZDNcbiAgICAgICAgICAgICAgLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtbGluZS1sZWZ0LWlkPScke2QuaWR9J11gKTtcblxuICAgICAgICAgICAgZC5mcm9tID0geS5pbnZlcnQoZXZlbnQueSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1pblZhbHVlID0gZC5taW4gPz8gbWluO1xuXG4gICAgICAgICAgICBjb25zdCBib3JkZXJSZWFjaGVkID0gZC5mcm9tIDw9IG1pblZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoYm9yZGVyUmVhY2hlZCkge1xuICAgICAgICAgICAgICBkLmZyb20gPSBtaW5WYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGQuZnJvbSA+PSBkLnRvKSB7XG4gICAgICAgICAgICAgIGQuZnJvbSA9IGQudG87XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5hdHRyKCd5MScsIHkoZC5mcm9tKSkuYXR0cigneTInLCB5KGQuZnJvbSkpO1xuXG4gICAgICAgICAgICBkcmFnZ2VkQmFuZFxuICAgICAgICAgICAgICAuYXR0cigneScsIHkoZC5mcm9tKSlcbiAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIE1hdGguYWJzKHkoZC50bykgLSB5KGQuZnJvbSkpKTtcbiAgICAgICAgICAgIGRyYWdnZWRMaW5lLmF0dHIoJ3kxJywgeShkLmZyb20pKS5hdHRyKCd5MicsIHkoZC5mcm9tKSk7XG5cbiAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdlbmQnLCAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpID0+IGVtaXQoZXZlbnQsIGQpKSBhcyBhbnk7XG5cbiAgICAgICAgY29uc3QgcmlnaHRHcmFiRHJhZyA9IGQzXG4gICAgICAgICAgLmRyYWcoKVxuICAgICAgICAgIC5vbignZHJhZycsIGZ1bmN0aW9uIChldmVudDogRHJhZ0V2ZW50LCBkOiBQbG90QmFuZCkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBkMy5zZWxlY3QodGhpcykubm9kZSgpLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGRyYWdnZWRCYW5kID0gZDNcbiAgICAgICAgICAgICAgLnNlbGVjdChncm91cClcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtcGxvdGJhbmQtaWQ9JyR7ZC5pZH0nXWApO1xuXG4gICAgICAgICAgICBjb25zdCBkcmFnZ2VkTGluZSA9IGQzXG4gICAgICAgICAgICAgIC5zZWxlY3QoZ3JvdXApXG4gICAgICAgICAgICAgIC5zZWxlY3QoYFtkYXRhLWxpbmUtcmlnaHQtaWQ9JyR7ZC5pZH0nXWApO1xuXG4gICAgICAgICAgICBkLnRvID0geS5pbnZlcnQoZXZlbnQueSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1heFZhbHVlID0gZC5tYXggPz8gbWF4O1xuXG4gICAgICAgICAgICBjb25zdCBib3JkZXJSZWFjaGVkID0gZC50byA+PSBtYXhWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGJvcmRlclJlYWNoZWQpIHtcbiAgICAgICAgICAgICAgZC50byA9IG1heFZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZC50byA8PSBkLmZyb20pIHtcbiAgICAgICAgICAgICAgZC50byA9IGQuZnJvbTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3kxJywgeShkLnRvKSkuYXR0cigneTInLCB5KGQudG8pKTtcblxuICAgICAgICAgICAgZHJhZ2dlZEJhbmRcbiAgICAgICAgICAgICAgLmF0dHIoJ3knLCB5KGQuZnJvbSkpXG4gICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBNYXRoLmFicyh5KGQudG8pIC0geShkLmZyb20pKSk7XG4gICAgICAgICAgICBkcmFnZ2VkTGluZS5hdHRyKCd5MScsIHkoZC50bykpLmF0dHIoJ3kyJywgeShkLnRvKSk7XG5cbiAgICAgICAgICAgIGVtaXQoZXZlbnQsIGQpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdlbmQnLCAoZXZlbnQ6IERyYWdFdmVudCwgZDogUGxvdEJhbmQpID0+IGVtaXQoZXZlbnQsIGQpKSBhcyBhbnk7XG5cbiAgICAgICAgcGxvdGJhbmRcbiAgICAgICAgICAuc2VsZWN0QWxsKCdyZWN0JylcbiAgICAgICAgICAuZGF0YShheGlzLm9wdGlvbnMucGxvdEJhbmRzKVxuICAgICAgICAgIC5qb2luKCdyZWN0JylcbiAgICAgICAgICAuYXR0cignZGF0YS1wbG90YmFuZC1pZCcsIChkKSA9PiBkLmlkKVxuICAgICAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgICAgICAuYXR0cigneScsIChkKSA9PiB5KGQuZnJvbSkpXG4gICAgICAgICAgLmF0dHIoJ3dpZHRoJywgKGQpID0+IHBsb3RCYW5kV2lkdGgpXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGQuaW1hZ2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGB1cmwoIyR7ZC5pbWFnZX0pYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkLmNvbG9yO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgKGQpID0+IGQub3BhY2l0eSA/PyAxKVxuICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCAoZCkgPT4gTWF0aC5hYnMoeShkLnRvKSAtIHkoZC5mcm9tKSkpXG4gICAgICAgICAgLmF0dHIoJ2N1cnNvcicsIChkKSA9PiAoZC5kcmFnZ2FibGUgPyAnbW92ZScgOiAnZGVmYXVsdCcpKTtcblxuICAgICAgICBwbG90YmFuZFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5saW5lLWxlZnQnKVxuICAgICAgICAgIC5kYXRhKGF4aXMub3B0aW9ucy5wbG90QmFuZHMuZmlsdGVyKChkKSA9PiBkLnJlc2l6YWJsZSkpXG4gICAgICAgICAgLmpvaW4oJ2xpbmUnKVxuICAgICAgICAgIC5hdHRyKCdkYXRhLWxpbmUtbGVmdC1pZCcsIChkKSA9PiBkLmlkKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaW5lLWxlZnQnKVxuICAgICAgICAgIC5hdHRyKCd5MScsIChkKSA9PiB5KGQuZnJvbSkpXG4gICAgICAgICAgLmF0dHIoJ3kyJywgKGQpID0+IHkoZC5mcm9tKSlcbiAgICAgICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgICAgIC5hdHRyKCd4MicsIHBsb3RCYW5kV2lkdGgpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAxKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc4LCA4JylcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jb2xvci10ZXh0LTkwKScpXG4gICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgKGQpID0+IChkLnNob3dHcmFiYmVycyA/IDEgOiAwKSk7XG5cbiAgICAgICAgcGxvdGJhbmRcbiAgICAgICAgICAuc2VsZWN0QWxsKCcuZHJhZy1sZWZ0JylcbiAgICAgICAgICAuZGF0YShheGlzLm9wdGlvbnMucGxvdEJhbmRzLmZpbHRlcigoZCkgPT4gZC5yZXNpemFibGUpKVxuICAgICAgICAgIC5qb2luKCdsaW5lJylcbiAgICAgICAgICAuYXR0cignZGF0YS1ncmFiLWxlZnQtaWQnLCAoZCkgPT4gZC5pZClcbiAgICAgICAgICAuYXR0cigneTEnLCAoZCkgPT4geShkLmZyb20pKVxuICAgICAgICAgIC5hdHRyKCd5MicsIChkKSA9PiB5KGQuZnJvbSkpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgMClcbiAgICAgICAgICAuYXR0cigneDInLCBwbG90QmFuZFdpZHRoKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgOClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdyZ2JhKDAsIDAsIDAsIDApJylcbiAgICAgICAgICAuc3R5bGUoJ2N1cnNvcicsIChkKSA9PiAoZC5yZXNpemFibGUgPyAncm93LXJlc2l6ZScgOiAnZGVmYXVsdCcpKTtcblxuICAgICAgICBwbG90YmFuZFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5saW5lLXJpZ2h0JylcbiAgICAgICAgICAuZGF0YShheGlzLm9wdGlvbnMucGxvdEJhbmRzLmZpbHRlcigoZCkgPT4gZC5yZXNpemFibGUpKVxuICAgICAgICAgIC5qb2luKCdsaW5lJylcbiAgICAgICAgICAuYXR0cignZGF0YS1saW5lLXJpZ2h0LWlkJywgKGQpID0+IGQuaWQpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpbmUtcmlnaHQnKVxuICAgICAgICAgIC5hdHRyKCd5MScsIChkKSA9PiB5KGQudG8pKVxuICAgICAgICAgIC5hdHRyKCd5MicsIChkKSA9PiB5KGQudG8pKVxuICAgICAgICAgIC5hdHRyKCd4MScsIDApXG4gICAgICAgICAgLmF0dHIoJ3gyJywgcGxvdEJhbmRXaWR0aClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDEpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzgsIDgnKVxuICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNvbG9yLXRleHQtOTApJylcbiAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAoZCkgPT4gKGQuc2hvd0dyYWJiZXJzID8gMSA6IDApKTtcblxuICAgICAgICBwbG90YmFuZFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5kcmFnLXJpZ2h0JylcbiAgICAgICAgICAuZGF0YShheGlzLm9wdGlvbnMucGxvdEJhbmRzLmZpbHRlcigoZCkgPT4gZC5yZXNpemFibGUpKVxuICAgICAgICAgIC5qb2luKCdsaW5lJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZHJhZy1yaWdodCcpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEtZ3JhYi1yaWdodC1pZCcsIChkKSA9PiBkLmlkKVxuICAgICAgICAgIC5hdHRyKCd5MScsIChkKSA9PiB5KGQudG8pKVxuICAgICAgICAgIC5hdHRyKCd5MicsIChkKSA9PiB5KGQudG8pKVxuICAgICAgICAgIC5hdHRyKCd4MScsIDApXG4gICAgICAgICAgLmF0dHIoJ3gyJywgcGxvdEJhbmRXaWR0aClcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDgpXG4gICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAncmdiYSgwLCAwLCAwLCAwKScpXG4gICAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAoZCkgPT4gKGQucmVzaXphYmxlID8gJ3Jvdy1yZXNpemUnIDogJ2RlZmF1bHQnKSk7XG5cbiAgICAgICAgYXhpcy5vcHRpb25zLnBsb3RCYW5kcy5mb3JFYWNoKChfKSA9PiB7XG4gICAgICAgICAgaWYgKF8uZHJhZ2dhYmxlKSB7XG4gICAgICAgICAgICBwbG90YmFuZC5zZWxlY3QoYFtkYXRhLXBsb3RiYW5kLWlkPScke18uaWR9J11gKS5jYWxsKGRyYWdQbG90YmFuZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF8ucmVzaXphYmxlKSB7XG4gICAgICAgICAgICBwbG90YmFuZC5zZWxlY3QoYFtkYXRhLWdyYWItbGVmdC1pZD0nJHtfLmlkfSddYCkuY2FsbChsZWZ0R3JhYkRyYWcpO1xuICAgICAgICAgICAgcGxvdGJhbmRcbiAgICAgICAgICAgICAgLnNlbGVjdChgW2RhdGEtZ3JhYi1yaWdodC1pZD0nJHtfLmlkfSddYClcbiAgICAgICAgICAgICAgLmNhbGwocmlnaHRHcmFiRHJhZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3Q2hhcnQoKSB7XG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5fb3B0aW9ucy5zZXJpZXM/LmZpbHRlcigoXykgPT4gXy52aXNpYmxlKTtcblxuICAgIHRoaXMuX2NoYXJ0LnNlbGVjdEFsbCgnLnNlcmllcycpLnJlbW92ZSgpO1xuXG4gICAgaWYgKCFzZXJpZXMgfHwgc2VyaWVzLmxlbmd0aCA8IDEpIHtcbiAgICAgIGQzLnNlbGVjdCh0aGlzLl9jb250YWluZXIubmF0aXZlRWxlbWVudClcbiAgICAgICAgLnNlbGVjdCgnY2FudmFzJylcbiAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cCA9IHRoaXMuX2NoYXJ0XG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdzZXJpZXMnKVxuICAgICAgLmF0dHIoJ2NsaXAtcGF0aCcsIGB1cmwoI2RyYXctd2luZG93LSR7dGhpcy51bmlxSWR9KWApO1xuXG4gICAgc2VyaWVzPy5mb3JFYWNoKChzZXJpZXNJdGVtOiBTZXJpZXM8QmFzZVBvaW50PiwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChzZXJpZXNJdGVtLnJlbmRlclRvID09PSAnY2FudmFzJykge1xuICAgICAgICBkMy5zZWxlY3QodGhpcy5fY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgLnNlbGVjdCgnY2FudmFzJylcbiAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCBudWxsKTtcblxuICAgICAgICBkMy5zZWxlY3QodGhpcy5fY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgLnNlbGVjdCgnc3ZnJylcbiAgICAgICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkMy5zZWxlY3QodGhpcy5fY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgLnNlbGVjdCgnY2FudmFzJylcbiAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5feFNjYWxlcy5oYXMoc2VyaWVzSXRlbS54QXhpc0luZGV4KSB8fFxuICAgICAgICAhdGhpcy5feVNjYWxlcy5oYXMoc2VyaWVzSXRlbS55QXhpc0luZGV4KVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmRYID0gdGhpcy5feFNjYWxlcy5nZXQoc2VyaWVzSXRlbS54QXhpc0luZGV4KTtcbiAgICAgIGNvbnN0IGZvdW5kWSA9IHRoaXMuX3lTY2FsZXMuZ2V0KHNlcmllc0l0ZW0ueUF4aXNJbmRleCk7XG5cbiAgICAgIGNvbnN0IGRyYXdlciA9XG4gICAgICAgIHNlcmllc0l0ZW0uZHJhd2VyICE9IG51bGxcbiAgICAgICAgICA/IHNlcmllc0l0ZW0uZHJhd2VyXG4gICAgICAgICAgOiBkZWZhdWx0RHJhd2VyTWFwcGluZy5nZXQoc2VyaWVzSXRlbS50eXBlKTtcblxuICAgICAgaWYgKCFkcmF3ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBObyBkcmF3ZXIgZm9yIHNlcmllcyAke3Nlcmllc0l0ZW0ubmFtZX0sIHR5cGUgJHtcbiAgICAgICAgICAgIFNlcmllc1R5cGVbc2VyaWVzSXRlbS50eXBlXVxuICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXJpZXNJdGVtLnJlbmRlclRvID09PSAnY2FudmFzJykge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fY2FudmFzLm5vZGUoKS5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgbGV0IFt4TWluLCB4TWF4XSA9IGZvdW5kWC5kb21haW4oKTtcbiAgICAgIGxldCBbeU1pbiwgeU1heF0gPSBmb3VuZFkuZG9tYWluKCk7XG5cbiAgICAgIHhNaW4gPSB4TWluIGluc3RhbmNlb2YgRGF0ZSA/IHhNaW4uZ2V0VGltZSgpIDogeE1pbjtcbiAgICAgIHhNYXggPSB4TWF4IGluc3RhbmNlb2YgRGF0ZSA/IHhNYXguZ2V0VGltZSgpIDogeE1heDtcblxuICAgICAgeU1pbiA9IHlNaW4gaW5zdGFuY2VvZiBEYXRlID8geU1pbi5nZXRUaW1lKCkgOiB5TWluO1xuICAgICAgeU1heCA9IHlNYXggaW5zdGFuY2VvZiBEYXRlID8geU1heC5nZXRUaW1lKCkgOiB5TWF4O1xuXG4gICAgICBjb25zdCB2aXNpYmxlUG9pbnRzID0gKFxuICAgICAgICBwb2ludDogQmFzZVBvaW50LFxuICAgICAgICBpZHg6IG51bWJlcixcbiAgICAgICAgYXJyOiBBcnJheTxCYXNlUG9pbnQ+XG4gICAgICApID0+XG4gICAgICAgIChwb2ludC54IDw9IHhNYXggfHxcbiAgICAgICAgICBwb2ludC54MSA8PSB4TWF4IHx8XG4gICAgICAgICAgKGFycltpZHggLSAxXSAmJiBhcnJbaWR4IC0gMV0ueCA8PSB4TWF4KSB8fFxuICAgICAgICAgIChhcnJbaWR4IC0gMV0gJiYgYXJyW2lkeCAtIDFdLngxIDw9IHhNYXgpKSAmJlxuICAgICAgICAocG9pbnQueCA+PSB4TWluIHx8XG4gICAgICAgICAgcG9pbnQueDEgPj0geE1pbiB8fFxuICAgICAgICAgIChhcnJbaWR4ICsgMV0gJiYgYXJyW2lkeCArIDFdLnggPj0geE1pbikgfHxcbiAgICAgICAgICAoYXJyW2lkeCArIDFdICYmIGFycltpZHggKyAxXS54MSA+PSB4TWluKSkgJiZcbiAgICAgICAgKHBvaW50LnkgPD0geU1heCB8fFxuICAgICAgICAgIHBvaW50LnkxIDw9IHlNYXggfHxcbiAgICAgICAgICAoYXJyW2lkeCAtIDFdICYmIGFycltpZHggLSAxXS55IDw9IHlNYXgpIHx8XG4gICAgICAgICAgKGFycltpZHggLSAxXSAmJiBhcnJbaWR4IC0gMV0ueTEgPD0geU1heCkpICYmXG4gICAgICAgIChwb2ludC55ID49IHlNaW4gfHxcbiAgICAgICAgICBwb2ludC55MSA+PSB5TWluIHx8XG4gICAgICAgICAgKGFycltpZHggKyAxXSAmJiBhcnJbaWR4ICsgMV0ueSA+PSB5TWluKSB8fFxuICAgICAgICAgIChhcnJbaWR4ICsgMV0gJiYgYXJyW2lkeCArIDFdLnkxID49IHlNaW4pKTtcblxuICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gc2VyaWVzSXRlbS5kYXRhOyAvLy5maWx0ZXIodmlzaWJsZVBvaW50cyk7XG5cbiAgICAgIGNvbnN0IHNlcmllID0ge1xuICAgICAgICAuLi5zZXJpZXNJdGVtLFxuICAgICAgICBkYXRhOiBmaWx0ZXJlZERhdGEsXG4gICAgICB9O1xuXG4gICAgICBkcmF3ZXIuZHJhdyhcbiAgICAgICAgc2VyaWUsXG4gICAgICAgIHNlcmllc0l0ZW0ucmVuZGVyVG8gPT09ICdjYW52YXMnID8gdGhpcy5fY2FudmFzIDogZ3JvdXAsXG4gICAgICAgIGZvdW5kWCxcbiAgICAgICAgZm91bmRZLFxuICAgICAgICB0aGlzLl9vcHRpb25zXG4gICAgICApO1xuXG4gICAgICBjb25zdCBlbWl0ID0gKGV2ZW50OiBJRHJhZ0V2ZW50PFNlcmllczxCYXNlUG9pbnQ+PikgPT4ge1xuICAgICAgICB0aGlzLnNlcmllc01vdmUkLm5leHQoZXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW1pdFBvaW50ID0gKGV2ZW50OiBJRHJhZ0V2ZW50PFNlcmllczxCYXNlUG9pbnQ+PikgPT4ge1xuICAgICAgICB0aGlzLnBvaW50TW92ZSQubmV4dChldmVudCk7XG4gICAgICB9O1xuXG4gICAgICBkcmF3ZXI/LmRpc3BhdGNoPy5vbihEaXNwYXRjaFR5cGUubW92ZUxpbmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZW1pdCh0aGlzKTtcbiAgICAgIH0pO1xuXG4gICAgICBkcmF3ZXI/LmRpc3BhdGNoPy5vbihEaXNwYXRjaFR5cGUubW92ZVBvaW50LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGVtaXRQb2ludCh0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sdGlwKCkge1xuICAgIGQzLnNlbGVjdCh0aGlzLl9jb250YWluZXIubmF0aXZlRWxlbWVudClcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAndG9vbHRpcC1jaGFydCBjb2xvci10ZXh0LTkwIGJnLWJhY2tncm91bmQtNTAgc2hhZG93LTInKVxuICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdmaXhlZCcpXG4gICAgICAuc3R5bGUoJ3RvcCcsICd1bnNldCcpXG4gICAgICAuc3R5bGUoJ3JpZ2h0JywgJ3Vuc2V0JylcbiAgICAgIC5zdHlsZSgnYm90dG9tJywgJ3Vuc2V0JylcbiAgICAgIC5zdHlsZSgnbGVmdCcsICd1bnNldCcpXG4gICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTW91c2VNb3ZlKG9wdGlvbnMpIHtcbiAgICBjb25zdCBtb3VzZSA9IGQzLnBvaW50ZXIob3B0aW9ucy5ldmVudCk7XG4gICAgY29uc3QgeyB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQgfSA9IHRoaXMudG9vbHRpcFBvc2l0aW9uKG9wdGlvbnMuZXZlbnQpO1xuXG4gICAgY29uc3QgdG9vbHRpcHNEYXRhID0gW107XG5cbiAgICB0aGlzLl9jaGFydFxuICAgICAgLnNlbGVjdCgnLm1hcmtlci1saW5lJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7MH0sICR7bW91c2VbMV0gLSAyfSlgKTtcblxuICAgIHRoaXMuX2NoYXJ0XG4gICAgICAuc2VsZWN0QWxsKCcubWFya2VyJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZDogU2VyaWVzPEJhc2VQb2ludD4pID0+IHtcbiAgICAgICAgaWYgKCFkLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLl94U2NhbGVzLmhhcyhkLnhBeGlzSW5kZXgpIHx8XG4gICAgICAgICAgIXRoaXMuX3lTY2FsZXMuaGFzKGQueUF4aXNJbmRleClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm91bmRYID0gdGhpcy5feFNjYWxlcy5nZXQoZC54QXhpc0luZGV4KTtcbiAgICAgICAgY29uc3QgZm91bmRZID0gdGhpcy5feVNjYWxlcy5nZXQoZC55QXhpc0luZGV4KTtcblxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy50b29sdGlwLnRyYWNraW5nID09PSAneCcpIHtcbiAgICAgICAgICBjb25zdCBbbWluLCBtYXhdID0gZm91bmRYLmRvbWFpbigpO1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGQuZGF0YS5maWx0ZXIoXG4gICAgICAgICAgICAocG9pbnQpID0+IHBvaW50LnggPD0gbWF4ICYmIHBvaW50LnggPj0gbWluXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5maWx0ZXJlZERhdGFdLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICBkMy5hc2NlbmRpbmcoYS54LCBiLngpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGJpc2VjdCA9IGQzLmJpc2VjdG9yKChkZDogYW55KSA9PiBkZC54KS5sZWZ0O1xuICAgICAgICAgIGNvbnN0IHgwID0gZm91bmRYLmludmVydChtb3VzZVswXSk7XG5cbiAgICAgICAgICBjb25zdCBpbmRleCA9IGJpc2VjdChzb3J0ZWQsIHgwKTtcblxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBzb3J0ZWRbaW5kZXhdID8gc29ydGVkW2luZGV4XSA6IHNvcnRlZFtpbmRleCAtIDFdO1xuXG4gICAgICAgICAgdG9vbHRpcHNEYXRhLnB1c2goe1xuICAgICAgICAgICAgcG9pbnQ6IGRhdGEsXG4gICAgICAgICAgICBjb2xvcjogZC5jb2xvcixcbiAgICAgICAgICAgIG5hbWU6IGQubmFtZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7XG4gICAgICAgICAgICAhaXNOYU4oZGF0YT8ueCkgJiYgZGF0YT8ueCAhPSBudWxsID8gZm91bmRYKGRhdGEueCkgOiAtMTBcbiAgICAgICAgICB9LCAkeyFpc05hTihkYXRhPy55KSAmJiBkYXRhPy55ICE9IG51bGwgPyBmb3VuZFkoZGF0YS55KSA6IC0xMH0pYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnRvb2x0aXAudHJhY2tpbmcgPT09ICd5Jykge1xuICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5kLmRhdGFdLnNvcnQoKGEsIGIpID0+IGQzLmFzY2VuZGluZyhhLnksIGIueSkpO1xuICAgICAgICAgIGNvbnN0IGJpc2VjdCA9IGQzLmJpc2VjdG9yKChkZDogYW55KSA9PiBkZC55KS5sZWZ0O1xuICAgICAgICAgIGNvbnN0IHkwID0gZm91bmRZLmludmVydChtb3VzZVsxXSk7XG5cbiAgICAgICAgICBjb25zdCBpbmRleCA9IGJpc2VjdChzb3J0ZWQsIHkwLCAwKTtcblxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBzb3J0ZWRbaW5kZXhdID8gc29ydGVkW2luZGV4XSA6IHNvcnRlZFtpbmRleCAtIDFdO1xuXG4gICAgICAgICAgdG9vbHRpcHNEYXRhLnB1c2goe1xuICAgICAgICAgICAgcG9pbnQ6IGRhdGEsXG4gICAgICAgICAgICBjb2xvcjogZC5jb2xvcixcbiAgICAgICAgICAgIG5hbWU6IGQubmFtZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7XG4gICAgICAgICAgICAhaXNOYU4oZGF0YT8ueCkgJiYgZGF0YT8ueCAhPSBudWxsID8gZm91bmRYKGRhdGEueCkgOiAtMTBcbiAgICAgICAgICB9LCAkeyFpc05hTihkYXRhPy55KSAmJiBkYXRhPy55ICE9IG51bGwgPyBmb3VuZFkoZGF0YS55KSA6IC0xMH0pYDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy50b29sdGlwPy5mb3JtYXQpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuX29wdGlvbnMudG9vbHRpcD8uZm9ybWF0KHRvb2x0aXBzRGF0YSk7XG5cbiAgICAgIGQzLnNlbGVjdCh0aGlzLl9jb250YWluZXIubmF0aXZlRWxlbWVudClcbiAgICAgICAgLnNlbGVjdCgnLnRvb2x0aXAtY2hhcnQnKVxuICAgICAgICAuc3R5bGUoJ3RvcCcsIHRvcClcbiAgICAgICAgLnN0eWxlKCdyaWdodCcsIHJpZ2h0KVxuICAgICAgICAuc3R5bGUoJ2JvdHRvbScsIGJvdHRvbSlcbiAgICAgICAgLnN0eWxlKCdsZWZ0JywgbGVmdClcbiAgICAgICAgLmh0bWwoZm9ybWF0dGVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvb2x0aXBQb3NpdGlvbihldmVudCkge1xuICAgIGNvbnN0IGNlbnRlclggPSB0aGlzLl93aWR0aCAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9IHRoaXMuX2hlaWdodCAvIDI7XG5cbiAgICBjb25zdCBwYWRkaW5nID0geyB4OiAxMCwgeTogMTAgfTtcblxuICAgIGNvbnN0IHNjZW5lID0ge1xuICAgICAgbGVmdDogZXZlbnQucGFnZVggPiBjZW50ZXJYID8gJ2luaXRpYWwnIDogYCR7ZXZlbnQucGFnZVggKyBwYWRkaW5nLnh9cHhgLFxuICAgICAgdG9wOiBldmVudC5wYWdlWSA+IGNlbnRlclkgPyAnaW5pdGlhbCcgOiBgJHtldmVudC5wYWdlWSArIHBhZGRpbmcueX1weGAsXG4gICAgICBib3R0b206XG4gICAgICAgIGV2ZW50LnBhZ2VZID4gY2VudGVyWVxuICAgICAgICAgID8gYCR7d2luZG93LmlubmVySGVpZ2h0IC0gZXZlbnQucGFnZVl9cHhgXG4gICAgICAgICAgOiAnaW5pdGlhbCcsXG4gICAgICByaWdodDpcbiAgICAgICAgZXZlbnQucGFnZVggPiBjZW50ZXJYXG4gICAgICAgICAgPyBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIGV2ZW50LnBhZ2VYICsgcGFkZGluZy54fXB4YFxuICAgICAgICAgIDogJ2luaXRpYWwnLFxuICAgIH07XG5cbiAgICByZXR1cm4gc2NlbmU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1hcmtlcnMoKSB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMudG9vbHRpcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9vcHRpb25zLnRvb2x0aXAuZW5hYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0QWxsKCcubWFya2VyJykucmVtb3ZlKCk7XG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0KCcubWFya2VyLWxpbmUnKS5yZW1vdmUoKTtcblxuICAgIHRoaXMuX2NoYXJ0XG4gICAgICAuYXBwZW5kKCdsaW5lJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdtYXJrZXItbGluZScpXG4gICAgICAuYXR0cigneDEnLCAzNSlcbiAgICAgIC5hdHRyKCd4MicsIHRoaXMuX3dpZHRoKVxuICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAwLjUpXG4gICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jb2xvci10ZXh0LTQwKScpXG4gICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXG4gICAgY29uc3QgeyBzZXJpZXMgfSA9IHRoaXMuX29wdGlvbnM7XG5cbiAgICBpZiAoIXNlcmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcmtlcnMgPSB0aGlzLl9jaGFydFxuICAgICAgLnNlbGVjdEFsbCgpXG4gICAgICAuZGF0YShzZXJpZXMuZmlsdGVyKChfKSA9PiBfLnZpc2libGUpKTtcblxuICAgIG1hcmtlcnNcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ21hcmtlcicpXG4gICAgICAuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAuYXR0cigncicsIDMpXG4gICAgICAuYXR0cignZmlsbCcsIChfLCBpKSA9PiBfLmNvbG9yKVxuICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgIGNvbnN0IG1vdXNlb3V0RXZlbnQgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9jaGFydC5zZWxlY3RBbGwoJy5tYXJrZXInKS5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICB0aGlzLl9jaGFydC5zZWxlY3QoJy5tYXJrZXItbGluZScpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgZDMuc2VsZWN0KHRoaXMuX2NvbnRhaW5lci5uYXRpdmVFbGVtZW50KVxuICAgICAgICAuc2VsZWN0KCcudG9vbHRpcC1jaGFydCcpXG4gICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgfTtcblxuICAgIGNvbnN0IG1vdXNlTW92ZUV2ZW50ID0gKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBldmVudCxcbiAgICAgICAgc2VyaWVzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5oYW5kbGVNb3VzZU1vdmUob3B0aW9ucyk7XG4gICAgfTtcblxuICAgIGNvbnN0IG1vdXNlT3ZlckV2ZW50ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX29wdGlvbnMudG9vbHRpcC5zaG93TWFya2Vycykge1xuICAgICAgICB0aGlzLl9jaGFydFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5tYXJrZXInKVxuICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsIChkOiBTZXJpZXM8QmFzZVBvaW50PikgPT4ge1xuICAgICAgICAgICAgaWYgKGQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ25vbmUnO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy50b29sdGlwLnNob3dMaW5lKSB7XG4gICAgICAgIHRoaXMuX2NoYXJ0LnNlbGVjdCgnLm1hcmtlci1saW5lJykuc3R5bGUoJ2Rpc3BsYXknLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgZDMuc2VsZWN0KHRoaXMuX2NvbnRhaW5lci5uYXRpdmVFbGVtZW50KVxuICAgICAgICAuc2VsZWN0KCcudG9vbHRpcC1jaGFydCcpXG4gICAgICAgIC5zdHlsZSgnZGlzcGxheScsIG51bGwpO1xuICAgIH07XG5cbiAgICB0aGlzLl9jaGFydFxuICAgICAgLm9uKCdtb3VzZW92ZXInLCBtb3VzZU92ZXJFdmVudClcbiAgICAgIC5vbignbW91c2Vtb3ZlJywgbW91c2VNb3ZlRXZlbnQpXG4gICAgICAub24oJ21vdXNlbGVhdmUnLCBtb3VzZW91dEV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0xlZ2VuZCgpIHtcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5sZWdlbmQ/LnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0QWxsKCcubGVnZW5kJykucmVtb3ZlKCk7XG5cbiAgICBjb25zdCBkcmF3ZXIgPSB0aGlzLl9vcHRpb25zLmxlZ2VuZD8udHlwZVxuICAgICAgPyBkZWZhdWx0TGVnZW5kRHJhd2VyTWFwcGluZy5nZXQodGhpcy5fb3B0aW9ucy5sZWdlbmQudHlwZSlcbiAgICAgIDogZGVmYXVsdExlZ2VuZERyYXdlck1hcHBpbmcuZ2V0KExlZ2VuZFR5cGUuc3dhdGNoZXMpO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2NvbnRhaW5lci5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKCFkcmF3ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIGRyYXdlciBmb3IgbGVnZW5kXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGRyYXdlci5kcmF3KHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBzZXJpZXM6IHRoaXMuX29wdGlvbnMuc2VyaWVzLmZpbHRlcigoXykgPT4gXy5zaG93SW5MZWdlbmQpLFxuICAgICAgd2lkdGg6IHRoaXMuX3dpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbHVjbGF0ZUNoYXJ0V2lkdGgoKSB7XG4gICAgbGV0IHdpZHRoID0gLXRoaXMuX3dpZHRoO1xuXG4gICAgaWYgKHRoaXMub2Zmc2V0T3Bwb3NpdGUgPiAwKSB7XG4gICAgICB3aWR0aCA9IC10aGlzLl93aWR0aCArIHRoaXMub2Zmc2V0T3Bwb3NpdGUgKyB0aGlzLm9mZnNldE5vbk9wcG9zaXRlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9mZnNldE5vbk9wcG9zaXRlID4gMCkge1xuICAgICAgd2lkdGggPVxuICAgICAgICAtdGhpcy5fd2lkdGggKyB0aGlzLl9vcHRpb25zLmJvdW5kcy5yaWdodCArIHRoaXMub2Zmc2V0Tm9uT3Bwb3NpdGU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5vZmZzZXRPcHBvc2l0ZSA+PSBBeGlzLm9mZnNldEZhY3RvciAmJlxuICAgICAgdGhpcy5vZmZzZXROb25PcHBvc2l0ZSA9PT0gMFxuICAgICkge1xuICAgICAgd2lkdGggPSAtdGhpcy5fd2lkdGggKyB0aGlzLm9mZnNldE9wcG9zaXRlICsgdGhpcy5fb3B0aW9ucy5ib3VuZHMubGVmdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRPcHBvc2l0ZSA+IDAgJiYgdGhpcy5vZmZzZXROb25PcHBvc2l0ZSA+IDApIHtcbiAgICAgIHdpZHRoID0gLXRoaXMuX3dpZHRoICsgdGhpcy5vZmZzZXRPcHBvc2l0ZSArIHRoaXMub2Zmc2V0Tm9uT3Bwb3NpdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguYWJzKHdpZHRoKTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0dyaWRMaW5lcygpIHtcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5ncmlkTGluZXMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNsYXRlWCA9XG4gICAgICB0aGlzLm9mZnNldE5vbk9wcG9zaXRlID4gMFxuICAgICAgICA/IHRoaXMub2Zmc2V0Tm9uT3Bwb3NpdGVcbiAgICAgICAgOiB0aGlzLl9vcHRpb25zLmJvdW5kcy5sZWZ0ICsgdGhpcy5vZmZzZXROb25PcHBvc2l0ZTtcblxuICAgIHRoaXMuX2NoYXJ0LnNlbGVjdEFsbCgnLmdyaWQnKS5yZW1vdmUoKTtcblxuICAgIGNvbnN0IHlMaXN0ID0gdGhpcy5feUF4aXNMaXN0LmZpbHRlcihcbiAgICAgIChfKSA9PiBfLm9wdGlvbnMudmlzaWJsZSAmJiAhXy5vcHRpb25zLm9wcG9zaXRlXG4gICAgKTtcblxuICAgIGNvbnN0IHk6IGFueSA9XG4gICAgICB5TGlzdD8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuX3lTY2FsZXMuZ2V0KHlMaXN0W3lMaXN0Lmxlbmd0aCAtIDFdLmluZGV4KVxuICAgICAgICA6IHRoaXMuX3lTY2FsZXMuZ2V0KDApO1xuXG4gICAgY29uc3QgeCA9IHRoaXMuX3hTY2FsZXMuZ2V0KDApO1xuXG4gICAgaWYgKCF5IHx8ICF4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgVElDS19IRUlHSFQgPSA0MDtcbiAgICBjb25zdCBUSUNLX1dJRFRIID0gNjA7XG5cbiAgICBjb25zdCB0aWNrQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX2hlaWdodCAvIFRJQ0tfSEVJR0hUKTtcbiAgICBjb25zdCB0aWNrQ291bnRYID0gTWF0aC5yb3VuZCh0aGlzLl93aWR0aCAvIFRJQ0tfV0lEVEgpO1xuXG4gICAgY29uc3QgZ3JpZFkgPSB0aGlzLl9jaGFydFxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ3JpZCBjb2xvci10ZXh0LTEwJylcbiAgICAgIC5zdHlsZSgnc2hhcGUtcmVuZGVyaW5nJywgJ2NyaXNwRWRnZXMnKTtcblxuICAgIGNvbnN0IGdyaWRsaW5lc1kgPSBkM1xuICAgICAgLmF4aXNMZWZ0KHkpXG4gICAgICAudGlja0Zvcm1hdCgnJyBhcyBhbnkpXG4gICAgICAudGlja1NpemUoLXRoaXMudmlzaWJsZUNoYXJ0V2luZG93V2lkdGgpO1xuXG4gICAgY29uc3QgaGFzQmFyU2VyaWVzVHlwZSA9IHRoaXMuX29wdGlvbnMuc2VyaWVzLnNvbWUoXG4gICAgICAoXykgPT4gXy50eXBlID09PSBTZXJpZXNUeXBlLmJhclxuICAgICk7XG5cbiAgICBpZiAoIWhhc0JhclNlcmllc1R5cGUpIHtcbiAgICAgIGNvbnN0IGdyaWRYID0gdGhpcy5fY2hhcnRcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdncmlkIGNvbG9yLXRleHQtMTAnKVxuICAgICAgICAuc3R5bGUoJ3NoYXBlLXJlbmRlcmluZycsICdjcmlzcEVkZ2VzJyk7XG5cbiAgICAgIGNvbnN0IGdyaWRsaW5lc1ggPSBkM1xuICAgICAgICAuYXhpc0JvdHRvbSh4KVxuICAgICAgICAudGlja3ModGlja0NvdW50WClcbiAgICAgICAgLnRpY2tGb3JtYXQoJycgYXMgYW55KVxuICAgICAgICAudGlja1NpemUoXG4gICAgICAgICAgdGhpcy5faGVpZ2h0IC0gdGhpcy5fb3B0aW9ucy5ib3VuZHMuYm90dG9tIC0gdGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wXG4gICAgICAgICk7XG5cbiAgICAgIGdyaWRYXG4gICAgICAgIC5jYWxsKGdyaWRsaW5lc1gpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7dGhpcy5fb3B0aW9ucy5ib3VuZHMudG9wfSlgKVxuICAgICAgICAubG93ZXIoKTtcbiAgICB9XG5cbiAgICBncmlkWVxuICAgICAgLmNhbGwoZ3JpZGxpbmVzWSlcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH0sICR7MH0pYClcbiAgICAgIC5sb3dlcigpO1xuXG4gICAgdGhpcy5fY2hhcnQuc2VsZWN0QWxsKCcuZ3JpZCBwYXRoJykucmVtb3ZlKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNjYWxlcygpIHtcbiAgICB0aGlzLl94U2NhbGVzLmNsZWFyKCk7XG4gICAgdGhpcy5feVNjYWxlcy5jbGVhcigpO1xuXG4gICAgY29uc3QgZGVmYXVsdFNjYWxlTWFwcGluZzogTWFwPFNjYWxlVHlwZSwgYW55PiA9IG5ldyBNYXA8U2NhbGVUeXBlLCBhbnk+KClcbiAgICAgIC5zZXQoU2NhbGVUeXBlLmxpbmVhciwgZDMuc2NhbGVMaW5lYXIpXG4gICAgICAuc2V0KFNjYWxlVHlwZS5sb2csIGQzLnNjYWxlTG9nKVxuICAgICAgLnNldChTY2FsZVR5cGUuc3FydCwgZDMuc2NhbGVTcXJ0KVxuICAgICAgLnNldChTY2FsZVR5cGUucG93LCBkMy5zY2FsZVBvdyk7XG5cbiAgICBjb25zdCB4UmFuZ2UgPSBbXG4gICAgICB0aGlzLm9mZnNldE5vbk9wcG9zaXRlXG4gICAgICAgID8gdGhpcy5vZmZzZXROb25PcHBvc2l0ZVxuICAgICAgICA6IHRoaXMuX29wdGlvbnMuYm91bmRzLmxlZnQsXG4gICAgICB0aGlzLl93aWR0aCAtXG4gICAgICAgICh0aGlzLm9mZnNldE9wcG9zaXRlXG4gICAgICAgICAgPyB0aGlzLm9mZnNldE9wcG9zaXRlXG4gICAgICAgICAgOiB0aGlzLl9vcHRpb25zLmJvdW5kcy5yaWdodCksXG4gICAgXTtcblxuICAgIGNvbnN0IHlSYW5nZSA9IFtcbiAgICAgIHRoaXMuX2hlaWdodCAtIHRoaXMuX29wdGlvbnMuYm91bmRzLmJvdHRvbSxcbiAgICAgIHRoaXMuX29wdGlvbnMuYm91bmRzLnRvcCxcbiAgICBdO1xuXG4gICAgdGhpcy5feEF4aXNMaXN0LmZvckVhY2goKGF4aXMsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgc2NhbGUgPSBudWxsO1xuXG4gICAgICBpZiAoYXhpcy5vcHRpb25zLnR5cGUgPT09IFNjYWxlLnRpbWUpIHtcbiAgICAgICAgc2NhbGUgPSBkM1xuICAgICAgICAgIC5zY2FsZVRpbWUoKVxuICAgICAgICAgIC5kb21haW4oYXhpcy5leHRlbnQpXG4gICAgICAgICAgLnJhbmdlKGF4aXMub3B0aW9ucy5pbnZlcnRlZCA/IFsuLi54UmFuZ2VdLnJldmVyc2UoKSA6IHhSYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChheGlzLm9wdGlvbnMudHlwZSA9PT0gU2NhbGUubnVtYmVyKSB7XG4gICAgICAgIHNjYWxlID0gZGVmYXVsdFNjYWxlTWFwcGluZ1xuICAgICAgICAgIC5nZXQoYXhpcy5vcHRpb25zLnNjYWxlT3B0aW9ucy50eXBlKSgpXG4gICAgICAgICAgLmRvbWFpbihheGlzLmV4dGVudClcbiAgICAgICAgICAucmFuZ2UoYXhpcy5vcHRpb25zLmludmVydGVkID8gWy4uLnhSYW5nZV0ucmV2ZXJzZSgpIDogeFJhbmdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMub3B0aW9ucy5uaWNlVGlja3MpIHtcbiAgICAgICAgc2NhbGUubmljZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXhpcy5vcHRpb25zLnNjYWxlT3B0aW9ucy50eXBlID09PSBTY2FsZVR5cGUubG9nKSB7XG4gICAgICAgIHNjYWxlLmJhc2UoYXhpcy5vcHRpb25zLnNjYWxlT3B0aW9ucy5iYXNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMub3B0aW9ucy5zY2FsZU9wdGlvbnMudHlwZSA9PT0gU2NhbGVUeXBlLnBvdykge1xuICAgICAgICBzY2FsZS5leHBvbmVudChheGlzLm9wdGlvbnMuc2NhbGVPcHRpb25zLmJhc2UpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl94U2NhbGVzLnNldChpbmRleCwgc2NhbGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5feUF4aXNMaXN0LmZvckVhY2goKGF4aXMsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgc2NhbGUgPSBudWxsO1xuXG4gICAgICBpZiAoYXhpcy5vcHRpb25zLnR5cGUgPT09IFNjYWxlLm51bWJlcikge1xuICAgICAgICBzY2FsZSA9IGRlZmF1bHRTY2FsZU1hcHBpbmdcbiAgICAgICAgICAuZ2V0KGF4aXMub3B0aW9ucy5zY2FsZU9wdGlvbnMudHlwZSkoKVxuICAgICAgICAgIC5kb21haW4oYXhpcy5leHRlbnQpXG4gICAgICAgICAgLnJhbmdlKGF4aXMub3B0aW9ucy5pbnZlcnRlZCA/IFsuLi55UmFuZ2VdLnJldmVyc2UoKSA6IHlSYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChheGlzLm9wdGlvbnMudHlwZSA9PT0gU2NhbGUudGltZSkge1xuICAgICAgICBzY2FsZSA9IGQzXG4gICAgICAgICAgLnNjYWxlVGltZSgpXG4gICAgICAgICAgLmRvbWFpbihheGlzLmV4dGVudClcbiAgICAgICAgICAucmFuZ2UoYXhpcy5vcHRpb25zLmludmVydGVkID8gWy4uLnlSYW5nZV0ucmV2ZXJzZSgpIDogeVJhbmdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMub3B0aW9ucy5uaWNlVGlja3MpIHtcbiAgICAgICAgc2NhbGUubmljZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXhpcy5vcHRpb25zLnNjYWxlT3B0aW9ucy50eXBlID09PSBTY2FsZVR5cGUubG9nKSB7XG4gICAgICAgIHNjYWxlLmJhc2UoYXhpcy5vcHRpb25zLnNjYWxlT3B0aW9ucy5iYXNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMub3B0aW9ucy5zY2FsZU9wdGlvbnMudHlwZSA9PT0gU2NhbGVUeXBlLnBvdykge1xuICAgICAgICBzY2FsZS5leHBvbmVudChheGlzLm9wdGlvbnMuc2NhbGVPcHRpb25zLmJhc2UpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl95U2NhbGVzLnNldChpbmRleCwgc2NhbGUpO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5feVNjYWxlcykge1xuICAgICAgdGhpcy5fY2xvbmVkWS5zZXQoa2V5LCB2YWx1ZS5jb3B5KCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuX3hTY2FsZXMpIHtcbiAgICAgIHRoaXMuX2Nsb25lZFguc2V0KGtleSwgdmFsdWUuY29weSgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRyYXdBeGlzKCkge1xuICAgIGNvbnN0IGhhc1Zpc2libGVBeGlzID0gWy4uLnRoaXMuX3hBeGlzTGlzdCwgLi4udGhpcy5feUF4aXNMaXN0XS5maWx0ZXIoXG4gICAgICAoYXhpcykgPT4gYXhpcy5vcHRpb25zLnZpc2libGVcbiAgICApO1xuXG4gICAgaWYgKCFoYXNWaXNpYmxlQXhpcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5lZ2F0aXZlID0gZmFsc2U7XG5cbiAgICB0aGlzLl9jaGFydC5zZWxlY3RBbGwoJy5heGVzJykucmVtb3ZlKCk7XG5cbiAgICBjb25zdCBheGVzID0gdGhpcy5fY2hhcnRcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4ZXMnKVxuICAgICAgLnN0eWxlKCdzaGFwZS1yZW5kZXJpbmcnLCAnY3Jpc3BFZGdlcycpO1xuXG4gICAgY29uc3QgVElDS19IRUlHSFQgPSA0MDtcbiAgICBjb25zdCBUSUNLX1dJRFRIID0gNjA7XG5cbiAgICBjb25zdCB0aWNrQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX2hlaWdodCAvIFRJQ0tfSEVJR0hUKTtcbiAgICBjb25zdCB0aWNrQ291bnRYID0gTWF0aC5yb3VuZCh0aGlzLl93aWR0aCAvIFRJQ0tfV0lEVEgpO1xuXG4gICAgdGhpcy5feEF4aXNMaXN0LmZvckVhY2goKGF4aXMpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IEF4aXNPcHRpb25zID0gYXhpcy5vcHRpb25zO1xuXG4gICAgICBjb25zdCB0cmFuc2xhdGUgPSBgdHJhbnNsYXRlKCR7MH0sICR7XG4gICAgICAgIHRoaXMuX2hlaWdodCAtIHRoaXMuX29wdGlvbnMuYm91bmRzLmJvdHRvbVxuICAgICAgfSlgO1xuXG4gICAgICBjb25zdCB4ID0gdGhpcy5feFNjYWxlcy5nZXQoYXhpcy5pbmRleCk7XG5cbiAgICAgIGNvbnN0IHhBeGlzID0gZDMuYXhpc0JvdHRvbSh4KS50aWNrcyh0aWNrQ291bnRYKTtcblxuICAgICAgaWYgKGF4aXMub3B0aW9ucz8udGlja0Zvcm1hdCkge1xuICAgICAgICB4QXhpcy50aWNrRm9ybWF0KGF4aXMub3B0aW9ucy50aWNrRm9ybWF0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlWCA9IHRoaXMub2Zmc2V0Tm9uT3Bwb3NpdGVcbiAgICAgICAgICA/IHRoaXMub2Zmc2V0Tm9uT3Bwb3NpdGVcbiAgICAgICAgICA6IHRoaXMuX29wdGlvbnMuYm91bmRzLmxlZnQgKyB0aGlzLm9mZnNldE5vbk9wcG9zaXRlO1xuXG4gICAgICAgIGF4ZXNcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAneC1heGlzLWxhYmVsJylcbiAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY29sb3ItdGV4dC01MCknKVxuICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgICAgICAndHJhbnNsYXRlKCcgK1xuICAgICAgICAgICAgICB0aGlzLl93aWR0aCAvIDIgK1xuICAgICAgICAgICAgICAnICwnICtcbiAgICAgICAgICAgICAgKHRoaXMuX2hlaWdodCAtIHRoaXMuX29wdGlvbnMuYm91bmRzLmJvdHRvbSkgK1xuICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICApXG4gICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAgIC5hdHRyKCdkeScsICczZW0nKVxuICAgICAgICAgIC50ZXh0KG9wdGlvbnMudGl0bGUgPz8gJycpO1xuXG4gICAgICAgIGF4ZXNcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAneC1heGlzIGZvbnQtY2FwdGlvbicpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEteC1zY2FsZS1pZCcsIGF4aXMuaW5kZXgpXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHRyYW5zbGF0ZSlcbiAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgIC5jYWxsKHhBeGlzKVxuICAgICAgICAgIC5jYWxsKChfKSA9PiB7XG4gICAgICAgICAgICBfLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgXy5zZWxlY3RBbGwoJy50aWNrJykuYXR0cignY2xhc3MnLCAnY29sb3ItdGV4dC01MCcpO1xuXG4gICAgICAgICAgICBpZiAobmVnYXRpdmUpIHtcbiAgICAgICAgICAgICAgXy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgdGhpcy5faGVpZ2h0KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7eCgwKX0sIC0ke3RoaXMuX2hlaWdodH0pYClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDAuNSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jb2xvci10ZXh0LTUwKScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgIC5hdHRyKCd4MScsIDApXG4gICAgICAgICAgICAgIC5hdHRyKCd4MicsIHRoaXMudmlzaWJsZUNoYXJ0V2luZG93V2lkdGgpXG4gICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH0sICR7MH0pYClcbiAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAwLjUpXG4gICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNvbG9yLXRleHQtNTApJyk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl95QXhpc0xpc3QuZm9yRWFjaCgoYXhpcykgPT4ge1xuICAgICAgY29uc3QgdHJhbnNsYXRlID0gYXhpcy5vcHRpb25zLm9wcG9zaXRlXG4gICAgICAgID8gYHRyYW5zbGF0ZSgke3RoaXMuX3dpZHRoIC0gYXhpcy5vZmZzZXR9LCAkezB9KWBcbiAgICAgICAgOiBgdHJhbnNsYXRlKCR7YXhpcy5vZmZzZXR9LCAkezB9KWA7XG5cbiAgICAgIGNvbnN0IHkgPSB0aGlzLl95U2NhbGVzLmdldChheGlzLmluZGV4KTtcblxuICAgICAgY29uc3QgeUF4aXMgPSBheGlzLm9wdGlvbnMub3Bwb3NpdGUgPyBkMy5heGlzUmlnaHQoeSkgOiBkMy5heGlzTGVmdCh5KTtcblxuICAgICAgaWYgKGF4aXMub3B0aW9ucy52aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICBjb25zdCBsYWJlbE9mZnNldCA9IGF4aXMub3B0aW9ucy5vcHBvc2l0ZVxuICAgICAgICAgID8gdGhpcy5fd2lkdGggLSBheGlzLm9mZnNldCArIGF4aXMud2lkdGhcbiAgICAgICAgICA6IGF4aXMub2Zmc2V0IC0gYXhpcy53aWR0aDtcblxuICAgICAgICBheGVzXG4gICAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3ktYXhpcy1sYWJlbCcpXG4gICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNvbG9yLXRleHQtNTApJylcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcbiAgICAgICAgICAuYXR0cigneScsIGxhYmVsT2Zmc2V0KVxuICAgICAgICAgIC5hdHRyKCd4JywgMCAtIHRoaXMuX2hlaWdodCAvIDIpXG4gICAgICAgICAgLmF0dHIoJ2R5JywgYXhpcy5vcHRpb25zLm9wcG9zaXRlID8gJzEycHgnIDogJy0zcHgnKVxuICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgICAudGV4dChheGlzLm9wdGlvbnMudGl0bGUgPz8gJycpO1xuXG4gICAgICAgIGF4ZXNcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAneS1heGlzIGZvbnQtY2FwdGlvbicpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEteS1zY2FsZS1pZCcsIGF4aXMuaW5kZXgpXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHRyYW5zbGF0ZSlcbiAgICAgICAgICAuY2FsbCh5QXhpcylcbiAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgIC5jYWxsKChfKSA9PiB7XG4gICAgICAgICAgICBfLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgXy5zZWxlY3RBbGwoJy50aWNrJykuYXR0cignY2xhc3MnLCAnY29sb3ItdGV4dC01MCcpO1xuXG4gICAgICAgICAgICBpZiAoIW5lZ2F0aXZlKSB7XG4gICAgICAgICAgICAgIF8uYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgICAgICAgJ3kyJyxcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2hlaWdodCAtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuYm91bmRzLnRvcCAtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuYm91bmRzLmJvdHRvbVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgICAgICAgYHRyYW5zbGF0ZSgkezB9LCAke3RoaXMuX29wdGlvbnMuYm91bmRzLnRvcH0pYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDAuNSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jb2xvci10ZXh0LTUwKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=