hurui200320
2434253c1a
feat(cli): implement full output rendering framework (#812)
## Summary
Implement the 6 missing element handle types (Tree, Text, Code, Diff, Separator, ActionHint) and ensure all 6 materialization strategies (rich, color, table, plain, json, yaml) support all 10 element types. This completes the output rendering framework per the specification (§25417-27276).
Closes #550
## Changes
### Source (restructured into smaller modules)
#### `handles/` package (was `handles.py` — 1062 lines → 5 files, all ≤500 lines)
- **`_models.py`**: All Pydantic data models, constants (MAX_TREE_DEPTH, MAX_ELEMENTS_PER_SESSION, MAX_TABLE_ROWS), exceptions (ElementClosedError), event classes, ElementSnapshot union. P2-1: `DiffLine.type` renamed to `line_type` with backward-compatible alias.
- **`_base.py`**: Generic `ElementHandle[E]` base class with thread-safe `element_copy()` (lock-protected).
- **`_panel_table.py`**: PanelHandle, TableHandle, StatusHandle.
- **`_concrete.py`**: ProgressHandle (P1-1: validates `total` non-negative), TreeHandle, TextHandle (P3-2: close() delegates to super()), CodeHandle, DiffHandle, SeparatorHandle, ActionHintHandle. P3-8: `increment(delta=0)` now rejected.
- **`__init__.py`**: Re-exports all public symbols.
#### `_renderers.py` — plain renderers, sanitization, and shared helpers
- Plain render functions for all 10 element types.
- Terminal escape sanitization (`strip_terminal_escapes`).
- P2-3: `_sort_table_rows` now consults `ColumnDef.col_type` for numeric sorting.
- P2-6: `compute_column_widths()` shared helper extracted (DRY fix).
#### `_color_renderers.py` — ANSI colour renderers
- Colour-coded render functions for all 10 element types.
- P2-2: TextBlock now gets color treatment (`_render_text_color`) instead of falling through to plain.
#### `_boxdraw.py` — box-drawing renderers
- P2-5: Upgraded from ASCII `+-|` to Unicode box-drawing `╭─╮│╰╯` with rounded corners per spec §26821.
#### `_ids.py` — ID generation helpers
- P3-1: Session and handle IDs now use separate counters, making IDs monotonic within their namespace.
#### `materializers.py` — strategy protocol and 6 concrete strategies
- P1-2: `_snapshot_to_dict` now includes `timing` field in JSON/YAML output per spec §27022.
- P2-4: `_column_def_to_dict` always includes all fields unconditionally for stable JSON schemas.
#### `selection.py` — materializer selection with fallback
- P1-4: `NO_COLOR` environment variable now respected (https://no-color.org/). When set, all visual formats fall back to plain. Precedence: explicit flag > NO_COLOR > terminal capability fallback.
#### `session.py`
- P1-1: `session.progress()` factory validates `total >= 0`.
- P1-2: `snapshot()` includes `timing` when available.
#### `__init__.py` — package docstring
- P1-3: SD-29 corrected to reflect actual Table → Color → Plain fallback chain.
- SD-14 marked as implemented (NO_COLOR support added).
### Spec Deviations (Documented)
28 deliberate deviations documented in `__init__.py` module docstring (SD-1 through SD-29, with SD-14 now implemented). SD-29 corrected.
### Tests (updated)
- **+23 new BDD scenarios** covering: P1-1 total validation, P1-4 NO_COLOR, P2-1 DiffLine.line_type alias, P2-2 text color, P2-3 numeric sorting, P2-4 ColumnDef serialization, P2-5 Unicode box-drawing, P3-3 add_rows limit, P3-5 10-thread stress test, P3-6 summary truncation, P3-7 explicit format for color/table, P3-8 zero delta.
- **Robot tests**: Updated box-drawing assertion for Unicode chars.
## Verification
| Check | Result |
|-------|--------|
| Pyright | 0 errors, 1 pre-existing warning |
| Ruff lint | All passed |
| Unit tests | 393 features, 11,344 scenarios, 0 failures |
| Integration tests | All passed |
| E2E tests | All passed |
| Coverage | 97% overall (threshold: 97%) |
## Review Fixes Applied (Luis Review #2412)
| ID | Severity | Fix |
|----|----------|-----|
| P1-1 | High | `set_progress()` and `session.progress()` validate `total >= 0` |
| P1-2 | High | `_snapshot_to_dict` includes `timing` field |
| P1-3 | High | SD-29 documentation corrected |
| P1-4 | High | `NO_COLOR` env var respected |
| P2-1 | Medium | `DiffLine.type` → `line_type` with alias |
| P2-2 | Medium | TextBlock gets color treatment |
| P2-3 | Medium | Numeric column sorting |
| P2-4 | Medium | ColumnDef always serializes all fields |
| P2-5 | Medium | Unicode box-drawing characters |
| P2-6 | Medium | Shared `compute_column_widths()` helper |
| P3-1 | Low | Separate ID counters |
| P3-2 | Low | TextHandle.close() delegates to super() |
| P3-3 | Low | add_rows batch limit test |
| P3-5 | Low | 10-thread stress test |
| P3-6 | Low | Summary truncation test |
| P3-7 | Low | Explicit format tests for color/table |
| P3-8 | Low | Zero delta rejected |
### Deferred Items
| ID | Reason |
|----|--------|
| P3-9 | snapshot() lock scope — acceptable correctness trade-off |
| P3-10 | CLEVERAGENTS_FORMAT env var — documented as SD-15, requires CLI framework changes |
Reviewed-on: cleveragents/cleveragents-core#812
Reviewed-by: Jeffrey Phillips Freeman <jeffrey.freeman@cleverthis.com>
Co-authored-by: Rui Hu <rui.hu@cleverthis.com>
Co-committed-by: Rui Hu <rui.hu@cleverthis.com>
2026-03-19 08:46:46 +00:00
..
2025-12-10 14:42:09 -05:00
2026-03-10 03:39:32 +00:00
2026-03-13 18:21:50 +00:00
2026-03-12 14:38:57 +00:00
2026-03-18 17:33:30 +00:00
2026-03-12 14:38:57 +00:00
2026-03-12 14:38:57 +00:00
2026-03-12 14:38:57 +00:00
2026-03-09 13:01:58 -04:00
2026-03-03 03:29:31 +00:00
2026-03-10 15:09:03 +00:00
2026-03-05 15:13:19 +00:00
2026-03-05 10:27:36 -05:00
2026-03-07 14:53:18 +00:00
2026-03-05 01:28:50 +00:00
2026-03-09 13:01:58 -04:00
2026-03-12 20:42:14 +00:00
2026-02-14 12:16:39 -05:00
2026-03-15 19:33:11 -04:00
2026-02-14 12:16:39 -05:00
2026-02-22 00:43:08 -05:00
2026-02-13 09:41:28 -05:00
2026-02-13 09:41:28 -05:00
2026-03-02 02:01:27 +00:00
2026-02-20 15:57:21 +00:00
2026-02-13 09:41:28 -05:00
2026-02-13 19:01:55 +05:30
2026-03-17 09:53:57 +00:00
2026-03-09 13:01:58 -04:00
2026-02-10 16:04:17 +00:00
2026-02-12 05:44:57 +00:00
2026-02-24 19:12:01 +00:00
2026-02-24 17:57:18 +00:00
2026-02-24 17:57:18 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-02-12 22:01:51 +00:00
2026-02-16 14:21:06 -05:00
2026-02-18 12:18:37 +00:00
2026-02-25 10:30:42 +00:00
2026-03-10 23:11:22 +00:00
2026-02-20 20:24:10 +00:00
2026-02-20 08:48:33 -05:00
2026-02-12 22:01:51 +00:00
2026-02-20 08:48:33 -05:00
2026-02-20 08:48:33 -05:00
2026-03-09 13:01:58 -04:00
2026-02-22 08:31:45 +00:00
2026-03-18 06:58:39 +00:00
2026-03-09 13:01:58 -04:00
2025-12-19 12:35:56 -05:00
2026-02-13 05:01:27 +00:00
2026-02-02 18:46:33 -05:00
2026-02-26 09:10:35 +00:00
2026-01-27 21:55:06 -05:00
2025-11-24 20:04:18 -05:00
2025-11-28 23:52:23 -05:00
2025-11-11 20:09:06 -05:00
2025-12-08 23:02:29 -05:00
2026-03-19 06:53:06 +00:00
2026-03-09 13:01:58 -04:00
2026-02-25 10:01:57 +00:00
2026-02-25 10:05:57 +00:00
2026-03-04 23:47:20 +00:00
2026-03-09 13:01:58 -04:00
2026-03-12 23:32:48 +00:00
2026-03-12 23:32:48 +00:00
2026-02-13 21:54:31 +00:00
2025-12-22 11:18:57 -05:00
2026-02-27 09:47:10 -05:00
2026-02-20 15:57:21 +00:00
2026-03-17 09:53:53 +00:00
2026-03-17 09:53:53 +00:00
2026-03-17 09:53:53 +00:00
2026-02-18 03:27:00 +00:00
2026-02-20 15:57:21 +00:00
2026-03-02 17:44:18 +00:00
2026-02-22 10:19:43 +00:00
2026-03-09 13:01:58 -04:00
2026-03-10 14:18:04 -04:00
2026-02-18 03:27:00 +00:00
2026-02-18 03:27:00 +00:00
2026-03-09 13:01:58 -04:00
2026-02-27 13:47:42 -05:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-02-21 16:27:40 +00:00
2026-03-12 10:31:37 +00:00
2026-02-27 23:08:55 +00:00
2026-02-27 23:08:55 +00:00
2026-03-01 03:09:51 +00:00
2026-03-18 16:51:14 +00:00
2026-02-16 14:21:06 -05:00
2026-03-11 17:42:13 +00:00
2026-02-22 00:43:08 -05:00
2026-02-22 00:43:08 -05:00
2026-02-07 23:02:50 -05:00
2026-03-17 09:53:57 +00:00
2026-02-18 12:18:03 +00:00
2026-03-18 06:58:39 +00:00
2026-03-06 20:28:37 +00:00
2026-03-09 13:01:58 -04:00
2026-03-18 06:58:39 +00:00
2026-03-15 20:50:02 +00:00
2025-11-16 20:38:02 -05:00
2026-02-22 00:43:08 -05:00
2026-03-17 09:53:57 +00:00
2026-02-18 03:27:00 +00:00
2026-02-18 03:27:00 +00:00
2026-01-17 12:54:03 -05:00
2026-03-02 02:01:27 +00:00
2026-03-09 13:01:58 -04:00
2026-03-17 13:14:37 -04:00
2026-03-07 11:49:14 -05:00
2026-02-25 10:48:05 -05:00
2026-03-09 13:01:58 -04:00
2026-03-01 04:38:30 +00:00
2026-03-01 04:38:30 +00:00
2026-03-01 04:38:30 +00:00
2026-01-27 21:55:06 -05:00
2026-03-02 15:05:20 +00:00
2026-02-23 10:44:58 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-02-10 16:04:17 +00:00
2026-02-27 09:47:10 -05:00
2026-03-12 10:31:37 +00:00
2026-02-10 16:04:17 +00:00
2026-02-27 09:47:10 -05:00
2026-02-27 09:47:10 -05:00
2026-03-17 09:53:57 +00:00
2026-03-05 14:11:23 +00:00
2026-02-08 11:33:30 -05:00
2025-12-05 21:00:46 -05:00
2026-03-09 13:01:58 -04:00
2026-02-27 09:47:10 -05:00
2026-02-27 09:47:10 -05:00
2026-03-09 13:01:58 -04:00
2026-03-02 02:01:27 +00:00
2026-03-05 12:58:57 +00:00
2026-03-11 01:36:06 +00:00
2026-03-03 17:01:57 +00:00
2026-02-13 00:15:58 +00:00
2025-12-11 13:55:55 -05:00
2026-02-14 04:01:20 +00:00
2026-03-09 13:01:58 -04:00
2026-02-22 17:15:51 +00:00
2026-02-22 17:56:18 +00:00
2026-02-25 19:38:43 -05:00
2026-02-24 12:19:04 -05:00
2026-02-22 16:15:49 -05:00
2026-03-10 14:18:04 -04:00
2026-02-25 12:08:01 -05:00
2026-03-17 09:53:57 +00:00
2026-02-24 00:41:01 +00:00
2026-03-02 02:01:27 +00:00
2026-03-09 13:01:58 -04:00
2026-03-17 09:53:57 +00:00
2026-02-13 22:25:16 +00:00
2026-02-13 18:54:15 +00:00
2026-02-16 21:35:54 +00:00
2026-03-09 13:01:58 -04:00
2026-03-04 21:20:47 +00:00
2026-03-04 21:20:47 +00:00
2026-03-02 14:32:31 +00:00
2026-03-16 22:50:27 +00:00
2025-11-24 20:04:18 -05:00
2025-12-19 12:35:56 -05:00
2026-02-20 15:57:21 +00:00
2026-03-18 08:13:56 +00:00
2026-03-18 08:13:56 +00:00
2026-02-24 12:19:04 -05:00
2026-03-18 08:13:56 +00:00
2026-02-22 00:43:08 -05:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-10 19:29:27 +00:00
2026-03-18 17:16:32 +00:00
2026-03-04 23:47:20 +00:00
2026-03-19 07:53:43 +00:00
2026-02-26 16:13:44 +00:00
2026-02-26 16:13:44 +00:00
2026-03-19 07:53:43 +00:00
2026-03-03 12:53:28 +00:00
2026-03-09 13:01:58 -04:00
2026-03-03 12:53:28 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-03 21:44:20 +00:00
2026-02-25 10:04:31 +00:00
2026-03-05 15:42:20 +00:00
2026-03-10 12:17:51 +00:00
2026-03-12 14:38:57 +00:00
2026-03-12 10:31:37 +00:00
2026-03-10 12:17:51 +00:00
2026-03-10 12:17:51 +00:00
2026-02-25 10:02:38 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 23:55:33 +00:00
2026-03-09 13:01:58 -04:00
2025-12-06 00:23:48 -05:00
2026-03-09 13:01:58 -04:00
2026-02-13 20:34:57 +00:00
2026-02-12 02:26:03 +00:00
2026-03-17 09:53:57 +00:00
2026-02-25 10:07:09 +00:00
2026-03-03 15:42:53 +00:00
2026-03-03 14:48:55 -05:00
2026-02-19 14:20:16 +00:00
2026-02-19 14:20:16 +00:00
2026-02-21 18:11:31 +00:00
2026-02-16 21:35:54 +00:00
2026-02-14 04:01:20 +00:00
2026-02-12 02:26:03 +00:00
2026-03-04 15:36:34 +00:00
2026-02-22 16:15:49 -05:00
2026-02-22 09:23:35 +00:00
2026-03-04 20:26:42 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-02-12 02:26:03 +00:00
2026-01-27 21:55:06 -05:00
2026-01-27 21:55:06 -05:00
2026-01-27 21:55:06 -05:00
2026-02-12 04:47:02 +00:00
2026-03-09 13:01:58 -04:00
2026-02-12 04:47:02 +00:00
2026-02-12 04:47:02 +00:00
2026-01-27 21:55:06 -05:00
2026-01-27 21:55:06 -05:00
2025-12-11 13:55:55 -05:00
2026-03-03 21:44:20 +00:00
2026-03-03 21:44:20 +00:00
2026-03-09 13:01:58 -04:00
2025-11-13 18:25:24 -05:00
2026-02-20 15:57:21 +00:00
2026-03-03 17:04:17 -05:00
2026-02-27 13:47:42 -05:00
2026-02-22 16:15:49 -05:00
2026-03-09 13:01:58 -04:00
2026-03-12 14:38:57 +00:00
2026-03-18 10:09:06 +00:00
2026-02-25 04:13:55 +00:00
2026-03-12 20:42:14 +00:00
2026-03-18 10:09:06 +00:00
2026-03-03 23:36:15 +00:00
2026-03-12 14:38:57 +00:00
2026-03-02 17:44:18 +00:00
2026-03-02 02:01:27 +00:00
2026-03-19 08:46:46 +00:00
2026-02-25 14:17:34 +00:00
2025-11-30 17:36:52 -05:00
2026-02-12 22:01:51 +00:00
2026-03-10 17:23:05 +00:00
2026-03-18 17:16:32 +00:00
2026-02-25 19:38:43 -05:00
2026-02-25 19:38:43 -05:00
2026-02-25 19:38:43 -05:00
2026-03-02 02:01:27 +00:00
2025-11-24 20:04:18 -05:00
2026-03-09 13:01:58 -04:00
2026-03-03 14:55:58 -05:00
2026-02-13 21:54:31 +00:00
2026-02-12 20:19:42 +00:00
2026-02-12 02:26:03 +00:00
2026-02-12 02:26:03 +00:00
2025-11-11 20:09:06 -05:00
2026-03-19 08:46:46 +00:00
2026-02-28 20:21:18 +00:00
2026-02-20 20:34:29 +00:00
2026-02-23 09:47:00 -05:00
2026-03-15 19:59:38 -04:00
2026-03-01 03:09:51 +00:00
2026-03-09 13:01:58 -04:00
2026-03-17 09:53:57 +00:00
2026-02-24 12:19:04 -05:00
2026-03-15 20:50:02 +00:00
2026-03-15 20:50:02 +00:00
2026-03-15 20:50:02 +00:00
2026-02-27 13:47:42 -05:00
2026-02-25 19:38:43 -05:00
2026-02-20 15:57:21 +00:00
2026-02-25 19:38:43 -05:00
2026-02-13 05:01:27 +00:00
2026-03-12 20:42:14 +00:00
2026-03-09 13:01:58 -04:00
2026-03-07 19:36:09 +00:00
2026-02-10 16:04:17 +00:00
2026-03-12 20:42:14 +00:00
2026-03-17 09:53:57 +00:00
2026-02-22 00:43:08 -05:00
2026-02-22 15:13:43 +00:00
2026-02-27 13:47:42 -05:00
2026-03-01 03:09:51 +00:00
2026-03-09 13:01:58 -04:00
2026-03-12 20:42:14 +00:00
2026-03-17 09:53:57 +00:00
2026-02-12 02:26:03 +00:00
2026-02-27 09:47:10 -05:00
2026-02-27 09:47:10 -05:00
2026-02-13 20:34:57 +00:00
2026-03-09 13:01:58 -04:00
2026-03-18 10:09:06 +00:00
2026-03-17 10:39:33 +00:00
2026-03-01 03:09:51 +00:00
2026-02-25 19:38:43 -05:00
2026-02-17 00:37:53 +00:00
2026-02-25 14:00:04 -05:00
2026-03-18 06:58:39 +00:00
2026-02-24 12:19:04 -05:00
2026-02-15 00:12:07 -05:00
2026-02-25 19:38:43 -05:00
2026-03-09 13:01:58 -04:00
2026-02-15 00:12:07 -05:00
2026-02-20 15:57:21 +00:00
2026-02-22 00:43:08 -05:00
2026-03-02 02:01:27 +00:00
2026-02-15 06:16:19 +00:00
2026-03-09 13:01:58 -04:00
2026-03-18 06:58:39 +00:00
2026-02-20 15:57:21 +00:00
2026-03-09 13:01:58 -04:00
2026-02-25 14:00:04 -05:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-02 02:01:27 +00:00
2026-02-22 00:43:08 -05:00
2026-03-03 14:40:37 +00:00
2026-03-18 08:13:56 +00:00
2026-03-10 14:51:39 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-08 21:53:21 -04:00
2026-03-17 09:53:57 +00:00
2026-02-18 03:27:00 +00:00
2026-03-09 13:01:58 -04:00
2026-03-17 09:53:57 +00:00
2026-03-05 21:38:55 +00:00
2026-03-19 06:53:06 +00:00
2026-03-17 09:53:57 +00:00
2026-02-18 03:27:00 +00:00
2026-03-09 06:59:15 +00:00
2026-03-13 13:32:52 +08:00
2026-03-09 13:01:58 -04:00
2026-02-12 05:23:29 +00:00
2026-03-09 07:56:38 +00:00
2026-02-15 11:04:18 -05:00
2026-03-08 22:19:40 +00:00
2026-02-27 09:47:10 -05:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2025-12-10 12:39:07 -05:00
2025-12-24 18:50:34 -05:00
2026-01-28 13:33:45 -05:00
2026-02-12 23:35:53 -05:00
2026-03-09 13:01:58 -04:00
2026-02-12 20:19:42 +00:00
2026-02-10 16:04:17 +00:00
2026-03-09 13:01:58 -04:00
2026-01-27 21:55:06 -05:00
2026-02-24 12:19:04 -05:00
2026-03-18 10:09:06 +00:00
2026-03-18 10:09:06 +00:00
2026-03-09 23:55:33 +00:00
2026-02-20 15:57:21 +00:00
2026-03-10 22:27:37 +00:00
2026-02-27 13:47:42 -05:00
2026-03-18 08:13:56 +00:00
2026-03-01 03:09:51 +00:00
2026-03-06 03:22:45 +00:00
2026-03-02 17:44:18 +00:00
2026-02-20 15:57:21 +00:00
2026-03-09 13:01:58 -04:00
2026-03-10 03:39:32 +00:00
2026-03-09 13:01:58 -04:00
2026-03-17 09:53:57 +00:00
2026-03-17 09:53:57 +00:00
2026-02-18 03:27:00 +00:00
2026-02-24 12:19:04 -05:00
2026-02-23 22:20:44 +00:00
2026-03-10 04:06:02 +00:00
2026-03-10 04:06:02 +00:00
2026-03-07 19:36:09 +00:00
2026-02-13 21:54:31 +00:00
2026-03-09 13:01:58 -04:00
2026-03-18 02:30:00 +00:00
2026-02-17 21:07:54 +00:00
2026-02-20 08:49:30 -05:00
2026-03-06 20:44:36 +00:00
2026-03-07 19:36:09 +00:00
2026-02-15 10:44:14 -05:00
2026-03-18 02:30:00 +00:00
2026-02-18 03:27:00 +00:00
2026-03-10 03:39:32 +00:00
2026-03-10 03:39:32 +00:00
2026-03-10 03:39:32 +00:00
2026-03-18 02:30:00 +00:00
2026-03-18 01:45:25 +00:00
2026-03-09 13:01:58 -04:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-02-20 20:38:53 +00:00
2026-01-27 21:55:06 -05:00
2026-01-27 21:55:06 -05:00
2026-01-27 21:55:06 -05:00
2026-02-10 16:04:17 +00:00
2026-03-03 22:21:14 +00:00
2026-03-03 22:21:14 +00:00
2026-03-04 15:59:15 +00:00
2026-03-02 10:18:14 +00:00
2026-02-27 13:47:42 -05:00
2026-03-10 19:29:27 +00:00
2026-03-09 13:01:58 -04:00
2026-02-12 20:19:42 +00:00
2026-03-09 13:01:58 -04:00
2026-02-20 03:31:43 +00:00
2026-03-06 00:49:33 +00:00
2026-03-06 00:49:33 +00:00
2026-03-12 14:38:57 +00:00
2026-02-25 04:50:43 +00:00
2026-02-21 16:32:03 +00:00
2026-02-25 10:05:57 +00:00
2026-02-26 20:33:20 +00:00
2026-02-13 19:24:24 +00:00
2026-02-19 11:15:18 +00:00
2026-03-09 13:01:58 -04:00
2026-02-25 10:06:27 +00:00
2026-03-04 12:18:51 -05:00
2026-02-28 17:46:54 +00:00
2026-03-02 22:05:53 +00:00
2026-03-17 09:53:57 +00:00
2026-03-12 14:38:57 +00:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-02-18 03:27:00 +00:00
2026-03-02 02:01:27 +00:00
2026-02-20 01:10:19 +00:00
2026-03-12 16:16:41 +00:00
2026-03-10 21:39:31 +00:00
2026-03-12 16:16:41 +00:00
2026-02-20 15:57:21 +00:00
2026-02-20 15:57:21 +00:00
2026-02-18 00:10:15 +00:00
2026-03-09 13:01:58 -04:00
2025-12-10 12:39:07 -05:00
2026-03-05 21:38:55 +00:00
2026-03-08 02:57:44 +00:00
2026-03-12 23:32:48 +00:00
2026-02-26 10:57:07 +00:00
2026-02-27 13:47:42 -05:00
2026-02-24 12:19:04 -05:00
2026-02-26 10:57:07 +00:00
2026-02-20 08:50:08 -05:00
2026-02-24 17:57:18 +00:00
2026-02-21 10:23:33 -05:00
2026-02-24 17:57:18 +00:00
2026-02-20 08:50:08 -05:00
2026-02-20 08:50:08 -05:00
2026-02-20 08:50:08 -05:00
2026-03-02 02:01:27 +00:00
2026-02-27 20:09:26 +00:00
2026-02-25 10:03:57 +00:00
2026-02-21 16:30:40 +00:00
2026-02-17 19:58:15 +00:00
2026-02-17 10:13:19 +00:00
2026-02-21 10:23:33 -05:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-01-27 21:55:06 -05:00
2026-03-08 22:19:40 +00:00
2026-02-02 18:46:33 -05:00
2026-02-08 11:33:30 -05:00
2026-02-12 20:19:42 +00:00
2026-02-12 20:19:42 +00:00
2026-02-12 20:19:42 +00:00
2026-02-21 16:32:03 +00:00
2025-11-11 20:09:06 -05:00
2026-03-09 13:01:58 -04:00
2026-03-19 07:53:43 +00:00
2026-02-20 20:34:29 +00:00
2026-03-09 13:01:58 -04:00
2026-03-18 17:07:07 +00:00
2026-03-02 09:41:25 -05:00
2026-03-09 13:01:58 -04:00
2026-02-22 00:43:08 -05:00
2026-02-20 15:57:21 +00:00
2026-03-08 21:53:21 -04:00
2026-03-10 22:40:15 +00:00
2026-03-16 01:45:50 +00:00
2026-03-12 20:42:14 +00:00
2026-03-12 19:49:11 +00:00
2026-03-12 19:49:11 +00:00
2026-03-19 06:31:20 +00:00
2026-03-19 07:31:12 +00:00
2026-03-19 06:41:26 +00:00
2026-03-19 07:21:11 +00:00
2026-03-12 16:16:41 +00:00
2026-03-12 16:16:41 +00:00
2026-03-12 16:16:41 +00:00
2026-03-12 16:16:41 +00:00
2026-03-16 01:12:24 +00:00
2026-03-16 22:45:55 +00:00
2026-03-11 01:36:06 +00:00
2026-03-11 01:36:06 +00:00
2026-03-11 01:36:06 +00:00
2026-03-11 01:36:06 +00:00
2026-03-08 22:11:49 +00:00
2026-02-14 14:03:28 -05:00
2026-02-20 08:49:30 -05:00
2026-02-20 08:49:30 -05:00
2026-02-22 00:43:08 -05:00
2026-02-16 21:35:54 +00:00
2026-02-14 18:55:48 +00:00
2026-02-17 21:14:46 +00:00
2026-02-17 22:59:16 -05:00
2026-02-25 10:03:57 +00:00
2026-02-22 00:43:08 -05:00
2026-02-17 20:28:20 +00:00
2026-02-21 10:23:33 -05:00
2026-02-14 13:46:10 -05:00
2026-03-04 18:21:19 +00:00
2026-03-18 10:09:06 +00:00
2026-03-18 10:09:06 +00:00
2026-03-05 19:20:39 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-13 18:21:50 +00:00
2026-03-13 18:21:50 +00:00
2026-03-13 18:21:50 +00:00
2026-03-13 18:21:50 +00:00
2026-03-16 12:11:08 +00:00
2026-03-16 12:11:08 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-05 21:38:55 +00:00
2026-03-09 13:01:58 -04:00
2026-02-20 15:57:21 +00:00
2026-02-25 10:03:21 +00:00
2026-02-22 00:43:08 -05:00
2026-02-20 02:54:08 +00:00
2026-03-02 02:01:27 +00:00
2026-02-25 10:03:57 +00:00
2026-02-12 20:19:42 +00:00
2026-03-09 13:01:58 -04:00
2026-02-10 16:04:17 +00:00
2026-02-12 22:01:51 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-02-16 14:21:06 -05:00