fmode-ng 0.0.113 → 0.0.115

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 (275) hide show
  1. package/LICENSE.md +8 -0
  2. package/README.md +37 -37
  3. package/esm2022/fmode-ng.mjs +10 -5
  4. package/esm2022/lib/aigc/agent/fm-agent-task/fm-agent-task.component.mjs +8 -92
  5. package/esm2022/lib/aigc/agent/index.mjs +10 -3
  6. package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
  7. package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
  8. package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
  9. package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
  10. package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
  11. package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -98
  12. package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -107
  13. package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -113
  14. package/esm2022/lib/aigc/avatar/index.mjs +10 -8
  15. package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
  16. package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -164
  17. package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -49
  18. package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
  19. package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -155
  20. package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
  21. package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
  22. package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
  23. package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -140
  24. package/esm2022/lib/aigc/chat/chat-message-card/duration-str.pipe.mjs +10 -29
  25. package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -3
  26. package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -3
  27. package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -193
  28. package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -331
  29. package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +8 -249
  30. package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -83
  31. package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
  32. package/esm2022/lib/aigc/chat/index.mjs +10 -8
  33. package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
  34. package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -367
  35. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
  36. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
  37. package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -115
  38. package/esm2022/lib/aigc/index.mjs +10 -14
  39. package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
  40. package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +10 -2
  41. package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -174
  42. package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
  43. package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
  44. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
  45. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
  46. package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
  47. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-func.mjs +9 -162
  48. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-work.mjs +10 -68
  49. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -313
  50. package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -4
  51. package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -62
  52. package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -87
  53. package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -345
  54. package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -81
  55. package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -152
  56. package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -42
  57. package/esm2022/lib/aigc/story/index.mjs +10 -6
  58. package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -47
  59. package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -95
  60. package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -253
  61. package/esm2022/lib/aigc/story/story.service.mjs +10 -35
  62. package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +10 -636
  63. package/esm2022/lib/aigc/voice/index.mjs +10 -7
  64. package/esm2022/lib/aigc/voice/lib/audio/audio.player.mjs +10 -55
  65. package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -2
  66. package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -96
  67. package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +8 -177
  68. package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
  69. package/esm2022/lib/aigc/voice/lib/recorder/extension-waveview.mjs +10 -215
  70. package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
  71. package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +10 -189
  72. package/esm2022/lib/aigc/voice/tts/index.mjs +10 -5
  73. package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -2
  74. package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +8 -346
  75. package/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs +8 -342
  76. package/esm2022/lib/code/index.mjs +10 -2
  77. package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +8 -430
  78. package/esm2022/lib/core/agent/chat/completion/index.mjs +10 -2
  79. package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -2
  80. package/esm2022/lib/core/agent/chat/fmode-chat.mjs +8 -617
  81. package/esm2022/lib/core/agent/chat/index.mjs +10 -4
  82. package/esm2022/lib/core/agent/chat/interface.mjs +10 -2
  83. package/esm2022/lib/core/agent/index.mjs +10 -6
  84. package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +10 -133
  85. package/esm2022/lib/core/agent/prompt/index.mjs +10 -2
  86. package/esm2022/lib/core/agent/prompt/prompt-util.mjs +10 -16
  87. package/esm2022/lib/core/agent/story/agent.story.mjs +10 -64
  88. package/esm2022/lib/core/agent/story/index.mjs +10 -2
  89. package/esm2022/lib/core/agent/task/agent.task.mjs +10 -90
  90. package/esm2022/lib/core/agent/task/index.mjs +10 -2
  91. package/esm2022/lib/core/agent/waiting/index.mjs +10 -3
  92. package/esm2022/lib/core/agent/waiting/loading/loading.ctrl.mjs +10 -279
  93. package/esm2022/lib/core/agent/waiting/tips/tips.ctrl.mjs +8 -190
  94. package/esm2022/lib/core/index.mjs +10 -4
  95. package/esm2022/lib/core/parse/datatype/acl.mjs +10 -57
  96. package/esm2022/lib/core/parse/datatype/file.mjs +10 -69
  97. package/esm2022/lib/core/parse/datatype/geopoint.mjs +10 -57
  98. package/esm2022/lib/core/parse/datatype/relation.mjs +10 -56
  99. package/esm2022/lib/core/parse/fmode.cloud.mjs +10 -0
  100. package/esm2022/lib/core/parse/fmode.object.mjs +10 -232
  101. package/esm2022/lib/core/parse/fmode.parse.mjs +10 -84
  102. package/esm2022/lib/core/parse/fmode.query.mjs +8 -500
  103. package/esm2022/lib/core/parse/fmode.user.mjs +10 -275
  104. package/esm2022/lib/core/parse/index.mjs +10 -5
  105. package/esm2022/lib/core/parse/types.mjs +10 -2
  106. package/esm2022/lib/core/voice/index.mjs +10 -3
  107. package/esm2022/lib/core/voice/tts/index.mjs +10 -2
  108. package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -3
  109. package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -14
  110. package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -3
  111. package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -3
  112. package/esm2022/lib/icon/filetype/file.svg.mjs +10 -3
  113. package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -57
  114. package/esm2022/lib/icon/filetype/index.mjs +10 -12
  115. package/esm2022/lib/icon/filetype/md.svg.mjs +10 -3
  116. package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -3
  117. package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -3
  118. package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -8
  119. package/esm2022/lib/icon/filetype/video.svg.mjs +10 -3
  120. package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -3
  121. package/esm2022/lib/icon/index.mjs +10 -2
  122. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -209
  123. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
  124. package/esm2022/lib/map/index.mjs +10 -4
  125. package/esm2022/lib/map/map.module.mjs +10 -61
  126. package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -132
  127. package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -115
  128. package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -118
  129. package/esm2022/lib/nova-cloud/index.mjs +10 -3
  130. package/esm2022/lib/nova-cloud/ncloud-api-func.mjs +10 -91
  131. package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -53
  132. package/esm2022/lib/payment/index.mjs +10 -2
  133. package/esm2022/lib/payment/payment/payment.component.mjs +10 -543
  134. package/esm2022/lib/payment/payment.service.mjs +10 -202
  135. package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -48
  136. package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -29
  137. package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -211
  138. package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +8 -412
  139. package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -50
  140. package/esm2022/lib/person/index.mjs +10 -5
  141. package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -144
  142. package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -41
  143. package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -595
  144. package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -172
  145. package/esm2022/lib/person/person.service.mjs +8 -193
  146. package/esm2022/lib/platform/cross.service.mjs +10 -62
  147. package/esm2022/lib/platform/index.mjs +10 -2
  148. package/esm2022/lib/social/index.mjs +10 -2
  149. package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -230
  150. package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
  151. package/esm2022/lib/storage/index.mjs +10 -5
  152. package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -131
  153. package/esm2022/lib/storage/service-hwobs/index.mjs +10 -3
  154. package/esm2022/lib/storage/service-hwobs/typings/esdk-obs-browser.mjs +1 -1
  155. package/esm2022/lib/storage/service-upload/index.mjs +10 -2
  156. package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -513
  157. package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
  158. package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +10 -93
  159. package/esm2022/lib/storage/storage.module.mjs +10 -42
  160. package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -72
  161. package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -237
  162. package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +8 -72
  163. package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -207
  164. package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +8 -227
  165. package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -303
  166. package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +8 -371
  167. package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -94
  168. package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -36
  169. package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -281
  170. package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -72
  171. package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -22
  172. package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -169
  173. package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -69
  174. package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -65
  175. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -55
  176. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -142
  177. package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -35
  178. package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -81
  179. package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -50
  180. package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -145
  181. package/esm2022/lib/text/index.mjs +10 -4
  182. package/esm2022/lib/user/account/account.service.mjs +10 -222
  183. package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
  184. package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -66
  185. package/esm2022/lib/user/index.mjs +10 -17
  186. package/esm2022/lib/user/login/auth.guard.mjs +10 -28
  187. package/esm2022/lib/user/login/auth.service.mjs +8 -433
  188. package/esm2022/lib/user/login/login.component.mjs +10 -916
  189. package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -311
  190. package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
  191. package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
  192. package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -164
  193. package/esm2022/lib/user/profile/profile-bind/profile-confirm-modal.component.mjs +10 -79
  194. package/esm2022/lib/user/profile/profile.module.mjs +10 -54
  195. package/esm2022/lib/user/staff/index.mjs +10 -4
  196. package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
  197. package/esm2022/lib/user/staff/staff.module.mjs +10 -18
  198. package/esm2022/lib/user/staff/staff.service.mjs +10 -85
  199. package/esm2022/lib/user/user-name.pipe.mjs +10 -29
  200. package/esm2022/lib/user/user.module.mjs +10 -102
  201. package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
  202. package/esm2022/lib/video/index.mjs +10 -2
  203. package/esm2022/public-api.mjs +10 -21
  204. package/fesm2022/fmode-ng.mjs +7 -19788
  205. package/fesm2022/fmode-ng.mjs.map +1 -1
  206. package/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.d.ts +2 -2
  207. package/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.d.ts +2 -2
  208. package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +2 -2
  209. package/lib/aigc/chat/chat-list/chat-list.component.d.ts +3 -2
  210. package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +3 -3
  211. package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +2 -2
  212. package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +3 -3
  213. package/lib/aigc/service-fmai/service-imagine/imagine-func.d.ts +3 -3
  214. package/lib/aigc/service-fmai/service-imagine/imagine-work.d.ts +4 -4
  215. package/lib/aigc/service-fmai/service-imagine/imagine.service.d.ts +6 -6
  216. package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +2 -2
  217. package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +2 -1
  218. package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +6 -6
  219. package/lib/aigc/story/fm-story-list/story-preview.d.ts +4 -4
  220. package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +3 -3
  221. package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +2 -2
  222. package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +3 -2
  223. package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +3 -2
  224. package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +6 -6
  225. package/lib/aigc/story/story.service.d.ts +3 -2
  226. package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
  227. package/lib/core/agent/chat/fmode-chat.d.ts +11 -11
  228. package/lib/core/agent/story/agent.story.d.ts +8 -8
  229. package/lib/core/parse/datatype/geopoint.d.ts +5 -1
  230. package/lib/core/parse/fmode.cloud.d.ts +32 -0
  231. package/lib/core/parse/fmode.object.d.ts +2 -2
  232. package/lib/core/parse/fmode.parse.d.ts +15 -9
  233. package/lib/core/parse/fmode.query.d.ts +41 -2
  234. package/lib/core/parse/fmode.user.d.ts +1 -0
  235. package/lib/core/parse/index.d.ts +1 -0
  236. package/lib/core/parse/types.d.ts +2 -0
  237. package/lib/map/comp-poi-picker/comp-poi-picker.component.d.ts +5 -5
  238. package/lib/payment/payment/payment.component.d.ts +3 -3
  239. package/lib/payment/payment.service.d.ts +4 -4
  240. package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +2 -1
  241. package/lib/person/comp-person-item/comp-person-item.component.d.ts +2 -1
  242. package/lib/person/comp-person-story/comp-person-story.component.d.ts +13 -13
  243. package/lib/person/edit-upload/edit-upload.component.d.ts +1 -1
  244. package/lib/person/modal-person-select/modal-person-select.component.d.ts +5 -5
  245. package/lib/person/modal-user-verify/user-verify.component.d.ts +5 -5
  246. package/lib/person/person-detail/person-detail.component.d.ts +4 -4
  247. package/lib/person/person.service.d.ts +7 -7
  248. package/lib/storage/service-hwobs/hwobs.service.d.ts +4 -5
  249. package/lib/storage/service-upload/nova-upload.service.d.ts +5 -5
  250. package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +2 -1
  251. package/lib/text/fm-article-editor/article.service.d.ts +12 -12
  252. package/lib/text/fm-article-editor/draft.service.d.ts +5 -5
  253. package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +3 -2
  254. package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +16 -17
  255. package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +3 -3
  256. package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +11 -10
  257. package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +2 -2
  258. package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +3 -3
  259. package/lib/text/fm-article-editor/task-article-generation.d.ts +5 -4
  260. package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +3 -3
  261. package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +3 -3
  262. package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +3 -3
  263. package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +2 -1
  264. package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +3 -3
  265. package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +3 -3
  266. package/lib/user/account/account.service.d.ts +2 -2
  267. package/lib/user/comp-user-avatar/comp-user-avatar.component.d.ts +2 -2
  268. package/lib/user/login/auth.service.d.ts +5 -5
  269. package/lib/user/login/login.component.d.ts +3 -3
  270. package/lib/user/profile/auth-profile.service.d.ts +8 -8
  271. package/lib/user/profile/profile-bind/profile-bind.component.d.ts +7 -7
  272. package/lib/user/profile/profile-bind/profile-confirm-modal.component.d.ts +2 -2
  273. package/lib/user/staff/staff.service.d.ts +3 -3
  274. package/lib/user/user-name.pipe.d.ts +2 -2
  275. package/package.json +12 -18
@@ -1,303 +1,10 @@
1
- import { CommonModule } from '@angular/common';
2
- import { ChangeDetectorRef, Component, EventEmitter, Inject, Input, Output, ViewChild } from '@angular/core';
3
- import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4
- import { MatButtonModule } from '@angular/material/button';
5
- import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
6
- import { DraftService } from '../draft.service';
7
- import { NzLayoutModule } from 'ng-zorro-antd/layout';
8
- import Parse from "parse";
9
- import { IonicModule } from '@ionic/angular';
10
- import { UtilnowPipe } from '../../../aigc/service-fmai/service-chat/utilnow.pipe';
11
- import { NzPipesModule } from 'ng-zorro-antd/pipes';
12
- import { NzIconModule } from 'ng-zorro-antd/icon';
13
- import { MarkdownPreviewModule } from '../../../aigc';
14
- import { MarkdownParse } from '../../../aigc';
15
- import { NzInputModule } from 'ng-zorro-antd/input';
16
- import { OutlineCountPipe } from '../outline-count.pipe';
17
- import { FmArticleOutlineLeftitemComponent } from '../fm-article-outline-leftitem/fm-article-outline-leftitem.component';
18
- import { addIcons } from 'ionicons';
19
- import { hardwareChipOutline, receiptOutline, chevronForward } from 'ionicons/icons';
20
- import { MatAccordion, MatExpansionModule } from '@angular/material/expansion';
21
- import { MatIconModule } from '@angular/material/icon';
22
- import { MatProgressBarModule } from '@angular/material/progress-bar';
23
- import * as i0 from "@angular/core";
24
- import * as i1 from "../draft.service";
25
- import * as i2 from "@angular/common";
26
- import * as i3 from "@ionic/angular";
27
- import * as i4 from "ng-zorro-antd/layout";
28
- import * as i5 from "ng-zorro-antd/icon";
29
- import * as i6 from "@angular/material/button";
30
- import * as i7 from "@angular/material/expansion";
31
- import * as i8 from "@angular/material/progress-bar";
32
- import * as i9 from "../../../aigc/comp-markdown-preview/markdown-preview.component";
33
- import * as i10 from "@angular/material/dialog";
34
- addIcons({ hardwareChipOutline, receiptOutline, chevronForward });
35
- export class FmArticleDraftComponent {
36
- constructor(draftServ, cdRef) {
37
- this.draftServ = draftServ;
38
- this.cdRef = cdRef;
39
- this.isSelectMode = false;
40
- this.onDraftConfirm = new EventEmitter();
41
- this.currentHTML = ``;
42
- this.ArticleDraft = Parse.Object.extend("ArticleDraft");
43
- this.isCreating = false;
44
- this.isCreatingMap = {};
45
- this.isCompleteMap = {};
46
- this.create$Map = {};
47
- this.contentArray = [];
48
- }
49
- getAcc() {
50
- console.log(this.expandComp);
51
- }
52
- ngOnInit() {
53
- for (let index = 0; index < 20; index++) {
54
- this.isCompleteMap[index] = true;
55
- }
56
- this.expandComp?.openAll();
57
- if (this.article?.id) {
58
- this.draftServ?.loadArticleDraft(this.article);
59
- }
60
- }
61
- confirmDraft() {
62
- let mdparser = new MarkdownParse();
63
- let contentArray = this.contentArray?.map(item => {
64
- item.type = 'richtext';
65
- // console.log(item?.content)
66
- item.content = mdparser.parseToHTML(item.content);
67
- // console.log(item?.content)
68
- return item;
69
- });
70
- // console.log(contentArray)
71
- this.onDraftConfirm.emit(contentArray);
72
- }
73
- previewDraft(draft) {
74
- // if(document.body.clientWidth>900){
75
- // PC端展示草稿
76
- this.currentDraft = undefined;
77
- setTimeout(() => {
78
- this.currentDraft = draft;
79
- this.contentArray = draft?.get("contentArray");
80
- }, 100);
81
- // }else{
82
- // // 移动端展示草稿
83
- // }
84
- }
85
- async createNewDraft(outlineJson, writingOptions, person, docList, documentList) {
86
- this.isCompleteMap = {};
87
- this.expandComp?.closeAll();
88
- // console.log("createNewDraft")
89
- // 根据当前文章参数,生成草稿
90
- let draft = new this.ArticleDraft();
91
- draft.set({
92
- type: "ai",
93
- title: outlineJson?.title || this.article?.get("title"),
94
- desc: outlineJson?.desc || this.article?.get("desc"),
95
- keywords: outlineJson?.keywords || this.article?.get("keywords"),
96
- article: this.article?.toPointer(),
97
- docList: docList,
98
- content: ``,
99
- outlineJson: outlineJson,
100
- contentArray: [],
101
- author: Parse.User.current()?.toPointer(),
102
- });
103
- // 设置草稿为当前预览
104
- if (this.article) {
105
- if (!this.draftServ.DraftListMap[this.article.id])
106
- this.draftServ.DraftListMap[this.article.id] = [];
107
- this.draftServ.DraftListMap[this.article.id].unshift(draft);
108
- }
109
- this.currentDraft = draft;
110
- this.createAllSections(documentList, writingOptions, person);
111
- }
112
- async createAllSections(documentList, writingOptions, person) {
113
- let that = this;
114
- // console.log("createAllSections")
115
- this.isCreating = true;
116
- if (this.currentDraft) {
117
- // 执行创作生成内容
118
- // console.log(this.currentDraft,this.contentArray)
119
- let sections = this.currentDraft?.get('outlineJson')?.sections || [];
120
- for (let index = 0; index < sections.length; index++) {
121
- this.isCreatingMap[index] = true;
122
- let CreateOrderSetting = "逐个";
123
- if (CreateOrderSetting == "逐个") {
124
- await new Promise(async (resolve) => {
125
- // this.isCreating = true; // 逐个生成,每次保存后都需要重置markdown-preview
126
- this.create$Map[index] = await this.draftServ?.newSectionCreate({
127
- person: person,
128
- writingOptions: writingOptions,
129
- contentArray: this.contentArray,
130
- outlineJson: this.currentDraft?.get('outlineJson'),
131
- draft: this.currentDraft,
132
- sectionIndex: index,
133
- documentList: documentList,
134
- afterComplete: (draft) => {
135
- // 结束生成后续步骤
136
- that.stopCreating(index);
137
- resolve(true);
138
- },
139
- cdRef: this.cdRef
140
- });
141
- });
142
- }
143
- if (CreateOrderSetting == "并发") {
144
- this.create$Map[index] = await this.draftServ?.newSectionCreate({
145
- person: person,
146
- writingOptions: writingOptions,
147
- contentArray: this.contentArray,
148
- outlineJson: this.currentDraft?.get('outlineJson'),
149
- draft: this.currentDraft,
150
- sectionIndex: index,
151
- documentList: documentList,
152
- afterComplete: (draft) => {
153
- // 结束生成后续步骤
154
- that.stopCreating(index);
155
- },
156
- cdRef: this.cdRef
157
- });
158
- }
159
- }
160
- }
161
- }
162
- stopCreatingAll() {
163
- Object.values(this.isCreatingMap).forEach((sub) => {
164
- try {
165
- sub && sub?.unsubscribe();
166
- }
167
- catch (err) { }
168
- });
169
- }
170
- stopCreating(index) {
171
- // console.log("stopCreating",index)
172
- this.isCreatingMap[index] = false;
173
- this.isCompleteMap[index] = true;
174
- // if(!this.create$Map[index]?.closed)this.create$Map[index]?.unsubscribe();
175
- // console.log("trueLength",Object.values(this.isCreatingMap)?.filter(item=>item==true)?.length)
176
- // console.log("contentArray",this.contentArray)
177
- if (Object.values(this.isCreatingMap)?.filter(item => item == true)?.length == 0) {
178
- this.isCreating = false;
179
- if (this.contentArray?.length > 0) {
180
- this.currentDraft?.set("contentArray", this.contentArray);
181
- this.currentDraft?.save();
182
- }
183
- }
184
- this.checkAllComplete(index);
185
- }
186
- checkAllComplete(index) {
187
- // 过程折叠控制
188
- let length = this.contentArray?.length;
189
- let nextIndex = index + 1;
190
- this.expandComp?.closeAll();
191
- // console.log("checkAllComplete");
192
- // console.log((this.expandComp as any)?._keyManager?._items?._results?.[nextIndex]);
193
- this.expandComp?._keyManager?._items?._results?.[nextIndex]?.panel?.open();
194
- // 全部完成判定
195
- for (let index = 0; index < length; index++) {
196
- let complete = this.isCompleteMap[index];
197
- if (!complete) {
198
- return false;
199
- }
200
- }
201
- return true;
202
- }
203
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FmArticleDraftComponent, deps: [{ token: i1.DraftService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
204
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FmArticleDraftComponent, isStandalone: true, selector: "fm-article-draft", inputs: { article: "article" }, outputs: { onDraftConfirm: "onDraftConfirm" }, viewQueries: [{ propertyName: "expandComp", first: true, predicate: MatAccordion, descendants: true }], ngImport: i0, template: "\r\n\r\n\r\n<nz-layout style=\"height:100%;\">\r\n <nz-sider [nzWidth]=\"isSelectMode?290:350\">\r\n\r\n <div class=\"list\">\r\n <!-- \u6DFB\u52A0\u8349\u7A3F -->\r\n <!-- <button mat-flat-button color=\"primary\" *ngIf=\"!isSelectMode\">\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\"></span> \u65B0\u7684\u8349\u7A3F\r\n </button> -->\r\n <!-- \u8349\u7A3F\u5361\u7247 -->\r\n \r\n <ion-list [inset]=\"true\">\r\n\r\n <ion-item [button]=\"true\">\r\n <ion-icon color=\"tertiary\" slot=\"start\" name=\"hardware-chip-outline\" size=\"large\"></ion-icon>\r\n <ion-label>AI\u521B\u4F5C\u7A3F\u4EF6</ion-label>\r\n <ion-note slot=\"end\">{{draftServ.DraftCountMap?.[article?.id||'']?.aiCount}}</ion-note>\r\n </ion-item>\r\n\r\n <ion-item [button]=\"true\">\r\n <ion-icon color=\"warning\" slot=\"start\" name=\"receipt-outline\" size=\"large\"></ion-icon>\r\n <ion-label>\u5386 \u53F2 \u7A3F \u4EF6</ion-label>\r\n <ion-note slot=\"end\">{{draftServ.DraftCountMap?.[article?.id||'']?.draftCount}}</ion-note>\r\n </ion-item>\r\n </ion-list>\r\n\r\n <ion-list [inset]=\"true\" *ngIf=\"article?.id\">\r\n\r\n <!-- \u8349\u7A3F\u6587\u7AE0\u5361\u7247 -->\r\n <ng-container *ngFor=\"let draft of (draftServ.DraftListMap?.[article?.id||'']||[])\">\r\n <ion-item (click)=\"previewDraft(draft)\" [button]=\"true\" detail=\"false\">\r\n <div class=\"unread-indicator-wrapper\" slot=\"start\">\r\n <div class=\"unread-indicator\"></div>\r\n </div>\r\n <ion-label>\r\n <!-- \u6807\u9898 -->\r\n <strong>{{draft?.get(\"title\")}}</strong>\r\n <!-- <ion-text>Never Gonna Give You Up</ion-text> -->\r\n <!-- \u5173\u952E\u5B57 -->\r\n <br />\r\n <ion-note color=\"medium\" class=\"ion-text-wrap\">\r\n <span *ngFor=\"let key of draft?.get('keywords')\" style=\"margin-right:3px;\">{{key}}</span>\r\n </ion-note>\r\n <!-- \u6240\u7528\u6A21\u578B -->\r\n <ng-container *ngIf=\"draft?.get('model')\">\r\n <br />\r\n <ion-note color=\"medium\">#{{draft?.get('model')}} <span>\u7EA6{{draft?.get(\"contentArray\") | outlineCount}}\u5B57</span></ion-note>\r\n </ng-container>\r\n <!-- \u751F\u6210\u65F6\u95F4 -->\r\n <br />\r\n <ion-note color=\"medium\" *ngIf=\"draft?.id\">{{draft.updatedAt | utilnow}}</ion-note>\r\n <ion-note color=\"medium\" *ngIf=\"!draft?.id\">--</ion-note>\r\n </ion-label>\r\n <div class=\"metadata-end-wrapper\" slot=\"end\">\r\n <ion-icon color=\"medium\" name=\"chevron-forward\"></ion-icon>\r\n </div>\r\n </ion-item>\r\n\r\n <button (click)=\"stopCreatingAll()\" *ngIf=\"!draft?.id&&isCreating&&create$\" mat-flat-button color=\"warn\">\r\n <span nz-icon [nzType]=\"'sync'\" [nzSpin]=\"true\"></span>\r\n \u505C\u6B62\u751F\u6210\r\n </button>\r\n </ng-container>\r\n\r\n </ion-list>\r\n\r\n </div>\r\n\r\n </nz-sider>\r\n\r\n <!-- PC\u7AEF\uFF1A\u8349\u7A3F\u663E\u793A\u533A\u57DF -->\r\n <nz-layout class=\"draft-area\" [class.is-hidden]=\"!currentDraft\">\r\n <nz-content style=\"height:100%;\">\r\n <!-- <fm-story-loader *ngIf=\"currentStory?.story\" [isSelectMode]=\"isSelectMode\" [story]=\"currentStory\"></fm-story-loader> -->\r\n <div class=\"preview\" *ngIf=\"currentDraft\">\r\n <div class=\"title\">\r\n <div class=\"text\">\r\n <span style=\"font-weight: bold;\" (click)=\"getAcc()\">{{currentDraft?.get('title')}}@if(currentDraft?.get('contentArray')?.length){&nbsp;\u7EA6{{currentDraft?.get(\"contentArray\") | outlineCount}}\u5B57}</span>\r\n <!-- <span style=\"font-size:16px;\" *ngIf=\"currentDraft?.get('contentArray')?.length\">\u7EA6{{currentDraft?.get(\"contentArray\") | outlineCount}}\u5B57</span> -->\r\n </div>\r\n <button mat-raised-button (click)=\"currentDraft=undefined\">\u53D6\u6D88</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"confirmDraft()\">\u9009\u62E9</button>\r\n </div>\r\n\r\n <div class=\"section-area\">\r\n\r\n <mat-accordion #expandComp class=\"example-headers-align\" multi>\r\n\r\n <ng-container *ngFor=\"let section of (currentDraft?.get('outlineJson')?.sections || []);let index=index\">\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title style=\"min-width: 120px;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;\">\r\n {{index}}.{{section?.title}}\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n @if(isCompleteMap[index]){\r\n <span style=\"min-width: 50px;\">\u5DF2\u5B8C\u6210</span>\r\n }@else{\r\n <span style=\"min-width: 50px;\">\u751F\u6210\u4E2D</span>\r\n }\r\n <mat-progress-bar [mode]=\"isCompleteMap[index]?'determinate':'indeterminate'\" value=\"100\"></mat-progress-bar>\r\n <!-- <mat-icon>account_circle</mat-icon> -->\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n \r\n <div class=\"row section-tips\" *ngIf=\"section?.outline\">\r\n <!-- <div class=\"name\"></div> -->\r\n <div class=\"content\"><span style=\"font-weight: bold;\">\u4E3B\u8981\u5185\u5BB9:&nbsp;</span>{{section?.outline}}</div>\r\n </div>\r\n <div class=\"row section-tips\" *ngIf=\"section?.skill\">\r\n <!-- <div class=\"name\"></div> -->\r\n <div class=\"content\"><span style=\"font-weight: bold;\">\u5199\u4F5C\u6280\u5DE7:&nbsp;</span>{{section?.skill}}</div>\r\n </div>\r\n <div class=\"row section-tips\" *ngIf=\"section?.case\">\r\n <!-- <div class=\"name\"></div> -->\r\n <div class=\"content\"><span style=\"font-weight: bold;\">\u91CD\u70B9\u4E8B\u4F8B:&nbsp;</span>{{section?.case}}</div>\r\n </div>\r\n\r\n <!-- \u751F\u6210\u4E2D/\u5DF2\u751F\u6210 -->\r\n <fm-markdown-preview class=\"content\" *ngIf=\"isCreatingMap[index]&&contentArray?.[index]\" [content]=\"contentArray?.[index]?.content\" [render]=\"false\"></fm-markdown-preview>\r\n <fm-markdown-preview class=\"content\" *ngIf=\"!isCreatingMap[index]&&contentArray?.[index]\" [content]=\"contentArray?.[index]?.content\"></fm-markdown-preview>\r\n </mat-expansion-panel>\r\n <!-- <div class=\"section\" *ngFor=\"let section of (currentDraft?.get('outlineJson')?.sections || []);let index=index\"> -->\r\n\r\n <!-- <div class=\"outline\">\r\n <div class=\"row divide section-title\" *ngIf=\"section?.title\">\r\n <span>\u7AE0{{index+1}}.</span>\r\n <input nz-input type=\"text\" [(ngModel)]=\"section.title\" placeholder=\"\u8BF7\u586B\u7AE0\u8282\u6807\u9898\" nzBorderless />\r\n </div>\r\n <div class=\"row\" *ngIf=\"section?.outline\">\r\n <span>\u5185\u5BB9</span>\r\n <textarea nzAutosize nz-input type=\"text\" [(ngModel)]=\"section.outline\" placeholder=\"\u8BF7\u586B\u4E3B\u8981\u5185\u5BB9\" nzBorderless></textarea>\r\n </div>\r\n <div class=\"row\" *ngIf=\"section?.skill\">\r\n <span>\u6280\u5DE7</span>\r\n <textarea nzAutosize nz-input type=\"text\" [(ngModel)]=\"section.skill\" placeholder=\"\u8BF7\u586B\u5199\u4F5C\u6280\u5DE7\" nzBorderless></textarea>\r\n </div>\r\n <div class=\"row\" *ngIf=\"section?.case\">\r\n <span>\u4E8B\u4F8B</span>\r\n <textarea nzAutosize nz-input type=\"text\" [(ngModel)]=\"section.case\" placeholder=\"\u8BF7\u586B\u91CD\u70B9\u4E8B\u4F8B\" nzBorderless></textarea>\r\n </div>\r\n </div> -->\r\n\r\n <!-- <div class=\"content\" [innerHTML]=\"currentDraft.get('content') | nzSanitizer: 'html'\"></div> -->\r\n <!-- </div> -->\r\n </ng-container>\r\n\r\n </mat-accordion>\r\n\r\n </div>\r\n </div>\r\n </nz-content>\r\n </nz-layout>\r\n</nz-layout>\r\n\r\n\r\n\r\n\r\n", styles: ["@media (max-width: 1024px){:host{--mat-expansion-container-background-color:#ded9c4}.draft-area{position:fixed;height:90vh;width:90vw!important;display:flex;top:5vh;left:5vw;z-index:100}.is-hidden{display:none}nz-sider{padding:0}nz-sider,.list,nz-layout{background:var(--dark-page-background)!important}.title{height:auto!important}.title .text{flex-direction:column;align-items:flex-start}.title .text span{font-size:14px!important}}.section-tips{border-left:solid 2px rgba(0,0,0,.5);padding-left:7px}mat-card-header{flex-direction:column}nz-sider{background:var(--background-gray)}nz-sider mat-button-toggle-group{display:flex;width:100%}nz-sider mat-button-toggle-group mat-button-toggle{flex:50%}nz-sider .list{overflow-y:auto;background:#fff;border-radius:5px;height:100%;padding:7px}nz-sider .list button{width:100%;margin-bottom:5px}.preview{width:100%;height:100%;padding:5px;display:flex;flex-direction:column}.preview .title{display:flex;justify-content:space-between;align-items:center;width:100%;height:48px;font-size:24px;font-weight:700}.preview .title .text{display:flex;justify-content:center}.preview .section-area{width:100%;flex:1;overflow-y:auto;display:flex;flex-wrap:wrap}.preview .section-area .row{width:100%;display:flex}.preview .section-area .row .title{width:50px}.preview .section-area .row .content{flex:1}.preview .section-area .section{width:100%;display:flex;flex-direction:row}.preview .section-area .section .content{flex:1;overflow-y:auto;min-height:20px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i3.IonNote, selector: "ion-note", inputs: ["color", "mode"] }, { kind: "ngmodule", type:
205
- //
206
- NzLayoutModule }, { kind: "component", type: i4.NzLayoutComponent, selector: "nz-layout", exportAs: ["nzLayout"] }, { kind: "component", type: i4.NzContentComponent, selector: "nz-content", exportAs: ["nzContent"] }, { kind: "component", type: i4.NzSiderComponent, selector: "nz-sider", inputs: ["nzWidth", "nzTheme", "nzCollapsedWidth", "nzBreakpoint", "nzZeroTrigger", "nzTrigger", "nzReverseArrow", "nzCollapsible", "nzCollapsed"], outputs: ["nzCollapsedChange"], exportAs: ["nzSider"] }, { kind: "ngmodule", type: NzPipesModule }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i5.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "ngmodule", type:
207
- //
208
- MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i7.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i7.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i7.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type:
209
- //
210
- UtilnowPipe, name: "utilnow" }, { kind: "ngmodule", type: MarkdownPreviewModule }, { kind: "component", type: i9.MarkdownPreviewComponent, selector: "fm-markdown-preview", inputs: ["content", "render"] }, { kind: "pipe", type: OutlineCountPipe, name: "outlineCount" }] }); }
211
- }
212
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FmArticleDraftComponent, decorators: [{
213
- type: Component,
214
- args: [{ selector: 'fm-article-draft', standalone: true, imports: [
215
- CommonModule, FormsModule, ReactiveFormsModule,
216
- IonicModule,
217
- //
218
- NzLayoutModule,
219
- NzPipesModule,
220
- NzIconModule,
221
- NzInputModule,
222
- //
223
- MatButtonModule, MatExpansionModule, MatIconModule, MatProgressBarModule,
224
- //
225
- UtilnowPipe,
226
- MarkdownPreviewModule,
227
- OutlineCountPipe,
228
- FmArticleOutlineLeftitemComponent,
229
- ], template: "\r\n\r\n\r\n<nz-layout style=\"height:100%;\">\r\n <nz-sider [nzWidth]=\"isSelectMode?290:350\">\r\n\r\n <div class=\"list\">\r\n <!-- \u6DFB\u52A0\u8349\u7A3F -->\r\n <!-- <button mat-flat-button color=\"primary\" *ngIf=\"!isSelectMode\">\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\"></span> \u65B0\u7684\u8349\u7A3F\r\n </button> -->\r\n <!-- \u8349\u7A3F\u5361\u7247 -->\r\n \r\n <ion-list [inset]=\"true\">\r\n\r\n <ion-item [button]=\"true\">\r\n <ion-icon color=\"tertiary\" slot=\"start\" name=\"hardware-chip-outline\" size=\"large\"></ion-icon>\r\n <ion-label>AI\u521B\u4F5C\u7A3F\u4EF6</ion-label>\r\n <ion-note slot=\"end\">{{draftServ.DraftCountMap?.[article?.id||'']?.aiCount}}</ion-note>\r\n </ion-item>\r\n\r\n <ion-item [button]=\"true\">\r\n <ion-icon color=\"warning\" slot=\"start\" name=\"receipt-outline\" size=\"large\"></ion-icon>\r\n <ion-label>\u5386 \u53F2 \u7A3F \u4EF6</ion-label>\r\n <ion-note slot=\"end\">{{draftServ.DraftCountMap?.[article?.id||'']?.draftCount}}</ion-note>\r\n </ion-item>\r\n </ion-list>\r\n\r\n <ion-list [inset]=\"true\" *ngIf=\"article?.id\">\r\n\r\n <!-- \u8349\u7A3F\u6587\u7AE0\u5361\u7247 -->\r\n <ng-container *ngFor=\"let draft of (draftServ.DraftListMap?.[article?.id||'']||[])\">\r\n <ion-item (click)=\"previewDraft(draft)\" [button]=\"true\" detail=\"false\">\r\n <div class=\"unread-indicator-wrapper\" slot=\"start\">\r\n <div class=\"unread-indicator\"></div>\r\n </div>\r\n <ion-label>\r\n <!-- \u6807\u9898 -->\r\n <strong>{{draft?.get(\"title\")}}</strong>\r\n <!-- <ion-text>Never Gonna Give You Up</ion-text> -->\r\n <!-- \u5173\u952E\u5B57 -->\r\n <br />\r\n <ion-note color=\"medium\" class=\"ion-text-wrap\">\r\n <span *ngFor=\"let key of draft?.get('keywords')\" style=\"margin-right:3px;\">{{key}}</span>\r\n </ion-note>\r\n <!-- \u6240\u7528\u6A21\u578B -->\r\n <ng-container *ngIf=\"draft?.get('model')\">\r\n <br />\r\n <ion-note color=\"medium\">#{{draft?.get('model')}} <span>\u7EA6{{draft?.get(\"contentArray\") | outlineCount}}\u5B57</span></ion-note>\r\n </ng-container>\r\n <!-- \u751F\u6210\u65F6\u95F4 -->\r\n <br />\r\n <ion-note color=\"medium\" *ngIf=\"draft?.id\">{{draft.updatedAt | utilnow}}</ion-note>\r\n <ion-note color=\"medium\" *ngIf=\"!draft?.id\">--</ion-note>\r\n </ion-label>\r\n <div class=\"metadata-end-wrapper\" slot=\"end\">\r\n <ion-icon color=\"medium\" name=\"chevron-forward\"></ion-icon>\r\n </div>\r\n </ion-item>\r\n\r\n <button (click)=\"stopCreatingAll()\" *ngIf=\"!draft?.id&&isCreating&&create$\" mat-flat-button color=\"warn\">\r\n <span nz-icon [nzType]=\"'sync'\" [nzSpin]=\"true\"></span>\r\n \u505C\u6B62\u751F\u6210\r\n </button>\r\n </ng-container>\r\n\r\n </ion-list>\r\n\r\n </div>\r\n\r\n </nz-sider>\r\n\r\n <!-- PC\u7AEF\uFF1A\u8349\u7A3F\u663E\u793A\u533A\u57DF -->\r\n <nz-layout class=\"draft-area\" [class.is-hidden]=\"!currentDraft\">\r\n <nz-content style=\"height:100%;\">\r\n <!-- <fm-story-loader *ngIf=\"currentStory?.story\" [isSelectMode]=\"isSelectMode\" [story]=\"currentStory\"></fm-story-loader> -->\r\n <div class=\"preview\" *ngIf=\"currentDraft\">\r\n <div class=\"title\">\r\n <div class=\"text\">\r\n <span style=\"font-weight: bold;\" (click)=\"getAcc()\">{{currentDraft?.get('title')}}@if(currentDraft?.get('contentArray')?.length){&nbsp;\u7EA6{{currentDraft?.get(\"contentArray\") | outlineCount}}\u5B57}</span>\r\n <!-- <span style=\"font-size:16px;\" *ngIf=\"currentDraft?.get('contentArray')?.length\">\u7EA6{{currentDraft?.get(\"contentArray\") | outlineCount}}\u5B57</span> -->\r\n </div>\r\n <button mat-raised-button (click)=\"currentDraft=undefined\">\u53D6\u6D88</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"confirmDraft()\">\u9009\u62E9</button>\r\n </div>\r\n\r\n <div class=\"section-area\">\r\n\r\n <mat-accordion #expandComp class=\"example-headers-align\" multi>\r\n\r\n <ng-container *ngFor=\"let section of (currentDraft?.get('outlineJson')?.sections || []);let index=index\">\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title style=\"min-width: 120px;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;\">\r\n {{index}}.{{section?.title}}\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n @if(isCompleteMap[index]){\r\n <span style=\"min-width: 50px;\">\u5DF2\u5B8C\u6210</span>\r\n }@else{\r\n <span style=\"min-width: 50px;\">\u751F\u6210\u4E2D</span>\r\n }\r\n <mat-progress-bar [mode]=\"isCompleteMap[index]?'determinate':'indeterminate'\" value=\"100\"></mat-progress-bar>\r\n <!-- <mat-icon>account_circle</mat-icon> -->\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n \r\n <div class=\"row section-tips\" *ngIf=\"section?.outline\">\r\n <!-- <div class=\"name\"></div> -->\r\n <div class=\"content\"><span style=\"font-weight: bold;\">\u4E3B\u8981\u5185\u5BB9:&nbsp;</span>{{section?.outline}}</div>\r\n </div>\r\n <div class=\"row section-tips\" *ngIf=\"section?.skill\">\r\n <!-- <div class=\"name\"></div> -->\r\n <div class=\"content\"><span style=\"font-weight: bold;\">\u5199\u4F5C\u6280\u5DE7:&nbsp;</span>{{section?.skill}}</div>\r\n </div>\r\n <div class=\"row section-tips\" *ngIf=\"section?.case\">\r\n <!-- <div class=\"name\"></div> -->\r\n <div class=\"content\"><span style=\"font-weight: bold;\">\u91CD\u70B9\u4E8B\u4F8B:&nbsp;</span>{{section?.case}}</div>\r\n </div>\r\n\r\n <!-- \u751F\u6210\u4E2D/\u5DF2\u751F\u6210 -->\r\n <fm-markdown-preview class=\"content\" *ngIf=\"isCreatingMap[index]&&contentArray?.[index]\" [content]=\"contentArray?.[index]?.content\" [render]=\"false\"></fm-markdown-preview>\r\n <fm-markdown-preview class=\"content\" *ngIf=\"!isCreatingMap[index]&&contentArray?.[index]\" [content]=\"contentArray?.[index]?.content\"></fm-markdown-preview>\r\n </mat-expansion-panel>\r\n <!-- <div class=\"section\" *ngFor=\"let section of (currentDraft?.get('outlineJson')?.sections || []);let index=index\"> -->\r\n\r\n <!-- <div class=\"outline\">\r\n <div class=\"row divide section-title\" *ngIf=\"section?.title\">\r\n <span>\u7AE0{{index+1}}.</span>\r\n <input nz-input type=\"text\" [(ngModel)]=\"section.title\" placeholder=\"\u8BF7\u586B\u7AE0\u8282\u6807\u9898\" nzBorderless />\r\n </div>\r\n <div class=\"row\" *ngIf=\"section?.outline\">\r\n <span>\u5185\u5BB9</span>\r\n <textarea nzAutosize nz-input type=\"text\" [(ngModel)]=\"section.outline\" placeholder=\"\u8BF7\u586B\u4E3B\u8981\u5185\u5BB9\" nzBorderless></textarea>\r\n </div>\r\n <div class=\"row\" *ngIf=\"section?.skill\">\r\n <span>\u6280\u5DE7</span>\r\n <textarea nzAutosize nz-input type=\"text\" [(ngModel)]=\"section.skill\" placeholder=\"\u8BF7\u586B\u5199\u4F5C\u6280\u5DE7\" nzBorderless></textarea>\r\n </div>\r\n <div class=\"row\" *ngIf=\"section?.case\">\r\n <span>\u4E8B\u4F8B</span>\r\n <textarea nzAutosize nz-input type=\"text\" [(ngModel)]=\"section.case\" placeholder=\"\u8BF7\u586B\u91CD\u70B9\u4E8B\u4F8B\" nzBorderless></textarea>\r\n </div>\r\n </div> -->\r\n\r\n <!-- <div class=\"content\" [innerHTML]=\"currentDraft.get('content') | nzSanitizer: 'html'\"></div> -->\r\n <!-- </div> -->\r\n </ng-container>\r\n\r\n </mat-accordion>\r\n\r\n </div>\r\n </div>\r\n </nz-content>\r\n </nz-layout>\r\n</nz-layout>\r\n\r\n\r\n\r\n\r\n", styles: ["@media (max-width: 1024px){:host{--mat-expansion-container-background-color:#ded9c4}.draft-area{position:fixed;height:90vh;width:90vw!important;display:flex;top:5vh;left:5vw;z-index:100}.is-hidden{display:none}nz-sider{padding:0}nz-sider,.list,nz-layout{background:var(--dark-page-background)!important}.title{height:auto!important}.title .text{flex-direction:column;align-items:flex-start}.title .text span{font-size:14px!important}}.section-tips{border-left:solid 2px rgba(0,0,0,.5);padding-left:7px}mat-card-header{flex-direction:column}nz-sider{background:var(--background-gray)}nz-sider mat-button-toggle-group{display:flex;width:100%}nz-sider mat-button-toggle-group mat-button-toggle{flex:50%}nz-sider .list{overflow-y:auto;background:#fff;border-radius:5px;height:100%;padding:7px}nz-sider .list button{width:100%;margin-bottom:5px}.preview{width:100%;height:100%;padding:5px;display:flex;flex-direction:column}.preview .title{display:flex;justify-content:space-between;align-items:center;width:100%;height:48px;font-size:24px;font-weight:700}.preview .title .text{display:flex;justify-content:center}.preview .section-area{width:100%;flex:1;overflow-y:auto;display:flex;flex-wrap:wrap}.preview .section-area .row{width:100%;display:flex}.preview .section-area .row .title{width:50px}.preview .section-area .row .content{flex:1}.preview .section-area .section{width:100%;display:flex;flex-direction:row}.preview .section-area .section .content{flex:1;overflow-y:auto;min-height:20px}\n"] }]
230
- }], ctorParameters: () => [{ type: i1.DraftService }, { type: i0.ChangeDetectorRef }], propDecorators: { expandComp: [{
231
- type: ViewChild,
232
- args: [MatAccordion]
233
- }], article: [{
234
- type: Input
235
- }], onDraftConfirm: [{
236
- type: Output
237
- }] } });
238
- export class DialogArticleDraft {
239
- constructor(
240
- // 关联选择弹窗相关服务
241
- dialogRef, data) {
242
- this.dialogRef = dialogRef;
243
- this.data = data;
244
- this.isSelectMode = true;
245
- this.selectCount = 0;
246
- this.writingOptions = {};
247
- this.createNewDraft = false;
248
- this.article = data?.article;
249
- this.person = data?.person;
250
- this.book = data?.book;
251
- this.outlineJson = data?.outlineJson;
252
- this.documentList = data?.documentList;
253
- this.docList = data?.docList;
254
- this.writingOptions = data?.writingOptions;
255
- this.createNewDraft = data?.createNewDraft || false;
256
- }
257
- ngOnInit() {
258
- if (this.createNewDraft) {
259
- setTimeout(() => {
260
- if (this.draftComp) {
261
- this.draftComp.article = this.article;
262
- this.draftComp?.createNewDraft(this.outlineJson, this.writingOptions, this.person, this.docList, this.documentList);
263
- }
264
- }, 200);
265
- }
266
- }
267
- onConfirm() {
268
- this.dialogRef.close({
269
- draft: this.draftComp?.currentDraft,
270
- contentArray: this.draftComp?.contentArray
271
- });
272
- }
273
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogArticleDraft, deps: [{ token: i10.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
274
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DialogArticleDraft, isStandalone: true, selector: "article-draft-dialog", viewQueries: [{ propertyName: "draftComp", first: true, predicate: FmArticleDraftComponent, descendants: true }], ngImport: i0, template: `
275
- <fm-article-draft [article]="article" (onDraftConfirm)="onConfirm()"></fm-article-draft>
276
- <mat-dialog-actions align="start">
277
- <button mat-button color="primary" [mat-dialog-close]="true">取消</button>
278
- <button mat-raised-button color="primary" [mat-dialog-close]="true" cdkFocusInitial>完成</button>
279
- </mat-dialog-actions>
280
- `, isInline: true, styles: ["fm-article-draft{height:calc(100% - 60px);width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i10.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i10.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: FmArticleDraftComponent, selector: "fm-article-draft", inputs: ["article"], outputs: ["onDraftConfirm"] }] }); }
281
- }
282
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogArticleDraft, decorators: [{
283
- type: Component,
284
- args: [{ selector: 'article-draft-dialog', template: `
285
- <fm-article-draft [article]="article" (onDraftConfirm)="onConfirm()"></fm-article-draft>
286
- <mat-dialog-actions align="start">
287
- <button mat-button color="primary" [mat-dialog-close]="true">取消</button>
288
- <button mat-raised-button color="primary" [mat-dialog-close]="true" cdkFocusInitial>完成</button>
289
- </mat-dialog-actions>
290
- `, standalone: true, imports: [
291
- CommonModule,
292
- MatDialogModule, MatButtonModule,
293
- //
294
- FmArticleDraftComponent
295
- ], styles: ["fm-article-draft{height:calc(100% - 60px);width:100%}\n"] }]
296
- }], ctorParameters: () => [{ type: i10.MatDialogRef }, { type: undefined, decorators: [{
297
- type: Inject,
298
- args: [MAT_DIALOG_DATA]
299
- }] }], propDecorators: { draftComp: [{
300
- type: ViewChild,
301
- args: [FmArticleDraftComponent]
302
- }] } });
303
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm0tYXJ0aWNsZS1kcmFmdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL3RleHQvZm0tYXJ0aWNsZS1lZGl0b3IvZm0tYXJ0aWNsZS1kcmFmdC9mbS1hcnRpY2xlLWRyYWZ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvdGV4dC9mbS1hcnRpY2xlLWVkaXRvci9mbS1hcnRpY2xlLWRyYWZ0L2ZtLWFydGljbGUtZHJhZnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFFbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BE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TUFBTTsyQkFBQyxlQUFlO3lDQWpCVyxTQUFTO3NCQUE1QyxTQUFTO3VCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nTW9kdWxlLCBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IERyYWZ0U2VydmljZSB9IGZyb20gJy4uL2RyYWZ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOekxheW91dE1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvbGF5b3V0JztcclxuXHJcbmltcG9ydCBQYXJzZSBmcm9tIFwicGFyc2VcIjtcclxuaW1wb3J0IHsgSW9uaWNNb2R1bGUgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XHJcbmltcG9ydCB7IFV0aWxub3dQaXBlIH0gZnJvbSAnLi4vLi4vLi4vYWlnYy9zZXJ2aWNlLWZtYWkvc2VydmljZS1jaGF0L3V0aWxub3cucGlwZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOelBpcGVzTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9waXBlcyc7XHJcbmltcG9ydCB7IE56SWNvbk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaWNvbic7XHJcbmltcG9ydCB7IE1hcmtkb3duUHJldmlld01vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2FpZ2MnO1xyXG5pbXBvcnQgeyBNYXJrZG93blBhcnNlIH0gZnJvbSAnLi4vLi4vLi4vYWlnYyc7XHJcbmltcG9ydCB7IE56SW5wdXRNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2lucHV0JztcclxuaW1wb3J0IHsgT3V0bGluZUNvdW50UGlwZSB9IGZyb20gJy4uL291dGxpbmUtY291bnQucGlwZSc7XHJcbmltcG9ydCB7IEZtQXJ0aWNsZU91dGxpbmVMZWZ0aXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2ZtLWFydGljbGUtb3V0bGluZS1sZWZ0aXRlbS9mbS1hcnRpY2xlLW91dGxpbmUtbGVmdGl0ZW0uY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xyXG5pbXBvcnQgeyBoYXJkd2FyZUNoaXBPdXRsaW5lLHJlY2VpcHRPdXRsaW5lLGNoZXZyb25Gb3J3YXJkIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xyXG5pbXBvcnQgeyBNYXRBY2NvcmRpb24sIE1hdEV4cGFuc2lvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xyXG5hZGRJY29ucyh7aGFyZHdhcmVDaGlwT3V0bGluZSxyZWNlaXB0T3V0bGluZSxjaGV2cm9uRm9yd2FyZH0pXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ZtLWFydGljbGUtZHJhZnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mbS1hcnRpY2xlLWRyYWZ0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9mbS1hcnRpY2xlLWRyYWZ0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgSW9uaWNNb2R1bGUsXHJcbiAgICAvLyBcclxuICAgIE56TGF5b3V0TW9kdWxlLFxyXG4gICAgTnpQaXBlc01vZHVsZSxcclxuICAgIE56SWNvbk1vZHVsZSxcclxuICAgIE56SW5wdXRNb2R1bGUsXHJcbiAgICAvLyBcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxNYXRFeHBhbnNpb25Nb2R1bGUsTWF0SWNvbk1vZHVsZSxNYXRQcm9ncmVzc0Jhck1vZHVsZSxcclxuICAgIC8vIFxyXG4gICAgVXRpbG5vd1BpcGUsXHJcbiAgICBNYXJrZG93blByZXZpZXdNb2R1bGUsXHJcbiAgICBPdXRsaW5lQ291bnRQaXBlLFxyXG4gICAgRm1BcnRpY2xlT3V0bGluZUxlZnRpdGVtQ29tcG9uZW50LFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZtQXJ0aWNsZURyYWZ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKE1hdEFjY29yZGlvbikgZXhwYW5kQ29tcDpNYXRBY2NvcmRpb258dW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGFydGljbGU6IFBhcnNlLk9iamVjdCB8IHVuZGVmaW5lZFxyXG4gIHNlbGVjdEFydGljbGVEcmFmdDogUGFyc2UuT2JqZWN0IHwgdW5kZWZpbmVkXHJcblxyXG4gIGlzU2VsZWN0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBkcmFmdFNlcnY6IERyYWZ0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2RSZWY/OkNoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgIFxyXG4gICkge1xyXG5cclxuICB9XHJcblxyXG4gIGdldEFjYygpe1xyXG4gICAgY29uc29sZS5sb2codGhpcy5leHBhbmRDb21wKTtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMjA7IGluZGV4KyspIHtcclxuICAgICAgdGhpcy5pc0NvbXBsZXRlTWFwW2luZGV4XSA9IHRydWVcclxuICAgIH1cclxuICAgIHRoaXMuZXhwYW5kQ29tcD8ub3BlbkFsbCgpXHJcbiAgICBpZiAodGhpcy5hcnRpY2xlPy5pZCkge1xyXG4gICAgICB0aGlzLmRyYWZ0U2Vydj8ubG9hZEFydGljbGVEcmFmdCh0aGlzLmFydGljbGUpO1xyXG4gICAgfVxyXG4gIH1cclxuICBAT3V0cHV0KCkgb25EcmFmdENvbmZpcm06IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KClcclxuICBjb25maXJtRHJhZnQoKSB7XHJcbiAgICBsZXQgbWRwYXJzZXIgPSBuZXcgTWFya2Rvd25QYXJzZSgpXHJcbiAgICBsZXQgY29udGVudEFycmF5ID0gdGhpcy5jb250ZW50QXJyYXk/Lm1hcChpdGVtPT57XHJcbiAgICAgIGl0ZW0udHlwZSA9ICdyaWNodGV4dCdcclxuICAgICAgLy8gY29uc29sZS5sb2coaXRlbT8uY29udGVudClcclxuICAgICAgaXRlbS5jb250ZW50ID0gbWRwYXJzZXIucGFyc2VUb0hUTUwoaXRlbS5jb250ZW50KVxyXG4gICAgICAvLyBjb25zb2xlLmxvZyhpdGVtPy5jb250ZW50KVxyXG4gICAgICByZXR1cm4gaXRlbVxyXG4gICAgfSlcclxuICAgIC8vIGNvbnNvbGUubG9nKGNvbnRlbnRBcnJheSlcclxuICAgIHRoaXMub25EcmFmdENvbmZpcm0uZW1pdChjb250ZW50QXJyYXkpXHJcbiAgfVxyXG4gIHByZXZpZXdEcmFmdChkcmFmdDogUGFyc2UuT2JqZWN0KSB7XHJcbiAgICAvLyBpZihkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoPjkwMCl7XHJcbiAgICAgIC8vIFBD56uv5bGV56S66I2J56i/XHJcbiAgICAgIHRoaXMuY3VycmVudERyYWZ0ID0gdW5kZWZpbmVkXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3VycmVudERyYWZ0ID0gZHJhZnQ7XHJcbiAgICAgICAgdGhpcy5jb250ZW50QXJyYXkgPSBkcmFmdD8uZ2V0KFwiY29udGVudEFycmF5XCIpXHJcbiAgICAgIH0sIDEwMCk7XHJcbiAgICAvLyB9ZWxzZXtcclxuICAgIC8vICAgLy8g56e75Yqo56uv5bGV56S66I2J56i/XHJcblxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgY3VycmVudERyYWZ0OiBQYXJzZS5PYmplY3QgfCB1bmRlZmluZWRcclxuICBjdXJyZW50SFRNTDogc3RyaW5nID0gYGBcclxuICBBcnRpY2xlRHJhZnQgPSBQYXJzZS5PYmplY3QuZXh0ZW5kKFwiQXJ0aWNsZURyYWZ0XCIpXHJcblxyXG4gIGlzQ3JlYXRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZVxyXG4gIGlzQ3JlYXRpbmdNYXA6e1tpbmRleDpudW1iZXJdOmJvb2xlYW59ID0ge31cclxuICBpc0NvbXBsZXRlTWFwOntbaW5kZXg6bnVtYmVyXTpib29sZWFufSA9IHt9XHJcbiAgY3JlYXRlJDogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkXHJcbiAgY3JlYXRlJE1hcDp7W2luZGV4Om51bWJlcl06U3Vic2NyaXB0aW9ufSA9IHt9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZU5ld0RyYWZ0KG91dGxpbmVKc29uOiBhbnksIHdyaXRpbmdPcHRpb25zOiBhbnkscGVyc29uPzpQYXJzZS5PYmplY3QsIGRvY0xpc3Q/OiBBcnJheTxhbnk+LCBkb2N1bWVudExpc3Q/OiBBcnJheTxhbnk+KSB7XHJcblxyXG4gICAgdGhpcy5pc0NvbXBsZXRlTWFwID0ge31cclxuICAgIHRoaXMuZXhwYW5kQ29tcD8uY2xvc2VBbGwoKVxyXG4gICAgXHJcbiAgICAvLyBjb25zb2xlLmxvZyhcImNyZWF0ZU5ld0RyYWZ0XCIpXHJcbiAgICAvLyDmoLnmja7lvZPliY3mlofnq6Dlj4LmlbDvvIznlJ/miJDojYnnqL9cclxuICAgIGxldCBkcmFmdDogUGFyc2UuT2JqZWN0ID0gbmV3IHRoaXMuQXJ0aWNsZURyYWZ0KCk7XHJcbiAgICBkcmFmdC5zZXQoe1xyXG4gICAgICB0eXBlOiBcImFpXCIsXHJcbiAgICAgIHRpdGxlOiBvdXRsaW5lSnNvbj8udGl0bGUgfHwgdGhpcy5hcnRpY2xlPy5nZXQoXCJ0aXRsZVwiKSxcclxuICAgICAgZGVzYzogb3V0bGluZUpzb24/LmRlc2MgfHwgdGhpcy5hcnRpY2xlPy5nZXQoXCJkZXNjXCIpLFxyXG4gICAgICBrZXl3b3Jkczogb3V0bGluZUpzb24/LmtleXdvcmRzIHx8IHRoaXMuYXJ0aWNsZT8uZ2V0KFwia2V5d29yZHNcIiksXHJcbiAgICAgIGFydGljbGU6IHRoaXMuYXJ0aWNsZT8udG9Qb2ludGVyKCksXHJcbiAgICAgIGRvY0xpc3Q6IGRvY0xpc3QsXHJcbiAgICAgIGNvbnRlbnQ6IGBgLFxyXG4gICAgICBvdXRsaW5lSnNvbjpvdXRsaW5lSnNvbixcclxuICAgICAgY29udGVudEFycmF5OltdLFxyXG4gICAgICBhdXRob3I6UGFyc2UuVXNlci5jdXJyZW50KCk/LnRvUG9pbnRlcigpLFxyXG4gICAgfSlcclxuXHJcbiAgICAvLyDorr7nva7ojYnnqL/kuLrlvZPliY3pooTop4hcclxuICAgIGlmICh0aGlzLmFydGljbGUpIHtcclxuICAgICAgaWYgKCF0aGlzLmRyYWZ0U2Vydi5EcmFmdExpc3RNYXBbdGhpcy5hcnRpY2xlLmlkXSkgdGhpcy5kcmFmdFNlcnYuRHJhZnRMaXN0TWFwW3RoaXMuYXJ0aWNsZS5pZF0gPSBbXVxyXG4gICAgICB0aGlzLmRyYWZ0U2Vydi5EcmFmdExpc3RNYXBbdGhpcy5hcnRpY2xlLmlkXS51bnNoaWZ0KGRyYWZ0KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5jdXJyZW50RHJhZnQgPSBkcmFmdDtcclxuICAgIHRoaXMuY3JlYXRlQWxsU2VjdGlvbnMoZG9jdW1lbnRMaXN0LHdyaXRpbmdPcHRpb25zLHBlcnNvbik7XHJcbiAgfVxyXG4gIGNvbnRlbnRBcnJheTphbnkgPSBbXVxyXG4gIGFzeW5jIGNyZWF0ZUFsbFNlY3Rpb25zKGRvY3VtZW50TGlzdDphbnksd3JpdGluZ09wdGlvbnM6YW55LHBlcnNvbj86UGFyc2UuT2JqZWN0KXtcclxuICAgIGxldCB0aGF0ID0gdGhpc1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJjcmVhdGVBbGxTZWN0aW9uc1wiKVxyXG4gICAgdGhpcy5pc0NyZWF0aW5nID0gdHJ1ZTtcclxuICAgIGlmKHRoaXMuY3VycmVudERyYWZ0KXtcclxuICAgICAgLy8g5omn6KGM5Yib5L2c55Sf5oiQ5YaF5a65XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuY3VycmVudERyYWZ0LHRoaXMuY29udGVudEFycmF5KVxyXG4gICAgICBsZXQgc2VjdGlvbnMgPSB0aGlzLmN1cnJlbnREcmFmdD8uZ2V0KCdvdXRsaW5lSnNvbicpPy5zZWN0aW9ucyB8fCBbXVxyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2VjdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgdGhpcy5pc0NyZWF0aW5nTWFwW2luZGV4XSA9IHRydWVcclxuICAgICAgICBsZXQgQ3JlYXRlT3JkZXJTZXR0aW5nOnN0cmluZyA9IFwi6YCQ5LiqXCJcclxuICAgICAgICBcclxuICAgICAgICBpZihDcmVhdGVPcmRlclNldHRpbmc9PVwi6YCQ5LiqXCIpe1xyXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpPT57XHJcbiAgICAgICAgICAgIC8vIHRoaXMuaXNDcmVhdGluZyA9IHRydWU7IC8vIOmAkOS4queUn+aIkO+8jOavj+asoeS/neWtmOWQjumDvemcgOimgemHjee9rm1hcmtkb3duLXByZXZpZXdcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlJE1hcFtpbmRleF0gPSBhd2FpdCB0aGlzLmRyYWZ0U2Vydj8ubmV3U2VjdGlvbkNyZWF0ZShcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwZXJzb246cGVyc29uLFxyXG4gICAgICAgICAgICAgICAgd3JpdGluZ09wdGlvbnM6d3JpdGluZ09wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50QXJyYXk6dGhpcy5jb250ZW50QXJyYXksXHJcbiAgICAgICAgICAgICAgICBvdXRsaW5lSnNvbjp0aGlzLmN1cnJlbnREcmFmdD8uZ2V0KCdvdXRsaW5lSnNvbicpLFxyXG4gICAgICAgICAgICAgICAgZHJhZnQ6dGhpcy5jdXJyZW50RHJhZnQsIFxyXG4gICAgICAgICAgICAgICAgc2VjdGlvbkluZGV4OmluZGV4LCBcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50TGlzdDpkb2N1bWVudExpc3QsIFxyXG4gICAgICAgICAgICAgICAgYWZ0ZXJDb21wbGV0ZTooZHJhZnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAvLyDnu5PmnZ/nlJ/miJDlkI7nu63mraXpqqRcclxuICAgICAgICAgICAgICAgICAgdGhhdC5zdG9wQ3JlYXRpbmcoaW5kZXgpXHJcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2RSZWY6dGhpcy5jZFJlZlxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKENyZWF0ZU9yZGVyU2V0dGluZz09XCLlubblj5FcIil7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZSRNYXBbaW5kZXhdID0gYXdhaXQgdGhpcy5kcmFmdFNlcnY/Lm5ld1NlY3Rpb25DcmVhdGUoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHBlcnNvbjpwZXJzb24sXHJcbiAgICAgICAgICAgICAgICAgIHdyaXRpbmdPcHRpb25zOndyaXRpbmdPcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgICBjb250ZW50QXJyYXk6dGhpcy5jb250ZW50QXJyYXksXHJcbiAgICAgICAgICAgICAgICBvdXRsaW5lSnNvbjp0aGlzLmN1cnJlbnREcmFmdD8uZ2V0KCdvdXRsaW5lSnNvbicpLFxyXG4gICAgICAgICAgICAgICAgZHJhZnQ6dGhpcy5jdXJyZW50RHJhZnQsIFxyXG4gICAgICAgICAgICAgICAgICBzZWN0aW9uSW5kZXg6aW5kZXgsIFxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudExpc3Q6ZG9jdW1lbnRMaXN0LCBcclxuICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21wbGV0ZTooZHJhZnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOe7k+adn+eUn+aIkOWQjue7reatpemqpFxyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuc3RvcENyZWF0aW5nKGluZGV4KVxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBjZFJlZjp0aGlzLmNkUmVmXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgc3RvcENyZWF0aW5nQWxsKCl7XHJcbiAgICBPYmplY3QudmFsdWVzKHRoaXMuaXNDcmVhdGluZ01hcCkuZm9yRWFjaCgoc3ViOmFueSk9PntcclxuICAgICAgdHJ5e1xyXG4gICAgICAgIHN1YiYmc3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgICB9Y2F0Y2goZXJyKXt9XHJcbiAgICB9KVxyXG4gIH1cclxuICBzdG9wQ3JlYXRpbmcoaW5kZXg6bnVtYmVyKSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcInN0b3BDcmVhdGluZ1wiLGluZGV4KVxyXG4gICAgdGhpcy5pc0NyZWF0aW5nTWFwW2luZGV4XSA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0NvbXBsZXRlTWFwW2luZGV4XSA9IHRydWU7XHJcbiAgICAvLyBpZighdGhpcy5jcmVhdGUkTWFwW2luZGV4XT8uY2xvc2VkKXRoaXMuY3JlYXRlJE1hcFtpbmRleF0/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcInRydWVMZW5ndGhcIixPYmplY3QudmFsdWVzKHRoaXMuaXNDcmVhdGluZ01hcCk/LmZpbHRlcihpdGVtPT5pdGVtPT10cnVlKT8ubGVuZ3RoKVxyXG4gICAgLy8gY29uc29sZS5sb2coXCJjb250ZW50QXJyYXlcIix0aGlzLmNvbnRlbnRBcnJheSlcclxuXHJcbiAgICBpZihPYmplY3QudmFsdWVzKHRoaXMuaXNDcmVhdGluZ01hcCk/LmZpbHRlcihpdGVtPT5pdGVtPT10cnVlKT8ubGVuZ3RoPT0wKXtcclxuICAgICAgdGhpcy5pc0NyZWF0aW5nID0gZmFsc2U7XHJcbiAgICAgIGlmKHRoaXMuY29udGVudEFycmF5Py5sZW5ndGg+MCl7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RHJhZnQ/LnNldChcImNvbnRlbnRBcnJheVwiLHRoaXMuY29udGVudEFycmF5KVxyXG4gICAgICAgIHRoaXMuY3VycmVudERyYWZ0Py5zYXZlKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jaGVja0FsbENvbXBsZXRlKGluZGV4KTtcclxuICB9XHJcbiAgY2hlY2tBbGxDb21wbGV0ZShpbmRleDpudW1iZXIpe1xyXG4gICAgLy8g6L+H56iL5oqY5Y+g5o6n5Yi2XHJcbiAgICBsZXQgbGVuZ3RoID0gdGhpcy5jb250ZW50QXJyYXk/Lmxlbmd0aFxyXG5cclxuICAgIGxldCBuZXh0SW5kZXggPSBpbmRleCsxXHJcbiAgICB0aGlzLmV4cGFuZENvbXA/LmNsb3NlQWxsKCk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrQWxsQ29tcGxldGVcIik7XHJcbiAgICAvLyBjb25zb2xlLmxvZygodGhpcy5leHBhbmRDb21wIGFzIGFueSk/Ll9rZXlNYW5hZ2VyPy5faXRlbXM/Ll9yZXN1bHRzPy5bbmV4dEluZGV4XSk7XHJcbiAgICAodGhpcy5leHBhbmRDb21wIGFzIGFueSk/Ll9rZXlNYW5hZ2VyPy5faXRlbXM/Ll9yZXN1bHRzPy5bbmV4dEluZGV4XT8ucGFuZWw/Lm9wZW4oKTtcclxuXHJcbiAgICAvLyDlhajpg6jlrozmiJDliKTlrppcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgbGV0IGNvbXBsZXRlID0gdGhpcy5pc0NvbXBsZXRlTWFwW2luZGV4XTtcclxuICAgICAgaWYoIWNvbXBsZXRlKXtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuXHJcbn1cclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FydGljbGUtZHJhZnQtZGlhbG9nJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gIDxmbS1hcnRpY2xlLWRyYWZ0IFthcnRpY2xlXT1cImFydGljbGVcIiAob25EcmFmdENvbmZpcm0pPVwib25Db25maXJtKClcIj48L2ZtLWFydGljbGUtZHJhZnQ+XHJcbiAgIDxtYXQtZGlhbG9nLWFjdGlvbnMgYWxpZ249XCJzdGFydFwiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiPuWPlua2iDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFttYXQtZGlhbG9nLWNsb3NlXT1cInRydWVcIiBjZGtGb2N1c0luaXRpYWw+5a6M5oiQPC9idXR0b24+XHJcbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgYCxcclxuICBzdHlsZXM6IGBcclxuICAgZm0tYXJ0aWNsZS1kcmFmdHtcclxuICAgICAgaGVpZ2h0OmNhbGMoMTAwJSAtIDYwcHgpO1xyXG4gICAgICB3aWR0aDoxMDAlO1xyXG4gICAgfVxyXG4gICBgLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICAvLyBcclxuICAgIEZtQXJ0aWNsZURyYWZ0Q29tcG9uZW50XHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERpYWxvZ0FydGljbGVEcmFmdCB7XHJcbiAgQFZpZXdDaGlsZChGbUFydGljbGVEcmFmdENvbXBvbmVudCkgZHJhZnRDb21wOiBGbUFydGljbGVEcmFmdENvbXBvbmVudCB8IHVuZGVmaW5lZFxyXG4gIHBlcnNvbjogUGFyc2UuT2JqZWN0IHwgdW5kZWZpbmVkXHJcbiAgYm9vazogUGFyc2UuT2JqZWN0IHwgdW5kZWZpbmVkXHJcbiAgYXJ0aWNsZTogUGFyc2UuT2JqZWN0IHwgdW5kZWZpbmVkXHJcbiAgaXNTZWxlY3RNb2RlOiBib29sZWFuID0gdHJ1ZVxyXG4gIHNlbGVjdENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwXHJcblxyXG4gIG91dGxpbmVKc29uOiBhbnlcclxuICB3cml0aW5nT3B0aW9uczogYW55ID0ge31cclxuXHJcbiAgZG9jTGlzdDogQXJyYXk8YW55PiB8IHVuZGVmaW5lZDsgLy8g5paH56ug55u45YWz5oyH6ZKI5YiX6KGoXHJcbiAgZG9jdW1lbnRMaXN0OiBBcnJheTxhbnk+IHwgdW5kZWZpbmVkOyAvLyDlt7LpgInmi6nmlofmoaPliJfooahcclxuICBjcmVhdGVOZXdEcmFmdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8vIOWFs+iBlOmAieaLqeW8ueeql+ebuOWFs+acjeWKoVxyXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEZtQXJ0aWNsZURyYWZ0Q29tcG9uZW50PixcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YToge1xyXG4gICAgICBwZXJzb24/OiBQYXJzZS5PYmplY3QsXHJcbiAgICAgIGJvb2s/OiBQYXJzZS5PYmplY3QsXHJcbiAgICAgIGFydGljbGU6IFBhcnNlLk9iamVjdCxcclxuICAgICAgb3V0bGluZUpzb246IGFueSxcclxuICAgICAgd3JpdGluZ09wdGlvbnM6IEFycmF5PGFueT4sXHJcbiAgICAgIGRvY3VtZW50TGlzdD86IEFycmF5PGFueT4sXHJcbiAgICAgIGRvY0xpc3Q/OiBBcnJheTxhbnk+LFxyXG4gICAgICBjcmVhdGVOZXdEcmFmdD86IGJvb2xlYW5cclxuICAgIH0sXHJcbiAgKSB7XHJcbiAgICB0aGlzLmFydGljbGUgPSBkYXRhPy5hcnRpY2xlXHJcbiAgICB0aGlzLnBlcnNvbiA9IGRhdGE/LnBlcnNvblxyXG4gICAgdGhpcy5ib29rID0gZGF0YT8uYm9va1xyXG4gICAgdGhpcy5vdXRsaW5lSnNvbiA9IGRhdGE/Lm91dGxpbmVKc29uXHJcbiAgICB0aGlzLmRvY3VtZW50TGlzdCA9IGRhdGE/LmRvY3VtZW50TGlzdFxyXG4gICAgdGhpcy5kb2NMaXN0ID0gZGF0YT8uZG9jTGlzdFxyXG4gICAgdGhpcy53cml0aW5nT3B0aW9ucyA9IGRhdGE/LndyaXRpbmdPcHRpb25zXHJcbiAgICB0aGlzLmNyZWF0ZU5ld0RyYWZ0ID0gZGF0YT8uY3JlYXRlTmV3RHJhZnQgfHwgZmFsc2VcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gXHJcbiAgICBpZiAodGhpcy5jcmVhdGVOZXdEcmFmdCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5kcmFmdENvbXApIHtcclxuICAgICAgICAgIHRoaXMuZHJhZnRDb21wLmFydGljbGUgPSB0aGlzLmFydGljbGU7XHJcbiAgICAgICAgICB0aGlzLmRyYWZ0Q29tcD8uY3JlYXRlTmV3RHJhZnQodGhpcy5vdXRsaW5lSnNvbiwgdGhpcy53cml0aW5nT3B0aW9ucyx0aGlzLnBlcnNvbiwgdGhpcy5kb2NMaXN0LCB0aGlzLmRvY3VtZW50TGlzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAyMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Db25maXJtKCkge1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe1xyXG4gICAgICBkcmFmdDogdGhpcy5kcmFmdENvbXA/LmN1cnJlbnREcmFmdCxcclxuICAgICAgY29udGVudEFycmF5OiB0aGlzLmRyYWZ0Q29tcD8uY29udGVudEFycmF5XHJcbiAgICB9KTtcclxuICB9XHJcbn0iLCJcclxuXHJcblxyXG48bnotbGF5b3V0IHN0eWxlPVwiaGVpZ2h0OjEwMCU7XCI+XHJcbiAgPG56LXNpZGVyIFtueldpZHRoXT1cImlzU2VsZWN0TW9kZT8yOTA6MzUwXCI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImxpc3RcIj5cclxuICAgIDwhLS0g5re75Yqg6I2J56i/IC0tPlxyXG4gICAgICAgIDwhLS0gPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKm5nSWY9XCIhaXNTZWxlY3RNb2RlXCI+XHJcbiAgICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cInBsdXNcIiBuelRoZW1lPVwib3V0bGluZVwiPjwvc3Bhbj4g5paw55qE6I2J56i/XHJcbiAgICAgICAgPC9idXR0b24+IC0tPlxyXG4gICAgPCEtLSDojYnnqL/ljaHniYcgLS0+XHJcbiAgICAgICAgICBcclxuICAgICAgPGlvbi1saXN0IFtpbnNldF09XCJ0cnVlXCI+XHJcblxyXG4gICAgICAgIDxpb24taXRlbSBbYnV0dG9uXT1cInRydWVcIj5cclxuICAgICAgICAgIDxpb24taWNvbiBjb2xvcj1cInRlcnRpYXJ5XCIgc2xvdD1cInN0YXJ0XCIgbmFtZT1cImhhcmR3YXJlLWNoaXAtb3V0bGluZVwiIHNpemU9XCJsYXJnZVwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgICA8aW9uLWxhYmVsPkFJ5Yib5L2c56i/5Lu2PC9pb24tbGFiZWw+XHJcbiAgICAgICAgICA8aW9uLW5vdGUgc2xvdD1cImVuZFwiPnt7ZHJhZnRTZXJ2LkRyYWZ0Q291bnRNYXA/LlthcnRpY2xlPy5pZHx8JyddPy5haUNvdW50fX08L2lvbi1ub3RlPlxyXG4gICAgICAgIDwvaW9uLWl0ZW0+XHJcblxyXG4gICAgICAgIDxpb24taXRlbSBbYnV0dG9uXT1cInRydWVcIj5cclxuICAgICAgICAgIDxpb24taWNvbiBjb2xvcj1cIndhcm5pbmdcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwicmVjZWlwdC1vdXRsaW5lXCIgc2l6ZT1cImxhcmdlXCI+PC9pb24taWNvbj5cclxuICAgICAgICAgIDxpb24tbGFiZWw+5Y6GIOWPsiDnqL8g5Lu2PC9pb24tbGFiZWw+XHJcbiAgICAgICAgICA8aW9uLW5vdGUgc2xvdD1cImVuZFwiPnt7ZHJhZnRTZXJ2LkRyYWZ0Q291bnRNYXA/LlthcnRpY2xlPy5pZHx8JyddPy5kcmFmdENvdW50fX08L2lvbi1ub3RlPlxyXG4gICAgICAgIDwvaW9uLWl0ZW0+XHJcbiAgICAgIDwvaW9uLWxpc3Q+XHJcblxyXG4gICAgICA8aW9uLWxpc3QgW2luc2V0XT1cInRydWVcIiAqbmdJZj1cImFydGljbGU/LmlkXCI+XHJcblxyXG4gICAgICAgIDwhLS0g6I2J56i/5paH56ug5Y2h54mHIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgICpuZ0Zvcj1cImxldCBkcmFmdCBvZiAoZHJhZnRTZXJ2LkRyYWZ0TGlzdE1hcD8uW2FydGljbGU/LmlkfHwnJ118fFtdKVwiPlxyXG4gICAgICAgICAgPGlvbi1pdGVtIChjbGljayk9XCJwcmV2aWV3RHJhZnQoZHJhZnQpXCIgW2J1dHRvbl09XCJ0cnVlXCIgZGV0YWlsPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVucmVhZC1pbmRpY2F0b3Itd3JhcHBlclwiIHNsb3Q9XCJzdGFydFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1bnJlYWQtaW5kaWNhdG9yXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgIDwhLS0g5qCH6aKYIC0tPlxyXG4gICAgICAgICAgICAgIDxzdHJvbmc+e3tkcmFmdD8uZ2V0KFwidGl0bGVcIil9fTwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgIDwhLS0gPGlvbi10ZXh0Pk5ldmVyIEdvbm5hIEdpdmUgWW91IFVwPC9pb24tdGV4dD4gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSDlhbPplK7lrZcgLS0+XHJcbiAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgPGlvbi1ub3RlIGNvbG9yPVwibWVkaXVtXCIgY2xhc3M9XCJpb24tdGV4dC13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQga2V5IG9mIGRyYWZ0Py5nZXQoJ2tleXdvcmRzJylcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDozcHg7XCI+e3trZXl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2lvbi1ub3RlPlxyXG4gICAgICAgICAgICAgIDwhLS0g5omA55So5qih5Z6LIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkcmFmdD8uZ2V0KCdtb2RlbCcpXCI+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxpb24tbm90ZSBjb2xvcj1cIm1lZGl1bVwiPiN7e2RyYWZ0Py5nZXQoJ21vZGVsJyl9fSA8c3Bhbj7nuqZ7e2RyYWZ0Py5nZXQoXCJjb250ZW50QXJyYXlcIikgfCBvdXRsaW5lQ291bnR9feWtlzwvc3Bhbj48L2lvbi1ub3RlPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0g55Sf5oiQ5pe26Ze0IC0tPlxyXG4gICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgIDxpb24tbm90ZSBjb2xvcj1cIm1lZGl1bVwiICpuZ0lmPVwiZHJhZnQ/LmlkXCI+e3tkcmFmdC51cGRhdGVkQXQgfCB1dGlsbm93fX08L2lvbi1ub3RlPlxyXG4gICAgICAgICAgICAgIDxpb24tbm90ZSBjb2xvcj1cIm1lZGl1bVwiICpuZ0lmPVwiIWRyYWZ0Py5pZFwiPi0tPC9pb24tbm90ZT5cclxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRhZGF0YS1lbmQtd3JhcHBlclwiIHNsb3Q9XCJlbmRcIj5cclxuICAgICAgICAgICAgICA8aW9uLWljb24gY29sb3I9XCJtZWRpdW1cIiBuYW1lPVwiY2hldnJvbi1mb3J3YXJkXCI+PC9pb24taWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2lvbi1pdGVtPlxyXG5cclxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInN0b3BDcmVhdGluZ0FsbCgpXCIgKm5nSWY9XCIhZHJhZnQ/LmlkJiZpc0NyZWF0aW5nJiZjcmVhdGUkXCIgbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwid2FyblwiPlxyXG4gICAgICAgICAgICA8c3BhbiBuei1pY29uIFtuelR5cGVdPVwiJ3N5bmMnXCIgW256U3Bpbl09XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICDlgZzmraLnlJ/miJBcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPC9pb24tbGlzdD5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDwvbnotc2lkZXI+XHJcblxyXG4gIDwhLS0gUEPnq6/vvJrojYnnqL/mmL7npLrljLrln58gLS0+XHJcbiAgPG56LWxheW91dCBjbGFzcz1cImRyYWZ0LWFyZWFcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFjdXJyZW50RHJhZnRcIj5cclxuICAgIDxuei1jb250ZW50IHN0eWxlPVwiaGVpZ2h0OjEwMCU7XCI+XHJcbiAgICAgIDwhLS0gPGZtLXN0b3J5LWxvYWRlciAqbmdJZj1cImN1cnJlbnRTdG9yeT8uc3RvcnlcIiBbaXNTZWxlY3RNb2RlXT1cImlzU2VsZWN0TW9kZVwiIFtzdG9yeV09XCJjdXJyZW50U3RvcnlcIj48L2ZtLXN0b3J5LWxvYWRlcj4gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3XCIgKm5nSWY9XCJjdXJyZW50RHJhZnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7XCIgKGNsaWNrKT1cImdldEFjYygpXCI+e3tjdXJyZW50RHJhZnQ/LmdldCgndGl0bGUnKX19QGlmKGN1cnJlbnREcmFmdD8uZ2V0KCdjb250ZW50QXJyYXknKT8ubGVuZ3RoKXsmbmJzcDvnuqZ7e2N1cnJlbnREcmFmdD8uZ2V0KFwiY29udGVudEFycmF5XCIpIHwgb3V0bGluZUNvdW50fX3lrZd9PC9zcGFuPlxyXG4gICAgICAgICAgICA8IS0tIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7XCIgKm5nSWY9XCJjdXJyZW50RHJhZnQ/LmdldCgnY29udGVudEFycmF5Jyk/Lmxlbmd0aFwiPue6pnt7Y3VycmVudERyYWZ0Py5nZXQoXCJjb250ZW50QXJyYXlcIikgfCBvdXRsaW5lQ291bnR9feWtlzwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cImN1cnJlbnREcmFmdD11bmRlZmluZWRcIj7lj5bmtog8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNvbmZpcm1EcmFmdCgpXCI+6YCJ5oupPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWFyZWFcIj5cclxuXHJcbiAgICAgICAgICA8bWF0LWFjY29yZGlvbiAjZXhwYW5kQ29tcCBjbGFzcz1cImV4YW1wbGUtaGVhZGVycy1hbGlnblwiIG11bHRpPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiAoY3VycmVudERyYWZ0Py5nZXQoJ291dGxpbmVKc29uJyk/LnNlY3Rpb25zIHx8IFtdKTtsZXQgaW5kZXg9aW5kZXhcIj5cclxuICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZSBzdHlsZT1cIm1pbi13aWR0aDogMTIwcHg7dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7b3ZlcmZsb3c6IGhpZGRlbjt3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7aW5kZXh9fS57e3NlY3Rpb24/LnRpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtZGVzY3JpcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGlzQ29tcGxldGVNYXBbaW5kZXhdKXtcclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwibWluLXdpZHRoOiA1MHB4O1wiPuW3suWujOaIkDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB9QGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1pbi13aWR0aDogNTBweDtcIj7nlJ/miJDkuK08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIFttb2RlXT1cImlzQ29tcGxldGVNYXBbaW5kZXhdPydkZXRlcm1pbmF0ZSc6J2luZGV0ZXJtaW5hdGUnXCIgdmFsdWU9XCIxMDBcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWljb24+YWNjb3VudF9jaXJjbGU8L21hdC1pY29uPiAtLT5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtZGVzY3JpcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgc2VjdGlvbi10aXBzXCIgKm5nSWY9XCJzZWN0aW9uPy5vdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm5hbWVcIj48L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+PHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDtcIj7kuLvopoHlhoXlrrk6Jm5ic3A7PC9zcGFuPnt7c2VjdGlvbj8ub3V0bGluZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgc2VjdGlvbi10aXBzXCIgKm5nSWY9XCJzZWN0aW9uPy5za2lsbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJuYW1lXCI+PC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPjxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7XCI+5YaZ5L2c5oqA5benOiZuYnNwOzwvc3Bhbj57e3NlY3Rpb24/LnNraWxsfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBzZWN0aW9uLXRpcHNcIiAqbmdJZj1cInNlY3Rpb24/LmNhc2VcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibmFtZVwiPjwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj48c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkO1wiPumHjeeCueS6i+S+izombmJzcDs8L3NwYW4+e3tzZWN0aW9uPy5jYXNlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0g55Sf5oiQ5LitL+W3sueUn+aIkCAtLT5cclxuICAgICAgICAgICAgICAgIDxmbS1tYXJrZG93bi1wcmV2aWV3IGNsYXNzPVwiY29udGVudFwiICpuZ0lmPVwiaXNDcmVhdGluZ01hcFtpbmRleF0mJmNvbnRlbnRBcnJheT8uW2luZGV4XVwiIFtjb250ZW50XT1cImNvbnRlbnRBcnJheT8uW2luZGV4XT8uY29udGVudFwiIFtyZW5kZXJdPVwiZmFsc2VcIj48L2ZtLW1hcmtkb3duLXByZXZpZXc+XHJcbiAgICAgICAgICAgICAgICA8Zm0tbWFya2Rvd24tcHJldmlldyBjbGFzcz1cImNvbnRlbnRcIiAqbmdJZj1cIiFpc0NyZWF0aW5nTWFwW2luZGV4XSYmY29udGVudEFycmF5Py5baW5kZXhdXCIgW2NvbnRlbnRdPVwiY29udGVudEFycmF5Py5baW5kZXhdPy5jb250ZW50XCI+PC9mbS1tYXJrZG93bi1wcmV2aWV3PlxyXG4gICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCIgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgKGN1cnJlbnREcmFmdD8uZ2V0KCdvdXRsaW5lSnNvbicpPy5zZWN0aW9ucyB8fCBbXSk7bGV0IGluZGV4PWluZGV4XCI+IC0tPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBkaXZpZGUgc2VjdGlvbi10aXRsZVwiICpuZ0lmPVwic2VjdGlvbj8udGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPueroHt7aW5kZXgrMX19Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuei1pbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VjdGlvbi50aXRsZVwiIHBsYWNlaG9sZGVyPVwi6K+35aGr56ug6IqC5qCH6aKYXCIgbnpCb3JkZXJsZXNzIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJzZWN0aW9uPy5vdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj7lhoXlrrk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbnpBdXRvc2l6ZSBuei1pbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VjdGlvbi5vdXRsaW5lXCIgcGxhY2Vob2xkZXI9XCLor7floavkuLvopoHlhoXlrrlcIiBuekJvcmRlcmxlc3M+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cInNlY3Rpb24/LnNraWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj7mioDlt6c8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbnpBdXRvc2l6ZSBuei1pbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VjdGlvbi5za2lsbFwiIHBsYWNlaG9sZGVyPVwi6K+35aGr5YaZ5L2c5oqA5benXCIgbnpCb3JkZXJsZXNzPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJzZWN0aW9uPy5jYXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj7kuovkvos8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbnpBdXRvc2l6ZSBuei1pbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VjdGlvbi5jYXNlXCIgcGxhY2Vob2xkZXI9XCLor7floavph43ngrnkuovkvotcIiBuekJvcmRlcmxlc3M+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY29udGVudFwiIFtpbm5lckhUTUxdPVwiY3VycmVudERyYWZ0LmdldCgnY29udGVudCcpIHwgbnpTYW5pdGl6ZXI6ICdodG1sJ1wiPjwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICA8IS0tIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwvbWF0LWFjY29yZGlvbj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uei1jb250ZW50PlxyXG4gIDwvbnotbGF5b3V0PlxyXG48L256LWxheW91dD5cclxuXHJcblxyXG5cclxuXHJcbiJdfQ==
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs
7
+ */
8
+ import{CommonModule}from"@angular/common";import{ChangeDetectorRef,Component,EventEmitter,Inject,Input,Output,ViewChild}from"@angular/core";import{FormsModule,ReactiveFormsModule}from"@angular/forms";import{MatButtonModule}from"@angular/material/button";import{MatDialogModule,MatDialogRef,MAT_DIALOG_DATA}from"@angular/material/dialog";import{DraftService}from"../draft.service";import{NzLayoutModule}from"ng-zorro-antd/layout";import{FmodeParse,FmodeObject,FmodeUser}from"@fmode/parse";import{IonicModule}from"@ionic/angular";import{UtilnowPipe}from"../../../aigc/service-fmai/service-chat/utilnow.pipe";import{NzPipesModule}from"ng-zorro-antd/pipes";import{NzIconModule}from"ng-zorro-antd/icon";import{MarkdownPreviewModule}from"../../../aigc";import{MarkdownParse}from"../../../aigc";import{NzInputModule}from"ng-zorro-antd/input";import{OutlineCountPipe}from"../outline-count.pipe";import{FmArticleOutlineLeftitemComponent}from"../fm-article-outline-leftitem/fm-article-outline-leftitem.component";import{addIcons}from"ionicons";import{hardwareChipOutline,receiptOutline,chevronForward}from"ionicons/icons";import{MatAccordion,MatExpansionModule}from"@angular/material/expansion";import{MatIconModule}from"@angular/material/icon";import{MatProgressBarModule}from"@angular/material/progress-bar";import*as i0 from"@angular/core";import*as i1 from"../draft.service";import*as i2 from"@angular/common";import*as i3 from"@ionic/angular";import*as i4 from"ng-zorro-antd/layout";import*as i5 from"ng-zorro-antd/icon";import*as i6 from"@angular/material/button";import*as i7 from"@angular/material/expansion";import*as i8 from"@angular/material/progress-bar";import*as i9 from"../../../aigc/comp-markdown-preview/markdown-preview.component";import*as i10 from"@angular/material/dialog";const Parse=FmodeParse.with("nova");addIcons({hardwareChipOutline:hardwareChipOutline,receiptOutline:receiptOutline,chevronForward:chevronForward});export class FmArticleDraftComponent{constructor(t,n){this.draftServ=t,this.cdRef=n,this.isSelectMode=!1,this.onDraftConfirm=new EventEmitter,this.currentHTML="",this.isCreating=!1,this.isCreatingMap={},this.isCompleteMap={},this.create$Map={},this.contentArray=[]}getAcc(){console.log(this.expandComp)}ngOnInit(){for(let t=0;t<20;t++)this.isCompleteMap[t]=!0;this.expandComp?.openAll(),this.article?.id&&this.draftServ?.loadArticleDraft(this.article)}confirmDraft(){let t=new MarkdownParse,n=this.contentArray?.map((n=>(n.type="richtext",n.content=t.parseToHTML(n.content),n)));this.onDraftConfirm.emit(n)}previewDraft(t){this.currentDraft=void 0,setTimeout((()=>{this.currentDraft=t,this.contentArray=t?.get("contentArray")}),100)}async createNewDraft(t,n,e,i,o){this.isCompleteMap={},this.expandComp?.closeAll();let r=new Parse.Object("ArticleDraft");r.set({type:"ai",title:t?.title||this.article?.get("title"),desc:t?.desc||this.article?.get("desc"),keywords:t?.keywords||this.article?.get("keywords"),article:this.article?.toPointer(),docList:i,content:"",outlineJson:t,contentArray:[],author:FmodeUser.current()?.toPointer()}),this.article&&(this.draftServ.DraftListMap[this.article.id]||(this.draftServ.DraftListMap[this.article.id]=[]),this.draftServ.DraftListMap[this.article.id].unshift(r)),this.currentDraft=r,this.createAllSections(o,n,e)}async createAllSections(t,n,e){let i=this;if(this.isCreating=!0,this.currentDraft){let o=this.currentDraft?.get("outlineJson")?.sections||[];for(let r=0;r<o.length;r++){this.isCreatingMap[r]=!0;let o="逐个";"逐个"==o&&await new Promise((async o=>{this.create$Map[r]=await(this.draftServ?.newSectionCreate({person:e,writingOptions:n,contentArray:this.contentArray,outlineJson:this.currentDraft?.get("outlineJson"),draft:this.currentDraft,sectionIndex:r,documentList:t,afterComplete:t=>{i.stopCreating(r),o(!0)},cdRef:this.cdRef}))})),"并发"==o&&(this.create$Map[r]=await(this.draftServ?.newSectionCreate({person:e,writingOptions:n,contentArray:this.contentArray,outlineJson:this.currentDraft?.get("outlineJson"),draft:this.currentDraft,sectionIndex:r,documentList:t,afterComplete:t=>{i.stopCreating(r)},cdRef:this.cdRef})))}}}stopCreatingAll(){Object.values(this.isCreatingMap).forEach((t=>{try{t&&t?.unsubscribe()}catch(t){}}))}stopCreating(t){this.isCreatingMap[t]=!1,this.isCompleteMap[t]=!0,0==Object.values(this.isCreatingMap)?.filter((t=>1==t))?.length&&(this.isCreating=!1,this.contentArray?.length>0&&(this.currentDraft?.set("contentArray",this.contentArray),this.currentDraft?.save())),this.checkAllComplete(t)}checkAllComplete(t){let n=this.contentArray?.length,e=t+1;this.expandComp?.closeAll(),this.expandComp?._keyManager?._items?._results?.[e]?.panel?.open();for(let t=0;t<n;t++){if(!this.isCompleteMap[t])return!1}return!0}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmArticleDraftComponent,deps:[{token:i1.DraftService},{token:i0.ChangeDetectorRef}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmArticleDraftComponent,isStandalone:!0,selector:"fm-article-draft",inputs:{article:"article"},outputs:{onDraftConfirm:"onDraftConfirm"},viewQueries:[{propertyName:"expandComp",first:!0,predicate:MatAccordion,descendants:!0}],ngImport:i0,template:'\n\n\n<nz-layout style="height:100%;">\n <nz-sider [nzWidth]="isSelectMode?290:350">\n\n <div class="list">\n \x3c!-- 添加草稿 --\x3e\n \x3c!-- <button mat-flat-button color="primary" *ngIf="!isSelectMode">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 新的草稿\n </button> --\x3e\n \x3c!-- 草稿卡片 --\x3e\n \n <ion-list [inset]="true">\n\n <ion-item [button]="true">\n <ion-icon color="tertiary" slot="start" name="hardware-chip-outline" size="large"></ion-icon>\n <ion-label>AI创作稿件</ion-label>\n <ion-note slot="end">{{draftServ.DraftCountMap?.[article?.id||\'\']?.aiCount}}</ion-note>\n </ion-item>\n\n <ion-item [button]="true">\n <ion-icon color="warning" slot="start" name="receipt-outline" size="large"></ion-icon>\n <ion-label>历 史 稿 件</ion-label>\n <ion-note slot="end">{{draftServ.DraftCountMap?.[article?.id||\'\']?.draftCount}}</ion-note>\n </ion-item>\n </ion-list>\n\n <ion-list [inset]="true" *ngIf="article?.id">\n\n \x3c!-- 草稿文章卡片 --\x3e\n <ng-container *ngFor="let draft of (draftServ.DraftListMap?.[article?.id||\'\']||[])">\n <ion-item (click)="previewDraft(draft)" [button]="true" detail="false">\n <div class="unread-indicator-wrapper" slot="start">\n <div class="unread-indicator"></div>\n </div>\n <ion-label>\n \x3c!-- 标题 --\x3e\n <strong>{{draft?.get("title")}}</strong>\n \x3c!-- <ion-text>Never Gonna Give You Up</ion-text> --\x3e\n \x3c!-- 关键字 --\x3e\n <br />\n <ion-note color="medium" class="ion-text-wrap">\n <span *ngFor="let key of draft?.get(\'keywords\')" style="margin-right:3px;">{{key}}</span>\n </ion-note>\n \x3c!-- 所用模型 --\x3e\n <ng-container *ngIf="draft?.get(\'model\')">\n <br />\n <ion-note color="medium">#{{draft?.get(\'model\')}} <span>约{{draft?.get("contentArray") | outlineCount}}字</span></ion-note>\n </ng-container>\n \x3c!-- 生成时间 --\x3e\n <br />\n <ion-note color="medium" *ngIf="draft?.id">{{draft.updatedAt | utilnow}}</ion-note>\n <ion-note color="medium" *ngIf="!draft?.id">--</ion-note>\n </ion-label>\n <div class="metadata-end-wrapper" slot="end">\n <ion-icon color="medium" name="chevron-forward"></ion-icon>\n </div>\n </ion-item>\n\n <button (click)="stopCreatingAll()" *ngIf="!draft?.id&&isCreating&&create$" mat-flat-button color="warn">\n <span nz-icon [nzType]="\'sync\'" [nzSpin]="true"></span>\n 停止生成\n </button>\n </ng-container>\n\n </ion-list>\n\n </div>\n\n </nz-sider>\n\n \x3c!-- PC端:草稿显示区域 --\x3e\n <nz-layout class="draft-area" [class.is-hidden]="!currentDraft">\n <nz-content style="height:100%;">\n \x3c!-- <fm-story-loader *ngIf="currentStory?.story" [isSelectMode]="isSelectMode" [story]="currentStory"></fm-story-loader> --\x3e\n <div class="preview" *ngIf="currentDraft">\n <div class="title">\n <div class="text">\n <span style="font-weight: bold;" (click)="getAcc()">{{currentDraft?.get(\'title\')}}@if(currentDraft?.get(\'contentArray\')?.length){&nbsp;约{{currentDraft?.get("contentArray") | outlineCount}}字}</span>\n \x3c!-- <span style="font-size:16px;" *ngIf="currentDraft?.get(\'contentArray\')?.length">约{{currentDraft?.get("contentArray") | outlineCount}}字</span> --\x3e\n </div>\n <button mat-raised-button (click)="currentDraft=undefined">取消</button>\n <button mat-raised-button color="primary" (click)="confirmDraft()">选择</button>\n </div>\n\n <div class="section-area">\n\n <mat-accordion #expandComp class="example-headers-align" multi>\n\n <ng-container *ngFor="let section of (currentDraft?.get(\'outlineJson\')?.sections || []);let index=index">\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title style="min-width: 120px;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;">\n {{index}}.{{section?.title}}\n </mat-panel-title>\n <mat-panel-description>\n @if(isCompleteMap[index]){\n <span style="min-width: 50px;">已完成</span>\n }@else{\n <span style="min-width: 50px;">生成中</span>\n }\n <mat-progress-bar [mode]="isCompleteMap[index]?\'determinate\':\'indeterminate\'" value="100"></mat-progress-bar>\n \x3c!-- <mat-icon>account_circle</mat-icon> --\x3e\n </mat-panel-description>\n </mat-expansion-panel-header>\n \n <div class="row section-tips" *ngIf="section?.outline">\n \x3c!-- <div class="name"></div> --\x3e\n <div class="content"><span style="font-weight: bold;">主要内容:&nbsp;</span>{{section?.outline}}</div>\n </div>\n <div class="row section-tips" *ngIf="section?.skill">\n \x3c!-- <div class="name"></div> --\x3e\n <div class="content"><span style="font-weight: bold;">写作技巧:&nbsp;</span>{{section?.skill}}</div>\n </div>\n <div class="row section-tips" *ngIf="section?.case">\n \x3c!-- <div class="name"></div> --\x3e\n <div class="content"><span style="font-weight: bold;">重点事例:&nbsp;</span>{{section?.case}}</div>\n </div>\n\n \x3c!-- 生成中/已生成 --\x3e\n <fm-markdown-preview class="content" *ngIf="isCreatingMap[index]&&contentArray?.[index]" [content]="contentArray?.[index]?.content" [render]="false"></fm-markdown-preview>\n <fm-markdown-preview class="content" *ngIf="!isCreatingMap[index]&&contentArray?.[index]" [content]="contentArray?.[index]?.content"></fm-markdown-preview>\n </mat-expansion-panel>\n \x3c!-- <div class="section" *ngFor="let section of (currentDraft?.get(\'outlineJson\')?.sections || []);let index=index"> --\x3e\n\n \x3c!-- <div class="outline">\n <div class="row divide section-title" *ngIf="section?.title">\n <span>章{{index+1}}.</span>\n <input nz-input type="text" [(ngModel)]="section.title" placeholder="请填章节标题" nzBorderless />\n </div>\n <div class="row" *ngIf="section?.outline">\n <span>内容</span>\n <textarea nzAutosize nz-input type="text" [(ngModel)]="section.outline" placeholder="请填主要内容" nzBorderless></textarea>\n </div>\n <div class="row" *ngIf="section?.skill">\n <span>技巧</span>\n <textarea nzAutosize nz-input type="text" [(ngModel)]="section.skill" placeholder="请填写作技巧" nzBorderless></textarea>\n </div>\n <div class="row" *ngIf="section?.case">\n <span>事例</span>\n <textarea nzAutosize nz-input type="text" [(ngModel)]="section.case" placeholder="请填重点事例" nzBorderless></textarea>\n </div>\n </div> --\x3e\n\n \x3c!-- <div class="content" [innerHTML]="currentDraft.get(\'content\') | nzSanitizer: \'html\'"></div> --\x3e\n \x3c!-- </div> --\x3e\n </ng-container>\n\n </mat-accordion>\n\n </div>\n </div>\n </nz-content>\n </nz-layout>\n</nz-layout>\n\n\n\n\n',styles:["@media (max-width: 1024px){:host{--mat-expansion-container-background-color:#ded9c4}.draft-area{position:fixed;height:90vh;width:90vw!important;display:flex;top:5vh;left:5vw;z-index:100}.is-hidden{display:none}nz-sider{padding:0}nz-sider,.list,nz-layout{background:var(--dark-page-background)!important}.title{height:auto!important}.title .text{flex-direction:column;align-items:flex-start}.title .text span{font-size:14px!important}}.section-tips{border-left:solid 2px rgba(0,0,0,.5);padding-left:7px}mat-card-header{flex-direction:column}nz-sider{background:var(--background-gray)}nz-sider mat-button-toggle-group{display:flex;width:100%}nz-sider mat-button-toggle-group mat-button-toggle{flex:50%}nz-sider .list{overflow-y:auto;background:#fff;border-radius:5px;height:100%;padding:7px}nz-sider .list button{width:100%;margin-bottom:5px}.preview{width:100%;height:100%;padding:5px;display:flex;flex-direction:column}.preview .title{display:flex;justify-content:space-between;align-items:center;width:100%;height:48px;font-size:24px;font-weight:700}.preview .title .text{display:flex;justify-content:center}.preview .section-area{width:100%;flex:1;overflow-y:auto;display:flex;flex-wrap:wrap}.preview .section-area .row{width:100%;display:flex}.preview .section-area .row .title{width:50px}.preview .section-area .row .content{flex:1}.preview .section-area .section{width:100%;display:flex;flex-direction:row}.preview .section-area .section .content{flex:1;overflow-y:auto;min-height:20px}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i2.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:i2.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:FormsModule},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"ngmodule",type:IonicModule},{kind:"component",type:i3.IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:i3.IonItem,selector:"ion-item",inputs:["button","color","detail","detailIcon","disabled","download","href","lines","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:i3.IonLabel,selector:"ion-label",inputs:["color","mode","position"]},{kind:"component",type:i3.IonList,selector:"ion-list",inputs:["inset","lines","mode"]},{kind:"component",type:i3.IonNote,selector:"ion-note",inputs:["color","mode"]},{kind:"ngmodule",type:NzLayoutModule},{kind:"component",type:i4.NzLayoutComponent,selector:"nz-layout",exportAs:["nzLayout"]},{kind:"component",type:i4.NzContentComponent,selector:"nz-content",exportAs:["nzContent"]},{kind:"component",type:i4.NzSiderComponent,selector:"nz-sider",inputs:["nzWidth","nzTheme","nzCollapsedWidth","nzBreakpoint","nzZeroTrigger","nzTrigger","nzReverseArrow","nzCollapsible","nzCollapsed"],outputs:["nzCollapsedChange"],exportAs:["nzSider"]},{kind:"ngmodule",type:NzPipesModule},{kind:"ngmodule",type:NzIconModule},{kind:"directive",type:i5.NzIconDirective,selector:"[nz-icon]",inputs:["nzSpin","nzRotate","nzType","nzTheme","nzTwotoneColor","nzIconfont"],exportAs:["nzIcon"]},{kind:"ngmodule",type:NzInputModule},{kind:"ngmodule",type:MatButtonModule},{kind:"component",type:i6.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",exportAs:["matButton"]},{kind:"ngmodule",type:MatExpansionModule},{kind:"directive",type:i7.MatAccordion,selector:"mat-accordion",inputs:["hideToggle","displayMode","togglePosition"],exportAs:["matAccordion"]},{kind:"component",type:i7.MatExpansionPanel,selector:"mat-expansion-panel",inputs:["hideToggle","togglePosition"],outputs:["afterExpand","afterCollapse"],exportAs:["matExpansionPanel"]},{kind:"component",type:i7.MatExpansionPanelHeader,selector:"mat-expansion-panel-header",inputs:["expandedHeight","collapsedHeight","tabIndex"]},{kind:"directive",type:i7.MatExpansionPanelTitle,selector:"mat-panel-title"},{kind:"directive",type:i7.MatExpansionPanelDescription,selector:"mat-panel-description"},{kind:"ngmodule",type:MatIconModule},{kind:"ngmodule",type:MatProgressBarModule},{kind:"component",type:i8.MatProgressBar,selector:"mat-progress-bar",inputs:["color","value","bufferValue","mode"],outputs:["animationEnd"],exportAs:["matProgressBar"]},{kind:"pipe",type:UtilnowPipe,name:"utilnow"},{kind:"ngmodule",type:MarkdownPreviewModule},{kind:"component",type:i9.MarkdownPreviewComponent,selector:"fm-markdown-preview",inputs:["content","render"]},{kind:"pipe",type:OutlineCountPipe,name:"outlineCount"}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmArticleDraftComponent,decorators:[{type:Component,args:[{selector:"fm-article-draft",standalone:!0,imports:[CommonModule,FormsModule,ReactiveFormsModule,IonicModule,NzLayoutModule,NzPipesModule,NzIconModule,NzInputModule,MatButtonModule,MatExpansionModule,MatIconModule,MatProgressBarModule,UtilnowPipe,MarkdownPreviewModule,OutlineCountPipe,FmArticleOutlineLeftitemComponent],template:'\n\n\n<nz-layout style="height:100%;">\n <nz-sider [nzWidth]="isSelectMode?290:350">\n\n <div class="list">\n \x3c!-- 添加草稿 --\x3e\n \x3c!-- <button mat-flat-button color="primary" *ngIf="!isSelectMode">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 新的草稿\n </button> --\x3e\n \x3c!-- 草稿卡片 --\x3e\n \n <ion-list [inset]="true">\n\n <ion-item [button]="true">\n <ion-icon color="tertiary" slot="start" name="hardware-chip-outline" size="large"></ion-icon>\n <ion-label>AI创作稿件</ion-label>\n <ion-note slot="end">{{draftServ.DraftCountMap?.[article?.id||\'\']?.aiCount}}</ion-note>\n </ion-item>\n\n <ion-item [button]="true">\n <ion-icon color="warning" slot="start" name="receipt-outline" size="large"></ion-icon>\n <ion-label>历 史 稿 件</ion-label>\n <ion-note slot="end">{{draftServ.DraftCountMap?.[article?.id||\'\']?.draftCount}}</ion-note>\n </ion-item>\n </ion-list>\n\n <ion-list [inset]="true" *ngIf="article?.id">\n\n \x3c!-- 草稿文章卡片 --\x3e\n <ng-container *ngFor="let draft of (draftServ.DraftListMap?.[article?.id||\'\']||[])">\n <ion-item (click)="previewDraft(draft)" [button]="true" detail="false">\n <div class="unread-indicator-wrapper" slot="start">\n <div class="unread-indicator"></div>\n </div>\n <ion-label>\n \x3c!-- 标题 --\x3e\n <strong>{{draft?.get("title")}}</strong>\n \x3c!-- <ion-text>Never Gonna Give You Up</ion-text> --\x3e\n \x3c!-- 关键字 --\x3e\n <br />\n <ion-note color="medium" class="ion-text-wrap">\n <span *ngFor="let key of draft?.get(\'keywords\')" style="margin-right:3px;">{{key}}</span>\n </ion-note>\n \x3c!-- 所用模型 --\x3e\n <ng-container *ngIf="draft?.get(\'model\')">\n <br />\n <ion-note color="medium">#{{draft?.get(\'model\')}} <span>约{{draft?.get("contentArray") | outlineCount}}字</span></ion-note>\n </ng-container>\n \x3c!-- 生成时间 --\x3e\n <br />\n <ion-note color="medium" *ngIf="draft?.id">{{draft.updatedAt | utilnow}}</ion-note>\n <ion-note color="medium" *ngIf="!draft?.id">--</ion-note>\n </ion-label>\n <div class="metadata-end-wrapper" slot="end">\n <ion-icon color="medium" name="chevron-forward"></ion-icon>\n </div>\n </ion-item>\n\n <button (click)="stopCreatingAll()" *ngIf="!draft?.id&&isCreating&&create$" mat-flat-button color="warn">\n <span nz-icon [nzType]="\'sync\'" [nzSpin]="true"></span>\n 停止生成\n </button>\n </ng-container>\n\n </ion-list>\n\n </div>\n\n </nz-sider>\n\n \x3c!-- PC端:草稿显示区域 --\x3e\n <nz-layout class="draft-area" [class.is-hidden]="!currentDraft">\n <nz-content style="height:100%;">\n \x3c!-- <fm-story-loader *ngIf="currentStory?.story" [isSelectMode]="isSelectMode" [story]="currentStory"></fm-story-loader> --\x3e\n <div class="preview" *ngIf="currentDraft">\n <div class="title">\n <div class="text">\n <span style="font-weight: bold;" (click)="getAcc()">{{currentDraft?.get(\'title\')}}@if(currentDraft?.get(\'contentArray\')?.length){&nbsp;约{{currentDraft?.get("contentArray") | outlineCount}}字}</span>\n \x3c!-- <span style="font-size:16px;" *ngIf="currentDraft?.get(\'contentArray\')?.length">约{{currentDraft?.get("contentArray") | outlineCount}}字</span> --\x3e\n </div>\n <button mat-raised-button (click)="currentDraft=undefined">取消</button>\n <button mat-raised-button color="primary" (click)="confirmDraft()">选择</button>\n </div>\n\n <div class="section-area">\n\n <mat-accordion #expandComp class="example-headers-align" multi>\n\n <ng-container *ngFor="let section of (currentDraft?.get(\'outlineJson\')?.sections || []);let index=index">\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title style="min-width: 120px;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;">\n {{index}}.{{section?.title}}\n </mat-panel-title>\n <mat-panel-description>\n @if(isCompleteMap[index]){\n <span style="min-width: 50px;">已完成</span>\n }@else{\n <span style="min-width: 50px;">生成中</span>\n }\n <mat-progress-bar [mode]="isCompleteMap[index]?\'determinate\':\'indeterminate\'" value="100"></mat-progress-bar>\n \x3c!-- <mat-icon>account_circle</mat-icon> --\x3e\n </mat-panel-description>\n </mat-expansion-panel-header>\n \n <div class="row section-tips" *ngIf="section?.outline">\n \x3c!-- <div class="name"></div> --\x3e\n <div class="content"><span style="font-weight: bold;">主要内容:&nbsp;</span>{{section?.outline}}</div>\n </div>\n <div class="row section-tips" *ngIf="section?.skill">\n \x3c!-- <div class="name"></div> --\x3e\n <div class="content"><span style="font-weight: bold;">写作技巧:&nbsp;</span>{{section?.skill}}</div>\n </div>\n <div class="row section-tips" *ngIf="section?.case">\n \x3c!-- <div class="name"></div> --\x3e\n <div class="content"><span style="font-weight: bold;">重点事例:&nbsp;</span>{{section?.case}}</div>\n </div>\n\n \x3c!-- 生成中/已生成 --\x3e\n <fm-markdown-preview class="content" *ngIf="isCreatingMap[index]&&contentArray?.[index]" [content]="contentArray?.[index]?.content" [render]="false"></fm-markdown-preview>\n <fm-markdown-preview class="content" *ngIf="!isCreatingMap[index]&&contentArray?.[index]" [content]="contentArray?.[index]?.content"></fm-markdown-preview>\n </mat-expansion-panel>\n \x3c!-- <div class="section" *ngFor="let section of (currentDraft?.get(\'outlineJson\')?.sections || []);let index=index"> --\x3e\n\n \x3c!-- <div class="outline">\n <div class="row divide section-title" *ngIf="section?.title">\n <span>章{{index+1}}.</span>\n <input nz-input type="text" [(ngModel)]="section.title" placeholder="请填章节标题" nzBorderless />\n </div>\n <div class="row" *ngIf="section?.outline">\n <span>内容</span>\n <textarea nzAutosize nz-input type="text" [(ngModel)]="section.outline" placeholder="请填主要内容" nzBorderless></textarea>\n </div>\n <div class="row" *ngIf="section?.skill">\n <span>技巧</span>\n <textarea nzAutosize nz-input type="text" [(ngModel)]="section.skill" placeholder="请填写作技巧" nzBorderless></textarea>\n </div>\n <div class="row" *ngIf="section?.case">\n <span>事例</span>\n <textarea nzAutosize nz-input type="text" [(ngModel)]="section.case" placeholder="请填重点事例" nzBorderless></textarea>\n </div>\n </div> --\x3e\n\n \x3c!-- <div class="content" [innerHTML]="currentDraft.get(\'content\') | nzSanitizer: \'html\'"></div> --\x3e\n \x3c!-- </div> --\x3e\n </ng-container>\n\n </mat-accordion>\n\n </div>\n </div>\n </nz-content>\n </nz-layout>\n</nz-layout>\n\n\n\n\n',styles:["@media (max-width: 1024px){:host{--mat-expansion-container-background-color:#ded9c4}.draft-area{position:fixed;height:90vh;width:90vw!important;display:flex;top:5vh;left:5vw;z-index:100}.is-hidden{display:none}nz-sider{padding:0}nz-sider,.list,nz-layout{background:var(--dark-page-background)!important}.title{height:auto!important}.title .text{flex-direction:column;align-items:flex-start}.title .text span{font-size:14px!important}}.section-tips{border-left:solid 2px rgba(0,0,0,.5);padding-left:7px}mat-card-header{flex-direction:column}nz-sider{background:var(--background-gray)}nz-sider mat-button-toggle-group{display:flex;width:100%}nz-sider mat-button-toggle-group mat-button-toggle{flex:50%}nz-sider .list{overflow-y:auto;background:#fff;border-radius:5px;height:100%;padding:7px}nz-sider .list button{width:100%;margin-bottom:5px}.preview{width:100%;height:100%;padding:5px;display:flex;flex-direction:column}.preview .title{display:flex;justify-content:space-between;align-items:center;width:100%;height:48px;font-size:24px;font-weight:700}.preview .title .text{display:flex;justify-content:center}.preview .section-area{width:100%;flex:1;overflow-y:auto;display:flex;flex-wrap:wrap}.preview .section-area .row{width:100%;display:flex}.preview .section-area .row .title{width:50px}.preview .section-area .row .content{flex:1}.preview .section-area .section{width:100%;display:flex;flex-direction:row}.preview .section-area .section .content{flex:1;overflow-y:auto;min-height:20px}\n"]}]}],ctorParameters:()=>[{type:i1.DraftService},{type:i0.ChangeDetectorRef}],propDecorators:{expandComp:[{type:ViewChild,args:[MatAccordion]}],article:[{type:Input}],onDraftConfirm:[{type:Output}]}});export class DialogArticleDraft{constructor(t,n){this.dialogRef=t,this.data=n,this.isSelectMode=!0,this.selectCount=0,this.writingOptions={},this.createNewDraft=!1,this.article=n?.article,this.person=n?.person,this.book=n?.book,this.outlineJson=n?.outlineJson,this.documentList=n?.documentList,this.docList=n?.docList,this.writingOptions=n?.writingOptions,this.createNewDraft=n?.createNewDraft||!1}ngOnInit(){this.createNewDraft&&setTimeout((()=>{this.draftComp&&(this.draftComp.article=this.article,this.draftComp?.createNewDraft(this.outlineJson,this.writingOptions,this.person,this.docList,this.documentList))}),200)}onConfirm(){this.dialogRef.close({draft:this.draftComp?.currentDraft,contentArray:this.draftComp?.contentArray})}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:DialogArticleDraft,deps:[{token:i10.MatDialogRef},{token:MAT_DIALOG_DATA}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:DialogArticleDraft,isStandalone:!0,selector:"article-draft-dialog",viewQueries:[{propertyName:"draftComp",first:!0,predicate:FmArticleDraftComponent,descendants:!0}],ngImport:i0,template:'\n <fm-article-draft [article]="article" (onDraftConfirm)="onConfirm()"></fm-article-draft>\n <mat-dialog-actions align="start">\n <button mat-button color="primary" [mat-dialog-close]="true">取消</button>\n <button mat-raised-button color="primary" [mat-dialog-close]="true" cdkFocusInitial>完成</button>\n </mat-dialog-actions>\n ',isInline:!0,styles:["fm-article-draft{height:calc(100% - 60px);width:100%}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"ngmodule",type:MatDialogModule},{kind:"directive",type:i10.MatDialogClose,selector:"[mat-dialog-close], [matDialogClose]",inputs:["aria-label","type","mat-dialog-close","matDialogClose"],exportAs:["matDialogClose"]},{kind:"directive",type:i10.MatDialogActions,selector:"[mat-dialog-actions], mat-dialog-actions, [matDialogActions]",inputs:["align"]},{kind:"ngmodule",type:MatButtonModule},{kind:"component",type:i6.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",exportAs:["matButton"]},{kind:"component",type:FmArticleDraftComponent,selector:"fm-article-draft",inputs:["article"],outputs:["onDraftConfirm"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:DialogArticleDraft,decorators:[{type:Component,args:[{selector:"article-draft-dialog",template:'\n <fm-article-draft [article]="article" (onDraftConfirm)="onConfirm()"></fm-article-draft>\n <mat-dialog-actions align="start">\n <button mat-button color="primary" [mat-dialog-close]="true">取消</button>\n <button mat-raised-button color="primary" [mat-dialog-close]="true" cdkFocusInitial>完成</button>\n </mat-dialog-actions>\n ',standalone:!0,imports:[CommonModule,MatDialogModule,MatButtonModule,FmArticleDraftComponent],styles:["fm-article-draft{height:calc(100% - 60px);width:100%}\n"]}]}],ctorParameters:()=>[{type:i10.MatDialogRef},{type:void 0,decorators:[{type:Inject,args:[MAT_DIALOG_DATA]}]}],propDecorators:{draftComp:[{type:ViewChild,args:[FmArticleDraftComponent]}]}});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi90ZXh0L2ZtLWFydGljbGUtZWRpdG9yL2ZtLWFydGljbGUtZHJhZnQvZm0tYXJ0aWNsZS1kcmFmdC5jb21wb25lbnQubWpz`
10
+