@asrunjs/asrun 0.10.0 → 0.12.0

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 (71) hide show
  1. package/.claude/commands/explore-case.md +2 -1
  2. package/.claude/commands/gen-spec.md +2 -1
  3. package/.claude/commands/heal-spec.md +2 -1
  4. package/.claude/commands/make-case.md +2 -1
  5. package/.claude/skills/exploring-cases/SKILL.md +59 -64
  6. package/.claude/skills/exploring-cases/references/case-rules.md +5 -0
  7. package/.claude/skills/exploring-cases/references/notes.md +87 -0
  8. package/.claude/skills/exploring-cases/references/open-questions.md +8 -0
  9. package/.claude/skills/exploring-cases/references/readiness.md +3 -2
  10. package/.claude/skills/exploring-cases/references/tools.md +34 -0
  11. package/.claude/skills/exploring-cases/references/user-handoff.md +13 -9
  12. package/.claude/skills/generating-specs/SKILL.md +61 -47
  13. package/.claude/skills/generating-specs/references/conventions.md +6 -2
  14. package/.claude/skills/making-cases/SKILL.md +12 -5
  15. package/.claude/skills/making-cases/references/writes-and-email.md +5 -2
  16. package/AGENTS.md +30 -14
  17. package/README.md +16 -11
  18. package/bin/asrun.mjs +1 -0
  19. package/dist/lib/case-doc.d.ts +1 -1
  20. package/dist/lib/config.d.ts +26 -0
  21. package/dist/lib/config.js +51 -0
  22. package/dist/lib/explore-notes.d.ts +74 -0
  23. package/dist/lib/explore-notes.js +242 -0
  24. package/dist/lib/fixtures.d.ts +1 -1
  25. package/dist/lib/fixtures.js +7 -4
  26. package/dist/lib/paths.d.ts +2 -0
  27. package/dist/lib/paths.js +2 -0
  28. package/dist/lib/records.d.ts +17 -2
  29. package/dist/lib/records.js +32 -2
  30. package/dist/lib/rules.d.ts +57 -0
  31. package/dist/lib/rules.js +140 -0
  32. package/dist/scripts/cleanup.js +10 -1
  33. package/dist/scripts/cli.js +17 -2
  34. package/dist/scripts/doctor.js +27 -48
  35. package/dist/scripts/explore-notes.d.ts +1 -0
  36. package/dist/scripts/explore-notes.js +131 -0
  37. package/dist/scripts/lint-specs.js +23 -1
  38. package/dist/scripts/rules.d.ts +1 -0
  39. package/dist/scripts/rules.js +148 -0
  40. package/docs/agents/case-format.md +9 -5
  41. package/docs/agents/framework-dev.md +4 -0
  42. package/docs/ai-workflow.md +30 -13
  43. package/docs/cases.md +14 -10
  44. package/docs/commands.md +33 -4
  45. package/docs/install.md +2 -1
  46. package/docs/theme-guide.html +79 -2
  47. package/docs/troubleshooting.md +11 -2
  48. package/docs/web-ui.md +40 -12
  49. package/package.json +3 -1
  50. package/templates/.claude/commands/explore-case.md +3 -1
  51. package/templates/.claude/commands/gen-spec.md +3 -1
  52. package/templates/.claude/commands/heal-spec.md +3 -1
  53. package/templates/.claude/commands/make-case.md +3 -1
  54. package/templates/AGENTS.md +17 -8
  55. package/templates/cases/_template.md +3 -3
  56. package/templates/package.json +5 -0
  57. package/ui/dist/assets/{dist-BmWaNjqO.js → dist-BX88bMYN.js} +1 -1
  58. package/ui/dist/assets/{dist-2msWI-5M.js → dist-Bfv586Or.js} +1 -1
  59. package/ui/dist/assets/{dist-e-KhTWHJ.js → dist-BjlbPf3t.js} +1 -1
  60. package/ui/dist/assets/{dist-BVvHVJ3N.js → dist-CJnqQMvX.js} +1 -1
  61. package/ui/dist/assets/{dist-BMfJatHo.js → dist-CaAcCNRS.js} +1 -1
  62. package/ui/dist/assets/{dist-sfZKBSMm.js → dist-Clj0wGFy.js} +1 -1
  63. package/ui/dist/assets/{dist-J36xayOv.js → dist-D8TUm3Ai.js} +1 -1
  64. package/ui/dist/assets/{dist-4U_gPHXf.js → dist-DUDqh_3e.js} +1 -1
  65. package/ui/dist/assets/{dist-BwNz_xW2.js → dist-DkAx5a-Y.js} +1 -1
  66. package/ui/dist/assets/{dist-wjB7g6OJ.js → dist-cuboTVh-.js} +1 -1
  67. package/ui/dist/assets/index-DaUQORCy.js +353 -0
  68. package/ui/dist/assets/index-j3W4BBCj.css +2 -0
  69. package/ui/dist/index.html +2 -2
  70. package/ui/dist/assets/index-CGbRJT3b.js +0 -348
  71. package/ui/dist/assets/index-CI0i0LWc.css +0 -2
package/docs/commands.md CHANGED
@@ -10,6 +10,7 @@ thin wrappers, so `pnpm asrun`, `pnpm signin` and the rest work as below. The sa
10
10
  | Install the framework in a project | `pnpm dlx @asrunjs/asrun init --install` |
11
11
  | Upgrade the framework and migrate the workspace | `pnpm asrun upgrade [--version <v>] [--dry-run]` |
12
12
  | Prepare or check the workspace | `pnpm asrun init [--update]`, `pnpm asrun doctor` |
13
+ | See the effective rules and project settings | `pnpm asrun rules [--json] [--case <case-id>]` |
13
14
  | See or apply the workspace migrations after a manual install | `pnpm asrun migrate [--list] [--dry-run]` |
14
15
  | Start over with fresh dependencies | `pnpm asrun reset [--yes] [--state] [--lockfile]` |
15
16
  | Start the web UI | `pnpm go`, `pnpm ui`, `pnpm ui:dev` |
@@ -18,6 +19,7 @@ thin wrappers, so `pnpm asrun`, `pnpm signin` and the rest work as below. The sa
18
19
  | Run tests | `pnpm asrun --env <env> [filters]` |
19
20
  | Open the last report | `pnpm report` |
20
21
  | Look around a page as a profile | `pnpm explore <profile-id> [path]` |
22
+ | See or validate what an exploration recorded for a case | `pnpm explore:notes <case-id> [--profile <id>] [--json] [--check]` |
21
23
  | Read what the last report says about a case | `pnpm heal:evidence --case <case-id> --env <env>` |
22
24
  | List or forget test data that could not be removed | `pnpm cleanup --env <env> [--forget]` |
23
25
  | Create or validate a case | `pnpm case:new <id>`, `pnpm case:check [case-id]` |
@@ -141,6 +143,9 @@ pnpm pdf:render report.pdf --out .explore/targets/header-logo --corner top-left
141
143
 
142
144
  ```bash
143
145
  pnpm explore example-staging /app/home
146
+ pnpm explore:notes conduit/header-navigation
147
+ pnpm explore:notes conduit/header-navigation --profile example-staging --json
148
+ pnpm explore:notes conduit/header-navigation --check
144
149
  pnpm heal:evidence --case header-logo --env staging
145
150
  ```
146
151
 
@@ -149,6 +154,28 @@ are saved to `~/Downloads` and never overwrite an existing file. `heal:evidence`
149
154
  step, error, call log and screenshots for a case, and whether the report is stale; it is what `/heal-spec` reads
150
155
  first.
151
156
 
157
+ `explore:notes` reads the **exploration note** that `/explore-case` writes for a case under
158
+ `.explore/notes/<case-id>/<profile-id>.json`. It prints one line per profile (fresh or stale, the steps and targets it
159
+ covers) and `--json` prints the parsed notes for a run that reads them. A note is local, git-ignored and optional:
160
+ `/gen-spec` uses a fresh one to verify the locators and request patterns instead of rediscovering them, and replays the
161
+ case when it is missing or stale. `--check` fails on a malformed note and warns about a stale one (it prints the current
162
+ `caseSha256`); `--hash` prints that hash. Deleting `.explore/notes/` is always safe.
163
+
164
+ ## Rules
165
+
166
+ ```bash
167
+ pnpm asrun rules
168
+ pnpm asrun rules --json
169
+ pnpm asrun rules --case conduit/publish-article
170
+ ```
171
+
172
+ Prints the effective rules of the workspace: the framework baseline, the project's `AGENTS.md` §2 table (id, effect
173
+ and text), and the project settings the framework needs at run time (`testDataPrefix` and the resulting data-name
174
+ format). `--case <id>` adds that case's `## Rules`. `--json` is the machine-readable form the AI steps read before
175
+ they apply anything. A §2 row that is invalid — an unknown baseline id, a `[non-negotiable]` rule, a duplicate id, a
176
+ project id (`P1`, ...) without `adds` — is printed as an error and the command exits 1; `doctor` shows the same errors.
177
+ The point is that "§2 wins over the baseline" is a fact the tool states, not a judgment an agent has to make.
178
+
152
179
  ## Cleanup
153
180
 
154
181
  ```bash
@@ -156,10 +183,12 @@ pnpm cleanup --env staging
156
183
  pnpm cleanup --env staging --forget
157
184
  ```
158
185
 
159
- A write case registers everything it creates (named `[asrun] ...`) and removes it after the test, also after a
160
- failure. Whatever could not be removed is listed in the report and by `cleanup`. Delete it by hand in the product,
161
- then run `--forget` so it is not listed again. `--env` is required. `cleanup` is about test data in the product;
162
- `pnpm asrun reset` (below) is the command that removes workspace files and dependencies.
186
+ A write case registers everything it creates (named with the project's prefix and a run stamp, for example
187
+ `[asrun] Draft CMA (2026-11-09 12-34-56)`) and removes it after the test, also after a failure. Whatever could not be
188
+ removed is listed in the report and by `cleanup`. Delete it by hand in the product, then run `--forget` so it is not
189
+ listed again. The run stamp matches the report folder and the ledger entry, so one run's leftovers are easy to find.
190
+ `--env` is required. `cleanup` is about test data in the product; `pnpm asrun reset` (below) is the command that
191
+ removes workspace files and dependencies.
163
192
 
164
193
  ## Web UI
165
194
 
package/docs/install.md CHANGED
@@ -163,7 +163,8 @@ Run it after changing profiles, rules or overrides, and after an update. It chec
163
163
  - that `.gitignore` ignores `.auth/` and `reports/`;
164
164
  - whether the installed version is behind the package's templates, and whether `dist/` is out of date;
165
165
  - the workspace migrations: the baseline in `.asrun.json`, what still applies, and the manual steps left open;
166
- - the project rule table in `AGENTS.md` §2 (unknown ids, a missing `Effect`, a non-negotiable rule);
166
+ - the project rule table in `AGENTS.md` §2 (unknown ids, a missing `Effect`, a duplicate id, a non-negotiable rule, a
167
+ project id without `adds`) and the project settings in `package.json` `"asrun"` (for example `testDataPrefix`);
167
168
  - the framework skills and the project overrides under `.claude/skills/<skill>.md`, and lists the ones it sees.
168
169
 
169
170
  ## Which workspace a command runs against
@@ -144,6 +144,13 @@
144
144
  }
145
145
  .btn:hover { transform: translateY(-1px); }
146
146
  .btn[disabled] { opacity: .5; cursor: not-allowed; box-shadow: none; transform: none; }
147
+ /* A button disabled because something must happen first: gold with a lock, not faded (see "Blocked" below). */
148
+ .btn[disabled][data-blocked] {
149
+ opacity: 1;
150
+ background: var(--gold-bg);
151
+ color: var(--gold-deep);
152
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--gold-deep) 45%, transparent);
153
+ }
147
154
  .btn svg { flex: none; }
148
155
  .btn-primary, .btn-success {
149
156
  color: #fff;
@@ -330,6 +337,7 @@
330
337
  <a href="#icons">Icons</a>
331
338
  <a href="#tooltips">Tooltips</a>
332
339
  <a href="#editor">Markdown editor</a>
340
+ <a href="#document-tabs">Document tabs</a>
333
341
  <a href="#surfaces">Surfaces</a>
334
342
  <a href="#sections">Sidebar sections</a>
335
343
  <a href="#checklist">Checklist</a>
@@ -517,6 +525,11 @@
517
525
  <button class="btn btn-info">Full screen</button>
518
526
  <button class="btn btn-danger">Cancel</button>
519
527
  <button class="btn btn-secondary" disabled>Disabled</button>
528
+ <button class="btn btn-secondary" disabled data-blocked>
529
+ <!-- Lock icon from Feather (https://feathericons.com/) -->
530
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>
531
+ Blocked
532
+ </button>
520
533
  </div>
521
534
  <table>
522
535
  <thead><tr><th>Variant</th><th>Use for</th></tr></thead>
@@ -530,7 +543,12 @@
530
543
  <tr><td><code>invalid</code> (red field)</td><td>A control that is required and still empty, drawn as a button because it opens a panel instead of a native list (the environment picker of the case toolbar). The same red as an invalid dropdown; it is not an action.</td></tr>
531
544
  </tbody>
532
545
  </table>
533
- <p class="small muted">Hover lifts the button 1px; disabled is 50% opacity with no shadow. With an icon, add <code>gap-1.5</code> to the button.</p>
546
+ <p class="small muted">Hover lifts the button 1px. Disabled has two looks, and they must not be mixed up: a control with
547
+ nothing to do yet, or one that waits for the app (a running job, a pending request), is 50% opacity with no shadow;
548
+ a control that is disabled because <b>you</b> must do something first (save the file, choose an environment, tick a
549
+ profile, fix a name) is <b>blocked</b>: the gold tint above, a Feather <code>Lock</code> icon instead of its usual icon, and a
550
+ tooltip that says what to do (<code>blocked()</code> in <code>components/status.tsx</code> sets
551
+ <code>data-blocked</code>). With an icon, add <code>gap-1.5</code> to the button.</p>
534
552
 
535
553
  <h2 id="badges">Badges</h2>
536
554
  <div class="demo">
@@ -833,7 +851,10 @@ import {FilterChips} from '../components/filter-chips';
833
851
  Write a plain <code>title="..."</code> on the element. <code>lib/tooltip.ts</code> (tippy.js) turns every <code>title</code> into
834
852
  a dark tooltip with an arrow on hover, so the browser's native tooltip never shows. Do not set up tippy per component and do not
835
853
  use a <code>title</code> on an <code>iframe</code>. Each <code>\n</code> in the text starts a new paragraph, and a line that starts with <code># </code> is a bold heading. Keep it short: a heading, then one or two sentences. Never put a command line or other long raw text in a tooltip. Disabled buttons and inputs get the
836
- tooltip too, so a <code>title</code> that says why something is disabled works. The box is styled by <code>.tippy-box[data-theme~='tip']</code>
854
+ tooltip too, so a <code>title</code> that says why something is disabled works. Point at the control, not at a
855
+ position: never write "above", "below", "left" or "right", because a layout change silently makes it wrong; name the
856
+ control or the bar instead ("in the AI toolbar below the tabs"). A tooltip of a disabled control says what to do
857
+ first, and when it is <b>blocked</b> (see the buttons above) the lock and the gold say so without opening it. The box is styled by <code>.tippy-box[data-theme~='tip']</code>
837
858
  in <code>index.css</code>; the keyword help of the case editor and the ? help of the case panel have their own
838
859
  <code>inkstone</code> theme, and both open on click (see <code>ui/web/src/lib/section-help.ts</code>).
839
860
  A target card is too long for a tooltip: it opens as a window (<code>components/case-panel/target-card-dialog.tsx</code>).
@@ -959,6 +980,62 @@ import {FilterChips} from '../components/filter-chips';
959
980
  <li><b>Every expand/collapse animates.</b> Use <code>Collapse</code> from <code>components/collapse.tsx</code> (height and fade, 200ms, <code>ease-out</code>) for content that appears and disappears, and rotate the chevron with <code>transition-transform duration-200</code> instead of swapping two icons. Always add <code>motion-reduce:transition-none</code>. Turn transitions off while the user drags a resize handle.</li>
960
981
  </ul>
961
982
 
983
+ <h2 id="document-tabs">Document tabs</h2>
984
+ <p class="muted">
985
+ A page that holds more than one file of the same thing puts them in a tab strip: <code>DocumentTabs</code> in
986
+ <code>pages/cases.tsx</code>, where <b>Case</b> is the source a person writes and <b>Spec</b> what a run
987
+ generated from it. The strip is the only place the file names appear. The bar under it carries the tools of the
988
+ file on screen (<code>WorkbenchControls</code>, the layout and pane switches), never a second copy of the name,
989
+ and <b>Save</b> / <b>Discard</b> always sit at the same end of the strip and act on the file on screen.
990
+ </p>
991
+ <div class="demo" style="align-items:flex-end;gap:16px;padding:12px 16px 0;background:var(--warm);border-bottom:1px solid var(--line-mid)">
992
+ <span style="display:flex;align-items:center;gap:8px;margin-bottom:-1px;padding:6px 12px;border-bottom:2px solid var(--theme-btn);border-radius:6px 6px 0 0;background:var(--card);font-size:14px">
993
+ <span style="font-size:12px;font-weight:500;letter-spacing:.05em;color:var(--theme-ink)">Case</span>
994
+ <span class="mono">favorite-article.md</span>
995
+ <span title="Unsaved changes" style="width:6px;height:6px;border-radius:9999px;background:var(--gold-deep)"></span>
996
+ </span>
997
+ <span style="display:flex;align-items:center;gap:8px;padding:6px 12px;border-bottom:2px solid transparent;border-radius:6px 6px 0 0;font-size:14px;color:var(--ink-2)">
998
+ <span style="font-size:12px;font-weight:500;letter-spacing:.05em;color:var(--ink-3)">Spec</span>
999
+ <span class="mono">favorite-article.spec.ts</span>
1000
+ </span>
1001
+ <span style="display:flex;align-items:center;gap:8px;margin-left:auto;padding-bottom:8px">
1002
+ <span class="btn btn-secondary">Discard</span>
1003
+ <span class="btn btn-primary">Save</span>
1004
+ <span class="btn btn-secondary">...</span>
1005
+ </span>
1006
+ </div>
1007
+ <div class="demo" style="gap:16px;background:var(--card);border-bottom:1px solid var(--line-mid);padding:8px 16px">
1008
+ <span style="display:flex;align-items:center;gap:6px">
1009
+ <span style="font-size:12px;color:var(--ink-3)">Layout</span>
1010
+ <span style="display:flex;overflow:hidden;border-radius:4px;box-shadow:0 0 0 1px var(--line-mid)">
1011
+ <span style="padding:4px 10px;font-size:14px;background:var(--card);color:var(--ink-2)">Split</span>
1012
+ <span style="padding:4px 10px;font-size:14px;background:var(--theme-btn);color:#fff">Single</span>
1013
+ </span>
1014
+ </span>
1015
+ <span style="display:flex;align-items:center;gap:6px">
1016
+ <span style="font-size:12px;color:var(--ink-3)">Pane</span>
1017
+ <span style="display:flex;overflow:hidden;border-radius:4px;box-shadow:0 0 0 1px var(--line-mid)">
1018
+ <span style="padding:4px 10px;font-size:14px;background:var(--theme-btn);color:#fff">Panel</span>
1019
+ <span style="padding:4px 10px;font-size:14px;background:var(--card);color:var(--ink-2)">Editor</span>
1020
+ <span style="padding:4px 10px;font-size:14px;background:var(--card);color:var(--ink-2)">Doc</span>
1021
+ </span>
1022
+ </span>
1023
+ </div>
1024
+ <ul class="tight">
1025
+ <li>The active tab is <code>bg-card</code> with a <code>border-b-2 border-theme-btn</code> underline; the others are
1026
+ <code>text-ink-2</code> on the warm strip. The name is <code>font-mono</code>; the kind in front of it is
1027
+ <code>text-xs tracking-wider</code>, <code>text-theme-ink</code> when active and <code>text-ink-3</code> otherwise.</li>
1028
+ <li>Unsaved changes are a 6px <code>bg-gold-deep</code> dot on the tab, never a badge in the page header. A file
1029
+ that does not exist yet keeps its tab, disabled with <code>data-blocked</code> (gold tint and a Feather
1030
+ <code>Lock</code>), with a tooltip that says where to create it (the AI toolbar below the tabs).</li>
1031
+ <li>The switches of the bar under the tabs are a segmented control, not buttons: active <code>bg-theme-btn</code>
1032
+ with white text, the others <code>bg-card</code>, the whole group ringed with <code>ring-1 ring-line-mid</code>, and
1033
+ a <code>text-xs text-ink-3</code> label in front (<code>Layout</code>, <code>Pane</code>). A switch group without a
1034
+ label is not discoverable; never ship one.</li>
1035
+ <li>Switching tabs keeps the other tab's draft, so <b>Save</b> and <b>Discard</b> take the active file; the tab
1036
+ dot is what says another file still has unsaved changes.</li>
1037
+ </ul>
1038
+
962
1039
  <h2 id="sections">Sidebar sections and selection</h2>
963
1040
  <div class="row" style="align-items:flex-start">
964
1041
  <div class="side">
@@ -164,8 +164,17 @@ environment, aliases or gateway expose.
164
164
 
165
165
  **Thinking does nothing** — it is an OpenCode flag. Claude Code has no such flag; its model and settings decide.
166
166
 
167
- **A project rule does nothing** — `AGENTS.md` §2 needs the rule id and an `Effect` of `narrows` or `replaces`.
168
- `F1`..`F6` cannot be changed. `pnpm asrun doctor` names a wrong id, a missing `Effect` or a non-negotiable rule.
167
+ **A project rule does nothing** — `AGENTS.md` §2 needs the rule id and an `Effect` of `narrows`, `replaces` or `adds`.
168
+ A rule the baseline does not have needs a project id (`P1`, `P2`, ...) and `adds`. `F1`..`F6` and `R2` cannot be
169
+ changed. `pnpm asrun doctor` names a wrong id, a missing `Effect`, a duplicate id or a non-negotiable rule, and
170
+ `pnpm asrun rules` prints what the AI steps will actually read. A difference between §2 and a framework default is
171
+ not a conflict: it is applied, not turned into a question.
172
+
173
+ **A test-data prefix is not `[asrun]`** — set it in `package.json`: `"asrun": { "testDataPrefix": "[autotest]" }`.
174
+ The runtime (`records.track`), `pnpm cleanup` and the AI steps all read that one value; without it the default
175
+ `[asrun]` applies. Created names get the run stamp on top: `[autotest] <base> (2026-11-09 12-34-56)`. A prefix written
176
+ only as prose in `AGENTS.md` cannot reach the runtime: `doctor` and `pnpm asrun rules` report the mismatch and name the
177
+ `package.json` value to set.
169
178
 
170
179
  **A skill override does nothing** — it must be `.claude/skills/<skill>.md` (the skill name, for example
171
180
  `generating-specs`, not the command name), and it is not discovered as a standalone skill: the command and the skill
package/docs/web-ui.md CHANGED
@@ -55,9 +55,31 @@ One row per profile, with the same login check as `pnpm status`.
55
55
 
56
56
  ## Cases
57
57
 
58
- The case list is grouped by folder and collapses. The editor opens in **Single** with the **Panel** full width; the
59
- toolbar switches to **Split** (source left, one pane right; drag the divider to resize, double-click to reset) or, in
60
- Single, between **Panel**, **Editor** and **Doc**.
58
+ The case list is grouped by folder and collapses. A case opens on the **Case** tab, with the **Spec** tab beside it:
59
+
60
+ - **Case** (`favorite-article.md`) is the source a person writes: the steps, values, rules and questions.
61
+ - **Spec** (`favorite-article.spec.ts`) is what a generate or heal run wrote from it. It stays visible but blocked (gold,
62
+ with a lock) until the case has a spec; its tooltip says to choose **Generate spec** in the AI toolbar below the tabs,
63
+ pick an environment and press **Run AI**.
64
+
65
+ The tab is the page's state: it lives in the URL (`?view=spec`), so a reload, a shared link and the Back button land on
66
+ the same file, and every other link opens the case. Each tab keeps its own unsaved draft while you switch between them;
67
+ an amber dot on a tab means that file has unsaved changes, and **Save** (`Ctrl/Cmd+S`) and **Discard** always sit at the
68
+ right of the tab strip and act on the file on screen.
69
+
70
+ A control that is disabled because **you** must do something first (save a file, choose an environment, tick a profile) is
71
+ **blocked**: gold with a lock, and its tooltip says what to do; the Run AI button for example names the tab whose draft is
72
+ unsaved. A faded control instead just has nothing to do yet or waits for the app (a running job, a pending request).
73
+
74
+ Under the tabs, the first row is the AI toolbar (command, environment, profiles, attended, **Run AI**, copy the shell
75
+ command, AI guide). It is the same on both tabs, because every AI command acts on the case. The row below holds the
76
+ tools of the file on screen: on **Case** the **Layout** (Split / Single) and **Pane** (Panel / Editor / Doc) switches
77
+ and the previous / next of an outstanding mark; on **Spec** the line that says the file is generated from the case
78
+ (with a link back to it), **Open in editor**, **Copy path** and copy the spec. **Rename or move** and **Delete** live
79
+ in the **⋯** menu at the end of the tab strip.
80
+
81
+ The editor opens in **Single** with the **Panel** full width; **Split** puts the source on the left and one pane on the
82
+ right (drag the divider to resize, double-click to reset).
61
83
 
62
84
  - **Source and preview** scroll together, the preview block at the caret is shaded, and a click in the preview puts
63
85
  the caret on that line. `Ctrl/Cmd+S` saves.
@@ -66,9 +88,11 @@ Single, between **Panel**, **Editor** and **Doc**.
66
88
  green. Hover for a tooltip; the small X after a marker removes it (or the whole question block for a `TODO`) in one
67
89
  step, with Undo; the file is saved when you save it.
68
90
  - **New case** takes an optional folder and runs `pnpm case:new`.
69
- - **The Panel** shows the case as a form, with the open questions first (accept one to delete the question, or write an
70
- answer and the AI folds it in). Then the front matter (title, login, suites, writes and its note, environments), the
71
- `## Rules` bullets, the steps (sentence, `[writes]` / `[input]` / `[email]` tags, `- Ready when:` lines,
91
+ - **The Panel** shows the case as a form, with the open questions first: each one shows what the case says above it,
92
+ then the question, and offers **Keep what the case says** (the question block disappears, that text stays) or
93
+ **Write your answer** (the AI folds it in). Only the two texts jump to the source; the rest of the row does not.
94
+ Then the front matter (title, login, suites, writes and its note, environments), the `## Rules` bullets, the steps
95
+ (sentence, `[writes]` / `[input]` / `[email]` tags, `- Ready when:` lines,
72
96
  `- Recipe:` lines), the `## Expected` and `## Visual checks` bullets (drag to reorder), the `## Values` table (one
73
97
  column per profile; an
74
98
  empty cell inherits `default`), and the `## Targets` cards read-only, with what each is missing. With two or more
@@ -84,15 +108,19 @@ Single, between **Panel**, **Editor** and **Doc**.
84
108
  when it saved one, the **screenshot** from the exploration, so you look at the image instead of opening the page
85
109
  again. Rows that change an assertion are highlighted; **Confirm** settles one line and **Confirm all** settles the
86
110
  list in one undo step. None of this blocks generating a spec; healing stops until the case is settled.
87
- - **Spec view** is editable too (`Ctrl/Cmd+S`; refused when the file changed on disk meanwhile). **Open in editor**
88
- opens it in the default application for `.spec.ts`, **Copy path** copies its absolute path.
89
- - Click the file name (or the pencil icon) to **rename** or move the case: the spec and the baselines move with it and
90
- the spec is rewritten. **Delete** (type the id, or fill it in with the feather icon) removes the case, its spec and
91
- its baselines; both dialogs list exactly what they touch, and are refused while an AI or test run is in progress.
92
- - **Toolbar:** command (explore / generate / heal, explore by default), **Environment** (required, no default),
111
+ - **Spec view** is editable too (`Ctrl/Cmd+S`; refused when the file changed on disk meanwhile), and its tab links back
112
+ to the case it was generated from. **Open in editor** opens it in the default application for `.spec.ts`, **Copy
113
+ path** copies its absolute path.
114
+ - **Rename or move** (in the **⋯** menu) keeps the spec and the baselines with the case and rewrites the spec;
115
+ **Delete** (type the id, or fill it in with the feather icon) removes the case, its spec and its baselines. Both
116
+ dialogs list exactly what they touch, and are refused while an AI or test run is in progress or while a draft is
117
+ unsaved.
118
+ - **AI toolbar:** command (explore / generate / heal, explore by default), **Environment** (required, no default),
93
119
  **Profiles** (explore only: every profile that is logged in is ticked, the choice is remembered per environment, and
94
120
  only the ticked ones are opened), **Attended** (only for explore, ticked by default), **Run AI**, copy the shell
95
121
  command, open the AI guide.
122
+ - **Writes in …** is one line under the toolbar, in red: the environments whose data the case writes, then its note,
123
+ with the full note in its tooltip. A case that only runs in some environments shows that line instead.
96
124
  - **From memo** opens a Markdown editor with a preview for raw notes. **Make cases** saves them to `.tmp/memos/` and
97
125
  runs `/make-case` one-shot (defaults for gaps, `TODO` for unknown values, no page exploration, existing cases never
98
126
  overwritten); **Copy /make-case** copies the memo for the interactive dialogue. When the run ends, **What to do
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asrunjs/asrun",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "description": "Multi-profile end-to-end test suite: plain-language cases, AI-written Playwright specs, evidence for every run.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Zoro Chen",
@@ -49,9 +49,11 @@
49
49
  "status": "tsx scripts/status.ts",
50
50
  "reset": "tsx scripts/cli.ts reset",
51
51
  "asrun": "tsx scripts/cli.ts",
52
+ "rules": "tsx scripts/cli.ts rules",
52
53
  "report": "tsx scripts/report.ts",
53
54
  "heal:evidence": "node scripts/heal-evidence.mjs",
54
55
  "explore": "tsx scripts/explore.ts",
56
+ "explore:notes": "tsx scripts/explore-notes.ts",
55
57
  "cleanup": "tsx scripts/cleanup.ts",
56
58
  "case:new": "tsx scripts/new-case.ts",
57
59
  "case:check": "tsx scripts/check-cases.ts",
@@ -6,7 +6,9 @@ Load the framework skill `{{framework}}/.claude/skills/exploring-cases/SKILL.md`
6
6
 
7
7
  Rules combine in this order, and a later one wins where they conflict: the framework baseline
8
8
  `{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/exploring-cases.md` if it exists, then the workspace
9
- `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. Project facts are in `AGENTS.md` §3.
9
+ `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
10
+ applied as written and is never turned into a question (a difference from a framework default is not a conflict).
11
+ Project facts are in `AGENTS.md` §3.
10
12
 
11
13
  Arguments: `<case-id> <env> [--attended] [--profiles a,b] [--hints <file>]`. The case id is the path below `cases/` without `.md` (it may include a
12
14
  group folder, e.g. `documents/landing-page`) and is required. `<env>` is `staging` or `production`; it is required and there
@@ -7,7 +7,9 @@ $ARGUMENTS
7
7
 
8
8
  Rules combine in this order, and a later one wins where they conflict: the framework baseline
9
9
  `{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/generating-specs.md` if it exists, then the workspace
10
- `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. Project facts are in `AGENTS.md` §3.
10
+ `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
11
+ applied as written and is never turned into a question (a difference from a framework default is not a conflict).
12
+ Project facts are in `AGENTS.md` §3.
11
13
 
12
14
  Arguments: `<case-id> [<env>] [--force] [--hints <file>]`. The case file is `cases/<case-id>.md` (the id may include one group folder,
13
15
  e.g. `documents/landing-page`). `<env>` is the environment to explore in (`staging` or `production`); there is no default. If
@@ -7,7 +7,9 @@ spec", and follow it exactly.
7
7
 
8
8
  Rules combine in this order, and a later one wins where they conflict: the framework baseline
9
9
  `{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/generating-specs.md` if it exists, then the workspace
10
- `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. Project facts are in `AGENTS.md` §3.
10
+ `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
11
+ applied as written and is never turned into a question (a difference from a framework default is not a conflict).
12
+ Project facts are in `AGENTS.md` §3.
11
13
 
12
14
  Arguments: $ARGUMENTS
13
15
  Format: `<case-id> <env> [--profiles a,b] [--report <run-id>] [--hints <file>]`, with optional free text after them.
@@ -7,7 +7,9 @@ documents: $ARGUMENTS
7
7
 
8
8
  Rules combine in this order, and a later one wins where they conflict: the framework baseline
9
9
  `{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/making-cases.md` if it exists, then the workspace
10
- `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. Project facts are in `AGENTS.md` §3.
10
+ `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
11
+ applied as written and is never turned into a question (a difference from a framework default is not a conflict).
12
+ Project facts are in `AGENTS.md` §3.
11
13
 
12
14
  The input is either text or a path to a file with the notes. Follow the skill's procedure exactly. Ask me the open
13
15
  questions before writing any case file. Do not generate specs; that is `/gen-spec`.
@@ -22,24 +22,31 @@ The framework skills are loaded by the commands in `.claude/commands/` (Claude C
22
22
 
23
23
  ## 2. Project rules
24
24
 
25
- Only what differs from the baseline: name the rule id, and whether it `narrows` (stricter) or `replaces` (a different
26
- default, for example the artifact language) the baseline rule. `replaces` is refused for `F1`–`F6` and `R2`. Rows
27
- whose first cell is not a rule id are ignored, so the placeholder below can stay until you need it.
25
+ Only what differs from the baseline. A row names the baseline rule it changes and whether it `narrows` (stricter) or
26
+ `replaces` (a different default, for example the artifact language) it. A rule the baseline does not have gets a
27
+ project id (`P1`, `P2`, ...) and `adds`. `replaces` is refused for `F1`–`F6` and `R2`. Rows whose first cell is not a
28
+ rule id are ignored, so the placeholder below can stay until you need it.
28
29
 
29
30
  | Rule | Project rule | Effect |
30
31
  |---|---|---|
31
- | <rule id, e.g. F10> | <what this project does differently from the baseline> | narrows |
32
+ | <rule id, e.g. F10 or P1> | <what this project does differently from the baseline> | <narrows / replaces / adds> |
32
33
 
33
34
  Examples (delete what you do not use; the fenced block is an example, not a rule):
34
35
 
35
36
  ```markdown
36
37
  | F10 | Case prose, report summaries and assertion messages in Simplified Chinese; code and commit messages stay English. | replaces |
37
- | F9 | Staging writes are limited to accounts named `qa-*` and names starting with `[asrun]`. | narrows |
38
- | F7 | This project runs production profiles only from a scheduled job; people use `--env staging`. | narrows |
38
+ | F11 | Test data carries the ticket id as well as the run stamp: `[autotest] ABC-123 <title> (<run stamp>)`. | narrows |
39
+ | P1 | Staging writes are limited to accounts named `qa-*`. | adds |
39
40
  ```
40
41
 
41
- `pnpm asrun doctor` fails when this table names a `[non-negotiable]` rule, an unknown rule id, or an `Effect` that is
42
- not `narrows` or `replaces`.
42
+ `pnpm asrun doctor` fails when this table names a `[non-negotiable]` rule, an unknown baseline id, a duplicate id, a
43
+ project id without `adds`, or an `Effect` that is not `narrows`, `replaces` or `adds`. `pnpm asrun rules` prints the
44
+ effective set, and every AI step reads it before it applies the rules: **§2 is applied as written and is never a
45
+ question.** A difference between §2 and a framework default is not a conflict.
46
+
47
+ The test-data prefix is not written here: it is `asrun.testDataPrefix` in `package.json` (default `[asrun]`), so the
48
+ document and the code read the same value. A case's data is named `testDataName(base)`:
49
+ `<prefix> <base> (<UTC time of the run>)`, so two runs never collide.
43
50
 
44
51
  The structural tokens are fixed English whatever the project language: the section headings (`## Values`, `## Rules`,
45
52
  `## Targets`, ...), a step's `- Recipe (phase): ...` lines, `### T<n>`, the `TODO` blocks with their `Answer:` line,
@@ -60,6 +67,8 @@ and the front-matter keys. See "Fixed tokens" in the framework baseline.
60
67
  - `cases/**/*.md` human-written test cases (committed)
61
68
  - `tests/**/*.spec.ts` generated Playwright specs and their `*-snapshots/` baselines (committed)
62
69
  - `profiles.yaml` one entry per environment, connection settings only (committed)
70
+ - `package.json` npm scripts and the framework dependency; its `"asrun"` object holds project settings
71
+ (`testDataPrefix`, committed)
63
72
  - `.claude/commands/` `/make-case`, `/explore-case`, `/gen-spec`, `/heal-spec` for Claude Code
64
73
  - `.opencode/commands/` the same commands for OpenCode (it does not read `.claude/commands`)
65
74
  - `.claude/skills/` optional overrides of a framework skill: `<skill>.md`
@@ -4,7 +4,7 @@ title: One-line summary of what this case proves
4
4
  login: required # required | none (none = public page, no saved session needed)
5
5
  suites: [smoke, regression] # a case may be in several suites; filter with `pnpm asrun --suite <name>`
6
6
  # writes: [staging] # omit = read-only. The environments in which the case may create or change data of the test accounts (and cleans it up); elsewhere it is skipped with a notice
7
- # writes-note: What the case creates or changes, e.g. one draft named "[asrun] ...", deleted at the end. (required when writes is set)
7
+ # writes-note: What the case creates or changes, e.g. one draft named "[asrun] ... (<run stamp>)", deleted at the end. (required when writes is set)
8
8
  # envs: [production, staging] # optional: run only in these environments (default: all); must include every environment in `writes`
9
9
  ---
10
10
 
@@ -24,8 +24,8 @@ none.
24
24
  row. It says when to look; what must be true afterwards goes under Expected.>
25
25
  2. <What to look at or click.>
26
26
  3. <A step that needs a person's choice or writes something.> [input] [writes]
27
- - Recipe (start): <what the person did, recorded by /explore-case --attended: positions, [asrun] names, control
28
- labels; never selectors or ids. One line per phase.>
27
+ - Recipe (start): <what the person did, recorded by /explore-case --attended: positions, created names (project
28
+ prefix plus the run's UTC stamp), control labels; never selectors or ids. One line per phase.>
29
29
 
30
30
  ## Expected
31
31
  - <Behaviour that must hold for every profile.>
@@ -8,12 +8,14 @@
8
8
  "scripts": {
9
9
  "go": "asrun go",
10
10
  "asrun": "asrun",
11
+ "rules": "asrun rules",
11
12
  "signin": "asrun signin",
12
13
  "status": "asrun status",
13
14
  "reset": "asrun reset",
14
15
  "report": "asrun report",
15
16
  "heal:evidence": "asrun heal:evidence",
16
17
  "explore": "asrun explore",
18
+ "explore:notes": "asrun explore:notes",
17
19
  "cleanup": "asrun cleanup",
18
20
  "case:new": "asrun case:new",
19
21
  "case:check": "asrun case:check",
@@ -30,5 +32,8 @@
30
32
  "@playwright/test": "1.64.1",
31
33
  "@types/node": "^22.20.5",
32
34
  "typescript": "^7.0.2"
35
+ },
36
+ "asrun": {
37
+ "testDataPrefix": "[asrun]"
33
38
  }
34
39
  }
@@ -1 +1 @@
1
- import{C as e,D as t,L as n,h as r,n as i,r as a,s as o,u as s,x as c,z as l}from"./dist-Dr9crbBz.js";import{r as u}from"./index-CGbRJT3b.js";var d=110,f=1,p=2,m=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288];function h(e){return e>=65&&e<=90||e>=97&&e<=122||e>=161}function g(e){return e>=48&&e<=57}var _=new i((e,t)=>{if(e.next==40){let t=e.peek(-1);(h(t)||g(t)||t==95||t==45)&&e.acceptToken(p,1)}}),v=new i(e=>{if(m.indexOf(e.peek(-1))>-1){let{next:t}=e;(h(t)||t==95||t==35||t==46||t==91||t==58||t==45)&&e.acceptToken(d)}}),y=new i(e=>{if(m.indexOf(e.peek(-1))<0){let{next:t}=e;if(t==37&&(e.advance(),e.acceptToken(f)),h(t)){do e.advance();while(h(e.next));e.acceptToken(f)}}}),b=n({"import charset namespace keyframes media supports when":l.definitionKeyword,"from to selector":l.keyword,NamespaceName:l.namespace,KeyframeName:l.labelName,TagName:l.tagName,ClassName:l.className,PseudoClassName:l.constant(l.className),IdName:l.labelName,"FeatureName PropertyName PropertyVariable":l.propertyName,AttributeName:l.attributeName,NumberLiteral:l.number,KeywordQuery:l.keyword,UnaryQueryOp:l.operatorKeyword,"CallTag ValueName":l.atom,VariableName:l.variableName,"AtKeyword Interpolation":l.special(l.variableName),Callee:l.operatorKeyword,Unit:l.unit,"UniversalSelector NestingSelector":l.definitionOperator,MatchOp:l.compareOperator,"ChildOp SiblingOp, LogicOp":l.logicOperator,BinOp:l.arithmeticOperator,Important:l.modifier,"Comment LineComment":l.blockComment,ColorLiteral:l.color,"ParenthesizedContent StringLiteral":l.string,Escape:l.special(l.string),": ...":l.punctuation,"PseudoOp #":l.derefOperator,"; ,":l.separator,"( )":l.paren,"[ ]":l.squareBracket,"{ }":l.brace}),x={__proto__:null,lang:40,"nth-child":40,"nth-last-child":40,"nth-of-type":40,"nth-last-of-type":40,dir:40,"host-context":40,and:244,or:244,not:74,only:74,url:86,"url-prefix":86,domain:86,regexp:86,when:117,selector:142,from:172,to:174},S={__proto__:null,"@import":126,"@plugin":126,"@media":152,"@charset":156,"@namespace":160,"@keyframes":166,"@supports":178},C=a.deserialize({version:14,states:"@^O!gQWOOO!nQaO'#CeOOQP'#Cd'#CdO$RQWO'#CgO$xQaO'#EaO%cQWO'#CiO%kQWO'#DZO%pQWO'#D^O%uQaO'#DfOOQP'#Es'#EsO'YQWO'#DlO'yQWO'#DyO(QQWO'#D{O(xQWO'#D}O)TQWO'#EQO'bQWO'#EWO)YQ`O'#FTO)]Q`O'#FTO)hQ`O'#FTO)vQWO'#EYOOQO'#Er'#ErOOQO'#FV'#FVOOQO'#Ec'#EcO){QWO'#EqO*WQWO'#EqQOQWOOOOQP'#Ch'#ChOOQP,59R,59RO$RQWO,59RO*bQWO'#EdO+PQWO,58|O+_QWO,59TO%kQWO,59uO%pQWO,59xO*bQWO,59{O*bQWO,59}OOQO'#De'#DeO*bQWO,5:OO,bQpO'#E}O,iQWO'#DkOOQO,58|,58|O(QQWO,58|O,pQWO,5:{OOQO,5:{,5:{OOQT'#Cl'#ClO-UQeO,59TO.cQ[O,59TOOQP'#D]'#D]OOQP,59u,59uOOQO'#D_'#D_O.hQpO,59xOOQO'#EZ'#EZO.pQ`O,5;oOOQO,5;o,5;oO/OQWO,5:WO/VQWO,5:WOOQS'#Dn'#DnO/rQWO'#DsO/yQ!fO'#FRO0eQWO'#DtOOQS'#FS'#FSO+YQWO,5:eO'bQWO'#DrOOQS'#Cu'#CuO(QQWO'#CwO0jQ!hO'#CyO2^Q!fO,5:gO2oQWO'#DWOOQS'#Ex'#ExO(QQWO'#DQOOQO'#EP'#EPO2tQWO,5:iO2yQWO,5:iOOQO'#ES'#ESO3RQWO,5:lO3WQ!fO,5:rO3iQ`O'#EkO.pQ`O,5;oOOQO,5:|,5:|O3zQWO,5:tOOQO,5:},5:}O4XQWO,5;]OOQO-E8a-E8aOOQP1G.m1G.mOOQP'#Ce'#CeO5RQaO,5;OOOQP'#Df'#DfOOQO-E8b-E8bOOQO1G.h1G.hO(QQWO1G.hO5fQWO1G.hO5nQeO1G.oO.cQ[O1G.oOOQP1G/a1G/aO6{QpO1G/dO7fQaO1G/gO8cQaO1G/iO9`QaO1G/jO:]Q!fO'#FOO:yQ!fO'#ExOOQO'#FO'#FOOOQO,5;i,5;iO<^QWO,5;iO<iQWO,5:VO<nQ!fO1G.hOOQO1G0g1G0gO=PQWO'#CnOOQP1G.o1G.oO=WQWO'#CqOOQP1G/d1G/dO(QQWO1G/dO=_Q`O1G1ZOOQO1G1Z1G1ZO=mQWO1G/rO=rQ!fO'#FQO>WQWO1G/rO>]Q!fO'#DnO>qQWO,5:ZO>vQ!fO,5:_OOQO'#DP'#DPO'bQWO,5:]O?XQWO'#DwOOQS,5:b,5:bO?`QWO,5:dO'bQWO'#EiO?gQWO,5;mO*bQWO,5:`OOQO1G0P1G0PO?uQ!fO,5:^O@aQ!fO,59cOOQS,59e,59eO(QQWO,59iOOQS,59n,59nO@rQWO,59pOOQO1G0R1G0RO@yQ#tO,59rOARQ!fO,59lOOQO1G0T1G0TOBrQWO1G0TOBwQWO'#ETOOQO1G0W1G0WOOQO1G0^1G0^OOQO,5;V,5;VOOQO-E8i-E8iOCVQ!fO1G0bOCvQWO1G0`O%kQWO'#E_O$RQWO'#E`OEZQWO'#E^OOQO1G0b1G0bPEkQWO'#EcO<nQ!fO7+$SOOQO7+$S7+$SO(QQWO7+$SOOQP7+$Z7+$ZOOQP7+%O7+%OO(QQWO7+%OOEpQ!fO'#EeOF}QWO,5;jO(QQWO,5;jOOQO,5;j,5;jO+gQpO'#EgOG[QWO1G1TOOQO1G1T1G1TOOQO1G/q1G/qOGgQaO'#EvOGnQWO,59YOGsQWO'#EwOG}QWO,59]OHSQ!fO7+%OOOQO7+&u7+&uOOQO7+%^7+%^O(QQWO'#EhOHeQWO,5;lOHmQWO7+%^O(QQWO1G/uOOQS1G/y1G/yOOQS1G/w1G/wOHrQWO,5:cOHwQ!fO1G0OOOQS1G0O1G0OOIYQ!fO,5;TOOQO-E8g-E8gOItQaO1G/zOOQS1G.}1G.}OOQS1G/T1G/TOI{Q!fO1G/[OOQS1G/[1G/[OJ^QWO1G/^OOQO7+%o7+%oOJcQYO'#CyO+YQWO'#EjOJkQWO,5:oOOQO,5:o,5:oOJyQ!fO'#ElO(QQWO'#ElOL^QWO7+%|OOQO7+%|7+%|OOQO7+%z7+%zOOQO,5:y,5:yOOQO,5:z,5:zOLqQaO,5:xOOQO,5:x,5:xOOQO<<Gn<<GnO<nQ!fO<<GnOMRQ!fO<<HjOOQO-E8c-E8cOMdQWO1G1UOOQO,5;R,5;ROOQO-E8e-E8eOOQO7+&o7+&oOMqQWO,5;bOOQP1G.t1G.tO(QQWO'#EfOMyQWO,5;cOOQT1G.w1G.wOOQP<<Hj<<HjONRQ!fO,5;SOOQO-E8f-E8fO/OQWO<<HxONgQWO7+%aOOQS1G/}1G/}OOQS7+%j7+%jOOQS7+%f7+%fOOQS7+$v7+$vOOQS7+$x7+$xOOQO,5;U,5;UOOQO-E8h-E8hOOQO1G0Z1G0ZONnQ!fO,5;WOOQO-E8j-E8jOOQO<<Ih<<IhOOQO1G0d1G0dOOQOAN=YAN=YOOQPAN>UAN>UO!!RQWO,5;QOOQO-E8d-E8dO!!]QWOAN>dOOQS<<H{<<H{OOQOG24OG24O",stateData:"!!n~O#dOSROSSOS~OVXOYXO^TO_TOfaOgbOoaOpWOyVO!OUO!aYO!nZO!p[O!r]O!u^O!{_O#hPO#iRO~O#a#eP~P]O^XX^!}X_XXcXXjXXp!}XyXX!OXX!UXX!ZXX![XX!^XX#PXX#aXX#bXX#iXX#oXX#pXX#p!}X#x!}X!]XX~O#hjO~O^oO_oOcmOyqO!OpO!UrO#bsO#ilO#otO#ptO~OjvO![yO!^wO#P{O!Z#TX#a#TX!]#TX~P$WOd!OO#h|O~O#h!PO~O#h!RO~O#h!TO#p!VO#x!VO^!YX^#wX_!YXc!YXj!YXy!YX!O!YX!U!YX!Z!YX![!YX!^!YX#P!YX#a!YX#b!YX#i!YX#o!YX#p!YX!]!YX~Oj!XOn!WO~Og!^Oj!ZOo!^Op!^Ou!`O!i!]O#h!YO~O!^#uP~P'bOf!fOg!fOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO~On!iO{!eO#h!hO~O#h!kO~Op!nO#p!VO#x!VO^#wX~OjvO#p!VO#x!VO^#wX~O^!qO~O!Z!rO#a#eX!]#eX~O#a#eX!]#eX~P]OVXOYXO^TO_TOp!xOyVO!OUO#h!vO#iRO~OcmOjvO![!{O!^wO~Od#OO#h|O~Of!fOg#VOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO#s#WO~Oa#XO~P+gO!]#eP~P]O![!{O!^wO#P#]O!Z#Ta#a#Ta!]#Ta~OQ#^O^]a_]ac]aj]ay]a!O]a!U]a!Z]a![]a!^]a#P]a#a]a#b]a#i]a#o]a#p]a!]]aa]a~OQ#`O~Ow#aO!S#bO~Op!nO#p#dO#x#dO^#wa~O!Z#uP~P'bOa#tP~P(QOg!^Oj!ZOo!^Op!^Ou!`O!i!]O~O#h#hO~P/^OQ#mOc#pOr#lOy#oO#n#kO!^#uX!Z#uXa#uX~Oj#rO~OP#vOQmXrmXymX!ZmX#nmX^mXamXcmXfmXgmXhmXjmXlmXnmXomXpmXumX{mX#hmX#mmX!^mX#PmX#amXwmX!]mX~OQ#`Or#wOy#yO!Z#zO#n#kO~Oj#{O~O!Z#}O~On$OO{!eO~O!^$PO~OQ#mOr#lOy#oO!^wO#n#kO~O#h!TO^#_Xp#_X#p#_X#x#_X~O!O$WO!^wO#i$XO~P(QO!Z!rO#a#ea!]#ea~O^oO_oOyqO!OpO!UrO#bsO#ilO#otO#ptO~Oc#Waj#Wa![#Wa!^#Waa#Wa~P4dO![$_O!^wO~OQ#^O^]i_]ic]ij]iy]i!O]i!U]i!Z]i![]i!^]i#P]i#a]i#b]i#i]i#o]i#p]i!]]ia]i~Ow$aO!S$bO~O^oO_oOyqO!OpO#ilO~Oc!Tij!Ti!U!Ti!Z!Ti![!Ti!^!Ti#P!Ti#a!Ti#b!Ti#o!Ti#p!Ti!]!Tia!Ti~P7TOc!Vij!Vi!U!Vi!Z!Vi![!Vi!^!Vi#P!Vi#a!Vi#b!Vi#o!Vi#p!Vi!]!Via!Vi~P7TOc!Wij!Wi!U!Wi!Z!Wi![!Wi!^!Wi#P!Wi#a!Wi#b!Wi#o!Wi#p!Wi!]!Wia!Wi~P7TOQ#`O^$eOr#wOy#yO#n#kOa#rXc#rX!Z#rX~P(QO#s$fOQ#lX^#lXa#lXc#lXf#lXg#lXh#lXj#lXl#lXn#lXo#lXp#lXr#lXu#lXy#lX{#lX!Z#lX#h#lX#m#lX#n#lX~Oa$iOc$gO!Z$gO~O!]$jO~OQ#`Or#wOy#yO!^wO#n#kO~Oa#jP~P*bOa#kP~P(QOp!nO#p$pO#x$pO^#wi~O!Z$qO~OQ#`Oc$rOr#wOy#yO#n#kOa#tX~Oa$tO~OQ!bX^!dXa!bXr!bXy!bX#n!bX~O^$uO~OQ#mOa$vOr#lOy#oO#n#kO~Oa#uP~P'bOw$zO~P(QOc#pO!^#ua!Z#uaa#ua~OQ#mOr#lOy#oO#n#kOc!fa!^!fa!Z!faa!fa~OQ#`Oa%OOr#wOy#yO#n#kO~Ow%RO~P(QOn%SO|%SO~OQ#`Or#wOy#yO#n#kO!Zta^taatactaftagtahtajtaltantaotaptauta{ta#hta#mta!^ta#Pta#atawta!]ta~O!Z%TO~O!]%XO!x%VO!y%VO#m%UO~OQ#`Oc%ZOr#wOy#yO#P%]O#n#kO!Z#Oi#a#Oi!]#Oi~P(QO!Z%^OV!|iY!|i^!|i_!|if!|ig!|io!|ip!|iy!|i!O!|i!a!|i!n!|i!p!|i!r!|i!u!|i!{!|i#a!|i#h!|i#i!|i!]!|i~OjvO!Z#QX#a#QX!]#QX~P*bO!Z!rO~OQ#`Or#wOy#yO#n#kOa#XXc#XXf#XXg#XXh#XXj#XXl#XXn#XXo#XXp#XXu#XX{#XX!Z#XX#h#XX#m#XX~Oa#rac#ra!Z#ra~P(QOa%jOc$gO!Z$gO~Oa#jX~P$WOa%lO~Oc%mOa#kX~P(QOa%oO~OQ#`Or#wOw%pOy#yO#n#kO~Oc$rOa#ta~On%sO~Oa%uO~OQ#`Or#wOw%vOy#yO#n#kO~OQ#mOr#lOy#oO#n#kOc#]a!^#]a!Z#]aa#]a~Oa%wO~P4dOQ#`Or#wOw%xOy#yO#n#kO~Oa%yO~OP#vO!^mX~O!]%|O!x%VO!y%VO#m%UO~OQ#`Or#wOy#yO#n#kOc#`Xf#`Xg#`Xh#`Xj#`Xl#`Xn#`Xo#`Xp#`Xu#`X{#`X!Z#`X#P#`X#a#`X#h#`X#m#`X!]#`X~Oc%ZO#P&PO!Z#Oq#a#Oq!]#Oq~P(QOjvO!Z#Qa#a#Qa!]#Qa~P4dOQ#`Or#wOw&SOy#yO#n#kO~Oa#ric#ri!Z#ri~P(QOcmOa#ja~Oc%mOa#ka~OQ#`Or#wOy#yO#n#kOa#[ac#[a~Oa&WO~P(QOQ#`Or#wOy#yO#n#kOc#`af#`ag#`ah#`aj#`al#`an#`ao#`ap#`au#`a{#`a!Z#`a#P#`a#a#`a#h#`a#m#`a!]#`a~Oa#Yac#Ya~P(QO!Z&XO~Of#dpg#m|#iRSRr~",goto:"0^#zPPPPPP#{P$Q$^P$Q$j$QPP$sP$yPP%PPPP%jP%jP&ZPPP%jP'O%jP%jP%jP'jPP$QP(a$Q(jP$QP$Q$Q(p$QPPPP(w#{P)f)f)q)f)f)f)fP)f)t)f#{P#{P#{P){#{P*O*RPP#{P#{*U*aP*f*i*i*a*a*l*s*}+e+k+q+w+},T,_PPPP,e,k,pPP-[-_-bPPPP.u/UP/[/_/k0QP0VVdOhweXOhmrsuw#^#r$YeQOhmrsuw#^#r$YQkRQ!ulR%`$XQ}TR!}oQ#_}R$`!}Q#_!Or#x!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}R$`#O!]!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&T![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TT%V$P%WY#l![!m#j#t${s#w!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TQ!i]R$O!jQ!QUQ#PpR%_$WQ!SVR#QqZuS!w$k$}%aQxSS!znzQ#s!_Q$R!mQ$V!qS$^!|#[Q%c$]Q%z%VR&R%dc!^Z_!W!Z!`#l#m#p%sR#i!ZZ#n![!m#j#t${R!j]R!l^R$Q!lU`OhwQ!UWR$S!nVeOhwR$Z!qR$Y!qShOwR!thQnSS!yn%kR%k$kQ$d#UQ$m#`Y%f$d$m%g%t&TQ%g$eQ%t$uR&T%mQ%n$mR&U%nQ$h#YR%i$hQ$s#fR%r$sQ#q![R$|#qQ%W$PR%{%WQ!o`Q#c!UT$T!o#cQ%[$UR&O%[QiOR#ZwVfOhwUSOhwQ!wmQ#RrQ#SsQ#TuQ$k#^Q$}#rR%a$YR$l#^R$n#`Q!d[S#Uv$gQ#[yQ#f!XQ#u!bQ#|!gQ$U!qQ$]!{d$c#U#`$d$e$m$u%g%m%t&TQ$o#bQ$y#oQ%P#wQ%Q#yS%Y$U%[Q%d$_Q%e$bQ%q$rR%}%ZQzSQ!pbQ!|nQ%b$YR&Q%aQ#YvR%h$gR#g!XQ!_ZQ#e!WQ$x#mR&V%sW![Z!W#m%sQ!m_Q#j!ZQ#t!`Q$w#lR${#pVcOhwSgOwR!sh",nodeNames:`⚠ Unit ( Comment LineComment StyleSheet RuleSet UniversalSelector TagSelector TagName NestingSelector ClassSelector ClassName PseudoClassSelector : :: PseudoClassName ) ArgList , PseudoClassName ArgList VariableName AtKeyword PropertyVariable ValueName ( ParenthesizedValue ColorLiteral NumberLiteral StringLiteral Escape Interpolation BinaryExpression BinOp LogicOp UnaryExpression UnaryQueryOp CallExpression ] SubscriptExpression [ CallLiteral CallTag ParenthesizedContent IdSelector # IdName AttributeSelector AttributeName MatchOp ChildSelector ChildOp DescendantSelector SiblingSelector SiblingOp InterpolatedSelector ; when } { Block ImportStatement import KeywordQuery FeatureQuery FeatureName BinaryQuery UnaryQuery ParenthesizedQuery SelectorQuery selector CallQuery ArgList SubscriptQuery MediaStatement media CharsetStatement charset NamespaceStatement namespace NamespaceName KeyframesStatement keyframes KeyframeName KeyframeList from to SupportsStatement supports DetachedRuleSet PropertyName Declaration Important Inclusion IdSelector ClassSelector Inclusion CallExpression`,maxTerm:133,nodeProps:[[`isolate`,-3,3,4,30,``],[`openedBy`,17,`(`,59,`{`],[`closedBy`,26,`)`,60,`}`]],propSources:[b],skippedNodes:[0,3,4],repeatNodeCount:10,tokenData:"!2q~R!ZOX$tX^%l^p$tpq%lqr)Ors-xst/ltu6Zuv$tvw8^wx:Uxy;syz<Uz{<Z{|<t|}BQ}!OBc!O!PDo!P!QFY!Q![Jw![!]Kr!]!^Ln!^!_MP!_!`M{!`!aNl!a!b$t!b!c! m!c!}!&R!}#O!'y#O#P$t#P#Q!([#Q#R!(m#R#T$t#T#o!&R#o#p!)S#p#q!(m#q#r!)e#r#s!)v#s#y$t#y#z%l#z$f$t$f$g%l$g#BY$t#BY#BZ%l#BZ$IS$t$IS$I_%l$I_$I|$t$I|$JO%l$JO$JT$t$JT$JU%l$JU$KV$t$KV$KW%l$KW&FU$t&FU&FV%l&FV;'S$t;'S;=`!2k<%lO$t`$wSOy%Tz;'S%T;'S;=`%f<%lO%T`%YS|`Oy%Tz;'S%T;'S;=`%f<%lO%T`%iP;=`<%l%T~%qh#d~OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%T~'dh#d~|`OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%Tk)RUOy%Tz#]%T#]#^)e#^;'S%T;'S;=`%f<%lO%Tk)jU|`Oy%Tz#a%T#a#b)|#b;'S%T;'S;=`%f<%lO%Tk*RU|`Oy%Tz#d%T#d#e*e#e;'S%T;'S;=`%f<%lO%Tk*jU|`Oy%Tz#c%T#c#d*|#d;'S%T;'S;=`%f<%lO%Tk+RU|`Oy%Tz#f%T#f#g+e#g;'S%T;'S;=`%f<%lO%Tk+jU|`Oy%Tz#h%T#h#i+|#i;'S%T;'S;=`%f<%lO%Tk,RU|`Oy%Tz#T%T#T#U,e#U;'S%T;'S;=`%f<%lO%Tk,jU|`Oy%Tz#b%T#b#c,|#c;'S%T;'S;=`%f<%lO%Tk-RU|`Oy%Tz#h%T#h#i-e#i;'S%T;'S;=`%f<%lO%Tk-lS#PZ|`Oy%Tz;'S%T;'S;=`%f<%lO%T~-{WOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f<%lO-x~.jOn~~.mRO;'S-x;'S;=`.v;=`O-x~.yXOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f;=`<%l-x<%lO-x~/iP;=`<%l-xo/qY!OROy%Tz!Q%T!Q![0a![!c%T!c!i0a!i#T%T#T#Z0a#Z;'S%T;'S;=`%f<%lO%Tm0fY|`Oy%Tz!Q%T!Q![1U![!c%T!c!i1U!i#T%T#T#Z1U#Z;'S%T;'S;=`%f<%lO%Tm1ZY|`Oy%Tz!Q%T!Q![1y![!c%T!c!i1y!i#T%T#T#Z1y#Z;'S%T;'S;=`%f<%lO%Tm2QYl]|`Oy%Tz!Q%T!Q![2p![!c%T!c!i2p!i#T%T#T#Z2p#Z;'S%T;'S;=`%f<%lO%Tm2wYl]|`Oy%Tz!Q%T!Q![3g![!c%T!c!i3g!i#T%T#T#Z3g#Z;'S%T;'S;=`%f<%lO%Tm3lY|`Oy%Tz!Q%T!Q![4[![!c%T!c!i4[!i#T%T#T#Z4[#Z;'S%T;'S;=`%f<%lO%Tm4cYl]|`Oy%Tz!Q%T!Q![5R![!c%T!c!i5R!i#T%T#T#Z5R#Z;'S%T;'S;=`%f<%lO%Tm5WY|`Oy%Tz!Q%T!Q![5v![!c%T!c!i5v!i#T%T#T#Z5v#Z;'S%T;'S;=`%f<%lO%Tm5}Sl]|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm6^YOy%Tz!_%T!_!`6|!`!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Td7TS!SS|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm7h[h]|`Oy%Tz}%T}!O7a!O!Q%T!Q![7a![!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Ta8c[YPOy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%Ta9`[YP|`Oy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%T~:XWOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m<%lO:U~:tRO;'S:U;'S;=`:};=`O:U~;QXOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m;=`<%l:U<%lO:U~;pP;=`<%l:Uo;xSj_Oy%Tz;'S%T;'S;=`%f<%lO%T~<ZOa~m<bUVPrWOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%To<{Y#pQrWOy%Tz!O%T!O!P=k!P!Q%T!Q![@p![#R%T#R#SAm#S;'S%T;'S;=`%f<%lO%Tm=pU|`Oy%Tz!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%Tm>ZY#m]|`Oy%Tz!Q%T!Q![>S![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%Tm?OY|`Oy%Tz{%T{|?n|}%T}!O?n!O!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm?sU|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@^U#m]|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@w[#m]|`Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TbAtS#xQ|`Oy%Tz;'S%T;'S;=`%f<%lO%TkBVScZOy%Tz;'S%T;'S;=`%f<%lO%TmBhXrWOy%Tz}%T}!OCT!O!P=k!P!Q%T!Q![@p![;'S%T;'S;=`%f<%lO%TmCYW|`Oy%Tz!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%TmCy[f]|`Oy%Tz}%T}!OCr!O!Q%T!Q![Cr![!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%ToDtW#iROy%Tz!O%T!O!PE^!P!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%TlEcU|`Oy%Tz!O%T!O!PEu!P;'S%T;'S;=`%f<%lO%TlE|S#s[|`Oy%Tz;'S%T;'S;=`%f<%lO%T~F_VrWOy%Tz{Ft{!P%T!P!QIl!Q;'S%T;'S;=`%f<%lO%T~FyU|`OyFtyzG]z{Hd{;'SFt;'S;=`If<%lOFt~G`TOzG]z{Go{;'SG];'S;=`H^<%lOG]~GrVOzG]z{Go{!PG]!P!QHX!Q;'SG];'S;=`H^<%lOG]~H^OR~~HaP;=`<%lG]~HiW|`OyFtyzG]z{Hd{!PFt!P!QIR!Q;'SFt;'S;=`If<%lOFt~IYS|`R~Oy%Tz;'S%T;'S;=`%f<%lO%T~IiP;=`<%lFt~IsV|`S~OYIlYZ%TZyIlyzJYz;'SIl;'S;=`Jq<%lOIl~J_SS~OYJYZ;'SJY;'S;=`Jk<%lOJY~JnP;=`<%lJY~JtP;=`<%lIlmJ|[#m]Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TkKwU^ZOy%Tz![%T![!]LZ!];'S%T;'S;=`%f<%lO%TcLbS_R|`Oy%Tz;'S%T;'S;=`%f<%lO%TkLsS!ZZOy%Tz;'S%T;'S;=`%f<%lO%ThMUUrWOy%Tz!_%T!_!`Mh!`;'S%T;'S;=`%f<%lO%ThMoS|`rWOy%Tz;'S%T;'S;=`%f<%lO%TlNSW!SSrWOy%Tz!^%T!^!_Mh!_!`%T!`!aMh!a;'S%T;'S;=`%f<%lO%TjNsV!UQrWOy%Tz!_%T!_!`Mh!`!a! Y!a;'S%T;'S;=`%f<%lO%Tb! aS!UQ|`Oy%Tz;'S%T;'S;=`%f<%lO%To! rYg]Oy%Tz!b%T!b!c!!b!c!}!#R!}#T%T#T#o!#R#o#p!$O#p;'S%T;'S;=`%f<%lO%Tm!!iWg]|`Oy%Tz!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%Tm!#Y[g]|`Oy%Tz}%T}!O!#R!O!Q%T!Q![!#R![!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%To!$TW|`Oy%Tz!c%T!c!}!$m!}#T%T#T#o!$m#o;'S%T;'S;=`%f<%lO%To!$r^|`Oy%Tz}%T}!O!$m!O!Q%T!Q![!$m![!c%T!c!}!$m!}#T%T#T#o!$m#o#q%T#q#r!%n#r;'S%T;'S;=`%f<%lO%To!%uSp_|`Oy%Tz;'S%T;'S;=`%f<%lO%To!&W[#h_Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%To!'T[#h_|`Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%Tk!(OSyZOy%Tz;'S%T;'S;=`%f<%lO%Tm!(aSw]Oy%Tz;'S%T;'S;=`%f<%lO%Td!(pUOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tk!)XS!^ZOy%Tz;'S%T;'S;=`%f<%lO%Tk!)jS!]ZOy%Tz;'S%T;'S;=`%f<%lO%To!){Y#oQOr%Trs!*ksw%Twx!.wxy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tm!*pZ|`OY!*kYZ%TZr!*krs!+csy!*kyz!+vz#O!*k#O#P!-j#P;'S!*k;'S;=`!.q<%lO!*km!+jSo]|`Oy%Tz;'S%T;'S;=`%f<%lO%T]!+yWOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d<%lO!+v]!,hOo]]!,kRO;'S!+v;'S;=`!,t;=`O!+v]!,wXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!+v<%lO!+v]!-gP;=`<%l!+vm!-oU|`Oy!*kyz!+vz;'S!*k;'S;=`!.R;=`<%l!+v<%lO!*km!.UXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!*k<%lO!+vm!.tP;=`<%l!*km!.|Z|`OY!.wYZ%TZw!.wwx!+cxy!.wyz!/oz#O!.w#O#P!1^#P;'S!.w;'S;=`!2e<%lO!.w]!/rWOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W<%lO!/o]!0_RO;'S!/o;'S;=`!0h;=`O!/o]!0kXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!/o<%lO!/o]!1ZP;=`<%l!/om!1cU|`Oy!.wyz!/oz;'S!.w;'S;=`!1u;=`<%l!/o<%lO!.wm!1xXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!.w<%lO!/om!2hP;=`<%l!.w`!2nP;=`<%l$t",tokenizers:[v,y,_,0,1,2,3,4],topRules:{StyleSheet:[0,5]},specialized:[{term:116,get:e=>x[e]||-1},{term:23,get:e=>S[e]||-1}],tokenPrec:2180}),w=o.define({name:`less`,parser:C.configure({props:[t.add({Declaration:r()}),e.add({Block:c})]}),languageData:{commentTokens:{block:{open:`/*`,close:`*/`},line:`//`},indentOnInput:/^\s*\}$/,wordChars:`@-`}}),T=u(e=>e.name==`VariableName`||e.name==`AtKeyword`);function E(){return new s(w,w.data.of({autocomplete:T}))}export{E as less};
1
+ import{C as e,D as t,L as n,h as r,n as i,r as a,s as o,u as s,x as c,z as l}from"./dist-Dr9crbBz.js";import{r as u}from"./index-DaUQORCy.js";var d=110,f=1,p=2,m=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288];function h(e){return e>=65&&e<=90||e>=97&&e<=122||e>=161}function g(e){return e>=48&&e<=57}var _=new i((e,t)=>{if(e.next==40){let t=e.peek(-1);(h(t)||g(t)||t==95||t==45)&&e.acceptToken(p,1)}}),v=new i(e=>{if(m.indexOf(e.peek(-1))>-1){let{next:t}=e;(h(t)||t==95||t==35||t==46||t==91||t==58||t==45)&&e.acceptToken(d)}}),y=new i(e=>{if(m.indexOf(e.peek(-1))<0){let{next:t}=e;if(t==37&&(e.advance(),e.acceptToken(f)),h(t)){do e.advance();while(h(e.next));e.acceptToken(f)}}}),b=n({"import charset namespace keyframes media supports when":l.definitionKeyword,"from to selector":l.keyword,NamespaceName:l.namespace,KeyframeName:l.labelName,TagName:l.tagName,ClassName:l.className,PseudoClassName:l.constant(l.className),IdName:l.labelName,"FeatureName PropertyName PropertyVariable":l.propertyName,AttributeName:l.attributeName,NumberLiteral:l.number,KeywordQuery:l.keyword,UnaryQueryOp:l.operatorKeyword,"CallTag ValueName":l.atom,VariableName:l.variableName,"AtKeyword Interpolation":l.special(l.variableName),Callee:l.operatorKeyword,Unit:l.unit,"UniversalSelector NestingSelector":l.definitionOperator,MatchOp:l.compareOperator,"ChildOp SiblingOp, LogicOp":l.logicOperator,BinOp:l.arithmeticOperator,Important:l.modifier,"Comment LineComment":l.blockComment,ColorLiteral:l.color,"ParenthesizedContent StringLiteral":l.string,Escape:l.special(l.string),": ...":l.punctuation,"PseudoOp #":l.derefOperator,"; ,":l.separator,"( )":l.paren,"[ ]":l.squareBracket,"{ }":l.brace}),x={__proto__:null,lang:40,"nth-child":40,"nth-last-child":40,"nth-of-type":40,"nth-last-of-type":40,dir:40,"host-context":40,and:244,or:244,not:74,only:74,url:86,"url-prefix":86,domain:86,regexp:86,when:117,selector:142,from:172,to:174},S={__proto__:null,"@import":126,"@plugin":126,"@media":152,"@charset":156,"@namespace":160,"@keyframes":166,"@supports":178},C=a.deserialize({version:14,states:"@^O!gQWOOO!nQaO'#CeOOQP'#Cd'#CdO$RQWO'#CgO$xQaO'#EaO%cQWO'#CiO%kQWO'#DZO%pQWO'#D^O%uQaO'#DfOOQP'#Es'#EsO'YQWO'#DlO'yQWO'#DyO(QQWO'#D{O(xQWO'#D}O)TQWO'#EQO'bQWO'#EWO)YQ`O'#FTO)]Q`O'#FTO)hQ`O'#FTO)vQWO'#EYOOQO'#Er'#ErOOQO'#FV'#FVOOQO'#Ec'#EcO){QWO'#EqO*WQWO'#EqQOQWOOOOQP'#Ch'#ChOOQP,59R,59RO$RQWO,59RO*bQWO'#EdO+PQWO,58|O+_QWO,59TO%kQWO,59uO%pQWO,59xO*bQWO,59{O*bQWO,59}OOQO'#De'#DeO*bQWO,5:OO,bQpO'#E}O,iQWO'#DkOOQO,58|,58|O(QQWO,58|O,pQWO,5:{OOQO,5:{,5:{OOQT'#Cl'#ClO-UQeO,59TO.cQ[O,59TOOQP'#D]'#D]OOQP,59u,59uOOQO'#D_'#D_O.hQpO,59xOOQO'#EZ'#EZO.pQ`O,5;oOOQO,5;o,5;oO/OQWO,5:WO/VQWO,5:WOOQS'#Dn'#DnO/rQWO'#DsO/yQ!fO'#FRO0eQWO'#DtOOQS'#FS'#FSO+YQWO,5:eO'bQWO'#DrOOQS'#Cu'#CuO(QQWO'#CwO0jQ!hO'#CyO2^Q!fO,5:gO2oQWO'#DWOOQS'#Ex'#ExO(QQWO'#DQOOQO'#EP'#EPO2tQWO,5:iO2yQWO,5:iOOQO'#ES'#ESO3RQWO,5:lO3WQ!fO,5:rO3iQ`O'#EkO.pQ`O,5;oOOQO,5:|,5:|O3zQWO,5:tOOQO,5:},5:}O4XQWO,5;]OOQO-E8a-E8aOOQP1G.m1G.mOOQP'#Ce'#CeO5RQaO,5;OOOQP'#Df'#DfOOQO-E8b-E8bOOQO1G.h1G.hO(QQWO1G.hO5fQWO1G.hO5nQeO1G.oO.cQ[O1G.oOOQP1G/a1G/aO6{QpO1G/dO7fQaO1G/gO8cQaO1G/iO9`QaO1G/jO:]Q!fO'#FOO:yQ!fO'#ExOOQO'#FO'#FOOOQO,5;i,5;iO<^QWO,5;iO<iQWO,5:VO<nQ!fO1G.hOOQO1G0g1G0gO=PQWO'#CnOOQP1G.o1G.oO=WQWO'#CqOOQP1G/d1G/dO(QQWO1G/dO=_Q`O1G1ZOOQO1G1Z1G1ZO=mQWO1G/rO=rQ!fO'#FQO>WQWO1G/rO>]Q!fO'#DnO>qQWO,5:ZO>vQ!fO,5:_OOQO'#DP'#DPO'bQWO,5:]O?XQWO'#DwOOQS,5:b,5:bO?`QWO,5:dO'bQWO'#EiO?gQWO,5;mO*bQWO,5:`OOQO1G0P1G0PO?uQ!fO,5:^O@aQ!fO,59cOOQS,59e,59eO(QQWO,59iOOQS,59n,59nO@rQWO,59pOOQO1G0R1G0RO@yQ#tO,59rOARQ!fO,59lOOQO1G0T1G0TOBrQWO1G0TOBwQWO'#ETOOQO1G0W1G0WOOQO1G0^1G0^OOQO,5;V,5;VOOQO-E8i-E8iOCVQ!fO1G0bOCvQWO1G0`O%kQWO'#E_O$RQWO'#E`OEZQWO'#E^OOQO1G0b1G0bPEkQWO'#EcO<nQ!fO7+$SOOQO7+$S7+$SO(QQWO7+$SOOQP7+$Z7+$ZOOQP7+%O7+%OO(QQWO7+%OOEpQ!fO'#EeOF}QWO,5;jO(QQWO,5;jOOQO,5;j,5;jO+gQpO'#EgOG[QWO1G1TOOQO1G1T1G1TOOQO1G/q1G/qOGgQaO'#EvOGnQWO,59YOGsQWO'#EwOG}QWO,59]OHSQ!fO7+%OOOQO7+&u7+&uOOQO7+%^7+%^O(QQWO'#EhOHeQWO,5;lOHmQWO7+%^O(QQWO1G/uOOQS1G/y1G/yOOQS1G/w1G/wOHrQWO,5:cOHwQ!fO1G0OOOQS1G0O1G0OOIYQ!fO,5;TOOQO-E8g-E8gOItQaO1G/zOOQS1G.}1G.}OOQS1G/T1G/TOI{Q!fO1G/[OOQS1G/[1G/[OJ^QWO1G/^OOQO7+%o7+%oOJcQYO'#CyO+YQWO'#EjOJkQWO,5:oOOQO,5:o,5:oOJyQ!fO'#ElO(QQWO'#ElOL^QWO7+%|OOQO7+%|7+%|OOQO7+%z7+%zOOQO,5:y,5:yOOQO,5:z,5:zOLqQaO,5:xOOQO,5:x,5:xOOQO<<Gn<<GnO<nQ!fO<<GnOMRQ!fO<<HjOOQO-E8c-E8cOMdQWO1G1UOOQO,5;R,5;ROOQO-E8e-E8eOOQO7+&o7+&oOMqQWO,5;bOOQP1G.t1G.tO(QQWO'#EfOMyQWO,5;cOOQT1G.w1G.wOOQP<<Hj<<HjONRQ!fO,5;SOOQO-E8f-E8fO/OQWO<<HxONgQWO7+%aOOQS1G/}1G/}OOQS7+%j7+%jOOQS7+%f7+%fOOQS7+$v7+$vOOQS7+$x7+$xOOQO,5;U,5;UOOQO-E8h-E8hOOQO1G0Z1G0ZONnQ!fO,5;WOOQO-E8j-E8jOOQO<<Ih<<IhOOQO1G0d1G0dOOQOAN=YAN=YOOQPAN>UAN>UO!!RQWO,5;QOOQO-E8d-E8dO!!]QWOAN>dOOQS<<H{<<H{OOQOG24OG24O",stateData:"!!n~O#dOSROSSOS~OVXOYXO^TO_TOfaOgbOoaOpWOyVO!OUO!aYO!nZO!p[O!r]O!u^O!{_O#hPO#iRO~O#a#eP~P]O^XX^!}X_XXcXXjXXp!}XyXX!OXX!UXX!ZXX![XX!^XX#PXX#aXX#bXX#iXX#oXX#pXX#p!}X#x!}X!]XX~O#hjO~O^oO_oOcmOyqO!OpO!UrO#bsO#ilO#otO#ptO~OjvO![yO!^wO#P{O!Z#TX#a#TX!]#TX~P$WOd!OO#h|O~O#h!PO~O#h!RO~O#h!TO#p!VO#x!VO^!YX^#wX_!YXc!YXj!YXy!YX!O!YX!U!YX!Z!YX![!YX!^!YX#P!YX#a!YX#b!YX#i!YX#o!YX#p!YX!]!YX~Oj!XOn!WO~Og!^Oj!ZOo!^Op!^Ou!`O!i!]O#h!YO~O!^#uP~P'bOf!fOg!fOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO~On!iO{!eO#h!hO~O#h!kO~Op!nO#p!VO#x!VO^#wX~OjvO#p!VO#x!VO^#wX~O^!qO~O!Z!rO#a#eX!]#eX~O#a#eX!]#eX~P]OVXOYXO^TO_TOp!xOyVO!OUO#h!vO#iRO~OcmOjvO![!{O!^wO~Od#OO#h|O~Of!fOg#VOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO#s#WO~Oa#XO~P+gO!]#eP~P]O![!{O!^wO#P#]O!Z#Ta#a#Ta!]#Ta~OQ#^O^]a_]ac]aj]ay]a!O]a!U]a!Z]a![]a!^]a#P]a#a]a#b]a#i]a#o]a#p]a!]]aa]a~OQ#`O~Ow#aO!S#bO~Op!nO#p#dO#x#dO^#wa~O!Z#uP~P'bOa#tP~P(QOg!^Oj!ZOo!^Op!^Ou!`O!i!]O~O#h#hO~P/^OQ#mOc#pOr#lOy#oO#n#kO!^#uX!Z#uXa#uX~Oj#rO~OP#vOQmXrmXymX!ZmX#nmX^mXamXcmXfmXgmXhmXjmXlmXnmXomXpmXumX{mX#hmX#mmX!^mX#PmX#amXwmX!]mX~OQ#`Or#wOy#yO!Z#zO#n#kO~Oj#{O~O!Z#}O~On$OO{!eO~O!^$PO~OQ#mOr#lOy#oO!^wO#n#kO~O#h!TO^#_Xp#_X#p#_X#x#_X~O!O$WO!^wO#i$XO~P(QO!Z!rO#a#ea!]#ea~O^oO_oOyqO!OpO!UrO#bsO#ilO#otO#ptO~Oc#Waj#Wa![#Wa!^#Waa#Wa~P4dO![$_O!^wO~OQ#^O^]i_]ic]ij]iy]i!O]i!U]i!Z]i![]i!^]i#P]i#a]i#b]i#i]i#o]i#p]i!]]ia]i~Ow$aO!S$bO~O^oO_oOyqO!OpO#ilO~Oc!Tij!Ti!U!Ti!Z!Ti![!Ti!^!Ti#P!Ti#a!Ti#b!Ti#o!Ti#p!Ti!]!Tia!Ti~P7TOc!Vij!Vi!U!Vi!Z!Vi![!Vi!^!Vi#P!Vi#a!Vi#b!Vi#o!Vi#p!Vi!]!Via!Vi~P7TOc!Wij!Wi!U!Wi!Z!Wi![!Wi!^!Wi#P!Wi#a!Wi#b!Wi#o!Wi#p!Wi!]!Wia!Wi~P7TOQ#`O^$eOr#wOy#yO#n#kOa#rXc#rX!Z#rX~P(QO#s$fOQ#lX^#lXa#lXc#lXf#lXg#lXh#lXj#lXl#lXn#lXo#lXp#lXr#lXu#lXy#lX{#lX!Z#lX#h#lX#m#lX#n#lX~Oa$iOc$gO!Z$gO~O!]$jO~OQ#`Or#wOy#yO!^wO#n#kO~Oa#jP~P*bOa#kP~P(QOp!nO#p$pO#x$pO^#wi~O!Z$qO~OQ#`Oc$rOr#wOy#yO#n#kOa#tX~Oa$tO~OQ!bX^!dXa!bXr!bXy!bX#n!bX~O^$uO~OQ#mOa$vOr#lOy#oO#n#kO~Oa#uP~P'bOw$zO~P(QOc#pO!^#ua!Z#uaa#ua~OQ#mOr#lOy#oO#n#kOc!fa!^!fa!Z!faa!fa~OQ#`Oa%OOr#wOy#yO#n#kO~Ow%RO~P(QOn%SO|%SO~OQ#`Or#wOy#yO#n#kO!Zta^taatactaftagtahtajtaltantaotaptauta{ta#hta#mta!^ta#Pta#atawta!]ta~O!Z%TO~O!]%XO!x%VO!y%VO#m%UO~OQ#`Oc%ZOr#wOy#yO#P%]O#n#kO!Z#Oi#a#Oi!]#Oi~P(QO!Z%^OV!|iY!|i^!|i_!|if!|ig!|io!|ip!|iy!|i!O!|i!a!|i!n!|i!p!|i!r!|i!u!|i!{!|i#a!|i#h!|i#i!|i!]!|i~OjvO!Z#QX#a#QX!]#QX~P*bO!Z!rO~OQ#`Or#wOy#yO#n#kOa#XXc#XXf#XXg#XXh#XXj#XXl#XXn#XXo#XXp#XXu#XX{#XX!Z#XX#h#XX#m#XX~Oa#rac#ra!Z#ra~P(QOa%jOc$gO!Z$gO~Oa#jX~P$WOa%lO~Oc%mOa#kX~P(QOa%oO~OQ#`Or#wOw%pOy#yO#n#kO~Oc$rOa#ta~On%sO~Oa%uO~OQ#`Or#wOw%vOy#yO#n#kO~OQ#mOr#lOy#oO#n#kOc#]a!^#]a!Z#]aa#]a~Oa%wO~P4dOQ#`Or#wOw%xOy#yO#n#kO~Oa%yO~OP#vO!^mX~O!]%|O!x%VO!y%VO#m%UO~OQ#`Or#wOy#yO#n#kOc#`Xf#`Xg#`Xh#`Xj#`Xl#`Xn#`Xo#`Xp#`Xu#`X{#`X!Z#`X#P#`X#a#`X#h#`X#m#`X!]#`X~Oc%ZO#P&PO!Z#Oq#a#Oq!]#Oq~P(QOjvO!Z#Qa#a#Qa!]#Qa~P4dOQ#`Or#wOw&SOy#yO#n#kO~Oa#ric#ri!Z#ri~P(QOcmOa#ja~Oc%mOa#ka~OQ#`Or#wOy#yO#n#kOa#[ac#[a~Oa&WO~P(QOQ#`Or#wOy#yO#n#kOc#`af#`ag#`ah#`aj#`al#`an#`ao#`ap#`au#`a{#`a!Z#`a#P#`a#a#`a#h#`a#m#`a!]#`a~Oa#Yac#Ya~P(QO!Z&XO~Of#dpg#m|#iRSRr~",goto:"0^#zPPPPPP#{P$Q$^P$Q$j$QPP$sP$yPP%PPPP%jP%jP&ZPPP%jP'O%jP%jP%jP'jPP$QP(a$Q(jP$QP$Q$Q(p$QPPPP(w#{P)f)f)q)f)f)f)fP)f)t)f#{P#{P#{P){#{P*O*RPP#{P#{*U*aP*f*i*i*a*a*l*s*}+e+k+q+w+},T,_PPPP,e,k,pPP-[-_-bPPPP.u/UP/[/_/k0QP0VVdOhweXOhmrsuw#^#r$YeQOhmrsuw#^#r$YQkRQ!ulR%`$XQ}TR!}oQ#_}R$`!}Q#_!Or#x!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}R$`#O!]!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&T![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TT%V$P%WY#l![!m#j#t${s#w!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TQ!i]R$O!jQ!QUQ#PpR%_$WQ!SVR#QqZuS!w$k$}%aQxSS!znzQ#s!_Q$R!mQ$V!qS$^!|#[Q%c$]Q%z%VR&R%dc!^Z_!W!Z!`#l#m#p%sR#i!ZZ#n![!m#j#t${R!j]R!l^R$Q!lU`OhwQ!UWR$S!nVeOhwR$Z!qR$Y!qShOwR!thQnSS!yn%kR%k$kQ$d#UQ$m#`Y%f$d$m%g%t&TQ%g$eQ%t$uR&T%mQ%n$mR&U%nQ$h#YR%i$hQ$s#fR%r$sQ#q![R$|#qQ%W$PR%{%WQ!o`Q#c!UT$T!o#cQ%[$UR&O%[QiOR#ZwVfOhwUSOhwQ!wmQ#RrQ#SsQ#TuQ$k#^Q$}#rR%a$YR$l#^R$n#`Q!d[S#Uv$gQ#[yQ#f!XQ#u!bQ#|!gQ$U!qQ$]!{d$c#U#`$d$e$m$u%g%m%t&TQ$o#bQ$y#oQ%P#wQ%Q#yS%Y$U%[Q%d$_Q%e$bQ%q$rR%}%ZQzSQ!pbQ!|nQ%b$YR&Q%aQ#YvR%h$gR#g!XQ!_ZQ#e!WQ$x#mR&V%sW![Z!W#m%sQ!m_Q#j!ZQ#t!`Q$w#lR${#pVcOhwSgOwR!sh",nodeNames:`⚠ Unit ( Comment LineComment StyleSheet RuleSet UniversalSelector TagSelector TagName NestingSelector ClassSelector ClassName PseudoClassSelector : :: PseudoClassName ) ArgList , PseudoClassName ArgList VariableName AtKeyword PropertyVariable ValueName ( ParenthesizedValue ColorLiteral NumberLiteral StringLiteral Escape Interpolation BinaryExpression BinOp LogicOp UnaryExpression UnaryQueryOp CallExpression ] SubscriptExpression [ CallLiteral CallTag ParenthesizedContent IdSelector # IdName AttributeSelector AttributeName MatchOp ChildSelector ChildOp DescendantSelector SiblingSelector SiblingOp InterpolatedSelector ; when } { Block ImportStatement import KeywordQuery FeatureQuery FeatureName BinaryQuery UnaryQuery ParenthesizedQuery SelectorQuery selector CallQuery ArgList SubscriptQuery MediaStatement media CharsetStatement charset NamespaceStatement namespace NamespaceName KeyframesStatement keyframes KeyframeName KeyframeList from to SupportsStatement supports DetachedRuleSet PropertyName Declaration Important Inclusion IdSelector ClassSelector Inclusion CallExpression`,maxTerm:133,nodeProps:[[`isolate`,-3,3,4,30,``],[`openedBy`,17,`(`,59,`{`],[`closedBy`,26,`)`,60,`}`]],propSources:[b],skippedNodes:[0,3,4],repeatNodeCount:10,tokenData:"!2q~R!ZOX$tX^%l^p$tpq%lqr)Ors-xst/ltu6Zuv$tvw8^wx:Uxy;syz<Uz{<Z{|<t|}BQ}!OBc!O!PDo!P!QFY!Q![Jw![!]Kr!]!^Ln!^!_MP!_!`M{!`!aNl!a!b$t!b!c! m!c!}!&R!}#O!'y#O#P$t#P#Q!([#Q#R!(m#R#T$t#T#o!&R#o#p!)S#p#q!(m#q#r!)e#r#s!)v#s#y$t#y#z%l#z$f$t$f$g%l$g#BY$t#BY#BZ%l#BZ$IS$t$IS$I_%l$I_$I|$t$I|$JO%l$JO$JT$t$JT$JU%l$JU$KV$t$KV$KW%l$KW&FU$t&FU&FV%l&FV;'S$t;'S;=`!2k<%lO$t`$wSOy%Tz;'S%T;'S;=`%f<%lO%T`%YS|`Oy%Tz;'S%T;'S;=`%f<%lO%T`%iP;=`<%l%T~%qh#d~OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%T~'dh#d~|`OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%Tk)RUOy%Tz#]%T#]#^)e#^;'S%T;'S;=`%f<%lO%Tk)jU|`Oy%Tz#a%T#a#b)|#b;'S%T;'S;=`%f<%lO%Tk*RU|`Oy%Tz#d%T#d#e*e#e;'S%T;'S;=`%f<%lO%Tk*jU|`Oy%Tz#c%T#c#d*|#d;'S%T;'S;=`%f<%lO%Tk+RU|`Oy%Tz#f%T#f#g+e#g;'S%T;'S;=`%f<%lO%Tk+jU|`Oy%Tz#h%T#h#i+|#i;'S%T;'S;=`%f<%lO%Tk,RU|`Oy%Tz#T%T#T#U,e#U;'S%T;'S;=`%f<%lO%Tk,jU|`Oy%Tz#b%T#b#c,|#c;'S%T;'S;=`%f<%lO%Tk-RU|`Oy%Tz#h%T#h#i-e#i;'S%T;'S;=`%f<%lO%Tk-lS#PZ|`Oy%Tz;'S%T;'S;=`%f<%lO%T~-{WOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f<%lO-x~.jOn~~.mRO;'S-x;'S;=`.v;=`O-x~.yXOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f;=`<%l-x<%lO-x~/iP;=`<%l-xo/qY!OROy%Tz!Q%T!Q![0a![!c%T!c!i0a!i#T%T#T#Z0a#Z;'S%T;'S;=`%f<%lO%Tm0fY|`Oy%Tz!Q%T!Q![1U![!c%T!c!i1U!i#T%T#T#Z1U#Z;'S%T;'S;=`%f<%lO%Tm1ZY|`Oy%Tz!Q%T!Q![1y![!c%T!c!i1y!i#T%T#T#Z1y#Z;'S%T;'S;=`%f<%lO%Tm2QYl]|`Oy%Tz!Q%T!Q![2p![!c%T!c!i2p!i#T%T#T#Z2p#Z;'S%T;'S;=`%f<%lO%Tm2wYl]|`Oy%Tz!Q%T!Q![3g![!c%T!c!i3g!i#T%T#T#Z3g#Z;'S%T;'S;=`%f<%lO%Tm3lY|`Oy%Tz!Q%T!Q![4[![!c%T!c!i4[!i#T%T#T#Z4[#Z;'S%T;'S;=`%f<%lO%Tm4cYl]|`Oy%Tz!Q%T!Q![5R![!c%T!c!i5R!i#T%T#T#Z5R#Z;'S%T;'S;=`%f<%lO%Tm5WY|`Oy%Tz!Q%T!Q![5v![!c%T!c!i5v!i#T%T#T#Z5v#Z;'S%T;'S;=`%f<%lO%Tm5}Sl]|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm6^YOy%Tz!_%T!_!`6|!`!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Td7TS!SS|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm7h[h]|`Oy%Tz}%T}!O7a!O!Q%T!Q![7a![!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Ta8c[YPOy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%Ta9`[YP|`Oy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%T~:XWOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m<%lO:U~:tRO;'S:U;'S;=`:};=`O:U~;QXOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m;=`<%l:U<%lO:U~;pP;=`<%l:Uo;xSj_Oy%Tz;'S%T;'S;=`%f<%lO%T~<ZOa~m<bUVPrWOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%To<{Y#pQrWOy%Tz!O%T!O!P=k!P!Q%T!Q![@p![#R%T#R#SAm#S;'S%T;'S;=`%f<%lO%Tm=pU|`Oy%Tz!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%Tm>ZY#m]|`Oy%Tz!Q%T!Q![>S![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%Tm?OY|`Oy%Tz{%T{|?n|}%T}!O?n!O!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm?sU|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@^U#m]|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@w[#m]|`Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TbAtS#xQ|`Oy%Tz;'S%T;'S;=`%f<%lO%TkBVScZOy%Tz;'S%T;'S;=`%f<%lO%TmBhXrWOy%Tz}%T}!OCT!O!P=k!P!Q%T!Q![@p![;'S%T;'S;=`%f<%lO%TmCYW|`Oy%Tz!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%TmCy[f]|`Oy%Tz}%T}!OCr!O!Q%T!Q![Cr![!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%ToDtW#iROy%Tz!O%T!O!PE^!P!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%TlEcU|`Oy%Tz!O%T!O!PEu!P;'S%T;'S;=`%f<%lO%TlE|S#s[|`Oy%Tz;'S%T;'S;=`%f<%lO%T~F_VrWOy%Tz{Ft{!P%T!P!QIl!Q;'S%T;'S;=`%f<%lO%T~FyU|`OyFtyzG]z{Hd{;'SFt;'S;=`If<%lOFt~G`TOzG]z{Go{;'SG];'S;=`H^<%lOG]~GrVOzG]z{Go{!PG]!P!QHX!Q;'SG];'S;=`H^<%lOG]~H^OR~~HaP;=`<%lG]~HiW|`OyFtyzG]z{Hd{!PFt!P!QIR!Q;'SFt;'S;=`If<%lOFt~IYS|`R~Oy%Tz;'S%T;'S;=`%f<%lO%T~IiP;=`<%lFt~IsV|`S~OYIlYZ%TZyIlyzJYz;'SIl;'S;=`Jq<%lOIl~J_SS~OYJYZ;'SJY;'S;=`Jk<%lOJY~JnP;=`<%lJY~JtP;=`<%lIlmJ|[#m]Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TkKwU^ZOy%Tz![%T![!]LZ!];'S%T;'S;=`%f<%lO%TcLbS_R|`Oy%Tz;'S%T;'S;=`%f<%lO%TkLsS!ZZOy%Tz;'S%T;'S;=`%f<%lO%ThMUUrWOy%Tz!_%T!_!`Mh!`;'S%T;'S;=`%f<%lO%ThMoS|`rWOy%Tz;'S%T;'S;=`%f<%lO%TlNSW!SSrWOy%Tz!^%T!^!_Mh!_!`%T!`!aMh!a;'S%T;'S;=`%f<%lO%TjNsV!UQrWOy%Tz!_%T!_!`Mh!`!a! Y!a;'S%T;'S;=`%f<%lO%Tb! aS!UQ|`Oy%Tz;'S%T;'S;=`%f<%lO%To! rYg]Oy%Tz!b%T!b!c!!b!c!}!#R!}#T%T#T#o!#R#o#p!$O#p;'S%T;'S;=`%f<%lO%Tm!!iWg]|`Oy%Tz!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%Tm!#Y[g]|`Oy%Tz}%T}!O!#R!O!Q%T!Q![!#R![!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%To!$TW|`Oy%Tz!c%T!c!}!$m!}#T%T#T#o!$m#o;'S%T;'S;=`%f<%lO%To!$r^|`Oy%Tz}%T}!O!$m!O!Q%T!Q![!$m![!c%T!c!}!$m!}#T%T#T#o!$m#o#q%T#q#r!%n#r;'S%T;'S;=`%f<%lO%To!%uSp_|`Oy%Tz;'S%T;'S;=`%f<%lO%To!&W[#h_Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%To!'T[#h_|`Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%Tk!(OSyZOy%Tz;'S%T;'S;=`%f<%lO%Tm!(aSw]Oy%Tz;'S%T;'S;=`%f<%lO%Td!(pUOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tk!)XS!^ZOy%Tz;'S%T;'S;=`%f<%lO%Tk!)jS!]ZOy%Tz;'S%T;'S;=`%f<%lO%To!){Y#oQOr%Trs!*ksw%Twx!.wxy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tm!*pZ|`OY!*kYZ%TZr!*krs!+csy!*kyz!+vz#O!*k#O#P!-j#P;'S!*k;'S;=`!.q<%lO!*km!+jSo]|`Oy%Tz;'S%T;'S;=`%f<%lO%T]!+yWOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d<%lO!+v]!,hOo]]!,kRO;'S!+v;'S;=`!,t;=`O!+v]!,wXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!+v<%lO!+v]!-gP;=`<%l!+vm!-oU|`Oy!*kyz!+vz;'S!*k;'S;=`!.R;=`<%l!+v<%lO!*km!.UXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!*k<%lO!+vm!.tP;=`<%l!*km!.|Z|`OY!.wYZ%TZw!.wwx!+cxy!.wyz!/oz#O!.w#O#P!1^#P;'S!.w;'S;=`!2e<%lO!.w]!/rWOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W<%lO!/o]!0_RO;'S!/o;'S;=`!0h;=`O!/o]!0kXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!/o<%lO!/o]!1ZP;=`<%l!/om!1cU|`Oy!.wyz!/oz;'S!.w;'S;=`!1u;=`<%l!/o<%lO!.wm!1xXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!.w<%lO!/om!2hP;=`<%l!.w`!2nP;=`<%l$t",tokenizers:[v,y,_,0,1,2,3,4],topRules:{StyleSheet:[0,5]},specialized:[{term:116,get:e=>x[e]||-1},{term:23,get:e=>S[e]||-1}],tokenPrec:2180}),w=o.define({name:`less`,parser:C.configure({props:[t.add({Declaration:r()}),e.add({Block:c})]}),languageData:{commentTokens:{block:{open:`/*`,close:`*/`},line:`//`},indentOnInput:/^\s*\}$/,wordChars:`@-`}}),T=u(e=>e.name==`VariableName`||e.name==`AtKeyword`);function E(){return new s(w,w.data.of({autocomplete:T}))}export{E as less};