@yinuo-ngm/server 1.0.15 → 1.0.17
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/lib/app.js +3 -15
- package/lib/common/editor.js +2 -2
- package/lib/env.d.ts +1 -0
- package/lib/env.js +1 -0
- package/lib/plugins/error-handler.plugin.d.ts +2 -2
- package/lib/plugins/error-handler.plugin.js +97 -88
- package/lib/plugins/ws/topics/nginx.ws.js +2 -1
- package/lib/plugins/ws/topics/svn.ws.d.ts +2 -1
- package/lib/plugins/ws/topics/svn.ws.js +3 -2
- package/lib/plugins/ws/topics/syslog.ws.d.ts +1 -1
- package/lib/plugins/ws/topics/task.ws.d.ts +2 -1
- package/lib/plugins/ws/topics/task.ws.js +2 -1
- package/lib/plugins/ws/ws.context.d.ts +1 -1
- package/lib/plugins/ws/ws.plugin.js +4 -3
- package/lib/plugins/ws/ws.router.d.ts +2 -2
- package/lib/plugins/ws/ws.router.js +8 -7
- package/lib/routes/api-client/collection.routes.js +8 -6
- package/lib/routes/api-client/env.routes.js +4 -3
- package/lib/routes/api-client/history.routes.js +3 -2
- package/lib/routes/api-client/hub-token.routes.js +32 -10
- package/lib/routes/api-client/request.routes.js +7 -6
- package/lib/routes/api-client/send.routes.js +3 -2
- package/lib/routes/config.routes.js +5 -5
- package/lib/routes/hub.routes.js +10 -10
- package/lib/routes/index.js +2 -0
- package/lib/routes/nginx/nginx-lifecycle.routes.js +4 -0
- package/lib/routes/nginx/nginx-route.context.js +23 -7
- package/lib/routes/nginx/nginx-server.routes.js +158 -6
- package/lib/routes/node-version.routes.d.ts +2 -0
- package/lib/routes/node-version.routes.js +56 -0
- package/lib/routes/project.routes.js +14 -9
- package/lib/routes/rss.routes.js +3 -3
- package/lib/routes/sprite-browse.routes.js +21 -6
- package/lib/routes/sprite.routes.js +18 -12
- package/lib/routes/static-files.routes.js +21 -5
- package/lib/routes/svn.routes.js +5 -3
- package/lib/routes/system.routes.js +20 -1
- package/lib/routes/task.routes.js +10 -3
- package/package.json +13 -6
- package/www/3rdpartylicenses.txt +66 -118
- package/www/browser/chunk-2L7NUOMX.js +2 -0
- package/www/browser/chunk-2NZJ7CN2.js +20 -0
- package/www/browser/chunk-3CM4SKDO.js +15 -0
- package/www/browser/chunk-3I7BQCXS.js +1 -0
- package/www/browser/chunk-3M56F2S2.js +1 -0
- package/www/browser/chunk-3OHBKMAA.js +1 -0
- package/www/browser/chunk-3XNNQFWR.js +1 -0
- package/www/browser/chunk-4BRW6LCZ.js +4 -0
- package/www/browser/chunk-4LBSLURA.js +1 -0
- package/www/browser/chunk-4X42HB6N.js +2 -0
- package/www/browser/chunk-5DYX4DUX.js +11 -0
- package/www/browser/chunk-6SYVDN5L.js +1 -0
- package/www/browser/chunk-6YYNHZ2A.js +1 -0
- package/www/browser/chunk-75W3GVSO.js +1 -0
- package/www/browser/chunk-7U44RF5F.js +63 -0
- package/www/browser/chunk-AELTP6YN.js +1 -0
- package/www/browser/chunk-AMXRL4GR.js +1 -0
- package/www/browser/chunk-AV2ZODEH.js +1 -0
- package/www/browser/chunk-AZ6SIMYH.js +1 -0
- package/www/browser/chunk-B3C35ET3.js +2 -0
- package/www/browser/chunk-BTQIUVTQ.js +1 -0
- package/www/browser/chunk-CN5J4WNO.js +1 -0
- package/www/browser/chunk-D2ODDESN.js +1 -0
- package/www/browser/chunk-DE6E23ET.js +1 -0
- package/www/browser/chunk-DIJPUYIA.js +1 -0
- package/www/browser/chunk-DLGJD6YU.js +4 -0
- package/www/browser/chunk-EEDA5U4V.js +1 -0
- package/www/browser/chunk-FK6Z4HLL.js +1 -0
- package/www/browser/chunk-FL6GDGHW.js +1 -0
- package/www/browser/chunk-FXCG34QS.js +1 -0
- package/www/browser/chunk-H2USFIYR.js +1 -0
- package/www/browser/chunk-H5HGMOE6.js +1 -0
- package/www/browser/chunk-HB3HECPD.js +1 -0
- package/www/browser/chunk-HDNG236Q.js +1 -0
- package/www/browser/chunk-HFZLJHYR.js +1 -0
- package/www/browser/chunk-HJTXXSMC.js +1 -0
- package/www/browser/chunk-HUMCWAKJ.js +3 -0
- package/www/browser/chunk-IKB3EQCP.js +2 -0
- package/www/browser/chunk-K7PESFPY.js +1 -0
- package/www/browser/chunk-KRYMOHYF.js +2 -0
- package/www/browser/chunk-M4QRBV3K.js +1 -0
- package/www/browser/chunk-N2PELLMM.js +30 -0
- package/www/browser/chunk-ONXBYGIG.js +1 -0
- package/www/browser/chunk-OSBDR36P.js +1 -0
- package/www/browser/chunk-OZCK4XVV.js +1 -0
- package/www/browser/chunk-QJP5F735.js +1 -0
- package/www/browser/chunk-RGOYDY7H.js +1 -0
- package/www/browser/chunk-UJKK4A7Y.js +1 -0
- package/www/browser/chunk-WD2EKZQC.js +1 -0
- package/www/browser/chunk-WUA5JFDD.js +1 -0
- package/www/browser/chunk-XLFHB7RS.js +3 -0
- package/www/browser/chunk-YNW4HEJO.js +37 -0
- package/www/browser/chunk-ZTDLWBW5.js +1 -0
- package/www/browser/dark.css +1 -30433
- package/www/browser/default.css +1 -30149
- package/www/browser/index.html +3 -3
- package/www/browser/main-N64WJCHX.js +34 -0
- package/www/browser/scripts-U25HCVEI.js +6 -0
- package/www/browser/styles-ROAHD7MY.css +1 -0
- package/www/browser/add-widget-drawer.component.css.map +0 -7
- package/www/browser/advanced-editor.component.css.map +0 -7
- package/www/browser/api-client.component.css.map +0 -7
- package/www/browser/api-history-drawer.component.css.map +0 -7
- package/www/browser/app.css.map +0 -7
- package/www/browser/attachment-viewer.component.css.map +0 -7
- package/www/browser/auth-editor.component.css.map +0 -7
- package/www/browser/body-editor.component.css.map +0 -7
- package/www/browser/chunk-2YSUXBGC.js +0 -627
- package/www/browser/chunk-2YSUXBGC.js.map +0 -1
- package/www/browser/chunk-3G2GEOPV.js +0 -456
- package/www/browser/chunk-3G2GEOPV.js.map +0 -1
- package/www/browser/chunk-3L72DF3R.js +0 -1683
- package/www/browser/chunk-3L72DF3R.js.map +0 -1
- package/www/browser/chunk-3MCIETCQ.js +0 -8279
- package/www/browser/chunk-3MCIETCQ.js.map +0 -1
- package/www/browser/chunk-665WC4RU.js +0 -5383
- package/www/browser/chunk-665WC4RU.js.map +0 -1
- package/www/browser/chunk-6QMSEZPT.js +0 -10044
- package/www/browser/chunk-6QMSEZPT.js.map +0 -1
- package/www/browser/chunk-6TBQERYX.js +0 -280
- package/www/browser/chunk-6TBQERYX.js.map +0 -1
- package/www/browser/chunk-6UW4MRJZ.js +0 -43
- package/www/browser/chunk-6UW4MRJZ.js.map +0 -7
- package/www/browser/chunk-6XUMIL3W.js +0 -5495
- package/www/browser/chunk-6XUMIL3W.js.map +0 -1
- package/www/browser/chunk-724YOJI3.js +0 -903
- package/www/browser/chunk-724YOJI3.js.map +0 -1
- package/www/browser/chunk-766T7YES.js +0 -437
- package/www/browser/chunk-766T7YES.js.map +0 -1
- package/www/browser/chunk-7FC7DN65.js +0 -728
- package/www/browser/chunk-7FC7DN65.js.map +0 -1
- package/www/browser/chunk-APGQRYWX.js +0 -156
- package/www/browser/chunk-APGQRYWX.js.map +0 -7
- package/www/browser/chunk-AQHSGTHS.js +0 -1960
- package/www/browser/chunk-AQHSGTHS.js.map +0 -1
- package/www/browser/chunk-CTOEAJQK.js +0 -40
- package/www/browser/chunk-CTOEAJQK.js.map +0 -7
- package/www/browser/chunk-DEGQJKKZ.js +0 -409
- package/www/browser/chunk-DEGQJKKZ.js.map +0 -1
- package/www/browser/chunk-DIJX2663.js +0 -1166
- package/www/browser/chunk-DIJX2663.js.map +0 -1
- package/www/browser/chunk-E4XD4GLT.js +0 -427
- package/www/browser/chunk-E4XD4GLT.js.map +0 -1
- package/www/browser/chunk-EQOY6A3M.js +0 -212
- package/www/browser/chunk-EQOY6A3M.js.map +0 -1
- package/www/browser/chunk-ETTBRXVA.js +0 -2643
- package/www/browser/chunk-ETTBRXVA.js.map +0 -1
- package/www/browser/chunk-FLSUSPBD.js +0 -5569
- package/www/browser/chunk-FLSUSPBD.js.map +0 -1
- package/www/browser/chunk-FZNHBEAZ.js +0 -102
- package/www/browser/chunk-FZNHBEAZ.js.map +0 -1
- package/www/browser/chunk-GJC7CZIJ.js +0 -361
- package/www/browser/chunk-GJC7CZIJ.js.map +0 -7
- package/www/browser/chunk-GMCNMOTD.js +0 -844
- package/www/browser/chunk-GMCNMOTD.js.map +0 -7
- package/www/browser/chunk-H43HGCRW.js +0 -198
- package/www/browser/chunk-H43HGCRW.js.map +0 -7
- package/www/browser/chunk-J447GBHM.js +0 -160
- package/www/browser/chunk-J447GBHM.js.map +0 -1
- package/www/browser/chunk-JN3VOWP7.js +0 -384
- package/www/browser/chunk-JN3VOWP7.js.map +0 -1
- package/www/browser/chunk-KSHAGY2M.js +0 -399
- package/www/browser/chunk-KSHAGY2M.js.map +0 -7
- package/www/browser/chunk-KV72AKOD.js +0 -59
- package/www/browser/chunk-KV72AKOD.js.map +0 -7
- package/www/browser/chunk-LAVMY2SJ.js +0 -26
- package/www/browser/chunk-LAVMY2SJ.js.map +0 -7
- package/www/browser/chunk-LLRVGHG5.js +0 -73
- package/www/browser/chunk-LLRVGHG5.js.map +0 -7
- package/www/browser/chunk-LPME4AJ3.js +0 -196
- package/www/browser/chunk-LPME4AJ3.js.map +0 -1
- package/www/browser/chunk-LVPSURVU.js +0 -4615
- package/www/browser/chunk-LVPSURVU.js.map +0 -1
- package/www/browser/chunk-MMPO7QLO.js +0 -4146
- package/www/browser/chunk-MMPO7QLO.js.map +0 -7
- package/www/browser/chunk-O7LB6VFM.js +0 -1953
- package/www/browser/chunk-O7LB6VFM.js.map +0 -1
- package/www/browser/chunk-P5CWA4FO.js +0 -685
- package/www/browser/chunk-P5CWA4FO.js.map +0 -1
- package/www/browser/chunk-RBWIWNTL.js +0 -203
- package/www/browser/chunk-RBWIWNTL.js.map +0 -7
- package/www/browser/chunk-RUXJCM3V.js +0 -26199
- package/www/browser/chunk-RUXJCM3V.js.map +0 -1
- package/www/browser/chunk-S77VVYUZ.js +0 -168
- package/www/browser/chunk-S77VVYUZ.js.map +0 -1
- package/www/browser/chunk-SCXPYFOB.js +0 -4316
- package/www/browser/chunk-SCXPYFOB.js.map +0 -1
- package/www/browser/chunk-SS73S33S.js +0 -471
- package/www/browser/chunk-SS73S33S.js.map +0 -7
- package/www/browser/chunk-T6UAOWNP.js +0 -600
- package/www/browser/chunk-T6UAOWNP.js.map +0 -1
- package/www/browser/chunk-TEW4MY4J.js +0 -148
- package/www/browser/chunk-TEW4MY4J.js.map +0 -7
- package/www/browser/chunk-TVORF3SF.js +0 -82
- package/www/browser/chunk-TVORF3SF.js.map +0 -7
- package/www/browser/chunk-UAN42EUZ.js +0 -2147
- package/www/browser/chunk-UAN42EUZ.js.map +0 -1
- package/www/browser/chunk-ULOHDK7Y.js +0 -1
- package/www/browser/chunk-ULOHDK7Y.js.map +0 -7
- package/www/browser/chunk-UYJ3FVRV.js +0 -3978
- package/www/browser/chunk-UYJ3FVRV.js.map +0 -1
- package/www/browser/chunk-VXHZMSDM.js +0 -5509
- package/www/browser/chunk-VXHZMSDM.js.map +0 -1
- package/www/browser/chunk-VYNQPZQO.js +0 -281
- package/www/browser/chunk-VYNQPZQO.js.map +0 -1
- package/www/browser/chunk-W3J23PZI.js +0 -9213
- package/www/browser/chunk-W3J23PZI.js.map +0 -1
- package/www/browser/chunk-W5HGHCQT.js +0 -1642
- package/www/browser/chunk-W5HGHCQT.js.map +0 -7
- package/www/browser/chunk-XF5H7E4L.js +0 -4723
- package/www/browser/chunk-XF5H7E4L.js.map +0 -1
- package/www/browser/chunk-XNFNEBMY.js +0 -398
- package/www/browser/chunk-XNFNEBMY.js.map +0 -7
- package/www/browser/chunk-XQY5SPGI.js +0 -30811
- package/www/browser/chunk-XQY5SPGI.js.map +0 -1
- package/www/browser/chunk-Y7JBZHNK.js +0 -514
- package/www/browser/chunk-Y7JBZHNK.js.map +0 -1
- package/www/browser/chunk-YWHRP4X3.js +0 -406
- package/www/browser/chunk-YWHRP4X3.js.map +0 -1
- package/www/browser/chunk-Z7FJIV62.js +0 -95
- package/www/browser/chunk-Z7FJIV62.js.map +0 -7
- package/www/browser/chunk-ZBZHXS46.js +0 -1674
- package/www/browser/chunk-ZBZHXS46.js.map +0 -1
- package/www/browser/chunk-ZZA5NVAI.js +0 -735
- package/www/browser/chunk-ZZA5NVAI.js.map +0 -1
- package/www/browser/collection-modal.component.css.map +0 -7
- package/www/browser/collection-tree-item.component.css.map +0 -7
- package/www/browser/collection-tree.component.css.map +0 -7
- package/www/browser/config-change-bar-component.css.map +0 -7
- package/www/browser/config-item-component.css.map +0 -7
- package/www/browser/config-nav-component.css.map +0 -7
- package/www/browser/config-section-component.css.map +0 -7
- package/www/browser/create-summary-aside.component.css.map +0 -7
- package/www/browser/curl-actions.component.css.map +0 -7
- package/www/browser/dark.css.map +0 -7
- package/www/browser/dashboard-canvas.component.css.map +0 -7
- package/www/browser/dashboard.component.css.map +0 -7
- package/www/browser/default.css.map +0 -7
- package/www/browser/detail-item-card.component.css.map +0 -7
- package/www/browser/ellipsis-text.component.css.map +0 -7
- package/www/browser/env-modal.component.css.map +0 -7
- package/www/browser/env-picker.component.css.map +0 -7
- package/www/browser/feedback.component.css.map +0 -7
- package/www/browser/fs-explorer.component.css.map +0 -7
- package/www/browser/git-import-modal.component.css.map +0 -7
- package/www/browser/hub-v2-personal-token-modal.component.css.map +0 -7
- package/www/browser/issue-action-area.component.css.map +0 -7
- package/www/browser/issue-add-participants-dialog.component.css.map +0 -7
- package/www/browser/issue-assign-dialog.component.css.map +0 -7
- package/www/browser/issue-attachment-area.component.css.map +0 -7
- package/www/browser/issue-base-info-area.component.css.map +0 -7
- package/www/browser/issue-branches.component.css.map +0 -7
- package/www/browser/issue-close-dialog.component.css.map +0 -7
- package/www/browser/issue-collaborators-panel.component.css.map +0 -7
- package/www/browser/issue-comment-editor.component.css.map +0 -7
- package/www/browser/issue-create-branch-dialog.component.css.map +0 -7
- package/www/browser/issue-description-area.component.css.map +0 -7
- package/www/browser/issue-detail.component.css.map +0 -7
- package/www/browser/issue-resolve-dialog.component.css.map +0 -7
- package/www/browser/issue-start-own-branch-dialog.component.css.map +0 -7
- package/www/browser/issues-list-table.component.css.map +0 -7
- package/www/browser/issues.component.css.map +0 -7
- package/www/browser/kill-port-widget.component.css.map +0 -7
- package/www/browser/kv-table.component.css.map +0 -7
- package/www/browser/layout-footer.component.css.map +0 -7
- package/www/browser/layout-header.component.css.map +0 -7
- package/www/browser/layout-menu.component.css.map +0 -7
- package/www/browser/layout-project-nav.component.css.map +0 -7
- package/www/browser/layout-sidebar.component.css.map +0 -7
- package/www/browser/layout.component.css.map +0 -7
- package/www/browser/less-viewport-component.css.map +0 -7
- package/www/browser/main.js +0 -1872
- package/www/browser/main.js.map +0 -1
- package/www/browser/markdown-viewer.component.css.map +0 -7
- package/www/browser/news-feed-widget.component.css.map +0 -7
- package/www/browser/ng-devtool.component.css.map +0 -7
- package/www/browser/nginx-config-editor.component.css.map +0 -7
- package/www/browser/nginx-log-viewer.component.css.map +0 -7
- package/www/browser/nginx-secondary-logs-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-perf-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-settings-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-ssl-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-test-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-traffic-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-upstream-tab.component.css.map +0 -7
- package/www/browser/nginx-section-card.component.css.map +0 -7
- package/www/browser/nginx-server-drawer.component.css.map +0 -7
- package/www/browser/nginx-server-list.component.css.map +0 -7
- package/www/browser/nginx-stat-card.component.css.map +0 -7
- package/www/browser/nginx.component.css.map +0 -7
- package/www/browser/page-layout.component.css.map +0 -7
- package/www/browser/pick-workspace-modal.component.css.map +0 -7
- package/www/browser/polyfills.js +0 -26584
- package/www/browser/polyfills.js.map +0 -7
- package/www/browser/project-conf.component.css.map +0 -7
- package/www/browser/project-create-modal.component.css.map +0 -7
- package/www/browser/project-create.component.css.map +0 -7
- package/www/browser/project-deps.component.css.map +0 -7
- package/www/browser/project-edit-modal.component.css.map +0 -7
- package/www/browser/project-import.component.css.map +0 -7
- package/www/browser/project-item-popover.component.css.map +0 -7
- package/www/browser/project-item.component.css.map +0 -7
- package/www/browser/project-list.component.css.map +0 -7
- package/www/browser/projects.component.css.map +0 -7
- package/www/browser/quick-task-widget.component.css.map +0 -7
- package/www/browser/rd-action-area.component.css.map +0 -7
- package/www/browser/rd-advance-stage-dialog.component.css.map +0 -7
- package/www/browser/rd-block-dialog.component.css.map +0 -7
- package/www/browser/rd-create-dialog.component.css.map +0 -7
- package/www/browser/rd-detail.component.css.map +0 -7
- package/www/browser/rd-item-card.component.css.map +0 -7
- package/www/browser/rd-list-board.component.css.map +0 -7
- package/www/browser/rd-list-table.component.css.map +0 -7
- package/www/browser/rd.component.css.map +0 -7
- package/www/browser/request-collections.component.css.map +0 -7
- package/www/browser/request-editor.component.css.map +0 -7
- package/www/browser/request-list-item.component.css.map +0 -7
- package/www/browser/request-list.component.css.map +0 -7
- package/www/browser/request-tabs-bar.component.css.map +0 -7
- package/www/browser/request-tabs.component.css.map +0 -7
- package/www/browser/request-urlbar.component.css.map +0 -7
- package/www/browser/response-viewer.component.css.map +0 -7
- package/www/browser/scripts.js +0 -245
- package/www/browser/scripts.js.map +0 -7
- package/www/browser/setting.component.css.map +0 -7
- package/www/browser/sprite-conf-modal.component.css.map +0 -7
- package/www/browser/sprite-icons-panel-component.css.map +0 -7
- package/www/browser/sprite-images-panel-component.css.map +0 -7
- package/www/browser/sprite-result-tabs.component.css.map +0 -7
- package/www/browser/sprite-viewport-component.css.map +0 -7
- package/www/browser/sprite.component.css.map +0 -7
- package/www/browser/step-advance.component.css.map +0 -7
- package/www/browser/step-basic.component.css.map +0 -7
- package/www/browser/step-config.component.css.map +0 -7
- package/www/browser/step-features.component.css.map +0 -7
- package/www/browser/step-preset.component.css.map +0 -7
- package/www/browser/step-summary-aside.component.css.map +0 -7
- package/www/browser/styles.css +0 -258
- package/www/browser/styles.css.map +0 -7
- package/www/browser/system-log.component.css.map +0 -7
- package/www/browser/task-actions.component.css.map +0 -7
- package/www/browser/task-console.component.css.map +0 -7
- package/www/browser/task-header.component.css.map +0 -7
- package/www/browser/task-list.component.css.map +0 -7
- package/www/browser/tasks.component.css.map +0 -7
- package/www/browser/terminal-view.component.css.map +0 -7
- package/www/browser/welcome-widget.component.css.map +0 -7
- package/www/browser/widget-base.component.css.map +0 -7
- package/www/browser/widget-host.component.css.map +0 -7
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["angular:jit:template:src\\app\\pages\\issues\\issues.component.html","angular:jit:style:src\\app\\pages\\issues\\issues.component.less","src/app/pages/issues/services/issue-token-api.service.ts","src/app/pages/issues/services/issue-api.service.ts","src/app/pages/issues/store/issue-list.store.ts","angular:jit:style:inline:src\\app\\pages\\issues\\issues-list-table\\issues-list-table.component.ts;CiAgICAudGl0bGUtd3JhcCB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGdhcDogOHB4OwogICAgICBtaW4td2lkdGg6IDA7IC8vIOWFs+mUru+8muiuqeWGhemDqOWPr+S7pWVsbGlwc2lzCiAgICB9CgogICAgLnJkLXRpdGxlIHsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsgLy8g5qCH6aKY5Yqg57KXCiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIG1heC13aWR0aDogMTAwJTsKICAgIH0KCiAgICAuZGVzIHsKICAgICAgZm9udC1zaXplOiAxMnB4OyAvLyDmj4/ov7Dlj5jlsI8KICAgICAgY29sb3I6ICM5OTk7IC8vIOWPmOeBsAogICAgICBtYXJnaW4tdG9wOiAycHg7CgogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIH0KICAgIDpob3N0IDo6bmctZGVlcCB0YWJsZVtuei10YWJsZS1jb250ZW50XSB7CiAgICAgIHRhYmxlLWxheW91dDogZml4ZWQgIWltcG9ydGFudDsKICAgIH0KICAgIC5wYXJ0aWNpcGFudC1pbmxpbmUgewogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIGNvbG9yOiBncmF5OwogICAgICBmb250LXdlaWdodDogNDAwOwogICAgfQogICAgLmlzc3VlLWl0ZW0tcm93ewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB9CiAg","src/app/shared/constants/issue-type-options.ts","src/app/pages/issues/issues-list-table/issues-list-table.component.ts","src/app/pages/issues/services/issue-permission.service.ts","src/app/pages/issues/store/issue-detail.store.ts","angular:jit:style:inline:src\\app\\pages\\issues\\issue-detail\\issue-detail.component.ts;CiAgICAudGl0bGUtd3JhcCB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgLnN1YnRpdGxlIHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFyZW07CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICAgICAgcGFkZGluZzogM3B4IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5OwogICAgICAgIGNvbG9yOiAjNjQ3NDhiOwogICAgICB9CiAgICB9CiAgICAuZGV0YWlsLXdyYXAgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgLy8gaGVpZ2h0OiAxMDAlOwogICAgICAvLyBkaXNwbGF5OiBmbGV4OwogICAgICAvLyBmbGV4LWRpcmVjdGlvbjogOwogICAgICBnYXA6IDEwcHg7CiAgICAgIC5kZXRhaWwtaGVhZGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuZGV0YWlsLWNvbnRlbnQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAxMHB4OwogICAgICB9CiAgICAgIC53cmFwLXRpdGxlIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2JiYmJiYjsKICAgICAgfQogICAgICAubGVmdC1jb2x1bW4gewogICAgICAgIHdpZHRoOiA2MCU7CgogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgIH0KICAgICAgLnJpZ2h0LWNvbHVtbiB7CiAgICAgICAgd2lkdGg6IDQwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAxMHB4OwogICAgICB9CiAgICB9CiAgICAuY29tbWVudCB7CiAgICAgIC5jb21tZW50LWl0ZW0gewogICAgICB9CiAgICB9CiAg","angular:jit:style:inline:src\\app\\pages\\issues\\issue-detail\\issue-action-area\\issue-action-area.component.ts;CiAgICAuYWN0aW9uLWJ0bnMgewogICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBnYXA6IDEwcHg7CiAgICB9CiAgICA6aG9zdCA6Om5nLWRlZXAgLmFudC1zdGVwcy1pdGVtLXRpdGxlOjphZnRlciB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkM2QzZDMgIWltcG9ydGFudDsKICAgIH0KICA=","src/app/pages/issues/issue-detail/issue-action-area/issue-action-area.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\issue-detail\\issue-attachment-area\\issue-attachment-area.component.ts;CiAgICAuZW1wdHkgewogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIGNvbG9yOiBncmF5OwogICAgfQogIA==","angular:jit:style:inline:src\\app\\shared\\components\\attachment-viewer\\attachment-viewer.component.ts;CiAgICAgIC5hdHRhY2htZW50LXZpZXdlcl9faXRlbSB7CiAgICAgICAgbWFyZ2luOiA2cHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICAgICAgfQoKICAgICAgLmF0dGFjaG1lbnQtdmlld2VyX19pbWFnZSwKICAgICAgLmF0dGFjaG1lbnQtdmlld2VyX192aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAuYXR0YWNobWVudC12aWV3ZXJfX3ZpZGVvIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CgogICAgICAuYXR0YWNobWVudC12aWV3ZXJfX2ZpbGUgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIHBsYWNlLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQoKICAgICAgLmF0dGFjaG1lbnQtdmlld2VyX19maWxlLW5hbWUgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLyog8J+RhyDkv6Hmga/lsYLvvIg0MCXvvIkgKi8KICAgICAgLmF0dGFjaG1lbnQtdmlld2VyX19pbmZvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgaGVpZ2h0OiA0MCU7CgogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwoKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKCiAgICAgICAgY29sb3I6ICNmZmY7CgogICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byB0b3AsIHJnYmEoMCwgMCwgMCwgMC44NSksIHJnYmEoMCwgMCwgMCwgMC40KSwgdHJhbnNwYXJlbnQpOwogICAgICB9CgogICAgICAuYXR0YWNobWVudC12aWV3ZXJfX25hbWUgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuYXR0YWNobWVudC12aWV3ZXJfX21ldGEgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBvcGFjaXR5OiAwLjg1OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC8qIGhvdmVyIOmBrue9qSAqLwogICAgICAuYXR0YWNobWVudC12aWV3ZXJfX21hc2sgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBpbnNldDogMDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CgogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yczsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5hdHRhY2htZW50LXZpZXdlcl9faXRlbTpob3ZlciAuYXR0YWNobWVudC12aWV3ZXJfX21hc2sgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5hdHRhY2htZW50LXZpZXdlcl9fcHJldmlldyB7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICA=","src/app/shared/components/attachment-viewer/attachment-viewer.component.ts","src/app/pages/issues/issue-detail/issue-attachment-area/issue-attachment-area.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\issue-detail\\issue-base-info-area\\issue-base-info-area.component.ts;CiAgICA6aG9zdCA6Om5nLWRlZXAgLmFudC1kZXNjcmlwdGlvbnMtaXRlbS1jb250ZW50LAogICAgOmhvc3QgOjpuZy1kZWVwIC5hbnQtZGVzY3JpcHRpb25zLWl0ZW0tbGFiZWwgewogICAgICBmb250LXNpemU6IDAuODc1cmVtOwogICAgfQogIA==","src/app/pages/issues/issue-detail/issue-base-info-area/issue-base-info-area.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\issue-detail\\issue-collaborators-area\\issue-collaborators-panel.component.ts;CiAgICAgIC5lbXB0eSB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiBncmF5OwogICAgICB9CiAgICAgIC5wYXJ0aWNpcGFudC1saXN0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBnYXA6IDIwcHggOHB4OwogICAgICAgIHBhZGRpbmc6IDEwcHggMDsKICAgICAgfQogICAgICAucGFydGljaXBhbnQtaXRlbSB7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CiAgICAgIC5wYXJ0aWNpcGFudC1jaGlwIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDRweCAxMHB4IDRweCA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICAgICAgYmFja2dyb3VuZDogI2VjZWJlYjsKICAgICAgfQogICAgICAucGFydGljaXBhbnQtaXRlbV9fbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAuODc1cmVtOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgLy8gY29sb3I6ICMxODkwZmY7CiAgICAgIH0KICAgICAgLnJlbW92ZS1idG4gewogICAgICAgIG1hcmdpbi1yaWdodDogOHB4OwogICAgICB9CiAgICA=","src/app/pages/issues/issue-detail/issue-collaborators-area/issue-collaborators-panel.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\issue-detail\\issue-comment-area\\issue-comment-editor.component.ts;CiAgICAubWVudGlvbiB7CiAgICAgIGNvbG9yOiAjMTY3N2ZmOwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB9CiAgICAuY29tbWVudC1lbXB0eSB7CiAgICAgIG1hcmdpbjogMXJlbTsKICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICBjb2xvcjogZ3JheTsKICAgIH0KICAgIC5jb21tZW50LWlucHV0IHsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICB9CiAgICAudG9vbGJhciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGp1c3RpZnktY29udGVudDogZW5kOwogICAgfQogICAgLnNlbmQgewogICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICB9CiAgICAubWVudGlvbi1vcHRpb24gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIGdhcDogMTJweDsKICAgIH0KICAgIC5tZW50aW9uLW5hbWUgewogICAgICBmb250LXdlaWdodDogNjAwOwogICAgfQogICAgLm1lbnRpb24taWQgewogICAgICBmb250LXNpemU6IDEycHg7CiAgICB9CiAgICAubG9nLWl0ZW0gewogICAgICBwYWRkaW5nOiA0cHggMCAwOwogICAgICAubWV0YSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICAgICAgZ2FwOiAwLjg3NXJlbTsKICAgICAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjY1KTsKICAgICAgICBmb250LXNpemU6IDAuODc1cmVtOwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgICAub3BlcmF0b3IgewogICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIH0KICAgICAgICAuY29udGVudCB7CiAgICAgICAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg1KTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLmVtcHR5IHsKICAgICAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgICAgfQogICAgfQogICAgLmNvbW1lbnQtaXRlbSB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICB9CiAgICAudGltZSB7CiAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgbWluLXdpZHRoOiAxMDBweDsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBmb250LXdlaWdodDogMzAwOwogICAgICBjb2xvcjogI2JiYmJiYjsKICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICB9CiAgICAubG9nLWl0ZW0gewogICAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsKICAgIH0KICAgIC5zdW1tYXJ5IHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgfQogICAgOmhvc3QgOjpuZy1kZWVwIC5hbnQtdGltZWxpbmUtaXRlbSB7CiAgICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICAgIHBhZGRpbmctYm90dG9tOiAwOwogICAgfQogIA==","src/app/shared/constants/role-options.ts","node_modules/ng-zorro-antd/fesm2022/ng-zorro-antd-list.mjs","node_modules/ng-zorro-antd/fesm2022/ng-zorro-antd-comment.mjs","node_modules/ng-zorro-antd/fesm2022/ng-zorro-antd-mention.mjs","angular:jit:style:inline:src\\app\\shared\\components\\ellipsis-text\\ellipsis-text.component.ts;CiAgICAudGV4dCB7CiAgICAgIGRpc3BsYXk6IC13ZWJraXQtYm94OwogICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwoKICAgICAgLXdlYmtpdC1saW5lLWNsYW1wOiB2YXIoLS1saW5lLWNsYW1wKTsKICAgIH0KCiAgICAudGV4dC5leHBhbmRlZCB7CiAgICAgIC13ZWJraXQtbGluZS1jbGFtcDogdW5zZXQgIWltcG9ydGFudDsKICAgIH0KCiAgICAudG9nZ2xlIHsKICAgICAgZm9udC1zaXplOiAwLjhyZW07CiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICBjb2xvcjogIzE2NzdmZjsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KICA=","src/app/shared/components/ellipsis-text/ellipsis-text.component.ts","src/app/pages/issues/issue-detail/issue-comment-area/issue-comment-editor.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\issue-detail\\issue-description-area\\issue-description-area.component.ts;CiAgICAuZW1wdHkgewogICAgICBtYXJnaW46IDFyZW07CiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgY29sb3I6IGdyYXk7CiAgICB9CiAgICAucmVzb2x1dGlvbiB7CiAgICAgIG1hcmdpbi10b3A6IDI2cHg7CiAgICAgIC5yZXNvbHV0aW9uLWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDAuOHJlbTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBjb2xvcjogZ3JleTsKICAgICAgfQogICAgICAucmVzb2x1dGlvbi1jb250ZW50IHsKICAgICAgICBmb250LXNpemU6IDAuOHJlbTsKICAgICAgICB0ZXh0LWluZGVudDogMC44cmVtOwogICAgICB9CiAgICB9CiAg","angular:jit:template:src\\app\\shared\\components\\markdown-viewer\\markdown-viewer.component.html","angular:jit:style:src\\app\\shared\\components\\markdown-viewer\\markdown-viewer.component.less","src/app/shared/components/markdown-viewer/markdown-viewer.component.ts","src/app/pages/issues/issue-detail/issue-description-area/issue-description-area.component.ts","angular:jit:style:src\\app\\pages\\issues\\issue-detail\\issue-branches\\issue-branches.component.less","src/app/pages/issues/issue-detail/issue-branches/issue-branches.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\dialogs\\issue-start-own-branch-dialog.component.ts;CiAgICAubW9kYWwtdGl0bGVfX21haW57CiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgfQogICAgICAubW9kYWwtdGl0bGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQogICAgICAubW9kYWwtc3VidGl0bGUgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9CiAgICAgIC5sYWJlbCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KICAgICAgLmhpbnQgewogICAgICAgIGZvbnQtc2l6ZTogc21hbGw7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgIA==","src/app/pages/issues/dialogs/issue-start-own-branch-dialog.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\dialogs\\issue-create-branch-dialog.component.ts;CiAgICAgIC5wYXJ0aWNpcGFudC1zZWxlY3RvciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLm1vZGFsLXRpdGxlX19tYWluIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLm1vZGFsLXRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5tb2RhbC1zdWJ0aXRsZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTsKICAgICAgICBtYXJnaW46IDEycHggMCA0cHg7CiAgICAgIH0KCiAgICAgIC5oaW50IHsKICAgICAgICBmb250LXNpemU6IHNtYWxsOwogICAgICAgIGNvbG9yOiBncmF5OwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgfQogICAg","src/app/pages/issues/dialogs/issue-create-branch-dialog.component.ts","src/app/pages/issues/issue-detail/issue-detail.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\dialogs\\issue-close-dialog.component.ts;CiAgICAubW9kYWwtdGl0bGUgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgfQogICAgLm1vZGFsLXN1YnRpdGxlIHsKICAgICAgY29sb3I6ICM5OTk7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICB9CiAgICAuYmxvY2staW5wdXQgewogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICB9CiAg","src/app/pages/issues/dialogs/issue-close-dialog.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\dialogs\\issue-resolve-dialog.component.ts;CiAgICAubW9kYWwtdGl0bGUgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgfQogICAgLm1vZGFsLXN1YnRpdGxlIHsKICAgICAgY29sb3I6ICM5OTk7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICB9CiAgICAuYmxvY2staW5wdXQgewogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICB9CiAg","src/app/pages/issues/dialogs/issue-resolve-dialog.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\dialogs\\issue-assign-dialog.component.ts;CiAgICAubW9kYWwtdGl0bGUgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgfQogICAgLm1vZGFsLXN1YnRpdGxlIHsKICAgICAgY29sb3I6ICM5OTk7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICB9CiAgICAuYXNzaWduZWUtc2VsZWN0IHsKICAgICAgd2lkdGg6IDEwMCU7CiAgICB9CiAgICAuYXNzaWduZWV7CiAgICAgIGZvbnQtc2l6ZTogLjhyZW07CiAgICAgIGNvbG9yOmdyYXk7CiAgICB9CiAg","src/app/pages/issues/dialogs/issue-assign-dialog.component.ts","angular:jit:style:inline:src\\app\\pages\\issues\\dialogs\\issue-add-participants-dialog.component.ts;CiAgICAubW9kYWwtdGl0bGUgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgfQogICAgLm1vZGFsLXN1YnRpdGxlIHsKICAgICAgY29sb3I6ICM5OTk7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICB9CiAgICAuc2VsZWN0IHsKICAgICAgd2lkdGg6IDEwMCU7CiAgICB9CiAgICAubGFiZWwgewogICAgICBmb250LXNpemU6IDAuOHJlbTsKICAgICAgY29sb3I6IGdyYXk7CiAgICB9CiAg","src/app/pages/issues/dialogs/issue-add-participants-dialog.component.ts","src/app/pages/issues/issues.component.ts","src/app/pages/issues/issues-routing.module.ts","src/app/pages/issues/issues.module.ts"],"sourcesContent":["<app-page-layout [title]=\"'测试跟踪'\" [loading]=\"loading()\" [isFullscreen]=\"true\" [isOverflowYAuto]=\"false\">\r\n <div class=\"issues-content\">\r\n <div class=\"toolbar\">\r\n <div class=\"filter-group\">\r\n <div class=\"keyword-wrap\">\r\n <nz-input-wrapper>\r\n <nz-icon nzInputPrefix nzType=\"search\" nzTheme=\"outline\"></nz-icon>\r\n <input nz-input type=\"text\" [ngModel]=\"query().keyword\" (ngModelChange)=\"updateKeyword($event)\"\r\n placeholder=\"搜索标题、编号或提报人\" />\r\n </nz-input-wrapper>\r\n </div>\r\n\r\n <div class=\"status-filter-wrap\">\r\n <span class=\"label\">\r\n <nz-icon nzType=\"tags\" nzTheme=\"fill\" /> 状态:\r\n </span>\r\n @for (item of statusOptions ; track item.value) {\r\n <button nz-button type=\"button\" nzShape=\"round\"\r\n [nzType]=\"query().status === item.value ? 'primary' : 'default'\"\r\n (click)=\"updateStatus(item.value)\">\r\n {{ item.label }}\r\n </button>\r\n }\r\n </div>\r\n <div class=\"priority-filter-wrap\">\r\n <span class=\"label\">\r\n <nz-icon nzType=\"experiment\" nzTheme=\"fill\" />\r\n 优先级:\r\n </span>\r\n <nz-radio-group [ngModel]=\"query().priority\" (ngModelChange)=\"updatePriority($event)\"\r\n name=\"priority\">\r\n @for (item of priorityOptions; track item.value) {\r\n <label nz-radio-button [nzValue]=\"item.value\">\r\n {{ item.label }}\r\n </label>\r\n }\r\n </nz-radio-group>\r\n </div>\r\n </div>\r\n <div class=\"right-col\">\r\n <!-- 新建按钮 -->\r\n <!-- <button nz-button nzType=\"primary\" type=\"button\" (click)=\"openCreateDialog()\">\r\n <nz-icon nzType=\"plus\" nzTheme=\"outline\"></nz-icon>\r\n 新建研发项\r\n </button> -->\r\n <!-- 列表视图切换 -->\r\n <nz-radio-group [(ngModel)]=\"viewType\" class=\"view-type\">\r\n <label nz-radio-button nzValue=\"list\">\r\n <nz-icon nzType=\"unordered-list\" nzTheme=\"outline\"></nz-icon>\r\n </label>\r\n <!-- <label nz-radio-button nzValue=\"board\">\r\n <nz-icon nzType=\"book\" nzTheme=\"outline\"></nz-icon>\r\n </label> -->\r\n </nz-radio-group>\r\n </div>\r\n </div>\r\n\r\n <!-- 列表 -->\r\n <div class=\"list-content\">\r\n @if(viewType() === 'list') {\r\n <app-issues-list-table [issues]=\"issues()\" [selectedItem]=\"selectedIssue()\"\r\n (selectItem)=\"selectIssue($event)\"></app-issues-list-table>\r\n } @else {\r\n\r\n }\r\n <div class=\"pagination-bar\">\r\n <nz-pagination [(nzPageIndex)]=\"query().page\" [nzTotal]=\"total()\" [nzShowTotal]=\"totalTemplate\"\r\n nzShowSizeChanger nzShowQuickJumper (nzPageIndexChange)=\"onPageChange($event)\"\r\n (nzPageSizeChange)=\"onPageSizeChange($event)\" />\r\n <ng-template #totalTemplate let-total>共 {{ total }} 条记录</ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <app-issue-detail [open]=\"open()\" (commentSubmit)=\"commentSubmit($event)\"\r\n (close)=\"closeIssueDetail()\" (actionClick)=\"handleActions($event)\"\r\n (removeParticipant)=\"removeParticipant($event)\"></app-issue-detail>\r\n\r\n <app-issue-close-dialog [open]=\"IssueCloseDialogOpen()\" [busy]=\"busy()\" [item]=\"selectedIssue()\"\r\n (cancel)=\"cancelCloseDialog()\" (confirm)=\"closeConfirm($event)\"></app-issue-close-dialog>\r\n\r\n <app-issue-resolve-dialog [open]=\"IssueResolveDialogOpen()\" [busy]=\"busy()\" [item]=\"selectedIssue()\"\r\n (cancel)=\"cancelResolveDialog()\" (confirm)=\"resolveConfirm($event)\"></app-issue-resolve-dialog>\r\n\r\n <app-issue-assign-dialog [open]=\"IssueAssignDialogOpen()\" [busy]=\"busy()\" [issue]=\"selectedIssue()\"\r\n [actionLabel]=\"IssueAssignActionLabel()\" [members]=\"members()\" (cancel)=\"cancelAssignDialog()\"\r\n (confirm)=\"assignConfirm($event)\"></app-issue-assign-dialog>\r\n\r\n <app-issue-add-participants-dialog [open]=\"IssueAddParticipantsDialogOpen()\" [busy]=\"busy()\"\r\n [issue]=\"selectedIssue()\" [members]=\"members()\" [participants]=\"IssueParticipants()\"\r\n (cancel)=\"cancelAddParticipantsConfirm()\"\r\n (confirm)=\"AddParticipantsConfirm($event)\"></app-issue-add-participants-dialog>\r\n</app-page-layout>","/* src/app/pages/issues/issues.component.less */\n.issues-content {\n width: 100%;\n min-width: 630px;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n overflow: auto;\n}\n.issues-content .toolbar {\n width: calc(100% - 48px * 2);\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 8px;\n display: flex;\n justify-content: space-between;\n margin-top: 16px;\n padding: 16px;\n}\n.issues-content .toolbar .filter-group {\n width: 64%;\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n justify-content: space-between;\n}\n.issues-content .toolbar .filter-group .keyword-wrap {\n width: 100%;\n}\n.issues-content .toolbar .status-filter-wrap {\n min-width: 0;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n}\n.issues-content .toolbar .right-col {\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: end;\n justify-content: end;\n}\n.issues-content .toolbar .right-col .view-type {\n display: flex;\n justify-content: end;\n}\n.issues-content .list-content {\n width: 100%;\n padding: 12px 48px 8px;\n min-height: 0;\n flex-grow: 1;\n}\n.issues-content .list-content .pagination-bar {\n padding: 12px;\n display: flex;\n justify-content: end;\n}\n/*# sourceMappingURL=issues.component.css.map */\n","import { inject, Injectable } from '@angular/core';\r\nimport { ApiClient } from '@app/core';\r\nimport { IssueActionType } from '../models/issue.model';\r\nimport { ProjectContextStore } from '@app/core/stores';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class IssueTokenApiService {\r\n private apiClient: ApiClient = inject(ApiClient);\r\n private projectContext = inject(ProjectContextStore);\r\n /**\r\n * 通过个人token 操作hub v2 的数据(写操作)\r\n */\r\n async issuePostReqWithPK<T>(body: { issueId: string; action: string; payload: Object }) {\r\n return this.apiClient.hubRequestWithPersonalToken<T>({\r\n projectId: this.projectContext.currentProjectId()!,\r\n method: 'POST',\r\n path: `/issues/${body.issueId}/${body.action}`,\r\n payload: body.payload,\r\n });\r\n }\r\n\r\n /**\r\n * 通过个人token 操作hub v2 的数据(删除操作)\r\n */\r\n async issueDeleteReqWithPK<T>(body: { issueId: string; deletedId: string; action: string }) {\r\n const projectId = this.projectContext.currentProjectId()!;\r\n return this.apiClient.hubRequestWithPersonalToken<T>({\r\n projectId: projectId,\r\n method: 'DELETE',\r\n path: `/issues/${body.issueId}/${body.action}/${body.deletedId}`,\r\n });\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport {\r\n CreateIssueInput,\r\n IssueEntity,\r\n IssueListQuery,\r\n IssuePriority,\r\n IssueType,\r\n IssueCommentEntity,\r\n AssignIssueInput,\r\n IssueLogEntity,\r\n IssueListResult,\r\n IssueParticipantEntity,\r\n IssueAttachmentEntity,\r\n ProjectMemberEntity,\r\n AddParticipantsInput,\r\n IssueBranchEntity,\r\n CreateIssueBranchInput,\r\n StartOwnIssueBranchInput,\r\n CompleteIssueBranchInput,\r\n} from '../models/issue.model';\r\nimport { ApiClient } from '@core/api/api-client';\r\nimport { IssueTokenApiService } from './issue-token-api.service';\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class IssueApiService {\r\n private readonly apiClient = inject(ApiClient);\r\n private readonly issueTokenApi = inject(IssueTokenApiService);\r\n\r\n async addAttachment(id: string, id1: any): Promise<any> {\r\n throw new Error('Method not implemented.');\r\n }\r\n\r\n uploadFile(file: File, id: string): Promise<any> {\r\n throw new Error('Method not implemented.');\r\n }\r\n\r\n // branch\r\n getBranches(projectId: string, issueId: string): Promise<{ items: IssueBranchEntity[] }> {\r\n return this.apiClient.hubRequestWithPrjId<{ items: IssueBranchEntity[] }>({\r\n projectId,\r\n path: `/issues/${issueId}/branches`,\r\n });\r\n }\r\n\r\n createBranch(issueId: string, input: CreateIssueBranchInput) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueBranchEntity>({\r\n issueId,\r\n action: 'branches',\r\n payload: input,\r\n });\r\n }\r\n\r\n startOwnBranch(issueId: string, input: StartOwnIssueBranchInput) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueBranchEntity>({\r\n issueId,\r\n action: 'branches/start-mine',\r\n payload: input,\r\n });\r\n }\r\n\r\n startBranch(issueId: string, branchId: string) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueBranchEntity>({\r\n issueId,\r\n action: `branches/${branchId}/start`,\r\n payload: {},\r\n });\r\n }\r\n\r\n completeBranch(issueId: string, branchId: string, input: CompleteIssueBranchInput = {}) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueBranchEntity>({\r\n issueId,\r\n action: `branches/${branchId}/complete`,\r\n payload: input,\r\n });\r\n }\r\n\r\n // participants\r\n addParticipant(issueId: string, input: { userId: string }) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueParticipantEntity>({\r\n issueId,\r\n action: 'participants',\r\n payload: input,\r\n });\r\n }\r\n\r\n getIssueParticipants(projectId: string, issueId: string) {\r\n return this.apiClient.hubRequestWithPrjId<{ items: IssueParticipantEntity[] }>({\r\n projectId,\r\n path: `/issues/${issueId}/participants`,\r\n });\r\n }\r\n\r\n // log\r\n getIssueLogs(projectId: string, issueId: string) {\r\n return this.apiClient.hubRequestWithPrjId<{ items: IssueLogEntity[] }>({\r\n projectId,\r\n path: `/issues/${issueId}/logs`,\r\n });\r\n }\r\n\r\n // comment\r\n addComment(issueId: string, content: string) {\r\n return this.issueTokenApi.issuePostReqWithPK({\r\n issueId,\r\n action: 'comments',\r\n payload: { content },\r\n });\r\n }\r\n\r\n createIssueComment(issueId: string, content: string, mentions: string[] = []) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueCommentEntity>({\r\n issueId,\r\n action: 'comments',\r\n payload: { content, mentions },\r\n });\r\n }\r\n\r\n assignIssue(issueId: string, input: AssignIssueInput) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueEntity>({\r\n issueId,\r\n action: 'assign',\r\n payload: input,\r\n });\r\n }\r\n\r\n claimIssue(issueId: string) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueEntity>({\r\n issueId,\r\n action: 'claim',\r\n payload: {},\r\n });\r\n }\r\n\r\n startIssue(issueId: string) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueEntity>({\r\n issueId,\r\n action: 'start',\r\n payload: {},\r\n });\r\n }\r\n\r\n waitUpdateIssue(issueId: string) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueEntity>({\r\n issueId,\r\n action: 'wait-update',\r\n payload: {},\r\n });\r\n }\r\n\r\n resolveIssue(issueId: string, summary?: string) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueEntity>({\r\n issueId,\r\n action: 'resolve',\r\n payload: {},\r\n });\r\n }\r\n\r\n // verifyIssue(projectId: string, issueId: string) {\r\n // return this.issueTokenApi.issuePostReqWithPK<IssueEntity>({\r\n // projectId,\r\n // path: `/personal/projects/${projectId}/issues/${issueId}/verify`,\r\n // method: 'POST',\r\n // });\r\n // }\r\n\r\n reopenIssue(issueId: string) {\r\n return this.issueTokenApi.issuePostReqWithPK<IssueEntity>({\r\n issueId,\r\n action: 'reopen',\r\n payload: {},\r\n });\r\n }\r\n\r\n // closeIssue(projectId: string, issueId: string) {\r\n // return this.apiClient.hubTokenRequest<IssueEntity>({\r\n // projectId,\r\n // path: `/personal/projects/${projectId}/issues/${issueId}/close`,\r\n // method: 'POST',\r\n // });\r\n // }\r\n\r\n getIssuesList(projectId: string, query: IssueListQuery) {\r\n return this.apiClient.hubRequestWithPrjId<IssueListResult>({\r\n projectId,\r\n path: `/issues`,\r\n query: { ...query },\r\n });\r\n }\r\n\r\n getIssueDetail(projectId: string, issueId: string) {\r\n return this.apiClient.hubRequestWithPrjId<IssueEntity>({\r\n projectId,\r\n path: `/issues/${issueId}`,\r\n });\r\n }\r\n\r\n // getIssueComments(projectId: string, issueId: string) {\r\n // return this.apiClient.hubRequestWithPrjId<{ items: IssueCommentEntity[] }>({\r\n // projectId,\r\n // path: `/issues/${issueId}/comments`,\r\n // });\r\n // }\r\n\r\n getIssueAttachments(projectId: string, issueId: string) {\r\n return this.apiClient.hubRequestWithPrjId<{\r\n items: IssueAttachmentEntity[];\r\n }>({\r\n projectId,\r\n path: `/issues/${issueId}/attachments`,\r\n });\r\n }\r\n\r\n getProjectMembers(projectId: string) {\r\n return this.apiClient.hubRequestWithPrjId<{ items: ProjectMemberEntity[] }>({\r\n projectId,\r\n path: `/projects/${projectId}/members`,\r\n });\r\n }\r\n\r\n removeParticipant(issueId: string, participantId: string) {\r\n return this.issueTokenApi.issueDeleteReqWithPK<IssueParticipantEntity[]>({\r\n issueId,\r\n action: 'participants',\r\n deletedId: participantId,\r\n });\r\n }\r\n}\r\n","import { computed, inject, Injectable, signal } from '@angular/core';\r\n\r\n// import { ProjectContextStore } from '@core/state';\r\nimport { ProjectContextStore } from '@app/core/stores';\r\nimport { UserStore } from '@app/core/stores/user/user.store';\r\nimport type { PageResult } from '@app/core/types/page.types';\r\nimport type { CreateIssueInput, IssueEntity, IssueListQuery } from '../models/issue.model';\r\nimport { IssueApiService } from '../services/issue-api.service';\r\n\r\nconst DEFAULT_QUERY: IssueListQuery = {\r\n page: 1,\r\n pageSize: 10,\r\n keyword: '',\r\n status: '',\r\n priority: '',\r\n};\r\n\r\n@Injectable()\r\nexport class IssueListStore {\r\n private readonly issueApi = inject(IssueApiService);\r\n private readonly projectContext = inject(ProjectContextStore)\r\n private readonly userStore = inject(UserStore);\r\n\r\n private readonly queryState = signal<IssueListQuery>({ ...DEFAULT_QUERY });\r\n private readonly resultState = signal<PageResult<IssueEntity> | null>(null);\r\n private readonly loadingState = signal(false);\r\n\r\n readonly query = computed(() => this.queryState());\r\n readonly result = computed(() => this.resultState());\r\n readonly items = computed(() => this.resultState()?.items ?? []);\r\n readonly loading = computed(() => this.loadingState());\r\n readonly total = computed(() => this.resultState()?.total ?? 0);\r\n readonly page = computed(() => this.queryState().page ?? 1);\r\n readonly pageSize = computed(() => this.queryState().pageSize ?? 20);\r\n\r\n private readonly currentProjectId = this.projectContext.currentProjectId\r\n\r\n initialize(): void {\r\n this.userStore.ensureUserLoaded();\r\n this.load();\r\n }\r\n\r\n refreshForProject(projectId: string | null): void {\r\n this.queryState.update((query) => ({\r\n ...query,\r\n projectId: this.currentProjectId() ?? '',\r\n page: 1,\r\n }));\r\n\r\n if (!projectId) {\r\n this.resultState.set({\r\n items: [],\r\n page: 1,\r\n pageSize: queryPageSize(this.queryState()),\r\n total: 0,\r\n });\r\n this.loadingState.set(false);\r\n return;\r\n }\r\n\r\n this.loadingState.set(true);\r\n this.resultState.set(null);\r\n this.load();\r\n }\r\n\r\n updateQuery(patch: Partial<IssueListQuery>): void {\r\n this.queryState.update((query) => ({\r\n ...query,\r\n ...patch,\r\n page: patch.page ?? query.page ?? 1,\r\n }));\r\n }\r\n\r\n async load() {\r\n const currentProjectId = this.currentProjectId();\r\n if (!currentProjectId) return;\r\n const query = this.queryState();\r\n this.loadingState.set(true);\r\n try {\r\n const res = await this.issueApi.getIssuesList(currentProjectId, query);\r\n this.resultState.set(res);\r\n this.loadingState.set(false);\r\n } catch (error) {\r\n this.loadingState.set(false);\r\n }\r\n }\r\n\r\n async createIssue(issueInput: Omit<CreateIssueInput, 'projectId'>, attachmentFiles?: File[]) {\r\n const projectId = this.currentProjectId() ?? '';\r\n const title = issueInput.title.trim();\r\n if (!projectId || !title) {\r\n return;\r\n }\r\n const files = attachmentFiles ?? [];\r\n const assigneeId = issueInput.assigneeId ?? null;\r\n // 过滤参与者中重复的,且去除自己\r\n const participantIds = [\r\n ...new Set((issueInput.participantIds ?? []).map((item) => item.trim()).filter(Boolean)),\r\n ].filter((id) => id !== assigneeId);\r\n this.loadingState.set(true);\r\n\r\n try {\r\n // const created = (await this.issueApi.createIssue({\r\n // ...issueInput,\r\n // projectId,\r\n // title,\r\n // } as CreateIssueInput)) as any;\r\n // // 添加参与人\r\n // const participantPromises = participantIds.map((userId) =>\r\n // this.issueApi.addParticipant(created.id, userId),\r\n // );\r\n // const attachmentPromises = files.map(async (file) => {\r\n // const upload = await this.issueApi.uploadFile(file, created.id);\r\n // await this.issueApi.addAttachment(created.id, upload.id);\r\n // });\r\n // await Promise.all([...participantPromises, ...attachmentPromises]);\r\n } catch (e) {\r\n } finally {\r\n this.load();\r\n this.loadingState.set(false);\r\n }\r\n }\r\n}\r\n\r\nfunction queryPageSize(query: IssueListQuery): number {\r\n return query.pageSize && query.pageSize > 0 ? query.pageSize : 20;\r\n}\r\n","/* angular:styles/component:less;5e74c24065811c2ba3bb2bb981b8946d8306e15807801ce76b2341f7fb06ebee;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\issues-list-table\\issues-list-table.component.ts */\n.title-wrap {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n.rd-title {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: inline-block;\n max-width: 100%;\n}\n.des {\n font-size: 12px;\n color: #999;\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n:host ::ng-deep table[nz-table-content] {\n table-layout: fixed !important;\n}\n.participant-inline {\n font-size: 12px;\n color: gray;\n font-weight: 400;\n}\n.issue-item-row {\n cursor: pointer;\n}\n/*# sourceMappingURL=issues-list-table.component.css.map */\n","export const ISSUE_TYPE_LABELS: Record<string, string> = {\r\n bug: '缺陷',\r\n feature: '新功能',\r\n change: '需求变更',\r\n improvement: '改进',\r\n task: '任务',\r\n test: '测试记录',\r\n};\r\nexport const ISSUE_TYPE_COLORS: Record<string, string> = {\r\n bug: 'red',\r\n feature: 'green',\r\n change: 'blue',\r\n improvement: 'cyan',\r\n task: 'geekblue',\r\n test: 'lime',\r\n};\r\n\r\nexport const ISSUE_TYPE_OPTIONS = [\r\n { label: '缺陷', value: 'bug' },\r\n { label: '新功能', value: 'feature' },\r\n { label: '需求变更', value: 'change' },\r\n { label: '改进', value: 'improvement' },\r\n { label: '任务', value: 'task' },\r\n { label: '测试记录', value: 'test' },\r\n];\r\n\r\nexport const ISSUE_TITLE_BY_TYPE = [\r\n { type: 'bug', title: '问题描述' },\r\n { type: 'feature', title: '新功能描述' },\r\n { type: 'change', title: '需求变更描述' },\r\n { type: 'improvement', title: '改进描述' },\r\n { type: 'task', title: '任务描述' },\r\n { type: 'test', title: '测试记录' },\r\n]\r\n\r\n","import { Component, input, output } from '@angular/core';\r\nimport { IssueEntity, IssuePriority, IssueStatus, IssueType } from '../models/issue.model';\r\nimport { NzTableModule } from 'ng-zorro-antd/table';\r\nimport { ISSUE_STATUS_COLORS, ISSUE_STATUS_LABELS } from '@app/shared/constants/status-options';\r\nimport { RdItemStatus } from '@pages/rd/models/rd.model';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { PRIORITY_COLORS, PRIORITY_LABELS } from '@app/shared/constants/priority-options';\r\nimport { NzProgressModule } from 'ng-zorro-antd/progress';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ISSUE_TYPE_COLORS, ISSUE_TYPE_LABELS } from '@app/shared/constants/issue-type-options';\r\n\r\n@Component({\r\n selector: 'app-issues-list-table',\r\n imports: [NzTableModule, NzTagModule, NzProgressModule, CommonModule],\r\n template: ` <nz-table\r\n [nzData]=\"issues()\"\r\n [nzFrontPagination]=\"false\"\r\n [nzShowPagination]=\"false\"\r\n [nzShowSizeChanger]=\"true\"\r\n class=\"rd-list\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"5%\">序号</th>\r\n <!-- <th nzWidth=\"7%\">编号</th> -->\r\n <th nzWidth=\"44%\">标题</th>\r\n <th nzWidth=\"8%\">状态</th>\r\n <th nzWidth=\"8%\">提报人</th>\r\n <th nzWidth=\"10%\">负责人</th>\r\n <th nzWidth=\"10%\">更新时间</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (item of issues(); track item.id) {\r\n <tr\r\n (click)=\"selectItem.emit(item)\"\r\n [style.background-color]=\"item.id === selectedItem()?.id ? '#1890ff24' : ''\"\r\n class=\"issue-item-row\"\r\n >\r\n <td>{{ $index + 1 }}</td>\r\n <td>\r\n <div class=\"title-wrap\">\r\n <span class=\"rd-title\"> [{{ item.issueNo }}] {{ item.title }} </span>\r\n <nz-tag [nzColor]=\"getTypeColor(item.type)\">\r\n {{ getTypeLabel(item.type) }}\r\n </nz-tag>\r\n <nz-tag [nzColor]=\"getPriorityColor(item.priority)\">\r\n {{ getPriorityLabel(item.priority) }}\r\n </nz-tag>\r\n @if (item.moduleCode) {\r\n <nz-tag nzColor=\"default\">{{ item.moduleCode }}</nz-tag>\r\n }\r\n </div>\r\n <div class=\"des\">{{ item.description }}</div>\r\n </td>\r\n <td>\r\n <nz-tag [nzColor]=\"getStatusColor(item.status)\">\r\n {{ getStatusLabel(item.status) }}\r\n </nz-tag>\r\n </td>\r\n <td>\r\n {{ item.reporterName || '-' }}\r\n </td>\r\n <td>\r\n {{ item.assigneeName }}<br />\r\n @if ((item.participantNames?.length ?? 0) > 0) {\r\n <span class=\"participant-inline\">· {{ participantNamesText(item) }}</span>\r\n }\r\n </td>\r\n <td>{{ (item.updatedAt | date: 'MM-dd HH:mm') ?? '_' }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>`,\r\n styles: `\r\n .title-wrap {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n min-width: 0; // 关键:让内部可以ellipsis\r\n }\r\n\r\n .rd-title {\r\n font-weight: 600; // 标题加粗\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n display: inline-block;\r\n max-width: 100%;\r\n }\r\n\r\n .des {\r\n font-size: 12px; // 描述变小\r\n color: #999; // 变灰\r\n margin-top: 2px;\r\n\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n :host ::ng-deep table[nz-table-content] {\r\n table-layout: fixed !important;\r\n }\r\n .participant-inline {\r\n font-size: 12px;\r\n color: gray;\r\n font-weight: 400;\r\n }\r\n .issue-item-row{\r\n cursor: pointer;\r\n }\r\n `,\r\n})\r\nexport class IssuesListTableComponent {\r\n readonly issues = input.required<IssueEntity[]>();\r\n readonly selectedItem = input<IssueEntity | null>();\r\n readonly selectItem = output<IssueEntity>();\r\n\r\n getStatusLabel(status: IssueStatus) {\r\n return ISSUE_STATUS_LABELS[status];\r\n }\r\n\r\n getStatusColor(status: IssueStatus) {\r\n return ISSUE_STATUS_COLORS[status];\r\n }\r\n\r\n getPriorityColor(priority: IssuePriority) {\r\n return PRIORITY_COLORS[priority];\r\n }\r\n\r\n getPriorityLabel(priority: IssuePriority) {\r\n return PRIORITY_LABELS[priority];\r\n }\r\n\r\n getTypeLabel(type: IssueType) {\r\n return ISSUE_TYPE_LABELS[type];\r\n }\r\n\r\n getTypeColor(type: IssueType) {\r\n return ISSUE_TYPE_COLORS[type];\r\n }\r\n\r\n participantNamesText(item: IssueEntity): string {\r\n const names = (item.participantNames ?? []).filter(Boolean);\r\n if (names.length === 0) {\r\n return '';\r\n }\r\n if (names.length <= 2) {\r\n return names.join('、');\r\n }\r\n return `${names.slice(0, 2).join('、')} +${names.length - 2}`;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nimport type { UserStore } from '@app/core/stores/user/user.store';\r\nimport type {\r\n IssueAttachmentEntity,\r\n IssueEntity,\r\n IssueParticipantEntity,\r\n} from '../models/issue.model';\r\nimport { HubAuthUser } from '@app/core/stores/user/user.types';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class IssuePermissionService {\r\n canEdit(issue: IssueEntity, user: HubAuthUser | null): boolean {\r\n return this.matchActor(user, issue.reporterId);\r\n }\r\n\r\n canAssign(issue: IssueEntity, user: HubAuthUser | null, isProjectAdmin = false): boolean {\r\n return !!this.getAssignActionLabel(issue, user, isProjectAdmin);\r\n }\r\n\r\n getAssignActionLabel(\r\n issue: IssueEntity,\r\n user: HubAuthUser | null,\r\n isProjectAdmin = false,\r\n ): string | null {\r\n if (!user) {\r\n return null;\r\n }\r\n\r\n if (!['open', 'reopened', 'in_progress', 'pending_update'].includes(issue.status)) {\r\n return null;\r\n }\r\n const isReporter = this.matchActor(user, issue.reporterId);\r\n const isAssignee = this.matchActor(user, issue.assigneeId);\r\n const isManager = isProjectAdmin;\r\n\r\n // 未有负责人时:提报人或管理角色可指派。\r\n if (!issue.assigneeId && (isReporter || isManager)) {\r\n return '指派';\r\n }\r\n\r\n // 已有负责人后:仅当前负责人可转派。\r\n if (issue.assigneeId && isAssignee) {\r\n return '转派';\r\n }\r\n\r\n return null;\r\n }\r\n\r\n canManageParticipants(\r\n issue: IssueEntity,\r\n user: HubAuthUser | null,\r\n isProjectAdmin = false,\r\n ): boolean {\r\n if (!['open', 'in_progress', 'pending_update'].includes(issue.status)) {\r\n return false;\r\n }\r\n if (!issue.assigneeId) {\r\n return false;\r\n }\r\n\r\n return (\r\n isProjectAdmin ||\r\n this.matchActor(user, issue.reporterId) ||\r\n this.matchActor(user, issue.assigneeId)\r\n );\r\n }\r\n\r\n canClaim(issue: IssueEntity, user: HubAuthUser | null): boolean {\r\n return (\r\n !!user?.userId &&\r\n !issue.assigneeId &&\r\n ['open', 'reopened', 'in_progress', 'pending_update'].includes(issue.status)\r\n );\r\n }\r\n\r\n canStart(issue: IssueEntity, user: HubAuthUser | null): boolean {\r\n return this.matchActor(user, issue.assigneeId);\r\n }\r\n\r\n canResolve(issue: IssueEntity, user: HubAuthUser | null): boolean {\r\n return this.canStart(issue, user);\r\n }\r\n\r\n canVerify(issue: IssueEntity, user: HubAuthUser | null): boolean {\r\n return this.matchActor(user, issue.verifierId) || this.matchActor(user, issue.reporterId);\r\n }\r\n\r\n canClose(issue: IssueEntity, user: HubAuthUser | null): boolean {\r\n if (!this.matchActor(user, issue.reporterId)) {\r\n return false;\r\n }\r\n return ['open', 'reopened', 'verified'].includes(issue.status);\r\n }\r\n\r\n canDeleteAttachment(\r\n attachment: IssueAttachmentEntity,\r\n user: HubAuthUser | null,\r\n isProjectAdmin = false,\r\n ): boolean {\r\n return isProjectAdmin || this.matchActor(user, attachment.upload.uploaderId);\r\n }\r\n\r\n // 协作分支\r\n canCreateBranches(\r\n issue: IssueEntity,\r\n user: HubAuthUser | null,\r\n participants: IssueParticipantEntity[],\r\n ): boolean {\r\n if (['verified', 'closed'].includes(issue.status)) {\r\n return false;\r\n }\r\n if (participants.length === 0) {\r\n return false;\r\n }\r\n return this.matchActor(user, issue.assigneeId);\r\n }\r\n\r\n canStartBranchActions(issue: IssueEntity, user: HubAuthUser | null): boolean {\r\n return !['resolved', 'verified', 'closed'].includes(issue.status);\r\n }\r\n\r\n canStartOwnBranch(\r\n issue: IssueEntity,\r\n user: HubAuthUser | null,\r\n participants: IssueParticipantEntity[],\r\n ): boolean {\r\n if (!issue || !user || ['resolved', 'verified', 'closed'].includes(issue.status)) {\r\n return false;\r\n }\r\n\r\n // 非协作人员不允许开始协作分支\r\n const isParticipant = participants.some((item) => item.userId === user.userId);\r\n if (!isParticipant) {\r\n return false;\r\n }\r\n\r\n // 负责人不允许开始自己的协作分支\r\n return !this.matchActor(user, issue.reporterId);\r\n }\r\n\r\n // 权限检查函数\r\n hasPermissionToRead(user: HubAuthUser): boolean {\r\n return user.scopes?.includes('issues:read') ?? false;\r\n }\r\n\r\n hasPermissionToComment(user: HubAuthUser): boolean {\r\n return user.scopes?.includes('issue:comment:write') ?? false;\r\n }\r\n\r\n hasPermissionToTransition(user: HubAuthUser): boolean {\r\n return user.scopes?.includes('issue:transition:write') ?? false;\r\n }\r\n\r\n hasPermissionToAssign(user: HubAuthUser): boolean {\r\n return user.scopes?.includes('issue:assign:write') ?? false;\r\n }\r\n\r\n hasPermissionToManageParticipants(user: HubAuthUser): boolean {\r\n return user.scopes?.includes('issue:participant:write') ?? false;\r\n }\r\n\r\n hasPermissionToBranchOperation(user: HubAuthUser): boolean {\r\n return user.scopes?.includes('issue:branch:write') ?? false;\r\n }\r\n\r\n matchActor(user: HubAuthUser | null, actorId: string | null): boolean {\r\n if (!user || !actorId) {\r\n return false;\r\n }\r\n\r\n const userId = user.userId?.trim();\r\n const accountId = user.id?.trim();\r\n return actorId === userId || actorId === accountId;\r\n }\r\n}\r\n","import { computed, inject, Injectable, signal } from '@angular/core';\r\nimport { forkJoin, from } from 'rxjs';\r\n\r\nimport { ProjectContextStore } from '@app/core/stores';\r\nimport { UserStore } from '@app/core/stores/user/user.store';\r\nimport {\r\n CreateIssueBranchInput,\r\n IssueBranchSummary,\r\n StartOwnIssueBranchInput,\r\n type AddParticipantsInput,\r\n type AssignIssueInput,\r\n type createCommentInput,\r\n type IssueAttachmentEntity,\r\n type IssueBranchEntity,\r\n type IssueCommentEntity,\r\n type IssueEntity,\r\n type IssueLogEntity,\r\n type IssueParticipantEntity,\r\n type ProjectMemberEntity,\r\n} from '../models/issue.model';\r\nimport { IssueApiService } from '../services/issue-api.service';\r\nimport { IssuePermissionService } from '../services/issue-permission.service';\r\n\r\n@Injectable()\r\nexport class IssueDetailStore {\r\n private readonly issueApi = inject(IssueApiService);\r\n private readonly userStore = inject(UserStore);\r\n private readonly permissionService = inject(IssuePermissionService);\r\n\r\n private readonly projectContext = inject(ProjectContextStore);\r\n\r\n private readonly issueState = signal<IssueEntity | null>(null);\r\n private readonly logsState = signal<IssueLogEntity[]>([]);\r\n private readonly commentsState = signal<IssueCommentEntity[]>([]);\r\n private readonly participantsState = signal<IssueParticipantEntity[]>([]);\r\n private readonly attachmentsState = signal<IssueAttachmentEntity[]>([]);\r\n private readonly branchesState = signal<IssueBranchEntity[]>([]);\r\n private readonly loadingState = signal(false);\r\n private readonly busyState = signal(false);\r\n private readonly actionTickState = signal(0);\r\n\r\n // 当前项目\r\n readonly currentProjectId = this.projectContext.currentProjectId;\r\n\r\n readonly issue = computed(() => this.issueState());\r\n readonly logs = computed(() => this.logsState());\r\n // readonly comments = computed(() => this.commentsState());\r\n readonly branches = computed(() => this.branchesState());\r\n readonly participants = computed(() => this.participantsState());\r\n readonly attachments = computed(() => this.attachmentsState());\r\n readonly members = computed(() => this.projectContext.currentProjectMembers());\r\n readonly loading = computed(() => this.loadingState());\r\n readonly busy = computed(() => this.busyState());\r\n readonly actionTick = computed(() => this.actionTickState());\r\n\r\n readonly branchSummary = computed<IssueBranchSummary>(() => {\r\n const branches = this.branchesState();\r\n const total = branches.length;\r\n const done = branches.filter((item) => item.status === 'done').length;\r\n const inProgress = branches.filter((item) => item.status === 'in_progress').length;\r\n const todo = branches.filter((item) => item.status === 'todo').length;\r\n return {\r\n total,\r\n done,\r\n inProgress,\r\n todo,\r\n };\r\n });\r\n\r\n readonly currentUser = this.userStore.currentUser;\r\n\r\n readonly availableMembers = computed(() => {\r\n const issue = this.issueState();\r\n const assigneeId = issue?.assigneeId ?? null;\r\n const usedUserIds = new Set(this.participantsState().map((item) => item.userId));\r\n return this.members().filter(\r\n (item) => !usedUserIds.has(item.userId) && item.userId !== assigneeId,\r\n );\r\n });\r\n\r\n /*---------------------------------权限(user的scopes内是token权限,优先级最高的)--------------------------- */\r\n readonly isProjectAdmin = computed(() => {\r\n const user = this.currentUser();\r\n if (!user) {\r\n return false;\r\n }\r\n const member = this.members().find((item) => item.userId === user.userId);\r\n return !!member && (member.roleCode === 'project_admin' || member.isOwner);\r\n });\r\n\r\n readonly canAssign = computed(() => {\r\n const issue = this.issueState();\r\n const currentUser = this.currentUser();\r\n if (!issue || !currentUser || !this.permissionService.hasPermissionToAssign(currentUser)) {\r\n return false;\r\n }\r\n return this.permissionService.canAssign(issue, currentUser, this.isProjectAdmin());\r\n });\r\n\r\n readonly canManageParticipants = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToManageParticipants(user)) {\r\n return false;\r\n }\r\n return this.permissionService.canManageParticipants(\r\n issue,\r\n this.currentUser(),\r\n this.isProjectAdmin(),\r\n );\r\n });\r\n\r\n readonly canClaim = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToTransition(user)) {\r\n return false;\r\n }\r\n return this.permissionService.canClaim(issue, this.currentUser());\r\n });\r\n\r\n readonly canStart = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToTransition(user)) {\r\n return false;\r\n }\r\n return (\r\n !!issue &&\r\n ['open', 'reopened', 'pending_update'].includes(issue.status) &&\r\n this.permissionService.canStart(issue, this.currentUser())\r\n );\r\n });\r\n\r\n readonly canResolve = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToTransition(user)) {\r\n return false;\r\n }\r\n return (\r\n !!issue &&\r\n ['in_progress', 'pending_update'].includes(issue.status) &&\r\n this.permissionService.canResolve(issue, this.currentUser())\r\n );\r\n });\r\n\r\n readonly canPendingUpdate = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToTransition(user)) {\r\n return false;\r\n }\r\n return (\r\n !!issue &&\r\n issue.status === 'in_progress' &&\r\n this.permissionService.canResolve(issue, this.currentUser())\r\n );\r\n });\r\n\r\n readonly canVerify = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToTransition(user)) {\r\n return false;\r\n }\r\n return (\r\n !!issue &&\r\n issue.status === 'resolved' &&\r\n this.permissionService.canVerify(issue, this.currentUser())\r\n );\r\n });\r\n\r\n readonly canReopen = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToTransition(user)) {\r\n return false;\r\n }\r\n return (\r\n !!issue &&\r\n ['resolved', 'verified', 'closed'].includes(issue.status) &&\r\n this.permissionService.canVerify(issue, this.currentUser())\r\n );\r\n });\r\n\r\n canComment = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToComment(user)) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n canRead = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToRead(user)) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n readonly canClose = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToTransition(user)) {\r\n return false;\r\n }\r\n return (\r\n !!issue &&\r\n ['open', 'in_progress', 'resolved', 'verified', 'reopened'].includes(issue.status) &&\r\n this.permissionService.canClose(issue, this.currentUser())\r\n );\r\n });\r\n\r\n /*---------------------------------- 协作分支权限 ------------------------------------- */\r\n readonly canCreateBranches = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToBranchOperation(user)) {\r\n return false;\r\n }\r\n\r\n return (\r\n this.isProjectAdmin() ||\r\n this.permissionService.canCreateBranches(issue, this.currentUser(), this.participants())\r\n );\r\n });\r\n\r\n readonly canStartBranchActions = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToBranchOperation(user)) {\r\n return false;\r\n }\r\n return !!issue && this.permissionService.canStartBranchActions(issue, this.currentUser());\r\n });\r\n\r\n // 主动开始协作\r\n readonly canStartOwnBranch = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToBranchOperation(user)) {\r\n return false;\r\n }\r\n if (!this.permissionService.canStartOwnBranch(issue, user, this.participantsState())) {\r\n return false;\r\n }\r\n\r\n // 如果有未完成的分支,则不允许再创建新的分支了\r\n return !this.branchesState().some(\r\n (item) => item.ownerUserId === user?.userId && item.status !== 'done',\r\n );\r\n });\r\n\r\n // 完成分支(组件内需要进一步确认是否属于自己的分支)\r\n readonly canCompleteBranch = computed(() => {\r\n const issue = this.issueState();\r\n const user = this.currentUser();\r\n if (!issue || !user || !this.permissionService.hasPermissionToBranchOperation(user)) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n readonly startActionLabel = computed(() => {\r\n const issue = this.issueState();\r\n if (!issue) {\r\n return '开始处理';\r\n }\r\n\r\n return issue.status === 'pending_update' ? '继续处理' : '开始处理';\r\n });\r\n\r\n readonly assignActionLabel = computed(() => {\r\n const issue = this.issueState();\r\n if (!issue) {\r\n return '重新指派';\r\n }\r\n return (\r\n this.permissionService.getAssignActionLabel(\r\n issue,\r\n this.currentUser(),\r\n this.isProjectAdmin(),\r\n ) ?? '重新指派'\r\n );\r\n });\r\n\r\n load(issueId: string): void {\r\n const currentProjectId = this.currentProjectId();\r\n if (!currentProjectId) {\r\n return;\r\n }\r\n this.userStore.ensureUserLoaded();\r\n this.loadingState.set(true);\r\n forkJoin({\r\n issue: this.issueApi.getIssueDetail(currentProjectId, issueId),\r\n logs: this.issueApi.getIssueLogs(currentProjectId, issueId),\r\n // comments: this.issueApi.getIssueComments(currentProjectId, issueId),\r\n branches: this.issueApi.getBranches(currentProjectId, issueId),\r\n participants: this.issueApi.getIssueParticipants(currentProjectId, issueId),\r\n attachments: this.issueApi.getIssueAttachments(currentProjectId, issueId),\r\n }).subscribe({\r\n next: ({ issue, logs, branches, participants, attachments }) => {\r\n this.issueState.set(issue);\r\n this.logsState.set(logs.items);\r\n this.branchesState.set(branches.items);\r\n // this.commentsState.set(comments.items);\r\n this.participantsState.set(participants.items);\r\n this.attachmentsState.set(attachments.items);\r\n },\r\n error: () => {\r\n this.loadingState.set(false);\r\n },\r\n });\r\n }\r\n\r\n postComment(comment: createCommentInput): void {\r\n const issueId = this.issueState()?.id;\r\n if (!issueId || !comment.content.trim()) {\r\n return;\r\n }\r\n\r\n this.busyState.set(true);\r\n from(\r\n this.issueApi.createIssueComment(issueId, comment.content.trim(), comment.mentions),\r\n ).subscribe({\r\n next: (comment) => {\r\n this.commentsState.update((items) => [comment, ...items]);\r\n this.refreshLogs(issueId);\r\n this.busyState.set(false);\r\n },\r\n error: () => {\r\n this.busyState.set(false);\r\n },\r\n });\r\n }\r\n\r\n start(): void {\r\n this.runIssueAction((issueId) => this.issueApi.startIssue(issueId));\r\n }\r\n\r\n claim(): void {\r\n this.runIssueAction((issueId) => this.issueApi.claimIssue(issueId));\r\n }\r\n\r\n assign(input: AssignIssueInput): void {\r\n if (!input.assigneeId.trim()) {\r\n return;\r\n }\r\n this.runIssueAction((issueId) => this.issueApi.assignIssue(issueId, input));\r\n }\r\n\r\n waitForUpdate(): void {\r\n this.runIssueAction((issueId) => this.issueApi.waitUpdateIssue(issueId));\r\n }\r\n\r\n resolve(summary?: string): void {\r\n this.runIssueAction((issueId) => this.issueApi.resolveIssue(issueId, summary));\r\n }\r\n\r\n // verify(): void {\r\n // const currentProjectId = this.currentProjectId();\r\n // if (!currentProjectId) {\r\n // return;\r\n // }\r\n // this.runIssueAction((issueId) => this.issueApi.verify(issueId));\r\n // }\r\n\r\n // reopen(remark?: string): void {\r\n // const currentProjectId = this.currentProjectId();\r\n // if (!currentProjectId) {\r\n // return;\r\n // }\r\n // this.runIssueAction((issueId) => this.issueApi.reopen(issueId, remark));\r\n // }\r\n\r\n // close(reason?: string, remark?: string): void {\r\n // const currentProjectId = this.currentProjectId();\r\n // if (!currentProjectId) {\r\n // return;\r\n // }\r\n // this.runIssueAction((issueId) => this.issueApi.close(issueId, { reason, remark }));\r\n // }\r\n\r\n addParticipants(input: AddParticipantsInput): void {\r\n const issueId = this.issueState()?.id;\r\n const userIds = input.userIds;\r\n const ids = [...new Set(userIds.map((item) => item.trim()).filter(Boolean))];\r\n if (!issueId || ids.length === 0) {\r\n return;\r\n }\r\n // const inputFormated = { userIds: ids };\r\n\r\n this.busyState.set(true);\r\n forkJoin(ids.map((userId) => this.issueApi.addParticipant(issueId, { userId }))).subscribe({\r\n next: (participants) => {\r\n this.participantsState.update((items) => [...items, ...participants]);\r\n this.refreshLogs(issueId);\r\n this.busyState.set(false);\r\n },\r\n error: () => {\r\n this.busyState.set(false);\r\n },\r\n });\r\n }\r\n\r\n removeParticipant(participantId: string): void {\r\n const issueId = this.issueState()?.id;\r\n if (!issueId) {\r\n return;\r\n }\r\n\r\n this.busyState.set(true);\r\n from(this.issueApi.removeParticipant(issueId, participantId)).subscribe({\r\n next: () => {\r\n this.participantsState.update((items) => items.filter((item) => item.id !== participantId));\r\n this.refreshLogs(issueId);\r\n this.busyState.set(false);\r\n },\r\n error: () => {\r\n this.busyState.set(false);\r\n },\r\n });\r\n }\r\n\r\n // uploadAttachment(file: File): void {\r\n // const issueId = this.issueState()?.id;\r\n // if (!issueId) {\r\n // return;\r\n // }\r\n\r\n // this.busyState.set(true);\r\n // this.issueApi.uploadFile(file, issueId).subscribe({\r\n // next: (upload) => {\r\n // this.issueApi.addAttachment(issueId, upload.id).subscribe({\r\n // next: (attachment) => {\r\n // this.attachmentsState.update((items) => [...items, attachment]);\r\n // this.busyState.set(false);\r\n // },\r\n // error: () => {\r\n // this.busyState.set(false);\r\n // },\r\n // });\r\n // },\r\n // error: () => {\r\n // this.busyState.set(false);\r\n // },\r\n // });\r\n // }\r\n\r\n // removeAttachment(attachmentId: string): void {\r\n // const issueId = this.issueState()?.id;\r\n // if (!issueId) {\r\n // return;\r\n // }\r\n\r\n // this.busyState.set(true);\r\n // this.issueApi.removeAttachment(issueId, attachmentId).subscribe({\r\n // next: () => {\r\n // this.attachmentsState.update((items) => items.filter((item) => item.id !== attachmentId));\r\n // this.busyState.set(false);\r\n // },\r\n // error: () => {\r\n // this.busyState.set(false);\r\n // },\r\n // });\r\n // }\r\n\r\n createBranch(input: CreateIssueBranchInput): void {\r\n const issueId = this.issueState()?.id;\r\n if (!issueId || !input.ownerUserId.trim() || !input.title.trim()) {\r\n return;\r\n }\r\n this.busyState.set(true);\r\n from(\r\n this.issueApi.createBranch(issueId, {\r\n ownerUserId: input.ownerUserId.trim(),\r\n title: input.title.trim(),\r\n }),\r\n ).subscribe({\r\n next: (branch) => {\r\n this.branchesState.update((items) => [branch, ...items]);\r\n this.refreshLogs(issueId);\r\n this.busyState.set(false);\r\n },\r\n error: () => {\r\n this.busyState.set(false);\r\n },\r\n });\r\n }\r\n\r\n startOwnBranch(input: StartOwnIssueBranchInput): void {\r\n const issueId = this.issueState()?.id;\r\n const title = input.title.trim();\r\n if (!issueId || !title) {\r\n return;\r\n }\r\n this.busyState.set(true);\r\n from(this.issueApi.startOwnBranch(issueId, { title })).subscribe({\r\n next: () => {\r\n this.refreshBranches(issueId);\r\n this.refreshLogs(issueId);\r\n this.busyState.set(false);\r\n },\r\n error: () => {\r\n this.busyState.set(false);\r\n },\r\n });\r\n }\r\n\r\n startBranch(branchId: string): void {\r\n const issueId = this.issueState()?.id;\r\n if (!issueId) {\r\n return;\r\n }\r\n this.busyState.set(true);\r\n from(this.issueApi.startBranch(issueId, branchId)).subscribe({\r\n next: () => {\r\n this.refreshBranches(issueId);\r\n this.refreshLogs(issueId);\r\n this.busyState.set(false);\r\n },\r\n error: () => {\r\n this.busyState.set(false);\r\n },\r\n });\r\n }\r\n\r\n completeBranch(branchId: string): void {\r\n const issueId = this.issueState()?.id;\r\n if (!issueId) {\r\n return;\r\n }\r\n this.busyState.set(true);\r\n from(this.issueApi.completeBranch(issueId, branchId)).subscribe({\r\n next: () => {\r\n this.refreshBranches(issueId);\r\n this.refreshLogs(issueId);\r\n this.busyState.set(false);\r\n },\r\n error: () => {\r\n this.busyState.set(false);\r\n },\r\n });\r\n }\r\n\r\n private runIssueAction(request: (issueId: string) => Promise<IssueEntity>): void {\r\n const issueId = this.issueState()?.id;\r\n if (!issueId) {\r\n return;\r\n }\r\n\r\n this.busyState.set(true);\r\n request(issueId)\r\n .then((issue) => {\r\n this.issueState.set(issue);\r\n this.busyState.set(false);\r\n this.refreshLogs(issueId);\r\n this.actionTickState.update((value) => value + 1);\r\n })\r\n .catch((error) => {\r\n this.busyState.set(false);\r\n });\r\n }\r\n\r\n private refreshLogs(issueId: string): void {\r\n const currentProjectId = this.currentProjectId();\r\n if (!currentProjectId) {\r\n return;\r\n }\r\n from(this.issueApi.getIssueLogs(currentProjectId, issueId)).subscribe({\r\n next: (logs) => this.logsState.set(logs.items),\r\n });\r\n }\r\n\r\n private refreshBranches(issueId: string): void {\r\n const projuectId = this.currentProjectId();\r\n if (!projuectId) {\r\n return;\r\n }\r\n from(this.issueApi.getBranches(projuectId, issueId)).subscribe({\r\n next: (branches) => this.branchesState.set(branches.items),\r\n });\r\n }\r\n\r\n setSelectedIssue(issue: IssueEntity | null): void {\r\n this.issueState.set(issue);\r\n }\r\n}\r\n","/* angular:styles/component:less;583973471331d0e5b68d495311f8875908402313564d06d0b32429e6c5671568;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\issue-detail\\issue-detail.component.ts */\n.title-wrap {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.title-wrap .subtitle {\n margin-right: 1rem;\n font-size: 12px;\n line-height: 1.4;\n padding: 3px 8px;\n border-radius: 4px;\n white-space: nowrap;\n background: #f1f5f9;\n color: #64748b;\n}\n.detail-wrap {\n width: 100%;\n gap: 10px;\n}\n.detail-wrap .detail-header {\n width: 100%;\n}\n.detail-wrap .detail-content {\n width: 100%;\n display: flex;\n gap: 10px;\n}\n.detail-wrap .wrap-title {\n width: 100%;\n margin-bottom: 12px;\n font-size: 18px;\n font-weight: bold;\n border-bottom: 1px solid #bbbbbb;\n}\n.detail-wrap .left-column {\n width: 60%;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n.detail-wrap .right-column {\n width: 40%;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n/*# sourceMappingURL=issue-detail.component.css.map */\n","/* angular:styles/component:less;a4a1de8f26f191554fffb46f9546a8f800a56256a410a27a21bd199b286a3e36;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\issue-detail\\issue-action-area\\issue-action-area.component.ts */\n.action-btns {\n margin-top: 20px;\n display: flex;\n gap: 10px;\n}\n:host ::ng-deep .ant-steps-item-title::after {\n background-color: #d3d3d3 !important;\n}\n/*# sourceMappingURL=issue-action-area.component.css.map */\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { ISSUE_STATUS, ISSUE_STATUS_FILTER_OPTIONS } from '@app/shared/constants/status-options';\r\nimport { DetailItemCardComponent } from '@app/shared/ui/detail-item-card.component/detail-item-card.component';\r\nimport {\r\n IssueActionType,\r\n IssueEntity,\r\n IssueLogEntity,\r\n IssueStatus,\r\n} from '@pages/issues/models/issue.model';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { log } from 'ng-zorro-antd/core/logger';\r\nimport { NzModalModule, NzModalService } from 'ng-zorro-antd/modal';\r\nimport { NzStepsModule } from 'ng-zorro-antd/steps';\r\n\r\n@Component({\r\n selector: 'app-issue-action-area',\r\n imports: [NzStepsModule, NzButtonModule, NzModalModule, DetailItemCardComponent],\r\n template: `\r\n <app-detail-item-card>\r\n <div class=\"action-area\">\r\n <div class=\"steps\">\r\n <nz-steps [nzCurrent]=\"getStepIndex(issue().status)\" nzSize=\"small\">\r\n @for (step of stepsOptions; track step.value) {\r\n <nz-step [nzTitle]=\"step.label\" [nzStatus]=\"stepState(step.value)\"></nz-step>\r\n }\r\n </nz-steps>\r\n </div>\r\n <div class=\"action-btns\">\r\n @if (canStart()) {\r\n <button\r\n nz-button\r\n nzType=\"default\"\r\n class=\"detail-header__action-btn\"\r\n (click)=\"actionClick.emit('start')\"\r\n >\r\n {{ startActionLabel() }}\r\n </button>\r\n }\r\n @if (canClaim()) {\r\n <button\r\n nz-button\r\n nzType=\"default\"\r\n class=\"detail-header__action-btn\"\r\n (click)=\"actionClick.emit('claim')\"\r\n >\r\n 认领\r\n </button>\r\n }\r\n @if (canAssign()) {\r\n <button\r\n nz-button\r\n nzType=\"default\"\r\n class=\"detail-header__action-btn\"\r\n (click)=\"actionClick.emit('assign')\"\r\n >\r\n {{ assignActionLabel() }}\r\n </button>\r\n }\r\n @if (canManageParticipants()) {\r\n <button\r\n nz-button\r\n nzType=\"default\"\r\n class=\"detail-header__action-btn\"\r\n (click)=\"actionClick.emit('add_participants')\"\r\n >\r\n 添加协作人\r\n </button>\r\n }\r\n @if (canPendingUpdate()) {\r\n <button\r\n nz-button\r\n nzType=\"default\"\r\n class=\"detail-header__action-btn\"\r\n (click)=\"actionClick.emit('wait-update')\"\r\n >\r\n 标记待提测\r\n </button>\r\n }\r\n @if (canResolve()) {\r\n <button\r\n nz-button\r\n nzType=\"primary\"\r\n class=\"detail-header__action-btn\"\r\n (click)=\"actionClick.emit('resolve')\"\r\n >\r\n 标记解决\r\n </button>\r\n }\r\n\r\n <!-- @if (canVerify()) {\r\n <button\r\n nz-button\r\n nzType=\"primary\"\r\n class=\"detail-header__action-btn\"\r\n (click)=\"actionClick.emit('verify')\"\r\n >\r\n 验证通过\r\n </button>\r\n }\r\n @if (canReopen()) {\r\n <button\r\n nz-button\r\n nzType=\"default\"\r\n class=\"detail-header__action-btn\"\r\n (click)=\"actionClick.emit('reopen')\"\r\n >\r\n 重新打开\r\n </button>\r\n } -->\r\n <!-- @if (canClose()) {\r\n <button\r\n nz-button\r\n nzDanger\r\n nzType=\"default\"\r\n class=\"detail-header__action-btn\"\r\n (click)=\"actionClick.emit('close')\"\r\n >\r\n 关闭问题\r\n </button>\r\n } -->\r\n </div>\r\n </div>\r\n </app-detail-item-card>\r\n `,\r\n styles: `\r\n .action-btns {\r\n margin-top: 20px;\r\n display: flex;\r\n gap: 10px;\r\n }\r\n :host ::ng-deep .ant-steps-item-title::after {\r\n background-color: #d3d3d3 !important;\r\n }\r\n `,\r\n})\r\nexport class IssueActionAreaComponent {\r\n readonly issue = input.required<IssueEntity>();\r\n readonly logs = input<IssueLogEntity[]>([]);\r\n readonly canStart = input(false);\r\n readonly canClaim = input(false);\r\n readonly canAssign = input(false);\r\n readonly canManageParticipants = input(false);\r\n readonly canResolve = input(false);\r\n readonly canPendingUpdate = input(false);\r\n readonly canVerify = input(false);\r\n readonly canReopen = input(false);\r\n readonly canClose = input(false);\r\n\r\n readonly assignActionLabel = input('重新指派');\r\n readonly startActionLabel = input('开始处理');\r\n\r\n readonly actionClick = output<IssueActionType>();\r\n\r\n readonly excutedStatuses = computed(() => {\r\n const executedStatusesSet = new Set();\r\n const openCutoff = this.latestOpenAt();\r\n this.logs().forEach((log, index) => {\r\n // 只显示最近一次打开(重新打开)之后的状态变更,之前的状态变更不再展示为已执行\r\n if (openCutoff !== null && Date.parse(log.createdAt) < openCutoff) {\r\n return;\r\n }\r\n executedStatusesSet.add(log.toStatus);\r\n });\r\n if (executedStatusesSet.has('resolved')) {\r\n executedStatusesSet.add('pending_update');\r\n }\r\n return executedStatusesSet;\r\n });\r\n\r\n readonly stepsOptions = ISSUE_STATUS_FILTER_OPTIONS.filter((opt) => {\r\n if (opt.value === 'reopened' || opt.value === '') {\r\n return false;\r\n }\r\n return true;\r\n }) as { label: string; value: Exclude<IssueStatus, 'reopened'> }[];\r\n\r\n // 根据logs标记经过的历史状态\r\n stepState(stepOptValue: Exclude<IssueStatus, 'reopened'>) {\r\n if (\r\n this.issue().status === stepOptValue ||\r\n (stepOptValue === 'open' && this.issue().status === 'reopened')\r\n ) {\r\n return 'process';\r\n }\r\n if (\r\n this.excutedStatuses().has(stepOptValue) ||\r\n (stepOptValue === 'open' && this.excutedStatuses().has('reopened'))\r\n ) {\r\n return 'finish';\r\n }\r\n return 'wait';\r\n }\r\n\r\n getStepIndex(status: IssueStatus): number {\r\n if (status === 'reopened') {\r\n return 0; // 重新打开状态特殊处理,显示在待处理\r\n }\r\n if (status === 'closed') {\r\n return 4; // 关闭状态显示在最后\r\n }\r\n const index = ISSUE_STATUS.findIndex((s) => s === status) ?? -1;\r\n return index;\r\n }\r\n\r\n // 获取最近一次打开(重新打开)的时间戳\r\n private latestOpenAt(): number | null {\r\n let latest: number | null = null;\r\n for (const log of this.logs()) {\r\n const isReopen = log.actionType === 'reopen' && log.toStatus === 'reopened';\r\n const isOpen = log.actionType === 'create' && log.toStatus === 'open';\r\n if (!isReopen && !isOpen) {\r\n continue;\r\n }\r\n const timestamp = Date.parse(log.createdAt);\r\n if (Number.isNaN(timestamp)) {\r\n continue;\r\n }\r\n if (latest === null || timestamp > latest) {\r\n latest = timestamp;\r\n }\r\n }\r\n return latest;\r\n }\r\n}\r\n","/* angular:styles/component:less;cd40aadaf0e0ce4569db6b20d9cfe6870e0d2c0254d8272d47b2da5d43ba8f75;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\issue-detail\\issue-attachment-area\\issue-attachment-area.component.ts */\n.empty {\n text-align: center;\n color: gray;\n}\n/*# sourceMappingURL=issue-attachment-area.component.css.map */\n","/* angular:styles/component:less;3ce58ef2f340570f6e6ecea80116ec155206b7bf00ca1325efe3be0a99ee9606;D:\\ng-manager\\webapp\\src\\app\\shared\\components\\attachment-viewer\\attachment-viewer.component.ts */\n.attachment-viewer__item {\n margin: 6px;\n position: relative;\n height: 120px;\n border-radius: 8px;\n overflow: hidden;\n background: #f5f5f5;\n}\n.attachment-viewer__image,\n.attachment-viewer__video {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n.attachment-viewer__video {\n background: #000;\n}\n.attachment-viewer__file {\n width: 100%;\n height: 100%;\n display: grid;\n place-content: center;\n gap: 6px;\n text-align: center;\n padding: 8px;\n font-size: 12px;\n}\n.attachment-viewer__file-name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.attachment-viewer__info {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: 40%;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n padding: 8px;\n box-sizing: border-box;\n color: #fff;\n background:\n linear-gradient(\n to top,\n rgba(0, 0, 0, 0.85),\n rgba(0, 0, 0, 0.4),\n transparent);\n}\n.attachment-viewer__name {\n font-size: 12px;\n font-weight: 600;\n line-height: 1.2;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.attachment-viewer__meta {\n font-size: 11px;\n opacity: 0.85;\n display: flex;\n gap: 8px;\n}\n.attachment-viewer__mask {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.2s;\n cursor: pointer;\n}\n.attachment-viewer__item:hover .attachment-viewer__mask {\n opacity: 1;\n}\n.attachment-viewer__preview {\n font-size: 18px;\n color: #fff;\n}\n/*# sourceMappingURL=attachment-viewer.component.css.map */\n","import { Component, inject, input, signal, TemplateRef, ViewChild } from '@angular/core';\r\nimport { NzImageModule } from 'ng-zorro-antd/image';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzModalModule, NzModalService } from 'ng-zorro-antd/modal';\r\n\r\nexport interface AttachmentPreviewItem {\r\n id: string;\r\n name: string;\r\n url: string;\r\n kind: 'image' | 'video' | 'file';\r\n meta?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-attachment-viewer',\r\n standalone: true,\r\n imports: [NzImageModule, NzIconModule, NzModalModule],\r\n template: `\r\n <div class=\"attachment-viewer__item\">\r\n <!-- 内容 -->\r\n @if (item().kind === 'image') {\r\n <img\r\n nz-image\r\n class=\"attachment-viewer__image\"\r\n [nzSrc]=\"item().url\"\r\n [alt]=\"item().name\"\r\n [attr.data-preview-id]=\"item().id\"\r\n />\r\n } @else if (item().kind === 'video') {\r\n <video class=\"attachment-viewer__video\" [src]=\"item().url\"></video>\r\n } @else {\r\n <div class=\"attachment-viewer__file\">\r\n <span nz-icon nzType=\"file\"></span>\r\n <span class=\"attachment-viewer__file-name\">{{ item().name }}</span>\r\n </div>\r\n }\r\n\r\n <!-- 底部信息层 -->\r\n <div class=\"attachment-viewer__info\">\r\n <div class=\"attachment-viewer__name\" [title]=\"item().name\">\r\n {{ item().name }}\r\n </div>\r\n\r\n <div class=\"attachment-viewer__meta\">\r\n @if (item().meta) {\r\n <span>{{ item().meta }}</span>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- 遮罩层 -->\r\n <div class=\"attachment-viewer__mask\" (click)=\"openPreview(item())\">\r\n @if (item().kind === 'image') {\r\n <span class=\"attachment-viewer__preview\">\r\n <span nz-icon nzType=\"eye\"></span>\r\n </span>\r\n } @else if (item().kind === 'video') {\r\n <span class=\"attachment-viewer__preview\">\r\n <span nz-icon nzType=\"play-circle\"></span>\r\n </span>\r\n } @else if (item().kind === 'file') {\r\n <span class=\"attachment-viewer__preview\">\r\n <span nz-icon nzType=\"download\"></span>\r\n </span>\r\n }\r\n </div>\r\n\r\n <ng-template #videoTpl>\r\n <video\r\n [src]=\"previewUrl()\"\r\n controls\r\n autoplay\r\n style=\"width:100%;height:100%;background:#000\"\r\n ></video>\r\n </ng-template>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .attachment-viewer__item {\r\n margin: 6px;\r\n position: relative;\r\n height: 120px;\r\n border-radius: 8px;\r\n overflow: hidden;\r\n background: #f5f5f5;\r\n }\r\n\r\n .attachment-viewer__image,\r\n .attachment-viewer__video {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n display: block;\r\n }\r\n\r\n .attachment-viewer__video {\r\n background: #000;\r\n }\r\n\r\n .attachment-viewer__file {\r\n width: 100%;\r\n height: 100%;\r\n display: grid;\r\n place-content: center;\r\n gap: 6px;\r\n text-align: center;\r\n padding: 8px;\r\n font-size: 12px;\r\n }\r\n\r\n .attachment-viewer__file-name {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n /* 👇 信息层(40%) */\r\n .attachment-viewer__info {\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n height: 40%;\r\n\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: flex-end;\r\n\r\n padding: 8px;\r\n box-sizing: border-box;\r\n\r\n color: #fff;\r\n\r\n background: linear-gradient(to top, rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0.4), transparent);\r\n }\r\n\r\n .attachment-viewer__name {\r\n font-size: 12px;\r\n font-weight: 600;\r\n line-height: 1.2;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n .attachment-viewer__meta {\r\n font-size: 11px;\r\n opacity: 0.85;\r\n display: flex;\r\n gap: 8px;\r\n }\r\n\r\n /* hover 遮罩 */\r\n .attachment-viewer__mask {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n background: rgba(0, 0, 0, 0.5);\r\n opacity: 0;\r\n transition: opacity 0.2s;\r\n cursor: pointer;\r\n }\r\n\r\n .attachment-viewer__item:hover .attachment-viewer__mask {\r\n opacity: 1;\r\n }\r\n\r\n .attachment-viewer__preview {\r\n font-size: 18px;\r\n color: #fff;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class AttachmentViewerComponent {\r\n private readonly modal = inject(NzModalService);\r\n readonly item = input.required<AttachmentPreviewItem>();\r\n\r\n @ViewChild('videoTpl', { static: true }) videoTpl!: TemplateRef<any>;\r\n previewUrl = signal('');\r\n\r\n openPreview(item: AttachmentPreviewItem) {\r\n if (item.kind === 'image') {\r\n const el = document.querySelector(\r\n `img[data-preview-id=\"${item.id}\"]`,\r\n ) as HTMLImageElement | null;\r\n\r\n el?.click();\r\n return;\r\n }\r\n\r\n if (item.kind === 'video') {\r\n this.previewUrl.set(item.url);\r\n\r\n this.modal.create({\r\n nzContent: this.videoTpl,\r\n nzFooter: null,\r\n nzWidth: '80vw',\r\n nzBodyStyle: {\r\n padding: '0',\r\n background: '#000',\r\n },\r\n nzCentered: true,\r\n });\r\n }\r\n\r\n if (item.kind === 'file') {\r\n this.downloadFile(item);\r\n }\r\n }\r\n\r\n private downloadFile(item: AttachmentPreviewItem) {\r\n const link = document.createElement('a');\r\n link.href = item.url;\r\n link.download = item.name; // 指定文件名\r\n link.target = '_blank'; // 防止某些浏览器拦截\r\n link.click();\r\n link.remove();\r\n }\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport {\r\n AttachmentPreviewItem,\r\n AttachmentViewerComponent,\r\n} from '@app/shared/components/attachment-viewer/attachment-viewer.component';\r\nimport { DetailItemCardComponent } from '@app/shared/ui/detail-item-card.component/detail-item-card.component';\r\nimport { ProjectMemberEntity } from '@models/project.model';\r\nimport { IssueAttachmentEntity } from '@pages/issues/models/issue.model';\r\n@Component({\r\n selector: 'app-issue-attachment-area',\r\n imports: [AttachmentViewerComponent, DetailItemCardComponent],\r\n template: `\r\n <app-detail-item-card title=\"附件\">\r\n @if (attachments().length > 0) {\r\n @for (item of attachmentPreviewItems(); track $index) {\r\n <app-attachment-viewer [item]=\"item\"></app-attachment-viewer>\r\n }\r\n } @else {\r\n <div class=\"empty\">当前还没有附件</div>\r\n }\r\n </app-detail-item-card>\r\n `,\r\n styles: `\r\n .empty {\r\n text-align: center;\r\n color: gray;\r\n }\r\n `,\r\n})\r\nexport class IssueAttachmentAreaComponent {\r\n readonly attachments = input<IssueAttachmentEntity[]>([]);\r\n readonly projectId = input<string>('');\r\n readonly members = input<ProjectMemberEntity[]>([]);\r\n protected readonly apiBaseUrl = '';\r\n\r\n attachmentPreviewItems(): AttachmentPreviewItem[] {\r\n return this.attachments().map((item) => {\r\n const mime = (item.upload.mimeType || '').toLowerCase();\r\n const uploaderName = this.resolveUploaderName(\r\n item.upload.uploaderId,\r\n item.upload.uploaderName,\r\n );\r\n const kind: AttachmentPreviewItem['kind'] = mime.startsWith('image/')\r\n ? 'image'\r\n : mime.startsWith('video/')\r\n ? 'video'\r\n : 'file';\r\n return {\r\n id: item.id,\r\n name: item.upload.originalName,\r\n url: this.fileUrl(item),\r\n kind,\r\n meta: `${uploaderName} · ${item.upload.mimeType || 'file'} · ${this.formatSize(item.upload.fileSize)}`,\r\n };\r\n });\r\n }\r\n\r\n private fileUrl(item: IssueAttachmentEntity): string {\r\n return `/api/client/hub-token/projects/${this.projectId()}/issues/${item.issueId}/attachments/${item.id}/raw`;\r\n }\r\n\r\n private formatSize(size: number): string {\r\n if (!Number.isFinite(size) || size < 0) {\r\n return '-';\r\n }\r\n if (size < 1024) {\r\n return `${size} B`;\r\n }\r\n if (size < 1024 * 1024) {\r\n return `${(size / 1024).toFixed(1)} KB`;\r\n }\r\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\r\n }\r\n\r\n private resolveUploaderName(uploaderId: string | null, uploaderName: string | null): string {\r\n const normalizedName = uploaderName?.trim();\r\n if (normalizedName) {\r\n return normalizedName;\r\n }\r\n const normalizedId = uploaderId?.trim();\r\n if (!normalizedId) {\r\n return '未知上传者';\r\n }\r\n return this.members().find((item) => item.userId === normalizedId)?.displayName || normalizedId;\r\n }\r\n}\r\n","/* angular:styles/component:less;f4cc8dbe7ed1586614eca11e1756bac529bedfb506bdac0542314e3ecf33c0fd;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\issue-detail\\issue-base-info-area\\issue-base-info-area.component.ts */\n:host ::ng-deep .ant-descriptions-item-content,\n:host ::ng-deep .ant-descriptions-item-label {\n font-size: 0.875rem;\n}\n/*# sourceMappingURL=issue-base-info-area.component.css.map */\n","import { CommonModule } from '@angular/common';\r\nimport { Component, input } from '@angular/core';\r\nimport { ISSUE_TYPE_COLORS, ISSUE_TYPE_LABELS } from '@app/shared/constants/issue-type-options';\r\nimport { PRIORITY_COLORS, PRIORITY_LABELS } from '@app/shared/constants/priority-options';\r\nimport { ISSUE_STATUS_COLORS, ISSUE_STATUS_LABELS } from '@app/shared/constants/status-options';\r\nimport { DetailItemCardComponent } from '@app/shared/ui/detail-item-card.component/detail-item-card.component';\r\nimport {\r\n IssueEntity,\r\n IssuePriority,\r\n IssueStatus,\r\n IssueType,\r\n} from '@pages/issues/models/issue.model';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzDescriptionsModule } from 'ng-zorro-antd/descriptions';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\n\r\n@Component({\r\n selector: 'app-issue-base-info-area',\r\n standalone: true,\r\n imports: [NzCardModule, NzDescriptionsModule, NzTagModule, CommonModule, DetailItemCardComponent],\r\n template: `\r\n <app-detail-item-card [title]=\"'基础信息'\">\r\n <nz-descriptions nzBordered nzSize=\"small\" [nzColumn]=\"1\">\r\n <nz-descriptions-item nzTitle=\"提报人\">\r\n <b>{{ issue().reporterName }}</b>\r\n </nz-descriptions-item>\r\n <nz-descriptions-item nzTitle=\"负责人\">\r\n <b>{{ issue().assigneeName || '-' }}</b>\r\n </nz-descriptions-item>\r\n <nz-descriptions-item nzTitle=\"验收人\">\r\n <b>{{ issue().verifierName || '-' }}</b>\r\n </nz-descriptions-item>\r\n <nz-descriptions-item nzTitle=\"状态\">\r\n <nz-tag [nzColor]=\"getStatusColor(issue().status)\">\r\n {{ getStatusLabel(issue().status) }}\r\n </nz-tag>\r\n </nz-descriptions-item>\r\n <nz-descriptions-item nzTitle=\"优先级\">\r\n <nz-tag [nzColor]=\"getPriorityColor(issue().priority)\">\r\n {{ getPriorityLabel(issue().priority) }}\r\n </nz-tag>\r\n </nz-descriptions-item>\r\n <nz-descriptions-item nzTitle=\"类型\">\r\n <nz-tag [nzColor]=\"getTypeColor(issue().type)\">\r\n {{ getTypeLabel(issue().type) }}\r\n </nz-tag>\r\n </nz-descriptions-item>\r\n <nz-descriptions-item nzTitle=\"模块\">\r\n {{ issue().moduleCode || '-' }}\r\n </nz-descriptions-item>\r\n <nz-descriptions-item nzTitle=\"环境\">\r\n {{ issue().environmentCode || '-' }}\r\n </nz-descriptions-item>\r\n <nz-descriptions-item nzTitle=\"创建时间\">\r\n {{ issue().createdAt | date: 'yyyy-MM-dd HH:mm' }}\r\n </nz-descriptions-item>\r\n </nz-descriptions>\r\n </app-detail-item-card>\r\n `,\r\n styles: `\r\n :host ::ng-deep .ant-descriptions-item-content,\r\n :host ::ng-deep .ant-descriptions-item-label {\r\n font-size: 0.875rem;\r\n }\r\n `,\r\n})\r\nexport class IssueBaseInfoAreaComponent {\r\n issue = input.required<IssueEntity>();\r\n\r\n getPriorityLabel(priority: IssuePriority) {\r\n return PRIORITY_LABELS[priority];\r\n }\r\n\r\n getPriorityColor(priority: IssuePriority) {\r\n return PRIORITY_COLORS[priority];\r\n }\r\n\r\n getStatusLabel(status: IssueStatus) {\r\n return ISSUE_STATUS_LABELS[status];\r\n }\r\n\r\n getStatusColor(status: IssueStatus) {\r\n return ISSUE_STATUS_COLORS[status];\r\n }\r\n\r\n getTypeLabel(type: IssueType) {\r\n return ISSUE_TYPE_LABELS[type];\r\n }\r\n\r\n getTypeColor(type: IssueType) {\r\n return ISSUE_TYPE_COLORS[type];\r\n }\r\n}\r\n","/* angular:styles/component:less;f015cae12e63c7fe03a870fb28e54a9c93022f1ab53f56c665c1acd1b81d9b80;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\issue-detail\\issue-collaborators-area\\issue-collaborators-panel.component.ts */\n.empty {\n text-align: center;\n color: gray;\n}\n.participant-list {\n width: 100%;\n display: flex;\n flex-wrap: wrap;\n gap: 20px 8px;\n padding: 10px 0;\n}\n.participant-item {\n height: 20px;\n display: flex;\n justify-content: space-between;\n gap: 12px;\n align-items: center;\n}\n.participant-chip {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 4px 10px 4px 4px;\n border-radius: 999px;\n background: #ecebeb;\n}\n.participant-item__name {\n font-size: 0.875rem;\n font-weight: 600;\n}\n.remove-btn {\n margin-right: 8px;\n}\n/*# sourceMappingURL=issue-collaborators-panel.component.css.map */\n","import { ChangeDetectionStrategy, Component, input, output, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\n\r\n// import type { ProjectMemberEntity } from '@pages/issues/models/issue.model';\r\nimport type { IssueEntity, IssueParticipantEntity } from '../../models/issue.model';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzTooltipDirective, NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\r\nimport { ProjectMemberEntity } from '@pages/rd/models/rd.model';\r\nimport { NzAvatarModule } from 'ng-zorro-antd/avatar';\r\nimport { DetailItemCardComponent } from '@app/shared/ui/detail-item-card.component/detail-item-card.component';\r\n\r\n@Component({\r\n selector: 'app-issue-collaborators-area',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n NzButtonModule,\r\n NzSelectModule,\r\n NzIconModule,\r\n NzTooltipModule,\r\n NzPopconfirmModule,\r\n NzTooltipDirective,\r\n NzAvatarModule,\r\n DetailItemCardComponent,\r\n ],\r\n template: `\r\n <app-detail-item-card title=\"合作人\">\r\n @if (participants().length > 0) {\r\n <div class=\"participant-list\">\r\n @for (item of participants(); track item.id) {\r\n <div class=\"participant-item\" [style.width]=\"canManageParticipants() ? '100%' : 'auto'\">\r\n <div class=\"participant-chip\">\r\n <nz-avatar\r\n [nzText]=\"item.userName.charAt(0)\"\r\n nzSize=\"small\"\r\n style=\"background-color: #1890ff;\"\r\n ></nz-avatar>\r\n <span class=\"participant-item__name\">{{ item.userName }}</span>\r\n </div>\r\n @if (canManageParticipants()) {\r\n <button\r\n nz-button\r\n nzType=\"default\"\r\n nzShape=\"circle\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"确定要移除该参与人吗?\"\r\n nzPopconfirmOkText=\"移除\"\r\n nzPopconfirmCancelText=\"取消\"\r\n nz-tooltip=\"移除参与人\"\r\n (nzOnConfirm)=\"removeParticipant.emit(item.id)\"\r\n nzSize=\"small\"\r\n [nzLoading]=\"busy()\"\r\n class=\"remove-btn\"\r\n >\r\n <nz-icon nzType=\"minus\"></nz-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"empty\">当前还没有合作人</div>\r\n }\r\n </app-detail-item-card>\r\n `,\r\n styles: [\r\n `\r\n .empty {\r\n text-align: center;\r\n color: gray;\r\n }\r\n .participant-list {\r\n width: 100%;\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 20px 8px;\r\n padding: 10px 0;\r\n }\r\n .participant-item {\r\n height: 20px;\r\n display: flex;\r\n justify-content: space-between;\r\n gap: 12px;\r\n align-items: center;\r\n }\r\n .participant-chip {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 4px 10px 4px 4px;\r\n border-radius: 999px;\r\n background: #ecebeb;\r\n }\r\n .participant-item__name {\r\n font-size: .875rem;\r\n font-weight: 600;\r\n // color: #1890ff;\r\n }\r\n .remove-btn {\r\n margin-right: 8px;\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class IssueCollaboratorsAreaComponent {\r\n readonly issue = input.required<IssueEntity>();\r\n readonly participants = input<IssueParticipantEntity[]>([]);\r\n readonly members = input<ProjectMemberEntity[]>([]);\r\n readonly availableMembers = input<ProjectMemberEntity[]>([]);\r\n readonly canAssign = input(false);\r\n readonly canManageParticipants = input(false);\r\n readonly busy = input(false);\r\n readonly assign = output<string>();\r\n readonly removeParticipant = output<string>();\r\n\r\n readonly selectedAssignee = signal<string | null>(null);\r\n}\r\n","/* angular:styles/component:less;01d89092836df22bb14678ea8615352429aa1e455184787931b4b8d26c6419c2;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\issue-detail\\issue-comment-area\\issue-comment-editor.component.ts */\n.mention {\n color: #1677ff;\n font-weight: 500;\n cursor: pointer;\n}\n.comment-empty {\n margin: 1rem;\n text-align: center;\n color: gray;\n}\n.comment-input {\n width: 100%;\n border-radius: 10px;\n}\n.toolbar {\n display: flex;\n justify-content: end;\n}\n.send {\n border-radius: 6px;\n}\n.mention-option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n.mention-name {\n font-weight: 600;\n}\n.mention-id {\n font-size: 12px;\n}\n.log-item {\n padding: 4px 0 0;\n}\n.log-item .meta {\n display: flex;\n align-items: start;\n gap: 0.875rem;\n color: rgba(0, 0, 0, 0.65);\n font-size: 0.875rem;\n margin-bottom: 4px;\n}\n.log-item .meta .operator {\n font-weight: bold;\n white-space: nowrap;\n}\n.log-item .meta .content {\n color: rgba(0, 0, 0, 0.85);\n font-size: 14px;\n}\n.log-item .empty {\n color: rgba(0, 0, 0, 0.45);\n}\n.comment-item {\n display: flex;\n}\n.time {\n padding-left: 10px;\n display: flex;\n align-items: center;\n min-width: 100px;\n font-size: 14px;\n font-weight: 300;\n color: #bbbbbb;\n margin-left: auto;\n}\n.log-item {\n padding-bottom: 16px;\n}\n.summary {\n font-size: 14px;\n}\n:host ::ng-deep .ant-timeline-item {\n margin-left: 6px;\n padding-bottom: 0;\n}\n/*# sourceMappingURL=issue-comment-editor.component.css.map */\n","export const ROLE_OPTIONS = [\r\n { label: '成员', value: 'member' },\r\n { label: '产品', value: 'product' },\r\n { label: 'UI', value: 'ui' },\r\n { label: '前端开发', value: 'frontend_dev' },\r\n { label: '后端开发', value: 'backend_dev' },\r\n { label: '测试', value: 'qa' },\r\n { label: '运维', value: 'ops' },\r\n { label: '项目管理员', value: 'project_admin' },\r\n]\r\n\r\nexport const ROLE_LABELS: Record<string, string> = {\r\n member: '成员',\r\n product: '产品',\r\n ui: 'UI',\r\n frontend_dev: '前端开发',\r\n backend_dev: '后端开发',\r\n qa: '测试',\r\n ops: '运维',\r\n project_admin: '项目管理员',\r\n}","import { NgTemplateOutlet } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { ChangeDetectionStrategy, Component, Input, inject, ElementRef, TemplateRef, ContentChild, ViewEncapsulation, ViewChild, ChangeDetectorRef, ContentChildren, Directive, DestroyRef, booleanAttribute, HostBinding, NgModule } from '@angular/core';\nimport * as i1$1 from 'ng-zorro-antd/core/outlet';\nimport { NzOutletModule } from 'ng-zorro-antd/core/outlet';\nimport * as i1 from 'ng-zorro-antd/avatar';\nimport { NzAvatarModule } from 'ng-zorro-antd/avatar';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subject, defer, of, merge, BehaviorSubject } from 'rxjs';\nimport { mergeMap, startWith } from 'rxjs/operators';\nimport { Directionality } from '@angular/cdk/bidi';\nimport * as i3 from 'ng-zorro-antd/grid';\nimport { NzGridModule } from 'ng-zorro-antd/grid';\nimport * as i2 from 'ng-zorro-antd/spin';\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\nimport * as i1$2 from 'ng-zorro-antd/empty';\nimport { NzEmptyModule } from 'ng-zorro-antd/empty';\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nclass NzListItemMetaTitleComponent {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemMetaTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzListItemMetaTitleComponent, isStandalone: true, selector: \"nz-list-item-meta-title\", exportAs: [\"nzListItemMetaTitle\"], ngImport: i0, template: `\n <h4 class=\"ant-list-item-meta-title\">\n <ng-content></ng-content>\n </h4>\n `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemMetaTitleComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-item-meta-title',\n exportAs: 'nzListItemMetaTitle',\n template: `\n <h4 class=\"ant-list-item-meta-title\">\n <ng-content></ng-content>\n </h4>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n }]\n }] });\nclass NzListItemMetaDescriptionComponent {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemMetaDescriptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzListItemMetaDescriptionComponent, isStandalone: true, selector: \"nz-list-item-meta-description\", exportAs: [\"nzListItemMetaDescription\"], ngImport: i0, template: `\n <div class=\"ant-list-item-meta-description\">\n <ng-content></ng-content>\n </div>\n `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemMetaDescriptionComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-item-meta-description',\n exportAs: 'nzListItemMetaDescription',\n template: `\n <div class=\"ant-list-item-meta-description\">\n <ng-content></ng-content>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n }]\n }] });\nclass NzListItemMetaAvatarComponent {\n nzSrc;\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemMetaAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.0\", type: NzListItemMetaAvatarComponent, isStandalone: true, selector: \"nz-list-item-meta-avatar\", inputs: { nzSrc: \"nzSrc\" }, exportAs: [\"nzListItemMetaAvatar\"], ngImport: i0, template: `\n <div class=\"ant-list-item-meta-avatar\">\n @if (nzSrc) {\n <nz-avatar [nzSrc]=\"nzSrc\" />\n } @else {\n <ng-content />\n }\n </div>\n `, isInline: true, dependencies: [{ kind: \"ngmodule\", type: NzAvatarModule }, { kind: \"component\", type: i1.NzAvatarComponent, selector: \"nz-avatar\", inputs: [\"nzShape\", \"nzSize\", \"nzGap\", \"nzText\", \"nzSrc\", \"nzSrcSet\", \"nzAlt\", \"nzIcon\", \"nzLoading\", \"nzFetchPriority\"], outputs: [\"nzError\"], exportAs: [\"nzAvatar\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemMetaAvatarComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-item-meta-avatar',\n exportAs: 'nzListItemMetaAvatar',\n template: `\n <div class=\"ant-list-item-meta-avatar\">\n @if (nzSrc) {\n <nz-avatar [nzSrc]=\"nzSrc\" />\n } @else {\n <ng-content />\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NzAvatarModule]\n }]\n }], propDecorators: { nzSrc: [{\n type: Input\n }] } });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nclass NzListItemMetaComponent {\n elementRef = inject(ElementRef);\n avatarStr = '';\n avatarTpl;\n set nzAvatar(value) {\n if (value instanceof TemplateRef) {\n this.avatarStr = '';\n this.avatarTpl = value;\n }\n else {\n this.avatarStr = value;\n }\n }\n nzTitle;\n nzDescription;\n descriptionComponent;\n titleComponent;\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemMetaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.0\", type: NzListItemMetaComponent, isStandalone: true, selector: \"nz-list-item-meta, [nz-list-item-meta]\", inputs: { nzAvatar: \"nzAvatar\", nzTitle: \"nzTitle\", nzDescription: \"nzDescription\" }, host: { classAttribute: \"ant-list-item-meta\" }, queries: [{ propertyName: \"descriptionComponent\", first: true, predicate: NzListItemMetaDescriptionComponent, descendants: true }, { propertyName: \"titleComponent\", first: true, predicate: NzListItemMetaTitleComponent, descendants: true }], exportAs: [\"nzListItemMeta\"], ngImport: i0, template: `\n <!--Old API Start-->\n @if (avatarStr) {\n <nz-list-item-meta-avatar [nzSrc]=\"avatarStr\" />\n }\n\n @if (avatarTpl) {\n <nz-list-item-meta-avatar>\n <ng-container [ngTemplateOutlet]=\"avatarTpl\" />\n </nz-list-item-meta-avatar>\n }\n\n <!--Old API End-->\n\n <ng-content select=\"nz-list-item-meta-avatar\" />\n\n @if (nzTitle || nzDescription || descriptionComponent || titleComponent) {\n <div class=\"ant-list-item-meta-content\">\n <!--Old API Start-->\n\n @if (nzTitle && !titleComponent) {\n <nz-list-item-meta-title>\n <ng-container *nzStringTemplateOutlet=\"nzTitle\">{{ nzTitle }}</ng-container>\n </nz-list-item-meta-title>\n }\n\n @if (nzDescription && !descriptionComponent) {\n <nz-list-item-meta-description>\n <ng-container *nzStringTemplateOutlet=\"nzDescription\">{{ nzDescription }}</ng-container>\n </nz-list-item-meta-description>\n }\n <!--Old API End-->\n\n <ng-content select=\"nz-list-item-meta-title\" />\n <ng-content select=\"nz-list-item-meta-description\" />\n </div>\n }\n `, isInline: true, dependencies: [{ kind: \"component\", type: NzListItemMetaAvatarComponent, selector: \"nz-list-item-meta-avatar\", inputs: [\"nzSrc\"], exportAs: [\"nzListItemMetaAvatar\"] }, { kind: \"directive\", type: NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }, { kind: \"component\", type: NzListItemMetaTitleComponent, selector: \"nz-list-item-meta-title\", exportAs: [\"nzListItemMetaTitle\"] }, { kind: \"ngmodule\", type: NzOutletModule }, { kind: \"directive\", type: i1$1.NzStringTemplateOutletDirective, selector: \"[nzStringTemplateOutlet]\", inputs: [\"nzStringTemplateOutletContext\", \"nzStringTemplateOutlet\"], exportAs: [\"nzStringTemplateOutlet\"] }, { kind: \"component\", type: NzListItemMetaDescriptionComponent, selector: \"nz-list-item-meta-description\", exportAs: [\"nzListItemMetaDescription\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemMetaComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-item-meta, [nz-list-item-meta]',\n exportAs: 'nzListItemMeta',\n template: `\n <!--Old API Start-->\n @if (avatarStr) {\n <nz-list-item-meta-avatar [nzSrc]=\"avatarStr\" />\n }\n\n @if (avatarTpl) {\n <nz-list-item-meta-avatar>\n <ng-container [ngTemplateOutlet]=\"avatarTpl\" />\n </nz-list-item-meta-avatar>\n }\n\n <!--Old API End-->\n\n <ng-content select=\"nz-list-item-meta-avatar\" />\n\n @if (nzTitle || nzDescription || descriptionComponent || titleComponent) {\n <div class=\"ant-list-item-meta-content\">\n <!--Old API Start-->\n\n @if (nzTitle && !titleComponent) {\n <nz-list-item-meta-title>\n <ng-container *nzStringTemplateOutlet=\"nzTitle\">{{ nzTitle }}</ng-container>\n </nz-list-item-meta-title>\n }\n\n @if (nzDescription && !descriptionComponent) {\n <nz-list-item-meta-description>\n <ng-container *nzStringTemplateOutlet=\"nzDescription\">{{ nzDescription }}</ng-container>\n </nz-list-item-meta-description>\n }\n <!--Old API End-->\n\n <ng-content select=\"nz-list-item-meta-title\" />\n <ng-content select=\"nz-list-item-meta-description\" />\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'ant-list-item-meta'\n },\n imports: [\n NzListItemMetaAvatarComponent,\n NgTemplateOutlet,\n NzListItemMetaTitleComponent,\n NzOutletModule,\n NzListItemMetaDescriptionComponent\n ]\n }]\n }], propDecorators: { nzAvatar: [{\n type: Input\n }], nzTitle: [{\n type: Input\n }], nzDescription: [{\n type: Input\n }], descriptionComponent: [{\n type: ContentChild,\n args: [NzListItemMetaDescriptionComponent]\n }], titleComponent: [{\n type: ContentChild,\n args: [NzListItemMetaTitleComponent]\n }] } });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nclass NzListItemExtraComponent {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemExtraComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzListItemExtraComponent, isStandalone: true, selector: \"nz-list-item-extra, [nz-list-item-extra]\", host: { classAttribute: \"ant-list-item-extra\" }, exportAs: [\"nzListItemExtra\"], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemExtraComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-item-extra, [nz-list-item-extra]',\n exportAs: 'nzListItemExtra',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<ng-content></ng-content>`,\n host: {\n class: 'ant-list-item-extra'\n }\n }]\n }] });\nclass NzListItemActionComponent {\n templateRef;\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzListItemActionComponent, isStandalone: true, selector: \"nz-list-item-action\", viewQueries: [{ propertyName: \"templateRef\", first: true, predicate: TemplateRef, descendants: true, static: true }], exportAs: [\"nzListItemAction\"], ngImport: i0, template: `<ng-template><ng-content></ng-content></ng-template>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemActionComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-item-action',\n exportAs: 'nzListItemAction',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<ng-template><ng-content></ng-content></ng-template>`\n }]\n }], propDecorators: { templateRef: [{\n type: ViewChild,\n args: [TemplateRef, { static: true }]\n }] } });\nclass NzListItemActionsComponent {\n cdr = inject(ChangeDetectorRef);\n nzActions = [];\n nzListItemActions;\n actions = [];\n inputActionChanges$ = new Subject();\n contentChildrenChanges$ = defer(() => {\n if (this.nzListItemActions) {\n return of(null);\n }\n return this.initialized.pipe(mergeMap(() => this.nzListItemActions.changes.pipe(startWith(this.nzListItemActions))));\n });\n initialized = new Subject();\n constructor() {\n merge(this.contentChildrenChanges$, this.inputActionChanges$)\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n if (this.nzActions.length) {\n this.actions = this.nzActions;\n }\n else {\n this.actions = this.nzListItemActions.map(action => action.templateRef);\n }\n this.cdr.detectChanges();\n });\n }\n ngOnChanges() {\n this.inputActionChanges$.next(null);\n }\n ngAfterContentInit() {\n this.initialized.next();\n this.initialized.complete();\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.0\", type: NzListItemActionsComponent, isStandalone: true, selector: \"ul[nz-list-item-actions]\", inputs: { nzActions: \"nzActions\" }, host: { classAttribute: \"ant-list-item-action\" }, queries: [{ propertyName: \"nzListItemActions\", predicate: NzListItemActionComponent }], exportAs: [\"nzListItemActions\"], usesOnChanges: true, ngImport: i0, template: `\n @for (i of actions; track i) {\n <li>\n <ng-template [ngTemplateOutlet]=\"i\" />\n @if (!$last) {\n <em class=\"ant-list-item-action-split\"></em>\n }\n </li>\n }\n `, isInline: true, dependencies: [{ kind: \"directive\", type: NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemActionsComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'ul[nz-list-item-actions]',\n exportAs: 'nzListItemActions',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (i of actions; track i) {\n <li>\n <ng-template [ngTemplateOutlet]=\"i\" />\n @if (!$last) {\n <em class=\"ant-list-item-action-split\"></em>\n }\n </li>\n }\n `,\n host: {\n class: 'ant-list-item-action'\n },\n imports: [NgTemplateOutlet]\n }]\n }], ctorParameters: () => [], propDecorators: { nzActions: [{\n type: Input\n }], nzListItemActions: [{\n type: ContentChildren,\n args: [NzListItemActionComponent]\n }] } });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nclass NzListEmptyComponent {\n nzNoResult;\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListEmptyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzListEmptyComponent, isStandalone: true, selector: \"nz-list-empty\", inputs: { nzNoResult: \"nzNoResult\" }, host: { classAttribute: \"ant-list-empty-text\" }, exportAs: [\"nzListHeader\"], ngImport: i0, template: `<nz-embed-empty [nzComponentName]=\"'list'\" [specificContent]=\"nzNoResult\"></nz-embed-empty>`, isInline: true, dependencies: [{ kind: \"ngmodule\", type: NzEmptyModule }, { kind: \"component\", type: i1$2.NzEmbedEmptyComponent, selector: \"nz-embed-empty\", inputs: [\"nzComponentName\", \"specificContent\"], exportAs: [\"nzEmbedEmpty\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListEmptyComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-empty',\n exportAs: 'nzListHeader',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<nz-embed-empty [nzComponentName]=\"'list'\" [specificContent]=\"nzNoResult\"></nz-embed-empty>`,\n host: {\n class: 'ant-list-empty-text'\n },\n imports: [NzEmptyModule]\n }]\n }], propDecorators: { nzNoResult: [{\n type: Input\n }] } });\nclass NzListHeaderComponent {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzListHeaderComponent, isStandalone: true, selector: \"nz-list-header\", host: { classAttribute: \"ant-list-header\" }, exportAs: [\"nzListHeader\"], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListHeaderComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-header',\n exportAs: 'nzListHeader',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<ng-content></ng-content>`,\n host: {\n class: 'ant-list-header'\n }\n }]\n }] });\nclass NzListFooterComponent {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzListFooterComponent, isStandalone: true, selector: \"nz-list-footer\", host: { classAttribute: \"ant-list-footer\" }, exportAs: [\"nzListFooter\"], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListFooterComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-footer',\n exportAs: 'nzListFooter',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<ng-content></ng-content>`,\n host: {\n class: 'ant-list-footer'\n }\n }]\n }] });\nclass NzListPaginationComponent {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzListPaginationComponent, isStandalone: true, selector: \"nz-list-pagination\", host: { classAttribute: \"ant-list-pagination\" }, exportAs: [\"nzListPagination\"], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListPaginationComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-pagination',\n exportAs: 'nzListPagination',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<ng-content></ng-content>`,\n host: {\n class: 'ant-list-pagination'\n }\n }]\n }] });\nclass NzListLoadMoreDirective {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListLoadMoreDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzListLoadMoreDirective, isStandalone: true, selector: \"nz-list-load-more\", exportAs: [\"nzListLoadMoreDirective\"], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListLoadMoreDirective, decorators: [{\n type: Directive,\n args: [{\n selector: 'nz-list-load-more',\n exportAs: 'nzListLoadMoreDirective'\n }]\n }] });\nclass NzListGridDirective {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListGridDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzListGridDirective, isStandalone: true, selector: \"nz-list[nzGrid]\", host: { classAttribute: \"ant-list-grid\" }, ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListGridDirective, decorators: [{\n type: Directive,\n args: [{\n selector: 'nz-list[nzGrid]',\n host: {\n class: 'ant-list-grid'\n }\n }]\n }] });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nclass NzListComponent {\n directionality = inject(Directionality);\n destroyRef = inject(DestroyRef);\n nzDataSource;\n nzBordered = false;\n nzGrid = '';\n nzHeader;\n nzFooter;\n nzItemLayout = 'horizontal';\n nzRenderItem = null;\n nzLoading = false;\n nzLoadMore = null;\n nzPagination;\n nzSize = 'default';\n nzSplit = true;\n nzNoResult;\n nzListFooterComponent;\n nzListPaginationComponent;\n nzListLoadMoreDirective;\n hasSomethingAfterLastItem = false;\n dir = 'ltr';\n itemLayoutNotifySource = new BehaviorSubject(this.nzItemLayout);\n get itemLayoutNotify$() {\n return this.itemLayoutNotifySource.asObservable();\n }\n constructor() {\n this.destroyRef.onDestroy(() => this.itemLayoutNotifySource.unsubscribe());\n }\n ngOnInit() {\n this.dir = this.directionality.value;\n this.directionality.change?.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((direction) => {\n this.dir = direction;\n });\n }\n getSomethingAfterLastItem() {\n return !!(this.nzLoadMore ||\n this.nzPagination ||\n this.nzFooter ||\n this.nzListFooterComponent ||\n this.nzListPaginationComponent ||\n this.nzListLoadMoreDirective);\n }\n ngOnChanges(changes) {\n if (changes.nzItemLayout) {\n this.itemLayoutNotifySource.next(this.nzItemLayout);\n }\n }\n ngAfterContentInit() {\n this.hasSomethingAfterLastItem = this.getSomethingAfterLastItem();\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.0\", type: NzListComponent, isStandalone: true, selector: \"nz-list, [nz-list]\", inputs: { nzDataSource: \"nzDataSource\", nzBordered: [\"nzBordered\", \"nzBordered\", booleanAttribute], nzGrid: \"nzGrid\", nzHeader: \"nzHeader\", nzFooter: \"nzFooter\", nzItemLayout: \"nzItemLayout\", nzRenderItem: \"nzRenderItem\", nzLoading: [\"nzLoading\", \"nzLoading\", booleanAttribute], nzLoadMore: \"nzLoadMore\", nzPagination: \"nzPagination\", nzSize: \"nzSize\", nzSplit: [\"nzSplit\", \"nzSplit\", booleanAttribute], nzNoResult: \"nzNoResult\" }, host: { properties: { \"class.ant-list-rtl\": \"dir === 'rtl'\", \"class.ant-list-vertical\": \"nzItemLayout === \\\"vertical\\\"\", \"class.ant-list-lg\": \"nzSize === \\\"large\\\"\", \"class.ant-list-sm\": \"nzSize === \\\"small\\\"\", \"class.ant-list-split\": \"nzSplit\", \"class.ant-list-bordered\": \"nzBordered\", \"class.ant-list-loading\": \"nzLoading\", \"class.ant-list-something-after-last-item\": \"hasSomethingAfterLastItem\" }, classAttribute: \"ant-list\" }, queries: [{ propertyName: \"nzListFooterComponent\", first: true, predicate: NzListFooterComponent, descendants: true }, { propertyName: \"nzListPaginationComponent\", first: true, predicate: NzListPaginationComponent, descendants: true }, { propertyName: \"nzListLoadMoreDirective\", first: true, predicate: NzListLoadMoreDirective, descendants: true }], exportAs: [\"nzList\"], usesOnChanges: true, ngImport: i0, template: `\n @if (nzHeader) {\n <nz-list-header>\n <ng-container *nzStringTemplateOutlet=\"nzHeader\">{{ nzHeader }}</ng-container>\n </nz-list-header>\n }\n\n <ng-content select=\"nz-list-header\" />\n\n <nz-spin [nzSpinning]=\"nzLoading\">\n <ng-container>\n @if (nzLoading && nzDataSource && nzDataSource.length === 0) {\n <div [style.min-height.px]=\"53\"></div>\n }\n @if (nzGrid && nzDataSource) {\n <div nz-row [nzGutter]=\"nzGrid.gutter || null\">\n @for (item of nzDataSource; track item; let index = $index) {\n <div\n nz-col\n [nzSpan]=\"nzGrid.span || null\"\n [nzXs]=\"nzGrid.xs || null\"\n [nzSm]=\"nzGrid.sm || null\"\n [nzMd]=\"nzGrid.md || null\"\n [nzLg]=\"nzGrid.lg || null\"\n [nzXl]=\"nzGrid.xl || null\"\n [nzXXl]=\"nzGrid.xxl || null\"\n >\n <ng-template\n [ngTemplateOutlet]=\"nzRenderItem\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: index }\"\n />\n </div>\n }\n </div>\n } @else {\n <div class=\"ant-list-items\">\n @for (item of nzDataSource; track item; let index = $index) {\n <ng-container>\n <ng-template\n [ngTemplateOutlet]=\"nzRenderItem\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: index }\"\n />\n </ng-container>\n }\n <ng-content />\n </div>\n }\n\n @if (!nzLoading && nzDataSource && nzDataSource.length === 0) {\n <nz-list-empty [nzNoResult]=\"nzNoResult\" />\n }\n </ng-container>\n </nz-spin>\n\n @if (nzFooter) {\n <nz-list-footer>\n <ng-container *nzStringTemplateOutlet=\"nzFooter\">{{ nzFooter }}</ng-container>\n </nz-list-footer>\n }\n\n <ng-content select=\"nz-list-footer, [nz-list-footer]\" />\n\n <ng-template [ngTemplateOutlet]=\"nzLoadMore\"></ng-template>\n <ng-content select=\"nz-list-load-more, [nz-list-load-more]\" />\n\n @if (nzPagination) {\n <nz-list-pagination>\n <ng-template [ngTemplateOutlet]=\"nzPagination\" />\n </nz-list-pagination>\n }\n\n <ng-content select=\"nz-list-pagination, [nz-list-pagination]\" />\n `, isInline: true, dependencies: [{ kind: \"directive\", type: NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }, { kind: \"component\", type: NzListHeaderComponent, selector: \"nz-list-header\", exportAs: [\"nzListHeader\"] }, { kind: \"ngmodule\", type: NzOutletModule }, { kind: \"directive\", type: i1$1.NzStringTemplateOutletDirective, selector: \"[nzStringTemplateOutlet]\", inputs: [\"nzStringTemplateOutletContext\", \"nzStringTemplateOutlet\"], exportAs: [\"nzStringTemplateOutlet\"] }, { kind: \"ngmodule\", type: NzSpinModule }, { kind: \"component\", type: i2.NzSpinComponent, selector: \"nz-spin\", inputs: [\"nzIndicator\", \"nzSize\", \"nzTip\", \"nzDelay\", \"nzSimple\", \"nzSpinning\"], exportAs: [\"nzSpin\"] }, { kind: \"ngmodule\", type: NzGridModule }, { kind: \"directive\", type: i3.NzColDirective, selector: \"[nz-col],nz-col,nz-form-control,nz-form-label\", inputs: [\"nzFlex\", \"nzSpan\", \"nzOrder\", \"nzOffset\", \"nzPush\", \"nzPull\", \"nzXs\", \"nzSm\", \"nzMd\", \"nzLg\", \"nzXl\", \"nzXXl\"], exportAs: [\"nzCol\"] }, { kind: \"directive\", type: i3.NzRowDirective, selector: \"[nz-row],nz-row,nz-form-item\", inputs: [\"nzAlign\", \"nzJustify\", \"nzGutter\"], exportAs: [\"nzRow\"] }, { kind: \"component\", type: NzListEmptyComponent, selector: \"nz-list-empty\", inputs: [\"nzNoResult\"], exportAs: [\"nzListHeader\"] }, { kind: \"component\", type: NzListFooterComponent, selector: \"nz-list-footer\", exportAs: [\"nzListFooter\"] }, { kind: \"component\", type: NzListPaginationComponent, selector: \"nz-list-pagination\", exportAs: [\"nzListPagination\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list, [nz-list]',\n exportAs: 'nzList',\n template: `\n @if (nzHeader) {\n <nz-list-header>\n <ng-container *nzStringTemplateOutlet=\"nzHeader\">{{ nzHeader }}</ng-container>\n </nz-list-header>\n }\n\n <ng-content select=\"nz-list-header\" />\n\n <nz-spin [nzSpinning]=\"nzLoading\">\n <ng-container>\n @if (nzLoading && nzDataSource && nzDataSource.length === 0) {\n <div [style.min-height.px]=\"53\"></div>\n }\n @if (nzGrid && nzDataSource) {\n <div nz-row [nzGutter]=\"nzGrid.gutter || null\">\n @for (item of nzDataSource; track item; let index = $index) {\n <div\n nz-col\n [nzSpan]=\"nzGrid.span || null\"\n [nzXs]=\"nzGrid.xs || null\"\n [nzSm]=\"nzGrid.sm || null\"\n [nzMd]=\"nzGrid.md || null\"\n [nzLg]=\"nzGrid.lg || null\"\n [nzXl]=\"nzGrid.xl || null\"\n [nzXXl]=\"nzGrid.xxl || null\"\n >\n <ng-template\n [ngTemplateOutlet]=\"nzRenderItem\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: index }\"\n />\n </div>\n }\n </div>\n } @else {\n <div class=\"ant-list-items\">\n @for (item of nzDataSource; track item; let index = $index) {\n <ng-container>\n <ng-template\n [ngTemplateOutlet]=\"nzRenderItem\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: index }\"\n />\n </ng-container>\n }\n <ng-content />\n </div>\n }\n\n @if (!nzLoading && nzDataSource && nzDataSource.length === 0) {\n <nz-list-empty [nzNoResult]=\"nzNoResult\" />\n }\n </ng-container>\n </nz-spin>\n\n @if (nzFooter) {\n <nz-list-footer>\n <ng-container *nzStringTemplateOutlet=\"nzFooter\">{{ nzFooter }}</ng-container>\n </nz-list-footer>\n }\n\n <ng-content select=\"nz-list-footer, [nz-list-footer]\" />\n\n <ng-template [ngTemplateOutlet]=\"nzLoadMore\"></ng-template>\n <ng-content select=\"nz-list-load-more, [nz-list-load-more]\" />\n\n @if (nzPagination) {\n <nz-list-pagination>\n <ng-template [ngTemplateOutlet]=\"nzPagination\" />\n </nz-list-pagination>\n }\n\n <ng-content select=\"nz-list-pagination, [nz-list-pagination]\" />\n `,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ant-list',\n '[class.ant-list-rtl]': `dir === 'rtl'`,\n '[class.ant-list-vertical]': 'nzItemLayout === \"vertical\"',\n '[class.ant-list-lg]': 'nzSize === \"large\"',\n '[class.ant-list-sm]': 'nzSize === \"small\"',\n '[class.ant-list-split]': 'nzSplit',\n '[class.ant-list-bordered]': 'nzBordered',\n '[class.ant-list-loading]': 'nzLoading',\n '[class.ant-list-something-after-last-item]': 'hasSomethingAfterLastItem'\n },\n imports: [\n NgTemplateOutlet,\n NzListHeaderComponent,\n NzOutletModule,\n NzSpinModule,\n NzGridModule,\n NzListEmptyComponent,\n NzListFooterComponent,\n NzListPaginationComponent\n ]\n }]\n }], ctorParameters: () => [], propDecorators: { nzDataSource: [{\n type: Input\n }], nzBordered: [{\n type: Input,\n args: [{ transform: booleanAttribute }]\n }], nzGrid: [{\n type: Input\n }], nzHeader: [{\n type: Input\n }], nzFooter: [{\n type: Input\n }], nzItemLayout: [{\n type: Input\n }], nzRenderItem: [{\n type: Input\n }], nzLoading: [{\n type: Input,\n args: [{ transform: booleanAttribute }]\n }], nzLoadMore: [{\n type: Input\n }], nzPagination: [{\n type: Input\n }], nzSize: [{\n type: Input\n }], nzSplit: [{\n type: Input,\n args: [{ transform: booleanAttribute }]\n }], nzNoResult: [{\n type: Input\n }], nzListFooterComponent: [{\n type: ContentChild,\n args: [NzListFooterComponent]\n }], nzListPaginationComponent: [{\n type: ContentChild,\n args: [NzListPaginationComponent]\n }], nzListLoadMoreDirective: [{\n type: ContentChild,\n args: [NzListLoadMoreDirective]\n }] } });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nclass NzListItemComponent {\n cdr = inject(ChangeDetectorRef);\n destroyRef = inject(DestroyRef);\n parentComp = inject(NzListComponent);\n nzActions = [];\n nzContent;\n nzExtra = null;\n nzNoFlex = false;\n listItemExtraDirective;\n itemLayout;\n get isVerticalAndExtra() {\n return this.itemLayout === 'vertical' && (!!this.listItemExtraDirective || !!this.nzExtra);\n }\n ngAfterViewInit() {\n this.parentComp.itemLayoutNotify$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => {\n this.itemLayout = val;\n this.cdr.detectChanges();\n });\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.0\", type: NzListItemComponent, isStandalone: true, selector: \"nz-list-item, [nz-list-item]\", inputs: { nzActions: \"nzActions\", nzContent: \"nzContent\", nzExtra: \"nzExtra\", nzNoFlex: [\"nzNoFlex\", \"nzNoFlex\", booleanAttribute] }, host: { properties: { \"class.ant-list-item-no-flex\": \"this.nzNoFlex\" }, classAttribute: \"ant-list-item\" }, queries: [{ propertyName: \"listItemExtraDirective\", first: true, predicate: NzListItemExtraComponent, descendants: true }], exportAs: [\"nzListItem\"], ngImport: i0, template: `\n <ng-template #actionsTpl>\n @if (nzActions && nzActions.length > 0) {\n <ul nz-list-item-actions [nzActions]=\"nzActions\"></ul>\n }\n <ng-content select=\"nz-list-item-actions, [nz-list-item-actions]\" />\n </ng-template>\n <ng-template #contentTpl>\n <ng-content select=\"nz-list-item-meta, [nz-list-item-meta]\" />\n <ng-content />\n @if (nzContent) {\n <ng-container *nzStringTemplateOutlet=\"nzContent\">{{ nzContent }}</ng-container>\n }\n </ng-template>\n <ng-template #extraTpl>\n <ng-content select=\"nz-list-item-extra, [nz-list-item-extra]\" />\n </ng-template>\n\n @if (isVerticalAndExtra) {\n <div class=\"ant-list-item-main\">\n <ng-template [ngTemplateOutlet]=\"contentTpl\" />\n <ng-template [ngTemplateOutlet]=\"actionsTpl\" />\n </div>\n @if (nzExtra) {\n <nz-list-item-extra>\n <ng-template [ngTemplateOutlet]=\"nzExtra\" />\n </nz-list-item-extra>\n }\n <ng-template [ngTemplateOutlet]=\"extraTpl\" />\n } @else {\n <ng-template [ngTemplateOutlet]=\"contentTpl\" />\n <ng-template [ngTemplateOutlet]=\"nzExtra\" />\n <ng-template [ngTemplateOutlet]=\"extraTpl\" />\n <ng-template [ngTemplateOutlet]=\"actionsTpl\" />\n }\n `, isInline: true, dependencies: [{ kind: \"component\", type: NzListItemActionsComponent, selector: \"ul[nz-list-item-actions]\", inputs: [\"nzActions\"], exportAs: [\"nzListItemActions\"] }, { kind: \"ngmodule\", type: NzOutletModule }, { kind: \"directive\", type: i1$1.NzStringTemplateOutletDirective, selector: \"[nzStringTemplateOutlet]\", inputs: [\"nzStringTemplateOutletContext\", \"nzStringTemplateOutlet\"], exportAs: [\"nzStringTemplateOutlet\"] }, { kind: \"directive\", type: NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }, { kind: \"component\", type: NzListItemExtraComponent, selector: \"nz-list-item-extra, [nz-list-item-extra]\", exportAs: [\"nzListItemExtra\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListItemComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-list-item, [nz-list-item]',\n exportAs: 'nzListItem',\n template: `\n <ng-template #actionsTpl>\n @if (nzActions && nzActions.length > 0) {\n <ul nz-list-item-actions [nzActions]=\"nzActions\"></ul>\n }\n <ng-content select=\"nz-list-item-actions, [nz-list-item-actions]\" />\n </ng-template>\n <ng-template #contentTpl>\n <ng-content select=\"nz-list-item-meta, [nz-list-item-meta]\" />\n <ng-content />\n @if (nzContent) {\n <ng-container *nzStringTemplateOutlet=\"nzContent\">{{ nzContent }}</ng-container>\n }\n </ng-template>\n <ng-template #extraTpl>\n <ng-content select=\"nz-list-item-extra, [nz-list-item-extra]\" />\n </ng-template>\n\n @if (isVerticalAndExtra) {\n <div class=\"ant-list-item-main\">\n <ng-template [ngTemplateOutlet]=\"contentTpl\" />\n <ng-template [ngTemplateOutlet]=\"actionsTpl\" />\n </div>\n @if (nzExtra) {\n <nz-list-item-extra>\n <ng-template [ngTemplateOutlet]=\"nzExtra\" />\n </nz-list-item-extra>\n }\n <ng-template [ngTemplateOutlet]=\"extraTpl\" />\n } @else {\n <ng-template [ngTemplateOutlet]=\"contentTpl\" />\n <ng-template [ngTemplateOutlet]=\"nzExtra\" />\n <ng-template [ngTemplateOutlet]=\"extraTpl\" />\n <ng-template [ngTemplateOutlet]=\"actionsTpl\" />\n }\n `,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ant-list-item'\n },\n imports: [NzListItemActionsComponent, NzOutletModule, NgTemplateOutlet, NzListItemExtraComponent]\n }]\n }], propDecorators: { nzActions: [{\n type: Input\n }], nzContent: [{\n type: Input\n }], nzExtra: [{\n type: Input\n }], nzNoFlex: [{\n type: Input,\n args: [{ transform: booleanAttribute }]\n }, {\n type: HostBinding,\n args: ['class.ant-list-item-no-flex']\n }], listItemExtraDirective: [{\n type: ContentChild,\n args: [NzListItemExtraComponent]\n }] } });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nconst DIRECTIVES = [\n NzListComponent,\n NzListHeaderComponent,\n NzListFooterComponent,\n NzListPaginationComponent,\n NzListEmptyComponent,\n NzListItemComponent,\n NzListItemMetaComponent,\n NzListItemMetaTitleComponent,\n NzListItemMetaDescriptionComponent,\n NzListItemMetaAvatarComponent,\n NzListItemActionsComponent,\n NzListItemActionComponent,\n NzListItemExtraComponent,\n NzListLoadMoreDirective,\n NzListGridDirective\n];\nclass NzListModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListModule, imports: [NzListComponent,\n NzListHeaderComponent,\n NzListFooterComponent,\n NzListPaginationComponent,\n NzListEmptyComponent,\n NzListItemComponent,\n NzListItemMetaComponent,\n NzListItemMetaTitleComponent,\n NzListItemMetaDescriptionComponent,\n NzListItemMetaAvatarComponent,\n NzListItemActionsComponent,\n NzListItemActionComponent,\n NzListItemExtraComponent,\n NzListLoadMoreDirective,\n NzListGridDirective], exports: [NzListComponent,\n NzListHeaderComponent,\n NzListFooterComponent,\n NzListPaginationComponent,\n NzListEmptyComponent,\n NzListItemComponent,\n NzListItemMetaComponent,\n NzListItemMetaTitleComponent,\n NzListItemMetaDescriptionComponent,\n NzListItemMetaAvatarComponent,\n NzListItemActionsComponent,\n NzListItemActionComponent,\n NzListItemExtraComponent,\n NzListLoadMoreDirective,\n NzListGridDirective] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListModule, imports: [NzListComponent,\n NzListEmptyComponent,\n NzListItemComponent,\n NzListItemMetaComponent,\n NzListItemMetaAvatarComponent] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzListModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [DIRECTIVES],\n exports: [DIRECTIVES]\n }]\n }] });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { NzListComponent, NzListEmptyComponent, NzListFooterComponent, NzListGridDirective, NzListHeaderComponent, NzListItemActionComponent, NzListItemActionsComponent, NzListItemComponent, NzListItemExtraComponent, NzListItemMetaAvatarComponent, NzListItemMetaComponent, NzListItemMetaDescriptionComponent, NzListItemMetaTitleComponent, NzListLoadMoreDirective, NzListModule, NzListPaginationComponent };\n\n","import * as i0 from '@angular/core';\nimport { Directive, Input, inject, ViewContainerRef, TemplateRef, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component, DestroyRef, ChangeDetectorRef, ContentChildren, NgModule } from '@angular/core';\nimport { CdkPortalOutlet, TemplatePortal } from '@angular/cdk/portal';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport * as i1 from 'ng-zorro-antd/core/outlet';\nimport { NzOutletModule } from 'ng-zorro-antd/core/outlet';\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nclass NzCommentAvatarDirective {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentAvatarDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzCommentAvatarDirective, isStandalone: true, selector: \"nz-avatar[nz-comment-avatar]\", exportAs: [\"nzCommentAvatar\"], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentAvatarDirective, decorators: [{\n type: Directive,\n args: [{\n selector: 'nz-avatar[nz-comment-avatar]',\n exportAs: 'nzCommentAvatar'\n }]\n }] });\nclass NzCommentContentDirective {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzCommentContentDirective, isStandalone: true, selector: \"nz-comment-content, [nz-comment-content]\", host: { classAttribute: \"ant-comment-content-detail\" }, exportAs: [\"nzCommentContent\"], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentContentDirective, decorators: [{\n type: Directive,\n args: [{\n selector: 'nz-comment-content, [nz-comment-content]',\n exportAs: 'nzCommentContent',\n host: { class: 'ant-comment-content-detail' }\n }]\n }] });\nclass NzCommentActionHostDirective extends CdkPortalOutlet {\n nzCommentActionHost;\n ngOnInit() {\n super.ngOnInit();\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n }\n ngAfterViewInit() {\n this.attach(this.nzCommentActionHost);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentActionHostDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzCommentActionHostDirective, isStandalone: true, selector: \"[nzCommentActionHost]\", inputs: { nzCommentActionHost: \"nzCommentActionHost\" }, exportAs: [\"nzCommentActionHost\"], usesInheritance: true, ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentActionHostDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[nzCommentActionHost]',\n exportAs: 'nzCommentActionHost'\n }]\n }], propDecorators: { nzCommentActionHost: [{\n type: Input\n }] } });\nclass NzCommentActionComponent {\n implicitContent;\n viewContainerRef = inject(ViewContainerRef);\n contentPortal = null;\n get content() {\n return this.contentPortal;\n }\n ngOnInit() {\n this.contentPortal = new TemplatePortal(this.implicitContent, this.viewContainerRef);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzCommentActionComponent, isStandalone: true, selector: \"nz-comment-action\", viewQueries: [{ propertyName: \"implicitContent\", first: true, predicate: TemplateRef, descendants: true, static: true }], exportAs: [\"nzCommentAction\"], ngImport: i0, template: '<ng-template><ng-content /></ng-template>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentActionComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-comment-action',\n exportAs: 'nzCommentAction',\n template: '<ng-template><ng-content /></ng-template>',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n }]\n }], propDecorators: { implicitContent: [{\n type: ViewChild,\n args: [TemplateRef, { static: true }]\n }] } });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nclass NzCommentComponent {\n destroyRef = inject(DestroyRef);\n cdr = inject(ChangeDetectorRef);\n directionality = inject(Directionality);\n nzAuthor;\n nzDatetime;\n dir = 'ltr';\n actions;\n ngOnInit() {\n this.directionality.change?.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(direction => {\n this.dir = direction;\n this.cdr.detectChanges();\n });\n this.dir = this.directionality.value;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.0\", type: NzCommentComponent, isStandalone: true, selector: \"nz-comment\", inputs: { nzAuthor: \"nzAuthor\", nzDatetime: \"nzDatetime\" }, host: { properties: { \"class.ant-comment\": \"true\", \"class.ant-comment-rtl\": \"dir === \\\"rtl\\\"\" } }, queries: [{ propertyName: \"actions\", predicate: NzCommentActionComponent }], exportAs: [\"nzComment\"], ngImport: i0, template: `\n <div class=\"ant-comment-inner\">\n <div class=\"ant-comment-avatar\">\n <ng-content select=\"nz-avatar[nz-comment-avatar]\"></ng-content>\n </div>\n <div class=\"ant-comment-content\">\n <div class=\"ant-comment-content-author\">\n @if (nzAuthor) {\n <span class=\"ant-comment-content-author-name\">\n <ng-container *nzStringTemplateOutlet=\"nzAuthor\">{{ nzAuthor }}</ng-container>\n </span>\n }\n @if (nzDatetime) {\n <span class=\"ant-comment-content-author-time\">\n <ng-container *nzStringTemplateOutlet=\"nzDatetime\">{{ nzDatetime }}</ng-container>\n </span>\n }\n </div>\n <ng-content select=\"nz-comment-content\" />\n @if (actions?.length) {\n <ul class=\"ant-comment-actions\">\n @for (action of actions; track action) {\n <li>\n <span><ng-template [nzCommentActionHost]=\"action.content\" /></span>\n </li>\n }\n </ul>\n }\n </div>\n </div>\n <div class=\"ant-comment-nested\">\n <ng-content />\n </div>\n `, isInline: true, dependencies: [{ kind: \"ngmodule\", type: NzOutletModule }, { kind: \"directive\", type: i1.NzStringTemplateOutletDirective, selector: \"[nzStringTemplateOutlet]\", inputs: [\"nzStringTemplateOutletContext\", \"nzStringTemplateOutlet\"], exportAs: [\"nzStringTemplateOutlet\"] }, { kind: \"directive\", type: NzCommentActionHostDirective, selector: \"[nzCommentActionHost]\", inputs: [\"nzCommentActionHost\"], exportAs: [\"nzCommentActionHost\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-comment',\n exportAs: 'nzComment',\n template: `\n <div class=\"ant-comment-inner\">\n <div class=\"ant-comment-avatar\">\n <ng-content select=\"nz-avatar[nz-comment-avatar]\"></ng-content>\n </div>\n <div class=\"ant-comment-content\">\n <div class=\"ant-comment-content-author\">\n @if (nzAuthor) {\n <span class=\"ant-comment-content-author-name\">\n <ng-container *nzStringTemplateOutlet=\"nzAuthor\">{{ nzAuthor }}</ng-container>\n </span>\n }\n @if (nzDatetime) {\n <span class=\"ant-comment-content-author-time\">\n <ng-container *nzStringTemplateOutlet=\"nzDatetime\">{{ nzDatetime }}</ng-container>\n </span>\n }\n </div>\n <ng-content select=\"nz-comment-content\" />\n @if (actions?.length) {\n <ul class=\"ant-comment-actions\">\n @for (action of actions; track action) {\n <li>\n <span><ng-template [nzCommentActionHost]=\"action.content\" /></span>\n </li>\n }\n </ul>\n }\n </div>\n </div>\n <div class=\"ant-comment-nested\">\n <ng-content />\n </div>\n `,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.ant-comment]': `true`,\n '[class.ant-comment-rtl]': `dir === \"rtl\"`\n },\n imports: [NzOutletModule, NzCommentActionHostDirective]\n }]\n }], propDecorators: { nzAuthor: [{\n type: Input\n }], nzDatetime: [{\n type: Input\n }], actions: [{\n type: ContentChildren,\n args: [NzCommentActionComponent]\n }] } });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nconst NZ_COMMENT_CELLS = [\n NzCommentAvatarDirective,\n NzCommentContentDirective,\n NzCommentActionComponent,\n NzCommentActionHostDirective\n];\nclass NzCommentModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentModule, imports: [NzCommentComponent, NzCommentAvatarDirective,\n NzCommentContentDirective,\n NzCommentActionComponent,\n NzCommentActionHostDirective], exports: [NzCommentComponent, NzCommentAvatarDirective,\n NzCommentContentDirective,\n NzCommentActionComponent,\n NzCommentActionHostDirective] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentModule, imports: [NzCommentComponent] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzCommentModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [NzCommentComponent, ...NZ_COMMENT_CELLS],\n exports: [NzCommentComponent, ...NZ_COMMENT_CELLS]\n }]\n }] });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { NzCommentActionComponent, NzCommentActionHostDirective, NzCommentAvatarDirective, NzCommentComponent, NzCommentContentDirective, NzCommentModule };\n\n","import * as i0 from '@angular/core';\nimport { Directive, forwardRef, inject, ElementRef, NgZone, ChangeDetectorRef, DestroyRef, EventEmitter, signal, afterNextRender, Output, Injector, ViewContainerRef, Renderer2, contentChild, computed, DOCUMENT, effect, TemplateRef, booleanAttribute, ContentChild, ViewChildren, ViewChild, Input, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { fromEventOutsideAngular, getMentions, getCaretCoordinates, getStatusClassNames } from 'ng-zorro-antd/core/util';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { ENTER, LEFT_ARROW, RIGHT_ARROW, TAB, ESCAPE, UP_ARROW, DOWN_ARROW } from '@angular/cdk/keycodes';\nimport { createOverlayRef, createRepositionScrollStrategy, createFlexibleConnectedPositionStrategy, ConnectionPositionPair } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { of, merge, Subscription } from 'rxjs';\nimport { distinctUntilChanged, withLatestFrom, map, startWith, switchMap } from 'rxjs/operators';\nimport { NzFormStatusService, NzFormNoStatusService, NzFormItemFeedbackIconComponent } from 'ng-zorro-antd/core/form';\nimport { NzStringTemplateOutletDirective } from 'ng-zorro-antd/core/outlet';\nimport { DEFAULT_MENTION_BOTTOM_POSITIONS, DEFAULT_MENTION_TOP_POSITIONS } from 'ng-zorro-antd/core/overlay';\nimport * as i2 from 'ng-zorro-antd/empty';\nimport { NzEmptyModule } from 'ng-zorro-antd/empty';\nimport * as i1 from 'ng-zorro-antd/icon';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nclass NzMentionSuggestionDirective {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzMentionSuggestionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzMentionSuggestionDirective, isStandalone: true, selector: \"[nzMentionSuggestion]\", exportAs: [\"nzMentionSuggestion\"], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzMentionSuggestionDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[nzMentionSuggestion]',\n exportAs: 'nzMentionSuggestion'\n }]\n }] });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nconst NZ_MENTION_CONFIG = {\n split: ' '\n};\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n/**\n * @deprecated Internally used, will be removed in v21, please do not use it.\n */\nconst NZ_MENTION_TRIGGER_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NzMentionTriggerDirective),\n multi: true\n};\nclass NzMentionTriggerDirective {\n elementRef = inject((ElementRef));\n ngZone = inject(NgZone);\n cdr = inject(ChangeDetectorRef);\n destroyRef = inject(DestroyRef);\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n onFocusin = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n onBlur = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n onInput = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n onKeydown = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n onClick = new EventEmitter();\n value = signal('', ...(ngDevMode ? [{ debugName: \"value\" }] : []));\n disabled = signal(false, ...(ngDevMode ? [{ debugName: \"disabled\" }] : []));\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.completeEvents();\n });\n afterNextRender(() => {\n this.setupEventListener('blur', this.onBlur);\n this.setupEventListener('focusin', this.onFocusin);\n this.setupEventListener('input', this.onInput);\n this.setupEventListener('click', this.onClick);\n this.setupEventListener('keydown', this.onKeydown);\n });\n }\n completeEvents() {\n this.onFocusin.complete();\n this.onBlur.complete();\n this.onInput.complete();\n this.onKeydown.complete();\n this.onClick.complete();\n }\n focus(caretPos = null) {\n this.elementRef.nativeElement.focus();\n this.elementRef.nativeElement.setSelectionRange(caretPos, caretPos);\n }\n insertMention(mention) {\n const value = this.elementRef.nativeElement.value;\n const insertValue = `${mention.mention}${NZ_MENTION_CONFIG.split}`;\n const newValue = [\n value.slice(0, mention.startPos + 1),\n insertValue,\n value.slice(mention.endPos, value.length)\n ].join('');\n this.elementRef.nativeElement.value = newValue;\n this.focus(mention.startPos + insertValue.length + 1);\n this.onChange(newValue);\n this.value.set(newValue);\n }\n clear() {\n this.value.set('');\n this.elementRef.nativeElement.value = '';\n this.onChange('');\n }\n writeValue(value) {\n const parsedValue = typeof value === 'string' ? value : '';\n this.value.set(parsedValue);\n this.elementRef.nativeElement.value = parsedValue;\n }\n onChange = () => { };\n onTouched = () => { };\n registerOnChange(fn) {\n this.onChange = fn;\n }\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled) {\n this.disabled.set(isDisabled);\n }\n setupEventListener(eventName, eventEmitter) {\n fromEventOutsideAngular(this.elementRef.nativeElement, eventName)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (eventEmitter.observers.length) {\n this.ngZone.run(() => {\n eventEmitter.emit(event);\n this.cdr.markForCheck();\n });\n }\n });\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzMentionTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.0\", type: NzMentionTriggerDirective, isStandalone: true, selector: \"input[nzMentionTrigger], textarea[nzMentionTrigger]\", outputs: { onFocusin: \"onFocusin\", onBlur: \"onBlur\", onInput: \"onInput\", onKeydown: \"onKeydown\", onClick: \"onClick\" }, host: { attributes: { \"autocomplete\": \"off\" } }, providers: [NZ_MENTION_TRIGGER_ACCESSOR], exportAs: [\"nzMentionTrigger\"], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzMentionTriggerDirective, decorators: [{\n type: Directive,\n args: [{\n selector: 'input[nzMentionTrigger], textarea[nzMentionTrigger]',\n exportAs: 'nzMentionTrigger',\n providers: [NZ_MENTION_TRIGGER_ACCESSOR],\n host: {\n autocomplete: 'off'\n }\n }]\n }], ctorParameters: () => [], propDecorators: { onFocusin: [{\n type: Output\n }], onBlur: [{\n type: Output\n }], onInput: [{\n type: Output\n }], onKeydown: [{\n type: Output\n }], onClick: [{\n type: Output\n }] } });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nclass NzMentionComponent {\n ngZone = inject(NgZone);\n directionality = inject(Directionality);\n cdr = inject(ChangeDetectorRef);\n injector = inject(Injector);\n viewContainerRef = inject(ViewContainerRef);\n elementRef = inject(ElementRef);\n renderer = inject(Renderer2);\n destroyRef = inject(DestroyRef);\n nzValueWith = value => value;\n nzPrefix = '@';\n nzLoading = false;\n nzNotFoundContent = '无匹配结果,轻敲空格完成输入';\n nzPlacement = 'bottom';\n nzSuggestions = [];\n nzStatus = '';\n nzVariant = 'outlined';\n nzAllowClear = false;\n nzClearIcon = null;\n nzOnSelect = new EventEmitter();\n nzOnSearchChange = new EventEmitter();\n nzOnClear = new EventEmitter();\n suggestionsTemp;\n items;\n set suggestionChild(value) {\n if (value) {\n this.suggestionTemplate = value;\n }\n }\n trigger = contentChild.required(NzMentionTriggerDirective);\n isOpen = false;\n filteredSuggestions = [];\n suggestionTemplate = null;\n activeIndex = -1;\n dir = 'ltr';\n // status\n prefixCls = 'ant-mentions';\n statusCls = {};\n status = '';\n hasFeedback = false;\n focused = signal(false, ...(ngDevMode ? [{ debugName: \"focused\" }] : []));\n disabled = computed(() => {\n return this.trigger().disabled();\n }, ...(ngDevMode ? [{ debugName: \"disabled\" }] : []));\n hasValue = computed(() => {\n return !!this.trigger()?.value().trim();\n }, ...(ngDevMode ? [{ debugName: \"hasValue\" }] : []));\n previousValue = null;\n cursorMention = null;\n cursorMentionStart;\n cursorMentionEnd;\n overlayRef = null;\n portal;\n positionStrategy;\n overlayOutsideClickSubscription;\n document = inject(DOCUMENT);\n get triggerNativeElement() {\n return this.trigger().elementRef.nativeElement;\n }\n get focusItemElement() {\n const itemArr = this.items?.toArray();\n if (itemArr && itemArr[this.activeIndex]) {\n return itemArr[this.activeIndex].nativeElement;\n }\n return null;\n }\n nzFormStatusService = inject(NzFormStatusService, { optional: true });\n nzFormNoStatusService = inject(NzFormNoStatusService, { optional: true });\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.closeDropdown();\n });\n effect(() => {\n const trigger = this.trigger();\n if (trigger) {\n this.bindTriggerEvents();\n this.closeDropdown();\n this.overlayRef = null;\n }\n });\n }\n ngOnInit() {\n this.nzFormStatusService?.formStatusChanges\n .pipe(distinctUntilChanged((pre, cur) => {\n return pre.status === cur.status && pre.hasFeedback === cur.hasFeedback;\n }), withLatestFrom(this.nzFormNoStatusService ? this.nzFormNoStatusService.noFormStatus : of(false)), map(([{ status, hasFeedback }, noStatus]) => ({ status: noStatus ? '' : status, hasFeedback })), takeUntilDestroyed(this.destroyRef))\n .subscribe(({ status, hasFeedback }) => {\n this.setStatusStyles(status, hasFeedback);\n });\n this.dir = this.directionality.value;\n this.directionality.change?.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(direction => {\n this.dir = direction;\n });\n }\n ngOnChanges(changes) {\n const { nzSuggestions, nzStatus } = changes;\n if (nzSuggestions) {\n if (this.isOpen) {\n this.previousValue = null;\n this.activeIndex = -1;\n this.resetDropdown(false);\n }\n }\n if (nzStatus) {\n this.setStatusStyles(this.nzStatus, this.hasFeedback);\n }\n }\n ngAfterViewInit() {\n this.items.changes\n .pipe(startWith(this.items), switchMap(() => {\n const items = this.items.toArray();\n return merge(...items.map(item => fromEventOutsideAngular(item.nativeElement, 'mousedown')));\n }))\n .subscribe(event => {\n event.preventDefault();\n });\n }\n closeDropdown() {\n if (this.overlayRef && this.overlayRef.hasAttached()) {\n this.overlayRef.detach();\n this.overlayOutsideClickSubscription.unsubscribe();\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n }\n openDropdown() {\n this.attachOverlay();\n this.isOpen = true;\n this.cdr.markForCheck();\n }\n getMentions() {\n return this.trigger() ? getMentions(this.trigger().value(), this.nzPrefix) : [];\n }\n selectSuggestion(suggestion) {\n const value = this.nzValueWith(suggestion);\n this.trigger().insertMention({\n mention: value,\n startPos: this.cursorMentionStart,\n endPos: this.cursorMentionEnd\n });\n this.nzOnSelect.emit(suggestion);\n this.closeDropdown();\n this.activeIndex = -1;\n }\n clear() {\n this.closeDropdown();\n this.trigger().clear();\n this.nzOnClear.emit();\n }\n handleInput(event) {\n const target = event.target;\n this.trigger().onChange(target.value);\n this.trigger().value.set(target.value);\n this.resetDropdown();\n }\n handleKeydown(event) {\n const keyCode = event.keyCode;\n if (this.isOpen && keyCode === ENTER && this.activeIndex !== -1 && this.filteredSuggestions.length) {\n this.selectSuggestion(this.filteredSuggestions[this.activeIndex]);\n event.preventDefault();\n }\n else if (keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW) {\n this.resetDropdown();\n event.stopPropagation();\n }\n else {\n if (this.isOpen && (keyCode === TAB || keyCode === ESCAPE)) {\n this.closeDropdown();\n return;\n }\n if (this.isOpen && keyCode === UP_ARROW) {\n this.setPreviousItemActive();\n event.preventDefault();\n event.stopPropagation();\n }\n if (this.isOpen && keyCode === DOWN_ARROW) {\n this.setNextItemActive();\n event.preventDefault();\n event.stopPropagation();\n }\n }\n }\n handleClick() {\n this.resetDropdown(false);\n }\n bindTriggerEvents() {\n this.trigger().onFocusin.subscribe(() => this.focused.set(true));\n this.trigger().onBlur.subscribe(() => this.focused.set(false));\n this.trigger().onInput.subscribe((e) => this.handleInput(e));\n this.trigger().onKeydown.subscribe((e) => this.handleKeydown(e));\n this.trigger().onClick.subscribe(() => this.handleClick());\n }\n suggestionsFilter(value, emit) {\n const suggestions = value.substring(1);\n /**\n * Should always emit (nzOnSearchChange) when value empty\n *\n * @[something]... @[empty]... @[empty]\n * ^ ^ ^\n * preValue preValue (should emit)\n */\n if (this.previousValue === value && value !== this.cursorMention[0]) {\n return;\n }\n this.previousValue = value;\n if (emit) {\n this.nzOnSearchChange.emit({\n value: this.cursorMention.substring(1),\n prefix: this.cursorMention[0]\n });\n }\n const searchValue = suggestions.toLowerCase();\n this.filteredSuggestions = this.nzSuggestions.filter(suggestion => this.nzValueWith(suggestion).toLowerCase().includes(searchValue));\n }\n resetDropdown(emit = true) {\n this.resetCursorMention();\n if (typeof this.cursorMention !== 'string' || !this.canOpen()) {\n this.closeDropdown();\n return;\n }\n this.suggestionsFilter(this.cursorMention, emit);\n const activeIndex = this.filteredSuggestions.indexOf(this.cursorMention.substring(1));\n this.activeIndex = activeIndex >= 0 ? activeIndex : 0;\n this.openDropdown();\n }\n setNextItemActive() {\n this.activeIndex = this.activeIndex + 1 <= this.filteredSuggestions.length - 1 ? this.activeIndex + 1 : 0;\n this.cdr.markForCheck();\n this.scrollToFocusItem();\n }\n setPreviousItemActive() {\n this.activeIndex = this.activeIndex - 1 < 0 ? this.filteredSuggestions.length - 1 : this.activeIndex - 1;\n this.cdr.markForCheck();\n this.scrollToFocusItem();\n }\n scrollToFocusItem() {\n if (this.focusItemElement) {\n this.focusItemElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n }\n }\n canOpen() {\n const element = this.triggerNativeElement;\n return !element.readOnly && !element.disabled;\n }\n resetCursorMention() {\n const value = this.triggerNativeElement.value.replace(/[\\r\\n]/g, NZ_MENTION_CONFIG.split) || '';\n const selectionStart = this.triggerNativeElement.selectionStart;\n const prefix = typeof this.nzPrefix === 'string' ? [this.nzPrefix] : this.nzPrefix;\n let i = prefix.length;\n while (i >= 0) {\n const startPos = value.lastIndexOf(prefix[i], selectionStart);\n const endPos = value.indexOf(NZ_MENTION_CONFIG.split, selectionStart) > -1\n ? value.indexOf(NZ_MENTION_CONFIG.split, selectionStart)\n : value.length;\n const mention = value.substring(startPos, endPos);\n if ((startPos > 0 && value[startPos - 1] !== NZ_MENTION_CONFIG.split) ||\n startPos < 0 ||\n mention.includes(prefix[i], 1) ||\n mention.includes(NZ_MENTION_CONFIG.split)) {\n this.cursorMention = null;\n this.cursorMentionStart = -1;\n this.cursorMentionEnd = -1;\n }\n else {\n this.cursorMention = mention;\n this.cursorMentionStart = startPos;\n this.cursorMentionEnd = endPos;\n return;\n }\n i--;\n }\n }\n updatePositions() {\n const coordinates = getCaretCoordinates(this.triggerNativeElement, this.cursorMentionStart);\n const top = coordinates.top -\n this.triggerNativeElement.getBoundingClientRect().height -\n this.triggerNativeElement.scrollTop +\n (this.nzPlacement === 'bottom' ? coordinates.height - 6 : -6);\n const left = coordinates.left - this.triggerNativeElement.scrollLeft;\n this.positionStrategy.withDefaultOffsetX(left).withDefaultOffsetY(top);\n if (this.nzPlacement === 'bottom') {\n this.positionStrategy.withPositions([...DEFAULT_MENTION_BOTTOM_POSITIONS]);\n }\n if (this.nzPlacement === 'top') {\n this.positionStrategy.withPositions([...DEFAULT_MENTION_TOP_POSITIONS]);\n }\n this.positionStrategy.apply();\n }\n subscribeOverlayOutsideClick() {\n const canCloseDropdown = (event) => {\n const clickTarget = event.target;\n return (this.isOpen &&\n clickTarget !== this.triggerNativeElement &&\n !this.overlayRef?.overlayElement.contains(clickTarget));\n };\n const subscription = new Subscription();\n subscription.add(this.overlayRef.outsidePointerEvents().subscribe(event => canCloseDropdown(event) && this.closeDropdown()));\n subscription.add(fromEventOutsideAngular(this.document, 'touchend').subscribe(event => canCloseDropdown(event) && this.ngZone.run(() => this.closeDropdown())));\n return subscription;\n }\n attachOverlay() {\n if (!this.overlayRef) {\n this.portal = new TemplatePortal(this.suggestionsTemp, this.viewContainerRef);\n this.overlayRef = createOverlayRef(this.injector, {\n positionStrategy: this.getOverlayPosition(),\n scrollStrategy: createRepositionScrollStrategy(this.injector),\n disposeOnNavigation: true\n });\n }\n if (this.overlayRef && !this.overlayRef.hasAttached()) {\n this.overlayRef.attach(this.portal);\n this.overlayOutsideClickSubscription = this.subscribeOverlayOutsideClick();\n }\n this.updatePositions();\n }\n getOverlayPosition() {\n return (this.positionStrategy = createFlexibleConnectedPositionStrategy(this.injector, this.trigger().elementRef)\n .withPositions([\n new ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }),\n new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' })\n ])\n .withFlexibleDimensions(false)\n .withPush(false));\n }\n setStatusStyles(status, hasFeedback) {\n // set inner status\n this.status = status;\n this.hasFeedback = hasFeedback;\n this.cdr.markForCheck();\n // render status if nzStatus is set\n this.statusCls = getStatusClassNames(this.prefixCls, status, hasFeedback);\n Object.keys(this.statusCls).forEach(status => {\n if (this.statusCls[status]) {\n this.renderer.addClass(this.elementRef.nativeElement, status);\n }\n else {\n this.renderer.removeClass(this.elementRef.nativeElement, status);\n }\n });\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzMentionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.0\", type: NzMentionComponent, isStandalone: true, selector: \"nz-mention\", inputs: { nzValueWith: \"nzValueWith\", nzPrefix: \"nzPrefix\", nzLoading: [\"nzLoading\", \"nzLoading\", booleanAttribute], nzNotFoundContent: \"nzNotFoundContent\", nzPlacement: \"nzPlacement\", nzSuggestions: \"nzSuggestions\", nzStatus: \"nzStatus\", nzVariant: \"nzVariant\", nzAllowClear: [\"nzAllowClear\", \"nzAllowClear\", booleanAttribute], nzClearIcon: \"nzClearIcon\" }, outputs: { nzOnSelect: \"nzOnSelect\", nzOnSearchChange: \"nzOnSearchChange\", nzOnClear: \"nzOnClear\" }, host: { properties: { \"class.ant-mentions-rtl\": \"dir === 'rtl'\", \"class.ant-mentions-borderless\": \"nzVariant === 'borderless'\", \"class.ant-mentions-filled\": \"nzVariant === 'filled'\", \"class.ant-mentions-underlined\": \"nzVariant === 'underlined'\", \"class.ant-mentions-focused\": \"focused()\", \"class.ant-mentions-disabled\": \"disabled()\" }, classAttribute: \"ant-mentions\" }, queries: [{ propertyName: \"trigger\", first: true, predicate: NzMentionTriggerDirective, descendants: true, isSignal: true }, { propertyName: \"suggestionChild\", first: true, predicate: NzMentionSuggestionDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: \"suggestionsTemp\", first: true, predicate: TemplateRef, descendants: true }, { propertyName: \"items\", predicate: [\"items\"], descendants: true, read: ElementRef }], exportAs: [\"nzMention\"], usesOnChanges: true, ngImport: i0, template: `\n <ng-content></ng-content>\n <ng-template #suggestions>\n <div class=\"ant-mentions-dropdown\">\n <ul class=\"ant-mentions-dropdown-menu\" role=\"menu\" tabindex=\"0\">\n @for (suggestion of filteredSuggestions; track suggestion) {\n <li\n #items\n class=\"ant-mentions-dropdown-menu-item\"\n role=\"menuitem\"\n tabindex=\"-1\"\n [class.ant-mentions-dropdown-menu-item-active]=\"$index === activeIndex\"\n [class.ant-mentions-dropdown-menu-item-selected]=\"$index === activeIndex\"\n (click)=\"selectSuggestion(suggestion)\"\n >\n @if (suggestionTemplate) {\n <ng-container *ngTemplateOutlet=\"suggestionTemplate; context: { $implicit: suggestion }\" />\n } @else {\n {{ nzValueWith(suggestion) }}\n }\n </li>\n }\n\n @if (filteredSuggestions.length === 0) {\n <li class=\"ant-mentions-dropdown-menu-item ant-mentions-dropdown-menu-item-disabled\">\n @if (nzLoading) {\n <span><nz-icon nzType=\"loading\" /></span>\n } @else {\n <span>\n <nz-embed-empty nzComponentName=\"select\" [specificContent]=\"nzNotFoundContent!\" />\n </span>\n }\n </li>\n }\n </ul>\n </div>\n </ng-template>\n @if (hasFeedback && !!status) {\n <nz-form-item-feedback-icon class=\"ant-mentions-suffix\" [status]=\"status\" />\n }\n @if (nzAllowClear && hasValue()) {\n <span class=\"ant-mentions-suffix\">\n <button type=\"button\" tabindex=\"-1\" class=\"ant-mentions-clear-icon\" (click)=\"clear()\">\n <ng-template [nzStringTemplateOutlet]=\"nzClearIcon\">\n <nz-icon nzType=\"close-circle\" nzTheme=\"fill\" />\n </ng-template>\n </button>\n </span>\n }\n `, isInline: true, dependencies: [{ kind: \"directive\", type: NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }, { kind: \"ngmodule\", type: NzIconModule }, { kind: \"directive\", type: i1.NzIconDirective, selector: \"nz-icon,[nz-icon]\", inputs: [\"nzSpin\", \"nzRotate\", \"nzType\", \"nzTheme\", \"nzTwotoneColor\", \"nzIconfont\"], exportAs: [\"nzIcon\"] }, { kind: \"ngmodule\", type: NzEmptyModule }, { kind: \"component\", type: i2.NzEmbedEmptyComponent, selector: \"nz-embed-empty\", inputs: [\"nzComponentName\", \"specificContent\"], exportAs: [\"nzEmbedEmpty\"] }, { kind: \"component\", type: NzFormItemFeedbackIconComponent, selector: \"nz-form-item-feedback-icon\", inputs: [\"status\"], exportAs: [\"nzFormFeedbackIcon\"] }, { kind: \"directive\", type: NzStringTemplateOutletDirective, selector: \"[nzStringTemplateOutlet]\", inputs: [\"nzStringTemplateOutletContext\", \"nzStringTemplateOutlet\"], exportAs: [\"nzStringTemplateOutlet\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzMentionComponent, decorators: [{\n type: Component,\n args: [{\n selector: 'nz-mention',\n exportAs: 'nzMention',\n template: `\n <ng-content></ng-content>\n <ng-template #suggestions>\n <div class=\"ant-mentions-dropdown\">\n <ul class=\"ant-mentions-dropdown-menu\" role=\"menu\" tabindex=\"0\">\n @for (suggestion of filteredSuggestions; track suggestion) {\n <li\n #items\n class=\"ant-mentions-dropdown-menu-item\"\n role=\"menuitem\"\n tabindex=\"-1\"\n [class.ant-mentions-dropdown-menu-item-active]=\"$index === activeIndex\"\n [class.ant-mentions-dropdown-menu-item-selected]=\"$index === activeIndex\"\n (click)=\"selectSuggestion(suggestion)\"\n >\n @if (suggestionTemplate) {\n <ng-container *ngTemplateOutlet=\"suggestionTemplate; context: { $implicit: suggestion }\" />\n } @else {\n {{ nzValueWith(suggestion) }}\n }\n </li>\n }\n\n @if (filteredSuggestions.length === 0) {\n <li class=\"ant-mentions-dropdown-menu-item ant-mentions-dropdown-menu-item-disabled\">\n @if (nzLoading) {\n <span><nz-icon nzType=\"loading\" /></span>\n } @else {\n <span>\n <nz-embed-empty nzComponentName=\"select\" [specificContent]=\"nzNotFoundContent!\" />\n </span>\n }\n </li>\n }\n </ul>\n </div>\n </ng-template>\n @if (hasFeedback && !!status) {\n <nz-form-item-feedback-icon class=\"ant-mentions-suffix\" [status]=\"status\" />\n }\n @if (nzAllowClear && hasValue()) {\n <span class=\"ant-mentions-suffix\">\n <button type=\"button\" tabindex=\"-1\" class=\"ant-mentions-clear-icon\" (click)=\"clear()\">\n <ng-template [nzStringTemplateOutlet]=\"nzClearIcon\">\n <nz-icon nzType=\"close-circle\" nzTheme=\"fill\" />\n </ng-template>\n </button>\n </span>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ant-mentions',\n '[class.ant-mentions-rtl]': `dir === 'rtl'`,\n '[class.ant-mentions-borderless]': `nzVariant === 'borderless'`,\n '[class.ant-mentions-filled]': `nzVariant === 'filled'`,\n '[class.ant-mentions-underlined]': `nzVariant === 'underlined'`,\n '[class.ant-mentions-focused]': `focused()`,\n '[class.ant-mentions-disabled]': `disabled()`\n },\n imports: [\n NgTemplateOutlet,\n NzIconModule,\n NzEmptyModule,\n NzFormItemFeedbackIconComponent,\n NzStringTemplateOutletDirective\n ]\n }]\n }], ctorParameters: () => [], propDecorators: { nzValueWith: [{\n type: Input\n }], nzPrefix: [{\n type: Input\n }], nzLoading: [{\n type: Input,\n args: [{ transform: booleanAttribute }]\n }], nzNotFoundContent: [{\n type: Input\n }], nzPlacement: [{\n type: Input\n }], nzSuggestions: [{\n type: Input\n }], nzStatus: [{\n type: Input\n }], nzVariant: [{\n type: Input\n }], nzAllowClear: [{\n type: Input,\n args: [{ transform: booleanAttribute }]\n }], nzClearIcon: [{\n type: Input\n }], nzOnSelect: [{\n type: Output\n }], nzOnSearchChange: [{\n type: Output\n }], nzOnClear: [{\n type: Output\n }], suggestionsTemp: [{\n type: ViewChild,\n args: [TemplateRef, { static: false }]\n }], items: [{\n type: ViewChildren,\n args: ['items', { read: ElementRef }]\n }], suggestionChild: [{\n type: ContentChild,\n args: [NzMentionSuggestionDirective, { static: false, read: TemplateRef }]\n }] } });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\nconst COMPONENTS = [NzMentionComponent, NzMentionTriggerDirective, NzMentionSuggestionDirective];\nclass NzMentionModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzMentionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.3.0\", ngImport: i0, type: NzMentionModule, imports: [NzMentionComponent, NzMentionTriggerDirective, NzMentionSuggestionDirective], exports: [NzMentionComponent, NzMentionTriggerDirective, NzMentionSuggestionDirective] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzMentionModule, imports: [NzMentionComponent] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.0\", ngImport: i0, type: NzMentionModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [...COMPONENTS],\n exports: [...COMPONENTS]\n }]\n }] });\n\n/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { NZ_MENTION_TRIGGER_ACCESSOR, NzMentionComponent, NzMentionModule, NzMentionSuggestionDirective, NzMentionTriggerDirective };\n\n","/* angular:styles/component:less;7b610d47662b44b34cd8b501719db10e1610296aa9ac72dca96cf7fd65dfe766;D:\\ng-manager\\webapp\\src\\app\\shared\\components\\ellipsis-text\\ellipsis-text.component.ts */\n.text {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n -webkit-line-clamp: var(--line-clamp);\n}\n.text.expanded {\n -webkit-line-clamp: unset !important;\n}\n.toggle {\n font-size: 0.8rem;\n font-weight: bold;\n color: #1677ff;\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n}\n/*# sourceMappingURL=ellipsis-text.component.css.map */\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n input,\r\n signal,\r\n effect,\r\n computed,\r\n OnDestroy,\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-ellipsis-text',\r\n imports: [CommonModule],\r\n template: `\r\n <span #textRef class=\"text\" [class.expanded]=\"expanded()\" [style.--line-clamp]=\"lines()\">\r\n @if (!hasTextInput()) {\r\n <ng-content></ng-content>\r\n } @else {\r\n <ng-container *ngTemplateOutlet=\"textTpl\"></ng-container>\r\n }\r\n\r\n <ng-template #textTpl>\r\n {{ text() }}\r\n </ng-template>\r\n </span>\r\n\r\n @if (showToggle()) {\r\n <a class=\"toggle\" (click)=\"toggle()\">\r\n {{ expanded() ? '收起' : '展开' }}\r\n </a>\r\n }\r\n `,\r\n styles: `\r\n .text {\r\n display: -webkit-box;\r\n -webkit-box-orient: vertical;\r\n overflow: hidden;\r\n word-break: break-word;\r\n\r\n -webkit-line-clamp: var(--line-clamp);\r\n }\r\n\r\n .text.expanded {\r\n -webkit-line-clamp: unset !important;\r\n }\r\n\r\n .toggle {\r\n font-size: 0.8rem;\r\n font-weight: bold;\r\n color: #1677ff;\r\n cursor: pointer;\r\n user-select: none;\r\n }\r\n `,\r\n})\r\nexport class EllipsisTextComponent implements AfterViewInit, OnDestroy {\r\n text = input<string>('');\r\n\r\n lines = input<number>(2);\r\n\r\n @ViewChild('textRef') textRef!: ElementRef;\r\n\r\n private observer?: MutationObserver;\r\n\r\n expanded = signal(false);\r\n showToggle = signal(false);\r\n\r\n // 是否使用 text 输入(否则走 ng-content)\r\n hasTextInput = computed(() => !!this.text());\r\n\r\n ngAfterViewInit() {\r\n this.checkOverflow();\r\n this.initObserver();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.observer?.disconnect();\r\n }\r\n\r\n constructor() {\r\n // 当 text 或 lines 变化时重新计算\r\n effect(() => {\r\n this.text();\r\n this.lines();\r\n\r\n // 等 DOM 更新\r\n setTimeout(() => this.checkOverflow());\r\n });\r\n }\r\n\r\n // 插槽内容Observer\r\n private initObserver() {\r\n const el = this.textRef?.nativeElement;\r\n if (!el) return;\r\n\r\n this.observer = new MutationObserver(() => {\r\n this.checkOverflow();\r\n });\r\n\r\n this.observer.observe(el, {\r\n childList: true, // 子节点变化\r\n subtree: true, // 深层变化\r\n characterData: true, // 文本变化\r\n });\r\n }\r\n\r\n private checkOverflow() {\r\n // 先收起,才能正确测量\r\n this.toggle(false);\r\n this.showToggle.set(false);\r\n\r\n const el = this.textRef?.nativeElement;\r\n if (!el) return;\r\n requestAnimationFrame(() => this.showToggle.set(el.scrollHeight > el.clientHeight));\r\n }\r\n\r\n // 切换文本展开/收起\r\n toggle(expanded?: boolean) {\r\n if (expanded !== undefined) {\r\n this.expanded.set(expanded);\r\n } else {\r\n this.expanded.update((v) => !v);\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nimport { ROLE_LABELS } from '@app/shared/constants/role-options';\r\nimport { UserStore } from '@app/core/stores/user/user.store';\r\n\r\nimport {\r\n IssueLogEntity,\r\n type createCommentInput,\r\n type ProjectMemberEntity,\r\n} from '@pages/issues/models/issue.model';\r\nimport type { IssueCommentEntity } from '../../models/issue.model';\r\nimport { NzListModule } from 'ng-zorro-antd/list';\r\nimport { NzCommentModule } from 'ng-zorro-antd/comment';\r\nimport { NzAvatarModule } from 'ng-zorro-antd/avatar';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { DetailItemCardComponent } from '@app/shared/ui/detail-item-card.component/detail-item-card.component';\r\nimport { NzTimelineModule } from 'ng-zorro-antd/timeline';\r\nimport { MentionOnSearchTypes, NzMentionModule } from 'ng-zorro-antd/mention';\r\nimport { RdAction } from '@pages/rd/models/rd.model';\r\nimport { EllipsisTextComponent } from '@app/shared/components/ellipsis-text/ellipsis-text.component';\r\n\r\n@Component({\r\n selector: 'app-issue-comment-area',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzButtonModule,\r\n NzIconModule,\r\n NzInputModule,\r\n NzListModule,\r\n NzCommentModule,\r\n NzTimelineModule,\r\n NzMentionModule,\r\n NzFormModule,\r\n FormsModule,\r\n NzAvatarModule,\r\n DetailItemCardComponent,\r\n EllipsisTextComponent,\r\n ],\r\n template: `\r\n <app-detail-item-card title=\"研发动态\">\r\n <nz-comment>\r\n <nz-avatar\r\n nz-comment-avatar\r\n [nzSrc]=\"\"\r\n [nzText]=\"'我'\"\r\n nzSize=\"small\"\r\n style=\"background-color:#87d068\"\r\n />\r\n <nz-comment-content>\r\n <nz-form-item>\r\n <nz-mention\r\n [nzSuggestions]=\"mentionOptions()\"\r\n [nzValueWith]=\"mentionLabel\"\r\n (nzOnSearchChange)=\"handleMentionSearch($event)\"\r\n (nzOnSelect)=\"handleMentionSelect($event)\"\r\n >\r\n <textarea\r\n [(ngModel)]=\"commentDraft\"\r\n nz-input\r\n nzMentionTrigger\r\n rows=\"4\"\r\n class=\"comment-input\"\r\n placeholder=\"添加评论...输入 @ 提及成员\"\r\n ></textarea>\r\n <ng-template nzMentionSuggestion let-member>\r\n <div class=\"mention-option\">\r\n <span class=\"mention-name\">{{ member.displayName || member.userId }}</span>\r\n <span class=\"mention-id\">{{ roleLabel(member.roleCode) }}</span>\r\n </div>\r\n </ng-template>\r\n </nz-mention>\r\n </nz-form-item>\r\n <nz-form-item class=\"toolbar\">\r\n <button\r\n nz-button\r\n nzType=\"primary\"\r\n [nzLoading]=\"busy()\"\r\n (click)=\"handleSubmit()\"\r\n class=\"send\"\r\n [disabled]=\"!canComment()\"\r\n >\r\n @if (canComment()) {\r\n 发送评论\r\n } @else {\r\n 没有评论权限\r\n }\r\n </button>\r\n </nz-form-item>\r\n </nz-comment-content>\r\n </nz-comment>\r\n @if (logs().length === 0) {\r\n <div class=\"comment-empty\">暂无评论/备注</div>\r\n } @else {\r\n <!-- <nz-list [nzDataSource]=\"comments()\" [nzRenderItem]=\"item\" nzItemLayout=\"horizontal\">\r\n <ng-template #item let-item>\r\n <nz-comment [nzAuthor]=\"item.authorName\" [nzDatetime]=\"formatDate(item.createdAt)\">\r\n <nz-avatar\r\n nz-comment-avatar\r\n [nzText]=\"item.authorName.charAt(0)\"\r\n nzSize=\"small\"\r\n style=\"background-color: #1890ff\"\r\n />\r\n <nz-comment-content>\r\n <p>{{ item.content }}</p>\r\n </nz-comment-content>\r\n </nz-comment>\r\n </ng-template>\r\n </nz-list> -->\r\n <nz-timeline>\r\n @for (log of logs(); track log.id) {\r\n <nz-timeline-item [nzDot]=\"dotTemplate\">\r\n @if (log.actionType === 'comment') {\r\n <!-- 用户评论 -->\r\n <div class=\"comment-item\">\r\n <nz-comment [nzAuthor]=\"log.operatorName!\">\r\n <nz-avatar\r\n nz-comment-avatar\r\n [nzSrc]=\"getMemberAvatarUrl(log?.operatorId ?? '')\"\r\n [nzText]=\"log.operatorName!.charAt(0)\"\r\n nzSize=\"small\"\r\n style=\"background-color: #1890ff\"\r\n />\r\n <nz-comment-content>\r\n <p class=\"summary\">\r\n <app-ellipsis-text [lines]=\"2\">\r\n @for (seg of commentSegments(log.summary!); track $index) {\r\n @if (seg.mention) {\r\n <span class=\"mention\">{{ seg.text }}</span>\r\n } @else {\r\n <span>{{ seg.text }}</span>\r\n }\r\n }\r\n </app-ellipsis-text>\r\n </p>\r\n </nz-comment-content>\r\n </nz-comment>\r\n <span class=\"time\">{{ log.createdAt | date: 'MM/dd HH:mm' }}</span>\r\n </div>\r\n } @else {\r\n <!-- 评论以外的操作 -->\r\n <div class=\"log-item\">\r\n <div class=\"meta\">\r\n <span class=\"operator\">{{ log.operatorName || '系统' }}</span>\r\n <app-ellipsis-text [text]=\"log.summary || log.actionType\" [lines]=\"2\">\r\n <span class=\"content\">{{ log.summary || log.actionType }}</span>\r\n </app-ellipsis-text>\r\n <div class=\"time\">{{ log.createdAt | date: 'MM/dd HH:mm' }}</div>\r\n </div>\r\n </div>\r\n }\r\n </nz-timeline-item>\r\n <ng-template #dotTemplate>\r\n <nz-icon\r\n [nzType]=\"iconByAction(log.actionType)\"\r\n nzTheme=\"outline\"\r\n style=\"font-size: 16px;\"\r\n />\r\n </ng-template>\r\n }\r\n </nz-timeline>\r\n }\r\n </app-detail-item-card>\r\n `,\r\n styles: `\r\n .mention {\r\n color: #1677ff;\r\n font-weight: 500;\r\n cursor: pointer;\r\n }\r\n .comment-empty {\r\n margin: 1rem;\r\n text-align: center;\r\n color: gray;\r\n }\r\n .comment-input {\r\n width: 100%;\r\n border-radius: 10px;\r\n }\r\n .toolbar {\r\n display: flex;\r\n justify-content: end;\r\n }\r\n .send {\r\n border-radius: 6px;\r\n }\r\n .mention-option {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 12px;\r\n }\r\n .mention-name {\r\n font-weight: 600;\r\n }\r\n .mention-id {\r\n font-size: 12px;\r\n }\r\n .log-item {\r\n padding: 4px 0 0;\r\n .meta {\r\n display: flex;\r\n align-items: start;\r\n gap: 0.875rem;\r\n color: rgba(0, 0, 0, 0.65);\r\n font-size: 0.875rem;\r\n margin-bottom: 4px;\r\n .operator {\r\n font-weight: bold;\r\n white-space: nowrap;\r\n }\r\n .content {\r\n color: rgba(0, 0, 0, 0.85);\r\n font-size: 14px;\r\n }\r\n }\r\n .empty {\r\n color: rgba(0, 0, 0, 0.45);\r\n }\r\n }\r\n .comment-item {\r\n display: flex;\r\n }\r\n .time {\r\n padding-left: 10px;\r\n display: flex;\r\n align-items: center;\r\n min-width: 100px;\r\n font-size: 14px;\r\n font-weight: 300;\r\n color: #bbbbbb;\r\n margin-left: auto;\r\n }\r\n .log-item {\r\n padding-bottom: 16px;\r\n }\r\n .summary {\r\n font-size: 14px;\r\n }\r\n :host ::ng-deep .ant-timeline-item {\r\n margin-left: 6px;\r\n padding-bottom: 0;\r\n }\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class IssueCommentAreaComponent {\r\n private readonly authStore = inject(UserStore);\r\n\r\n readonly canComment = input(false);\r\n readonly logs = input.required<IssueLogEntity[]>();\r\n readonly members = input<ProjectMemberEntity[]>([]);\r\n readonly projectId = input<string>();\r\n readonly busy = input(false);\r\n private readonly mentionPattern = /(@[^\\s@,,.。;;::!?!?]+)/g;\r\n\r\n readonly submit = output<createCommentInput>();\r\n\r\n readonly commentDraft = signal('');\r\n readonly mentionKeyword = signal('');\r\n\r\n readonly mentionOptions = computed(() => {\r\n const keyword = this.mentionKeyword().trim().toLowerCase();\r\n const members = this.members();\r\n if (!keyword) {\r\n return members.slice(0, 20);\r\n }\r\n return members\r\n .filter((member) => {\r\n const displayName = (member.displayName || '').toLowerCase();\r\n const userId = (member.userId || '').toLowerCase();\r\n return displayName.includes(keyword) || userId.includes(keyword);\r\n })\r\n .slice(0, 20);\r\n });\r\n\r\n handleSubmit() {\r\n if (!this.commentDraft().trim()) return;\r\n this.submit.emit({\r\n content: this.commentDraft(),\r\n mentions: this.collectMentions(this.commentDraft()),\r\n });\r\n this.commentDraft.set('');\r\n this.mentionKeyword.set('');\r\n }\r\n\r\n roleLabel(roleCode: string): string {\r\n return ROLE_LABELS[roleCode] || roleCode;\r\n }\r\n\r\n mentionLabel(member: ProjectMemberEntity): string {\r\n return member.displayName?.trim() || member.userId;\r\n }\r\n\r\n handleMentionSearch(event: MentionOnSearchTypes): void {\r\n this.mentionKeyword.set(event.value || '');\r\n }\r\n\r\n handleMentionSelect(_member: ProjectMemberEntity): void {\r\n this.mentionKeyword.set('');\r\n }\r\n\r\n private collectMentions(content: string): string[] {\r\n const result = new Set<string>();\r\n for (const member of this.members()) {\r\n const label = this.mentionLabel(member);\r\n if (label && content.includes(`@${label}`)) {\r\n result.add(member.userId);\r\n }\r\n }\r\n return [...result];\r\n }\r\n\r\n iconByAction(action: string): string {\r\n return (\r\n {\r\n create: 'plus-circle',\r\n update: 'edit',\r\n start: 'play-circle',\r\n block: 'pause-circle',\r\n resume: 'redo',\r\n resolve: 'check-circle',\r\n accept: 'safety-certificate',\r\n close: 'close-circle',\r\n advance_stage: 'right-circle',\r\n delete: 'delete',\r\n comment: 'message',\r\n }[action] ?? 'history'\r\n );\r\n }\r\n\r\n commentSegments(text: string): Array<{ text: string; mention?: boolean }> {\r\n const segments: Array<{ text: string; mention?: boolean }> = [];\r\n\r\n if (!text) return segments;\r\n\r\n const regex = this.mentionPattern;\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = regex.exec(text))) {\r\n const start = match.index;\r\n const full = match[0]; // @陈墨\r\n const name = full.slice(1); // 陈墨\r\n\r\n // 普通文本\r\n if (start > lastIndex) {\r\n segments.push({\r\n text: text.slice(lastIndex, start),\r\n });\r\n }\r\n\r\n // mention(只对成员高亮)\r\n segments.push({\r\n text: full,\r\n mention: this.isMember(name),\r\n });\r\n\r\n lastIndex = regex.lastIndex;\r\n }\r\n\r\n // 剩余文本\r\n if (lastIndex < text.length) {\r\n segments.push({\r\n text: text.slice(lastIndex),\r\n });\r\n }\r\n\r\n return segments;\r\n }\r\n\r\n isMember(name: string): boolean {\r\n return !!this.members().find((member) => member.displayName === name);\r\n }\r\n\r\n getMemberAvatarUrl(userId: string): string {\r\n if (!this.projectId()) return '';\r\n const member = this.members().find((member) => member.userId === userId);\r\n const avatarUrl = this.transformAvatarUrl(\r\n member?.avatarUrl || '',\r\n this.projectId()!,\r\n this.logs()[0].issueId,\r\n );\r\n return avatarUrl;\r\n }\r\n\r\n transformAvatarUrl(url: string, projectKey: string, issueId: string): string {\r\n // 使用正则表达式从原始路径中提取出 attachmentId\r\n const regex = /\\/api\\/admin\\/uploads\\/(upl_[a-zA-Z0-9_-]+)\\/raw/;\r\n const match = url.match(regex);\r\n\r\n if (match) {\r\n // 提取出 attachmentId\r\n const attachmentId = match[1];\r\n\r\n // 返回转换后的 URL\r\n return `/api/token/projects/${projectKey}/issues/${issueId}/attachments/${attachmentId}/raw`;\r\n } else {\r\n return '';\r\n }\r\n }\r\n}\r\n","/* angular:styles/component:less;5203d2fa9c3095a15770edf81b96d290bc82b89d9686d40a0de350991ef9f39e;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\issue-detail\\issue-description-area\\issue-description-area.component.ts */\n.empty {\n margin: 1rem;\n text-align: center;\n color: gray;\n}\n.resolution {\n margin-top: 26px;\n}\n.resolution .resolution-label {\n font-size: 0.8rem;\n font-weight: bold;\n color: grey;\n}\n.resolution .resolution-content {\n font-size: 0.8rem;\n text-indent: 0.8rem;\n}\n/*# sourceMappingURL=issue-description-area.component.css.map */\n","<div #viewerRef class=\"markdown-viewer markdown-body\" (click)=\"onContentClick($event)\">\r\n <div class=\"markdown-layout\" [class.has-toc]=\"showToc && tocItems.length > 0 && tocVariant === 'inline'\">\r\n @if (showToc && tocItems.length > 0 && tocVariant === 'floating') {\r\n <div class=\"markdown-toc-floating\" [class.is-collapsed]=\"tocCollapsed\">\r\n <button\r\n type=\"button\"\r\n class=\"markdown-toc-floating__toggle\"\r\n (click)=\"toggleToc()\"\r\n >\r\n {{ tocCollapsed ? '目录' : '收起目录' }}\r\n </button>\r\n @if (!tocCollapsed) {\r\n <aside class=\"markdown-toc markdown-toc--floating\">\r\n <div class=\"markdown-toc__title\">On this page</div>\r\n <ul class=\"markdown-toc__list\">\r\n @for (item of tocItems; track item.id) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"markdown-toc__item\"\r\n [class.is-active]=\"activeTocId === item.id\"\r\n [attr.data-toc-id]=\"item.id\"\r\n [style.paddingLeft.px]=\"(item.level - 1) * 12\"\r\n (click)=\"jumpToHeading(item.id)\"\r\n >\r\n {{ item.text }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </aside>\r\n }\r\n </div>\r\n }\r\n @if (showToc && tocItems.length > 0 && tocVariant === 'inline') {\r\n <aside class=\"markdown-toc\">\r\n <div class=\"markdown-toc__title\">On this page</div>\r\n <ul class=\"markdown-toc__list\">\r\n @for (item of tocItems; track item.id) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"markdown-toc__item\"\r\n [class.is-active]=\"activeTocId === item.id\"\r\n [attr.data-toc-id]=\"item.id\"\r\n [style.paddingLeft.px]=\"(item.level - 1) * 12\"\r\n (click)=\"jumpToHeading(item.id)\"\r\n >\r\n {{ item.text }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </aside>\r\n }\r\n <div class=\"markdown-content\">\r\n <markdown [data]=\"content\" [clipboard]=\"true\" (ready)=\"onMarkdownReady()\"></markdown>\r\n </div>\r\n </div>\r\n</div>\r\n","/* src/app/shared/components/markdown-viewer/markdown-viewer.component.less */\n:host {\n display: block;\n width: 100%;\n}\n:host .markdown-viewer {\n font-size: 14px;\n line-height: 1.8;\n color: var(--text-primary, #262626);\n word-break: break-word;\n}\n:host .markdown-viewer .markdown-layout {\n display: block;\n position: relative;\n}\n:host .markdown-viewer .markdown-layout.has-toc {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 280px;\n gap: 20px;\n align-items: start;\n}\n:host .markdown-viewer .markdown-content {\n min-width: 0;\n order: 1;\n display: flow-root;\n}\n:host .markdown-viewer .markdown-toc-floating {\n position: sticky;\n top: 8px;\n z-index: 4;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 8px;\n float: right;\n clear: right;\n margin: 0 0 8px 16px;\n width: fit-content;\n}\n:host .markdown-viewer .markdown-toc-floating__toggle {\n height: 30px;\n min-width: 64px;\n padding: 0 10px;\n border: 1px solid var(--border-color-soft, #d9dde6);\n border-radius: 999px;\n background: var(--surface-elevated, rgba(255, 255, 255, 0.92));\n color: var(--text-secondary, #475569);\n font-size: 12px;\n line-height: 28px;\n cursor: pointer;\n box-shadow: 0 6px 16px rgba(15, 23, 42, 0.1);\n -webkit-backdrop-filter: blur(4px);\n backdrop-filter: blur(4px);\n}\n:host .markdown-viewer .markdown-toc-floating__toggle:hover {\n color: var(--text-primary, #0f172a);\n}\n:host .markdown-viewer .markdown-toc--floating {\n width: 220px;\n max-height: min(55vh, 420px);\n overflow: auto;\n margin: 0;\n padding: 10px 0 10px 14px;\n border-radius: 14px;\n border: 1px solid var(--border-color-soft, #e5e6eb);\n background: var(--surface-elevated, rgba(255, 255, 255, 0.96));\n box-shadow: 0 14px 28px rgba(15, 23, 42, 0.16);\n position: static;\n}\n:host .markdown-viewer .markdown-toc.markdown-toc--floating {\n position: static;\n top: auto;\n order: initial;\n border-left: 0;\n padding-left: 14px;\n}\n:host .markdown-viewer .markdown-toc {\n margin: 0;\n padding: 6px 0 6px 18px;\n border-left: 1px solid var(--border-color-soft, #e5e6eb);\n position: sticky;\n top: 76px;\n order: 2;\n min-width: 0;\n max-height: min(68vh, calc(100vh - 140px));\n overflow: auto;\n}\n:host .markdown-viewer .markdown-toc__title {\n margin: 0 0 10px;\n font-size: 14px;\n font-weight: 700;\n color: var(--text-heading, #1f2937);\n}\n:host .markdown-viewer .markdown-toc__list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 2px;\n}\n:host .markdown-viewer .markdown-toc__item {\n position: relative;\n width: 100%;\n min-height: 30px;\n border: 0;\n border-radius: 0;\n background: transparent;\n color: var(--text-muted, #64748b);\n text-align: left;\n font-size: 13px;\n line-height: 1.45;\n padding: 4px 8px 4px 10px;\n cursor: pointer;\n white-space: normal;\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n:host .markdown-viewer .markdown-toc__item:hover {\n background: transparent;\n color: var(--text-primary, #0f172a);\n}\n:host .markdown-viewer .markdown-toc__item.is-active {\n color: var(--primary-500, #2563eb);\n font-weight: 600;\n}\n:host .markdown-viewer .markdown-toc__item.is-active::after {\n content: \"\";\n position: absolute;\n left: 2px;\n top: 7px;\n bottom: 7px;\n width: 2px;\n border-radius: 999px;\n background: var(--primary-500, #2563eb);\n}\n:host .markdown-viewer .markdown-toc--floating .markdown-toc__item {\n padding-left: 10px;\n}\n:host .markdown-viewer ::ng-deep h1,\n:host .markdown-viewer ::ng-deep h2,\n:host .markdown-viewer ::ng-deep h3,\n:host .markdown-viewer ::ng-deep h4,\n:host .markdown-viewer ::ng-deep h5,\n:host .markdown-viewer ::ng-deep h6 {\n margin: 1.2em 0 0.6em;\n font-weight: 600;\n line-height: 1.4;\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n:host .markdown-viewer ::ng-deep h1 {\n font-size: 28px;\n}\n:host .markdown-viewer ::ng-deep h2 {\n font-size: 24px;\n}\n:host .markdown-viewer ::ng-deep h3 {\n font-size: 20px;\n}\n:host .markdown-viewer ::ng-deep h1,\n:host .markdown-viewer ::ng-deep h2,\n:host .markdown-viewer ::ng-deep h3,\n:host .markdown-viewer ::ng-deep h4,\n:host .markdown-viewer ::ng-deep h5,\n:host .markdown-viewer ::ng-deep h6 {\n scroll-margin-top: 88px;\n}\n:host .markdown-viewer ::ng-deep p {\n margin: 0 0 12px;\n}\n:host .markdown-viewer ::ng-deep ul,\n:host .markdown-viewer ::ng-deep ol {\n margin: 0 0 12px;\n padding-left: 24px;\n}\n:host .markdown-viewer ::ng-deep li {\n margin: 4px 0;\n}\n:host .markdown-viewer ::ng-deep blockquote {\n margin: 0 0 12px;\n padding: 8px 12px;\n color: #595959;\n border-left: 4px solid #d9d9d9;\n background: #fafafa;\n}\n:host .markdown-viewer ::ng-deep pre {\n overflow: auto;\n padding: 12px 14px;\n border-radius: 8px;\n background: #f6f8fa;\n border: 1px solid var(--border-color-soft, #e5e6eb);\n}\n:host .markdown-viewer ::ng-deep code {\n font-family:\n Consolas,\n \"Courier New\",\n monospace;\n}\n:host .markdown-viewer ::ng-deep :not(pre) > code {\n padding: 2px 6px;\n border-radius: 6px;\n background: var(--bg-subtle, #f5f7fa);\n border: 1px solid var(--border-color-soft, #e5e6eb);\n color: var(--text-primary, #262626);\n font-size: 13px;\n}\n:host .markdown-viewer ::ng-deep pre code {\n background: transparent;\n border: 0;\n padding: 0;\n color: inherit;\n font-size: 13px;\n line-height: 1.7;\n}\n:host .markdown-viewer ::ng-deep table {\n width: 100%;\n margin: 0 0 12px;\n border-collapse: collapse;\n}\n:host .markdown-viewer ::ng-deep th,\n:host .markdown-viewer ::ng-deep td {\n padding: 8px 10px;\n border: 1px solid #e5e6eb;\n text-align: left;\n}\n:host .markdown-viewer ::ng-deep img {\n display: block;\n max-width: 100%;\n width: auto;\n max-height: min(32vh, 100px);\n margin: 12px 0;\n border-radius: 10px;\n object-fit: contain;\n border: 1px solid var(--border-color-soft, #e5e6eb);\n background: var(--bg-elevated, #fff);\n cursor: zoom-in;\n box-shadow: 0 4px 12px rgba(15, 23, 42, 0.08);\n}\n:host .markdown-viewer ::ng-deep a {\n color: #1677ff;\n text-decoration: none;\n}\n:host .markdown-viewer ::ng-deep a:hover {\n text-decoration: underline;\n}\n:host .markdown-viewer :host-context(html[data-theme=\"dark\"]) ::ng-deep pre {\n background: #0f172a;\n border-color: rgba(148, 163, 184, 0.24);\n}\n:host .markdown-viewer :host-context(html[data-theme=\"dark\"]) ::ng-deep :not(pre) > code {\n background: rgba(148, 163, 184, 0.14);\n border-color: rgba(148, 163, 184, 0.24);\n color: #e2e8f0;\n}\n:host .markdown-viewer :host-context(html[data-theme=\"dark\"]) .markdown-toc,\n:host .markdown-viewer :host-context(html.dark) .markdown-toc,\n:host .markdown-viewer :host-context(body[data-theme=\"dark\"]) .markdown-toc {\n border-color: rgba(148, 163, 184, 0.24);\n background: transparent;\n}\n:host .markdown-viewer :host-context(html[data-theme=\"dark\"]) .markdown-toc--floating,\n:host .markdown-viewer :host-context(html.dark) .markdown-toc--floating,\n:host .markdown-viewer :host-context(body[data-theme=\"dark\"]) .markdown-toc--floating {\n border-color: rgba(148, 163, 184, 0.28);\n background: #162033 !important;\n box-shadow: 0 14px 28px rgba(2, 6, 23, 0.45);\n}\n:host .markdown-viewer :host-context(html[data-theme=\"dark\"]) .markdown-toc-floating__toggle,\n:host .markdown-viewer :host-context(html.dark) .markdown-toc-floating__toggle,\n:host .markdown-viewer :host-context(body[data-theme=\"dark\"]) .markdown-toc-floating__toggle {\n border-color: rgba(148, 163, 184, 0.3) !important;\n background: #162033 !important;\n color: #e2e8f0 !important;\n box-shadow: 0 10px 22px rgba(2, 6, 23, 0.42);\n}\n:host .markdown-viewer :host-context(html[data-theme=\"dark\"]) .markdown-toc__title,\n:host .markdown-viewer :host-context(html.dark) .markdown-toc__title,\n:host .markdown-viewer :host-context(body[data-theme=\"dark\"]) .markdown-toc__title {\n color: #e2e8f0;\n}\n:host .markdown-viewer :host-context(html[data-theme=\"dark\"]) .markdown-toc__item,\n:host .markdown-viewer :host-context(html.dark) .markdown-toc__item,\n:host .markdown-viewer :host-context(body[data-theme=\"dark\"]) .markdown-toc__item {\n color: #cbd5e1;\n}\n:host .markdown-viewer :host-context(html[data-theme=\"dark\"]) .markdown-toc__item:hover,\n:host .markdown-viewer :host-context(html.dark) .markdown-toc__item:hover,\n:host .markdown-viewer :host-context(body[data-theme=\"dark\"]) .markdown-toc__item:hover {\n color: #f1f5f9;\n}\n:host .markdown-viewer :host-context(html[data-theme=\"dark\"]) .markdown-toc__item.is-active,\n:host .markdown-viewer :host-context(html.dark) .markdown-toc__item.is-active,\n:host .markdown-viewer :host-context(body[data-theme=\"dark\"]) .markdown-toc__item.is-active {\n color: #60a5fa;\n}\n@media (max-width: 1024px) {\n :host .markdown-viewer .markdown-layout.has-toc {\n grid-template-columns: 1fr;\n }\n :host .markdown-viewer .markdown-toc {\n position: static;\n margin-bottom: 12px;\n }\n :host .markdown-viewer .markdown-toc-floating {\n position: static;\n margin-bottom: 8px;\n align-items: flex-start;\n }\n :host .markdown-viewer .markdown-toc--floating {\n width: 100%;\n max-height: none;\n }\n}\n/*# sourceMappingURL=markdown-viewer.component.css.map */\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, OnChanges, OnDestroy, SimpleChanges, ViewChild, inject } from '@angular/core';\r\nimport { NzImageModule, NzImageService } from 'ng-zorro-antd/image';\r\nimport { MarkdownModule } from 'ngx-markdown';\r\n\r\n@Component({\r\n selector: 'app-markdown-viewer',\r\n standalone: true,\r\n imports: [CommonModule, MarkdownModule, NzImageModule],\r\n templateUrl: './markdown-viewer.component.html',\r\n styleUrls: ['./markdown-viewer.component.less'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class MarkdownViewerComponent implements OnChanges, OnDestroy {\r\n private readonly imageService = inject(NzImageService);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n @ViewChild('viewerRef', { static: true })\r\n viewerRef!: ElementRef<HTMLElement>;\r\n\r\n @Input() content = '';\r\n @Input() showToc = true;\r\n @Input() tocVariant: 'inline' | 'floating' = 'inline';\r\n @Input() tocCollapsedByDefault = false;\r\n\r\n tocItems: Array<{ id: string; text: string; level: number }> = [];\r\n activeTocId: string | null = null;\r\n tocCollapsed = false;\r\n private headingElements: HTMLElement[] = [];\r\n private scrollContainer: HTMLElement | Window | null = null;\r\n private scrollListener: (() => void) | null = null;\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['content'] || changes['showToc'] || changes['tocCollapsedByDefault'] || changes['tocVariant']) {\r\n queueMicrotask(() => this.buildToc());\r\n }\r\n }\r\n\r\n onMarkdownReady(): void {\r\n this.buildToc();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.teardownScrollTracking();\r\n }\r\n\r\n jumpToHeading(id: string): void {\r\n const host = this.viewerRef?.nativeElement;\r\n const target = host?.querySelector<HTMLElement>(`#${CSS.escape(id)}`);\r\n if (!target) {\r\n return;\r\n }\r\n\r\n this.activeTocId = id;\r\n this.cdr.markForCheck();\r\n queueMicrotask(() => this.ensureActiveTocItemVisible());\r\n\r\n const container = this.scrollContainer instanceof HTMLElement ? this.scrollContainer : null;\r\n const topOffset = 16;\r\n if (container) {\r\n const containerRect = container.getBoundingClientRect();\r\n const targetRect = target.getBoundingClientRect();\r\n const nextTop = container.scrollTop + (targetRect.top - containerRect.top) - topOffset;\r\n container.scrollTo({ top: Math.max(0, nextTop), behavior: 'smooth' });\r\n return;\r\n }\r\n\r\n const viewportTop = target.getBoundingClientRect().top + window.scrollY - 88;\r\n window.scrollTo({ top: Math.max(0, viewportTop), behavior: 'smooth' });\r\n }\r\n\r\n toggleToc(): void {\r\n this.tocCollapsed = !this.tocCollapsed;\r\n }\r\n\r\n onContentClick(event: MouseEvent): void {\r\n const target = event.target as HTMLElement | null;\r\n const image = target?.closest('img') as HTMLImageElement | null;\r\n if (!image?.src) {\r\n return;\r\n }\r\n\r\n const host = this.viewerRef?.nativeElement;\r\n const imageElements = host\r\n ? Array.from(host.querySelectorAll('img'))\r\n : [image];\r\n const previewImages = imageElements\r\n .map((item) => ({\r\n src: item.currentSrc || item.src,\r\n alt: item.alt || undefined\r\n }))\r\n .filter((item) => !!item.src);\r\n const index = Math.max(\r\n 0,\r\n imageElements.findIndex((item) => item === image)\r\n );\r\n\r\n if (previewImages.length === 0) {\r\n return;\r\n }\r\n const previewRef = this.imageService.preview(previewImages, {\r\n nzMaskClosable: true,\r\n nzKeyboard: true\r\n });\r\n if (index > 0) {\r\n previewRef.switchTo(index);\r\n }\r\n }\r\n\r\n private buildToc(): void {\r\n if (!this.showToc) {\r\n this.tocItems = [];\r\n this.activeTocId = null;\r\n this.tocCollapsed = true;\r\n this.teardownScrollTracking();\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n const host = this.viewerRef?.nativeElement;\r\n if (!host) {\r\n this.tocItems = [];\r\n this.activeTocId = null;\r\n this.tocCollapsed = this.tocCollapsedByDefault;\r\n this.teardownScrollTracking();\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n const headings = Array.from(host.querySelectorAll<HTMLElement>('h1, h2, h3'));\r\n const duplicateCount = new Map<string, number>();\r\n const items: Array<{ id: string; text: string; level: number }> = [];\r\n\r\n for (let index = 0; index < headings.length; index += 1) {\r\n const heading = headings[index];\r\n const text = (heading.textContent || '').trim();\r\n if (!text) {\r\n continue;\r\n }\r\n const level = Number(heading.tagName.slice(1)) || 1;\r\n let slug = this.slugify(text) || `section-${index + 1}`;\r\n const count = duplicateCount.get(slug) ?? 0;\r\n duplicateCount.set(slug, count + 1);\r\n if (count > 0) {\r\n slug = `${slug}-${count + 1}`;\r\n }\r\n\r\n heading.id = heading.id || slug;\r\n items.push({ id: heading.id, text, level });\r\n }\r\n\r\n this.tocItems = items;\r\n this.activeTocId = items[0]?.id ?? null;\r\n this.tocCollapsed = this.tocCollapsedByDefault;\r\n this.setupScrollTracking(host, headings);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private setupScrollTracking(host: HTMLElement, headings: HTMLElement[]): void {\r\n this.teardownScrollTracking();\r\n if (headings.length === 0) {\r\n return;\r\n }\r\n\r\n this.headingElements = headings;\r\n const container = this.findScrollContainer(host);\r\n this.scrollContainer = container ?? window;\r\n this.scrollListener = () => this.syncActiveHeading();\r\n this.scrollContainer.addEventListener('scroll', this.scrollListener, { passive: true });\r\n window.addEventListener('resize', this.scrollListener, { passive: true });\r\n this.syncActiveHeading();\r\n }\r\n\r\n private teardownScrollTracking(): void {\r\n if (this.scrollListener) {\r\n this.scrollContainer?.removeEventListener('scroll', this.scrollListener as EventListener);\r\n window.removeEventListener('resize', this.scrollListener as EventListener);\r\n }\r\n this.headingElements = [];\r\n this.scrollContainer = null;\r\n this.scrollListener = null;\r\n }\r\n\r\n private syncActiveHeading(): void {\r\n if (this.headingElements.length === 0) {\r\n return;\r\n }\r\n\r\n const threshold = 96;\r\n let active = this.headingElements[0];\r\n const container = this.scrollContainer instanceof HTMLElement ? this.scrollContainer : null;\r\n\r\n if (container) {\r\n const containerRect = container.getBoundingClientRect();\r\n const current = container.scrollTop + threshold;\r\n const maxScrollTop = Math.max(container.scrollHeight - container.clientHeight, 0);\r\n const nearBottom = maxScrollTop - container.scrollTop <= 2;\r\n\r\n if (nearBottom) {\r\n active = this.headingElements[this.headingElements.length - 1];\r\n }\r\n\r\n for (const heading of this.headingElements) {\r\n const headingRect = heading.getBoundingClientRect();\r\n const top = headingRect.top - containerRect.top + container.scrollTop;\r\n if (top <= current) {\r\n active = heading;\r\n } else {\r\n break;\r\n }\r\n }\r\n } else {\r\n for (const heading of this.headingElements) {\r\n const top = heading.getBoundingClientRect().top;\r\n if (top <= threshold) {\r\n active = heading;\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!active.id || active.id === this.activeTocId) {\r\n return;\r\n }\r\n\r\n this.activeTocId = active.id;\r\n this.cdr.markForCheck();\r\n queueMicrotask(() => this.ensureActiveTocItemVisible());\r\n }\r\n\r\n private ensureActiveTocItemVisible(): void {\r\n const host = this.viewerRef?.nativeElement;\r\n if (!host || !this.activeTocId) {\r\n return;\r\n }\r\n\r\n const item = host.querySelector<HTMLElement>(\r\n `.markdown-toc__item[data-toc-id=\"${CSS.escape(this.activeTocId)}\"]`\r\n );\r\n if (!item) {\r\n return;\r\n }\r\n\r\n const container = item.closest<HTMLElement>('.markdown-toc--floating, .markdown-toc');\r\n if (!container) {\r\n return;\r\n }\r\n\r\n item.scrollIntoView({ block: 'nearest', inline: 'nearest' });\r\n\r\n const itemTop = item.offsetTop;\r\n const itemBottom = itemTop + item.offsetHeight;\r\n const viewTop = container.scrollTop;\r\n const viewBottom = viewTop + container.clientHeight;\r\n\r\n if (itemTop < viewTop) {\r\n container.scrollTop = Math.max(itemTop - 8, 0);\r\n } else if (itemBottom > viewBottom) {\r\n container.scrollTop = itemBottom - container.clientHeight + 8;\r\n }\r\n }\r\n\r\n private findScrollContainer(element: HTMLElement): HTMLElement | null {\r\n let current: HTMLElement | null = element.parentElement;\r\n while (current) {\r\n const style = getComputedStyle(current);\r\n const overflowY = style.overflowY;\r\n if ((overflowY === 'auto' || overflowY === 'scroll') && current.scrollHeight > current.clientHeight) {\r\n return current;\r\n }\r\n current = current.parentElement;\r\n }\r\n return null;\r\n }\r\n\r\n private slugify(value: string): string {\r\n return value\r\n .toLowerCase()\r\n .trim()\r\n .replace(/\\s+/g, '-')\r\n .replace(/[^\\w\\u4e00-\\u9fa5-]/g, '')\r\n .replace(/-+/g, '-')\r\n .replace(/^-|-$/g, '');\r\n }\r\n}\r\n","import { Component, computed, input, signal } from '@angular/core';\r\nimport { EllipsisTextComponent } from '@app/shared/components/ellipsis-text/ellipsis-text.component';\r\nimport { MarkdownViewerComponent } from '@app/shared/components/markdown-viewer';\r\nimport { ISSUE_TITLE_BY_TYPE } from '@app/shared/constants/issue-type-options';\r\nimport { DetailItemCardComponent } from '@app/shared/ui/detail-item-card.component/detail-item-card.component';\r\nimport { IssueEntity } from '@pages/issues/models/issue.model';\r\n\r\n@Component({\r\n selector: 'app-issue-description-area',\r\n imports: [DetailItemCardComponent, MarkdownViewerComponent, EllipsisTextComponent],\r\n template: `\r\n <app-detail-item-card [title]=\"getIssueTitleByType(issue())\" maxHeight=\"550px\">\r\n @if (mdContent(); as des) {\r\n <app-markdown-viewer\r\n [content]=\"des\"\r\n [showToc]=\"true\"\r\n [tocVariant]=\"'floating'\"\r\n [tocCollapsedByDefault]=\"true\"\r\n ></app-markdown-viewer>\r\n } @else {\r\n <div class=\"empty\">暂无描述</div>\r\n }\r\n @if (issue().resolutionSummary) {\r\n <div class=\"resolution\">\r\n <div class=\"resolution-label\">解决说明</div>\r\n <div class=\"resolution-content\">\r\n <app-ellipsis-text [lines]=\"2\">\r\n {{ issue().resolutionSummary }}\r\n </app-ellipsis-text>\r\n </div>\r\n </div>\r\n }\r\n @if (issue().closeReason) {\r\n <div class=\"resolution\">\r\n <div class=\"resolution-label\">关闭原因</div>\r\n <div class=\"resolution-content\">\r\n <app-ellipsis-text [lines]=\"2\">\r\n {{ issue().closeReason }}\r\n </app-ellipsis-text>\r\n </div>\r\n </div>\r\n }\r\n @if (issue().closeRemark) {\r\n <div class=\"resolution\">\r\n <div class=\"resolution-label\">重开原因</div>\r\n <div class=\"resolution-content\">\r\n <app-ellipsis-text [lines]=\"2\">\r\n {{ issue().closeRemark }}\r\n </app-ellipsis-text>\r\n </div>\r\n </div>\r\n }\r\n </app-detail-item-card>\r\n `,\r\n styles: `\r\n .empty {\r\n margin: 1rem;\r\n text-align: center;\r\n color: gray;\r\n }\r\n .resolution {\r\n margin-top: 26px;\r\n .resolution-label {\r\n font-size: 0.8rem;\r\n font-weight: bold;\r\n color: grey;\r\n }\r\n .resolution-content {\r\n font-size: 0.8rem;\r\n text-indent: 0.8rem;\r\n }\r\n }\r\n `,\r\n})\r\nexport class IssueDescriptionAreaComponent {\r\n readonly issue = input.required<IssueEntity>();\r\n readonly projectId = input<string>('');\r\n\r\n readonly mdContent = computed(() => {\r\n return this.replaceImagePaths(\r\n this.issue().description || '',\r\n this.projectId(),\r\n this.issue().id,\r\n );\r\n });\r\n\r\n private replaceImagePaths(mdContent: string, projectId: string, issueId: string) {\r\n // 正则表达式匹配Markdown中的图片路径\r\n const regex = /!\\[.*?\\]\\((\\/api\\/admin\\/uploads\\/[a-zA-Z0-9_-]+\\/raw)\\)/g;\r\n\r\n // 替换匹配到的图片路径\r\n return mdContent.replace(regex, (match: string, originalPath: string) => {\r\n // 提取原路径中的 uploadId (例如upl_mnk0hxvl4xt7)\r\n const matchResult = originalPath.match(/uploads\\/([a-zA-Z0-9_-]+)/);\r\n\r\n if (!matchResult) {\r\n return match;\r\n }\r\n const itemId = matchResult[1];\r\n const newPath = `/api/client/hub-token/projects/${projectId}/issues/${issueId}/uploads/${itemId}/raw`;\r\n\r\n return match.replace(originalPath, newPath);\r\n });\r\n }\r\n\r\n // 获取描述标题\r\n getIssueTitleByType(issue: IssueEntity): string {\r\n const item = ISSUE_TITLE_BY_TYPE.find((i) => i.type === issue.type);\r\n return item ? item.title : '问题描述';\r\n }\r\n}\r\n","/* src/app/pages/issues/issue-detail/issue-branches/issue-branches.component.less */\n.create-btn {\n margin-right: 6px;\n}\n.branch-summary {\n margin: -2px 0 6px;\n font-size: 0.875rem;\n color: gray;\n}\n.branch-list {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n}\n.branch-list .branch-card {\n padding: 12px;\n border-radius: 10px;\n background-color: #fafafa;\n width: 100%;\n transition: all 0.3s ease;\n border: 1px solid #f0f0f0;\n}\n.branch-list .branch-card:hover {\n transform: translateY(-2px);\n box-shadow: 0px 16px 10px -8px rgba(0, 32, 64, 0.12);\n}\n.branch-list .branch-card .branch-card__header {\n display: flex;\n}\n.branch-list .branch-card .branch-card__header .branch-card__title {\n font-weight: 600;\n flex-grow: 1;\n}\n.branch-list .branch-card .branch-card__meta {\n display: flex;\n flex-wrap: wrap;\n gap: 2px;\n margin: 4px 0 8px;\n font-size: 0.75rem;\n color: gray;\n}\n.branch-list .branch-card .branch-card__meta .branch-card__owner {\n color: #1677ff;\n font-weight: bold;\n}\n.branch-list .branch-card .branch-card__summary {\n margin-top: 10px;\n font-size: 0.875rem;\n}\n.branch-list .branch-card .branch-card__actions {\n display: flex;\n}\n:host ::ng-deep .ant-tag {\n height: 1.6rem;\n}\n/*# sourceMappingURL=issue-branches.component.css.map */\n","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, inject, input, output } from '@angular/core';\r\nimport { UserStore } from '@app/core/stores';\r\nimport {\r\n ISSUE_BRANCH_STATUS_COLORS,\r\n ISSUE_BRANCH_STATUS_LABELS,\r\n} from '@app/shared/constants/status-options';\r\nimport { DetailItemCardComponent } from '@app/shared/ui/detail-item-card.component/detail-item-card.component';\r\nimport { IssueBranchEntity, IssueBranchSummary } from '@pages/issues/models/issue.model';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\n\r\n@Component({\r\n selector: 'app-issue-branches',\r\n imports: [DetailItemCardComponent, NzButtonModule, NzTagModule, CommonModule],\r\n template: `\r\n <app-detail-item-card\r\n title=\"协作分支\"\r\n [emptyStatus]=\"!branches().length\"\r\n emptyText=\"当前还没有协作分支\"\r\n >\r\n <div actions>\r\n @if (canStartActions() && canStartOwn()) {\r\n <button\r\n nz-button\r\n nz-tooltip=\"点击开始协作\"\r\n nzType=\"default\"\r\n nzSize=\"small\"\r\n [nzLoading]=\"busy()\"\r\n (click)=\"startOwn.emit()\"\r\n >\r\n 开始\r\n </button>\r\n }\r\n @if (canCreate()) {\r\n <button\r\n nz-button\r\n nz-tooltip=\"点击新建协作分支\"\r\n nzType=\"primary\"\r\n nzSize=\"small\"\r\n [disabled]=\"busy()\"\r\n (click)=\"create.emit()\"\r\n class=\"create-btn\"\r\n >\r\n 新建\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (branches().length > 0) {\r\n <div class=\"branch-summary\">{{ branchSummaryText() }}</div>\r\n <div class=\"branch-list\">\r\n @for (branch of branches(); track branch.id) {\r\n <article class=\"branch-card\">\r\n <div class=\"branch-card__header\">\r\n <div class=\"branch-card__title\">{{ branch.title }}</div>\r\n <nz-tag [nzColor]=\"branchStatusColor(branch.status)\">\r\n {{ branchStatusLabel(branch.status) }}\r\n </nz-tag>\r\n </div>\r\n\r\n <div class=\"branch-card__meta\">\r\n <span class=\"branch-card__owner\">{{ branch.ownerUserName }}</span>\r\n <span>由 {{ branch.createdByName }} 创建</span>\r\n <span>{{ branch.updatedAt | date: 'MM-dd HH:mm' }} 更新</span>\r\n </div>\r\n\r\n @if (branch.summary) {\r\n <div class=\"branch-card__summary\">{{ branch.summary }}</div>\r\n }\r\n <div class=\"branch-card__actions\">\r\n @if (canStartActions() && isMine(branch) && branch.status === 'todo') {\r\n <button\r\n nz-button\r\n nzType=\"default\"\r\n nzSize=\"small\"\r\n [nzLoading]=\"busy()\"\r\n (click)=\"startBranch.emit(branch.id)\"\r\n class=\"action-btn\"\r\n >\r\n 开始处理\r\n </button>\r\n }\r\n @if (canCompleteBranch() && isMine(branch) && branch.status === 'in_progress') {\r\n <button\r\n nz-button\r\n nzType=\"primary\"\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"确认标记该协作分支已完成?\"\r\n nzPopconfirmOkText=\"完成\"\r\n nzPopconfirmCancelText=\"取消\"\r\n [nzLoading]=\"busy()\"\r\n (nzOnConfirm)=\"completeBranch.emit(branch.id)\"\r\n class=\"action-btn\"\r\n >\r\n 标记完成\r\n </button>\r\n }\r\n </div>\r\n </article>\r\n }\r\n </div>\r\n }\r\n </app-detail-item-card>\r\n `,\r\n styleUrl: './issue-branches.component.less',\r\n})\r\nexport class IssueBranchesComponent {\r\n private userStore = inject(UserStore);\r\n readonly branches = input<IssueBranchEntity[]>([]);\r\n readonly summary = input<IssueBranchSummary>();\r\n readonly canCreate = input(false);\r\n readonly canStartActions = input(false);\r\n readonly canStartOwn = input(false);\r\n readonly canCompleteBranch = input(false);\r\n readonly busy = input(false);\r\n\r\n readonly create = output<void>();\r\n readonly startOwn = output<void>();\r\n readonly startBranch = output<string>();\r\n readonly completeBranch = output<string>();\r\n\r\n readonly branchSummaryText = computed(() => {\r\n const stats = this.summary();\r\n if (!stats) return '';\r\n if (stats.total === 0) {\r\n return '当前没有协作分支';\r\n }\r\n const parts = [`已完成 ${stats.done}`];\r\n if (stats.inProgress > 0) {\r\n parts.push(`处理中 ${stats.inProgress}`);\r\n }\r\n if (stats.todo > 0) {\r\n parts.push(`待开始 ${stats.todo}`);\r\n }\r\n return parts.join(',');\r\n });\r\n\r\n isMine(branch: IssueBranchEntity): boolean {\r\n return this.userStore.currentUserId() === branch.ownerUserId;\r\n }\r\n\r\n branchStatusLabel(status: IssueBranchEntity['status']): string {\r\n return ISSUE_BRANCH_STATUS_LABELS[status] ?? status;\r\n }\r\n\r\n branchStatusColor(status: IssueBranchEntity['status']): string {\r\n return ISSUE_BRANCH_STATUS_COLORS[status] ?? 'default';\r\n }\r\n}\r\n","/* angular:styles/component:less;c34c64cbc5231edec199971f2aafa92f8e684e2b04574ff5db8accb17af4e122;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\dialogs\\issue-start-own-branch-dialog.component.ts */\n.modal-title__main {\n font-weight: bold;\n}\n.modal-title {\n display: flex;\n flex-direction: column;\n}\n.modal-subtitle {\n margin-top: 10px;\n color: #999;\n font-size: 14px;\n line-height: 20px;\n}\n.label {\n font-weight: bold;\n font-size: 0.875rem;\n margin-bottom: 4px;\n}\n.hint {\n font-size: small;\n color: gray;\n text-align: right;\n}\n/*# sourceMappingURL=issue-start-own-branch-dialog.component.css.map */\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nimport type { IssueEntity } from '../models/issue.model';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\n\r\n@Component({\r\n selector: 'app-issue-start-own-branch-dialog',\r\n standalone: true,\r\n imports: [FormsModule, NzButtonModule, NzInputModule, NzModalModule, NzIconModule],\r\n template: `\r\n <nz-modal\r\n [nzVisible]=\"open()\"\r\n [nzWidth]=\"640\"\r\n [nzClosable]=\"true\"\r\n [nzMaskClosable]=\"false\"\r\n [nzOkLoading]=\"busy()\"\r\n (nzOnCancel)=\"cancel.emit()\"\r\n (nzOnOk)=\"confirmSubmit()\"\r\n [nzOkDisabled]=\"disabledSubmit()\"\r\n >\r\n <div *nzModalTitle>\r\n <div class=\"modal-title\">\r\n <span class=\"modal-title__main\">\r\n <nz-icon nzType=\"play-circle\" nzTheme=\"twotone\" />\r\n 开始协作\r\n </span>\r\n <div class=\"modal-subtitle\">\r\n {{ issue() ? issue()!.title : '填写本次协作内容。' }}\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *nzModalContent>\r\n <p class=\"label\">协作内容</p>\r\n <input\r\n nz-input\r\n maxlength=\"80\"\r\n [ngModel]=\"title()\"\r\n (ngModelChange)=\"title.set(($event ?? '').toString())\"\r\n placeholder=\"例如:补抓包定位登录异常\"\r\n />\r\n <div class=\"hint\">提交后会自动创建并开始你的协作分支。</div>\r\n </ng-container>\r\n </nz-modal>\r\n `,\r\n styles: [\r\n `\r\n .modal-title__main{\r\n font-weight: bold;\r\n }\r\n .modal-title {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .modal-subtitle {\r\n margin-top: 10px;\r\n color: #999;\r\n font-size: 14px;\r\n line-height: 20px;\r\n }\r\n .label {\r\n font-weight: bold;\r\n font-size: 0.875rem;\r\n margin-bottom: 4px;\r\n }\r\n .hint {\r\n font-size: small;\r\n color: gray;\r\n text-align: right;\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class IssueStartOwnBranchDialogComponent {\r\n readonly open = input(false);\r\n readonly busy = input(false);\r\n readonly issue = input<IssueEntity | null>(null);\r\n readonly cancel = output<void>();\r\n readonly confirm = output<{ title: string }>();\r\n\r\n readonly title = signal('');\r\n readonly disabledSubmit = computed(() => !this.title().trim());\r\n\r\n constructor() {\r\n effect(() => {\r\n if (!this.open()) {\r\n return;\r\n }\r\n this.title.set('');\r\n });\r\n }\r\n\r\n confirmSubmit(): void {\r\n const title = this.title().trim();\r\n if (!title) {\r\n return;\r\n }\r\n this.confirm.emit({ title });\r\n }\r\n}\r\n","/* angular:styles/component:less;7dc6470ad8388ca352d5e1b0f82ef0d0e79459ea86b112d2a2076b28ae69c5c8;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\dialogs\\issue-create-branch-dialog.component.ts */\n.participant-selector {\n width: 100%;\n}\n.modal-title__main {\n font-weight: bold;\n}\n.modal-title {\n display: flex;\n flex-direction: column;\n}\n.modal-subtitle {\n margin-top: 10px;\n color: #999;\n font-size: 14px;\n line-height: 20px;\n}\n.label {\n font-weight: bold;\n font-size: 0.875rem;\n margin: 12px 0 4px;\n}\n.hint {\n font-size: small;\n color: gray;\n text-align: right;\n margin-top: 8px;\n}\n/*# sourceMappingURL=issue-create-branch-dialog.component.css.map */\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { IssueEntity, IssueParticipantEntity } from '../models/issue.model';\r\n\r\n@Component({\r\n selector: 'app-issue-create-branch-dialog',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n NzButtonModule,\r\n NzInputModule,\r\n NzSelectModule,\r\n NzModalModule,\r\n NzIconModule,\r\n ],\r\n template: `\r\n <nz-modal\r\n [nzVisible]=\"open()\"\r\n [nzWidth]=\"680\"\r\n [nzClosable]=\"true\"\r\n [nzMaskClosable]=\"false\"\r\n [nzOkLoading]=\"busy()\"\r\n (nzOnCancel)=\"cancel.emit()\"\r\n (nzOnOk)=\"confirmSubmit()\"\r\n [nzOkDisabled]=\"disabledSubmit()\"\r\n >\r\n <div *nzModalTitle>\r\n <div class=\"modal-title\">\r\n <span class=\"modal-title__main\">\r\n <nz-icon nzType=\"plus-circle\" nzTheme=\"twotone\" />\r\n 创建协作分支\r\n </span>\r\n <div class=\"modal-subtitle\">\r\n {{ issue() ? issue()!.title : '为协作人拆分处理分支。' }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *nzModalContent>\r\n <p class=\"label\">协作人</p>\r\n <nz-select\r\n nzShowSearch\r\n nzPlaceHolder=\"选择要负责该分支的协作人\"\r\n [ngModel]=\"selectedOwnerUserId()\"\r\n (ngModelChange)=\"selectedOwnerUserId.set($event)\"\r\n class=\"participant-selector\"\r\n >\r\n @for (participant of participants(); track participant.id) {\r\n <nz-option [nzLabel]=\"participant.userName\" [nzValue]=\"participant.userId\"></nz-option>\r\n }\r\n </nz-select>\r\n\r\n <p class=\"label\">分支标题</p>\r\n <input\r\n nz-input\r\n [ngModel]=\"title()\"\r\n (ngModelChange)=\"title.set(($event ?? '').toString())\"\r\n placeholder=\"例如:排查前端渲染\"\r\n />\r\n </ng-container>\r\n </nz-modal>\r\n `,\r\n styles: [\r\n `\r\n .participant-selector {\r\n width: 100%;\r\n }\r\n .modal-title__main {\r\n font-weight: bold;\r\n }\r\n\r\n .modal-title {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .modal-subtitle {\r\n margin-top: 10px;\r\n color: #999;\r\n font-size: 14px;\r\n line-height: 20px;\r\n }\r\n\r\n .label {\r\n font-weight: bold;\r\n font-size: 0.875rem;\r\n margin: 12px 0 4px;\r\n }\r\n\r\n .hint {\r\n font-size: small;\r\n color: gray;\r\n text-align: right;\r\n margin-top: 8px;\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class IssueCreateBranchDialogComponent {\r\n readonly open = input(false);\r\n readonly busy = input(false);\r\n readonly issue = input<IssueEntity | null>(null);\r\n readonly participants = input<IssueParticipantEntity[]>([]);\r\n readonly cancel = output<void>();\r\n readonly confirm = output<{ ownerUserId: string; title: string }>();\r\n\r\n readonly selectedOwnerUserId = signal<string | null>(null);\r\n readonly title = signal('');\r\n\r\n readonly disabledSubmit = computed(\r\n () => !this.selectedOwnerUserId()?.trim() || !this.title().trim(),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n if (!this.open()) {\r\n return;\r\n }\r\n this.selectedOwnerUserId.set(this.participants()[0]?.userId ?? null);\r\n this.title.set('');\r\n });\r\n }\r\n\r\n confirmSubmit(): void {\r\n const ownerUserId = this.selectedOwnerUserId()?.trim();\r\n const title = this.title().trim();\r\n\r\n if (!ownerUserId || !title) {\r\n return;\r\n }\r\n\r\n this.confirm.emit({ ownerUserId, title });\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { NzDrawerModule, NzDrawerPlacement } from 'ng-zorro-antd/drawer';\r\nimport { NzEmptyModule } from 'ng-zorro-antd/empty';\r\nimport {\r\n createCommentInput,\r\n IssueActionType,\r\n IssueAttachmentEntity,\r\n IssueBranchEntity,\r\n IssueCommentEntity,\r\n IssueEntity,\r\n IssueLogEntity,\r\n IssueParticipantEntity,\r\n ProjectMemberEntity,\r\n} from '../models/issue.model';\r\nimport { IssueDetailStore } from '../store/issue-detail.store';\r\nimport { IssueActionAreaComponent } from './issue-action-area/issue-action-area.component';\r\nimport { IssueAttachmentAreaComponent } from './issue-attachment-area/issue-attachment-area.component';\r\nimport { IssueBaseInfoAreaComponent } from './issue-base-info-area/issue-base-info-area.component';\r\nimport { IssueCollaboratorsAreaComponent } from './issue-collaborators-area/issue-collaborators-panel.component';\r\nimport { IssueCommentAreaComponent } from './issue-comment-area/issue-comment-editor.component';\r\nimport { IssueDescriptionAreaComponent } from './issue-description-area/issue-description-area.component';\r\nimport { IssueBranchesComponent } from './issue-branches/issue-branches.component';\r\nimport { IssueStartOwnBranchDialogComponent } from '../dialogs/issue-start-own-branch-dialog.component';\r\nimport { IssueCreateBranchDialogComponent } from '../dialogs/issue-create-branch-dialog.component';\r\n\r\n@Component({\r\n selector: 'app-issue-detail',\r\n imports: [\r\n NzDrawerModule,\r\n NzEmptyModule,\r\n IssueActionAreaComponent,\r\n IssueCollaboratorsAreaComponent,\r\n IssueCommentAreaComponent,\r\n IssueAttachmentAreaComponent,\r\n IssueBaseInfoAreaComponent,\r\n IssueDescriptionAreaComponent,\r\n IssueBranchesComponent,\r\n IssueStartOwnBranchDialogComponent,\r\n IssueCreateBranchDialogComponent,\r\n CommonModule,\r\n ],\r\n template: `\r\n <nz-drawer\r\n [nzVisible]=\"open()\"\r\n [nzClosable]=\"true\"\r\n [nzMaskClosable]=\"true\"\r\n [nzWidth]=\"900\"\r\n [nzWrapClassName]=\"'rd-detail-drawer'\"\r\n [nzMask]=\"false\"\r\n [nzTitle]=\"drawerTitleTpl\"\r\n (nzOnClose)=\"closeDetaile()\"\r\n >\r\n <ng-template #drawerTitleTpl>\r\n <div class=\"title-wrap\">\r\n <div class=\"title-main\">\r\n @if (subtitleText(); as subtitle) {\r\n <span class=\"subtitle\">{{ subtitle }}</span>\r\n }\r\n <strong>{{ titleText() }}</strong>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template nzDrawerContent>\r\n @if (store.canRead()) {\r\n <nz-empty [nzNotFoundContent]=\"'您没有权限查看该问题详情'\"></nz-empty>\r\n } @else if (!store.issue()) {\r\n <nz-empty [nzNotFoundContent]=\"'正在加载测试单详情…'\"></nz-empty>\r\n } @else if (store.issue(); as issue) {\r\n <div class=\"detail-wrap\">\r\n <div class=\"detail-header\">\r\n <!-- 操作 -->\r\n <app-issue-action-area\r\n [issue]=\"issue\"\r\n [logs]=\"store.logs()\"\r\n (actionClick)=\"handleActionClick($event)\"\r\n [canStart]=\"store.canStart()\"\r\n [canClaim]=\"store.canClaim()\"\r\n [canAssign]=\"store.canAssign()\"\r\n [assignActionLabel]=\"store.assignActionLabel()\"\r\n [startActionLabel]=\"store.startActionLabel()\"\r\n [canManageParticipants]=\"store.canManageParticipants()\"\r\n [canPendingUpdate]=\"store.canPendingUpdate()\"\r\n [canResolve]=\"store.canResolve()\"\r\n [canVerify]=\"store.canVerify()\"\r\n [canReopen]=\"store.canReopen()\"\r\n [canClose]=\"store.canClose()\"\r\n ></app-issue-action-area>\r\n </div>\r\n <div class=\"detail-content\">\r\n <div class=\"left-column\">\r\n <!-- 详情 -->\r\n <app-issue-description-area\r\n [issue]=\"issue\"\r\n [projectId]=\"store.currentProjectId()!\"\r\n ></app-issue-description-area>\r\n\r\n <!-- 评论 -->\r\n <app-issue-comment-area\r\n (submit)=\"commentSubmit.emit($event)\"\r\n [busy]=\"busy()\"\r\n [logs]=\"store.logs()\"\r\n [members]=\"store.members()\"\r\n [projectId]=\"store.currentProjectId()!\"\r\n [canComment]=\"store.canComment()\"\r\n ></app-issue-comment-area>\r\n </div>\r\n <div class=\"right-column\">\r\n <!-- 基础信息 -->\r\n <app-issue-base-info-area [issue]=\"issue\"></app-issue-base-info-area>\r\n\r\n <!-- 分支 -->\r\n <app-issue-branches\r\n [branches]=\"store.branches()\"\r\n [canStartActions]=\"store.canStartBranchActions()\"\r\n [canCreate]=\"store.canCreateBranches()\"\r\n [canStartOwn]=\"store.canStartOwnBranch()\"\r\n [canCompleteBranch]=\"store.canCompleteBranch()\"\r\n [summary]=\"store.branchSummary()\"\r\n [busy]=\"busy()\"\r\n (startOwn)=\"openStartOwnBranch()\"\r\n (create)=\"openCreateBranch()\"\r\n (startBranch)=\"store.startBranch($event)\"\r\n (completeBranch)=\"store.completeBranch($event)\"\r\n ></app-issue-branches>\r\n\r\n <!-- 合作人 -->\r\n <app-issue-collaborators-area\r\n [issue]=\"issue\"\r\n [participants]=\"store.participants()\"\r\n [canManageParticipants]=\"store.canManageParticipants()\"\r\n [busy]=\"busy()\"\r\n (removeParticipant)=\"removeParticipant.emit($event)\"\r\n ></app-issue-collaborators-area>\r\n\r\n <!-- 附件 -->\r\n <app-issue-attachment-area\r\n [attachments]=\"store.attachments()\"\r\n [projectId]=\"store.currentProjectId()!\"\r\n [members]=\"store.members()\"\r\n ></app-issue-attachment-area>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <app-issue-start-own-branch-dialog\r\n [open]=\"startOwnBranchOpen()\"\r\n [issue]=\"store.issue()\"\r\n [busy]=\"store.busy()\"\r\n (confirm)=\"confirmStartOwnBranch($event)\"\r\n (cancel)=\"startOwnBranchOpen.set(false)\"\r\n ></app-issue-start-own-branch-dialog>\r\n\r\n <app-issue-create-branch-dialog\r\n [open]=\"createBranchOpen()\"\r\n [busy]=\"store.busy()\"\r\n [issue]=\"store.issue()\"\r\n [participants]=\"store.participants()\"\r\n (cancel)=\"createBranchOpen.set(false)\"\r\n (confirm)=\"confirmCreateBranch($event)\"\r\n />\r\n </nz-drawer>\r\n `,\r\n styles: `\r\n .title-wrap {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n .subtitle {\r\n margin-right: 1rem;\r\n font-size: 12px;\r\n line-height: 1.4;\r\n padding: 3px 8px;\r\n border-radius: 4px;\r\n white-space: nowrap;\r\n background: #f1f5f9;\r\n color: #64748b;\r\n }\r\n }\r\n .detail-wrap {\r\n width: 100%;\r\n // height: 100%;\r\n // display: flex;\r\n // flex-direction: ;\r\n gap: 10px;\r\n .detail-header {\r\n width: 100%;\r\n }\r\n .detail-content {\r\n width: 100%;\r\n display: flex;\r\n gap: 10px;\r\n }\r\n .wrap-title {\r\n width: 100%;\r\n margin-bottom: 12px;\r\n font-size: 18px;\r\n font-weight: bold;\r\n border-bottom: 1px solid #bbbbbb;\r\n }\r\n .left-column {\r\n width: 60%;\r\n\r\n display: flex;\r\n flex-direction: column;\r\n gap: 10px;\r\n }\r\n .right-column {\r\n width: 40%;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 10px;\r\n }\r\n }\r\n .comment {\r\n .comment-item {\r\n }\r\n }\r\n `,\r\n})\r\nexport class IssueDetailComponent {\r\n readonly store = inject(IssueDetailStore);\r\n readonly open = input(false);\r\n readonly busy = input(false);\r\n\r\n readonly close = output();\r\n readonly actionClick = output<IssueActionType>();\r\n readonly commentSubmit = output<createCommentInput>();\r\n readonly progressChange = output<number>();\r\n readonly removeParticipant = output<string>();\r\n readonly deleteClick = output<void>();\r\n\r\n // 对话框\r\n readonly startOwnBranchOpen = signal<boolean>(false);\r\n readonly createBranchOpen = signal<boolean>(false);\r\n\r\n readonly subtitleText = computed(() => this.store.issue()?.issueNo || '');\r\n readonly titleText = computed(() => this.store.issue()?.title || '问题详情');\r\n\r\n closeDetaile() {\r\n this.close.emit();\r\n }\r\n\r\n handleActionClick(action: IssueActionType) {\r\n this.actionClick.emit(action);\r\n }\r\n\r\n // 开始协作\r\n openStartOwnBranch(): void {\r\n this.startOwnBranchOpen.set(true);\r\n }\r\n\r\n confirmStartOwnBranch(input: { title: string }): void {\r\n this.store.startOwnBranch(input);\r\n this.startOwnBranchOpen.set(false);\r\n }\r\n\r\n // 创建协作分支\r\n openCreateBranch(): void {\r\n this.createBranchOpen.set(true);\r\n }\r\n\r\n confirmCreateBranch(input: { ownerUserId: string; title: string }): void {\r\n this.store.createBranch(input);\r\n this.createBranchOpen.set(false);\r\n }\r\n}\r\n","/* angular:styles/component:less;4f832b80bea4560b936b16e21b7abb9526d55fb5e17e66c688aebfc1418f6640;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\dialogs\\issue-close-dialog.component.ts */\n.modal-title {\n display: flex;\n flex-direction: column;\n}\n.modal-subtitle {\n color: #999;\n font-size: 14px;\n line-height: 20px;\n}\n.block-input {\n border-radius: 8px;\n}\n/*# sourceMappingURL=issue-close-dialog.component.css.map */\n","import { Component, effect, input, output, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { IssueEntity } from '../models/issue.model';\r\n\r\n@Component({\r\n selector: 'app-issue-close-dialog',\r\n imports: [NzModalModule, FormsModule, NzButtonModule, NzInputModule],\r\n template: `\r\n <nz-modal\r\n [nzVisible]=\"open()\"\r\n nzTitle=\"关闭问题\"\r\n [nzWidth]=\"640\"\r\n [nzClosable]=\"true\"\r\n [nzMaskClosable]=\"false\"\r\n [nzOkLoading]=\"busy()\"\r\n (nzOnCancel)=\"cancel.emit()\"\r\n (nzOnOk)=\"submitForm()\"\r\n >\r\n <!-- subtitle(原来的 subtitle 需要手动补) -->\r\n <div *nzModalTitle>\r\n <div class=\"modal-title\">\r\n <span>关闭问题</span>\r\n <div class=\"modal-subtitle\">\r\n {{ item() ? item()!.title : '记录当前测试问题的关闭原因。' }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- body -->\r\n <ng-container *nzModalContent>\r\n <form class=\"block-form\">\r\n <textarea\r\n nz-input\r\n rows=\"6\"\r\n placeholder=\"请输入关闭原因。例如:需求取消/问题重复/无法复现。\"\r\n [ngModel]=\"reason()\"\r\n name=\"reason\"\r\n (ngModelChange)=\"reason.set($event)\"\r\n class=\"block-input\"\r\n ></textarea>\r\n </form>\r\n </ng-container>\r\n\r\n <!-- footer(自定义按钮) -->\r\n <ng-container *nzModalFooter>\r\n <button nz-button type=\"button\" (click)=\"cancel.emit()\">取消</button>\r\n <button\r\n nz-button\r\n nzType=\"primary\"\r\n [disabled]=\"!reason().trim()\"\r\n [nzLoading]=\"busy()\"\r\n (click)=\"submitForm()\"\r\n >\r\n 确认关闭\r\n </button>\r\n </ng-container>\r\n </nz-modal>\r\n `,\r\n styles: `\r\n .modal-title {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .modal-subtitle {\r\n color: #999;\r\n font-size: 14px;\r\n line-height: 20px;\r\n }\r\n .block-input {\r\n border-radius: 8px;\r\n }\r\n `,\r\n})\r\nexport class IssueCloseDialogComponent {\r\n readonly open = input(true);\r\n readonly busy = input(false);\r\n readonly item = input<IssueEntity | null>(null);\r\n\r\n readonly confirm = output<string>();\r\n readonly cancel = output<void>();\r\n\r\n readonly reason = signal('');\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.open()) {\r\n this.reason.set(this.item()?.closeReason ?? '');\r\n }\r\n });\r\n }\r\n\r\n submitForm(): void {\r\n const closeReason = this.reason().trim();\r\n if (!closeReason) {\r\n return;\r\n }\r\n this.confirm.emit(closeReason);\r\n }\r\n}\r\n","/* angular:styles/component:less;4f832b80bea4560b936b16e21b7abb9526d55fb5e17e66c688aebfc1418f6640;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\dialogs\\issue-resolve-dialog.component.ts */\n.modal-title {\n display: flex;\n flex-direction: column;\n}\n.modal-subtitle {\n color: #999;\n font-size: 14px;\n line-height: 20px;\n}\n.block-input {\n border-radius: 8px;\n}\n/*# sourceMappingURL=issue-resolve-dialog.component.css.map */\n","import { Component, effect, input, output, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { IssueEntity } from '../models/issue.model';\r\n\r\n@Component({\r\n selector: 'app-issue-resolve-dialog',\r\n imports: [NzModalModule, FormsModule, NzButtonModule, NzInputModule],\r\n template: `\r\n <nz-modal\r\n [nzVisible]=\"open()\"\r\n [nzWidth]=\"640\"\r\n [nzClosable]=\"true\"\r\n [nzMaskClosable]=\"false\"\r\n [nzOkLoading]=\"busy()\"\r\n (nzOnCancel)=\"cancel.emit()\"\r\n (nzOnOk)=\"submitForm()\"\r\n >\r\n <!-- subtitle -->\r\n <div *nzModalTitle>\r\n <div class=\"modal-title\">\r\n <span>标记解决</span>\r\n <div class=\"modal-subtitle\">\r\n {{ item() ? item()!.title : '记录当前测试问题的解决说明。' }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- body -->\r\n <ng-container *nzModalContent>\r\n <form class=\"block-form\" (ngSubmit)=\"submitForm()\">\r\n <textarea\r\n nz-input\r\n rows=\"6\"\r\n placeholder=\"请输入解决说明。\"\r\n [ngModel]=\"reason()\"\r\n name=\"reason\"\r\n (ngModelChange)=\"reason.set($event)\"\r\n class=\"block-input\"\r\n ></textarea>\r\n </form>\r\n </ng-container>\r\n\r\n <!-- footer(自定义按钮) -->\r\n <ng-container *nzModalFooter>\r\n <button nz-button type=\"button\" (click)=\"cancel.emit()\">取消</button>\r\n <button\r\n nz-button\r\n nzType=\"primary\"\r\n [disabled]=\"!reason().trim()\"\r\n [nzLoading]=\"busy()\"\r\n (click)=\"submitForm()\"\r\n >\r\n 确认解决\r\n </button>\r\n </ng-container>\r\n </nz-modal>\r\n `,\r\n styles: `\r\n .modal-title {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .modal-subtitle {\r\n color: #999;\r\n font-size: 14px;\r\n line-height: 20px;\r\n }\r\n .block-input {\r\n border-radius: 8px;\r\n }\r\n `,\r\n})\r\nexport class IssueResolveDialogComponent {\r\n readonly open = input(true);\r\n readonly busy = input(false);\r\n readonly item = input<IssueEntity | null>(null);\r\n\r\n readonly confirm = output<string>();\r\n readonly cancel = output<void>();\r\n\r\n readonly reason = signal('已解决');\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.open()) {\r\n this.reason.set(this.item()?.closeReason ?? '已解决');\r\n }\r\n });\r\n }\r\n\r\n submitForm(): void {\r\n const resolveReason = this.reason().trim();\r\n if (!resolveReason) {\r\n return;\r\n }\r\n this.confirm.emit(resolveReason);\r\n }\r\n}\r\n","/* angular:styles/component:less;de20ace82d55e90306852d96851283d7e04a7f631069ccd87f409fee5d315857;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\dialogs\\issue-assign-dialog.component.ts */\n.modal-title {\n display: flex;\n flex-direction: column;\n}\n.modal-subtitle {\n color: #999;\n font-size: 14px;\n line-height: 20px;\n}\n.assignee-select {\n width: 100%;\n}\n.assignee {\n font-size: 0.8rem;\n color: gray;\n}\n/*# sourceMappingURL=issue-assign-dialog.component.css.map */\n","import { ChangeDetectionStrategy, Component, effect, input, output, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\n\r\nimport type { ProjectMemberEntity } from '@models/project.model';\r\nimport type { AssignIssueInput, IssueEntity } from '../models/issue.model';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\n\r\n@Component({\r\n selector: 'app-issue-assign-dialog',\r\n standalone: true,\r\n imports: [FormsModule, NzButtonModule, NzSelectModule, NzModalModule],\r\n template: `\r\n <nz-modal\r\n [nzVisible]=\"open()\"\r\n [nzClosable]=\"true\"\r\n [nzMaskClosable]=\"false\"\r\n [nzOkLoading]=\"busy()\"\r\n [nzOkDisabled]=\"!assigneeId()\"\r\n nzOkText=\"添加负责人\"\r\n (nzOnCancel)=\"cancel.emit()\"\r\n (nzOnOk)=\"confirmAssign()\"\r\n >\r\n <!-- subtitle -->\r\n <div *nzModalTitle>\r\n <div class=\"modal-title\">\r\n <span>{{ dialogTitle() }}</span>\r\n <div class=\"modal-subtitle\">\r\n {{ issue() ? issue()!.title : '选择新的负责人。' }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- body -->\r\n <ng-container *nzModalContent>\r\n <p class=\"assignee\">负责人:</p>\r\n <nz-select\r\n nzShowSearch\r\n nzPlaceHolder=\"选择项目成员\"\r\n class=\"assignee-select\"\r\n [ngModel]=\"assigneeId()\"\r\n (ngModelChange)=\"assigneeId.set($event || '')\"\r\n >\r\n @for (member of members(); track member.id) {\r\n <nz-option [nzLabel]=\"member.displayName\" [nzValue]=\"member.userId\"></nz-option>\r\n }\r\n </nz-select>\r\n </ng-container>\r\n </nz-modal>\r\n `,\r\n styles: `\r\n .modal-title {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .modal-subtitle {\r\n color: #999;\r\n font-size: 14px;\r\n line-height: 20px;\r\n }\r\n .assignee-select {\r\n width: 100%;\r\n }\r\n .assignee{\r\n font-size: .8rem;\r\n color:gray;\r\n }\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class IssueAssignDialogComponent {\r\n readonly open = input(false);\r\n readonly busy = input(false);\r\n readonly issue = input<IssueEntity | null>(null);\r\n readonly actionLabel = input('重新指派');\r\n readonly members = input<ProjectMemberEntity[]>([]);\r\n readonly confirm = output<AssignIssueInput>();\r\n readonly cancel = output<void>();\r\n\r\n readonly assigneeId = signal('');\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.open()) {\r\n this.assigneeId.set(this.issue()?.assigneeId ?? '');\r\n }\r\n });\r\n }\r\n\r\n dialogTitle(): string {\r\n const label = this.actionLabel();\r\n if (label === '指派') {\r\n return '指派负责人';\r\n }\r\n if (label === '转派') {\r\n return '转派负责人';\r\n }\r\n return '重新指派负责人';\r\n }\r\n\r\n confirmText(): string {\r\n const label = this.actionLabel();\r\n if (label === '指派') {\r\n return '确认指派';\r\n }\r\n if (label === '转派') {\r\n return '确认转派';\r\n }\r\n return '确认重新指派';\r\n }\r\n\r\n confirmAssign(): void {\r\n if (!this.assigneeId()) {\r\n return;\r\n }\r\n this.confirm.emit({ assigneeId: this.assigneeId() });\r\n }\r\n}\r\n","/* angular:styles/component:less;1f43874475cbfbe41f7cd4e9d5b4197d8052711c0713c9b411f98356e9d2ce1a;D:\\ng-manager\\webapp\\src\\app\\pages\\issues\\dialogs\\issue-add-participants-dialog.component.ts */\n.modal-title {\n display: flex;\n flex-direction: column;\n}\n.modal-subtitle {\n color: #999;\n font-size: 14px;\n line-height: 20px;\n}\n.select {\n width: 100%;\n}\n.label {\n font-size: 0.8rem;\n color: gray;\n}\n/*# sourceMappingURL=issue-add-participants-dialog.component.css.map */\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\n\r\nimport type { ProjectMemberEntity } from '@models/project.model';\r\nimport { IssueParticipantEntity, type IssueEntity } from '../models/issue.model';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\n\r\n@Component({\r\n selector: 'app-issue-add-participants-dialog',\r\n standalone: true,\r\n imports: [FormsModule, NzButtonModule, NzSelectModule, NzModalModule],\r\n template: `\r\n <nz-modal\r\n [nzVisible]=\"open()\"\r\n [nzClosable]=\"true\"\r\n [nzMaskClosable]=\"false\"\r\n [nzOkLoading]=\"busy()\"\r\n [nzOkDisabled]=\"disabledSubmit()\"\r\n nzOkText=\"添加协作人\"\r\n (nzOnCancel)=\"cancel.emit()\"\r\n (nzOnOk)=\"confirmSubmit()\"\r\n >\r\n <!-- subtitle -->\r\n <div *nzModalTitle>\r\n <div class=\"modal-title\">\r\n <span>协作人(可多选)</span>\r\n <div class=\"modal-subtitle\">\r\n {{ issue() ? issue()!.title : '选择协作人' }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- body -->\r\n <ng-container *nzModalContent>\r\n <p class=\"label\">协作人:</p>\r\n <nz-select\r\n nzShowSearch\r\n nzPlaceHolder=\"选择项目成员(负责人不可选)\"\r\n nzMode=\"multiple\"\r\n class=\"select\"\r\n [ngModel]=\"selectedUserIds()\"\r\n (ngModelChange)=\"onSelectedChange($event)\"\r\n >\r\n @for (member of memberOptions(); track member.id) {\r\n <nz-option [nzLabel]=\"member.displayName\" [nzValue]=\"member.userId\"></nz-option>\r\n }\r\n </nz-select>\r\n </ng-container>\r\n </nz-modal>\r\n `,\r\n styles: `\r\n .modal-title {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .modal-subtitle {\r\n color: #999;\r\n font-size: 14px;\r\n line-height: 20px;\r\n }\r\n .select {\r\n width: 100%;\r\n }\r\n .label {\r\n font-size: 0.8rem;\r\n color: gray;\r\n }\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class IssueAddParticipantsDialogComponent {\r\n readonly open = input(false);\r\n readonly busy = input(false);\r\n readonly issue = input<IssueEntity | null>(null);\r\n readonly members = input<ProjectMemberEntity[]>([]);\r\n readonly participants = input<IssueParticipantEntity[]>([]);\r\n readonly cancel = output<void>();\r\n readonly confirm = output<{ userIds: string[] }>();\r\n\r\n readonly selectedUserIds = signal<string[]>([]);\r\n readonly disabledSubmit = computed(() => this.selectedUserIds().length === 0);\r\n\r\n readonly memberOptions = computed(() => {\r\n return this.members().filter((member) => {\r\n const participants = this.participants();\r\n const same = participants.find((par) => {\r\n return par.userId === member.userId;\r\n });\r\n return member.userId !== this.issue()?.assigneeId && !same;\r\n });\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n if (!this.open()) {\r\n return;\r\n }\r\n this.selectedUserIds.set([]);\r\n });\r\n }\r\n\r\n confirmSubmit(): void {\r\n const userIds = [\r\n ...new Set(\r\n this.selectedUserIds()\r\n .map((item) => item.trim())\r\n .filter(Boolean),\r\n ),\r\n ];\r\n if (userIds.length === 0) {\r\n return;\r\n }\r\n this.confirm.emit({ userIds });\r\n }\r\n\r\n onSelectedChange(value: unknown): void {\r\n this.selectedUserIds.set(Array.isArray(value) ? (value as string[]) : []);\r\n }\r\n}\r\n","import { Component, effect, inject, signal } from '@angular/core';\r\nimport { PageLayoutComponent } from '@app/shared';\r\nimport { IssueListStore } from './store/issue-list.store';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport {\r\n ISSUE_STATUS_FILTER_OPTIONS,\r\n ISSUE_STATUS_LABELS,\r\n} from '@app/shared/constants/status-options';\r\nimport { PRIORITY_LABELS, PRIORITY_OPTIONS } from '@app/shared/constants/priority-options';\r\nimport {\r\n AddParticipantsInput,\r\n AssignIssueInput,\r\n createCommentInput,\r\n IssueActionType,\r\n IssueEntity,\r\n IssueStatus,\r\n} from './models/issue.model';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzPaginationModule } from 'ng-zorro-antd/pagination';\r\nimport { IssuesListTableComponent } from './issues-list-table/issues-list-table.component';\r\nimport { IssueDetailStore } from './store/issue-detail.store';\r\nimport { IssueDetailComponent } from './issue-detail/issue-detail.component';\r\nimport { NzModalModule, NzModalService } from 'ng-zorro-antd/modal';\r\nimport { IssueCloseDialogComponent } from './dialogs/issue-close-dialog.component';\r\nimport { IssueResolveDialogComponent } from './dialogs/issue-resolve-dialog.component';\r\nimport { IssueAssignDialogComponent } from './dialogs/issue-assign-dialog.component';\r\nimport { IssueAddParticipantsDialogComponent } from './dialogs/issue-add-participants-dialog.component';\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\nimport { ProjectContextStore } from '@app/core/stores/project-context/project-context.store';\r\n\r\ntype viewType = 'list' | 'board';\r\n\r\n@Component({\r\n selector: 'app-issues',\r\n imports: [\r\n PageLayoutComponent,\r\n FormsModule,\r\n NzInputModule,\r\n NzButtonModule,\r\n NzRadioModule,\r\n NzIconModule,\r\n NzPaginationModule,\r\n NzModalModule,\r\n IssuesListTableComponent,\r\n IssueDetailComponent,\r\n IssueCloseDialogComponent,\r\n IssueResolveDialogComponent,\r\n IssueAssignDialogComponent,\r\n IssueAddParticipantsDialogComponent,\r\n ],\r\n templateUrl: './issues.component.html',\r\n styleUrl: './issues.component.less',\r\n providers: [IssueListStore, IssueDetailStore],\r\n})\r\nexport class IssuesComponent {\r\n private readonly issueListStore = inject(IssueListStore);\r\n private readonly issueDetailStore = inject(IssueDetailStore);\r\n private readonly projectContextStore = inject(ProjectContextStore);\r\n protected readonly router = inject(Router);\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly modal = inject(NzModalService);\r\n\r\n // 视图模式\r\n protected readonly viewType = signal<viewType>('list');\r\n protected readonly loading = this.issueListStore.loading;\r\n protected readonly issues = this.issueListStore.items;\r\n protected readonly total = this.issueListStore.total;\r\n protected readonly query = this.issueListStore.query;\r\n\r\n // 详情相关\r\n protected readonly selectedIssue = this.issueDetailStore.issue;\r\n // protected readonly IssueComments = this.issueDetailStore.comments;\r\n protected readonly IssueAttachments = this.issueDetailStore.attachments;\r\n protected readonly IssueParticipants = this.issueDetailStore.participants;\r\n protected readonly IssueBranches = this.issueDetailStore.branches;\r\n protected readonly busy = this.issueDetailStore.busy;\r\n protected readonly members = this.projectContextStore.currentProjectMembers;\r\n\r\n // 详情操作相关\r\n protected readonly IssueAssignActionLabel = this.issueDetailStore.assignActionLabel;\r\n\r\n // 操作弹窗开关\r\n protected readonly IssueCloseDialogOpen = signal(false);\r\n protected readonly IssueResolveDialogOpen = signal(false);\r\n protected readonly IssueAssignDialogOpen = signal(false);\r\n protected readonly IssueAddParticipantsDialogOpen = signal(false);\r\n\r\n protected readonly open = signal(false);\r\n\r\n protected readonly currentPriority = signal<IssueStatus | ''>('');\r\n\r\n constructor() {\r\n const projectId = this.projectContextStore.currentProjectId();\r\n this.issueListStore.initialize();\r\n projectId && this.projectContextStore.loadProjectMembers(projectId);\r\n\r\n this.route.queryParamMap.subscribe((params) => {\r\n const detailId = params.get('detail');\r\n\r\n if (detailId) {\r\n this.issueDetailStore.load(detailId);\r\n this.open.set(true);\r\n } else {\r\n this.open.set(false);\r\n }\r\n });\r\n\r\n // 筛选变化时\r\n let queryTimer: ReturnType<typeof setTimeout>;\r\n effect(() => {\r\n const query = this.issueListStore.query();\r\n if (query) {\r\n clearTimeout(queryTimer);\r\n queryTimer = setTimeout(() => {\r\n this.issueListStore.load();\r\n }, 500);\r\n }\r\n });\r\n }\r\n\r\n onPageChange(page: number) {\r\n this.issueListStore.updateQuery({ page });\r\n }\r\n\r\n onPageSizeChange(size: number) {\r\n this.issueListStore.updateQuery({ pageSize: size });\r\n }\r\n\r\n statusOptions = ISSUE_STATUS_FILTER_OPTIONS;\r\n priorityOptions = PRIORITY_OPTIONS;\r\n\r\n selectIssue(issue: IssueEntity) {\r\n this.openDetail(issue);\r\n this.issueDetailStore.load(issue.id);\r\n this.open.set(true);\r\n }\r\n\r\n closeIssueDetail() {\r\n this.open.set(false);\r\n this.issueDetailStore.setSelectedIssue(null);\r\n this.router.navigate([], {\r\n queryParams: {},\r\n });\r\n }\r\n\r\n // 提交评论\r\n commentSubmit(comment: createCommentInput) {\r\n this.issueDetailStore.postComment(comment);\r\n }\r\n\r\n // 操作\r\n handleActions(action: IssueActionType) {\r\n switch (action) {\r\n case 'comments':\r\n break;\r\n case 'start': {\r\n this.startConfirm();\r\n break;\r\n }\r\n case 'claim': {\r\n this.claimConfirm();\r\n break;\r\n }\r\n case 'assign': {\r\n this.IssueAssignDialogOpen.set(true);\r\n break;\r\n }\r\n case 'wait-update': {\r\n this.waitForUpdateConfirm();\r\n break;\r\n }\r\n case 'resolve': {\r\n this.IssueResolveDialogOpen.set(true);\r\n break;\r\n }\r\n case 'verify':\r\n break;\r\n case 'reopen':\r\n break;\r\n case 'close': {\r\n this.IssueCloseDialogOpen.set(true);\r\n break;\r\n }\r\n case 'add_participants': {\r\n this.IssueAddParticipantsDialogOpen.set(true);\r\n break;\r\n }\r\n case 'remove_participants':\r\n break;\r\n }\r\n }\r\n\r\n openDetail(item: IssueEntity): void {\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: { detail: item.id },\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n\r\n private startConfirm() {\r\n this.modal.confirm({\r\n nzTitle:\r\n this.issueDetailStore.issue()?.status === 'pending_update'\r\n ? '确认继续处理该问题?'\r\n : '确认开始处理该问题?',\r\n nzContent:\r\n this.issueDetailStore.issue()?.status === 'pending_update'\r\n ? '继续处理后,状态将从“待提测”回到“处理中”。'\r\n : '开始处理后将进入处理流转,负责人可继续处理、转派或标记待提测。',\r\n nzOkText:\r\n this.issueDetailStore.issue()?.status === 'pending_update' ? '确认继续' : '确认开始',\r\n nzCancelText: '取消',\r\n nzOnOk: () => this.issueDetailStore.start(),\r\n });\r\n }\r\n\r\n private claimConfirm() {\r\n this.modal.confirm({\r\n nzTitle: '确定认领该问题?',\r\n nzContent: '认领后你将成为负责人,可继续开始处理。(转派需前往NGM Hub V2)',\r\n nzOnOk: () => {\r\n this.issueDetailStore.claim();\r\n },\r\n });\r\n }\r\n\r\n private waitForUpdateConfirm() {\r\n this.modal.confirm({\r\n nzTitle: '标记为待提测?',\r\n nzContent: '适用于代码已提交、等待测试验证的情况,方便后续单独筛选。',\r\n nzOkText: '确认标记',\r\n nzCancelText: '取消',\r\n nzOnOk: () => this.issueDetailStore.waitForUpdate(),\r\n });\r\n }\r\n\r\n closeConfirm(reason: string) {\r\n // this.issueDetailStore.close\r\n }\r\n\r\n resolveConfirm(summary: string) {\r\n this.issueDetailStore.resolve(summary);\r\n this.IssueResolveDialogOpen.set(false);\r\n }\r\n\r\n assignConfirm(input: AssignIssueInput) {\r\n this.issueDetailStore.assign(input);\r\n this.IssueAssignDialogOpen.set(false);\r\n }\r\n\r\n AddParticipantsConfirm(input: AddParticipantsInput) {\r\n this.issueDetailStore.addParticipants(input);\r\n this.IssueAddParticipantsDialogOpen.set(false);\r\n }\r\n\r\n removeParticipant(participantId: string) {\r\n this.issueDetailStore.removeParticipant(participantId);\r\n }\r\n\r\n cancelAssignDialog() {\r\n this.IssueAssignDialogOpen.set(false);\r\n }\r\n\r\n cancelAddParticipantsConfirm() {\r\n this.IssueAddParticipantsDialogOpen.set(false);\r\n }\r\n\r\n cancelCloseDialog() {\r\n this.IssueCloseDialogOpen.set(false);\r\n }\r\n\r\n cancelResolveDialog() {\r\n this.IssueResolveDialogOpen.set(false);\r\n }\r\n\r\n updateStatus(status: IssueStatus | '') {\r\n this.issueListStore.updateQuery({ status });\r\n }\r\n\r\n updatePriority(priority: IssueStatus) {\r\n this.issueListStore.updateQuery({ priority });\r\n }\r\n\r\n updateKeyword(keyword: string) {\r\n this.issueListStore.updateQuery({ keyword });\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { IssuesComponent } from './issues.component';\r\n\r\nconst routes: Routes = [{ path: '', component: IssuesComponent }];\r\n\r\n@NgModule({\r\n imports: [CommonModule, RouterModule.forChild(routes)],\r\n exports: [RouterModule],\r\n})\r\nexport class IssuesRoutingModule {}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { IssuesRoutingModule } from './issues-routing.module';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [CommonModule, IssuesRoutingModule],\r\n})\r\nexport class IssuesModule {}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,4BAAA;;;ACQO,IAAM,uBAAN,MAAMC,sBAAoB;EACvB,YAAuB,OAAO,SAAS;EACvC,iBAAiB,OAAO,mBAAmB;;;;EAInD,MAAM,mBAAsB,MAA0D;AACpF,WAAO,KAAK,UAAU,4BAA+B;MACnD,WAAW,KAAK,eAAe,iBAAgB;MAC/C,QAAQ;MACR,MAAM,WAAW,KAAK,OAAO,IAAI,KAAK,MAAM;MAC5C,SAAS,KAAK;KACf;EACH;;;;EAKA,MAAM,qBAAwB,MAA4D;AACxF,UAAM,YAAY,KAAK,eAAe,iBAAgB;AACtD,WAAO,KAAK,UAAU,4BAA+B;MACnD;MACA,QAAQ;MACR,MAAM,WAAW,KAAK,OAAO,IAAI,KAAK,MAAM,IAAI,KAAK,SAAS;KAC/D;EACH;;AAzBW,uBAAoB,WAAA;EAHhC,WAAW;IACV,YAAY;GACb;GACY,oBAAoB;;;ACiB1B,IAAM,kBAAN,MAAMC,iBAAe;EACT,YAAY,OAAO,SAAS;EAC5B,gBAAgB,OAAO,oBAAoB;EAE5D,MAAM,cAAc,IAAY,KAAQ;AACtC,UAAM,IAAI,MAAM,yBAAyB;EAC3C;EAEA,WAAW,MAAY,IAAU;AAC/B,UAAM,IAAI,MAAM,yBAAyB;EAC3C;;EAGA,YAAY,WAAmB,SAAe;AAC5C,WAAO,KAAK,UAAU,oBAAoD;MACxE;MACA,MAAM,WAAW,OAAO;KACzB;EACH;EAEA,aAAa,SAAiBC,QAA6B;AACzD,WAAO,KAAK,cAAc,mBAAsC;MAC9D;MACA,QAAQ;MACR,SAASA;KACV;EACH;EAEA,eAAe,SAAiBA,QAA+B;AAC7D,WAAO,KAAK,cAAc,mBAAsC;MAC9D;MACA,QAAQ;MACR,SAASA;KACV;EACH;EAEA,YAAY,SAAiB,UAAgB;AAC3C,WAAO,KAAK,cAAc,mBAAsC;MAC9D;MACA,QAAQ,YAAY,QAAQ;MAC5B,SAAS,CAAA;KACV;EACH;EAEA,eAAe,SAAiB,UAAkBA,SAAkC,CAAA,GAAE;AACpF,WAAO,KAAK,cAAc,mBAAsC;MAC9D;MACA,QAAQ,YAAY,QAAQ;MAC5B,SAASA;KACV;EACH;;EAGA,eAAe,SAAiBA,QAAyB;AACvD,WAAO,KAAK,cAAc,mBAA2C;MACnE;MACA,QAAQ;MACR,SAASA;KACV;EACH;EAEA,qBAAqB,WAAmB,SAAe;AACrD,WAAO,KAAK,UAAU,oBAAyD;MAC7E;MACA,MAAM,WAAW,OAAO;KACzB;EACH;;EAGA,aAAa,WAAmB,SAAe;AAC7C,WAAO,KAAK,UAAU,oBAAiD;MACrE;MACA,MAAM,WAAW,OAAO;KACzB;EACH;;EAGA,WAAW,SAAiB,SAAe;AACzC,WAAO,KAAK,cAAc,mBAAmB;MAC3C;MACA,QAAQ;MACR,SAAS,EAAE,QAAO;KACnB;EACH;EAEA,mBAAmB,SAAiB,SAAiB,WAAqB,CAAA,GAAE;AAC1E,WAAO,KAAK,cAAc,mBAAuC;MAC/D;MACA,QAAQ;MACR,SAAS,EAAE,SAAS,SAAQ;KAC7B;EACH;EAEA,YAAY,SAAiBA,QAAuB;AAClD,WAAO,KAAK,cAAc,mBAAgC;MACxD;MACA,QAAQ;MACR,SAASA;KACV;EACH;EAEA,WAAW,SAAe;AACxB,WAAO,KAAK,cAAc,mBAAgC;MACxD;MACA,QAAQ;MACR,SAAS,CAAA;KACV;EACH;EAEA,WAAW,SAAe;AACxB,WAAO,KAAK,cAAc,mBAAgC;MACxD;MACA,QAAQ;MACR,SAAS,CAAA;KACV;EACH;EAEA,gBAAgB,SAAe;AAC7B,WAAO,KAAK,cAAc,mBAAgC;MACxD;MACA,QAAQ;MACR,SAAS,CAAA;KACV;EACH;EAEA,aAAa,SAAiB,SAAgB;AAC5C,WAAO,KAAK,cAAc,mBAAgC;MACxD;MACA,QAAQ;MACR,SAAS,CAAA;KACV;EACH;;;;;;;;EAUA,YAAY,SAAe;AACzB,WAAO,KAAK,cAAc,mBAAgC;MACxD;MACA,QAAQ;MACR,SAAS,CAAA;KACV;EACH;;;;;;;;EAUA,cAAc,WAAmB,OAAqB;AACpD,WAAO,KAAK,UAAU,oBAAqC;MACzD;MACA,MAAM;MACN,OAAO,mBAAK;KACb;EACH;EAEA,eAAe,WAAmB,SAAe;AAC/C,WAAO,KAAK,UAAU,oBAAiC;MACrD;MACA,MAAM,WAAW,OAAO;KACzB;EACH;;;;;;;EASA,oBAAoB,WAAmB,SAAe;AACpD,WAAO,KAAK,UAAU,oBAEnB;MACD;MACA,MAAM,WAAW,OAAO;KACzB;EACH;EAEA,kBAAkB,WAAiB;AACjC,WAAO,KAAK,UAAU,oBAAsD;MAC1E;MACA,MAAM,aAAa,SAAS;KAC7B;EACH;EAEA,kBAAkB,SAAiB,eAAqB;AACtD,WAAO,KAAK,cAAc,qBAA+C;MACvE;MACA,QAAQ;MACR,WAAW;KACZ;EACH;;AAzMW,kBAAe,WAAA;EAH3B,WAAW;IACV,YAAY;GACb;GACY,eAAe;;;AChB5B,IAAM,gBAAgC;EACpC,MAAM;EACN,UAAU;EACV,SAAS;EACT,QAAQ;EACR,UAAU;;AAIL,IAAM,iBAAN,MAAMC,gBAAc;EACR,WAAW,OAAO,eAAe;EACjC,iBAAiB,OAAO,mBAAmB;EAC3C,YAAY,OAAO,SAAS;EAE5B,aAAa,OAAuB,mBAAK,cAAe;EACxD,cAAc,OAAuC,IAAI;EACzD,eAAe,OAAO,KAAK;EAEnC,QAAQ,SAAS,MAAM,KAAK,WAAU,CAAE;EACxC,SAAS,SAAS,MAAM,KAAK,YAAW,CAAE;EAC1C,QAAQ,SAAS,MAAM,KAAK,YAAW,GAAI,SAAS,CAAA,CAAE;EACtD,UAAU,SAAS,MAAM,KAAK,aAAY,CAAE;EAC5C,QAAQ,SAAS,MAAM,KAAK,YAAW,GAAI,SAAS,CAAC;EACrD,OAAO,SAAS,MAAM,KAAK,WAAU,EAAG,QAAQ,CAAC;EACjD,WAAW,SAAS,MAAM,KAAK,WAAU,EAAG,YAAY,EAAE;EAElD,mBAAmB,KAAK,eAAe;EAExD,aAAU;AACR,SAAK,UAAU,iBAAgB;AAC/B,SAAK,KAAI;EACX;EAEA,kBAAkB,WAAwB;AACxC,SAAK,WAAW,OAAO,CAAC,UAAW,iCAC9B,QAD8B;MAEjC,WAAW,KAAK,iBAAgB,KAAM;MACtC,MAAM;MACN;AAEF,QAAI,CAAC,WAAW;AACd,WAAK,YAAY,IAAI;QACnB,OAAO,CAAA;QACP,MAAM;QACN,UAAU,cAAc,KAAK,WAAU,CAAE;QACzC,OAAO;OACR;AACD,WAAK,aAAa,IAAI,KAAK;AAC3B;IACF;AAEA,SAAK,aAAa,IAAI,IAAI;AAC1B,SAAK,YAAY,IAAI,IAAI;AACzB,SAAK,KAAI;EACX;EAEA,YAAY,OAA8B;AACxC,SAAK,WAAW,OAAO,CAAC,UAAW,gDAC9B,QACA,QAF8B;MAGjC,MAAM,MAAM,QAAQ,MAAM,QAAQ;MAClC;EACJ;EAEA,MAAM,OAAI;AACR,UAAM,mBAAmB,KAAK,iBAAgB;AAC9C,QAAI,CAAC;AAAkB;AACvB,UAAM,QAAQ,KAAK,WAAU;AAC7B,SAAK,aAAa,IAAI,IAAI;AAC1B,QAAI;AACF,YAAM,MAAM,MAAM,KAAK,SAAS,cAAc,kBAAkB,KAAK;AACrE,WAAK,YAAY,IAAI,GAAG;AACxB,WAAK,aAAa,IAAI,KAAK;IAC7B,SAAS,OAAO;AACd,WAAK,aAAa,IAAI,KAAK;IAC7B;EACF;EAEA,MAAM,YAAY,YAAiD,iBAAwB;AACzF,UAAM,YAAY,KAAK,iBAAgB,KAAM;AAC7C,UAAM,QAAQ,WAAW,MAAM,KAAI;AACnC,QAAI,CAAC,aAAa,CAAC,OAAO;AACxB;IACF;AACA,UAAM,QAAQ,mBAAmB,CAAA;AACjC,UAAM,aAAa,WAAW,cAAc;AAE5C,UAAM,iBAAiB;MACrB,GAAG,IAAI,KAAK,WAAW,kBAAkB,CAAA,GAAI,IAAI,CAAC,SAAS,KAAK,KAAI,CAAE,EAAE,OAAO,OAAO,CAAC;MACvF,OAAO,CAAC,OAAO,OAAO,UAAU;AAClC,SAAK,aAAa,IAAI,IAAI;AAE1B,QAAI;IAeJ,SAAS,GAAG;IACZ;AACE,WAAK,KAAI;AACT,WAAK,aAAa,IAAI,KAAK;IAC7B;EACF;;AAvGW,iBAAc,WAAA;EAD1B,WAAU;GACE,cAAc;AA0G3B,SAAS,cAAc,OAAqB;AAC1C,SAAO,MAAM,YAAY,MAAM,WAAW,IAAI,MAAM,WAAW;AACjE;;;AC9HA;;;ACAO,IAAM,oBAA4C;EACvD,KAAK;EACL,SAAS;EACT,QAAQ;EACR,aAAa;EACb,MAAM;EACN,MAAM;;AAED,IAAM,oBAA4C;EACvD,KAAK;EACL,SAAS;EACT,QAAQ;EACR,aAAa;EACb,MAAM;EACN,MAAM;;AAYD,IAAM,sBAAsB;EACjC,EAAE,MAAM,OAAO,OAAO,2BAAM;EAC5B,EAAE,MAAM,WAAW,OAAO,iCAAO;EACjC,EAAE,MAAM,UAAU,OAAO,uCAAQ;EACjC,EAAE,MAAM,eAAe,OAAO,2BAAM;EACpC,EAAE,MAAM,QAAQ,OAAO,2BAAM;EAC7B,EAAE,MAAM,QAAQ,OAAO,2BAAM;;;;ACiFxB,IAAM,2BAAN,MAAMC,0BAAwB;WACjB,MAAM,SAAQ;iBACR,MAAK;EACpB,aAAa,OAAM;EAE5B,eAAe,QAAmB;AAChC,WAAO,oBAAoB,MAAM;EACnC;EAEA,eAAe,QAAmB;AAChC,WAAO,oBAAoB,MAAM;EACnC;EAEA,iBAAiB,UAAuB;AACtC,WAAO,gBAAgB,QAAQ;EACjC;EAEA,iBAAiB,UAAuB;AACtC,WAAO,gBAAgB,QAAQ;EACjC;EAEA,aAAa,MAAe;AAC1B,WAAO,kBAAkB,IAAI;EAC/B;EAEA,aAAa,MAAe;AAC1B,WAAO,kBAAkB,IAAI;EAC/B;EAEA,qBAAqB,MAAiB;AACpC,UAAM,SAAS,KAAK,oBAAoB,CAAA,GAAI,OAAO,OAAO;AAC1D,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;IACT;AACA,QAAI,MAAM,UAAU,GAAG;AACrB,aAAO,MAAM,KAAK,QAAG;IACvB;AACA,WAAO,GAAG,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,QAAG,CAAC,KAAK,MAAM,SAAS,CAAC;EAC5D;;;;;;;AAtCW,2BAAwB,WAAA;EAtGpC,UAAU;IACT,UAAU;IACV,SAAS,CAAC,eAAe,aAAa,kBAAkB,YAAY;IACpE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGX;GACY,wBAAwB;;;ACtG9B,IAAM,yBAAN,MAAMC,wBAAsB;EACjC,QAAQ,OAAoB,MAAwB;AAClD,WAAO,KAAK,WAAW,MAAM,MAAM,UAAU;EAC/C;EAEA,UAAU,OAAoB,MAA0B,iBAAiB,OAAK;AAC5E,WAAO,CAAC,CAAC,KAAK,qBAAqB,OAAO,MAAM,cAAc;EAChE;EAEA,qBACE,OACA,MACA,iBAAiB,OAAK;AAEtB,QAAI,CAAC,MAAM;AACT,aAAO;IACT;AAEA,QAAI,CAAC,CAAC,QAAQ,YAAY,eAAe,gBAAgB,EAAE,SAAS,MAAM,MAAM,GAAG;AACjF,aAAO;IACT;AACA,UAAM,aAAa,KAAK,WAAW,MAAM,MAAM,UAAU;AACzD,UAAM,aAAa,KAAK,WAAW,MAAM,MAAM,UAAU;AACzD,UAAM,YAAY;AAGlB,QAAI,CAAC,MAAM,eAAe,cAAc,YAAY;AAClD,aAAO;IACT;AAGA,QAAI,MAAM,cAAc,YAAY;AAClC,aAAO;IACT;AAEA,WAAO;EACT;EAEA,sBACE,OACA,MACA,iBAAiB,OAAK;AAEtB,QAAI,CAAC,CAAC,QAAQ,eAAe,gBAAgB,EAAE,SAAS,MAAM,MAAM,GAAG;AACrE,aAAO;IACT;AACA,QAAI,CAAC,MAAM,YAAY;AACrB,aAAO;IACT;AAEA,WACE,kBACA,KAAK,WAAW,MAAM,MAAM,UAAU,KACtC,KAAK,WAAW,MAAM,MAAM,UAAU;EAE1C;EAEA,SAAS,OAAoB,MAAwB;AACnD,WACE,CAAC,CAAC,MAAM,UACR,CAAC,MAAM,cACP,CAAC,QAAQ,YAAY,eAAe,gBAAgB,EAAE,SAAS,MAAM,MAAM;EAE/E;EAEA,SAAS,OAAoB,MAAwB;AACnD,WAAO,KAAK,WAAW,MAAM,MAAM,UAAU;EAC/C;EAEA,WAAW,OAAoB,MAAwB;AACrD,WAAO,KAAK,SAAS,OAAO,IAAI;EAClC;EAEA,UAAU,OAAoB,MAAwB;AACpD,WAAO,KAAK,WAAW,MAAM,MAAM,UAAU,KAAK,KAAK,WAAW,MAAM,MAAM,UAAU;EAC1F;EAEA,SAAS,OAAoB,MAAwB;AACnD,QAAI,CAAC,KAAK,WAAW,MAAM,MAAM,UAAU,GAAG;AAC5C,aAAO;IACT;AACA,WAAO,CAAC,QAAQ,YAAY,UAAU,EAAE,SAAS,MAAM,MAAM;EAC/D;EAEA,oBACE,YACA,MACA,iBAAiB,OAAK;AAEtB,WAAO,kBAAkB,KAAK,WAAW,MAAM,WAAW,OAAO,UAAU;EAC7E;;EAGA,kBACE,OACA,MACA,cAAsC;AAEtC,QAAI,CAAC,YAAY,QAAQ,EAAE,SAAS,MAAM,MAAM,GAAG;AACjD,aAAO;IACT;AACA,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO;IACT;AACA,WAAO,KAAK,WAAW,MAAM,MAAM,UAAU;EAC/C;EAEA,sBAAsB,OAAoB,MAAwB;AAChE,WAAO,CAAC,CAAC,YAAY,YAAY,QAAQ,EAAE,SAAS,MAAM,MAAM;EAClE;EAEA,kBACE,OACA,MACA,cAAsC;AAEtC,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,YAAY,QAAQ,EAAE,SAAS,MAAM,MAAM,GAAG;AAChF,aAAO;IACT;AAGA,UAAM,gBAAgB,aAAa,KAAK,CAAC,SAAS,KAAK,WAAW,KAAK,MAAM;AAC7E,QAAI,CAAC,eAAe;AAClB,aAAO;IACT;AAGA,WAAO,CAAC,KAAK,WAAW,MAAM,MAAM,UAAU;EAChD;;EAGA,oBAAoB,MAAiB;AACnC,WAAO,KAAK,QAAQ,SAAS,aAAa,KAAK;EACjD;EAEA,uBAAuB,MAAiB;AACtC,WAAO,KAAK,QAAQ,SAAS,qBAAqB,KAAK;EACzD;EAEA,0BAA0B,MAAiB;AACzC,WAAO,KAAK,QAAQ,SAAS,wBAAwB,KAAK;EAC5D;EAEA,sBAAsB,MAAiB;AACrC,WAAO,KAAK,QAAQ,SAAS,oBAAoB,KAAK;EACxD;EAEA,kCAAkC,MAAiB;AACjD,WAAO,KAAK,QAAQ,SAAS,yBAAyB,KAAK;EAC7D;EAEA,+BAA+B,MAAiB;AAC9C,WAAO,KAAK,QAAQ,SAAS,oBAAoB,KAAK;EACxD;EAEA,WAAW,MAA0B,SAAsB;AACzD,QAAI,CAAC,QAAQ,CAAC,SAAS;AACrB,aAAO;IACT;AAEA,UAAM,SAAS,KAAK,QAAQ,KAAI;AAChC,UAAM,YAAY,KAAK,IAAI,KAAI;AAC/B,WAAO,YAAY,UAAU,YAAY;EAC3C;;AAnKW,yBAAsB,WAAA;EADlC,WAAW,EAAE,YAAY,OAAM,CAAE;GACrB,sBAAsB;;;ACa5B,IAAM,mBAAN,MAAMC,kBAAgB;EACV,WAAW,OAAO,eAAe;EACjC,YAAY,OAAO,SAAS;EAC5B,oBAAoB,OAAO,sBAAsB;EAEjD,iBAAiB,OAAO,mBAAmB;EAE3C,aAAa,OAA2B,IAAI;EAC5C,YAAY,OAAyB,CAAA,CAAE;EACvC,gBAAgB,OAA6B,CAAA,CAAE;EAC/C,oBAAoB,OAAiC,CAAA,CAAE;EACvD,mBAAmB,OAAgC,CAAA,CAAE;EACrD,gBAAgB,OAA4B,CAAA,CAAE;EAC9C,eAAe,OAAO,KAAK;EAC3B,YAAY,OAAO,KAAK;EACxB,kBAAkB,OAAO,CAAC;;EAGlC,mBAAmB,KAAK,eAAe;EAEvC,QAAQ,SAAS,MAAM,KAAK,WAAU,CAAE;EACxC,OAAO,SAAS,MAAM,KAAK,UAAS,CAAE;;EAEtC,WAAW,SAAS,MAAM,KAAK,cAAa,CAAE;EAC9C,eAAe,SAAS,MAAM,KAAK,kBAAiB,CAAE;EACtD,cAAc,SAAS,MAAM,KAAK,iBAAgB,CAAE;EACpD,UAAU,SAAS,MAAM,KAAK,eAAe,sBAAqB,CAAE;EACpE,UAAU,SAAS,MAAM,KAAK,aAAY,CAAE;EAC5C,OAAO,SAAS,MAAM,KAAK,UAAS,CAAE;EACtC,aAAa,SAAS,MAAM,KAAK,gBAAe,CAAE;EAElD,gBAAgB,SAA6B,MAAK;AACzD,UAAM,WAAW,KAAK,cAAa;AACnC,UAAM,QAAQ,SAAS;AACvB,UAAM,OAAO,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM,EAAE;AAC/D,UAAM,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,aAAa,EAAE;AAC5E,UAAM,OAAO,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM,EAAE;AAC/D,WAAO;MACL;MACA;MACA;MACA;;EAEJ,CAAC;EAEQ,cAAc,KAAK,UAAU;EAE7B,mBAAmB,SAAS,MAAK;AACxC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,aAAa,OAAO,cAAc;AACxC,UAAM,cAAc,IAAI,IAAI,KAAK,kBAAiB,EAAG,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AAC/E,WAAO,KAAK,QAAO,EAAG,OACpB,CAAC,SAAS,CAAC,YAAY,IAAI,KAAK,MAAM,KAAK,KAAK,WAAW,UAAU;EAEzE,CAAC;;EAGQ,iBAAiB,SAAS,MAAK;AACtC,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,MAAM;AACT,aAAO;IACT;AACA,UAAM,SAAS,KAAK,QAAO,EAAG,KAAK,CAAC,SAAS,KAAK,WAAW,KAAK,MAAM;AACxE,WAAO,CAAC,CAAC,WAAW,OAAO,aAAa,mBAAmB,OAAO;EACpE,CAAC;EAEQ,YAAY,SAAS,MAAK;AACjC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,cAAc,KAAK,YAAW;AACpC,QAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,kBAAkB,sBAAsB,WAAW,GAAG;AACxF,aAAO;IACT;AACA,WAAO,KAAK,kBAAkB,UAAU,OAAO,aAAa,KAAK,eAAc,CAAE;EACnF,CAAC;EAEQ,wBAAwB,SAAS,MAAK;AAC7C,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,kCAAkC,IAAI,GAAG;AACtF,aAAO;IACT;AACA,WAAO,KAAK,kBAAkB,sBAC5B,OACA,KAAK,YAAW,GAChB,KAAK,eAAc,CAAE;EAEzB,CAAC;EAEQ,WAAW,SAAS,MAAK;AAChC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,0BAA0B,IAAI,GAAG;AAC9E,aAAO;IACT;AACA,WAAO,KAAK,kBAAkB,SAAS,OAAO,KAAK,YAAW,CAAE;EAClE,CAAC;EAEQ,WAAW,SAAS,MAAK;AAChC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,0BAA0B,IAAI,GAAG;AAC9E,aAAO;IACT;AACA,WACE,CAAC,CAAC,SACF,CAAC,QAAQ,YAAY,gBAAgB,EAAE,SAAS,MAAM,MAAM,KAC5D,KAAK,kBAAkB,SAAS,OAAO,KAAK,YAAW,CAAE;EAE7D,CAAC;EAEQ,aAAa,SAAS,MAAK;AAClC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,0BAA0B,IAAI,GAAG;AAC9E,aAAO;IACT;AACA,WACE,CAAC,CAAC,SACF,CAAC,eAAe,gBAAgB,EAAE,SAAS,MAAM,MAAM,KACvD,KAAK,kBAAkB,WAAW,OAAO,KAAK,YAAW,CAAE;EAE/D,CAAC;EAEQ,mBAAmB,SAAS,MAAK;AACxC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,0BAA0B,IAAI,GAAG;AAC9E,aAAO;IACT;AACA,WACE,CAAC,CAAC,SACF,MAAM,WAAW,iBACjB,KAAK,kBAAkB,WAAW,OAAO,KAAK,YAAW,CAAE;EAE/D,CAAC;EAEQ,YAAY,SAAS,MAAK;AACjC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,0BAA0B,IAAI,GAAG;AAC9E,aAAO;IACT;AACA,WACE,CAAC,CAAC,SACF,MAAM,WAAW,cACjB,KAAK,kBAAkB,UAAU,OAAO,KAAK,YAAW,CAAE;EAE9D,CAAC;EAEQ,YAAY,SAAS,MAAK;AACjC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,0BAA0B,IAAI,GAAG;AAC9E,aAAO;IACT;AACA,WACE,CAAC,CAAC,SACF,CAAC,YAAY,YAAY,QAAQ,EAAE,SAAS,MAAM,MAAM,KACxD,KAAK,kBAAkB,UAAU,OAAO,KAAK,YAAW,CAAE;EAE9D,CAAC;EAED,aAAa,SAAS,MAAK;AACzB,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,uBAAuB,IAAI,GAAG;AAC3E,aAAO;IACT;AACA,WAAO;EACT,CAAC;EAED,UAAU,SAAS,MAAK;AACtB,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,oBAAoB,IAAI,GAAG;AACxE,aAAO;IACT;AACA,WAAO;EACT,CAAC;EAEQ,WAAW,SAAS,MAAK;AAChC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,0BAA0B,IAAI,GAAG;AAC9E,aAAO;IACT;AACA,WACE,CAAC,CAAC,SACF,CAAC,QAAQ,eAAe,YAAY,YAAY,UAAU,EAAE,SAAS,MAAM,MAAM,KACjF,KAAK,kBAAkB,SAAS,OAAO,KAAK,YAAW,CAAE;EAE7D,CAAC;;EAGQ,oBAAoB,SAAS,MAAK;AACzC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,+BAA+B,IAAI,GAAG;AACnF,aAAO;IACT;AAEA,WACE,KAAK,eAAc,KACnB,KAAK,kBAAkB,kBAAkB,OAAO,KAAK,YAAW,GAAI,KAAK,aAAY,CAAE;EAE3F,CAAC;EAEQ,wBAAwB,SAAS,MAAK;AAC7C,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,+BAA+B,IAAI,GAAG;AACnF,aAAO;IACT;AACA,WAAO,CAAC,CAAC,SAAS,KAAK,kBAAkB,sBAAsB,OAAO,KAAK,YAAW,CAAE;EAC1F,CAAC;;EAGQ,oBAAoB,SAAS,MAAK;AACzC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,+BAA+B,IAAI,GAAG;AACnF,aAAO;IACT;AACA,QAAI,CAAC,KAAK,kBAAkB,kBAAkB,OAAO,MAAM,KAAK,kBAAiB,CAAE,GAAG;AACpF,aAAO;IACT;AAGA,WAAO,CAAC,KAAK,cAAa,EAAG,KAC3B,CAAC,SAAS,KAAK,gBAAgB,MAAM,UAAU,KAAK,WAAW,MAAM;EAEzE,CAAC;;EAGQ,oBAAoB,SAAS,MAAK;AACzC,UAAM,QAAQ,KAAK,WAAU;AAC7B,UAAM,OAAO,KAAK,YAAW;AAC7B,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAkB,+BAA+B,IAAI,GAAG;AACnF,aAAO;IACT;AACA,WAAO;EACT,CAAC;EAEQ,mBAAmB,SAAS,MAAK;AACxC,UAAM,QAAQ,KAAK,WAAU;AAC7B,QAAI,CAAC,OAAO;AACV,aAAO;IACT;AAEA,WAAO,MAAM,WAAW,mBAAmB,6BAAS;EACtD,CAAC;EAEQ,oBAAoB,SAAS,MAAK;AACzC,UAAM,QAAQ,KAAK,WAAU;AAC7B,QAAI,CAAC,OAAO;AACV,aAAO;IACT;AACA,WACE,KAAK,kBAAkB,qBACrB,OACA,KAAK,YAAW,GAChB,KAAK,eAAc,CAAE,KAClB;EAET,CAAC;EAED,KAAK,SAAe;AAClB,UAAM,mBAAmB,KAAK,iBAAgB;AAC9C,QAAI,CAAC,kBAAkB;AACrB;IACF;AACA,SAAK,UAAU,iBAAgB;AAC/B,SAAK,aAAa,IAAI,IAAI;AAC1B,aAAS;MACP,OAAO,KAAK,SAAS,eAAe,kBAAkB,OAAO;MAC7D,MAAM,KAAK,SAAS,aAAa,kBAAkB,OAAO;;MAE1D,UAAU,KAAK,SAAS,YAAY,kBAAkB,OAAO;MAC7D,cAAc,KAAK,SAAS,qBAAqB,kBAAkB,OAAO;MAC1E,aAAa,KAAK,SAAS,oBAAoB,kBAAkB,OAAO;KACzE,EAAE,UAAU;MACX,MAAM,CAAC,EAAE,OAAO,MAAM,UAAU,cAAc,YAAW,MAAM;AAC7D,aAAK,WAAW,IAAI,KAAK;AACzB,aAAK,UAAU,IAAI,KAAK,KAAK;AAC7B,aAAK,cAAc,IAAI,SAAS,KAAK;AAErC,aAAK,kBAAkB,IAAI,aAAa,KAAK;AAC7C,aAAK,iBAAiB,IAAI,YAAY,KAAK;MAC7C;MACA,OAAO,MAAK;AACV,aAAK,aAAa,IAAI,KAAK;MAC7B;KACD;EACH;EAEA,YAAY,SAA2B;AACrC,UAAM,UAAU,KAAK,WAAU,GAAI;AACnC,QAAI,CAAC,WAAW,CAAC,QAAQ,QAAQ,KAAI,GAAI;AACvC;IACF;AAEA,SAAK,UAAU,IAAI,IAAI;AACvB,SACE,KAAK,SAAS,mBAAmB,SAAS,QAAQ,QAAQ,KAAI,GAAI,QAAQ,QAAQ,CAAC,EACnF,UAAU;MACV,MAAM,CAACC,aAAW;AAChB,aAAK,cAAc,OAAO,CAAC,UAAU,CAACA,UAAS,GAAG,KAAK,CAAC;AACxD,aAAK,YAAY,OAAO;AACxB,aAAK,UAAU,IAAI,KAAK;MAC1B;MACA,OAAO,MAAK;AACV,aAAK,UAAU,IAAI,KAAK;MAC1B;KACD;EACH;EAEA,QAAK;AACH,SAAK,eAAe,CAAC,YAAY,KAAK,SAAS,WAAW,OAAO,CAAC;EACpE;EAEA,QAAK;AACH,SAAK,eAAe,CAAC,YAAY,KAAK,SAAS,WAAW,OAAO,CAAC;EACpE;EAEA,OAAOC,QAAuB;AAC5B,QAAI,CAACA,OAAM,WAAW,KAAI,GAAI;AAC5B;IACF;AACA,SAAK,eAAe,CAAC,YAAY,KAAK,SAAS,YAAY,SAASA,MAAK,CAAC;EAC5E;EAEA,gBAAa;AACX,SAAK,eAAe,CAAC,YAAY,KAAK,SAAS,gBAAgB,OAAO,CAAC;EACzE;EAEA,QAAQ,SAAgB;AACtB,SAAK,eAAe,CAAC,YAAY,KAAK,SAAS,aAAa,SAAS,OAAO,CAAC;EAC/E;;;;;;;;;;;;;;;;;;;;;;EA0BA,gBAAgBA,QAA2B;AACzC,UAAM,UAAU,KAAK,WAAU,GAAI;AACnC,UAAM,UAAUA,OAAM;AACtB,UAAM,MAAM,CAAC,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC,SAAS,KAAK,KAAI,CAAE,EAAE,OAAO,OAAO,CAAC,CAAC;AAC3E,QAAI,CAAC,WAAW,IAAI,WAAW,GAAG;AAChC;IACF;AAGA,SAAK,UAAU,IAAI,IAAI;AACvB,aAAS,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,eAAe,SAAS,EAAE,OAAM,CAAE,CAAC,CAAC,EAAE,UAAU;MACzF,MAAM,CAAC,iBAAgB;AACrB,aAAK,kBAAkB,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,YAAY,CAAC;AACpE,aAAK,YAAY,OAAO;AACxB,aAAK,UAAU,IAAI,KAAK;MAC1B;MACA,OAAO,MAAK;AACV,aAAK,UAAU,IAAI,KAAK;MAC1B;KACD;EACH;EAEA,kBAAkB,eAAqB;AACrC,UAAM,UAAU,KAAK,WAAU,GAAI;AACnC,QAAI,CAAC,SAAS;AACZ;IACF;AAEA,SAAK,UAAU,IAAI,IAAI;AACvB,SAAK,KAAK,SAAS,kBAAkB,SAAS,aAAa,CAAC,EAAE,UAAU;MACtE,MAAM,MAAK;AACT,aAAK,kBAAkB,OAAO,CAAC,UAAU,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,aAAa,CAAC;AAC1F,aAAK,YAAY,OAAO;AACxB,aAAK,UAAU,IAAI,KAAK;MAC1B;MACA,OAAO,MAAK;AACV,aAAK,UAAU,IAAI,KAAK;MAC1B;KACD;EACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,aAAaA,QAA6B;AACxC,UAAM,UAAU,KAAK,WAAU,GAAI;AACnC,QAAI,CAAC,WAAW,CAACA,OAAM,YAAY,KAAI,KAAM,CAACA,OAAM,MAAM,KAAI,GAAI;AAChE;IACF;AACA,SAAK,UAAU,IAAI,IAAI;AACvB,SACE,KAAK,SAAS,aAAa,SAAS;MAClC,aAAaA,OAAM,YAAY,KAAI;MACnC,OAAOA,OAAM,MAAM,KAAI;KACxB,CAAC,EACF,UAAU;MACV,MAAM,CAAC,WAAU;AACf,aAAK,cAAc,OAAO,CAAC,UAAU,CAAC,QAAQ,GAAG,KAAK,CAAC;AACvD,aAAK,YAAY,OAAO;AACxB,aAAK,UAAU,IAAI,KAAK;MAC1B;MACA,OAAO,MAAK;AACV,aAAK,UAAU,IAAI,KAAK;MAC1B;KACD;EACH;EAEA,eAAeA,QAA+B;AAC5C,UAAM,UAAU,KAAK,WAAU,GAAI;AACnC,UAAM,QAAQA,OAAM,MAAM,KAAI;AAC9B,QAAI,CAAC,WAAW,CAAC,OAAO;AACtB;IACF;AACA,SAAK,UAAU,IAAI,IAAI;AACvB,SAAK,KAAK,SAAS,eAAe,SAAS,EAAE,MAAK,CAAE,CAAC,EAAE,UAAU;MAC/D,MAAM,MAAK;AACT,aAAK,gBAAgB,OAAO;AAC5B,aAAK,YAAY,OAAO;AACxB,aAAK,UAAU,IAAI,KAAK;MAC1B;MACA,OAAO,MAAK;AACV,aAAK,UAAU,IAAI,KAAK;MAC1B;KACD;EACH;EAEA,YAAY,UAAgB;AAC1B,UAAM,UAAU,KAAK,WAAU,GAAI;AACnC,QAAI,CAAC,SAAS;AACZ;IACF;AACA,SAAK,UAAU,IAAI,IAAI;AACvB,SAAK,KAAK,SAAS,YAAY,SAAS,QAAQ,CAAC,EAAE,UAAU;MAC3D,MAAM,MAAK;AACT,aAAK,gBAAgB,OAAO;AAC5B,aAAK,YAAY,OAAO;AACxB,aAAK,UAAU,IAAI,KAAK;MAC1B;MACA,OAAO,MAAK;AACV,aAAK,UAAU,IAAI,KAAK;MAC1B;KACD;EACH;EAEA,eAAe,UAAgB;AAC7B,UAAM,UAAU,KAAK,WAAU,GAAI;AACnC,QAAI,CAAC,SAAS;AACZ;IACF;AACA,SAAK,UAAU,IAAI,IAAI;AACvB,SAAK,KAAK,SAAS,eAAe,SAAS,QAAQ,CAAC,EAAE,UAAU;MAC9D,MAAM,MAAK;AACT,aAAK,gBAAgB,OAAO;AAC5B,aAAK,YAAY,OAAO;AACxB,aAAK,UAAU,IAAI,KAAK;MAC1B;MACA,OAAO,MAAK;AACV,aAAK,UAAU,IAAI,KAAK;MAC1B;KACD;EACH;EAEQ,eAAe,SAAkD;AACvE,UAAM,UAAU,KAAK,WAAU,GAAI;AACnC,QAAI,CAAC,SAAS;AACZ;IACF;AAEA,SAAK,UAAU,IAAI,IAAI;AACvB,YAAQ,OAAO,EACZ,KAAK,CAAC,UAAS;AACd,WAAK,WAAW,IAAI,KAAK;AACzB,WAAK,UAAU,IAAI,KAAK;AACxB,WAAK,YAAY,OAAO;AACxB,WAAK,gBAAgB,OAAO,CAAC,UAAU,QAAQ,CAAC;IAClD,CAAC,EACA,MAAM,CAAC,UAAS;AACf,WAAK,UAAU,IAAI,KAAK;IAC1B,CAAC;EACL;EAEQ,YAAY,SAAe;AACjC,UAAM,mBAAmB,KAAK,iBAAgB;AAC9C,QAAI,CAAC,kBAAkB;AACrB;IACF;AACA,SAAK,KAAK,SAAS,aAAa,kBAAkB,OAAO,CAAC,EAAE,UAAU;MACpE,MAAM,CAAC,SAAS,KAAK,UAAU,IAAI,KAAK,KAAK;KAC9C;EACH;EAEQ,gBAAgB,SAAe;AACrC,UAAM,aAAa,KAAK,iBAAgB;AACxC,QAAI,CAAC,YAAY;AACf;IACF;AACA,SAAK,KAAK,SAAS,YAAY,YAAY,OAAO,CAAC,EAAE,UAAU;MAC7D,MAAM,CAAC,aAAa,KAAK,cAAc,IAAI,SAAS,KAAK;KAC1D;EACH;EAEA,iBAAiB,OAAyB;AACxC,SAAK,WAAW,IAAI,KAAK;EAC3B;;AAtjBW,mBAAgB,WAAA;EAD5B,WAAU;GACE,gBAAgB;;;ACxB7B;;;ACAA;;;ACuIO,IAAM,2BAAN,MAAMC,0BAAwB;UAClB,MAAM,SAAQ;SACf,MAAwB,CAAA,CAAE;aACtB,MAAM,KAAK;aACX,MAAM,KAAK;cACV,MAAM,KAAK;0BACC,MAAM,KAAK;eACtB,MAAM,KAAK;qBACL,MAAM,KAAK;cAClB,MAAM,KAAK;cACX,MAAM,KAAK;aACZ,MAAM,KAAK;sBAEF,MAAM,0BAAM;qBACb,MAAM,0BAAM;EAE/B,cAAc,OAAM;EAEpB,kBAAkB,SAAS,MAAK;AACvC,UAAM,sBAAsB,oBAAI,IAAG;AACnC,UAAM,aAAa,KAAK,aAAY;AACpC,SAAK,KAAI,EAAG,QAAQ,CAAC,KAAK,UAAS;AAEjC,UAAI,eAAe,QAAQ,KAAK,MAAM,IAAI,SAAS,IAAI,YAAY;AACjE;MACF;AACA,0BAAoB,IAAI,IAAI,QAAQ;IACtC,CAAC;AACD,QAAI,oBAAoB,IAAI,UAAU,GAAG;AACvC,0BAAoB,IAAI,gBAAgB;IAC1C;AACA,WAAO;EACT,CAAC;EAEQ,eAAe,4BAA4B,OAAO,CAAC,QAAO;AACjE,QAAI,IAAI,UAAU,cAAc,IAAI,UAAU,IAAI;AAChD,aAAO;IACT;AACA,WAAO;EACT,CAAC;;EAGD,UAAU,cAA8C;AACtD,QACE,KAAK,MAAK,EAAG,WAAW,gBACvB,iBAAiB,UAAU,KAAK,MAAK,EAAG,WAAW,YACpD;AACA,aAAO;IACT;AACA,QACE,KAAK,gBAAe,EAAG,IAAI,YAAY,KACtC,iBAAiB,UAAU,KAAK,gBAAe,EAAG,IAAI,UAAU,GACjE;AACA,aAAO;IACT;AACA,WAAO;EACT;EAEA,aAAa,QAAmB;AAC9B,QAAI,WAAW,YAAY;AACzB,aAAO;IACT;AACA,QAAI,WAAW,UAAU;AACvB,aAAO;IACT;AACA,UAAM,QAAQ,aAAa,UAAU,CAAC,MAAM,MAAM,MAAM,KAAK;AAC7D,WAAO;EACT;;EAGQ,eAAY;AAClB,QAAI,SAAwB;AAC5B,eAAW,OAAO,KAAK,KAAI,GAAI;AAC7B,YAAM,WAAW,IAAI,eAAe,YAAY,IAAI,aAAa;AACjE,YAAM,SAAS,IAAI,eAAe,YAAY,IAAI,aAAa;AAC/D,UAAI,CAAC,YAAY,CAAC,QAAQ;AACxB;MACF;AACA,YAAM,YAAY,KAAK,MAAM,IAAI,SAAS;AAC1C,UAAI,OAAO,MAAM,SAAS,GAAG;AAC3B;MACF;AACA,UAAI,WAAW,QAAQ,YAAY,QAAQ;AACzC,iBAAS;MACX;IACF;AACA,WAAO;EACT;;;;;;;;;;;;;;;;;;AAvFW,2BAAwB,WAAA;EAzHpC,UAAU;IACT,UAAU;IACV,SAAS,CAAC,eAAe,gBAAgB,eAAe,uBAAuB;IAC/E,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqHX;GACY,wBAAwB;;;ACvIrC;;;ACAA;;;ACkLO,IAAM,4BAAN,MAAMC,2BAAyB;EACnB,QAAQ,OAAO,cAAc;SAC9B,MAAM,SAAQ;EAEW;EACzC,aAAa,OAAO,EAAE;EAEtB,YAAY,MAA2B;AACrC,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,KAAK,SAAS,cAClB,wBAAwB,KAAK,EAAE,IAAI;AAGrC,UAAI,MAAK;AACT;IACF;AAEA,QAAI,KAAK,SAAS,SAAS;AACzB,WAAK,WAAW,IAAI,KAAK,GAAG;AAE5B,WAAK,MAAM,OAAO;QAChB,WAAW,KAAK;QAChB,UAAU;QACV,SAAS;QACT,aAAa;UACX,SAAS;UACT,YAAY;;QAEd,YAAY;OACb;IACH;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,WAAK,aAAa,IAAI;IACxB;EACF;EAEQ,aAAa,MAA2B;AAC9C,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,OAAO,KAAK;AACjB,SAAK,WAAW,KAAK;AACrB,SAAK,SAAS;AACd,SAAK,MAAK;AACV,SAAK,OAAM;EACb;;;uBAxCC,WAAS,MAAA,CAAC,YAAY,EAAE,QAAQ,KAAI,CAAE,EAAA,CAAA;;;AAJ5B,4BAAyB,WAAA;EArKrC,UAAU;IACT,UAAU;IACV,YAAY;IACZ,SAAS,CAAC,eAAe,cAAc,aAAa;IACpD,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgKX;GACY,yBAAyB;;;ACrJ/B,IAAM,+BAAN,MAAMC,8BAA4B;gBAChB,MAA+B,CAAA,CAAE;cACnC,MAAc,EAAE;YAClB,MAA6B,CAAA,CAAE;EAC/B,aAAa;EAEhC,yBAAsB;AACpB,WAAO,KAAK,YAAW,EAAG,IAAI,CAAC,SAAQ;AACrC,YAAM,QAAQ,KAAK,OAAO,YAAY,IAAI,YAAW;AACrD,YAAM,eAAe,KAAK,oBACxB,KAAK,OAAO,YACZ,KAAK,OAAO,YAAY;AAE1B,YAAM,OAAsC,KAAK,WAAW,QAAQ,IAChE,UACA,KAAK,WAAW,QAAQ,IACtB,UACA;AACN,aAAO;QACL,IAAI,KAAK;QACT,MAAM,KAAK,OAAO;QAClB,KAAK,KAAK,QAAQ,IAAI;QACtB;QACA,MAAM,GAAG,YAAY,SAAM,KAAK,OAAO,YAAY,MAAM,SAAM,KAAK,WAAW,KAAK,OAAO,QAAQ,CAAC;;IAExG,CAAC;EACH;EAEQ,QAAQ,MAA2B;AACzC,WAAO,kCAAkC,KAAK,UAAS,CAAE,WAAW,KAAK,OAAO,gBAAgB,KAAK,EAAE;EACzG;EAEQ,WAAW,MAAY;AAC7B,QAAI,CAAC,OAAO,SAAS,IAAI,KAAK,OAAO,GAAG;AACtC,aAAO;IACT;AACA,QAAI,OAAO,MAAM;AACf,aAAO,GAAG,IAAI;IAChB;AACA,QAAI,OAAO,OAAO,MAAM;AACtB,aAAO,IAAI,OAAO,MAAM,QAAQ,CAAC,CAAC;IACpC;AACA,WAAO,IAAI,QAAQ,OAAO,OAAO,QAAQ,CAAC,CAAC;EAC7C;EAEQ,oBAAoB,YAA2B,cAA2B;AAChF,UAAM,iBAAiB,cAAc,KAAI;AACzC,QAAI,gBAAgB;AAClB,aAAO;IACT;AACA,UAAM,eAAe,YAAY,KAAI;AACrC,QAAI,CAAC,cAAc;AACjB,aAAO;IACT;AACA,WAAO,KAAK,QAAO,EAAG,KAAK,CAAC,SAAS,KAAK,WAAW,YAAY,GAAG,eAAe;EACrF;;;;;;;AAvDW,+BAA4B,WAAA;EArBxC,UAAU;IACT,UAAU;IACV,SAAS,CAAC,2BAA2B,uBAAuB;IAC5D,UAAU;;;;;;;;;;;;GAiBX;GACY,4BAA4B;;;AC7BzC;;;ACkEO,IAAM,6BAAN,MAAMC,4BAA0B;UAC7B,MAAM,SAAQ;EAEtB,iBAAiB,UAAuB;AACtC,WAAO,gBAAgB,QAAQ;EACjC;EAEA,iBAAiB,UAAuB;AACtC,WAAO,gBAAgB,QAAQ;EACjC;EAEA,eAAe,QAAmB;AAChC,WAAO,oBAAoB,MAAM;EACnC;EAEA,eAAe,QAAmB;AAChC,WAAO,oBAAoB,MAAM;EACnC;EAEA,aAAa,MAAe;AAC1B,WAAO,kBAAkB,IAAI;EAC/B;EAEA,aAAa,MAAe;AAC1B,WAAO,kBAAkB,IAAI;EAC/B;;;;;AAzBW,6BAA0B,WAAA;EAlDtC,UAAU;IACT,UAAU;IACV,YAAY;IACZ,SAAS,CAAC,cAAc,sBAAsB,aAAa,cAAc,uBAAuB;IAChG,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CX;GACY,0BAA0B;;;AClEvC;;;AC4GO,IAAM,kCAAN,MAAMC,iCAA+B;UACzB,MAAM,SAAQ;iBACP,MAAgC,CAAA,CAAE;YACvC,MAA6B,CAAA,CAAE;qBACtB,MAA6B,CAAA,CAAE;cACtC,MAAM,KAAK;0BACC,MAAM,KAAK;SAC5B,MAAM,KAAK;EAClB,SAAS,OAAM;EACf,oBAAoB,OAAM;EAE1B,mBAAmB,OAAsB,IAAI;;;;;;;;;;;;;AAX3C,kCAA+B,WAAA;EA9F3C,UAAU;IACT,UAAU;IACV,YAAY;IACZ,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;IAEF,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8EV,iBAAiB,wBAAwB;;GAC1C;GACY,+BAA+B;;;AC5G5C;;;ACWO,IAAM,cAAsC;EAC/C,QAAQ;EACR,SAAS;EACT,IAAI;EACJ,cAAc;EACd,aAAa;EACb,IAAI;EACJ,KAAK;EACL,eAAe;;;;ACQnB,IAAM,+BAAN,MAAM,8BAA6B;AAAA,EAC/B,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,+BAA8B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EACjL,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,+BAA8B,cAAc,MAAM,UAAU,2BAA2B,UAAU,CAAC,qBAAqB,GAAG,UAAU,cAAI,UAAU;AAAA;AAAA;AAAA;AAAA,KAIxO,UAAU,MAAM,iBAAoB,wBAAwB,OAAO,CAAC;AACzE;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,8BAA8B,YAAY,CAAC;AAAA,EAC1H,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,IAKV,iBAAiB,wBAAwB;AAAA,EAC7C,CAAC;AACT,CAAC,EAAE,CAAC;AACZ,IAAM,qCAAN,MAAM,oCAAmC;AAAA,EACrC,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,qCAAoC,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EACvL,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,qCAAoC,cAAc,MAAM,UAAU,iCAAiC,UAAU,CAAC,2BAA2B,GAAG,UAAU,cAAI,UAAU;AAAA;AAAA;AAAA;AAAA,KAI1P,UAAU,MAAM,iBAAoB,wBAAwB,OAAO,CAAC;AACzE;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,oCAAoC,YAAY,CAAC;AAAA,EAChI,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,IAKV,iBAAiB,wBAAwB;AAAA,EAC7C,CAAC;AACT,CAAC,EAAE,CAAC;AACZ,IAAM,gCAAN,MAAM,+BAA8B;AAAA,EAChC;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,gCAA+B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAClL,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,gCAA+B,cAAc,MAAM,UAAU,4BAA4B,QAAQ,EAAE,OAAO,QAAQ,GAAG,UAAU,CAAC,sBAAsB,GAAG,UAAU,cAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQvQ,UAAU,MAAM,cAAc,CAAC,EAAE,MAAM,YAAY,MAAM,eAAe,GAAG,EAAE,MAAM,aAAa,MAAS,mBAAmB,UAAU,aAAa,QAAQ,CAAC,WAAW,UAAU,SAAS,UAAU,SAAS,YAAY,SAAS,UAAU,aAAa,iBAAiB,GAAG,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,GAAG,iBAAoB,wBAAwB,OAAO,CAAC;AACvX;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,+BAA+B,YAAY,CAAC;AAAA,EAC3H,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASV,iBAAiB,wBAAwB;AAAA,IACzC,SAAS,CAAC,cAAc;AAAA,EAC5B,CAAC;AACT,CAAC,GAAG,gBAAgB,EAAE,OAAO,CAAC;AAAA,EACtB,MAAM;AACV,CAAC,EAAE,EAAE,CAAC;AAMlB,IAAM,0BAAN,MAAM,yBAAwB;AAAA,EAC1B,aAAa,OAAO,UAAU;AAAA,EAC9B,YAAY;AAAA,EACZ;AAAA,EACA,IAAI,SAAS,OAAO;AAChB,QAAI,iBAAiB,aAAa;AAC9B,WAAK,YAAY;AACjB,WAAK,YAAY;AAAA,IACrB,OACK;AACD,WAAK,YAAY;AAAA,IACrB;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,0BAAyB,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC5K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,0BAAyB,cAAc,MAAM,UAAU,0CAA0C,QAAQ,EAAE,UAAU,YAAY,SAAS,WAAW,eAAe,gBAAgB,GAAG,MAAM,EAAE,gBAAgB,qBAAqB,GAAG,SAAS,CAAC,EAAE,cAAc,wBAAwB,OAAO,MAAM,WAAW,oCAAoC,aAAa,KAAK,GAAG,EAAE,cAAc,kBAAkB,OAAO,MAAM,WAAW,8BAA8B,aAAa,KAAK,CAAC,GAAG,UAAU,CAAC,gBAAgB,GAAG,UAAU,cAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAqCpmB,UAAU,MAAM,cAAc,CAAC,EAAE,MAAM,aAAa,MAAM,+BAA+B,UAAU,4BAA4B,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,sBAAsB,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,kBAAkB,UAAU,sBAAsB,QAAQ,CAAC,2BAA2B,oBAAoB,0BAA0B,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,8BAA8B,UAAU,2BAA2B,UAAU,CAAC,qBAAqB,EAAE,GAAG,EAAE,MAAM,YAAY,MAAM,eAAe,GAAG,EAAE,MAAM,aAAa,MAAW,iCAAiC,UAAU,4BAA4B,QAAQ,CAAC,iCAAiC,wBAAwB,GAAG,UAAU,CAAC,wBAAwB,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,oCAAoC,UAAU,iCAAiC,UAAU,CAAC,2BAA2B,EAAE,CAAC,GAAG,iBAAoB,wBAAwB,QAAQ,eAAkB,kBAAkB,KAAK,CAAC;AACx9B;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,yBAAyB,YAAY,CAAC;AAAA,EACrH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsCV,iBAAiB,wBAAwB;AAAA,IACzC,eAAe,kBAAkB;AAAA,IACjC,MAAM;AAAA,MACF,OAAO;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ,CAAC;AACT,CAAC,GAAG,gBAAgB,EAAE,UAAU,CAAC;AAAA,EACzB,MAAM;AACV,CAAC,GAAG,SAAS,CAAC;AAAA,EACV,MAAM;AACV,CAAC,GAAG,eAAe,CAAC;AAAA,EAChB,MAAM;AACV,CAAC,GAAG,sBAAsB,CAAC;AAAA,EACvB,MAAM;AAAA,EACN,MAAM,CAAC,kCAAkC;AAC7C,CAAC,GAAG,gBAAgB,CAAC;AAAA,EACjB,MAAM;AAAA,EACN,MAAM,CAAC,4BAA4B;AACvC,CAAC,EAAE,EAAE,CAAC;AAMlB,IAAM,2BAAN,MAAM,0BAAyB;AAAA,EAC3B,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,2BAA0B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC7K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,2BAA0B,cAAc,MAAM,UAAU,4CAA4C,MAAM,EAAE,gBAAgB,sBAAsB,GAAG,UAAU,CAAC,iBAAiB,GAAG,UAAU,cAAI,UAAU,6BAA6B,UAAU,MAAM,iBAAoB,wBAAwB,OAAO,CAAC;AACxY;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,0BAA0B,YAAY,CAAC;AAAA,EACtH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB,wBAAwB;AAAA,IACzC,UAAU;AAAA,IACV,MAAM;AAAA,MACF,OAAO;AAAA,IACX;AAAA,EACJ,CAAC;AACT,CAAC,EAAE,CAAC;AACZ,IAAM,4BAAN,MAAM,2BAA0B;AAAA,EAC5B;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,4BAA2B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC9K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,4BAA2B,cAAc,MAAM,UAAU,uBAAuB,aAAa,CAAC,EAAE,cAAc,eAAe,OAAO,MAAM,WAAW,aAAa,aAAa,MAAM,QAAQ,KAAK,CAAC,GAAG,UAAU,CAAC,kBAAkB,GAAG,UAAU,cAAI,UAAU,wDAAwD,UAAU,MAAM,iBAAoB,wBAAwB,OAAO,CAAC;AACrd;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,2BAA2B,YAAY,CAAC;AAAA,EACvH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB,wBAAwB;AAAA,IACzC,UAAU;AAAA,EACd,CAAC;AACT,CAAC,GAAG,gBAAgB,EAAE,aAAa,CAAC;AAAA,EAC5B,MAAM;AAAA,EACN,MAAM,CAAC,aAAa,EAAE,QAAQ,KAAK,CAAC;AACxC,CAAC,EAAE,EAAE,CAAC;AAClB,IAAM,6BAAN,MAAM,4BAA2B;AAAA,EAC7B,MAAM,OAAO,iBAAiB;AAAA,EAC9B,YAAY,CAAC;AAAA,EACb;AAAA,EACA,UAAU,CAAC;AAAA,EACX,sBAAsB,IAAI,QAAQ;AAAA,EAClC,0BAA0B,MAAM,MAAM;AAClC,QAAI,KAAK,mBAAmB;AACxB,aAAO,GAAG,IAAI;AAAA,IAClB;AACA,WAAO,KAAK,YAAY,KAAK,SAAS,MAAM,KAAK,kBAAkB,QAAQ,KAAK,UAAU,KAAK,iBAAiB,CAAC,CAAC,CAAC;AAAA,EACvH,CAAC;AAAA,EACD,cAAc,IAAI,QAAQ;AAAA,EAC1B,cAAc;AACV,UAAM,KAAK,yBAAyB,KAAK,mBAAmB,EACvD,KAAK,mBAAmB,CAAC,EACzB,UAAU,MAAM;AACjB,UAAI,KAAK,UAAU,QAAQ;AACvB,aAAK,UAAU,KAAK;AAAA,MACxB,OACK;AACD,aAAK,UAAU,KAAK,kBAAkB,IAAI,YAAU,OAAO,WAAW;AAAA,MAC1E;AACA,WAAK,IAAI,cAAc;AAAA,IAC3B,CAAC;AAAA,EACL;AAAA,EACA,cAAc;AACV,SAAK,oBAAoB,KAAK,IAAI;AAAA,EACtC;AAAA,EACA,qBAAqB;AACjB,SAAK,YAAY,KAAK;AACtB,SAAK,YAAY,SAAS;AAAA,EAC9B;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,6BAA4B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC/K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,6BAA4B,cAAc,MAAM,UAAU,4BAA4B,QAAQ,EAAE,WAAW,YAAY,GAAG,MAAM,EAAE,gBAAgB,uBAAuB,GAAG,SAAS,CAAC,EAAE,cAAc,qBAAqB,WAAW,0BAA0B,CAAC,GAAG,UAAU,CAAC,mBAAmB,GAAG,eAAe,MAAM,UAAU,cAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASxa,UAAU,MAAM,cAAc,CAAC,EAAE,MAAM,aAAa,MAAM,kBAAkB,UAAU,sBAAsB,QAAQ,CAAC,2BAA2B,oBAAoB,0BAA0B,EAAE,CAAC,GAAG,iBAAoB,wBAAwB,OAAO,CAAC;AAC7P;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,4BAA4B,YAAY,CAAC;AAAA,EACxH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB,wBAAwB;AAAA,IACzC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUV,MAAM;AAAA,MACF,OAAO;AAAA,IACX;AAAA,IACA,SAAS,CAAC,gBAAgB;AAAA,EAC9B,CAAC;AACT,CAAC,GAAG,gBAAgB,MAAM,CAAC,GAAG,gBAAgB,EAAE,WAAW,CAAC;AAAA,EACpD,MAAM;AACV,CAAC,GAAG,mBAAmB,CAAC;AAAA,EACpB,MAAM;AAAA,EACN,MAAM,CAAC,yBAAyB;AACpC,CAAC,EAAE,EAAE,CAAC;AAMlB,IAAM,uBAAN,MAAM,sBAAqB;AAAA,EACvB;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,uBAAsB,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EACzK,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,uBAAsB,cAAc,MAAM,UAAU,iBAAiB,QAAQ,EAAE,YAAY,aAAa,GAAG,MAAM,EAAE,gBAAgB,sBAAsB,GAAG,UAAU,CAAC,cAAc,GAAG,UAAU,cAAI,UAAU,+FAA+F,UAAU,MAAM,cAAc,CAAC,EAAE,MAAM,YAAY,MAAM,cAAc,GAAG,EAAE,MAAM,aAAa,MAAW,uBAAuB,UAAU,kBAAkB,QAAQ,CAAC,mBAAmB,iBAAiB,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC,GAAG,iBAAoB,wBAAwB,OAAO,CAAC;AAC1qB;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,sBAAsB,YAAY,CAAC;AAAA,EAClH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB,wBAAwB;AAAA,IACzC,UAAU;AAAA,IACV,MAAM;AAAA,MACF,OAAO;AAAA,IACX;AAAA,IACA,SAAS,CAAC,aAAa;AAAA,EAC3B,CAAC;AACT,CAAC,GAAG,gBAAgB,EAAE,YAAY,CAAC;AAAA,EAC3B,MAAM;AACV,CAAC,EAAE,EAAE,CAAC;AAClB,IAAM,wBAAN,MAAM,uBAAsB;AAAA,EACxB,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,wBAAuB,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC1K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,wBAAuB,cAAc,MAAM,UAAU,kBAAkB,MAAM,EAAE,gBAAgB,kBAAkB,GAAG,UAAU,CAAC,cAAc,GAAG,UAAU,cAAI,UAAU,6BAA6B,UAAU,MAAM,iBAAoB,wBAAwB,OAAO,CAAC;AACpW;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,uBAAuB,YAAY,CAAC;AAAA,EACnH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB,wBAAwB;AAAA,IACzC,UAAU;AAAA,IACV,MAAM;AAAA,MACF,OAAO;AAAA,IACX;AAAA,EACJ,CAAC;AACT,CAAC,EAAE,CAAC;AACZ,IAAM,wBAAN,MAAM,uBAAsB;AAAA,EACxB,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,wBAAuB,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC1K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,wBAAuB,cAAc,MAAM,UAAU,kBAAkB,MAAM,EAAE,gBAAgB,kBAAkB,GAAG,UAAU,CAAC,cAAc,GAAG,UAAU,cAAI,UAAU,6BAA6B,UAAU,MAAM,iBAAoB,wBAAwB,OAAO,CAAC;AACpW;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,uBAAuB,YAAY,CAAC;AAAA,EACnH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB,wBAAwB;AAAA,IACzC,UAAU;AAAA,IACV,MAAM;AAAA,MACF,OAAO;AAAA,IACX;AAAA,EACJ,CAAC;AACT,CAAC,EAAE,CAAC;AACZ,IAAM,4BAAN,MAAM,2BAA0B;AAAA,EAC5B,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,4BAA2B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC9K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,4BAA2B,cAAc,MAAM,UAAU,sBAAsB,MAAM,EAAE,gBAAgB,sBAAsB,GAAG,UAAU,CAAC,kBAAkB,GAAG,UAAU,cAAI,UAAU,6BAA6B,UAAU,MAAM,iBAAoB,wBAAwB,OAAO,CAAC;AACpX;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,2BAA2B,YAAY,CAAC;AAAA,EACvH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB,wBAAwB;AAAA,IACzC,UAAU;AAAA,IACV,MAAM;AAAA,MACF,OAAO;AAAA,IACX;AAAA,EACJ,CAAC;AACT,CAAC,EAAE,CAAC;AACZ,IAAM,0BAAN,MAAM,yBAAwB;AAAA,EAC1B,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,0BAAyB,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC5K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,0BAAyB,cAAc,MAAM,UAAU,qBAAqB,UAAU,CAAC,yBAAyB,GAAG,UAAU,aAAG,CAAC;AAC5N;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,yBAAyB,YAAY,CAAC;AAAA,EACrH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,EACd,CAAC;AACT,CAAC,EAAE,CAAC;AACZ,IAAM,sBAAN,MAAM,qBAAoB;AAAA,EACtB,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,sBAAqB,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EACxK,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,sBAAqB,cAAc,MAAM,UAAU,mBAAmB,MAAM,EAAE,gBAAgB,gBAAgB,GAAG,UAAU,aAAG,CAAC;AAC1N;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,qBAAqB,YAAY,CAAC;AAAA,EACjH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,MAAM;AAAA,MACF,OAAO;AAAA,IACX;AAAA,EACJ,CAAC;AACT,CAAC,EAAE,CAAC;AAMZ,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAClB,iBAAiB,OAAO,cAAc;AAAA,EACtC,aAAa,OAAO,UAAU;AAAA,EAC9B;AAAA,EACA,aAAa;AAAA,EACb,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AAAA,EACb;AAAA,EACA,SAAS;AAAA,EACT,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,4BAA4B;AAAA,EAC5B,MAAM;AAAA,EACN,yBAAyB,IAAI,gBAAgB,KAAK,YAAY;AAAA,EAC9D,IAAI,oBAAoB;AACpB,WAAO,KAAK,uBAAuB,aAAa;AAAA,EACpD;AAAA,EACA,cAAc;AACV,SAAK,WAAW,UAAU,MAAM,KAAK,uBAAuB,YAAY,CAAC;AAAA,EAC7E;AAAA,EACA,WAAW;AACP,SAAK,MAAM,KAAK,eAAe;AAC/B,SAAK,eAAe,QAAQ,KAAK,mBAAmB,KAAK,UAAU,CAAC,EAAE,UAAU,CAAC,cAAc;AAC3F,WAAK,MAAM;AAAA,IACf,CAAC;AAAA,EACL;AAAA,EACA,4BAA4B;AACxB,WAAO,CAAC,EAAE,KAAK,cACX,KAAK,gBACL,KAAK,YACL,KAAK,yBACL,KAAK,6BACL,KAAK;AAAA,EACb;AAAA,EACA,YAAY,SAAS;AACjB,QAAI,QAAQ,cAAc;AACtB,WAAK,uBAAuB,KAAK,KAAK,YAAY;AAAA,IACtD;AAAA,EACJ;AAAA,EACA,qBAAqB;AACjB,SAAK,4BAA4B,KAAK,0BAA0B;AAAA,EACpE;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,kBAAiB,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EACpK,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,kBAAiB,cAAc,MAAM,UAAU,sBAAsB,QAAQ,EAAE,cAAc,gBAAgB,YAAY,CAAC,cAAc,cAAc,gBAAgB,GAAG,QAAQ,UAAU,UAAU,YAAY,UAAU,YAAY,cAAc,gBAAgB,cAAc,gBAAgB,WAAW,CAAC,aAAa,aAAa,gBAAgB,GAAG,YAAY,cAAc,cAAc,gBAAgB,QAAQ,UAAU,SAAS,CAAC,WAAW,WAAW,gBAAgB,GAAG,YAAY,aAAa,GAAG,MAAM,EAAE,YAAY,EAAE,sBAAsB,iBAAiB,2BAA2B,+BAAiC,qBAAqB,sBAAwB,qBAAqB,sBAAwB,wBAAwB,WAAW,2BAA2B,cAAc,0BAA0B,aAAa,4CAA4C,4BAA4B,GAAG,gBAAgB,WAAW,GAAG,SAAS,CAAC,EAAE,cAAc,yBAAyB,OAAO,MAAM,WAAW,uBAAuB,aAAa,KAAK,GAAG,EAAE,cAAc,6BAA6B,OAAO,MAAM,WAAW,2BAA2B,aAAa,KAAK,GAAG,EAAE,cAAc,2BAA2B,OAAO,MAAM,WAAW,yBAAyB,aAAa,KAAK,CAAC,GAAG,UAAU,CAAC,QAAQ,GAAG,eAAe,MAAM,UAAU,cAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAwE35C,UAAU,MAAM,cAAc,CAAC,EAAE,MAAM,aAAa,MAAM,kBAAkB,UAAU,sBAAsB,QAAQ,CAAC,2BAA2B,oBAAoB,0BAA0B,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,uBAAuB,UAAU,kBAAkB,UAAU,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,YAAY,MAAM,eAAe,GAAG,EAAE,MAAM,aAAa,MAAW,iCAAiC,UAAU,4BAA4B,QAAQ,CAAC,iCAAiC,wBAAwB,GAAG,UAAU,CAAC,wBAAwB,EAAE,GAAG,EAAE,MAAM,YAAY,MAAM,aAAa,GAAG,EAAE,MAAM,aAAa,MAAS,iBAAiB,UAAU,WAAW,QAAQ,CAAC,eAAe,UAAU,SAAS,WAAW,YAAY,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,YAAY,MAAM,aAAa,GAAG,EAAE,MAAM,aAAa,MAAS,gBAAgB,UAAU,iDAAiD,QAAQ,CAAC,UAAU,UAAU,WAAW,YAAY,UAAU,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,MAAS,gBAAgB,UAAU,gCAAgC,QAAQ,CAAC,WAAW,aAAa,UAAU,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,sBAAsB,UAAU,iBAAiB,QAAQ,CAAC,YAAY,GAAG,UAAU,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,uBAAuB,UAAU,kBAAkB,UAAU,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,2BAA2B,UAAU,sBAAsB,UAAU,CAAC,kBAAkB,EAAE,CAAC,GAAG,iBAAoB,wBAAwB,QAAQ,eAAkB,kBAAkB,KAAK,CAAC;AACjpD;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,iBAAiB,YAAY,CAAC;AAAA,EAC7G,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAyEV,eAAe,kBAAkB;AAAA,IACjC,iBAAiB,wBAAwB;AAAA,IACzC,MAAM;AAAA,MACF,OAAO;AAAA,MACP,wBAAwB;AAAA,MACxB,6BAA6B;AAAA,MAC7B,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,6BAA6B;AAAA,MAC7B,4BAA4B;AAAA,MAC5B,8CAA8C;AAAA,IAClD;AAAA,IACA,SAAS;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ,CAAC;AACT,CAAC,GAAG,gBAAgB,MAAM,CAAC,GAAG,gBAAgB,EAAE,cAAc,CAAC;AAAA,EACvD,MAAM;AACV,CAAC,GAAG,YAAY,CAAC;AAAA,EACb,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,WAAW,iBAAiB,CAAC;AAC1C,CAAC,GAAG,QAAQ,CAAC;AAAA,EACT,MAAM;AACV,CAAC,GAAG,UAAU,CAAC;AAAA,EACX,MAAM;AACV,CAAC,GAAG,UAAU,CAAC;AAAA,EACX,MAAM;AACV,CAAC,GAAG,cAAc,CAAC;AAAA,EACf,MAAM;AACV,CAAC,GAAG,cAAc,CAAC;AAAA,EACf,MAAM;AACV,CAAC,GAAG,WAAW,CAAC;AAAA,EACZ,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,WAAW,iBAAiB,CAAC;AAC1C,CAAC,GAAG,YAAY,CAAC;AAAA,EACb,MAAM;AACV,CAAC,GAAG,cAAc,CAAC;AAAA,EACf,MAAM;AACV,CAAC,GAAG,QAAQ,CAAC;AAAA,EACT,MAAM;AACV,CAAC,GAAG,SAAS,CAAC;AAAA,EACV,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,WAAW,iBAAiB,CAAC;AAC1C,CAAC,GAAG,YAAY,CAAC;AAAA,EACb,MAAM;AACV,CAAC,GAAG,uBAAuB,CAAC;AAAA,EACxB,MAAM;AAAA,EACN,MAAM,CAAC,qBAAqB;AAChC,CAAC,GAAG,2BAA2B,CAAC;AAAA,EAC5B,MAAM;AAAA,EACN,MAAM,CAAC,yBAAyB;AACpC,CAAC,GAAG,yBAAyB,CAAC;AAAA,EAC1B,MAAM;AAAA,EACN,MAAM,CAAC,uBAAuB;AAClC,CAAC,EAAE,EAAE,CAAC;AAMlB,IAAM,sBAAN,MAAM,qBAAoB;AAAA,EACtB,MAAM,OAAO,iBAAiB;AAAA,EAC9B,aAAa,OAAO,UAAU;AAAA,EAC9B,aAAa,OAAO,eAAe;AAAA,EACnC,YAAY,CAAC;AAAA,EACb;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,IAAI,qBAAqB;AACrB,WAAO,KAAK,eAAe,eAAe,CAAC,CAAC,KAAK,0BAA0B,CAAC,CAAC,KAAK;AAAA,EACtF;AAAA,EACA,kBAAkB;AACd,SAAK,WAAW,kBAAkB,KAAK,mBAAmB,KAAK,UAAU,CAAC,EAAE,UAAU,SAAO;AACzF,WAAK,aAAa;AAClB,WAAK,IAAI,cAAc;AAAA,IAC3B,CAAC;AAAA,EACL;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,sBAAqB,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EACxK,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,sBAAqB,cAAc,MAAM,UAAU,gCAAgC,QAAQ,EAAE,WAAW,aAAa,WAAW,aAAa,SAAS,WAAW,UAAU,CAAC,YAAY,YAAY,gBAAgB,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,+BAA+B,gBAAgB,GAAG,gBAAgB,gBAAgB,GAAG,SAAS,CAAC,EAAE,cAAc,0BAA0B,OAAO,MAAM,WAAW,0BAA0B,aAAa,KAAK,CAAC,GAAG,UAAU,CAAC,YAAY,GAAG,UAAU,cAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAmCxkB,UAAU,MAAM,cAAc,CAAC,EAAE,MAAM,aAAa,MAAM,4BAA4B,UAAU,4BAA4B,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE,MAAM,YAAY,MAAM,eAAe,GAAG,EAAE,MAAM,aAAa,MAAW,iCAAiC,UAAU,4BAA4B,QAAQ,CAAC,iCAAiC,wBAAwB,GAAG,UAAU,CAAC,wBAAwB,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,kBAAkB,UAAU,sBAAsB,QAAQ,CAAC,2BAA2B,oBAAoB,0BAA0B,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,0BAA0B,UAAU,4CAA4C,UAAU,CAAC,iBAAiB,EAAE,CAAC,GAAG,iBAAoB,wBAAwB,QAAQ,eAAkB,kBAAkB,KAAK,CAAC;AAC10B;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,qBAAqB,YAAY,CAAC;AAAA,EACjH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoCV,eAAe,kBAAkB;AAAA,IACjC,iBAAiB,wBAAwB;AAAA,IACzC,MAAM;AAAA,MACF,OAAO;AAAA,IACX;AAAA,IACA,SAAS,CAAC,4BAA4B,gBAAgB,kBAAkB,wBAAwB;AAAA,EACpG,CAAC;AACT,CAAC,GAAG,gBAAgB,EAAE,WAAW,CAAC;AAAA,EAC1B,MAAM;AACV,CAAC,GAAG,WAAW,CAAC;AAAA,EACZ,MAAM;AACV,CAAC,GAAG,SAAS,CAAC;AAAA,EACV,MAAM;AACV,CAAC,GAAG,UAAU,CAAC;AAAA,EACX,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,WAAW,iBAAiB,CAAC;AAC1C,GAAG;AAAA,EACC,MAAM;AAAA,EACN,MAAM,CAAC,6BAA6B;AACxC,CAAC,GAAG,wBAAwB,CAAC;AAAA,EACzB,MAAM;AAAA,EACN,MAAM,CAAC,wBAAwB;AACnC,CAAC,EAAE,EAAE,CAAC;AAMlB,IAAM,aAAa;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AACA,IAAM,eAAN,MAAM,cAAa;AAAA,EACf,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,eAAc,MAAM,CAAC,GAAG,QAAW,cAAgB,SAAS,CAAC;AAAA,EAChK,OAAO,YAAU,8BAAoB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,eAAc,SAAS;AAAA,IAAC;AAAA,IACpH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAmB,GAAG,SAAS;AAAA,IAAC;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAmB,EAAE,CAAC;AAAA,EAC9B,OAAO,YAAU,8BAAoB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,eAAc,SAAS;AAAA,IAAC;AAAA,IACpH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAA6B,EAAE,CAAC;AAC5C;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,cAAc,YAAY,CAAC;AAAA,EAC1G,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,SAAS,CAAC,UAAU;AAAA,IACpB,SAAS,CAAC,UAAU;AAAA,EACxB,CAAC;AACT,CAAC,EAAE,CAAC;;;AC13BZ,IAAM,2BAAN,MAAM,0BAAyB;AAAA,EAC3B,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,2BAA0B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC7K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,2BAA0B,cAAc,MAAM,UAAU,gCAAgC,UAAU,CAAC,iBAAiB,GAAG,UAAU,aAAG,CAAC;AAChO;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,0BAA0B,YAAY,CAAC;AAAA,EACtH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,EACd,CAAC;AACT,CAAC,EAAE,CAAC;AACZ,IAAM,4BAAN,MAAM,2BAA0B;AAAA,EAC5B,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,4BAA2B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC9K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,4BAA2B,cAAc,MAAM,UAAU,4CAA4C,MAAM,EAAE,gBAAgB,6BAA6B,GAAG,UAAU,CAAC,kBAAkB,GAAG,UAAU,aAAG,CAAC;AACtS;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,2BAA2B,YAAY,CAAC;AAAA,EACvH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,MAAM,EAAE,OAAO,6BAA6B;AAAA,EAChD,CAAC;AACT,CAAC,EAAE,CAAC;AACZ,IAAM,+BAAN,MAAM,sCAAqC,gBAAgB;AAAA,EACvD;AAAA,EACA,WAAW;AACP,UAAM,SAAS;AAAA,EACnB;AAAA,EACA,cAAc;AACV,UAAM,YAAY;AAAA,EACtB;AAAA,EACA,kBAAkB;AACd,SAAK,OAAO,KAAK,mBAAmB;AAAA,EACxC;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,+BAA8B,MAAM,MAAM,QAAW,cAAgB,UAAU,CAAC;AAAA,EACnL,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,+BAA8B,cAAc,MAAM,UAAU,yBAAyB,QAAQ,EAAE,qBAAqB,sBAAsB,GAAG,UAAU,CAAC,qBAAqB,GAAG,iBAAiB,MAAM,UAAU,aAAG,CAAC;AAChT;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,8BAA8B,YAAY,CAAC;AAAA,EAC1H,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,EACd,CAAC;AACT,CAAC,GAAG,gBAAgB,EAAE,qBAAqB,CAAC;AAAA,EACpC,MAAM;AACV,CAAC,EAAE,EAAE,CAAC;AAClB,IAAM,2BAAN,MAAM,0BAAyB;AAAA,EAC3B;AAAA,EACA,mBAAmB,OAAO,gBAAgB;AAAA,EAC1C,gBAAgB;AAAA,EAChB,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,WAAW;AACP,SAAK,gBAAgB,IAAI,eAAe,KAAK,iBAAiB,KAAK,gBAAgB;AAAA,EACvF;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,2BAA0B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC7K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,2BAA0B,cAAc,MAAM,UAAU,qBAAqB,aAAa,CAAC,EAAE,cAAc,mBAAmB,OAAO,MAAM,WAAW,aAAa,aAAa,MAAM,QAAQ,KAAK,CAAC,GAAG,UAAU,CAAC,iBAAiB,GAAG,UAAU,cAAI,UAAU,6CAA6C,UAAU,MAAM,iBAAoB,wBAAwB,QAAQ,eAAkB,kBAAkB,KAAK,CAAC;AACpf;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,0BAA0B,YAAY,CAAC;AAAA,EACtH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,eAAe,kBAAkB;AAAA,IACjC,iBAAiB,wBAAwB;AAAA,EAC7C,CAAC;AACT,CAAC,GAAG,gBAAgB,EAAE,iBAAiB,CAAC;AAAA,EAChC,MAAM;AAAA,EACN,MAAM,CAAC,aAAa,EAAE,QAAQ,KAAK,CAAC;AACxC,CAAC,EAAE,EAAE,CAAC;AAMlB,IAAM,qBAAN,MAAM,oBAAmB;AAAA,EACrB,aAAa,OAAO,UAAU;AAAA,EAC9B,MAAM,OAAO,iBAAiB;AAAA,EAC9B,iBAAiB,OAAO,cAAc;AAAA,EACtC;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA,WAAW;AACP,SAAK,eAAe,QAAQ,KAAK,mBAAmB,KAAK,UAAU,CAAC,EAAE,UAAU,eAAa;AACzF,WAAK,MAAM;AACX,WAAK,IAAI,cAAc;AAAA,IAC3B,CAAC;AACD,SAAK,MAAM,KAAK,eAAe;AAAA,EACnC;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,qBAAoB,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EACvK,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,qBAAoB,cAAc,MAAM,UAAU,cAAc,QAAQ,EAAE,UAAU,YAAY,YAAY,aAAa,GAAG,MAAM,EAAE,YAAY,EAAE,qBAAqB,QAAQ,yBAAyB,gBAAkB,EAAE,GAAG,SAAS,CAAC,EAAE,cAAc,WAAW,WAAW,yBAAyB,CAAC,GAAG,UAAU,CAAC,WAAW,GAAG,UAAU,cAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAiCnb,UAAU,MAAM,cAAc,CAAC,EAAE,MAAM,YAAY,MAAM,eAAe,GAAG,EAAE,MAAM,aAAa,MAAS,iCAAiC,UAAU,4BAA4B,QAAQ,CAAC,iCAAiC,wBAAwB,GAAG,UAAU,CAAC,wBAAwB,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,8BAA8B,UAAU,yBAAyB,QAAQ,CAAC,qBAAqB,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC,GAAG,iBAAoB,wBAAwB,QAAQ,eAAkB,kBAAkB,KAAK,CAAC;AACniB;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,oBAAoB,YAAY,CAAC;AAAA,EAChH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkCV,eAAe,kBAAkB;AAAA,IACjC,iBAAiB,wBAAwB;AAAA,IACzC,MAAM;AAAA,MACF,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,IAC/B;AAAA,IACA,SAAS,CAAC,gBAAgB,4BAA4B;AAAA,EAC1D,CAAC;AACT,CAAC,GAAG,gBAAgB,EAAE,UAAU,CAAC;AAAA,EACzB,MAAM;AACV,CAAC,GAAG,YAAY,CAAC;AAAA,EACb,MAAM;AACV,CAAC,GAAG,SAAS,CAAC;AAAA,EACV,MAAM;AAAA,EACN,MAAM,CAAC,wBAAwB;AACnC,CAAC,EAAE,EAAE,CAAC;AAMlB,IAAM,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AACA,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAClB,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,kBAAiB,MAAM,CAAC,GAAG,QAAW,cAAgB,SAAS,CAAC;AAAA,EACnK,OAAO,YAAU,8BAAoB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,kBAAiB,SAAS;AAAA,IAAC;AAAA,IAAoB;AAAA,IAC3I;AAAA,IACA;AAAA,IACA;AAAA,EAA4B,GAAG,SAAS;AAAA,IAAC;AAAA,IAAoB;AAAA,IAC7D;AAAA,IACA;AAAA,IACA;AAAA,EAA4B,EAAE,CAAC;AAAA,EACvC,OAAO,YAAU,8BAAoB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,kBAAiB,SAAS,CAAC,kBAAkB,EAAE,CAAC;AACxJ;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,iBAAiB,YAAY,CAAC;AAAA,EAC7G,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,SAAS,CAAC,oBAAoB,GAAG,gBAAgB;AAAA,IACjD,SAAS,CAAC,oBAAoB,GAAG,gBAAgB;AAAA,EACrD,CAAC;AACT,CAAC,EAAE,CAAC;;;ACvMZ,IAAM,+BAAN,MAAM,8BAA6B;AAAA,EAC/B,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,+BAA8B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EACjL,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,+BAA8B,cAAc,MAAM,UAAU,yBAAyB,UAAU,CAAC,qBAAqB,GAAG,UAAU,aAAG,CAAC;AACjO;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,8BAA8B,YAAY,CAAC;AAAA,EAC1H,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,EACd,CAAC;AACT,CAAC,EAAE,CAAC;AAMZ,IAAM,oBAAoB;AAAA,EACtB,OAAO;AACX;AASA,IAAM,8BAA8B;AAAA,EAChC,SAAS;AAAA,EACT,aAAa,WAAW,MAAM,yBAAyB;AAAA,EACvD,OAAO;AACX;AACA,IAAM,4BAAN,MAAM,2BAA0B;AAAA,EAC5B,aAAa,OAAQ,UAAW;AAAA,EAChC,SAAS,OAAO,MAAM;AAAA,EACtB,MAAM,OAAO,iBAAiB;AAAA,EAC9B,aAAa,OAAO,UAAU;AAAA;AAAA,EAE9B,YAAY,IAAI,aAAa;AAAA;AAAA,EAE7B,SAAS,IAAI,aAAa;AAAA;AAAA,EAE1B,UAAU,IAAI,aAAa;AAAA;AAAA,EAE3B,YAAY,IAAI,aAAa;AAAA;AAAA,EAE7B,UAAU,IAAI,aAAa;AAAA,EAC3B,QAAQ,OAAO,IAAI,GAAI,YAAY,CAAC,EAAE,WAAW,QAAQ,CAAC,IAAI,CAAC,CAAE;AAAA,EACjE,WAAW,OAAO,OAAO,GAAI,YAAY,CAAC,EAAE,WAAW,WAAW,CAAC,IAAI,CAAC,CAAE;AAAA,EAC1E,cAAc;AACV,SAAK,WAAW,UAAU,MAAM;AAC5B,WAAK,eAAe;AAAA,IACxB,CAAC;AACD,oBAAgB,MAAM;AAClB,WAAK,mBAAmB,QAAQ,KAAK,MAAM;AAC3C,WAAK,mBAAmB,WAAW,KAAK,SAAS;AACjD,WAAK,mBAAmB,SAAS,KAAK,OAAO;AAC7C,WAAK,mBAAmB,SAAS,KAAK,OAAO;AAC7C,WAAK,mBAAmB,WAAW,KAAK,SAAS;AAAA,IACrD,CAAC;AAAA,EACL;AAAA,EACA,iBAAiB;AACb,SAAK,UAAU,SAAS;AACxB,SAAK,OAAO,SAAS;AACrB,SAAK,QAAQ,SAAS;AACtB,SAAK,UAAU,SAAS;AACxB,SAAK,QAAQ,SAAS;AAAA,EAC1B;AAAA,EACA,MAAM,WAAW,MAAM;AACnB,SAAK,WAAW,cAAc,MAAM;AACpC,SAAK,WAAW,cAAc,kBAAkB,UAAU,QAAQ;AAAA,EACtE;AAAA,EACA,cAAc,SAAS;AACnB,UAAM,QAAQ,KAAK,WAAW,cAAc;AAC5C,UAAM,cAAc,GAAG,QAAQ,OAAO,GAAG,kBAAkB,KAAK;AAChE,UAAM,WAAW;AAAA,MACb,MAAM,MAAM,GAAG,QAAQ,WAAW,CAAC;AAAA,MACnC;AAAA,MACA,MAAM,MAAM,QAAQ,QAAQ,MAAM,MAAM;AAAA,IAC5C,EAAE,KAAK,EAAE;AACT,SAAK,WAAW,cAAc,QAAQ;AACtC,SAAK,MAAM,QAAQ,WAAW,YAAY,SAAS,CAAC;AACpD,SAAK,SAAS,QAAQ;AACtB,SAAK,MAAM,IAAI,QAAQ;AAAA,EAC3B;AAAA,EACA,QAAQ;AACJ,SAAK,MAAM,IAAI,EAAE;AACjB,SAAK,WAAW,cAAc,QAAQ;AACtC,SAAK,SAAS,EAAE;AAAA,EACpB;AAAA,EACA,WAAW,OAAO;AACd,UAAM,cAAc,OAAO,UAAU,WAAW,QAAQ;AACxD,SAAK,MAAM,IAAI,WAAW;AAC1B,SAAK,WAAW,cAAc,QAAQ;AAAA,EAC1C;AAAA,EACA,WAAW,MAAM;AAAA,EAAE;AAAA,EACnB,YAAY,MAAM;AAAA,EAAE;AAAA,EACpB,iBAAiB,IAAI;AACjB,SAAK,WAAW;AAAA,EACpB;AAAA,EACA,kBAAkB,IAAI;AAClB,SAAK,YAAY;AAAA,EACrB;AAAA,EACA,iBAAiB,YAAY;AACzB,SAAK,SAAS,IAAI,UAAU;AAAA,EAChC;AAAA,EACA,mBAAmB,WAAW,cAAc;AACxC,4BAAwB,KAAK,WAAW,eAAe,SAAS,EAC3D,KAAK,mBAAmB,KAAK,UAAU,CAAC,EACxC,UAAU,WAAS;AACpB,UAAI,aAAa,UAAU,QAAQ;AAC/B,aAAK,OAAO,IAAI,MAAM;AAClB,uBAAa,KAAK,KAAK;AACvB,eAAK,IAAI,aAAa;AAAA,QAC1B,CAAC;AAAA,MACL;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,4BAA2B,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EAC9K,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,4BAA2B,cAAc,MAAM,UAAU,uDAAuD,SAAS,EAAE,WAAW,aAAa,QAAQ,UAAU,SAAS,WAAW,WAAW,aAAa,SAAS,UAAU,GAAG,MAAM,EAAE,YAAY,EAAE,gBAAgB,MAAM,EAAE,GAAG,WAAW,CAAC,2BAA2B,GAAG,UAAU,CAAC,kBAAkB,GAAG,UAAU,aAAG,CAAC;AAC3c;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,2BAA2B,YAAY,CAAC;AAAA,EACvH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW,CAAC,2BAA2B;AAAA,IACvC,MAAM;AAAA,MACF,cAAc;AAAA,IAClB;AAAA,EACJ,CAAC;AACT,CAAC,GAAG,gBAAgB,MAAM,CAAC,GAAG,gBAAgB,EAAE,WAAW,CAAC;AAAA,EACpD,MAAM;AACV,CAAC,GAAG,QAAQ,CAAC;AAAA,EACT,MAAM;AACV,CAAC,GAAG,SAAS,CAAC;AAAA,EACV,MAAM;AACV,CAAC,GAAG,WAAW,CAAC;AAAA,EACZ,MAAM;AACV,CAAC,GAAG,SAAS,CAAC;AAAA,EACV,MAAM;AACV,CAAC,EAAE,EAAE,CAAC;AAMlB,IAAM,qBAAN,MAAM,oBAAmB;AAAA,EACrB,SAAS,OAAO,MAAM;AAAA,EACtB,iBAAiB,OAAO,cAAc;AAAA,EACtC,MAAM,OAAO,iBAAiB;AAAA,EAC9B,WAAW,OAAO,QAAQ;AAAA,EAC1B,mBAAmB,OAAO,gBAAgB;AAAA,EAC1C,aAAa,OAAO,UAAU;AAAA,EAC9B,WAAW,OAAO,SAAS;AAAA,EAC3B,aAAa,OAAO,UAAU;AAAA,EAC9B,cAAc,WAAS;AAAA,EACvB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,gBAAgB,CAAC;AAAA,EACjB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa,IAAI,aAAa;AAAA,EAC9B,mBAAmB,IAAI,aAAa;AAAA,EACpC,YAAY,IAAI,aAAa;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,IAAI,gBAAgB,OAAO;AACvB,QAAI,OAAO;AACP,WAAK,qBAAqB;AAAA,IAC9B;AAAA,EACJ;AAAA,EACA,UAAU,aAAa,SAAS,yBAAyB;AAAA,EACzD,SAAS;AAAA,EACT,sBAAsB,CAAC;AAAA,EACvB,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,MAAM;AAAA;AAAA,EAEN,YAAY;AAAA,EACZ,YAAY,CAAC;AAAA,EACb,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU,OAAO,OAAO,GAAI,YAAY,CAAC,EAAE,WAAW,UAAU,CAAC,IAAI,CAAC,CAAE;AAAA,EACxE,WAAW,SAAS,MAAM;AACtB,WAAO,KAAK,QAAQ,EAAE,SAAS;AAAA,EACnC,GAAG,GAAI,YAAY,CAAC,EAAE,WAAW,WAAW,CAAC,IAAI,CAAC,CAAE;AAAA,EACpD,WAAW,SAAS,MAAM;AACtB,WAAO,CAAC,CAAC,KAAK,QAAQ,GAAG,MAAM,EAAE,KAAK;AAAA,EAC1C,GAAG,GAAI,YAAY,CAAC,EAAE,WAAW,WAAW,CAAC,IAAI,CAAC,CAAE;AAAA,EACpD,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,OAAO,QAAQ;AAAA,EAC1B,IAAI,uBAAuB;AACvB,WAAO,KAAK,QAAQ,EAAE,WAAW;AAAA,EACrC;AAAA,EACA,IAAI,mBAAmB;AACnB,UAAM,UAAU,KAAK,OAAO,QAAQ;AACpC,QAAI,WAAW,QAAQ,KAAK,WAAW,GAAG;AACtC,aAAO,QAAQ,KAAK,WAAW,EAAE;AAAA,IACrC;AACA,WAAO;AAAA,EACX;AAAA,EACA,sBAAsB,OAAO,qBAAqB,EAAE,UAAU,KAAK,CAAC;AAAA,EACpE,wBAAwB,OAAO,uBAAuB,EAAE,UAAU,KAAK,CAAC;AAAA,EACxE,cAAc;AACV,SAAK,WAAW,UAAU,MAAM;AAC5B,WAAK,cAAc;AAAA,IACvB,CAAC;AACD,WAAO,MAAM;AACT,YAAM,UAAU,KAAK,QAAQ;AAC7B,UAAI,SAAS;AACT,aAAK,kBAAkB;AACvB,aAAK,cAAc;AACnB,aAAK,aAAa;AAAA,MACtB;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,WAAW;AACP,SAAK,qBAAqB,kBACrB,KAAK,qBAAqB,CAAC,KAAK,QAAQ;AACzC,aAAO,IAAI,WAAW,IAAI,UAAU,IAAI,gBAAgB,IAAI;AAAA,IAChE,CAAC,GAAG,eAAe,KAAK,wBAAwB,KAAK,sBAAsB,eAAe,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,QAAQ,YAAY,GAAG,QAAQ,OAAO,EAAE,QAAQ,WAAW,KAAK,QAAQ,YAAY,EAAE,GAAG,mBAAmB,KAAK,UAAU,CAAC,EACrO,UAAU,CAAC,EAAE,QAAQ,YAAY,MAAM;AACxC,WAAK,gBAAgB,QAAQ,WAAW;AAAA,IAC5C,CAAC;AACD,SAAK,MAAM,KAAK,eAAe;AAC/B,SAAK,eAAe,QAAQ,KAAK,mBAAmB,KAAK,UAAU,CAAC,EAAE,UAAU,eAAa;AACzF,WAAK,MAAM;AAAA,IACf,CAAC;AAAA,EACL;AAAA,EACA,YAAY,SAAS;AACjB,UAAM,EAAE,eAAe,SAAS,IAAI;AACpC,QAAI,eAAe;AACf,UAAI,KAAK,QAAQ;AACb,aAAK,gBAAgB;AACrB,aAAK,cAAc;AACnB,aAAK,cAAc,KAAK;AAAA,MAC5B;AAAA,IACJ;AACA,QAAI,UAAU;AACV,WAAK,gBAAgB,KAAK,UAAU,KAAK,WAAW;AAAA,IACxD;AAAA,EACJ;AAAA,EACA,kBAAkB;AACd,SAAK,MAAM,QACN,KAAK,UAAU,KAAK,KAAK,GAAG,UAAU,MAAM;AAC7C,YAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,aAAO,MAAM,GAAG,MAAM,IAAI,UAAQ,wBAAwB,KAAK,eAAe,WAAW,CAAC,CAAC;AAAA,IAC/F,CAAC,CAAC,EACG,UAAU,WAAS;AACpB,YAAM,eAAe;AAAA,IACzB,CAAC;AAAA,EACL;AAAA,EACA,gBAAgB;AACZ,QAAI,KAAK,cAAc,KAAK,WAAW,YAAY,GAAG;AAClD,WAAK,WAAW,OAAO;AACvB,WAAK,gCAAgC,YAAY;AACjD,WAAK,SAAS;AACd,WAAK,IAAI,aAAa;AAAA,IAC1B;AAAA,EACJ;AAAA,EACA,eAAe;AACX,SAAK,cAAc;AACnB,SAAK,SAAS;AACd,SAAK,IAAI,aAAa;AAAA,EAC1B;AAAA,EACA,cAAc;AACV,WAAO,KAAK,QAAQ,IAAI,YAAY,KAAK,QAAQ,EAAE,MAAM,GAAG,KAAK,QAAQ,IAAI,CAAC;AAAA,EAClF;AAAA,EACA,iBAAiB,YAAY;AACzB,UAAM,QAAQ,KAAK,YAAY,UAAU;AACzC,SAAK,QAAQ,EAAE,cAAc;AAAA,MACzB,SAAS;AAAA,MACT,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,IACjB,CAAC;AACD,SAAK,WAAW,KAAK,UAAU;AAC/B,SAAK,cAAc;AACnB,SAAK,cAAc;AAAA,EACvB;AAAA,EACA,QAAQ;AACJ,SAAK,cAAc;AACnB,SAAK,QAAQ,EAAE,MAAM;AACrB,SAAK,UAAU,KAAK;AAAA,EACxB;AAAA,EACA,YAAY,OAAO;AACf,UAAM,SAAS,MAAM;AACrB,SAAK,QAAQ,EAAE,SAAS,OAAO,KAAK;AACpC,SAAK,QAAQ,EAAE,MAAM,IAAI,OAAO,KAAK;AACrC,SAAK,cAAc;AAAA,EACvB;AAAA,EACA,cAAc,OAAO;AACjB,UAAM,UAAU,MAAM;AACtB,QAAI,KAAK,UAAU,YAAY,SAAS,KAAK,gBAAgB,MAAM,KAAK,oBAAoB,QAAQ;AAChG,WAAK,iBAAiB,KAAK,oBAAoB,KAAK,WAAW,CAAC;AAChE,YAAM,eAAe;AAAA,IACzB,WACS,YAAY,cAAc,YAAY,aAAa;AACxD,WAAK,cAAc;AACnB,YAAM,gBAAgB;AAAA,IAC1B,OACK;AACD,UAAI,KAAK,WAAW,YAAY,OAAO,YAAY,SAAS;AACxD,aAAK,cAAc;AACnB;AAAA,MACJ;AACA,UAAI,KAAK,UAAU,YAAY,UAAU;AACrC,aAAK,sBAAsB;AAC3B,cAAM,eAAe;AACrB,cAAM,gBAAgB;AAAA,MAC1B;AACA,UAAI,KAAK,UAAU,YAAY,YAAY;AACvC,aAAK,kBAAkB;AACvB,cAAM,eAAe;AACrB,cAAM,gBAAgB;AAAA,MAC1B;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,cAAc;AACV,SAAK,cAAc,KAAK;AAAA,EAC5B;AAAA,EACA,oBAAoB;AAChB,SAAK,QAAQ,EAAE,UAAU,UAAU,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC;AAC/D,SAAK,QAAQ,EAAE,OAAO,UAAU,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC;AAC7D,SAAK,QAAQ,EAAE,QAAQ,UAAU,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;AAC3D,SAAK,QAAQ,EAAE,UAAU,UAAU,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC;AAC/D,SAAK,QAAQ,EAAE,QAAQ,UAAU,MAAM,KAAK,YAAY,CAAC;AAAA,EAC7D;AAAA,EACA,kBAAkB,OAAO,MAAM;AAC3B,UAAM,cAAc,MAAM,UAAU,CAAC;AAQrC,QAAI,KAAK,kBAAkB,SAAS,UAAU,KAAK,cAAc,CAAC,GAAG;AACjE;AAAA,IACJ;AACA,SAAK,gBAAgB;AACrB,QAAI,MAAM;AACN,WAAK,iBAAiB,KAAK;AAAA,QACvB,OAAO,KAAK,cAAc,UAAU,CAAC;AAAA,QACrC,QAAQ,KAAK,cAAc,CAAC;AAAA,MAChC,CAAC;AAAA,IACL;AACA,UAAM,cAAc,YAAY,YAAY;AAC5C,SAAK,sBAAsB,KAAK,cAAc,OAAO,gBAAc,KAAK,YAAY,UAAU,EAAE,YAAY,EAAE,SAAS,WAAW,CAAC;AAAA,EACvI;AAAA,EACA,cAAc,OAAO,MAAM;AACvB,SAAK,mBAAmB;AACxB,QAAI,OAAO,KAAK,kBAAkB,YAAY,CAAC,KAAK,QAAQ,GAAG;AAC3D,WAAK,cAAc;AACnB;AAAA,IACJ;AACA,SAAK,kBAAkB,KAAK,eAAe,IAAI;AAC/C,UAAM,cAAc,KAAK,oBAAoB,QAAQ,KAAK,cAAc,UAAU,CAAC,CAAC;AACpF,SAAK,cAAc,eAAe,IAAI,cAAc;AACpD,SAAK,aAAa;AAAA,EACtB;AAAA,EACA,oBAAoB;AAChB,SAAK,cAAc,KAAK,cAAc,KAAK,KAAK,oBAAoB,SAAS,IAAI,KAAK,cAAc,IAAI;AACxG,SAAK,IAAI,aAAa;AACtB,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EACA,wBAAwB;AACpB,SAAK,cAAc,KAAK,cAAc,IAAI,IAAI,KAAK,oBAAoB,SAAS,IAAI,KAAK,cAAc;AACvG,SAAK,IAAI,aAAa;AACtB,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EACA,oBAAoB;AAChB,QAAI,KAAK,kBAAkB;AACvB,WAAK,iBAAiB,eAAe,EAAE,UAAU,UAAU,OAAO,UAAU,QAAQ,UAAU,CAAC;AAAA,IACnG;AAAA,EACJ;AAAA,EACA,UAAU;AACN,UAAM,UAAU,KAAK;AACrB,WAAO,CAAC,QAAQ,YAAY,CAAC,QAAQ;AAAA,EACzC;AAAA,EACA,qBAAqB;AACjB,UAAM,QAAQ,KAAK,qBAAqB,MAAM,QAAQ,WAAW,kBAAkB,KAAK,KAAK;AAC7F,UAAM,iBAAiB,KAAK,qBAAqB;AACjD,UAAM,SAAS,OAAO,KAAK,aAAa,WAAW,CAAC,KAAK,QAAQ,IAAI,KAAK;AAC1E,QAAI,IAAI,OAAO;AACf,WAAO,KAAK,GAAG;AACX,YAAM,WAAW,MAAM,YAAY,OAAO,CAAC,GAAG,cAAc;AAC5D,YAAM,SAAS,MAAM,QAAQ,kBAAkB,OAAO,cAAc,IAAI,KAClE,MAAM,QAAQ,kBAAkB,OAAO,cAAc,IACrD,MAAM;AACZ,YAAM,UAAU,MAAM,UAAU,UAAU,MAAM;AAChD,UAAK,WAAW,KAAK,MAAM,WAAW,CAAC,MAAM,kBAAkB,SAC3D,WAAW,KACX,QAAQ,SAAS,OAAO,CAAC,GAAG,CAAC,KAC7B,QAAQ,SAAS,kBAAkB,KAAK,GAAG;AAC3C,aAAK,gBAAgB;AACrB,aAAK,qBAAqB;AAC1B,aAAK,mBAAmB;AAAA,MAC5B,OACK;AACD,aAAK,gBAAgB;AACrB,aAAK,qBAAqB;AAC1B,aAAK,mBAAmB;AACxB;AAAA,MACJ;AACA;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,kBAAkB;AACd,UAAM,cAAc,oBAAoB,KAAK,sBAAsB,KAAK,kBAAkB;AAC1F,UAAM,MAAM,YAAY,MACpB,KAAK,qBAAqB,sBAAsB,EAAE,SAClD,KAAK,qBAAqB,aACzB,KAAK,gBAAgB,WAAW,YAAY,SAAS,IAAI;AAC9D,UAAM,OAAO,YAAY,OAAO,KAAK,qBAAqB;AAC1D,SAAK,iBAAiB,mBAAmB,IAAI,EAAE,mBAAmB,GAAG;AACrE,QAAI,KAAK,gBAAgB,UAAU;AAC/B,WAAK,iBAAiB,cAAc,CAAC,GAAG,gCAAgC,CAAC;AAAA,IAC7E;AACA,QAAI,KAAK,gBAAgB,OAAO;AAC5B,WAAK,iBAAiB,cAAc,CAAC,GAAG,6BAA6B,CAAC;AAAA,IAC1E;AACA,SAAK,iBAAiB,MAAM;AAAA,EAChC;AAAA,EACA,+BAA+B;AAC3B,UAAM,mBAAmB,CAAC,UAAU;AAChC,YAAM,cAAc,MAAM;AAC1B,aAAQ,KAAK,UACT,gBAAgB,KAAK,wBACrB,CAAC,KAAK,YAAY,eAAe,SAAS,WAAW;AAAA,IAC7D;AACA,UAAM,eAAe,IAAI,aAAa;AACtC,iBAAa,IAAI,KAAK,WAAW,qBAAqB,EAAE,UAAU,WAAS,iBAAiB,KAAK,KAAK,KAAK,cAAc,CAAC,CAAC;AAC3H,iBAAa,IAAI,wBAAwB,KAAK,UAAU,UAAU,EAAE,UAAU,WAAS,iBAAiB,KAAK,KAAK,KAAK,OAAO,IAAI,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC;AAC9J,WAAO;AAAA,EACX;AAAA,EACA,gBAAgB;AACZ,QAAI,CAAC,KAAK,YAAY;AAClB,WAAK,SAAS,IAAI,eAAe,KAAK,iBAAiB,KAAK,gBAAgB;AAC5E,WAAK,aAAa,iBAAiB,KAAK,UAAU;AAAA,QAC9C,kBAAkB,KAAK,mBAAmB;AAAA,QAC1C,gBAAgB,+BAA+B,KAAK,QAAQ;AAAA,QAC5D,qBAAqB;AAAA,MACzB,CAAC;AAAA,IACL;AACA,QAAI,KAAK,cAAc,CAAC,KAAK,WAAW,YAAY,GAAG;AACnD,WAAK,WAAW,OAAO,KAAK,MAAM;AAClC,WAAK,kCAAkC,KAAK,6BAA6B;AAAA,IAC7E;AACA,SAAK,gBAAgB;AAAA,EACzB;AAAA,EACA,qBAAqB;AACjB,WAAQ,KAAK,mBAAmB,wCAAwC,KAAK,UAAU,KAAK,QAAQ,EAAE,UAAU,EAC3G,cAAc;AAAA,MACf,IAAI,uBAAuB,EAAE,SAAS,SAAS,SAAS,SAAS,GAAG,EAAE,UAAU,SAAS,UAAU,MAAM,CAAC;AAAA,MAC1G,IAAI,uBAAuB,EAAE,SAAS,SAAS,SAAS,MAAM,GAAG,EAAE,UAAU,SAAS,UAAU,SAAS,CAAC;AAAA,IAC9G,CAAC,EACI,uBAAuB,KAAK,EAC5B,SAAS,KAAK;AAAA,EACvB;AAAA,EACA,gBAAgB,QAAQ,aAAa;AAEjC,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,IAAI,aAAa;AAEtB,SAAK,YAAY,oBAAoB,KAAK,WAAW,QAAQ,WAAW;AACxE,WAAO,KAAK,KAAK,SAAS,EAAE,QAAQ,CAAAC,YAAU;AAC1C,UAAI,KAAK,UAAUA,OAAM,GAAG;AACxB,aAAK,SAAS,SAAS,KAAK,WAAW,eAAeA,OAAM;AAAA,MAChE,OACK;AACD,aAAK,SAAS,YAAY,KAAK,WAAW,eAAeA,OAAM;AAAA,MACnE;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,qBAAoB,MAAM,CAAC,GAAG,QAAW,cAAgB,UAAU,CAAC;AAAA,EACvK,OAAO,YAAU,+BAAqB,EAAE,YAAY,UAAU,SAAS,UAAU,MAAM,qBAAoB,cAAc,MAAM,UAAU,cAAc,QAAQ,EAAE,aAAa,eAAe,UAAU,YAAY,WAAW,CAAC,aAAa,aAAa,gBAAgB,GAAG,mBAAmB,qBAAqB,aAAa,eAAe,eAAe,iBAAiB,UAAU,YAAY,WAAW,aAAa,cAAc,CAAC,gBAAgB,gBAAgB,gBAAgB,GAAG,aAAa,cAAc,GAAG,SAAS,EAAE,YAAY,cAAc,kBAAkB,oBAAoB,WAAW,YAAY,GAAG,MAAM,EAAE,YAAY,EAAE,0BAA0B,iBAAiB,iCAAiC,8BAA8B,6BAA6B,0BAA0B,iCAAiC,8BAA8B,8BAA8B,aAAa,+BAA+B,aAAa,GAAG,gBAAgB,eAAe,GAAG,SAAS,CAAC,EAAE,cAAc,WAAW,OAAO,MAAM,WAAW,2BAA2B,aAAa,MAAM,UAAU,KAAK,GAAG,EAAE,cAAc,mBAAmB,OAAO,MAAM,WAAW,8BAA8B,aAAa,MAAM,MAAM,YAAY,CAAC,GAAG,aAAa,CAAC,EAAE,cAAc,mBAAmB,OAAO,MAAM,WAAW,aAAa,aAAa,KAAK,GAAG,EAAE,cAAc,SAAS,WAAW,CAAC,OAAO,GAAG,aAAa,MAAM,MAAM,WAAW,CAAC,GAAG,UAAU,CAAC,WAAW,GAAG,eAAe,MAAM,UAAU,cAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAiD39C,UAAU,MAAM,cAAc,CAAC,EAAE,MAAM,aAAa,MAAM,kBAAkB,UAAU,sBAAsB,QAAQ,CAAC,2BAA2B,oBAAoB,0BAA0B,EAAE,GAAG,EAAE,MAAM,YAAY,MAAM,aAAa,GAAG,EAAE,MAAM,aAAa,MAAS,iBAAiB,UAAU,qBAAqB,QAAQ,CAAC,UAAU,YAAY,UAAU,WAAW,kBAAkB,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,YAAY,MAAM,cAAc,GAAG,EAAE,MAAM,aAAa,MAAS,uBAAuB,UAAU,kBAAkB,QAAQ,CAAC,mBAAmB,iBAAiB,GAAG,UAAU,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,iCAAiC,UAAU,8BAA8B,QAAQ,CAAC,QAAQ,GAAG,UAAU,CAAC,oBAAoB,EAAE,GAAG,EAAE,MAAM,aAAa,MAAM,iCAAiC,UAAU,4BAA4B,QAAQ,CAAC,iCAAiC,wBAAwB,GAAG,UAAU,CAAC,wBAAwB,EAAE,CAAC,GAAG,iBAAoB,wBAAwB,OAAO,CAAC;AACvhC;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,oBAAoB,YAAY,CAAC;AAAA,EAChH,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkDV,iBAAiB,wBAAwB;AAAA,IACzC,MAAM;AAAA,MACF,OAAO;AAAA,MACP,4BAA4B;AAAA,MAC5B,mCAAmC;AAAA,MACnC,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,gCAAgC;AAAA,MAChC,iCAAiC;AAAA,IACrC;AAAA,IACA,SAAS;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ,CAAC;AACT,CAAC,GAAG,gBAAgB,MAAM,CAAC,GAAG,gBAAgB,EAAE,aAAa,CAAC;AAAA,EACtD,MAAM;AACV,CAAC,GAAG,UAAU,CAAC;AAAA,EACX,MAAM;AACV,CAAC,GAAG,WAAW,CAAC;AAAA,EACZ,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,WAAW,iBAAiB,CAAC;AAC1C,CAAC,GAAG,mBAAmB,CAAC;AAAA,EACpB,MAAM;AACV,CAAC,GAAG,aAAa,CAAC;AAAA,EACd,MAAM;AACV,CAAC,GAAG,eAAe,CAAC;AAAA,EAChB,MAAM;AACV,CAAC,GAAG,UAAU,CAAC;AAAA,EACX,MAAM;AACV,CAAC,GAAG,WAAW,CAAC;AAAA,EACZ,MAAM;AACV,CAAC,GAAG,cAAc,CAAC;AAAA,EACf,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,WAAW,iBAAiB,CAAC;AAC1C,CAAC,GAAG,aAAa,CAAC;AAAA,EACd,MAAM;AACV,CAAC,GAAG,YAAY,CAAC;AAAA,EACb,MAAM;AACV,CAAC,GAAG,kBAAkB,CAAC;AAAA,EACnB,MAAM;AACV,CAAC,GAAG,WAAW,CAAC;AAAA,EACZ,MAAM;AACV,CAAC,GAAG,iBAAiB,CAAC;AAAA,EAClB,MAAM;AAAA,EACN,MAAM,CAAC,aAAa,EAAE,QAAQ,MAAM,CAAC;AACzC,CAAC,GAAG,OAAO,CAAC;AAAA,EACR,MAAM;AAAA,EACN,MAAM,CAAC,SAAS,EAAE,MAAM,WAAW,CAAC;AACxC,CAAC,GAAG,iBAAiB,CAAC;AAAA,EAClB,MAAM;AAAA,EACN,MAAM,CAAC,8BAA8B,EAAE,QAAQ,OAAO,MAAM,YAAY,CAAC;AAC7E,CAAC,EAAE,EAAE,CAAC;AAMlB,IAAM,aAAa,CAAC,oBAAoB,2BAA2B,4BAA4B;AAC/F,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAClB,OAAO,YAAU,6BAAmB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,kBAAiB,MAAM,CAAC,GAAG,QAAW,cAAgB,SAAS,CAAC;AAAA,EACnK,OAAO,YAAU,8BAAoB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,kBAAiB,SAAS,CAAC,oBAAoB,2BAA2B,4BAA4B,GAAG,SAAS,CAAC,oBAAoB,2BAA2B,4BAA4B,EAAE,CAAC;AAAA,EACrS,OAAO,YAAU,8BAAoB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,kBAAiB,SAAS,CAAC,kBAAkB,EAAE,CAAC;AACxJ;AACG,mCAAyB,EAAE,YAAY,UAAU,SAAS,UAAU,UAAU,cAAI,MAAM,iBAAiB,YAAY,CAAC;AAAA,EAC7G,MAAM;AAAA,EACN,MAAM,CAAC;AAAA,IACC,SAAS,CAAC,GAAG,UAAU;AAAA,IACvB,SAAS,CAAC,GAAG,UAAU;AAAA,EAC3B,CAAC;AACT,CAAC,EAAE,CAAC;;;ACnrBZ;;;AC0DO,IAAM,wBAAN,MAAMC,uBAAqB;SACzB,MAAc,EAAE;UAEf,MAAc,CAAC;EAED;EAEd;EAER,WAAW,OAAO,KAAK;EACvB,aAAa,OAAO,KAAK;;EAGzB,eAAe,SAAS,MAAM,CAAC,CAAC,KAAK,KAAI,CAAE;EAE3C,kBAAe;AACb,SAAK,cAAa;AAClB,SAAK,aAAY;EACnB;EAEA,cAAW;AACT,SAAK,UAAU,WAAU;EAC3B;EAEA,cAAA;AAEE,WAAO,MAAK;AACV,WAAK,KAAI;AACT,WAAK,MAAK;AAGV,iBAAW,MAAM,KAAK,cAAa,CAAE;IACvC,CAAC;EACH;;EAGQ,eAAY;AAClB,UAAM,KAAK,KAAK,SAAS;AACzB,QAAI,CAAC;AAAI;AAET,SAAK,WAAW,IAAI,iBAAiB,MAAK;AACxC,WAAK,cAAa;IACpB,CAAC;AAED,SAAK,SAAS,QAAQ,IAAI;MACxB,WAAW;;MACX,SAAS;;MACT,eAAe;;KAChB;EACH;EAEQ,gBAAa;AAEnB,SAAK,OAAO,KAAK;AACjB,SAAK,WAAW,IAAI,KAAK;AAEzB,UAAM,KAAK,KAAK,SAAS;AACzB,QAAI,CAAC;AAAI;AACT,0BAAsB,MAAM,KAAK,WAAW,IAAI,GAAG,eAAe,GAAG,YAAY,CAAC;EACpF;;EAGA,OAAO,UAAkB;AACvB,QAAI,aAAa,QAAW;AAC1B,WAAK,SAAS,IAAI,QAAQ;IAC5B,OAAO;AACL,WAAK,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC;EACF;;;;;sBA/DC,WAAS,MAAA,CAAC,SAAS,EAAA,CAAA;;;AALT,wBAAqB,WAAA;EA7CjC,UAAU;IACT,UAAU;IACV,SAAS,CAAC,YAAY;IACtB,UAAU;;;;;;;;;;;;;;;;;;;;GAyCX;GACY,qBAAqB;;;AC0M3B,IAAM,4BAAN,MAAMC,2BAAyB;EACnB,YAAY,OAAO,SAAS;eAEvB,MAAM,KAAK;SACjB,MAAM,SAAQ;YACX,MAA6B,CAAA,CAAE;cAC7B,MAAK;SACV,MAAM,KAAK;EACV,iBAAiB;EAEzB,SAAS,OAAM;EAEf,eAAe,OAAO,EAAE;EACxB,iBAAiB,OAAO,EAAE;EAE1B,iBAAiB,SAAS,MAAK;AACtC,UAAM,UAAU,KAAK,eAAc,EAAG,KAAI,EAAG,YAAW;AACxD,UAAM,UAAU,KAAK,QAAO;AAC5B,QAAI,CAAC,SAAS;AACZ,aAAO,QAAQ,MAAM,GAAG,EAAE;IAC5B;AACA,WAAO,QACJ,OAAO,CAAC,WAAU;AACjB,YAAM,eAAe,OAAO,eAAe,IAAI,YAAW;AAC1D,YAAM,UAAU,OAAO,UAAU,IAAI,YAAW;AAChD,aAAO,YAAY,SAAS,OAAO,KAAK,OAAO,SAAS,OAAO;IACjE,CAAC,EACA,MAAM,GAAG,EAAE;EAChB,CAAC;EAED,eAAY;AACV,QAAI,CAAC,KAAK,aAAY,EAAG,KAAI;AAAI;AACjC,SAAK,OAAO,KAAK;MACf,SAAS,KAAK,aAAY;MAC1B,UAAU,KAAK,gBAAgB,KAAK,aAAY,CAAE;KACnD;AACD,SAAK,aAAa,IAAI,EAAE;AACxB,SAAK,eAAe,IAAI,EAAE;EAC5B;EAEA,UAAU,UAAgB;AACxB,WAAO,YAAY,QAAQ,KAAK;EAClC;EAEA,aAAa,QAA2B;AACtC,WAAO,OAAO,aAAa,KAAI,KAAM,OAAO;EAC9C;EAEA,oBAAoB,OAA2B;AAC7C,SAAK,eAAe,IAAI,MAAM,SAAS,EAAE;EAC3C;EAEA,oBAAoB,SAA4B;AAC9C,SAAK,eAAe,IAAI,EAAE;EAC5B;EAEQ,gBAAgB,SAAe;AACrC,UAAM,SAAS,oBAAI,IAAG;AACtB,eAAW,UAAU,KAAK,QAAO,GAAI;AACnC,YAAM,QAAQ,KAAK,aAAa,MAAM;AACtC,UAAI,SAAS,QAAQ,SAAS,IAAI,KAAK,EAAE,GAAG;AAC1C,eAAO,IAAI,OAAO,MAAM;MAC1B;IACF;AACA,WAAO,CAAC,GAAG,MAAM;EACnB;EAEA,aAAa,QAAc;AACzB,WACE;MACE,QAAQ;MACR,QAAQ;MACR,OAAO;MACP,OAAO;MACP,QAAQ;MACR,SAAS;MACT,QAAQ;MACR,OAAO;MACP,eAAe;MACf,QAAQ;MACR,SAAS;MACT,MAAM,KAAK;EAEjB;EAEA,gBAAgB,MAAY;AAC1B,UAAM,WAAuD,CAAA;AAE7D,QAAI,CAAC;AAAM,aAAO;AAElB,UAAM,QAAQ,KAAK;AACnB,QAAI,YAAY;AAChB,QAAI;AAEJ,WAAQ,QAAQ,MAAM,KAAK,IAAI,GAAI;AACjC,YAAM,QAAQ,MAAM;AACpB,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,OAAO,KAAK,MAAM,CAAC;AAGzB,UAAI,QAAQ,WAAW;AACrB,iBAAS,KAAK;UACZ,MAAM,KAAK,MAAM,WAAW,KAAK;SAClC;MACH;AAGA,eAAS,KAAK;QACZ,MAAM;QACN,SAAS,KAAK,SAAS,IAAI;OAC5B;AAED,kBAAY,MAAM;IACpB;AAGA,QAAI,YAAY,KAAK,QAAQ;AAC3B,eAAS,KAAK;QACZ,MAAM,KAAK,MAAM,SAAS;OAC3B;IACH;AAEA,WAAO;EACT;EAEA,SAAS,MAAY;AACnB,WAAO,CAAC,CAAC,KAAK,QAAO,EAAG,KAAK,CAAC,WAAW,OAAO,gBAAgB,IAAI;EACtE;EAEA,mBAAmB,QAAc;AAC/B,QAAI,CAAC,KAAK,UAAS;AAAI,aAAO;AAC9B,UAAM,SAAS,KAAK,QAAO,EAAG,KAAK,CAACC,YAAWA,QAAO,WAAW,MAAM;AACvE,UAAM,YAAY,KAAK,mBACrB,QAAQ,aAAa,IACrB,KAAK,UAAS,GACd,KAAK,KAAI,EAAG,CAAC,EAAE,OAAO;AAExB,WAAO;EACT;EAEA,mBAAmB,KAAa,YAAoB,SAAe;AAEjE,UAAM,QAAQ;AACd,UAAM,QAAQ,IAAI,MAAM,KAAK;AAE7B,QAAI,OAAO;AAET,YAAM,eAAe,MAAM,CAAC;AAG5B,aAAO,uBAAuB,UAAU,WAAW,OAAO,gBAAgB,YAAY;IACxF,OAAO;AACL,aAAO;IACT;EACF;;;;;;;;;;AA1JW,4BAAyB,WAAA;EAlOrC,UAAU;IACT,UAAU;IACV,YAAY;IACZ,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;IAEF,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6MV,iBAAiB,wBAAwB;;GAC1C;GACY,yBAAyB;;;ACpQtC;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,qCAAA;;;ACaO,IAAM,0BAAN,MAAMC,yBAAuB;EACf,eAAe,OAAO,cAAc;EACpC,MAAM,OAAO,iBAAiB;EAG/C;EAES,UAAU;EACV,UAAU;EACV,aAAoC;EACpC,wBAAwB;EAEjC,WAA+D,CAAA;EAC/D,cAA6B;EAC7B,eAAe;EACP,kBAAiC,CAAA;EACjC,kBAA+C;EAC/C,iBAAsC;EAE9C,YAAY,SAAsB;AAC9B,QAAI,QAAQ,SAAS,KAAK,QAAQ,SAAS,KAAK,QAAQ,uBAAuB,KAAK,QAAQ,YAAY,GAAG;AACvG,qBAAe,MAAM,KAAK,SAAQ,CAAE;IACxC;EACJ;EAEA,kBAAe;AACX,SAAK,SAAQ;EACjB;EAEA,cAAW;AACP,SAAK,uBAAsB;EAC/B;EAEA,cAAc,IAAU;AACpB,UAAM,OAAO,KAAK,WAAW;AAC7B,UAAM,SAAS,MAAM,cAA2B,IAAI,IAAI,OAAO,EAAE,CAAC,EAAE;AACpE,QAAI,CAAC,QAAQ;AACT;IACJ;AAEA,SAAK,cAAc;AACnB,SAAK,IAAI,aAAY;AACrB,mBAAe,MAAM,KAAK,2BAA0B,CAAE;AAEtD,UAAM,YAAY,KAAK,2BAA2B,cAAc,KAAK,kBAAkB;AACvF,UAAM,YAAY;AAClB,QAAI,WAAW;AACX,YAAM,gBAAgB,UAAU,sBAAqB;AACrD,YAAM,aAAa,OAAO,sBAAqB;AAC/C,YAAM,UAAU,UAAU,aAAa,WAAW,MAAM,cAAc,OAAO;AAC7E,gBAAU,SAAS,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,GAAG,UAAU,SAAQ,CAAE;AACpE;IACJ;AAEA,UAAM,cAAc,OAAO,sBAAqB,EAAG,MAAM,OAAO,UAAU;AAC1E,WAAO,SAAS,EAAE,KAAK,KAAK,IAAI,GAAG,WAAW,GAAG,UAAU,SAAQ,CAAE;EACzE;EAEA,YAAS;AACL,SAAK,eAAe,CAAC,KAAK;EAC9B;EAEA,eAAe,OAAiB;AAC5B,UAAM,SAAS,MAAM;AACrB,UAAM,QAAQ,QAAQ,QAAQ,KAAK;AACnC,QAAI,CAAC,OAAO,KAAK;AACb;IACJ;AAEA,UAAM,OAAO,KAAK,WAAW;AAC7B,UAAM,gBAAgB,OAChB,MAAM,KAAK,KAAK,iBAAiB,KAAK,CAAC,IACvC,CAAC,KAAK;AACZ,UAAM,gBAAgB,cACjB,IAAI,CAAC,UAAU;MACZ,KAAK,KAAK,cAAc,KAAK;MAC7B,KAAK,KAAK,OAAO;MACnB,EACD,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG;AAChC,UAAM,QAAQ,KAAK,IACf,GACA,cAAc,UAAU,CAAC,SAAS,SAAS,KAAK,CAAC;AAGrD,QAAI,cAAc,WAAW,GAAG;AAC5B;IACJ;AACA,UAAM,aAAa,KAAK,aAAa,QAAQ,eAAe;MACxD,gBAAgB;MAChB,YAAY;KACf;AACD,QAAI,QAAQ,GAAG;AACX,iBAAW,SAAS,KAAK;IAC7B;EACJ;EAEQ,WAAQ;AACZ,QAAI,CAAC,KAAK,SAAS;AACf,WAAK,WAAW,CAAA;AAChB,WAAK,cAAc;AACnB,WAAK,eAAe;AACpB,WAAK,uBAAsB;AAC3B,WAAK,IAAI,aAAY;AACrB;IACJ;AAEA,UAAM,OAAO,KAAK,WAAW;AAC7B,QAAI,CAAC,MAAM;AACP,WAAK,WAAW,CAAA;AAChB,WAAK,cAAc;AACnB,WAAK,eAAe,KAAK;AACzB,WAAK,uBAAsB;AAC3B,WAAK,IAAI,aAAY;AACrB;IACJ;AAEA,UAAM,WAAW,MAAM,KAAK,KAAK,iBAA8B,YAAY,CAAC;AAC5E,UAAM,iBAAiB,oBAAI,IAAG;AAC9B,UAAM,QAA4D,CAAA;AAElE,aAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS,GAAG;AACrD,YAAM,UAAU,SAAS,KAAK;AAC9B,YAAM,QAAQ,QAAQ,eAAe,IAAI,KAAI;AAC7C,UAAI,CAAC,MAAM;AACP;MACJ;AACA,YAAM,QAAQ,OAAO,QAAQ,QAAQ,MAAM,CAAC,CAAC,KAAK;AAClD,UAAI,OAAO,KAAK,QAAQ,IAAI,KAAK,WAAW,QAAQ,CAAC;AACrD,YAAM,QAAQ,eAAe,IAAI,IAAI,KAAK;AAC1C,qBAAe,IAAI,MAAM,QAAQ,CAAC;AAClC,UAAI,QAAQ,GAAG;AACX,eAAO,GAAG,IAAI,IAAI,QAAQ,CAAC;MAC/B;AAEA,cAAQ,KAAK,QAAQ,MAAM;AAC3B,YAAM,KAAK,EAAE,IAAI,QAAQ,IAAI,MAAM,MAAK,CAAE;IAC9C;AAEA,SAAK,WAAW;AAChB,SAAK,cAAc,MAAM,CAAC,GAAG,MAAM;AACnC,SAAK,eAAe,KAAK;AACzB,SAAK,oBAAoB,MAAM,QAAQ;AACvC,SAAK,IAAI,aAAY;EACzB;EAEQ,oBAAoB,MAAmB,UAAuB;AAClE,SAAK,uBAAsB;AAC3B,QAAI,SAAS,WAAW,GAAG;AACvB;IACJ;AAEA,SAAK,kBAAkB;AACvB,UAAM,YAAY,KAAK,oBAAoB,IAAI;AAC/C,SAAK,kBAAkB,aAAa;AACpC,SAAK,iBAAiB,MAAM,KAAK,kBAAiB;AAClD,SAAK,gBAAgB,iBAAiB,UAAU,KAAK,gBAAgB,EAAE,SAAS,KAAI,CAAE;AACtF,WAAO,iBAAiB,UAAU,KAAK,gBAAgB,EAAE,SAAS,KAAI,CAAE;AACxE,SAAK,kBAAiB;EAC1B;EAEQ,yBAAsB;AAC1B,QAAI,KAAK,gBAAgB;AACrB,WAAK,iBAAiB,oBAAoB,UAAU,KAAK,cAA+B;AACxF,aAAO,oBAAoB,UAAU,KAAK,cAA+B;IAC7E;AACA,SAAK,kBAAkB,CAAA;AACvB,SAAK,kBAAkB;AACvB,SAAK,iBAAiB;EAC1B;EAEQ,oBAAiB;AACrB,QAAI,KAAK,gBAAgB,WAAW,GAAG;AACnC;IACJ;AAEA,UAAM,YAAY;AAClB,QAAI,SAAS,KAAK,gBAAgB,CAAC;AACnC,UAAM,YAAY,KAAK,2BAA2B,cAAc,KAAK,kBAAkB;AAEvF,QAAI,WAAW;AACX,YAAM,gBAAgB,UAAU,sBAAqB;AACrD,YAAM,UAAU,UAAU,YAAY;AACtC,YAAM,eAAe,KAAK,IAAI,UAAU,eAAe,UAAU,cAAc,CAAC;AAChF,YAAM,aAAa,eAAe,UAAU,aAAa;AAEzD,UAAI,YAAY;AACZ,iBAAS,KAAK,gBAAgB,KAAK,gBAAgB,SAAS,CAAC;MACjE;AAEA,iBAAW,WAAW,KAAK,iBAAiB;AACxC,cAAM,cAAc,QAAQ,sBAAqB;AACjD,cAAM,MAAM,YAAY,MAAM,cAAc,MAAM,UAAU;AAC5D,YAAI,OAAO,SAAS;AAChB,mBAAS;QACb,OAAO;AACH;QACJ;MACJ;IACJ,OAAO;AACH,iBAAW,WAAW,KAAK,iBAAiB;AACxC,cAAM,MAAM,QAAQ,sBAAqB,EAAG;AAC5C,YAAI,OAAO,WAAW;AAClB,mBAAS;QACb,OAAO;AACH;QACJ;MACJ;IACJ;AAEA,QAAI,CAAC,OAAO,MAAM,OAAO,OAAO,KAAK,aAAa;AAC9C;IACJ;AAEA,SAAK,cAAc,OAAO;AAC1B,SAAK,IAAI,aAAY;AACrB,mBAAe,MAAM,KAAK,2BAA0B,CAAE;EAC1D;EAEQ,6BAA0B;AAC9B,UAAM,OAAO,KAAK,WAAW;AAC7B,QAAI,CAAC,QAAQ,CAAC,KAAK,aAAa;AAC5B;IACJ;AAEA,UAAM,OAAO,KAAK,cACd,oCAAoC,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI;AAExE,QAAI,CAAC,MAAM;AACP;IACJ;AAEA,UAAM,YAAY,KAAK,QAAqB,wCAAwC;AACpF,QAAI,CAAC,WAAW;AACZ;IACJ;AAEA,SAAK,eAAe,EAAE,OAAO,WAAW,QAAQ,UAAS,CAAE;AAE3D,UAAM,UAAU,KAAK;AACrB,UAAM,aAAa,UAAU,KAAK;AAClC,UAAM,UAAU,UAAU;AAC1B,UAAM,aAAa,UAAU,UAAU;AAEvC,QAAI,UAAU,SAAS;AACnB,gBAAU,YAAY,KAAK,IAAI,UAAU,GAAG,CAAC;IACjD,WAAW,aAAa,YAAY;AAChC,gBAAU,YAAY,aAAa,UAAU,eAAe;IAChE;EACJ;EAEQ,oBAAoB,SAAoB;AAC5C,QAAI,UAA8B,QAAQ;AAC1C,WAAO,SAAS;AACZ,YAAM,QAAQ,iBAAiB,OAAO;AACtC,YAAM,YAAY,MAAM;AACxB,WAAK,cAAc,UAAU,cAAc,aAAa,QAAQ,eAAe,QAAQ,cAAc;AACjG,eAAO;MACX;AACA,gBAAU,QAAQ;IACtB;AACA,WAAO;EACX;EAEQ,QAAQ,OAAa;AACzB,WAAO,MACF,YAAW,EACX,KAAI,EACJ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,wBAAwB,EAAE,EAClC,QAAQ,OAAO,GAAG,EAClB,QAAQ,UAAU,EAAE;EAC7B;;wBA3QC,WAAS,MAAA,CAAC,aAAa,EAAE,QAAQ,KAAI,CAAE,EAAA,CAAA;sBAGvC,MAAK,CAAA;sBACL,MAAK,CAAA;yBACL,MAAK,CAAA;oCACL,MAAK,CAAA;;;AAVG,0BAAuB,WAAA;EARnC,UAAU;IACP,UAAU;IACV,YAAY;IACZ,SAAS,CAAC,cAAc,gBAAgB,aAAa;IACrD,UAAA;IAEA,iBAAiB,wBAAwB;;GAC5C;GACY,uBAAuB;;;AC6D7B,IAAM,gCAAN,MAAMC,+BAA6B;UACvB,MAAM,SAAQ;cACV,MAAc,EAAE;EAE5B,YAAY,SAAS,MAAK;AACjC,WAAO,KAAK,kBACV,KAAK,MAAK,EAAG,eAAe,IAC5B,KAAK,UAAS,GACd,KAAK,MAAK,EAAG,EAAE;EAEnB,CAAC;EAEO,kBAAkB,WAAmB,WAAmB,SAAe;AAE7E,UAAM,QAAQ;AAGd,WAAO,UAAU,QAAQ,OAAO,CAAC,OAAe,iBAAwB;AAEtE,YAAM,cAAc,aAAa,MAAM,2BAA2B;AAElE,UAAI,CAAC,aAAa;AAChB,eAAO;MACT;AACA,YAAM,SAAS,YAAY,CAAC;AAC5B,YAAM,UAAU,kCAAkC,SAAS,WAAW,OAAO,YAAY,MAAM;AAE/F,aAAO,MAAM,QAAQ,cAAc,OAAO;IAC5C,CAAC;EACH;;EAGA,oBAAoB,OAAkB;AACpC,UAAM,OAAO,oBAAoB,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI;AAClE,WAAO,OAAO,KAAK,QAAQ;EAC7B;;;;;;AAnCW,gCAA6B,WAAA;EAnEzC,UAAU;IACT,UAAU;IACV,SAAS,CAAC,yBAAyB,yBAAyB,qBAAqB;IACjF,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DX;GACY,6BAA6B;;;AC1E1C;;;AC4GO,IAAM,yBAAN,MAAMC,wBAAsB;EACzB,YAAY,OAAO,SAAS;aAChB,MAA2B,CAAA,CAAE;YAC9B,MAAK;cACH,MAAM,KAAK;oBACL,MAAM,KAAK;gBACf,MAAM,KAAK;sBACL,MAAM,KAAK;SACxB,MAAM,KAAK;EAElB,SAAS,OAAM;EACf,WAAW,OAAM;EACjB,cAAc,OAAM;EACpB,iBAAiB,OAAM;EAEvB,oBAAoB,SAAS,MAAK;AACzC,UAAM,QAAQ,KAAK,QAAO;AAC1B,QAAI,CAAC;AAAO,aAAO;AACnB,QAAI,MAAM,UAAU,GAAG;AACrB,aAAO;IACT;AACA,UAAM,QAAQ,CAAC,sBAAO,MAAM,IAAI,EAAE;AAClC,QAAI,MAAM,aAAa,GAAG;AACxB,YAAM,KAAK,sBAAO,MAAM,UAAU,EAAE;IACtC;AACA,QAAI,MAAM,OAAO,GAAG;AAClB,YAAM,KAAK,sBAAO,MAAM,IAAI,EAAE;IAChC;AACA,WAAO,MAAM,KAAK,QAAG;EACvB,CAAC;EAED,OAAO,QAAyB;AAC9B,WAAO,KAAK,UAAU,cAAa,MAAO,OAAO;EACnD;EAEA,kBAAkB,QAAmC;AACnD,WAAO,2BAA2B,MAAM,KAAK;EAC/C;EAEA,kBAAkB,QAAmC;AACnD,WAAO,2BAA2B,MAAM,KAAK;EAC/C;;;;;;;;;;;;;;;AAzCW,yBAAsB,WAAA;EAhGlC,UAAU;IACT,UAAU;IACV,SAAS,CAAC,yBAAyB,gBAAgB,aAAa,YAAY;IAC5E,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4FX;GACY,sBAAsB;;;AC5GnC;;;ACqFO,IAAM,qCAAN,MAAMC,oCAAkC;SAC7B,MAAM,KAAK;SACX,MAAM,KAAK;UACV,MAA0B,IAAI;EACtC,SAAS,OAAM;EACf,UAAU,OAAM;EAEhB,QAAQ,OAAO,EAAE;EACjB,iBAAiB,SAAS,MAAM,CAAC,KAAK,MAAK,EAAG,KAAI,CAAE;EAE7D,cAAA;AACE,WAAO,MAAK;AACV,UAAI,CAAC,KAAK,KAAI,GAAI;AAChB;MACF;AACA,WAAK,MAAM,IAAI,EAAE;IACnB,CAAC;EACH;EAEA,gBAAa;AACX,UAAM,QAAQ,KAAK,MAAK,EAAG,KAAI;AAC/B,QAAI,CAAC,OAAO;AACV;IACF;AACA,SAAK,QAAQ,KAAK,EAAE,MAAK,CAAE;EAC7B;;;;;;;;;;AAzBW,qCAAkC,WAAA;EApE9C,UAAU;IACT,UAAU;IACV,YAAY;IACZ,SAAS,CAAC,aAAa,gBAAgB,eAAe,eAAe,YAAY;IACjF,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8DV,iBAAiB,wBAAwB;;GAC1C;GACY,kCAAkC;;;ACrF/C;;;ACgHO,IAAM,mCAAN,MAAMC,kCAAgC;SAC3B,MAAM,KAAK;SACX,MAAM,KAAK;UACV,MAA0B,IAAI;iBACvB,MAAgC,CAAA,CAAE;EACjD,SAAS,OAAM;EACf,UAAU,OAAM;EAEhB,sBAAsB,OAAsB,IAAI;EAChD,QAAQ,OAAO,EAAE;EAEjB,iBAAiB,SACxB,MAAM,CAAC,KAAK,oBAAmB,GAAI,KAAI,KAAM,CAAC,KAAK,MAAK,EAAG,KAAI,CAAE;EAGnE,cAAA;AACE,WAAO,MAAK;AACV,UAAI,CAAC,KAAK,KAAI,GAAI;AAChB;MACF;AACA,WAAK,oBAAoB,IAAI,KAAK,aAAY,EAAG,CAAC,GAAG,UAAU,IAAI;AACnE,WAAK,MAAM,IAAI,EAAE;IACnB,CAAC;EACH;EAEA,gBAAa;AACX,UAAM,cAAc,KAAK,oBAAmB,GAAI,KAAI;AACpD,UAAM,QAAQ,KAAK,MAAK,EAAG,KAAI;AAE/B,QAAI,CAAC,eAAe,CAAC,OAAO;AAC1B;IACF;AAEA,SAAK,QAAQ,KAAK,EAAE,aAAa,MAAK,CAAE;EAC1C;;;;;;;;;;;AAlCW,mCAAgC,WAAA;EA/F5C,UAAU;IACT,UAAU;IACV,YAAY;IACZ,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;;IAEF,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkFV,iBAAiB,wBAAwB;;GAC1C;GACY,gCAAgC;;;AC+GtC,IAAM,uBAAN,MAAMC,sBAAoB;EACtB,QAAQ,OAAO,gBAAgB;SACxB,MAAM,KAAK;SACX,MAAM,KAAK;EAElB,QAAQ,OAAM;EACd,cAAc,OAAM;EACpB,gBAAgB,OAAM;EACtB,iBAAiB,OAAM;EACvB,oBAAoB,OAAM;EAC1B,cAAc,OAAM;;EAGpB,qBAAqB,OAAgB,KAAK;EAC1C,mBAAmB,OAAgB,KAAK;EAExC,eAAe,SAAS,MAAM,KAAK,MAAM,MAAK,GAAI,WAAW,EAAE;EAC/D,YAAY,SAAS,MAAM,KAAK,MAAM,MAAK,GAAI,SAAS,0BAAM;EAEvE,eAAY;AACV,SAAK,MAAM,KAAI;EACjB;EAEA,kBAAkB,QAAuB;AACvC,SAAK,YAAY,KAAK,MAAM;EAC9B;;EAGA,qBAAkB;AAChB,SAAK,mBAAmB,IAAI,IAAI;EAClC;EAEA,sBAAsBC,QAAwB;AAC5C,SAAK,MAAM,eAAeA,MAAK;AAC/B,SAAK,mBAAmB,IAAI,KAAK;EACnC;;EAGA,mBAAgB;AACd,SAAK,iBAAiB,IAAI,IAAI;EAChC;EAEA,oBAAoBA,QAA6C;AAC/D,SAAK,MAAM,aAAaA,MAAK;AAC7B,SAAK,iBAAiB,IAAI,KAAK;EACjC;;;;;;;;;;;;AA7CW,uBAAoB,WAAA;EArMhC,UAAU;IACT,UAAU;IACV,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;IAEF,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoLX;GACY,oBAAoB;;;AC/NjC;;;AC4EO,IAAM,4BAAN,MAAMC,2BAAyB;SACpB,MAAM,IAAI;SACV,MAAM,KAAK;SACX,MAA0B,IAAI;EAErC,UAAU,OAAM;EAChB,SAAS,OAAM;EAEf,SAAS,OAAO,EAAE;EAE3B,cAAA;AACE,WAAO,MAAK;AACV,UAAI,KAAK,KAAI,GAAI;AACf,aAAK,OAAO,IAAI,KAAK,KAAI,GAAI,eAAe,EAAE;MAChD;IACF,CAAC;EACH;EAEA,aAAU;AACR,UAAM,cAAc,KAAK,OAAM,EAAG,KAAI;AACtC,QAAI,CAAC,aAAa;AAChB;IACF;AACA,SAAK,QAAQ,KAAK,WAAW;EAC/B;;;;;;;;;;AAxBW,4BAAyB,WAAA;EArErC,UAAU;IACT,UAAU;IACV,SAAS,CAAC,eAAe,aAAa,gBAAgB,aAAa;IACnE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEX;GACY,yBAAyB;;;AC5EtC;;;AC2EO,IAAM,8BAAN,MAAMC,6BAA2B;SACtB,MAAM,IAAI;SACV,MAAM,KAAK;SACX,MAA0B,IAAI;EAErC,UAAU,OAAM;EAChB,SAAS,OAAM;EAEf,SAAS,OAAO,oBAAK;EAE9B,cAAA;AACE,WAAO,MAAK;AACV,UAAI,KAAK,KAAI,GAAI;AACf,aAAK,OAAO,IAAI,KAAK,KAAI,GAAI,eAAe,oBAAK;MACnD;IACF,CAAC;EACH;EAEA,aAAU;AACR,UAAM,gBAAgB,KAAK,OAAM,EAAG,KAAI;AACxC,QAAI,CAAC,eAAe;AAClB;IACF;AACA,SAAK,QAAQ,KAAK,aAAa;EACjC;;;;;;;;;;AAxBW,8BAA2B,WAAA;EApEvC,UAAU;IACT,UAAU;IACV,SAAS,CAAC,eAAe,aAAa,gBAAgB,aAAa;IACnE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEX;GACY,2BAA2B;;;AC3ExC;;;ACuEO,IAAM,6BAAN,MAAMC,4BAA0B;SACrB,MAAM,KAAK;SACX,MAAM,KAAK;UACV,MAA0B,IAAI;gBACxB,MAAM,0BAAM;YAChB,MAA6B,CAAA,CAAE;EACzC,UAAU,OAAM;EAChB,SAAS,OAAM;EAEf,aAAa,OAAO,EAAE;EAE/B,cAAA;AACE,WAAO,MAAK;AACV,UAAI,KAAK,KAAI,GAAI;AACf,aAAK,WAAW,IAAI,KAAK,MAAK,GAAI,cAAc,EAAE;MACpD;IACF,CAAC;EACH;EAEA,cAAW;AACT,UAAM,QAAQ,KAAK,YAAW;AAC9B,QAAI,UAAU,gBAAM;AAClB,aAAO;IACT;AACA,QAAI,UAAU,gBAAM;AAClB,aAAO;IACT;AACA,WAAO;EACT;EAEA,cAAW;AACT,UAAM,QAAQ,KAAK,YAAW;AAC9B,QAAI,UAAU,gBAAM;AAClB,aAAO;IACT;AACA,QAAI,UAAU,gBAAM;AAClB,aAAO;IACT;AACA,WAAO;EACT;EAEA,gBAAa;AACX,QAAI,CAAC,KAAK,WAAU,GAAI;AACtB;IACF;AACA,SAAK,QAAQ,KAAK,EAAE,YAAY,KAAK,WAAU,EAAE,CAAE;EACrD;;;;;;;;;;;;AA9CW,6BAA0B,WAAA;EA9DtC,UAAU;IACT,UAAU;IACV,YAAY;IACZ,SAAS,CAAC,aAAa,gBAAgB,gBAAgB,aAAa;IACpE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAwDV,iBAAiB,wBAAwB;;GAC1C;GACY,0BAA0B;;;ACvEvC;;;ACgFO,IAAM,sCAAN,MAAMC,qCAAmC;SAC9B,MAAM,KAAK;SACX,MAAM,KAAK;UACV,MAA0B,IAAI;YAC5B,MAA6B,CAAA,CAAE;iBAC1B,MAAgC,CAAA,CAAE;EACjD,SAAS,OAAM;EACf,UAAU,OAAM;EAEhB,kBAAkB,OAAiB,CAAA,CAAE;EACrC,iBAAiB,SAAS,MAAM,KAAK,gBAAe,EAAG,WAAW,CAAC;EAEnE,gBAAgB,SAAS,MAAK;AACrC,WAAO,KAAK,QAAO,EAAG,OAAO,CAAC,WAAU;AACtC,YAAM,eAAe,KAAK,aAAY;AACtC,YAAM,OAAO,aAAa,KAAK,CAAC,QAAO;AACrC,eAAO,IAAI,WAAW,OAAO;MAC/B,CAAC;AACD,aAAO,OAAO,WAAW,KAAK,MAAK,GAAI,cAAc,CAAC;IACxD,CAAC;EACH,CAAC;EAED,cAAA;AACE,WAAO,MAAK;AACV,UAAI,CAAC,KAAK,KAAI,GAAI;AAChB;MACF;AACA,WAAK,gBAAgB,IAAI,CAAA,CAAE;IAC7B,CAAC;EACH;EAEA,gBAAa;AACX,UAAM,UAAU;MACd,GAAG,IAAI,IACL,KAAK,gBAAe,EACjB,IAAI,CAAC,SAAS,KAAK,KAAI,CAAE,EACzB,OAAO,OAAO,CAAC;;AAGtB,QAAI,QAAQ,WAAW,GAAG;AACxB;IACF;AACA,SAAK,QAAQ,KAAK,EAAE,QAAO,CAAE;EAC/B;EAEA,iBAAiB,OAAc;AAC7B,SAAK,gBAAgB,IAAI,MAAM,QAAQ,KAAK,IAAK,QAAqB,CAAA,CAAE;EAC1E;;;;;;;;;;;;AA/CW,sCAAmC,WAAA;EA/D/C,UAAU;IACT,UAAU;IACV,YAAY;IACZ,SAAS,CAAC,aAAa,gBAAgB,gBAAgB,aAAa;IACpE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAyDV,iBAAiB,wBAAwB;;GAC1C;GACY,mCAAmC;;;ACvBzC,IAAM,kBAAN,MAAMC,iBAAe;EACT,iBAAiB,OAAO,cAAc;EACtC,mBAAmB,OAAO,gBAAgB;EAC1C,sBAAsB,OAAO,mBAAmB;EAC9C,SAAS,OAAO,MAAM;EACxB,QAAQ,OAAO,cAAc;EAC7B,QAAQ,OAAO,cAAc;;EAG3B,WAAW,OAAiB,MAAM;EAClC,UAAU,KAAK,eAAe;EAC9B,SAAS,KAAK,eAAe;EAC7B,QAAQ,KAAK,eAAe;EAC5B,QAAQ,KAAK,eAAe;;EAG5B,gBAAgB,KAAK,iBAAiB;;EAEtC,mBAAmB,KAAK,iBAAiB;EACzC,oBAAoB,KAAK,iBAAiB;EAC1C,gBAAgB,KAAK,iBAAiB;EACtC,OAAO,KAAK,iBAAiB;EAC7B,UAAU,KAAK,oBAAoB;;EAGnC,yBAAyB,KAAK,iBAAiB;;EAG/C,uBAAuB,OAAO,KAAK;EACnC,yBAAyB,OAAO,KAAK;EACrC,wBAAwB,OAAO,KAAK;EACpC,iCAAiC,OAAO,KAAK;EAE7C,OAAO,OAAO,KAAK;EAEnB,kBAAkB,OAAyB,EAAE;EAEhE,cAAA;AACE,UAAM,YAAY,KAAK,oBAAoB,iBAAgB;AAC3D,SAAK,eAAe,WAAU;AAC9B,iBAAa,KAAK,oBAAoB,mBAAmB,SAAS;AAElE,SAAK,MAAM,cAAc,UAAU,CAAC,WAAU;AAC5C,YAAM,WAAW,OAAO,IAAI,QAAQ;AAEpC,UAAI,UAAU;AACZ,aAAK,iBAAiB,KAAK,QAAQ;AACnC,aAAK,KAAK,IAAI,IAAI;MACpB,OAAO;AACL,aAAK,KAAK,IAAI,KAAK;MACrB;IACF,CAAC;AAGD,QAAI;AACJ,WAAO,MAAK;AACV,YAAM,QAAQ,KAAK,eAAe,MAAK;AACvC,UAAI,OAAO;AACT,qBAAa,UAAU;AACvB,qBAAa,WAAW,MAAK;AAC3B,eAAK,eAAe,KAAI;QAC1B,GAAG,GAAG;MACR;IACF,CAAC;EACH;EAEA,aAAa,MAAY;AACvB,SAAK,eAAe,YAAY,EAAE,KAAI,CAAE;EAC1C;EAEA,iBAAiB,MAAY;AAC3B,SAAK,eAAe,YAAY,EAAE,UAAU,KAAI,CAAE;EACpD;EAEA,gBAAgB;EAChB,kBAAkB;EAElB,YAAY,OAAkB;AAC5B,SAAK,WAAW,KAAK;AACrB,SAAK,iBAAiB,KAAK,MAAM,EAAE;AACnC,SAAK,KAAK,IAAI,IAAI;EACpB;EAEA,mBAAgB;AACd,SAAK,KAAK,IAAI,KAAK;AACnB,SAAK,iBAAiB,iBAAiB,IAAI;AAC3C,SAAK,OAAO,SAAS,CAAA,GAAI;MACvB,aAAa,CAAA;KACd;EACH;;EAGA,cAAc,SAA2B;AACvC,SAAK,iBAAiB,YAAY,OAAO;EAC3C;;EAGA,cAAc,QAAuB;AACnC,YAAQ,QAAQ;MACd,KAAK;AACH;MACF,KAAK,SAAS;AACZ,aAAK,aAAY;AACjB;MACF;MACA,KAAK,SAAS;AACZ,aAAK,aAAY;AACjB;MACF;MACA,KAAK,UAAU;AACb,aAAK,sBAAsB,IAAI,IAAI;AACnC;MACF;MACA,KAAK,eAAe;AAClB,aAAK,qBAAoB;AACzB;MACF;MACA,KAAK,WAAW;AACd,aAAK,uBAAuB,IAAI,IAAI;AACpC;MACF;MACA,KAAK;AACH;MACF,KAAK;AACH;MACF,KAAK,SAAS;AACZ,aAAK,qBAAqB,IAAI,IAAI;AAClC;MACF;MACA,KAAK,oBAAoB;AACvB,aAAK,+BAA+B,IAAI,IAAI;AAC5C;MACF;MACA,KAAK;AACH;IACJ;EACF;EAEA,WAAW,MAAiB;AAC1B,SAAK,OAAO,SAAS,CAAA,GAAI;MACvB,YAAY,KAAK;MACjB,aAAa,EAAE,QAAQ,KAAK,GAAE;MAC9B,qBAAqB;KACtB;EACH;EAEQ,eAAY;AAClB,SAAK,MAAM,QAAQ;MACjB,SACE,KAAK,iBAAiB,MAAK,GAAI,WAAW,mBACtC,iEACA;MACN,WACE,KAAK,iBAAiB,MAAK,GAAI,WAAW,mBACtC,+IACA;MACN,UACE,KAAK,iBAAiB,MAAK,GAAI,WAAW,mBAAmB,6BAAS;MACxE,cAAc;MACd,QAAQ,MAAM,KAAK,iBAAiB,MAAK;KAC1C;EACH;EAEQ,eAAY;AAClB,SAAK,MAAM,QAAQ;MACjB,SAAS;MACT,WAAW;MACX,QAAQ,MAAK;AACX,aAAK,iBAAiB,MAAK;MAC7B;KACD;EACH;EAEQ,uBAAoB;AAC1B,SAAK,MAAM,QAAQ;MACjB,SAAS;MACT,WAAW;MACX,UAAU;MACV,cAAc;MACd,QAAQ,MAAM,KAAK,iBAAiB,cAAa;KAClD;EACH;EAEA,aAAa,QAAc;EAE3B;EAEA,eAAe,SAAe;AAC5B,SAAK,iBAAiB,QAAQ,OAAO;AACrC,SAAK,uBAAuB,IAAI,KAAK;EACvC;EAEA,cAAcC,QAAuB;AACnC,SAAK,iBAAiB,OAAOA,MAAK;AAClC,SAAK,sBAAsB,IAAI,KAAK;EACtC;EAEA,uBAAuBA,QAA2B;AAChD,SAAK,iBAAiB,gBAAgBA,MAAK;AAC3C,SAAK,+BAA+B,IAAI,KAAK;EAC/C;EAEA,kBAAkB,eAAqB;AACrC,SAAK,iBAAiB,kBAAkB,aAAa;EACvD;EAEA,qBAAkB;AAChB,SAAK,sBAAsB,IAAI,KAAK;EACtC;EAEA,+BAA4B;AAC1B,SAAK,+BAA+B,IAAI,KAAK;EAC/C;EAEA,oBAAiB;AACf,SAAK,qBAAqB,IAAI,KAAK;EACrC;EAEA,sBAAmB;AACjB,SAAK,uBAAuB,IAAI,KAAK;EACvC;EAEA,aAAa,QAAwB;AACnC,SAAK,eAAe,YAAY,EAAE,OAAM,CAAE;EAC5C;EAEA,eAAe,UAAqB;AAClC,SAAK,eAAe,YAAY,EAAE,SAAQ,CAAE;EAC9C;EAEA,cAAc,SAAe;AAC3B,SAAK,eAAe,YAAY,EAAE,QAAO,CAAE;EAC7C;;;AAxOW,kBAAe,WAAA;EAtB3B,UAAU;IACT,UAAU;IACV,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;IAEF,UAAA;IAEA,WAAW,CAAC,gBAAgB,gBAAgB;;GAC7C;GACY,eAAe;;;ACpD5B,IAAM,SAAiB,CAAC,EAAE,MAAM,IAAI,WAAW,gBAAe,CAAE;AAMzD,IAAM,sBAAN,MAAMC,qBAAmB;;AAAnB,sBAAmB,WAAA;EAJ/B,SAAS;IACR,SAAS,CAAC,cAAc,aAAa,SAAS,MAAM,CAAC;IACrD,SAAS,CAAC,YAAY;GACvB;GACY,mBAAmB;;;ACHzB,IAAM,eAAN,MAAMC,cAAY;;AAAZ,eAAY,WAAA;EAJxB,SAAS;IACR,cAAc,CAAA;IACd,SAAS,CAAC,cAAc,mBAAmB;GAC5C;GACY,YAAY;","names":["issues_component_default","IssueTokenApiService","IssueApiService","input","IssueListStore","IssuesListTableComponent","IssuePermissionService","IssueDetailStore","comment","input","IssueActionAreaComponent","AttachmentViewerComponent","IssueAttachmentAreaComponent","IssueBaseInfoAreaComponent","IssueCollaboratorsAreaComponent","status","EllipsisTextComponent","IssueCommentAreaComponent","member","markdown_viewer_component_default","MarkdownViewerComponent","IssueDescriptionAreaComponent","IssueBranchesComponent","IssueStartOwnBranchDialogComponent","IssueCreateBranchDialogComponent","IssueDetailComponent","input","IssueCloseDialogComponent","IssueResolveDialogComponent","IssueAssignDialogComponent","IssueAddParticipantsDialogComponent","IssuesComponent","input","IssuesRoutingModule","IssuesModule"],"x_google_ignoreList":[23,24,25]}
|