{"_id":"@bnomei/emdash-action-maintenance","_rev":"4-d98877d7d7cd83364589b8d17ad2e706","name":"@bnomei/emdash-action-maintenance","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@bnomei/emdash-action-maintenance","version":"0.1.0","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","maintenance","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-action-maintenance@0.1.0","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-action-maintenance#readme","bugs":{"url":"https://github.com/bnomei/emdash-action-maintenance/issues"},"dist":{"shasum":"425e64ccfef2069f49a9be7ab8471e56f1655bf4","tarball":"https://registry.npmjs.org/@bnomei/emdash-action-maintenance/-/emdash-action-maintenance-0.1.0.tgz","fileCount":5,"integrity":"sha512-dgg5Egrijblekpk/4wOXUm0k0j1mAvmFHJCpnmpCCuJ3SG2RvwUOgE59qjD0CpCPnz/74dCv+4bDwY0NNpRRfQ==","signatures":[{"sig":"MEQCIH/qYHqdniOvlHYxn0WyamRJ2JvnkS68v00uCjJN3YlsAiAJg4SLITy5tBC3DXyLaV/GCEt62V6E3lEE/QCQVynEZA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33770},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"f6afacf076d6c6073be12e56d21d3ef2a29880ef","scripts":{"build":"vp pack src/index.ts --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-action-maintenance.git","type":"git"},"_npmVersion":"11.16.0","description":"Maintenance-mode action provider plugin for EmDash.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.6.0","devDependencies":{"emdash":"^0.19.0","publint":"^0.3.21","vite-plus":"^0.1.24","typescript":"^6.0.3","@arethetypeswrong/cli":"^0.18.3"},"peerDependencies":{"emdash":">=0.19.0"},"_npmOperationalInternal":{"tmp":"tmp/emdash-action-maintenance_0.1.0_1781535977587_0.3010296270602808","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bnomei/emdash-action-maintenance","version":"0.2.0","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","maintenance","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-action-maintenance@0.2.0","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-action-maintenance#readme","bugs":{"url":"https://github.com/bnomei/emdash-action-maintenance/issues"},"dist":{"shasum":"7f86a99c79d9da1729e0bd70021b473b468a51a3","tarball":"https://registry.npmjs.org/@bnomei/emdash-action-maintenance/-/emdash-action-maintenance-0.2.0.tgz","fileCount":5,"integrity":"sha512-m8N7eeD2lzgoD2lEm7pz+u5DHa6770sI8YJgP3kcxRAe+DBOdlnCk3l5k43WgV1lq2YGXftgcNXQWSTyum4zUQ==","signatures":[{"sig":"MEQCIB+bGs9h6isT8cDJtXbIc6KrkGXQdzqq/LBb6huEbQaXAiBEsPj/MLsU2l5IZG0hWu4zLCnrP2VjLyoHy20ez55blg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34911},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"89d90ea20d28731e6840f2b188080f151bb00fac","scripts":{"build":"vp pack src/index.ts --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-action-maintenance.git","type":"git"},"_npmVersion":"11.16.0","description":"Maintenance-mode action provider plugin for EmDash.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"emdash":"^0.19.0","publint":"^0.3.21","vite-plus":"^0.1.24","typescript":"^6.0.3","@arethetypeswrong/cli":"^0.18.3"},"peerDependencies":{"emdash":">=0.19.0"},"_npmOperationalInternal":{"tmp":"tmp/emdash-action-maintenance_0.2.0_1781606434889_0.509669067804573","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bnomei/emdash-action-maintenance","version":"0.3.0","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","maintenance","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-action-maintenance@0.3.0","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-action-maintenance#readme","bugs":{"url":"https://github.com/bnomei/emdash-action-maintenance/issues"},"dist":{"shasum":"e01e454223ac5b1b50cbd2b220c77ba7432695a7","tarball":"https://registry.npmjs.org/@bnomei/emdash-action-maintenance/-/emdash-action-maintenance-0.3.0.tgz","fileCount":7,"integrity":"sha512-9Zb/D4dnuauzMZZJ1wF3D4AFZSsJDedihyTcGdBB9MZxQzjMq58a1+qBZEConICc/XWKmHa21fH8et429lClDQ==","signatures":[{"sig":"MEQCIB/KKvSa2IXSBC3yv5bOcoCyUEwMkmSq96+zWAPsO1cAAiAibpKWRncNplrMUHTkeiH5oUQxtoIlEKv0MrcctYo7lA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76847},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"gitHead":"c4b218f9d6746924ebc15fbb15d22f8a8f11b9b3","scripts":{"test":"npm run build && node --test test/*.test.mjs","build":"vp pack src/index.ts --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm test && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-action-maintenance.git","type":"git"},"_npmVersion":"11.16.0","description":"Maintenance-mode action provider plugin for EmDash.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.4.2","devDependencies":{"emdash":"^0.19.0","publint":"^0.3.21","vite-plus":"^0.1.24","typescript":"^6.0.3","@arethetypeswrong/cli":"^0.18.3"},"peerDependencies":{"emdash":">=0.19.0"},"_npmOperationalInternal":{"tmp":"tmp/emdash-action-maintenance_0.3.0_1781797584410_0.8314581336370503","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bnomei/emdash-action-maintenance","version":"0.4.0","description":"Maintenance-mode action provider plugin for EmDash.","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","maintenance","serverless","typescript"],"homepage":"https://github.com/bnomei/emdash-action-maintenance#readme","bugs":{"url":"https://github.com/bnomei/emdash-action-maintenance/issues"},"license":"MIT","author":{"name":"Bruno Meilick","email":"b@bnomei.com","url":"https://bnomei.com"},"repository":{"type":"git","url":"git+https://github.com/bnomei/emdash-action-maintenance.git"},"type":"module","sideEffects":false,"main":"./dist/index.mjs","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"}},"publishConfig":{"access":"public"},"scripts":{"build":"vp pack src/index.ts --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","pack:check":"vp pack src/index.ts --format esm --dts --clean --tsconfig tsconfig.json --publint","prepack":"npm run build","prepublishOnly":"npm run check && npm run typecheck && npm test && npm run pack:check && npm run types:check","test":"npm run build && node --test test/*.test.mjs","typecheck":"tsc --noEmit","types:check":"attw --pack . --profile esm-only --no-summary"},"devDependencies":{"@arethetypeswrong/cli":"^0.18.3","emdash":"^0.19.0","publint":"^0.3.21","typescript":"^6.0.3","vite-plus":"^0.1.24"},"peerDependencies":{"emdash":">=0.19.0"},"engines":{"node":">=22.12.0"},"packageManager":"npm@11.4.2","gitHead":"4653ffa7518eb84674091634c2a4cdfcb1f5deec","_id":"@bnomei/emdash-action-maintenance@0.4.0","_nodeVersion":"26.3.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-qEcE7Qz4hNTB0Vv8tbxoadqgj5H8BFsNBXuT80iSSD00N15H6iiGyX1aH1fy91dS7o8FXfjIQizcso3seAtNpg==","shasum":"8621e8bd60ddaa455d0c4bd3735b55b696238076","tarball":"https://registry.npmjs.org/@bnomei/emdash-action-maintenance/-/emdash-action-maintenance-0.4.0.tgz","fileCount":7,"unpackedSize":90535,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC+q8pqUPpKDhh2f167lQkxKn7y9kNhqhrrACyVS322PgIgGPfoowoi8gTJ3jUuQGCiN7EVtVJynV1/nexgSbQgo0w="}]},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"directories":{},"maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/emdash-action-maintenance_0.4.0_1781814885763_0.7854059760088787"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-15T15:06:17.023Z","modified":"2026-06-18T20:34:46.031Z","0.1.0":"2026-06-15T15:06:17.734Z","0.2.0":"2026-06-16T10:40:35.101Z","0.3.0":"2026-06-18T15:46:24.568Z","0.4.0":"2026-06-18T20:34:45.915Z"},"bugs":{"url":"https://github.com/bnomei/emdash-action-maintenance/issues"},"author":{"name":"Bruno Meilick","email":"b@bnomei.com","url":"https://bnomei.com"},"license":"MIT","homepage":"https://github.com/bnomei/emdash-action-maintenance#readme","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","maintenance","serverless","typescript"],"repository":{"type":"git","url":"git+https://github.com/bnomei/emdash-action-maintenance.git"},"description":"Maintenance-mode action provider plugin for EmDash.","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"readme":"# @bnomei/emdash-action-maintenance\n\n[![npm version](https://img.shields.io/npm/v/@bnomei/emdash-action-maintenance.svg)](https://www.npmjs.com/package/@bnomei/emdash-action-maintenance)\n[![npm downloads](https://img.shields.io/npm/dm/@bnomei/emdash-action-maintenance.svg)](https://www.npmjs.com/package/@bnomei/emdash-action-maintenance)\n[![license](https://img.shields.io/npm/l/@bnomei/emdash-action-maintenance.svg)](https://www.npmjs.com/package/@bnomei/emdash-action-maintenance)\n[![types](https://img.shields.io/badge/types-included-blue.svg)](./package.json)\n[![source](https://img.shields.io/badge/source-GitHub-181717.svg?logo=github)](https://github.com/bnomei/emdash-action-maintenance)\n\nMaintenance mode for EmDash sites.\n\n`emdash-action-maintenance` stores a shared maintenance state, exposes admin routes for toggling it, and provides action descriptors that `@bnomei/emdash-actions` can render as dashboard buttons. It does not own your public routing by itself. Your Astro app opts in by adding the middleware helper from this package.\n\n## Install\n\n```sh\nnpm install @bnomei/emdash-action-maintenance\n```\n\nRegister the native plugin with EmDash. This goes in the Astro config file where your `emdash()` integration is configured:\n\n```ts\n// astro.config.mjs\nimport { defineConfig } from \"astro/config\";\nimport emdash from \"emdash/astro\";\nimport { actionMaintenance } from \"@bnomei/emdash-action-maintenance\";\n\nexport default defineConfig({\n  integrations: [\n    emdash({\n      plugins: [\n        actionMaintenance({\n          defaultMessage: \"This site is temporarily unavailable. Please check back soon.\",\n          defaultMessages: {\n            de: \"Diese Website ist vorubergehend nicht erreichbar.\",\n            fr: \"Ce site est temporairement indisponible.\",\n          },\n        }),\n      ],\n    }),\n  ],\n});\n```\n\n## Middleware\n\nAdd the helper to your Astro middleware file, usually `src/middleware.ts`, to make maintenance mode affect public visitors:\n\n```ts\n// src/middleware.ts\nimport { defineMiddleware } from \"astro:middleware\";\nimport { createMaintenanceMiddleware } from \"@bnomei/emdash-action-maintenance\";\n\nexport const onRequest = defineMiddleware(createMaintenanceMiddleware());\n```\n\nWhen maintenance mode is disabled, the helper calls `next()`. When it is enabled, the helper returns a `503` HTML response with `Cache-Control: no-store` and a `Retry-After` header.\n\nThe helper skips EmDash routes, Astro assets, and common metadata paths by default. Add a custom bypass in `src/middleware.ts` when your project has public routes that must stay online:\n\n```ts\n// src/middleware.ts\nexport const onRequest = defineMiddleware(\n  createMaintenanceMiddleware({\n    bypass: (_context, url) =>\n      url.pathname.startsWith(\"/api/webhooks/\") || url.pathname === \"/health\",\n  }),\n);\n```\n\n## Custom Template\n\nIf you want a custom maintenance page, first ask the helper to rewrite to it from `src/middleware.ts`:\n\n```ts\n// src/middleware.ts\nimport { defineMiddleware } from \"astro:middleware\";\nimport { createMaintenanceMiddleware } from \"@bnomei/emdash-action-maintenance\";\n\nexport const onRequest = defineMiddleware(\n  createMaintenanceMiddleware({\n    template: \"/maintenance\",\n  }),\n);\n```\n\nThen add the Astro page at `src/pages/maintenance.astro`:\n\n```astro\n---\nimport { DEFAULT_MESSAGE } from \"@bnomei/emdash-action-maintenance\";\n\nAstro.response.status = 503;\nAstro.response.headers.set(\"Cache-Control\", \"no-store\");\nAstro.response.headers.set(\"Retry-After\", \"300\");\n\nconst state = Astro.locals.maintenance;\nconst message = state?.message ?? DEFAULT_MESSAGE;\nconst lang = state?.messageLocale ?? state?.locale ?? \"en\";\n---\n\n<!doctype html>\n<html lang={lang}>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Maintenance</title>\n  </head>\n  <body>\n    <main>\n      <h1>Maintenance</h1>\n      <p>{message}</p>\n    </main>\n  </body>\n</html>\n```\n\nThe helper stores the public state on `Astro.locals.maintenance` before rewriting. For TypeScript projects, add this to `src/env.d.ts`:\n\n```ts\n// src/env.d.ts\ndeclare namespace App {\n  interface Locals {\n    maintenance?: import(\"@bnomei/emdash-action-maintenance\").PublicMaintenanceState;\n  }\n}\n```\n\nFor complete control, return your own response from `src/middleware.ts` instead of using a template:\n\n```ts\n// src/middleware.ts\nexport const onRequest = defineMiddleware(\n  createMaintenanceMiddleware({\n    render: (state) =>\n      new Response(`Maintenance: ${state.message}`, {\n        status: 503,\n        headers: {\n          \"Cache-Control\": \"no-store\",\n          \"Content-Type\": \"text/plain; charset=utf-8\",\n          \"Retry-After\": \"300\",\n        },\n      }),\n  }),\n);\n```\n\n## Dashboard Buttons\n\nUse this package with `@bnomei/emdash-actions` when you want maintenance controls in the EmDash dashboard:\n\n```sh\nnpm install @bnomei/emdash-actions @bnomei/emdash-action-maintenance\n```\n\n```ts\n// astro.config.mjs\nimport { defineConfig } from \"astro/config\";\nimport emdash from \"emdash/astro\";\nimport { actionsPlugin } from \"@bnomei/emdash-actions\";\nimport {\n  PLUGIN_ID as MAINTENANCE_PLUGIN_ID,\n  actionMaintenance,\n} from \"@bnomei/emdash-action-maintenance\";\n\nexport default defineConfig({\n  integrations: [\n    emdash({\n      plugins: [\n        actionsPlugin({\n          providers: [\n            {\n              pluginId: MAINTENANCE_PLUGIN_ID,\n              label: \"Maintenance\",\n            },\n          ],\n        }),\n        actionMaintenance(),\n      ],\n    }),\n  ],\n});\n```\n\nThe provider exposes a single state-aware dashboard toggle action. The dashboard button label is read from the persisted maintenance state and updates after each successful toggle. Direct `enable` and `disable` routes remain available for custom clients, but the action manifest uses one `maintenance.toggle` button.\n\n## Persistence\n\nThe plugin stores one state record in EmDash plugin KV. This is the persisted state shape, not a file you create manually:\n\n```ts\ntype MaintenanceState = {\n  enabled: boolean;\n  message: string;\n  messages: Record<string, string>;\n  updatedAt: string | null;\n};\n```\n\nKey details:\n\n- `enabled` controls whether the middleware blocks public requests.\n- `message` is the fallback public message.\n- `messages` stores locale-specific messages keyed by locale code.\n- `updatedAt` records when an admin action last changed the state.\n\nThe state is not kept in process memory. Admin actions write to plugin KV, and the middleware reads the public state route for each request. In a scaled Cloudflare/serverless deployment, every instance uses the same EmDash plugin KV backend instead of a local variable. Propagation and consistency follow the configured KV/storage backend; this plugin does not add an extra in-memory cache.\n\nIf no state has been saved yet, maintenance mode is disabled and the configured default message is used as the fallback.\n\n## Routes\n\nThe plugin exposes these routes under `/_emdash/api/plugins/action-maintenance/`:\n\n| Route                 | Auth   | Purpose                                                              |\n| --------------------- | ------ | -------------------------------------------------------------------- |\n| `status`              | Admin  | Read the full maintenance state and locale config.                   |\n| `summary`             | Admin  | Alias for `status`, useful for generic action dashboards.            |\n| `enable`              | Admin  | Enable maintenance mode. Accepts `POST` only.                        |\n| `disable`             | Admin  | Disable maintenance mode. Accepts `POST` only.                       |\n| `toggle`              | Admin  | Toggle maintenance mode, optionally with a new message. `POST` only. |\n| `public-state`        | Public | Read the public state from SSR middleware. Accepts `?locale=fr`.     |\n| `.well-known/actions` | Admin  | Return the state-aware dashboard toggle action descriptor.           |\n\nAction payloads may include `message`, `messages`, and for `toggle`, `enabled`. These payloads are request bodies sent to the plugin routes by dashboard buttons or custom clients:\n\n```ts\n// POST /_emdash/api/plugins/action-maintenance/toggle\n{\n  enabled: true,\n  message: \"This site is temporarily unavailable. Please check back soon.\",\n  messages: {\n    de: \"Diese Website ist vorubergehend nicht erreichbar.\",\n  },\n}\n```\n\nThe toggle route returns the persisted state plus the stable action patch consumed by `@bnomei/emdash-actions`. When maintenance mode is disabled, the manifest returns `Enable maintenance mode`; after a successful enable, the response patches the same button to `Disable maintenance mode`. The next successful toggle patches it back.\n\n```ts\n// Response body from POST /_emdash/api/plugins/action-maintenance/toggle\n{\n  ok: true,\n  message: \"Maintenance mode enabled.\",\n  action: {\n    label: \"Disable maintenance mode\",\n    icon: \"warning\",\n    tone: \"danger\",\n    confirm: \"Bring the public site back online?\",\n  },\n}\n```\n\nMessages are bounded before storage to keep the routes suitable for Cloudflare/serverless plugin KV.\n\n## Options\n\nThese options go into the `actionMaintenance()` call in `astro.config.mjs`:\n\n```ts\n// astro.config.mjs\nactionMaintenance({\n  defaultMessage: \"This site is temporarily unavailable. Please check back soon.\",\n  defaultMessages: {\n    de: \"Diese Website ist vorubergehend nicht erreichbar.\",\n  },\n  defaultLocale: \"en\",\n  locales: [\"en\", \"de\"],\n});\n```\n\nAvailable plugin options:\n\n- `defaultMessage`: Fallback message used before a custom state is saved.\n- `defaultMessages`: Locale-specific default messages.\n- `defaultLocale`: Locale used when no request locale is available.\n- `locales`: Supported locale list exposed by the status route.\n- `entrypoint`: Native plugin entrypoint. Defaults to `@bnomei/emdash-action-maintenance`.\n\nThe public state route only honors request locales from `ctx.input.locale` or\n`?locale=` when they match a configured locale, an available message locale, or\nan EmDash i18n fallback locale. Unknown, invalid, blank, or missing request\nlocales are ignored, so the returned message falls back to `defaultLocale`\nconsistently for both input sources.\n\nAvailable middleware options:\n\n- `template`: Astro route to rewrite to when maintenance is enabled.\n- `render`: Custom response function. Takes priority over `template`.\n- `response`: Options for the built-in HTML response.\n- `locale`: Locale override. Defaults to `context.currentLocale`.\n- `bypass`: Additional route bypass function.\n\n## Development\n\n```sh\nnpm install\nnpm run typecheck\nnpm run build\nnpm run pack:check\n```\n","readmeFilename":"README.md"}