@bizdoc/core 3.2.10 → 3.3.2

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 (448) hide show
  1. package/assets/themes/brown.min.css +1 -1
  2. package/assets/themes/dark.min.css +3 -3
  3. package/assets/themes/deep-purple-light-blue.min.css +1 -1
  4. package/assets/themes/deep-purple-teal.min.css +1 -1
  5. package/assets/themes/default.min.css +8 -8
  6. package/assets/themes/green.min.css +1 -1
  7. package/assets/themes/indigo-amber.min.css +1 -1
  8. package/assets/themes/indigo.min.css +1 -1
  9. package/fesm2022/bizdoc-core.mjs +2068 -1866
  10. package/fesm2022/bizdoc-core.mjs.map +1 -1
  11. package/lib/admin/admin-menu.component.d.ts +1 -3
  12. package/lib/admin/architecture/designer.base.d.ts +3 -3
  13. package/lib/admin/architecture/elements/form.component.d.ts +1 -1
  14. package/lib/compose/trace/trace.base.d.ts +1 -1
  15. package/lib/core/base.d.ts +5 -0
  16. package/lib/core/fields/options.base.d.ts +2 -2
  17. package/lib/core/inputs/combination-picker-body.d.ts +0 -2
  18. package/lib/core/inputs/combination-picker.d.ts +1 -1
  19. package/lib/core/session.service.d.ts +2 -2
  20. package/lib/core/tagging/tagging.component-base.d.ts +1 -1
  21. package/lib/core/translate.service.d.ts +2 -2
  22. package/lib/cube/matrix/matrix.base.d.ts +1 -1
  23. package/lib/cube/view-base.d.ts +1 -1
  24. package/lib/dashboard/cube/cube-analysis.base.d.ts +1 -1
  25. package/lib/home/home-base.component.d.ts +1 -1
  26. package/lib/home/home.desktop.component.d.ts +5 -3
  27. package/lib/notifications/types/notification-base.d.ts +1 -1
  28. package/lib/reports/cube/usage-base.d.ts +1 -1
  29. package/lib/views/cube/cube-base.d.ts +1 -1
  30. package/package.json +31 -33
  31. package/esm2022/bizdoc-core.mjs +0 -5
  32. package/esm2022/lib/admin/admin-dismiss.service.mjs +0 -28
  33. package/esm2022/lib/admin/admin-menu.component.mjs +0 -24
  34. package/esm2022/lib/admin/architecture/cube-axes-filter.component.mjs +0 -93
  35. package/esm2022/lib/admin/architecture/declarations.mjs +0 -79
  36. package/esm2022/lib/admin/architecture/designer-element.component.mjs +0 -270
  37. package/esm2022/lib/admin/architecture/designer-privileges.component.mjs +0 -96
  38. package/esm2022/lib/admin/architecture/designer.base.mjs +0 -136
  39. package/esm2022/lib/admin/architecture/designer.component.mjs +0 -396
  40. package/esm2022/lib/admin/architecture/elements/action.component.mjs +0 -43
  41. package/esm2022/lib/admin/architecture/elements/analysis-view.component.mjs +0 -50
  42. package/esm2022/lib/admin/architecture/elements/analysis-widget.component.mjs +0 -49
  43. package/esm2022/lib/admin/architecture/elements/anomaly-rule.component.mjs +0 -29
  44. package/esm2022/lib/admin/architecture/elements/attribute.component.mjs +0 -35
  45. package/esm2022/lib/admin/architecture/elements/box-form.component.mjs +0 -49
  46. package/esm2022/lib/admin/architecture/elements/configuration-datasource.component.mjs +0 -66
  47. package/esm2022/lib/admin/architecture/elements/control.component.mjs +0 -21
  48. package/esm2022/lib/admin/architecture/elements/cube-index-utility.component.mjs +0 -32
  49. package/esm2022/lib/admin/architecture/elements/cube-view.component.mjs +0 -34
  50. package/esm2022/lib/admin/architecture/elements/cube.component.mjs +0 -254
  51. package/esm2022/lib/admin/architecture/elements/document-state-widget.component.mjs +0 -40
  52. package/esm2022/lib/admin/architecture/elements/documents-report.component.mjs +0 -34
  53. package/esm2022/lib/admin/architecture/elements/documents-widget.component.mjs +0 -40
  54. package/esm2022/lib/admin/architecture/elements/explore-view.component.mjs +0 -35
  55. package/esm2022/lib/admin/architecture/elements/folder.component.mjs +0 -56
  56. package/esm2022/lib/admin/architecture/elements/form-invite.dialog.mjs +0 -126
  57. package/esm2022/lib/admin/architecture/elements/form.component.mjs +0 -156
  58. package/esm2022/lib/admin/architecture/elements/guide.component.mjs +0 -53
  59. package/esm2022/lib/admin/architecture/elements/job.component.mjs +0 -57
  60. package/esm2022/lib/admin/architecture/elements/matrix-view.component.mjs +0 -98
  61. package/esm2022/lib/admin/architecture/elements/node.component.mjs +0 -18
  62. package/esm2022/lib/admin/architecture/elements/parallel-view.component.mjs +0 -38
  63. package/esm2022/lib/admin/architecture/elements/performance-report.component.mjs +0 -32
  64. package/esm2022/lib/admin/architecture/elements/performance-widget.component.mjs +0 -34
  65. package/esm2022/lib/admin/architecture/elements/pivot-view.component.mjs +0 -40
  66. package/esm2022/lib/admin/architecture/elements/policy.component.mjs +0 -18
  67. package/esm2022/lib/admin/architecture/elements/report.component.mjs +0 -29
  68. package/esm2022/lib/admin/architecture/elements/return-to-role-action.component.mjs +0 -33
  69. package/esm2022/lib/admin/architecture/elements/role.component.mjs +0 -43
  70. package/esm2022/lib/admin/architecture/elements/rule.component.mjs +0 -18
  71. package/esm2022/lib/admin/architecture/elements/source.component.mjs +0 -25
  72. package/esm2022/lib/admin/architecture/elements/state.component.mjs +0 -44
  73. package/esm2022/lib/admin/architecture/elements/sum-view.component.mjs +0 -38
  74. package/esm2022/lib/admin/architecture/elements/tasks-report.component.mjs +0 -39
  75. package/esm2022/lib/admin/architecture/elements/type.component.mjs +0 -83
  76. package/esm2022/lib/admin/architecture/elements/usage-report.component.mjs +0 -64
  77. package/esm2022/lib/admin/architecture/elements/utility.component.mjs +0 -18
  78. package/esm2022/lib/admin/architecture/elements/view.component.mjs +0 -18
  79. package/esm2022/lib/admin/architecture/elements/widget.component.mjs +0 -29
  80. package/esm2022/lib/admin/architecture/icon-picker.component.mjs +0 -173
  81. package/esm2022/lib/admin/core/ace.input.mjs +0 -144
  82. package/esm2022/lib/admin/core/color-picker.input.mjs +0 -183
  83. package/esm2022/lib/admin/core/localized-string.component.mjs +0 -129
  84. package/esm2022/lib/admin/core/search.input.mjs +0 -52
  85. package/esm2022/lib/admin/diff/configuration-diff.component.mjs +0 -573
  86. package/esm2022/lib/admin/document-trace/document-trace.component.mjs +0 -537
  87. package/esm2022/lib/admin/document-trace/reassign.dialog.mjs +0 -39
  88. package/esm2022/lib/admin/document-trace/timeline.mjs +0 -2
  89. package/esm2022/lib/admin/document-trace/trace-element.component.mjs +0 -125
  90. package/esm2022/lib/admin/form/designer/box-designer.component.mjs +0 -270
  91. package/esm2022/lib/admin/form/designer/declarations.mjs +0 -2
  92. package/esm2022/lib/admin/form/designer/design-control.component.mjs +0 -41
  93. package/esm2022/lib/admin/form/designer/properties.component.mjs +0 -71
  94. package/esm2022/lib/admin/form/designer/section.component.mjs +0 -53
  95. package/esm2022/lib/admin/form/designer/settings.component.mjs +0 -51
  96. package/esm2022/lib/admin/form/form.resolve.service.mjs +0 -18
  97. package/esm2022/lib/admin/form/workflow/node-ref.mjs +0 -8
  98. package/esm2022/lib/admin/form/workflow/node.component.mjs +0 -156
  99. package/esm2022/lib/admin/form/workflow/role-node.component.mjs +0 -88
  100. package/esm2022/lib/admin/form/workflow/workflow.component.mjs +0 -586
  101. package/esm2022/lib/admin/indices/manage-cube-index.component.mjs +0 -160
  102. package/esm2022/lib/admin/patterns/patterns.component.mjs +0 -180
  103. package/esm2022/lib/admin/permissions/permissions.component.mjs +0 -98
  104. package/esm2022/lib/admin/positions/positions-popup.component.mjs +0 -75
  105. package/esm2022/lib/admin/positions/positions.component.mjs +0 -463
  106. package/esm2022/lib/admin/profiler/outofoffice.component.mjs +0 -156
  107. package/esm2022/lib/admin/profiler/profiler.component.mjs +0 -284
  108. package/esm2022/lib/admin/system.service.mjs +0 -127
  109. package/esm2022/lib/admin/utility-ref.mjs +0 -39
  110. package/esm2022/lib/admin/utility-wrapper.component.mjs +0 -53
  111. package/esm2022/lib/admin/utility.pane.component.mjs +0 -48
  112. package/esm2022/lib/app.component.mjs +0 -73
  113. package/esm2022/lib/bizdoc.module.mjs +0 -110
  114. package/esm2022/lib/browse/browse-items.component.mjs +0 -496
  115. package/esm2022/lib/browse/browse.mobile.component.mjs +0 -102
  116. package/esm2022/lib/browse/browse.pane.component.mjs +0 -169
  117. package/esm2022/lib/browse/expanded-item/expanded-item.component.mjs +0 -316
  118. package/esm2022/lib/browse/filter/filter.component.mjs +0 -140
  119. package/esm2022/lib/browse/folders-menu.component.mjs +0 -49
  120. package/esm2022/lib/chat/chat-info.mjs +0 -77
  121. package/esm2022/lib/chat/chat.mobile.component.mjs +0 -24
  122. package/esm2022/lib/chat/chat.service.mjs +0 -122
  123. package/esm2022/lib/chat/contacts.component.mjs +0 -107
  124. package/esm2022/lib/chat/contacts.pane.component.mjs +0 -26
  125. package/esm2022/lib/chat/conversation.component.mjs +0 -196
  126. package/esm2022/lib/chat/conversation.pane.component.mjs +0 -46
  127. package/esm2022/lib/compose/action/action-picker.component.mjs +0 -82
  128. package/esm2022/lib/compose/action/action-ref.mjs +0 -19
  129. package/esm2022/lib/compose/action/action.base.mjs +0 -50
  130. package/esm2022/lib/compose/action/action.dialog.mjs +0 -62
  131. package/esm2022/lib/compose/action/action.pane.dialog.exp.mjs +0 -68
  132. package/esm2022/lib/compose/action/assign-action.component.mjs +0 -77
  133. package/esm2022/lib/compose/action/moveto-action.component.mjs +0 -90
  134. package/esm2022/lib/compose/action/return-action.component.mjs +0 -51
  135. package/esm2022/lib/compose/attachments/attachments.component.mjs +0 -130
  136. package/esm2022/lib/compose/attachments/preview/attachment-preview.component.mjs +0 -157
  137. package/esm2022/lib/compose/attachments/progress-button.directive.mjs +0 -25
  138. package/esm2022/lib/compose/box/box.component.mjs +0 -44
  139. package/esm2022/lib/compose/box/control.component.mjs +0 -50
  140. package/esm2022/lib/compose/box/row.component.mjs +0 -41
  141. package/esm2022/lib/compose/can-deactivate-changes.service.mjs +0 -27
  142. package/esm2022/lib/compose/comments/comment.component.mjs +0 -188
  143. package/esm2022/lib/compose/comments/comments.component.mjs +0 -226
  144. package/esm2022/lib/compose/comments/comments.pane.component.mjs +0 -40
  145. package/esm2022/lib/compose/comments/edit-comment.component.mjs +0 -32
  146. package/esm2022/lib/compose/comments/edits.component.mjs +0 -30
  147. package/esm2022/lib/compose/comments/quick-comment.component.exp.mjs +0 -64
  148. package/esm2022/lib/compose/comments/votes.component.mjs +0 -42
  149. package/esm2022/lib/compose/compose-resolve.service.mjs +0 -34
  150. package/esm2022/lib/compose/compose.mobile.component.mjs +0 -114
  151. package/esm2022/lib/compose/compose.pane.component.mjs +0 -202
  152. package/esm2022/lib/compose/copy/copy.dialog.mjs +0 -45
  153. package/esm2022/lib/compose/dismiss.service.mjs +0 -25
  154. package/esm2022/lib/compose/document-resolve.service.mjs +0 -33
  155. package/esm2022/lib/compose/document-resolver.service.mjs +0 -17
  156. package/esm2022/lib/compose/document.component.mjs +0 -48
  157. package/esm2022/lib/compose/document.mobile.component.mjs +0 -23
  158. package/esm2022/lib/compose/document.pane.component.mjs +0 -27
  159. package/esm2022/lib/compose/events/events.component.mjs +0 -29
  160. package/esm2022/lib/compose/form-ref.mjs +0 -43
  161. package/esm2022/lib/compose/form-selector/form-selector.sheet.mjs +0 -57
  162. package/esm2022/lib/compose/form.component.mjs +0 -512
  163. package/esm2022/lib/compose/new-menu.component.mjs +0 -94
  164. package/esm2022/lib/compose/overlay.component.exp.mjs +0 -71
  165. package/esm2022/lib/compose/privilage.directive.mjs +0 -64
  166. package/esm2022/lib/compose/recipient-resolver.service.mjs +0 -18
  167. package/esm2022/lib/compose/state.component.mjs +0 -37
  168. package/esm2022/lib/compose/tag/tags.component.mjs +0 -89
  169. package/esm2022/lib/compose/trace/flow.component.mjs +0 -687
  170. package/esm2022/lib/compose/trace/people.component.mjs +0 -39
  171. package/esm2022/lib/compose/trace/trace.base.mjs +0 -79
  172. package/esm2022/lib/compose/trace/trace.component.mjs +0 -353
  173. package/esm2022/lib/compose/trace/trace.pane.component.mjs +0 -48
  174. package/esm2022/lib/compose/version-compare/version-compare.component.mjs +0 -58
  175. package/esm2022/lib/compose/version-compare/version-compare.directive.mjs +0 -343
  176. package/esm2022/lib/compose/version-compare/version.pane.component.mjs +0 -53
  177. package/esm2022/lib/core/account.service.mjs +0 -38
  178. package/esm2022/lib/core/animated-icon/animated-icon.directive.mjs +0 -17
  179. package/esm2022/lib/core/animations.mjs +0 -168
  180. package/esm2022/lib/core/authentication.mjs +0 -4
  181. package/esm2022/lib/core/avatar/avatar.component.mjs +0 -111
  182. package/esm2022/lib/core/base.mjs +0 -2
  183. package/esm2022/lib/core/checkbox.mjs +0 -38
  184. package/esm2022/lib/core/colors.mjs +0 -322
  185. package/esm2022/lib/core/component-factory-resolver.mjs +0 -48
  186. package/esm2022/lib/core/configuration.mjs +0 -17
  187. package/esm2022/lib/core/datasource.service.mjs +0 -75
  188. package/esm2022/lib/core/decorators.mjs +0 -46
  189. package/esm2022/lib/core/document-factory.service.mjs +0 -156
  190. package/esm2022/lib/core/fields/address.designer.mjs +0 -39
  191. package/esm2022/lib/core/fields/address.field.mjs +0 -65
  192. package/esm2022/lib/core/fields/autocomplete.field.mjs +0 -136
  193. package/esm2022/lib/core/fields/axes-picker.designer.mjs +0 -59
  194. package/esm2022/lib/core/fields/axes-picker.field.mjs +0 -46
  195. package/esm2022/lib/core/fields/checkbox.designer.mjs +0 -38
  196. package/esm2022/lib/core/fields/checkbox.field.mjs +0 -35
  197. package/esm2022/lib/core/fields/checklist.designer.mjs +0 -98
  198. package/esm2022/lib/core/fields/checklist.field.mjs +0 -36
  199. package/esm2022/lib/core/fields/date-range.designer.mjs +0 -43
  200. package/esm2022/lib/core/fields/date-range.field.mjs +0 -46
  201. package/esm2022/lib/core/fields/date.designer.mjs +0 -40
  202. package/esm2022/lib/core/fields/date.field.mjs +0 -40
  203. package/esm2022/lib/core/fields/expression.field.mjs +0 -87
  204. package/esm2022/lib/core/fields/file.designer.mjs +0 -39
  205. package/esm2022/lib/core/fields/file.field.mjs +0 -35
  206. package/esm2022/lib/core/fields/html.designer.mjs +0 -61
  207. package/esm2022/lib/core/fields/html.field.mjs +0 -44
  208. package/esm2022/lib/core/fields/input.designer.mjs +0 -38
  209. package/esm2022/lib/core/fields/input.field.mjs +0 -54
  210. package/esm2022/lib/core/fields/localized-string.field.mjs +0 -49
  211. package/esm2022/lib/core/fields/numeric.designer.mjs +0 -72
  212. package/esm2022/lib/core/fields/numeric.field.mjs +0 -37
  213. package/esm2022/lib/core/fields/options.base.mjs +0 -41
  214. package/esm2022/lib/core/fields/options.component.mjs +0 -58
  215. package/esm2022/lib/core/fields/radio-button.designer.mjs +0 -39
  216. package/esm2022/lib/core/fields/radio-button.field.mjs +0 -33
  217. package/esm2022/lib/core/fields/select.designer.mjs +0 -104
  218. package/esm2022/lib/core/fields/select.field.mjs +0 -36
  219. package/esm2022/lib/core/fields/signature.designer.mjs +0 -37
  220. package/esm2022/lib/core/fields/signature.field.mjs +0 -52
  221. package/esm2022/lib/core/fields/switch.field.mjs +0 -35
  222. package/esm2022/lib/core/fields/tags.designer.mjs +0 -28
  223. package/esm2022/lib/core/fields/tags.field.mjs +0 -51
  224. package/esm2022/lib/core/fields/textarea.designer.mjs +0 -33
  225. package/esm2022/lib/core/fields/textarea.field.mjs +0 -37
  226. package/esm2022/lib/core/fields/time.designer.mjs +0 -41
  227. package/esm2022/lib/core/fields/time.field.mjs +0 -39
  228. package/esm2022/lib/core/fields/timespan.field.mjs +0 -82
  229. package/esm2022/lib/core/fields/yesno.designer.mjs +0 -52
  230. package/esm2022/lib/core/fields/yesno.field.mjs +0 -34
  231. package/esm2022/lib/core/firebase.service.mjs +0 -51
  232. package/esm2022/lib/core/functions.mjs +0 -225
  233. package/esm2022/lib/core/guide/guide.component.mjs +0 -220
  234. package/esm2022/lib/core/guide/guide.service.mjs +0 -124
  235. package/esm2022/lib/core/guide/help-tip.component.mjs +0 -52
  236. package/esm2022/lib/core/http.interceptor.mjs +0 -63
  237. package/esm2022/lib/core/hub.service.mjs +0 -117
  238. package/esm2022/lib/core/identity/identity.component.mjs +0 -66
  239. package/esm2022/lib/core/info/attachment-info.service.mjs +0 -53
  240. package/esm2022/lib/core/info/document-info.service.mjs +0 -21
  241. package/esm2022/lib/core/info/location-info.component.mjs +0 -60
  242. package/esm2022/lib/core/info/map-info.mjs +0 -42
  243. package/esm2022/lib/core/inputs/address.input.mjs +0 -203
  244. package/esm2022/lib/core/inputs/auto-complete.input.mjs +0 -273
  245. package/esm2022/lib/core/inputs/combination-picker-body.mjs +0 -171
  246. package/esm2022/lib/core/inputs/combination-picker.mjs +0 -285
  247. package/esm2022/lib/core/inputs/combination-pool.mjs +0 -105
  248. package/esm2022/lib/core/inputs/file.input.mjs +0 -432
  249. package/esm2022/lib/core/inputs/select.input.mjs +0 -254
  250. package/esm2022/lib/core/inputs/signature.input.mjs +0 -150
  251. package/esm2022/lib/core/inputs/time-picker.mjs +0 -195
  252. package/esm2022/lib/core/inputs/timespan.input.mjs +0 -180
  253. package/esm2022/lib/core/layout.component.mjs +0 -93
  254. package/esm2022/lib/core/lottie-animation.exp.mjs +0 -49
  255. package/esm2022/lib/core/mailbox.service.mjs +0 -445
  256. package/esm2022/lib/core/models.mjs +0 -25
  257. package/esm2022/lib/core/none.component.mjs +0 -37
  258. package/esm2022/lib/core/pipes/action.pipe.mjs +0 -25
  259. package/esm2022/lib/core/pipes/calendar.pipe.mjs +0 -72
  260. package/esm2022/lib/core/pipes/date-format.pipe.mjs +0 -19
  261. package/esm2022/lib/core/pipes/daterange.pipe.mjs +0 -62
  262. package/esm2022/lib/core/pipes/difference.pipe.mjs +0 -15
  263. package/esm2022/lib/core/pipes/duration-format.pipe.mjs +0 -48
  264. package/esm2022/lib/core/pipes/duration.pipe.mjs +0 -19
  265. package/esm2022/lib/core/pipes/filter.pipe.mjs +0 -25
  266. package/esm2022/lib/core/pipes/form.pipe.mjs +0 -25
  267. package/esm2022/lib/core/pipes/join.pipe.mjs +0 -18
  268. package/esm2022/lib/core/pipes/localized-string.pipe.mjs +0 -26
  269. package/esm2022/lib/core/pipes/role.pipe.mjs +0 -25
  270. package/esm2022/lib/core/pipes/sanitize-html.pipe.mjs +0 -18
  271. package/esm2022/lib/core/pipes/sort.pipe.mjs +0 -42
  272. package/esm2022/lib/core/pipes/state.pipe.mjs +0 -25
  273. package/esm2022/lib/core/pipes/time-ago.pipe.mjs +0 -51
  274. package/esm2022/lib/core/pipes/to-now.pipe.mjs +0 -66
  275. package/esm2022/lib/core/pipes/translate.pipe.mjs +0 -58
  276. package/esm2022/lib/core/pipes/type-value.pipe.mjs +0 -42
  277. package/esm2022/lib/core/pipes/user-name.pipe.mjs +0 -21
  278. package/esm2022/lib/core/popup/popup-ref.mjs +0 -20
  279. package/esm2022/lib/core/popup/popup.component.mjs +0 -36
  280. package/esm2022/lib/core/popup/popup.service.mjs +0 -158
  281. package/esm2022/lib/core/popup/tooltip.directive.mjs +0 -81
  282. package/esm2022/lib/core/prompt/ask/ask.dialog.mjs +0 -29
  283. package/esm2022/lib/core/prompt/mask/mask.component.mjs +0 -21
  284. package/esm2022/lib/core/prompt.service.mjs +0 -88
  285. package/esm2022/lib/core/router.mjs +0 -37
  286. package/esm2022/lib/core/save-changes.dialog.mjs +0 -18
  287. package/esm2022/lib/core/session.service.mjs +0 -291
  288. package/esm2022/lib/core/slots/pane-ref.mjs +0 -152
  289. package/esm2022/lib/core/slots/router.directive.mjs +0 -68
  290. package/esm2022/lib/core/slots/router.service.mjs +0 -40
  291. package/esm2022/lib/core/slots/slots.component.mjs +0 -1193
  292. package/esm2022/lib/core/sticky-toolbar.exp.mjs +0 -33
  293. package/esm2022/lib/core/tagging/documents.component.mjs +0 -25
  294. package/esm2022/lib/core/tagging/edit-input.component.mjs +0 -238
  295. package/esm2022/lib/core/tagging/emoji.component.mjs +0 -35
  296. package/esm2022/lib/core/tagging/tagging-item.directive.mjs +0 -39
  297. package/esm2022/lib/core/tagging/tagging.component-base.mjs +0 -29
  298. package/esm2022/lib/core/tagging/tagging.directive.mjs +0 -136
  299. package/esm2022/lib/core/tagging/tagging.pipe.mjs +0 -72
  300. package/esm2022/lib/core/tagging/users.component.mjs +0 -32
  301. package/esm2022/lib/core/translate.service.mjs +0 -125
  302. package/esm2022/lib/core/translations.mjs +0 -1068
  303. package/esm2022/lib/core/virtual-tabs.component.exp.mjs +0 -84
  304. package/esm2022/lib/core/window-title.service.mjs +0 -65
  305. package/esm2022/lib/cube/accum/accum.component.mjs +0 -262
  306. package/esm2022/lib/cube/chart/chart.component.mjs +0 -345
  307. package/esm2022/lib/cube/cube-info.service.mjs +0 -103
  308. package/esm2022/lib/cube/cube-menu.component.mjs +0 -25
  309. package/esm2022/lib/cube/cube-view.component.mjs +0 -186
  310. package/esm2022/lib/cube/cube.service.mjs +0 -446
  311. package/esm2022/lib/cube/declarations.mjs +0 -2
  312. package/esm2022/lib/cube/explore/document-item.component.mjs +0 -38
  313. package/esm2022/lib/cube/explore/explore-item.component.mjs +0 -27
  314. package/esm2022/lib/cube/explore/explore-items.component.mjs +0 -193
  315. package/esm2022/lib/cube/explore/explore.pane.component.mjs +0 -78
  316. package/esm2022/lib/cube/explore/item-resolver.service.mjs +0 -30
  317. package/esm2022/lib/cube/explore/item.pane.component.mjs +0 -21
  318. package/esm2022/lib/cube/filter/filter-tags.component.exp.mjs +0 -75
  319. package/esm2022/lib/cube/filter/filter.component.mjs +0 -137
  320. package/esm2022/lib/cube/grid/grid.component.mjs +0 -210
  321. package/esm2022/lib/cube/matrix/matrix.base.mjs +0 -124
  322. package/esm2022/lib/cube/matrix/matrix.mobile.component.mjs +0 -67
  323. package/esm2022/lib/cube/matrix/matrix.pane.component.mjs +0 -78
  324. package/esm2022/lib/cube/matrix/popup.component.mjs +0 -70
  325. package/esm2022/lib/cube/matrix/table.component.mjs +0 -512
  326. package/esm2022/lib/cube/parallel/item.mjs +0 -40
  327. package/esm2022/lib/cube/parallel/parallel.component.mjs +0 -162
  328. package/esm2022/lib/cube/pivot/pivot.component.mjs +0 -564
  329. package/esm2022/lib/cube/spreadsheet/spreadsheet.component.mjs +0 -382
  330. package/esm2022/lib/cube/spreadsheet/spreadsheet.container.exp.mjs +0 -19
  331. package/esm2022/lib/cube/sum/sum.component.mjs +0 -403
  332. package/esm2022/lib/cube/view-base.mjs +0 -74
  333. package/esm2022/lib/cube/view.mobile.component.mjs +0 -121
  334. package/esm2022/lib/cube/view.pane.component.mjs +0 -99
  335. package/esm2022/lib/dashboard/actions/actions.widget.mjs +0 -127
  336. package/esm2022/lib/dashboard/cube/accum-cube.widget.mjs +0 -151
  337. package/esm2022/lib/dashboard/cube/compare.widget.mjs +0 -216
  338. package/esm2022/lib/dashboard/cube/cube-analysis.base.mjs +0 -117
  339. package/esm2022/lib/dashboard/cube/cube-analysis.widget.mjs +0 -50
  340. package/esm2022/lib/dashboard/cube/cube-chart.widget.mjs +0 -146
  341. package/esm2022/lib/dashboard/cube/document-state.widget.mjs +0 -85
  342. package/esm2022/lib/dashboard/cube/documents.widget.mjs +0 -66
  343. package/esm2022/lib/dashboard/cube/filter/filter.component.mjs +0 -61
  344. package/esm2022/lib/dashboard/dashboard.component.mjs +0 -67
  345. package/esm2022/lib/dashboard/dashboard.pane.component.mjs +0 -18
  346. package/esm2022/lib/dashboard/recents/recents.widget.mjs +0 -98
  347. package/esm2022/lib/dashboard/score/activity.widget.mjs +0 -177
  348. package/esm2022/lib/dashboard/score/compare-groups.widget.mjs +0 -215
  349. package/esm2022/lib/dashboard/score/peers-performance.widget.mjs +0 -251
  350. package/esm2022/lib/dashboard/score/pending-results.widget.mjs +0 -59
  351. package/esm2022/lib/dashboard/score/personal-score.widget.mjs +0 -222
  352. package/esm2022/lib/dashboard/widget-item.component.mjs +0 -91
  353. package/esm2022/lib/dashboard/widget-ref.mjs +0 -18
  354. package/esm2022/lib/designer.module.mjs +0 -106
  355. package/esm2022/lib/desktop.module.mjs +0 -140
  356. package/esm2022/lib/home/about/about.dialog.mjs +0 -25
  357. package/esm2022/lib/home/home-base.component.mjs +0 -92
  358. package/esm2022/lib/home/home.desktop.component.mjs +0 -286
  359. package/esm2022/lib/home/home.mobile.component.mjs +0 -131
  360. package/esm2022/lib/home/notifications/notifications.component.mjs +0 -64
  361. package/esm2022/lib/home/outofoffice/outofoffice.component.mjs +0 -37
  362. package/esm2022/lib/home/sign/sign.component.mjs +0 -56
  363. package/esm2022/lib/impersonate/impersonate.component.mjs +0 -77
  364. package/esm2022/lib/mobile.module.mjs +0 -63
  365. package/esm2022/lib/modules/chart.module.mjs +0 -44
  366. package/esm2022/lib/modules/circular-gauge.module.mjs +0 -20
  367. package/esm2022/lib/modules/date.adapter.mjs +0 -23
  368. package/esm2022/lib/modules/datepicker.intl.mjs +0 -41
  369. package/esm2022/lib/modules/dayjs.module.mjs +0 -43
  370. package/esm2022/lib/modules/diagram.module.mjs +0 -43
  371. package/esm2022/lib/modules/gantt.module.mjs +0 -22
  372. package/esm2022/lib/modules/grid.module.mjs +0 -26
  373. package/esm2022/lib/modules/linear-gauge.module.mjs +0 -17
  374. package/esm2022/lib/modules/material.module.mjs +0 -182
  375. package/esm2022/lib/modules/paginator.intl.mjs +0 -21
  376. package/esm2022/lib/modules/pivot.module.mjs +0 -24
  377. package/esm2022/lib/modules/schedule.module.mjs +0 -24
  378. package/esm2022/lib/modules/spreadsheet.module.mjs +0 -28
  379. package/esm2022/lib/modules/stepper.intl.mjs +0 -17
  380. package/esm2022/lib/modules/texteditor.module.mjs +0 -26
  381. package/esm2022/lib/notifications/filter.component.mjs +0 -24
  382. package/esm2022/lib/notifications/notifications-table.component.mjs +0 -105
  383. package/esm2022/lib/notifications/notifications.component-base.mjs +0 -50
  384. package/esm2022/lib/notifications/notifications.mobile.component.mjs +0 -20
  385. package/esm2022/lib/notifications/notifications.pane.component.mjs +0 -21
  386. package/esm2022/lib/notifications/notifications.service.mjs +0 -78
  387. package/esm2022/lib/notifications/types/commented.notification.mjs +0 -60
  388. package/esm2022/lib/notifications/types/cube-anomaly.notification.mjs +0 -58
  389. package/esm2022/lib/notifications/types/escalated.notification.mjs +0 -33
  390. package/esm2022/lib/notifications/types/invite.notification.mjs +0 -45
  391. package/esm2022/lib/notifications/types/liked.notification.mjs +0 -58
  392. package/esm2022/lib/notifications/types/long-running-task.notification.mjs +0 -31
  393. package/esm2022/lib/notifications/types/notification-base.mjs +0 -40
  394. package/esm2022/lib/notifications/types/nudge.notification.mjs +0 -31
  395. package/esm2022/lib/notifications/types/state-changed.notification.mjs +0 -30
  396. package/esm2022/lib/notifications/types/tagged.notification.mjs +0 -43
  397. package/esm2022/lib/notifications/types/text.notification.mjs +0 -23
  398. package/esm2022/lib/notifications/types/upcoming-event.notification.mjs +0 -36
  399. package/esm2022/lib/options/options.component.mjs +0 -308
  400. package/esm2022/lib/options/options.desktop.component.mjs +0 -26
  401. package/esm2022/lib/options/options.mobile.component.mjs +0 -23
  402. package/esm2022/lib/reports/arguments-component.mjs +0 -81
  403. package/esm2022/lib/reports/cube/documents.component.mjs +0 -38
  404. package/esm2022/lib/reports/cube/grid-documents.component.mjs +0 -72
  405. package/esm2022/lib/reports/cube/performance-hilo.component.mjs +0 -260
  406. package/esm2022/lib/reports/cube/performance-wind.component.mjs +0 -269
  407. package/esm2022/lib/reports/cube/table-documents.component.mjs +0 -57
  408. package/esm2022/lib/reports/cube/usage-args.component.mjs +0 -62
  409. package/esm2022/lib/reports/cube/usage-base.mjs +0 -79
  410. package/esm2022/lib/reports/cube/usage-chart.component.mjs +0 -354
  411. package/esm2022/lib/reports/cube/usage-pivot.component.mjs +0 -257
  412. package/esm2022/lib/reports/cube/usage.component.mjs +0 -40
  413. package/esm2022/lib/reports/report-ref.mjs +0 -38
  414. package/esm2022/lib/reports/report-viewer.component.mjs +0 -156
  415. package/esm2022/lib/reports/report.mobile.component.mjs +0 -127
  416. package/esm2022/lib/reports/report.pane.component.mjs +0 -109
  417. package/esm2022/lib/reports/reports-menu.component.mjs +0 -24
  418. package/esm2022/lib/reports/substitution/substitution.component.mjs +0 -39
  419. package/esm2022/lib/reports/table/table-view.component.mjs +0 -40
  420. package/esm2022/lib/reports/tasks/tasks.component.mjs +0 -95
  421. package/esm2022/lib/routes.desktop.mjs +0 -209
  422. package/esm2022/lib/routes.mobile.mjs +0 -84
  423. package/esm2022/lib/scheduler/schedule.component.mjs +0 -164
  424. package/esm2022/lib/scheduler/scheduler.mobile.component.mjs +0 -37
  425. package/esm2022/lib/scheduler/scheduler.pane.component.mjs +0 -50
  426. package/esm2022/lib/search/cube.component.mjs +0 -47
  427. package/esm2022/lib/search/declarations.mjs +0 -7
  428. package/esm2022/lib/search/document.component.mjs +0 -41
  429. package/esm2022/lib/search/guide.component.mjs +0 -28
  430. package/esm2022/lib/search/path.component.mjs +0 -44
  431. package/esm2022/lib/search/search.service.mjs +0 -155
  432. package/esm2022/lib/shared.module.mjs +0 -622
  433. package/esm2022/lib/system.module.mjs +0 -562
  434. package/esm2022/lib/views/cube/chart.component.mjs +0 -74
  435. package/esm2022/lib/views/cube/cube-base.mjs +0 -101
  436. package/esm2022/lib/views/cube/explore.component.mjs +0 -85
  437. package/esm2022/lib/views/cube/matrix.component.mjs +0 -101
  438. package/esm2022/lib/views/cube/parallel.component.mjs +0 -53
  439. package/esm2022/lib/views/cube/pivot.component.mjs +0 -50
  440. package/esm2022/lib/views/cube/sum.component.mjs +0 -66
  441. package/esm2022/lib/views/cube/view.component.mjs +0 -101
  442. package/esm2022/lib/views/document-view-ref.mjs +0 -27
  443. package/esm2022/lib/views/timeline/timeline.component.mjs +0 -329
  444. package/esm2022/lib/views/view-item.component.mjs +0 -68
  445. package/esm2022/lib/views/views.component.mjs +0 -32
  446. package/esm2022/lib/views/views.mobile.component.mjs +0 -21
  447. package/esm2022/lib/views/views.pane.component.mjs +0 -29
  448. package/esm2022/public-api.mjs +0 -182
@@ -1,512 +0,0 @@
1
- import { Injector, ViewContainerRef, Component, ViewChild, Input, EventEmitter, Output } from '@angular/core';
2
- import { Subject, Observable, of, from, forkJoin } from 'rxjs';
3
- import { debounceTime, takeUntil, tap, switchMap, startWith, map } from 'rxjs/operators';
4
- import { deepAssign, isBoolean, isPromise, queryParams } from '../core/functions';
5
- import { DOCUMENT_MODEL } from '../core/mailbox.service';
6
- import { FormRef } from './form-ref';
7
- import { AttachmentsComponent } from './attachments/attachments.component';
8
- import { TagsComponent } from './tag/tags.component';
9
- import { ActionDialog } from './action/action.dialog';
10
- import { OpenPolicy } from '../core/configuration';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "../core/popup/popup.service";
13
- import * as i2 from "../core/mailbox.service";
14
- import * as i3 from "../core/account.service";
15
- import * as i4 from "../core/router";
16
- import * as i5 from "@angular/material/dialog";
17
- import * as i6 from "../core/prompt.service";
18
- import * as i7 from "../core/session.service";
19
- import * as i8 from "@angular/material/snack-bar";
20
- import * as i9 from "../core/component-factory-resolver";
21
- import * as i10 from "../core/guide/guide.service";
22
- import * as i11 from "../core/translate.service";
23
- import * as i12 from "../core/hub.service";
24
- import * as i13 from "@angular/forms";
25
- import * as i14 from "@angular/material/chips";
26
- import * as i15 from "@angular/material/icon";
27
- import * as i16 from "./attachments/attachments.component";
28
- export const REPORT_EDITING_DELAY = 2000,
29
- /** save draft ms */
30
- AUTO_SAVE_DELAY = 5000, EDITING_MESSAGE_DELAY = 3000;
31
- export class ComposeFormComponent {
32
- constructor(_popup, _mailbox, _accounts, _router, _dialog, _sb, _session, _injector, _snackbar, _cf, _guide, _translate, _messaging) {
33
- this._popup = _popup;
34
- this._mailbox = _mailbox;
35
- this._accounts = _accounts;
36
- this._router = _router;
37
- this._dialog = _dialog;
38
- this._sb = _sb;
39
- this._session = _session;
40
- this._injector = _injector;
41
- this._snackbar = _snackbar;
42
- this._cf = _cf;
43
- this._guide = _guide;
44
- this._translate = _translate;
45
- this._messaging = _messaging;
46
- this.modelChange = new EventEmitter();
47
- this.working = false;
48
- this.workingChange = new EventEmitter();
49
- this.dirty = false;
50
- this.dirtyChange = new EventEmitter();
51
- this.valid = false;
52
- this.validChange = new EventEmitter();
53
- this.saved = new EventEmitter();
54
- this.contacts = true;
55
- this.actions = [];
56
- this._destroy = new Subject();
57
- }
58
- /** */
59
- ngOnInit() {
60
- this._fileElement.nativeElement.addEventListener('change', this._fileChangeListener.bind(this));
61
- this._messaging.callback$.pipe(takeUntil(this._destroy)).subscribe(e => this._instance.onMessage && this._instance.onMessage(e.message));
62
- this._messaging.editing$.pipe(takeUntil(this._destroy)).subscribe(e => e.id === this.model.id &&
63
- this._editing(e.userId));
64
- this._messaging.update$.pipe(takeUntil(this._destroy)).subscribe(e => {
65
- if (e.model.id === this.model.id) {
66
- (e.userId !== this._session.userId) &&
67
- this._accounts.get(e.userId).subscribe(u => this._snackbar.open(this._translate.get('MailVersionUpdate', this.model.number, u.name), this._translate.get('OK'), {
68
- direction: this._session.direction,
69
- }).onAction().subscribe(() => {
70
- this._assign(e.model);
71
- this._reset();
72
- }));
73
- }
74
- });
75
- // form may have changed by browse actions
76
- this._mailbox.changed.pipe(takeUntil(this._destroy)).
77
- subscribe(e => !this.working && e.id === this.model.id &&
78
- this._assign(e));
79
- }
80
- _editing(userId) {
81
- this._accounts.get(userId).subscribe(u => {
82
- this.editing = this._translate.personalize('Editing', u.gender, u.name);
83
- clearTimeout(this._editingTask);
84
- this._editingTask = setTimeout(() => this.editing = undefined, EDITING_MESSAGE_DELAY);
85
- });
86
- }
87
- /**
88
- *
89
- * @param changes
90
- */
91
- ngOnChanges(changes) {
92
- if (changes['page'] && !changes['page'].firstChange)
93
- this._navPage(changes['page'].currentValue);
94
- else {
95
- this._formRef && this._formRef._destroy();
96
- this.form = this._session.profile.forms.find(f => f.name === this.model.formId);
97
- this.help = this.form.guide;
98
- if (!this.form.template)
99
- throw (`Form '${this.form.name}' model missing '[Template()]' attribute.`);
100
- const comp = this._cf.component(this.form.template);
101
- this._formRef = new FormRef(this._router, this.form);
102
- this._formRef._stateChange$.pipe(startWith()).
103
- subscribe(() => this.help = this._formRef.help);
104
- const injector = Injector.create({
105
- providers: [
106
- {
107
- provide: FormRef, useValue: this._formRef
108
- }, {
109
- provide: DOCUMENT_MODEL, useValue: this.model
110
- }
111
- ], parent: this._injector
112
- });
113
- this._container.clear();
114
- const componentRef = this._container.createComponent(comp, { injector });
115
- this._instance = componentRef.instance;
116
- this._formRef._mode = this._instance.mode = this.mode;
117
- this._instance.form.statusChanges.pipe(takeUntil(this._destroy)).subscribe(() => {
118
- const { dirty, valid } = this._instance.form;
119
- this.dirty = dirty;
120
- this.dirtyChange.emit(dirty);
121
- this.valid = valid;
122
- this.validChange.emit(valid);
123
- });
124
- this.model.draft && this._instance.form.valueChanges.pipe(takeUntil(this._destroy),
125
- //debounceTime(REPORT_EDITING_DELAY),
126
- //tap(() => !this.working && this._mailbox.editing(this.model.documentId)),
127
- debounceTime(AUTO_SAVE_DELAY)).subscribe(() => !this.working && this.dirty &&
128
- this.save(false).subscribe());
129
- this._instance.onBind(this.model);
130
- this.page !== undefined &&
131
- // allow form onInit
132
- setTimeout(() => this._navPage(this.page));
133
- this._reset();
134
- }
135
- }
136
- /**
137
- *
138
- * @param page
139
- */
140
- _navPage(page) {
141
- if (!this._instance.onNavigate)
142
- throw 'missing form onNavigate()';
143
- this._instance.onNavigate(page);
144
- }
145
- /**
146
- *
147
- * @param ev
148
- */
149
- _fileChangeListener(ev) {
150
- const { files } = ev.target, arr = [];
151
- if (files && files.length) {
152
- for (let i = 0; i < files.length; i++)
153
- arr.push(files[i]);
154
- this.upload(arr).subscribe(() => {
155
- this._fileElement.nativeElement.value = '';
156
- this.attachments.ngOnChanges();
157
- });
158
- }
159
- }
160
- _applychanges() {
161
- // raw value, disabled controls
162
- deepAssign(this.model.model, this._instance.form.getRawValue());
163
- }
164
- _getActionAdjective(name) {
165
- const action = this._session.profile.actions.find(a => a.name === name);
166
- return (action.adjective || action.past || action.title).toLowerCase();
167
- }
168
- /**
169
- *
170
- * @param feedback
171
- */
172
- _save(feedback) {
173
- this.working = true;
174
- this.workingChange.emit(true);
175
- const { id, version, formId, model, draft } = this.model;
176
- return this._mailbox.save(id, formId, version, model).pipe(tap({
177
- next: m => {
178
- this._assign(m);
179
- this.modelChange.emit(this.model);
180
- this._reset();
181
- feedback &&
182
- this._sb.toast(draft ? 'DraftSaved' : 'ChangesSaved');
183
- this.saved.emit();
184
- }, error: e => {
185
- feedback &&
186
- this._handleError(e, 'SaveErr');
187
- }, finalize: () => {
188
- this.working = false;
189
- this.workingChange.emit(false);
190
- }
191
- }), map(() => true));
192
- }
193
- /**
194
- *
195
- * @param files
196
- * @returns
197
- */
198
- upload(files) {
199
- this.working = true;
200
- this.workingChange.emit(true);
201
- let exists;
202
- const observables = [];
203
- files.forEach(f => {
204
- if (!exists)
205
- exists = this.model.attachments.some(a => a.fileName === f.name && !a.deleted && !a.failed);
206
- const retry = this.model.attachments.findIndex(a => a.fileName === f.name && a.failed);
207
- if (retry > -1)
208
- this.model.attachments.splice(retry, 1);
209
- const model = this._constructAttachment(f);
210
- const observable = this._mailbox.upload(this.model.id, this.model.formId, this.model.version, f).
211
- pipe(tap({
212
- next: r => {
213
- this._sb.toast(!exists ? 'UploadOk' : 'UploadVersionOk', f.name);
214
- Object.assign(model, r, { progress: null, });
215
- this.model.attachments.push(model);
216
- }, error: e => {
217
- this._handleError(e, 'UploadFailed', f.name);
218
- return of(false);
219
- }, finalize: () => {
220
- this.working = false;
221
- this.workingChange.emit(false);
222
- }
223
- }));
224
- observables.push(observable);
225
- });
226
- return forkJoin(observables);
227
- }
228
- /**
229
- *
230
- * @param file
231
- * @returns
232
- */
233
- _constructAttachment(file) {
234
- const now = new Date(), utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);
235
- return {
236
- userId: this._session.profile.userId,
237
- byId: this._session.profile.byId,
238
- time: utc.toJSON(),
239
- fileName: file.name,
240
- contentType: file.type
241
- };
242
- }
243
- tag(evt) {
244
- this._popup.open(TagsComponent, evt.target, {
245
- data: this.model
246
- });
247
- }
248
- /** */
249
- _reset() {
250
- this._instance.form.reset(this.model.model, { emitEvent: false });
251
- this.valid = this._instance.form.valid;
252
- this.validChange.emit(this.valid);
253
- this.dirty = false;
254
- this.dirtyChange.emit(this.dirty);
255
- this.actions = this.model.actions?.length ?
256
- this._session.profile.actions.
257
- filter(a => this.model.actions.indexOf(a.name) > -1).
258
- sort(sortActions) : [];
259
- }
260
- guide(name) {
261
- this._guide.start(name);
262
- }
263
- attach() {
264
- const elem = this._fileElement.nativeElement;
265
- elem.click();
266
- }
267
- /**
268
- *
269
- * @param feedback
270
- */
271
- save(feedback = true) {
272
- this._applychanges();
273
- //const saveArgs = { cancel: false } as SaveEventArgs;
274
- if (feedback && this._instance.onSave) {
275
- const result = this._instance.onSave();
276
- if (isBoolean(result)) {
277
- if (result === false)
278
- return of(false);
279
- }
280
- else if (isPromise(result))
281
- return from(result).pipe(switchMap(() => this._save(feedback)));
282
- else
283
- return result.pipe(switchMap(() => this._save(feedback)));
284
- }
285
- return this._save(feedback);
286
- }
287
- flag() {
288
- const extra = this.model, { flag } = this.model;
289
- extra.working = true;
290
- this.working = true;
291
- this._mailbox.flag(this.model.id, !flag).subscribe({
292
- next: () => {
293
- this.model.flag = !flag;
294
- extra.working = false;
295
- }, error: () => {
296
- extra.working = false;
297
- this.working = false;
298
- }
299
- });
300
- }
301
- submit() {
302
- this._applychanges();
303
- const { id, version, formId, model, number } = this.model;
304
- this.working = true;
305
- this.workingChange.emit(true);
306
- return this._mailbox.submit(id, version, formId, model).
307
- pipe(tap({
308
- next: () => {
309
- this._sb.toast('Submitted', number);
310
- }, error: e => {
311
- this._handleError(e, 'SubmitErr');
312
- }, finalize: () => {
313
- this.working = false;
314
- this.workingChange.emit(false);
315
- }
316
- }));
317
- }
318
- back() {
319
- this._router.navigate([], {
320
- queryParams: { page: undefined },
321
- });
322
- }
323
- /**
324
- *
325
- * @returns
326
- */
327
- discard() {
328
- return new Observable(observe => {
329
- this._sb.ask('DiscardAsk', 'Discard', {
330
- color: 'warn', ok: 'Discard'
331
- }).subscribe(ok => {
332
- if (ok) {
333
- this.workingChange.emit(true);
334
- this._mailbox.delete(this.model.id).
335
- subscribe({
336
- next: () => {
337
- observe.next();
338
- observe.complete();
339
- this.workingChange.emit(false);
340
- },
341
- error: e => {
342
- this.working = false;
343
- this.workingChange.emit(false);
344
- this._handleError(e, 'NetworkErr');
345
- observe.error();
346
- observe.complete();
347
- }
348
- });
349
- }
350
- else {
351
- observe.complete();
352
- }
353
- });
354
- });
355
- }
356
- /**
357
- *
358
- * @param action
359
- * @returns
360
- */
361
- send(action) {
362
- return new Observable(observe => {
363
- this._dialog.open(ActionDialog, {
364
- data: {
365
- action,
366
- item: this.model
367
- },
368
- closeOnNavigation: true
369
- }).afterClosed().subscribe(args => {
370
- if (args) {
371
- this._applychanges();
372
- const params = queryParams(args);
373
- this.working = true;
374
- this.workingChange.emit(true);
375
- const { id, version, number, model, formId } = this.model;
376
- this._mailbox.send(id, version, formId, model, action, params).
377
- subscribe({
378
- next: r => {
379
- const origin = r.recipients.filter(r => r.originId === id);
380
- if (origin.length)
381
- this._accounts.getAll(origin.map(r => r.userId)).subscribe(u => this._sb.toast('SentTo', number, this._getActionAdjective(action), this._translate.join(u.map(u => u.name))));
382
- else
383
- this._sb.toast('Sent', number, this._getActionAdjective(action));
384
- this.working = false;
385
- this.workingChange.emit(false);
386
- observe.next();
387
- observe.complete();
388
- }, error: e => {
389
- this.working = false;
390
- this.workingChange.emit(false);
391
- this._handleError(e, 'SendErr');
392
- observe.error();
393
- observe.complete();
394
- }
395
- });
396
- }
397
- else {
398
- observe.error();
399
- observe.complete();
400
- }
401
- });
402
- });
403
- }
404
- /** */
405
- copy() {
406
- this._mailbox.copy(this.model.documentId).subscribe({
407
- next: i => {
408
- this._sb.toast('Copied', i.number || this.form.title);
409
- this._router.navigate(['mailbox/i', i.id.encodeId()], {
410
- policy: OpenPolicy.Clear,
411
- state: { item: i }
412
- });
413
- }, error: () => this._sb.error()
414
- });
415
- }
416
- /**
417
- *
418
- * @param response
419
- * @param item
420
- * @param message resource
421
- * @param args
422
- */
423
- _handleError(response, message, ...args) {
424
- if (response.constructor.name === 'PositionError')
425
- switch (response.code) {
426
- case 1:
427
- this._sb.error('UserDeniedGeoErr');
428
- break;
429
- default:
430
- this._sb.error('GeoErr');
431
- }
432
- else
433
- switch (response.status) {
434
- case 401:
435
- this._sb.error('Unauthorized');
436
- break;
437
- case 409: // version change
438
- {
439
- const obj = response.error /* serialized model */;
440
- obj && this._assign(obj);
441
- this._reset();
442
- this._sb.error('VersionErr', this.model.number);
443
- break;
444
- }
445
- case 406: // validation
446
- this._sb.errorString(response.error);
447
- break;
448
- case 426: // license
449
- this._sb.error('LicenseErr');
450
- break;
451
- default:
452
- this._sb.error(message, ...args);
453
- }
454
- }
455
- _assign(model) {
456
- Object.assign(this.model, model, {
457
- // preserve object ref in model and update server changes, such as line attribute
458
- model: deepAssign(this.model.model, model.model)
459
- });
460
- }
461
- ngOnDestroy() {
462
- this._destroy.next();
463
- this._destroy.complete();
464
- }
465
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ComposeFormComponent, deps: [{ token: i1.Popup }, { token: i2.MailboxService }, { token: i3.AccountService }, { token: i4.RouterImpl }, { token: i5.MatDialog }, { token: i6.PromptService }, { token: i7.SessionService }, { token: i0.Injector }, { token: i8.MatSnackBar }, { token: i9.BizDocComponentFactoryResolver }, { token: i10.GuideService }, { token: i11.TranslateService }, { token: i12.HubService }], target: i0.ɵɵFactoryTarget.Component }); }
466
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: ComposeFormComponent, selector: "bizdoc-form", inputs: { model: "model", working: "working", dirty: "dirty", valid: "valid", page: "page", mode: "mode", contacts: "contacts" }, outputs: { modelChange: "modelChange", workingChange: "workingChange", dirtyChange: "dirtyChange", validChange: "validChange", saved: "saved" }, host: { classAttribute: "form-container bizdoc-compose" }, viewQueries: [{ propertyName: "_fileElement", first: true, predicate: ["file"], descendants: true, static: true }, { propertyName: "attachments", first: true, predicate: AttachmentsComponent, descendants: true, static: true }, { propertyName: "_container", first: true, predicate: ["component"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"form-header\">\r\n <!--<bizdoc-people [model]=\"model\" *ngIf=\"mode !== 'compose' && contacts\"></bizdoc-people>-->\r\n <bizdoc-attachments [model]=\"model\" [includeDeleted]=\"true\" [viewedIndicator]=\"false\"></bizdoc-attachments>\r\n @if (!model.replied && mode !== 'compose' && model.note) {\r\n <div class=\"compose-note\">\r\n <mat-icon color=\"primary\">info</mat-icon> <span class=\"mat-body-2\">{{model.note}}</span>\r\n </div>\r\n }\r\n @if (model.tags) {\r\n <mat-chip-set>\r\n @for (tag of model.tags; track tag) {\r\n <mat-chip [disableRipple]=\"true\">{{tag}}</mat-chip>\r\n }\r\n </mat-chip-set>\r\n }\r\n @if (editing) {\r\n <div class=\"message\">{{ editing }}</div>\r\n }\r\n</div>\r\n<ng-container #component></ng-container>\r\n<form style=\"display:none\"><input type=\"file\" #file multiple /></form>\r\n", dependencies: [{ kind: "directive", type: i13.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i13.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i14.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i14.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.AttachmentsComponent, selector: "bizdoc-attachments", inputs: ["model", "viewedIndicator", "includeDeleted"] }] }); }
467
- }
468
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ComposeFormComponent, decorators: [{
469
- type: Component,
470
- args: [{ selector: 'bizdoc-form', host: {
471
- class: 'form-container bizdoc-compose'
472
- }, template: "<div class=\"form-header\">\r\n <!--<bizdoc-people [model]=\"model\" *ngIf=\"mode !== 'compose' && contacts\"></bizdoc-people>-->\r\n <bizdoc-attachments [model]=\"model\" [includeDeleted]=\"true\" [viewedIndicator]=\"false\"></bizdoc-attachments>\r\n @if (!model.replied && mode !== 'compose' && model.note) {\r\n <div class=\"compose-note\">\r\n <mat-icon color=\"primary\">info</mat-icon> <span class=\"mat-body-2\">{{model.note}}</span>\r\n </div>\r\n }\r\n @if (model.tags) {\r\n <mat-chip-set>\r\n @for (tag of model.tags; track tag) {\r\n <mat-chip [disableRipple]=\"true\">{{tag}}</mat-chip>\r\n }\r\n </mat-chip-set>\r\n }\r\n @if (editing) {\r\n <div class=\"message\">{{ editing }}</div>\r\n }\r\n</div>\r\n<ng-container #component></ng-container>\r\n<form style=\"display:none\"><input type=\"file\" #file multiple /></form>\r\n" }]
473
- }], ctorParameters: () => [{ type: i1.Popup }, { type: i2.MailboxService }, { type: i3.AccountService }, { type: i4.RouterImpl }, { type: i5.MatDialog }, { type: i6.PromptService }, { type: i7.SessionService }, { type: i0.Injector }, { type: i8.MatSnackBar }, { type: i9.BizDocComponentFactoryResolver }, { type: i10.GuideService }, { type: i11.TranslateService }, { type: i12.HubService }], propDecorators: { model: [{
474
- type: Input
475
- }], modelChange: [{
476
- type: Output
477
- }], working: [{
478
- type: Input
479
- }], workingChange: [{
480
- type: Output
481
- }], dirty: [{
482
- type: Input
483
- }], dirtyChange: [{
484
- type: Output
485
- }], valid: [{
486
- type: Input
487
- }], page: [{
488
- type: Input
489
- }], validChange: [{
490
- type: Output
491
- }], saved: [{
492
- type: Output
493
- }], mode: [{
494
- type: Input
495
- }], contacts: [{
496
- type: Input
497
- }], _fileElement: [{
498
- type: ViewChild,
499
- args: ['file', { static: true }]
500
- }], attachments: [{
501
- type: ViewChild,
502
- args: [AttachmentsComponent, { static: true }]
503
- }], _container: [{
504
- type: ViewChild,
505
- args: ['component', { read: ViewContainerRef, static: true }]
506
- }] } });
507
- function sortActions(a, b) {
508
- if (a.group && b.group && a.group !== b.group)
509
- return a.group < b.group ? -1 : 1;
510
- return 0;
511
- }
512
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvY29tcG9zZS9mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9jb21wb3NlL2Zvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBeUIsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBNEIsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJdkssT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekYsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSWxGLE9BQU8sRUFBNkIsY0FBYyxFQUFtQixNQUFNLHlCQUF5QixDQUFDO0FBT3JHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3JELE9BQU8sRUFBRSxZQUFZLEVBQW9CLE1BQU0sd0JBQXdCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFbkQsTUFBTSxDQUFDLE1BQ0wsb0JBQW9CLEdBQUcsSUFBSTtBQUMzQixvQkFB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LElBQUksRUFBRTtnQkFDaUIsVUFBVTtzQkFBM0UsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7QUEyYmxFLFNBQVMsV0FBVyxDQUFDLENBQVMsRUFBRSxDQUFTO0lBQ3ZDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEtBQUs7UUFDM0MsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IsIE9uRGVzdHJveSwgRWxlbWVudFJlZiwgVmlld0NvbnRhaW5lclJlZiwgQ29tcG9uZW50LCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgSW5wdXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIGZyb20sIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsLCB0YXAsIHN3aXRjaE1hcCwgc3RhcnRXaXRoLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IGRlZXBBc3NpZ24sIGlzQm9vbGVhbiwgaXNQcm9taXNlLCBxdWVyeVBhcmFtcyB9IGZyb20gJy4uL2NvcmUvZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgUmVjaXBpZW50TW9kZWwsIEZvcm0sIEFjdGlvbiwgQXR0YWNobWVudCB9IGZyb20gJy4uL2NvcmUvbW9kZWxzJztcclxuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCwgVmlld01vZGUgfSBmcm9tICcuLi9jb3JlL2Jhc2UnO1xyXG5pbXBvcnQgeyBTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uL2NvcmUvc2Vzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWFpbGJveFNlcnZpY2UsIEl0ZW1FeHRyYSwgRE9DVU1FTlRfTU9ERUwsIEF0dGFjaG1lbnRFeHRyYSB9IGZyb20gJy4uL2NvcmUvbWFpbGJveC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUHJvbXB0U2VydmljZSB9IGZyb20gJy4uL2NvcmUvcHJvbXB0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIdWJTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9odWIuc2VydmljZSc7XHJcbmltcG9ydCB7IEd1aWRlU2VydmljZSB9IGZyb20gJy4uL2NvcmUvZ3VpZGUvZ3VpZGUuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9hY2NvdW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS90cmFuc2xhdGUuc2VydmljZSc7XHJcbmltcG9ydCB7IEJpekRvY0NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB9IGZyb20gJy4uL2NvcmUvY29tcG9uZW50LWZhY3RvcnktcmVzb2x2ZXInO1xyXG5pbXBvcnQgeyBGb3JtUmVmIH0gZnJvbSAnLi9mb3JtLXJlZic7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRzQ29tcG9uZW50IH0gZnJvbSAnLi9hdHRhY2htZW50cy9hdHRhY2htZW50cy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUYWdzQ29tcG9uZW50IH0gZnJvbSAnLi90YWcvdGFncy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQb3B1cCB9IGZyb20gJy4uL2NvcmUvcG9wdXAvcG9wdXAuc2VydmljZSc7XHJcbmltcG9ydCB7IFJvdXRlckltcGwgfSBmcm9tIFwiLi4vY29yZS9yb3V0ZXJcIjtcclxuaW1wb3J0IHsgQWN0aW9uRGlhbG9nLCBBY3Rpb25EaWFsb2dEYXRhIH0gZnJvbSAnLi9hY3Rpb24vYWN0aW9uLmRpYWxvZyc7XHJcbmltcG9ydCB7IE9wZW5Qb2xpY3kgfSBmcm9tICcuLi9jb3JlL2NvbmZpZ3VyYXRpb24nO1xyXG5cclxuZXhwb3J0IGNvbnN0XHJcbiAgUkVQT1JUX0VESVRJTkdfREVMQVkgPSAyMDAwLFxyXG4gIC8qKiBzYXZlIGRyYWZ0IG1zICovXHJcbiAgQVVUT19TQVZFX0RFTEFZID0gNTAwMCxcclxuICBFRElUSU5HX01FU1NBR0VfREVMQVkgPSAzMDAwO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdiaXpkb2MtZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIGhvc3Q6IHtcclxuICAgIGNsYXNzOiAnZm9ybS1jb250YWluZXIgYml6ZG9jLWNvbXBvc2UnXHJcbiAgfVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tcG9zZUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBtb2RlbDogUmVjaXBpZW50TW9kZWw8YW55PjtcclxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY2lwaWVudE1vZGVsPGFueT4+KCk7XHJcbiAgZm9ybTogRm9ybTtcclxuICBASW5wdXQoKVxyXG4gIHdvcmtpbmcgPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgcmVhZG9ubHkgd29ya2luZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBASW5wdXQoKVxyXG4gIGRpcnR5ID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRpcnR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBJbnB1dCgpXHJcbiAgdmFsaWQgPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHBhZ2U6IHN0cmluZyB8IG51bWJlcjtcclxuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmFsaWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNhdmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBJbnB1dCgpIG1vZGU6IFZpZXdNb2RlO1xyXG4gIEBJbnB1dCgpIGNvbnRhY3RzID0gdHJ1ZTtcclxuICBhY3Rpb25zOiBBY3Rpb25bXSA9IFtdO1xyXG4gIGhlbHA6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBlZGl0aW5nOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgQFZpZXdDaGlsZCgnZmlsZScsIHsgc3RhdGljOiB0cnVlIH0pIF9maWxlRWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKEF0dGFjaG1lbnRzQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBhdHRhY2htZW50czogQXR0YWNobWVudHNDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgnY29tcG9uZW50JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSkgX2NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcclxuICBwcml2YXRlIF9mb3JtUmVmOiBGb3JtUmVmO1xyXG4gIHByaXZhdGUgX2luc3RhbmNlOiBGb3JtQ29tcG9uZW50PGFueT47XHJcbiAgcHJpdmF0ZSBfZWRpdGluZ1Rhc2s6IE5vZGVKUy5UaW1lb3V0O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfcG9wdXA6IFBvcHVwLFxyXG4gICAgcHJpdmF0ZSBfbWFpbGJveDogTWFpbGJveFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hY2NvdW50czogQWNjb3VudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlckltcGwsXHJcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgX3NiOiBQcm9tcHRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcml2YXRlIF9zbmFja2JhcjogTWF0U25hY2tCYXIsXHJcbiAgICBwcml2YXRlIF9jZjogQml6RG9jQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJpdmF0ZSBfZ3VpZGU6IEd1aWRlU2VydmljZSxcclxuICAgIHByaXZhdGUgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2luZzogSHViU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuICAvKiogKi9cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpbGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fZmlsZUNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy5fbWVzc2FnaW5nLmNhbGxiYWNrJC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKGUgPT5cclxuICAgICAgdGhpcy5faW5zdGFuY2Uub25NZXNzYWdlICYmIHRoaXMuX2luc3RhbmNlLm9uTWVzc2FnZShlLm1lc3NhZ2UpKTtcclxuICAgIHRoaXMuX21lc3NhZ2luZy5lZGl0aW5nJC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKGUgPT5cclxuICAgICAgZS5pZCA9PT0gdGhpcy5tb2RlbC5pZCAmJlxyXG4gICAgICB0aGlzLl9lZGl0aW5nKGUudXNlcklkKSk7XHJcbiAgICB0aGlzLl9tZXNzYWdpbmcudXBkYXRlJC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKGUgPT4ge1xyXG4gICAgICBpZiAoZS5tb2RlbC5pZCA9PT0gdGhpcy5tb2RlbC5pZCkge1xyXG4gICAgICAgIChlLnVzZXJJZCAhPT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpICYmXHJcbiAgICAgICAgICB0aGlzLl9hY2NvdW50cy5nZXQoZS51c2VySWQpLnN1YnNjcmliZSh1ID0+XHJcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW4odGhpcy5fdHJhbnNsYXRlLmdldCgnTWFpbFZlcnNpb25VcGRhdGUnLCB0aGlzLm1vZGVsLm51bWJlciwgdS5uYW1lKSxcclxuICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGUuZ2V0KCdPSycpLCB7XHJcbiAgICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLl9zZXNzaW9uLmRpcmVjdGlvbixcclxuICAgICAgICAgICAgfSkub25BY3Rpb24oKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2Fzc2lnbihlLm1vZGVsKTtcclxuICAgICAgICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBmb3JtIG1heSBoYXZlIGNoYW5nZWQgYnkgYnJvd3NlIGFjdGlvbnNcclxuICAgIHRoaXMuX21haWxib3guY2hhbmdlZC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuXHJcbiAgICAgIHN1YnNjcmliZShlID0+ICF0aGlzLndvcmtpbmcgJiYgZS5pZCA9PT0gdGhpcy5tb2RlbC5pZCAmJlxyXG4gICAgICAgIHRoaXMuX2Fzc2lnbihlKSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2VkaXRpbmcodXNlcklkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2FjY291bnRzLmdldCh1c2VySWQpLnN1YnNjcmliZSh1ID0+IHtcclxuICAgICAgdGhpcy5lZGl0aW5nID0gdGhpcy5fdHJhbnNsYXRlLnBlcnNvbmFsaXplKCdFZGl0aW5nJywgdS5nZW5kZXIsIHUubmFtZSk7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9lZGl0aW5nVGFzayk7XHJcbiAgICAgIHRoaXMuX2VkaXRpbmdUYXNrID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmVkaXRpbmcgPSB1bmRlZmluZWQsIEVESVRJTkdfTUVTU0FHRV9ERUxBWSk7XHJcbiAgICB9KVxyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gY2hhbmdlc1xyXG4gICAqL1xyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydwYWdlJ10gJiYgIWNoYW5nZXNbJ3BhZ2UnXS5maXJzdENoYW5nZSlcclxuICAgICAgdGhpcy5fbmF2UGFnZShjaGFuZ2VzWydwYWdlJ10uY3VycmVudFZhbHVlKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl9mb3JtUmVmICYmIHRoaXMuX2Zvcm1SZWYuX2Rlc3Ryb3koKTtcclxuICAgICAgdGhpcy5mb3JtID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLmZvcm1zLmZpbmQoZiA9PiBmLm5hbWUgPT09IHRoaXMubW9kZWwuZm9ybUlkKSE7XHJcbiAgICAgIHRoaXMuaGVscCA9IHRoaXMuZm9ybS5ndWlkZTtcclxuICAgICAgaWYgKCF0aGlzLmZvcm0udGVtcGxhdGUpXHJcbiAgICAgICAgdGhyb3cgKGBGb3JtICcke3RoaXMuZm9ybS5uYW1lfScgbW9kZWwgbWlzc2luZyAnW1RlbXBsYXRlKCldJyBhdHRyaWJ1dGUuYCk7XHJcbiAgICAgIGNvbnN0IGNvbXAgPSB0aGlzLl9jZi5jb21wb25lbnQodGhpcy5mb3JtLnRlbXBsYXRlKTtcclxuICAgICAgdGhpcy5fZm9ybVJlZiA9IG5ldyBGb3JtUmVmKHRoaXMuX3JvdXRlciwgdGhpcy5mb3JtKTtcclxuICAgICAgdGhpcy5fZm9ybVJlZi5fc3RhdGVDaGFuZ2UkLnBpcGUoc3RhcnRXaXRoKCkpLlxyXG4gICAgICAgIHN1YnNjcmliZSgoKSA9PiB0aGlzLmhlbHAgPSB0aGlzLl9mb3JtUmVmLmhlbHApO1xyXG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IEZvcm1SZWYsIHVzZVZhbHVlOiB0aGlzLl9mb3JtUmVmXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IERPQ1VNRU5UX01PREVMLCB1c2VWYWx1ZTogdGhpcy5tb2RlbFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF0sIHBhcmVudDogdGhpcy5faW5qZWN0b3JcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGVhcigpO1xyXG5cclxuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5fY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wLCB7IGluamVjdG9yIH0pO1xyXG5cclxuICAgICAgdGhpcy5faW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgRm9ybUNvbXBvbmVudDxhbnk+O1xyXG4gICAgICB0aGlzLl9mb3JtUmVmLl9tb2RlID0gdGhpcy5faW5zdGFuY2UubW9kZSA9IHRoaXMubW9kZTtcclxuICAgICAgdGhpcy5faW5zdGFuY2UuZm9ybS5zdGF0dXNDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgZGlydHksIHZhbGlkIH0gPSB0aGlzLl9pbnN0YW5jZS5mb3JtO1xyXG4gICAgICAgIHRoaXMuZGlydHkgPSBkaXJ0eTtcclxuICAgICAgICB0aGlzLmRpcnR5Q2hhbmdlLmVtaXQoZGlydHkpO1xyXG4gICAgICAgIHRoaXMudmFsaWQgPSB2YWxpZDtcclxuICAgICAgICB0aGlzLnZhbGlkQ2hhbmdlLmVtaXQodmFsaWQpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5tb2RlbC5kcmFmdCAmJiB0aGlzLl9pbnN0YW5jZS5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSxcclxuICAgICAgICAvL2RlYm91bmNlVGltZShSRVBPUlRfRURJVElOR19ERUxBWSksXHJcbiAgICAgICAgLy90YXAoKCkgPT4gIXRoaXMud29ya2luZyAmJiB0aGlzLl9tYWlsYm94LmVkaXRpbmcodGhpcy5tb2RlbC5kb2N1bWVudElkKSksXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKEFVVE9fU0FWRV9ERUxBWSlcclxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4gIXRoaXMud29ya2luZyAmJiB0aGlzLmRpcnR5ICYmXHJcbiAgICAgICAgdGhpcy5zYXZlKGZhbHNlKS5zdWJzY3JpYmUoKSk7XHJcbiAgICAgIHRoaXMuX2luc3RhbmNlLm9uQmluZCh0aGlzLm1vZGVsKTtcclxuICAgICAgdGhpcy5wYWdlICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAvLyBhbGxvdyBmb3JtIG9uSW5pdFxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT5cclxuICAgICAgICAgIHRoaXMuX25hdlBhZ2UodGhpcy5wYWdlKSk7XHJcbiAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYWdlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfbmF2UGFnZShwYWdlOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5faW5zdGFuY2Uub25OYXZpZ2F0ZSkgdGhyb3cgJ21pc3NpbmcgZm9ybSBvbk5hdmlnYXRlKCknO1xyXG4gICAgdGhpcy5faW5zdGFuY2Uub25OYXZpZ2F0ZShwYWdlKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGV2XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZmlsZUNoYW5nZUxpc3RlbmVyKGV2OiBFdmVudCkge1xyXG4gICAgY29uc3QgeyBmaWxlcyB9ID0gZXYudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQsXHJcbiAgICAgIGFycjogRmlsZVtdID0gW107XHJcbiAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXJyLnB1c2goZmlsZXNbaV0pO1xyXG4gICAgICB0aGlzLnVwbG9hZChhcnIpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fZmlsZUVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuYXR0YWNobWVudHMubmdPbkNoYW5nZXMoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgX2FwcGx5Y2hhbmdlcygpIHtcclxuICAgIC8vIHJhdyB2YWx1ZSwgZGlzYWJsZWQgY29udHJvbHNcclxuICAgIGRlZXBBc3NpZ24odGhpcy5tb2RlbC5tb2RlbCwgdGhpcy5faW5zdGFuY2UuZm9ybS5nZXRSYXdWYWx1ZSgpKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZ2V0QWN0aW9uQWRqZWN0aXZlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLl9zZXNzaW9uLnByb2ZpbGUuYWN0aW9ucy5maW5kKGEgPT4gYS5uYW1lID09PSBuYW1lKSE7XHJcbiAgICByZXR1cm4gKGFjdGlvbi5hZGplY3RpdmUgfHwgYWN0aW9uLnBhc3QgfHwgYWN0aW9uLnRpdGxlKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gZmVlZGJhY2tcclxuICAgKi9cclxuICBwcml2YXRlIF9zYXZlKGZlZWRiYWNrOiBib29sZWFuKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLndvcmtpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy53b3JraW5nQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcbiAgICBjb25zdCB7IGlkLCB2ZXJzaW9uLCBmb3JtSWQsIG1vZGVsLCBkcmFmdCB9ID0gdGhpcy5tb2RlbDtcclxuICAgIHJldHVybiB0aGlzLl9tYWlsYm94LnNhdmUoaWQsIGZvcm1JZCwgdmVyc2lvbiwgbW9kZWwpLnBpcGUoXHJcbiAgICAgIHRhcCh7XHJcbiAgICAgICAgbmV4dDogbSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9hc3NpZ24obSk7XHJcbiAgICAgICAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQodGhpcy5tb2RlbCk7XHJcbiAgICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgICAgICAgZmVlZGJhY2sgJiZcclxuICAgICAgICAgICAgdGhpcy5fc2IudG9hc3QoZHJhZnQgPyAnRHJhZnRTYXZlZCcgOiAnQ2hhbmdlc1NhdmVkJyk7XHJcbiAgICAgICAgICB0aGlzLnNhdmVkLmVtaXQoKTtcclxuICAgICAgICB9LCBlcnJvcjogZSA9PiB7XHJcbiAgICAgICAgICBmZWVkYmFjayAmJlxyXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvcihlLCAnU2F2ZUVycicpO1xyXG4gICAgICAgIH0sIGZpbmFsaXplOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMud29ya2luZ0NoYW5nZS5lbWl0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLCBtYXAoKCkgPT4gdHJ1ZSkpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gZmlsZXNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHVwbG9hZChmaWxlczogRmlsZVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMud29ya2luZyA9IHRydWU7XHJcbiAgICB0aGlzLndvcmtpbmdDaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIGxldCBleGlzdHM6IGJvb2xlYW47XHJcbiAgICBjb25zdCBvYnNlcnZhYmxlcyA9IFtdIGFzIE9ic2VydmFibGU8YW55PltdO1xyXG4gICAgZmlsZXMuZm9yRWFjaChmID0+IHtcclxuICAgICAgaWYgKCFleGlzdHMpXHJcbiAgICAgICAgZXhpc3RzID0gdGhpcy5tb2RlbC5hdHRhY2htZW50cy5zb21lKGEgPT4gYS5maWxlTmFtZSA9PT0gZi5uYW1lICYmICFhLmRlbGV0ZWQgJiYgIShhIGFzIEF0dGFjaG1lbnRFeHRyYSkuZmFpbGVkKTtcclxuICAgICAgY29uc3QgcmV0cnkgPSB0aGlzLm1vZGVsLmF0dGFjaG1lbnRzLmZpbmRJbmRleChhID0+IGEuZmlsZU5hbWUgPT09IGYubmFtZSAmJiAoYSBhcyBBdHRhY2htZW50RXh0cmEpLmZhaWxlZCk7XHJcbiAgICAgIGlmIChyZXRyeSA+IC0xKVxyXG4gICAgICAgIHRoaXMubW9kZWwuYXR0YWNobWVudHMuc3BsaWNlKHJldHJ5LCAxKTtcclxuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9jb25zdHJ1Y3RBdHRhY2htZW50KGYpO1xyXG4gICAgICBjb25zdCBvYnNlcnZhYmxlID0gdGhpcy5fbWFpbGJveC51cGxvYWQodGhpcy5tb2RlbC5pZCwgdGhpcy5tb2RlbC5mb3JtSWQsIHRoaXMubW9kZWwudmVyc2lvbiwgZikuXHJcbiAgICAgICAgcGlwZSh0YXAoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5leHQ6IHIgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3NiLnRvYXN0KFxyXG4gICAgICAgICAgICAgICAgIWV4aXN0cyA/ICdVcGxvYWRPaycgOiAnVXBsb2FkVmVyc2lvbk9rJywgZi5uYW1lKTtcclxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG1vZGVsLCByLCB7IHByb2dyZXNzOiBudWxsLCB9KTtcclxuICAgICAgICAgICAgICB0aGlzLm1vZGVsLmF0dGFjaG1lbnRzLnB1c2gobW9kZWwpO1xyXG4gICAgICAgICAgICB9LCBlcnJvcjogZSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZSwgJ1VwbG9hZEZhaWxlZCcsIGYubmFtZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICAgICAgfSwgZmluYWxpemU6ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLndvcmtpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pKTtcclxuICAgICAgb2JzZXJ2YWJsZXMucHVzaChvYnNlcnZhYmxlKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKG9ic2VydmFibGVzKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGZpbGVcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgX2NvbnN0cnVjdEF0dGFjaG1lbnQoZmlsZTogRmlsZSkge1xyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKSwgdXRjID0gbmV3IERhdGUobm93LmdldFRpbWUoKSArIG5vdy5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDApO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdXNlcklkOiB0aGlzLl9zZXNzaW9uLnByb2ZpbGUudXNlcklkLFxyXG4gICAgICBieUlkOiB0aGlzLl9zZXNzaW9uLnByb2ZpbGUuYnlJZCxcclxuICAgICAgdGltZTogdXRjLnRvSlNPTigpIGFzIGFueSxcclxuICAgICAgZmlsZU5hbWU6IGZpbGUubmFtZSxcclxuICAgICAgY29udGVudFR5cGU6IGZpbGUudHlwZVxyXG4gICAgfSBhcyBBdHRhY2htZW50O1xyXG4gIH1cclxuICB0YWcoZXZ0OiBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLl9wb3B1cC5vcGVuKFRhZ3NDb21wb25lbnQsIChldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSwge1xyXG4gICAgICBkYXRhOiB0aGlzLm1vZGVsXHJcbiAgICB9KVxyXG4gIH1cclxuICAvKiogKi9cclxuICBwcml2YXRlIF9yZXNldCgpIHtcclxuICAgIHRoaXMuX2luc3RhbmNlLmZvcm0ucmVzZXQodGhpcy5tb2RlbC5tb2RlbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy52YWxpZCA9IHRoaXMuX2luc3RhbmNlLmZvcm0udmFsaWQ7XHJcbiAgICB0aGlzLnZhbGlkQ2hhbmdlLmVtaXQodGhpcy52YWxpZCk7XHJcbiAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XHJcbiAgICB0aGlzLmRpcnR5Q2hhbmdlLmVtaXQodGhpcy5kaXJ0eSk7XHJcbiAgICB0aGlzLmFjdGlvbnMgPSB0aGlzLm1vZGVsLmFjdGlvbnM/Lmxlbmd0aCA/XHJcbiAgICAgIHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5hY3Rpb25zLlxyXG4gICAgICAgIGZpbHRlcihhID0+IHRoaXMubW9kZWwuYWN0aW9ucyEuaW5kZXhPZihhLm5hbWUpID4gLTEpLlxyXG4gICAgICAgIHNvcnQoc29ydEFjdGlvbnMpIDogW107XHJcbiAgfVxyXG5cclxuICBndWlkZShuYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2d1aWRlLnN0YXJ0KG5hbWUpO1xyXG4gIH1cclxuICBhdHRhY2goKSB7XHJcbiAgICBjb25zdCBlbGVtID0gdGhpcy5fZmlsZUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgZWxlbS5jbGljaygpO1xyXG4gIH1cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBmZWVkYmFja1xyXG4gICAqL1xyXG4gIHNhdmUoZmVlZGJhY2sgPSB0cnVlKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLl9hcHBseWNoYW5nZXMoKTtcclxuICAgIC8vY29uc3Qgc2F2ZUFyZ3MgPSB7IGNhbmNlbDogZmFsc2UgfSBhcyBTYXZlRXZlbnRBcmdzO1xyXG4gICAgaWYgKGZlZWRiYWNrICYmIHRoaXMuX2luc3RhbmNlLm9uU2F2ZSkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pbnN0YW5jZS5vblNhdmUoKTtcclxuICAgICAgaWYgKGlzQm9vbGVhbihyZXN1bHQpKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpXHJcbiAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGlzUHJvbWlzZShyZXN1bHQpKVxyXG4gICAgICAgIHJldHVybiBmcm9tKHJlc3VsdCkucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fc2F2ZShmZWVkYmFjaykpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiByZXN1bHQucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fc2F2ZShmZWVkYmFjaykpKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9zYXZlKGZlZWRiYWNrKTtcclxuICB9XHJcbiAgZmxhZygpIHtcclxuICAgIGNvbnN0IGV4dHJhID0gdGhpcy5tb2RlbCBhcyBJdGVtRXh0cmEsIHsgZmxhZyB9ID0gdGhpcy5tb2RlbDtcclxuICAgIGV4dHJhLndvcmtpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuX21haWxib3guZmxhZyh0aGlzLm1vZGVsLmlkLCAhZmxhZykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kZWwuZmxhZyA9ICFmbGFnO1xyXG4gICAgICAgIGV4dHJhLndvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgfSwgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICBleHRyYS53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBzdWJtaXQoKSB7XHJcbiAgICB0aGlzLl9hcHBseWNoYW5nZXMoKTtcclxuICAgIGNvbnN0IHsgaWQsIHZlcnNpb24sIGZvcm1JZCwgbW9kZWwsIG51bWJlciB9ID0gdGhpcy5tb2RlbDtcclxuICAgIHRoaXMud29ya2luZyA9IHRydWU7XHJcbiAgICB0aGlzLndvcmtpbmdDaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIHJldHVybiB0aGlzLl9tYWlsYm94LnN1Ym1pdChpZCwgdmVyc2lvbiwgZm9ybUlkLCBtb2RlbCkuXHJcbiAgICAgIHBpcGUodGFwKHtcclxuICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9zYi50b2FzdCgnU3VibWl0dGVkJywgbnVtYmVyKTtcclxuICAgICAgICB9LCBlcnJvcjogZSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvcihlLCAnU3VibWl0RXJyJyk7XHJcbiAgICAgICAgfSwgZmluYWxpemU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy53b3JraW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpO1xyXG4gIH1cclxuICBiYWNrKCkge1xyXG4gICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IHBhZ2U6IHVuZGVmaW5lZCB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgZGlzY2FyZCgpIHtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlID0+IHtcclxuICAgICAgdGhpcy5fc2IuYXNrKCdEaXNjYXJkQXNrJywgJ0Rpc2NhcmQnLCB7XHJcbiAgICAgICAgY29sb3I6ICd3YXJuJywgb2s6ICdEaXNjYXJkJ1xyXG4gICAgICB9KS5zdWJzY3JpYmUob2sgPT4ge1xyXG4gICAgICAgIGlmIChvaykge1xyXG4gICAgICAgICAgdGhpcy53b3JraW5nQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLl9tYWlsYm94LmRlbGV0ZSh0aGlzLm1vZGVsLmlkKS5cclxuICAgICAgICAgICAgc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmUuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2luZ0NoYW5nZS5lbWl0KGZhbHNlKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGVycm9yOiBlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZSwgJ05ldHdvcmtFcnInKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmUuZXJyb3IoKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmUuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIG9ic2VydmUuY29tcGxldGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBhY3Rpb25cclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHNlbmQoYWN0aW9uOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlID0+IHtcclxuICAgICAgdGhpcy5fZGlhbG9nLm9wZW4oQWN0aW9uRGlhbG9nLCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgYWN0aW9uLFxyXG4gICAgICAgICAgaXRlbTogdGhpcy5tb2RlbFxyXG4gICAgICAgIH0gYXMgQWN0aW9uRGlhbG9nRGF0YSxcclxuICAgICAgICBjbG9zZU9uTmF2aWdhdGlvbjogdHJ1ZVxyXG4gICAgICB9KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShhcmdzID0+IHtcclxuICAgICAgICBpZiAoYXJncykge1xyXG4gICAgICAgICAgdGhpcy5fYXBwbHljaGFuZ2VzKCk7XHJcbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSBxdWVyeVBhcmFtcyhhcmdzKTtcclxuICAgICAgICAgIHRoaXMud29ya2luZyA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLndvcmtpbmdDaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgICAgICAgIGNvbnN0IHsgaWQsIHZlcnNpb24sIG51bWJlciwgbW9kZWwsIGZvcm1JZCB9ID0gdGhpcy5tb2RlbDtcclxuICAgICAgICAgIHRoaXMuX21haWxib3guc2VuZChpZCwgdmVyc2lvbiwgZm9ybUlkLCBtb2RlbCwgYWN0aW9uLCBwYXJhbXMpLlxyXG4gICAgICAgICAgICBzdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG5leHQ6IHIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gci5yZWNpcGllbnRzLmZpbHRlcihyID0+IHIub3JpZ2luSWQgPT09IGlkKTtcclxuICAgICAgICAgICAgICAgIGlmIChvcmlnaW4ubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9hY2NvdW50cy5nZXRBbGwob3JpZ2luLm1hcChyID0+IHIudXNlcklkKSkuc3Vic2NyaWJlKHUgPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYi50b2FzdCgnU2VudFRvJywgbnVtYmVyLCB0aGlzLl9nZXRBY3Rpb25BZGplY3RpdmUoYWN0aW9uKSwgdGhpcy5fdHJhbnNsYXRlLmpvaW4odS5tYXAodSA9PiB1Lm5hbWUpKSkpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9zYi50b2FzdCgnU2VudCcsIG51bWJlciwgdGhpcy5fZ2V0QWN0aW9uQWRqZWN0aXZlKGFjdGlvbikpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmUuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICB9LCBlcnJvcjogZSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2luZ0NoYW5nZS5lbWl0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKGUsICdTZW5kRXJyJyk7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlLmVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBvYnNlcnZlLmVycm9yKCk7XHJcbiAgICAgICAgICBvYnNlcnZlLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKiAqL1xyXG4gIGNvcHkoKSB7XHJcbiAgICB0aGlzLl9tYWlsYm94LmNvcHkodGhpcy5tb2RlbC5kb2N1bWVudElkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBpID0+IHtcclxuICAgICAgICB0aGlzLl9zYi50b2FzdCgnQ29waWVkJywgaS5udW1iZXIgfHwgdGhpcy5mb3JtLnRpdGxlKTtcclxuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWydtYWlsYm94L2knLCBpLmlkLmVuY29kZUlkKCldLCB7XHJcbiAgICAgICAgICBwb2xpY3k6IE9wZW5Qb2xpY3kuQ2xlYXIsXHJcbiAgICAgICAgICBzdGF0ZTogeyBpdGVtOiBpIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSwgZXJyb3I6ICgpID0+IHRoaXMuX3NiLmVycm9yKClcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSByZXNwb25zZVxyXG4gICAqIEBwYXJhbSBpdGVtXHJcbiAgICogQHBhcmFtIG1lc3NhZ2UgcmVzb3VyY2VcclxuICAgKiBAcGFyYW0gYXJnc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgX2hhbmRsZUVycm9yKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSB8IGFueSwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXSkge1xyXG4gICAgaWYgKHJlc3BvbnNlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdQb3NpdGlvbkVycm9yJylcclxuICAgICAgc3dpdGNoIChyZXNwb25zZS5jb2RlKSB7XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgdGhpcy5fc2IuZXJyb3IoJ1VzZXJEZW5pZWRHZW9FcnInKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLl9zYi5lcnJvcignR2VvRXJyJyk7XHJcbiAgICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcclxuICAgICAgICBjYXNlIDQwMTpcclxuICAgICAgICAgIHRoaXMuX3NiLmVycm9yKCdVbmF1dGhvcml6ZWQnKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgNDA5OiAvLyB2ZXJzaW9uIGNoYW5nZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zdCBvYmogPSByZXNwb25zZS5lcnJvciAvKiBzZXJpYWxpemVkIG1vZGVsICovIGFzIFJlY2lwaWVudE1vZGVsPGFueT47XHJcbiAgICAgICAgICAgIG9iaiAmJiB0aGlzLl9hc3NpZ24ob2JqKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2IuZXJyb3IoJ1ZlcnNpb25FcnInLCB0aGlzLm1vZGVsLm51bWJlcik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgNDA2OiAvLyB2YWxpZGF0aW9uXHJcbiAgICAgICAgICB0aGlzLl9zYi5lcnJvclN0cmluZyhyZXNwb25zZS5lcnJvcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDQyNjogLy8gbGljZW5zZSBcclxuICAgICAgICAgIHRoaXMuX3NiLmVycm9yKCdMaWNlbnNlRXJyJyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhpcy5fc2IuZXJyb3IobWVzc2FnZSwgLi4uYXJncyk7XHJcbiAgICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBfYXNzaWduKG1vZGVsOiBSZWNpcGllbnRNb2RlbCkge1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm1vZGVsLCBtb2RlbCwge1xyXG4gICAgICAvLyBwcmVzZXJ2ZSBvYmplY3QgcmVmIGluIG1vZGVsIGFuZCB1cGRhdGUgc2VydmVyIGNoYW5nZXMsIHN1Y2ggYXMgbGluZSBhdHRyaWJ1dGVcclxuICAgICAgbW9kZWw6IGRlZXBBc3NpZ24odGhpcy5tb2RlbC5tb2RlbCwgbW9kZWwubW9kZWwpXHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0cm95Lm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuZnVuY3Rpb24gc29ydEFjdGlvbnMoYTogQWN0aW9uLCBiOiBBY3Rpb24pIHtcclxuICBpZiAoYS5ncm91cCAmJiBiLmdyb3VwICYmIGEuZ3JvdXAgIT09IGIuZ3JvdXApXHJcbiAgICByZXR1cm4gYS5ncm91cCA8IGIuZ3JvdXAgPyAtMSA6IDE7XHJcbiAgcmV0dXJuIDA7XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZvcm0taGVhZGVyXCI+XHJcbiAgPCEtLTxiaXpkb2MtcGVvcGxlIFttb2RlbF09XCJtb2RlbFwiICpuZ0lmPVwibW9kZSAhPT0gJ2NvbXBvc2UnICYmIGNvbnRhY3RzXCI+PC9iaXpkb2MtcGVvcGxlPi0tPlxyXG4gIDxiaXpkb2MtYXR0YWNobWVudHMgW21vZGVsXT1cIm1vZGVsXCIgW2luY2x1ZGVEZWxldGVkXT1cInRydWVcIiBbdmlld2VkSW5kaWNhdG9yXT1cImZhbHNlXCI+PC9iaXpkb2MtYXR0YWNobWVudHM+XHJcbiAgQGlmICghbW9kZWwucmVwbGllZCAmJiBtb2RlICE9PSAnY29tcG9zZScgJiYgbW9kZWwubm90ZSkge1xyXG4gIDxkaXYgY2xhc3M9XCJjb21wb3NlLW5vdGVcIj5cclxuICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5pbmZvPC9tYXQtaWNvbj4gPHNwYW4gY2xhc3M9XCJtYXQtYm9keS0yXCI+e3ttb2RlbC5ub3RlfX08L3NwYW4+XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG4gIEBpZiAobW9kZWwudGFncykge1xyXG4gIDxtYXQtY2hpcC1zZXQ+XHJcbiAgICBAZm9yICh0YWcgb2YgbW9kZWwudGFnczsgdHJhY2sgdGFnKSB7XHJcbiAgICA8bWF0LWNoaXAgW2Rpc2FibGVSaXBwbGVdPVwidHJ1ZVwiPnt7dGFnfX08L21hdC1jaGlwPlxyXG4gICAgfVxyXG4gIDwvbWF0LWNoaXAtc2V0PlxyXG4gIH1cclxuICBAaWYgKGVkaXRpbmcpIHtcclxuICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPnt7IGVkaXRpbmcgfX08L2Rpdj5cclxuICB9XHJcbjwvZGl2PlxyXG48bmctY29udGFpbmVyICNjb21wb25lbnQ+PC9uZy1jb250YWluZXI+XHJcbjxmb3JtIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PGlucHV0IHR5cGU9XCJmaWxlXCIgI2ZpbGUgbXVsdGlwbGUgLz48L2Zvcm0+XHJcbiJdfQ==