@terreno/mcp 57.19.2 → 57.20.0

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 (197) hide show
  1. package/CHANGELOG.md +393 -0
  2. package/README.md +32 -269
  3. package/dist/bootstrap.d.ts +12 -0
  4. package/dist/bootstrap.d.ts.map +1 -1
  5. package/dist/bootstrap.js +77 -122
  6. package/dist/bootstrap.js.map +1 -1
  7. package/dist/docs/guidelines/ui/guidelines/core.md +1 -1
  8. package/dist/docs/resources/overview.md +4 -2
  9. package/dist/docs/resources/patterns.md +237 -176
  10. package/dist/docs/resources/ui.md +48 -17
  11. package/dist/docs/templates/bootstrap/frontend/app/(tabs)/profile.template.tsx +0 -26
  12. package/dist/docs/templates/bootstrap/frontend/app/_layout.template.tsx +3 -2
  13. package/dist/docs/templates/bootstrap/frontend/app/login.template.tsx +1 -1
  14. package/dist/docs/upgrades/57.20.0.md +238 -0
  15. package/dist/docs/versioned/next/approval-rubric.md +30 -12
  16. package/dist/docs/versioned/next/explanation/README.md +5 -0
  17. package/dist/docs/versioned/next/explanation/account-linking.md +169 -0
  18. package/dist/docs/versioned/next/explanation/admin-interface.md +1 -1
  19. package/dist/docs/versioned/next/explanation/agent-guidelines.md +173 -0
  20. package/dist/docs/versioned/next/explanation/ai-development-loop.md +196 -0
  21. package/dist/docs/versioned/next/explanation/authentication.md +45 -1
  22. package/dist/docs/versioned/next/explanation/consent-forms.md +105 -0
  23. package/dist/docs/versioned/next/explanation/example-coverage.md +1 -0
  24. package/dist/docs/versioned/next/explanation/local-first-data.md +1 -1
  25. package/dist/docs/versioned/next/explanation/organizations.md +37 -0
  26. package/dist/docs/versioned/next/explanation/planning-plugins.md +4 -0
  27. package/dist/docs/versioned/next/explanation/responsive-design.md +143 -0
  28. package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +11 -0
  29. package/dist/docs/versioned/next/explanation/schema-metadata.md +5 -0
  30. package/dist/docs/versioned/next/how-to/README.md +7 -2
  31. package/dist/docs/versioned/next/how-to/audit-log.md +22 -3
  32. package/dist/docs/versioned/next/how-to/automate-terreno-upgrades.md +169 -0
  33. package/dist/docs/versioned/next/how-to/build-list-detail-screens.md +160 -0
  34. package/dist/docs/versioned/next/how-to/circleci.md +15 -5
  35. package/dist/docs/versioned/next/how-to/configure-better-auth.md +673 -53
  36. package/dist/docs/versioned/next/how-to/create-a-terreno-app.md +8 -5
  37. package/dist/docs/versioned/next/how-to/debug-with-mcp.md +393 -23
  38. package/dist/docs/versioned/next/how-to/enable-mcp-oauth.md +54 -3
  39. package/dist/docs/versioned/next/how-to/migrate-rtk-to-syncdb.md +9 -0
  40. package/dist/docs/versioned/next/how-to/password-reset.md +1 -1
  41. package/dist/docs/versioned/next/how-to/recover-locked-out-user.md +112 -0
  42. package/dist/docs/versioned/next/how-to/run-tests-locally.md +37 -8
  43. package/dist/docs/versioned/next/how-to/set-up-social-login.md +424 -0
  44. package/dist/docs/versioned/next/how-to/set-up-terreno-mcp.md +241 -36
  45. package/dist/docs/versioned/next/how-to/sign-consent-on-behalf.md +139 -0
  46. package/dist/docs/versioned/next/how-to/upgrade-terreno.md +4 -0
  47. package/dist/docs/versioned/next/implementationPlans/ai-dev-loop-boost.md +47 -32
  48. package/dist/docs/versioned/next/implementationPlans/auth-experience.md +952 -0
  49. package/dist/docs/versioned/next/implementationPlans/consent-forms.md +8 -0
  50. package/dist/docs/versioned/next/implementationPlans/list-detail-layout.md +297 -0
  51. package/dist/docs/versioned/next/implementationPlans/login-redesign/HANDOFF.md +211 -0
  52. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/AnotherWay.html +121 -0
  53. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/BackupCode.html +72 -0
  54. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/Cancelled.html +87 -0
  55. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/ContinueEmail.html +64 -0
  56. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/FirstVisit.html +81 -0
  57. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/Main.html +88 -0
  58. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/ManageAccounts.html +77 -0
  59. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/NotLinked.html +92 -0
  60. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/SigningIn.html +60 -0
  61. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactor.html +76 -0
  62. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactorError.html +81 -0
  63. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/WrongPassword.html +69 -0
  64. package/dist/docs/versioned/next/implementationPlans/mcp-boost-parity.md +1 -1
  65. package/dist/docs/versioned/next/plans/2026-10-23-provisional-consent.md +297 -0
  66. package/dist/docs/versioned/next/plans/2026-10-29-fix-mcp-oauth-native-and-machine.md +68 -0
  67. package/dist/docs/versioned/next/reference/README.md +1 -0
  68. package/dist/docs/versioned/next/reference/account-security.md +700 -0
  69. package/dist/docs/versioned/next/reference/admin-backend.md +3 -1
  70. package/dist/docs/versioned/next/reference/admin-frontend.md +225 -1
  71. package/dist/docs/versioned/next/reference/api.md +461 -35
  72. package/dist/docs/versioned/next/reference/cli.md +1 -1
  73. package/dist/docs/versioned/next/reference/comms.md +8 -0
  74. package/dist/docs/versioned/next/reference/create-terreno-app.md +3 -1
  75. package/dist/docs/versioned/next/reference/environment-variables.md +9 -3
  76. package/dist/docs/versioned/next/reference/legacy/rtk.md +19 -3
  77. package/dist/docs/versioned/next/reference/lifecycle-plugin.md +6 -0
  78. package/dist/docs/versioned/next/reference/mcp-server.md +1158 -441
  79. package/dist/docs/versioned/next/reference/syncdb.md +8 -1
  80. package/dist/docs/versioned/next/reference/ui.md +1271 -27
  81. package/dist/docs/versioned/next/tasks/ai-dev-loop-boost.md +28 -16
  82. package/dist/docs/versioned/next/tutorials/README.md +4 -0
  83. package/dist/httpApp.d.ts +14 -0
  84. package/dist/httpApp.d.ts.map +1 -0
  85. package/dist/httpApp.js +99 -0
  86. package/dist/httpApp.js.map +1 -0
  87. package/dist/index.js +8 -90
  88. package/dist/index.js.map +1 -1
  89. package/dist/local/localTools.d.ts.map +1 -1
  90. package/dist/local/localTools.js +44 -14
  91. package/dist/local/localTools.js.map +1 -1
  92. package/dist/local/metro/metroDevSession.d.ts +18 -0
  93. package/dist/local/metro/metroDevSession.d.ts.map +1 -1
  94. package/dist/local/metro/metroDevSession.js +42 -3
  95. package/dist/local/metro/metroDevSession.js.map +1 -1
  96. package/dist/local/tools/databaseQuery.d.ts.map +1 -1
  97. package/dist/local/tools/databaseQuery.js +3 -13
  98. package/dist/local/tools/databaseQuery.js.map +1 -1
  99. package/dist/local/tools/databaseSchema.d.ts.map +1 -1
  100. package/dist/local/tools/databaseSchema.js +3 -13
  101. package/dist/local/tools/databaseSchema.js.map +1 -1
  102. package/dist/local/tools/localMongo.d.ts +10 -0
  103. package/dist/local/tools/localMongo.d.ts.map +1 -0
  104. package/dist/local/tools/localMongo.js +30 -0
  105. package/dist/local/tools/localMongo.js.map +1 -0
  106. package/dist/local/tools/runtime.d.ts +18 -2
  107. package/dist/local/tools/runtime.d.ts.map +1 -1
  108. package/dist/local/tools/runtime.js +75 -20
  109. package/dist/local/tools/runtime.js.map +1 -1
  110. package/dist/local/tools/syncDb.d.ts +11 -0
  111. package/dist/local/tools/syncDb.d.ts.map +1 -1
  112. package/dist/local/tools/syncDb.js +15 -3
  113. package/dist/local/tools/syncDb.js.map +1 -1
  114. package/dist/rateLimit.d.ts +35 -0
  115. package/dist/rateLimit.d.ts.map +1 -0
  116. package/dist/rateLimit.js +112 -0
  117. package/dist/rateLimit.js.map +1 -0
  118. package/dist/tools.d.ts.map +1 -1
  119. package/dist/tools.js +42 -60
  120. package/dist/tools.js.map +1 -1
  121. package/package.json +4 -3
  122. package/src/docs/guidelines/ui/guidelines/core.md +1 -1
  123. package/src/docs/resources/overview.md +4 -2
  124. package/src/docs/resources/patterns.md +237 -176
  125. package/src/docs/resources/ui.md +48 -17
  126. package/src/docs/templates/bootstrap/frontend/app/(tabs)/profile.template.tsx +0 -26
  127. package/src/docs/templates/bootstrap/frontend/app/_layout.template.tsx +3 -2
  128. package/src/docs/templates/bootstrap/frontend/app/login.template.tsx +1 -1
  129. package/src/docs/upgrades/57.20.0.md +238 -0
  130. package/src/docs/versioned/next/approval-rubric.md +30 -12
  131. package/src/docs/versioned/next/explanation/README.md +5 -0
  132. package/src/docs/versioned/next/explanation/account-linking.md +169 -0
  133. package/src/docs/versioned/next/explanation/admin-interface.md +1 -1
  134. package/src/docs/versioned/next/explanation/agent-guidelines.md +173 -0
  135. package/src/docs/versioned/next/explanation/ai-development-loop.md +196 -0
  136. package/src/docs/versioned/next/explanation/authentication.md +45 -1
  137. package/src/docs/versioned/next/explanation/consent-forms.md +105 -0
  138. package/src/docs/versioned/next/explanation/example-coverage.md +1 -0
  139. package/src/docs/versioned/next/explanation/local-first-data.md +1 -1
  140. package/src/docs/versioned/next/explanation/organizations.md +37 -0
  141. package/src/docs/versioned/next/explanation/planning-plugins.md +4 -0
  142. package/src/docs/versioned/next/explanation/responsive-design.md +143 -0
  143. package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +11 -0
  144. package/src/docs/versioned/next/explanation/schema-metadata.md +5 -0
  145. package/src/docs/versioned/next/how-to/README.md +7 -2
  146. package/src/docs/versioned/next/how-to/audit-log.md +22 -3
  147. package/src/docs/versioned/next/how-to/automate-terreno-upgrades.md +169 -0
  148. package/src/docs/versioned/next/how-to/build-list-detail-screens.md +160 -0
  149. package/src/docs/versioned/next/how-to/circleci.md +15 -5
  150. package/src/docs/versioned/next/how-to/configure-better-auth.md +673 -53
  151. package/src/docs/versioned/next/how-to/create-a-terreno-app.md +8 -5
  152. package/src/docs/versioned/next/how-to/debug-with-mcp.md +393 -23
  153. package/src/docs/versioned/next/how-to/enable-mcp-oauth.md +54 -3
  154. package/src/docs/versioned/next/how-to/migrate-rtk-to-syncdb.md +9 -0
  155. package/src/docs/versioned/next/how-to/password-reset.md +1 -1
  156. package/src/docs/versioned/next/how-to/recover-locked-out-user.md +112 -0
  157. package/src/docs/versioned/next/how-to/run-tests-locally.md +37 -8
  158. package/src/docs/versioned/next/how-to/set-up-social-login.md +424 -0
  159. package/src/docs/versioned/next/how-to/set-up-terreno-mcp.md +241 -36
  160. package/src/docs/versioned/next/how-to/sign-consent-on-behalf.md +139 -0
  161. package/src/docs/versioned/next/how-to/upgrade-terreno.md +4 -0
  162. package/src/docs/versioned/next/implementationPlans/ai-dev-loop-boost.md +47 -32
  163. package/src/docs/versioned/next/implementationPlans/auth-experience.md +952 -0
  164. package/src/docs/versioned/next/implementationPlans/consent-forms.md +8 -0
  165. package/src/docs/versioned/next/implementationPlans/list-detail-layout.md +297 -0
  166. package/src/docs/versioned/next/implementationPlans/login-redesign/HANDOFF.md +211 -0
  167. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/AnotherWay.html +121 -0
  168. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/BackupCode.html +72 -0
  169. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/Cancelled.html +87 -0
  170. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/ContinueEmail.html +64 -0
  171. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/FirstVisit.html +81 -0
  172. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/Main.html +88 -0
  173. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/ManageAccounts.html +77 -0
  174. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/NotLinked.html +92 -0
  175. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/SigningIn.html +60 -0
  176. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactor.html +76 -0
  177. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactorError.html +81 -0
  178. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/WrongPassword.html +69 -0
  179. package/src/docs/versioned/next/implementationPlans/mcp-boost-parity.md +1 -1
  180. package/src/docs/versioned/next/plans/2026-10-23-provisional-consent.md +297 -0
  181. package/src/docs/versioned/next/plans/2026-10-29-fix-mcp-oauth-native-and-machine.md +68 -0
  182. package/src/docs/versioned/next/reference/README.md +1 -0
  183. package/src/docs/versioned/next/reference/account-security.md +700 -0
  184. package/src/docs/versioned/next/reference/admin-backend.md +3 -1
  185. package/src/docs/versioned/next/reference/admin-frontend.md +225 -1
  186. package/src/docs/versioned/next/reference/api.md +461 -35
  187. package/src/docs/versioned/next/reference/cli.md +1 -1
  188. package/src/docs/versioned/next/reference/comms.md +8 -0
  189. package/src/docs/versioned/next/reference/create-terreno-app.md +3 -1
  190. package/src/docs/versioned/next/reference/environment-variables.md +9 -3
  191. package/src/docs/versioned/next/reference/legacy/rtk.md +19 -3
  192. package/src/docs/versioned/next/reference/lifecycle-plugin.md +6 -0
  193. package/src/docs/versioned/next/reference/mcp-server.md +1158 -441
  194. package/src/docs/versioned/next/reference/syncdb.md +8 -1
  195. package/src/docs/versioned/next/reference/ui.md +1271 -27
  196. package/src/docs/versioned/next/tasks/ai-dev-loop-boost.md +28 -16
  197. package/src/docs/versioned/next/tutorials/README.md +4 -0
@@ -0,0 +1,92 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Sign in: account not linked</title>
6
+ </head>
7
+ <body>
8
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&amp;family=Titillium+Web:wght@600;700&amp;display=swap">
9
+ <style>
10
+ body{margin:0;background:#e9eef0;display:flex;justify-content:center;padding:24px 0}
11
+ a{color:#0a7092}a:hover{color:#095a75}
12
+ .screen{--surface-base:#ffffff;--surface-primary:#0e9dcd;--surface-sec-xl:#f2f9fa;--surface-sec-l:#b6cdd5;--surface-sec-xd:#092e3a;--surface-warningLight:#ffe3c6;--text-primary:#1c1c1c;--text-secondary:#686868;--text-extraLight:#949494;--text-link:#0a7092;--text-warning:#b14202;--text-sec-d:#092e3a;--border-default:#cdcdcd;--border-warning:#f36719;box-sizing:border-box;width:390px;min-height:100%;padding:56px 24px 32px;background:var(--surface-base);color:var(--text-primary);font-family:Nunito,system-ui,sans-serif;display:flex;flex-direction:column;gap:24px}
13
+ .logo{width:48px;height:48px;border-radius:16px;background:var(--surface-sec-xd);color:#fff;display:grid;place-items:center;font:700 12px/1 Nunito,sans-serif}
14
+ .h1{margin:0;font:700 32px/38px "Titillium Web",sans-serif}
15
+ .sub{margin:4px 0 0;font-size:16px;line-height:24px;color:var(--text-secondary)}
16
+ .banner{display:flex;gap:12px;align-items:flex-start;padding:16px;border-radius:16px;background:var(--surface-warningLight);border:1px solid var(--border-warning);color:var(--text-primary);font-size:16px;line-height:22px}
17
+ .banner .ico{flex:none;width:20px;height:20px;margin-top:1px;color:var(--text-warning)}
18
+ .banner-body{flex:1;display:flex;flex-direction:column;gap:12px}
19
+ .banner-title{margin:0;font-weight:700}
20
+ .banner p{margin:0}
21
+ .btn-sm{align-self:flex-start;height:36px;padding:0 16px;border-radius:360px;border:1px solid var(--text-primary);background:none;font:700 14px/1 Nunito,sans-serif;color:var(--text-primary);cursor:pointer}
22
+ .link{font:700 16px/24px Nunito,sans-serif;color:var(--text-link);text-decoration:none;background:none;border:0;padding:0;cursor:pointer}
23
+ .btn{position:relative;display:flex;align-items:center;justify-content:center;gap:10px;width:100%;height:48px;box-sizing:border-box;padding:0 20px;border-radius:360px;border:1px solid var(--border-default);background:var(--surface-base);color:var(--text-primary);font:700 16px/1 Nunito,sans-serif;cursor:pointer}
24
+ .btn .ico{position:absolute;left:20px;width:18px;height:18px}
25
+ .btn-primary{background:var(--surface-primary);border-color:var(--surface-primary);color:#fff;font-size:19px}
26
+ .stack{display:flex;flex-direction:column;gap:12px}
27
+ .divider{display:flex;align-items:center;gap:12px;font-size:12px;line-height:16px;color:var(--text-secondary)}
28
+ .divider::before,.divider::after{content:"";flex:1;height:1px;background:var(--border-default)}
29
+ .form{display:flex;flex-direction:column;gap:16px}
30
+ .field{display:flex;flex-direction:column;gap:6px}
31
+ .lbl-row{display:flex;justify-content:space-between;align-items:baseline}
32
+ .lbl{font:600 16px/24px Nunito,sans-serif}
33
+ .input{box-sizing:border-box;width:100%;height:48px;padding:0 14px;border:1px solid var(--border-default);border-radius:4px;background:var(--surface-base);font:16px Nunito,sans-serif;color:var(--text-primary)}
34
+ .input::placeholder{color:var(--text-extraLight)}
35
+ .foot{margin-top:auto;text-align:center;font-size:16px;line-height:24px;color:var(--text-secondary)}
36
+ </style>
37
+ <main class="screen">
38
+ <div class="logo" aria-label="Your app logo">LOGO</div>
39
+ <div>
40
+ <h1 class="h1">Sign in</h1>
41
+ <p class="sub">Choose how you want to sign in.</p>
42
+ </div>
43
+
44
+ <div class="banner" role="alert">
45
+ <svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3 2 20h20L12 3z"></path><path d="M12 10v4M12 17h.01"></path></svg>
46
+ <div class="banner-body">
47
+ <p class="banner-title">You already have an account</p>
48
+ <p>That email is already used with a password. Sign in with email, then link GitHub from Security.</p>
49
+ <button class="btn-sm" type="button">Sign in with email</button>
50
+ </div>
51
+ </div>
52
+
53
+ <div class="stack">
54
+ <button class="btn" type="button">
55
+ <svg class="ico" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z"></path></svg>
56
+ Continue with Google
57
+ </button>
58
+ <button class="btn" type="button">
59
+ <svg class="ico" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"></path></svg>
60
+ Continue with Apple
61
+ </button>
62
+ <button class="btn" type="button">
63
+ <svg class="ico" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg>
64
+ Continue with GitHub
65
+ </button>
66
+ <button class="btn" type="button">
67
+ <svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="7.5" cy="15.5" r="4.5"></circle><path d="M10.7 12.3 21 2M17 6l3 3M14.5 8.5l2.5 2.5"></path></svg>
68
+ Sign in with a passkey
69
+ </button>
70
+ </div>
71
+
72
+ <div class="divider">or use your email</div>
73
+
74
+ <form class="form">
75
+ <div class="field">
76
+ <label class="lbl" for="nl-email">Email</label>
77
+ <input class="input" id="nl-email" type="email" placeholder="you@example.com" autocomplete="username webauthn">
78
+ </div>
79
+ <div class="field">
80
+ <div class="lbl-row">
81
+ <label class="lbl" for="nl-pw">Password</label>
82
+ <a class="link" href="#" style="font-size: 14px">Forgot password?</a>
83
+ </div>
84
+ <input class="input" id="nl-pw" type="password" autocomplete="current-password">
85
+ </div>
86
+ <button class="btn btn-primary" type="submit">Sign in</button>
87
+ </form>
88
+
89
+ <p class="foot">New here? <a href="#">Create an account</a></p>
90
+ </main>
91
+ </body>
92
+ </html>
@@ -0,0 +1,60 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Sign in: signing in</title>
6
+ </head>
7
+ <body>
8
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&amp;family=Titillium+Web:wght@600;700&amp;display=swap">
9
+ <style>
10
+ body{margin:0;background:#e9eef0;display:flex;justify-content:center;padding:24px 0}
11
+ a{color:#0a7092}a:hover{color:#095a75}
12
+ .screen{--surface-base:#ffffff;--surface-alt:#f2f2f2;--surface-primary:#0e9dcd;--surface-sec-xl:#f2f9fa;--surface-sec-l:#b6cdd5;--text-primary:#1c1c1c;--text-secondary:#686868;--text-extraLight:#949494;--text-link:#0a7092;--border-default:#cdcdcd;box-sizing:border-box;width:390px;min-height:100%;padding:24px 24px 32px;background:var(--surface-base);color:var(--text-primary);font-family:Nunito,system-ui,sans-serif;display:flex;flex-direction:column;gap:24px}
13
+ .back{display:inline-flex;align-items:center;gap:4px;height:44px;align-self:flex-start;margin-left:-8px;padding:0 8px;border:0;background:none;font:700 16px/1 Nunito,sans-serif;color:var(--text-secondary);cursor:default}
14
+ .back svg{width:20px;height:20px}
15
+ .h1{margin:0;font:700 32px/38px "Titillium Web",sans-serif}
16
+ .who{display:flex;align-items:center;gap:12px;padding:12px 16px;border-radius:16px;background:var(--surface-sec-xl);border:1px solid var(--surface-sec-l)}
17
+ .avatar{flex:none;width:40px;height:40px;border-radius:50%;display:grid;place-items:center;color:#fff;font:700 18px/1 "Titillium Web",sans-serif}
18
+ .who-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
19
+ .who-name{font-weight:700;font-size:16px;line-height:22px}
20
+ .who-meta{font-size:12px;line-height:16px;color:var(--text-secondary)}
21
+ .form{display:flex;flex-direction:column;gap:16px}
22
+ .field{display:flex;flex-direction:column;gap:6px}
23
+ .lbl{font:600 16px/24px Nunito,sans-serif}
24
+ .input{box-sizing:border-box;width:100%;height:48px;padding:0 14px;border:1px solid var(--border-default);border-radius:4px;background:var(--surface-alt);font:16px Nunito,sans-serif;color:var(--text-secondary)}
25
+ .btn{position:relative;display:flex;align-items:center;justify-content:center;gap:10px;width:100%;height:48px;box-sizing:border-box;padding:0 20px;border-radius:360px;border:1px solid var(--border-default);font:700 16px/1 Nunito,sans-serif}
26
+ .btn-primary{background:var(--surface-primary);border-color:var(--surface-primary);color:#fff;font-size:19px;cursor:progress}
27
+ .spin{width:20px;height:20px}
28
+ .foot{margin-top:auto;text-align:center;font-size:16px;line-height:24px;color:var(--text-secondary)}
29
+ </style>
30
+ <main class="screen" aria-busy="true">
31
+ <button class="back" type="button" disabled>
32
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 6-6 6 6 6"></path></svg>
33
+ All sign-in options
34
+ </button>
35
+
36
+ <h1 class="h1">Enter your password</h1>
37
+
38
+ <div class="who">
39
+ <span class="avatar" style="background: #0a7092" aria-hidden="true">J</span>
40
+ <span class="who-body">
41
+ <span class="who-name">Josh Gachnang</span>
42
+ <span class="who-meta">josh@example.com</span>
43
+ </span>
44
+ </div>
45
+
46
+ <form class="form">
47
+ <div class="field">
48
+ <label class="lbl" for="si-pw">Password</label>
49
+ <input class="input" id="si-pw" type="password" value="password123" disabled>
50
+ </div>
51
+ <button class="btn btn-primary" type="submit" disabled>
52
+ <svg class="spin" viewBox="0 0 24 24" fill="none" aria-hidden="true"><circle cx="12" cy="12" r="9" stroke="currentColor" stroke-opacity="0.35" stroke-width="3"></circle><path d="M21 12a9 9 0 0 0-9-9" stroke="currentColor" stroke-width="3" stroke-linecap="round"></path></svg>
53
+ Signing in
54
+ </button>
55
+ </form>
56
+
57
+ <p class="foot">New here? <a href="#">Create an account</a></p>
58
+ </main>
59
+ </body>
60
+ </html>
@@ -0,0 +1,76 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Two-factor: authenticator code</title>
6
+ </head>
7
+ <body>
8
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&amp;family=Titillium+Web:wght@600;700&amp;display=swap">
9
+ <style>
10
+ body{margin:0;background:#e9eef0;display:flex;justify-content:center;padding:24px 0}
11
+ a{color:#0a7092}a:hover{color:#095a75}
12
+ .screen{--surface-base:#ffffff;--surface-primary:#0e9dcd;--surface-sec-xl:#f2f9fa;--surface-sec-l:#b6cdd5;--text-primary:#1c1c1c;--text-secondary:#686868;--text-link:#0a7092;--text-sec-d:#092e3a;--border-default:#cdcdcd;--border-focus:#73cae8;box-sizing:border-box;width:390px;min-height:100%;padding:24px 24px 32px;background:var(--surface-base);color:var(--text-primary);font-family:Nunito,system-ui,sans-serif;display:flex;flex-direction:column;gap:24px}
13
+ .back{display:inline-flex;align-items:center;gap:4px;height:44px;align-self:flex-start;margin-left:-8px;padding:0 8px;border:0;background:none;font:700 16px/1 Nunito,sans-serif;color:var(--text-link);cursor:pointer}
14
+ .back svg{width:20px;height:20px}
15
+ .badge{width:56px;height:56px;border-radius:16px;display:grid;place-items:center;background:var(--surface-sec-xl);color:var(--text-sec-d)}
16
+ .badge svg{width:28px;height:28px}
17
+ .h1{margin:0;font:700 32px/38px "Titillium Web",sans-serif}
18
+ .sub{margin:8px 0 0;font-size:16px;line-height:24px;color:var(--text-secondary)}
19
+ .otp{display:flex;gap:8px;justify-content:space-between}
20
+ .digit{box-sizing:border-box;width:48px;height:56px;border:1px solid var(--border-default);border-radius:4px;text-align:center;font:700 24px/1 "Titillium Web",sans-serif;color:var(--text-primary);background:var(--surface-base)}
21
+ .digit-focus{border-color:var(--surface-primary);box-shadow:0 0 0 3px var(--border-focus)}
22
+ .check{display:flex;gap:12px;align-items:flex-start;font-size:16px;line-height:22px;cursor:pointer}
23
+ .check input{flex:none;width:20px;height:20px;margin:1px 0 0;accent-color:#0e9dcd}
24
+ .check small{display:block;font-size:12px;line-height:16px;color:var(--text-secondary)}
25
+ .btn{display:flex;align-items:center;justify-content:center;width:100%;height:48px;box-sizing:border-box;border-radius:360px;border:1px solid var(--border-default);background:var(--surface-base);color:var(--text-primary);font:700 16px/1 Nunito,sans-serif;cursor:pointer}
26
+ .btn-primary{background:var(--surface-primary);border-color:var(--surface-primary);color:#fff;font-size:19px}
27
+ .alt{display:flex;flex-direction:column;align-items:center;gap:4px}
28
+ .link{font:700 16px/24px Nunito,sans-serif;color:var(--text-link);text-decoration:none;background:none;border:0;padding:10px 0;cursor:pointer}
29
+ .foot{margin-top:auto;text-align:center}
30
+ </style>
31
+ <main class="screen">
32
+ <button class="back" type="button">
33
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 6-6 6 6 6"></path></svg>
34
+ Back
35
+ </button>
36
+
37
+ <div class="badge" aria-hidden="true">
38
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3 4 6v6c0 4.5 3.4 8.3 8 9 4.6-.7 8-4.5 8-9V6l-8-3z"></path><path d="m9 12 2 2 4-4"></path></svg>
39
+ </div>
40
+
41
+ <div>
42
+ <h1 class="h1">Enter your code</h1>
43
+ <p class="sub">Open your authenticator app and enter the 6-digit code for j***@n***.io.</p>
44
+ </div>
45
+
46
+ <form style="display: flex; flex-direction: column; gap: 24px">
47
+ <fieldset style="border: 0; margin: 0; padding: 0">
48
+ <legend style="position: absolute; width: 1px; height: 1px; overflow: hidden">Authentication code</legend>
49
+ <div class="otp">
50
+ <input class="digit" value="4" inputmode="numeric" maxlength="1" aria-label="Digit 1" autocomplete="one-time-code">
51
+ <input class="digit" value="8" inputmode="numeric" maxlength="1" aria-label="Digit 2">
52
+ <input class="digit" value="2" inputmode="numeric" maxlength="1" aria-label="Digit 3">
53
+ <input class="digit digit-focus" value="" inputmode="numeric" maxlength="1" aria-label="Digit 4">
54
+ <input class="digit" value="" inputmode="numeric" maxlength="1" aria-label="Digit 5">
55
+ <input class="digit" value="" inputmode="numeric" maxlength="1" aria-label="Digit 6">
56
+ </div>
57
+ </fieldset>
58
+
59
+ <label class="check">
60
+ <input type="checkbox" checked>
61
+ <span>Trust this device<small>We won't ask for a code here for 30 days.</small></span>
62
+ </label>
63
+
64
+ <button class="btn btn-primary" type="submit">Verify</button>
65
+ </form>
66
+
67
+ <div class="alt">
68
+ <button class="link" type="button">Use a backup code instead</button>
69
+ </div>
70
+
71
+ <div class="foot">
72
+ <button class="link" type="button" style="color: #686868">Sign in a different way</button>
73
+ </div>
74
+ </main>
75
+ </body>
76
+ </html>
@@ -0,0 +1,81 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Two-factor: wrong code</title>
6
+ </head>
7
+ <body>
8
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&amp;family=Titillium+Web:wght@600;700&amp;display=swap">
9
+ <style>
10
+ body{margin:0;background:#e9eef0;display:flex;justify-content:center;padding:24px 0}
11
+ a{color:#0a7092}a:hover{color:#095a75}
12
+ .screen{--surface-base:#ffffff;--surface-primary:#0e9dcd;--surface-sec-xl:#f2f9fa;--text-primary:#1c1c1c;--text-secondary:#686868;--text-link:#0a7092;--text-error:#bd1111;--text-sec-d:#092e3a;--border-default:#cdcdcd;--border-error:#d33232;box-sizing:border-box;width:390px;min-height:100%;padding:24px 24px 32px;background:var(--surface-base);color:var(--text-primary);font-family:Nunito,system-ui,sans-serif;display:flex;flex-direction:column;gap:24px}
13
+ .back{display:inline-flex;align-items:center;gap:4px;height:44px;align-self:flex-start;margin-left:-8px;padding:0 8px;border:0;background:none;font:700 16px/1 Nunito,sans-serif;color:var(--text-link);cursor:pointer}
14
+ .back svg{width:20px;height:20px}
15
+ .badge{width:56px;height:56px;border-radius:16px;display:grid;place-items:center;background:var(--surface-sec-xl);color:var(--text-sec-d)}
16
+ .badge svg{width:28px;height:28px}
17
+ .h1{margin:0;font:700 32px/38px "Titillium Web",sans-serif}
18
+ .sub{margin:8px 0 0;font-size:16px;line-height:24px;color:var(--text-secondary)}
19
+ .otp{display:flex;gap:8px;justify-content:space-between}
20
+ .digit{box-sizing:border-box;width:48px;height:56px;border:2px solid var(--border-error);border-radius:4px;text-align:center;font:700 24px/1 "Titillium Web",sans-serif;color:var(--text-primary);background:var(--surface-base)}
21
+ .err{display:flex;gap:6px;align-items:flex-start;margin:8px 0 0;font-size:14px;line-height:20px;color:var(--text-error)}
22
+ .err svg{flex:none;width:16px;height:16px;margin-top:2px}
23
+ .check{display:flex;gap:12px;align-items:flex-start;font-size:16px;line-height:22px;cursor:pointer}
24
+ .check input{flex:none;width:20px;height:20px;margin:1px 0 0;accent-color:#0e9dcd}
25
+ .check small{display:block;font-size:12px;line-height:16px;color:var(--text-secondary)}
26
+ .btn{display:flex;align-items:center;justify-content:center;width:100%;height:48px;box-sizing:border-box;border-radius:360px;border:1px solid var(--border-default);background:var(--surface-base);color:var(--text-primary);font:700 16px/1 Nunito,sans-serif;cursor:pointer}
27
+ .btn-primary{background:var(--surface-primary);border-color:var(--surface-primary);color:#fff;font-size:19px}
28
+ .alt{display:flex;flex-direction:column;align-items:center;gap:4px}
29
+ .link{font:700 16px/24px Nunito,sans-serif;color:var(--text-link);text-decoration:none;background:none;border:0;padding:10px 0;cursor:pointer}
30
+ .foot{margin-top:auto;text-align:center}
31
+ </style>
32
+ <main class="screen">
33
+ <button class="back" type="button">
34
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 6-6 6 6 6"></path></svg>
35
+ Back
36
+ </button>
37
+
38
+ <div class="badge" aria-hidden="true">
39
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3 4 6v6c0 4.5 3.4 8.3 8 9 4.6-.7 8-4.5 8-9V6l-8-3z"></path><path d="m9 12 2 2 4-4"></path></svg>
40
+ </div>
41
+
42
+ <div>
43
+ <h1 class="h1">Enter your code</h1>
44
+ <p class="sub">Open your authenticator app and enter the 6-digit code for j***@n***.io.</p>
45
+ </div>
46
+
47
+ <form style="display: flex; flex-direction: column; gap: 24px">
48
+ <fieldset style="border: 0; margin: 0; padding: 0">
49
+ <legend style="position: absolute; width: 1px; height: 1px; overflow: hidden">Authentication code</legend>
50
+ <div class="otp">
51
+ <input class="digit" value="4" inputmode="numeric" maxlength="1" aria-label="Digit 1" aria-invalid="true" aria-describedby="tfe-err">
52
+ <input class="digit" value="8" inputmode="numeric" maxlength="1" aria-label="Digit 2" aria-invalid="true">
53
+ <input class="digit" value="2" inputmode="numeric" maxlength="1" aria-label="Digit 3" aria-invalid="true">
54
+ <input class="digit" value="1" inputmode="numeric" maxlength="1" aria-label="Digit 4" aria-invalid="true">
55
+ <input class="digit" value="0" inputmode="numeric" maxlength="1" aria-label="Digit 5" aria-invalid="true">
56
+ <input class="digit" value="7" inputmode="numeric" maxlength="1" aria-label="Digit 6" aria-invalid="true">
57
+ </div>
58
+ <p class="err" id="tfe-err" role="alert">
59
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v6M12 16h.01"></path></svg>
60
+ That code didn't work. Codes change every 30 seconds, so enter the one your app shows now.
61
+ </p>
62
+ </fieldset>
63
+
64
+ <label class="check">
65
+ <input type="checkbox" checked>
66
+ <span>Trust this device<small>We won't ask for a code here for 30 days.</small></span>
67
+ </label>
68
+
69
+ <button class="btn btn-primary" type="submit">Verify</button>
70
+ </form>
71
+
72
+ <div class="alt">
73
+ <button class="link" type="button">Use a backup code instead</button>
74
+ </div>
75
+
76
+ <div class="foot">
77
+ <button class="link" type="button" style="color: #686868">Sign in a different way</button>
78
+ </div>
79
+ </main>
80
+ </body>
81
+ </html>
@@ -0,0 +1,69 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Sign in: wrong password</title>
6
+ </head>
7
+ <body>
8
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&amp;family=Titillium+Web:wght@600;700&amp;display=swap">
9
+ <style>
10
+ body{margin:0;background:#e9eef0;display:flex;justify-content:center;padding:24px 0}
11
+ a{color:#0a7092}a:hover{color:#095a75}
12
+ .screen{--surface-base:#ffffff;--surface-primary:#0e9dcd;--surface-sec-xl:#f2f9fa;--surface-sec-l:#b6cdd5;--text-primary:#1c1c1c;--text-secondary:#686868;--text-link:#0a7092;--text-error:#bd1111;--border-default:#cdcdcd;--border-error:#d33232;box-sizing:border-box;width:390px;min-height:100%;padding:24px 24px 32px;background:var(--surface-base);color:var(--text-primary);font-family:Nunito,system-ui,sans-serif;display:flex;flex-direction:column;gap:24px}
13
+ .back{display:inline-flex;align-items:center;gap:4px;height:44px;align-self:flex-start;margin-left:-8px;padding:0 8px;border:0;background:none;font:700 16px/1 Nunito,sans-serif;color:var(--text-link);cursor:pointer}
14
+ .back svg{width:20px;height:20px}
15
+ .h1{margin:0;font:700 32px/38px "Titillium Web",sans-serif}
16
+ .who{display:flex;align-items:center;gap:12px;padding:12px 16px;border-radius:16px;background:var(--surface-sec-xl);border:1px solid var(--surface-sec-l)}
17
+ .avatar{flex:none;width:40px;height:40px;border-radius:50%;display:grid;place-items:center;color:#fff;font:700 18px/1 "Titillium Web",sans-serif}
18
+ .who-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
19
+ .who-name{font-weight:700;font-size:16px;line-height:22px}
20
+ .who-meta{font-size:12px;line-height:16px;color:var(--text-secondary)}
21
+ .link{font:700 16px/24px Nunito,sans-serif;color:var(--text-link);text-decoration:none;background:none;border:0;padding:0;cursor:pointer}
22
+ .form{display:flex;flex-direction:column;gap:16px}
23
+ .field{display:flex;flex-direction:column;gap:6px}
24
+ .lbl-row{display:flex;justify-content:space-between;align-items:baseline}
25
+ .lbl{font:600 16px/24px Nunito,sans-serif}
26
+ .input{box-sizing:border-box;width:100%;height:48px;padding:0 14px;border:1px solid var(--border-default);border-radius:4px;background:var(--surface-base);font:16px Nunito,sans-serif;color:var(--text-primary)}
27
+ .input-error{border:2px solid var(--border-error);padding:0 13px}
28
+ .err{display:flex;gap:6px;align-items:flex-start;margin:0;font-size:14px;line-height:20px;color:var(--text-error)}
29
+ .err svg{flex:none;width:16px;height:16px;margin-top:2px}
30
+ .btn{position:relative;display:flex;align-items:center;justify-content:center;gap:10px;width:100%;height:48px;box-sizing:border-box;padding:0 20px;border-radius:360px;border:1px solid var(--border-default);background:var(--surface-base);color:var(--text-primary);font:700 16px/1 Nunito,sans-serif;cursor:pointer}
31
+ .btn-primary{background:var(--surface-primary);border-color:var(--surface-primary);color:#fff;font-size:19px}
32
+ .foot{margin-top:auto;text-align:center;font-size:16px;line-height:24px;color:var(--text-secondary)}
33
+ </style>
34
+ <main class="screen">
35
+ <button class="back" type="button">
36
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 6-6 6 6 6"></path></svg>
37
+ All sign-in options
38
+ </button>
39
+
40
+ <h1 class="h1">Enter your password</h1>
41
+
42
+ <div class="who">
43
+ <span class="avatar" style="background: #0a7092" aria-hidden="true">J</span>
44
+ <span class="who-body">
45
+ <span class="who-name">Josh Gachnang</span>
46
+ <span class="who-meta">josh@example.com</span>
47
+ </span>
48
+ <button class="link" type="button" style="font-size: 14px">Not you?</button>
49
+ </div>
50
+
51
+ <form class="form">
52
+ <div class="field">
53
+ <div class="lbl-row">
54
+ <label class="lbl" for="wp-pw">Password</label>
55
+ <a class="link" href="#" style="font-size: 14px">Forgot password?</a>
56
+ </div>
57
+ <input class="input input-error" id="wp-pw" type="password" value="password123" aria-invalid="true" aria-describedby="wp-err">
58
+ <p class="err" id="wp-err">
59
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v6M12 16h.01"></path></svg>
60
+ That password doesn't match. Try again or reset it.
61
+ </p>
62
+ </div>
63
+ <button class="btn btn-primary" type="submit">Sign in</button>
64
+ </form>
65
+
66
+ <p class="foot">New here? <a href="#">Create an account</a></p>
67
+ </main>
68
+ </body>
69
+ </html>
@@ -113,7 +113,7 @@ Boost keys guidelines by package major version (`.ai/laravel/11/`, `12/`). Terre
113
113
  ```jsonc
114
114
  {
115
115
  "mcpServers": {
116
- "terreno": { "type": "http", "url": "https://mcp.terreno.flourish.health/mcp" },
116
+ "terreno": { "type": "http", "url": "https://mcp.terreno.app/mcp" },
117
117
  "terreno-local": { "command": "bunx", "args": ["terreno-mcp-local"] }
118
118
  }
119
119
  }