bobframes 0.1.0__py3-none-any.whl
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.
- bobframes/__init__.py +3 -0
- bobframes/_version.py +1 -0
- bobframes/catalog.py +154 -0
- bobframes/cli.py +266 -0
- bobframes/derive_post_merge.py +365 -0
- bobframes/derives/__init__.py +0 -0
- bobframes/derives/pass_class_breakdown.py +102 -0
- bobframes/derives/texture_usage.py +121 -0
- bobframes/discovery.py +132 -0
- bobframes/global_entities.py +99 -0
- bobframes/html/__init__.py +0 -0
- bobframes/html/template.py +1056 -0
- bobframes/lint.py +114 -0
- bobframes/manifest.py +127 -0
- bobframes/parquetize.py +282 -0
- bobframes/parsers/__init__.py +0 -0
- bobframes/parsers/derive_program_transitions.py +73 -0
- bobframes/parsers/parse_init_state.py +675 -0
- bobframes/paths.py +111 -0
- bobframes/probes/__init__.py +0 -0
- bobframes/probes/whatif.py +165 -0
- bobframes/qrd_harness.py +119 -0
- bobframes/query_examples.py +222 -0
- bobframes/rdcmd.py +72 -0
- bobframes/replay/__init__.py +26 -0
- bobframes/replay/replay_main.py +2305 -0
- bobframes/reports/__init__.py +0 -0
- bobframes/reports/_dashboard.py +425 -0
- bobframes/reports/ab.py +88 -0
- bobframes/reports/base.py +114 -0
- bobframes/reports/cache.py +147 -0
- bobframes/reports/chrome.py +1306 -0
- bobframes/reports/cli.py +99 -0
- bobframes/reports/delta.py +167 -0
- bobframes/reports/discovery.py +118 -0
- bobframes/reports/draws_by_class.py +165 -0
- bobframes/reports/formatters.py +122 -0
- bobframes/reports/instancing_opportunities.py +276 -0
- bobframes/reports/orchestrator.py +59 -0
- bobframes/reports/overdraw.py +293 -0
- bobframes/reports/pass_gpu.py +190 -0
- bobframes/reports/shader_hotlist.py +240 -0
- bobframes/reports/trend_table.py +444 -0
- bobframes/resource_labels.py +162 -0
- bobframes/run.py +480 -0
- bobframes/schemas.py +426 -0
- bobframes/stable_keys.py +83 -0
- bobframes/tests/__init__.py +0 -0
- bobframes/tests/_render_util.py +84 -0
- bobframes/tests/data/golden/_reports/draws_by_class.html +323 -0
- bobframes/tests/data/golden/_reports/drill/District 01/2026-05-28_r110600/index.html +1560 -0
- bobframes/tests/data/golden/_reports/index.html +264 -0
- bobframes/tests/data/golden/_reports/instancing_opportunities.html +266 -0
- bobframes/tests/data/golden/_reports/overdraw.html +275 -0
- bobframes/tests/data/golden/_reports/pass_gpu.html +277 -0
- bobframes/tests/data/golden/_reports/shader_hotlist.html +265 -0
- bobframes/tests/data/golden/_reports/trend_table.html +390 -0
- bobframes/tests/data/golden/index.html +1175 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/_manifest.json +51 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/buffers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/clears.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/counters_per_event.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/descriptor_access.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/dispatches.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draw_bindings.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draws.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/fbos.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/frame_totals.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/ibo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/indirect_args.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/passes.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/pixel_history.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/post_vs_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/program_transitions.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/programs.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/render_targets.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/resource_creation.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/rt_event_timeline.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/samplers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/shaders.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/state_change_events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/texture_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/textures.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vbo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vertex_inputs.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/_manifest.json +51 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/buffers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/clears.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/counters_per_event.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/descriptor_access.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/dispatches.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draw_bindings.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draws.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/fbos.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/frame_totals.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/ibo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/indirect_args.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/passes.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/pixel_history.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/post_vs_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/program_transitions.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/programs.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/render_targets.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/resource_creation.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/rt_event_timeline.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/samplers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/shaders.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/state_change_events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/texture_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/textures.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vbo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vertex_inputs.parquet +0 -0
- bobframes/tests/make_synthetic.py +171 -0
- bobframes/tests/smoke.py +199 -0
- bobframes/tests/test_determinism.py +19 -0
- bobframes/tests/test_discovery.py +97 -0
- bobframes/tests/test_hardening.py +142 -0
- bobframes/tests/test_parity.py +22 -0
- bobframes/tests/test_perf.py +18 -0
- bobframes/tests/test_replay_drift.py +115 -0
- bobframes/tests/test_schemas.py +26 -0
- bobframes/tests/test_schemas_unit.py +55 -0
- bobframes/tests/test_stable_keys.py +61 -0
- bobframes-0.1.0.dist-info/METADATA +144 -0
- bobframes-0.1.0.dist-info/RECORD +130 -0
- bobframes-0.1.0.dist-info/WHEEL +4 -0
- bobframes-0.1.0.dist-info/entry_points.txt +2 -0
- bobframes-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: bobframes
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: RenderDoc capture pipeline: ingest, analyze, render.
|
|
5
|
+
Project-URL: Homepage, https://github.com/altpsyche/bobframes
|
|
6
|
+
Project-URL: Issues, https://github.com/altpsyche/bobframes/issues
|
|
7
|
+
Project-URL: Changelog, https://github.com/altpsyche/bobframes/blob/main/CHANGELOG.md
|
|
8
|
+
Author-email: Siva Subramanyam <sivasubramanyam@mayhem-studios.com>
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: gpu,parquet,profiling,renderdoc
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Multimedia :: Graphics
|
|
21
|
+
Classifier: Topic :: Software Development :: Debuggers
|
|
22
|
+
Requires-Python: <3.15,>=3.10
|
|
23
|
+
Requires-Dist: pyarrow<22,>=17
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: build; extra == 'dev'
|
|
26
|
+
Requires-Dist: hatchling; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest; extra == 'dev'
|
|
28
|
+
Requires-Dist: twine; extra == 'dev'
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
|
|
31
|
+
# BobFrames
|
|
32
|
+
|
|
33
|
+
RenderDoc capture pipeline: ingest, analyze, render. Point it at a folder of `.rdc` captures and it
|
|
34
|
+
produces `_data/` (Parquet tables) plus `_reports/` (static HTML you can browse). Windows-only in v1.
|
|
35
|
+
|
|
36
|
+
## Requirements
|
|
37
|
+
|
|
38
|
+
- Windows 10 or later (the replay stage drives `qrenderdoc`, which is Windows-only in v1).
|
|
39
|
+
- Python 3.10 - 3.13.
|
|
40
|
+
- RenderDoc 1.x, or Arm Performance Studio, providing `renderdoccmd` and `qrenderdoc` on disk.
|
|
41
|
+
|
|
42
|
+
## Install
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
pipx install bobframes
|
|
46
|
+
bobframes check
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`bobframes check` prints the resolved paths for `renderdoccmd` and `qrenderdoc` and exits non-zero if
|
|
50
|
+
either is missing, so you can confirm the toolchain before a long ingest.
|
|
51
|
+
|
|
52
|
+
## Quickstart
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
cd path\to\captures # a folder of <Area>\<YYYY-MM-DD[_label]>\*.rdc
|
|
56
|
+
bobframes ingest . # export, parse, replay, parquetize, derive, render
|
|
57
|
+
bobframes serve . # open a local static preview of the reports
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`ingest` writes Parquet under `_data/` and HTML under `_reports/`. Re-run `bobframes render .` any
|
|
61
|
+
time to rebuild the HTML from existing Parquet without re-replaying captures.
|
|
62
|
+
|
|
63
|
+
## Commands
|
|
64
|
+
|
|
65
|
+
| Command | Purpose |
|
|
66
|
+
|---|---|
|
|
67
|
+
| `ingest [root] [--area X] [--label Y] [--capture N] [--force] [--pixel-grid 4] [--render-only]` | Full pipeline: export, parse, replay, parquetize, derive, manifest, commit, catalog, render. |
|
|
68
|
+
| `render [root] [--area X] [--label Y]` | Rebuild HTML and catalog from existing Parquet. |
|
|
69
|
+
| `ab [root] --baseline-label X --compare-label Y` | All reports for one drop pair under `_reports/ab/<pair>/`. |
|
|
70
|
+
| `report [root] <name>` | Build one named report (draws-by-class, trend, instancing, pass-gpu, shader, overdraw, dashboard). |
|
|
71
|
+
| `catalog [root]` | Rebuild `_data/_catalog.parquet` only. |
|
|
72
|
+
| `lint <file>...` | Check HTML or markdown against the banlist. |
|
|
73
|
+
| `check` | Print resolved tool paths; non-zero when a tool is missing. |
|
|
74
|
+
| `serve [root] [--port 8000] [--bind 127.0.0.1]` | Static preview via the stdlib HTTP server. |
|
|
75
|
+
| `smoke [--data DIR]` | End-to-end check; render-only against the bundled fixture when `--data` is omitted. |
|
|
76
|
+
| `version` | Print `bobframes`, schema, and pyarrow versions. |
|
|
77
|
+
|
|
78
|
+
`<root>` is positional and defaults to `.`. Flags are long-form only. Exit codes: `0` success,
|
|
79
|
+
`1` pipeline or build failure, `2` usage error, `3` external tool missing, `4` interrupted.
|
|
80
|
+
|
|
81
|
+
## External tools
|
|
82
|
+
|
|
83
|
+
The export stage runs `renderdoccmd convert`; the replay stage runs `qrenderdoc --python`. v1 looks
|
|
84
|
+
for both at a baked Arm Performance Studio install path and on `PATH`. A config file and a
|
|
85
|
+
tool-resolver with version globbing arrive in v0.2; until then, install RenderDoc where v1 expects it
|
|
86
|
+
or put the executables on `PATH`. Run `bobframes check` to see what was resolved.
|
|
87
|
+
|
|
88
|
+
## Output layout
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
<root>/
|
|
92
|
+
index.html root catalog view
|
|
93
|
+
<area>/<drop>/ raw RDC inputs (left untouched)
|
|
94
|
+
_data/ pipeline outputs
|
|
95
|
+
_catalog.parquet (+ .csv, .json)
|
|
96
|
+
_global_entities.parquet (+ .csv)
|
|
97
|
+
_query_examples.md
|
|
98
|
+
<area>/<drop>/ per-drop data (29 Parquet tables)
|
|
99
|
+
*.parquet (+ matching .csv)
|
|
100
|
+
_manifest.json, _resource_labels.json
|
|
101
|
+
shader_src/*.glsl, jsonl sidecars
|
|
102
|
+
done.marker
|
|
103
|
+
_reports/ rendered HTML
|
|
104
|
+
*.html (dashboard + reports)
|
|
105
|
+
ab/<pair>/*.html
|
|
106
|
+
drill/<area>/<drop>/index.html per-drop browser
|
|
107
|
+
_cache/
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The catalog stores each drop's path relative to `<root>` for portability.
|
|
111
|
+
|
|
112
|
+
## Migrating from `_analysis`
|
|
113
|
+
|
|
114
|
+
v1 is a hard rename of the older project-embedded `_analysis` package, with no compatibility shim:
|
|
115
|
+
`python -m _analysis.*` stops working once `bobframes` is installed. Map old invocations to new ones:
|
|
116
|
+
|
|
117
|
+
| Old (`_analysis`) | New (`bobframes`) |
|
|
118
|
+
|---|---|
|
|
119
|
+
| `python -m _analysis.run --root . --area X --label Y` | `bobframes ingest . --area X --label Y` |
|
|
120
|
+
| `python -m _analysis.reports.ab --root . --baseline-label X --compare-label Y` | `bobframes ab . --baseline-label X --compare-label Y` |
|
|
121
|
+
| `python -m _analysis.lint <file>` | `bobframes lint <file>` |
|
|
122
|
+
| `python -m _analysis.tests.smoke` | `bobframes smoke` |
|
|
123
|
+
|
|
124
|
+
## Troubleshooting
|
|
125
|
+
|
|
126
|
+
| Symptom | Resolution |
|
|
127
|
+
|---|---|
|
|
128
|
+
| `renderdoccmd not found` (exit 3) | Install RenderDoc or Arm Performance Studio, or put the executable on `PATH`; confirm with `bobframes check`. |
|
|
129
|
+
| `qrenderdoc` replay hangs | v1 kills the replay process tree on timeout and records `capture_status='replay_failed'` for that capture; the rest of the drop still completes. Re-run with `--force` to retry. |
|
|
130
|
+
| Lint failure during render | The emitted HTML contains a banned token. Run `bobframes lint <file>` to see the line and label. |
|
|
131
|
+
| `schema mismatch` (exit 1) | A drop's `_manifest.json` schema version differs from the installed schema. Rebuild it with `bobframes ingest --force` (the v1 schema-migration path; see G-3). |
|
|
132
|
+
| Permission denied on `_data` | Close any viewer holding a Parquet open, then re-run; writes are staged and renamed atomically. |
|
|
133
|
+
|
|
134
|
+
## Advanced
|
|
135
|
+
|
|
136
|
+
- A/B reports: `bobframes ab . --baseline-label OLD --compare-label NEW` builds a side-by-side set.
|
|
137
|
+
- Programmatic use: import `bobframes.schemas`, `bobframes.discovery`, and `bobframes.paths` to drive
|
|
138
|
+
table lookups, drop discovery, and path resolution from your own scripts.
|
|
139
|
+
- `bobframes/probes/whatif.py` is a manual qrenderdoc-side probe and is not wired as a CLI command.
|
|
140
|
+
- A TOML config file, an externalized draw classifier, and design-token theming are planned for v0.2.
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
|
|
144
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
bobframes/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
|
|
2
|
+
bobframes/_version.py,sha256=kUR5RAFc7HCeiqdlX36dZOHkUI5wI6V_43RpEcD8b-0,22
|
|
3
|
+
bobframes/catalog.py,sha256=snPmN8RfNHtQkc-6PmgaqyJ6qXUHwWiAbAUdkHcaFYM,5748
|
|
4
|
+
bobframes/cli.py,sha256=w9rlZov2qYTl6213T7oubqdG58gAQYuXw27awkb8TNs,9498
|
|
5
|
+
bobframes/derive_post_merge.py,sha256=tYHGhkLsUx3hBC7JLei52AM6prLWa9q_Nr0fM5LG6VU,14301
|
|
6
|
+
bobframes/discovery.py,sha256=xUS5Q-f9B6xJffI8rqVDWqxRIyJHL5GLbGc6UeqIs9w,4053
|
|
7
|
+
bobframes/global_entities.py,sha256=7ZUu1THpgfUgpaNoSeYJSzexjAHpbnOg-9pLXnmaYos,3498
|
|
8
|
+
bobframes/lint.py,sha256=C3L0zAJz7Kls3a8zmx-nsjo-QWrwh0KvhloDxhZ2Oe4,4456
|
|
9
|
+
bobframes/manifest.py,sha256=DkgItSt2cNrTFCyXUYQNxkY6F3F_-JZwSildHp1gfHg,4127
|
|
10
|
+
bobframes/parquetize.py,sha256=y_hJQIV9Z4Z5NRSrJvOQwJ8tSz2yYB7vlocTNfgznfM,10412
|
|
11
|
+
bobframes/paths.py,sha256=t7MtUAfDOo0FJ-SuD1En_HvXgOZ0jkba2PqDgg5SAIM,3655
|
|
12
|
+
bobframes/qrd_harness.py,sha256=3INEfqdikh5pRzc8umw08u6C0_HoqU7uO2v18e7_pJw,3969
|
|
13
|
+
bobframes/query_examples.py,sha256=f_ctz7ziaki2cgWKQ_OgvoUldBO_-mWPBqSJQRqRGwA,6261
|
|
14
|
+
bobframes/rdcmd.py,sha256=X8nMc2n8mNt19t0dtMCWTCkzLo_29t0K9sJgnXjb0i4,2395
|
|
15
|
+
bobframes/resource_labels.py,sha256=xx_d9WE885mSaEFgWFQBiKOxYBzAdeV3RDXSIrrrdd0,5686
|
|
16
|
+
bobframes/run.py,sha256=YCeueyt4npIAwhqCCkjOXmpgiRT7PaYlTGBx4LxJP4Q,19445
|
|
17
|
+
bobframes/schemas.py,sha256=tz4PKNsX3k7y9hTg9c9bbZHBhc7HanNlJbpR3j6jVmg,17940
|
|
18
|
+
bobframes/stable_keys.py,sha256=vBqo1MtJV5LonDB3Xo1j4jFG8aZp260YLp-6Pc87IQ8,2640
|
|
19
|
+
bobframes/derives/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
+
bobframes/derives/pass_class_breakdown.py,sha256=NBL37Vt0bYMH9h01Swh3rbMyjcoIm5oafY7n-gjKsqk,3946
|
|
21
|
+
bobframes/derives/texture_usage.py,sha256=XSMj_FlQ81Mcc7vQTGqT2iBQ1-mCiUC8KEiCbl1m1EU,4583
|
|
22
|
+
bobframes/html/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
|
+
bobframes/html/template.py,sha256=vWgm_OZeIhmZ_N_F-DTqkPmhqihvZEJ9Gc6DiYJ3efY,40258
|
|
24
|
+
bobframes/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
|
+
bobframes/parsers/derive_program_transitions.py,sha256=Yj9U8gngX3-GiHSR2lWm-Pnvcmf-ThSnOcURvsSThVQ,2532
|
|
26
|
+
bobframes/parsers/parse_init_state.py,sha256=wDfHp13g9Qlcq_uh2h-bSb2oWLUgCLeIkIjpRNKonWE,25323
|
|
27
|
+
bobframes/probes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
+
bobframes/probes/whatif.py,sha256=jUSDDRWInxvuttk8YrCPdDQCpjFaA6sOfhnpjE6DpAg,5827
|
|
29
|
+
bobframes/replay/__init__.py,sha256=24W5zSUzCAK-b4BXLOcsLAjuNqylkZYiQ9W5Je4yD7E,1168
|
|
30
|
+
bobframes/reports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
+
bobframes/reports/_dashboard.py,sha256=CPgVMFTVM5OE2mnV51LxiOypddNdWrOgwaW7735rNzI,15020
|
|
32
|
+
bobframes/reports/ab.py,sha256=gkO44HquuHAZjFwHunAoHexKpeSA0Wod_qpxgdydWD0,2924
|
|
33
|
+
bobframes/reports/base.py,sha256=dOW8Ef4R0bN7rK3HHL5bNF0JEKgUBWXScFhGqdDVawo,3042
|
|
34
|
+
bobframes/reports/cache.py,sha256=3y4vnSl1BAyZ3YCOLXZRUPwteaa2nUk4A95dKey7Ac0,5340
|
|
35
|
+
bobframes/reports/chrome.py,sha256=lR8WQ2IS31wKx0apXYvsKVzJolJDl0bUSWB6fkg11nA,45159
|
|
36
|
+
bobframes/reports/cli.py,sha256=lRsQ62QMGGaoFs685W37OU0gYC4LSX_UI_2LF7ji3lY,3740
|
|
37
|
+
bobframes/reports/delta.py,sha256=EfU-9yi_ojYx70GbzaMKFlG6ObzglUD9_0Q208QQ2tg,5443
|
|
38
|
+
bobframes/reports/discovery.py,sha256=KoW8Zx3uWcasm3zn4vUaroOVPPFct19JYQRhcApYoWI,3753
|
|
39
|
+
bobframes/reports/draws_by_class.py,sha256=KOn0CCOUFDlGwjfRKqkLSlwSKYJmwNNH-M3UD1cm5TI,6227
|
|
40
|
+
bobframes/reports/formatters.py,sha256=POHwd89HkUGVAah32uzmv4FH6T4Ua3n_P4reKZwD5as,3192
|
|
41
|
+
bobframes/reports/instancing_opportunities.py,sha256=XaTz_pYu2eJCtcLn03A3N44JJ6AzaZOeCPJ19BpMQ-M,10934
|
|
42
|
+
bobframes/reports/orchestrator.py,sha256=hEW081VHfx4xzSks4BeCZ-uBxzg2wDhrYmY1xRIthYw,1645
|
|
43
|
+
bobframes/reports/overdraw.py,sha256=-qs9eVETX9Y0WKKq-a93Itbe7imdZzd0POIFtrsxFxo,12335
|
|
44
|
+
bobframes/reports/pass_gpu.py,sha256=wXwdkyqJVF8DHVhzjElJv4hlsYc60wBO44L_kukSsW4,7707
|
|
45
|
+
bobframes/reports/shader_hotlist.py,sha256=TbDgMiEg3ck3JTAbE6EJ_-oKHa0Cm20ZKCo8l94cZEc,9236
|
|
46
|
+
bobframes/reports/trend_table.py,sha256=ZeE7-UUFzkphuu4Br31usB9ADsVPeo3n4FYwnTphRqw,17442
|
|
47
|
+
bobframes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
|
+
bobframes/tests/_render_util.py,sha256=RNWg4ZLXo8kQtgK2HmHDzt1aS95iYcZChCG0kMOEo08,3240
|
|
49
|
+
bobframes/tests/make_synthetic.py,sha256=7LPCPrIyg8vBayyqQTFCdrxxYVN3uZYhI9kjbfsODyI,7016
|
|
50
|
+
bobframes/tests/smoke.py,sha256=KY7vEXrgscg37KzOSMgzKvupVAXUFvcMW-C5MdqrFEM,7698
|
|
51
|
+
bobframes/tests/test_determinism.py,sha256=0Q35vHf6EEF-_hA6FGbNcKFSgu3E5_tTa1z7IS3vO1U,778
|
|
52
|
+
bobframes/tests/test_discovery.py,sha256=LVAR0zrgmoSIoe0FnJ0K8OOn5x_NwXKgc5_mAy145V0,4110
|
|
53
|
+
bobframes/tests/test_hardening.py,sha256=I4SRkTbivhm2X74VfkCQxQnQomul3yLE1LIQgJJayW4,5156
|
|
54
|
+
bobframes/tests/test_parity.py,sha256=FFiibA45jLvmflOPNgyE0oaHVoybXRPLdtcQzwQXowE,878
|
|
55
|
+
bobframes/tests/test_perf.py,sha256=G05Ep9jb9HVdXX0aLR-WWlQ36aVumYmm8LH3P9_vX5I,612
|
|
56
|
+
bobframes/tests/test_replay_drift.py,sha256=3RGm34IPBi1klP9Nnfs5fH-kh7B-LmVuta24m_RDsqQ,5283
|
|
57
|
+
bobframes/tests/test_schemas.py,sha256=KTgq_v8AJWQ1GN6nGOd0uYkK1gHiFpo0B6sfCUlH7oA,999
|
|
58
|
+
bobframes/tests/test_schemas_unit.py,sha256=cH0Om2Ab-KMr9xAapfnw8Zqy4idJ0cwX2mNeWPlPaT0,2188
|
|
59
|
+
bobframes/tests/test_stable_keys.py,sha256=_4ZwCWzRypck2SmDMFg1-GIUE5igTz_vFjPVMiyPkBA,2781
|
|
60
|
+
bobframes/tests/data/golden/index.html,sha256=MMRreJE4p1K9IYMMhgdATr9KTsPVEHSv7ClGsYGhpmk,45715
|
|
61
|
+
bobframes/tests/data/golden/_reports/draws_by_class.html,sha256=HA8Tuel63Z1_U7_uCySiUTvBSJRif4SC0ADD3jQB-b8,33195
|
|
62
|
+
bobframes/tests/data/golden/_reports/index.html,sha256=PkhHRqD25sc0X5sOYjJpN5lh9vzXFIp8VoKcVZdigB8,32452
|
|
63
|
+
bobframes/tests/data/golden/_reports/instancing_opportunities.html,sha256=iLrOXb4hcEWnkE5JHU25bqYM-gdut39npTi7epMq-Wo,48587
|
|
64
|
+
bobframes/tests/data/golden/_reports/overdraw.html,sha256=zNLLqbSAK0wGg1c-hKtjrePKpknl7Bp3tpGpjAlvaY8,31958
|
|
65
|
+
bobframes/tests/data/golden/_reports/pass_gpu.html,sha256=RpciESyLvUVF1sNAIzSHKjTcw4ZAAlwfWvlRsB0SskA,46194
|
|
66
|
+
bobframes/tests/data/golden/_reports/shader_hotlist.html,sha256=3leSvrr_hwrZHrjopwSUleSWoVhShnng_fACtFiUfsQ,48816
|
|
67
|
+
bobframes/tests/data/golden/_reports/trend_table.html,sha256=DsH5ZqhpwoKdvQfj6k9uzGqvHWeUKpAEs0WTbcoxrcc,34202
|
|
68
|
+
bobframes/tests/data/golden/_reports/drill/District 01/2026-05-28_r110600/index.html,sha256=Nq2icYTPRYDXXeAh90N31jlkTqvXvbNuHKSZlFOTmTs,307053
|
|
69
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/_manifest.json,sha256=O4FW0wVCGPB1pZ1slCmoa0aC5iW56mCwIP_uiPRcoLM,1003
|
|
70
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/buffers.parquet,sha256=x51w53un4U81dUyTK0eeChR9pZ1IxGSuAqyrrXHMNR8,10573
|
|
71
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/clears.parquet,sha256=vCGqNYH4XrH6Y7yxh8N-wVoJAbMGYIbHE5cGa2Ytm68,5125
|
|
72
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/counters_per_event.parquet,sha256=m9nZ2rEdUIOy4pNR5oQBb0yuOjNR1FY_UUt8ZZ49XyI,3154
|
|
73
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/descriptor_access.parquet,sha256=d2ijWYjxJ2hlfDDjynBOamP6YiEqB7NvecnA-5Fw5rk,3892
|
|
74
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/dispatches.parquet,sha256=Ldme9wpZ8KsZn2et4DDJ7vJ8y5dDK2fIAUrzMFLst2g,6980
|
|
75
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draw_bindings.parquet,sha256=-x19L686BDDPKwEW7MdoWcUxS1PDazrSizDjDEMtQew,3672
|
|
76
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draws.parquet,sha256=xqT0kkalbhgwKCjeSs4N8Low3KvExhzeE7op_HCBjEI,23112
|
|
77
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/events.parquet,sha256=6zKqAyUUoYMjHmCINPaXZxoHMfgwYk6peAPGKaRm0Go,9624
|
|
78
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/fbos.parquet,sha256=AOYER6f2rg126J8Lgo95tchuDHmmoJ3pFRIelihTmzw,7826
|
|
79
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/frame_totals.parquet,sha256=LlonlN5QzphIFuRg3mk2-tutnVDrU34VA6BsCvn4aWA,13410
|
|
80
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/ibo_samples.parquet,sha256=mWF_-EohUUmJMOydziPPVoz6iYq_JK2g1eXkNg-Bl_Y,2650
|
|
81
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/indirect_args.parquet,sha256=i51x2N6xzTYW1XgYHuuW1puEGPWO_zfn4fZalLuQWXU,2916
|
|
82
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/passes.parquet,sha256=jWqCPPHctmcb04kPSzsNYaoPWATy9PUstHIaRppIn8I,12749
|
|
83
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/pixel_history.parquet,sha256=xIxm7x2Hg-2hEGYC_IprTOCgtPe_At-33_wfbbgwCCs,9051
|
|
84
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/post_vs_samples.parquet,sha256=zx-FJe0pvE9qsXkpMrrSfgfLDgoumHMfbDcFWAdTqLE,4350
|
|
85
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/program_transitions.parquet,sha256=VZfIbel1Wo74eyH28ZxDA1Spbg5A5MP-IC0rUyyFyn8,2700
|
|
86
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/programs.parquet,sha256=GbsFudOX-SLDBDFO8rrlbKonMDYM1ftrW2uberfKxWU,11981
|
|
87
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/render_targets.parquet,sha256=BBYG6IB0pkYNQVSyEMwK9zMm8UnP-_0uP2Z9kvFVZN4,11617
|
|
88
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/resource_creation.parquet,sha256=7cmAFcAr-oawKQqjGPSJE62PiuGBx_mBOunulBggGhM,3552
|
|
89
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/rt_event_timeline.parquet,sha256=jf3auh8mqub3Xk21QcE7B2fF9YL3100vQBMAQILYqUw,3585
|
|
90
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/samplers.parquet,sha256=tlUMz5PJ4Sdm5rXDaJ1jdNd_TU33-pa4X_NdAGnMqRw,8281
|
|
91
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/shaders.parquet,sha256=RUucRqlaUeDWyEBN9RkGJMcbfVOTIkIYObGyz-ToKdw,12533
|
|
92
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/state_change_events.parquet,sha256=0TMP9IjQP_nt97msilap2mMerJ1m-QzHUuChpM4jck4,3825
|
|
93
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/texture_samples.parquet,sha256=fFX1vOfZkSuQshrQdLyi4dwQFOPhiAMWVRjsV5sfnXM,4458
|
|
94
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/textures.parquet,sha256=matPx0bQ1tE900fLgaFxS-HjPPM9RR2aRqb6InvxqQs,11521
|
|
95
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vbo_samples.parquet,sha256=HMGtL9zYfg__0aL0vHLFv7UucmZIDDUJ-MVWlj1MQH8,7695
|
|
96
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vertex_inputs.parquet,sha256=Evl1JYIJa77FmxzJXfSvKqBuauvyVvDEvHAGGzG_org,5517
|
|
97
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/_manifest.json,sha256=YjyIxcgzjlhOBa4zimGkNffUR-K34cWzCqiGOm_cDqY,1003
|
|
98
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/buffers.parquet,sha256=qc1WLcCumbMJrRTpAUV0ssP6b4p1RicV6aaxkTHfKBU,10535
|
|
99
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/clears.parquet,sha256=PDXWj-F0pnoIAo8Whw1Gm1a4yx3oWROZFVDUoizdGP4,5124
|
|
100
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/counters_per_event.parquet,sha256=tB31crTrtRQ4t6pyu-QDE9HspmXi6DvgsJxHanpn66Y,3169
|
|
101
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/descriptor_access.parquet,sha256=A_DUUFNgGjz7CcB4Jv_UENEf5233ZvrpK2V5Y8LS5bI,3877
|
|
102
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/dispatches.parquet,sha256=dXJFa19zB3CbVURrtdOtKtDRzkhoH6p4gyYUK5_W-vM,6988
|
|
103
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draw_bindings.parquet,sha256=Jk9nx2iLHn2B0VbaXcW3fY_EvCLoBgCYFPF6JPZBZag,3653
|
|
104
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draws.parquet,sha256=UpsJDkH-_qW2g0vuf6AqO1WHhPi-sDg4lSxf6OlLPDA,23953
|
|
105
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/events.parquet,sha256=fmzPDxIxX0CBZWCHv7ctyhpB1VSH3i-liHKeyQhYk8Q,9635
|
|
106
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/fbos.parquet,sha256=ZaVJUgkawpjaeU61FtgVFJPoLOZAop5iy38VdtU0Gbs,7854
|
|
107
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/frame_totals.parquet,sha256=3QHze-H76vpdOLU7P1U8I57am-kv__AXrJgUQTWhbqQ,13417
|
|
108
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/ibo_samples.parquet,sha256=EVOwMY96B79-9XfQtYCNXlPzgKPqkQ96AqH-5CBmNFA,2650
|
|
109
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/indirect_args.parquet,sha256=i51x2N6xzTYW1XgYHuuW1puEGPWO_zfn4fZalLuQWXU,2916
|
|
110
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/passes.parquet,sha256=3LZdtBwnCsMTYMtmKOu7HZrt-LKP37NnC26UQlhb07U,12655
|
|
111
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/pixel_history.parquet,sha256=1qsrD62zUktk8blVbmQtLd_GXHHe8Sg7avj0Ej-ux8I,9021
|
|
112
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/post_vs_samples.parquet,sha256=TU1Vv1w_ichoHxU62WbFrsV4WykX8IfFRUySnAENnUo,4367
|
|
113
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/program_transitions.parquet,sha256=PRMNHTMY0fd_ClBclem6fQIANVurz3zY-2u8jomiGRo,2703
|
|
114
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/programs.parquet,sha256=02fiExQd-UU8Le59Cu5T6xp4m5ds83NHHZQduNUimWI,12022
|
|
115
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/render_targets.parquet,sha256=RxDMD5xQfCmfcBGllhJXucNd-87lLHTsFGUK2EKTqjg,11620
|
|
116
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/resource_creation.parquet,sha256=-4qNadpVnrUrFlHhxKAQBHCKsxNHNzjOaZon2ziTKs0,3552
|
|
117
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/rt_event_timeline.parquet,sha256=gEnecXgBdfLF6wgKg_EWEaOscSzpGx3DcpDJwZTQ7Cc,3587
|
|
118
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/samplers.parquet,sha256=5Jkf4cl6gKmdotlU1FO1rP4MqkvCoN0KUDLOj3_Nk20,8281
|
|
119
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/shaders.parquet,sha256=EhoO1umTTDgu2GsTWJKM-B09dEQjJtOx4ENBHD5pLys,12504
|
|
120
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/state_change_events.parquet,sha256=z1Vaze5LK4nwajHEBccELpx8GqyGinWnqnXx6jPKjbE,3823
|
|
121
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/texture_samples.parquet,sha256=HdAYZDlD_2H-CtpR5Z56DtFEPLHLUwZDX6zh8isO_Fc,4458
|
|
122
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/textures.parquet,sha256=0bY4-R-8OwE2LC37_SbY4qipviKXK_DOxhs2MZC4XAE,11530
|
|
123
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vbo_samples.parquet,sha256=IWxgDC1XRFqxx5NDYxhQjlgkNDsrOxMzAQVTnSM0UnM,8905
|
|
124
|
+
bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vertex_inputs.parquet,sha256=PNDTahleTWIdxv7gAVovWYaTaTBndPqmhUW_-YEucL8,5518
|
|
125
|
+
bobframes/replay/replay_main.py,sha256=Xf3we3GKGrCP9uUbe_mAstawAqIqykdONl4p6XNhpz8,96954
|
|
126
|
+
bobframes-0.1.0.dist-info/METADATA,sha256=lsMR4NCzm4BATc3f5B-czRB9WnUsm_vEkqbRjR1BsF8,6793
|
|
127
|
+
bobframes-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
128
|
+
bobframes-0.1.0.dist-info/entry_points.txt,sha256=NEYpiZNWy0k-3h8vDyxCBxp2yEwOgvekwmzYlEyXC-c,49
|
|
129
|
+
bobframes-0.1.0.dist-info/licenses/LICENSE,sha256=03hXmfO8te8gTlJFcSd40wqgdwLmHmTpz0-sqH9L9lA,1089
|
|
130
|
+
bobframes-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Siva Subramanyam, Mayhem Studios
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|