@profoundlogic/coderflow-server 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/LICENSE.txt +322 -0
  2. package/README.md +158 -0
  3. package/dist/LICENSE.txt +322 -0
  4. package/dist/README.md +158 -0
  5. package/dist/base-image/Dockerfile +184 -0
  6. package/dist/base-image/agent-wrapper.sh +143 -0
  7. package/dist/base-image/apply-local-state.sh +357 -0
  8. package/dist/base-image/coder-git-credential-helper +307 -0
  9. package/dist/base-image/entrypoint.sh +942 -0
  10. package/dist/base-image/ssh_config_template +41 -0
  11. package/dist/base-image/start-code-server.sh +76 -0
  12. package/dist/base-image/sync-repos.sh +170 -0
  13. package/dist/base-image/vscode-extensions.txt +10 -0
  14. package/dist/base-image/vscode-settings.json +41 -0
  15. package/dist/coder-server.js +2 -0
  16. package/dist/config/cli-models.json +45 -0
  17. package/dist/config/imported-skills.schema.json +83 -0
  18. package/dist/config/skill-catalog.json +18 -0
  19. package/dist/config/skill-catalog.schema.json +140 -0
  20. package/dist/config.js +1 -0
  21. package/dist/examples/oidc.json.example +11 -0
  22. package/dist/lib/agent-keepalive.js +1 -0
  23. package/dist/lib/api-keys.js +1 -0
  24. package/dist/lib/apiKeys.js +1 -0
  25. package/dist/lib/auto-judge.js +1 -0
  26. package/dist/lib/basic-auth.js +1 -0
  27. package/dist/lib/build-history.js +1 -0
  28. package/dist/lib/build-output-service.js +1 -0
  29. package/dist/lib/build-scheduler.js +1 -0
  30. package/dist/lib/build-service.js +1 -0
  31. package/dist/lib/claude-oauth-refresh.js +1 -0
  32. package/dist/lib/cli/build.js +1 -0
  33. package/dist/lib/cli/config-command.js +1 -0
  34. package/dist/lib/cli/config.js +1 -0
  35. package/dist/lib/cli/create-user.js +1 -0
  36. package/dist/lib/cli/init.js +1 -0
  37. package/dist/lib/cli/jira.js +1 -0
  38. package/dist/lib/cli/license.js +1 -0
  39. package/dist/lib/cli/server-manager.js +1 -0
  40. package/dist/lib/container-tokens.js +1 -0
  41. package/dist/lib/data-dir.js +1 -0
  42. package/dist/lib/deployment-history.js +1 -0
  43. package/dist/lib/deployment-service.js +1 -0
  44. package/dist/lib/docker-utils.js +1 -0
  45. package/dist/lib/email.js +1 -0
  46. package/dist/lib/emailTemplates.js +1 -0
  47. package/dist/lib/entitlement.js +1 -0
  48. package/dist/lib/fetch-utils.js +1 -0
  49. package/dist/lib/git-provider-service.js +1 -0
  50. package/dist/lib/git-provider-setup/assets/coderflow_github_app.png +0 -0
  51. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -0
  52. package/dist/lib/git-provider-setup/index.js +1 -0
  53. package/dist/lib/git-provider-setup/setup-factory.js +1 -0
  54. package/dist/lib/git-provider-setup/setup-interface.js +1 -0
  55. package/dist/lib/git-providers/azure-devops-provider.js +1 -0
  56. package/dist/lib/git-providers/github-app-provider.js +1 -0
  57. package/dist/lib/git-providers/index.js +1 -0
  58. package/dist/lib/git-providers/provider-factory.js +1 -0
  59. package/dist/lib/git-providers/provider-interface.js +1 -0
  60. package/dist/lib/jira-client.js +1 -0
  61. package/dist/lib/logger.js +1 -0
  62. package/dist/lib/model-fetcher.js +1 -0
  63. package/dist/lib/notifications.js +1 -0
  64. package/dist/lib/oidc-auth.js +1 -0
  65. package/dist/lib/oidc-device-flow.js +1 -0
  66. package/dist/lib/passwordTokens.js +1 -0
  67. package/dist/lib/pin-cascade.js +1 -0
  68. package/dist/lib/provider-accounts.js +1 -0
  69. package/dist/lib/provider-oauth.js +1 -0
  70. package/dist/lib/provider-profile.js +1 -0
  71. package/dist/lib/provider-token-refresh.js +1 -0
  72. package/dist/lib/roles.js +1 -0
  73. package/dist/lib/secrets.js +1 -0
  74. package/dist/lib/state-capture.js +1 -0
  75. package/dist/lib/static-files.js +1 -0
  76. package/dist/lib/task-name-generator.js +1 -0
  77. package/dist/lib/users.js +1 -0
  78. package/dist/middleware/requireAuth.js +1 -0
  79. package/dist/middleware/requireInit.js +1 -0
  80. package/dist/middleware/requirePermission.js +1 -0
  81. package/dist/package-lock.json +4151 -0
  82. package/dist/package.json +50 -0
  83. package/dist/routes/apiKeys.js +1 -0
  84. package/dist/routes/auth-oidc.js +1 -0
  85. package/dist/routes/auth.js +1 -0
  86. package/dist/routes/build.js +1 -0
  87. package/dist/routes/containers.js +1 -0
  88. package/dist/routes/deploy-task.js +1 -0
  89. package/dist/routes/environment-management.js +1 -0
  90. package/dist/routes/environments.js +1 -0
  91. package/dist/routes/external-skills.js +1 -0
  92. package/dist/routes/git-credentials.js +1 -0
  93. package/dist/routes/git-provider-setup.js +1 -0
  94. package/dist/routes/health.js +1 -0
  95. package/dist/routes/jira.js +1 -0
  96. package/dist/routes/objective-management.js +1 -0
  97. package/dist/routes/password.js +1 -0
  98. package/dist/routes/prompt.js +1 -0
  99. package/dist/routes/provider-auth.js +1 -0
  100. package/dist/routes/qa.js +1 -0
  101. package/dist/routes/settings.js +1 -0
  102. package/dist/routes/skill-management.js +1 -0
  103. package/dist/routes/skills.js +1 -0
  104. package/dist/routes/tasks.js +2 -0
  105. package/dist/routes/templates.js +1 -0
  106. package/dist/routes/test-task.js +1 -0
  107. package/dist/routes/test.js +1 -0
  108. package/dist/routes/users.js +1 -0
  109. package/dist/routes/visualizations.js +1 -0
  110. package/dist/schemas/template-metadata.schema.json +178 -0
  111. package/dist/scripts/create-user.js +2 -0
  112. package/dist/shipped-skills/environment-instructions/SKILL.md +154 -0
  113. package/dist/shipped-skills/environment-templates/SKILL.md +282 -0
  114. package/dist/shipped-skills/objective-management/SKILL.md +238 -0
  115. package/dist/shipped-skills/skill-editor/SKILL.md +326 -0
  116. package/dist/start.js +2 -0
  117. package/dist/web-ui/public/activity-detail-modal.js +1 -0
  118. package/dist/web-ui/public/activity-feed.js +1 -0
  119. package/dist/web-ui/public/activity-formatters.js +1 -0
  120. package/dist/web-ui/public/agent-event-parser.js +1 -0
  121. package/dist/web-ui/public/app.js +1 -0
  122. package/dist/web-ui/public/approve-dialog.js +1 -0
  123. package/dist/web-ui/public/coderflow-logo-reversed.svg +46 -0
  124. package/dist/web-ui/public/coderflow-logo.svg +46 -0
  125. package/dist/web-ui/public/comments-widget.js +1 -0
  126. package/dist/web-ui/public/docs/.nojekyll +0 -0
  127. package/dist/web-ui/public/docs/README.md +26 -0
  128. package/dist/web-ui/public/docs/_sidebar.md +47 -0
  129. package/dist/web-ui/public/docs/admin/ai-providers.md +132 -0
  130. package/dist/web-ui/public/docs/admin/email-notifications.md +69 -0
  131. package/dist/web-ui/public/docs/admin/environments.md +215 -0
  132. package/dist/web-ui/public/docs/admin/git-providers.md +147 -0
  133. package/dist/web-ui/public/docs/admin/installation.md +313 -0
  134. package/dist/web-ui/public/docs/admin/skills.md +35 -0
  135. package/dist/web-ui/public/docs/admin/sso.md +241 -0
  136. package/dist/web-ui/public/docs/admin/users-and-roles.md +57 -0
  137. package/dist/web-ui/public/docs/code/cli.md +102 -0
  138. package/dist/web-ui/public/docs/code/files-and-editing.md +86 -0
  139. package/dist/web-ui/public/docs/code/terminal-access.md +110 -0
  140. package/dist/web-ui/public/docs/code/vscode-extension.md +58 -0
  141. package/dist/web-ui/public/docs/getting-started/core-concepts.md +129 -0
  142. package/dist/web-ui/public/docs/getting-started/overview.md +46 -0
  143. package/dist/web-ui/public/docs/index.html +151 -0
  144. package/dist/web-ui/public/docs/integrations/custom.md +58 -0
  145. package/dist/web-ui/public/docs/integrations/ibmi/overview.md +58 -0
  146. package/dist/web-ui/public/docs/integrations/overview.md +48 -0
  147. package/dist/web-ui/public/docs/objectives/qa-mode.md +90 -0
  148. package/dist/web-ui/public/docs/objectives/staged-tasks.md +60 -0
  149. package/dist/web-ui/public/docs/objectives/working-with-objectives.md +102 -0
  150. package/dist/web-ui/public/docs/tasks/approval-and-deployment.md +83 -0
  151. package/dist/web-ui/public/docs/tasks/creating-tasks.md +111 -0
  152. package/dist/web-ui/public/docs/tasks/judging.md +114 -0
  153. package/dist/web-ui/public/docs/tasks/providing-feedback.md +41 -0
  154. package/dist/web-ui/public/docs/tasks/task-groups.md +73 -0
  155. package/dist/web-ui/public/docs/tasks/winner-selection.md +75 -0
  156. package/dist/web-ui/public/docs/templates/batch-processing.md +152 -0
  157. package/dist/web-ui/public/docs/templates/task-templates.md +44 -0
  158. package/dist/web-ui/public/docs/templates/template-examples.md +93 -0
  159. package/dist/web-ui/public/docs/testing/profound-automated-testing.md +77 -0
  160. package/dist/web-ui/public/docs/testing/task-visualizations.md +42 -0
  161. package/dist/web-ui/public/docs/testing/testing-menu.md +118 -0
  162. package/dist/web-ui/public/environments.css +3942 -0
  163. package/dist/web-ui/public/environments.html +1791 -0
  164. package/dist/web-ui/public/environments.js +1 -0
  165. package/dist/web-ui/public/favicon-16.png +0 -0
  166. package/dist/web-ui/public/favicon-32.png +0 -0
  167. package/dist/web-ui/public/favicon.ico +0 -0
  168. package/dist/web-ui/public/feedback-widget.css +3133 -0
  169. package/dist/web-ui/public/feedback-widget.js +1 -0
  170. package/dist/web-ui/public/git-history.css +2663 -0
  171. package/dist/web-ui/public/git-history.html +272 -0
  172. package/dist/web-ui/public/git-history.js +1 -0
  173. package/dist/web-ui/public/git-status.js +1 -0
  174. package/dist/web-ui/public/index.html +1459 -0
  175. package/dist/web-ui/public/index.js +1 -0
  176. package/dist/web-ui/public/login.html +346 -0
  177. package/dist/web-ui/public/login.js +1 -0
  178. package/dist/web-ui/public/markdown-editor.js +1 -0
  179. package/dist/web-ui/public/markdown-file-editor.js +1 -0
  180. package/dist/web-ui/public/modal-maximize.js +1 -0
  181. package/dist/web-ui/public/notifications.js +1 -0
  182. package/dist/web-ui/public/server-health.js +1 -0
  183. package/dist/web-ui/public/settings.css +761 -0
  184. package/dist/web-ui/public/settings.html +1044 -0
  185. package/dist/web-ui/public/settings.js +1 -0
  186. package/dist/web-ui/public/setup-password.html +355 -0
  187. package/dist/web-ui/public/setup-password.js +1 -0
  188. package/dist/web-ui/public/skills.css +1949 -0
  189. package/dist/web-ui/public/skills.html +820 -0
  190. package/dist/web-ui/public/skills.js +1 -0
  191. package/dist/web-ui/public/sse-client.js +1 -0
  192. package/dist/web-ui/public/sse-shared-worker.js +1 -0
  193. package/dist/web-ui/public/styles.css +18614 -0
  194. package/dist/web-ui/public/task.html +1779 -0
  195. package/dist/web-ui/public/task.js +1 -0
  196. package/dist/web-ui/public/terminal.html +45 -0
  197. package/dist/web-ui/public/terminal.js +1 -0
  198. package/dist/web-ui/public/theme.js +1 -0
  199. package/dist/web-ui/public/users.html +298 -0
  200. package/dist/web-ui/public/users.js +1 -0
  201. package/dist/web-ui/public/variant-grouping.js +1 -0
  202. package/package.json +63 -0
@@ -0,0 +1,45 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Terminal · CoderFlow</title>
7
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
8
+ <link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
9
+ <link rel="icon" href="/favicon-16.png" type="image/png" sizes="16x16">
10
+ <link rel="icon" href="/favicon.ico">
11
+ <script>
12
+ (() => {
13
+ const key = 'profound-coder-theme';
14
+ try {
15
+ const stored = localStorage.getItem(key);
16
+ const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
17
+ const theme = stored === 'dark' || stored === 'light' ? stored : (prefersDark ? 'dark' : 'light');
18
+ document.documentElement.dataset.theme = theme;
19
+ document.documentElement.style.colorScheme = theme === 'dark' ? 'dark' : 'light';
20
+ } catch (error) {
21
+ document.documentElement.dataset.theme = 'light';
22
+ }
23
+ })();
24
+ </script>
25
+ <link rel="stylesheet" href="styles.css?v=83">
26
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css">
27
+ <script type="module" src="terminal.js?v=59"></script>
28
+ <!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
29
+ </head>
30
+ <body class="terminal-body">
31
+ <header class="terminal-header">
32
+ <div>
33
+ <h1 id="terminal-title">Terminal session</h1>
34
+ <span id="terminal-subtitle" class="text-muted"></span>
35
+ </div>
36
+ <div class="terminal-actions">
37
+ <button class="btn-ghost btn-small" id="close-terminal">Close</button>
38
+ </div>
39
+ </header>
40
+ <main class="terminal-main">
41
+ <div id="terminal-status" class="terminal-status">Connecting to container…</div>
42
+ <div id="terminal-container" class="terminal-container"></div>
43
+ </main>
44
+ </body>
45
+ </html>
@@ -0,0 +1 @@
1
+ const _0x2b23c0=_0x145b;(function(_0xa07b4a,_0x5755d1){const _0x223431=_0x145b,_0x48cb92=_0xa07b4a();while(!![]){try{const _0x1eb2ef=-parseInt(_0x223431(0xd2))/0x1+-parseInt(_0x223431(0xe3))/0x2*(-parseInt(_0x223431(0xba))/0x3)+-parseInt(_0x223431(0xe4))/0x4*(-parseInt(_0x223431(0xf3))/0x5)+parseInt(_0x223431(0xf8))/0x6*(parseInt(_0x223431(0xef))/0x7)+-parseInt(_0x223431(0xb1))/0x8*(-parseInt(_0x223431(0xbe))/0x9)+parseInt(_0x223431(0xd1))/0xa+-parseInt(_0x223431(0xe2))/0xb;if(_0x1eb2ef===_0x5755d1)break;else _0x48cb92['push'](_0x48cb92['shift']());}catch(_0x47b700){_0x48cb92['push'](_0x48cb92['shift']());}}}(_0x4190,0x3725d));import{API,Utils}from'./app.js';import{Terminal}from'https://cdn.jsdelivr.net/npm/xterm@5.3.0/+esm';import{FitAddon}from'https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.7.0/+esm';function _0x145b(_0x6f1b57,_0x20bf8d){_0x6f1b57=_0x6f1b57-0xac;const _0x4190d4=_0x4190();let _0x145b32=_0x4190d4[_0x6f1b57];if(_0x145b['sFXKxi']===undefined){var _0xfa772d=function(_0x1f1635){const _0x31d61d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xf91a32='',_0x21740b='';for(let _0x2152aa=0x0,_0x8c36c3,_0x13b83e,_0x293432=0x0;_0x13b83e=_0x1f1635['charAt'](_0x293432++);~_0x13b83e&&(_0x8c36c3=_0x2152aa%0x4?_0x8c36c3*0x40+_0x13b83e:_0x13b83e,_0x2152aa++%0x4)?_0xf91a32+=String['fromCharCode'](0xff&_0x8c36c3>>(-0x2*_0x2152aa&0x6)):0x0){_0x13b83e=_0x31d61d['indexOf'](_0x13b83e);}for(let _0x16685a=0x0,_0x1f419f=_0xf91a32['length'];_0x16685a<_0x1f419f;_0x16685a++){_0x21740b+='%'+('00'+_0xf91a32['charCodeAt'](_0x16685a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x21740b);};_0x145b['bNjXyE']=_0xfa772d,_0x145b['wWeBBy']={},_0x145b['sFXKxi']=!![];}const _0x4a862f=_0x4190d4[0x0],_0x177f5a=_0x6f1b57+_0x4a862f,_0xbc8f=_0x145b['wWeBBy'][_0x177f5a];return!_0xbc8f?(_0x145b32=_0x145b['bNjXyE'](_0x145b32),_0x145b['wWeBBy'][_0x177f5a]=_0x145b32):_0x145b32=_0xbc8f,_0x145b32;}import{getCurrentTheme,initTheme,mountThemeToggle,onThemeChange}from'./theme.js';const params=Utils[_0x2b23c0(0xf2)](),containerId=params[_0x2b23c0(0xfd)],command=(params[_0x2b23c0(0xc8)]||'')[_0x2b23c0(0xfa)](),useServerExec=params['server_exec']===_0x2b23c0(0xca),titleEl=document[_0x2b23c0(0xd8)](_0x2b23c0(0xda)),subtitleEl=document[_0x2b23c0(0xd8)](_0x2b23c0(0xf4)),statusEl=document['getElementById']('terminal-status'),terminalEl=document[_0x2b23c0(0xd8)]('terminal-container'),closeBtn=document[_0x2b23c0(0xd8)](_0x2b23c0(0xe9));function _0x4190(){const _0x267020=['C2v0','CM93CW','uNvUBMLUzZOG','mZaXnJjlBKz2uMi','vgvYBwLUywWGD2vIC29JA2v0igvYCM9Y','DhjPBq','DhLWzq','AhjLzG','y29UDgfPBMvY','Ahr0Chm6','C3vJy2vZCW','DgL0Bgu','zM9YBwf0uMvSyxrPDMvuAw1L','y2XVC2u','y29UDgfPBMvYihbHCMfTzxrLCIbPCYbYzxf1AxjLza','ChjVDg9JB2W','C2vUza','y29UDgfPBMvYswq','odm4ndHjuffgzem','y29UDgfPBMvYCW','imk3ifn0yxj0zwqG','uhjLCgfYAw5NoIa','q29UBMvJDgLVBIbJBg9Zzwq','y2f0y2G','C3rYAw5NAwz5','B2jZzxj2zq','C3rHCNrZv2L0Aa','mtmXntiXmLHyr1bWDG','imk3ienVBw1HBMqG','vgvYBwLUywWGy29UBMvJDgvK','Aw5MBW','mJyXB1ffshHw','BgvUz3rO','vgvYBwLUywWGWRCG','Dgv4DenVBNrLBNq','DMfYAwfUDa','zxjYB3i','C3rYAw5N','zNvSBenVBNrHAw5LCKLK','l3DZl2nVBNrHAw5LCNmV','z2v0q29UDgfPBMvY','y21K','C2XPy2u','Dhj1zq','D3jPDgu','Bg9JyxrPB24','rw52AxjVBM1LBNqG','CMvHC29U','zw52AxjVBM1LBNq','C2nYB2XSvg9cB3r0B20','mJyXodqWrenPEfvu','ntu0ndrdtuXiD2K','zgvMyxvSDefNzw50','lNrLCM1PBMfSlwfJDgLVBNm','y3jLyxrLzef0','i2uYztHMma','sMv0qNjHAw5Zie1VBM8Sifngtw9UBY1szwD1BgfYlcbdB25ZB2XHCYWGBw9UB3nWywnL','z2v0rwXLBwvUDej5swq','C3vIC3rYAw5N','DgvYBwLUywWTDgL0Bgu','ywrKrxzLBNrmAxn0zw5LCG','rw52AxjVBM1LBNqGDw5RBM93BG','imk3iefNzw50ia','iZbMmtCYyq','C3rHDhvZ','BMfTzq','u2vZC2LVBIa','mta4mJm3odbYEuTQDLG','mMHWEKD0Aa','mtaWmZi4qKvLuu5l','y29UBMvJDgvK','D2fZq2XLyw4','BwvZC2fNzq','q29UDgfPBMvYia','y2XVC2uTDgvYBwLUywW','rMfPBgvKihrVihbHCNnLihrLCM1PBMfSig1LC3nHz2u','y29SCW','zgf0yq','CMvHzhLtDgf0zq','t1bftG','otHfz3voB24','B3bLBG','zM9JDxm','z2v0uxvLCNLqyxjHBxm','odvNBfD6zem','DgvYBwLUywWTC3vIDgL0Bgu'];_0x4190=function(){return _0x267020;};return _0x4190();}initTheme(),mountThemeToggle({'targetSelectors':[_0x2b23c0(0xd4)]});const getXtermTheme=()=>{const _0x493179=_0x2b23c0;return{'background':_0x493179(0xde),'foreground':_0x493179(0xd6),'cursor':_0x493179(0xd6),'cursorAccent':_0x493179(0xde)};};closeBtn&&closeBtn['addEventListener']('click',()=>{const _0x3746c5=_0x2b23c0;window[_0x3746c5(0xac)]();});if(!containerId){updateStatus('Missing\x20container\x20identifier',_0x2b23c0(0xc3));throw new Error(_0x2b23c0(0xad));}document[_0x2b23c0(0x100)]=_0x2b23c0(0xc0)+containerId[_0x2b23c0(0xc9)](0x0,0xc),enrichContainerDetails(containerId)[_0x2b23c0(0xb6)](()=>{const _0x3d695d=_0x2b23c0;subtitleEl[_0x3d695d(0xc1)]='Container\x20'+containerId[_0x3d695d(0xd9)](0x0,0xc);});const term=new Terminal({'convertEol':!![],'cursorBlink':!![],'fontFamily':_0x2b23c0(0xd7),'fontSize':0x10,'theme':getXtermTheme()}),fitAddon=new FitAddon();term['loadAddon'](fitAddon),term[_0x2b23c0(0xf0)](terminalEl),term[_0x2b23c0(0xf1)]();let isFitting=![];const doFit=()=>{const _0x223c9d=_0x2b23c0;if(isFitting)return;isFitting=!![],fitAddon['fit'](),sendResize(),term[_0x223c9d(0xd0)](),setTimeout(()=>{isFitting=![];},0x32);};window[_0x2b23c0(0xdb)]('resize',()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});const resizeObserver=new ResizeObserver(()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});resizeObserver[_0x2b23c0(0xb8)](terminalEl);const socketProtocol=window[_0x2b23c0(0xcc)][_0x2b23c0(0xae)]===_0x2b23c0(0xfe)?'wss':'ws',socketUrl=new URL(_0x2b23c0(0xc6)+encodeURIComponent(containerId),window['location'][_0x2b23c0(0xfc)]);command&&useServerExec&&socketUrl['searchParams'][_0x2b23c0(0xf5)]('cmd',command);socketUrl['protocol']=socketProtocol+':';const socket=new WebSocket(socketUrl['toString']());term['onData'](_0xf91a32=>{const _0x3a3f64=_0x2b23c0;socket[_0x3a3f64(0xed)]===WebSocket['OPEN']&&socket[_0x3a3f64(0xaf)](JSON['stringify']({'type':'data','data':_0xf91a32}));});let commandSent=![],hasReceivedOutput=![];socket[_0x2b23c0(0xdb)]('message',_0x21740b=>{const _0x68c1af=_0x2b23c0;try{const _0x2152aa=JSON['parse'](_0x21740b['data']);if(_0x2152aa[_0x68c1af(0xfb)]===_0x68c1af(0xec)&&typeof _0x2152aa[_0x68c1af(0xec)]===_0x68c1af(0xc4))term[_0x68c1af(0xcb)](_0x2152aa[_0x68c1af(0xec)]),!hasReceivedOutput&&_0x2152aa[_0x68c1af(0xec)][_0x68c1af(0xbf)]>0x0&&(hasReceivedOutput=!![],command&&!useServerExec&&!commandSent&&(commandSent=!![],setTimeout(()=>{const _0x4a22ed=_0x68c1af;socket['readyState']===WebSocket['OPEN']&&socket[_0x4a22ed(0xaf)](JSON[_0x4a22ed(0xb7)]({'type':_0x4a22ed(0xec),'data':command+'\x0d'}));},0xc8)));else{if(_0x2152aa[_0x68c1af(0xfb)]===_0x68c1af(0xdf)&&_0x2152aa[_0x68c1af(0xdf)]){if(_0x2152aa['status']===_0x68c1af(0xe5)){if(command&&useServerExec)updateStatus(_0x68c1af(0xf7)+command,_0x68c1af(0xbd));else command?updateStatus(_0x68c1af(0xb4)+command,_0x68c1af(0xbd)):updateStatus(_0x68c1af(0xbc),'success');doFit(),term[_0x68c1af(0xf1)](),command&&!useServerExec&&!commandSent&&setTimeout(()=>{const _0x11e50d=_0x68c1af;!commandSent&&socket[_0x11e50d(0xed)]===WebSocket[_0x11e50d(0xee)]&&(commandSent=!![],socket[_0x11e50d(0xaf)](JSON[_0x11e50d(0xb7)]({'type':_0x11e50d(0xec),'data':command+'\x0d'})),updateStatus(_0x11e50d(0xf7)+command,_0x11e50d(0xbd)));},0x7d0);}else updateStatus(_0x68c1af(0xe1)+_0x2152aa[_0x68c1af(0xdf)],_0x2152aa[_0x68c1af(0xdf)]===_0x68c1af(0xe5)?_0x68c1af(0xff):_0x68c1af(0xbd));}else _0x2152aa[_0x68c1af(0xfb)]===_0x68c1af(0xc3)&&_0x2152aa[_0x68c1af(0xe7)]&&updateStatus(_0x2152aa[_0x68c1af(0xe7)],_0x68c1af(0xc3));}}catch(_0x8c36c3){console[_0x68c1af(0xc3)](_0x68c1af(0xea),_0x8c36c3);}}),socket[_0x2b23c0(0xdb)](_0x2b23c0(0xac),_0x13b83e=>{const _0x409e24=_0x2b23c0,_0x293432=_0x13b83e[_0x409e24(0xce)]||_0x409e24(0xb5);updateStatus(_0x293432,_0x13b83e[_0x409e24(0xe6)]?'info':_0x409e24(0xc3));}),socket[_0x2b23c0(0xdb)]('error',_0x16685a=>{const _0x11b64d=_0x2b23c0;console[_0x11b64d(0xc3)](_0x11b64d(0xf9),_0x16685a),updateStatus('Connection\x20error','error');});function sendResize(){const _0x51d35b=_0x2b23c0;if(socket[_0x51d35b(0xed)]!==WebSocket[_0x51d35b(0xee)])return;const _0x1f419f=term[_0x51d35b(0xeb)],_0x3388ad=term[_0x51d35b(0xf6)];socket[_0x51d35b(0xaf)](JSON[_0x51d35b(0xb7)]({'type':'resize','cols':_0x1f419f,'rows':_0x3388ad}));}function updateStatus(_0x1ea36e,_0x55bff='info'){const _0x3736f0=_0x2b23c0;if(!statusEl)return;statusEl['textContent']=_0x1ea36e,statusEl['dataset'][_0x3736f0(0xc2)]=_0x55bff;}async function enrichContainerDetails(_0x3292c5){const _0x479ede=_0x2b23c0;try{const _0x879231=await API[_0x479ede(0xc7)](_0x3292c5);updateTerminalDetails(_0x879231);}catch{try{const _0x32e054=await API['getContainers'](),_0x54f5e3=(_0x32e054[_0x479ede(0xb2)]||[])['find'](_0x4114d7=>_0x4114d7[_0x479ede(0xb0)]===_0x3292c5||_0x4114d7[_0x479ede(0xe0)]===_0x3292c5||_0x4114d7[_0x479ede(0xc5)]?.[_0x479ede(0xb9)](_0x3292c5));if(_0x54f5e3){updateTerminalDetails(_0x54f5e3);return;}subtitleEl['textContent']=_0x479ede(0xe8)+_0x3292c5[_0x479ede(0xd9)](0x0,0xc);}catch{subtitleEl[_0x479ede(0xc1)]='Container\x20'+_0x3292c5['substring'](0x0,0xc);}}}function updateTerminalDetails(_0x7d5153){const _0x328095=_0x2b23c0,_0x270ba1=_0x7d5153[_0x328095(0xb0)]||_0x7d5153['name']||_0x7d5153['fullContainerId']||containerId,_0x266fb0=_0x7d5153[_0x328095(0xcf)]?_0x328095(0xcd)+_0x7d5153['environment']:_0x328095(0xdc),_0x59edff=_0x7d5153[_0x328095(0xd3)]?_0x328095(0xdd)+_0x7d5153[_0x328095(0xd3)]:'',_0x539741=_0x7d5153['createdAt']?_0x328095(0xb3)+Utils[_0x328095(0x101)](_0x7d5153[_0x328095(0xd5)]):'';titleEl[_0x328095(0xc1)]='Terminal\x20·\x20'+_0x270ba1[_0x328095(0xd9)](0x0,0xc);const _0x55688d=command?_0x328095(0xbb)+command:'';subtitleEl[_0x328095(0xc1)]=''+_0x266fb0+_0x59edff+_0x539741+_0x55688d;}
@@ -0,0 +1 @@
1
+ const _0x3b54e0=_0x3a61;function _0x2792(){const _0x38d23d=['mtbkDwnnC3O','lNn0yxr1CY1Hy3rPB25Z','ChjVzM91BMqTDgHLBwuTy2HHBMDL','C3bHBG','ohb4','yNv0Dg9U','zMLUza','DgHLBwuTDg9Nz2XLlwzSB2f0Aw5N','zgv0ywLS','CgfKzgLUzW','BgLNAhq','ywXPz25jDgvTCW','nZu1nJG3mgLxvu9JAq','y3jLyxrLrwXLBwvUDa','ChjVzM91BMqTy29KzxiTDgHLBwu','Bwf0y2HLCW','DgL0Bgu','zgLZCgXHEq','mZzWEa','u3DPDgnOihrVigrHCMSGBw9Kzq','ywrK','y2XHC3nmAxn0','BwfW','zgfYAW','yxbWzw5K','mJGXntz4C0rhy04','zgLZCgf0y2HfDMvUDa','y2XHC3noyw1L','yxbWzw5Kq2HPBgq','CMvTB3zLrxzLBNrmAxn0zw5LCG','zgf0yxnLDa','khbYzwzLCNmTy29SB3iTC2nOzw1LoIbKyxjRkq','mZe3nZe2mfHSzMLADW','w1rOzw1LxsbgywLSzwqGDg8GCgvYC2LZDcb0AgvTzsbWCMvMzxjLBMnLoG','C3r5Bgu','mtrurvveDhC','D2fYBG','DhLWzq','mtG1mda5nfvjswfxDa','Bwf0y2HnzwrPyq','y2vUDgvY','DgHLBwuTDg9Nz2XLlwj0BG','ywrKrxzLBNrmAxn0zw5LCG','BgLUzuHLAwDODa','DgHLBwuTAwnVBG','ovPAzhP1Ea','nJC2mJi4CK5tsxPm','y2XPy2S','zMXLEa','zg9JDw1LBNrfBgvTzw50','DgHLBwu','C2v0qxr0CMLIDxrL','lMHLywrLCI1Hy3rPB25Z','yM9KEq','Aw5Uzxjive1m','ANvZDgLMEunVBNrLBNq','AgfZ','u3DPDgnOihrVigXPz2H0ig1Vzgu','w1rOzw1LxsbgywLSzwqGDg8GCMvHzcbZDg9YzwqGDgHLBwuGChjLzMvYzw5JztO','yNrUlwDOB3n0ihrOzw1LlxrVz2DSzs1IDg4','ndGXmdiXmMDTwhrTwq','mtKWnZeXndrUrNzXugO'];_0x2792=function(){return _0x38d23d;};return _0x2792();}(function(_0x192a1b,_0x2319a2){const _0x3548be=_0x3a61,_0x49d593=_0x192a1b();while(!![]){try{const _0x2b890e=-parseInt(_0x3548be(0x132))/0x1*(-parseInt(_0x3548be(0x15c))/0x2)+parseInt(_0x3548be(0x141))/0x3+parseInt(_0x3548be(0x133))/0x4+parseInt(_0x3548be(0x14f))/0x5+parseInt(_0x3548be(0x12b))/0x6+-parseInt(_0x3548be(0x128))/0x7*(parseInt(_0x3548be(0x125))/0x8)+parseInt(_0x3548be(0x142))/0x9*(-parseInt(_0x3548be(0x143))/0xa);if(_0x2b890e===_0x2319a2)break;else _0x49d593['push'](_0x49d593['shift']());}catch(_0x52f389){_0x49d593['push'](_0x49d593['shift']());}}}(_0x2792,0xc4acc));const THEME_STORAGE_KEY=_0x3b54e0(0x151),THEME_CHANGE_EVENT=_0x3b54e0(0x145),VALID_THEMES=new Set([_0x3b54e0(0x14d),_0x3b54e0(0x15a)]),DEFAULT_TARGET_SELECTORS=['#theme-toggle-container',_0x3b54e0(0x139),_0x3b54e0(0x144),'.terminal-actions','.top-bar'];function readStoredTheme(){const _0x441972=_0x3b54e0;try{const _0x455574=localStorage['getItem'](THEME_STORAGE_KEY);if(_0x455574&&VALID_THEMES[_0x441972(0x13d)](_0x455574))return _0x455574;}catch(_0x450ce1){console[_0x441972(0x129)](_0x441972(0x13f),_0x450ce1);}return null;}export function getPreferredTheme(){const _0x30b6c5=_0x3b54e0,_0x3c809a=readStoredTheme();if(_0x3c809a)return _0x3c809a;const _0xafb183=window[_0x30b6c5(0x12c)]&&window[_0x30b6c5(0x12c)](_0x30b6c5(0x124))[_0x30b6c5(0x152)];return _0xafb183?_0x30b6c5(0x15a):'light';}export function getCurrentTheme(){const _0x49f823=_0x3b54e0,_0x131ce0=document[_0x49f823(0x136)][_0x49f823(0x123)][_0x49f823(0x137)];if(_0x131ce0&&VALID_THEMES[_0x49f823(0x13d)](_0x131ce0))return _0x131ce0;return getPreferredTheme();}function _0x3a61(_0x5b7dd3,_0x31f72f){_0x5b7dd3=_0x5b7dd3-0x120;const _0x2792c2=_0x2792();let _0x3a61f4=_0x2792c2[_0x5b7dd3];if(_0x3a61['yQepoX']===undefined){var _0x3fbc42=function(_0x1d38eb){const _0x3a9094='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x455574='',_0x450ce1='';for(let _0x3c809a=0x0,_0xafb183,_0x131ce0,_0x1dc545=0x0;_0x131ce0=_0x1d38eb['charAt'](_0x1dc545++);~_0x131ce0&&(_0xafb183=_0x3c809a%0x4?_0xafb183*0x40+_0x131ce0:_0x131ce0,_0x3c809a++%0x4)?_0x455574+=String['fromCharCode'](0xff&_0xafb183>>(-0x2*_0x3c809a&0x6)):0x0){_0x131ce0=_0x3a9094['indexOf'](_0x131ce0);}for(let _0xb1b720=0x0,_0x2c5d38=_0x455574['length'];_0xb1b720<_0x2c5d38;_0xb1b720++){_0x450ce1+='%'+('00'+_0x455574['charCodeAt'](_0xb1b720)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x450ce1);};_0x3a61['raAzuq']=_0x3fbc42,_0x3a61['peoYQL']={},_0x3a61['yQepoX']=!![];}const _0xa8cd3b=_0x2792c2[0x0],_0x4665b0=_0x5b7dd3+_0xa8cd3b,_0x28cce6=_0x3a61['peoYQL'][_0x4665b0];return!_0x28cce6?(_0x3a61f4=_0x3a61['raAzuq'](_0x3a61f4),_0x3a61['peoYQL'][_0x4665b0]=_0x3a61f4):_0x3a61f4=_0x28cce6,_0x3a61f4;}export function applyTheme(_0x1dc545,{persist:persist=!![],emitEvent:emitEvent=!![]}={}){const _0x561d6d=_0x3b54e0,_0xb1b720=VALID_THEMES[_0x561d6d(0x13d)](_0x1dc545)?_0x1dc545:_0x561d6d(0x14d);document[_0x561d6d(0x136)][_0x561d6d(0x123)][_0x561d6d(0x137)]=_0xb1b720,document[_0x561d6d(0x136)][_0x561d6d(0x127)]['colorScheme']=_0xb1b720==='dark'?_0x561d6d(0x15a):_0x561d6d(0x14d);if(persist)try{localStorage['setItem'](THEME_STORAGE_KEY,_0xb1b720);}catch(_0x2c5d38){console[_0x561d6d(0x129)](_0x561d6d(0x126),_0x2c5d38);}return emitEvent&&window[_0x561d6d(0x15d)](new CustomEvent(THEME_CHANGE_EVENT,{'detail':{'theme':_0xb1b720}})),_0xb1b720;}export function initTheme(_0x4e2e77={}){const {emitEvent:emitEvent=![]}=_0x4e2e77;return applyTheme(getPreferredTheme(),{'persist':![],'emitEvent':emitEvent});}export function toggleTheme(){const _0x23720f=_0x3b54e0,_0x1f244d=getCurrentTheme()===_0x23720f(0x15a)?_0x23720f(0x14d):_0x23720f(0x15a);return applyTheme(_0x1f244d);}export function onThemeChange(_0x3c4147,{runImmediately:runImmediately=![]}={}){const _0x497615=_0x3b54e0,_0xf33b9=_0x3f1a9b=>{const _0x22132e=_0x3a61;_0x3c4147(_0x3f1a9b[_0x22132e(0x14b)][_0x22132e(0x137)]);};return window[_0x497615(0x12f)](THEME_CHANGE_EVENT,_0xf33b9),runImmediately&&_0x3c4147(getCurrentTheme()),()=>window[_0x497615(0x122)](THEME_CHANGE_EVENT,_0xf33b9);}export function mountThemeToggle(_0x464a52={}){const _0x567971=_0x3b54e0,{targetSelectors:targetSelectors=DEFAULT_TARGET_SELECTORS}=_0x464a52,_0x3982c9=targetSelectors[_0x567971(0x159)](_0x21b8d3=>document['querySelector'](_0x21b8d3))[_0x567971(0x149)](Boolean),_0x84c806=document[_0x567971(0x150)](_0x567971(0x148));_0x84c806[_0x567971(0x12a)]='button',_0x84c806[_0x567971(0x120)]=_0x567971(0x140),_0x84c806['id']=_0x567971(0x12e),_0x84c806[_0x567971(0x138)]('aria-pressed','false'),_0x84c806[_0x567971(0x127)][_0x567971(0x14c)]=_0x567971(0x147),_0x84c806[_0x567971(0x127)][_0x567971(0x130)]='0',_0x84c806[_0x567971(0x127)]['width']=_0x567971(0x155),_0x84c806[_0x567971(0x127)]['height']=_0x567971(0x155),_0x84c806[_0x567971(0x127)][_0x567971(0x154)]=_0x567971(0x135),_0x84c806[_0x567971(0x127)][_0x567971(0x14e)]=_0x567971(0x12d),_0x84c806[_0x567971(0x127)][_0x567971(0x13c)]=_0x567971(0x12d);const _0xc36cd7=document[_0x567971(0x150)](_0x567971(0x146));_0xc36cd7[_0x567971(0x120)]=_0x567971(0x131),_0xc36cd7[_0x567971(0x127)][_0x567971(0x154)]=_0x567971(0x135),_0x84c806[_0x567971(0x15b)](_0xc36cd7);const _0x3e5a92='<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20width=\x2220\x22\x20height=\x2220\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><path\x20d=\x22M21\x2012.79A9\x209\x200\x201\x201\x2011.21\x203\x207\x207\x200\x200\x200\x2021\x2012.79z\x22></path></svg>',_0x3897c9='<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20width=\x2220\x22\x20height=\x2220\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><circle\x20cx=\x2212\x22\x20cy=\x2212\x22\x20r=\x225\x22></circle><line\x20x1=\x2212\x22\x20y1=\x221\x22\x20x2=\x2212\x22\x20y2=\x223\x22></line><line\x20x1=\x2212\x22\x20y1=\x2221\x22\x20x2=\x2212\x22\x20y2=\x2223\x22></line><line\x20x1=\x224.22\x22\x20y1=\x224.22\x22\x20x2=\x225.64\x22\x20y2=\x225.64\x22></line><line\x20x1=\x2218.36\x22\x20y1=\x2218.36\x22\x20x2=\x2219.78\x22\x20y2=\x2219.78\x22></line><line\x20x1=\x221\x22\x20y1=\x2212\x22\x20x2=\x223\x22\x20y2=\x2212\x22></line><line\x20x1=\x2221\x22\x20y1=\x2212\x22\x20x2=\x2223\x22\x20y2=\x2212\x22></line><line\x20x1=\x224.22\x22\x20y1=\x2219.78\x22\x20x2=\x225.64\x22\x20y2=\x2218.36\x22></line><line\x20x1=\x2218.36\x22\x20y1=\x225.64\x22\x20x2=\x2219.78\x22\x20y2=\x224.22\x22></line></svg>',_0x428463=_0x587fd6=>{const _0x10a604=_0x567971,_0x1f6967=_0x587fd6===_0x10a604(0x15a);_0xc36cd7[_0x10a604(0x13b)]=_0x1f6967?_0x3e5a92:_0x3897c9,_0x84c806[_0x10a604(0x153)]=_0x1f6967?_0x10a604(0x13e):_0x10a604(0x156),_0x84c806['dataset']['theme']=_0x587fd6,_0x84c806[_0x10a604(0x138)]('aria-pressed',String(_0x1f6967));};return _0x84c806[_0x567971(0x12f)](_0x567971(0x134),()=>{const _0x5ed4a5=_0x567971,_0x505186=getCurrentTheme()===_0x5ed4a5(0x15a)?_0x5ed4a5(0x14d):_0x5ed4a5(0x15a);applyTheme(_0x505186);}),_0x3982c9?_0x3982c9[_0x567971(0x121)](_0x84c806):(_0x84c806[_0x567971(0x158)][_0x567971(0x157)](_0x567971(0x14a)),document[_0x567971(0x13a)][_0x567971(0x121)](_0x84c806)),_0x428463(initTheme()),onThemeChange(_0x428463),_0x84c806;}export{THEME_STORAGE_KEY,THEME_CHANGE_EVENT};
@@ -0,0 +1,298 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>User Management · CoderFlow</title>
7
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
8
+ <link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
9
+ <link rel="icon" href="/favicon-16.png" type="image/png" sizes="16x16">
10
+ <link rel="icon" href="/favicon.ico">
11
+ <script>
12
+ (() => {
13
+ const key = 'profound-coder-theme';
14
+ try {
15
+ const stored = localStorage.getItem(key);
16
+ const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
17
+ const theme = stored === 'dark' || stored === 'light' ? stored : (prefersDark ? 'dark' : 'light');
18
+ document.documentElement.dataset.theme = theme;
19
+ document.documentElement.style.colorScheme = theme === 'dark' ? 'dark' : 'light';
20
+ } catch (error) {
21
+ document.documentElement.dataset.theme = 'light';
22
+ }
23
+ })();
24
+ </script>
25
+ <link rel="stylesheet" href="styles.css?v=83">
26
+ <script type="module" src="users.js?v=58"></script>
27
+ <!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
28
+ </head>
29
+ <body>
30
+ <main class="task-detail">
31
+ <div class="task-hero">
32
+ <div class="hero-top">
33
+ <nav class="breadcrumb" aria-label="Breadcrumb">
34
+ <a class="breadcrumb-link" href="index.html">
35
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
36
+ <path d="M3 11.5L12 4l9 7.5"></path>
37
+ <path d="M5 10.5V20h5v-5h4v5h5v-9.5"></path>
38
+ </svg>
39
+ <span>Home</span>
40
+ </a>
41
+ <span class="breadcrumb-separator" aria-hidden="true">/</span>
42
+ <span class="breadcrumb-current">Users</span>
43
+ </nav>
44
+ <span class="task-context">Administration</span>
45
+ <!-- Admin Menu (gear icon) -->
46
+ <div class="admin-menu-container" id="admin-menu-container" hidden>
47
+ <button class="btn-icon-admin" id="admin-menu-btn" title="Admin">
48
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
49
+ <circle cx="12" cy="12" r="3"></circle>
50
+ <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
51
+ </svg>
52
+ </button>
53
+ <div class="dropdown-menu admin-dropdown" id="admin-menu" hidden>
54
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='environments.html'">
55
+ <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">
56
+ <circle cx="12" cy="12" r="10"></circle>
57
+ <line x1="2" y1="12" x2="22" y2="12"></line>
58
+ <path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path>
59
+ </svg>
60
+ <span class="option-text">Environments</span>
61
+ </button>
62
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='skills.html'">
63
+ <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">
64
+ <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>
65
+ </svg>
66
+ <span class="option-text">Skills</span>
67
+ </button>
68
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='settings.html'">
69
+ <svg class="option-icon icon-server-settings" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
70
+ <line x1="4" y1="21" x2="4" y2="14"></line>
71
+ <line x1="4" y1="10" x2="4" y2="3"></line>
72
+ <line x1="12" y1="21" x2="12" y2="12"></line>
73
+ <line x1="12" y1="8" x2="12" y2="3"></line>
74
+ <line x1="20" y1="21" x2="20" y2="16"></line>
75
+ <line x1="20" y1="12" x2="20" y2="3"></line>
76
+ <line x1="1" y1="14" x2="7" y2="14"></line>
77
+ <line x1="9" y1="8" x2="15" y2="8"></line>
78
+ <line x1="17" y1="16" x2="23" y2="16"></line>
79
+ </svg>
80
+ <span class="option-text">Server Settings</span>
81
+ </button>
82
+ <button type="button" class="dropdown-item admin-menu-item" id="server-health-btn">
83
+ <svg class="option-icon icon-health" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
84
+ <path d="M22 12h-4l-3 9L9 3l-3 9H2"></path>
85
+ </svg>
86
+ <span class="option-text">Server Health</span>
87
+ </button>
88
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='git-history.html'">
89
+ <svg class="option-icon icon-git-history" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
90
+ <circle cx="6" cy="6" r="2"></circle>
91
+ <circle cx="6" cy="18" r="2"></circle>
92
+ <circle cx="18" cy="12" r="2"></circle>
93
+ <path d="M6 8v8"></path>
94
+ <path d="M6 12h10"></path>
95
+ </svg>
96
+ <span class="option-text">Git History</span>
97
+ </button>
98
+ </div>
99
+ </div>
100
+ <div id="theme-toggle-container"></div>
101
+ </div>
102
+ <div class="status-hero">
103
+ <div class="status-copy">
104
+ <h1>User Management</h1>
105
+ <p class="task-subtitle">Manage user accounts and permissions</p>
106
+ </div>
107
+ <div class="status-actions">
108
+ <button class="btn-primary btn-small" id="create-user-btn">Create User</button>
109
+ </div>
110
+ </div>
111
+ </div>
112
+
113
+ <div id="users-loading" class="loading">Loading users…</div>
114
+ <div id="users-error" class="empty-state" hidden>
115
+ <h3>Failed to load users</h3>
116
+ <p id="users-error-message" class="text-muted"></p>
117
+ <button class="btn-primary" id="retry-users-btn">Try Again</button>
118
+ </div>
119
+
120
+ <section id="users-content" class="detail-stack" hidden>
121
+ <article class="detail-card">
122
+ <header class="detail-card-header">
123
+ <h2>Users</h2>
124
+ <span id="user-count" class="tag">0 users</span>
125
+ </header>
126
+ <div class="detail-card-content">
127
+ <div class="users-table-container">
128
+ <table class="users-table">
129
+ <thead>
130
+ <tr>
131
+ <th>Username</th>
132
+ <th>Name</th>
133
+ <th>Email</th>
134
+ <th>Role</th>
135
+ <th>Created</th>
136
+ <th>Actions</th>
137
+ </tr>
138
+ </thead>
139
+ <tbody id="users-table-body">
140
+ <!-- Users will be populated here -->
141
+ </tbody>
142
+ </table>
143
+ </div>
144
+ </div>
145
+ </article>
146
+ </section>
147
+ </main>
148
+
149
+ <!-- Create/Edit User Modal -->
150
+ <div id="user-modal" class="modal" hidden>
151
+ <div class="modal-overlay"></div>
152
+ <div class="modal-content">
153
+ <div class="modal-header">
154
+ <h2 id="modal-title">Create User</h2>
155
+ <button class="modal-close" id="close-user-modal">&times;</button>
156
+ </div>
157
+ <div class="modal-body">
158
+ <form id="user-form">
159
+ <div class="modal-section">
160
+ <label for="user-username">Username *</label>
161
+ <input
162
+ type="text"
163
+ id="user-username"
164
+ class="form-input"
165
+ required
166
+ pattern="[a-zA-Z0-9_\-]+"
167
+ placeholder="username"
168
+ >
169
+ <p class="field-hint">Letters, numbers, underscores, and hyphens only</p>
170
+ </div>
171
+
172
+ <div class="modal-section">
173
+ <label for="user-name">Full Name *</label>
174
+ <input
175
+ type="text"
176
+ id="user-name"
177
+ class="form-input"
178
+ required
179
+ placeholder="John Doe"
180
+ >
181
+ </div>
182
+
183
+ <div class="modal-section">
184
+ <label for="user-email">Email *</label>
185
+ <input
186
+ type="email"
187
+ id="user-email"
188
+ class="form-input"
189
+ required
190
+ placeholder="user@example.com"
191
+ >
192
+ </div>
193
+
194
+ <div class="modal-section">
195
+ <label for="user-password">Password <span id="password-required">*</span></label>
196
+ <input
197
+ type="password"
198
+ id="user-password"
199
+ class="form-input"
200
+ minlength="8"
201
+ placeholder="Minimum 8 characters"
202
+ >
203
+ <p class="field-hint" id="password-hint">Leave blank to keep current password (when editing)</p>
204
+
205
+ <div id="skip-password-container" style="margin-top: 0.75rem; display: none;">
206
+ <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer;">
207
+ <input type="checkbox" id="skip-password" style="width: auto; margin: 0;">
208
+ <span style="font-weight: normal;">Skip password (send setup link to user)</span>
209
+ </label>
210
+ </div>
211
+ </div>
212
+
213
+ <div class="modal-section">
214
+ <label for="user-role">Role *</label>
215
+ <select id="user-role" class="form-input" required>
216
+ <option value="viewer">Viewer</option>
217
+ <option value="developer">Developer</option>
218
+ <option value="manager">Manager</option>
219
+ <option value="admin">Administrator</option>
220
+ </select>
221
+ <p class="field-hint" id="role-description">Select a role to see its permissions</p>
222
+ </div>
223
+
224
+ <!-- Custom Permissions Section (admin only) -->
225
+ <div id="permissions-section" class="modal-section" style="display: none;">
226
+ <div class="permissions-header">
227
+ <label>Custom Permissions</label>
228
+ <button type="button" class="btn-ghost btn-small" id="toggle-permissions">
229
+ <span id="toggle-permissions-text">Show</span>
230
+ </button>
231
+ </div>
232
+ <p class="field-hint">Grant additional permissions beyond the role's defaults</p>
233
+
234
+ <div id="permissions-list" class="permissions-list" style="display: none;">
235
+ <!-- Permission categories will be populated here -->
236
+ </div>
237
+ </div>
238
+
239
+ <div id="form-error" class="login-error" hidden></div>
240
+ </form>
241
+ </div>
242
+ <div class="modal-footer">
243
+ <button class="btn-ghost" id="cancel-user">Cancel</button>
244
+ <button class="btn-primary" id="save-user">Save User</button>
245
+ </div>
246
+ </div>
247
+ </div>
248
+
249
+ <!-- Delete Confirmation Modal -->
250
+ <div id="delete-modal" class="modal" hidden>
251
+ <div class="modal-overlay"></div>
252
+ <div class="modal-content">
253
+ <div class="modal-header">
254
+ <h2>Delete User</h2>
255
+ <button class="modal-close" id="close-delete-modal">&times;</button>
256
+ </div>
257
+ <div class="modal-body">
258
+ <p>Are you sure you want to delete user <strong id="delete-user-name"></strong>?</p>
259
+ <p class="field-hint">This action cannot be undone.</p>
260
+ </div>
261
+ <div class="modal-footer">
262
+ <button class="btn-ghost" id="cancel-delete">Cancel</button>
263
+ <button class="btn-primary" id="confirm-delete" style="background: var(--color-danger);">Delete User</button>
264
+ </div>
265
+ </div>
266
+ </div>
267
+
268
+ <!-- Setup Link Modal -->
269
+ <div id="setup-link-modal" class="modal" hidden>
270
+ <div class="modal-overlay"></div>
271
+ <div class="modal-content">
272
+ <div class="modal-header">
273
+ <h2>Password Setup Link</h2>
274
+ <button class="modal-close" id="close-setup-link-modal">&times;</button>
275
+ </div>
276
+ <div class="modal-body">
277
+ <p>User created successfully! Share this link with <strong id="setup-link-username"></strong> to set their password:</p>
278
+ <div style="margin: 1.5rem 0;">
279
+ <div style="background: var(--color-surface); border: 2px solid var(--color-border); border-radius: 8px; padding: 1rem; word-break: break-all; font-family: monospace; font-size: 0.875rem;">
280
+ <span id="setup-link-url"></span>
281
+ </div>
282
+ </div>
283
+ <p class="field-hint">This link will expire in 7 days and can only be used once.</p>
284
+ <div style="margin-top: 1rem; padding: 0.875rem; background: rgba(0, 94, 184, 0.1); border: 2px solid rgba(0, 94, 184, 0.2); border-radius: 8px; font-size: 0.875rem;">
285
+ <strong>Note:</strong> Copy this link now and share it with the user via your preferred method (email, Slack, Teams, etc.). You won't be able to see this link again.
286
+ </div>
287
+ </div>
288
+ <div class="modal-footer">
289
+ <button class="btn-secondary" id="email-setup-link" style="display: none;">
290
+ <span id="email-button-text">Email Link</span>
291
+ </button>
292
+ <button class="btn-secondary" id="copy-setup-link">Copy Link</button>
293
+ <button class="btn-primary" id="close-setup-link">Done</button>
294
+ </div>
295
+ </div>
296
+ </div>
297
+ </body>
298
+ </html>
@@ -0,0 +1 @@
1
+ const _0x47b723=_0x2474;(function(_0x2e9dd1,_0x4e1de4){const _0x367275=_0x2474,_0x4a18c8=_0x2e9dd1();while(!![]){try{const _0x54d68c=parseInt(_0x367275(0x130))/0x1*(parseInt(_0x367275(0x124))/0x2)+-parseInt(_0x367275(0x176))/0x3*(parseInt(_0x367275(0x1ba))/0x4)+-parseInt(_0x367275(0x189))/0x5*(parseInt(_0x367275(0x15c))/0x6)+-parseInt(_0x367275(0x1d2))/0x7*(parseInt(_0x367275(0x168))/0x8)+parseInt(_0x367275(0x144))/0x9*(-parseInt(_0x367275(0x197))/0xa)+-parseInt(_0x367275(0x1ae))/0xb+parseInt(_0x367275(0x18d))/0xc;if(_0x54d68c===_0x4e1de4)break;else _0x4a18c8['push'](_0x4a18c8['shift']());}catch(_0x573f7b){_0x4a18c8['push'](_0x4a18c8['shift']());}}}(_0x3194,0xea7eb));import{API,Utils,ConfirmDialog,CustomSelect,initializeAdminMenu}from'./app.js';import{initTheme,mountThemeToggle}from'./theme.js';const state={'users':[],'editingUserId':null,'deletingUserId':null,'setupLinkData':null,'emailConfigured':![],'currentUser':null,'rolesInfo':null,'selectedPermissions':[],'permissionsExpanded':![],'roleCustomSelect':null},ROLE_DESCRIPTIONS={'viewer':_0x47b723(0x15b),'developer':'Create\x20and\x20execute\x20tasks,\x20view\x20environments','manager':_0x47b723(0x19c),'admin':'Full\x20system\x20access\x20with\x20all\x20permissions'},ROLE_NAMES={'viewer':_0x47b723(0x187),'developer':_0x47b723(0x16c),'manager':'Manager','admin':_0x47b723(0x198)};function formatRoleName(_0x430ce9){return ROLE_NAMES[_0x430ce9]||_0x430ce9;}const PERMISSION_CATEGORIES={'tasks':_0x47b723(0x1a9),'environments':_0x47b723(0x175),'users':_0x47b723(0x122),'settings':_0x47b723(0x16e),'server':_0x47b723(0x1d5),'apikeys':_0x47b723(0x1c9)};document[_0x47b723(0x16a)]('DOMContentLoaded',async()=>{const _0x158977=_0x47b723;initTheme(),mountThemeToggle(),await checkAdminAccess(),await initializeAdminMenu(state[_0x158977(0x1cc)]),await checkEmailConfig(),bindEventListeners(),await loadUsers();});async function checkAdminAccess(){const _0x50b9ef=_0x47b723;try{const _0x46dbb0=await API[_0x50b9ef(0x125)]();state[_0x50b9ef(0x1cc)]=_0x46dbb0;try{state[_0x50b9ef(0x193)]=await API[_0x50b9ef(0x186)]();}catch(_0x3ce3c1){Utils[_0x50b9ef(0x173)](_0x50b9ef(0x136),_0x50b9ef(0x13a)),setTimeout(()=>{const _0x2bbee1=_0x50b9ef;window[_0x2bbee1(0x164)][_0x2bbee1(0x15f)]=_0x2bbee1(0x158);},0x7d0);return;}setupRoleDescriptions();}catch(_0x1e5396){window[_0x50b9ef(0x164)]['href']=_0x50b9ef(0x15d);}}function setupRoleDescriptions(){const _0x105c70=_0x47b723,_0xc20e1a=document[_0x105c70(0x157)](_0x105c70(0x121)),_0x2e6e58=document[_0x105c70(0x157)](_0x105c70(0x163));if(!_0xc20e1a||!_0x2e6e58)return;state['rolesInfo']?.['roles']&&(_0xc20e1a['innerHTML']='',state[_0x105c70(0x193)][_0x105c70(0x1ca)][_0x105c70(0x14a)](_0x7c6315=>{const _0x1b94c5=_0x105c70;if(_0x7c6315['canAssign']){const _0x4b6b58=document[_0x1b94c5(0x1ab)](_0x1b94c5(0x12d));_0x4b6b58[_0x1b94c5(0x190)]=_0x7c6315[_0x1b94c5(0x190)],_0x4b6b58[_0x1b94c5(0x159)]=_0x7c6315[_0x1b94c5(0x1c6)],_0xc20e1a[_0x1b94c5(0x17c)](_0x4b6b58);}}));state[_0x105c70(0x141)]=new CustomSelect(_0xc20e1a),_0xc20e1a[_0x105c70(0x16a)]('change',()=>{const _0x514e3e=_0x105c70,_0x1df809=_0xc20e1a[_0x514e3e(0x190)];_0x2e6e58[_0x514e3e(0x159)]=ROLE_DESCRIPTIONS[_0x1df809]||'',handleRoleChange();});const _0x3bad45=_0xc20e1a['value'];_0x2e6e58['textContent']=ROLE_DESCRIPTIONS[_0x3bad45]||'',setupPermissionsSection();}function setupPermissionsSection(){const _0xa31bbd=_0x47b723,_0x39b41c=document[_0xa31bbd(0x157)](_0xa31bbd(0x13c)),_0x279df7=document[_0xa31bbd(0x157)](_0xa31bbd(0x1c3)),_0x41ed87=state[_0xa31bbd(0x193)]?.['permissions']?.[_0xa31bbd(0x17d)](_0x4b9c6c=>_0x4b9c6c['canAssign']);if(!_0x41ed87||!_0x39b41c||!_0x279df7){if(_0x39b41c)_0x39b41c['style'][_0xa31bbd(0x1d9)]=_0xa31bbd(0x13b);return;}_0x39b41c[_0xa31bbd(0x11f)]['display']=_0xa31bbd(0x1d4);const _0x3335be={};state[_0xa31bbd(0x193)][_0xa31bbd(0x166)]['forEach'](_0x3bdc3b=>{const _0x3a363b=_0xa31bbd;if(!_0x3bdc3b[_0x3a363b(0x137)])return;const [_0x40dac9]=_0x3bdc3b['key'][_0x3a363b(0x18a)](':');!_0x3335be[_0x40dac9]&&(_0x3335be[_0x40dac9]=[]),_0x3335be[_0x40dac9][_0x3a363b(0x1a1)](_0x3bdc3b);}),_0x279df7['innerHTML']=Object[_0xa31bbd(0x185)](_0x3335be)[_0xa31bbd(0x123)](([_0x89d1ae,_0x2910a4])=>_0xa31bbd(0x1b4)+(PERMISSION_CATEGORIES[_0x89d1ae]||_0x89d1ae)+'</h4>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22permission-items\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+_0x2910a4['map'](_0x14fa58=>'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22permission-item\x22\x20title=\x22'+Utils[_0xa31bbd(0x180)](_0x14fa58['description'])+_0xa31bbd(0x1d3)+_0x14fa58[_0xa31bbd(0x116)]+_0xa31bbd(0x1b6)+_0x14fa58[_0xa31bbd(0x116)][_0xa31bbd(0x18a)](':')[0x1]+_0xa31bbd(0x171))['join']('')+'\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20')[_0xa31bbd(0x152)](''),_0x279df7[_0xa31bbd(0x14e)](_0xa31bbd(0x1c2))[_0xa31bbd(0x14a)](_0x437c9a=>{const _0x1ac927=_0xa31bbd;_0x437c9a[_0x1ac927(0x16a)](_0x1ac927(0x12f),handlePermissionChange);});}function getRolePermissions(_0xa3c794){const _0x5879df=_0x47b723,_0x1e05cf={'admin':['*'],'manager':['tasks:create','tasks:execute',_0x5879df(0x1d1),'tasks:view_all',_0x5879df(0x156),_0x5879df(0x1ac),_0x5879df(0x14d),'tasks:assign',_0x5879df(0x1e1),_0x5879df(0x115),_0x5879df(0x14f),_0x5879df(0x146),_0x5879df(0x1a7),_0x5879df(0x1cf),_0x5879df(0x18b)],'developer':[_0x5879df(0x169),_0x5879df(0x1b7),_0x5879df(0x1d1),'tasks:delete_own',_0x5879df(0x1e1),_0x5879df(0x115),_0x5879df(0x18b)],'viewer':[_0x5879df(0x1d1),_0x5879df(0x1e1),_0x5879df(0x115),'apikeys:manage_own']};return _0x1e05cf[_0xa3c794]||[];}function _0x2474(_0x54374b,_0x1d5de8){_0x54374b=_0x54374b-0x112;const _0x3194d0=_0x3194();let _0x24743e=_0x3194d0[_0x54374b];if(_0x2474['VJIidR']===undefined){var _0x466db4=function(_0x3a572d){const _0x5954b5='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x430ce9='',_0x46dbb0='';for(let _0x3ce3c1=0x0,_0x1e5396,_0xc20e1a,_0x2e6e58=0x0;_0xc20e1a=_0x3a572d['charAt'](_0x2e6e58++);~_0xc20e1a&&(_0x1e5396=_0x3ce3c1%0x4?_0x1e5396*0x40+_0xc20e1a:_0xc20e1a,_0x3ce3c1++%0x4)?_0x430ce9+=String['fromCharCode'](0xff&_0x1e5396>>(-0x2*_0x3ce3c1&0x6)):0x0){_0xc20e1a=_0x5954b5['indexOf'](_0xc20e1a);}for(let _0x3bad45=0x0,_0x7c6315=_0x430ce9['length'];_0x3bad45<_0x7c6315;_0x3bad45++){_0x46dbb0+='%'+('00'+_0x430ce9['charCodeAt'](_0x3bad45)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x46dbb0);};_0x2474['tKHsfs']=_0x466db4,_0x2474['xKMrxX']={},_0x2474['VJIidR']=!![];}const _0x3b19a9=_0x3194d0[0x0],_0x4617cf=_0x54374b+_0x3b19a9,_0x39e4cb=_0x2474['xKMrxX'][_0x4617cf];return!_0x39e4cb?(_0x24743e=_0x2474['tKHsfs'](_0x24743e),_0x2474['xKMrxX'][_0x4617cf]=_0x24743e):_0x24743e=_0x39e4cb,_0x24743e;}function roleHasPermission(_0x380ae1,_0x351ea0){const _0x202f14=_0x47b723,_0x30763c=getRolePermissions(_0x380ae1);if(_0x30763c['includes']('*'))return!![];if(_0x30763c[_0x202f14(0x16b)](_0x351ea0))return!![];const [_0x553065]=_0x351ea0[_0x202f14(0x18a)](':');if(_0x30763c['includes'](_0x553065+':*'))return!![];return![];}function togglePermissionsSection(){const _0x1e87b7=_0x47b723,_0x159705=document['getElementById'](_0x1e87b7(0x1c3)),_0x5863f3=document['getElementById'](_0x1e87b7(0x13d));if(!_0x159705||!_0x5863f3)return;state[_0x1e87b7(0x179)]=!state[_0x1e87b7(0x179)],state[_0x1e87b7(0x179)]?(_0x159705[_0x1e87b7(0x11f)][_0x1e87b7(0x1d9)]='block',_0x5863f3[_0x1e87b7(0x159)]=_0x1e87b7(0x126)):(_0x159705['style'][_0x1e87b7(0x1d9)]='none',_0x5863f3[_0x1e87b7(0x159)]=_0x1e87b7(0x1c1));}function handlePermissionChange(_0x542b83){const _0xd23716=_0x47b723,_0x46382d=_0x542b83['target'],_0xcd81ab=_0x46382d['value'];_0x46382d['checked']?!state[_0xd23716(0x1da)][_0xd23716(0x16b)](_0xcd81ab)&&state['selectedPermissions'][_0xd23716(0x1a1)](_0xcd81ab):state[_0xd23716(0x1da)]=state[_0xd23716(0x1da)][_0xd23716(0x1d7)](_0x4ef4c5=>_0x4ef4c5!==_0xcd81ab);}function updatePermissionCheckboxes(_0x2fbc26=[],_0x516d77=null){const _0x286ad3=_0x47b723;state[_0x286ad3(0x1da)]=[..._0x2fbc26];const _0x2c6245=document[_0x286ad3(0x157)](_0x286ad3(0x1c3)),_0x18acdb=_0x516d77||document[_0x286ad3(0x157)]('user-role')?.['value']||'developer';if(!_0x2c6245)return;_0x2c6245['querySelectorAll']('.permission-item')[_0x286ad3(0x14a)](_0x333765=>{const _0x3cf916=_0x286ad3,_0x15b210=_0x333765[_0x3cf916(0x1a0)](_0x3cf916(0x1c2)),_0x15e5ee=_0x333765['querySelector'](_0x3cf916(0x145)),_0x1b0996=_0x15b210[_0x3cf916(0x190)],_0x833bba=roleHasPermission(_0x18acdb,_0x1b0996),_0x20eb20=_0x2fbc26[_0x3cf916(0x16b)](_0x1b0996);if(_0x833bba)_0x15b210['checked']=!![],_0x15b210[_0x3cf916(0x17a)]=!![],_0x333765['classList']['add'](_0x3cf916(0x143)),_0x333765[_0x3cf916(0x192)][_0x3cf916(0x1c5)](_0x3cf916(0x1af)),_0x15e5ee&&(_0x15e5ee['style'][_0x3cf916(0x1d9)]=_0x3cf916(0x167),_0x15e5ee[_0x3cf916(0x159)]=_0x18acdb);else{if(_0x20eb20){_0x15b210[_0x3cf916(0x172)]=!![],_0x15b210[_0x3cf916(0x17a)]=![],_0x333765['classList']['remove'](_0x3cf916(0x143)),_0x333765[_0x3cf916(0x192)][_0x3cf916(0x1dd)](_0x3cf916(0x1af));if(_0x15e5ee)_0x15e5ee['style'][_0x3cf916(0x1d9)]=_0x3cf916(0x13b);}else{_0x15b210['checked']=![],_0x15b210[_0x3cf916(0x17a)]=![],_0x333765[_0x3cf916(0x192)][_0x3cf916(0x1c5)](_0x3cf916(0x143),'permission-custom');if(_0x15e5ee)_0x15e5ee[_0x3cf916(0x11f)][_0x3cf916(0x1d9)]='none';}}});}function handleRoleChange(){const _0x42fbdb=_0x47b723,_0x4dc7fa=document[_0x42fbdb(0x157)](_0x42fbdb(0x121))?.[_0x42fbdb(0x190)];_0x4dc7fa&&updatePermissionCheckboxes(state[_0x42fbdb(0x1da)],_0x4dc7fa);}function resetPermissionsSection(){const _0x3acf3d=_0x47b723;state[_0x3acf3d(0x1da)]=[],state['permissionsExpanded']=![];const _0x37082a=document['getElementById'](_0x3acf3d(0x1c3)),_0x33a769=document[_0x3acf3d(0x157)]('toggle-permissions-text');_0x37082a&&(_0x37082a[_0x3acf3d(0x11f)]['display']=_0x3acf3d(0x13b));_0x33a769&&(_0x33a769[_0x3acf3d(0x159)]=_0x3acf3d(0x1c1));const _0x121257=document[_0x3acf3d(0x157)](_0x3acf3d(0x121))?.[_0x3acf3d(0x190)]||'developer';updatePermissionCheckboxes([],_0x121257);}async function checkEmailConfig(){const _0x36bf4c=_0x47b723;try{const _0x4fc41b=await API[_0x36bf4c(0x196)]();state[_0x36bf4c(0x1cd)]=_0x4fc41b[_0x36bf4c(0x1bf)],console['log'](_0x36bf4c(0x1cb),state[_0x36bf4c(0x1cd)]);}catch(_0x2227e8){console[_0x36bf4c(0x13a)](_0x36bf4c(0x191),_0x2227e8),state[_0x36bf4c(0x1cd)]=![];}}function bindEventListeners(){const _0x1835b3=_0x47b723;document[_0x1835b3(0x157)](_0x1835b3(0x1c7))?.[_0x1835b3(0x16a)](_0x1835b3(0x1b1),showCreateUserModal),document[_0x1835b3(0x157)]('close-user-modal')?.[_0x1835b3(0x16a)](_0x1835b3(0x1b1),hideUserModal),document[_0x1835b3(0x157)](_0x1835b3(0x184))?.[_0x1835b3(0x16a)]('click',hideUserModal),document[_0x1835b3(0x157)](_0x1835b3(0x11b))?.[_0x1835b3(0x16a)]('click',saveUser),document[_0x1835b3(0x1a0)](_0x1835b3(0x1b2))?.[_0x1835b3(0x16a)](_0x1835b3(0x1b1),hideUserModal),document[_0x1835b3(0x157)](_0x1835b3(0x13e))?.[_0x1835b3(0x16a)](_0x1835b3(0x1b1),hideDeleteModal),document['getElementById'](_0x1835b3(0x195))?.[_0x1835b3(0x16a)](_0x1835b3(0x1b1),hideDeleteModal),document['getElementById']('confirm-delete')?.[_0x1835b3(0x16a)](_0x1835b3(0x1b1),confirmDeleteUser),document[_0x1835b3(0x1a0)](_0x1835b3(0x17b))?.[_0x1835b3(0x16a)]('click',hideDeleteModal),document[_0x1835b3(0x157)](_0x1835b3(0x1b3))?.[_0x1835b3(0x16a)]('click',hideSetupLinkModal),document[_0x1835b3(0x157)]('close-setup-link')?.['addEventListener'](_0x1835b3(0x1b1),hideSetupLinkModal),document[_0x1835b3(0x157)]('copy-setup-link')?.[_0x1835b3(0x16a)]('click',copySetupLink),document[_0x1835b3(0x157)](_0x1835b3(0x17f))?.[_0x1835b3(0x16a)]('click',emailSetupLink),document[_0x1835b3(0x1a0)](_0x1835b3(0x119))?.['addEventListener']('click',hideSetupLinkModal),document[_0x1835b3(0x157)](_0x1835b3(0x1a3))?.[_0x1835b3(0x16a)](_0x1835b3(0x12f),handleSkipPasswordChange),document[_0x1835b3(0x157)]('toggle-permissions')?.[_0x1835b3(0x16a)](_0x1835b3(0x1b1),togglePermissionsSection),document[_0x1835b3(0x157)]('retry-users-btn')?.[_0x1835b3(0x16a)]('click',loadUsers);}async function loadUsers(){const _0x320738=_0x47b723,_0x5108ee=document[_0x320738(0x157)](_0x320738(0x140)),_0x277c88=document[_0x320738(0x157)](_0x320738(0x181)),_0x46606c=document[_0x320738(0x157)](_0x320738(0x11a));try{_0x5108ee[_0x320738(0x1a4)]=![],_0x277c88[_0x320738(0x1a4)]=!![],_0x46606c[_0x320738(0x1a4)]=!![];const _0x3dfeec=await API['getUsers']();state[_0x320738(0x14c)]=_0x3dfeec[_0x320738(0x14c)]||[],renderUsers(),_0x5108ee[_0x320738(0x1a4)]=!![],_0x46606c[_0x320738(0x1a4)]=![];}catch(_0x595ca5){console[_0x320738(0x13a)](_0x320738(0x14b),_0x595ca5),_0x5108ee['hidden']=!![],_0x277c88['hidden']=![],document[_0x320738(0x157)](_0x320738(0x182))['textContent']=_0x595ca5[_0x320738(0x11e)];}}function renderUsers(){const _0x4b51c5=_0x47b723,_0x2cd6ab=document['getElementById']('users-table-body'),_0x12ec03=document['getElementById']('user-count');if(!_0x2cd6ab)return;_0x12ec03&&(_0x12ec03[_0x4b51c5(0x159)]=state[_0x4b51c5(0x14c)][_0x4b51c5(0x178)]+'\x20user'+(state[_0x4b51c5(0x14c)][_0x4b51c5(0x178)]===0x1?'':'s'));const _0x453058=[...state[_0x4b51c5(0x14c)]][_0x4b51c5(0x188)]((_0x38ddfb,_0xb2d221)=>{const _0xd779c3=_0x4b51c5,_0x4d35bd=new Date(_0x38ddfb[_0xd779c3(0x19a)])[_0xd779c3(0x1b9)](),_0x4db125=new Date(_0xb2d221[_0xd779c3(0x19a)])[_0xd779c3(0x1b9)]();return _0x4db125-_0x4d35bd;});_0x2cd6ab['innerHTML']=_0x453058[_0x4b51c5(0x123)](_0x3c557f=>_0x4b51c5(0x1a2)+Utils[_0x4b51c5(0x180)](_0x3c557f['username'])+_0x4b51c5(0x118)+Utils[_0x4b51c5(0x180)](_0x3c557f['name'])+_0x4b51c5(0x1be)+Utils[_0x4b51c5(0x180)](_0x3c557f[_0x4b51c5(0x133)])+_0x4b51c5(0x1e2)+_0x3c557f[_0x4b51c5(0x194)]+'\x22>'+formatRoleName(_0x3c557f['role'])+_0x4b51c5(0x16d)+(_0x3c557f[_0x4b51c5(0x166)]?.[_0x4b51c5(0x178)]?'<span\x20class=\x22custom-permissions-badge\x22\x20title=\x22'+_0x3c557f[_0x4b51c5(0x166)][_0x4b51c5(0x152)](',\x20')+_0x4b51c5(0x170)+_0x3c557f[_0x4b51c5(0x166)][_0x4b51c5(0x178)]+'</span>':'')+_0x4b51c5(0x18e)+Utils[_0x4b51c5(0x165)](_0x3c557f[_0x4b51c5(0x19a)])+_0x4b51c5(0x1c8)+_0x3c557f['id']+'\x27)\x22>Edit</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-secondary\x20btn-small\x22\x20onclick=\x22window.resetPassword(\x27'+_0x3c557f['id']+_0x4b51c5(0x134)+_0x3c557f['id']+_0x4b51c5(0x1d6))[_0x4b51c5(0x152)]('');}function _0x3194(){const _0x296b59=['C2v0DxaTBgLUAY1TB2rHBa','CMvWB3j0vMfSAwrPDhK','B3b0Aw9U','C2v0DxaTBgLUAY11CMW','y2HHBMDL','mte4mdDRy21KwNy','rMfPBgvKihrVignYzwf0zsbWyxnZD29YzcbYzxnLDcbSAw5R','DxnLCI1TB2rHBa','zw1HAwW','jYKIpLjLC2v0ifbHC3n3B3jKpc9IDxr0B24+cIaGicaGicaGica8yNv0Dg9UignSyxnZpsjIDg4Tz2HVC3qGyNrUlxnTywXSiIbVBMnSAwnRpsj3Aw5KB3CUzgvSzxrLvxnLCIGN','zw1HAwXtzw50','qwnJzxnZigrLBMLLzdOGvxnLCIbTyw5Hz2vTzw50ihbYAxzPBgvNzxmGCMvXDwLYzwq','y2fUqxnZAwDU','zgvSzxrLlw1VzgfS','kt8GvgHPCYb3AwXSignYzwf0zsbHigXPBMSGDgHHDcb0Agv5ignHBIb1C2uGDg8GC2v0igeGBMv3ihbHC3n3B3jKlG','zxjYB3i','BM9Uzq','CgvYBwLZC2LVBNmTC2vJDgLVBG','Dg9Nz2XLlxbLCM1PC3nPB25ZlxrLEhq','y2XVC2uTzgvSzxrLlw1VzgfS','zwrPDgLUz1vZzxjjza','DxnLCNmTBg9HzgLUzW','CM9Szun1C3rVBvnLBgvJDa','zM9YBs1LCNjVCG','CgvYBwLZC2LVBI1MCM9TlxjVBgu','mtG1neDpshjUvW','lNbLCM1PC3nPB24TCM9Szs1IywrNzq','DxnLCNm6y3jLyxrL','ugXLyxnLigzPBgWGAw4GywXSihjLCxvPCMvKigzPzwXKCW','vxnLCIbJCMvHDgvKihn1y2nLC3nMDwXSEq','C2v0Dxa','zM9YrwfJAa','rMfPBgvKihrVigXVywqGDxnLCNm','DxnLCNm','DgfZA3m6ANvKz2u','CxvLCNLtzwXLy3rVCKfSBa','DxnLCNm6DMLLDW','r2vUzxjHDguGtgLUAW','rMfPBgvKihrVihnLBMqGzw1HAwW6ia','AM9PBG','CMvXDwLYzwq','C2v0DxaTBgLUAY11C2vYBMfTzq','DxnLCI1LBwfPBa','DgfZA3m6zgvSzxrLx293BG','z2v0rwXLBwvUDej5swq','Aw5KzxGUAhrTBa','Dgv4DenVBNrLBNq','DxnLCG','uMvHzc1VBMX5igfJy2vZCYb0BYbVD24GDgfZA3mGyw5KigvUDMLYB25Tzw50CW','nK92r2zhsW','Bg9NAw4UAhrTBa','DxjS','AhjLzG','Bw9KywWTDgL0Bgu','CgfZC3DVCMqTCMvXDwLYzwq','u2f2zsbvC2vY','CM9Szs1KzxnJCMLWDgLVBG','Bg9JyxrPB24','zM9YBwf0uMvSyxrPDMvuAw1L','CgvYBwLZC2LVBNm','Aw5SAw5L','mtyWoe9PveLIAW','DgfZA3m6y3jLyxrL','ywrKrxzLBNrmAxn0zw5LCG','Aw5JBhvKzxm','rgv2zwXVCgvY','pc9ZCgfUpGOGicaGicaGia','u2v0DgLUz3m','zgvSzxrPBMDvC2vYswq','iJ4R','pc9ZCgfUpGOGicaGicaGicaGica8C3bHBIbJBgfZCZ0ICgvYBwLZC2LVBI1YB2XLlwjHzgDLiIbZDhLSzt0IzgLZCgXHEtOGBM9UztSIpNjVBgu8l3nWyw4+cIaGicaGicaGica8l2XHyMvSpGOGicaGicaGia','y2HLy2TLza','C2HVD1rVyxn0','Dg9Rzw4','rw52AxjVBM1LBNrZ','mtvPr1HHrvu','DhjPBq','BgvUz3rO','CgvYBwLZC2LVBNnfEhbHBMrLza','zgLZywjSzwq','i2rLBgv0zs1TB2rHBcaUBw9KywWTB3zLCMXHEq','yxbWzw5Kq2HPBgq','C29Tzq','DxnLCI1WyxnZD29Yza','zw1HAwWTC2v0DxaTBgLUAW','zxnJyxbLshrTBa','DxnLCNmTzxjYB3i','DxnLCNmTzxjYB3iTBwvZC2fNzq','C3vJy2vZCW','y2fUy2vSlxvZzxi','zw50CMLLCW','z2v0uM9SzxnjBMzV','vMLLD2vY','C29YDa','nZu3nJi4nxHqExjrua','C3bSAxq','yxbPA2v5CZPTyw5Hz2vFB3DU','zw1HAwWTyNv0Dg9UlxrLEhq','ntmZnZq4mtjwq1HNqxa','cIaGicaGidWVDgq+cIaGicaGidX0zd4','ugfZC3DVCMqGAxmGCMvXDwLYzwqGzM9Yig5LDYb1C2vYCW','DMfSDwu','rMfPBgvKihrVignOzwnRigvTywLSignVBMzPzW','y2XHC3nmAxn0','CM9SzxnjBMzV','CM9Szq','y2fUy2vSlwrLBgv0zq','z2v0rw1HAwXdB25MAwC','mJuZotbiCM10A3K','qwrTAw4','DxnLCI11C2vYBMfTzq','y3jLyxrLzf9HDa','tgLUAYbJB3bPzwqGDg8Gy2XPCgjVyxjK','vxnLCIbTyw5Hz2vTzw50igfUzcb0yxnRig92zxjZAwDODcbJyxbHyMLSAxrPzxm','twLUAw11Bsa4ignOyxjHy3rLCNm','CgfZC3DVCMqTAgLUDa','CMvZzxq','CxvLCNLtzwXLy3rVCG','ChvZAa','cIaGica8Dhi+cIaGicaGidX0zd4kicaGicaGica8zgL2ignSyxnZpsj1C2vYlxvZzxjUyw1LiJ4kicaGicaGicaGia','C2TPCc1WyxnZD29Yza','AgLKzgvU','DhLWzq','tgvHDMuGyMXHBMSGDg8GA2vLCcbJDxjYzw50ihbHC3n3B3jK','DxnLCNm6zwrPDa','vxnLCIbKzwXLDgvKihn1y2nLC3nMDwXSEq','vgfZA3m','u2vUzgLUzY4UlG','y3jLyxrLrwXLBwvUDa','DgfZA3m6zgvSzxrLx2fUEq','y29UzMLYBs1KzwXLDgu','nZG2ndG2ohPNr2fnAa','CgvYBwLZC2LVBI1JDxn0B20','uMvZzxqGugfZC3DVCMq','y2XPy2S','i3vZzxiTBw9KywWGlM1VzgfSlw92zxjSyxK','y2XVC2uTC2v0DxaTBgLUAY1TB2rHBa','cIaGica8zgL2ignSyxnZpsjWzxjTAxnZAw9UlwnHDgvNB3j5iJ4kicaGicaGpgG0ignSyxnZpsjWzxjTAxnZAw9UlwnHDgvNB3j5lxrPDgXLiJ4','DxnLCI1MB3jT','iIbJBgfZCZ0ICgvYBwLZC2LVBI1JAgvJA2jVEci+cIaGicaGicaGicaGidXZCgfUignSyxnZpsjWzxjTAxnZAw9UlwTLEsi+','DgfZA3m6zxHLy3v0zq','y3jLyxrLvxnLCG','z2v0vgLTzq','mJKYmtu2sfbIBgnz','DxnLCKLK','C2v0DxbmAw5Rrgf0yq','C2TPCc1WyxnZD29Yzc1JB250ywLUzxi','pc90zd4kicaGicaGphrKpG','y29UzMLNDxjLza','DxnLCI1Uyw1L','u2HVDW','lNbLCM1PC3nPB24Ty2HLy2TIB3G','CgvYBwLZC2LVBNmTBgLZDa','rMfPBgvKihrVigrLBgv0zsb1C2vY','CMvTB3zL','BMfTzq','y3jLyxrLlxvZzxiTyNrU','pc90zd4kicaGicaGphrKpGOGicaGicaGidXKAxyGy2XHC3m9iNvZzxiTywn0Aw9UCYi+cIaGicaGicaGica8yNv0Dg9UignSyxnZpsjIDg4TC2vJB25Kyxj5igj0BI1ZBwfSBciGB25JBgLJAZ0ID2LUzg93lMvKAxrvC2vYkcC','qvbjieTLExm','CM9Szxm','rw1HAwWGy29UzMLNDxjLzdO','y3vYCMvUDfvZzxi','zw1HAwXdB25MAwD1CMvK','y3jLyxrLugfZC3DVCMruB2TLBG','C2vYDMvYoMHLywX0Aa','zgLZCgf0y2HfDMvUDa','DgfZA3m6DMLLD19VD24','mJq3nZnfwefOy0m','iJ4kicaGicaGicaGicaGpgLUChv0ihr5Cgu9iMnOzwnRyM94iIb2ywX1zt0I','yMXVy2S','u2vYDMvY','jYKIpKrLBgv0ztWVyNv0Dg9UpGOGicaGicaGidWVzgL2pGOGicaGica8l3rKpGOGicaGpc90CJ4kica','zMLSDgvY','zw1HAwXfCNjVCG','zgLZCgXHEq','C2vSzwn0zwrqzxjTAxnZAw9UCW','C2v0DxbvCMW','zM9JDxm','ywrK','r2vUzxjHDguGysbWyxnZD29YzcbYzxnLDcbSAw5RigzVCIa','CgfZC3DVCMq','rMfPBgvKihrVignVChKGBgLUAW','zw52AxjVBM1LBNrZoNzPzxC','pc90zd4kicaGicaGphrKpGOGicaGicaGidXZCgfUignSyxnZpsjYB2XLlwjHzgDLihjVBguT','rw1HAwWGC2vUDcb0BYa','rgvSzxrPBMCUlI4','q3jLyxrPBMCUlI4','zMLUza','zw52AxjVBM1LBNrZoNzPzxDFzgv0ywLSCW','A2v5','zwrPDfvZzxi','cIaGicaGicaGpc9KAxy+cIaGicaGidWVDgq+cIaGicaGidX0zd4','i3nLDhvWlwXPBMSTBw9KywWGlM1VzgfSlw92zxjSyxK','DxnLCNmTy29UDgvUDa','C2f2zs11C2vY','y2XPCgjVyxjK','DxnLCM5HBwu','BwvZC2fNzq','C3r5Bgu','rw1HAwWGtgLUAW','DxnLCI1YB2XL','vxnLCNm','BwfW','ntHIrhvrwNm','z2v0q3vYCMvUDfvZzxi','sgLKzq','zgvSzxrLvxnLCG','C2HVDW','rMfPBgvKihrVigvTywLSihnLDhvWigXPBMS','rMfPBgvKihrVigrLBgv0zsb1C2vYoIa'];_0x3194=function(){return _0x296b59;};return _0x3194();}function showCreateUserModal(){const _0x100178=_0x47b723;state[_0x100178(0x13f)]=null;const _0x3386de=document[_0x100178(0x157)](_0x100178(0x132)),_0x217cd8=document[_0x100178(0x157)](_0x100178(0x160)),_0x20eb84=document[_0x100178(0x157)](_0x100178(0x17e)),_0x546b72=document['getElementById'](_0x100178(0x161)),_0x1b30ea=document[_0x100178(0x157)](_0x100178(0x19e)),_0x3602cd=document[_0x100178(0x157)](_0x100178(0x1bd)),_0x167739=document[_0x100178(0x157)](_0x100178(0x1a3));_0x217cd8['textContent']='Create\x20User',document[_0x100178(0x157)](_0x100178(0x1b5))[_0x100178(0x19f)](),_0x20eb84[_0x100178(0x153)]=!![];if(_0x546b72)_0x546b72['textContent']='*';_0x3602cd&&(_0x3602cd[_0x100178(0x11f)][_0x100178(0x1d9)]='block',_0x167739[_0x100178(0x172)]=![]),_0x1b30ea&&(_0x1b30ea[_0x100178(0x159)]=_0x100178(0x19d)),resetPermissionsSection(),_0x3386de[_0x100178(0x1a4)]=![],setTimeout(()=>{const _0x21c97f=_0x100178;document['getElementById'](_0x21c97f(0x199))[_0x21c97f(0x1dc)]();},0x64);}window[_0x47b723(0x117)]=function(_0x3d3c59){const _0x48a944=_0x47b723,_0x2e2386=state[_0x48a944(0x14c)][_0x48a944(0x114)](_0x3e0c96=>_0x3e0c96['id']===_0x3d3c59);if(!_0x2e2386)return;state[_0x48a944(0x13f)]=_0x3d3c59;const _0x287994=document['getElementById']('user-modal'),_0x54b0d6=document[_0x48a944(0x157)](_0x48a944(0x160)),_0xbc1651=document['getElementById']('user-password'),_0x42e95c=document[_0x48a944(0x157)](_0x48a944(0x161)),_0x1eec0d=document[_0x48a944(0x157)]('password-hint'),_0x3f5d52=document[_0x48a944(0x157)](_0x48a944(0x1bd));_0x54b0d6[_0x48a944(0x159)]='Edit\x20User',document[_0x48a944(0x157)](_0x48a944(0x199))['value']=_0x2e2386['username'],document[_0x48a944(0x157)](_0x48a944(0x1c0))['value']=_0x2e2386[_0x48a944(0x1c6)],document[_0x48a944(0x157)](_0x48a944(0x155))['value']=_0x2e2386[_0x48a944(0x133)];const _0x45d950=document[_0x48a944(0x157)]('user-role');_0x45d950[_0x48a944(0x190)]=_0x2e2386['role'],_0x45d950[_0x48a944(0x1d0)](new Event(_0x48a944(0x12f),{'bubbles':!![]})),_0xbc1651[_0x48a944(0x190)]='',_0xbc1651['required']=![];if(_0x42e95c)_0x42e95c['textContent']='';_0x3f5d52&&(_0x3f5d52[_0x48a944(0x11f)][_0x48a944(0x1d9)]=_0x48a944(0x13b));_0x1eec0d&&(_0x1eec0d['textContent']=_0x48a944(0x1a6));const _0x12b8a5=_0x2e2386[_0x48a944(0x166)]||[];updatePermissionCheckboxes(_0x12b8a5,_0x2e2386[_0x48a944(0x194)]);if(_0x12b8a5['length']>0x0){state[_0x48a944(0x179)]=!![];const _0x23572b=document[_0x48a944(0x157)]('permissions-list'),_0x50e950=document[_0x48a944(0x157)]('toggle-permissions-text');if(_0x23572b)_0x23572b[_0x48a944(0x11f)]['display']=_0x48a944(0x1d4);if(_0x50e950)_0x50e950['textContent']='Hide';}else{state[_0x48a944(0x179)]=![];const _0x23f8bf=document[_0x48a944(0x157)](_0x48a944(0x1c3)),_0x6715a3=document[_0x48a944(0x157)](_0x48a944(0x13d));if(_0x23f8bf)_0x23f8bf[_0x48a944(0x11f)][_0x48a944(0x1d9)]=_0x48a944(0x13b);if(_0x6715a3)_0x6715a3['textContent']=_0x48a944(0x1c1);}_0x287994[_0x48a944(0x1a4)]=![],setTimeout(()=>{const _0x7ccb7=_0x48a944;document[_0x7ccb7(0x157)](_0x7ccb7(0x199))[_0x7ccb7(0x1dc)]();},0x64);};function hideUserModal(){const _0x89ca2b=_0x47b723,_0xc4eb7f=document['getElementById']('user-modal'),_0x26e236=document[_0x89ca2b(0x157)](_0x89ca2b(0x142)),_0x86ccd5=document[_0x89ca2b(0x157)](_0x89ca2b(0x11b));_0xc4eb7f['hidden']=!![],_0x26e236['hidden']=!![],state[_0x89ca2b(0x13f)]=null,_0x86ccd5&&(_0x86ccd5['disabled']=![],_0x86ccd5[_0x89ca2b(0x159)]=_0x89ca2b(0x162));}async function saveUser(){const _0x43327e=_0x47b723,_0x37657d=document[_0x43327e(0x157)](_0x43327e(0x1b5)),_0x5c3259=document['getElementById'](_0x43327e(0x1a3))?.[_0x43327e(0x172)]||![];if(!_0x5c3259&&!_0x37657d['checkValidity']()){_0x37657d[_0x43327e(0x12c)]();return;}const _0x51df9=document[_0x43327e(0x157)]('form-error'),_0x289f79=document[_0x43327e(0x157)](_0x43327e(0x11b)),_0x5d59d5=document[_0x43327e(0x157)](_0x43327e(0x199))[_0x43327e(0x190)][_0x43327e(0x177)](),_0x2e08d4=document[_0x43327e(0x157)](_0x43327e(0x1c0))[_0x43327e(0x190)][_0x43327e(0x177)](),_0x294074=document[_0x43327e(0x157)](_0x43327e(0x155))[_0x43327e(0x190)]['trim'](),_0x44f2d1=document[_0x43327e(0x157)](_0x43327e(0x17e))[_0x43327e(0x190)],_0x28cbe7=document[_0x43327e(0x157)](_0x43327e(0x121))[_0x43327e(0x190)];if(!_0x5d59d5||!_0x2e08d4||!_0x294074){_0x51df9['textContent']=_0x43327e(0x147),_0x51df9[_0x43327e(0x1a4)]=![];return;}_0x51df9[_0x43327e(0x1a4)]=!![];const _0x4d3e35=_0x289f79['textContent'];_0x289f79[_0x43327e(0x17a)]=!![],_0x289f79[_0x43327e(0x159)]=state[_0x43327e(0x13f)]?'Updating...':_0x43327e(0x113);try{if(state[_0x43327e(0x13f)]){const _0x5e44b4={'username':_0x5d59d5,'name':_0x2e08d4,'email':_0x294074,'role':_0x28cbe7};_0x44f2d1&&(_0x5e44b4[_0x43327e(0x1df)]=_0x44f2d1),state[_0x43327e(0x193)]?.[_0x43327e(0x166)]?.[_0x43327e(0x17d)](_0x2eb21b=>_0x2eb21b[_0x43327e(0x137)])&&(_0x5e44b4[_0x43327e(0x166)]=state['selectedPermissions']),await API['updateUser'](state[_0x43327e(0x13f)],_0x5e44b4),Utils[_0x43327e(0x173)]('User\x20updated\x20successfully',_0x43327e(0x183)),await loadUsers(),hideUserModal();}else{const _0x2a19c0={'username':_0x5d59d5,'name':_0x2e08d4,'email':_0x294074,'role':_0x28cbe7};if(!_0x5c3259){if(!_0x44f2d1)throw new Error(_0x43327e(0x18f));_0x2a19c0[_0x43327e(0x1df)]=_0x44f2d1;}state[_0x43327e(0x193)]?.[_0x43327e(0x166)]?.[_0x43327e(0x17d)](_0x555d61=>_0x555d61['canAssign'])&&state['selectedPermissions']['length']>0x0&&(_0x2a19c0['permissions']=state[_0x43327e(0x1da)]);const _0x53c4f9=await API[_0x43327e(0x1b8)](_0x2a19c0),_0x3abcc0=_0x53c4f9[_0x43327e(0x15a)];if(_0x5c3259||!_0x44f2d1){const _0x2369e6=await API[_0x43327e(0x1ce)](_0x3abcc0['id'],_0x43327e(0x149),![]);state[_0x43327e(0x1bc)]={'username':_0x3abcc0[_0x43327e(0x11d)],'email':_0x3abcc0[_0x43327e(0x133)],'url':_0x2369e6[_0x43327e(0x174)][_0x43327e(0x1db)],'userId':_0x3abcc0['id'],'type':'setup','emailSent':![]},await loadUsers(),hideUserModal(),showSetupLinkModal();}else Utils[_0x43327e(0x173)](_0x43327e(0x148),'success'),await loadUsers(),hideUserModal();}}catch(_0x31da23){console['error']('Failed\x20to\x20save\x20user',_0x31da23),_0x51df9['textContent']=_0x31da23['message'],_0x51df9['hidden']=![],_0x289f79[_0x43327e(0x17a)]=![],_0x289f79[_0x43327e(0x159)]=_0x4d3e35;}}window[_0x47b723(0x127)]=function(_0x574d7e){const _0x4b1bd4=_0x47b723,_0x558e8d=state[_0x4b1bd4(0x14c)][_0x4b1bd4(0x114)](_0xcf6189=>_0xcf6189['id']===_0x574d7e);if(!_0x558e8d)return;state[_0x4b1bd4(0x16f)]=_0x574d7e;const _0x4a19e4=document[_0x4b1bd4(0x157)](_0x4b1bd4(0x138)),_0x4c6545=document[_0x4b1bd4(0x157)]('delete-user-name');_0x4c6545[_0x4b1bd4(0x159)]=_0x558e8d[_0x4b1bd4(0x1c6)]+'\x20('+_0x558e8d[_0x4b1bd4(0x11d)]+')',_0x4a19e4['hidden']=![];};function hideDeleteModal(){const _0x1be713=_0x47b723,_0xe187f7=document[_0x1be713(0x157)]('delete-modal');_0xe187f7[_0x1be713(0x1a4)]=!![],state[_0x1be713(0x16f)]=null;}async function confirmDeleteUser(){const _0x1d34e9=_0x47b723;if(!state[_0x1d34e9(0x16f)])return;const _0x2a9a50=document[_0x1d34e9(0x157)](_0x1d34e9(0x1ad)),_0x4179bf=_0x2a9a50[_0x1d34e9(0x159)];_0x2a9a50['disabled']=!![],_0x2a9a50[_0x1d34e9(0x159)]=_0x1d34e9(0x112);try{await API[_0x1d34e9(0x127)](state['deletingUserId']),Utils['showToast'](_0x1d34e9(0x1a8),'success'),await loadUsers(),hideDeleteModal();}catch(_0x1b7477){console[_0x1d34e9(0x13a)](_0x1d34e9(0x1c4),_0x1b7477),Utils['showToast'](_0x1d34e9(0x12a)+_0x1b7477[_0x1d34e9(0x11e)],_0x1d34e9(0x13a)),_0x2a9a50['disabled']=![],_0x2a9a50['textContent']=_0x4179bf;}}function handleSkipPasswordChange(_0x2a73b7){const _0x3a23d1=_0x47b723,_0x512002=document[_0x3a23d1(0x157)]('user-password'),_0x24cc8d=_0x2a73b7['target'][_0x3a23d1(0x172)];_0x24cc8d?(_0x512002[_0x3a23d1(0x153)]=![],_0x512002[_0x3a23d1(0x17a)]=!![],_0x512002[_0x3a23d1(0x190)]=''):(_0x512002[_0x3a23d1(0x153)]=!![],_0x512002[_0x3a23d1(0x17a)]=![]);}function showSetupLinkModal(){const _0x5f0b14=_0x47b723;if(!state[_0x5f0b14(0x1bc)])return;const _0x4b1bab=document[_0x5f0b14(0x157)](_0x5f0b14(0x12b)),_0x2d5cba=document[_0x5f0b14(0x157)](_0x5f0b14(0x154)),_0x2283b3=document[_0x5f0b14(0x157)](_0x5f0b14(0x12e)),_0x75d710=document['getElementById'](_0x5f0b14(0x17f)),_0x588409=document[_0x5f0b14(0x157)](_0x5f0b14(0x18c));_0x2d5cba[_0x5f0b14(0x159)]=state[_0x5f0b14(0x1bc)][_0x5f0b14(0x11d)],_0x2283b3[_0x5f0b14(0x159)]=state[_0x5f0b14(0x1bc)][_0x5f0b14(0x15e)],_0x75d710&&_0x588409&&(_0x75d710['disabled']=![],_0x588409[_0x5f0b14(0x159)]=_0x5f0b14(0x120),state[_0x5f0b14(0x1cd)]&&!state[_0x5f0b14(0x1bc)][_0x5f0b14(0x135)]?_0x75d710['style'][_0x5f0b14(0x1d9)]='inline-block':_0x75d710[_0x5f0b14(0x11f)]['display']=_0x5f0b14(0x13b)),_0x4b1bab['hidden']=![];}function hideSetupLinkModal(){const _0x32938c=_0x47b723,_0x2d547e=document[_0x32938c(0x157)](_0x32938c(0x12b));_0x2d547e['hidden']=!![],state[_0x32938c(0x1bc)]=null;}async function copySetupLink(){const _0x3b746a=_0x47b723;if(!state[_0x3b746a(0x1bc)])return;try{await navigator[_0x3b746a(0x11c)]['writeText'](state['setupLinkData'][_0x3b746a(0x15e)]),Utils[_0x3b746a(0x173)](_0x3b746a(0x19b),_0x3b746a(0x183));}catch(_0x296c47){console['error'](_0x3b746a(0x1e0),_0x296c47),Utils[_0x3b746a(0x173)]('Failed\x20to\x20copy\x20link','error');}}async function emailSetupLink(){const _0x3b639a=_0x47b723;if(!state[_0x3b639a(0x1bc)])return;const _0x5173b3=document[_0x3b639a(0x157)](_0x3b639a(0x17f)),_0x3701bc=document[_0x3b639a(0x157)]('email-button-text');if(!_0x5173b3||!_0x3701bc)return;const _0x231a0c=_0x3701bc[_0x3b639a(0x159)];_0x5173b3['disabled']=!![],_0x3701bc[_0x3b639a(0x159)]=_0x3b639a(0x1aa);try{const _0x5c9f33=await API['createPasswordToken'](state[_0x3b639a(0x1bc)][_0x3b639a(0x1bb)],state[_0x3b639a(0x1bc)][_0x3b639a(0x1a5)],!![]);if(_0x5c9f33[_0x3b639a(0x135)])Utils[_0x3b639a(0x173)](_0x3b639a(0x1e3)+state[_0x3b639a(0x1bc)][_0x3b639a(0x133)],_0x3b639a(0x183)),state[_0x3b639a(0x1bc)]['emailSent']=!![],_0x5173b3['style'][_0x3b639a(0x1d9)]='none';else{const _0x3be1da=_0x5c9f33[_0x3b639a(0x1d8)]||'Failed\x20to\x20send\x20email';Utils[_0x3b639a(0x173)](_0x3be1da,_0x3b639a(0x13a)),_0x5173b3[_0x3b639a(0x17a)]=![],_0x3701bc['textContent']=_0x231a0c;}}catch(_0x1fcdf6){console[_0x3b639a(0x13a)](_0x3b639a(0x129),_0x1fcdf6),Utils[_0x3b639a(0x173)](_0x3b639a(0x151)+_0x1fcdf6[_0x3b639a(0x11e)],_0x3b639a(0x13a)),_0x5173b3[_0x3b639a(0x17a)]=![],_0x3701bc[_0x3b639a(0x159)]=_0x231a0c;}}window['resetPassword']=async function(_0x237142){const _0x4f20cb=_0x47b723,_0x4007cf=state[_0x4f20cb(0x14c)]['find'](_0x49e461=>_0x49e461['id']===_0x237142);if(!_0x4007cf)return;const _0x2e7b07=await ConfirmDialog[_0x4f20cb(0x128)]({'title':_0x4f20cb(0x1b0),'message':_0x4f20cb(0x1de)+_0x4007cf[_0x4f20cb(0x1c6)]+'\x20('+_0x4007cf[_0x4f20cb(0x11d)]+_0x4f20cb(0x139),'confirmText':_0x4f20cb(0x150)});if(!_0x2e7b07)return;try{const _0x3038f0=await API['createPasswordToken'](_0x237142,'reset',![]);state[_0x4f20cb(0x1bc)]={'username':_0x4007cf['username'],'email':_0x4007cf[_0x4f20cb(0x133)],'url':_0x3038f0['token'][_0x4f20cb(0x1db)],'userId':_0x4007cf['id'],'type':_0x4f20cb(0x19f),'emailSent':![]},showSetupLinkModal();}catch(_0x3c686c){console[_0x4f20cb(0x13a)](_0x4f20cb(0x131),_0x3c686c),Utils[_0x4f20cb(0x173)]('Failed\x20to\x20create\x20password\x20reset\x20link:\x20'+_0x3c686c[_0x4f20cb(0x11e)],_0x4f20cb(0x13a));}};
@@ -0,0 +1 @@
1
+ function _0x2b09(_0x1a49b9,_0x3bda34){_0x1a49b9=_0x1a49b9-0x90;const _0x5ef282=_0x5ef2();let _0x2b09a9=_0x5ef282[_0x1a49b9];if(_0x2b09['EypyJf']===undefined){var _0x5f46b2=function(_0xd42b72){const _0x51f7a6='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5018de='',_0x27cae0='';for(let _0x416dbd=0x0,_0x18d571,_0x55b810,_0x55435d=0x0;_0x55b810=_0xd42b72['charAt'](_0x55435d++);~_0x55b810&&(_0x18d571=_0x416dbd%0x4?_0x18d571*0x40+_0x55b810:_0x55b810,_0x416dbd++%0x4)?_0x5018de+=String['fromCharCode'](0xff&_0x18d571>>(-0x2*_0x416dbd&0x6)):0x0){_0x55b810=_0x51f7a6['indexOf'](_0x55b810);}for(let _0x5f0efd=0x0,_0x5804bb=_0x5018de['length'];_0x5f0efd<_0x5804bb;_0x5f0efd++){_0x27cae0+='%'+('00'+_0x5018de['charCodeAt'](_0x5f0efd)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x27cae0);};_0x2b09['SaDJkb']=_0x5f46b2,_0x2b09['aLLBeV']={},_0x2b09['EypyJf']=!![];}const _0x599f45=_0x5ef282[0x0],_0x429916=_0x1a49b9+_0x599f45,_0x4aef2b=_0x2b09['aLLBeV'][_0x429916];return!_0x4aef2b?(_0x2b09a9=_0x2b09['SaDJkb'](_0x2b09a9),_0x2b09['aLLBeV'][_0x429916]=_0x2b09a9):_0x2b09a9=_0x4aef2b,_0x2b09a9;}const _0x4f7f26=_0x2b09;(function(_0x540815,_0x1a6c16){const _0x1fd3f8=_0x2b09,_0x498ff9=_0x540815();while(!![]){try{const _0x465254=-parseInt(_0x1fd3f8(0x123))/0x1+-parseInt(_0x1fd3f8(0x130))/0x2*(parseInt(_0x1fd3f8(0x10d))/0x3)+parseInt(_0x1fd3f8(0xe8))/0x4*(-parseInt(_0x1fd3f8(0xd1))/0x5)+parseInt(_0x1fd3f8(0x98))/0x6*(parseInt(_0x1fd3f8(0xc4))/0x7)+-parseInt(_0x1fd3f8(0xb3))/0x8*(parseInt(_0x1fd3f8(0xd3))/0x9)+-parseInt(_0x1fd3f8(0xce))/0xa*(parseInt(_0x1fd3f8(0xcb))/0xb)+parseInt(_0x1fd3f8(0x10f))/0xc;if(_0x465254===_0x1a6c16)break;else _0x498ff9['push'](_0x498ff9['shift']());}catch(_0x1cfde4){_0x498ff9['push'](_0x498ff9['shift']());}}}(_0x5ef2,0x89a87));function _0x5ef2(){const _0x2eae5d=['zgf0yvrYyw5ZzMvY','z3jVDxbjza','yxr0ywnOrxzLBNrmAxn0zw5LCNm','ywrKvg9hCM91Ca','y2XVC2vZDa','lNzNBs1KCM9WlxPVBMu','z3jVDxbjBMrLEa','lMrYB3aTAw5KAwnHDg9Y','phn2zYbJBgfZCZ0IC3rHDhvZlwLJB24IihzPzxDcB3G9iJaGmcaXnIaXnIiGzMLSBd0Iy3vYCMvUDenVBg9YiJ48Cgf0AcbKpsjnocaWytGGocaWideGmcaWide2qtGGocaWidaGmca4idb6BtaGmtrbnIa2idaGmsaXidGGmMe2idyGmcaWideGmcaXmNPTms02lJvwneG3DJqUnwWZidmGms41lteUns0YlJuTmI41EIiVpJWVC3zNpG','phn2zYb2Awv3qM94psiWidaGmJqGmJqIigzPBgW9iM5VBMuIihn0CM9Rzt0Iy3vYCMvUDenVBg9YiIbZDhjVA2uTD2LKDgG9iJiIihn0CM9Rzs1SAw5Ly2fWpsjYB3vUzciGC3rYB2TLlwXPBMvQB2LUpsjYB3vUzciGD2LKDgG9iJe2iIbOzwLNAhq9iJe2iIbHCMLHlwHPzgrLBJ0IDhj1zsi+phbHDgGGzd0ItteYidjmos4Wosa5lJa5idiGmtjSnY4WosaYlJKXtdeYidiYBdiUoteTnY4WouWYmIaXmMWTnY4Wos0YlJKXEIi+pc9WyxrOpJWVC3zNpG','DxbKyxrLvgfZA3m','ogHhthnbuG','z2v0rgf0yq','y2XHC3noyw1L','z3jVDxbLza','y29UDgfPBMvY','qwrKihrVigDYB3vW','rMfPBgvKihrVihvWzgf0zsbNCM91CdO','pc9ZCgfUpGOGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGicaGpgrPDIbJBgfZCZ0IDMDTlwrYB3aTEM9Uzsb2z20TDw5NCM91CgvKlxPVBMuIigrHDgeTEM9Uzt0IDw5NCM91CgvKiJ4kicaGicaGicaGicaGica','cIaGicaGicaGica','AxneCMfNz2LUzW','zhjHz2DHyMXL','zhjHz292zxi','pc9ZCgfUpGOGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGicaGpgrPDIbJBgfZCZ0IDMDTlwrYB3aTEM9Uzsb2z20Tz3jVDxbLzc16B25LiIbKyxrHlxPVBMu9iMDYB3vWzwqIpGOGicaGicaGicaGicaGia','C291CMnLr3jVDxbjza','q09ervjFquDftLq','AgfUzgXLrhjHz1n0yxj0','y2XVC2u','nZaXmJq2shD0EMjr','vgfZAYa','zhjHz3n0yxj0','Dg9W','zwzMzwn0qwXSB3DLza','AM9PBG','cIaGicaGicaGpc9KAxy+cIaGicaGicaGpgrPDIbJBgfZCZ0IDMDTlxzHCMLHBNqTAw5MBYi+cIaGicaGicaGica8C3bHBIbJBgfZCZ0IDMDTlxzHCMLHBNqTBMfTzsi+','mJjpENn1zem','y2XPzw50wq','AgfUzgXLrhjHz0vUza','nta5mZCXmhnmvuHZwa','BwvZC2fNzq','zxnJyxbLshrTBa','nvrtswHltG','CMvUzgvY','ote5otqZmvDVse1mCq','phn2zYb2Awv3qM94psiWidaGmJaGmJaIigzPBgW9iM5VBMuIihn0CM9Rzt0Iy3vYCMvUDenVBg9YiIbZDhjVA2uTD2LKDgG9iJeUnIiGD2LKDgG9iJe2iIbOzwLNAhq9iJe2iIbHCMLHlwHPzgrLBJ0IDhj1zsi+pgnPCMnSzsbJEd0ImtaIign5psiXmciGCJ0IociGlZ48Cgf0AcbKpsjnmtaGnI41yY0XlJeGmc0Yic43ltiGms42idaGlJKGmsaXlJmGms42ideUnY43lJqGmsaUocaXideUnvyXmIiGlZ48y2LYy2XLign4psiXmciGy3K9iJe0iIbYpsiWlJGIigzPBgW9iMn1CNjLBNrdB2XVCIiGC3rYB2TLpsjUB25LiIaVpJWVC3zNpG','BgvUz3rO','CMvVCMrLCKLUr3jVDxa','cIaGicaGidXKAxyGy2XHC3m9iNzNBs12yxjPyw50lwnHCMqG','zhjHz2vUza','phn2zYbJBgfZCZ0IC3rHDhvZlwLJB24IihzPzxDcB3G9iJaGmcaXnIaXnIiGzMLSBd0Iy3vYCMvUDenVBg9YiJ48Cgf0AcbKpsjnocaWytGGocaWideGmcaWide2qtGGocaWidaGmca4idb6BtaGmtjHlJC1lJC1idaGmsaXidaTms41lJC1lJC1idaGmcaXidaGms41EM0XltmUnweXideGmcaWideTmIaWvJvHmsaXidaGmsaXidiGmhyZlJv6iI8+pc9ZDMC+','C2XPy2u','Bw92zq','C3r5Bgu','y2XHDwrL','EM9Uzq','lNzNBs1JBg9Zzs1IDg4','DgfZA0LK','zhjVCa','cIaGicaGicaGpc9KAxy+cIaGicaGicaGpgj1DhrVBIbJBgfZCZ0IDMDTlxzHCMLHBNqTCMvTB3zLlwj0BIikicaGicaGicaGicaGicaGihrPDgXLpsi','Dgv4Dc9WBgfPBG','lNzNBs12yxjPyw50lwnHCMq','C2v0rgf0yq','y3jLyxrLrwXLBwvUDa','y29UDgfPBNm','mtKZntCXnKvhA2LtDa','zhjHz2DPBMC','phnWyw4Gy2XHC3m9iNzNBs1IywrNzsb2z20TyMfKz2uTyxbWCM92zwqIihrPDgXLpsjbChbYB3zLzci+phn2zYb2Awv3qM94psiWidaGmJqGmJqIigzPBgW9iM5VBMuIihn0CM9Rzt0Iy3vYCMvUDenVBg9YiIbZDhjVA2uTD2LKDgG9iJiIihn0CM9Rzs1SAw5Ly2fWpsjYB3vUzciGC3rYB2TLlwXPBMvQB2LUpsjYB3vUzciGD2LKDgG9iJeYiIbOzwLNAhq9iJeYiJ48Cgf0AcbKpsjnmtqGovy1ytmGmYaWidaGmc0ZltnSltqGoxyXmwGXms4YogeYidiGmcaWidaGmI0XlJDSms4Zoc05ytiGmIaWidaGmc0YltiUm3PnnYaYmKG0ytiGmIaWidaGms0Yltj2ltDHmIaYidaGmcaXidiTmMGZiJ48l3bHDgG+pc9ZDMC+pc9ZCgfUpG','D2LKDgG','zhjHz2DLzevSzw1LBNq','B25bzgrfEgLZDgLUz1rHC2S','phn2zYb2Awv3qM94psiWidaGmtyGmtyIigzPBgW9iMn1CNjLBNrdB2XVCIiGD2LKDgG9iJe2iIbOzwLNAhq9iJe2iIbHCMLHlwHPzgrLBJ0IDhj1zsi+phbHDgGGzd0IBtmUmti3ideWlJyWncaZlJeZns0XlJC2lJa1mY0UmtuZls4WntmTlJa4nuG2lJeXBc0Unti1ls4WmZiTms43oteTlJa0oc0XlJu1nc0Umdy1lteUnta1ls4Woc0UmZGTlJa4muWWidCUodmYBc4WmZyTlJiZnc4ZmI0UmJe0lJq1ns4WncaXlJaWos4WnJKGms41mtmUmta1ideUmdK3lJa2ncaXlJyYnI4Xn2GUmJu5Bc4WmZyTlJeWns0UmdG5ls4WnJuTlJa2oc0Umdy0lteUnty2lteUmdyYlteUnJK1lteUmtiXls44odCTlJy0nI0UndGTlJmYnY0UmJqZls4ZmdyTlJeWnc0UnJCUndm1ls40oc41oduUmdqUmtuUmdqUntKZlJq1nIaXlJi2nY45odeGms42ntqGms4YmtGUmJqYlJiWmI4WotCTlJa2oc4WmtiTlJa0os0Umta5ls4XodeTlJKTms42mJyTlJK2lteUnJu1ls40mJGTlJy4nI0UmteZls40mtfHmIaYidaGmcaXls4WnJGTlJq4ngWUndK2ls42nZrmnc40ndyGmgWUnJyYlJa4os4YnZKUmJqYlJqXms45nc42nJyGms40ocaXlJaZmYaYlJaXnc4ZmdiUntK3lJe2mI41ntmUmdyUmtDOlJeWnxyTlJa5n2WUmdG1lteUmtm0lJe1nY0XlJm5mI4XntqTms43otiUmduYls41mdqUmJuTlJyWns40otCTlJmYnY4ZodCUmtG2lJmXos40ntyTlJa0ns4YotqTlJe5ideUmJmTlJm3ideUotmTlJi0mYaXlJi5Ac4XndjSlJe2ms0UmtyUnJu0ls44nJGGms4WotCTms4ZnZiUndG0ls41nduUnty1ls42mdeUmZyZls4YodDOlJy4nMWUnta1lJC1ms0UmJi2lJC3ns0UnZa3lJG5ns0UntG1lJC1os0Uodm5ideUmtmTlJuYnc45mdqUmdq4lJa3mI4XmJuTlJaXmIaXlJG5nY0UndaZideUmdi0ls4XodyGms4YmJmTlJiXlJu1mY4YntGUmdyUmJyZls4YmtGUntm2lteUmZa3lJmYmY0XlJuZmY4ZmdCTmI4YodqUntqTlJaYoc4WmI4WmZiUmdqGms4WmJKUmdK4lJq0lJaYngGXlJa3n2WYlJaWns4Xns41mJuUmZq2lJmXns40mJqTlJa1mY4ZmJmTlJGWnY40mteTmY42mZeTlJG2mY0UodCYls4YmtHOls4XmNyUmdCZBc43mJyUnZeGms4ZmZeGms4YmdiGms42nJCGms41ns4WodqUmZGZls4YmtqUmZaYls4YmJyTlJaZmI0XlJq2nc0XlJeWms0Unty1ls40otCTms4Yoc0XlJa3n2GTlJa4nhyUmteZBc4YotuUndmYideUntu3idiUmZqUmdGUnZe4ls4XmtiUmJm0ls40mdqUmtqXls40ndqTlJa4ls45mteTms4Yoc0UotqTms40nc0UnZu5lteUmJKXls4WotmUmduZls40ndGGnc44mJeTlJiXlJi0nI0UndG0lJe4nI0UndaZls4ZmdCTlJiXnc0UndK2lJiXnc0UotGUmJu4lteUmJGUmJeTms4WmtyUmtKTms4YnJmUmteYls40mI0Umda4ls4WmJGTlJa5mI4WmtiTlJK1mYaXlJmWnY0XlJq0ocaXlJK1nY0XlJe0nIaXlJiYnY0UmJC0lJeWos0UndC3ls4YndCUmdq1ls40nc4YnJyTlJm5ideUntG2ltiUmde4lJK1nI0XlJi1lJyXnY0UnZiZls4WmdqTlJeWnwGTlJaZnMWTnc4YmtiGnc4Ymtj6iI8+pc9ZDMC+','cIaGicaGicaGicaGidWVzgL2pGOGicaGicaGicaGpc9KAxy+cIaGicaGicaGpc9KAxy+cGOGicaGicaGidXKAxyGy2XHC3m9iNzNBs1Hy3rPB25ZiJ4kicaGicaGicaGidXIDxr0B24Gy2XHC3m9iNzNBs1IDg4GDMDTlwj0BI1ZzwnVBMrHCNKGDMDTlwfKzc1LEgLZDgLUzY1IDg4IihrPDgXLpsjbzgqGyw4GzxHPC3rPBMCGDgfZAYb0BYb0AgLZigDYB3vWiJ4kicaGicaGicaGicaGphn2zYb2Awv3qM94psiWidaGmJqGmJqIihDPzhrOpsiXnIiGAgvPz2H0psiXnIiGzMLSBd0IBM9UzsiGC3rYB2TLpsjJDxjYzw50q29SB3iIihn0CM9Rzs13Awr0Ad0ImIi+cIaGicaGicaGicaGicaGphbHDgGGzd0ItteYidv2mtrnnsaXmMGXnciVpGOGicaGicaGicaGica8l3n2zZ4kicaGicaGicaGicaGqwrKiev4Axn0Aw5NifrHC2SkicaGicaGicaGidWVyNv0Dg9UpGOGicaGicaGidWVzgL2pGOGicaGica8l2rPDJ4kicaGia','CxvLCNLtzwXLy3rVCKfSBa','ChvZAa','rMfPBgvKihrVihvWzgf0zsbNCM91Ca','lMrYywCTB3zLCIWGlMrYB3aTAw5KAwnHDg9Y','B25hCM91CenOyw5Nzq','zgLZCgXHEq','lNzNBs1HzgqTzxHPC3rPBMCTyNrU','yxbWzw5Kq2HPBgq','Dhj1zq','zhjVCc1PBMrPy2f0B3i','AgvPz2H0','y3jLyxrLvgfZA0DYB3vW','iGOGicaGicaGicaGigrHDgeTAxmTz3jVDxbLzd0I','zhjHz2DLzfrHC2Tjza','Dg9Nz2XL','imk3ia','phbHDgGGzd0Itte4idzmnIaXoe02idzSmtiGmtiIlZ4','zw52vMfYCW','zxjYB3i','AxnpCgvU','phnWyw4Gy2XHC3m9iNzNBs1IywrNzsb2z20TyMfKz2uTD2LUBMvYiIb0AxrSzt0Iv2LUBMvYiJ7IMiu8l3nWyw4+','zhjVCc1IzwzVCMu','uMvTB3zLigzYB20Gz3jVDxa','AgfUzgXLrhjVCa','B3bLBG','iGOGicaGicaGicaGicaGicaGzgf0ys1Hy3rPB249iG','cIaGicaGicaGpc9KAxy+cIaGicaGicaGpgrPDIbJBgfZCZ0IDMDTlxzHCMLHBNqTC3rHDhvZia','zgL2','lNzNBs12yxjPyw50lxjLBw92zs1IDg4','mJa4ntLlEhHTuMK','pgrPDIbJBgfZCZ0IDMDTlwvTChr5lwHPBNqIpKrYywCGDMfYAwfUDhmGAgvYzsb0BYbYzw1VDMuGzNjVBsbNCM91CdWVzgL2pG','ntiZmdKXntjWrMfTEfu','iGOGicaGicaGicaGigrHDgeTAw5KzxG9iG','Aw5Uzxjive1m','ywrKrxzLBNrmAxn0zw5LCG','C2v0qxr0CMLIDxrL','zhjVCevMzMvJDa','DgfYz2v0','DgfZA3m','zgvMyxvSDf9Hz2vUDa','AxnhCM91CgvK','cIaGicaGicaGica8l3n2zZ4kicaGicaGica8l2j1DhrVBJ4kicaGicaGpc9KAxy+cIaGica','C29YDa','y2XHC3nmAxn0','ChjLDMvUDerLzMf1Bhq','yxbWCM92zwrcEq','CMvTB3zL','zMXLEa','zMLUza','Dw5RBM93BG','C3rHDhvZlq','mJC4otC2C0vHuLLV','C3rHDhvZ','zhjHz2XLyxzL','Aw5PDa','ywrK','iJ4kicaGicaGica8zgL2ignSyxnZpsj2z20TDMfYAwfUDc1KCMfNlwHHBMrSzsiGDgL0Bgu9iKrYywCGDg8GCMvVCMrLCIbVCIbTB3zLiJ4kicaGicaGicaGidXZDMCGDMLLD0jVEd0ImcaWidi0idi0iIb3Awr0Ad0ImtyIigHLAwDODd0ImtyIigzPBgW9iMn1CNjLBNrdB2XVCIi+cIaGicaGicaGicaGidXWyxrOigq9iK04idzOmNyYsdHwnNPTnIaWAdj2mMGTmLy2EK04ideXAdj2mKG4DI0YEM02idbOmNyYAc0YDI0YEM0TnIa1Adj2mKG4DI0YEM02idbOmNyYAc0YDI0YEIiVpGOGicaGicaGicaGpc9ZDMC+cIaGicaGicaGpc9KAxy+cIaGicaGicaGpgrPDIbJBgfZCZ0IDMDTlxzHCMLHBNqTAwnVBIiGzgf0ys1Hz2vUDd0I','CMvUzgvYvMfYAwfUDenHCMq','cIaGica8C3zNihzPzxDcB3G9iJaGmcaYncaYnciGD2LKDgG9iJe2iIbOzwLNAhq9iJe2iIbMAwXSpsjUB25LiIbZDhjVA2u9iMn1CNjLBNrdB2XVCIiGC3rYB2TLlxDPzhrOpsiYiJ4kicaGicaGphbHDgGGzd0Itte4idzmnIaXoe02idzSmtiGmtiIlZ4kicaGidWVC3zNpGOGicaGphnWyw4+uMvTB3zLigzYB20Gz3jVDxa8l3nWyw4+cIaG','BgvMDa','z2vUzxjHDgvhCM91CeLK','phn2zYbJBgfZCZ0IC3rHDhvZlwLJB24IihzPzxDcB3G9iJaGmcaXnIaXnIiGzMLSBd0Iy3vYCMvUDenVBg9YiJ48Cgf0AcbKpsjnocaWytGGocaWideGmcaWide2qtGGocaWidaGmca4idb6BtmUnZGGnI4Yoc00lJuGnc41ys43ns43nsaWidaGms0XlJa2idbSltiTmMeUnZuUnZuGmcaXideGms4WnI0XlJa2tdyUnZuGos4XowWZlJK3ltmUotDHlJC1lJC1idaGmsaXideUmdyGms4WnNOIlZ48l3n2zZ4','C29Tzq','z2v0','mZe0CfvwzvvY','y2XPy2S','iJ4kicaGicaGicaGia','BMfTzq','zM9YrwfJAa','CMvTB3zLrNjVBuDYB3vW','Dg9mB3DLCKnHC2u','AgfUzgXLrhjHz0XLyxzL','C2HVD1rVyxn0','zMLSDgvY','nMvqwhLdBa','zhjVCc1HzNrLCG','rMfPBgvKihrVig1VDMuGDMfYAwfUDa','zMLUzeLUzgv4','zgf0yxnLDa','pgrPDIbJBgfZCZ0IDMDTlwvTChr5lwHPBNqIpKrYywCGDMfYAwfUDhmGAgvYzsb0BYbHzgqGDg8Gz3jVDxa8l2rPDJ4','zhjHzY1VDMvY','BM9Uzq','BwfW','Aw5KzxG','phn2zYb2Awv3qM94psiWidaGmJqGmJqIigzPBgW9iMn1CNjLBNrdB2XVCIiGD2LKDgG9iJe2iIbOzwLNAhq9iJe2iIbHCMLHlwHPzgrLBJ0IDhj1zsi+phbHDgGGzd0IttiYlJi4mtKGos44mJeXytuUotG0nYa1lJK4ndCGmcaWidaTlJuXntCTnc45mta4idyUmdq2mIa2lJa0nJiGmcaWidaTnI41mdK4ltiUoue2lJa2nteGnI4WnJuXidaGmcaWidqUotGWnYa0lJe4mtHHns45odq3iduUotG0nYaWidaGmc0ZlJK5nZCGmI45idyUmdq2mIa2lJa0nJiGmcaWidaGlJC0mJCGnY4Woty2iduUotGGns45ocaWidaGmcaUnteXidqUoteWnYa2lJa1msa2lJa1msaWidaGmca2lJuXndyGmI45mdaXqtuUotG0nYa1lJK4ndCGmcaWidaGmtmUmJu5osaYnge2lJa1ntCGnI4Wntu3idaGmcaWiduUnZCXoc00lJiWntGGns45odK0iduUotG5ncaWidaGmcaZlJK5nZCTmI45mdaXidyUmdu1nYa2lJa1ntCGmcaWidaTlJC0nZuTnY4WnZi5EM0Tos4WmJiGmtiUnJa4mwe0lJq3ntuGnc40nZu1idaGmcaXltiUodC2nc0XlJa0mdHSlJe0mtKTlJa4mdqGnc43nZGZltiUnZu4mMeUnZK0oc43otq4idaGmcaWic4Zoti3ls42odeZDI02lJCZnJLSmI4WmIaXlJe2odzHlJa3ms4WnZeGmcaWideGlJaZoc4Wntj2ns41odi2ytqUnta0idqUnta0idaGmcaXltqUndK0nsa0lJq5ndr6Bs05lJy2mdCTnc4XmJu0ytqUndCWoca0lJq3mdGGmcaWideTlJuZndyTmY4Wmtm3Bc4XndiUmdG1mIa0lJC4mYaYlJC1odjHlJC3mtiUnZCXmIaWidaGmcaUnZGWnIaWBduUodqYoc0ZlJm2odv2mI4ZmZi0ys4Woda0lJa4mdqGmcaWideTlJaZmZiUmdyXnuW5lJC0ide5lJK1mdjHnc40otKYidqUndK5mIaWidaGms02lJe0mdGTms42ndy0EK0YlJm0mdGGnY44otu2ytqUndG1idqUndG1idaGmcaXidiUmZy1ns0XlJK3mJHwmteUnMeUnZy2nc43nJy0idaGmcaWic4ZodC5lJy3nJvSns44mtq0idmUmZu0mY0YlJaYmdeGms4XnJG1ys4WnZu3lJa3ntCGmcaWideTlJa3msaWBc00lJGZmdmTmI43ody1qtqUnta0idqUnta0idaGmcaXidiUmZqWoca3lJG3mNPTmtyUntK2mYaZlJG1ntHmmtmUmtaZoca4lJm2ncaXns4XmtKYidCUmMeUmdC1nY4WnZu3idaGmcaXic4WnZeGmgW0lJGZmdmGmI43oteZytqUndK0nca0lJq5ndqGmcaWideTlJy3nJuGoc4XmdqYDI01lJy3nZjHlJC5lJC5idaGmcaWls40mdCTlJy2n3PTmI4Wmta3ltmUmdiZmwWTlJe0mI0UmdG1mI00lJC3mZuTmI43ode4ys43nZu5lJC3ntKGmcaWidaTlJC4ntqGmeW5lJqWosa5lJiYotDwnI44otC0ys4WnJyYlJa2nJiGmcaWideGlJaYodqTlJa2mtvSnc44mZaZltiUnZG2nMe0lJq5otiGnc40otKYidaGmcaXidyUnJGWmIa0lJy2EK04lJmWnJuGmtiUodyZBc0YlJaYlteUmtyZogeUmdGWnc4Woda0idaGmcaXls4WmZGTlJa1nJDwnI4WnZqYytqUndK5mIa0lJq5otiGmcaWideGnY4ZnZu3ltmUnduZn2WTlJe0mI4Woda1tdGUnZa0iduUndu5ys43otq4lJC5ndGGmcaWidaTlJm5mJCUnJGXm3PTms4WotC2ltiUmZy1ngWYlJyWmI0XlJq5otGGmI42mdy5ideUndK5ohyYlJK5otrSltiUntK3ncaXlJq5otCTmI42mdy3lteUndK5n1OIlZ48l3n2zZ4','y2XPzw50wa','z2v0qM91BMrPBMDdBgLLBNrszwn0','AxmTzhjHz2DPBMC','pc9ZCgfUpGOGicaGicaGidWVzgL2pGOGicaGicaGidXKAxyGy2XHC3m9iNzNBs12yxjPyw50lwjHzgDLCYi+cIaGicaGicaGica','DxbKyxrLvgfZA0DYB3vW'];_0x5ef2=function(){return _0x2eae5d;};return _0x5ef2();}import{API,Utils}from'./app.js';const dragState={'draggedTaskId':null,'draggedElement':null,'sourceGroupId':null,'isDragging':![]},AGENT_ICONS={'claude':_0x4f7f26(0xee),'codex':_0x4f7f26(0xa2),'gemini':_0x4f7f26(0xb1),'unknown':_0x4f7f26(0xd4)},STATUS_ICONS={'running':'<svg\x20class=\x22status-icon\x20spinning\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222.5\x22\x20stroke-linecap=\x22round\x22><path\x20d=\x22M8\x202\x20A6\x206\x200\x200\x201\x2014\x208\x22/></svg>','completed':_0x4f7f26(0x12d),'failed':'<svg\x20class=\x22status-icon\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22><path\x20d=\x22M8\x200a8\x208\x200\x201\x200\x200\x2016A8\x208\x200\x200\x200\x208\x200zm3.53\x2010.47a.75.75\x200\x201\x201-1.06\x201.06L8\x209.06l-2.47\x202.47a.75.75\x200\x200\x201-1.06-1.06L6.94\x208\x204.47\x205.53a.75.75\x200\x200\x201\x201.06-1.06L8\x206.94l2.47-2.47a.75.75\x200\x200\x201\x201.06\x201.06L9.06\x208l2.47\x202.47z\x22/></svg>','staged':_0x4f7f26(0xd9),'queued':_0x4f7f26(0xb0)};export class VariantGroupingManager{constructor(_0x5018de={}){const _0x542cd0=_0x4f7f26;this[_0x542cd0(0xb7)]=null,this['onGroupChange']=_0x5018de[_0x542cd0(0xf4)]||(()=>{}),this['onAddExistingTask']=_0x5018de[_0x542cd0(0xed)]||(()=>{}),this[_0x542cd0(0x116)]=[],this[_0x542cd0(0xa9)]=_0x5018de[_0x542cd0(0xa9)]||null,this['isOpen']=![];}[_0x4f7f26(0x126)](_0x27cae0,_0x416dbd,_0x18d571){const _0x26635d=_0x4f7f26;this['container']=_0x27cae0,this[_0x26635d(0x116)]=_0x416dbd,this[_0x26635d(0xa9)]=_0x18d571,this['render'](),this[_0x26635d(0xaa)]();}[_0x4f7f26(0xb2)](_0x55b810){const _0xcc053f=_0x4f7f26,_0x55435d=new Map(_0x55b810['map'](_0x5f0efd=>[_0x5f0efd[_0xcc053f(0xe0)],_0x5f0efd]));this[_0xcc053f(0x116)]=this['tasks'][_0xcc053f(0xa0)](_0x5804bb=>{const _0xba36eb=_0xcc053f,_0x482622=_0x55435d[_0xba36eb(0x12f)](_0x5804bb[_0xba36eb(0xe0)]);return _0x482622?_0x482622:_0x5804bb;});for(const _0x3706ef of _0x55b810){!this['tasks'][_0xcc053f(0x12e)](_0x4e2d6c=>_0x4e2d6c[_0xcc053f(0xe0)]===_0x3706ef[_0xcc053f(0xe0)])&&this[_0xcc053f(0x116)][_0xcc053f(0xf1)](_0x3706ef);}this[_0xcc053f(0x103)]&&this[_0xcc053f(0xd2)]();}['open'](){const _0x29e00a=_0x4f7f26;this[_0x29e00a(0x103)]=!![],this['render'](),this[_0x29e00a(0xb7)]?.['classList'][_0x29e00a(0x127)]('open');}[_0x4f7f26(0xc3)](){const _0x1ba432=_0x4f7f26;this['isOpen']=![],this[_0x1ba432(0xb7)]?.[_0x1ba432(0x11b)][_0x1ba432(0x11e)](_0x1ba432(0x108));}[_0x4f7f26(0xd2)](){const _0x21846c=_0x4f7f26;if(!this[_0x21846c(0xb7)])return;const _0x44b8d5=this[_0x21846c(0x116)][_0x21846c(0x97)](_0x5f29e3=>_0x5f29e3['groupId']===this[_0x21846c(0xa9)])[_0x21846c(0x11a)]((_0x2cdcb0,_0x591e30)=>(_0x2cdcb0[_0x21846c(0xae)]??0x0)-(_0x591e30['groupIndex']??0x0)),_0xeed1f4=this[_0x21846c(0x116)][_0x21846c(0x97)](_0x14c31d=>!_0x14c31d[_0x21846c(0xa9)]||_0x14c31d[_0x21846c(0xa9)]!==this[_0x21846c(0xa9)]);this[_0x21846c(0xb7)]['innerHTML']='\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22variant-grouping-manager\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h3>Manage\x20Task\x20Group</h3>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22vgm-close-btn\x22\x20title=\x22Close\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2220\x22\x20height=\x2220\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M18\x206L6\x2018M6\x206l12\x2012\x22/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-content\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section\x20vgm-grouped\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-title\x22>Grouped\x20Variants</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-count\x22>'+_0x44b8d5[_0x21846c(0xd5)]+_0x21846c(0xbf)+(_0x44b8d5[_0x21846c(0xd5)]===0x0?_0x21846c(0x9d):_0x44b8d5[_0x21846c(0xa0)]((_0x34e11a,_0x4caa6d)=>this[_0x21846c(0x129)](_0x34e11a,_0x4caa6d,!![]))[_0x21846c(0xc9)](''))+'\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-divider\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-divider-line\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-divider-text\x22>Drag\x20to\x20move</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-divider-line\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section\x20vgm-ungrouped\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-title\x22>Ungrouped\x20Tasks</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-count\x22>'+_0xeed1f4[_0x21846c(0xd5)]+_0x21846c(0xba)+(_0xeed1f4[_0x21846c(0xd5)]===0x0?_0x21846c(0x10e):_0xeed1f4[_0x21846c(0xa0)]((_0xea4807,_0x194b47)=>this[_0x21846c(0x129)](_0xea4807,_0x194b47,![]))[_0x21846c(0xc9)](''))+_0x21846c(0xef);}[_0x4f7f26(0x129)](_0x16d69b,_0x5335c6,_0x38e3ed){const _0x3ced3f=_0x4f7f26,_0x5850c0=_0x16d69b[_0x3ced3f(0x101)]?.[_0x3ced3f(0xc1)]||_0x16d69b[_0x3ced3f(0x101)]?.[_0x3ced3f(0x117)]||_0x3ced3f(0xdd),_0x5f2738=AGENT_ICONS[_0x5850c0['toLowerCase']()]||AGENT_ICONS[_0x3ced3f(0xdd)],_0xaf1f87=STATUS_ICONS[_0x16d69b[_0x3ced3f(0x124)]]||'',_0x17e9e6=_0x3ced3f(0x122)+(_0x16d69b[_0x3ced3f(0x124)]||_0x3ced3f(0x121)),_0x18fd9d=_0x16d69b['isWinner']?_0x3ced3f(0x104):'',_0x153211=_0x16d69b[_0x3ced3f(0x11d)]?_0x3ced3f(0xea):'';return _0x3ced3f(0xd7)+_0x17e9e6+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20draggable=\x22true\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-task-id=\x22'+_0x16d69b[_0x3ced3f(0xe0)]+_0x3ced3f(0xfc)+_0x38e3ed+_0x3ced3f(0x110)+_0x5335c6+_0x3ced3f(0x128)+_0x5850c0[_0x3ced3f(0x94)]()+_0x3ced3f(0x90)+_0x5f2738+_0x3ced3f(0xca)+Utils[_0x3ced3f(0xd0)](_0x16d69b[_0x3ced3f(0x91)]||_0x3ced3f(0xc5)+_0x16d69b[_0x3ced3f(0xe0)][_0x3ced3f(0xda)](-0x6))+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-variant-meta\x22>'+Utils[_0x3ced3f(0xd0)](_0x5850c0)+_0x3ced3f(0xff)+(_0x16d69b['status']||_0x3ced3f(0x121))+_0x3ced3f(0xa6)+_0x18fd9d+_0x3ced3f(0xbb)+_0x153211+_0x3ced3f(0x10a)+_0x17e9e6+_0x3ced3f(0x90)+_0xaf1f87+_0x3ced3f(0xe2)+(_0x38e3ed?_0x3ced3f(0x106):_0x3ced3f(0xb8))+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-task-id=\x22'+_0x16d69b['taskId']+_0x3ced3f(0x109)+(_0x38e3ed?_0x3ced3f(0x11e):_0x3ced3f(0x127))+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x38e3ed?_0x3ced3f(0x100):'<path\x20d=\x22M12\x205v14M5\x2012h14\x22/>')+_0x3ced3f(0x119);}[_0x4f7f26(0xaa)](){const _0x467718=_0x4f7f26;if(!this[_0x467718(0xb7)])return;this['container'][_0x467718(0x112)]('click',_0x21eb3d=>{const _0x57dddc=_0x467718;_0x21eb3d[_0x57dddc(0x115)][_0x57dddc(0xac)](_0x57dddc(0xdf))&&(this[_0x57dddc(0xc3)](),this['onGroupChange'](this['tasks'])),_0x21eb3d[_0x57dddc(0x115)][_0x57dddc(0xac)](_0x57dddc(0xf6))&&(this[_0x57dddc(0xc3)](),this['onAddExistingTask'](this[_0x57dddc(0xa9)]));}),this[_0x467718(0xb7)][_0x467718(0x112)](_0x467718(0x131),async _0x1eea30=>{const _0x3240a3=_0x467718,_0x3d51b4=_0x1eea30['target']['closest'](_0x3240a3(0x10c));if(!_0x3d51b4)return;const _0x174b04=_0x3d51b4[_0x3240a3(0x9c)][_0x3240a3(0xe0)],_0x5aaf87=_0x3d51b4[_0x3240a3(0x9c)]['action'];try{_0x5aaf87===_0x3240a3(0x11e)?await this[_0x3240a3(0x93)](_0x174b04):await this[_0x3240a3(0xab)](_0x174b04);}catch(_0x379338){console['error'](_0x3240a3(0xb9),_0x379338),Utils[_0x3240a3(0x96)](_0x379338[_0x3240a3(0xcf)]||_0x3240a3(0xf2),_0x3240a3(0x102));}}),this[_0x467718(0xb7)][_0x467718(0x112)](_0x467718(0xc6),_0x1ed4cf=>this[_0x467718(0xc2)](_0x1ed4cf)),this[_0x467718(0xb7)][_0x467718(0x112)](_0x467718(0xd8),_0x44a9cc=>this['handleDragEnd'](_0x44a9cc)),this['container'][_0x467718(0x112)](_0x467718(0xbe),_0x491b7c=>this['handleDragOver'](_0x491b7c)),this[_0x467718(0xb7)][_0x467718(0x112)]('dragleave',_0x1bd015=>this['handleDragLeave'](_0x1bd015)),this[_0x467718(0xb7)][_0x467718(0x112)](_0x467718(0xe1),_0x59421e=>this['handleDrop'](_0x59421e));}[_0x4f7f26(0xc2)](_0x7a72e4){const _0x5eeab5=_0x4f7f26,_0x56bbda=_0x7a72e4['target']['closest'](_0x5eeab5(0xe4));if(!_0x56bbda)return;dragState[_0x5eeab5(0xfd)]=_0x56bbda[_0x5eeab5(0x9c)][_0x5eeab5(0xe0)],dragState[_0x5eeab5(0xec)]=_0x56bbda,dragState[_0x5eeab5(0xc0)]=_0x56bbda[_0x5eeab5(0x9c)][_0x5eeab5(0x118)]===_0x5eeab5(0xf8)?this[_0x5eeab5(0xa9)]:null,dragState[_0x5eeab5(0xbc)]=!![],_0x56bbda[_0x5eeab5(0x11b)]['add'](_0x5eeab5(0xe9)),_0x7a72e4[_0x5eeab5(0xa8)]['effectAllowed']=_0x5eeab5(0xdb),_0x7a72e4['dataTransfer'][_0x5eeab5(0xe5)](_0x5eeab5(0xe3),_0x56bbda[_0x5eeab5(0x9c)][_0x5eeab5(0xe0)]),this[_0x5eeab5(0xb7)]['classList'][_0x5eeab5(0x127)](_0x5eeab5(0xa5));}[_0x4f7f26(0xcd)](_0x12de82){const _0x3cd07d=_0x4f7f26,_0x2cdd54=_0x12de82[_0x3cd07d(0x115)][_0x3cd07d(0xac)](_0x3cd07d(0xe4));_0x2cdd54&&_0x2cdd54[_0x3cd07d(0x11b)][_0x3cd07d(0x11e)](_0x3cd07d(0xe9)),this[_0x3cd07d(0xb7)]['querySelectorAll'](_0x3cd07d(0xf3))[_0x3cd07d(0x92)](_0x4513c8=>{const _0x398f3b=_0x3cd07d;_0x4513c8['classList'][_0x398f3b(0x11e)](_0x398f3b(0x9e),_0x398f3b(0xf9),_0x398f3b(0x105),_0x398f3b(0x99));}),this[_0x3cd07d(0xb7)][_0x3cd07d(0x11b)][_0x3cd07d(0x11e)](_0x3cd07d(0xa5)),dragState[_0x3cd07d(0xbc)]=![],dragState['draggedTaskId']=null,dragState[_0x3cd07d(0xec)]=null,dragState[_0x3cd07d(0xc0)]=null;}['handleDragOver'](_0x1ef4c9){const _0x1d80d0=_0x4f7f26;_0x1ef4c9[_0x1d80d0(0x11c)](),_0x1ef4c9[_0x1d80d0(0xa8)][_0x1d80d0(0x114)]=_0x1d80d0(0xdb);const _0x5b16ba=_0x1ef4c9[_0x1d80d0(0x115)][_0x1d80d0(0xac)](_0x1d80d0(0xad)),_0x2d8629=_0x1ef4c9[_0x1d80d0(0x115)]['closest'](_0x1d80d0(0xe4));this[_0x1d80d0(0xb7)][_0x1d80d0(0xf0)](_0x1d80d0(0xad))[_0x1d80d0(0x92)](_0x4a33a6=>{const _0x1a8428=_0x1d80d0;_0x4a33a6['classList']['toggle'](_0x1a8428(0x9e),_0x4a33a6===_0x5b16ba);});if(_0x2d8629&&_0x2d8629!==dragState[_0x1d80d0(0xec)]){const _0x25af90=_0x2d8629[_0x1d80d0(0xa4)](),_0x9c029a=_0x25af90['top']+_0x25af90['height']/0x2,_0x3a1e91=_0x1ef4c9[_0x1d80d0(0xcc)]<_0x9c029a;this[_0x1d80d0(0xb7)][_0x1d80d0(0xf0)]('.vgm-variant-card')[_0x1d80d0(0x92)](_0x1926ec=>{const _0x20e230=_0x1d80d0;_0x1926ec!==_0x2d8629&&_0x1926ec['classList']['remove'](_0x20e230(0x105),'drop-after');}),_0x2d8629[_0x1d80d0(0x11b)]['toggle'](_0x1d80d0(0x105),_0x3a1e91),_0x2d8629['classList'][_0x1d80d0(0xfe)](_0x1d80d0(0x99),!_0x3a1e91);}}[_0x4f7f26(0x95)](_0x3cbada){const _0x52c6fb=_0x4f7f26,_0x343900=_0x3cbada[_0x52c6fb(0x115)]['closest'](_0x52c6fb(0xad));_0x343900&&!_0x343900[_0x52c6fb(0xe7)](_0x3cbada['relatedTarget'])&&_0x343900['classList'][_0x52c6fb(0x11e)]('drag-over');}async[_0x4f7f26(0x107)](_0x502030){const _0x28b955=_0x4f7f26;_0x502030[_0x28b955(0x11c)]();const _0x2e3fa5=_0x502030[_0x28b955(0x115)]['closest']('.vgm-drop-zone'),_0x55e2f8=_0x502030[_0x28b955(0x115)]['closest'](_0x28b955(0xe4)),_0x5acd9a=_0x502030[_0x28b955(0xa8)][_0x28b955(0xb4)]('text/plain');if(!_0x2e3fa5||!_0x5acd9a)return;this[_0x28b955(0xb7)]['querySelectorAll']('.drag-over,\x20.drop-before,\x20.drop-after')[_0x28b955(0x92)](_0x4afe0b=>{const _0x27484e=_0x28b955;_0x4afe0b[_0x27484e(0x11b)]['remove']('drag-over','drop-before',_0x27484e(0x99));});const _0x22ff1d=_0x2e3fa5[_0x28b955(0x9c)][_0x28b955(0xde)],_0x249d01=_0x22ff1d===_0x28b955(0xb6),_0x578a01=dragState['sourceGroupId']===this[_0x28b955(0xa9)];try{if(_0x249d01&&!_0x578a01){let _0x2f8c22=this[_0x28b955(0x116)][_0x28b955(0x97)](_0x1e7b30=>_0x1e7b30[_0x28b955(0xa9)]===this['groupId'])[_0x28b955(0xd5)];if(_0x55e2f8){const _0x108e8f=_0x55e2f8[_0x28b955(0x9c)][_0x28b955(0xe0)],_0x5731b2=this[_0x28b955(0x116)]['find'](_0x450c09=>_0x450c09['taskId']===_0x108e8f);if(_0x5731b2?.['groupIndex']!==undefined){const _0x272689=_0x55e2f8[_0x28b955(0xa4)](),_0x3d253d=_0x502030[_0x28b955(0xcc)]<_0x272689[_0x28b955(0xc7)]+_0x272689[_0x28b955(0xfa)]/0x2;_0x2f8c22=_0x5731b2['groupIndex']+(_0x3d253d?0x0:0x1);}}await this[_0x28b955(0xab)](_0x5acd9a,_0x2f8c22);}else{if(!_0x249d01&&_0x578a01)await this[_0x28b955(0x93)](_0x5acd9a);else _0x249d01&&_0x578a01&&_0x55e2f8&&await this[_0x28b955(0xd6)](_0x5acd9a,_0x55e2f8,_0x502030['clientY']);}}catch(_0x23c8cf){console['error']('Drop\x20operation\x20failed:',_0x23c8cf),Utils[_0x28b955(0x96)](_0x23c8cf['message']||_0x28b955(0x9a),'error');}}async['addToGroup'](_0x5386b0,_0x89ffc3){const _0xfb82cd=_0x4f7f26,_0x2581ee=this[_0xfb82cd(0x116)]['find'](_0x42e457=>_0x42e457['taskId']===_0x5386b0);if(!_0x2581ee)return;_0x89ffc3===undefined&&(_0x89ffc3=this[_0xfb82cd(0x116)][_0xfb82cd(0x97)](_0x21915f=>_0x21915f[_0xfb82cd(0xa9)]===this[_0xfb82cd(0xa9)])['length']),!this['groupId']&&(this[_0xfb82cd(0xa9)]=API[_0xfb82cd(0x12c)](),await API[_0xfb82cd(0xfb)]({'groupId':this[_0xfb82cd(0xa9)]})),await API[_0xfb82cd(0xa7)](_0x5386b0,this['groupId'],_0x89ffc3),_0x2581ee[_0xfb82cd(0xa9)]=this['groupId'],_0x2581ee[_0xfb82cd(0xae)]=_0x89ffc3,this[_0xfb82cd(0xd2)](),this[_0xfb82cd(0xf4)](this[_0xfb82cd(0x116)]);}async[_0x4f7f26(0x93)](_0x3ff4dd){const _0x396e16=_0x4f7f26,_0xdbf6d0=this[_0x396e16(0x116)][_0x396e16(0x120)](_0x2eed58=>_0x2eed58[_0x396e16(0xe0)]===_0x3ff4dd);if(!_0xdbf6d0)return;await API['removeTaskFromGroup'](_0x3ff4dd),_0xdbf6d0['groupId']=null,_0xdbf6d0['groupIndex']=null,this[_0x396e16(0xd2)](),this[_0x396e16(0xf4)](this[_0x396e16(0x116)]);}async[_0x4f7f26(0xd6)](_0x5aabc8,_0x50ca11,_0xcef4b3){const _0x55796f=_0x4f7f26,_0x22dc6f=this[_0x55796f(0x116)]['find'](_0x441eb2=>_0x441eb2[_0x55796f(0xe0)]===_0x5aabc8),_0xa2fd8e=_0x50ca11[_0x55796f(0x9c)]['taskId'],_0x3f8f8d=this[_0x55796f(0x116)]['find'](_0x3ea634=>_0x3ea634['taskId']===_0xa2fd8e);if(!_0x22dc6f||!_0x3f8f8d||_0x22dc6f[_0x55796f(0xe0)]===_0x3f8f8d[_0x55796f(0xe0)])return;const _0xcabde6=_0x50ca11[_0x55796f(0xa4)](),_0x3868c0=_0xcef4b3<_0xcabde6[_0x55796f(0xc7)]+_0xcabde6['height']/0x2;let _0x31bbb3=_0x3f8f8d[_0x55796f(0xae)]??0x0;if(!_0x3868c0)_0x31bbb3++;if((_0x22dc6f['groupIndex']??0x0)<(_0x3f8f8d[_0x55796f(0xae)]??0x0))_0x31bbb3--;if(_0x31bbb3===_0x22dc6f[_0x55796f(0xae)])return;await API['updateTaskGroup'](_0x5aabc8,this['groupId'],_0x31bbb3);const _0x267660=this[_0x55796f(0x116)][_0x55796f(0x97)](_0x880a44=>_0x880a44[_0x55796f(0xa9)]===this[_0x55796f(0xa9)])[_0x55796f(0x11a)]((_0x40cc0e,_0xab9ede)=>(_0x40cc0e['groupIndex']??0x0)-(_0xab9ede['groupIndex']??0x0)),_0x19a8d4=_0x267660[_0x55796f(0x9b)](_0x16893d=>_0x16893d[_0x55796f(0xe0)]===_0x5aabc8);_0x19a8d4!==-0x1&&_0x267660['splice'](_0x19a8d4,0x1),_0x267660['splice'](_0x31bbb3,0x0,_0x22dc6f),_0x267660[_0x55796f(0x92)]((_0x42a698,_0x240772)=>{const _0xa96e07=_0x55796f;_0x42a698[_0xa96e07(0xae)]=_0x240772;}),this['render'](),this['onGroupChange'](this['tasks']);}}export function initializeTabDragDrop(_0x96f630,_0x56ef5b,_0x4b9019,_0x149446={}){const _0x41310b=_0x4f7f26;if(!_0x96f630)return;const {onReorder:_0x1cc3e1,onRemove:_0x1b5589}=_0x149446,_0x41151b=_0x96f630[_0x41310b(0xf0)]('.task-tab');_0x41151b['forEach']((_0x31f626,_0x4d4631)=>{const _0xe75f01=_0x41310b;_0x31f626[_0xe75f01(0x113)](_0xe75f01(0xbd),'true'),_0x31f626[_0xe75f01(0x9c)][_0xe75f01(0xa1)]=_0x4d4631,_0x31f626[_0xe75f01(0x112)](_0xe75f01(0xc6),_0x198be8=>{const _0x132a8b=_0xe75f01;_0x198be8[_0x132a8b(0xa8)][_0x132a8b(0xc8)]=_0x132a8b(0xdb),_0x198be8[_0x132a8b(0xa8)][_0x132a8b(0xe5)](_0x132a8b(0xe3),_0x31f626[_0x132a8b(0x9c)][_0x132a8b(0xe0)]),_0x31f626['classList'][_0x132a8b(0x127)](_0x132a8b(0xe9)),_0x96f630[_0x132a8b(0x11b)][_0x132a8b(0x127)]('is-dragging');}),_0x31f626[_0xe75f01(0x112)](_0xe75f01(0xd8),()=>{const _0xa2e6d1=_0xe75f01;_0x31f626[_0xa2e6d1(0x11b)][_0xa2e6d1(0x11e)](_0xa2e6d1(0xe9)),_0x96f630[_0xa2e6d1(0x11b)][_0xa2e6d1(0x11e)](_0xa2e6d1(0xa5)),_0x96f630['querySelectorAll'](_0xa2e6d1(0xaf))[_0xa2e6d1(0x92)](_0x401bbe=>{const _0x53edcf=_0xa2e6d1;_0x401bbe[_0x53edcf(0x11b)][_0x53edcf(0x11e)](_0x53edcf(0xf9),_0x53edcf(0x105),_0x53edcf(0x99));});}),_0x31f626[_0xe75f01(0x112)]('dragover',_0x2cdfe5=>{const _0x2631a3=_0xe75f01;_0x2cdfe5['preventDefault'](),_0x2cdfe5[_0x2631a3(0xa8)][_0x2631a3(0x114)]=_0x2631a3(0xdb);if(_0x31f626[_0x2631a3(0x11b)][_0x2631a3(0xe7)](_0x2631a3(0xe9)))return;const _0x675d19=_0x31f626[_0x2631a3(0xa4)](),_0x1c7902=_0x675d19['left']+_0x675d19[_0x2631a3(0xeb)]/0x2,_0x291127=_0x2cdfe5[_0x2631a3(0xa3)]<_0x1c7902;_0x41151b[_0x2631a3(0x92)](_0x48f7f2=>_0x48f7f2[_0x2631a3(0x11b)]['remove'](_0x2631a3(0x105),_0x2631a3(0x99))),_0x31f626[_0x2631a3(0x11b)][_0x2631a3(0x127)](_0x291127?_0x2631a3(0x105):_0x2631a3(0x99));}),_0x31f626[_0xe75f01(0x112)]('dragleave',()=>{const _0x277db7=_0xe75f01;_0x31f626[_0x277db7(0x11b)][_0x277db7(0x11e)](_0x277db7(0x105),_0x277db7(0x99));}),_0x31f626[_0xe75f01(0x112)]('drop',async _0x5cf65a=>{const _0x205d3f=_0xe75f01;_0x5cf65a['preventDefault']();const _0x25183e=_0x5cf65a[_0x205d3f(0xa8)][_0x205d3f(0xb4)]('text/plain'),_0x264390=_0x31f626[_0x205d3f(0x9c)][_0x205d3f(0xe0)];if(_0x25183e===_0x264390)return;const _0x1942bd=_0x31f626[_0x205d3f(0xa4)](),_0x35a195=_0x5cf65a['clientX']<_0x1942bd[_0x205d3f(0x12b)]+_0x1942bd[_0x205d3f(0xeb)]/0x2;_0x31f626['classList'][_0x205d3f(0x11e)]('drop-before','drop-after'),_0x1cc3e1&&await _0x1cc3e1(_0x25183e,_0x264390,_0x35a195);});});const _0x159cdd=document[_0x41310b(0xe6)](_0x41310b(0x10b));return _0x159cdd[_0x41310b(0xb5)]='task-tab-remove-zone',_0x159cdd[_0x41310b(0x111)]=_0x41310b(0x12a),_0x159cdd['style'][_0x41310b(0xf5)]=_0x41310b(0x9f),_0x159cdd[_0x41310b(0x112)](_0x41310b(0xbe),_0x2c493e=>{const _0xfbe5c3=_0x41310b;_0x2c493e['preventDefault'](),_0x159cdd[_0xfbe5c3(0x11b)][_0xfbe5c3(0x127)]('drag-over');}),_0x159cdd[_0x41310b(0x112)](_0x41310b(0x125),()=>{const _0x2ea519=_0x41310b;_0x159cdd['classList'][_0x2ea519(0x11e)]('drag-over');}),_0x159cdd[_0x41310b(0x112)]('drop',async _0x5c27ca=>{const _0x3eee6d=_0x41310b;_0x5c27ca[_0x3eee6d(0x11c)](),_0x159cdd[_0x3eee6d(0x11b)][_0x3eee6d(0x11e)](_0x3eee6d(0x9e));const _0x4475f=_0x5c27ca['dataTransfer'][_0x3eee6d(0xb4)]('text/plain');_0x1b5589&&await _0x1b5589(_0x4475f);}),_0x96f630[_0x41310b(0x112)](_0x41310b(0xc6),()=>{const _0x567281=_0x41310b;_0x56ef5b[_0x567281(0xd5)]>0x1&&(_0x159cdd['style']['display']=_0x567281(0x11f));}),_0x96f630['addEventListener'](_0x41310b(0xd8),()=>{const _0x4f2a3c=_0x41310b;_0x159cdd[_0x4f2a3c(0xdc)][_0x4f2a3c(0xf5)]=_0x4f2a3c(0x9f);}),_0x96f630[_0x41310b(0xf7)](_0x159cdd),{'destroy':()=>{const _0x3522b1=_0x41310b;_0x159cdd[_0x3522b1(0x11e)]();}};}export default VariantGroupingManager;