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.
- package/LICENSE.md +8 -0
- package/README.md +37 -37
- package/esm2022/fmode-ng.mjs +10 -5
- package/esm2022/lib/aigc/agent/fm-agent-task/fm-agent-task.component.mjs +8 -92
- package/esm2022/lib/aigc/agent/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -98
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -107
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -113
- package/esm2022/lib/aigc/avatar/index.mjs +10 -8
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -164
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -49
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -155
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -140
- package/esm2022/lib/aigc/chat/chat-message-card/duration-str.pipe.mjs +10 -29
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -193
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -331
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +8 -249
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -83
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/index.mjs +10 -8
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -367
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -115
- package/esm2022/lib/aigc/index.mjs +10 -14
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +10 -2
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -174
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-func.mjs +9 -162
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-work.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -313
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -4
- package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -62
- package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -87
- package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -345
- package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -81
- package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -152
- package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -42
- package/esm2022/lib/aigc/story/index.mjs +10 -6
- package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -47
- package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -95
- package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -253
- package/esm2022/lib/aigc/story/story.service.mjs +10 -35
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +10 -636
- package/esm2022/lib/aigc/voice/index.mjs +10 -7
- package/esm2022/lib/aigc/voice/lib/audio/audio.player.mjs +10 -55
- package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -2
- package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -96
- package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +8 -177
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
- package/esm2022/lib/aigc/voice/lib/recorder/extension-waveview.mjs +10 -215
- package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +10 -189
- package/esm2022/lib/aigc/voice/tts/index.mjs +10 -5
- package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -2
- package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +8 -346
- package/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs +8 -342
- package/esm2022/lib/code/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +8 -430
- package/esm2022/lib/core/agent/chat/completion/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -2
- package/esm2022/lib/core/agent/chat/fmode-chat.mjs +8 -617
- package/esm2022/lib/core/agent/chat/index.mjs +10 -4
- package/esm2022/lib/core/agent/chat/interface.mjs +10 -2
- package/esm2022/lib/core/agent/index.mjs +10 -6
- package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +10 -133
- package/esm2022/lib/core/agent/prompt/index.mjs +10 -2
- package/esm2022/lib/core/agent/prompt/prompt-util.mjs +10 -16
- package/esm2022/lib/core/agent/story/agent.story.mjs +10 -64
- package/esm2022/lib/core/agent/story/index.mjs +10 -2
- package/esm2022/lib/core/agent/task/agent.task.mjs +10 -90
- package/esm2022/lib/core/agent/task/index.mjs +10 -2
- package/esm2022/lib/core/agent/waiting/index.mjs +10 -3
- package/esm2022/lib/core/agent/waiting/loading/loading.ctrl.mjs +10 -279
- package/esm2022/lib/core/agent/waiting/tips/tips.ctrl.mjs +8 -190
- package/esm2022/lib/core/index.mjs +10 -4
- package/esm2022/lib/core/parse/datatype/acl.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/file.mjs +10 -69
- package/esm2022/lib/core/parse/datatype/geopoint.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/relation.mjs +10 -56
- package/esm2022/lib/core/parse/fmode.cloud.mjs +10 -0
- package/esm2022/lib/core/parse/fmode.object.mjs +10 -232
- package/esm2022/lib/core/parse/fmode.parse.mjs +10 -84
- package/esm2022/lib/core/parse/fmode.query.mjs +8 -500
- package/esm2022/lib/core/parse/fmode.user.mjs +10 -275
- package/esm2022/lib/core/parse/index.mjs +10 -5
- package/esm2022/lib/core/parse/types.mjs +10 -2
- package/esm2022/lib/core/voice/index.mjs +10 -3
- package/esm2022/lib/core/voice/tts/index.mjs +10 -2
- package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -14
- package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/file.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -57
- package/esm2022/lib/icon/filetype/index.mjs +10 -12
- package/esm2022/lib/icon/filetype/md.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -8
- package/esm2022/lib/icon/filetype/video.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -3
- package/esm2022/lib/icon/index.mjs +10 -2
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -209
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
- package/esm2022/lib/map/index.mjs +10 -4
- package/esm2022/lib/map/map.module.mjs +10 -61
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -132
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -115
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -118
- package/esm2022/lib/nova-cloud/index.mjs +10 -3
- package/esm2022/lib/nova-cloud/ncloud-api-func.mjs +10 -91
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -53
- package/esm2022/lib/payment/index.mjs +10 -2
- package/esm2022/lib/payment/payment/payment.component.mjs +10 -543
- package/esm2022/lib/payment/payment.service.mjs +10 -202
- package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -48
- package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -29
- package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -211
- package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +8 -412
- package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -50
- package/esm2022/lib/person/index.mjs +10 -5
- package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -144
- package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -41
- package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -595
- package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -172
- package/esm2022/lib/person/person.service.mjs +8 -193
- package/esm2022/lib/platform/cross.service.mjs +10 -62
- package/esm2022/lib/platform/index.mjs +10 -2
- package/esm2022/lib/social/index.mjs +10 -2
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -230
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
- package/esm2022/lib/storage/index.mjs +10 -5
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -131
- package/esm2022/lib/storage/service-hwobs/index.mjs +10 -3
- package/esm2022/lib/storage/service-hwobs/typings/esdk-obs-browser.mjs +1 -1
- package/esm2022/lib/storage/service-upload/index.mjs +10 -2
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -513
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
- package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +10 -93
- package/esm2022/lib/storage/storage.module.mjs +10 -42
- package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -237
- package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +8 -72
- package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -207
- package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +8 -227
- package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -303
- package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +8 -371
- package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -94
- package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -36
- package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -281
- package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -22
- package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -169
- package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -69
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -65
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -55
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -142
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -35
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -81
- package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -50
- package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -145
- package/esm2022/lib/text/index.mjs +10 -4
- package/esm2022/lib/user/account/account.service.mjs +10 -222
- package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -66
- package/esm2022/lib/user/index.mjs +10 -17
- package/esm2022/lib/user/login/auth.guard.mjs +10 -28
- package/esm2022/lib/user/login/auth.service.mjs +8 -433
- package/esm2022/lib/user/login/login.component.mjs +10 -916
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -311
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
- package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -164
- package/esm2022/lib/user/profile/profile-bind/profile-confirm-modal.component.mjs +10 -79
- package/esm2022/lib/user/profile/profile.module.mjs +10 -54
- package/esm2022/lib/user/staff/index.mjs +10 -4
- package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
- package/esm2022/lib/user/staff/staff.module.mjs +10 -18
- package/esm2022/lib/user/staff/staff.service.mjs +10 -85
- package/esm2022/lib/user/user-name.pipe.mjs +10 -29
- package/esm2022/lib/user/user.module.mjs +10 -102
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
- package/esm2022/lib/video/index.mjs +10 -2
- package/esm2022/public-api.mjs +10 -21
- package/fesm2022/fmode-ng.mjs +7 -19788
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +2 -2
- package/lib/aigc/chat/chat-list/chat-list.component.d.ts +3 -2
- package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +3 -3
- package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +2 -2
- package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-func.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-work.d.ts +4 -4
- package/lib/aigc/service-fmai/service-imagine/imagine.service.d.ts +6 -6
- package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +2 -2
- package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +2 -1
- package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +6 -6
- package/lib/aigc/story/fm-story-list/story-preview.d.ts +4 -4
- package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +3 -3
- package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +2 -2
- package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +6 -6
- package/lib/aigc/story/story.service.d.ts +3 -2
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/lib/core/agent/chat/fmode-chat.d.ts +11 -11
- package/lib/core/agent/story/agent.story.d.ts +8 -8
- package/lib/core/parse/datatype/geopoint.d.ts +5 -1
- package/lib/core/parse/fmode.cloud.d.ts +32 -0
- package/lib/core/parse/fmode.object.d.ts +2 -2
- package/lib/core/parse/fmode.parse.d.ts +15 -9
- package/lib/core/parse/fmode.query.d.ts +41 -2
- package/lib/core/parse/fmode.user.d.ts +1 -0
- package/lib/core/parse/index.d.ts +1 -0
- package/lib/core/parse/types.d.ts +2 -0
- package/lib/map/comp-poi-picker/comp-poi-picker.component.d.ts +5 -5
- package/lib/payment/payment/payment.component.d.ts +3 -3
- package/lib/payment/payment.service.d.ts +4 -4
- package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +2 -1
- package/lib/person/comp-person-item/comp-person-item.component.d.ts +2 -1
- package/lib/person/comp-person-story/comp-person-story.component.d.ts +13 -13
- package/lib/person/edit-upload/edit-upload.component.d.ts +1 -1
- package/lib/person/modal-person-select/modal-person-select.component.d.ts +5 -5
- package/lib/person/modal-user-verify/user-verify.component.d.ts +5 -5
- package/lib/person/person-detail/person-detail.component.d.ts +4 -4
- package/lib/person/person.service.d.ts +7 -7
- package/lib/storage/service-hwobs/hwobs.service.d.ts +4 -5
- package/lib/storage/service-upload/nova-upload.service.d.ts +5 -5
- package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +2 -1
- package/lib/text/fm-article-editor/article.service.d.ts +12 -12
- package/lib/text/fm-article-editor/draft.service.d.ts +5 -5
- package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +3 -2
- package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +16 -17
- package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +3 -3
- package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +11 -10
- package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +2 -2
- package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +3 -3
- package/lib/text/fm-article-editor/task-article-generation.d.ts +5 -4
- package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +2 -1
- package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +3 -3
- package/lib/user/account/account.service.d.ts +2 -2
- package/lib/user/comp-user-avatar/comp-user-avatar.component.d.ts +2 -2
- package/lib/user/login/auth.service.d.ts +5 -5
- package/lib/user/login/login.component.d.ts +3 -3
- package/lib/user/profile/auth-profile.service.d.ts +8 -8
- package/lib/user/profile/profile-bind/profile-bind.component.d.ts +7 -7
- package/lib/user/profile/profile-bind/profile-confirm-modal.component.d.ts +2 -2
- package/lib/user/staff/staff.service.d.ts +3 -3
- package/lib/user/user-name.pipe.d.ts +2 -2
- package/package.json +12 -18
|
@@ -1,543 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { QrCodeModule } from 'ng-qrcode';
|
|
9
|
-
|
|
10
|
-
|
|
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
|
+
|