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,543 +1,10 @@
1
- import { Component, EventEmitter, Input, Output } from "@angular/core";
2
- import { catchError } from "rxjs/operators";
3
- import { ActivatedRoute } from "@angular/router";
4
- import { HttpClient } from "@angular/common/http";
5
- import { CommonModule } from "@angular/common";
6
- import { WechatJssdkService } from "../../social/wechat/wechat-jssdk.service";
7
- import { PaymentService } from "../../payment/payment.service";
8
- import { QrCodeModule } from 'ng-qrcode';
9
- import {
10
- // IonModal,
11
- // IonIcon,
12
- // ToastController,
13
- AlertController, } from "@ionic/angular/standalone";
14
- import * as Parse from "parse";
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "../../social/wechat/wechat-jssdk.service";
17
- import * as i2 from "@angular/common/http";
18
- import * as i3 from "@angular/router";
19
- import * as i4 from "../../payment/payment.service";
20
- import * as i5 from "@ionic/angular/standalone";
21
- import * as i6 from "ng-qrcode";
22
- export class PaymentComponent {
23
- constructor(wxjssdk, http, activRoute, payServer,
24
- // private toastController: ToastController,
25
- alertCtrl) {
26
- this.wxjssdk = wxjssdk;
27
- this.http = http;
28
- this.activRoute = activRoute;
29
- this.payServer = payServer;
30
- this.alertCtrl = alertCtrl;
31
- this.price = 0; //支付金额
32
- this.title = "支付订单"; //支付标题
33
- this.showTypes = ["wxpay", "alipay"]; //显示的支付方式
34
- this.orderType = 'goods'; //订单类型
35
- /* 关键定制参数isRechargeRule:当orderType = vip | recharge且如果isRechargeRule为true,则表示是充值规则,需要设置credit或gid
36
- * orderType:vip 会员开通
37
- * orderType:recharge 充值
38
- */
39
- this.isRechargeRule = false; //是否是充值规则
40
- this.credit = 0; //积分&虚拟币
41
- this.payResult = new EventEmitter();
42
- this.isOpen = true; //打开弹窗
43
- this.checkpay = this.showTypes[0] || "";
44
- this.user = Parse.User.current();
45
- this.isLoading = false; //等待
46
- this.isDisabled = false; //防抖
47
- }
48
- ngOnInit() {
49
- this.activRoute.paramMap.subscribe(async (params) => {
50
- let ua = navigator.userAgent.toLowerCase();
51
- console.log(ua);
52
- if (ua.indexOf("micromessenger") != -1) {
53
- this.userAgent = "weixin";
54
- await this.wxjssdk.initUserOpenid();
55
- this.wxjssdk.setCurrentPageShareInfo();
56
- }
57
- else if (ua.indexOf("windows") != -1 || ua.indexOf("Macintosh") != -1) {
58
- this.userAgent = "pc";
59
- }
60
- });
61
- }
62
- onchangPay(val) {
63
- this.checkpay = val;
64
- console.log(val);
65
- }
66
- /* 用户确认支付 */
67
- async userPayment() {
68
- if (this.isLoading || !this.checkpay)
69
- return;
70
- if (!this.tradeNo) {
71
- this.tradeNo = this.payServer.setTradeNo();
72
- }
73
- /* isRechargeRule 充值规则 */
74
- if (this.isRechargeRule && this.tradeNo) {
75
- this.orderId = await this.payServer.getOrder(this.tradeNo);
76
- //满足 ①会员充值且订单不存在 ②余额充值且充值记录不存在或已支付 将重新创建订单号作为新订单创建
77
- if ((this.orderType == "vip" && !this.orderId) ||
78
- (this.orderType == "recharge" &&
79
- (!this.accountLog?.id || this.accountLog?.get("isVerified")))) {
80
- this.tradeNo = this.payServer.setTradeNo();
81
- }
82
- }
83
- console.log(this.tradeNo);
84
- if (this.price == 0) {
85
- this.toast("支付成功", "success");
86
- this.isOpen = false;
87
- this.payResult.emit({
88
- code: 200,
89
- tradeNo: this.tradeNo,
90
- type: this.checkpay,
91
- });
92
- this.tradeNo = null;
93
- return;
94
- }
95
- switch (this.checkpay) {
96
- case "wxpay":
97
- this.openWxPay();
98
- break;
99
- case "alipay":
100
- this.openAlipay();
101
- break;
102
- }
103
- }
104
- /* 校验支付方式 */
105
- async openWxPay() {
106
- let ua = navigator.userAgent.toLowerCase();
107
- let isWeixin = ua.indexOf("micromessenger") != -1;
108
- if (isWeixin) {
109
- //JSAPI 支付
110
- this.wxPayH5();
111
- }
112
- else {
113
- this.wxPay();
114
- }
115
- }
116
- /* 微信浏览器H5环境 */
117
- async wxPayH5() {
118
- if (this.isDisabled)
119
- return;
120
- try {
121
- this.isDisabled = true;
122
- let wechat = Parse.User.current()?.get("wechat");
123
- let openid = localStorage.getItem("openid") ||
124
- wechat[this.wxjssdk.wechatAccountId]?.openid;
125
- if (openid) {
126
- let params = {
127
- company: this.wxjssdk.company,
128
- body: this.title,
129
- out_trade_no: this.tradeNo,
130
- total_fee: +this.price,
131
- openid: openid,
132
- appid: this.wxjssdk.wechatAccountId,
133
- };
134
- let _this = this;
135
- this.http
136
- .post(`https://server.gdchat.cn/api/wxpay/neworder`, params)
137
- .pipe(catchError(async (err) => {
138
- console.error(err);
139
- this.isDisabled = false;
140
- this.isLoading = false;
141
- this.toast("支付失败:" + err?.error?.mess, "fail");
142
- }))
143
- .subscribe(async (response) => {
144
- await this.certificatePay();
145
- let payinfo = response;
146
- wx.chooseWXPay({
147
- timestamp: payinfo.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
148
- nonceStr: payinfo.nonceStr, // 支付签名随机串,不长于 32 位
149
- package: payinfo.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
150
- signType: "MD5", // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
151
- paySign: payinfo.paySign, // 支付签名
152
- success: async (res) => {
153
- // 支付成功后的回调函数
154
- if (res) {
155
- if (this.isRechargeRule) {
156
- let info = {
157
- out_trade_no: _this.tradeNo,
158
- nonce_str: payinfo.nonceStr,
159
- company: this.wxjssdk.company,
160
- };
161
- if (this.orderId) {
162
- this.payServer.updateAccountLog(info, this.orderId);
163
- }
164
- else if (this.orderType == "recharge") {
165
- this.accountLog = await this.payServer.updateRecharge(this.accountLog);
166
- }
167
- }
168
- _this.toast("支付成功", "success");
169
- _this.isOpen = false;
170
- _this.payResult.emit({
171
- code: 200,
172
- tradeNo: this.tradeNo,
173
- type: this.checkpay,
174
- });
175
- }
176
- },
177
- });
178
- this.isDisabled = false;
179
- });
180
- }
181
- else {
182
- // alert('缺少openid,请重新登录')
183
- this.isDisabled = false;
184
- let alert = await this.alertCtrl.create({
185
- header: "提示",
186
- subHeader: "",
187
- message: "缺少openid,请刷新页面或重新登录",
188
- buttons: [
189
- {
190
- role: "ok",
191
- text: "确认",
192
- handler: () => {
193
- location.reload();
194
- },
195
- },
196
- ],
197
- });
198
- alert.present();
199
- }
200
- }
201
- catch (err) {
202
- this.isDisabled = false;
203
- let alert = await this.alertCtrl.create({
204
- header: "异常错误",
205
- subHeader: "",
206
- message: err.message,
207
- buttons: [
208
- {
209
- role: "ok",
210
- text: "确认",
211
- handler: () => { },
212
- },
213
- ],
214
- });
215
- alert.present();
216
- }
217
- }
218
- /* 浏览器二维码支付 */
219
- async wxPay() {
220
- let params = {
221
- company: this.wxjssdk.company,
222
- out_trade_no: this.tradeNo,
223
- total_fee: this.price,
224
- body: this.title,
225
- };
226
- Parse.Cloud.run("pay_code2", params)
227
- .then(async (res) => {
228
- let nonce_str = res.nonce_str;
229
- this.codeLink = res.code_url[0];
230
- console.log(this.codeLink);
231
- await this.certificatePay();
232
- this.updateOrder(nonce_str);
233
- // this.isOpen = false;
234
- })
235
- .catch((err) => {
236
- this.isDisabled = false;
237
- this.toast(err.message, "danger");
238
- });
239
- }
240
- /* 支付宝支付 */
241
- async openAlipay() {
242
- if (this.isDisabled)
243
- return;
244
- this.isLoading = true;
245
- try {
246
- this.isDisabled = true;
247
- let htmlStringOrUrl = await this.getAliPayUrl();
248
- console.log(htmlStringOrUrl);
249
- await this.certificatePay();
250
- // if (this.deviceSer.isIOS) {
251
- // this.safariViewController
252
- // .show({
253
- // url: htmlStringOrUrl,
254
- // hidden: false,
255
- // animated: true,
256
- // transition: "curl",
257
- // })
258
- // .subscribe(
259
- // (result: any) => {
260
- // if (result.event === "opened") {
261
- // console.log("Opened");
262
- // } else if (result.event === "loaded") {
263
- // console.log("Loaded");
264
- // } else if (result.event === "closed") {
265
- // console.log("Closed");
266
- // }
267
- // },
268
- // (error: any) => {
269
- // console.log(error);
270
- // },
271
- // );
272
- // } else {
273
- const tempDiv = document.createElement("div");
274
- tempDiv.innerHTML = htmlStringOrUrl; // 假设htmlString是完整的HTML字符串
275
- const formElement = tempDiv.querySelector("form");
276
- if (formElement) {
277
- // 阻止默认行为,避免页面刷新
278
- formElement.addEventListener("submit", (event) => {
279
- event.preventDefault();
280
- });
281
- // 添加隐藏的iframe来提交表单
282
- const iframe = document.createElement("iframe");
283
- iframe.style.display = "none";
284
- document.body.appendChild(iframe);
285
- formElement.target = iframe.name;
286
- console.log(formElement);
287
- document.body.appendChild(formElement);
288
- formElement.submit();
289
- document.body.removeChild(formElement); // 提交后移除表单元素
290
- }
291
- else {
292
- console.error("未找到表单元素");
293
- this.isLoading = false;
294
- }
295
- // }
296
- this.timer = setInterval(async () => {
297
- console.log("支付结果轮询");
298
- let AccountLog = new Parse.Query("AccountLog");
299
- AccountLog.equalTo("company", this.wxjssdk.company);
300
- AccountLog.equalTo("orderNumber", this.tradeNo);
301
- AccountLog.equalTo("payType", "alipay");
302
- AccountLog.equalTo("isVerified", true);
303
- let result = await AccountLog.first();
304
- this.isLoading = false;
305
- if (result && result.id) {
306
- clearInterval(this.timer);
307
- this.timer = null;
308
- }
309
- if (!this.timer) {
310
- //支付成功返回状态
311
- this.toast("支付成功", "success");
312
- this.isOpen = false;
313
- this.payResult.emit({
314
- code: 200,
315
- tradeNo: this.tradeNo,
316
- type: this.checkpay,
317
- });
318
- }
319
- }, 1000);
320
- }
321
- catch (err) {
322
- this.isLoading = false;
323
- this.isDisabled = false;
324
- let alert = await this.alertCtrl.create({
325
- header: "异常错误",
326
- subHeader: "",
327
- message: err.message,
328
- buttons: [
329
- {
330
- role: "ok",
331
- text: "确认",
332
- handler: () => { },
333
- },
334
- ],
335
- });
336
- alert.present();
337
- }
338
- }
339
- // 获取支付宝支付
340
- async getAliPayUrl() {
341
- return new Promise((resolve, reject) => {
342
- let beforURL = window.location.href;
343
- let params = {
344
- company: this.wxjssdk.company,
345
- tradeNo: this.tradeNo,
346
- price: this.price,
347
- tradetype: "wap",
348
- orderTitle: this.title,
349
- returnUrl: beforURL,
350
- returnType: "get",
351
- rechargeRule: this.isRechargeRule
352
- };
353
- try {
354
- this.http
355
- .post("https://server.gdchat.cn/api/alipay/neworder", params)
356
- .pipe(catchError(async (err) => {
357
- console.error(err);
358
- this.isDisabled = false;
359
- this.isLoading = false;
360
- this.toast("支付失败:" + err?.error?.mess, "fail");
361
- }))
362
- .subscribe((res) => {
363
- if (res.code !== 200) {
364
- this.toast("网络错误,请稍后重试", "warning");
365
- return;
366
- }
367
- if (res.data && res.data.pay_url) {
368
- resolve(res.data.pay_url);
369
- }
370
- });
371
- }
372
- catch (err) {
373
- if (err) {
374
- this.toast("网络错误,请稍后重试", "warning");
375
- reject(err);
376
- }
377
- }
378
- });
379
- }
380
- updateOrder(nonce_str) {
381
- // 定时查询订单支付状态
382
- let that = this;
383
- that.timer = setInterval(() => {
384
- let info = {
385
- out_trade_no: that.tradeNo,
386
- nonce_str: nonce_str,
387
- company: this.wxjssdk.company,
388
- };
389
- // console.log(info);
390
- Parse.Cloud.run("order_status2", info)
391
- .then(async (res) => {
392
- // console.log(res);
393
- if (res.status && res.status[0] == "SUCCESS") {
394
- clearInterval(that.timer);
395
- if (this.isRechargeRule) {
396
- if (this.orderId) {
397
- this.payServer.updateAccountLog(info, this.orderId);
398
- }
399
- else if (this.orderType == "recharge") {
400
- this.accountLog = await this.payServer.updateRecharge(this.accountLog);
401
- }
402
- }
403
- that.toast("支付成功", "success");
404
- that.isOpen = false;
405
- that.payResult.emit({
406
- code: 200,
407
- tradeNo: this.tradeNo,
408
- type: this.checkpay,
409
- });
410
- }
411
- })
412
- .catch((err) => { });
413
- }, 3000);
414
- }
415
- // 支付前留存预订单
416
- async certificatePay() {
417
- await this.payServer.createdAccountLog({
418
- company: this.wxjssdk.company,
419
- orderId: this.orderId,
420
- tradeNo: this.tradeNo,
421
- price: this.price,
422
- payType: this.checkpay,
423
- orderType: this.orderType
424
- });
425
- if (!this.isRechargeRule)
426
- return;
427
- if (this.orderType == "vip" && !this.orderId && this.gid) {
428
- let resulte = await this.payServer.setOrder({
429
- type: "service", //创建服务类订单
430
- gid: this.gid,
431
- price: this.price,
432
- total_fee: this.price,
433
- tradeNo: this.tradeNo,
434
- out_trade_no: this.tradeNo,
435
- payType: this.checkpay,
436
- code: this.codeLink
437
- });
438
- console.log(resulte);
439
- if (resulte?.objectId) {
440
- this.orderId = resulte.objectId;
441
- }
442
- }
443
- else if (this.orderType == "recharge") {
444
- this.accountLog = await this.payServer.creatdRechargeLog({
445
- tradeNo: this.tradeNo,
446
- payType: this.checkpay,
447
- price: this.price,
448
- credit: this.credit,
449
- });
450
- }
451
- }
452
- /* 关闭支付弹窗 */
453
- onClose() {
454
- this.isOpen = false;
455
- const result = {
456
- code: 0,
457
- tradeNo: this.tradeNo,
458
- type: this.checkpay,
459
- };
460
- this.payResult.emit(result);
461
- }
462
- toast(text, type) {
463
- const toastEl = document.createElement("div");
464
- const color = type ?? "warning";
465
- // 颜色配置
466
- const colorConfig = {
467
- success: { bg: "#10dc60", text: "#fff" },
468
- danger: { bg: "#f04141", text: "#fff" },
469
- fail: { bg: "#f04141", text: "#fff" },
470
- warning: { bg: "#ffce00", text: "#000" },
471
- };
472
- // 应用样式
473
- Object.assign(toastEl.style, {
474
- position: "fixed",
475
- bottom: "20px",
476
- left: "50%",
477
- transform: "translateX(-50%)",
478
- padding: "12px 20px",
479
- borderRadius: "4px",
480
- zIndex: "9999",
481
- fontSize: "14px",
482
- textAlign: "center",
483
- minWidth: "200px",
484
- boxShadow: "0 3px 5px rgba(0,0,0,0.2)",
485
- opacity: "0",
486
- transition: "opacity 0.3s ease-in-out",
487
- backgroundColor: colorConfig[color]?.bg || colorConfig.warning.bg,
488
- color: colorConfig[color]?.text || colorConfig.warning.text,
489
- });
490
- toastEl.textContent = text;
491
- document.body.appendChild(toastEl);
492
- // 显示和自动移除
493
- requestAnimationFrame(() => {
494
- toastEl.style.opacity = "1";
495
- setTimeout(() => {
496
- toastEl.style.opacity = "0";
497
- setTimeout(() => document.body.removeChild(toastEl), 300);
498
- }, 1500);
499
- });
500
- }
501
- ngOnDestroy() {
502
- this.timer && clearInterval(this.timer);
503
- }
504
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaymentComponent, deps: [{ token: i1.WechatJssdkService }, { token: i2.HttpClient }, { token: i3.ActivatedRoute }, { token: i4.PaymentService }, { token: i5.AlertController }], target: i0.ɵɵFactoryTarget.Component }); }
505
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PaymentComponent, isStandalone: true, selector: "fm-payment", inputs: { price: "price", tradeNo: "tradeNo", title: "title", showTypes: "showTypes", orderType: "orderType", isRechargeRule: "isRechargeRule", credit: "credit", gid: "gid", orderId: "orderId", isOpen: "isOpen" }, outputs: { payResult: "payResult" }, ngImport: i0, template: "@if (isOpen) {\r\n <div class=\"payment-overlay\">\r\n <!-- \u5168\u5C40 Loading -->\r\n @if (isLoading) {\r\n <div class=\"global-loading\">\r\n <div class=\"loading-spinner\"></div>\r\n <div class=\"loading-text\">\u5904\u7406\u4E2D...</div>\r\n </div>\r\n }\r\n\r\n <div class=\"payment-box\" [class.blur-effect]=\"isLoading\">\r\n <div class=\"pay-box\">\r\n <div class=\"close-btn\" (click)=\"!isLoading && onClose()\">\r\n <span class=\"close-icon\"></span>\r\n </div>\r\n @if (!codeLink) {\r\n <div class=\"pay-title\">\u652F\u4ED8\u8BA2\u5355</div>\r\n <div class=\"pay-num\">\uFFE5{{ price || 0 }}</div>\r\n <div class=\"options\">\r\n @if (showTypes.includes(\"wxpay\")) {\r\n <div class=\"row\" (click)=\"onchangPay('wxpay')\">\r\n <div class=\"label\">\r\n <img\r\n src=\"https://file-cloud.fmode.cn/E4KpGvTEto/20231123/s1sun8061000007.png\"\r\n alt=\"\u5FAE\u4FE1\u652F\u4ED8\"\r\n class=\"icon\"\r\n />\r\n <div class=\"text\">\u5FAE\u4FE1\u652F\u4ED8</div>\r\n </div>\r\n <div class=\"check\" [class.check-active]=\"checkpay === 'wxpay'\">\r\n <div class=\"checkbox\"></div>\r\n </div>\r\n </div>\r\n }\r\n @if (showTypes.length > 1) {\r\n <div class=\"divider\"></div>\r\n }\r\n @if (showTypes.includes(\"alipay\")) {\r\n <div class=\"row\" (click)=\"onchangPay('alipay')\">\r\n <div class=\"label\">\r\n <img\r\n src=\"https://file-cloud.fmode.cn/storage/company/E4KpGvTEto/20250815/110934166.png\"\r\n alt=\"\u652F\u4ED8\u5B9D\"\r\n class=\"icon\"\r\n />\r\n <div class=\"text\">\u652F\u4ED8\u5B9D</div>\r\n </div>\r\n <div class=\"check\" [class.check-active]=\"checkpay === 'alipay'\">\r\n <div class=\"checkbox\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"pay-footer\">\r\n <div class=\"order-num\">\u8BA2\u5355\u7F16\u53F7\uFF1A{{ tradeNo ? tradeNo : \"-\" }}</div>\r\n <div\r\n class=\"pay-btn\"\r\n (click)=\"!isLoading && userPayment()\"\r\n [class.disabled]=\"isLoading || !checkpay\"\r\n >\r\n \u53BB\u4ED8\u6B3E\r\n @if (isLoading) {\r\n <span class=\"btn-loading\"></span>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"qrcode-section\">\r\n <qr-code [value]=\"codeLink\" value=\"\u8BF7\u4F7F\u7528\u624B\u673A\u626B\u63CF\u4E8C\u7EF4\u7801\u5B8C\u6210\u652F\u4ED8\" [size]=\"180\"></qr-code>\r\n <p class=\"qrcode-tip\">\u8BF7\u4F7F\u7528\u624B\u673A\u626B\u63CF\u4E8C\u7EF4\u7801\u5B8C\u6210\u652F\u4ED8</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";.global-loading{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1001;background:#ffffffe6;padding:20px 30px;border-radius:8px;box-shadow:0 2px 10px #0000001a;display:flex;flex-direction:column;align-items:center}.global-loading .loading-spinner{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #1890ff;border-radius:50%;animation:spin 1s linear infinite;margin-bottom:10px}.global-loading .loading-text{color:#333;font-size:14px}.blur-effect{filter:blur(2px);pointer-events:none}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.payment-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000;animation:fadeIn .3s ease}.payment-box{width:90%;max-width:400px;background:#fff;border-radius:12px;box-shadow:0 4px 20px #00000026;animation:slideUp .3s ease;overflow:hidden}.pay-box{padding:20px;position:relative}.pay-box .close{position:absolute;right:16px;top:16px;font-size:24px;color:#999;cursor:pointer;transition:color .2s;padding:8px}.pay-box .close:hover{color:#666}.pay-box .pay-title{text-align:center;font-size:18px;font-weight:600;color:#333;margin-bottom:8px}.pay-box .pay-num{text-align:center;font-size:28px;color:#1890ff;margin:12px auto;font-weight:700}.pay-box .options{margin:20px 0}.pay-box .options .row{display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:background-color .2s;border-radius:8px;padding:12px}.pay-box .options .row:hover{background-color:#f9f9f9}.pay-box .options .row .label{display:flex;align-items:center}.pay-box .options .row .label img{width:32px;height:32px;object-fit:contain}.pay-box .options .row .label .text{font-size:16px;margin-left:12px;color:#333}.pay-box .options .row .check{border:2px solid #ddd;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;transition:all .2s}.pay-box .options .row .check .checkbox{width:12px;height:12px;border-radius:50%;background:transparent;transition:background .2s}.pay-box .options .row .check-active{border-color:#1890ff}.pay-box .options .row .check-active .checkbox{background:#1890ff}.pay-box .options .divider{margin:8px 0;height:1px;background:#eee}.pay-box .pay-footer{display:flex;flex-direction:column;align-items:center;margin-top:20px}.pay-box .pay-footer .order-num{color:#999;font-size:14px;margin-bottom:16px}.pay-box .pay-footer .pay-btn{padding:12px 0;width:100%;color:#fff;text-align:center;background:#1890ff;border-radius:8px;font-size:16px;font-weight:500;cursor:pointer;transition:background .2s;border:none;position:relative}.pay-box .pay-footer .pay-btn:hover,.pay-box .pay-footer .pay-btn:active{background:#1166b5}.pay-box .pay-footer .pay-btn.disabled{background:#ccc!important;cursor:not-allowed}.pay-box .pay-footer .pay-btn .btn-loading{display:inline-block;width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top:2px solid white;border-radius:50%;animation:spin .8s linear infinite;margin-left:8px;vertical-align:middle}.pay-box .qrcode{display:flex;justify-content:center;align-items:center;padding:20px}.pay-box .qrcode img{max-width:100%;height:auto;border:1px solid #eee;border-radius:8px}.pay-box .qrcode-section{text-align:center;margin:20px 0;padding:15px}.pay-box .qrcode-section .qrcode-image{max-width:200px;height:auto;border:1px solid #ddd;padding:10px;background:#fff}.pay-box .qrcode-section .qrcode-tip{margin-top:10px;font-size:14px;color:#666}.close-btn{position:absolute;right:16px;top:16px;width:40px;height:40px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:background-color .2s ease;z-index:1}.close-btn:hover{background-color:#0000000d}.close-btn:active{background-color:#0000001a}.close-icon{position:relative;width:20px;height:20px}.close-icon:before,.close-icon:after{content:\"\";position:absolute;top:50%;left:50%;width:100%;height:2px;background-color:#666;border-radius:1px}.close-icon:before{transform:translate(-50%,-50%) rotate(45deg)}.close-icon:after{transform:translate(-50%,-50%) rotate(-45deg)}.close-btn.disabled{pointer-events:none;opacity:.5}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: QrCodeModule }, { kind: "component", type: i6.QrCodeComponent, selector: "qr-code", inputs: ["value", "size", "darkColor", "lightColor", "errorCorrectionLevel", "centerImageSrc", "centerImageSize", "margin"] }] }); }
506
- }
507
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaymentComponent, decorators: [{
508
- type: Component,
509
- args: [{ selector: "fm-payment", standalone: true, imports: [CommonModule, QrCodeModule], template: "@if (isOpen) {\r\n <div class=\"payment-overlay\">\r\n <!-- \u5168\u5C40 Loading -->\r\n @if (isLoading) {\r\n <div class=\"global-loading\">\r\n <div class=\"loading-spinner\"></div>\r\n <div class=\"loading-text\">\u5904\u7406\u4E2D...</div>\r\n </div>\r\n }\r\n\r\n <div class=\"payment-box\" [class.blur-effect]=\"isLoading\">\r\n <div class=\"pay-box\">\r\n <div class=\"close-btn\" (click)=\"!isLoading && onClose()\">\r\n <span class=\"close-icon\"></span>\r\n </div>\r\n @if (!codeLink) {\r\n <div class=\"pay-title\">\u652F\u4ED8\u8BA2\u5355</div>\r\n <div class=\"pay-num\">\uFFE5{{ price || 0 }}</div>\r\n <div class=\"options\">\r\n @if (showTypes.includes(\"wxpay\")) {\r\n <div class=\"row\" (click)=\"onchangPay('wxpay')\">\r\n <div class=\"label\">\r\n <img\r\n src=\"https://file-cloud.fmode.cn/E4KpGvTEto/20231123/s1sun8061000007.png\"\r\n alt=\"\u5FAE\u4FE1\u652F\u4ED8\"\r\n class=\"icon\"\r\n />\r\n <div class=\"text\">\u5FAE\u4FE1\u652F\u4ED8</div>\r\n </div>\r\n <div class=\"check\" [class.check-active]=\"checkpay === 'wxpay'\">\r\n <div class=\"checkbox\"></div>\r\n </div>\r\n </div>\r\n }\r\n @if (showTypes.length > 1) {\r\n <div class=\"divider\"></div>\r\n }\r\n @if (showTypes.includes(\"alipay\")) {\r\n <div class=\"row\" (click)=\"onchangPay('alipay')\">\r\n <div class=\"label\">\r\n <img\r\n src=\"https://file-cloud.fmode.cn/storage/company/E4KpGvTEto/20250815/110934166.png\"\r\n alt=\"\u652F\u4ED8\u5B9D\"\r\n class=\"icon\"\r\n />\r\n <div class=\"text\">\u652F\u4ED8\u5B9D</div>\r\n </div>\r\n <div class=\"check\" [class.check-active]=\"checkpay === 'alipay'\">\r\n <div class=\"checkbox\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"pay-footer\">\r\n <div class=\"order-num\">\u8BA2\u5355\u7F16\u53F7\uFF1A{{ tradeNo ? tradeNo : \"-\" }}</div>\r\n <div\r\n class=\"pay-btn\"\r\n (click)=\"!isLoading && userPayment()\"\r\n [class.disabled]=\"isLoading || !checkpay\"\r\n >\r\n \u53BB\u4ED8\u6B3E\r\n @if (isLoading) {\r\n <span class=\"btn-loading\"></span>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"qrcode-section\">\r\n <qr-code [value]=\"codeLink\" value=\"\u8BF7\u4F7F\u7528\u624B\u673A\u626B\u63CF\u4E8C\u7EF4\u7801\u5B8C\u6210\u652F\u4ED8\" [size]=\"180\"></qr-code>\r\n <p class=\"qrcode-tip\">\u8BF7\u4F7F\u7528\u624B\u673A\u626B\u63CF\u4E8C\u7EF4\u7801\u5B8C\u6210\u652F\u4ED8</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";.global-loading{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1001;background:#ffffffe6;padding:20px 30px;border-radius:8px;box-shadow:0 2px 10px #0000001a;display:flex;flex-direction:column;align-items:center}.global-loading .loading-spinner{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #1890ff;border-radius:50%;animation:spin 1s linear infinite;margin-bottom:10px}.global-loading .loading-text{color:#333;font-size:14px}.blur-effect{filter:blur(2px);pointer-events:none}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.payment-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000;animation:fadeIn .3s ease}.payment-box{width:90%;max-width:400px;background:#fff;border-radius:12px;box-shadow:0 4px 20px #00000026;animation:slideUp .3s ease;overflow:hidden}.pay-box{padding:20px;position:relative}.pay-box .close{position:absolute;right:16px;top:16px;font-size:24px;color:#999;cursor:pointer;transition:color .2s;padding:8px}.pay-box .close:hover{color:#666}.pay-box .pay-title{text-align:center;font-size:18px;font-weight:600;color:#333;margin-bottom:8px}.pay-box .pay-num{text-align:center;font-size:28px;color:#1890ff;margin:12px auto;font-weight:700}.pay-box .options{margin:20px 0}.pay-box .options .row{display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:background-color .2s;border-radius:8px;padding:12px}.pay-box .options .row:hover{background-color:#f9f9f9}.pay-box .options .row .label{display:flex;align-items:center}.pay-box .options .row .label img{width:32px;height:32px;object-fit:contain}.pay-box .options .row .label .text{font-size:16px;margin-left:12px;color:#333}.pay-box .options .row .check{border:2px solid #ddd;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;transition:all .2s}.pay-box .options .row .check .checkbox{width:12px;height:12px;border-radius:50%;background:transparent;transition:background .2s}.pay-box .options .row .check-active{border-color:#1890ff}.pay-box .options .row .check-active .checkbox{background:#1890ff}.pay-box .options .divider{margin:8px 0;height:1px;background:#eee}.pay-box .pay-footer{display:flex;flex-direction:column;align-items:center;margin-top:20px}.pay-box .pay-footer .order-num{color:#999;font-size:14px;margin-bottom:16px}.pay-box .pay-footer .pay-btn{padding:12px 0;width:100%;color:#fff;text-align:center;background:#1890ff;border-radius:8px;font-size:16px;font-weight:500;cursor:pointer;transition:background .2s;border:none;position:relative}.pay-box .pay-footer .pay-btn:hover,.pay-box .pay-footer .pay-btn:active{background:#1166b5}.pay-box .pay-footer .pay-btn.disabled{background:#ccc!important;cursor:not-allowed}.pay-box .pay-footer .pay-btn .btn-loading{display:inline-block;width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top:2px solid white;border-radius:50%;animation:spin .8s linear infinite;margin-left:8px;vertical-align:middle}.pay-box .qrcode{display:flex;justify-content:center;align-items:center;padding:20px}.pay-box .qrcode img{max-width:100%;height:auto;border:1px solid #eee;border-radius:8px}.pay-box .qrcode-section{text-align:center;margin:20px 0;padding:15px}.pay-box .qrcode-section .qrcode-image{max-width:200px;height:auto;border:1px solid #ddd;padding:10px;background:#fff}.pay-box .qrcode-section .qrcode-tip{margin-top:10px;font-size:14px;color:#666}.close-btn{position:absolute;right:16px;top:16px;width:40px;height:40px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:background-color .2s ease;z-index:1}.close-btn:hover{background-color:#0000000d}.close-btn:active{background-color:#0000001a}.close-icon{position:relative;width:20px;height:20px}.close-icon:before,.close-icon:after{content:\"\";position:absolute;top:50%;left:50%;width:100%;height:2px;background-color:#666;border-radius:1px}.close-icon:before{transform:translate(-50%,-50%) rotate(45deg)}.close-icon:after{transform:translate(-50%,-50%) rotate(-45deg)}.close-btn.disabled{pointer-events:none;opacity:.5}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}\n"] }]
510
- }], ctorParameters: () => [{ type: i1.WechatJssdkService }, { type: i2.HttpClient }, { type: i3.ActivatedRoute }, { type: i4.PaymentService }, { type: i5.AlertController }], propDecorators: { price: [{
511
- type: Input,
512
- args: ["price"]
513
- }], tradeNo: [{
514
- type: Input,
515
- args: ["tradeNo"]
516
- }], title: [{
517
- type: Input,
518
- args: ["title"]
519
- }], showTypes: [{
520
- type: Input,
521
- args: ["showTypes"]
522
- }], orderType: [{
523
- type: Input,
524
- args: ["orderType"]
525
- }], isRechargeRule: [{
526
- type: Input,
527
- args: ["isRechargeRule"]
528
- }], credit: [{
529
- type: Input,
530
- args: ["credit"]
531
- }], gid: [{
532
- type: Input,
533
- args: ["gid"]
534
- }], orderId: [{
535
- type: Input,
536
- args: ["orderId"]
537
- }], payResult: [{
538
- type: Output
539
- }], isOpen: [{
540
- type: Input,
541
- args: ["isOpen"]
542
- }] } });
543
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL3BheW1lbnQvcGF5bWVudC9wYXltZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvcGF5bWVudC9wYXltZW50L3BheW1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekMsT0FBTztBQUNMLFlBQVk7QUFDWixXQUFXO0FBQ1gsbUJBQW1CO0FBQ25CLGVBQWUsR0FDaEIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQzs7Ozs7Ozs7QUFhL0IsTUFBTSxPQUFPLGdCQUFnQjtJQTJCM0IsWUFDVSxPQUEyQixFQUMzQixJQUFnQixFQUNoQixVQUEwQixFQUMxQixTQUF5QjtJQUNqQyw0Q0FBNEM7SUFDcEMsU0FBMEI7UUFMMUIsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0IsU0FBSSxHQUFKLElB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VUM3QjdCLDByR0E0RUEsNnlJRG5EWSxZQUFZLDhCQUFFLFlBQVk7OzRGQUl6QixnQkFBZ0I7a0JBUDVCLFNBQVM7K0JBQ0UsWUFBWSxjQUNWLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUM7d01BS3JCLEtBQUs7c0JBQXBCLEtBQUs7dUJBQUMsT0FBTztnQkFDSSxPQUFPO3NCQUF4QixLQUFLO3VCQUFDLFNBQVM7Z0JBQ0EsS0FBSztzQkFBcEIsS0FBSzt1QkFBQyxPQUFPO2dCQUNNLFNBQVM7c0JBQTVCLEtBQUs7dUJBQUMsV0FBVztnQkFFRSxTQUFTO3NCQUE1QixLQUFLO3VCQUFDLFdBQVc7Z0JBS08sY0FBYztzQkFBdEMsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBQ04sTUFBTTtzQkFBdEIsS0FBSzt1QkFBQyxRQUFRO2dCQUNELEdBQUc7c0JBQWhCLEtBQUs7dUJBQUMsS0FBSztnQkFDTSxPQUFPO3NCQUF4QixLQUFLO3VCQUFDLFNBQVM7Z0JBRU4sU0FBUztzQkFBbEIsTUFBTTtnQkFDVSxNQUFNO3NCQUF0QixLQUFLO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IFdlY2hhdEpzc2RrU2VydmljZSB9IGZyb20gXCIuLi8uLi9zb2NpYWwvd2VjaGF0L3dlY2hhdC1qc3Nkay5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBheW1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3BheW1lbnQvcGF5bWVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFFyQ29kZU1vZHVsZSB9IGZyb20gJ25nLXFyY29kZSc7XHJcblxyXG5pbXBvcnQge1xyXG4gIC8vIElvbk1vZGFsLFxyXG4gIC8vIElvbkljb24sXHJcbiAgLy8gVG9hc3RDb250cm9sbGVyLFxyXG4gIEFsZXJ0Q29udHJvbGxlcixcclxufSBmcm9tIFwiQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZVwiO1xyXG5cclxuaW1wb3J0ICogYXMgUGFyc2UgZnJvbSBcInBhcnNlXCI7XHJcbmRlY2xhcmUgdmFyIHd4OiBhbnk7XHJcblxyXG4vLyDlrprkuYnmlK/ku5jnsbvlnovmnprkuL5cclxudHlwZSBQYXltZW50TWV0aG9kID0gXCJ3eHBheVwiIHwgXCJhbGlwYXlcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImZtLXBheW1lbnRcIixcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFFyQ29kZU1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9wYXltZW50LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9wYXltZW50LmNvbXBvbmVudC5zY3NzXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYXltZW50Q29tcG9uZW50IHtcclxuICBASW5wdXQoXCJwcmljZVwiKSBwcmljZTogbnVtYmVyID0gMDsgLy/mlK/ku5jph5Hpop1cclxuICBASW5wdXQoXCJ0cmFkZU5vXCIpIHRyYWRlTm86IHN0cmluZyB8IHVuZGVmaW5lZDsgLy/mlK/ku5jljZXlj7dcclxuICBASW5wdXQoXCJ0aXRsZVwiKSB0aXRsZTogc3RyaW5nID0gXCLmlK/ku5jorqLljZVcIjsgLy/mlK/ku5jmoIfpophcclxuICBASW5wdXQoXCJzaG93VHlwZXNcIikgc2hvd1R5cGVzOiBQYXltZW50TWV0aG9kW10gPSBbXCJ3eHBheVwiLCBcImFsaXBheVwiXTsgLy/mmL7npLrnmoTmlK/ku5jmlrnlvI9cclxuICBcclxuICBASW5wdXQoXCJvcmRlclR5cGVcIikgb3JkZXJUeXBlOiBzdHJpbmcgPSAnZ29vZHMnOyAvL+iuouWNleexu+Wei1xyXG4gIC8qIOWFs+mUruWumuWItuWPguaVsGlzUmVjaGFyZ2VSdWxl77ya5b2Tb3JkZXJUeXBlID0gdmlwIHwgcmVjaGFyZ2XkuJTlpoLmnpxpc1JlY2hhcmdlUnVsZeS4unRydWXvvIzliJnooajnpLrmmK/lhYXlgLzop4TliJnvvIzpnIDopoHorr7nva5jcmVkaXTmiJZnaWQgXHJcbiAgKiBvcmRlclR5cGXvvJp2aXAg5Lya5ZGY5byA6YCaXHJcbiAgKiBvcmRlclR5cGXvvJpyZWNoYXJnZSDlhYXlgLxcclxuICAqL1xyXG4gIEBJbnB1dChcImlzUmVjaGFyZ2VSdWxlXCIpIGlzUmVjaGFyZ2VSdWxlOiBib29sZWFuID0gZmFsc2U7IC8v5piv5ZCm5piv5YWF5YC86KeE5YiZXHJcbiAgQElucHV0KFwiY3JlZGl0XCIpIGNyZWRpdDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDsgLy/np6/liIYm6Jma5ouf5biBXHJcbiAgQElucHV0KFwiZ2lkXCIpIGdpZDogc3RyaW5nIHwgdW5kZWZpbmVkOyAvL+WVhuWTgUlEXHJcbiAgQElucHV0KFwib3JkZXJJZFwiKSBvcmRlcklkPzogc3RyaW5nOyAvL+iuouWNlUlEXHJcblxyXG4gIEBPdXRwdXQoKSBwYXlSZXN1bHQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQElucHV0KFwiaXNPcGVuXCIpIGlzT3BlbjogYm9vbGVhbiA9IHRydWU7IC8v5omT5byA5by556qXXHJcblxyXG4gIGNoZWNrcGF5OiBzdHJpbmcgPSB0aGlzLnNob3dUeXBlc1swXSB8fCBcIlwiO1xyXG4gIHVzZXJBZ2VudD86IHN0cmluZzsgLy/ojrflj5blvZPliY3mtY/op4jlmajnjq/looNcclxuICBjb2RlTGluaz86IHN0cmluZztcclxuICB1c2VyOiBQYXJzZS5PYmplY3QgPSBQYXJzZS5Vc2VyLmN1cnJlbnQoKSE7XHJcbiAgdGltZXI6IGFueTsgLy/lrprml7bmn6Xor6JcclxuXHJcbiAgYWNjb3VudExvZz86IFBhcnNlLk9iamVjdDsgLy8g5YWF5YC86K6w5b2VXHJcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7IC8v562J5b6FXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHd4anNzZGs6IFdlY2hhdEpzc2RrU2VydmljZSxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgYWN0aXZSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHBheVNlcnZlcjogUGF5bWVudFNlcnZpY2UsXHJcbiAgICAvLyBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBhbGVydEN0cmw6IEFsZXJ0Q29udHJvbGxlcixcclxuICApIHt9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmFjdGl2Um91dGUucGFyYW1NYXAuc3Vic2NyaWJlKGFzeW5jIChwYXJhbXMpID0+IHtcclxuICAgICAgbGV0IHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zb2xlLmxvZyh1YSk7XHJcbiAgICAgIGlmICh1YS5pbmRleE9mKFwibWljcm9tZXNzZW5nZXJcIikgIT0gLTEpIHtcclxuICAgICAgICB0aGlzLnVzZXJBZ2VudCA9IFwid2VpeGluXCI7XHJcbiAgICAgICAgYXdhaXQgdGhpcy53eGpzc2RrLmluaXRVc2VyT3BlbmlkKCk7XHJcbiAgICAgICAgdGhpcy53eGpzc2RrLnNldEN1cnJlbnRQYWdlU2hhcmVJbmZvKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodWEuaW5kZXhPZihcIndpbmRvd3NcIikgIT0gLTEgfHwgdWEuaW5kZXhPZihcIk1hY2ludG9zaFwiKSAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMudXNlckFnZW50ID0gXCJwY1wiO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uY2hhbmdQYXkodmFsOiBQYXltZW50TWV0aG9kKSB7XHJcbiAgICB0aGlzLmNoZWNrcGF5ID0gdmFsO1xyXG4gICAgY29uc29sZS5sb2codmFsKTtcclxuICB9XHJcblxyXG4gIC8qIOeUqOaIt+ehruiupOaUr+S7mCAqL1xyXG4gIGFzeW5jIHVzZXJQYXltZW50KCkge1xyXG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nIHx8ICF0aGlzLmNoZWNrcGF5KSByZXR1cm47XHJcbiAgICBpZiAoIXRoaXMudHJhZGVObykge1xyXG4gICAgICB0aGlzLnRyYWRlTm8gPSB0aGlzLnBheVNlcnZlci5zZXRUcmFkZU5vKCk7XHJcbiAgICB9XHJcbiAgICAvKiBpc1JlY2hhcmdlUnVsZSDlhYXlgLzop4TliJkgKi9cclxuICAgIGlmICh0aGlzLmlzUmVjaGFyZ2VSdWxlICYmIHRoaXMudHJhZGVObykge1xyXG4gICAgICB0aGlzLm9yZGVySWQgPSBhd2FpdCB0aGlzLnBheVNlcnZlci5nZXRPcmRlcih0aGlzLnRyYWRlTm8pO1xyXG4gICAgICAvL+a7oei2syDikaDkvJrlkZjlhYXlgLzkuJTorqLljZXkuI3lrZjlnKgg4pGh5L2Z6aKd5YWF5YC85LiU5YWF5YC86K6w5b2V5LiN5a2Y5Zyo5oiW5bey5pSv5LuYIOWwhumHjeaWsOWIm+W7uuiuouWNleWPt+S9nOS4uuaWsOiuouWNleWIm+W7uiAgICBcclxuICAgICAgaWYgKFxyXG4gICAgICAgICh0aGlzLm9yZGVyVHlwZSA9PSBcInZpcFwiICYmICF0aGlzLm9yZGVySWQpIHx8XHJcbiAgICAgICAgKHRoaXMub3JkZXJUeXBlID09IFwicmVjaGFyZ2VcIiAmJlxyXG4gICAgICAgICAgKCF0aGlzLmFjY291bnRMb2c/LmlkIHx8IHRoaXMuYWNjb3VudExvZz8uZ2V0KFwiaXNWZXJpZmllZFwiKSkpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMudHJhZGVObyA9IHRoaXMucGF5U2VydmVyLnNldFRyYWRlTm8oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2codGhpcy50cmFkZU5vKTtcclxuICAgIGlmICh0aGlzLnByaWNlID09IDApIHtcclxuICAgICAgdGhpcy50b2FzdChcIuaUr+S7mOaIkOWKn1wiLCBcInN1Y2Nlc3NcIik7XHJcbiAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucGF5UmVzdWx0LmVtaXQoe1xyXG4gICAgICAgIGNvZGU6IDIwMCxcclxuICAgICAgICB0cmFkZU5vOiB0aGlzLnRyYWRlTm8sXHJcbiAgICAgICAgdHlwZTogdGhpcy5jaGVja3BheSxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudHJhZGVObyA9IG51bGw7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHN3aXRjaCAodGhpcy5jaGVja3BheSkge1xyXG4gICAgICBjYXNlIFwid3hwYXlcIjpcclxuICAgICAgICB0aGlzLm9wZW5XeFBheSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiYWxpcGF5XCI6XHJcbiAgICAgICAgdGhpcy5vcGVuQWxpcGF5KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qIOagoemqjOaUr+S7mOaWueW8jyAqL1xyXG4gIGFzeW5jIG9wZW5XeFBheSgpIHtcclxuICAgIGxldCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcclxuICAgIGxldCBpc1dlaXhpbiA9IHVhLmluZGV4T2YoXCJtaWNyb21lc3NlbmdlclwiKSAhPSAtMTtcclxuICAgIGlmIChpc1dlaXhpbikge1xyXG4gICAgICAvL0pTQVBJIOaUr+S7mFxyXG4gICAgICB0aGlzLnd4UGF5SDUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMud3hQYXkoKTtcclxuICAgIH1cclxuICB9XHJcbiAgaXNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlOyAvL+mYsuaKllxyXG5cclxuICAvKiDlvq7kv6HmtY/op4jlmahINeeOr+WigyAqL1xyXG4gIGFzeW5jIHd4UGF5SDUoKSB7XHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzRGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICBsZXQgd2VjaGF0ID0gUGFyc2UuVXNlci5jdXJyZW50KCk/LmdldChcIndlY2hhdFwiKTtcclxuICAgICAgbGV0IG9wZW5pZCA9XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJvcGVuaWRcIikgfHxcclxuICAgICAgICB3ZWNoYXRbdGhpcy53eGpzc2RrLndlY2hhdEFjY291bnRJZF0/Lm9wZW5pZDtcclxuICAgICAgaWYgKG9wZW5pZCkge1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICBjb21wYW55OiB0aGlzLnd4anNzZGsuY29tcGFueSxcclxuICAgICAgICAgIGJvZHk6IHRoaXMudGl0bGUsXHJcbiAgICAgICAgICBvdXRfdHJhZGVfbm86IHRoaXMudHJhZGVObyxcclxuICAgICAgICAgIHRvdGFsX2ZlZTogK3RoaXMucHJpY2UsXHJcbiAgICAgICAgICBvcGVuaWQ6IG9wZW5pZCxcclxuICAgICAgICAgIGFwcGlkOiB0aGlzLnd4anNzZGsud2VjaGF0QWNjb3VudElkLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLmh0dHBcclxuICAgICAgICAgIC5wb3N0KGBodHRwczovL3NlcnZlci5nZGNoYXQuY24vYXBpL3d4cGF5L25ld29yZGVyYCwgcGFyYW1zKVxyXG4gICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoYXN5bmMgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3QoXCLmlK/ku5jlpLHotKXvvJpcIiArIGVycj8uZXJyb3I/Lm1lc3MsIFwiZmFpbFwiKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNlcnRpZmljYXRlUGF5KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcGF5aW5mbzogYW55ID0gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgIHd4LmNob29zZVdYUGF5KHtcclxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IHBheWluZm8udGltZVN0YW1wLCAvLyDmlK/ku5jnrb7lkI3ml7bpl7TmiLPvvIzms6jmhI/lvq7kv6Fqc3Nka+S4reeahOaJgOacieS9v+eUqHRpbWVzdGFtcOWtl+auteWdh+S4uuWwj+WGmeOAguS9huacgOaWsOeJiOeahOaUr+S7mOWQjuWPsOeUn+aIkOetvuWQjeS9v+eUqOeahHRpbWVTdGFtcOWtl+auteWQjemcgOWkp+WGmeWFtuS4reeahFPlrZfnrKZcclxuICAgICAgICAgICAgICBub25jZVN0cjogcGF5aW5mby5ub25jZVN0ciwgLy8g5pSv5LuY562+5ZCN6ZqP5py65Liy77yM5LiN6ZW/5LqOIDMyIOS9jVxyXG4gICAgICAgICAgICAgIHBhY2thZ2U6IHBheWluZm8ucGFja2FnZSwgLy8g57uf5LiA5pSv5LuY5o6l5Y+j6L+U5Zue55qEcHJlcGF5X2lk5Y+C5pWw5YC877yM5o+Q5Lqk5qC85byP5aaC77yacHJlcGF5X2lkPVxcKlxcKlxcKu+8iVxyXG4gICAgICAgICAgICAgIHNpZ25UeXBlOiBcIk1ENVwiLCAvLyDnrb7lkI3mlrnlvI/vvIzpu5jorqTkuLonU0hBMSfvvIzkvb/nlKjmlrDniYjmlK/ku5jpnIDkvKDlhaUnTUQ1J1xyXG4gICAgICAgICAgICAgIHBheVNpZ246IHBheWluZm8ucGF5U2lnbiwgLy8g5pSv5LuY562+5ZCNXHJcbiAgICAgICAgICAgICAgc3VjY2VzczogYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyDmlK/ku5jmiJDlip/lkI7nmoTlm57osIPlh73mlbBcclxuICAgICAgICAgICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgaWYodGhpcy5pc1JlY2hhcmdlUnVsZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZm8gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBvdXRfdHJhZGVfbm86IF90aGlzLnRyYWRlTm8sXHJcbiAgICAgICAgICAgICAgICAgICAgICBub25jZV9zdHI6IHBheWluZm8ubm9uY2VTdHIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb21wYW55OiB0aGlzLnd4anNzZGsuY29tcGFueSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9yZGVySWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGF5U2VydmVyLnVwZGF0ZUFjY291bnRMb2coaW5mbywgdGhpcy5vcmRlcklkKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3JkZXJUeXBlID09IFwicmVjaGFyZ2VcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50TG9nID0gYXdhaXQgdGhpcy5wYXlTZXJ2ZXIudXBkYXRlUmVjaGFyZ2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudExvZyEsXHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBfdGhpcy50b2FzdChcIuaUr+S7mOaIkOWKn1wiLCBcInN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICBfdGhpcy5wYXlSZXN1bHQuZW1pdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgY29kZTogMjAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHRyYWRlTm86IHRoaXMudHJhZGVObyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmNoZWNrcGF5LFxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBhbGVydCgn57y65bCRb3BlbmlkLOivt+mHjeaWsOeZu+W9lScpXHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydEN0cmwuY3JlYXRlKHtcclxuICAgICAgICAgIGhlYWRlcjogXCLmj5DnpLpcIixcclxuICAgICAgICAgIHN1YkhlYWRlcjogXCJcIixcclxuICAgICAgICAgIG1lc3NhZ2U6IFwi57y65bCRb3BlbmlkLOivt+WIt+aWsOmhtemdouaIlumHjeaWsOeZu+W9lVwiLFxyXG4gICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgcm9sZTogXCJva1wiLFxyXG4gICAgICAgICAgICAgIHRleHQ6IFwi56Gu6K6kXCIsXHJcbiAgICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYWxlcnQucHJlc2VudCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgbGV0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydEN0cmwuY3JlYXRlKHtcclxuICAgICAgICBoZWFkZXI6IFwi5byC5bi46ZSZ6K+vXCIsXHJcbiAgICAgICAgc3ViSGVhZGVyOiBcIlwiLFxyXG4gICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgcm9sZTogXCJva1wiLFxyXG4gICAgICAgICAgICB0ZXh0OiBcIuehruiupFwiLFxyXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7fSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSk7XHJcbiAgICAgIGFsZXJ0LnByZXNlbnQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyog5rWP6KeI5Zmo5LqM57u056CB5pSv5LuYICovXHJcbiAgYXN5bmMgd3hQYXkoKSB7XHJcbiAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICBjb21wYW55OiB0aGlzLnd4anNzZGsuY29tcGFueSxcclxuICAgICAgb3V0X3RyYWRlX25vOiB0aGlzLnRyYWRlTm8sXHJcbiAgICAgIHRvdGFsX2ZlZTogdGhpcy5wcmljZSxcclxuICAgICAgYm9keTogdGhpcy50aXRsZSxcclxuICAgIH07XHJcbiAgICBQYXJzZS5DbG91ZC5ydW4oXCJwYXlfY29kZTJcIiwgcGFyYW1zKVxyXG4gICAgICAudGhlbihhc3luYyAocmVzKSA9PiB7XHJcbiAgICAgICAgbGV0IG5vbmNlX3N0ciA9IHJlcy5ub25jZV9zdHI7XHJcbiAgICAgICAgdGhpcy5jb2RlTGluayA9IHJlcy5jb2RlX3VybFswXTtcclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNvZGVMaW5rKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNlcnRpZmljYXRlUGF5KCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVPcmRlcihub25jZV9zdHIpO1xyXG4gICAgICAgIC8vIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b2FzdChlcnIubWVzc2FnZSwgXCJkYW5nZXJcIik7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyog5pSv5LuY5a6d5pSv5LuYICovXHJcbiAgYXN5bmMgb3BlbkFsaXBheSgpIHtcclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHJldHVybjtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIGxldCBodG1sU3RyaW5nT3JVcmw6IGFueSA9IGF3YWl0IHRoaXMuZ2V0QWxpUGF5VXJsKCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGh0bWxTdHJpbmdPclVybCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuY2VydGlmaWNhdGVQYXkoKTtcclxuICAgICAgLy8gaWYgKHRoaXMuZGV2aWNlU2VyLmlzSU9TKSB7XHJcbiAgICAgIC8vICAgdGhpcy5zYWZhcmlWaWV3Q29udHJvbGxlclxyXG4gICAgICAvLyAgICAgLnNob3coe1xyXG4gICAgICAvLyAgICAgICB1cmw6IGh0bWxTdHJpbmdPclVybCxcclxuICAgICAgLy8gICAgICAgaGlkZGVuOiBmYWxzZSxcclxuICAgICAgLy8gICAgICAgYW5pbWF0ZWQ6IHRydWUsXHJcbiAgICAgIC8vICAgICAgIHRyYW5zaXRpb246IFwiY3VybFwiLFxyXG4gICAgICAvLyAgICAgfSlcclxuICAgICAgLy8gICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgIC8vICAgICAgIChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyAgICAgICAgIGlmIChyZXN1bHQuZXZlbnQgPT09IFwib3BlbmVkXCIpIHtcclxuICAgICAgLy8gICAgICAgICAgIGNvbnNvbGUubG9nKFwiT3BlbmVkXCIpO1xyXG4gICAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmV2ZW50ID09PSBcImxvYWRlZFwiKSB7XHJcbiAgICAgIC8vICAgICAgICAgICBjb25zb2xlLmxvZyhcIkxvYWRlZFwiKTtcclxuICAgICAgLy8gICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5ldmVudCA9PT0gXCJjbG9zZWRcIikge1xyXG4gICAgICAvLyAgICAgICAgICAgY29uc29sZS5sb2coXCJDbG9zZWRcIik7XHJcbiAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAvLyAgICAgICB9LFxyXG4gICAgICAvLyAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgLy8gICAgICAgfSxcclxuICAgICAgLy8gICAgICk7XHJcbiAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICB0ZW1wRGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmdPclVybDsgLy8g5YGH6K6+aHRtbFN0cmluZ+aYr+WujOaVtOeahEhUTUzlrZfnrKbkuLJcclxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSB0ZW1wRGl2LnF1ZXJ5U2VsZWN0b3IoXCJmb3JtXCIpO1xyXG4gICAgICBpZiAoZm9ybUVsZW1lbnQpIHtcclxuICAgICAgICAvLyDpmLvmraLpu5jorqTooYzkuLrvvIzpgb/lhY3pobXpnaLliLfmlrBcclxuICAgICAgICBmb3JtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyDmt7vliqDpmpDol4/nmoRpZnJhbWXmnaXmj5DkuqTooajljZVcclxuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgIGZvcm1FbGVtZW50LnRhcmdldCA9IGlmcmFtZS5uYW1lO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGZvcm1FbGVtZW50KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtRWxlbWVudCk7XHJcbiAgICAgICAgZm9ybUVsZW1lbnQuc3VibWl0KCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmb3JtRWxlbWVudCk7IC8vIOaPkOS6pOWQjuenu+mZpOihqOWNleWFg+e0oFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCLmnKrmib7liLDooajljZXlhYPntKBcIik7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5pSv5LuY57uT5p6c6L2u6K+iXCIpO1xyXG4gICAgICAgIGxldCBBY2NvdW50TG9nID0gbmV3IFBhcnNlLlF1ZXJ5KFwiQWNjb3VudExvZ1wiKTtcclxuICAgICAgICBBY2NvdW50TG9nLmVxdWFsVG8oXCJjb21wYW55XCIsIHRoaXMud3hqc3Nkay5jb21wYW55KTtcclxuICAgICAgICBBY2NvdW50TG9nLmVxdWFsVG8oXCJvcmRlck51bWJlclwiLCB0aGlzLnRyYWRlTm8pO1xyXG4gICAgICAgIEFjY291bnRMb2cuZXF1YWxUbyhcInBheVR5cGVcIiwgXCJhbGlwYXlcIik7XHJcbiAgICAgICAgQWNjb3VudExvZy5lcXVhbFRvKFwiaXNWZXJpZmllZFwiLCB0cnVlKTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgQWNjb3VudExvZy5maXJzdCgpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmlkKSB7XHJcbiAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xyXG4gICAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy50aW1lcikge1xyXG4gICAgICAgICAgLy/mlK/ku5jmiJDlip/ov5Tlm57nirbmgIFcclxuICAgICAgICAgIHRoaXMudG9hc3QoXCLmlK/ku5jmiJDlip9cIiwgXCJzdWNjZXNzXCIpO1xyXG4gICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucGF5UmVzdWx0LmVtaXQoe1xyXG4gICAgICAgICAgICBjb2RlOiAyMDAsXHJcbiAgICAgICAgICAgIHRyYWRlTm86IHRoaXMudHJhZGVObyxcclxuICAgICAgICAgICAgdHlwZTogdGhpcy5jaGVja3BheSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgbGV0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydEN0cmwuY3JlYXRlKHtcclxuICAgICAgICBoZWFkZXI6IFwi5byC5bi46ZSZ6K+vXCIsXHJcbiAgICAgICAgc3ViSGVhZGVyOiBcIlwiLFxyXG4gICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgcm9sZTogXCJva1wiLFxyXG4gICAgICAgICAgICB0ZXh0OiBcIuehruiupFwiLFxyXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7fSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSk7XHJcbiAgICAgIGFsZXJ0LnByZXNlbnQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8g6I635Y+W5pSv5LuY5a6d5pSv5LuYXHJcbiAgYXN5bmMgZ2V0QWxpUGF5VXJsKCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbGV0IGJlZm9yVVJMID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgY29tcGFueTogdGhpcy53eGpzc2RrLmNvbXBhbnksXHJcbiAgICAgICAgdHJhZGVObzogdGhpcy50cmFkZU5vLFxyXG4gICAgICAgIHByaWNlOiB0aGlzLnByaWNlLFxyXG4gICAgICAgIHRyYWRldHlwZTogXCJ3YXBcIixcclxuICAgICAgICBvcmRlclRpdGxlOiB0aGlzLnRpdGxlLFxyXG4gICAgICAgIHJldHVyblVybDogYmVmb3JVUkwsXHJcbiAgICAgICAgcmV0dXJuVHlwZTogXCJnZXRcIixcclxuICAgICAgICByZWNoYXJnZVJ1bGU6dGhpcy5pc1JlY2hhcmdlUnVsZVxyXG4gICAgICB9O1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgICAgLnBvc3QoXCJodHRwczovL3NlcnZlci5nZGNoYXQuY24vYXBpL2FsaXBheS9uZXdvcmRlclwiLCBwYXJhbXMpXHJcbiAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcihhc3luYyAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdChcIuaUr+S7mOWksei0pe+8mlwiICsgZXJyPy5lcnJvcj8ubWVzcywgXCJmYWlsXCIpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuY29kZSAhPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdChcIue9kee7nOmUmeivr++8jOivt+eojeWQjumHjeivlVwiLCBcIndhcm5pbmdcIik7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YSAmJiByZXMuZGF0YS5wYXlfdXJsKSB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXMuZGF0YS5wYXlfdXJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QoXCLnvZHnu5zplJnor6/vvIzor7fnqI3lkI7ph43or5VcIiwgXCJ3YXJuaW5nXCIpO1xyXG4gICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU9yZGVyKG5vbmNlX3N0cjogc3RyaW5nKSB7XHJcbiAgICAvLyDlrprml7bmn6Xor6LorqLljZXmlK/ku5jnirbmgIFcclxuICAgIGxldCB0aGF0ID0gdGhpcztcclxuICAgIHRoYXQudGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIGxldCBpbmZvID0ge1xyXG4gICAgICAgIG91dF90cmFkZV9ubzogdGhhdC50cmFkZU5vLFxyXG4gICAgICAgIG5vbmNlX3N0cjogbm9uY2Vfc3RyLFxyXG4gICAgICAgIGNvbXBhbnk6IHRoaXMud3hqc3Nkay5jb21wYW55LFxyXG4gICAgICB9O1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhpbmZvKTtcclxuICAgICAgUGFyc2UuQ2xvdWQucnVuKFwib3JkZXJfc3RhdHVzMlwiLCBpbmZvKVxyXG4gICAgICAgIC50aGVuKGFzeW5jIChyZXMpID0+IHtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlcyk7XHJcbiAgICAgICAgICBpZiAocmVzLnN0YXR1cyAmJiByZXMuc3RhdHVzWzBdID09IFwiU1VDQ0VTU1wiKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhhdC50aW1lcik7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNSZWNoYXJnZVJ1bGUpe1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9yZGVySWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGF5U2VydmVyLnVwZGF0ZUFjY291bnRMb2coaW5mbywgdGhpcy5vcmRlcklkKTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3JkZXJUeXBlID09IFwicmVjaGFyZ2VcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50TG9nID0gYXdhaXQgdGhpcy5wYXlTZXJ2ZXIudXBkYXRlUmVjaGFyZ2UoXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudExvZyEsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGF0LnRvYXN0KFwi5pSv5LuY5oiQ5YqfXCIsIFwic3VjY2Vzc1wiKTtcclxuICAgICAgICAgICAgdGhhdC5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhhdC5wYXlSZXN1bHQuZW1pdCh7XHJcbiAgICAgICAgICAgICAgY29kZTogMjAwLFxyXG4gICAgICAgICAgICAgIHRyYWRlTm86IHRoaXMudHJhZGVObyxcclxuICAgICAgICAgICAgICB0eXBlOiB0aGlzLmNoZWNrcGF5LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7fSk7XHJcbiAgICB9LCAzMDAwKTtcclxuICB9XHJcblxyXG4gIC8vIOaUr+S7mOWJjeeVmeWtmOmihOiuouWNlVxyXG4gIGFzeW5jIGNlcnRpZmljYXRlUGF5KCkge1xyXG4gICAgYXdhaXQgdGhpcy5wYXlTZXJ2ZXIuY3JlYXRlZEFjY291bnRMb2coe1xyXG4gICAgICBjb21wYW55OiB0aGlzLnd4anNzZGsuY29tcGFueSxcclxuICAgICAgb3JkZXJJZDogdGhpcy5vcmRlcklkLFxyXG4gICAgICB0cmFkZU5vOiB0aGlzLnRyYWRlTm8sXHJcbiAgICAgIHByaWNlOiB0aGlzLnByaWNlLFxyXG4gICAgICBwYXlUeXBlOiB0aGlzLmNoZWNrcGF5LFxyXG4gICAgICBvcmRlclR5cGU6IHRoaXMub3JkZXJUeXBlXHJcbiAgICB9KVxyXG4gICAgaWYoIXRoaXMuaXNSZWNoYXJnZVJ1bGUpIHJldHVyblxyXG4gICAgaWYgKHRoaXMub3JkZXJUeXBlID09IFwidmlwXCIgJiYgIXRoaXMub3JkZXJJZCAmJiB0aGlzLmdpZCkge1xyXG4gICAgICBsZXQgcmVzdWx0ZSA9IGF3YWl0IHRoaXMucGF5U2VydmVyLnNldE9yZGVyKHtcclxuICAgICAgICB0eXBlOiBcInNlcnZpY2VcIiwgLy/liJvlu7rmnI3liqHnsbvorqLljZVcclxuICAgICAgICBnaWQ6IHRoaXMuZ2lkLFxyXG4gICAgICAgIHByaWNlOiB0aGlzLnByaWNlLFxyXG4gICAgICAgIHRvdGFsX2ZlZTogdGhpcy5wcmljZSxcclxuICAgICAgICB0cmFkZU5vOiB0aGlzLnRyYWRlTm8hLFxyXG4gICAgICAgIG91dF90cmFkZV9ubzogdGhpcy50cmFkZU5vISxcclxuICAgICAgICBwYXlUeXBlOiB0aGlzLmNoZWNrcGF5LFxyXG4gICAgICAgIGNvZGU6dGhpcy5jb2RlTGlua1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc29sZS5sb2cocmVzdWx0ZSk7XHJcbiAgICAgIGlmIChyZXN1bHRlPy5vYmplY3RJZCkge1xyXG4gICAgICAgIHRoaXMub3JkZXJJZCA9IHJlc3VsdGUub2JqZWN0SWQ7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5vcmRlclR5cGUgPT0gXCJyZWNoYXJnZVwiKSB7XHJcbiAgICAgIHRoaXMuYWNjb3VudExvZyA9IGF3YWl0IHRoaXMucGF5U2VydmVyLmNyZWF0ZFJlY2hhcmdlTG9nKHtcclxuICAgICAgICB0cmFkZU5vOiB0aGlzLnRyYWRlTm8hLFxyXG4gICAgICAgIHBheVR5cGU6IHRoaXMuY2hlY2twYXksXHJcbiAgICAgICAgcHJpY2U6IHRoaXMucHJpY2UsXHJcbiAgICAgICAgY3JlZGl0OiB0aGlzLmNyZWRpdCEsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKiDlhbPpl63mlK/ku5jlvLnnqpcgKi9cclxuICBvbkNsb3NlKCkge1xyXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHtcclxuICAgICAgY29kZTogMCxcclxuICAgICAgdHJhZGVObzogdGhpcy50cmFkZU5vLFxyXG4gICAgICB0eXBlOiB0aGlzLmNoZWNrcGF5LFxyXG4gICAgfTtcclxuICAgIHRoaXMucGF5UmVzdWx0LmVtaXQocmVzdWx0KTtcclxuICB9XHJcbiAgdG9hc3QodGV4dDogc3RyaW5nLCB0eXBlPzogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB0b2FzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgIGNvbnN0IGNvbG9yID0gdHlwZSA/PyBcIndhcm5pbmdcIjtcclxuXHJcbiAgICAvLyDpopzoibLphY3nva5cclxuICAgIGNvbnN0IGNvbG9yQ29uZmlnID0ge1xyXG4gICAgICBzdWNjZXNzOiB7IGJnOiBcIiMxMGRjNjBcIiwgdGV4dDogXCIjZmZmXCIgfSxcclxuICAgICAgZGFuZ2VyOiB7IGJnOiBcIiNmMDQxNDFcIiwgdGV4dDogXCIjZmZmXCIgfSxcclxuICAgICAgZmFpbDogeyBiZzogXCIjZjA0MTQxXCIsIHRleHQ6IFwiI2ZmZlwiIH0sXHJcbiAgICAgIHdhcm5pbmc6IHsgYmc6IFwiI2ZmY2UwMFwiLCB0ZXh0OiBcIiMwMDBcIiB9LFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyDlupTnlKjmoLflvI9cclxuICAgIE9iamVjdC5hc3NpZ24odG9hc3RFbC5zdHlsZSwge1xyXG4gICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxyXG4gICAgICBib3R0b206IFwiMjBweFwiLFxyXG4gICAgICBsZWZ0OiBcIjUwJVwiLFxyXG4gICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWCgtNTAlKVwiLFxyXG4gICAgICBwYWRkaW5nOiBcIjEycHggMjBweFwiLFxyXG4gICAgICBib3JkZXJSYWRpdXM6IFwiNHB4XCIsXHJcbiAgICAgIHpJbmRleDogXCI5OTk5XCIsXHJcbiAgICAgIGZvbnRTaXplOiBcIjE0cHhcIixcclxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxyXG4gICAgICBtaW5XaWR0aDogXCIyMDBweFwiLFxyXG4gICAgICBib3hTaGFkb3c6IFwiMCAzcHggNXB4IHJnYmEoMCwwLDAsMC4yKVwiLFxyXG4gICAgICBvcGFjaXR5OiBcIjBcIixcclxuICAgICAgdHJhbnNpdGlvbjogXCJvcGFjaXR5IDAuM3MgZWFzZS1pbi1vdXRcIixcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBjb2xvckNvbmZpZ1tjb2xvcl0/LmJnIHx8IGNvbG9yQ29uZmlnLndhcm5pbmcuYmcsXHJcbiAgICAgIGNvbG9yOiBjb2xvckNvbmZpZ1tjb2xvcl0/LnRleHQgfHwgY29sb3JDb25maWcud2FybmluZy50ZXh0LFxyXG4gICAgfSk7XHJcblxyXG4gICAgdG9hc3RFbC50ZXh0Q29udGVudCA9IHRleHQ7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvYXN0RWwpO1xyXG5cclxuICAgIC8vIOaYvuekuuWSjOiHquWKqOenu+mZpFxyXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgdG9hc3RFbC5zdHlsZS5vcGFjaXR5ID0gXCIxXCI7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRvYXN0RWwuc3R5bGUub3BhY2l0eSA9IFwiMFwiO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0b2FzdEVsKSwgMzAwKTtcclxuICAgICAgfSwgMTUwMCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGltZXIgJiYgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcclxuICB9XHJcbn1cclxuIiwiQGlmIChpc09wZW4pIHtcclxuICA8ZGl2IGNsYXNzPVwicGF5bWVudC1vdmVybGF5XCI+XHJcbiAgICA8IS0tIOWFqOWxgCBMb2FkaW5nIC0tPlxyXG4gICAgQGlmIChpc0xvYWRpbmcpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImdsb2JhbC1sb2FkaW5nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXRleHRcIj7lpITnkIbkuK0uLi48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInBheW1lbnQtYm94XCIgW2NsYXNzLmJsdXItZWZmZWN0XT1cImlzTG9hZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGF5LWJveFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZS1idG5cIiAoY2xpY2spPVwiIWlzTG9hZGluZyAmJiBvbkNsb3NlKClcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xvc2UtaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBAaWYgKCFjb2RlTGluaykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBheS10aXRsZVwiPuaUr+S7mOiuouWNlTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBheS1udW1cIj7vv6V7eyBwcmljZSB8fCAwIH19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiPlxyXG4gICAgICAgICAgICBAaWYgKHNob3dUeXBlcy5pbmNsdWRlcyhcInd4cGF5XCIpKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIChjbGljayk9XCJvbmNoYW5nUGF5KCd3eHBheScpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgIHNyYz1cImh0dHBzOi8vZmlsZS1jbG91ZC5mbW9kZS5jbi9FNEtwR3ZURXRvLzIwMjMxMTIzL3Mxc3VuODA2MTAwMDAwNy5wbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIuW+ruS/oeaUr+S7mFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uXCJcclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHRcIj7lvq7kv6HmlK/ku5g8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrXCIgW2NsYXNzLmNoZWNrLWFjdGl2ZV09XCJjaGVja3BheSA9PT0gJ3d4cGF5J1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBpZiAoc2hvd1R5cGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBpZiAoc2hvd1R5cGVzLmluY2x1ZGVzKFwiYWxpcGF5XCIpKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIChjbGljayk9XCJvbmNoYW5nUGF5KCdhbGlwYXknKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL2ZpbGUtY2xvdWQuZm1vZGUuY24vc3RvcmFnZS9jb21wYW55L0U0S3BHdlRFdG8vMjAyNTA4MTUvMTEwOTM0MTY2LnBuZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwi5pSv5LuY5a6dXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb25cIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dFwiPuaUr+S7mOWunTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tcIiBbY2xhc3MuY2hlY2stYWN0aXZlXT1cImNoZWNrcGF5ID09PSAnYWxpcGF5J1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXktZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcmRlci1udW1cIj7orqLljZXnvJblj7fvvJp7eyB0cmFkZU5vID8gdHJhZGVObyA6IFwiLVwiIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInBheS1idG5cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCIhaXNMb2FkaW5nICYmIHVzZXJQYXltZW50KClcIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0xvYWRpbmcgfHwgIWNoZWNrcGF5XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIOWOu+S7mOasvlxyXG4gICAgICAgICAgICAgIEBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1sb2FkaW5nXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxcmNvZGUtc2VjdGlvblwiPlxyXG4gICAgICAgICAgICA8cXItY29kZSBbdmFsdWVdPVwiY29kZUxpbmtcIiB2YWx1ZT1cIuivt+S9v+eUqOaJi+acuuaJq+aPj+S6jOe7tOeggeWujOaIkOaUr+S7mFwiIFtzaXplXT1cIjE4MFwiPjwvcXItY29kZT5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJxcmNvZGUtdGlwXCI+6K+35L2/55So5omL5py65omr5o+P5LqM57u056CB5a6M5oiQ5pSv5LuYPC9wPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG59XHJcbiJdfQ==
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/payment/payment/payment.component.mjs
7
+ */
8
+ import{Component,EventEmitter,Input,Output}from"@angular/core";import{catchError}from"rxjs/operators";import{ActivatedRoute}from"@angular/router";import{HttpClient}from"@angular/common/http";import{CommonModule}from"@angular/common";import{WechatJssdkService}from"../../social/wechat/wechat-jssdk.service";import{PaymentService}from"../../payment/payment.service";import{QrCodeModule}from"ng-qrcode";import{AlertController}from"@ionic/angular/standalone";import{FmodeParse}from"@fmode/parse";import*as i0 from"@angular/core";import*as i1 from"../../social/wechat/wechat-jssdk.service";import*as i2 from"@angular/common/http";import*as i3 from"@angular/router";import*as i4 from"../../payment/payment.service";import*as i5 from"@ionic/angular/standalone";import*as i6 from"ng-qrcode";const Parse=FmodeParse.with("nova");export class PaymentComponent{constructor(e,t,i,o,a){this.wxjssdk=e,this.http=t,this.activRoute=i,this.payServer=o,this.alertCtrl=a,this.price=0,this.title="支付订单",this.showTypes=["wxpay","alipay"],this.orderType="goods",this.isRechargeRule=!1,this.credit=0,this.payResult=new EventEmitter,this.isOpen=!0,this.checkpay=this.showTypes[0]||"",this.user=Parse.User.current(),this.isLoading=!1,this.isDisabled=!1}ngOnInit(){this.activRoute.paramMap.subscribe((async e=>{let t=navigator.userAgent.toLowerCase();console.log(t),-1!=t.indexOf("micromessenger")?(this.userAgent="weixin",await this.wxjssdk.initUserOpenid(),this.wxjssdk.setCurrentPageShareInfo()):-1==t.indexOf("windows")&&-1==t.indexOf("Macintosh")||(this.userAgent="pc")}))}onchangPay(e){this.checkpay=e,console.log(e)}async userPayment(){if(!this.isLoading&&this.checkpay){if(this.tradeNo||(this.tradeNo=this.payServer.setTradeNo()),this.isRechargeRule&&this.tradeNo&&(this.orderId=await this.payServer.getOrder(this.tradeNo),("vip"==this.orderType&&!this.orderId||"recharge"==this.orderType&&(!this.accountLog?.id||this.accountLog?.get("isVerified")))&&(this.tradeNo=this.payServer.setTradeNo())),console.log(this.tradeNo),0==this.price)return this.toast("支付成功","success"),this.isOpen=!1,this.payResult.emit({code:200,tradeNo:this.tradeNo,type:this.checkpay}),void(this.tradeNo=null);switch(this.checkpay){case"wxpay":this.openWxPay();break;case"alipay":this.openAlipay()}}}async openWxPay(){-1!=navigator.userAgent.toLowerCase().indexOf("micromessenger")?this.wxPayH5():this.wxPay()}async wxPayH5(){if(!this.isDisabled)try{this.isDisabled=!0;let e=Parse.User.current()?.get("wechat"),t=localStorage.getItem("openid")||e[this.wxjssdk.wechatAccountId]?.openid;if(t){let e={company:this.wxjssdk.company,body:this.title,out_trade_no:this.tradeNo,total_fee:+this.price,openid:t,appid:this.wxjssdk.wechatAccountId},i=this;this.http.post("https://server.gdchat.cn/api/wxpay/neworder",e).pipe(catchError((async e=>{console.error(e),this.isDisabled=!1,this.isLoading=!1,this.toast("支付失败:"+e?.error?.mess,"fail")}))).subscribe((async e=>{await this.certificatePay();let t=e;wx.chooseWXPay({timestamp:t.timeStamp,nonceStr:t.nonceStr,package:t.package,signType:"MD5",paySign:t.paySign,success:async e=>{if(e){if(this.isRechargeRule){let e={out_trade_no:i.tradeNo,nonce_str:t.nonceStr,company:this.wxjssdk.company};this.orderId?this.payServer.updateAccountLog(e,this.orderId):"recharge"==this.orderType&&(this.accountLog=await this.payServer.updateRecharge(this.accountLog))}i.toast("支付成功","success"),i.isOpen=!1,i.payResult.emit({code:200,tradeNo:this.tradeNo,type:this.checkpay})}}}),this.isDisabled=!1}))}else{this.isDisabled=!1,(await this.alertCtrl.create({header:"提示",subHeader:"",message:"缺少openid,请刷新页面或重新登录",buttons:[{role:"ok",text:"确认",handler:()=>{location.reload()}}]})).present()}}catch(e){this.isDisabled=!1,(await this.alertCtrl.create({header:"异常错误",subHeader:"",message:e.message,buttons:[{role:"ok",text:"确认",handler:()=>{}}]})).present()}}async wxPay(){let e={company:this.wxjssdk.company,out_trade_no:this.tradeNo,total_fee:this.price,body:this.title};Parse.Cloud.run("pay_code2",e).then((async e=>{let t=e.nonce_str;this.codeLink=e.code_url[0],console.log(this.codeLink),await this.certificatePay(),this.updateOrder(t)})).catch((e=>{this.isDisabled=!1,this.toast(e.message,"danger")}))}async openAlipay(){if(!this.isDisabled){this.isLoading=!0;try{this.isDisabled=!0;let e=await this.getAliPayUrl();console.log(e),await this.certificatePay();const t=document.createElement("div");t.innerHTML=e;const i=t.querySelector("form");if(i){i.addEventListener("submit",(e=>{e.preventDefault()}));const e=document.createElement("iframe");e.style.display="none",document.body.appendChild(e),i.target=e.name,console.log(i),document.body.appendChild(i),i.submit(),document.body.removeChild(i)}else console.error("未找到表单元素"),this.isLoading=!1;this.timer=setInterval((async()=>{console.log("支付结果轮询");let e=new Parse.Query("AccountLog");e.equalTo("company",this.wxjssdk.company),e.equalTo("orderNumber",this.tradeNo),e.equalTo("payType","alipay"),e.equalTo("isVerified",!0);let t=await e.first();this.isLoading=!1,t&&t.id&&(clearInterval(this.timer),this.timer=null),this.timer||(this.toast("支付成功","success"),this.isOpen=!1,this.payResult.emit({code:200,tradeNo:this.tradeNo,type:this.checkpay}))}),1e3)}catch(e){this.isLoading=!1,this.isDisabled=!1,(await this.alertCtrl.create({header:"异常错误",subHeader:"",message:e.message,buttons:[{role:"ok",text:"确认",handler:()=>{}}]})).present()}}}async getAliPayUrl(){return new Promise(((e,t)=>{let i=window.location.href,o={company:this.wxjssdk.company,tradeNo:this.tradeNo,price:this.price,tradetype:"wap",orderTitle:this.title,returnUrl:i,returnType:"get",rechargeRule:this.isRechargeRule};try{this.http.post("https://server.gdchat.cn/api/alipay/neworder",o).pipe(catchError((async e=>{console.error(e),this.isDisabled=!1,this.isLoading=!1,this.toast("支付失败:"+e?.error?.mess,"fail")}))).subscribe((t=>{200===t.code?t.data&&t.data.pay_url&&e(t.data.pay_url):this.toast("网络错误,请稍后重试","warning")}))}catch(e){e&&(this.toast("网络错误,请稍后重试","warning"),t(e))}}))}updateOrder(e){let t=this;t.timer=setInterval((()=>{let i={out_trade_no:t.tradeNo,nonce_str:e,company:this.wxjssdk.company};Parse.Cloud.run("order_status2",i).then((async e=>{e.status&&"SUCCESS"==e.status[0]&&(clearInterval(t.timer),this.isRechargeRule&&(this.orderId?this.payServer.updateAccountLog(i,this.orderId):"recharge"==this.orderType&&(this.accountLog=await this.payServer.updateRecharge(this.accountLog))),t.toast("支付成功","success"),t.isOpen=!1,t.payResult.emit({code:200,tradeNo:this.tradeNo,type:this.checkpay}))})).catch((e=>{}))}),3e3)}async certificatePay(){if(await this.payServer.createdAccountLog({company:this.wxjssdk.company,orderId:this.orderId,tradeNo:this.tradeNo,price:this.price,payType:this.checkpay,orderType:this.orderType}),this.isRechargeRule)if("vip"==this.orderType&&!this.orderId&&this.gid){let e=await this.payServer.setOrder({type:"service",gid:this.gid,price:this.price,total_fee:this.price,tradeNo:this.tradeNo,out_trade_no:this.tradeNo,payType:this.checkpay,code:this.codeLink});console.log(e),e?.objectId&&(this.orderId=e.objectId)}else"recharge"==this.orderType&&(this.accountLog=await this.payServer.creatdRechargeLog({tradeNo:this.tradeNo,payType:this.checkpay,price:this.price,credit:this.credit}))}onClose(){this.isOpen=!1;const e={code:0,tradeNo:this.tradeNo,type:this.checkpay};this.payResult.emit(e)}toast(e,t){const i=document.createElement("div"),o=t??"warning",a={success:{bg:"#10dc60",text:"#fff"},danger:{bg:"#f04141",text:"#fff"},fail:{bg:"#f04141",text:"#fff"},warning:{bg:"#ffce00",text:"#000"}};Object.assign(i.style,{position:"fixed",bottom:"20px",left:"50%",transform:"translateX(-50%)",padding:"12px 20px",borderRadius:"4px",zIndex:"9999",fontSize:"14px",textAlign:"center",minWidth:"200px",boxShadow:"0 3px 5px rgba(0,0,0,0.2)",opacity:"0",transition:"opacity 0.3s ease-in-out",backgroundColor:a[o]?.bg||a.warning.bg,color:a[o]?.text||a.warning.text}),i.textContent=e,document.body.appendChild(i),requestAnimationFrame((()=>{i.style.opacity="1",setTimeout((()=>{i.style.opacity="0",setTimeout((()=>document.body.removeChild(i)),300)}),1500)}))}ngOnDestroy(){this.timer&&clearInterval(this.timer)}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:PaymentComponent,deps:[{token:i1.WechatJssdkService},{token:i2.HttpClient},{token:i3.ActivatedRoute},{token:i4.PaymentService},{token:i5.AlertController}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:PaymentComponent,isStandalone:!0,selector:"fm-payment",inputs:{price:"price",tradeNo:"tradeNo",title:"title",showTypes:"showTypes",orderType:"orderType",isRechargeRule:"isRechargeRule",credit:"credit",gid:"gid",orderId:"orderId",isOpen:"isOpen"},outputs:{payResult:"payResult"},ngImport:i0,template:'@if (isOpen) {\n <div class="payment-overlay">\n \x3c!-- 全局 Loading --\x3e\n @if (isLoading) {\n <div class="global-loading">\n <div class="loading-spinner"></div>\n <div class="loading-text">处理中...</div>\n </div>\n }\n\n <div class="payment-box" [class.blur-effect]="isLoading">\n <div class="pay-box">\n <div class="close-btn" (click)="!isLoading && onClose()">\n <span class="close-icon"></span>\n </div>\n @if (!codeLink) {\n <div class="pay-title">支付订单</div>\n <div class="pay-num">¥{{ price || 0 }}</div>\n <div class="options">\n @if (showTypes.includes("wxpay")) {\n <div class="row" (click)="onchangPay(\'wxpay\')">\n <div class="label">\n <img\n src="https://file-cloud.fmode.cn/E4KpGvTEto/20231123/s1sun8061000007.png"\n alt="微信支付"\n class="icon"\n />\n <div class="text">微信支付</div>\n </div>\n <div class="check" [class.check-active]="checkpay === \'wxpay\'">\n <div class="checkbox"></div>\n </div>\n </div>\n }\n @if (showTypes.length > 1) {\n <div class="divider"></div>\n }\n @if (showTypes.includes("alipay")) {\n <div class="row" (click)="onchangPay(\'alipay\')">\n <div class="label">\n <img\n src="https://file-cloud.fmode.cn/storage/company/E4KpGvTEto/20250815/110934166.png"\n alt="支付宝"\n class="icon"\n />\n <div class="text">支付宝</div>\n </div>\n <div class="check" [class.check-active]="checkpay === \'alipay\'">\n <div class="checkbox"></div>\n </div>\n </div>\n }\n </div>\n <div class="pay-footer">\n <div class="order-num">订单编号:{{ tradeNo ? tradeNo : "-" }}</div>\n <div\n class="pay-btn"\n (click)="!isLoading && userPayment()"\n [class.disabled]="isLoading || !checkpay"\n >\n 去付款\n @if (isLoading) {\n <span class="btn-loading"></span>\n }\n </div>\n </div>\n } @else {\n <div class="qrcode-section">\n <qr-code [value]="codeLink" value="请使用手机扫描二维码完成支付" [size]="180"></qr-code>\n <p class="qrcode-tip">请使用手机扫描二维码完成支付</p>\n </div>\n }\n </div>\n </div>\n </div>\n}\n',styles:['@charset "UTF-8";.global-loading{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1001;background:#ffffffe6;padding:20px 30px;border-radius:8px;box-shadow:0 2px 10px #0000001a;display:flex;flex-direction:column;align-items:center}.global-loading .loading-spinner{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #1890ff;border-radius:50%;animation:spin 1s linear infinite;margin-bottom:10px}.global-loading .loading-text{color:#333;font-size:14px}.blur-effect{filter:blur(2px);pointer-events:none}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.payment-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000;animation:fadeIn .3s ease}.payment-box{width:90%;max-width:400px;background:#fff;border-radius:12px;box-shadow:0 4px 20px #00000026;animation:slideUp .3s ease;overflow:hidden}.pay-box{padding:20px;position:relative}.pay-box .close{position:absolute;right:16px;top:16px;font-size:24px;color:#999;cursor:pointer;transition:color .2s;padding:8px}.pay-box .close:hover{color:#666}.pay-box .pay-title{text-align:center;font-size:18px;font-weight:600;color:#333;margin-bottom:8px}.pay-box .pay-num{text-align:center;font-size:28px;color:#1890ff;margin:12px auto;font-weight:700}.pay-box .options{margin:20px 0}.pay-box .options .row{display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:background-color .2s;border-radius:8px;padding:12px}.pay-box .options .row:hover{background-color:#f9f9f9}.pay-box .options .row .label{display:flex;align-items:center}.pay-box .options .row .label img{width:32px;height:32px;object-fit:contain}.pay-box .options .row .label .text{font-size:16px;margin-left:12px;color:#333}.pay-box .options .row .check{border:2px solid #ddd;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;transition:all .2s}.pay-box .options .row .check .checkbox{width:12px;height:12px;border-radius:50%;background:transparent;transition:background .2s}.pay-box .options .row .check-active{border-color:#1890ff}.pay-box .options .row .check-active .checkbox{background:#1890ff}.pay-box .options .divider{margin:8px 0;height:1px;background:#eee}.pay-box .pay-footer{display:flex;flex-direction:column;align-items:center;margin-top:20px}.pay-box .pay-footer .order-num{color:#999;font-size:14px;margin-bottom:16px}.pay-box .pay-footer .pay-btn{padding:12px 0;width:100%;color:#fff;text-align:center;background:#1890ff;border-radius:8px;font-size:16px;font-weight:500;cursor:pointer;transition:background .2s;border:none;position:relative}.pay-box .pay-footer .pay-btn:hover,.pay-box .pay-footer .pay-btn:active{background:#1166b5}.pay-box .pay-footer .pay-btn.disabled{background:#ccc!important;cursor:not-allowed}.pay-box .pay-footer .pay-btn .btn-loading{display:inline-block;width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top:2px solid white;border-radius:50%;animation:spin .8s linear infinite;margin-left:8px;vertical-align:middle}.pay-box .qrcode{display:flex;justify-content:center;align-items:center;padding:20px}.pay-box .qrcode img{max-width:100%;height:auto;border:1px solid #eee;border-radius:8px}.pay-box .qrcode-section{text-align:center;margin:20px 0;padding:15px}.pay-box .qrcode-section .qrcode-image{max-width:200px;height:auto;border:1px solid #ddd;padding:10px;background:#fff}.pay-box .qrcode-section .qrcode-tip{margin-top:10px;font-size:14px;color:#666}.close-btn{position:absolute;right:16px;top:16px;width:40px;height:40px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:background-color .2s ease;z-index:1}.close-btn:hover{background-color:#0000000d}.close-btn:active{background-color:#0000001a}.close-icon{position:relative;width:20px;height:20px}.close-icon:before,.close-icon:after{content:"";position:absolute;top:50%;left:50%;width:100%;height:2px;background-color:#666;border-radius:1px}.close-icon:before{transform:translate(-50%,-50%) rotate(45deg)}.close-icon:after{transform:translate(-50%,-50%) rotate(-45deg)}.close-btn.disabled{pointer-events:none;opacity:.5}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}\n'],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"ngmodule",type:QrCodeModule},{kind:"component",type:i6.QrCodeComponent,selector:"qr-code",inputs:["value","size","darkColor","lightColor","errorCorrectionLevel","centerImageSrc","centerImageSize","margin"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:PaymentComponent,decorators:[{type:Component,args:[{selector:"fm-payment",standalone:!0,imports:[CommonModule,QrCodeModule],template:'@if (isOpen) {\n <div class="payment-overlay">\n \x3c!-- 全局 Loading --\x3e\n @if (isLoading) {\n <div class="global-loading">\n <div class="loading-spinner"></div>\n <div class="loading-text">处理中...</div>\n </div>\n }\n\n <div class="payment-box" [class.blur-effect]="isLoading">\n <div class="pay-box">\n <div class="close-btn" (click)="!isLoading && onClose()">\n <span class="close-icon"></span>\n </div>\n @if (!codeLink) {\n <div class="pay-title">支付订单</div>\n <div class="pay-num">¥{{ price || 0 }}</div>\n <div class="options">\n @if (showTypes.includes("wxpay")) {\n <div class="row" (click)="onchangPay(\'wxpay\')">\n <div class="label">\n <img\n src="https://file-cloud.fmode.cn/E4KpGvTEto/20231123/s1sun8061000007.png"\n alt="微信支付"\n class="icon"\n />\n <div class="text">微信支付</div>\n </div>\n <div class="check" [class.check-active]="checkpay === \'wxpay\'">\n <div class="checkbox"></div>\n </div>\n </div>\n }\n @if (showTypes.length > 1) {\n <div class="divider"></div>\n }\n @if (showTypes.includes("alipay")) {\n <div class="row" (click)="onchangPay(\'alipay\')">\n <div class="label">\n <img\n src="https://file-cloud.fmode.cn/storage/company/E4KpGvTEto/20250815/110934166.png"\n alt="支付宝"\n class="icon"\n />\n <div class="text">支付宝</div>\n </div>\n <div class="check" [class.check-active]="checkpay === \'alipay\'">\n <div class="checkbox"></div>\n </div>\n </div>\n }\n </div>\n <div class="pay-footer">\n <div class="order-num">订单编号:{{ tradeNo ? tradeNo : "-" }}</div>\n <div\n class="pay-btn"\n (click)="!isLoading && userPayment()"\n [class.disabled]="isLoading || !checkpay"\n >\n 去付款\n @if (isLoading) {\n <span class="btn-loading"></span>\n }\n </div>\n </div>\n } @else {\n <div class="qrcode-section">\n <qr-code [value]="codeLink" value="请使用手机扫描二维码完成支付" [size]="180"></qr-code>\n <p class="qrcode-tip">请使用手机扫描二维码完成支付</p>\n </div>\n }\n </div>\n </div>\n </div>\n}\n',styles:['@charset "UTF-8";.global-loading{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1001;background:#ffffffe6;padding:20px 30px;border-radius:8px;box-shadow:0 2px 10px #0000001a;display:flex;flex-direction:column;align-items:center}.global-loading .loading-spinner{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #1890ff;border-radius:50%;animation:spin 1s linear infinite;margin-bottom:10px}.global-loading .loading-text{color:#333;font-size:14px}.blur-effect{filter:blur(2px);pointer-events:none}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.payment-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000;animation:fadeIn .3s ease}.payment-box{width:90%;max-width:400px;background:#fff;border-radius:12px;box-shadow:0 4px 20px #00000026;animation:slideUp .3s ease;overflow:hidden}.pay-box{padding:20px;position:relative}.pay-box .close{position:absolute;right:16px;top:16px;font-size:24px;color:#999;cursor:pointer;transition:color .2s;padding:8px}.pay-box .close:hover{color:#666}.pay-box .pay-title{text-align:center;font-size:18px;font-weight:600;color:#333;margin-bottom:8px}.pay-box .pay-num{text-align:center;font-size:28px;color:#1890ff;margin:12px auto;font-weight:700}.pay-box .options{margin:20px 0}.pay-box .options .row{display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:background-color .2s;border-radius:8px;padding:12px}.pay-box .options .row:hover{background-color:#f9f9f9}.pay-box .options .row .label{display:flex;align-items:center}.pay-box .options .row .label img{width:32px;height:32px;object-fit:contain}.pay-box .options .row .label .text{font-size:16px;margin-left:12px;color:#333}.pay-box .options .row .check{border:2px solid #ddd;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;transition:all .2s}.pay-box .options .row .check .checkbox{width:12px;height:12px;border-radius:50%;background:transparent;transition:background .2s}.pay-box .options .row .check-active{border-color:#1890ff}.pay-box .options .row .check-active .checkbox{background:#1890ff}.pay-box .options .divider{margin:8px 0;height:1px;background:#eee}.pay-box .pay-footer{display:flex;flex-direction:column;align-items:center;margin-top:20px}.pay-box .pay-footer .order-num{color:#999;font-size:14px;margin-bottom:16px}.pay-box .pay-footer .pay-btn{padding:12px 0;width:100%;color:#fff;text-align:center;background:#1890ff;border-radius:8px;font-size:16px;font-weight:500;cursor:pointer;transition:background .2s;border:none;position:relative}.pay-box .pay-footer .pay-btn:hover,.pay-box .pay-footer .pay-btn:active{background:#1166b5}.pay-box .pay-footer .pay-btn.disabled{background:#ccc!important;cursor:not-allowed}.pay-box .pay-footer .pay-btn .btn-loading{display:inline-block;width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top:2px solid white;border-radius:50%;animation:spin .8s linear infinite;margin-left:8px;vertical-align:middle}.pay-box .qrcode{display:flex;justify-content:center;align-items:center;padding:20px}.pay-box .qrcode img{max-width:100%;height:auto;border:1px solid #eee;border-radius:8px}.pay-box .qrcode-section{text-align:center;margin:20px 0;padding:15px}.pay-box .qrcode-section .qrcode-image{max-width:200px;height:auto;border:1px solid #ddd;padding:10px;background:#fff}.pay-box .qrcode-section .qrcode-tip{margin-top:10px;font-size:14px;color:#666}.close-btn{position:absolute;right:16px;top:16px;width:40px;height:40px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:background-color .2s ease;z-index:1}.close-btn:hover{background-color:#0000000d}.close-btn:active{background-color:#0000001a}.close-icon{position:relative;width:20px;height:20px}.close-icon:before,.close-icon:after{content:"";position:absolute;top:50%;left:50%;width:100%;height:2px;background-color:#666;border-radius:1px}.close-icon:before{transform:translate(-50%,-50%) rotate(45deg)}.close-icon:after{transform:translate(-50%,-50%) rotate(-45deg)}.close-btn.disabled{pointer-events:none;opacity:.5}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}\n']}]}],ctorParameters:()=>[{type:i1.WechatJssdkService},{type:i2.HttpClient},{type:i3.ActivatedRoute},{type:i4.PaymentService},{type:i5.AlertController}],propDecorators:{price:[{type:Input,args:["price"]}],tradeNo:[{type:Input,args:["tradeNo"]}],title:[{type:Input,args:["title"]}],showTypes:[{type:Input,args:["showTypes"]}],orderType:[{type:Input,args:["orderType"]}],isRechargeRule:[{type:Input,args:["isRechargeRule"]}],credit:[{type:Input,args:["credit"]}],gid:[{type:Input,args:["gid"]}],orderId:[{type:Input,args:["orderId"]}],payResult:[{type:Output}],isOpen:[{type:Input,args:["isOpen"]}]}});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9wYXltZW50L3BheW1lbnQvcGF5bWVudC5jb21wb25lbnQubWpz`
10
+