@profoundlogic/coderflow-server 0.4.2 → 0.4.5
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/README.md +1 -1
- package/dist/README.md +1 -1
- package/dist/base-image/entrypoint.sh +2 -1
- package/dist/coder-server.js +1 -1
- package/dist/config.js +1 -1
- package/dist/lib/agent-keepalive.js +1 -1
- package/dist/lib/agent-models.js +1 -1
- package/dist/lib/api-keys.js +1 -1
- package/dist/lib/apiKeys.js +1 -1
- package/dist/lib/app-server-ports.js +1 -1
- package/dist/lib/auto-judge.js +1 -1
- package/dist/lib/automation-service.js +1 -0
- package/dist/lib/basic-auth.js +1 -1
- package/dist/lib/bindings.js +1 -0
- package/dist/lib/build-history.js +1 -1
- package/dist/lib/build-output-service.js +1 -1
- package/dist/lib/build-scheduler.js +1 -1
- package/dist/lib/build-service.js +1 -1
- package/dist/lib/ca-certificates.js +1 -1
- package/dist/lib/claude-oauth-refresh.js +1 -1
- package/dist/lib/cli/build.js +1 -1
- package/dist/lib/cli/config-command.js +1 -1
- package/dist/lib/cli/config.js +1 -1
- package/dist/lib/cli/create-user.js +1 -1
- package/dist/lib/cli/init.js +1 -1
- package/dist/lib/cli/jira.js +1 -1
- package/dist/lib/cli/license.js +1 -1
- package/dist/lib/cli/server-manager.js +1 -1
- package/dist/lib/config-migration.js +1 -1
- package/dist/lib/container-credential-sync.js +1 -1
- package/dist/lib/container-tokens.js +1 -1
- package/dist/lib/data-dir.js +1 -1
- package/dist/lib/deployment-history.js +1 -1
- package/dist/lib/deployment-service.js +1 -1
- package/dist/lib/docker-utils.js +1 -1
- package/dist/lib/email.js +1 -1
- package/dist/lib/emailTemplates.js +1 -1
- package/dist/lib/entitlement.js +1 -1
- package/dist/lib/fetch-utils.js +1 -1
- package/dist/lib/git-askpass.sh +16 -0
- package/dist/lib/git-commit-details-route.js +1 -1
- package/dist/lib/git-history-diff-guardrails.js +1 -1
- package/dist/lib/git-provider-service.js +1 -1
- package/dist/lib/git-provider-setup/github-setup-handler.js +1 -1
- package/dist/lib/git-provider-setup/index.js +1 -1
- package/dist/lib/git-provider-setup/setup-factory.js +1 -1
- package/dist/lib/git-provider-setup/setup-interface.js +1 -1
- package/dist/lib/git-providers/azure-devops-provider.js +1 -1
- package/dist/lib/git-providers/github-app-provider.js +1 -1
- package/dist/lib/git-providers/index.js +1 -1
- package/dist/lib/git-providers/provider-factory.js +1 -1
- package/dist/lib/git-providers/provider-interface.js +1 -1
- package/dist/lib/github-urls.js +1 -1
- package/dist/lib/group-objective-linking.js +1 -1
- package/dist/lib/jira-client.js +1 -1
- package/dist/lib/judge-blinding.js +1 -1
- package/dist/lib/logger.js +1 -1
- package/dist/lib/migration-to-scoped-rbac.js +1 -0
- package/dist/lib/model-fetcher.js +1 -1
- package/dist/lib/notifications.js +1 -1
- package/dist/lib/objective-context.js +1 -1
- package/dist/lib/oidc-auth.js +1 -1
- package/dist/lib/oidc-device-flow.js +1 -1
- package/dist/lib/passwordTokens.js +1 -1
- package/dist/lib/permission-resolver.js +1 -0
- package/dist/lib/pin-cascade.js +1 -1
- package/dist/lib/provider-accounts.js +1 -1
- package/dist/lib/provider-oauth.js +1 -1
- package/dist/lib/provider-profile.js +1 -1
- package/dist/lib/provider-token-refresh.js +1 -1
- package/dist/lib/request-url.js +1 -1
- package/dist/lib/rewind.js +1 -1
- package/dist/lib/role-definitions.js +1 -0
- package/dist/lib/roles.js +1 -1
- package/dist/lib/secrets.js +1 -1
- package/dist/lib/setup-repo-git-auth.js +1 -1
- package/dist/lib/state-capture.js +1 -1
- package/dist/lib/static-files.js +1 -1
- package/dist/lib/task-name-format.js +1 -1
- package/dist/lib/task-name-generator.js +1 -1
- package/dist/lib/task-source-metadata.js +1 -0
- package/dist/lib/teams.js +1 -0
- package/dist/lib/user-git-oauth.js +1 -1
- package/dist/lib/user-git-tokens.js +1 -1
- package/dist/lib/users.js +1 -1
- package/dist/middleware/requireAuth.js +1 -1
- package/dist/middleware/requireInit.js +1 -1
- package/dist/middleware/requirePermission.js +1 -1
- package/dist/package-lock.json +211 -21
- package/dist/package.json +3 -1
- package/dist/playwright.config.js +1 -0
- package/dist/routes/apiKeys.js +1 -1
- package/dist/routes/auth-oidc.js +1 -1
- package/dist/routes/auth.js +1 -1
- package/dist/routes/automations.js +1 -0
- package/dist/routes/bindings.js +1 -0
- package/dist/routes/build.js +1 -1
- package/dist/routes/containers.js +1 -1
- package/dist/routes/deploy-task.js +1 -1
- package/dist/routes/environment-management.js +1 -1
- package/dist/routes/environments.js +1 -1
- package/dist/routes/external-skills.js +1 -1
- package/dist/routes/git-credentials.js +1 -1
- package/dist/routes/git-oauth.js +1 -1
- package/dist/routes/git-provider-setup.js +1 -1
- package/dist/routes/health.js +1 -1
- package/dist/routes/jira.js +1 -1
- package/dist/routes/objective-management.js +1 -1
- package/dist/routes/password.js +1 -1
- package/dist/routes/prompt.js +1 -1
- package/dist/routes/provider-auth.js +1 -1
- package/dist/routes/qa.js +1 -1
- package/dist/routes/roles.js +1 -0
- package/dist/routes/settings.js +1 -1
- package/dist/routes/skill-management.js +1 -1
- package/dist/routes/skills.js +1 -1
- package/dist/routes/tasks.js +1 -1
- package/dist/routes/teams.js +1 -0
- package/dist/routes/templates.js +1 -1
- package/dist/routes/test-task.js +1 -1
- package/dist/routes/test.js +1 -1
- package/dist/routes/users.js +1 -1
- package/dist/routes/visualizations.js +1 -1
- package/dist/scripts/create-user.js +1 -1
- package/dist/scripts/migrate-config-to-data-dir.js +1 -1
- package/dist/scripts/migrate-to-scoped-rbac.js +2 -0
- package/dist/start.js +1 -1
- package/dist/start.js.bak +1381 -0
- package/dist/web-ui/public/activity-detail-modal.js +1 -1
- package/dist/web-ui/public/activity-feed.js +1 -1
- package/dist/web-ui/public/activity-formatters.js +1 -1
- package/dist/web-ui/public/agent-event-parser.js +1 -1
- package/dist/web-ui/public/app.js +1 -1
- package/dist/web-ui/public/approve-dialog.js +1 -1
- package/dist/web-ui/public/automation-links.js +1 -0
- package/dist/web-ui/public/automation-schedule.js +1 -0
- package/dist/web-ui/public/comments-widget.js +1 -1
- package/dist/web-ui/public/diff-utils.js +1 -1
- package/dist/web-ui/public/docs/_sidebar.md +1 -0
- package/dist/web-ui/public/docs/admin/automations.md +75 -0
- package/dist/web-ui/public/docs/admin/git-providers.md +10 -5
- package/dist/web-ui/public/docs/admin/installation.md +1 -1
- package/dist/web-ui/public/docs/admin/users-and-roles.md +14 -4
- package/dist/web-ui/public/environments.css +253 -125
- package/dist/web-ui/public/environments.html +366 -2
- package/dist/web-ui/public/environments.js +1 -1
- package/dist/web-ui/public/feedback-widget.css +42 -0
- package/dist/web-ui/public/feedback-widget.js +1 -1
- package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
- package/dist/web-ui/public/git-history.html +15 -0
- package/dist/web-ui/public/git-history.js +1 -1
- package/dist/web-ui/public/git-status.js +1 -1
- package/dist/web-ui/public/index.html +27 -0
- package/dist/web-ui/public/index.js +1 -1
- package/dist/web-ui/public/login.js +1 -1
- package/dist/web-ui/public/markdown-editor.js +1 -1
- package/dist/web-ui/public/markdown-file-editor.js +1 -1
- package/dist/web-ui/public/modal-maximize.js +1 -1
- package/dist/web-ui/public/notifications.js +1 -1
- package/dist/web-ui/public/pr-dialog.js +1 -1
- package/dist/web-ui/public/roles.html +247 -0
- package/dist/web-ui/public/roles.js +1 -0
- package/dist/web-ui/public/server-health.js +1 -1
- package/dist/web-ui/public/settings.html +84 -1
- package/dist/web-ui/public/settings.js +1 -1
- package/dist/web-ui/public/setup-password.js +1 -1
- package/dist/web-ui/public/skills.css +6 -0
- package/dist/web-ui/public/skills.html +35 -0
- package/dist/web-ui/public/skills.js +1 -1
- package/dist/web-ui/public/sse-client.js +1 -1
- package/dist/web-ui/public/sse-shared-worker.js +1 -1
- package/dist/web-ui/public/styles.css +278 -161
- package/dist/web-ui/public/task.html +33 -2
- package/dist/web-ui/public/task.js +1 -1
- package/dist/web-ui/public/teams.html +285 -0
- package/dist/web-ui/public/teams.js +1 -0
- package/dist/web-ui/public/terminal.js +1 -1
- package/dist/web-ui/public/theme.js +1 -1
- package/dist/web-ui/public/users.html +87 -29
- package/dist/web-ui/public/users.js +1 -1
- package/dist/web-ui/public/variant-grouping.js +1 -1
- package/package.json +7 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x220d4b=_0x1195;function _0x5290(){const _0x5ac761=['C2v0qxr0CMLIDxrL','ywrK','lI4U','zgLZAY11C2fNzq','D2fYBMLUzW','y29UDgfPBMvYCW','u3rVChbPBMCGy29UDgfPBMvYCW','zg9JA2vYlwnVBNrHAw5LCNm','zg9JA2vYlxn0B3jHz2uTyNvPBgrJywnOzq','CM91BMq','zgLZAY1WCM9NCMvZCW','tg9HzgLUzYbZzxj2zxiGBwv0CMLJCW','C2vYDMvYlwHLywX0Ac1Hy3rPB24TC3rHDhvZ','Dxb0Aw1L','y2XLyw51Cc1JB250zw50','zxjYB3i','y2XLyw51Cc10B2DNBgu','yNvPBgrdywnOzq','zgLZywjSzwq','rMfPBgvKihrVigXVywqGBwv0CMLJCZOG','A2v5zg93BG','BwvZC2fNzq','BwvTB3j5lxvZywDL','nJeYode3mKXXuwDTqG','yxbWzw5Kq2HPBgq','ignVBxbSzxrLza','C2vYDMvYlwHLywX0Ac1VAW','Bwf4','y2XLyw51Cc1Zzwn0Aw9U','BwvTB3j5','mZu5nZm2EffMBeTm','yxzHAwXHyMXLrgLZCgXHEq','uMvTB3zPBMCGC3rVChbLzcbJB250ywLUzxjZ','ywn0AxzLlxnLC3nPB25Z','C3rHDhvZlxDHCM5PBMC','C2vYDMvYlwHLywX0Ac1JBg9Zzq','D2LKDgG','CgvYy2vUDa','zgLZAW','C2vYDMvYlwHLywX0Ac1TB2rHBa','y3b1lxbYB2DYzxnZ','yxjPys1LEhbHBMrLza','r0vu','B25JBgLJAW','AxngAw5PDgu','zg9JA2vYlxn0B3jHz2uTAw1Hz2vZ','BwLU','ndznrgf5yK4','y2XHC3nmAxn0','zxHWyw5Kzwq','Aw5JBhvKzq','CgfYzw50rwXLBwvUDa','y3b1','C2vZC2LVBNm','mJy1nteZnwnSs0r3DG','mZKWn1H6EwH2EG','zg9JA2vYlxn0B3jHz2uTDM9SDw1LCW','C2vYDMvYlwHLywX0Ac1YzwzYzxnO','B3bLBLnLCNzLCKHLywX0Ae1VzgfS','lM1VzgfSlw92zxjSyxK','mJuZtxzSALrP','mZvOCfv5yMS','C3vJy2vZCW','nJy0mhfzvMDwBG','Dg9mB3DLCKnHC2u','y3jPDgLJywW','C3rHDhvZlwnYAxrPy2fS','zgL2','z2v0rwXLBwvUDej5swq','C2vYDMvYlxvWDgLTzq','zg9JA2vYlxn0B3jHz2uTCMvJBgfPBwfIBgu','ywrKrxzLBNrmAxn0zw5LCG','zg9JA2vYu3rVCMfNzq','Aw5Uzxjive1m','Aw1Hz2vZ','ody1ndbvrLvTsee','zgLZCgXHEq','C2vYDMvYlwHLywX0Ac1LCNjVCG','C3rVCefSBenVBNrHAw5LCNm','ndqWota2n0fKs1fzyq','Dg90ywW','C3rHDhvZ','Dgv4DenVBNrLBNq','zg9JA2vYlxn0B3jHz2uTy29UDgfPBMvYCW','C3r5Bgu','CMvTB3zLu3rVChbLzenVBNrHAw5LCNm','zg9JA2vY','zg9JA2vYlxn0B3jHz2uTy2fYza','zMfSC2u','C2vYDMvYlwHLywX0Ac1SB2fKAw5N','nZi5owDNC1HoCW','AgLKzgvU','mZjHwenXuem','rMfPBgvKihrVigXVywqGC2vYDMvYigHLywX0AcbTzxrYAwnZoG','CMvTB3zL','yxjPys12ywX1zw5VDW','CNvUBMLUzW','CMvJBgfPBwfIBgveAxnWBgf5','zg9JA2vYlxbYB2DYzxnZ','y3b1lxvZywDL','CMvTB3zLrxzLBNrmAxn0zw5LCG','Dg9Nz2XL'];_0x5290=function(){return _0x5ac761;};return _0x5290();}(function(_0x57ae5f,_0x3ce0ea){const _0x168578=_0x1195,_0x2f3e75=_0x57ae5f();while(!![]){try{const _0x27d090=parseInt(_0x168578(0x1a4))/0x1*(-parseInt(_0x168578(0x19c))/0x2)+-parseInt(_0x168578(0x1bc))/0x3+-parseInt(_0x168578(0x1b8))/0x4*(parseInt(_0x168578(0x1aa))/0x5)+parseInt(_0x168578(0x184))/0x6+parseInt(_0x168578(0x1a3))/0x7*(parseInt(_0x168578(0x1c9))/0x8)+parseInt(_0x168578(0x1c7))/0x9*(-parseInt(_0x168578(0x1ac))/0xa)+-parseInt(_0x168578(0x1a9))/0xb*(-parseInt(_0x168578(0x18b))/0xc);if(_0x27d090===_0x3ce0ea)break;else _0x2f3e75['push'](_0x2f3e75['shift']());}catch(_0x570715){_0x2f3e75['push'](_0x2f3e75['shift']());}}}(_0x5290,0xeee91));import{API}from'./app.js';let modalInjected=![];const SERVER_HEALTH_MODAL_HTML='\x0a<div\x20id=\x22server-health-modal\x22\x20class=\x22modal\x22\x20hidden>\x0a\x20\x20<div\x20class=\x22modal-overlay\x22></div>\x0a\x20\x20<div\x20class=\x22modal-content\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22modal-header\x22>\x0a\x20\x20\x20\x20\x20\x20<h2>Server\x20Health</h2>\x0a\x20\x20\x20\x20\x20\x20<button\x20type=\x22button\x22\x20class=\x22modal-close\x22\x20id=\x22server-health-close\x22\x20aria-label=\x22Close\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2224\x22\x20height=\x2224\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<line\x20x1=\x2218\x22\x20y1=\x226\x22\x20x2=\x226\x22\x20y2=\x2218\x22></line>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<line\x20x1=\x226\x22\x20y1=\x226\x22\x20x2=\x2218\x22\x20y2=\x2218\x22></line>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20class=\x22modal-body\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20id=\x22server-health-loading\x22\x20class=\x22loading\x22>Loading\x20server\x20metrics</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20id=\x22server-health-error\x22\x20class=\x22error-message\x22\x20hidden></div>\x0a\x20\x20\x20\x20\x20\x20<div\x20id=\x22server-health-content\x22\x20hidden>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22health-metrics\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-icon\x22>💻</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-details\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-label\x22>CPU\x20Usage</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20id=\x22cpu-usage\x22>-</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-progress\x22\x20role=\x22progressbar\x22\x20aria-label=\x22CPU\x20usage\x22\x20aria-valuemin=\x220\x22\x20aria-valuemax=\x22100\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-progress-fill\x22\x20id=\x22cpu-progress\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-icon\x22>🧠</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-details\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-label\x22>Memory\x20Usage</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20id=\x22memory-usage\x22>-</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-progress\x22\x20role=\x22progressbar\x22\x20aria-label=\x22Memory\x20usage\x22\x20aria-valuemin=\x220\x22\x20aria-valuemax=\x22100\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-progress-fill\x22\x20id=\x22memory-progress\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-icon\x22>💾</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-details\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-label\x22>Disk\x20Usage</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20id=\x22disk-usage\x22>-</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-progress\x22\x20role=\x22progressbar\x22\x20aria-label=\x22Disk\x20usage\x22\x20aria-valuemin=\x220\x22\x20aria-valuemax=\x22100\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-progress-fill\x22\x20id=\x22disk-progress\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-icon\x22>🐳</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-details\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-label\x22>Docker\x20Containers</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20id=\x22docker-containers\x22>-</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-progress\x22\x20role=\x22progressbar\x22\x20aria-label=\x22Running\x20containers\x20ratio\x22\x20aria-valuemin=\x220\x22\x20aria-valuemax=\x22100\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-progress-fill\x22\x20id=\x22docker-progress\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-card\x20metric-card-wide\x22\x20id=\x22docker-storage-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-icon\x22>📦</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-details\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-label\x22>Docker\x20Storage</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20id=\x22docker-storage-total\x22>-</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-progress\x22\x20id=\x22docker-storage-progress-wrap\x22\x20role=\x22progressbar\x22\x20aria-label=\x22Docker\x20storage\x20usage\x22\x20aria-valuemin=\x220\x22\x20aria-valuemax=\x22100\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-progress-fill\x22\x20id=\x22docker-storage-progress\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-sub\x22\x20id=\x22docker-storage-available\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-sub\x22\x20id=\x22docker-storage-reclaimable\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22docker-storage-breakdown\x22\x20id=\x22docker-storage-breakdown\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22storage-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22storage-label\x22>Images:</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22storage-value\x22\x20id=\x22docker-storage-images\x22>-</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22storage-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22storage-label\x22>Containers:</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22storage-value\x22\x20id=\x22docker-storage-containers\x22>-</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22storage-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22storage-label\x22>Volumes:</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22storage-value\x22\x20id=\x22docker-storage-volumes\x22>-</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22storage-item\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22storage-label\x22>Build\x20Cache:</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22storage-value\x22\x20id=\x22docker-storage-buildcache\x22>-</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-icon\x22>⏱️</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-details\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-label\x22>Server\x20Uptime</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20id=\x22server-uptime\x22>-</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-icon\x22>📡</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-details\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-label\x22>User\x20Sessions</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20id=\x22active-sessions\x22>-</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22health-actions\x20collapsible-section\x22\x20id=\x22cleanup-section\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20type=\x22button\x22\x20class=\x22health-actions-header\x20collapsible-toggle\x22\x20id=\x22cleanup-toggle\x22\x20aria-expanded=\x22false\x22\x20aria-controls=\x22cleanup-content\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22health-actions-title\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20class=\x22collapse-chevron\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<polyline\x20points=\x229\x2018\x2015\x2012\x209\x206\x22></polyline>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Clean\x20Up\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20id=\x22server-health-action-status\x22\x20class=\x22health-action-status\x22\x20aria-live=\x22polite\x22\x20hidden></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22collapsible-content\x22\x20id=\x22cleanup-content\x22\x20hidden>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-cards\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-icon\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2224\x22\x20height=\x2224\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<rect\x20x=\x223\x22\x20y=\x223\x22\x20width=\x2218\x22\x20height=\x2218\x22\x20rx=\x222\x22\x20ry=\x222\x22></rect>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<line\x20x1=\x229\x22\x20y1=\x229\x22\x20x2=\x2215\x22\x20y2=\x2215\x22></line>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<line\x20x1=\x2215\x22\x20y1=\x229\x22\x20x2=\x229\x22\x20y2=\x2215\x22></line>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-content\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-title\x22>Stop\x20All\x20Containers</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-description\x22>Gracefully\x20stop\x20all\x20running\x20Docker\x20containers.\x20Active\x20coding\x20sessions\x20will\x20be\x20terminated.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20type=\x22button\x22\x20class=\x22btn-secondary\x20cleanup-card-btn\x22\x20id=\x22server-stop-containers\x22>Stop</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-icon\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2224\x22\x20height=\x2224\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<polyline\x20points=\x223\x206\x205\x206\x2021\x206\x22></polyline>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M19\x206v14a2\x202\x200\x200\x201-2\x202H7a2\x202\x200\x200\x201-2-2V6m3\x200V4a2\x202\x200\x200\x201\x202-2h4a2\x202\x200\x200\x201\x202\x202v2\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-content\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-title\x22>Remove\x20Stopped\x20Containers</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-description\x22>Delete\x20all\x20stopped\x20containers\x20to\x20free\x20up\x20disk\x20space.\x20This\x20cannot\x20be\x20undone.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20type=\x22button\x22\x20class=\x22btn-secondary\x20cleanup-card-btn\x22\x20id=\x22server-remove-stopped\x22>Remove</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card\x20cleanup-card-danger\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-icon\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2224\x22\x20height=\x2224\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12\x202L2\x207l10\x205\x2010-5-10-5z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M2\x2017l10\x205\x2010-5\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M2\x2012l10\x205\x2010-5\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-content\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-title\x22>Docker\x20System\x20Prune</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22cleanup-card-description\x22>Remove\x20all\x20stopped\x20containers,\x20unused\x20networks,\x20dangling\x20images,\x20and\x20build\x20cache.\x20Frees\x20significant\x20disk\x20space.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20type=\x22button\x22\x20class=\x22btn-danger\x20cleanup-card-btn\x22\x20id=\x22server-prune-docker\x22>Prune</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20class=\x22modal-actions\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20type=\x22button\x22\x20id=\x22server-health-refresh\x22\x20class=\x22btn-secondary\x22>Refresh</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20type=\x22button\x22\x20id=\x22server-health-ok\x22\x20class=\x22btn-primary\x22>OK</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a</div>\x0a';function ensureModalExists(){const _0xb0a1c7=_0x1195;if(modalInjected||document[_0xb0a1c7(0x1b1)](_0xb0a1c7(0x194)))return;const _0x99ddc6=document['createElement'](_0xb0a1c7(0x1b0));_0x99ddc6[_0xb0a1c7(0x1b6)]=SERVER_HEALTH_MODAL_HTML,document['body'][_0xb0a1c7(0x185)](_0x99ddc6['firstElementChild']),modalInjected=!![];}function clampPercent(_0x45a3be){const _0x17d107=_0x1195;if(!Number[_0x17d107(0x199)](_0x45a3be))return 0x0;return Math[_0x17d107(0x188)](0x0,Math[_0x17d107(0x19b)](0x64,Math[_0x17d107(0x176)](_0x45a3be)));}function setMetricProgress(_0x38c886,_0x399760,_0x187cbf='ok'){const _0x3412e3=_0x1195,_0x51076b=document[_0x3412e3(0x1b1)](_0x38c886);if(!_0x51076b)return;const _0x435b64=_0x51076b[_0x3412e3(0x1a0)],_0x174bd8=clampPercent(_0x399760);_0x51076b[_0x3412e3(0x1c1)][_0x3412e3(0x191)]=_0x174bd8+'%',_0x51076b[_0x3412e3(0x19d)][_0x3412e3(0x165)]('status-ok',_0x3412e3(0x18f),_0x3412e3(0x1af)),_0x51076b[_0x3412e3(0x19d)][_0x3412e3(0x16e)](_0x187cbf===_0x3412e3(0x1ae)?_0x3412e3(0x1af):_0x187cbf===_0x3412e3(0x171)?_0x3412e3(0x18f):'status-ok'),_0x435b64&&_0x435b64[_0x3412e3(0x16d)](_0x3412e3(0x166),String(_0x174bd8));}function statusFromPercent(_0x1fc291){const _0x1cd484=_0x1195;if(_0x1fc291>=0x5a)return _0x1cd484(0x1ae);if(_0x1fc291>=0x4b)return'warning';return'ok';}async function loadServerHealthMetrics(){const _0x214b8f=_0x1195,_0x49dbb3=document[_0x214b8f(0x1b1)](_0x214b8f(0x1c6)),_0x24359a=document[_0x214b8f(0x1b1)](_0x214b8f(0x1ba)),_0x535fda=document[_0x214b8f(0x1b1)]('server-health-content');if(!_0x49dbb3||!_0x24359a||!_0x535fda)return;_0x49dbb3[_0x214b8f(0x1bf)]=_0x214b8f(0x178);try{const _0x484f06=await fetch('/health/metrics',{'method':_0x214b8f(0x197),'headers':{'Content-Type':'application/json'},'credentials':_0x214b8f(0x19f)});if(!_0x484f06['ok'])throw new Error(_0x214b8f(0x180)+_0x484f06['statusText']);const _0x22b432=await _0x484f06['json']();document[_0x214b8f(0x1b1)](_0x214b8f(0x16a))[_0x214b8f(0x1bf)]=_0x22b432[_0x214b8f(0x1a1)][_0x214b8f(0x1b9)],document['getElementById'](_0x214b8f(0x183))[_0x214b8f(0x1bf)]=_0x22b432[_0x214b8f(0x18a)][_0x214b8f(0x1b9)],document[_0x214b8f(0x1b1)](_0x214b8f(0x170))[_0x214b8f(0x1bf)]=_0x22b432[_0x214b8f(0x193)][_0x214b8f(0x1b9)],document['getElementById'](_0x214b8f(0x174))['textContent']=_0x22b432[_0x214b8f(0x1c3)][_0x214b8f(0x1b9)],document[_0x214b8f(0x1b1)](_0x214b8f(0x1b2))[_0x214b8f(0x1bf)]=_0x22b432[_0x214b8f(0x17a)][_0x214b8f(0x1b9)],document[_0x214b8f(0x1b1)](_0x214b8f(0x18e))[_0x214b8f(0x1bf)]=_0x22b432[_0x214b8f(0x1a2)][_0x214b8f(0x1b9)],setMetricProgress(_0x214b8f(0x195),_0x22b432['cpu']['percent'],statusFromPercent(_0x22b432[_0x214b8f(0x1a1)]['percent'])),setMetricProgress('memory-progress',_0x22b432[_0x214b8f(0x18a)][_0x214b8f(0x192)],statusFromPercent(_0x22b432[_0x214b8f(0x18a)][_0x214b8f(0x192)])),setMetricProgress(_0x214b8f(0x177),_0x22b432[_0x214b8f(0x193)][_0x214b8f(0x192)],statusFromPercent(_0x22b432[_0x214b8f(0x193)][_0x214b8f(0x192)]));const _0x4e7a32=_0x22b432[_0x214b8f(0x1c3)]['total']>0x0?_0x22b432[_0x214b8f(0x1c3)][_0x214b8f(0x167)]/_0x22b432[_0x214b8f(0x1c3)][_0x214b8f(0x1bd)]*0x64:0x0;setMetricProgress(_0x214b8f(0x169),_0x4e7a32);if(_0x22b432[_0x214b8f(0x1b5)]){const _0x5283bd=document[_0x214b8f(0x1b1)](_0x214b8f(0x1c4));document[_0x214b8f(0x1b1)]('docker-storage-total')[_0x214b8f(0x1bf)]=_0x22b432[_0x214b8f(0x1b5)][_0x214b8f(0x1b9)];const _0xe64b57=document['getElementById']('docker-storage-available');_0x22b432[_0x214b8f(0x1b5)]['availableDisplay']?(_0xe64b57['textContent']=_0x22b432['dockerStorage'][_0x214b8f(0x18c)],_0xe64b57[_0x214b8f(0x1c8)]=![]):_0xe64b57[_0x214b8f(0x1c8)]=!![];document[_0x214b8f(0x1b1)](_0x214b8f(0x1b3))[_0x214b8f(0x1bf)]=_0x22b432[_0x214b8f(0x1b5)][_0x214b8f(0x168)],document[_0x214b8f(0x1b1)](_0x214b8f(0x19a))[_0x214b8f(0x1bf)]=_0x22b432['dockerStorage'][_0x214b8f(0x1b7)][_0x214b8f(0x1b9)],document[_0x214b8f(0x1b1)](_0x214b8f(0x1c0))['textContent']=_0x22b432['dockerStorage'][_0x214b8f(0x172)][_0x214b8f(0x1b9)],document[_0x214b8f(0x1b1)](_0x214b8f(0x1a5))[_0x214b8f(0x1bf)]=_0x22b432['dockerStorage']['volumes'][_0x214b8f(0x1b9)],document[_0x214b8f(0x1b1)](_0x214b8f(0x175))['textContent']=_0x22b432[_0x214b8f(0x1b5)][_0x214b8f(0x17e)][_0x214b8f(0x1b9)],setMetricProgress('docker-storage-progress',_0x22b432[_0x214b8f(0x1b5)][_0x214b8f(0x192)],_0x22b432['dockerStorage'][_0x214b8f(0x1be)]),_0x5283bd['classList']['remove'](_0x214b8f(0x18f),_0x214b8f(0x1af));if(_0x22b432[_0x214b8f(0x1b5)][_0x214b8f(0x1be)]===_0x214b8f(0x1ae))_0x5283bd[_0x214b8f(0x19d)]['add'](_0x214b8f(0x1af));else _0x22b432[_0x214b8f(0x1b5)][_0x214b8f(0x1be)]==='warning'&&_0x5283bd['classList']['add']('status-warning');}_0x49dbb3[_0x214b8f(0x1c8)]=!![],_0x535fda['hidden']=![];}catch(_0x4ff9d0){console['error'](_0x214b8f(0x164),_0x4ff9d0),_0x49dbb3[_0x214b8f(0x1c8)]=!![],_0x24359a[_0x214b8f(0x1c8)]=![],_0x24359a[_0x214b8f(0x1bf)]='Failed\x20to\x20load\x20server\x20metrics:\x20'+_0x4ff9d0[_0x214b8f(0x182)];}}export async function openServerHealthModal(){const _0x5174a3=_0x1195;ensureModalExists();const _0x153a85=document[_0x5174a3(0x1b1)](_0x5174a3(0x194)),_0x423a98=document[_0x5174a3(0x1b1)](_0x5174a3(0x1c6)),_0x445a5b=document[_0x5174a3(0x1b1)](_0x5174a3(0x1ba)),_0x5d9ded=document[_0x5174a3(0x1b1)]('server-health-content'),_0x6e30c8=document[_0x5174a3(0x1b1)](_0x5174a3(0x190)),_0x2a23b5=document[_0x5174a3(0x1b1)](_0x5174a3(0x187)),_0x449cf2=document[_0x5174a3(0x1b1)](_0x5174a3(0x1a6)),_0x1e321b=document['getElementById']('server-stop-containers'),_0x9bf926=document[_0x5174a3(0x1b1)]('server-remove-stopped'),_0x354302=document[_0x5174a3(0x1b1)]('server-prune-docker'),_0x201831=document[_0x5174a3(0x1b1)](_0x5174a3(0x179)),_0x44f582=document[_0x5174a3(0x1b1)](_0x5174a3(0x17d)),_0x54128b=document['getElementById'](_0x5174a3(0x17b)),_0x36637e=document['getElementById'](_0x5174a3(0x189));if(!_0x153a85)return;_0x153a85['hidden']=![],_0x423a98[_0x5174a3(0x1c8)]=![],_0x445a5b[_0x5174a3(0x1c8)]=!![],_0x5d9ded[_0x5174a3(0x1c8)]=!![];_0x201831&&(_0x201831[_0x5174a3(0x1c8)]=!![],_0x201831[_0x5174a3(0x1bf)]='',_0x201831[_0x5174a3(0x19d)]['remove']('success',_0x5174a3(0x17c)));_0x36637e&&_0x36637e[_0x5174a3(0x19d)][_0x5174a3(0x165)]('expanded');_0x54128b&&(_0x54128b[_0x5174a3(0x1c8)]=!![]);_0x44f582&&_0x44f582[_0x5174a3(0x16d)]('aria-expanded',_0x5174a3(0x1c5));const _0x2683f5=[_0x1e321b,_0x9bf926,_0x354302,_0x449cf2],_0x4c54e5=_0x3d025f=>{_0x2683f5['forEach'](_0x108cf6=>{const _0x4f385a=_0x1195;if(_0x108cf6)_0x108cf6[_0x4f385a(0x17f)]=_0x3d025f;});},_0x3fc252=(_0x4ee33c,_0x59d488='info')=>{const _0x1b3a10=_0x5174a3;if(!_0x201831)return;_0x201831['hidden']=![],_0x201831[_0x1b3a10(0x1bf)]=_0x4ee33c,_0x201831[_0x1b3a10(0x19d)]['remove'](_0x1b3a10(0x1ab),_0x1b3a10(0x17c));if(_0x59d488===_0x1b3a10(0x1ab))_0x201831['classList'][_0x1b3a10(0x16e)]('success');else _0x59d488==='error'&&_0x201831['classList'][_0x1b3a10(0x16e)](_0x1b3a10(0x17c));};await loadServerHealthMetrics();const _0x1e2758=()=>{const _0x2743d1=_0x5174a3;_0x153a85[_0x2743d1(0x1c8)]=!![],document[_0x2743d1(0x16b)](_0x2743d1(0x181),_0xaad110);},_0xaad110=_0x3ad90d=>{const _0x23a5a6=_0x5174a3;_0x3ad90d['key']==='Escape'&&!_0x153a85[_0x23a5a6(0x1c8)]&&_0x1e2758();};_0x6e30c8['onclick']=_0x1e2758,_0x2a23b5['onclick']=_0x1e2758,_0x449cf2['onclick']=async()=>{const _0x3a5390=_0x5174a3;_0x423a98['hidden']=![],_0x445a5b[_0x3a5390(0x1c8)]=!![],_0x5d9ded['hidden']=!![],await loadServerHealthMetrics();};const _0x564296=async(_0xae2eb4,_0x48d76e)=>{const _0x2fe720=_0x5174a3;_0x423a98[_0x2fe720(0x1bf)]=_0xae2eb4,_0x423a98[_0x2fe720(0x1c8)]=![],_0x445a5b[_0x2fe720(0x1c8)]=!![],_0x5d9ded[_0x2fe720(0x1c8)]=!![],_0x4c54e5(!![]),_0x3fc252(_0xae2eb4+_0x2fe720(0x16f));try{const _0x4df34b=await _0x48d76e(),_0x41a617=_0x4df34b?.[_0x2fe720(0x182)]||_0xae2eb4+_0x2fe720(0x186);_0x3fc252(_0x41a617,'success');}catch(_0x5a0bfe){console[_0x2fe720(0x17c)]('Server\x20cleanup\x20action\x20failed\x20('+_0xae2eb4+')',_0x5a0bfe),_0x3fc252(_0x5a0bfe[_0x2fe720(0x182)]||'Failed\x20while\x20'+_0xae2eb4[_0x2fe720(0x1ad)](),_0x2fe720(0x17c));}finally{await loadServerHealthMetrics(),_0x4c54e5(![]);}};_0x1e321b&&(_0x1e321b[_0x5174a3(0x198)]=()=>_0x564296(_0x5174a3(0x173),()=>API[_0x5174a3(0x1bb)]()));_0x9bf926&&(_0x9bf926['onclick']=()=>_0x564296(_0x5174a3(0x18d),()=>API[_0x5174a3(0x1c2)]()));_0x354302&&(_0x354302[_0x5174a3(0x198)]=()=>_0x564296('Pruning\x20Docker\x20resources',()=>API['pruneDockerResources']()));_0x44f582&&_0x54128b&&_0x36637e&&(_0x44f582['onclick']=()=>{const _0x1c5419=_0x5174a3,_0x3bf18f=_0x36637e['classList'][_0x1c5419(0x16c)](_0x1c5419(0x19e));_0x54128b[_0x1c5419(0x1c8)]=!_0x3bf18f,_0x44f582[_0x1c5419(0x16d)](_0x1c5419(0x196),_0x3bf18f?'true':_0x1c5419(0x1c5));});document[_0x5174a3(0x1b4)](_0x5174a3(0x181),_0xaad110);const _0x287977=_0x153a85['querySelector'](_0x5174a3(0x1a8));_0x287977&&(_0x287977[_0x5174a3(0x198)]=_0x1e2758);}export{loadServerHealthMetrics};function _0x1195(_0x38fb4b,_0x2a3649){_0x38fb4b=_0x38fb4b-0x164;const _0x529040=_0x5290();let _0x11951c=_0x529040[_0x38fb4b];if(_0x1195['uJstFO']===undefined){var _0x159dcd=function(_0x52b8a5){const _0x285b5d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x99ddc6='',_0x45a3be='';for(let _0x38c886=0x0,_0x399760,_0x187cbf,_0x51076b=0x0;_0x187cbf=_0x52b8a5['charAt'](_0x51076b++);~_0x187cbf&&(_0x399760=_0x38c886%0x4?_0x399760*0x40+_0x187cbf:_0x187cbf,_0x38c886++%0x4)?_0x99ddc6+=String['fromCharCode'](0xff&_0x399760>>(-0x2*_0x38c886&0x6)):0x0){_0x187cbf=_0x285b5d['indexOf'](_0x187cbf);}for(let _0x435b64=0x0,_0x174bd8=_0x99ddc6['length'];_0x435b64<_0x174bd8;_0x435b64++){_0x45a3be+='%'+('00'+_0x99ddc6['charCodeAt'](_0x435b64)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x45a3be);};_0x1195['XdYlWj']=_0x159dcd,_0x1195['lgAFCY']={},_0x1195['uJstFO']=!![];}const _0xd7f5f4=_0x529040[0x0],_0x29e2c9=_0x38fb4b+_0xd7f5f4,_0x5d3830=_0x1195['lgAFCY'][_0x29e2c9];return!_0x5d3830?(_0x11951c=_0x1195['XdYlWj'](_0x11951c),_0x1195['lgAFCY'][_0x29e2c9]=_0x11951c):_0x11951c=_0x5d3830,_0x11951c;}typeof window!=='undefined'&&(window[_0x220d4b(0x1a7)]=openServerHealthModal);
|
|
1
|
+
const _0x34d48f=_0x5258;(function(_0x4ae99c,_0x48d583){const _0x4005d4=_0x5258,_0x1e6e8d=_0x4ae99c();while(!![]){try{const _0x2de559=parseInt(_0x4005d4(0x96))/0x1*(parseInt(_0x4005d4(0xa1))/0x2)+-parseInt(_0x4005d4(0x6a))/0x3*(-parseInt(_0x4005d4(0xad))/0x4)+parseInt(_0x4005d4(0x76))/0x5*(parseInt(_0x4005d4(0xb0))/0x6)+parseInt(_0x4005d4(0x7d))/0x7+parseInt(_0x4005d4(0x9c))/0x8*(parseInt(_0x4005d4(0xa0))/0x9)+parseInt(_0x4005d4(0x68))/0xa+-parseInt(_0x4005d4(0xcc))/0xb;if(_0x2de559===_0x48d583)break;else _0x1e6e8d['push'](_0x1e6e8d['shift']());}catch(_0x3e5d56){_0x1e6e8d['push'](_0x1e6e8d['shift']());}}}(_0x411b,0x5cb77));import{API}from'./app.js';let modalInjected=![];const SERVER_HEALTH_MODAL_HTML=_0x34d48f(0xae);function ensureModalExists(){const _0xe29cea=_0x34d48f;if(modalInjected||document[_0xe29cea(0x93)](_0xe29cea(0xc9)))return;const _0x3513b0=document[_0xe29cea(0x6d)]('div');_0x3513b0[_0xe29cea(0x7a)]=SERVER_HEALTH_MODAL_HTML,document[_0xe29cea(0xb2)][_0xe29cea(0xa5)](_0x3513b0[_0xe29cea(0x90)]),modalInjected=!![];}function clampPercent(_0x1c354e){const _0x92e1b4=_0x34d48f;if(!Number[_0x92e1b4(0x7c)](_0x1c354e))return 0x0;return Math[_0x92e1b4(0x9e)](0x0,Math[_0x92e1b4(0x8c)](0x64,Math[_0x92e1b4(0x92)](_0x1c354e)));}function setMetricProgress(_0x3262d4,_0x2904fa,_0x25c2b7='ok'){const _0x21edff=_0x34d48f,_0x41c250=document[_0x21edff(0x93)](_0x3262d4);if(!_0x41c250)return;const _0x57abd2=_0x41c250[_0x21edff(0xbd)],_0x242073=clampPercent(_0x2904fa);_0x41c250[_0x21edff(0x8b)]['width']=_0x242073+'%',_0x41c250['classList'][_0x21edff(0x67)](_0x21edff(0x88),_0x21edff(0x8e),_0x21edff(0x7b)),_0x41c250['classList'][_0x21edff(0x6c)](_0x25c2b7===_0x21edff(0xa8)?_0x21edff(0x7b):_0x25c2b7===_0x21edff(0xac)?_0x21edff(0x8e):_0x21edff(0x88)),_0x57abd2&&_0x57abd2[_0x21edff(0x7e)](_0x21edff(0xcd),String(_0x242073));}function _0x5258(_0xf59ace,_0x14bafb){_0xf59ace=_0xf59ace-0x67;const _0x411bd2=_0x411b();let _0x5258bb=_0x411bd2[_0xf59ace];if(_0x5258['FuoNWE']===undefined){var _0x537ec7=function(_0x17abab){const _0x5aba09='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3513b0='',_0x1c354e='';for(let _0x3262d4=0x0,_0x2904fa,_0x25c2b7,_0x41c250=0x0;_0x25c2b7=_0x17abab['charAt'](_0x41c250++);~_0x25c2b7&&(_0x2904fa=_0x3262d4%0x4?_0x2904fa*0x40+_0x25c2b7:_0x25c2b7,_0x3262d4++%0x4)?_0x3513b0+=String['fromCharCode'](0xff&_0x2904fa>>(-0x2*_0x3262d4&0x6)):0x0){_0x25c2b7=_0x5aba09['indexOf'](_0x25c2b7);}for(let _0x57abd2=0x0,_0x242073=_0x3513b0['length'];_0x57abd2<_0x242073;_0x57abd2++){_0x1c354e+='%'+('00'+_0x3513b0['charCodeAt'](_0x57abd2)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1c354e);};_0x5258['kxxgOX']=_0x537ec7,_0x5258['szEDgo']={},_0x5258['FuoNWE']=!![];}const _0x3a1471=_0x411bd2[0x0],_0x39b18a=_0xf59ace+_0x3a1471,_0x27baff=_0x5258['szEDgo'][_0x39b18a];return!_0x27baff?(_0x5258bb=_0x5258['kxxgOX'](_0x5258bb),_0x5258['szEDgo'][_0x39b18a]=_0x5258bb):_0x5258bb=_0x27baff,_0x5258bb;}function _0x411b(){const _0x477362=['Bwf4','zgLZAY11C2fNzq','nJm2nti3n0DpsfPYyW','nZeWmff6quPNqq','yxbWBgLJyxrPB24VANnVBG','Dhj1zq','zg9JA2vYlxn0B3jHz2uTyxzHAwXHyMXL','yxbWzw5Kq2HPBgq','BwvTB3j5lxbYB2DYzxnZ','C2vYDMvYlxn0B3aTy29UDgfPBMvYCW','y3jPDgLJywW','ignVBxbSzxrLza','BwvZC2fNzq','A2v5zg93BG','D2fYBMLUzW','ne9rELz5Cq','cJXKAxyGAwq9iNnLCNzLCI1OzwfSDgGTBw9KywWIignSyxnZpsjTB2rHBciGAgLKzgvUpGOGidXKAxyGy2XHC3m9iM1VzgfSlw92zxjSyxKIpJWVzgL2pGOGidXKAxyGy2XHC3m9iM1VzgfSlwnVBNrLBNqIpGOGicaGpgrPDIbJBgfZCZ0IBw9KywWTAgvHzgvYiJ4kicaGicaGpgGYpLnLCNzLCIbizwfSDgG8l2GYpGOGicaGica8yNv0Dg9Uihr5Cgu9iMj1DhrVBIiGy2XHC3m9iM1VzgfSlwnSB3nLiIbPzd0IC2vYDMvYlwHLywX0Ac1JBg9ZzsiGyxjPys1SywjLBd0Iq2XVC2uIpGOGicaGicaGidXZDMCGD2LKDgG9iJi0iIbOzwLNAhq9iJi0iIb2Awv3qM94psiWidaGmJqGmJqIigzPBgW9iM5VBMuIihn0CM9Rzt0Iy3vYCMvUDenVBg9YiIbZDhjVA2uTD2LKDgG9iJiIihn0CM9Rzs1SAw5Ly2fWpsjYB3vUzciGC3rYB2TLlwXPBMvQB2LUpsjYB3vUzci+cIaGicaGicaGica8BgLUzsb4mt0ImtGIihKXpsi2iIb4mJ0InIiGEti9iJe4iJ48l2XPBMu+cIaGicaGicaGica8BgLUzsb4mt0InIiGEte9iJyIihGYpsiXociGEti9iJe4iJ48l2XPBMu+cIaGicaGicaGpc9ZDMC+cIaGicaGidWVyNv0Dg9UpGOGicaGpc9KAxy+cIaGica8zgL2ignSyxnZpsjTB2rHBc1IB2r5iJ4kicaGicaGpgrPDIbPzd0IC2vYDMvYlwHLywX0Ac1SB2fKAw5NiIbJBgfZCZ0IBg9HzgLUzYi+tg9HzgLUzYbZzxj2zxiGBwv0CMLJCZWVzgL2pGOGicaGica8zgL2igLKpsjZzxj2zxiTAgvHBhrOlwvYCM9YiIbJBgfZCZ0IzxjYB3iTBwvZC2fNzsiGAgLKzgvUpJWVzgL2pGOGicaGica8zgL2igLKpsjZzxj2zxiTAgvHBhrOlwnVBNrLBNqIigHPzgrLBJ4kicaGicaGica8zgL2ignSyxnZpsjOzwfSDgGTBwv0CMLJCYi+cIaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTy2fYzci+cIaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY1Py29UiJ7WN5k7pc9KAxy+cIaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY1KzxrHAwXZiJ4kicaGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTBgfIzwWIpKnqvsbvC2fNztWVzgL2pGOGicaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY12ywX1zsiGAwq9iMnWDs11C2fNzsi+ltWVzgL2pGOGicaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY1WCM9NCMvZCYiGCM9Szt0IChjVz3jLC3nIyxiIigfYAweTBgfIzwW9iKnqvsb1C2fNzsiGyxjPys12ywX1zw1PBJ0ImciGyxjPys12ywX1zw1HEd0ImtaWiJ4kicaGicaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY1WCM9NCMvZCY1MAwXSiIbPzd0Iy3b1lxbYB2DYzxnZiJ48l2rPDJ4kicaGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGicaGpc9KAxy+cIaGicaGicaGica8l2rPDJ4kicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY1JyxjKiJ4kicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlwLJB24IpVcFP6a8l2rPDJ4kicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlwrLDgfPBhmIpGOGicaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY1SywjLBci+twvTB3j5ifvZywDLpc9KAxy+cIaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlxzHBhvLiIbPzd0IBwvTB3j5lxvZywDLiJ4Tpc9KAxy+cIaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlxbYB2DYzxnZiIbYB2XLpsjWCM9NCMvZC2jHCIiGyxjPys1SywjLBd0ItwvTB3j5ihvZywDLiIbHCMLHlxzHBhvLBwLUpsiWiIbHCMLHlxzHBhvLBwf4psiXmdaIpGOGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlxbYB2DYzxnZlwzPBgWIigLKpsjTzw1VCNKTChjVz3jLC3mIpJWVzgL2pGOGicaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGidWVzgL2pGOGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlwnHCMqIpGOGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTAwnVBIi+8j+sVJWVzgL2pGOGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTzgv0ywLSCYi+cIaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlwXHyMvSiJ5eAxnRifvZywDLpc9KAxy+cIaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlxzHBhvLiIbPzd0IzgLZAY11C2fNzsi+ltWVzgL2pGOGicaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY1WCM9NCMvZCYiGCM9Szt0IChjVz3jLC3nIyxiIigfYAweTBgfIzwW9iKrPC2SGDxnHz2uIigfYAweTDMfSDwvTAw49iJaIigfYAweTDMfSDwvTyxG9iJeWmci+cIaGicaGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTChjVz3jLC3mTzMLSBciGAwq9iMrPC2STChjVz3jLC3mIpJWVzgL2pGOGicaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGidWVzgL2pGOGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlwnHCMqIpGOGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTAwnVBIi+8j+qSZWVzgL2pGOGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTzgv0ywLSCYi+cIaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlwXHyMvSiJ5eB2nRzxiGq29UDgfPBMvYCZWVzgL2pGOGicaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY12ywX1zsiGAwq9iMrVy2TLCI1JB250ywLUzxjZiJ4Tpc9KAxy+cIaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlxbYB2DYzxnZiIbYB2XLpsjWCM9NCMvZC2jHCIiGyxjPys1SywjLBd0IuNvUBMLUzYbJB250ywLUzxjZihjHDgLViIbHCMLHlxzHBhvLBwLUpsiWiIbHCMLHlxzHBhvLBwf4psiXmdaIpGOGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlxbYB2DYzxnZlwzPBgWIigLKpsjKB2nRzxiTChjVz3jLC3mIpJWVzgL2pGOGicaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGidWVzgL2pGOGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlwnHCMqGBwv0CMLJlwnHCMqTD2LKzsiGAwq9iMrVy2TLCI1ZDg9YywDLlwnHCMqIpGOGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTAwnVBIi+8j+tPJWVzgL2pGOGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTzgv0ywLSCYi+cIaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlwXHyMvSiJ5eB2nRzxiGu3rVCMfNztWVzgL2pGOGicaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY12ywX1zsiGAwq9iMrVy2TLCI1ZDg9YywDLlxrVDgfSiJ4Tpc9KAxy+cIaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlxbYB2DYzxnZiIbPzd0Izg9JA2vYlxn0B3jHz2uTChjVz3jLC3mTD3jHCciGCM9Szt0IChjVz3jLC3nIyxiIigfYAweTBgfIzwW9iKrVy2TLCIbZDg9YywDLihvZywDLiIbHCMLHlxzHBhvLBwLUpsiWiIbHCMLHlxzHBhvLBwf4psiXmdaIpGOGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlxbYB2DYzxnZlwzPBgWIigLKpsjKB2nRzxiTC3rVCMfNzs1WCM9NCMvZCYi+pc9KAxy+cIaGicaGicaGicaGicaGpc9KAxy+cIaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlxn1yIiGAwq9iMrVy2TLCI1ZDg9YywDLlwf2ywLSywjSzsi+pc9KAxy+cIaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlxn1yIiGAwq9iMrVy2TLCI1ZDg9YywDLlxjLy2XHAw1HyMXLiJ48l2rPDJ4kicaGicaGicaGicaGica8zgL2ignSyxnZpsjKB2nRzxiTC3rVCMfNzs1ICMvHA2rVD24IigLKpsjKB2nRzxiTC3rVCMfNzs1ICMvHA2rVD24IpGOGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IC3rVCMfNzs1PDgvTiJ4kicaGicaGicaGicaGicaGicaGphnWyw4Gy2XHC3m9iNn0B3jHz2uTBgfIzwWIpKLTywDLCZO8l3nWyw4+cIaGicaGicaGicaGicaGicaGidXZCgfUignSyxnZpsjZDg9YywDLlxzHBhvLiIbPzd0Izg9JA2vYlxn0B3jHz2uTAw1Hz2vZiJ4Tpc9ZCgfUpGOGicaGicaGicaGicaGicaGpc9KAxy+cIaGicaGicaGicaGicaGica8zgL2ignSyxnZpsjZDg9YywDLlwL0zw0IpGOGicaGicaGicaGicaGicaGica8C3bHBIbJBgfZCZ0IC3rVCMfNzs1SywjLBci+q29UDgfPBMvYCZO8l3nWyw4+cIaGicaGicaGicaGicaGicaGidXZCgfUignSyxnZpsjZDg9YywDLlxzHBhvLiIbPzd0Izg9JA2vYlxn0B3jHz2uTy29UDgfPBMvYCYi+ltWVC3bHBJ4kicaGicaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0IC3rVCMfNzs1PDgvTiJ4kicaGicaGicaGicaGicaGicaGphnWyw4Gy2XHC3m9iNn0B3jHz2uTBgfIzwWIpLzVBhvTzxm6pc9ZCgfUpGOGicaGicaGicaGicaGicaGica8C3bHBIbJBgfZCZ0IC3rVCMfNzs12ywX1zsiGAwq9iMrVy2TLCI1ZDg9YywDLlxzVBhvTzxmIpI08l3nWyw4+cIaGicaGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGicaGicaGidXKAxyGy2XHC3m9iNn0B3jHz2uTAxrLBsi+cIaGicaGicaGicaGicaGicaGidXZCgfUignSyxnZpsjZDg9YywDLlwXHyMvSiJ5cDwLSzcbdywnOztO8l3nWyw4+cIaGicaGicaGicaGicaGicaGidXZCgfUignSyxnZpsjZDg9YywDLlxzHBhvLiIbPzd0Izg9JA2vYlxn0B3jHz2uTyNvPBgrJywnOzsi+ltWVC3bHBJ4kicaGicaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGidWVzgL2pGOGicaGicaGicaGpgrPDIbJBgfZCZ0IBwv0CMLJlwnHCMqIpGOGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTAwnVBIi+4O+X77Ippc9KAxy+cIaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY1KzxrHAwXZiJ4kicaGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTBgfIzwWIpLnLCNzLCIbvChrPBwu8l2rPDJ4kicaGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTDMfSDwuIigLKpsjZzxj2zxiTDxb0Aw1LiJ4Tpc9KAxy+cIaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGpc9KAxy+cIaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTy2fYzci+cIaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY1Py29UiJ7WN5oHpc9KAxy+cIaGicaGicaGicaGidXKAxyGy2XHC3m9iM1LDhjPyY1KzxrHAwXZiJ4kicaGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTBgfIzwWIpLvZzxiGu2vZC2LVBNm8l2rPDJ4kicaGicaGicaGicaGica8zgL2ignSyxnZpsjTzxrYAwmTDMfSDwuIigLKpsjHy3rPDMuTC2vZC2LVBNmIpI08l2rPDJ4kicaGicaGicaGicaGpc9KAxy+cIaGicaGicaGica8l2rPDJ4kicaGicaGica8l2rPDJ4kicaGicaGica8zgL2ignSyxnZpsjOzwfSDgGTywn0Aw9UCYbJB2XSyxbZAwjSzs1Zzwn0Aw9UiIbPzd0Iy2XLyw51Cc1Zzwn0Aw9UiJ4kicaGicaGicaGidXIDxr0B24GDhLWzt0IyNv0Dg9UiIbJBgfZCZ0IAgvHBhrOlwfJDgLVBNmTAgvHzgvYignVBgXHChnPyMXLlxrVz2DSzsiGAwq9iMnSzwfUDxaTDg9Nz2XLiIbHCMLHlwv4CgfUzgvKpsjMywXZzsiGyxjPys1JB250CM9SCZ0Iy2XLyw51Cc1JB250zw50iJ4kicaGicaGicaGicaGpgrPDIbJBgfZCZ0IAgvHBhrOlwfJDgLVBNmTDgL0BguIpGOGicaGicaGicaGicaGidXZDMCGy2XHC3m9iMnVBgXHChnLlwnOzxzYB24IihDPzhrOpsiXnIiGAgvPz2H0psiXnIiGDMLLD0jVEd0ImcaWidi0idi0iIbMAwXSpsjUB25LiIbZDhjVA2u9iMn1CNjLBNrdB2XVCIiGC3rYB2TLlxDPzhrOpsiYiIbZDhjVA2uTBgLUzwnHCd0ICM91BMqIihn0CM9Rzs1SAw5LAM9PBJ0ICM91BMqIpGOGicaGicaGicaGicaGicaGphbVBhLSAw5LihbVAw50CZ0IosaXocaXnsaXmIa5idyIpJWVCg9SEwXPBMu+cIaGicaGicaGicaGicaGpc9ZDMC+cIaGicaGicaGicaGicaGq2XLyw4GvxakicaGicaGicaGicaGpc9KAxy+cIaGicaGicaGicaGidXKAxyGAwq9iNnLCNzLCI1OzwfSDgGTywn0Aw9Ulxn0yxr1CYiGy2XHC3m9iMHLywX0Ac1Hy3rPB24TC3rHDhvZiIbHCMLHlwXPDMu9iNbVBgL0zsiGAgLKzgvUpJWVzgL2pGOGicaGicaGicaGpc9IDxr0B24+cIaGicaGicaGica8zgL2ignSyxnZpsjJB2XSyxbZAwjSzs1JB250zw50iIbPzd0Iy2XLyw51Cc1JB250zw50iIbOAwrKzw4+cIaGicaGicaGicaGidXKAxyGy2XHC3m9iMnSzwfUDxaTy2fYzhmIpGOGicaGicaGicaGicaGidXKAxyGy2XHC3m9iMnSzwfUDxaTy2fYzci+cIaGicaGicaGicaGicaGica8zgL2ignSyxnZpsjJBgvHBNvWlwnHCMqTAwnVBIi+cIaGicaGicaGicaGicaGicaGidXZDMCGD2LKDgG9iJi0iIbOzwLNAhq9iJi0iIb2Awv3qM94psiWidaGmJqGmJqIigzPBgW9iM5VBMuIihn0CM9Rzt0Iy3vYCMvUDenVBg9YiIbZDhjVA2uTD2LKDgG9iJiIihn0CM9Rzs1SAw5Ly2fWpsjYB3vUzciGC3rYB2TLlwXPBMvQB2LUpsjYB3vUzci+cIaGicaGicaGicaGicaGicaGicaGphjLy3qGEd0ImYiGEt0ImYiGD2LKDgG9iJe4iIbOzwLNAhq9iJe4iIbYEd0ImIiGCNK9iJiIpJWVCMvJDd4kicaGicaGicaGicaGicaGicaGica8BgLUzsb4mt0IosiGEte9iJKIihGYpsiXnsiGEti9iJe1iJ48l2XPBMu+cIaGicaGicaGicaGicaGicaGicaGpgXPBMuGEde9iJe1iIb5mt0IosiGEdi9iJKIihKYpsiXnsi+pc9SAw5LpGOGicaGicaGicaGicaGicaGica8l3n2zZ4kicaGicaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0Iy2XLyw51Cc1JyxjKlwnVBNrLBNqIpGOGicaGicaGicaGicaGicaGica8zgL2ignSyxnZpsjJBgvHBNvWlwnHCMqTDgL0BguIpLn0B3aGqwXSienVBNrHAw5LCNm8l2rPDJ4kicaGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0Iy2XLyw51Cc1JyxjKlwrLC2nYAxb0Aw9UiJ5hCMfJzwz1BgX5ihn0B3aGywXSihj1BM5PBMCGrg9JA2vYignVBNrHAw5LCNmUiefJDgL2zsbJB2rPBMCGC2vZC2LVBNmGD2LSBcbIzsb0zxjTAw5HDgvKlJWVzgL2pGOGicaGicaGicaGicaGicaGpc9KAxy+cIaGicaGicaGicaGicaGica8yNv0Dg9Uihr5Cgu9iMj1DhrVBIiGy2XHC3m9iMj0BI1ZzwnVBMrHCNKGy2XLyw51Cc1JyxjKlwj0BIiGAwq9iNnLCNzLCI1ZDg9WlwnVBNrHAw5LCNmIpLn0B3a8l2j1DhrVBJ4kicaGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGicaGica8zgL2ignSyxnZpsjJBgvHBNvWlwnHCMqIpGOGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0Iy2XLyw51Cc1JyxjKlwLJB24IpGOGicaGicaGicaGicaGicaGica8C3zNihDPzhrOpsiYnciGAgvPz2H0psiYnciGDMLLD0jVEd0ImcaWidi0idi0iIbMAwXSpsjUB25LiIbZDhjVA2u9iMn1CNjLBNrdB2XVCIiGC3rYB2TLlxDPzhrOpsiYiIbZDhjVA2uTBgLUzwnHCd0ICM91BMqIihn0CM9Rzs1SAw5LAM9PBJ0ICM91BMqIpGOGicaGicaGicaGicaGicaGicaGidXWB2X5BgLUzsbWB2LUDhm9iJmGnIa1idyGmJeGnIi+pc9WB2X5BgLUzt4kicaGicaGicaGicaGicaGicaGica8Cgf0AcbKpsjnmtKGnNyXngeYidiGmcaWideTmIaYsdDHmIaYidaGmcaXltiTmLy2BtmGmfy0ytiGmIaWidaGmsaYltjOngeYidiGmcaWideGmIaYDJiIpJWVCgf0Ad4kicaGicaGicaGicaGicaGicaGpc9ZDMC+cIaGicaGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGicaGicaGidXKAxyGy2XHC3m9iMnSzwfUDxaTy2fYzc1JB250zw50iJ4kicaGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0Iy2XLyw51Cc1JyxjKlxrPDgXLiJ5szw1VDMuGu3rVChbLzcbdB250ywLUzxjZpc9KAxy+cIaGicaGicaGicaGicaGicaGidXKAxyGy2XHC3m9iMnSzwfUDxaTy2fYzc1KzxnJCMLWDgLVBIi+rgvSzxrLigfSBcbZDg9WCgvKignVBNrHAw5LCNmGDg8GzNjLzsb1CcbKAxnRihnWywnLlIbuAgLZignHBM5VDcbIzsb1BMrVBMuUpc9KAxy+cIaGicaGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGicaGicaGidXIDxr0B24GDhLWzt0IyNv0Dg9UiIbJBgfZCZ0IyNrUlxnLy29UzgfYEsbJBgvHBNvWlwnHCMqTyNrUiIbPzd0IC2vYDMvYlxjLBw92zs1ZDg9WCgvKiJ5szw1VDMu8l2j1DhrVBJ4kicaGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGicaGica8zgL2ignSyxnZpsjJBgvHBNvWlwnHCMqGy2XLyw51Cc1JyxjKlwrHBMDLCIi+cIaGicaGicaGicaGicaGica8zgL2ignSyxnZpsjJBgvHBNvWlwnHCMqTAwnVBIi+cIaGicaGicaGicaGicaGicaGidXZDMCGD2LKDgG9iJi0iIbOzwLNAhq9iJi0iIb2Awv3qM94psiWidaGmJqGmJqIigzPBgW9iM5VBMuIihn0CM9Rzt0Iy3vYCMvUDenVBg9YiIbZDhjVA2uTD2LKDgG9iJiIihn0CM9Rzs1SAw5Ly2fWpsjYB3vUzciGC3rYB2TLlwXPBMvQB2LUpsjYB3vUzci+cIaGicaGicaGicaGicaGicaGicaGphbHDgGGzd0ItteYidjmmIa3BdeWiduGmtaTns0Xmc01EIi+pc9WyxrOpGOGicaGicaGicaGicaGicaGicaGidXWyxrOigq9iK0Yide3BdeWiduGmtaTnsi+pc9WyxrOpGOGicaGicaGicaGicaGicaGicaGidXWyxrOigq9iK0YideYBdeWiduGmtaTnsi+pc9WyxrOpGOGicaGicaGicaGicaGicaGica8l3n2zZ4kicaGicaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0Iy2XLyw51Cc1JyxjKlwnVBNrLBNqIpGOGicaGicaGicaGicaGicaGica8zgL2ignSyxnZpsjJBgvHBNvWlwnHCMqTDgL0BguIpKrVy2TLCIbtExn0zw0Guhj1BMu8l2rPDJ4kicaGicaGicaGicaGicaGicaGpgrPDIbJBgfZCZ0Iy2XLyw51Cc1JyxjKlwrLC2nYAxb0Aw9UiJ5szw1VDMuGywXSihn0B3bWzwqGy29UDgfPBMvYCYWGDw51C2vKig5LDhDVCMTZlcbKyw5NBgLUzYbPBwfNzxmSigfUzcbIDwLSzcbJywnOzs4GrNjLzxmGC2LNBMLMAwnHBNqGzgLZAYbZCgfJzs48l2rPDJ4kicaGicaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGicaGicaGpgj1DhrVBIb0ExbLpsjIDxr0B24IignSyxnZpsjIDg4TzgfUz2vYignSzwfUDxaTy2fYzc1IDg4IigLKpsjZzxj2zxiTChj1BMuTzg9JA2vYiJ5qCNvUztWVyNv0Dg9UpGOGicaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGidWVzgL2pGOGicaGicaGidWVzgL2pGOGicaGica8l2rPDJ4kicaGidWVzgL2pGOGicaGpgrPDIbJBgfZCZ0IBw9KywWTywn0Aw9UCYi+cIaGicaGidXIDxr0B24GDhLWzt0IyNv0Dg9UiIbPzd0IC2vYDMvYlwHLywX0Ac1YzwzYzxnOiIbJBgfZCZ0IyNrUlxnLy29UzgfYEsi+uMvMCMvZAdWVyNv0Dg9UpGOGicaGica8yNv0Dg9Uihr5Cgu9iMj1DhrVBIiGAwq9iNnLCNzLCI1OzwfSDgGTB2SIignSyxnZpsjIDg4TChjPBwfYEsi+t0S8l2j1DhrVBJ4kicaGidWVzgL2pGOGidWVzgL2pGO8l2rPDJ4k','y2XHC3nmAxn0','mtiWse9vug9d','C3rVCefSBenVBNrHAw5LCNm','yM9KEq','zgLZywjSzwq','CgvYy2vUDa','B25JBgLJAW','r0vu','zg9JA2vYlxbYB2DYzxnZ','zg9JA2vYlxn0B3jHz2uTCMvJBgfPBwfIBgu','Dxb0Aw1L','tg9HzgLUzYbZzxj2zxiGBwv0CMLJCW','zM9YrwfJAa','ywrKrxzLBNrmAxn0zw5LCG','CgfYzw50rwXLBwvUDa','zg9JA2vYlwnVBNrHAw5LCNm','yNvPBgrdywnOzq','CxvLCNLtzwXLy3rVCG','B3bLBLnLCNzLCKHLywX0Ae1VzgfS','u3rVChbPBMCGy29UDgfPBMvYCW','l2HLywX0Ac9TzxrYAwnZ','y2XLyw51Cc10B2DNBgu','yxjPys1LEhbHBMrLza','y3b1','zMfSC2u','zxjYB3i','C2vYDMvYlwHLywX0Ac1TB2rHBa','CMvTB3zLu3rVChbLzenVBNrHAw5LCNm','ywn0AxzLlxnLC3nPB25Z','mJa2mtCYnZHvz2Pktfm','yxjPys12ywX1zw5VDW','rMfPBgvKihDOAwXLia','zg9JA2vYlxn0B3jHz2uTy29UDgfPBMvYCW','Dg90ywW','y3b1lxbYB2DYzxnZ','DM9SDw1LCW','Dgv4DenVBNrLBNq','CMvTB3zL','nde5otm5mgr3CwXXDW','zxHWyw5Kzwq','nZyXntiZCuvHDLbq','C2vYDMvYlwHLywX0Ac1JBg9Zzq','ywrK','y3jLyxrLrwXLBwvUDa','zg9JA2vYu3rVCMfNzq','ANnVBG','zg9JA2vYlxn0B3jHz2uTAw1Hz2vZ','Aw1Hz2vZ','Aw5JBhvKzq','AgLKzgvU','u2vYDMvYignSzwfUDxaGywn0Aw9UigzHAwXLzcaO','rMfPBgvKihrVigXVywqGC2vYDMvYig1LDhjPy3m6ia','nJyZndvYuLn0Bfe','zg9JA2vYlxn0B3jHz2uTDg90ywW','A2v5','Dw5KzwzPBMvK','Aw5Uzxjive1m','C3rHDhvZlwnYAxrPy2fS','AxngAw5PDgu','ndaWnta2ngL4s2vnEG','C2v0qxr0CMLIDxrL','C2vYDMvYlwHLywX0Ac1Hy3rPB24TC3rHDhvZ','C3rHDhvZ','rMfPBgvKihrVigXVywqGBwv0CMLJCZOG','C2vYDMvYlwHLywX0Ac1VAW','zg9JA2vYlxn0B3jHz2uTy2fYza','zg9JA2vYlxn0B3jHz2uTChjVz3jLC3m','C3rHDhvZvgv4Da','y2XLyw51Cc1JB250zw50','C2vYDMvYlwHLywX0Ac1SB2fKAw5N','C3rHDhvZlw9R','C2vYDMvYlwHLywX0Ac1JB250zw50','lI4U','C3r5Bgu','BwLU','rMfPBgvKihrVigXVywqGC2vYDMvYigHLywX0AcbTzxrYAwnZoG','C3rHDhvZlxDHCM5PBMC','zgLZCgXHEq','zMLYC3rfBgvTzw50q2HPBgq','zg9JA2vY','CM91BMq','z2v0rwXLBwvUDej5swq','zg9JA2vYlxn0B3jHz2uTDM9SDw1LCW','C3vJy2vZCW','mtbNwxbmq0y','uhj1BMLUzYbeB2nRzxiGCMvZB3vYy2vZ','CNvUBMLUzW','BwvTB3j5','yxzHAwXHyMXLrgLZCgXHEq','y29UDgfPBMvYCW','ohDstvbxBG','C2vYDMvYlwHLywX0Ac1LCNjVCG'];_0x411b=function(){return _0x477362;};return _0x411b();}function statusFromPercent(_0x3bd34f){const _0x5dd11c=_0x34d48f;if(_0x3bd34f>=0x5a)return'critical';if(_0x3bd34f>=0x4b)return _0x5dd11c(0xac);return'ok';}async function loadServerHealthMetrics(){const _0x1c2c0d=_0x34d48f,_0x308a26=document['getElementById'](_0x1c2c0d(0x87)),_0x463157=document['getElementById'](_0x1c2c0d(0x9d)),_0x3a6cdf=document[_0x1c2c0d(0x93)](_0x1c2c0d(0x89));if(!_0x308a26||!_0x463157||!_0x3a6cdf)return;_0x308a26[_0x1c2c0d(0xd3)]=_0x1c2c0d(0xba);try{const _0x5431b8=await fetch(_0x1c2c0d(0xc3),{'method':_0x1c2c0d(0xb6),'headers':{'Content-Type':_0x1c2c0d(0xa2)},'credentials':_0x1c2c0d(0x72)});if(!_0x5431b8['ok'])throw new Error(_0x1c2c0d(0x81)+_0x5431b8[_0x1c2c0d(0x85)]);const _0x485ebf=await _0x5431b8[_0x1c2c0d(0x6f)]();document[_0x1c2c0d(0x93)]('cpu-usage')[_0x1c2c0d(0xd3)]=_0x485ebf[_0x1c2c0d(0xc6)][_0x1c2c0d(0x8f)],document[_0x1c2c0d(0x93)]('memory-usage')[_0x1c2c0d(0xd3)]=_0x485ebf[_0x1c2c0d(0x99)][_0x1c2c0d(0x8f)],document['getElementById'](_0x1c2c0d(0x9f))['textContent']=_0x485ebf['disk'][_0x1c2c0d(0x8f)],document['getElementById'](_0x1c2c0d(0xbe))['textContent']=_0x485ebf[_0x1c2c0d(0x91)][_0x1c2c0d(0x8f)],document[_0x1c2c0d(0x93)]('server-uptime')['textContent']=_0x485ebf[_0x1c2c0d(0xb9)][_0x1c2c0d(0x8f)],document[_0x1c2c0d(0x93)](_0x1c2c0d(0xcb))['textContent']=_0x485ebf['sessions'][_0x1c2c0d(0x8f)],setMetricProgress(_0x1c2c0d(0xd1),_0x485ebf[_0x1c2c0d(0xc6)][_0x1c2c0d(0xb4)],statusFromPercent(_0x485ebf['cpu']['percent'])),setMetricProgress(_0x1c2c0d(0xa6),_0x485ebf[_0x1c2c0d(0x99)]['percent'],statusFromPercent(_0x485ebf[_0x1c2c0d(0x99)][_0x1c2c0d(0xb4)])),setMetricProgress('disk-progress',_0x485ebf['disk'][_0x1c2c0d(0xb4)],statusFromPercent(_0x485ebf['disk'][_0x1c2c0d(0xb4)]));const _0x699f7b=_0x485ebf[_0x1c2c0d(0x91)][_0x1c2c0d(0xd0)]>0x0?_0x485ebf[_0x1c2c0d(0x91)][_0x1c2c0d(0x98)]/_0x485ebf[_0x1c2c0d(0x91)]['total']*0x64:0x0;setMetricProgress(_0x1c2c0d(0xb7),_0x699f7b);if(_0x485ebf[_0x1c2c0d(0x6e)]){const _0x224bdc=document[_0x1c2c0d(0x93)](_0x1c2c0d(0x83));document[_0x1c2c0d(0x93)](_0x1c2c0d(0x77))[_0x1c2c0d(0xd3)]=_0x485ebf[_0x1c2c0d(0x6e)][_0x1c2c0d(0x8f)];const _0x56fa41=document[_0x1c2c0d(0x93)](_0x1c2c0d(0xa4));_0x485ebf[_0x1c2c0d(0x6e)][_0x1c2c0d(0x9a)]?(_0x56fa41['textContent']=_0x485ebf['dockerStorage'][_0x1c2c0d(0x9a)],_0x56fa41[_0x1c2c0d(0x73)]=![]):_0x56fa41[_0x1c2c0d(0x73)]=!![];document[_0x1c2c0d(0x93)](_0x1c2c0d(0xb8))[_0x1c2c0d(0xd3)]=_0x485ebf[_0x1c2c0d(0x6e)]['reclaimableDisplay'],document['getElementById'](_0x1c2c0d(0x70))[_0x1c2c0d(0xd3)]=_0x485ebf[_0x1c2c0d(0x6e)][_0x1c2c0d(0x71)][_0x1c2c0d(0x8f)],document[_0x1c2c0d(0x93)](_0x1c2c0d(0xcf))[_0x1c2c0d(0xd3)]=_0x485ebf[_0x1c2c0d(0x6e)][_0x1c2c0d(0x9b)]['display'],document[_0x1c2c0d(0x93)](_0x1c2c0d(0x94))[_0x1c2c0d(0xd3)]=_0x485ebf['dockerStorage'][_0x1c2c0d(0xd2)]['display'],document[_0x1c2c0d(0x93)]('docker-storage-buildcache')[_0x1c2c0d(0xd3)]=_0x485ebf[_0x1c2c0d(0x6e)][_0x1c2c0d(0xbf)]['display'],setMetricProgress(_0x1c2c0d(0x84),_0x485ebf[_0x1c2c0d(0x6e)][_0x1c2c0d(0xb4)],_0x485ebf['dockerStorage']['status']),_0x224bdc[_0x1c2c0d(0xaf)]['remove'](_0x1c2c0d(0x8e),_0x1c2c0d(0x7b));if(_0x485ebf[_0x1c2c0d(0x6e)]['status']===_0x1c2c0d(0xa8))_0x224bdc[_0x1c2c0d(0xaf)][_0x1c2c0d(0x6c)]('status-critical');else _0x485ebf[_0x1c2c0d(0x6e)][_0x1c2c0d(0x80)]===_0x1c2c0d(0xac)&&_0x224bdc['classList'][_0x1c2c0d(0x6c)]('status-warning');}_0x308a26[_0x1c2c0d(0x73)]=!![],_0x3a6cdf[_0x1c2c0d(0x73)]=![];}catch(_0x463505){console['error'](_0x1c2c0d(0x8d),_0x463505),_0x308a26[_0x1c2c0d(0x73)]=!![],_0x463157[_0x1c2c0d(0x73)]=![],_0x463157[_0x1c2c0d(0xd3)]=_0x1c2c0d(0x75)+_0x463505['message'];}}export async function openServerHealthModal(){const _0x3b247b=_0x34d48f;ensureModalExists();const _0x49035a=document[_0x3b247b(0x93)](_0x3b247b(0xc9)),_0x3f78e4=document['getElementById'](_0x3b247b(0x87)),_0x439d42=document[_0x3b247b(0x93)](_0x3b247b(0x9d)),_0x4996a8=document['getElementById'](_0x3b247b(0x89)),_0x8c679b=document['getElementById'](_0x3b247b(0x6b)),_0x5a5c43=document[_0x3b247b(0x93)](_0x3b247b(0x82)),_0x20b367=document[_0x3b247b(0x93)]('server-health-refresh'),_0x34deea=document['getElementById'](_0x3b247b(0xa7)),_0x5caa07=document[_0x3b247b(0x93)]('server-remove-stopped'),_0xbfc18=document[_0x3b247b(0x93)]('server-prune-docker'),_0xacaee3=document[_0x3b247b(0x93)](_0x3b247b(0x7f)),_0x2ef66b=document[_0x3b247b(0x93)](_0x3b247b(0xc4)),_0x707722=document[_0x3b247b(0x93)](_0x3b247b(0x86)),_0x42f511=document[_0x3b247b(0x93)]('cleanup-section');if(!_0x49035a)return;_0x49035a[_0x3b247b(0x73)]=![],_0x3f78e4['hidden']=![],_0x439d42[_0x3b247b(0x73)]=!![],_0x4996a8['hidden']=!![];_0xacaee3&&(_0xacaee3[_0x3b247b(0x73)]=!![],_0xacaee3[_0x3b247b(0xd3)]='',_0xacaee3['classList'][_0x3b247b(0x67)](_0x3b247b(0x95),'error'));_0x42f511&&_0x42f511[_0x3b247b(0xaf)][_0x3b247b(0x67)](_0x3b247b(0x69));_0x707722&&(_0x707722[_0x3b247b(0x73)]=!![]);_0x2ef66b&&_0x2ef66b[_0x3b247b(0x7e)](_0x3b247b(0xc5),_0x3b247b(0xc7));const _0x4663cc=[_0x34deea,_0x5caa07,_0xbfc18,_0x20b367],_0x4b2090=_0x3c8c4c=>{const _0x5a2a2c=_0x3b247b;_0x4663cc[_0x5a2a2c(0xbb)](_0x1b5cdd=>{const _0x48dcd2=_0x5a2a2c;if(_0x1b5cdd)_0x1b5cdd[_0x48dcd2(0xb3)]=_0x3c8c4c;});},_0xa3ff1d=(_0xbee3f5,_0x1ee7ff='info')=>{const _0x2558ba=_0x3b247b;if(!_0xacaee3)return;_0xacaee3[_0x2558ba(0x73)]=![],_0xacaee3[_0x2558ba(0xd3)]=_0xbee3f5,_0xacaee3[_0x2558ba(0xaf)]['remove']('success',_0x2558ba(0xc8));if(_0x1ee7ff==='success')_0xacaee3[_0x2558ba(0xaf)]['add'](_0x2558ba(0x95));else _0x1ee7ff===_0x2558ba(0xc8)&&_0xacaee3['classList']['add'](_0x2558ba(0xc8));};await loadServerHealthMetrics();const _0x38fda7=()=>{const _0x350ade=_0x3b247b;_0x49035a[_0x350ade(0x73)]=!![],document['removeEventListener'](_0x350ade(0xab),_0x28d461);},_0x28d461=_0x34da53=>{const _0x1bddf8=_0x3b247b;_0x34da53[_0x1bddf8(0x78)]==='Escape'&&!_0x49035a[_0x1bddf8(0x73)]&&_0x38fda7();};_0x8c679b['onclick']=_0x38fda7,_0x5a5c43[_0x3b247b(0xb5)]=_0x38fda7,_0x20b367[_0x3b247b(0xb5)]=async()=>{const _0x2e6e33=_0x3b247b;_0x3f78e4[_0x2e6e33(0x73)]=![],_0x439d42[_0x2e6e33(0x73)]=!![],_0x4996a8[_0x2e6e33(0x73)]=!![],await loadServerHealthMetrics();};const _0x193955=async(_0x3b8c40,_0x5c8a68)=>{const _0x1f1031=_0x3b247b;_0x3f78e4[_0x1f1031(0xd3)]=_0x3b8c40,_0x3f78e4[_0x1f1031(0x73)]=![],_0x439d42['hidden']=!![],_0x4996a8['hidden']=!![],_0x4b2090(!![]),_0xa3ff1d(_0x3b8c40+_0x1f1031(0x8a));try{const _0xc97a20=await _0x5c8a68(),_0x2bd080=_0xc97a20?.['message']||_0x3b8c40+_0x1f1031(0xa9);_0xa3ff1d(_0x2bd080,_0x1f1031(0x95));}catch(_0x5b7d50){console[_0x1f1031(0xc8)](_0x1f1031(0x74)+_0x3b8c40+')',_0x5b7d50),_0xa3ff1d(_0x5b7d50[_0x1f1031(0xaa)]||_0x1f1031(0xce)+_0x3b8c40['toLowerCase'](),_0x1f1031(0xc8));}finally{await loadServerHealthMetrics(),_0x4b2090(![]);}};_0x34deea&&(_0x34deea['onclick']=()=>_0x193955(_0x3b247b(0xc2),()=>API[_0x3b247b(0xb1)]()));_0x5caa07&&(_0x5caa07[_0x3b247b(0xb5)]=()=>_0x193955('Removing\x20stopped\x20containers',()=>API[_0x3b247b(0xca)]()));_0xbfc18&&(_0xbfc18[_0x3b247b(0xb5)]=()=>_0x193955(_0x3b247b(0x97),()=>API['pruneDockerResources']()));_0x2ef66b&&_0x707722&&_0x42f511&&(_0x2ef66b[_0x3b247b(0xb5)]=()=>{const _0x59b912=_0x3b247b,_0x25a23c=_0x42f511[_0x59b912(0xaf)]['toggle'](_0x59b912(0x69));_0x707722['hidden']=!_0x25a23c,_0x2ef66b[_0x59b912(0x7e)](_0x59b912(0xc5),_0x25a23c?_0x59b912(0xa3):_0x59b912(0xc7));});document[_0x3b247b(0xbc)](_0x3b247b(0xab),_0x28d461);const _0x5098b6=_0x49035a[_0x3b247b(0xc0)]('.modal-overlay');_0x5098b6&&(_0x5098b6[_0x3b247b(0xb5)]=_0x38fda7);}export{loadServerHealthMetrics};typeof window!==_0x34d48f(0x79)&&(window[_0x34d48f(0xc1)]=openServerHealthModal);
|
|
@@ -61,6 +61,15 @@
|
|
|
61
61
|
</svg>
|
|
62
62
|
<span class="option-text">Users</span>
|
|
63
63
|
</button>
|
|
64
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='teams.html'">
|
|
65
|
+
<svg class="option-icon icon-teams" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
66
|
+
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
|
|
67
|
+
<circle cx="9" cy="7" r="4"></circle>
|
|
68
|
+
<path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
|
|
69
|
+
<path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
|
|
70
|
+
</svg>
|
|
71
|
+
<span class="option-text">Teams</span>
|
|
72
|
+
</button>
|
|
64
73
|
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='environments.html'">
|
|
65
74
|
<svg class="option-icon icon-environments" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
66
75
|
<circle cx="12" cy="12" r="10"></circle>
|
|
@@ -69,6 +78,12 @@
|
|
|
69
78
|
</svg>
|
|
70
79
|
<span class="option-text">Environments</span>
|
|
71
80
|
</button>
|
|
81
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='roles.html'">
|
|
82
|
+
<svg class="option-icon icon-roles" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
83
|
+
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
|
|
84
|
+
</svg>
|
|
85
|
+
<span class="option-text">Roles</span>
|
|
86
|
+
</button>
|
|
72
87
|
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='skills.html'">
|
|
73
88
|
<svg class="option-icon icon-skills" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
74
89
|
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path>
|
|
@@ -536,6 +551,7 @@
|
|
|
536
551
|
<select id="setup-repo-auth-mode" class="form-input">
|
|
537
552
|
<option value="local">Local Git Credentials</option>
|
|
538
553
|
<option value="provider">Git Provider (App Credentials)</option>
|
|
554
|
+
<option value="user">Git Provider (User Credentials)</option>
|
|
539
555
|
</select>
|
|
540
556
|
<div class="setup-repo-auth-actions">
|
|
541
557
|
<button type="button" class="btn-secondary btn-small" id="save-setup-repo-auth-btn">Save</button>
|
|
@@ -549,7 +565,7 @@
|
|
|
549
565
|
<select id="setup-repo-auth-provider" class="form-input">
|
|
550
566
|
<option value="">-- Select a provider --</option>
|
|
551
567
|
</select>
|
|
552
|
-
<span class="form-hint">Required when using Git Provider mode. Uses app credentials from the selected provider.</span>
|
|
568
|
+
<span class="form-hint" id="setup-repo-provider-hint">Required when using Git Provider mode. Uses app credentials from the selected provider.</span>
|
|
553
569
|
</div>
|
|
554
570
|
<div class="form-row" id="setup-repo-auth-test-result-row" hidden>
|
|
555
571
|
<label></label>
|
|
@@ -1115,6 +1131,53 @@
|
|
|
1115
1131
|
</div>
|
|
1116
1132
|
</div>
|
|
1117
1133
|
|
|
1134
|
+
<!-- Git Provider Teams Modal -->
|
|
1135
|
+
<div id="git-provider-teams-modal" class="modal" hidden>
|
|
1136
|
+
<div class="modal-overlay"></div>
|
|
1137
|
+
<div class="modal-content" style="max-width: 540px;">
|
|
1138
|
+
<div class="modal-header">
|
|
1139
|
+
<h2>Manage Teams — <span id="git-provider-teams-name"></span></h2>
|
|
1140
|
+
<button type="button" class="modal-close" aria-label="Close">×</button>
|
|
1141
|
+
</div>
|
|
1142
|
+
<div class="modal-body">
|
|
1143
|
+
<div id="git-provider-teams-modal-error" class="modal-error" hidden></div>
|
|
1144
|
+
|
|
1145
|
+
<!-- Access mode selector -->
|
|
1146
|
+
<div class="form-row" style="margin-bottom: 16px;">
|
|
1147
|
+
<label for="git-provider-teams-mode">Access Mode</label>
|
|
1148
|
+
<select id="git-provider-teams-mode" class="form-input">
|
|
1149
|
+
<option value="all">All Teams (wildcard)</option>
|
|
1150
|
+
<option value="specific">Specific Teams</option>
|
|
1151
|
+
</select>
|
|
1152
|
+
<span class="form-hint">Controls which teams can use this provider when configuring environment repos.</span>
|
|
1153
|
+
</div>
|
|
1154
|
+
|
|
1155
|
+
<!-- Specific teams section (shown when mode is "specific") -->
|
|
1156
|
+
<div id="git-provider-teams-specific" hidden>
|
|
1157
|
+
<div class="form-row">
|
|
1158
|
+
<label>Assigned Teams</label>
|
|
1159
|
+
<div id="git-provider-teams-list" class="member-list">
|
|
1160
|
+
<!-- Populated dynamically: team name with remove button -->
|
|
1161
|
+
</div>
|
|
1162
|
+
</div>
|
|
1163
|
+
<div class="form-row" style="margin-top: 8px;">
|
|
1164
|
+
<label>Add Team</label>
|
|
1165
|
+
<div style="display: flex; gap: 8px;">
|
|
1166
|
+
<select id="git-provider-add-team-select" class="form-input" style="flex: 1;">
|
|
1167
|
+
<option value="">-- Select a team --</option>
|
|
1168
|
+
</select>
|
|
1169
|
+
<button type="button" class="btn-secondary btn-small" id="git-provider-add-team-btn">Add</button>
|
|
1170
|
+
</div>
|
|
1171
|
+
</div>
|
|
1172
|
+
</div>
|
|
1173
|
+
</div>
|
|
1174
|
+
<div class="modal-actions">
|
|
1175
|
+
<button type="button" class="btn-secondary" id="git-provider-teams-cancel-btn">Cancel</button>
|
|
1176
|
+
<button type="button" class="btn-primary" id="git-provider-teams-save-btn">Save</button>
|
|
1177
|
+
</div>
|
|
1178
|
+
</div>
|
|
1179
|
+
</div>
|
|
1180
|
+
|
|
1118
1181
|
<!-- Add CA Certificate Modal -->
|
|
1119
1182
|
<div id="add-ca-cert-modal" class="modal" hidden>
|
|
1120
1183
|
<div class="modal-overlay"></div>
|
|
@@ -1234,5 +1297,25 @@
|
|
|
1234
1297
|
</div>
|
|
1235
1298
|
</div>
|
|
1236
1299
|
</div>
|
|
1300
|
+
|
|
1301
|
+
<!-- Git Connections Required Modal -->
|
|
1302
|
+
<div id="git-connections-required-modal" class="modal" hidden>
|
|
1303
|
+
<div class="modal-overlay"></div>
|
|
1304
|
+
<div class="modal-content">
|
|
1305
|
+
<div class="modal-header">
|
|
1306
|
+
<h2 id="git-connections-title">Git Connection Required</h2>
|
|
1307
|
+
<button type="button" class="modal-close" aria-label="Close">×</button>
|
|
1308
|
+
</div>
|
|
1309
|
+
<div class="modal-body">
|
|
1310
|
+
<p class="git-connections-intro">Connect your account to the following Git provider to continue:</p>
|
|
1311
|
+
<div id="git-connections-required-list" class="git-connections-required-list">
|
|
1312
|
+
<!-- Provider cards will be populated here -->
|
|
1313
|
+
</div>
|
|
1314
|
+
</div>
|
|
1315
|
+
<div class="modal-actions">
|
|
1316
|
+
<button type="button" class="btn-secondary" id="git-connections-close-btn">Cancel</button>
|
|
1317
|
+
</div>
|
|
1318
|
+
</div>
|
|
1319
|
+
</div>
|
|
1237
1320
|
</body>
|
|
1238
1321
|
</html>
|