Skip to content

docs: update audit log archival to document windowed, manifest-based archival with tuning fields - #5234

Merged
Pratham-Mishra04 merged 1 commit into
devfrom
07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage_docs
Jul 17, 2026
Merged

docs: update audit log archival to document windowed, manifest-based archival with tuning fields#5234
Pratham-Mishra04 merged 1 commit into
devfrom
07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage_docs

Conversation

@impoiler

@impoiler impoiler commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Updates the audit log archival documentation to reflect a redesigned background-job-based archival system, replacing the previous per-flush, best-effort write model with a windowed, manifest-committed approach that provides stronger delivery guarantees.

Changes

  • Clarified that archival is now a periodic background job operating on fixed time windows rather than a synchronous per-flush upload, and updated all descriptions accordingly.
  • Documented three new configuration fields: archive_interval, archive_grace_period, and archive_max_object_bytes, including their defaults, validation behavior, and silent fallback-to-default on invalid values.
  • Updated the object key schema from per-batch UUIDs under an hourly prefix to a windowed {start}-{end}/part-NNNNN.jsonl[.gz] layout with a manifest.json commit record.
  • Added a full explanation of the archival lifecycle: window eligibility via grace period, job deduplication across multi-node clusters, part rolling by size, and manifest-as-commit-point semantics.
  • Added a manifest JSON example and guidance that consumers must read windows through their manifests to avoid orphaned parts from retried runs.
  • Replaced the "best-effort" warning with a delivery guarantees table covering at-least-once, contiguous, and first-complete-write-wins semantics.
  • Added a warning that retention_days and archival are independent loops, with explicit guidance that retention_days: 1 races the archiver under default settings.
  • Documented catch-up behavior after outages, watermark persistence across restarts, and graceful shutdown behavior.
  • Added a tuning section covering the memory implications of archive_max_object_bytes and when to adjust archive_grace_period.
  • Added archive_interval, archive_grace_period, and archive_max_object_bytes to both the S3 and GCS configuration examples.

Type of change

  • Bug fix
  • Feature
  • Refactor
  • Documentation
  • Chore/CI

Affected areas

  • Core (Go)
  • Transports (HTTP)
  • Providers/Integrations
  • Plugins
  • UI (React)
  • Docs

How to test

Review the rendered documentation for accuracy against the archival implementation. Confirm:

  • The object key examples match what the archiver actually writes.
  • The manifest JSON schema matches the struct the archiver serializes.
  • Default values for archive_interval (24h), archive_grace_period (15m), and archive_max_object_bytes (134217728) match the implementation.
  • The retention_days: 2 minimum safe value holds given the default window and grace period.

Breaking changes

  • Yes
  • No

The object key layout has changed from {prefix}/audit-logs/{YYYY}/{MM}/{DD}/{HH}/{batchID}.jsonl.gz to {prefix}/audit-logs/{YYYY}/{MM}/{DD}/{start}-{end}/part-NNNNN.jsonl[.gz]. Any existing tooling, lifecycle rules, or SIEM ingestion pipelines keyed on the old path structure will need to be updated. Objects written under the old scheme are not affected retroactively, but new archives will not appear at the old paths.

Related issues

N/A

Security considerations

No new secrets or PII handling introduced. The archive_grace_period and watermark persistence are relevant to compliance posture — operators should confirm retention_days is set high enough to avoid rows being deleted before they are archived.

Checklist

  • I read docs/contributing/README.md and followed the guidelines
  • I added/updated tests where appropriate
  • I updated documentation where needed
  • I verified builds succeed (Go and UI)
  • I verified the CI pipeline passes locally if applicable

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 21 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 1f28ed3a-6053-446b-8e2f-ba153f1e4821

📥 Commits

Reviewing files that changed from the base of the PR and between 0b79936 and 5895115.

📒 Files selected for processing (1)
  • docs/enterprise/audit-logs.mdx
📝 Walkthrough

Walkthrough

Updates Audit Logs documentation for periodic, windowed object-storage mirroring with new tuning fields, manifest-based progress, retry behavior, and restart or shutdown handling.

Changes

Audit log object-storage archival

Layer / File(s) Summary
Archival configuration and examples
docs/enterprise/audit-logs.mdx
Documents archive_interval, archive_grace_period, and archive_max_object_bytes, runtime normalization, and updated S3/GCS examples.
Windowed archival workflow
docs/enterprise/audit-logs.mdx
Describes independent database and bucket copies, eligible time windows, JSONL part splitting, manifest commits, retries, no skipped windows, and no backfill.
Recovery and shutdown behavior
docs/enterprise/audit-logs.mdx
Documents persisted watermark resume, paced catch-up, and completion of in-flight windows during shutdown.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested reviewers: akshaydeo

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title is concise and accurately summarizes the main documentation change.
Description check ✅ Passed The PR description follows the template closely and includes the required sections with useful details.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage_docs

Comment @coderabbitai help to get the list of available commands.

impoiler commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

@impoiler impoiler self-assigned this Jul 15, 2026
@impoiler impoiler changed the title feat: allow time interval and size flexibility in audit logs in object storage docs docs: update audit log archival to document windowed, manifest-based archival with tuning fields Jul 15, 2026
@greptile-apps

greptile-apps Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Confidence Score: 4/5

The configuration guidance should be corrected before merging.

  • Schema-invalid archival values can stop gateway startup instead of falling back.
  • The rest of the latest documentation update does not show another blocking issue.

docs/enterprise/audit-logs.mdx

Important Files Changed

Filename Overview
docs/enterprise/audit-logs.mdx Documents the redesigned archival system, but still misstates how schema-invalid settings behave during startup.

Reviews (4): Last reviewed commit: "feat: allow time interval and size flexi..." | Re-trigger Greptile

Comment thread docs/enterprise/audit-logs.mdx Outdated
@impoiler
impoiler force-pushed the 07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage_docs branch from 7bb37d8 to 0b79936 Compare July 15, 2026 09:37
@coderabbitai
coderabbitai Bot requested a review from akshaydeo July 15, 2026 09:38

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/enterprise/audit-logs.mdx`:
- Line 115: Update the archive lag wording in the “When populated” table entry
from “at least archive_interval + archive_grace_period” to “up to
archive_interval + archive_grace_period,” preserving the existing conditions and
explanation.
- Around line 163-176: Correct the manifest example around the parts array so
the reported bytes for part-00000 align with the documented
archive_max_object_bytes rolling rule. Adjust the example’s byte value or the
stated rolling explanation consistently, while preserving the example’s event
counts and overall manifest structure.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 2026354c-1aae-40d2-bf33-d467b220a4d4

📥 Commits

Reviewing files that changed from the base of the PR and between 78dadcf and 0b79936.

📒 Files selected for processing (1)
  • docs/enterprise/audit-logs.mdx

Comment thread docs/enterprise/audit-logs.mdx
Comment thread docs/enterprise/audit-logs.mdx
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 15, 2026
@impoiler
impoiler force-pushed the 07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage branch from 78dadcf to c0ea503 Compare July 16, 2026 06:08
@impoiler
impoiler force-pushed the 07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage_docs branch from 0b79936 to b7f51ef Compare July 16, 2026 06:08
@impoiler
impoiler force-pushed the 07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage_docs branch from b7f51ef to e11b090 Compare July 16, 2026 06:09
@impoiler
impoiler force-pushed the 07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage branch from c0ea503 to a6e8d94 Compare July 16, 2026 06:09

Pratham-Mishra04 commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

Merge activity

  • Jul 17, 11:05 AM UTC: A user started a stack merge that includes this pull request via Graphite.
  • Jul 17, 11:44 AM UTC: Graphite rebased this pull request as part of a merge.
  • Jul 17, 11:45 AM UTC: @Pratham-Mishra04 merged this pull request with Graphite.

@Pratham-Mishra04
Pratham-Mishra04 changed the base branch from 07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage to graphite-base/5234 July 17, 2026 11:40
@Pratham-Mishra04
Pratham-Mishra04 changed the base branch from graphite-base/5234 to dev July 17, 2026 11:43
@Pratham-Mishra04
Pratham-Mishra04 dismissed coderabbitai[bot]’s stale review July 17, 2026 11:43

The base branch was changed.

@Pratham-Mishra04
Pratham-Mishra04 requested a review from a team as a code owner July 17, 2026 11:43
@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage_docs branch from e11b090 to 5895115 Compare July 17, 2026 11:43
<Note>
The three `archive_*` fields only take effect when `object_storage` is configured.

`config.schema.json` constrains these fields, so an editor wired to it (via `$schema`) will flag a malformed duration like `"6 hours"` or an out-of-range `archive_max_object_bytes` as you type. The gateway itself does **not** reject such values at startup: each field is normalized independently at runtime, so a value that gets past the schema **falls back to its default or is clamped into range rather than failing startup**. A typo like `"6 hours"` silently yields the 24h default, and `archive_interval: "10s"` is quietly raised to the 5m floor.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Schema errors still fail startup — The gateway validates the configuration against transports/config.schema.json while loading it. A malformed duration such as "6 hours" or an object size outside 1 MiB–4 GiB therefore fails validation before runtime normalization runs. Only schema-valid values, such as archive_interval: "10s", can reach the clamping behavior described here. As written, operators can expect a silent fallback but instead see the gateway fail to start.

Suggested change
`config.schema.json` constrains these fields, so an editor wired to it (via `$schema`) will flag a malformed duration like `"6 hours"` or an out-of-range `archive_max_object_bytes` as you type. The gateway itself does **not** reject such values at startup: each field is normalized independently at runtime, so a value that gets past the schema **falls back to its default or is clamped into range rather than failing startup**. A typo like `"6 hours"` silently yields the 24h default, and `archive_interval: "10s"` is quietly raised to the 5m floor.
`config.schema.json` constrains these fields, and the gateway validates configuration against it at startup. A malformed duration like `"6 hours"` or an out-of-range `archive_max_object_bytes` therefore fails startup validation. Values that pass schema validation are then normalized at runtime; for example, `archive_interval: "10s"` is quietly raised to the 5m floor.

@Pratham-Mishra04
Pratham-Mishra04 merged commit f7f27df into dev Jul 17, 2026
15 of 16 checks passed
@Pratham-Mishra04
Pratham-Mishra04 deleted the 07-15-feat_allow_time_interval_and_size_flexibility_in_audit_logs_in_object_storage_docs branch July 17, 2026 11:45
akshaydeo pushed a commit that referenced this pull request Jul 17, 2026
…archival with tuning fields (#5234)

## Summary

Updates the audit log archival documentation to reflect a redesigned background-job-based archival system, replacing the previous per-flush, best-effort write model with a windowed, manifest-committed approach that provides stronger delivery guarantees.

## Changes

- Clarified that archival is now a **periodic background job** operating on fixed time windows rather than a synchronous per-flush upload, and updated all descriptions accordingly.
- Documented three new configuration fields: `archive_interval`, `archive_grace_period`, and `archive_max_object_bytes`, including their defaults, validation behavior, and silent fallback-to-default on invalid values.
- Updated the object key schema from per-batch UUIDs under an hourly prefix to a windowed `{start}-{end}/part-NNNNN.jsonl[.gz]` layout with a `manifest.json` commit record.
- Added a full explanation of the archival lifecycle: window eligibility via grace period, job deduplication across multi-node clusters, part rolling by size, and manifest-as-commit-point semantics.
- Added a manifest JSON example and guidance that consumers must read windows through their manifests to avoid orphaned parts from retried runs.
- Replaced the "best-effort" warning with a delivery guarantees table covering at-least-once, contiguous, and first-complete-write-wins semantics.
- Added a warning that `retention_days` and archival are independent loops, with explicit guidance that `retention_days: 1` races the archiver under default settings.
- Documented catch-up behavior after outages, watermark persistence across restarts, and graceful shutdown behavior.
- Added a tuning section covering the memory implications of `archive_max_object_bytes` and when to adjust `archive_grace_period`.
- Added `archive_interval`, `archive_grace_period`, and `archive_max_object_bytes` to both the S3 and GCS configuration examples.

## Type of change

- [ ] Bug fix
- [ ] Feature
- [ ] Refactor
- [x] Documentation
- [ ] Chore/CI

## Affected areas

- [ ] Core (Go)
- [ ] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [ ] UI (React)
- [x] Docs

## How to test

Review the rendered documentation for accuracy against the archival implementation. Confirm:

- The object key examples match what the archiver actually writes.
- The manifest JSON schema matches the struct the archiver serializes.
- Default values for `archive_interval` (`24h`), `archive_grace_period` (`15m`), and `archive_max_object_bytes` (`134217728`) match the implementation.
- The `retention_days: 2` minimum safe value holds given the default window and grace period.

## Breaking changes

- [x] Yes
- [ ] No

The object key layout has changed from `{prefix}/audit-logs/{YYYY}/{MM}/{DD}/{HH}/{batchID}.jsonl.gz` to `{prefix}/audit-logs/{YYYY}/{MM}/{DD}/{start}-{end}/part-NNNNN.jsonl[.gz]`. Any existing tooling, lifecycle rules, or SIEM ingestion pipelines keyed on the old path structure will need to be updated. Objects written under the old scheme are not affected retroactively, but new archives will not appear at the old paths.

## Related issues

N/A

## Security considerations

No new secrets or PII handling introduced. The `archive_grace_period` and watermark persistence are relevant to compliance posture — operators should confirm `retention_days` is set high enough to avoid rows being deleted before they are archived.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [ ] I added/updated tests where appropriate
- [x] I updated documentation where needed
- [ ] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
akshaydeo pushed a commit that referenced this pull request Jul 18, 2026
…archival with tuning fields (#5234)

## Summary

Updates the audit log archival documentation to reflect a redesigned background-job-based archival system, replacing the previous per-flush, best-effort write model with a windowed, manifest-committed approach that provides stronger delivery guarantees.

## Changes

- Clarified that archival is now a **periodic background job** operating on fixed time windows rather than a synchronous per-flush upload, and updated all descriptions accordingly.
- Documented three new configuration fields: `archive_interval`, `archive_grace_period`, and `archive_max_object_bytes`, including their defaults, validation behavior, and silent fallback-to-default on invalid values.
- Updated the object key schema from per-batch UUIDs under an hourly prefix to a windowed `{start}-{end}/part-NNNNN.jsonl[.gz]` layout with a `manifest.json` commit record.
- Added a full explanation of the archival lifecycle: window eligibility via grace period, job deduplication across multi-node clusters, part rolling by size, and manifest-as-commit-point semantics.
- Added a manifest JSON example and guidance that consumers must read windows through their manifests to avoid orphaned parts from retried runs.
- Replaced the "best-effort" warning with a delivery guarantees table covering at-least-once, contiguous, and first-complete-write-wins semantics.
- Added a warning that `retention_days` and archival are independent loops, with explicit guidance that `retention_days: 1` races the archiver under default settings.
- Documented catch-up behavior after outages, watermark persistence across restarts, and graceful shutdown behavior.
- Added a tuning section covering the memory implications of `archive_max_object_bytes` and when to adjust `archive_grace_period`.
- Added `archive_interval`, `archive_grace_period`, and `archive_max_object_bytes` to both the S3 and GCS configuration examples.

## Type of change

- [ ] Bug fix
- [ ] Feature
- [ ] Refactor
- [x] Documentation
- [ ] Chore/CI

## Affected areas

- [ ] Core (Go)
- [ ] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [ ] UI (React)
- [x] Docs

## How to test

Review the rendered documentation for accuracy against the archival implementation. Confirm:

- The object key examples match what the archiver actually writes.
- The manifest JSON schema matches the struct the archiver serializes.
- Default values for `archive_interval` (`24h`), `archive_grace_period` (`15m`), and `archive_max_object_bytes` (`134217728`) match the implementation.
- The `retention_days: 2` minimum safe value holds given the default window and grace period.

## Breaking changes

- [x] Yes
- [ ] No

The object key layout has changed from `{prefix}/audit-logs/{YYYY}/{MM}/{DD}/{HH}/{batchID}.jsonl.gz` to `{prefix}/audit-logs/{YYYY}/{MM}/{DD}/{start}-{end}/part-NNNNN.jsonl[.gz]`. Any existing tooling, lifecycle rules, or SIEM ingestion pipelines keyed on the old path structure will need to be updated. Objects written under the old scheme are not affected retroactively, but new archives will not appear at the old paths.

## Related issues

N/A

## Security considerations

No new secrets or PII handling introduced. The `archive_grace_period` and watermark persistence are relevant to compliance posture — operators should confirm `retention_days` is set high enough to avoid rows being deleted before they are archived.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [ ] I added/updated tests where appropriate
- [x] I updated documentation where needed
- [ ] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
akhsaul pushed a commit to akhsaul/bifrost that referenced this pull request Aug 27, 2026
…archival with tuning fields (maximhq#5234)

## Summary

Updates the audit log archival documentation to reflect a redesigned background-job-based archival system, replacing the previous per-flush, best-effort write model with a windowed, manifest-committed approach that provides stronger delivery guarantees.

## Changes

- Clarified that archival is now a **periodic background job** operating on fixed time windows rather than a synchronous per-flush upload, and updated all descriptions accordingly.
- Documented three new configuration fields: `archive_interval`, `archive_grace_period`, and `archive_max_object_bytes`, including their defaults, validation behavior, and silent fallback-to-default on invalid values.
- Updated the object key schema from per-batch UUIDs under an hourly prefix to a windowed `{start}-{end}/part-NNNNN.jsonl[.gz]` layout with a `manifest.json` commit record.
- Added a full explanation of the archival lifecycle: window eligibility via grace period, job deduplication across multi-node clusters, part rolling by size, and manifest-as-commit-point semantics.
- Added a manifest JSON example and guidance that consumers must read windows through their manifests to avoid orphaned parts from retried runs.
- Replaced the "best-effort" warning with a delivery guarantees table covering at-least-once, contiguous, and first-complete-write-wins semantics.
- Added a warning that `retention_days` and archival are independent loops, with explicit guidance that `retention_days: 1` races the archiver under default settings.
- Documented catch-up behavior after outages, watermark persistence across restarts, and graceful shutdown behavior.
- Added a tuning section covering the memory implications of `archive_max_object_bytes` and when to adjust `archive_grace_period`.
- Added `archive_interval`, `archive_grace_period`, and `archive_max_object_bytes` to both the S3 and GCS configuration examples.

## Type of change

- [ ] Bug fix
- [ ] Feature
- [ ] Refactor
- [x] Documentation
- [ ] Chore/CI

## Affected areas

- [ ] Core (Go)
- [ ] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [ ] UI (React)
- [x] Docs

## How to test

Review the rendered documentation for accuracy against the archival implementation. Confirm:

- The object key examples match what the archiver actually writes.
- The manifest JSON schema matches the struct the archiver serializes.
- Default values for `archive_interval` (`24h`), `archive_grace_period` (`15m`), and `archive_max_object_bytes` (`134217728`) match the implementation.
- The `retention_days: 2` minimum safe value holds given the default window and grace period.

## Breaking changes

- [x] Yes
- [ ] No

The object key layout has changed from `{prefix}/audit-logs/{YYYY}/{MM}/{DD}/{HH}/{batchID}.jsonl.gz` to `{prefix}/audit-logs/{YYYY}/{MM}/{DD}/{start}-{end}/part-NNNNN.jsonl[.gz]`. Any existing tooling, lifecycle rules, or SIEM ingestion pipelines keyed on the old path structure will need to be updated. Objects written under the old scheme are not affected retroactively, but new archives will not appear at the old paths.

## Related issues

N/A

## Security considerations

No new secrets or PII handling introduced. The `archive_grace_period` and watermark persistence are relevant to compliance posture — operators should confirm `retention_days` is set high enough to avoid rows being deleted before they are archived.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [ ] I added/updated tests where appropriate
- [x] I updated documentation where needed
- [ ] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants