backspec 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. backspec-0.0.1/.gitignore +6 -0
  2. backspec-0.0.1/AGENTS.md +21 -0
  3. backspec-0.0.1/CLAUDE.md +1 -0
  4. backspec-0.0.1/DESIGN.md +282 -0
  5. backspec-0.0.1/LICENSE +21 -0
  6. backspec-0.0.1/PKG-INFO +430 -0
  7. backspec-0.0.1/README.md +410 -0
  8. backspec-0.0.1/docs/pipeline.svg +117 -0
  9. backspec-0.0.1/pyproject.toml +31 -0
  10. backspec-0.0.1/src/backspec/__init__.py +16 -0
  11. backspec-0.0.1/src/backspec/host/__init__.py +0 -0
  12. backspec-0.0.1/src/backspec/host/adapters/__init__.py +0 -0
  13. backspec-0.0.1/src/backspec/host/adapters/cache.py +103 -0
  14. backspec-0.0.1/src/backspec/host/adapters/cache_admin.py +64 -0
  15. backspec-0.0.1/src/backspec/host/adapters/capabilities_file.py +39 -0
  16. backspec-0.0.1/src/backspec/host/adapters/claude_code.py +77 -0
  17. backspec-0.0.1/src/backspec/host/adapters/codex.py +67 -0
  18. backspec-0.0.1/src/backspec/host/adapters/fake.py +39 -0
  19. backspec-0.0.1/src/backspec/host/adapters/filesystem.py +50 -0
  20. backspec-0.0.1/src/backspec/host/adapters/review_yaml.py +33 -0
  21. backspec-0.0.1/src/backspec/host/adapters/treesitter.py +130 -0
  22. backspec-0.0.1/src/backspec/host/cli.py +313 -0
  23. backspec-0.0.1/src/backspec/host/composition.py +211 -0
  24. backspec-0.0.1/src/backspec/kernel/__init__.py +0 -0
  25. backspec-0.0.1/src/backspec/kernel/llm.py +64 -0
  26. backspec-0.0.1/src/backspec/kernel/prompts.py +10 -0
  27. backspec-0.0.1/src/backspec/kernel/templates.py +12 -0
  28. backspec-0.0.1/src/backspec/kernel/text.py +23 -0
  29. backspec-0.0.1/src/backspec/kernel/usage.py +50 -0
  30. backspec-0.0.1/src/backspec/modules/__init__.py +0 -0
  31. backspec-0.0.1/src/backspec/modules/capabilities/__init__.py +0 -0
  32. backspec-0.0.1/src/backspec/modules/capabilities/domain.py +108 -0
  33. backspec-0.0.1/src/backspec/modules/capabilities/facade.py +48 -0
  34. backspec-0.0.1/src/backspec/modules/capabilities/ports.py +21 -0
  35. backspec-0.0.1/src/backspec/modules/capabilities/use_cases.py +63 -0
  36. backspec-0.0.1/src/backspec/modules/discovery/__init__.py +0 -0
  37. backspec-0.0.1/src/backspec/modules/discovery/domain.py +87 -0
  38. backspec-0.0.1/src/backspec/modules/discovery/facade.py +16 -0
  39. backspec-0.0.1/src/backspec/modules/discovery/ports.py +14 -0
  40. backspec-0.0.1/src/backspec/modules/discovery/use_cases.py +19 -0
  41. backspec-0.0.1/src/backspec/modules/evidence/__init__.py +0 -0
  42. backspec-0.0.1/src/backspec/modules/evidence/domain.py +276 -0
  43. backspec-0.0.1/src/backspec/modules/evidence/facade.py +24 -0
  44. backspec-0.0.1/src/backspec/modules/evidence/ports.py +12 -0
  45. backspec-0.0.1/src/backspec/modules/evidence/use_cases.py +128 -0
  46. backspec-0.0.1/src/backspec/modules/extraction/__init__.py +0 -0
  47. backspec-0.0.1/src/backspec/modules/extraction/facade.py +6 -0
  48. backspec-0.0.1/src/backspec/modules/extraction/use_cases.py +228 -0
  49. backspec-0.0.1/src/backspec/modules/lint/__init__.py +0 -0
  50. backspec-0.0.1/src/backspec/modules/lint/domain.py +152 -0
  51. backspec-0.0.1/src/backspec/modules/lint/facade.py +7 -0
  52. backspec-0.0.1/src/backspec/modules/lint/use_cases.py +16 -0
  53. backspec-0.0.1/src/backspec/modules/report/__init__.py +0 -0
  54. backspec-0.0.1/src/backspec/modules/report/domain.py +128 -0
  55. backspec-0.0.1/src/backspec/modules/report/dto.py +92 -0
  56. backspec-0.0.1/src/backspec/modules/report/facade.py +11 -0
  57. backspec-0.0.1/src/backspec/modules/report/renderers.py +220 -0
  58. backspec-0.0.1/src/backspec/modules/report/use_cases.py +127 -0
  59. backspec-0.0.1/src/backspec/modules/requirements/__init__.py +0 -0
  60. backspec-0.0.1/src/backspec/modules/requirements/domain.py +272 -0
  61. backspec-0.0.1/src/backspec/modules/requirements/facade.py +26 -0
  62. backspec-0.0.1/src/backspec/modules/requirements/use_cases.py +135 -0
  63. backspec-0.0.1/src/backspec/modules/review/__init__.py +0 -0
  64. backspec-0.0.1/src/backspec/modules/review/domain.py +129 -0
  65. backspec-0.0.1/src/backspec/modules/review/facade.py +32 -0
  66. backspec-0.0.1/src/backspec/modules/review/ports.py +15 -0
  67. backspec-0.0.1/src/backspec/modules/review/use_cases.py +89 -0
  68. backspec-0.0.1/src/backspec/modules/staleness/__init__.py +0 -0
  69. backspec-0.0.1/src/backspec/modules/staleness/domain.py +75 -0
  70. backspec-0.0.1/src/backspec/modules/staleness/facade.py +17 -0
  71. backspec-0.0.1/src/backspec/modules/staleness/ports.py +7 -0
  72. backspec-0.0.1/src/backspec/modules/staleness/use_cases.py +39 -0
  73. backspec-0.0.1/src/backspec/modules/triage/__init__.py +0 -0
  74. backspec-0.0.1/src/backspec/modules/triage/domain.py +144 -0
  75. backspec-0.0.1/src/backspec/modules/triage/facade.py +24 -0
  76. backspec-0.0.1/src/backspec/modules/triage/use_cases.py +79 -0
  77. backspec-0.0.1/src/backspec/prompts/assess.md +32 -0
  78. backspec-0.0.1/src/backspec/prompts/assign.md +18 -0
  79. backspec-0.0.1/src/backspec/prompts/consolidate.md +52 -0
  80. backspec-0.0.1/src/backspec/prompts/observe.md +52 -0
  81. backspec-0.0.1/src/backspec/prompts/orient.md +33 -0
  82. backspec-0.0.1/src/backspec/prompts/synthesise.md +97 -0
  83. backspec-0.0.1/src/backspec/prompts/triage.md +34 -0
  84. backspec-0.0.1/src/backspec/py.typed +0 -0
  85. backspec-0.0.1/src/backspec/templates/libre-baskerville-400.woff2 +0 -0
  86. backspec-0.0.1/src/backspec/templates/libre-baskerville-700.woff2 +0 -0
  87. backspec-0.0.1/src/backspec/templates/libre-baskerville-OFL.txt +93 -0
  88. backspec-0.0.1/src/backspec/templates/report.html +336 -0
  89. backspec-0.0.1/tests/test_architecture.py +65 -0
  90. backspec-0.0.1/tests/test_budget.py +225 -0
  91. backspec-0.0.1/tests/test_cache_command.py +84 -0
  92. backspec-0.0.1/tests/test_capabilities_file.py +159 -0
  93. backspec-0.0.1/tests/test_codex.py +109 -0
  94. backspec-0.0.1/tests/test_consolidate.py +108 -0
  95. backspec-0.0.1/tests/test_coverage_command.py +97 -0
  96. backspec-0.0.1/tests/test_discovery.py +46 -0
  97. backspec-0.0.1/tests/test_evidence.py +79 -0
  98. backspec-0.0.1/tests/test_html.py +74 -0
  99. backspec-0.0.1/tests/test_lint.py +163 -0
  100. backspec-0.0.1/tests/test_pipeline.py +173 -0
  101. backspec-0.0.1/tests/test_renderers.py +239 -0
  102. backspec-0.0.1/tests/test_reuse.py +222 -0
  103. backspec-0.0.1/tests/test_review.py +232 -0
  104. backspec-0.0.1/tests/test_status.py +105 -0
  105. backspec-0.0.1/tests/test_syntax.py +351 -0
  106. backspec-0.0.1/tests/test_triage.py +296 -0
@@ -0,0 +1,6 @@
1
+ __pycache__/
2
+ *.egg-info/
3
+ .venv/
4
+ dist/
5
+ .pytest_cache/
6
+ .backspec/
@@ -0,0 +1,21 @@
1
+ # Working on backspec
2
+
3
+ backspec reads a codebase and writes down the requirements it implements, with citations that are
4
+ checked in code. Read `README.md` first.
5
+
6
+ - One module per capability under `src/backspec/modules/<capability>/`: `domain.py` (rules and
7
+ models, no I/O), `ports.py` (what it needs from outside, as Protocols), `use_cases.py`, and a
8
+ small `facade.py`. Models that combine several modules go in `dto.py`.
9
+ - A domain imports only `backspec.kernel` and its own domain. A module reaches another module only
10
+ through that module's `facade`. Nothing under `modules/` or `kernel/` imports `backspec.host`.
11
+ - Adapters (file system, model backends, cache, YAML files) and wiring live in `src/backspec/host/`.
12
+ `host/cli.py` holds no logic: it turns flags into a `Config` and prints what comes back.
13
+ - The program drives and the model only reads and writes statements. Anything that can be
14
+ checked or computed in code is, never asked of a model. A model never writes a citation that
15
+ the program could copy.
16
+ - Nothing is dropped silently. What is rejected, skipped, unmatched or failed is recorded in the
17
+ result with its reason.
18
+ - Tests live flat in `tests/` as `test_*.py` and run against `backspec.host.adapters.fake.FakeLLM`.
19
+ Name a test for the behaviour it shows.
20
+ - Change `PROMPT_VERSION` in `src/backspec/kernel/prompts.py` whenever a prompt changes.
21
+ - Run `python3 -m pytest -q` before you finish. It must pass, including `tests/test_architecture.py`.
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -0,0 +1,282 @@
1
+ <!-- Source: https://designmd.ai/chef/thoughtstream (downloaded 2026-11-13). The HTML report in
2
+ src/backspec/templates/report.html follows this file. The report adds a dark palette, which this file does not define. -->
3
+
4
+ # ThoughtStream
5
+
6
+ Minimal, zen, distraction-free.
7
+
8
+ ## Overview
9
+
10
+ ThoughtStream is a contemplative design system built for minimalist personal blogs and newsletters. It embraces generous white space as a design element, letting words breathe and ideas settle. The warm, neutral palette recedes behind content, creating a reading experience that feels like a well-set page in a quiet room. Every decision prioritizes reading flow and typographic clarity over ornament.
11
+
12
+ ## Colors
13
+
14
+ ### Brand Palette
15
+
16
+ | Token | Hex | Role |
17
+ |-----------|-----------|--------------------------------------------|
18
+ | Primary | `#78716C` | Stone — anchors UI elements, links, icons |
19
+ | Secondary | `#A8A29E` | Sage — supporting accents, dividers |
20
+ | Tertiary | `#1C1917` | Warm Black — emphasis, strong headings |
21
+
22
+ ### Surface Palette
23
+
24
+ | Token | Hex | Role |
25
+ |----------------|-----------|----------------------------------------|
26
+ | Background | `#FAFAF9` | Warm white page background |
27
+ | Surface | `#F5F5F4` | Card and section backgrounds |
28
+ | Surface Raised | `#EFEDEB` | Hover states, subtle callout blocks |
29
+
30
+ ### Content Palette
31
+
32
+ | Token | Hex | Role |
33
+ |----------------|-----------|---------------------------------------|
34
+ | Text Primary | `#1C1917` | Body copy, headings |
35
+ | Text Secondary | `#57534E` | Bylines, metadata, captions |
36
+ | Text Tertiary | `#A8A29E` | Placeholders, disabled labels |
37
+
38
+ ### Border Palette
39
+
40
+ | Token | Hex |
41
+ |---------------|-----------|
42
+ | Border Subtle | `#E7E5E4` |
43
+ | Border Medium | `#D6D3D1` |
44
+ | Border Strong | `#A8A29E` |
45
+
46
+ ### Semantic Colors
47
+
48
+ | Token | Hex |
49
+ |---------|-----------|
50
+ | Success | `#65A30D` |
51
+ | Warning | `#CA8A04` |
52
+ | Error | `#DC2626` |
53
+ | Info | `#78716C` |
54
+
55
+ ## Typography
56
+
57
+ ### Font Stack
58
+
59
+ | Role | Font |
60
+ |------------------|---------------------------------------------------|
61
+ | Display/Headings | Libre Baskerville, Georgia, 'Times New Roman', serif |
62
+ | UI/Body | Inter, -apple-system, 'Segoe UI', Helvetica, sans-serif |
63
+ | Mono/Code | Source Code Pro, 'Fira Code', Consolas, monospace |
64
+
65
+ ### Type Scale
66
+
67
+ | Level | Font | Size | Weight | Line Height | Letter Spacing | Usage |
68
+ |--------------|-------------------|--------|--------|-------------|----------------|------------------------------|
69
+ | Display | Libre Baskerville | 40px | 700 | 1.2 | -0.02em | Hero article titles |
70
+ | Headline | Libre Baskerville | 30px | 700 | 1.3 | -0.015em | Post titles |
71
+ | Subhead | Libre Baskerville | 22px | 400 | 1.4 | -0.01em | Section headings |
72
+ | Body Large | Inter | 20px | 400 | 1.75 | 0 | Featured paragraph, lede |
73
+ | Body | Inter | 17px | 400 | 1.8 | 0 | Default reading text |
74
+ | Body Small | Inter | 15px | 400 | 1.7 | 0 | Sidebar text, footnotes |
75
+ | Caption | Inter | 13px | 400 | 1.5 | 0.01em | Image captions, dates |
76
+ | Overline | Inter | 11px | 600 | 1.4 | 0.08em | Category labels |
77
+ | Code | Source Code Pro | 15px | 400 | 1.7 | 0 | Inline code, code blocks |
78
+
79
+ ## Spacing
80
+
81
+ | Property | Value |
82
+ |-----------------------------|---------|
83
+ | Base unit | 12px |
84
+ | Scale | 12, 24, 36, 48, 60, 72, 96, 120 |
85
+ | Component padding — small | 12px |
86
+ | Component padding — medium | 24px |
87
+ | Component padding — large | 48px |
88
+ | Section spacing — mobile | 60px |
89
+ | Section spacing — tablet | 84px |
90
+ | Section spacing — desktop | 120px |
91
+
92
+ ## Border Radius
93
+
94
+ | Token | Value | Usage |
95
+ |--------|--------|----------------------------------|
96
+ | None | 0px | All elements — default |
97
+ | Small | 0px | Not used |
98
+ | Medium | 0px | Not used |
99
+ | Large | 0px | Not used |
100
+ | XL | 0px | Not used |
101
+ | Full | 9999px | Avatars only |
102
+
103
+ All interactive and container elements use sharp, geometric edges (0px radius). Only avatars use full rounding.
104
+
105
+ ## Shadows
106
+
107
+ **Philosophy:** ThoughtStream is completely flat. No shadows are used. Separation is achieved exclusively through borders and white space.
108
+
109
+ | Level | CSS Value | Usage |
110
+ |---------|-----------|---------------------------------|
111
+ | Subtle | `none` | — |
112
+ | Medium | `none` | — |
113
+ | Large | `none` | — |
114
+ | Overlay | `none` | — |
115
+
116
+ **Special — Focus Ring:** `0 0 0 2px #FAFAF9, 0 0 0 4px #78716C` — used for keyboard focus indicators.
117
+
118
+ ## Components
119
+
120
+ ### Buttons
121
+
122
+ **Primary**
123
+ - Background: `#78716C`
124
+ - Text: `#FAFAF9`
125
+ - Border: `1px solid #78716C`
126
+ - Padding: 12px 24px
127
+ - Font: Inter, 15px, weight 600
128
+ - Radius: 0px
129
+ - Hover: Background `#57534E`
130
+ - Active: Background `#44403C`
131
+
132
+ **Secondary**
133
+ - Background: transparent
134
+ - Text: `#78716C`
135
+ - Border: `1px solid #D6D3D1`
136
+ - Padding: 12px 24px
137
+ - Font: Inter, 15px, weight 600
138
+ - Radius: 0px
139
+ - Hover: Background `#F5F5F4`
140
+ - Active: Background `#E7E5E4`
141
+
142
+ **Ghost**
143
+ - Background: transparent
144
+ - Text: `#78716C`
145
+ - Border: none
146
+ - Padding: 12px 24px
147
+ - Font: Inter, 15px, weight 600
148
+ - Radius: 0px
149
+ - Hover: Background `#F5F5F4`
150
+ - Active: Background `#E7E5E4`
151
+
152
+ **Destructive**
153
+ - Background: `#DC2626`
154
+ - Text: `#FAFAF9`
155
+ - Border: `1px solid #DC2626`
156
+ - Padding: 12px 24px
157
+ - Font: Inter, 15px, weight 600
158
+ - Radius: 0px
159
+ - Hover: Background `#B91C1C`
160
+ - Active: Background `#991B1B`
161
+
162
+ **Sizes:** Small 8px 16px / 13px, Medium 12px 24px / 15px, Large 16px 36px / 17px
163
+
164
+ **Disabled:** Opacity 0.4, cursor not-allowed, no hover change.
165
+
166
+ ### Cards
167
+
168
+ **Default**
169
+ - Background: `#FAFAF9`
170
+ - Border: `1px solid #E7E5E4`
171
+ - Radius: 0px
172
+ - Padding: 36px
173
+ - Shadow: none
174
+ - Hover: Border `#D6D3D1`
175
+
176
+ **Elevated**
177
+ - Background: `#F5F5F4`
178
+ - Border: `1px solid #D6D3D1`
179
+ - Radius: 0px
180
+ - Padding: 36px
181
+ - Shadow: none
182
+
183
+ ### Inputs
184
+
185
+ **Text Input**
186
+ - Height: 48px
187
+ - Background: `#FAFAF9`
188
+ - Border: `1px solid #D6D3D1`
189
+ - Radius: 0px
190
+ - Padding: 12px 16px
191
+ - Font: Inter, 15px, weight 400
192
+ - Text color: `#1C1917`
193
+ - Placeholder color: `#A8A29E`
194
+ - Focus: Border `#78716C`, ring `0 0 0 2px #FAFAF9, 0 0 0 4px #78716C`
195
+ - Error: Border `#DC2626`
196
+ - Disabled: Background `#F5F5F4`, opacity 0.5
197
+
198
+ **Label:** Inter, 13px, weight 600, color `#57534E`, margin-bottom 8px.
199
+
200
+ **Helper Text:** Inter, 13px, weight 400, color `#A8A29E`, margin-top 6px. Error helper color `#DC2626`.
201
+
202
+ ### Chips
203
+
204
+ **Filter Chip**
205
+ - Background: transparent
206
+ - Border: `1px solid #D6D3D1`
207
+ - Radius: 0px
208
+ - Padding: 6px 14px
209
+ - Font: Inter, 13px, weight 500
210
+ - Text: `#57534E`
211
+ - Selected: Background `#78716C`, text `#FAFAF9`, border `#78716C`
212
+
213
+ **Status Chip**
214
+ - Padding: 4px 12px
215
+ - Font: Inter, 11px, weight 600, uppercase
216
+ - Radius: 0px
217
+ - Success: Background `#F0FDF4`, text `#65A30D`, border `1px solid #BBF7D0`
218
+ - Warning: Background `#FEFCE8`, text `#CA8A04`, border `1px solid #FEF08A`
219
+ - Error: Background `#FEF2F2`, text `#DC2626`, border `1px solid #FECACA`
220
+
221
+ ### Lists
222
+
223
+ **Default List Item**
224
+ - Padding: 16px 0
225
+ - Border bottom: `1px solid #E7E5E4`
226
+ - Font: Inter, 15px, weight 400
227
+ - Text: `#1C1917`
228
+ - Secondary text: `#A8A29E`, 13px
229
+ - Hover: Background `#F5F5F4`
230
+ - Active: Background `#EFEDEB`
231
+ - Leading element: 20px icon, color `#78716C`
232
+
233
+ ### Checkboxes
234
+
235
+ - Size: 18px
236
+ - Border: `1.5px solid #D6D3D1`
237
+ - Radius: 0px
238
+ - Background: `#FAFAF9`
239
+ - Checked: Background `#78716C`, border `#78716C`, checkmark `#FAFAF9`
240
+ - Indeterminate: Background `#78716C`, dash `#FAFAF9`
241
+ - Hover: Border `#78716C`
242
+ - Focus: Ring `0 0 0 2px #FAFAF9, 0 0 0 4px #78716C`
243
+ - Disabled: Opacity 0.4
244
+ - Label: Inter, 15px, weight 400, margin-left 10px
245
+
246
+ ### Radio Buttons
247
+
248
+ - Size: 18px
249
+ - Border: `1.5px solid #D6D3D1`
250
+ - Radius: 9999px
251
+ - Background: `#FAFAF9`
252
+ - Selected: Border `#78716C`, inner dot `#78716C` (8px)
253
+ - Hover: Border `#78716C`
254
+ - Focus: Ring `0 0 0 2px #FAFAF9, 0 0 0 4px #78716C`
255
+ - Disabled: Opacity 0.4
256
+ - Label: Inter, 15px, weight 400, margin-left 10px
257
+
258
+ ### Tooltips
259
+
260
+ - Background: `#1C1917`
261
+ - Text: `#FAFAF9`
262
+ - Font: Inter, 13px, weight 500
263
+ - Padding: 8px 14px
264
+ - Radius: 0px
265
+ - Max width: 240px
266
+ - Arrow: 6px, same background
267
+ - Delay: 300ms enter, 0ms leave
268
+ - Shadow: none
269
+
270
+ ## Do's and Don'ts
271
+
272
+ 1. **Do** let white space dominate — margins and padding should feel generous and contemplative.
273
+ 2. **Do** keep headlines in Libre Baskerville for literary warmth; never use it for UI labels.
274
+ 3. **Do** use `#E7E5E4` hairline borders to separate sections instead of shadows or color blocks.
275
+ 4. **Don't** add decorative elements, gradients, or illustrations that compete with the text.
276
+ 5. **Don't** use more than two font weights on a single screen — restraint is the ethos.
277
+ 6. **Do** set body text at 17px or above with 1.8 line height for comfortable long-form reading.
278
+ 7. **Don't** use color to convey meaning alone — pair with text or icons for accessibility.
279
+ 8. **Do** maintain a maximum content width of 680px for body text to preserve optimal reading measure.
280
+ 9. **Don't** introduce rounded corners — sharp edges reinforce the clean geometric identity.
281
+ 10. **Do** favor vertical rhythm aligned to the 12px base unit across all spacing decisions.
282
+
backspec-0.0.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Adi Eyal
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.