lat.md 0.10.0 → 0.10.2
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.
- package/README.md +8 -4
- package/dist/src/cli/check.js +2 -1
- package/dist/src/source-parser.d.ts +2 -0
- package/dist/src/source-parser.js +91 -42
- package/package.json +1 -1
- package/templates/logo-dark.svg +182 -0
- package/templates/logo-light.svg +182 -0
- package/templates/lat-prompt-hook.sh +0 -16
package/README.md
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="templates/logo-dark.svg" alt="lat.md" width="500">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
+
<p align="center">
|
|
6
|
+
<a href="https://github.com/1st1/lat.md/actions/workflows/ci.yml"><img src="https://github.com/1st1/lat.md/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
7
|
+
<a href="https://www.npmjs.com/package/lat.md"><img src="https://img.shields.io/npm/v/lat.md" alt="npm"></a>
|
|
8
|
+
</p>
|
|
5
9
|
|
|
6
|
-
A knowledge graph for your codebase, written in markdown
|
|
10
|
+
<p align="center">A knowledge graph for your codebase, written in markdown.</p>
|
|
7
11
|
|
|
8
12
|
## The problem
|
|
9
13
|
|
package/dist/src/cli/check.js
CHANGED
|
@@ -3,7 +3,7 @@ import { existsSync } from 'node:fs';
|
|
|
3
3
|
import { basename, dirname, extname, join, relative } from 'node:path';
|
|
4
4
|
import { listLatticeFiles, loadAllSections, extractRefs, flattenSections, parseFrontmatter, parseSections, buildFileIndex, resolveRef, } from '../lattice.js';
|
|
5
5
|
import { scanCodeRefs } from '../code-refs.js';
|
|
6
|
-
import { SOURCE_EXTENSIONS } from '../source-parser.js';
|
|
6
|
+
import { SOURCE_EXTENSIONS, clearSymbolCache } from '../source-parser.js';
|
|
7
7
|
import { walkEntries } from '../walk.js';
|
|
8
8
|
import { INIT_VERSION, readInitVersion } from '../init-version.js';
|
|
9
9
|
function filePart(id) {
|
|
@@ -82,6 +82,7 @@ async function tryResolveSourceRef(target, projectRoot) {
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
export async function checkMd(latticeDir) {
|
|
85
|
+
clearSymbolCache();
|
|
85
86
|
const projectRoot = dirname(latticeDir);
|
|
86
87
|
const files = await listLatticeFiles(latticeDir);
|
|
87
88
|
const allSections = await loadAllSections(latticeDir);
|
|
@@ -10,6 +10,8 @@ export type SourceSymbol = {
|
|
|
10
10
|
/** All source file extensions that lat can parse (derived from grammarMap). */
|
|
11
11
|
export declare const SOURCE_EXTENSIONS: ReadonlySet<string>;
|
|
12
12
|
export declare function parseSourceSymbols(filePath: string, content: string): Promise<SourceSymbol[]>;
|
|
13
|
+
/** Clear the symbol cache. Call between top-level operations. */
|
|
14
|
+
export declare function clearSymbolCache(): void;
|
|
13
15
|
/**
|
|
14
16
|
* Check whether a source file path (relative to projectRoot) has a given symbol.
|
|
15
17
|
* Used by lat check to validate source code wiki links lazily.
|
|
@@ -173,33 +173,43 @@ function extractPySymbols(tree) {
|
|
|
173
173
|
const node = root.child(i);
|
|
174
174
|
const startLine = node.startPosition.row + 1;
|
|
175
175
|
const endLine = node.endPosition.row + 1;
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
// Unwrap decorated_definition to get the inner function/class
|
|
177
|
+
const inner = node.type === 'decorated_definition'
|
|
178
|
+
? node.childForFieldName('definition')
|
|
179
|
+
: node;
|
|
180
|
+
if (!inner)
|
|
181
|
+
continue;
|
|
182
|
+
if (inner.type === 'function_definition') {
|
|
183
|
+
const name = extractName(inner);
|
|
178
184
|
if (name) {
|
|
179
185
|
symbols.push({
|
|
180
186
|
name,
|
|
181
187
|
kind: 'function',
|
|
182
188
|
startLine,
|
|
183
189
|
endLine,
|
|
184
|
-
signature: firstLine(
|
|
190
|
+
signature: firstLine(inner.text),
|
|
185
191
|
});
|
|
186
192
|
}
|
|
187
193
|
}
|
|
188
|
-
else if (
|
|
189
|
-
const name = extractName(
|
|
194
|
+
else if (inner.type === 'class_definition') {
|
|
195
|
+
const name = extractName(inner);
|
|
190
196
|
if (name) {
|
|
191
197
|
symbols.push({
|
|
192
198
|
name,
|
|
193
199
|
kind: 'class',
|
|
194
200
|
startLine,
|
|
195
201
|
endLine,
|
|
196
|
-
signature: firstLine(
|
|
202
|
+
signature: firstLine(inner.text),
|
|
197
203
|
});
|
|
198
204
|
// Extract methods
|
|
199
|
-
const body =
|
|
205
|
+
const body = inner.childForFieldName('body');
|
|
200
206
|
if (body) {
|
|
201
207
|
for (let j = 0; j < body.namedChildCount; j++) {
|
|
202
|
-
|
|
208
|
+
let member = body.namedChild(j);
|
|
209
|
+
// Unwrap decorated methods
|
|
210
|
+
if (member.type === 'decorated_definition') {
|
|
211
|
+
member = member.childForFieldName('definition') ?? member;
|
|
212
|
+
}
|
|
203
213
|
if (member.type === 'function_definition') {
|
|
204
214
|
const methodName = extractName(member);
|
|
205
215
|
if (methodName) {
|
|
@@ -217,11 +227,11 @@ function extractPySymbols(tree) {
|
|
|
217
227
|
}
|
|
218
228
|
}
|
|
219
229
|
}
|
|
220
|
-
else if (
|
|
221
|
-
|
|
222
|
-
|
|
230
|
+
else if (inner.type === 'expression_statement' &&
|
|
231
|
+
inner.namedChildCount === 1 &&
|
|
232
|
+
inner.namedChild(0).type === 'assignment') {
|
|
223
233
|
// Top-level assignment: FOO = ...
|
|
224
|
-
const assign =
|
|
234
|
+
const assign = inner.namedChild(0);
|
|
225
235
|
const left = assign.childForFieldName('left');
|
|
226
236
|
if (left && left.type === 'identifier') {
|
|
227
237
|
symbols.push({
|
|
@@ -467,8 +477,17 @@ function extractGoSymbols(tree) {
|
|
|
467
477
|
* Handles plain identifiers and pointer declarators (*name).
|
|
468
478
|
*/
|
|
469
479
|
function cFuncName(declarator) {
|
|
470
|
-
|
|
471
|
-
|
|
480
|
+
// Unwrap pointer_declarator layers (for functions returning pointers,
|
|
481
|
+
// e.g. `JSRuntime *JS_NewRuntime(void)` → pointer_declarator > function_declarator)
|
|
482
|
+
let node = declarator;
|
|
483
|
+
while (node.type === 'pointer_declarator') {
|
|
484
|
+
const child = node.childForFieldName('declarator');
|
|
485
|
+
if (!child)
|
|
486
|
+
return null;
|
|
487
|
+
node = child;
|
|
488
|
+
}
|
|
489
|
+
if (node.type === 'function_declarator') {
|
|
490
|
+
const inner = node.childForFieldName('declarator');
|
|
472
491
|
if (!inner)
|
|
473
492
|
return null;
|
|
474
493
|
if (inner.type === 'identifier')
|
|
@@ -500,6 +519,13 @@ function cVarName(declarator) {
|
|
|
500
519
|
return null;
|
|
501
520
|
node = inner;
|
|
502
521
|
}
|
|
522
|
+
// Unwrap array_declarator (e.g. `char js_version[]`)
|
|
523
|
+
if (node.type === 'array_declarator') {
|
|
524
|
+
const inner = node.childForFieldName('declarator');
|
|
525
|
+
if (!inner)
|
|
526
|
+
return null;
|
|
527
|
+
node = inner;
|
|
528
|
+
}
|
|
503
529
|
if (node.type === 'identifier')
|
|
504
530
|
return node.text;
|
|
505
531
|
if (node.type === 'pointer_declarator') {
|
|
@@ -591,7 +617,8 @@ function collectCNodes(parent, symbols) {
|
|
|
591
617
|
});
|
|
592
618
|
}
|
|
593
619
|
}
|
|
594
|
-
else if (node.type === 'preproc_def'
|
|
620
|
+
else if (node.type === 'preproc_def' ||
|
|
621
|
+
node.type === 'preproc_function_def') {
|
|
595
622
|
const name = extractName(node);
|
|
596
623
|
if (name) {
|
|
597
624
|
symbols.push({
|
|
@@ -624,19 +651,32 @@ export async function parseSourceSymbols(filePath, content) {
|
|
|
624
651
|
const tree = p.parse(content);
|
|
625
652
|
if (!tree)
|
|
626
653
|
return [];
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
654
|
+
try {
|
|
655
|
+
if (ext === '.py') {
|
|
656
|
+
return extractPySymbols(tree);
|
|
657
|
+
}
|
|
658
|
+
if (ext === '.rs') {
|
|
659
|
+
return extractRustSymbols(tree);
|
|
660
|
+
}
|
|
661
|
+
if (ext === '.go') {
|
|
662
|
+
return extractGoSymbols(tree);
|
|
663
|
+
}
|
|
664
|
+
if (ext === '.c' || ext === '.h') {
|
|
665
|
+
return extractCSymbols(tree);
|
|
666
|
+
}
|
|
667
|
+
return extractTsSymbols(tree);
|
|
635
668
|
}
|
|
636
|
-
|
|
637
|
-
|
|
669
|
+
finally {
|
|
670
|
+
tree.delete();
|
|
638
671
|
}
|
|
639
|
-
|
|
672
|
+
}
|
|
673
|
+
// Per-invocation cache for parsed source symbols, keyed by absolute file path.
|
|
674
|
+
// Prevents re-parsing the same file when multiple wiki links reference it
|
|
675
|
+
// (e.g. 20+ links to quickjs.c would otherwise parse a 60K-line file 20 times).
|
|
676
|
+
const symbolCache = new Map();
|
|
677
|
+
/** Clear the symbol cache. Call between top-level operations. */
|
|
678
|
+
export function clearSymbolCache() {
|
|
679
|
+
symbolCache.clear();
|
|
640
680
|
}
|
|
641
681
|
/**
|
|
642
682
|
* Check whether a source file path (relative to projectRoot) has a given symbol.
|
|
@@ -644,24 +684,33 @@ export async function parseSourceSymbols(filePath, content) {
|
|
|
644
684
|
*/
|
|
645
685
|
export async function resolveSourceSymbol(filePath, symbolPath, projectRoot) {
|
|
646
686
|
const absPath = join(projectRoot, filePath);
|
|
647
|
-
let
|
|
648
|
-
|
|
649
|
-
content
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
687
|
+
let cached = symbolCache.get(absPath);
|
|
688
|
+
if (!cached) {
|
|
689
|
+
let content;
|
|
690
|
+
try {
|
|
691
|
+
content = readFileSync(absPath, 'utf-8');
|
|
692
|
+
}
|
|
693
|
+
catch {
|
|
694
|
+
cached = { symbols: [] };
|
|
695
|
+
symbolCache.set(absPath, cached);
|
|
696
|
+
return { found: false, symbols: [] };
|
|
697
|
+
}
|
|
698
|
+
try {
|
|
699
|
+
const symbols = await parseSourceSymbols(filePath, content);
|
|
700
|
+
cached = { symbols };
|
|
701
|
+
}
|
|
702
|
+
catch (err) {
|
|
703
|
+
cached = {
|
|
704
|
+
symbols: [],
|
|
705
|
+
error: `failed to parse "${filePath}": ${err instanceof Error ? err.message : String(err)}`,
|
|
706
|
+
};
|
|
707
|
+
}
|
|
708
|
+
symbolCache.set(absPath, cached);
|
|
653
709
|
}
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
symbols = await parseSourceSymbols(filePath, content);
|
|
657
|
-
}
|
|
658
|
-
catch (err) {
|
|
659
|
-
return {
|
|
660
|
-
found: false,
|
|
661
|
-
symbols: [],
|
|
662
|
-
error: `failed to parse "${filePath}": ${err instanceof Error ? err.message : String(err)}`,
|
|
663
|
-
};
|
|
710
|
+
if (cached.error) {
|
|
711
|
+
return { found: false, symbols: cached.symbols, error: cached.error };
|
|
664
712
|
}
|
|
713
|
+
const { symbols } = cached;
|
|
665
714
|
const parts = symbolPath.split('#');
|
|
666
715
|
if (parts.length === 1) {
|
|
667
716
|
// Simple symbol: getConfigDir
|
package/package.json
CHANGED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 73224 16688" fill="#444">
|
|
2
|
+
<defs>
|
|
3
|
+
<path id="g2591" d="M934 -512V-251H1094V-512ZM298 -512V-251H457V-512ZM616 -147V114H775V-147ZM-20 -147V114H138V-147ZM934 219V480H1094V219ZM298 219V480H457V219ZM616 584V845H775V584ZM-20 584V845H138V584ZM934 950V1211H1094V950ZM298 950V1211H457V950ZM616 1315V1576H775V1315ZM-20 1315V1576H138V1315Z"/>
|
|
4
|
+
<path id="g2588" d="M-20 -512V1576H1253V-512Z"/>
|
|
5
|
+
</defs>
|
|
6
|
+
<use href="#g2591" transform="translate(0,0) scale(1,-1) translate(0,-1901)"/>
|
|
7
|
+
<use href="#g2588" transform="translate(1356,0) scale(1,-1) translate(0,-1901)"/>
|
|
8
|
+
<use href="#g2588" transform="translate(2712,0) scale(1,-1) translate(0,-1901)"/>
|
|
9
|
+
<use href="#g2591" transform="translate(21696,0) scale(1,-1) translate(0,-1901)"/>
|
|
10
|
+
<use href="#g2588" transform="translate(23052,0) scale(1,-1) translate(0,-1901)"/>
|
|
11
|
+
<use href="#g2588" transform="translate(24408,0) scale(1,-1) translate(0,-1901)"/>
|
|
12
|
+
<use href="#g2591" transform="translate(69156,0) scale(1,-1) translate(0,-1901)"/>
|
|
13
|
+
<use href="#g2588" transform="translate(70512,0) scale(1,-1) translate(0,-1901)"/>
|
|
14
|
+
<use href="#g2588" transform="translate(71868,0) scale(1,-1) translate(0,-1901)"/>
|
|
15
|
+
<use href="#g2591" transform="translate(0,2384) scale(1,-1) translate(0,-1901)"/>
|
|
16
|
+
<use href="#g2588" transform="translate(1356,2384) scale(1,-1) translate(0,-1901)"/>
|
|
17
|
+
<use href="#g2588" transform="translate(2712,2384) scale(1,-1) translate(0,-1901)"/>
|
|
18
|
+
<use href="#g2591" transform="translate(21696,2384) scale(1,-1) translate(0,-1901)"/>
|
|
19
|
+
<use href="#g2588" transform="translate(23052,2384) scale(1,-1) translate(0,-1901)"/>
|
|
20
|
+
<use href="#g2588" transform="translate(24408,2384) scale(1,-1) translate(0,-1901)"/>
|
|
21
|
+
<use href="#g2591" transform="translate(69156,2384) scale(1,-1) translate(0,-1901)"/>
|
|
22
|
+
<use href="#g2588" transform="translate(70512,2384) scale(1,-1) translate(0,-1901)"/>
|
|
23
|
+
<use href="#g2588" transform="translate(71868,2384) scale(1,-1) translate(0,-1901)"/>
|
|
24
|
+
<use href="#g2591" transform="translate(0,4768) scale(1,-1) translate(0,-1901)"/>
|
|
25
|
+
<use href="#g2588" transform="translate(1356,4768) scale(1,-1) translate(0,-1901)"/>
|
|
26
|
+
<use href="#g2588" transform="translate(2712,4768) scale(1,-1) translate(0,-1901)"/>
|
|
27
|
+
<use href="#g2591" transform="translate(6780,4768) scale(1,-1) translate(0,-1901)"/>
|
|
28
|
+
<use href="#g2588" transform="translate(8136,4768) scale(1,-1) translate(0,-1901)"/>
|
|
29
|
+
<use href="#g2588" transform="translate(9492,4768) scale(1,-1) translate(0,-1901)"/>
|
|
30
|
+
<use href="#g2588" transform="translate(10848,4768) scale(1,-1) translate(0,-1901)"/>
|
|
31
|
+
<use href="#g2588" transform="translate(12204,4768) scale(1,-1) translate(0,-1901)"/>
|
|
32
|
+
<use href="#g2588" transform="translate(13560,4768) scale(1,-1) translate(0,-1901)"/>
|
|
33
|
+
<use href="#g2588" transform="translate(14916,4768) scale(1,-1) translate(0,-1901)"/>
|
|
34
|
+
<use href="#g2591" transform="translate(18984,4768) scale(1,-1) translate(0,-1901)"/>
|
|
35
|
+
<use href="#g2588" transform="translate(20340,4768) scale(1,-1) translate(0,-1901)"/>
|
|
36
|
+
<use href="#g2588" transform="translate(21696,4768) scale(1,-1) translate(0,-1901)"/>
|
|
37
|
+
<use href="#g2588" transform="translate(23052,4768) scale(1,-1) translate(0,-1901)"/>
|
|
38
|
+
<use href="#g2588" transform="translate(24408,4768) scale(1,-1) translate(0,-1901)"/>
|
|
39
|
+
<use href="#g2588" transform="translate(25764,4768) scale(1,-1) translate(0,-1901)"/>
|
|
40
|
+
<use href="#g2588" transform="translate(27120,4768) scale(1,-1) translate(0,-1901)"/>
|
|
41
|
+
<use href="#g2591" transform="translate(37968,4768) scale(1,-1) translate(0,-1901)"/>
|
|
42
|
+
<use href="#g2588" transform="translate(39324,4768) scale(1,-1) translate(0,-1901)"/>
|
|
43
|
+
<use href="#g2588" transform="translate(40680,4768) scale(1,-1) translate(0,-1901)"/>
|
|
44
|
+
<use href="#g2588" transform="translate(42036,4768) scale(1,-1) translate(0,-1901)"/>
|
|
45
|
+
<use href="#g2588" transform="translate(43392,4768) scale(1,-1) translate(0,-1901)"/>
|
|
46
|
+
<use href="#g2588" transform="translate(44748,4768) scale(1,-1) translate(0,-1901)"/>
|
|
47
|
+
<use href="#g2588" transform="translate(46104,4768) scale(1,-1) translate(0,-1901)"/>
|
|
48
|
+
<use href="#g2588" transform="translate(47460,4768) scale(1,-1) translate(0,-1901)"/>
|
|
49
|
+
<use href="#g2588" transform="translate(48816,4768) scale(1,-1) translate(0,-1901)"/>
|
|
50
|
+
<use href="#g2588" transform="translate(50172,4768) scale(1,-1) translate(0,-1901)"/>
|
|
51
|
+
<use href="#g2588" transform="translate(51528,4768) scale(1,-1) translate(0,-1901)"/>
|
|
52
|
+
<use href="#g2588" transform="translate(52884,4768) scale(1,-1) translate(0,-1901)"/>
|
|
53
|
+
<use href="#g2588" transform="translate(54240,4768) scale(1,-1) translate(0,-1901)"/>
|
|
54
|
+
<use href="#g2588" transform="translate(55596,4768) scale(1,-1) translate(0,-1901)"/>
|
|
55
|
+
<use href="#g2591" transform="translate(61020,4768) scale(1,-1) translate(0,-1901)"/>
|
|
56
|
+
<use href="#g2588" transform="translate(62376,4768) scale(1,-1) translate(0,-1901)"/>
|
|
57
|
+
<use href="#g2588" transform="translate(63732,4768) scale(1,-1) translate(0,-1901)"/>
|
|
58
|
+
<use href="#g2588" transform="translate(65088,4768) scale(1,-1) translate(0,-1901)"/>
|
|
59
|
+
<use href="#g2588" transform="translate(66444,4768) scale(1,-1) translate(0,-1901)"/>
|
|
60
|
+
<use href="#g2588" transform="translate(67800,4768) scale(1,-1) translate(0,-1901)"/>
|
|
61
|
+
<use href="#g2588" transform="translate(69156,4768) scale(1,-1) translate(0,-1901)"/>
|
|
62
|
+
<use href="#g2588" transform="translate(70512,4768) scale(1,-1) translate(0,-1901)"/>
|
|
63
|
+
<use href="#g2588" transform="translate(71868,4768) scale(1,-1) translate(0,-1901)"/>
|
|
64
|
+
<use href="#g2591" transform="translate(0,7152) scale(1,-1) translate(0,-1901)"/>
|
|
65
|
+
<use href="#g2588" transform="translate(1356,7152) scale(1,-1) translate(0,-1901)"/>
|
|
66
|
+
<use href="#g2588" transform="translate(2712,7152) scale(1,-1) translate(0,-1901)"/>
|
|
67
|
+
<use href="#g2591" transform="translate(13560,7152) scale(1,-1) translate(0,-1901)"/>
|
|
68
|
+
<use href="#g2588" transform="translate(14916,7152) scale(1,-1) translate(0,-1901)"/>
|
|
69
|
+
<use href="#g2588" transform="translate(16272,7152) scale(1,-1) translate(0,-1901)"/>
|
|
70
|
+
<use href="#g2591" transform="translate(21696,7152) scale(1,-1) translate(0,-1901)"/>
|
|
71
|
+
<use href="#g2588" transform="translate(23052,7152) scale(1,-1) translate(0,-1901)"/>
|
|
72
|
+
<use href="#g2588" transform="translate(24408,7152) scale(1,-1) translate(0,-1901)"/>
|
|
73
|
+
<use href="#g2591" transform="translate(37968,7152) scale(1,-1) translate(0,-1901)"/>
|
|
74
|
+
<use href="#g2588" transform="translate(39324,7152) scale(1,-1) translate(0,-1901)"/>
|
|
75
|
+
<use href="#g2588" transform="translate(40680,7152) scale(1,-1) translate(0,-1901)"/>
|
|
76
|
+
<use href="#g2591" transform="translate(46104,7152) scale(1,-1) translate(0,-1901)"/>
|
|
77
|
+
<use href="#g2588" transform="translate(47460,7152) scale(1,-1) translate(0,-1901)"/>
|
|
78
|
+
<use href="#g2588" transform="translate(48816,7152) scale(1,-1) translate(0,-1901)"/>
|
|
79
|
+
<use href="#g2591" transform="translate(54240,7152) scale(1,-1) translate(0,-1901)"/>
|
|
80
|
+
<use href="#g2588" transform="translate(55596,7152) scale(1,-1) translate(0,-1901)"/>
|
|
81
|
+
<use href="#g2588" transform="translate(56952,7152) scale(1,-1) translate(0,-1901)"/>
|
|
82
|
+
<use href="#g2591" transform="translate(59664,7152) scale(1,-1) translate(0,-1901)"/>
|
|
83
|
+
<use href="#g2588" transform="translate(61020,7152) scale(1,-1) translate(0,-1901)"/>
|
|
84
|
+
<use href="#g2588" transform="translate(62376,7152) scale(1,-1) translate(0,-1901)"/>
|
|
85
|
+
<use href="#g2591" transform="translate(69156,7152) scale(1,-1) translate(0,-1901)"/>
|
|
86
|
+
<use href="#g2588" transform="translate(70512,7152) scale(1,-1) translate(0,-1901)"/>
|
|
87
|
+
<use href="#g2588" transform="translate(71868,7152) scale(1,-1) translate(0,-1901)"/>
|
|
88
|
+
<use href="#g2591" transform="translate(0,9536) scale(1,-1) translate(0,-1901)"/>
|
|
89
|
+
<use href="#g2588" transform="translate(1356,9536) scale(1,-1) translate(0,-1901)"/>
|
|
90
|
+
<use href="#g2588" transform="translate(2712,9536) scale(1,-1) translate(0,-1901)"/>
|
|
91
|
+
<use href="#g2591" transform="translate(6780,9536) scale(1,-1) translate(0,-1901)"/>
|
|
92
|
+
<use href="#g2588" transform="translate(8136,9536) scale(1,-1) translate(0,-1901)"/>
|
|
93
|
+
<use href="#g2588" transform="translate(9492,9536) scale(1,-1) translate(0,-1901)"/>
|
|
94
|
+
<use href="#g2588" transform="translate(10848,9536) scale(1,-1) translate(0,-1901)"/>
|
|
95
|
+
<use href="#g2588" transform="translate(12204,9536) scale(1,-1) translate(0,-1901)"/>
|
|
96
|
+
<use href="#g2588" transform="translate(13560,9536) scale(1,-1) translate(0,-1901)"/>
|
|
97
|
+
<use href="#g2588" transform="translate(14916,9536) scale(1,-1) translate(0,-1901)"/>
|
|
98
|
+
<use href="#g2588" transform="translate(16272,9536) scale(1,-1) translate(0,-1901)"/>
|
|
99
|
+
<use href="#g2591" transform="translate(21696,9536) scale(1,-1) translate(0,-1901)"/>
|
|
100
|
+
<use href="#g2588" transform="translate(23052,9536) scale(1,-1) translate(0,-1901)"/>
|
|
101
|
+
<use href="#g2588" transform="translate(24408,9536) scale(1,-1) translate(0,-1901)"/>
|
|
102
|
+
<use href="#g2591" transform="translate(37968,9536) scale(1,-1) translate(0,-1901)"/>
|
|
103
|
+
<use href="#g2588" transform="translate(39324,9536) scale(1,-1) translate(0,-1901)"/>
|
|
104
|
+
<use href="#g2588" transform="translate(40680,9536) scale(1,-1) translate(0,-1901)"/>
|
|
105
|
+
<use href="#g2591" transform="translate(46104,9536) scale(1,-1) translate(0,-1901)"/>
|
|
106
|
+
<use href="#g2588" transform="translate(47460,9536) scale(1,-1) translate(0,-1901)"/>
|
|
107
|
+
<use href="#g2588" transform="translate(48816,9536) scale(1,-1) translate(0,-1901)"/>
|
|
108
|
+
<use href="#g2591" transform="translate(54240,9536) scale(1,-1) translate(0,-1901)"/>
|
|
109
|
+
<use href="#g2588" transform="translate(55596,9536) scale(1,-1) translate(0,-1901)"/>
|
|
110
|
+
<use href="#g2588" transform="translate(56952,9536) scale(1,-1) translate(0,-1901)"/>
|
|
111
|
+
<use href="#g2591" transform="translate(59664,9536) scale(1,-1) translate(0,-1901)"/>
|
|
112
|
+
<use href="#g2588" transform="translate(61020,9536) scale(1,-1) translate(0,-1901)"/>
|
|
113
|
+
<use href="#g2588" transform="translate(62376,9536) scale(1,-1) translate(0,-1901)"/>
|
|
114
|
+
<use href="#g2591" transform="translate(69156,9536) scale(1,-1) translate(0,-1901)"/>
|
|
115
|
+
<use href="#g2588" transform="translate(70512,9536) scale(1,-1) translate(0,-1901)"/>
|
|
116
|
+
<use href="#g2588" transform="translate(71868,9536) scale(1,-1) translate(0,-1901)"/>
|
|
117
|
+
<use href="#g2591" transform="translate(0,11920) scale(1,-1) translate(0,-1901)"/>
|
|
118
|
+
<use href="#g2588" transform="translate(1356,11920) scale(1,-1) translate(0,-1901)"/>
|
|
119
|
+
<use href="#g2588" transform="translate(2712,11920) scale(1,-1) translate(0,-1901)"/>
|
|
120
|
+
<use href="#g2591" transform="translate(5424,11920) scale(1,-1) translate(0,-1901)"/>
|
|
121
|
+
<use href="#g2588" transform="translate(6780,11920) scale(1,-1) translate(0,-1901)"/>
|
|
122
|
+
<use href="#g2588" transform="translate(8136,11920) scale(1,-1) translate(0,-1901)"/>
|
|
123
|
+
<use href="#g2591" transform="translate(13560,11920) scale(1,-1) translate(0,-1901)"/>
|
|
124
|
+
<use href="#g2588" transform="translate(14916,11920) scale(1,-1) translate(0,-1901)"/>
|
|
125
|
+
<use href="#g2588" transform="translate(16272,11920) scale(1,-1) translate(0,-1901)"/>
|
|
126
|
+
<use href="#g2591" transform="translate(21696,11920) scale(1,-1) translate(0,-1901)"/>
|
|
127
|
+
<use href="#g2588" transform="translate(23052,11920) scale(1,-1) translate(0,-1901)"/>
|
|
128
|
+
<use href="#g2588" transform="translate(24408,11920) scale(1,-1) translate(0,-1901)"/>
|
|
129
|
+
<use href="#g2591" transform="translate(37968,11920) scale(1,-1) translate(0,-1901)"/>
|
|
130
|
+
<use href="#g2588" transform="translate(39324,11920) scale(1,-1) translate(0,-1901)"/>
|
|
131
|
+
<use href="#g2588" transform="translate(40680,11920) scale(1,-1) translate(0,-1901)"/>
|
|
132
|
+
<use href="#g2591" transform="translate(46104,11920) scale(1,-1) translate(0,-1901)"/>
|
|
133
|
+
<use href="#g2588" transform="translate(47460,11920) scale(1,-1) translate(0,-1901)"/>
|
|
134
|
+
<use href="#g2588" transform="translate(48816,11920) scale(1,-1) translate(0,-1901)"/>
|
|
135
|
+
<use href="#g2591" transform="translate(54240,11920) scale(1,-1) translate(0,-1901)"/>
|
|
136
|
+
<use href="#g2588" transform="translate(55596,11920) scale(1,-1) translate(0,-1901)"/>
|
|
137
|
+
<use href="#g2588" transform="translate(56952,11920) scale(1,-1) translate(0,-1901)"/>
|
|
138
|
+
<use href="#g2591" transform="translate(59664,11920) scale(1,-1) translate(0,-1901)"/>
|
|
139
|
+
<use href="#g2588" transform="translate(61020,11920) scale(1,-1) translate(0,-1901)"/>
|
|
140
|
+
<use href="#g2588" transform="translate(62376,11920) scale(1,-1) translate(0,-1901)"/>
|
|
141
|
+
<use href="#g2591" transform="translate(67800,11920) scale(1,-1) translate(0,-1901)"/>
|
|
142
|
+
<use href="#g2588" transform="translate(69156,11920) scale(1,-1) translate(0,-1901)"/>
|
|
143
|
+
<use href="#g2588" transform="translate(70512,11920) scale(1,-1) translate(0,-1901)"/>
|
|
144
|
+
<use href="#g2588" transform="translate(71868,11920) scale(1,-1) translate(0,-1901)"/>
|
|
145
|
+
<use href="#g2591" transform="translate(0,14304) scale(1,-1) translate(0,-1901)"/>
|
|
146
|
+
<use href="#g2588" transform="translate(1356,14304) scale(1,-1) translate(0,-1901)"/>
|
|
147
|
+
<use href="#g2588" transform="translate(2712,14304) scale(1,-1) translate(0,-1901)"/>
|
|
148
|
+
<use href="#g2591" transform="translate(6780,14304) scale(1,-1) translate(0,-1901)"/>
|
|
149
|
+
<use href="#g2588" transform="translate(8136,14304) scale(1,-1) translate(0,-1901)"/>
|
|
150
|
+
<use href="#g2588" transform="translate(9492,14304) scale(1,-1) translate(0,-1901)"/>
|
|
151
|
+
<use href="#g2588" transform="translate(10848,14304) scale(1,-1) translate(0,-1901)"/>
|
|
152
|
+
<use href="#g2588" transform="translate(12204,14304) scale(1,-1) translate(0,-1901)"/>
|
|
153
|
+
<use href="#g2588" transform="translate(13560,14304) scale(1,-1) translate(0,-1901)"/>
|
|
154
|
+
<use href="#g2591" transform="translate(14916,14304) scale(1,-1) translate(0,-1901)"/>
|
|
155
|
+
<use href="#g2588" transform="translate(16272,14304) scale(1,-1) translate(0,-1901)"/>
|
|
156
|
+
<use href="#g2588" transform="translate(17628,14304) scale(1,-1) translate(0,-1901)"/>
|
|
157
|
+
<use href="#g2591" transform="translate(23052,14304) scale(1,-1) translate(0,-1901)"/>
|
|
158
|
+
<use href="#g2588" transform="translate(24408,14304) scale(1,-1) translate(0,-1901)"/>
|
|
159
|
+
<use href="#g2588" transform="translate(25764,14304) scale(1,-1) translate(0,-1901)"/>
|
|
160
|
+
<use href="#g2588" transform="translate(27120,14304) scale(1,-1) translate(0,-1901)"/>
|
|
161
|
+
<use href="#g2591" transform="translate(31188,14304) scale(1,-1) translate(0,-1901)"/>
|
|
162
|
+
<use href="#g2588" transform="translate(32544,14304) scale(1,-1) translate(0,-1901)"/>
|
|
163
|
+
<use href="#g2588" transform="translate(33900,14304) scale(1,-1) translate(0,-1901)"/>
|
|
164
|
+
<use href="#g2591" transform="translate(37968,14304) scale(1,-1) translate(0,-1901)"/>
|
|
165
|
+
<use href="#g2588" transform="translate(39324,14304) scale(1,-1) translate(0,-1901)"/>
|
|
166
|
+
<use href="#g2588" transform="translate(40680,14304) scale(1,-1) translate(0,-1901)"/>
|
|
167
|
+
<use href="#g2591" transform="translate(46104,14304) scale(1,-1) translate(0,-1901)"/>
|
|
168
|
+
<use href="#g2588" transform="translate(47460,14304) scale(1,-1) translate(0,-1901)"/>
|
|
169
|
+
<use href="#g2588" transform="translate(48816,14304) scale(1,-1) translate(0,-1901)"/>
|
|
170
|
+
<use href="#g2591" transform="translate(54240,14304) scale(1,-1) translate(0,-1901)"/>
|
|
171
|
+
<use href="#g2588" transform="translate(55596,14304) scale(1,-1) translate(0,-1901)"/>
|
|
172
|
+
<use href="#g2588" transform="translate(56952,14304) scale(1,-1) translate(0,-1901)"/>
|
|
173
|
+
<use href="#g2591" transform="translate(61020,14304) scale(1,-1) translate(0,-1901)"/>
|
|
174
|
+
<use href="#g2588" transform="translate(62376,14304) scale(1,-1) translate(0,-1901)"/>
|
|
175
|
+
<use href="#g2588" transform="translate(63732,14304) scale(1,-1) translate(0,-1901)"/>
|
|
176
|
+
<use href="#g2588" transform="translate(65088,14304) scale(1,-1) translate(0,-1901)"/>
|
|
177
|
+
<use href="#g2588" transform="translate(66444,14304) scale(1,-1) translate(0,-1901)"/>
|
|
178
|
+
<use href="#g2588" transform="translate(67800,14304) scale(1,-1) translate(0,-1901)"/>
|
|
179
|
+
<use href="#g2591" transform="translate(69156,14304) scale(1,-1) translate(0,-1901)"/>
|
|
180
|
+
<use href="#g2588" transform="translate(70512,14304) scale(1,-1) translate(0,-1901)"/>
|
|
181
|
+
<use href="#g2588" transform="translate(71868,14304) scale(1,-1) translate(0,-1901)"/>
|
|
182
|
+
</svg>
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 73224 16688" fill="#ddd">
|
|
2
|
+
<defs>
|
|
3
|
+
<path id="g2588" d="M-20 -512V1576H1253V-512Z"/>
|
|
4
|
+
<path id="g2591" d="M934 -512V-251H1094V-512ZM298 -512V-251H457V-512ZM616 -147V114H775V-147ZM-20 -147V114H138V-147ZM934 219V480H1094V219ZM298 219V480H457V219ZM616 584V845H775V584ZM-20 584V845H138V584ZM934 950V1211H1094V950ZM298 950V1211H457V950ZM616 1315V1576H775V1315ZM-20 1315V1576H138V1315Z"/>
|
|
5
|
+
</defs>
|
|
6
|
+
<use href="#g2591" transform="translate(0,0) scale(1,-1) translate(0,-1901)"/>
|
|
7
|
+
<use href="#g2588" transform="translate(1356,0) scale(1,-1) translate(0,-1901)"/>
|
|
8
|
+
<use href="#g2588" transform="translate(2712,0) scale(1,-1) translate(0,-1901)"/>
|
|
9
|
+
<use href="#g2591" transform="translate(21696,0) scale(1,-1) translate(0,-1901)"/>
|
|
10
|
+
<use href="#g2588" transform="translate(23052,0) scale(1,-1) translate(0,-1901)"/>
|
|
11
|
+
<use href="#g2588" transform="translate(24408,0) scale(1,-1) translate(0,-1901)"/>
|
|
12
|
+
<use href="#g2591" transform="translate(69156,0) scale(1,-1) translate(0,-1901)"/>
|
|
13
|
+
<use href="#g2588" transform="translate(70512,0) scale(1,-1) translate(0,-1901)"/>
|
|
14
|
+
<use href="#g2588" transform="translate(71868,0) scale(1,-1) translate(0,-1901)"/>
|
|
15
|
+
<use href="#g2591" transform="translate(0,2384) scale(1,-1) translate(0,-1901)"/>
|
|
16
|
+
<use href="#g2588" transform="translate(1356,2384) scale(1,-1) translate(0,-1901)"/>
|
|
17
|
+
<use href="#g2588" transform="translate(2712,2384) scale(1,-1) translate(0,-1901)"/>
|
|
18
|
+
<use href="#g2591" transform="translate(21696,2384) scale(1,-1) translate(0,-1901)"/>
|
|
19
|
+
<use href="#g2588" transform="translate(23052,2384) scale(1,-1) translate(0,-1901)"/>
|
|
20
|
+
<use href="#g2588" transform="translate(24408,2384) scale(1,-1) translate(0,-1901)"/>
|
|
21
|
+
<use href="#g2591" transform="translate(69156,2384) scale(1,-1) translate(0,-1901)"/>
|
|
22
|
+
<use href="#g2588" transform="translate(70512,2384) scale(1,-1) translate(0,-1901)"/>
|
|
23
|
+
<use href="#g2588" transform="translate(71868,2384) scale(1,-1) translate(0,-1901)"/>
|
|
24
|
+
<use href="#g2591" transform="translate(0,4768) scale(1,-1) translate(0,-1901)"/>
|
|
25
|
+
<use href="#g2588" transform="translate(1356,4768) scale(1,-1) translate(0,-1901)"/>
|
|
26
|
+
<use href="#g2588" transform="translate(2712,4768) scale(1,-1) translate(0,-1901)"/>
|
|
27
|
+
<use href="#g2591" transform="translate(6780,4768) scale(1,-1) translate(0,-1901)"/>
|
|
28
|
+
<use href="#g2588" transform="translate(8136,4768) scale(1,-1) translate(0,-1901)"/>
|
|
29
|
+
<use href="#g2588" transform="translate(9492,4768) scale(1,-1) translate(0,-1901)"/>
|
|
30
|
+
<use href="#g2588" transform="translate(10848,4768) scale(1,-1) translate(0,-1901)"/>
|
|
31
|
+
<use href="#g2588" transform="translate(12204,4768) scale(1,-1) translate(0,-1901)"/>
|
|
32
|
+
<use href="#g2588" transform="translate(13560,4768) scale(1,-1) translate(0,-1901)"/>
|
|
33
|
+
<use href="#g2588" transform="translate(14916,4768) scale(1,-1) translate(0,-1901)"/>
|
|
34
|
+
<use href="#g2591" transform="translate(18984,4768) scale(1,-1) translate(0,-1901)"/>
|
|
35
|
+
<use href="#g2588" transform="translate(20340,4768) scale(1,-1) translate(0,-1901)"/>
|
|
36
|
+
<use href="#g2588" transform="translate(21696,4768) scale(1,-1) translate(0,-1901)"/>
|
|
37
|
+
<use href="#g2588" transform="translate(23052,4768) scale(1,-1) translate(0,-1901)"/>
|
|
38
|
+
<use href="#g2588" transform="translate(24408,4768) scale(1,-1) translate(0,-1901)"/>
|
|
39
|
+
<use href="#g2588" transform="translate(25764,4768) scale(1,-1) translate(0,-1901)"/>
|
|
40
|
+
<use href="#g2588" transform="translate(27120,4768) scale(1,-1) translate(0,-1901)"/>
|
|
41
|
+
<use href="#g2591" transform="translate(37968,4768) scale(1,-1) translate(0,-1901)"/>
|
|
42
|
+
<use href="#g2588" transform="translate(39324,4768) scale(1,-1) translate(0,-1901)"/>
|
|
43
|
+
<use href="#g2588" transform="translate(40680,4768) scale(1,-1) translate(0,-1901)"/>
|
|
44
|
+
<use href="#g2588" transform="translate(42036,4768) scale(1,-1) translate(0,-1901)"/>
|
|
45
|
+
<use href="#g2588" transform="translate(43392,4768) scale(1,-1) translate(0,-1901)"/>
|
|
46
|
+
<use href="#g2588" transform="translate(44748,4768) scale(1,-1) translate(0,-1901)"/>
|
|
47
|
+
<use href="#g2588" transform="translate(46104,4768) scale(1,-1) translate(0,-1901)"/>
|
|
48
|
+
<use href="#g2588" transform="translate(47460,4768) scale(1,-1) translate(0,-1901)"/>
|
|
49
|
+
<use href="#g2588" transform="translate(48816,4768) scale(1,-1) translate(0,-1901)"/>
|
|
50
|
+
<use href="#g2588" transform="translate(50172,4768) scale(1,-1) translate(0,-1901)"/>
|
|
51
|
+
<use href="#g2588" transform="translate(51528,4768) scale(1,-1) translate(0,-1901)"/>
|
|
52
|
+
<use href="#g2588" transform="translate(52884,4768) scale(1,-1) translate(0,-1901)"/>
|
|
53
|
+
<use href="#g2588" transform="translate(54240,4768) scale(1,-1) translate(0,-1901)"/>
|
|
54
|
+
<use href="#g2588" transform="translate(55596,4768) scale(1,-1) translate(0,-1901)"/>
|
|
55
|
+
<use href="#g2591" transform="translate(61020,4768) scale(1,-1) translate(0,-1901)"/>
|
|
56
|
+
<use href="#g2588" transform="translate(62376,4768) scale(1,-1) translate(0,-1901)"/>
|
|
57
|
+
<use href="#g2588" transform="translate(63732,4768) scale(1,-1) translate(0,-1901)"/>
|
|
58
|
+
<use href="#g2588" transform="translate(65088,4768) scale(1,-1) translate(0,-1901)"/>
|
|
59
|
+
<use href="#g2588" transform="translate(66444,4768) scale(1,-1) translate(0,-1901)"/>
|
|
60
|
+
<use href="#g2588" transform="translate(67800,4768) scale(1,-1) translate(0,-1901)"/>
|
|
61
|
+
<use href="#g2588" transform="translate(69156,4768) scale(1,-1) translate(0,-1901)"/>
|
|
62
|
+
<use href="#g2588" transform="translate(70512,4768) scale(1,-1) translate(0,-1901)"/>
|
|
63
|
+
<use href="#g2588" transform="translate(71868,4768) scale(1,-1) translate(0,-1901)"/>
|
|
64
|
+
<use href="#g2591" transform="translate(0,7152) scale(1,-1) translate(0,-1901)"/>
|
|
65
|
+
<use href="#g2588" transform="translate(1356,7152) scale(1,-1) translate(0,-1901)"/>
|
|
66
|
+
<use href="#g2588" transform="translate(2712,7152) scale(1,-1) translate(0,-1901)"/>
|
|
67
|
+
<use href="#g2591" transform="translate(13560,7152) scale(1,-1) translate(0,-1901)"/>
|
|
68
|
+
<use href="#g2588" transform="translate(14916,7152) scale(1,-1) translate(0,-1901)"/>
|
|
69
|
+
<use href="#g2588" transform="translate(16272,7152) scale(1,-1) translate(0,-1901)"/>
|
|
70
|
+
<use href="#g2591" transform="translate(21696,7152) scale(1,-1) translate(0,-1901)"/>
|
|
71
|
+
<use href="#g2588" transform="translate(23052,7152) scale(1,-1) translate(0,-1901)"/>
|
|
72
|
+
<use href="#g2588" transform="translate(24408,7152) scale(1,-1) translate(0,-1901)"/>
|
|
73
|
+
<use href="#g2591" transform="translate(37968,7152) scale(1,-1) translate(0,-1901)"/>
|
|
74
|
+
<use href="#g2588" transform="translate(39324,7152) scale(1,-1) translate(0,-1901)"/>
|
|
75
|
+
<use href="#g2588" transform="translate(40680,7152) scale(1,-1) translate(0,-1901)"/>
|
|
76
|
+
<use href="#g2591" transform="translate(46104,7152) scale(1,-1) translate(0,-1901)"/>
|
|
77
|
+
<use href="#g2588" transform="translate(47460,7152) scale(1,-1) translate(0,-1901)"/>
|
|
78
|
+
<use href="#g2588" transform="translate(48816,7152) scale(1,-1) translate(0,-1901)"/>
|
|
79
|
+
<use href="#g2591" transform="translate(54240,7152) scale(1,-1) translate(0,-1901)"/>
|
|
80
|
+
<use href="#g2588" transform="translate(55596,7152) scale(1,-1) translate(0,-1901)"/>
|
|
81
|
+
<use href="#g2588" transform="translate(56952,7152) scale(1,-1) translate(0,-1901)"/>
|
|
82
|
+
<use href="#g2591" transform="translate(59664,7152) scale(1,-1) translate(0,-1901)"/>
|
|
83
|
+
<use href="#g2588" transform="translate(61020,7152) scale(1,-1) translate(0,-1901)"/>
|
|
84
|
+
<use href="#g2588" transform="translate(62376,7152) scale(1,-1) translate(0,-1901)"/>
|
|
85
|
+
<use href="#g2591" transform="translate(69156,7152) scale(1,-1) translate(0,-1901)"/>
|
|
86
|
+
<use href="#g2588" transform="translate(70512,7152) scale(1,-1) translate(0,-1901)"/>
|
|
87
|
+
<use href="#g2588" transform="translate(71868,7152) scale(1,-1) translate(0,-1901)"/>
|
|
88
|
+
<use href="#g2591" transform="translate(0,9536) scale(1,-1) translate(0,-1901)"/>
|
|
89
|
+
<use href="#g2588" transform="translate(1356,9536) scale(1,-1) translate(0,-1901)"/>
|
|
90
|
+
<use href="#g2588" transform="translate(2712,9536) scale(1,-1) translate(0,-1901)"/>
|
|
91
|
+
<use href="#g2591" transform="translate(6780,9536) scale(1,-1) translate(0,-1901)"/>
|
|
92
|
+
<use href="#g2588" transform="translate(8136,9536) scale(1,-1) translate(0,-1901)"/>
|
|
93
|
+
<use href="#g2588" transform="translate(9492,9536) scale(1,-1) translate(0,-1901)"/>
|
|
94
|
+
<use href="#g2588" transform="translate(10848,9536) scale(1,-1) translate(0,-1901)"/>
|
|
95
|
+
<use href="#g2588" transform="translate(12204,9536) scale(1,-1) translate(0,-1901)"/>
|
|
96
|
+
<use href="#g2588" transform="translate(13560,9536) scale(1,-1) translate(0,-1901)"/>
|
|
97
|
+
<use href="#g2588" transform="translate(14916,9536) scale(1,-1) translate(0,-1901)"/>
|
|
98
|
+
<use href="#g2588" transform="translate(16272,9536) scale(1,-1) translate(0,-1901)"/>
|
|
99
|
+
<use href="#g2591" transform="translate(21696,9536) scale(1,-1) translate(0,-1901)"/>
|
|
100
|
+
<use href="#g2588" transform="translate(23052,9536) scale(1,-1) translate(0,-1901)"/>
|
|
101
|
+
<use href="#g2588" transform="translate(24408,9536) scale(1,-1) translate(0,-1901)"/>
|
|
102
|
+
<use href="#g2591" transform="translate(37968,9536) scale(1,-1) translate(0,-1901)"/>
|
|
103
|
+
<use href="#g2588" transform="translate(39324,9536) scale(1,-1) translate(0,-1901)"/>
|
|
104
|
+
<use href="#g2588" transform="translate(40680,9536) scale(1,-1) translate(0,-1901)"/>
|
|
105
|
+
<use href="#g2591" transform="translate(46104,9536) scale(1,-1) translate(0,-1901)"/>
|
|
106
|
+
<use href="#g2588" transform="translate(47460,9536) scale(1,-1) translate(0,-1901)"/>
|
|
107
|
+
<use href="#g2588" transform="translate(48816,9536) scale(1,-1) translate(0,-1901)"/>
|
|
108
|
+
<use href="#g2591" transform="translate(54240,9536) scale(1,-1) translate(0,-1901)"/>
|
|
109
|
+
<use href="#g2588" transform="translate(55596,9536) scale(1,-1) translate(0,-1901)"/>
|
|
110
|
+
<use href="#g2588" transform="translate(56952,9536) scale(1,-1) translate(0,-1901)"/>
|
|
111
|
+
<use href="#g2591" transform="translate(59664,9536) scale(1,-1) translate(0,-1901)"/>
|
|
112
|
+
<use href="#g2588" transform="translate(61020,9536) scale(1,-1) translate(0,-1901)"/>
|
|
113
|
+
<use href="#g2588" transform="translate(62376,9536) scale(1,-1) translate(0,-1901)"/>
|
|
114
|
+
<use href="#g2591" transform="translate(69156,9536) scale(1,-1) translate(0,-1901)"/>
|
|
115
|
+
<use href="#g2588" transform="translate(70512,9536) scale(1,-1) translate(0,-1901)"/>
|
|
116
|
+
<use href="#g2588" transform="translate(71868,9536) scale(1,-1) translate(0,-1901)"/>
|
|
117
|
+
<use href="#g2591" transform="translate(0,11920) scale(1,-1) translate(0,-1901)"/>
|
|
118
|
+
<use href="#g2588" transform="translate(1356,11920) scale(1,-1) translate(0,-1901)"/>
|
|
119
|
+
<use href="#g2588" transform="translate(2712,11920) scale(1,-1) translate(0,-1901)"/>
|
|
120
|
+
<use href="#g2591" transform="translate(5424,11920) scale(1,-1) translate(0,-1901)"/>
|
|
121
|
+
<use href="#g2588" transform="translate(6780,11920) scale(1,-1) translate(0,-1901)"/>
|
|
122
|
+
<use href="#g2588" transform="translate(8136,11920) scale(1,-1) translate(0,-1901)"/>
|
|
123
|
+
<use href="#g2591" transform="translate(13560,11920) scale(1,-1) translate(0,-1901)"/>
|
|
124
|
+
<use href="#g2588" transform="translate(14916,11920) scale(1,-1) translate(0,-1901)"/>
|
|
125
|
+
<use href="#g2588" transform="translate(16272,11920) scale(1,-1) translate(0,-1901)"/>
|
|
126
|
+
<use href="#g2591" transform="translate(21696,11920) scale(1,-1) translate(0,-1901)"/>
|
|
127
|
+
<use href="#g2588" transform="translate(23052,11920) scale(1,-1) translate(0,-1901)"/>
|
|
128
|
+
<use href="#g2588" transform="translate(24408,11920) scale(1,-1) translate(0,-1901)"/>
|
|
129
|
+
<use href="#g2591" transform="translate(37968,11920) scale(1,-1) translate(0,-1901)"/>
|
|
130
|
+
<use href="#g2588" transform="translate(39324,11920) scale(1,-1) translate(0,-1901)"/>
|
|
131
|
+
<use href="#g2588" transform="translate(40680,11920) scale(1,-1) translate(0,-1901)"/>
|
|
132
|
+
<use href="#g2591" transform="translate(46104,11920) scale(1,-1) translate(0,-1901)"/>
|
|
133
|
+
<use href="#g2588" transform="translate(47460,11920) scale(1,-1) translate(0,-1901)"/>
|
|
134
|
+
<use href="#g2588" transform="translate(48816,11920) scale(1,-1) translate(0,-1901)"/>
|
|
135
|
+
<use href="#g2591" transform="translate(54240,11920) scale(1,-1) translate(0,-1901)"/>
|
|
136
|
+
<use href="#g2588" transform="translate(55596,11920) scale(1,-1) translate(0,-1901)"/>
|
|
137
|
+
<use href="#g2588" transform="translate(56952,11920) scale(1,-1) translate(0,-1901)"/>
|
|
138
|
+
<use href="#g2591" transform="translate(59664,11920) scale(1,-1) translate(0,-1901)"/>
|
|
139
|
+
<use href="#g2588" transform="translate(61020,11920) scale(1,-1) translate(0,-1901)"/>
|
|
140
|
+
<use href="#g2588" transform="translate(62376,11920) scale(1,-1) translate(0,-1901)"/>
|
|
141
|
+
<use href="#g2591" transform="translate(67800,11920) scale(1,-1) translate(0,-1901)"/>
|
|
142
|
+
<use href="#g2588" transform="translate(69156,11920) scale(1,-1) translate(0,-1901)"/>
|
|
143
|
+
<use href="#g2588" transform="translate(70512,11920) scale(1,-1) translate(0,-1901)"/>
|
|
144
|
+
<use href="#g2588" transform="translate(71868,11920) scale(1,-1) translate(0,-1901)"/>
|
|
145
|
+
<use href="#g2591" transform="translate(0,14304) scale(1,-1) translate(0,-1901)"/>
|
|
146
|
+
<use href="#g2588" transform="translate(1356,14304) scale(1,-1) translate(0,-1901)"/>
|
|
147
|
+
<use href="#g2588" transform="translate(2712,14304) scale(1,-1) translate(0,-1901)"/>
|
|
148
|
+
<use href="#g2591" transform="translate(6780,14304) scale(1,-1) translate(0,-1901)"/>
|
|
149
|
+
<use href="#g2588" transform="translate(8136,14304) scale(1,-1) translate(0,-1901)"/>
|
|
150
|
+
<use href="#g2588" transform="translate(9492,14304) scale(1,-1) translate(0,-1901)"/>
|
|
151
|
+
<use href="#g2588" transform="translate(10848,14304) scale(1,-1) translate(0,-1901)"/>
|
|
152
|
+
<use href="#g2588" transform="translate(12204,14304) scale(1,-1) translate(0,-1901)"/>
|
|
153
|
+
<use href="#g2588" transform="translate(13560,14304) scale(1,-1) translate(0,-1901)"/>
|
|
154
|
+
<use href="#g2591" transform="translate(14916,14304) scale(1,-1) translate(0,-1901)"/>
|
|
155
|
+
<use href="#g2588" transform="translate(16272,14304) scale(1,-1) translate(0,-1901)"/>
|
|
156
|
+
<use href="#g2588" transform="translate(17628,14304) scale(1,-1) translate(0,-1901)"/>
|
|
157
|
+
<use href="#g2591" transform="translate(23052,14304) scale(1,-1) translate(0,-1901)"/>
|
|
158
|
+
<use href="#g2588" transform="translate(24408,14304) scale(1,-1) translate(0,-1901)"/>
|
|
159
|
+
<use href="#g2588" transform="translate(25764,14304) scale(1,-1) translate(0,-1901)"/>
|
|
160
|
+
<use href="#g2588" transform="translate(27120,14304) scale(1,-1) translate(0,-1901)"/>
|
|
161
|
+
<use href="#g2591" transform="translate(31188,14304) scale(1,-1) translate(0,-1901)"/>
|
|
162
|
+
<use href="#g2588" transform="translate(32544,14304) scale(1,-1) translate(0,-1901)"/>
|
|
163
|
+
<use href="#g2588" transform="translate(33900,14304) scale(1,-1) translate(0,-1901)"/>
|
|
164
|
+
<use href="#g2591" transform="translate(37968,14304) scale(1,-1) translate(0,-1901)"/>
|
|
165
|
+
<use href="#g2588" transform="translate(39324,14304) scale(1,-1) translate(0,-1901)"/>
|
|
166
|
+
<use href="#g2588" transform="translate(40680,14304) scale(1,-1) translate(0,-1901)"/>
|
|
167
|
+
<use href="#g2591" transform="translate(46104,14304) scale(1,-1) translate(0,-1901)"/>
|
|
168
|
+
<use href="#g2588" transform="translate(47460,14304) scale(1,-1) translate(0,-1901)"/>
|
|
169
|
+
<use href="#g2588" transform="translate(48816,14304) scale(1,-1) translate(0,-1901)"/>
|
|
170
|
+
<use href="#g2591" transform="translate(54240,14304) scale(1,-1) translate(0,-1901)"/>
|
|
171
|
+
<use href="#g2588" transform="translate(55596,14304) scale(1,-1) translate(0,-1901)"/>
|
|
172
|
+
<use href="#g2588" transform="translate(56952,14304) scale(1,-1) translate(0,-1901)"/>
|
|
173
|
+
<use href="#g2591" transform="translate(61020,14304) scale(1,-1) translate(0,-1901)"/>
|
|
174
|
+
<use href="#g2588" transform="translate(62376,14304) scale(1,-1) translate(0,-1901)"/>
|
|
175
|
+
<use href="#g2588" transform="translate(63732,14304) scale(1,-1) translate(0,-1901)"/>
|
|
176
|
+
<use href="#g2588" transform="translate(65088,14304) scale(1,-1) translate(0,-1901)"/>
|
|
177
|
+
<use href="#g2588" transform="translate(66444,14304) scale(1,-1) translate(0,-1901)"/>
|
|
178
|
+
<use href="#g2588" transform="translate(67800,14304) scale(1,-1) translate(0,-1901)"/>
|
|
179
|
+
<use href="#g2591" transform="translate(69156,14304) scale(1,-1) translate(0,-1901)"/>
|
|
180
|
+
<use href="#g2588" transform="translate(70512,14304) scale(1,-1) translate(0,-1901)"/>
|
|
181
|
+
<use href="#g2588" transform="translate(71868,14304) scale(1,-1) translate(0,-1901)"/>
|
|
182
|
+
</svg>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# lat.md prompt hook for Claude Code
|
|
3
|
-
# Injected by `lat init` — reminds the agent to consult lat.md before working.
|
|
4
|
-
#
|
|
5
|
-
# This hook fires on every user prompt submission. It adds a short instruction
|
|
6
|
-
# telling the agent to run `lat search` and `lat expand` so that lat.md context
|
|
7
|
-
# is consulted before any code changes.
|
|
8
|
-
|
|
9
|
-
cat <<'HOOK_JSON'
|
|
10
|
-
{
|
|
11
|
-
"hookSpecificOutput": {
|
|
12
|
-
"hookEventName": "UserPromptSubmit",
|
|
13
|
-
"additionalContext": "Before starting work on this task:\n1. Run `lat search` with a query relevant to the task and read the results to understand the design intent.\n2. If the prompt contains [[refs]], run `lat expand` on the full prompt text to resolve them.\n3. After completing work, run `lat check` to validate all links and code refs.\nDo not skip these steps."
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
HOOK_JSON
|