chill-agent 1.5.0 → 1.6.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 (187) hide show
  1. package/.claude-plugin/contrast-mcp-launcher.mjs +31 -0
  2. package/.claude-plugin/plugin.json +8 -3
  3. package/.cline-plugin/plugin.js +6 -0
  4. package/.codex-plugin/plugin.json +4 -3
  5. package/.cursor-plugin/marketplace.json +16 -0
  6. package/.cursor-plugin/plugin.json +2 -2
  7. package/.devin-plugin/plugin.json +2 -2
  8. package/.kimi-plugin/plugin.json +11 -29
  9. package/.omp-plugin/marketplace.json +15 -0
  10. package/.openclaw/skills/ponytail/SKILL.md +2 -7
  11. package/.openclaw/skills/ponytail-audit/SKILL.md +3 -6
  12. package/.openclaw/skills/ponytail-debt/SKILL.md +3 -4
  13. package/.openclaw/skills/ponytail-gain/SKILL.md +3 -4
  14. package/.openclaw/skills/ponytail-help/SKILL.md +3 -3
  15. package/.openclaw/skills/ponytail-review/SKILL.md +3 -6
  16. package/.opencode/plugins/ponytail.mjs +1 -1
  17. package/.qoder-plugin/plugin.json +12 -26
  18. package/AGENTS.md +32 -19
  19. package/__init__.py +1 -1
  20. package/assets/antislop-banner.png +0 -0
  21. package/assets/band/band.png +0 -0
  22. package/assets/band/board.png +0 -0
  23. package/assets/benchmark-3model.svg +21 -0
  24. package/assets/benchmark-agentic.svg +62 -0
  25. package/assets/codex-icon.png +0 -0
  26. package/assets/compare/code/after.webp +0 -0
  27. package/assets/compare/code/before.webp +0 -0
  28. package/assets/compare/text/after.webp +0 -0
  29. package/assets/compare/text/before.webp +0 -0
  30. package/assets/compare/ui/w-all.webp +0 -0
  31. package/assets/compare/ui/w-antislop.webp +0 -0
  32. package/assets/compare/ui/w-design.webp +0 -0
  33. package/assets/compare/ui/without.webp +0 -0
  34. package/assets/logo-dark.png +0 -0
  35. package/assets/logo-dark.svg +115 -0
  36. package/assets/logo-greenpt-dark.svg +27 -0
  37. package/assets/logo-greenpt.svg +27 -0
  38. package/assets/logo.png +0 -0
  39. package/assets/photoreunion-logo-dark.svg +4 -0
  40. package/assets/photoreunion-logo-light.svg +4 -0
  41. package/assets/profile.png +0 -0
  42. package/assets/retriever-logo-dark.svg +4 -0
  43. package/assets/retriever-logo-light.svg +4 -0
  44. package/assets/stories-banner.png +0 -0
  45. package/assets/v5/audit-es.png +0 -0
  46. package/assets/v5/audit-ja.png +0 -0
  47. package/assets/v5/audit-ko.png +0 -0
  48. package/assets/v5/audit-zh-CN.png +0 -0
  49. package/assets/v5/audit.png +0 -0
  50. package/assets/v5/beforeafter-es.png +0 -0
  51. package/assets/v5/beforeafter-ja.png +0 -0
  52. package/assets/v5/beforeafter-ko.png +0 -0
  53. package/assets/v5/beforeafter-zh-CN.png +0 -0
  54. package/assets/v5/beforeafter.png +0 -0
  55. package/assets/v5/chart-es.png +0 -0
  56. package/assets/v5/chart-ja.png +0 -0
  57. package/assets/v5/chart-ko.png +0 -0
  58. package/assets/v5/chart-zh-CN.png +0 -0
  59. package/assets/v5/chart.png +0 -0
  60. package/assets/v5/hero-es.jpg +0 -0
  61. package/assets/v5/hero-ja.jpg +0 -0
  62. package/assets/v5/hero-ko.jpg +0 -0
  63. package/assets/v5/hero-zh-CN.jpg +0 -0
  64. package/assets/v5/hero.jpg +0 -0
  65. package/assets/v5/ladder-es.png +0 -0
  66. package/assets/v5/ladder-ja.png +0 -0
  67. package/assets/v5/ladder-ko.png +0 -0
  68. package/assets/v5/ladder-zh-CN.png +0 -0
  69. package/assets/v5/ladder.png +0 -0
  70. package/assets/v5/review-es.png +0 -0
  71. package/assets/v5/review-ja.png +0 -0
  72. package/assets/v5/review-ko.png +0 -0
  73. package/assets/v5/review-zh-CN.png +0 -0
  74. package/assets/v5/review.png +0 -0
  75. package/assets/v5/tests-es.png +0 -0
  76. package/assets/v5/tests-ja.png +0 -0
  77. package/assets/v5/tests-ko.png +0 -0
  78. package/assets/v5/tests-zh-CN.png +0 -0
  79. package/assets/v5/tests.png +0 -0
  80. package/assets/waitlist-banner-es.png +0 -0
  81. package/assets/waitlist-banner-ja.png +0 -0
  82. package/assets/waitlist-banner-ko.png +0 -0
  83. package/assets/waitlist-banner-zh-CN.png +0 -0
  84. package/assets/waitlist-banner.png +0 -0
  85. package/benchmarks/.env.example +2 -0
  86. package/benchmarks/agentic/README.md +201 -0
  87. package/benchmarks/agentic/answer.py +288 -0
  88. package/benchmarks/agentic/compare.py +93 -0
  89. package/benchmarks/agentic/complete.py +178 -0
  90. package/benchmarks/agentic/judge.py +198 -0
  91. package/benchmarks/agentic/run.py +543 -0
  92. package/benchmarks/agentic/tasks.py +1544 -0
  93. package/benchmarks/arms/baseline.js +2 -0
  94. package/benchmarks/arms/caveman-SKILL.md +67 -0
  95. package/benchmarks/arms/caveman.js +8 -0
  96. package/benchmarks/arms/ponytail.js +8 -0
  97. package/benchmarks/behavior.js +54 -0
  98. package/benchmarks/behavior.yaml +40 -0
  99. package/benchmarks/correctness.js +291 -0
  100. package/benchmarks/loc.js +17 -19
  101. package/benchmarks/promptfooconfig.gemini.yaml +32 -0
  102. package/benchmarks/promptfooconfig.gpt-newest.yaml +33 -0
  103. package/benchmarks/promptfooconfig.yaml +41 -0
  104. package/benchmarks/results/2026-06-12-caveman-vs-ponytail.md +71 -0
  105. package/benchmarks/results/2026-06-12-v4-hardening-vs-caveman.md +125 -0
  106. package/benchmarks/results/2026-06-15-llama3.2-local.md +82 -0
  107. package/benchmarks/results/2026-06-16-correctness-gate-fix.md +113 -0
  108. package/benchmarks/results/2026-06-16-robustness-audit.md +135 -0
  109. package/benchmarks/results/2026-06-17-agentic-safety.md +164 -0
  110. package/benchmarks/results/2026-06-17-cost-verification.md +93 -0
  111. package/benchmarks/results/2026-06-18-agentic.md +219 -0
  112. package/benchmarks/results/2026-06-22-issue-245-217-comprehension.md +98 -0
  113. package/benchmarks/results/2026-10-07-agentic.md +186 -0
  114. package/cli/index.mjs +241 -0
  115. package/cli/lib/banner.mjs +21 -0
  116. package/cli/lib/install.mjs +498 -0
  117. package/cli/lib/settings.mjs +48 -0
  118. package/cli/package-lock.json +87 -0
  119. package/cli/package.json +42 -0
  120. package/cli/scripts/smoke-test.mjs +95 -0
  121. package/cli/scripts/smoke-worker.mjs +411 -0
  122. package/cli/scripts/sync-skills.mjs +81 -0
  123. package/examples/email-validation.md +156 -0
  124. package/examples/group-by.md +35 -0
  125. package/examples/infinite-scroll.md +58 -0
  126. package/examples/number-formatting.md +37 -0
  127. package/examples/rate-limit.md +272 -0
  128. package/examples/react-countdown.md +390 -0
  129. package/examples/url-params.md +41 -0
  130. package/gemini-extension.json +2 -2
  131. package/hooks/band/board.ts +560 -0
  132. package/hooks/band/logo.ts +3 -0
  133. package/hooks/band/metrics.ts +311 -0
  134. package/hooks/band/register.tsx +495 -0
  135. package/hooks/band/types.d.ts +34 -0
  136. package/hooks/claude-band.json +6 -0
  137. package/hooks/claude-codex-hooks.json +34 -4
  138. package/hooks/copilot-hooks.json +12 -2
  139. package/hooks/cursor-hooks.json +2 -2
  140. package/hooks/ponytail-band-import.js +274 -0
  141. package/hooks/ponytail-config.js +175 -0
  142. package/hooks/ponytail-map.js +111 -0
  143. package/hooks/ponytail-subagent.js +94 -0
  144. package/hooks/qoder-hooks.json +19 -4
  145. package/i18n/README.ko.md +230 -0
  146. package/package.json +12 -7
  147. package/pi-extension/test/extension.test.js +367 -0
  148. package/pi-extension/test/helpers.test.js +179 -0
  149. package/plugin.yaml +21 -12
  150. package/rules/antislop.mdc +18 -0
  151. package/scripts/build-openclaw-skills.js +60 -0
  152. package/scripts/check-repo.mjs +389 -0
  153. package/scripts/publish-openclaw-skills.js +75 -0
  154. package/scripts/skill-index.mjs +81 -0
  155. package/skills/antislop/SKILL.md +700 -0
  156. package/skills/antislop/VERSION +1 -0
  157. package/skills/antislop-code/SKILL.md +128 -0
  158. package/skills/antislop-copywriting/SKILL.md +407 -0
  159. package/skills/antislop-human/LICENSE-web-quality-skills +21 -0
  160. package/skills/antislop-human/SKILL.md +204 -0
  161. package/skills/antislop-human/contrast-check.py +168 -0
  162. package/skills/antislop-human/contrast-mcp.py +121 -0
  163. package/skills/antislop-human/references/A11Y-PATTERNS.md +249 -0
  164. package/skills/antislop-human/references/WCAG.md +127 -0
  165. package/skills/antislop-layoutmobile/SKILL.md +170 -0
  166. package/skills/antislop-ui/LICENSE-web-quality-skills +21 -0
  167. package/skills/antislop-ui/SKILL.md +344 -0
  168. package/skills/antislop-ui/references/CORE-WEB-VITALS.md +181 -0
  169. package/skills/antislop-ui/references/WEB-BASELINE.md +28 -0
  170. package/skills/plugin.json +5 -0
  171. package/src/package.json +3 -0
  172. package/tests/activation-map.test.js +63 -0
  173. package/tests/band-import.test.js +111 -0
  174. package/tests/band.test.tsx +520 -0
  175. package/tests/behavior.test.js +80 -0
  176. package/tests/gemini-extension.test.js +2 -2
  177. package/tests/grok-plugin.test.js +1 -1
  178. package/tests/hermes-plugin.test.js +1 -1
  179. package/tests/hooks-windows.test.js +205 -0
  180. package/tests/kimi-plugin.test.js +1 -1
  181. package/tests/map.test.js +30 -0
  182. package/tests/package-scripts.test.js +35 -0
  183. package/tests/package.test.js +23 -0
  184. package/tests/uninstall.test.js +202 -0
  185. /package/bin/{chill-agent.js → chill-agent.mjs} +0 -0
  186. /package/tests/{manifests.test.js → manifests.test.mjs} +0 -0
  187. /package/tests/{rules.test.js → rules.test.mjs} +0 -0
@@ -0,0 +1,3 @@
1
+ // The ponytail face from assets/logo-dark.svg, path numbers rounded to whole units (invisible at board sizes).
2
+ export const LOGO_VIEWBOX = '0 0 1085 1241'
3
+ export const LOGO_PATHS = '<g><g transform="matrix(1,0,0,1,35.854505,-7.205947)"><g transform="matrix(0.950749,0,0,0.950749,24.952881,30.915249)"><path d="M6,657C6,657 5,656 5,656C1,646 3,635 10,628C14,623 20,620 25,615C29,609 33,603 36,596C36,596 36,596 36,595C48,575 61,557 78,541C78,541 78,541 78,541C82,537 87,533 91,530C90,525 90,519 90,514C91,512 91,510 92,509C94,502 97,496 102,490C97,483 95,474 98,465C101,456 104,447 108,438C109,434 110,430 111,426C112,417 111,407 113,397C113,397 113,396 113,395C114,395 114,394 114,393C112,385 111,377 114,368C114,368 114,368 114,368C117,358 123,348 129,340C137,326 140,311 144,296C144,296 144,296 144,296C148,285 151,274 157,265C160,260 165,256 168,251L168,250C168,249 170,244 171,241C178,223 183,204 197,190C202,185 208,182 214,180C218,175 222,171 226,167C227,165 229,164 230,163L230,162C237,149 245,136 256,126L256,126C259,123 266,119 270,117C271,116 273,114 274,113C282,104 291,97 301,92C305,90 310,89 314,87C321,83 327,78 334,75C334,75 334,74 335,74C342,71 348,67 355,63C356,63 356,62 357,62C362,60 366,58 370,55C368,53 367,50 366,46C363,39 364,31 368,24C373,15 381,8 391,5C391,5 392,5 392,5C404,3 417,1 430,2C447,2 465,5 482,10C482,11 483,11 484,11C495,16 506,21 515,26C519,24 522,21 526,19C527,18 532,14 534,13L534,13C543,7 554,4 565,1C566,1 567,1 568,1C580,0 593,-2 605,-2C624,-1 642,2 661,4C676,5 690,8 704,12L704,12C728,18 751,24 774,33C774,33 775,33 775,34C783,37 790,40 798,43C811,50 826,57 836,69C839,71 842,75 843,77C858,85 873,95 886,106C891,110 896,115 900,120C905,124 911,128 917,132C917,132 918,132 918,133C925,138 931,144 937,150C945,158 952,169 956,180C956,182 957,183 957,184C958,188 958,193 960,197C964,204 969,210 974,216C974,216 975,217 975,217C982,226 984,237 991,246L991,246C997,253 1002,259 1006,267C1010,274 1014,282 1017,290C1017,290 1018,291 1018,292C1019,296 1021,303 1022,305C1023,307 1023,308 1024,309C1026,312 1028,315 1029,318C1030,323 1030,328 1029,333C1029,334 1029,335 1029,335L1029,335C1031,347 1031,358 1030,369C1030,371 1029,373 1029,375C1026,383 1024,392 1019,399C1017,401 1015,403 1012,405C1012,407 1011,409 1010,411C1008,417 1006,422 1003,427C1004,429 1004,431 1005,433L1005,433C1007,442 1007,451 1008,460C1010,470 1009,480 1012,490C1015,501 1017,513 1019,525C1019,525 1019,526 1019,526C1021,541 1025,555 1027,569C1027,570 1027,571 1027,571C1029,599 1023,626 1020,653C1020,660 1019,668 1018,675C1018,680 1017,684 1017,688C1017,688 1017,688 1017,689C1016,701 1016,713 1015,726C1015,726 1015,726 1015,726C1014,741 1011,756 1007,770C1007,771 1006,771 1006,771C1002,784 1000,797 994,809C994,810 994,810 994,811C991,817 988,824 985,831C985,832 985,832 984,833C980,842 975,851 970,860C970,860 969,860 969,861C966,866 963,871 961,877C961,877 961,878 961,878C959,882 957,887 955,891C956,893 957,895 958,897C958,897 958,898 958,898C961,910 957,918 952,925C947,931 936,936 927,936C926,936 926,936 925,936C925,936 924,936 924,936C921,939 918,941 915,944C915,944 914,944 914,945C908,950 901,954 893,958C893,958 893,958 892,959C885,962 878,965 872,970L871,970C864,977 856,982 848,987C842,992 836,996 829,999C822,1003 814,1005 807,1009L807,1009C795,1016 781,1020 767,1018C763,1018 759,1017 755,1017C751,1018 746,1019 741,1019C730,1019 719,1019 708,1016C698,1014 688,1013 678,1013C676,1013 673,1013 671,1013C670,1014 667,1015 665,1016C657,1019 642,1016 642,1016C642,1016 644,1017 645,1017C640,1016 635,1013 631,1009C628,1009 625,1010 623,1010L622,1010C614,1010 605,1010 596,1008C583,1007 570,1007 557,1005L557,1005C551,1005 546,1005 540,1004C529,1003 517,1003 506,1000C490,997 474,990 459,985C455,985 451,983 447,984L448,984C443,984 434,982 431,981C416,981 400,980 385,977C375,975 366,972 357,968C356,968 356,968 356,968C340,962 323,957 309,947C293,937 282,921 266,911C253,905 242,898 231,890C232,900 234,910 234,920L234,920C234,937 233,954 230,971C228,989 226,1007 223,1024L223,1024C219,1046 216,1068 206,1088C205,1089 205,1089 205,1090C199,1101 193,1112 184,1121C180,1125 175,1128 170,1129C166,1140 159,1149 153,1158C153,1161 152,1165 152,1168C150,1174 147,1180 144,1186C138,1197 126,1202 114,1201C104,1212 93,1222 81,1231C80,1232 80,1232 79,1233C75,1235 72,1236 68,1236C64,1241 59,1245 54,1248L54,1248C43,1255 31,1258 19,1257C8,1256 -1,1248 -5,1238C-9,1228 -6,1216 2,1209C4,1207 7,1205 9,1203C9,1199 10,1194 12,1190C16,1182 21,1176 26,1170C26,1170 25,1169 24,1169C12,1166 3,1155 4,1142C4,1134 6,1127 11,1121C17,1113 24,1106 27,1096C29,1087 32,1078 35,1069C38,1059 41,1049 42,1038L42,1038C42,1024 42,1010 40,996L40,995C39,988 35,982 32,975C27,965 24,955 20,946C15,935 14,923 11,912C11,912 11,912 11,911C6,893 -2,875 -2,856C-2,847 -2,839 -2,830C-4,828 -6,826 -7,823C-12,814 -15,804 -16,795C-18,784 -17,773 -17,762C-17,761 -17,761 -17,761C-16,751 -17,740 -14,730C-9,706 -3,681 6,657ZM1020,380C1019,382 1019,384 1019,384C1019,384 1020,382 1020,381L1020,380Z" fill="#fff"/></g><g transform="matrix(0.950749,0,0,0.950749,24.952881,30.915249)"><g><path d="M570,29C582,28 593,26 604,26C622,27 640,30 658,32C671,33 684,35 697,39C719,45 742,50 763,59C770,62 778,65 785,68C796,74 808,78 816,87C820,92 823,97 828,100C842,108 856,118 869,128C873,131 876,135 880,138C886,145 894,150 901,155C907,159 912,164 917,169C923,175 927,183 930,191C932,197 932,204 936,211C940,219 946,226 952,234C959,243 962,254 969,264C974,269 978,274 982,280C985,287 988,294 991,301C994,308 994,317 1000,323C1000,324 999,325 999,325C1000,326 1001,326 1002,326C999,330 1001,335 1002,339C1003,348 1003,357 1002,366C1000,372 999,377 996,382C995,380 993,378 992,376C993,373 995,371 994,368C993,363 991,358 991,353C990,347 991,341 988,336C986,337 984,339 982,341C987,349 989,358 988,367C987,370 989,373 989,376C989,379 988,383 987,386C986,391 986,396 984,401C981,408 978,415 974,422C975,428 976,434 978,440C980,448 980,456 981,464C983,475 982,487 985,498C988,508 990,519 992,530C994,544 997,559 999,573C1001,599 995,624 992,650C992,658 991,665 991,673C990,678 989,682 989,687C988,699 988,712 987,724C986,737 983,750 980,763C976,775 974,787 969,799C965,806 963,813 960,820C955,829 950,837 945,846C941,853 937,860 935,868C931,877 925,886 922,896C925,899 930,901 931,905C932,908 928,908 926,908C922,908 919,905 916,903C910,910 904,917 897,922C892,927 886,930 880,934C871,938 861,942 853,949C847,955 840,960 833,964C828,968 822,971 816,974C809,978 801,981 794,985C786,989 778,991 770,991C763,990 756,988 749,987C747,989 745,992 742,991C733,991 724,992 715,989C703,986 690,985 677,985C670,985 663,985 656,986C655,987 655,989 655,990C653,991 652,990 650,989C651,988 652,987 652,986C643,981 633,982 623,982C615,982 608,982 600,981C587,980 573,979 560,977C555,977 549,977 544,977C533,975 522,975 512,973C496,970 481,963 465,958C459,957 452,955 446,956C442,956 438,953 433,953C419,953 404,952 390,949C382,948 374,945 366,942C352,937 337,933 325,924C308,913 296,896 279,887C254,874 232,856 210,839C207,837 204,835 202,832C198,821 191,812 186,801C183,796 180,790 176,786C181,799 184,813 189,826C194,836 195,848 197,859C200,870 201,880 203,891C204,901 206,910 206,920C206,936 206,951 203,967C200,984 199,1002 195,1019C192,1038 190,1058 181,1076C176,1084 171,1094 164,1101C162,1103 159,1103 156,1104C163,1088 173,1074 176,1058C179,1049 182,1040 182,1031C179,1036 177,1043 173,1048C167,1058 162,1068 157,1078C151,1091 148,1104 144,1118C141,1129 133,1137 128,1147C126,1151 126,1155 125,1160C124,1164 122,1168 120,1172C119,1174 116,1174 114,1173C111,1172 110,1169 108,1166C104,1169 102,1174 98,1177C88,1189 76,1200 64,1209C61,1211 60,1207 58,1206C52,1213 46,1220 39,1225C34,1228 27,1230 21,1229C25,1226 30,1223 34,1220C43,1211 54,1203 57,1190C50,1192 49,1200 43,1203C41,1204 39,1203 37,1202C41,1194 48,1188 54,1181C58,1177 60,1171 63,1166C68,1158 70,1149 73,1140C74,1137 75,1134 74,1131C73,1125 74,1119 75,1113C73,1114 71,1115 70,1117C64,1123 57,1128 51,1133C46,1136 41,1139 36,1142C34,1143 33,1143 32,1142C32,1141 32,1139 33,1138C41,1128 50,1117 54,1104C56,1095 59,1086 62,1076C65,1064 69,1052 69,1039C70,1023 70,1007 68,992C66,982 61,973 57,964C53,954 50,944 46,934C41,925 40,914 38,904C33,888 26,873 26,856C26,833 24,810 28,787C30,775 33,764 35,752C36,744 39,737 40,729C42,715 45,700 48,686C49,679 51,673 53,666C55,655 61,646 63,636C60,639 57,643 55,646C53,652 51,657 48,662C44,672 41,682 36,692C32,706 29,720 24,734C20,745 21,758 19,769C18,780 17,790 19,801C20,806 22,810 23,814C21,813 18,812 17,810C14,804 12,797 11,790C10,781 11,771 11,762C12,753 11,745 13,736C19,705 27,674 41,646C38,646 34,646 31,646C36,641 42,638 46,633C52,626 57,617 61,609C71,591 83,575 97,561C105,554 114,547 124,542C121,534 117,526 118,517C121,509 128,503 135,499C138,498 141,497 142,494C141,490 138,488 136,485C134,481 133,476 132,471C129,472 127,473 125,474C128,465 130,457 134,449C136,443 136,438 138,433C140,423 139,412 141,402C142,398 143,393 142,389C140,385 139,381 141,376C143,369 148,362 153,356C162,340 166,322 171,304C174,296 175,287 180,279C184,274 189,270 192,265C195,261 195,255 198,251C203,236 206,221 217,210C220,206 226,205 231,204C235,198 240,192 246,186C249,183 253,179 255,175C260,164 267,154 276,146C278,143 283,143 286,141C289,138 292,135 295,131C300,125 307,120 314,116C318,114 322,114 326,112C333,108 340,103 347,100C354,96 362,92 369,87C386,79 402,68 420,62C431,58 443,58 454,59C461,59 468,60 475,57C469,53 462,52 456,50C443,46 430,46 417,44C408,44 400,42 392,38C394,36 395,33 398,33C408,30 419,29 429,30C444,30 459,32 473,37C484,42 495,46 505,52C508,54 511,57 515,58C521,56 526,54 531,50C534,47 537,45 541,43C544,41 546,38 549,36C556,32 563,30 570,29M597,36C597,39 598,42 601,43C604,43 605,38 603,37C601,36 599,36 597,36M544,90C539,86 532,88 526,88C528,91 532,93 531,97C530,100 527,102 524,103C521,102 519,99 516,98C514,99 513,101 511,102C504,104 496,104 490,108C483,112 478,119 475,126C470,133 465,140 461,148C450,163 439,178 427,192C424,197 420,201 417,206C410,217 403,229 395,239C393,242 390,245 387,244C386,237 387,229 390,222C399,204 408,186 416,168C418,166 418,163 418,161C412,160 407,165 403,170C400,175 398,180 394,184C387,190 380,197 372,202C367,206 362,209 356,211C353,213 352,217 349,218C340,222 333,229 326,236C321,240 315,244 314,251C312,252 310,253 308,255C302,264 297,273 291,282C288,285 286,290 283,294C281,298 278,301 276,305C275,308 274,312 273,315C271,322 268,330 266,337C265,340 267,344 267,347C266,353 263,358 261,364C258,370 255,376 252,382C249,385 249,390 248,395C248,399 247,402 246,406C256,407 266,407 276,406C278,401 279,397 281,392C282,388 280,384 280,380C283,381 284,384 284,387C287,387 290,388 292,390C295,392 299,392 302,393C302,398 299,402 299,406C301,407 303,407 305,407C316,407 328,407 339,410C351,410 364,410 376,409C391,411 406,411 421,412C427,413 434,415 440,415C445,414 445,409 448,406C454,396 465,390 476,387C481,386 486,384 491,384C500,384 510,384 519,384C529,385 538,387 548,388C561,390 574,394 587,398C605,404 624,411 639,424C645,430 649,438 652,446C662,443 672,439 682,436C685,435 688,436 691,437C704,440 716,446 723,458C725,454 727,450 731,448C737,444 743,441 749,439C776,434 804,434 831,435C839,435 847,438 855,440C863,444 871,449 877,455C884,463 891,471 896,480C898,479 900,479 902,479C911,479 921,481 930,484C942,488 954,494 967,496C966,486 966,476 965,466C964,461 962,457 962,453C962,449 961,446 960,443C957,431 955,419 951,408C949,395 948,381 946,368C946,362 943,356 943,350C940,350 936,350 934,348C931,346 931,342 929,340C927,337 926,333 928,329C929,327 932,326 934,324C929,315 923,306 917,298C914,294 908,294 906,290C904,287 905,284 906,280C896,266 881,255 873,239C870,234 867,229 866,223C861,222 858,220 854,217C847,212 840,207 835,200C834,207 840,213 843,219C845,226 850,232 854,238C858,245 863,251 869,257C876,263 882,270 890,275C893,277 897,280 896,284C894,286 892,287 889,287C883,287 878,283 873,280C862,272 854,260 847,249C842,241 837,234 833,225C828,215 823,204 818,194C816,189 811,185 807,181C796,172 784,162 774,152C769,148 765,143 760,140C753,135 745,134 738,130C731,126 726,119 719,115C710,110 702,106 692,103C680,99 666,96 653,95C650,95 646,94 643,96C638,99 634,105 628,104C624,104 622,100 619,98C616,98 614,100 612,98C609,97 611,91 607,90C599,89 591,90 584,88C579,88 574,90 569,90C566,90 564,87 564,84C565,82 565,80 566,78C563,79 560,80 557,80C555,80 553,79 551,79C548,82 547,87 544,90M623,80C625,82 627,84 630,83C628,81 626,80 623,80M778,133C779,135 779,136 780,137C780,138 779,140 779,141C781,144 783,146 786,148C791,154 797,160 803,164C801,160 799,156 797,152C796,149 794,146 791,144C787,140 783,136 778,133M854,150C854,150 854,151 853,151C854,155 858,149 854,150M932,257C934,264 938,271 944,276C945,274 946,273 945,271C944,264 937,260 932,257M963,279C963,289 966,300 968,310C970,316 977,318 981,323C981,322 983,321 983,320C982,313 978,306 975,299C972,292 970,284 963,279M223,332C224,333 224,333 223,332M218,381C217,383 217,385 217,387C219,389 221,390 224,391C226,388 227,385 228,382C225,381 221,380 218,381M189,382C188,384 187,386 187,389C188,387 190,386 191,384C191,383 190,383 189,382M461,410C456,415 456,422 456,428C456,439 461,451 470,458C477,465 485,471 492,478C505,487 519,495 535,496C550,498 566,498 581,496C589,495 598,494 606,491C604,490 602,489 600,487C604,485 609,484 613,484C616,483 619,483 622,482C627,479 630,474 632,470C634,467 636,465 635,462C634,459 632,457 631,454C629,450 632,446 633,442C629,440 625,437 621,436C616,435 612,434 609,430C607,427 610,424 612,422C608,419 602,418 597,416C590,412 582,410 574,408C562,405 550,401 537,400C532,400 526,402 521,402C518,402 517,399 516,396C509,396 501,396 494,397C482,397 469,402 461,410M230,420C228,423 229,427 226,430C223,430 219,428 216,429C213,431 209,431 206,433C200,434 195,435 190,437C194,440 200,440 204,443C214,449 220,459 226,468C228,470 227,473 225,474C221,477 215,476 211,479C209,482 208,485 207,489C211,493 216,497 221,500C221,504 219,508 215,509C211,510 207,513 204,514C201,516 199,515 197,514C199,503 203,492 205,480C201,480 196,479 195,475C195,471 197,468 200,466C203,463 202,457 198,456C195,454 192,454 188,454C183,455 180,460 177,464C174,469 176,475 177,481C178,488 184,496 182,504C182,507 184,510 186,512C185,514 184,515 184,517C187,516 189,515 192,514C193,514 194,515 195,516C194,518 194,520 193,523C192,524 190,525 189,526C191,531 194,536 199,539C203,538 206,536 209,535C211,537 212,540 212,543C210,547 206,549 202,550C196,550 191,550 185,550C183,550 179,551 179,548C178,553 178,558 176,563C174,577 174,590 173,604C173,608 170,612 169,616C167,623 167,630 167,637C167,647 167,656 168,666C168,670 169,675 171,678C164,685 168,697 160,704C162,710 164,715 165,720C167,730 171,738 175,747C184,762 190,779 201,793C202,793 203,793 205,793C204,794 204,796 205,797C210,806 215,814 220,823C222,827 226,830 229,833C237,840 246,845 255,852C258,854 261,857 265,858C269,859 271,862 275,864C278,866 281,867 285,868C285,869 285,871 285,872C287,874 290,875 293,877C297,880 301,884 306,886C307,887 308,886 310,886C318,893 327,899 337,904C348,910 359,917 371,920C379,922 387,926 395,927C403,928 411,930 419,931C430,932 440,936 450,938C455,939 459,941 464,941C476,945 489,948 501,950C530,955 559,962 589,963C594,963 599,963 604,964C618,965 632,965 646,964C643,962 639,959 635,959C633,959 632,960 630,960C629,955 634,952 638,952C646,951 653,952 661,952C661,954 661,955 661,957C660,959 658,960 656,961C656,963 656,964 657,966C668,968 680,967 692,968C708,968 723,968 739,968C753,968 767,968 781,965C779,960 777,956 777,952C777,950 778,947 780,946C783,946 785,948 787,950C789,955 788,960 788,964C800,963 812,959 821,952C827,949 831,946 837,942C833,937 832,928 837,923C841,923 844,926 844,929C845,931 845,935 848,934C853,931 857,928 861,924C870,918 879,911 887,904C892,899 896,894 900,889C901,887 903,885 901,883C899,882 897,884 895,885C892,885 887,886 885,883C884,877 889,873 893,869C896,867 899,864 903,866C906,868 908,872 910,875C915,869 918,861 922,854C927,844 932,834 937,824C945,808 954,794 959,777C961,771 962,765 964,759C967,750 969,740 970,730C972,722 971,715 970,707C971,694 972,681 974,668C976,655 976,642 978,629C980,616 982,604 980,591C979,586 979,581 977,576C976,568 973,560 973,552C973,545 972,538 970,531C969,527 971,522 971,518C972,515 969,514 967,513C959,508 949,506 940,502C934,500 928,497 922,496C915,494 907,492 899,492C898,496 897,500 895,504C892,512 885,519 878,524C867,528 857,534 845,535C838,536 832,538 825,537C804,536 784,532 765,526C760,524 756,524 752,522C743,519 736,513 728,508C725,516 723,525 715,529C711,532 705,534 700,534C696,534 695,529 697,526C702,520 709,515 714,509C715,507 715,505 714,503C711,498 708,492 705,487C702,480 701,471 704,463C705,462 706,460 705,458C705,455 702,454 699,453C693,451 685,450 679,452C671,453 663,456 656,459C650,461 650,468 648,472C642,484 632,496 619,500C612,503 604,505 596,506C585,508 574,511 562,511C552,511 542,511 531,510C519,508 507,504 496,497C488,493 481,487 474,481C466,474 456,467 450,457C448,453 447,448 445,443C444,439 444,433 441,429C438,428 436,428 433,428C422,426 411,425 400,425C375,422 350,425 326,421C316,420 306,419 296,419C283,420 270,418 257,419C258,420 260,421 261,422C260,424 259,426 260,428C262,436 264,445 264,454C255,453 247,453 239,454C236,454 234,454 231,453C232,449 233,446 234,442C236,437 237,433 240,429C242,428 244,429 246,428C247,429 248,430 249,430C252,427 253,423 255,420C246,419 238,418 230,420M165,432C163,437 163,442 163,447C166,444 170,441 172,438C172,432 171,427 170,421C168,425 167,429 165,432M789,447C784,448 779,447 773,449C765,450 756,450 748,454C742,457 738,462 735,467C732,471 731,475 731,480C731,484 734,487 736,491C742,497 748,504 756,508C766,511 776,515 786,517C790,517 794,519 798,520C810,522 823,525 836,523C852,521 868,516 879,504C882,499 885,494 883,488C880,480 874,472 868,465C862,460 855,455 847,451C833,447 819,446 805,446C800,446 795,446 789,447M139,452C139,454 138,456 139,458C139,460 140,462 142,461C142,458 140,455 139,452M146,512C146,522 152,532 155,541C157,547 159,553 163,557C165,551 161,545 159,539C156,531 153,522 153,514C152,512 153,510 151,509C149,509 146,509 146,512M161,513C160,522 163,531 166,540C167,537 169,534 170,532C168,529 166,527 164,524C163,520 162,516 161,513M137,515C136,517 134,519 134,522C135,528 138,534 141,540C142,543 142,547 144,549C148,553 152,558 155,563C157,565 159,567 161,566C160,564 159,562 158,560C154,556 152,550 149,545C146,538 142,531 141,523C140,520 140,517 139,515C139,515 138,515 137,515M184,526C184,527 184,528 186,528C187,526 186,525 184,526M132,582C136,579 138,576 141,573C140,573 138,572 138,571C135,574 132,578 132,582M150,577C152,579 154,581 156,583C157,581 157,579 158,577C155,577 153,577 150,577M155,598C155,596 155,594 155,592C153,594 153,596 155,598M102,766C100,771 100,778 103,784C105,778 104,771 102,766M52,820C51,831 53,841 55,852C55,856 56,860 58,863C58,850 58,837 55,825C54,823 53,822 52,820M185,876C184,894 187,911 188,929C189,935 189,941 192,947C193,940 192,932 192,925C192,915 192,905 190,895C189,889 189,882 185,876M157,896C157,903 158,910 161,917C163,910 162,902 157,896M89,959C89,962 89,964 89,967C90,964 90,962 89,959M84,1046C82,1047 84,1049 85,1048C86,1047 85,1044 84,1046M80,1118C83,1113 84,1109 84,1104C83,1108 80,1113 80,1118M79,1120C77,1121 79,1124 80,1122C81,1122 80,1119 79,1120M77,1125C76,1126 77,1129 78,1128C80,1127 78,1124 77,1125M101,1127C98,1130 96,1134 95,1138C98,1136 102,1132 101,1127M58,1205C61,1204 63,1202 64,1200C61,1200 59,1202 58,1205Z" style="fill-rule:nonzero;"/><path d="M635,113C635,112 638,112 638,113C638,115 635,115 635,113Z" style="fill-rule:nonzero;"/><path d="M637,118C640,119 642,121 644,123C640,125 637,125 633,124C633,122 635,120 637,118Z" style="fill-rule:nonzero;"/><path d="M663,120C666,121 668,123 670,126C667,125 664,123 663,120Z" style="fill-rule:nonzero;"/><path d="M649,125C652,124 655,124 658,125C655,127 651,127 648,128C648,127 649,126 649,125Z" style="fill-rule:nonzero;"/><path d="M471,150C473,147 476,145 480,146C478,148 475,151 471,150Z" style="fill-rule:nonzero;"/><path d="M634,167C636,164 642,164 644,168C641,171 637,169 634,167Z" style="fill-rule:nonzero;"/><path d="M509,233C511,230 513,234 515,235C514,235 513,237 513,237C511,237 506,235 509,233Z" style="fill-rule:nonzero;"/><path d="M437,241C440,240 443,238 446,240C447,242 446,244 446,246C443,246 439,246 435,245C434,244 436,242 437,241Z" style="fill-rule:nonzero;"/><path d="M516,246C518,246 520,246 522,247C524,248 523,251 521,252C519,253 515,252 514,249C513,248 515,246 516,246Z" style="fill-rule:nonzero;"/><path d="M559,279C557,277 558,270 562,272C561,275 560,277 559,279Z" style="fill-rule:nonzero;"/><path d="M475,276C487,275 500,274 512,279C524,284 538,288 552,291C561,293 570,295 579,296C576,291 571,291 566,290C564,289 564,286 566,285C571,284 577,285 581,288C585,290 584,295 587,298C592,301 599,300 604,302C606,305 607,308 610,309C615,314 615,325 608,328C601,329 595,328 588,326C582,325 577,319 571,316C567,313 562,313 557,312C551,311 545,308 539,307C534,305 528,304 523,302C520,300 517,301 514,300C504,296 493,295 483,295C468,295 453,297 440,304C433,306 425,302 422,295C420,290 423,284 428,282C432,281 436,281 439,280C451,278 463,277 475,276Z" style="fill-rule:nonzero;"/><path d="M778,300C778,297 780,296 782,297C781,298 780,299 778,300Z" style="fill-rule:nonzero;"/><path d="M365,298C370,296 375,296 380,297C382,298 383,301 383,303C383,306 382,309 381,312C374,310 368,305 365,298Z" style="fill-rule:nonzero;"/><path d="M647,305C650,303 653,306 654,309C658,316 656,325 651,331C647,336 643,342 636,341C633,341 630,340 630,336C630,333 633,332 635,330C642,323 644,314 647,305Z" style="fill-rule:nonzero;"/><path d="M828,334C834,332 840,333 846,333C858,333 871,334 883,336C893,339 904,339 914,340C919,341 925,344 927,348C930,352 929,358 925,360C920,362 916,359 912,357C907,354 901,353 895,353C875,350 855,352 834,353C821,354 807,354 794,357C791,357 786,358 784,355C782,352 784,348 786,346C790,344 793,341 798,340C802,339 806,338 810,337C816,335 822,336 828,334Z" style="fill-rule:nonzero;"/><path d="M260,374C261,374 262,374 263,375C263,377 262,379 260,380C259,378 259,376 260,374Z" style="fill-rule:nonzero;"/><path d="M761,403C760,401 762,400 763,401C764,402 762,404 761,403Z" style="fill-rule:nonzero;"/><path d="M996,502C999,500 997,505 996,502Z" style="fill-rule:nonzero;"/><path d="M642,518C642,517 641,515 643,515C645,515 646,516 647,517C646,518 644,519 642,518Z" style="fill-rule:nonzero;"/><path d="M648,522C652,520 655,517 659,515C663,513 668,516 672,517C674,520 673,525 670,525C664,527 659,529 653,528C649,528 647,522 647,519C647,519 648,521 648,522Z" style="fill-rule:nonzero;"/><path d="M430,536C431,536 432,536 432,537C431,539 428,540 427,538C426,536 429,536 430,536Z" style="fill-rule:nonzero;"/><path d="M417,548C419,545 421,542 423,539C426,541 428,542 431,544C434,544 435,548 434,551C432,551 430,550 429,550C425,548 421,548 417,548Z" style="fill-rule:nonzero;"/><path d="M213,559C214,557 214,553 217,553C216,555 215,557 213,559Z" style="fill-rule:nonzero;"/><path d="M609,578C612,577 616,576 618,578C620,580 618,583 617,584C614,588 607,586 606,582C606,580 608,578 609,578Z" style="fill-rule:nonzero;"/><path d="M646,579C648,577 651,578 653,579C656,579 659,581 661,584C660,587 658,589 655,590C649,594 641,583 646,579Z" style="fill-rule:nonzero;"/><path d="M712,588C711,585 715,585 717,584C725,584 732,590 735,597C730,599 725,595 721,594C717,593 713,592 712,588Z" style="fill-rule:nonzero;"/><path d="M655,594C659,593 662,595 666,596C662,599 658,597 655,594Z" style="fill-rule:nonzero;"/><path d="M703,595C706,593 709,595 711,598C709,599 706,600 704,599C703,598 703,596 703,595Z" style="fill-rule:nonzero;"/><path d="M579,596C583,595 586,598 588,601C590,604 587,607 585,609C583,610 580,608 580,606C578,603 578,599 579,596Z" style="fill-rule:nonzero;"/><path d="M632,601C634,599 635,597 638,598C640,599 643,599 644,602C642,607 636,603 632,601Z" style="fill-rule:nonzero;"/><path d="M728,610C728,608 728,607 729,605C731,606 733,608 731,610C730,610 729,610 728,610Z" style="fill-rule:nonzero;"/><path d="M658,611C661,610 664,610 667,610C674,610 680,610 686,612C695,613 703,615 711,619C716,623 721,626 726,631C729,634 732,638 731,643C730,645 728,645 726,645C723,645 721,643 719,642C714,638 708,634 702,630C697,627 690,627 684,626C672,625 661,627 649,628C640,630 632,631 624,634C619,635 615,636 610,637C608,637 605,637 602,636C601,632 602,626 606,625C618,619 631,616 645,613C649,613 653,612 658,611Z" style="fill-rule:nonzero;"/><path d="M564,613C565,612 567,613 568,614C570,616 571,620 569,622C568,624 566,625 564,624C561,621 561,615 564,613Z" style="fill-rule:nonzero;"/><path d="M755,614C757,612 761,613 762,616C764,618 764,623 760,624C757,623 754,622 752,620C750,618 753,615 755,614Z" style="fill-rule:nonzero;"/><path d="M735,620C736,620 738,620 739,621C739,623 739,625 736,625C735,624 734,622 735,620Z" style="fill-rule:nonzero;"/><path d="M537,638C534,638 534,634 536,633C537,634 538,636 537,638Z" style="fill-rule:nonzero;"/><path d="M766,636C766,636 768,635 768,635C769,636 770,637 771,638C771,639 770,640 769,642C768,640 767,638 766,636Z" style="fill-rule:nonzero;"/><path d="M536,646C539,645 542,647 544,648C545,652 545,658 540,658C534,658 532,650 536,646Z" style="fill-rule:nonzero;"/><path d="M670,655C672,655 676,654 675,657C674,660 669,658 670,655Z" style="fill-rule:nonzero;"/><path d="M252,669C254,668 255,668 257,668C256,670 254,669 252,669Z" style="fill-rule:nonzero;"/><path d="M210,724C214,721 219,724 222,727C220,730 217,733 214,736C213,739 212,744 208,744C204,744 201,739 203,735C204,731 207,727 210,724Z" style="fill-rule:nonzero;"/><path d="M237,736C241,735 248,737 246,742C242,744 236,741 237,736Z" style="fill-rule:nonzero;"/><path d="M230,751C234,749 240,753 239,758C238,761 237,765 233,765C229,764 229,760 228,757C228,755 228,752 230,751Z" style="fill-rule:nonzero;"/><path d="M214,758C218,762 220,769 221,775C219,774 215,774 214,771C213,767 213,762 214,758Z" style="fill-rule:nonzero;"/><path d="M188,760C190,759 194,759 195,762C196,766 190,769 187,766C185,765 187,762 188,760Z" style="fill-rule:nonzero;"/><path d="M282,770C284,770 287,771 287,774C284,776 281,773 282,770Z" style="fill-rule:nonzero;"/><path d="M223,776C224,773 227,775 228,776C228,777 228,778 228,778C226,778 224,778 223,776Z" style="fill-rule:nonzero;"/><path d="M883,776C884,777 886,778 885,780C884,781 882,781 881,781C882,780 882,778 883,776Z" style="fill-rule:nonzero;"/><path d="M233,785C236,783 239,787 240,789C238,794 229,789 233,785Z" style="fill-rule:nonzero;"/><path d="M932,793C936,791 943,792 944,797C943,799 941,799 939,799C936,799 933,799 931,797C931,796 932,794 932,793Z" style="fill-rule:nonzero;"/><path d="M234,798C236,794 242,796 243,800C242,804 242,809 237,809C235,806 232,802 234,798Z" style="fill-rule:nonzero;"/><path d="M315,805C317,804 319,806 319,808C320,814 323,820 323,826C321,826 319,824 318,822C317,817 315,811 314,806L315,805Z" style="fill-rule:nonzero;"/><path d="M937,807C938,805 941,808 939,809C938,811 936,808 937,807Z" style="fill-rule:nonzero;"/><path d="M906,813C910,811 915,812 919,813C921,814 923,815 923,817C921,820 916,821 912,822C909,823 907,824 904,825C903,827 902,830 900,831C898,833 895,833 893,831C892,828 892,826 894,824C896,821 899,820 902,818C904,816 904,813 906,813Z" style="fill-rule:nonzero;"/><path d="M758,822C759,819 758,814 762,813C766,816 768,821 770,825C771,828 769,830 769,833C771,839 772,845 772,851C764,860 752,865 741,869C728,874 714,876 700,879C690,881 680,883 669,883C652,884 634,884 617,885C612,885 610,880 606,879C603,878 600,875 601,871C603,868 605,865 606,861C608,861 610,861 613,861C616,864 620,864 624,865C629,866 635,869 640,867C643,866 646,864 649,865C650,866 650,868 650,869C663,869 676,869 688,868C691,867 695,868 698,866C699,863 700,858 704,858C708,857 709,861 709,864C714,864 720,861 725,860C735,856 746,852 755,844C758,841 761,837 764,834C761,830 758,827 758,822Z" style="fill-rule:nonzero;"/><path d="M270,821C272,820 275,822 276,825C276,828 277,832 276,836C272,833 267,829 265,825C265,823 268,822 270,821Z" style="fill-rule:nonzero;"/><path d="M611,828C614,827 617,827 619,828C620,830 617,832 616,833C613,836 612,841 608,843C604,844 599,837 603,834C605,831 608,829 611,828Z" style="fill-rule:nonzero;"/><path d="M643,832C644,830 646,830 648,830C649,835 647,839 646,844C645,847 644,851 642,854C641,855 638,857 636,855C633,852 633,847 635,843C638,839 640,835 643,832Z" style="fill-rule:nonzero;"/><path d="M590,832C593,831 594,834 595,836C594,839 592,842 590,845C587,849 580,846 581,841C581,836 586,834 590,832Z" style="fill-rule:nonzero;"/><path d="M737,836C740,835 742,838 742,840C743,843 743,846 741,848C738,851 732,848 733,844C732,841 734,837 737,836Z" style="fill-rule:nonzero;"/><path d="M663,848C665,847 669,843 671,847C673,851 673,856 673,861C670,861 668,862 666,860C662,857 662,852 663,848Z" style="fill-rule:nonzero;"/><path d="M297,846C299,845 302,848 303,850C303,853 303,858 303,862C301,864 298,865 296,864C294,862 295,859 295,856C294,855 293,854 292,853C293,850 295,848 297,846Z" style="fill-rule:nonzero;"/><path d="M889,850C892,849 896,849 897,852C899,854 897,857 894,858C891,860 886,858 885,854C885,852 887,850 889,850Z" style="fill-rule:nonzero;"/><path d="M387,850C389,849 392,849 394,850C395,853 394,856 394,859C389,860 384,854 387,850Z" style="fill-rule:nonzero;"/><path d="M275,852C277,852 279,852 281,853C281,853 280,854 280,855C278,854 277,853 275,852Z" style="fill-rule:nonzero;"/><path d="M382,874C383,869 384,865 385,860C386,866 390,870 395,874C392,878 389,881 386,883C384,881 381,878 382,874Z" style="fill-rule:nonzero;"/><path d="M745,873C748,871 752,870 756,872C757,872 757,874 756,875C752,876 748,875 745,873Z" style="fill-rule:nonzero;"/><path d="M469,875C477,870 479,887 471,886C465,886 464,877 469,875Z" style="fill-rule:nonzero;"/><path d="M844,885C848,881 855,878 861,879C860,883 859,886 859,890C859,893 855,894 852,895C847,895 841,896 836,894C836,893 836,891 837,889C839,887 842,886 844,885Z" style="fill-rule:nonzero;"/><path d="M417,882C421,881 425,884 427,887C424,891 416,887 417,882Z" style="fill-rule:nonzero;"/><path d="M674,888C676,887 677,889 678,889C676,890 674,891 674,888Z" style="fill-rule:nonzero;"/><path d="M329,890C330,889 332,892 331,893C330,894 328,891 329,890Z" style="fill-rule:nonzero;"/><path d="M505,898C506,894 511,895 513,895C518,895 522,900 521,904C516,906 511,910 505,909C505,905 505,902 505,898Z" style="fill-rule:nonzero;"/><path d="M865,899C866,898 867,899 867,900C865,901 865,900 865,899Z" style="fill-rule:nonzero;"/><path d="M839,908C838,906 839,904 839,903C841,904 841,906 839,908Z" style="fill-rule:nonzero;"/><path d="M462,905C465,904 468,904 471,905C473,908 475,911 476,915C476,917 474,918 472,918C467,918 461,916 459,911C458,908 460,906 462,905Z" style="fill-rule:nonzero;"/><path d="M588,912C590,910 595,911 595,914C595,919 584,915 588,912Z" style="fill-rule:nonzero;"/><path d="M454,914C456,913 458,913 458,915C457,916 455,918 454,916C453,916 453,914 454,914Z" style="fill-rule:nonzero;"/><path d="M554,914C555,914 556,914 556,916C554,917 553,916 554,914Z" style="fill-rule:nonzero;"/><path d="M678,918C682,916 685,918 687,921C688,923 690,925 688,927C685,928 682,928 679,927C675,926 674,919 678,918Z" style="fill-rule:nonzero;"/><path d="M700,917C702,917 704,919 706,920C709,923 713,924 716,926C718,928 716,933 713,933C709,933 707,930 704,928C701,925 698,921 700,917Z" style="fill-rule:nonzero;"/><path d="M851,918C854,917 857,916 859,918C861,919 862,922 860,923C857,927 851,922 851,918Z" style="fill-rule:nonzero;"/><path d="M747,924C748,922 749,920 751,919C755,918 760,918 764,920C766,923 763,925 761,925C756,926 751,927 747,924Z" style="fill-rule:nonzero;"/><path d="M796,928C799,925 804,926 807,929C810,932 813,936 812,941C806,941 800,940 795,937C791,935 793,930 796,928Z" style="fill-rule:nonzero;"/><path d="M554,930C557,933 560,936 563,939C559,939 555,938 553,935C552,933 554,932 554,930Z" style="fill-rule:nonzero;"/><path d="M580,932C583,930 586,930 588,933C587,935 585,937 583,938C580,937 578,934 580,932Z" style="fill-rule:nonzero;"/><path d="M759,935C760,933 762,932 763,930C764,932 766,934 765,937C764,937 763,938 762,939C761,938 760,937 759,935Z" style="fill-rule:nonzero;"/><path d="M592,948C591,945 592,940 595,939C601,940 603,947 601,952C598,952 594,951 592,948Z" style="fill-rule:nonzero;"/><path d="M570,951C572,950 573,953 572,953C570,954 569,952 570,951Z" style="fill-rule:nonzero;"/><path d="M746,953C748,952 750,954 748,955C747,956 745,954 746,953Z" style="fill-rule:nonzero;"/><path d="M544,90C547,87 548,82 551,79C553,79 555,80 557,80C560,80 563,79 566,78C565,80 565,82 564,84C564,87 566,90 569,90C574,90 579,88 584,88C591,90 599,89 607,90C611,91 609,97 612,98C614,100 616,98 619,98C622,100 624,104 628,104C634,105 638,99 643,96C646,94 650,95 653,95C666,96 680,99 692,103C702,106 710,110 719,115C726,119 731,126 738,130C745,134 753,135 760,140C765,143 769,148 774,152C784,162 796,172 807,181C811,185 816,189 818,194C823,204 828,215 833,225C837,234 842,241 847,249C854,260 862,272 873,280C878,283 883,287 889,287C892,287 894,286 896,284C897,280 893,277 890,275C882,270 876,263 869,257C863,251 858,245 854,238C850,232 845,226 843,219C840,213 834,207 835,200C840,207 847,212 854,217C858,220 861,222 866,223C867,229 870,234 873,239C881,255 896,266 906,280C905,284 904,287 906,290C908,294 914,294 917,298C923,306 929,315 934,324C932,326 929,327 928,329C926,333 927,337 929,340C931,342 931,346 934,348C936,350 940,350 943,350C943,356 946,362 946,368C948,381 949,395 951,408C955,419 957,431 960,443C961,446 962,449 962,453C962,457 964,461 965,466C966,476 966,486 967,496C954,494 942,488 930,484C921,481 911,479 902,479C900,479 898,479 896,480C891,471 884,463 877,455C871,449 863,444 855,440C847,438 839,435 831,435C804,434 776,434 749,439C743,441 737,444 731,448C727,450 725,454 723,458C716,446 704,440 691,437C688,436 685,435 682,436C672,439 662,443 652,446C649,438 645,430 639,424C624,411 605,404 587,398C574,394 561,390 548,388C538,387 529,385 519,384C510,384 500,384 491,384C486,384 481,386 476,387C465,390 454,396 448,406C445,409 445,414 440,415C434,415 427,413 421,412C406,411 391,411 376,409C364,410 351,410 339,410C328,407 316,407 305,407C303,407 301,407 299,406C299,402 302,398 302,393C299,392 295,392 292,390C290,388 287,387 284,387C284,384 283,381 280,380C280,384 282,388 281,392C279,397 278,401 276,406C266,407 256,407 246,406C247,402 248,399 248,395C249,390 249,385 252,382C255,376 258,370 261,364C263,358 266,353 267,347C267,344 265,340 266,337C268,330 271,322 273,315C274,312 275,308 276,305C278,301 281,298 283,294C286,290 288,285 291,282C297,273 302,264 308,255C310,253 312,252 314,251C315,244 321,240 326,236C333,229 340,222 349,218C352,217 353,213 356,211C362,209 367,206 372,202C380,197 387,190 394,184C398,180 400,175 403,170C407,165 412,160 418,161C418,163 418,166 416,168C408,186 399,204 390,222C387,229 386,237 387,244C390,245 393,242 395,239C403,229 410,217 417,206C420,201 424,197 427,192C439,178 450,163 461,148C465,140 470,133 475,126C478,119 483,112 490,108C496,104 504,104 511,102C513,101 514,99 516,98C519,99 521,102 524,103C527,102 530,100 531,97C532,93 528,91 526,88C532,88 539,86 544,90M635,113C635,115 638,115 638,113C638,112 635,112 635,113M637,118C635,120 633,122 633,124C637,125 640,125 644,123C642,121 640,119 637,118M663,120C664,123 667,125 670,126C668,123 666,121 663,120M649,125C649,126 648,127 648,128C651,127 655,127 658,125C655,124 652,124 649,125M471,150C475,151 478,148 480,146C476,145 473,147 471,150M634,167C637,169 641,171 644,168C642,164 636,164 634,167M509,233C506,235 511,237 513,237C513,237 514,235 515,235C513,234 511,230 509,233M437,241C436,242 434,244 435,245C439,246 443,246 446,246C446,244 447,242 446,240C443,238 440,240 437,241M516,246C515,246 513,248 514,249C515,252 519,253 521,252C523,251 524,248 522,247C520,246 518,246 516,246M559,279C560,277 561,275 562,272C558,270 557,277 559,279M475,276C463,277 451,278 439,280C436,281 432,281 428,282C423,284 420,290 422,295C425,302 433,306 440,304C453,297 468,295 483,295C493,295 504,296 514,300C517,301 520,300 523,302C528,304 534,305 539,307C545,308 551,311 557,312C562,313 567,313 571,316C577,319 582,325 588,326C595,328 601,329 608,328C615,325 615,314 610,309C607,308 606,305 604,302C599,300 592,301 587,298C584,295 585,290 581,288C577,285 571,284 566,285C564,286 564,289 566,290C571,291 576,291 579,296C570,295 561,293 552,291C538,288 524,284 512,279C500,274 487,275 475,276M778,300C780,299 781,298 782,297C780,296 778,297 778,300M365,298C368,305 374,310 381,312C382,309 383,306 383,303C383,301 382,298 380,297C375,296 370,296 365,298M647,305C644,314 642,323 635,330C633,332 630,333 630,336C630,340 633,341 636,341C643,342 647,336 651,331C656,325 658,316 654,309C653,306 650,303 647,305M828,334C822,336 816,335 810,337C806,338 802,339 798,340C793,341 790,344 786,346C784,348 782,352 784,355C786,358 791,357 794,357C807,354 821,354 834,353C855,352 875,350 895,353C901,353 907,354 912,357C916,359 920,362 925,360C929,358 930,352 927,348C925,344 919,341 914,340C904,339 893,339 883,336C871,334 858,333 846,333C840,333 834,332 828,334M260,374C259,376 259,378 260,380C262,379 263,377 263,375C262,374 261,374 260,374M761,403C762,404 764,402 763,401C762,400 760,401 761,403Z" style="fill:white;fill-rule:nonzero;"/><path d="M461,410C469,402 482,397 494,397C501,396 509,396 516,396C517,399 518,402 521,402C526,402 532,400 537,400C550,401 562,405 574,408C582,410 590,412 597,416C602,418 608,419 612,422C610,424 607,427 609,430C612,434 616,435 621,436C625,437 629,440 633,442C632,446 629,450 631,454C632,457 634,459 635,462C636,465 634,467 632,470C630,474 627,479 622,482C619,483 616,483 613,484C609,484 604,485 600,487C602,489 604,490 606,491C598,494 589,495 581,496C566,498 550,498 535,496C519,495 505,487 492,478C485,471 477,465 470,458C461,451 456,439 456,428C456,422 456,415 461,410Z" style="fill:white;fill-rule:nonzero;"/><path d="M230,420C238,418 246,419 255,420C253,423 252,427 249,430C248,430 247,429 246,428C244,429 242,428 240,429C237,433 236,437 234,442C233,446 232,449 231,453C234,454 236,454 239,454C247,453 255,453 264,454C264,445 262,436 260,428C259,426 260,424 261,422C260,421 258,420 257,419C270,418 283,420 296,419C306,419 316,420 326,421C350,425 375,422 400,425C411,425 422,426 433,428C436,428 438,428 441,429C444,433 444,439 445,443C447,448 448,453 450,457C456,467 466,474 474,481C481,487 488,493 496,497C507,504 519,508 531,510C542,511 552,511 562,511C574,511 585,508 596,506C604,505 612,503 619,500C632,496 642,484 648,472C650,468 650,461 656,459C663,456 671,453 679,452C685,450 693,451 699,453C702,454 705,455 705,458C706,460 705,462 704,463C701,471 702,480 705,487C708,492 711,498 714,503C715,505 715,507 714,509C709,515 702,520 697,526C695,529 696,534 700,534C705,534 711,532 715,529C723,525 725,516 728,508C736,513 743,519 752,522C756,524 760,524 765,526C784,532 804,536 825,537C832,538 838,536 845,535C857,534 867,528 878,524C885,519 892,512 895,504C897,500 898,496 899,492C907,492 915,494 922,496C928,497 934,500 940,502C949,506 959,508 967,513C969,514 972,515 971,518C971,522 969,527 970,531C972,538 973,545 973,552C973,560 976,568 977,576C979,581 979,586 980,591C982,604 980,616 978,629C976,642 976,655 974,668C972,681 971,694 970,707C971,715 972,722 970,730C969,740 967,750 964,759C962,765 961,771 959,777C954,794 945,808 937,824C932,834 927,844 922,854C918,861 915,869 910,875C908,872 906,868 903,866C899,864 896,867 893,869C889,873 884,877 885,883C887,886 892,885 895,885C897,884 899,882 901,883C903,885 901,887 900,889C896,894 892,899 887,904C879,911 870,918 861,924C857,928 853,931 848,934C845,935 845,931 844,929C844,926 841,923 837,923C832,928 833,937 837,942C831,946 827,949 821,952C812,959 800,963 788,964C788,960 789,955 787,950C785,948 783,946 780,946C778,947 777,950 777,952C777,956 779,960 781,965C767,968 753,968 739,968C723,968 708,968 692,968C680,967 668,968 657,966C656,964 656,963 656,961C658,960 660,959 661,957C661,955 661,954 661,952C653,952 646,951 638,952C634,952 629,955 630,960C632,960 633,959 635,959C639,959 643,962 646,964C632,965 618,965 604,964C599,963 594,963 589,963C559,962 530,955 501,950C489,948 476,945 464,941C459,941 455,939 450,938C440,936 430,932 419,931C411,930 403,928 395,927C387,926 379,922 371,920C359,917 348,910 337,904C327,899 318,893 310,886C308,886 307,887 306,886C301,884 297,880 293,877C290,875 287,874 285,872C285,871 285,869 285,868C281,867 278,866 275,864C271,862 269,859 265,858C261,857 258,854 255,852C246,845 237,840 229,833C226,830 222,827 220,823C215,814 210,806 205,797C204,796 204,794 205,793C203,793 202,793 201,793C190,779 184,762 175,747C171,738 167,730 165,720C164,715 162,710 160,704C168,697 164,685 171,678C169,675 168,670 168,666C167,656 167,647 167,637C167,630 167,623 169,616C170,612 173,608 173,604C174,590 174,577 176,563C178,558 178,553 179,548C179,551 183,550 185,550C191,550 196,550 202,550C206,549 210,547 212,543C212,540 211,537 209,535C206,536 203,538 199,539C194,536 191,531 189,526C190,525 192,524 193,523C194,520 194,518 195,516C194,515 193,514 192,514C189,515 187,516 184,517C184,515 185,514 186,512C184,510 182,507 182,504C184,496 178,488 177,481C176,475 174,469 177,464C180,460 183,455 188,454C192,454 195,454 198,456C202,457 203,463 200,466C197,468 195,471 195,475C196,479 201,480 205,480C203,492 199,503 197,514C199,515 201,516 204,514C207,513 211,510 215,509C219,508 221,504 221,500C216,497 211,493 207,489C208,485 209,482 211,479C215,476 221,477 225,474C227,473 228,470 226,468C220,459 214,449 204,443C200,440 194,440 190,437C195,435 200,434 206,433C209,431 213,431 216,429C219,428 223,430 226,430C229,427 228,423 230,420M642,518C644,519 646,518 647,517C646,516 645,515 643,515C641,515 642,517 642,518M648,522C648,521 647,519 647,519C647,522 649,528 653,528C659,529 664,527 670,525C673,525 674,520 672,517C668,516 663,513 659,515C655,517 652,520 648,522M430,536C429,536 426,536 427,538C428,540 431,539 432,537C432,536 431,536 430,536M417,548C421,548 425,548 429,550C430,550 432,551 434,551C435,548 434,544 431,544C428,542 426,541 423,539C421,542 419,545 417,548M213,559C215,557 216,555 217,553C214,553 214,557 213,559M609,578C608,578 606,580 606,582C607,586 614,588 617,584C618,583 620,580 618,578C616,576 612,577 609,578M646,579C641,583 649,594 655,590C658,589 660,587 661,584C659,581 656,579 653,579C651,578 648,577 646,579M712,588C713,592 717,593 721,594C725,595 730,599 735,597C732,590 725,584 717,584C715,585 711,585 712,588M655,594C658,597 662,599 666,596C662,595 659,593 655,594M703,595C703,596 703,598 704,599C706,600 709,599 711,598C709,595 706,593 703,595M579,596C578,599 578,603 580,606C580,608 583,610 585,609C587,607 590,604 588,601C586,598 583,595 579,596M632,601C636,603 642,607 644,602C643,599 640,599 638,598C635,597 634,599 632,601M728,610C729,610 730,610 731,610C733,608 731,606 729,605C728,607 728,608 728,610M658,611C653,612 649,613 645,613C631,616 618,619 606,625C602,626 601,632 602,636C605,637 608,637 610,637C615,636 619,635 624,634C632,631 640,630 649,628C661,627 672,625 684,626C690,627 697,627 702,630C708,634 714,638 719,642C721,643 723,645 726,645C728,645 730,645 731,643C732,638 729,634 726,631C721,626 716,623 711,619C703,615 695,613 686,612C680,610 674,610 667,610C664,610 661,610 658,611M564,613C561,615 561,621 564,624C566,625 568,624 569,622C571,620 570,616 568,614C567,613 565,612 564,613M755,614C753,615 750,618 752,620C754,622 757,623 760,624C764,623 764,618 762,616C761,613 757,612 755,614M735,620C734,622 735,624 736,625C739,625 739,623 739,621C738,620 736,620 735,620M537,638C538,636 537,634 536,633C534,634 534,638 537,638M766,636C767,638 768,640 769,642C770,640 771,639 771,638C770,637 769,636 768,635C768,635 766,636 766,636M536,646C532,650 534,658 540,658C545,658 545,652 544,648C542,647 539,645 536,646M670,655C669,658 674,660 675,657C676,654 672,655 670,655M252,669C254,669 256,670 257,668C255,668 254,668 252,669M210,724C207,727 204,731 203,735C201,739 204,744 208,744C212,744 213,739 214,736C217,733 220,730 222,727C219,724 214,721 210,724M237,736C236,741 242,744 246,742C248,737 241,735 237,736M230,751C228,752 228,755 228,757C229,760 229,764 233,765C237,765 238,761 239,758C240,753 234,749 230,751M214,758C213,762 213,767 214,771C215,774 219,774 221,775C220,769 218,762 214,758M188,760C187,762 185,765 187,766C190,769 196,766 195,762C194,759 190,759 188,760M282,770C281,773 284,776 287,774C287,771 284,770 282,770M223,776C224,778 226,778 228,778C228,778 228,777 228,776C227,775 224,773 223,776M883,776C882,778 882,780 881,781C882,781 884,781 885,780C886,778 884,777 883,776M233,785C229,789 238,794 240,789C239,787 236,783 233,785M932,793C932,794 931,796 931,797C933,799 936,799 939,799C941,799 943,799 944,797C943,792 936,791 932,793M234,798C232,802 235,806 237,809C242,809 242,804 243,800C242,796 236,794 234,798M315,805L314,806C315,811 317,817 318,822C319,824 321,826 323,826C323,820 320,814 319,808C319,806 317,804 315,805M937,807C936,808 938,811 939,809C941,808 938,805 937,807M906,813C904,813 904,816 902,818C899,820 896,821 894,824C892,826 892,828 893,831C895,833 898,833 900,831C902,830 903,827 904,825C907,824 909,823 912,822C916,821 921,820 923,817C923,815 921,814 919,813C915,812 910,811 906,813M758,822C758,827 761,830 764,834C761,837 758,841 755,844C746,852 735,856 725,860C720,861 714,864 709,864C709,861 708,857 704,858C700,858 699,863 698,866C695,868 691,867 688,868C676,869 663,869 650,869C650,868 650,866 649,865C646,864 643,866 640,867C635,869 629,866 624,865C620,864 616,864 613,861C610,861 608,861 606,861C605,865 603,868 601,871C600,875 603,878 606,879C610,880 612,885 617,885C634,884 652,884 669,883C680,883 690,881 700,879C714,876 728,874 741,869C752,865 764,860 772,851C772,845 771,839 769,833C769,830 771,828 770,825C768,821 766,816 762,813C758,814 759,819 758,822M270,821C268,822 265,823 265,825C267,829 272,833 276,836C277,832 276,828 276,825C275,822 272,820 270,821M611,828C608,829 605,831 603,834C599,837 604,844 608,843C612,841 613,836 616,833C617,832 620,830 619,828C617,827 614,827 611,828M643,832C640,835 638,839 635,843C633,847 633,852 636,855C638,857 641,855 642,854C644,851 645,847 646,844C647,839 649,835 648,830C646,830 644,830 643,832M590,832C586,834 581,836 581,841C580,846 587,849 590,845C592,842 594,839 595,836C594,834 593,831 590,832M737,836C734,837 732,841 733,844C732,848 738,851 741,848C743,846 743,843 742,840C742,838 740,835 737,836M663,848C662,852 662,857 666,860C668,862 670,861 673,861C673,856 673,851 671,847C669,843 665,847 663,848M297,846C295,848 293,850 292,853C293,854 294,855 295,856C295,859 294,862 296,864C298,865 301,864 303,862C303,858 303,853 303,850C302,848 299,845 297,846M889,850C887,850 885,852 885,854C886,858 891,860 894,858C897,857 899,854 897,852C896,849 892,849 889,850M387,850C384,854 389,860 394,859C394,856 395,853 394,850C392,849 389,849 387,850M275,852C277,853 278,854 280,855C280,854 281,853 281,853C279,852 277,852 275,852M382,874C381,878 384,881 386,883C389,881 392,878 395,874C390,870 386,866 385,860C384,865 383,869 382,874M745,873C748,875 752,876 756,875C757,874 757,872 756,872C752,870 748,871 745,873M469,875C464,877 465,886 471,886C479,887 477,870 469,875M844,885C842,886 839,887 837,889C836,891 836,893 836,894C841,896 847,895 852,895C855,894 859,893 859,890C859,886 860,883 861,879C855,878 848,881 844,885M417,882C416,887 424,891 427,887C425,884 421,881 417,882M674,888C674,891 676,890 678,889C677,889 676,887 674,888M329,890C328,891 330,894 331,893C332,892 330,889 329,890M505,898C505,902 505,905 505,909C511,910 516,906 521,904C522,900 518,895 513,895C511,895 506,894 505,898M865,899C865,900 865,901 867,900C867,899 866,898 865,899M839,908C841,906 841,904 839,903C839,904 838,906 839,908M462,905C460,906 458,908 459,911C461,916 467,918 472,918C474,918 476,917 476,915C475,911 473,908 471,905C468,904 465,904 462,905M588,912C584,915 595,919 595,914C595,911 590,910 588,912M454,914C453,914 453,916 454,916C455,918 457,916 458,915C458,913 456,913 454,914M554,914C553,916 554,917 556,916C556,914 555,914 554,914M678,918C674,919 675,926 679,927C682,928 685,928 688,927C690,925 688,923 687,921C685,918 682,916 678,918M700,917C698,921 701,925 704,928C707,930 709,933 713,933C716,933 718,928 716,926C713,924 709,923 706,920C704,919 702,917 700,917M851,918C851,922 857,927 860,923C862,922 861,919 859,918C857,916 854,917 851,918M747,924C751,927 756,926 761,925C763,925 766,923 764,920C760,918 755,918 751,919C749,920 748,922 747,924M796,928C793,930 791,935 795,937C800,940 806,941 812,941C813,936 810,932 807,929C804,926 799,925 796,928M554,930C554,932 552,933 553,935C555,938 559,939 563,939C560,936 557,933 554,930M580,932C578,934 580,937 583,938C585,937 587,935 588,933C586,930 583,930 580,932M759,935C760,937 761,938 762,939C763,938 764,937 765,937C766,934 764,932 763,930C762,932 760,933 759,935M592,948C594,951 598,952 601,952C603,947 601,940 595,939C592,940 591,945 592,948M570,951C569,952 570,954 572,953C573,953 572,950 570,951M746,953C745,954 747,956 748,955C750,954 748,952 746,953Z" style="fill:white;fill-rule:nonzero;"/><path d="M789,447C795,446 800,446 805,446C819,446 833,447 847,451C855,455 862,460 868,465C874,472 880,480 883,488C885,494 882,499 879,504C868,516 852,521 836,523C823,525 810,522 798,520C794,519 790,517 786,517C776,515 766,511 756,508C748,504 742,497 736,491C734,487 731,484 731,480C731,475 732,471 735,467C738,462 742,457 748,454C756,450 765,450 773,449C779,447 784,448 789,447Z" style="fill:white;fill-rule:nonzero;"/><path d="M146,512C146,509 149,509 151,509C153,510 152,512 153,514C153,522 156,531 159,539C161,545 165,551 163,557C159,553 157,547 155,541C152,532 146,522 146,512Z" style="fill:white;fill-rule:nonzero;"/><path d="M161,513C162,516 163,520 164,524C166,527 168,529 170,532C169,534 167,537 166,540C163,531 160,522 161,513Z" style="fill:white;fill-rule:nonzero;"/><path d="M137,515C138,515 139,515 139,515C140,517 140,520 141,523C142,531 146,538 149,545C152,550 154,556 158,560C159,562 160,564 161,566C159,567 157,565 155,563C152,558 148,553 144,549C142,547 142,543 141,540C138,534 135,528 134,522C134,519 136,517 137,515Z" style="fill:white;fill-rule:nonzero;"/></g></g></g></g><g></g>'
@@ -0,0 +1,311 @@
1
+ // Pure helpers for the band: no `$`, so the tests call them directly.
2
+
3
+ import { duration, elapsed, fmtTokens, parseCsv } from './board'
4
+ import type { Band, Tokens } from './types'
5
+
6
+ export { duration, elapsed, fmtTokens }
7
+
8
+ // Same skip rules as ponytail-map.js: tests, vendored and generated code are not "reuse".
9
+ const SKIP_DIR = /(^|\/)(node_modules|\.git|dist|build|out|vendor|venv|\.venv|__pycache__|coverage|\.next|target|migrations|fixtures|tests?|__tests__|spec)(\/|$)/
10
+ const SKIP_FILE = /(^|\/)(test_[^/]*|[^/]*(_test|\.test|\.spec|\.gen|\.min|\.d)\.[a-z]+)$/
11
+
12
+ // Top-level definitions per language, close to ponytail-map.js, plus plain JS functions.
13
+ // shortcut: regex, not a parser; nested and dynamic definitions are missed. Use tree-sitter if it matters.
14
+ const DEFS: [RegExp, RegExp[]][] = [
15
+ [/\.py$/, [/^(?:async\s+)?def\s+([A-Za-z]\w*)/gm, /^class\s+([A-Za-z]\w*)/gm]],
16
+ [/\.[cm]?[jt]sx?$/, [
17
+ /^export\s+(?:default\s+)?(?:async\s+)?(?:function\*?|class|const|let|var)\s+([A-Za-z_$][\w$]*)/gm,
18
+ /^(?:async\s+)?function\*?\s+([A-Za-z_$][\w$]*)/gm,
19
+ ]],
20
+ [/\.go$/, [/^func\s+(?:\([^)]*\)\s*)?([A-Za-z]\w*)/gm]],
21
+ [/\.rs$/, [/^(?:pub\s+)?(?:async\s+)?fn\s+(\w+)/gm]],
22
+ [/\.rb$/, [/^\s*def\s+(?:self\.)?([A-Za-z]\w*[?!]?)/gm]],
23
+ ]
24
+
25
+ // Lines worth a closer look; the per-language regexes above decide.
26
+ export const GREP_DEFS = '^[[:space:]]*(export|async|def|class|function|func|pub|fn)[[:space:]]'
27
+
28
+ // Names too generic to say anything about reuse.
29
+ const GENERIC = new Set(['main', 'init', 'run', 'get', 'set', 'test', 'setup', 'open', 'close', 'read', 'write', 'start', 'stop', 'load', 'save', 'update', 'create', 'delete', 'handle', 'render', 'index', 'new', 'call', 'apply'])
30
+
31
+ export const isCode = (file: string) => DEFS.some(([ext]) => ext.test(file))
32
+
33
+ export const isSource = (file: string) => isCode(file) && !SKIP_DIR.test(file) && !SKIP_FILE.test(file)
34
+
35
+ export function defsIn(file: string, text: string): string[] {
36
+ const rules = DEFS.find(([ext]) => ext.test(file))?.[1] ?? []
37
+ const names = new Set<string>()
38
+ for (const re of rules) for (const m of text.matchAll(re)) if (m[1]) names.add(m[1])
39
+ return [...names]
40
+ }
41
+
42
+ export type Hit = { file: string; line: string; text: string }
43
+
44
+ // `git grep -n` output, one "file:line:text" row each.
45
+ export const hits = (stdout: string): Hit[] =>
46
+ stdout.split('\n').flatMap(row => {
47
+ const m = /^(.+?):(\d+):(.*)$/.exec(row)
48
+ return m ? [{ file: m[1] ?? '', line: m[2] ?? '', text: m[3] ?? '' }] : []
49
+ })
50
+
51
+ // Existing definitions, name -> "file:line".
52
+ export function parseDefs(stdout: string): Map<string, string> {
53
+ const known = new Map<string, string>()
54
+ for (const hit of hits(stdout)) {
55
+ if (!isSource(hit.file)) continue
56
+ for (const name of defsIn(hit.file, hit.text.trimStart())) {
57
+ if (!known.has(name)) known.set(name, `${hit.file}:${hit.line}`)
58
+ }
59
+ }
60
+ return known
61
+ }
62
+
63
+ // Lines of `after` that `before` did not have: what an edit added.
64
+ export function addedLines(before: string, after: string): string {
65
+ const old = new Set(before.split('\n'))
66
+ return after.split('\n').filter(line => !old.has(line)).join('\n')
67
+ }
68
+
69
+ // Known names the added code calls, skipping its own new definitions.
70
+ export function callsIn(text: string, known: Map<string, string>, own: string[]): string[] {
71
+ const names = new Set<string>()
72
+ for (const m of text.matchAll(/(?<![\w$])([A-Za-z_$][\w$]*)\s*\(/g)) {
73
+ const name = m[1] ?? ''
74
+ if (known.has(name) && !own.includes(name) && !GENERIC.has(name.toLowerCase())) names.add(name)
75
+ }
76
+ return [...names]
77
+ }
78
+
79
+ // Whether a file lies under the project root; Windows paths may use either slash.
80
+ export function inProject(file: string, root: string): boolean {
81
+ const f = file.replace(/\\/g, '/')
82
+ const r = root.replace(/\\/g, '/').replace(/\/+$/, '')
83
+ return f === r || f.startsWith(`${r}/`)
84
+ }
85
+
86
+ const TEST_CMD = /\b(npm (run )?test|pnpm (run )?test|yarn test|bun test|npx (jest|vitest)|jest|vitest|pytest|python3? -m pytest|go test|cargo test|mvn test|gradle test|rspec|phpunit|dotnet test|node --test|deno test|make test)\b/
87
+
88
+ export const isTestCommand = (command: string) => TEST_CMD.test(command)
89
+
90
+ // Pass and fail counts from common runners: pytest, jest/vitest, cargo, node --test, TAP.
91
+ export function testCounts(output: string): { passed?: number; failed?: number } {
92
+ const num = (re: RegExp) => {
93
+ const m = re.exec(output)
94
+ return m ? Number(m[1]) : undefined
95
+ }
96
+ return {
97
+ passed: num(/(\d+) (?:passed|passing)\b/) ?? num(/(?:ℹ |# )pass (\d+)/),
98
+ failed: num(/(\d+) (?:failed|failing)\b/) ?? num(/(?:ℹ |# )fail (\d+)/),
99
+ }
100
+ }
101
+
102
+ export type Col = { key: string; label: string; value: string; sub: string; tone?: 'warning' | 'success' | 'error' }
103
+
104
+ const esc = (s: string) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
105
+ const fit = (s: string, max: number) => (s.length > max ? `${s.slice(0, Math.max(1, max - 1))}…` : s)
106
+
107
+ const FONT = "-apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif"
108
+ // The image cannot read the app's theme, so it follows the system's.
109
+ // shortcut: an app theme that differs from the system theme gets the wrong text color; pass the theme in if that bites.
110
+ const STYLE = `.l,.s{fill:#87867f;font:12px ${FONT}}.v{fill:#1f1e1d;font:600 16px ${FONT}}.d{stroke:#1f1e1d;stroke-opacity:.12}.b{fill:#87867f}.warning{fill:#a86400}.success{fill:#2e7d32}.error{fill:#c62828}@media (prefers-color-scheme:dark){.v{fill:#ecebe6}.d{stroke:#fff;stroke-opacity:.14}.warning{fill:#e3a03d}.success{fill:#6abf69}.error{fill:#ef6a5a}}`
111
+
112
+ // The details row as one SVG for surfaces that draw it: real 1px dividers and exact columns.
113
+ export function metricsSvg(cols: Col[], turnCosts: number[], width = 720): string {
114
+ const height = 64
115
+ const colW = width / Math.max(1, cols.length)
116
+ const max = Math.max(...turnCosts, 0)
117
+ let body = `<line class="d" x1="0" y1="0.5" x2="${width}" y2="0.5"/>`
118
+ cols.forEach((c, i) => {
119
+ const x = i * colW + (i === 0 ? 0 : 12)
120
+ const tone = c.tone ? ` ${c.tone}` : ''
121
+ if (i > 0) body += `<line class="d" x1="${i * colW}" y1="14" x2="${i * colW}" y2="${height - 2}"/>`
122
+ body += `<text class="l" x="${x}" y="24">${esc(c.label)}</text>`
123
+ body += `<text class="v${tone}" x="${x}" y="44">${esc(fit(c.value, Math.floor((colW - 16) / 9)))}</text>`
124
+ if (c.sub) body += `<text class="s${c.tone === 'warning' ? tone : ''}" x="${x}" y="61">${esc(fit(c.sub, Math.floor((colW - 16) / 6.2)))}</text>`
125
+ if (c.key === 'cost' && turnCosts.length > 1 && max > 0) {
126
+ const bars = turnCosts.slice(-10)
127
+ const x0 = (i + 1) * colW - 16 - bars.length * 5
128
+ bars.forEach((v, j) => {
129
+ const h = Math.max(1, Math.round((v / max) * 16))
130
+ body += `<rect class="b" x="${x0 + j * 5}" y="${44 - h}" width="3" height="${h}" rx="1"/>`
131
+ })
132
+ }
133
+ })
134
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}"><style>${STYLE}</style>${body}</svg>`
135
+ }
136
+
137
+ export const NO_TOKENS: Tokens = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }
138
+
139
+ type Usage = { input_tokens: number; output_tokens: number; cache_read_input_tokens: number; cache_creation_input_tokens: number }
140
+
141
+ export const addTokens = (t: Tokens, u: Usage): Tokens => ({
142
+ input: t.input + u.input_tokens,
143
+ output: t.output + u.output_tokens,
144
+ cacheRead: t.cacheRead + u.cache_read_input_tokens,
145
+ cacheWrite: t.cacheWrite + u.cache_creation_input_tokens,
146
+ })
147
+
148
+ export const totalTokens = (t: Tokens) => t.input + t.output + t.cacheRead + t.cacheWrite
149
+
150
+ export const stamp = (ms: number) => {
151
+ const d = new Date(ms)
152
+ const two = (n: number) => String(n).padStart(2, '0')
153
+ return `${d.getFullYear()}-${two(d.getMonth() + 1)}-${two(d.getDate())} ${two(d.getHours())}:${two(d.getMinutes())}`
154
+ }
155
+
156
+ export const testsLabel = (t: Band['tests']) =>
157
+ t.state === 'pass' ? `${t.passed ?? ''} passed`.trim() : t.state === 'fail' ? `${t.failed ?? ''} failed`.trim() : t.state === 'stale' ? 'stale' : 'not run'
158
+
159
+ // Claude Code writes the session's sidebar name into its transcript on every rename.
160
+ export const TITLE_RECORD = '"type":"custom-title"'
161
+ // grep -o pattern for the model of every reply in a transcript.
162
+ export const MODEL_PATTERN = '"model":"claude-[^"]*"'
163
+
164
+ // The model that wrote most replies, from grep -o lines like "model":"claude-opus-5-5". Empty when none.
165
+ export function mainModel(grepOut: string): string {
166
+ const count = new Map<string, number>()
167
+ for (const m of grepOut.matchAll(/"model":"(claude-[^"]+)"/g)) count.set(m[1], (count.get(m[1]) ?? 0) + 1)
168
+ return [...count].sort((a, b) => b[1] - a[1])[0]?.[0] ?? ''
169
+ }
170
+
171
+ // The newest sidebar name in transcript lines, or undefined when the session has none.
172
+ export function sessionTitle(jsonl: string): string | undefined {
173
+ for (const line of jsonl.split('\n').reverse()) {
174
+ if (!line.includes(TITLE_RECORD)) continue
175
+ try {
176
+ const r = JSON.parse(line) as { type?: unknown; customTitle?: unknown }
177
+ if (r.type !== 'custom-title') continue
178
+ const title = typeof r.customTitle === 'string' ? r.customTitle.trim() : ''
179
+ return title === '' ? undefined : title.slice(0, 60)
180
+ } catch {
181
+ continue
182
+ }
183
+ }
184
+ return undefined
185
+ }
186
+
187
+ // One session (one task) as it is exported, copied and sent.
188
+ export type Snapshot = {
189
+ key: string
190
+ started: string
191
+ project: string
192
+ name: string
193
+ session: string
194
+ level: string
195
+ model: string
196
+ cost: number
197
+ lastTurn: number | null
198
+ turns: number
199
+ agentMs: number
200
+ tokens: Tokens
201
+ reuse: number | null
202
+ reused: number
203
+ created: number
204
+ callersOpen: number
205
+ tests: string
206
+ }
207
+
208
+ // A task's row in the ledger: the session and when it started (a /clear starts a new one).
209
+ export const taskKey = (session: string, startedAt: number) => `${session.slice(0, 8)}-${startedAt}`
210
+
211
+ // A band that starts again mid-session (a reload, an update, a second copy) picks up the session's
212
+ // row, so what only the band counts (tokens, agent time, the name) goes on instead of starting at zero.
213
+ // shortcut: the ledger keeps only the token total and output, so a resumed band books the rest as input.
214
+ export function resume(b: Band, csv: string, key: string): Band {
215
+ const [head, ...rows] = parseCsv(csv)
216
+ const row = head ? rows.find(r => r[head.indexOf('key')] === key) : undefined
217
+ if (!head || !row) return b
218
+ const at = (col: string) => row[head.indexOf(col)] ?? ''
219
+ const total = Number(at('tokens_total')) || 0
220
+ const output = Number(at('tokens_output')) || 0
221
+ return {
222
+ ...b,
223
+ name: b.name || at('name'),
224
+ busyMs: Math.max(b.busyMs, (Number(at('agent_minutes')) || 0) * 60000),
225
+ tokens: total > totalTokens(b.tokens) ? { input: total - output, output, cacheRead: 0, cacheWrite: 0 } : b.tokens,
226
+ }
227
+ }
228
+
229
+ export function snapshot(b: Band, startedAt: number): Snapshot {
230
+ return {
231
+ key: taskKey(b.session, startedAt),
232
+ started: stamp(startedAt),
233
+ project: b.project,
234
+ name: b.name,
235
+ session: b.session,
236
+ level: b.level,
237
+ model: b.model,
238
+ // The session's cost as /cost totals it, since its start or the last /clear.
239
+ cost: +b.spent.toFixed(4),
240
+ lastTurn: b.turnCosts[b.turnCosts.length - 1] ?? null,
241
+ turns: b.turns,
242
+ agentMs: b.busyMs,
243
+ tokens: b.tokens,
244
+ reuse: percent(b.reused.length, b.created.length) ?? null,
245
+ reused: b.reused.length,
246
+ created: b.created.length,
247
+ callersOpen: b.openCallers.length,
248
+ tests: testsLabel(b.tests),
249
+ }
250
+ }
251
+
252
+ const per = (total: number, n: number) => (n > 0 ? total / n : 0)
253
+
254
+ export function markdown(s: Snapshot): string {
255
+ const t = s.tokens
256
+ const rows = [
257
+ ['Project', s.project],
258
+ ['Started', s.started],
259
+ ['Model', s.model || '–'],
260
+ ['Cost', `$${s.cost.toFixed(2)}${s.lastTurn === null ? '' : ` · last turn $${s.lastTurn.toFixed(2)}`} · ⌀ $${per(s.cost, s.turns).toFixed(2)} / turn`],
261
+ ['Turns', `${s.turns}`],
262
+ ['Agent time', `${elapsed(s.agentMs)} · ⌀ ${elapsed(per(s.agentMs, s.turns))} / turn`],
263
+ ['Tokens', `${fmtTokens(totalTokens(t))} (input ${fmtTokens(t.input)}, output ${fmtTokens(t.output)}, cache read ${fmtTokens(t.cacheRead)}, cache write ${fmtTokens(t.cacheWrite)})`],
264
+ ['Reuse', `${s.reuse === null ? '–' : `${s.reuse}%`} (${s.reused} used, ${s.created} new)`],
265
+ ['Callers open', `${s.callersOpen}`],
266
+ ['Tests', s.tests],
267
+ ['ponytail level', s.level],
268
+ ['Session', `\`${s.session}\``],
269
+ ]
270
+ const cell = (v: string) => v.replace(/\|/g, '\\|')
271
+ return [`## ${cell(s.name || 'Untitled session')}`, '', '| | |', '|---|---|', ...rows.map(([k, v]) => `| ${k} | ${cell(v ?? '')} |`)].join('\n')
272
+ }
273
+
274
+ export const CSV_HEADER = 'key,started,project,name,cost_usd,turns,agent_minutes,tokens_total,tokens_output,reuse_pct,reused,new,callers_open,tests,level,model'
275
+
276
+ const csvField = (v: string | number | null) => {
277
+ const s = v === null ? '' : String(v)
278
+ return /[",\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s
279
+ }
280
+
281
+ export const csvRow = (s: Snapshot) =>
282
+ [s.key, s.started, s.project, s.name, s.cost.toFixed(2), s.turns, (s.agentMs / 60000).toFixed(1), totalTokens(s.tokens), s.tokens.output, s.reuse, s.reused, s.created, s.callersOpen, s.tests, s.level, s.model]
283
+ .map(csvField)
284
+ .join(',')
285
+
286
+ // One row per session, replaced on every turn, so the file stays a table of tasks.
287
+ export function upsertCsv(existing: string, s: Snapshot): string {
288
+ const rows = existing.split('\n').filter(line => line !== '' && !line.startsWith('key,') && !line.startsWith(`${s.key},`))
289
+ return [CSV_HEADER, ...rows, csvRow(s)].join('\n') + '\n'
290
+ }
291
+
292
+ // shortcut: no share below 3 functions, where one new helper would read as "0% reuse"; tune the 3 if it shows too late.
293
+ export const percent = (reused: number, created: number) =>
294
+ reused + created < 3 ? undefined : Math.round((reused / (reused + created)) * 100)
295
+
296
+ export type WebhookRequest = { url: string; init: { method: 'POST'; headers: Record<string, string>; body: string } }
297
+
298
+ // The token travels only over HTTPS; plain http is allowed for a board on this machine.
299
+ export function webhookRequest(url: string, token: string, sendNames: boolean, row: Snapshot): WebhookRequest | { refused: string } {
300
+ let target: URL
301
+ try {
302
+ target = new URL(url)
303
+ } catch {
304
+ return { refused: 'webhook URL is not a URL' }
305
+ }
306
+ const local = ['localhost', '127.0.0.1', '[::1]'].includes(target.hostname)
307
+ if (target.protocol !== 'https:' && !(target.protocol === 'http:' && local)) return { refused: 'webhook needs https' }
308
+ const headers: Record<string, string> = { 'content-type': 'application/json' }
309
+ if (token !== '') headers.authorization = `Bearer ${token}`
310
+ return { url: target.href, init: { method: 'POST', headers, body: JSON.stringify(sendNames ? row : { ...row, name: '' }) } }
311
+ }