openfig-core 0.2.0 → 0.3.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.
package/README.md ADDED
@@ -0,0 +1,185 @@
1
+ # openfig-core
2
+
3
+ Isomorphic `.fig` file parser — reads Figma binary format in Node.js and browsers.
4
+
5
+ Parses `.fig` (Figma Design), `.deck` (Figma Slides), and `.jam` (FigJam) files into a traversable node tree. Zero Node.js dependencies — works in browsers via bundlers.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install openfig-core
11
+ ```
12
+
13
+ ## Quick start
14
+
15
+ ```js
16
+ import { parseFig, nodeId } from 'openfig-core';
17
+ import { readFileSync } from 'fs';
18
+
19
+ const data = new Uint8Array(readFileSync('design.fig'));
20
+ const doc = parseFig(data);
21
+
22
+ console.log(doc.header); // { prelude: 'fig-kiwi', version: 52 }
23
+ console.log(doc.nodes.length); // number of nodes in the file
24
+
25
+ // Traverse the node tree
26
+ for (const node of doc.nodes) {
27
+ const id = nodeId(node);
28
+ const children = doc.childrenMap.get(id) ?? [];
29
+ console.log(`${id} ${node.type} "${node.name}" (${children.length} children)`);
30
+ }
31
+ ```
32
+
33
+ ### Browser
34
+
35
+ ```js
36
+ const resp = await fetch('/design.fig');
37
+ const data = new Uint8Array(await resp.arrayBuffer());
38
+ const doc = parseFig(data);
39
+ ```
40
+
41
+ ## API
42
+
43
+ ### `parseFig(data: Uint8Array): FigDocument`
44
+
45
+ Parse a complete `.fig` ZIP archive. Extracts `canvas.fig`, `meta.json`, `thumbnail.png`, and `images/*`.
46
+
47
+ ### `parseFigBinary(data: Uint8Array): FigDocument`
48
+
49
+ Parse raw `canvas.fig` binary data (the blob inside the ZIP). Use this if you extract the ZIP yourself.
50
+
51
+ ### `nodeId(node: FigNode): string | null`
52
+
53
+ Format a node's GUID as `"sessionID:localID"` (e.g. `"1:127"`). Returns `null` if the node has no GUID.
54
+
55
+ ### `FigDocument`
56
+
57
+ ```ts
58
+ interface FigDocument {
59
+ header: { prelude: string; version: number };
60
+ nodes: FigNode[]; // all nodes (flat array)
61
+ nodeMap: Map<string, FigNode>; // id → node
62
+ childrenMap: Map<string, FigNode[]>; // parent id → children
63
+ schema: any; // decoded kiwi binary schema
64
+ compiledSchema: any; // compiled schema (encodeMessage/decodeMessage)
65
+ rawChunks: Uint8Array[]; // raw length-prefixed binary chunks
66
+ message: any; // full decoded kiwi message
67
+ meta?: Record<string, any>; // meta.json contents
68
+ thumbnail?: Uint8Array; // thumbnail.png bytes
69
+ images: Map<string, Uint8Array>; // filename → image bytes
70
+ }
71
+ ```
72
+
73
+ ### `FigNode`
74
+
75
+ ```ts
76
+ interface FigNode {
77
+ guid: FigGuid;
78
+ type: string; // FRAME, TEXT, ELLIPSE, SYMBOL, INSTANCE, ...
79
+ name: string;
80
+ phase?: string; // CREATED, REMOVED, etc.
81
+ parentIndex?: { guid: FigGuid; position: string };
82
+ size?: { x: number; y: number };
83
+ transform?: { m00, m01, m02, m10, m11, m12: number };
84
+ fillPaints?: FigPaint[];
85
+ textData?: { characters: string };
86
+ [key: string]: any; // open for all kiwi-decoded fields
87
+ }
88
+ ```
89
+
90
+ ## Encoding (write .fig files)
91
+
92
+ ### Round-trip: open, edit, save
93
+
94
+ ```js
95
+ import { parseFig, encodeFigParts, assembleCanvasFig, createFigZip } from 'openfig-core';
96
+
97
+ const doc = parseFig(data);
98
+
99
+ // Edit nodes...
100
+ doc.message.nodeChanges[2].name = "Renamed";
101
+
102
+ const parts = encodeFigParts(doc);
103
+
104
+ // Caller must zstd-compress the message (openfig-core stays isomorphic)
105
+ const messageCompressed = yourZstdCompress(parts.messageRaw, 3);
106
+
107
+ const canvasFig = assembleCanvasFig({
108
+ prelude: parts.prelude,
109
+ version: parts.version,
110
+ schemaCompressed: parts.schemaCompressed,
111
+ messageCompressed,
112
+ passThrough: parts.passThrough,
113
+ });
114
+
115
+ const figZip = createFigZip({
116
+ canvasFig,
117
+ meta: doc.meta,
118
+ thumbnail: doc.thumbnail,
119
+ images: doc.images,
120
+ });
121
+ // figZip is a Uint8Array — write to disk or trigger download
122
+ ```
123
+
124
+ ### From scratch: create a new .fig file
125
+
126
+ ```js
127
+ import { createEmptyFigDoc, encodeFigParts, assembleCanvasFig, createFigZip } from 'openfig-core';
128
+
129
+ const doc = createEmptyFigDoc();
130
+
131
+ // Add nodes to doc.message.nodeChanges...
132
+
133
+ const parts = encodeFigParts(doc);
134
+ const messageCompressed = yourZstdCompress(parts.messageRaw, 3);
135
+ const canvasFig = assembleCanvasFig({ ...parts, messageCompressed });
136
+ const figZip = createFigZip({ canvasFig, meta: doc.meta, thumbnail: doc.thumbnail });
137
+ ```
138
+
139
+ ### `encodeFigParts(doc: FigDocument): EncodedFigParts`
140
+
141
+ Encodes a FigDocument into kiwi binary parts. Returns the raw message (caller must zstd-compress for chunk 1) and the deflate-compressed schema (chunk 0).
142
+
143
+ ### `assembleCanvasFig(input: AssembleCanvasFigInput): Uint8Array`
144
+
145
+ Assembles the `canvas.fig` binary from pre-compressed chunks. Format: `[prelude 8B][version uint32 LE][len+chunk0][len+chunk1][len+chunk2+]...`
146
+
147
+ ### `createFigZip(input: CreateFigZipInput): Uint8Array`
148
+
149
+ Packages `canvas.fig` + optional `meta.json`, `thumbnail.png`, and `images/*` into a `.fig` ZIP archive (store mode).
150
+
151
+ ### `createEmptyFigDoc(): FigDocument`
152
+
153
+ Creates an empty FigDocument with a bundled kiwi schema, a Document node, and a Page node. Ready for adding content and encoding.
154
+
155
+ ## File format documentation
156
+
157
+ Detailed documentation of the Figma binary format is in [`docs/`](docs/):
158
+
159
+ | Doc | Covers |
160
+ |-----|--------|
161
+ | [Archive structure](docs/archive.md) | ZIP layout, canvas.fig binary, kiwi schema, encoding pipeline |
162
+ | [Nodes](docs/nodes.md) | Node types, GUIDs, parentIndex, hierarchy |
163
+ | [Shapes](docs/shapes.md) | ROUNDED_RECTANGLE, FRAME, transforms, geometry |
164
+ | [Text](docs/text.md) | TEXT nodes, styles, fonts |
165
+ | [Images](docs/images.md) | Image storage, SHA-1 hashing, thumbnails |
166
+ | [Colors](docs/colors.md) | Color variables, palette |
167
+ | [Overrides](docs/overrides.md) | Symbol overrides (text, image, nested) |
168
+ | [Slides](docs/slides.md) | Slide dimensions, cloning, ordering |
169
+ | [Modes](docs/modes.md) | Slides mode vs Design mode |
170
+ | [Invariants](docs/invariants.md) | Hard rules and sentinel values |
171
+ | [Research](docs/research.md) | Binary format reverse-engineering notes |
172
+
173
+ ## Dependencies
174
+
175
+ - [`fflate`](https://github.com/101arrowz/fflate) — ZIP extraction + deflate decompression
176
+ - [`kiwi-schema`](https://github.com/nicbarker/kiwi-schema) — Kiwi binary format decoding
177
+ - [`fzstd`](https://github.com/nicbarker/fzstd) — Zstandard decompression
178
+
179
+ ## License
180
+
181
+ MIT
182
+
183
+ ## Disclaimer
184
+
185
+ Figma is a trademark of Figma, Inc. This project is not affiliated with, endorsed by, or sponsored by Figma, Inc.
package/dist/index.cjs CHANGED
@@ -20,6 +20,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ assembleCanvasFig: () => assembleCanvasFig,
24
+ createEmptyFigDoc: () => createEmptyFigDoc,
25
+ createFigZip: () => createFigZip,
26
+ encodeFigParts: () => encodeFigParts,
23
27
  nodeId: () => nodeId,
24
28
  parseFig: () => parseFig,
25
29
  parseFigBinary: () => parseFigBinary
@@ -121,8 +125,91 @@ function parseFig(data) {
121
125
  }
122
126
  return doc;
123
127
  }
128
+
129
+ // src/encoder.ts
130
+ var import_fflate2 = require("fflate");
131
+ var import_kiwi_schema2 = require("kiwi-schema");
132
+ function encodeFigParts(doc) {
133
+ if (!doc.compiledSchema || !doc.message) {
134
+ throw new Error("FigDocument missing compiledSchema or message \u2014 cannot encode");
135
+ }
136
+ if (!doc.schema) {
137
+ throw new Error("FigDocument missing schema \u2014 cannot encode");
138
+ }
139
+ const messageRaw = new Uint8Array(doc.compiledSchema.encodeMessage(doc.message));
140
+ const schemaRaw = (0, import_kiwi_schema2.encodeBinarySchema)(doc.schema);
141
+ const schemaCompressed = (0, import_fflate2.deflateSync)(new Uint8Array(schemaRaw));
142
+ const passThrough = doc.rawChunks.slice(2);
143
+ return {
144
+ schemaCompressed,
145
+ messageRaw,
146
+ prelude: doc.header.prelude,
147
+ version: doc.header.version,
148
+ passThrough
149
+ };
150
+ }
151
+ function assembleCanvasFig(input) {
152
+ const { prelude, version, schemaCompressed, messageCompressed, passThrough = [] } = input;
153
+ const chunks = [schemaCompressed, messageCompressed, ...passThrough];
154
+ const headerSize = 8 + 4;
155
+ const totalSize = chunks.reduce((sz, c) => sz + 4 + c.byteLength, headerSize);
156
+ const buf = new Uint8Array(totalSize);
157
+ const view = new DataView(buf.buffer);
158
+ let off = 0;
159
+ const enc = new TextEncoder();
160
+ const preludeBytes = enc.encode(prelude);
161
+ buf.set(preludeBytes, 0);
162
+ for (let i = preludeBytes.length; i < 8; i++) {
163
+ buf[i] = 32;
164
+ }
165
+ off = 8;
166
+ view.setUint32(off, version, true);
167
+ off += 4;
168
+ for (const chunk of chunks) {
169
+ view.setUint32(off, chunk.byteLength, true);
170
+ off += 4;
171
+ buf.set(chunk, off);
172
+ off += chunk.byteLength;
173
+ }
174
+ return buf;
175
+ }
176
+ function createFigZip(input) {
177
+ const opts = {};
178
+ opts["canvas.fig"] = [input.canvasFig, { level: 0 }];
179
+ if (input.meta) {
180
+ opts["meta.json"] = [new TextEncoder().encode(JSON.stringify(input.meta)), { level: 0 }];
181
+ }
182
+ if (input.thumbnail) {
183
+ opts["thumbnail.png"] = [input.thumbnail, { level: 0 }];
184
+ }
185
+ if (input.images) {
186
+ for (const [name, data] of input.images) {
187
+ opts[`images/${name}`] = [data, { level: 0 }];
188
+ }
189
+ }
190
+ return (0, import_fflate2.zipSync)(opts);
191
+ }
192
+
193
+ // src/schema.ts
194
+ var emptyFigTemplate = "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";
195
+
196
+ // src/template.ts
197
+ function b64decode(b64) {
198
+ const bin = atob(b64);
199
+ const bytes = new Uint8Array(bin.length);
200
+ for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
201
+ return bytes;
202
+ }
203
+ function createEmptyFigDoc() {
204
+ const bytes = b64decode(emptyFigTemplate);
205
+ return parseFig(bytes);
206
+ }
124
207
  // Annotate the CommonJS export names for ESM import in node:
125
208
  0 && (module.exports = {
209
+ assembleCanvasFig,
210
+ createEmptyFigDoc,
211
+ createFigZip,
212
+ encodeFigParts,
126
213
  nodeId,
127
214
  parseFig,
128
215
  parseFigBinary
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/parser.ts","../src/utils.ts"],"sourcesContent":["export { parseFig, parseFigBinary } from \"./parser.js\";\nexport { nodeId } from \"./utils.js\";\nexport type { FigDocument, FigNode, FigPaint, FigGuid } from \"./types.js\";\n","/**\n * Isomorphic .fig binary parser.\n *\n * .fig files are ZIP archives containing:\n * - canvas.fig (binary: prelude + version + kiwi-encoded chunks)\n * - meta.json (optional)\n * - thumbnail.png (optional)\n * - images/ (optional)\n *\n * Parsing flow:\n * 1. Unzip → extract canvas.fig\n * 2. Read 8-byte prelude + 4-byte version\n * 3. Chunk 0: deflateRaw → kiwi binary schema\n * 4. Chunk 1: zstd or deflateRaw → kiwi message (nodeChanges[])\n * 5. Build node maps\n */\n\nimport { unzipSync, inflateSync } from \"fflate\";\nimport { decodeBinarySchema, compileSchema } from \"kiwi-schema\";\nimport { decompress as zstdDecompress } from \"fzstd\";\nimport type { FigDocument, FigNode } from \"./types.js\";\nimport { nodeId } from \"./utils.js\";\n\n/**\n * Parse raw canvas.fig binary data (the blob inside the ZIP).\n * Use this if you extract the ZIP yourself.\n */\nexport function parseFigBinary(data: Uint8Array): FigDocument {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Read 8-byte prelude + 4-byte version\n const prelude = String.fromCharCode(...data.subarray(0, 8));\n if (!prelude.startsWith(\"fig-\")) {\n throw new Error(`Unknown prelude: ${prelude}`);\n }\n const version = view.getUint32(8, true);\n\n // Read length-prefixed chunks\n const chunks: Uint8Array[] = [];\n let off = 12;\n while (off < data.byteLength) {\n const len = view.getUint32(off, true);\n off += 4;\n chunks.push(data.subarray(off, off + len));\n off += len;\n }\n\n if (chunks.length < 2) {\n throw new Error(\"Expected at least 2 chunks in .fig binary\");\n }\n\n // Chunk 0: kiwi schema (deflateRaw compressed)\n const schemaData = inflateSync(chunks[0]);\n const schema = decodeBinarySchema(schemaData);\n const compiled = compileSchema(schema);\n\n // Chunk 1: message (zstd or deflateRaw — auto-detect by magic bytes)\n let msgData: Uint8Array;\n const c1 = chunks[1];\n if (c1[0] === 0x28 && c1[1] === 0xb5 && c1[2] === 0x2f && c1[3] === 0xfd) {\n msgData = zstdDecompress(c1);\n } else {\n msgData = inflateSync(c1);\n }\n const message = compiled.decodeMessage(msgData);\n\n // Build maps\n const nodes: FigNode[] = message.nodeChanges;\n const nodeMap = new Map<string, FigNode>();\n const childrenMap = new Map<string, FigNode[]>();\n\n for (const node of nodes) {\n const id = nodeId(node);\n if (id) nodeMap.set(id, node);\n }\n\n for (const node of nodes) {\n if (!node.parentIndex?.guid) continue;\n const pid = `${node.parentIndex.guid.sessionID}:${node.parentIndex.guid.localID}`;\n if (!childrenMap.has(pid)) childrenMap.set(pid, []);\n childrenMap.get(pid)!.push(node);\n }\n\n return {\n header: { prelude: prelude.trim(), version },\n nodes,\n nodeMap,\n childrenMap,\n schema,\n compiledSchema: compiled,\n rawChunks: chunks,\n message,\n images: new Map(),\n };\n}\n\n/**\n * Parse a complete .fig file (ZIP archive).\n * Extracts canvas.fig, meta.json, thumbnail.png, and images/*.\n */\nexport function parseFig(data: Uint8Array): FigDocument {\n // Check ZIP header\n if (data[0] !== 0x50 || data[1] !== 0x4b) {\n throw new Error(\"Not a valid .fig file (missing ZIP header)\");\n }\n\n const unzipped = unzipSync(data);\n\n // Find and parse canvas.fig\n const canvasKey = Object.keys(unzipped).find((k) => k.endsWith(\"canvas.fig\"));\n if (!canvasKey) {\n throw new Error(\"No canvas.fig found in .fig archive\");\n }\n const doc = parseFigBinary(unzipped[canvasKey]);\n\n // Extract meta.json\n const metaKey = Object.keys(unzipped).find((k) => k.endsWith(\"meta.json\"));\n if (metaKey) {\n try {\n doc.meta = JSON.parse(new TextDecoder().decode(unzipped[metaKey]));\n } catch { /* ignore malformed meta */ }\n }\n\n // Extract thumbnail\n const thumbKey = Object.keys(unzipped).find((k) => k.endsWith(\"thumbnail.png\"));\n if (thumbKey) {\n doc.thumbnail = unzipped[thumbKey];\n }\n\n // Extract images\n for (const key of Object.keys(unzipped)) {\n if (key.includes(\"images/\") && key !== \"images/\") {\n const filename = key.split(\"/\").pop()!;\n doc.images.set(filename, unzipped[key]);\n }\n }\n\n return doc;\n}\n","import type { FigNode } from \"./types.js\";\n\n/**\n * Returns the string ID for a node (\"sessionID:localID\"), or null if no guid.\n */\nexport function nodeId(node: FigNode): string | null {\n if (!node?.guid) return null;\n return `${node.guid.sessionID}:${node.guid.localID}`;\n}\n"],"mappings":"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","names":["zstdDecompress"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/parser.ts","../src/utils.ts","../src/encoder.ts","../src/schema.ts","../src/template.ts"],"sourcesContent":["export { parseFig, parseFigBinary } from \"./parser.js\";\nexport { encodeFigParts, assembleCanvasFig, createFigZip } from \"./encoder.js\";\nexport { createEmptyFigDoc } from \"./template.js\";\nexport { nodeId } from \"./utils.js\";\nexport type { FigDocument, FigNode, FigPaint, FigGuid } from \"./types.js\";\nexport type { EncodedFigParts, AssembleCanvasFigInput, CreateFigZipInput } from \"./encoder.js\";\n","/**\n * Isomorphic .fig binary parser.\n *\n * .fig files are ZIP archives containing:\n * - canvas.fig (binary: prelude + version + kiwi-encoded chunks)\n * - meta.json (optional)\n * - thumbnail.png (optional)\n * - images/ (optional)\n *\n * Parsing flow:\n * 1. Unzip → extract canvas.fig\n * 2. Read 8-byte prelude + 4-byte version\n * 3. Chunk 0: deflateRaw → kiwi binary schema\n * 4. Chunk 1: zstd or deflateRaw → kiwi message (nodeChanges[])\n * 5. Build node maps\n */\n\nimport { unzipSync, inflateSync } from \"fflate\";\nimport { decodeBinarySchema, compileSchema } from \"kiwi-schema\";\nimport { decompress as zstdDecompress } from \"fzstd\";\nimport type { FigDocument, FigNode } from \"./types.js\";\nimport { nodeId } from \"./utils.js\";\n\n/**\n * Parse raw canvas.fig binary data (the blob inside the ZIP).\n * Use this if you extract the ZIP yourself.\n */\nexport function parseFigBinary(data: Uint8Array): FigDocument {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Read 8-byte prelude + 4-byte version\n const prelude = String.fromCharCode(...data.subarray(0, 8));\n if (!prelude.startsWith(\"fig-\")) {\n throw new Error(`Unknown prelude: ${prelude}`);\n }\n const version = view.getUint32(8, true);\n\n // Read length-prefixed chunks\n const chunks: Uint8Array[] = [];\n let off = 12;\n while (off < data.byteLength) {\n const len = view.getUint32(off, true);\n off += 4;\n chunks.push(data.subarray(off, off + len));\n off += len;\n }\n\n if (chunks.length < 2) {\n throw new Error(\"Expected at least 2 chunks in .fig binary\");\n }\n\n // Chunk 0: kiwi schema (deflateRaw compressed)\n const schemaData = inflateSync(chunks[0]);\n const schema = decodeBinarySchema(schemaData);\n const compiled = compileSchema(schema);\n\n // Chunk 1: message (zstd or deflateRaw — auto-detect by magic bytes)\n let msgData: Uint8Array;\n const c1 = chunks[1];\n if (c1[0] === 0x28 && c1[1] === 0xb5 && c1[2] === 0x2f && c1[3] === 0xfd) {\n msgData = zstdDecompress(c1);\n } else {\n msgData = inflateSync(c1);\n }\n const message = compiled.decodeMessage(msgData);\n\n // Build maps\n const nodes: FigNode[] = message.nodeChanges;\n const nodeMap = new Map<string, FigNode>();\n const childrenMap = new Map<string, FigNode[]>();\n\n for (const node of nodes) {\n const id = nodeId(node);\n if (id) nodeMap.set(id, node);\n }\n\n for (const node of nodes) {\n if (!node.parentIndex?.guid) continue;\n const pid = `${node.parentIndex.guid.sessionID}:${node.parentIndex.guid.localID}`;\n if (!childrenMap.has(pid)) childrenMap.set(pid, []);\n childrenMap.get(pid)!.push(node);\n }\n\n return {\n header: { prelude: prelude.trim(), version },\n nodes,\n nodeMap,\n childrenMap,\n schema,\n compiledSchema: compiled,\n rawChunks: chunks,\n message,\n images: new Map(),\n };\n}\n\n/**\n * Parse a complete .fig file (ZIP archive).\n * Extracts canvas.fig, meta.json, thumbnail.png, and images/*.\n */\nexport function parseFig(data: Uint8Array): FigDocument {\n // Check ZIP header\n if (data[0] !== 0x50 || data[1] !== 0x4b) {\n throw new Error(\"Not a valid .fig file (missing ZIP header)\");\n }\n\n const unzipped = unzipSync(data);\n\n // Find and parse canvas.fig\n const canvasKey = Object.keys(unzipped).find((k) => k.endsWith(\"canvas.fig\"));\n if (!canvasKey) {\n throw new Error(\"No canvas.fig found in .fig archive\");\n }\n const doc = parseFigBinary(unzipped[canvasKey]);\n\n // Extract meta.json\n const metaKey = Object.keys(unzipped).find((k) => k.endsWith(\"meta.json\"));\n if (metaKey) {\n try {\n doc.meta = JSON.parse(new TextDecoder().decode(unzipped[metaKey]));\n } catch { /* ignore malformed meta */ }\n }\n\n // Extract thumbnail\n const thumbKey = Object.keys(unzipped).find((k) => k.endsWith(\"thumbnail.png\"));\n if (thumbKey) {\n doc.thumbnail = unzipped[thumbKey];\n }\n\n // Extract images\n for (const key of Object.keys(unzipped)) {\n if (key.includes(\"images/\") && key !== \"images/\") {\n const filename = key.split(\"/\").pop()!;\n doc.images.set(filename, unzipped[key]);\n }\n }\n\n return doc;\n}\n","import type { FigNode } from \"./types.js\";\n\n/**\n * Returns the string ID for a node (\"sessionID:localID\"), or null if no guid.\n */\nexport function nodeId(node: FigNode): string | null {\n if (!node?.guid) return null;\n return `${node.guid.sessionID}:${node.guid.localID}`;\n}\n","/**\n * .fig file encoder — the write side of the roundtrip.\n *\n * Encodes a FigDocument back to .fig binary format.\n * Zstd compression of chunk 1 (message) is NOT included — the caller\n * provides pre-compressed bytes. This keeps openfig-core isomorphic\n * (no WASM dependency).\n *\n * Encoding flow:\n * 1. compiledSchema.encodeMessage(message) → kiwi binary\n * 2. encodeBinarySchema(schema) + deflateSync → compressed chunk 0\n * 3. Caller zstd-compresses the message → compressed chunk 1\n * 4. assembleCanvasFig() builds the binary\n * 5. createFigZip() packages into ZIP\n */\n\nimport { deflateSync, zipSync } from \"fflate\";\nimport { encodeBinarySchema } from \"kiwi-schema\";\nimport type { FigDocument } from \"./types.js\";\n\nexport interface EncodedFigParts {\n /** deflateRaw-compressed kiwi schema (ready for chunk 0) */\n schemaCompressed: Uint8Array;\n /** Raw kiwi-encoded message — caller MUST zstd-compress this for chunk 1 */\n messageRaw: Uint8Array;\n /** Original prelude string (e.g., \"fig-kiwi\") */\n prelude: string;\n /** Original version number */\n version: number;\n /** Passthrough chunks (rawChunks[2+]) — included as-is */\n passThrough: Uint8Array[];\n}\n\nexport interface AssembleCanvasFigInput {\n prelude: string;\n version: number;\n schemaCompressed: Uint8Array;\n messageCompressed: Uint8Array;\n passThrough?: Uint8Array[];\n}\n\nexport interface CreateFigZipInput {\n canvasFig: Uint8Array;\n meta?: Record<string, any>;\n thumbnail?: Uint8Array;\n images?: Map<string, Uint8Array>;\n}\n\n/**\n * Encode a FigDocument into parts ready for assembly.\n * The message is returned as raw kiwi bytes — caller must zstd-compress it.\n */\nexport function encodeFigParts(doc: FigDocument): EncodedFigParts {\n if (!doc.compiledSchema || !doc.message) {\n throw new Error(\"FigDocument missing compiledSchema or message — cannot encode\");\n }\n if (!doc.schema) {\n throw new Error(\"FigDocument missing schema — cannot encode\");\n }\n\n // Encode kiwi message\n const messageRaw = new Uint8Array(doc.compiledSchema.encodeMessage(doc.message));\n\n // Encode + deflateRaw-compress kiwi schema\n const schemaRaw = encodeBinarySchema(doc.schema);\n const schemaCompressed = deflateSync(new Uint8Array(schemaRaw));\n\n // Passthrough chunks 2+\n const passThrough = doc.rawChunks.slice(2);\n\n return {\n schemaCompressed,\n messageRaw,\n prelude: doc.header.prelude,\n version: doc.header.version,\n passThrough,\n };\n}\n\n/**\n * Assemble a canvas.fig binary from pre-compressed chunks.\n *\n * Format: [prelude 8B][version uint32 LE][len uint32 LE][chunk0][len][chunk1][len][chunk2+]...\n */\nexport function assembleCanvasFig(input: AssembleCanvasFigInput): Uint8Array {\n const { prelude, version, schemaCompressed, messageCompressed, passThrough = [] } = input;\n\n const chunks = [schemaCompressed, messageCompressed, ...passThrough];\n\n // Calculate total size: 8 (prelude) + 4 (version) + sum(4 + chunk.length)\n const headerSize = 8 + 4;\n const totalSize = chunks.reduce((sz, c) => sz + 4 + c.byteLength, headerSize);\n\n const buf = new Uint8Array(totalSize);\n const view = new DataView(buf.buffer);\n\n // Write prelude (8 bytes, padded with spaces if shorter)\n let off = 0;\n const enc = new TextEncoder();\n const preludeBytes = enc.encode(prelude);\n buf.set(preludeBytes, 0);\n // Pad to 8 bytes if needed\n for (let i = preludeBytes.length; i < 8; i++) {\n buf[i] = 0x20; // space\n }\n off = 8;\n\n // Write version (uint32 LE)\n view.setUint32(off, version, true);\n off += 4;\n\n // Write length-prefixed chunks\n for (const chunk of chunks) {\n view.setUint32(off, chunk.byteLength, true);\n off += 4;\n buf.set(chunk, off);\n off += chunk.byteLength;\n }\n\n return buf;\n}\n\n/**\n * Create a .fig/.deck ZIP archive from canvas.fig + optional metadata.\n * Uses store mode (no compression) via fflate.\n */\nexport function createFigZip(input: CreateFigZipInput): Uint8Array {\n const opts: Record<string, [Uint8Array, { level: 0 }]> = {};\n\n opts[\"canvas.fig\"] = [input.canvasFig, { level: 0 }];\n\n if (input.meta) {\n opts[\"meta.json\"] = [new TextEncoder().encode(JSON.stringify(input.meta)), { level: 0 }];\n }\n\n if (input.thumbnail) {\n opts[\"thumbnail.png\"] = [input.thumbnail, { level: 0 }];\n }\n\n if (input.images) {\n for (const [name, data] of input.images) {\n opts[`images/${name}`] = [data, { level: 0 }];\n }\n }\n\n return zipSync(opts);\n}\n","/** Pre-built empty .fig template — generated by src/utilities/generateTemplate.ts */\n/** @deprecated-backup Figma-derived blob (kept for rollback only):\n * UEsDBBQAAAAAALu8cFyLpHS2wWcAAMFnAAAKAAAAY2FudmFzLmZpZ2ZpZy1raXdpZQAAAJJlAAC0fQuY...\n */\nexport const emptyFigTemplate = \"UEsDBBQAAAAAAPkLcVyE27ZZxmcAAMZnAAAKAAAAY2FudmFzLmZpZ2ZpZy1raXdpZQAAAJJlAAC0fQuYZFdV7j6nqrq6p+eVyTskIbzfGMLb17Wqu7q7Zrq7iqrqnkyu17a6q2a6mO6upqp6MpPr1RARMQSEABEBY4wYQoyIiIgYERERERERERURIyIiIiIiIuL9/7X23mefqprI993vzvdN136dtd9rr7X2Wmvfk11q9/vNU+3Gud22MZcfrZSX1+qNQq1h8G+5Mltam1koLM+X6ohGK/VSLYjHUrq0PItwpl6eXy4sIpStN04slhDISWCtXiKsiQTyWv1YubpWKy1WCvwyv1xplOdOrNUXKiuLs2sr1flaYZbfT9rg2mxlmfEpF6+V5mql+gKS9tVnSsulNSRXF9aet1KqnUDidJhYK1UXmbh/tjw3h98DM4vl0nJjrVhD7TOFOtt2MGjb0cpKDf0osWWH6o1aqbDkx+OwjWuPLygvN0q1wkyjvIpOLpb9UCHvSK00U1leLs2gs2NaeOH4bNfWi9y4rpWXZ2qlJbS3sIhc+w1KXCwzg3Y1VupJrZfYvtXwaakmXbi0uHLDDWuFarVWWQUMX/SywtlOHzN4PaeZdUaFjQ2sBCShi7NrlWVpiZHI8Vq5wY+i5W6rXd1s9rFSYjSs0JA6UGipsirB6Hhnp9XZOVXb22KZ5cryDaVahWUqs5JPCLrUvguZBGpmKzMr7CKzZwrLqwVZWvO1ykqV62quVlhiuWyxUlksFZbXKlWMeqNcWeYSW8V4VGpcX5wkrqbFsoCdLC0ulqt1WTcYuQb6LYtyX600v7JYqK1VK4sn5gXINKrCgM1yhH25/Y3S9WzSAczsDBMO1k8sFStc4IfKy6hsWVKxJMozxzhUF9QXCtXS2vFyY2HNfnvETpg08MIZTllxsTJzjFN8vDw7LxvjYsBaYk8vWSrNlgucs4Xy/MIi/jP7sjoAaGcvt8E1DHZtscBKrzheqC+U1xqoGbGHrRZq5UJR2n9lwwauksDaDMYDsatdEbstHy4LF4FrCvV6uY4JXQPkygrzHjG6wEuLshqR+UgPiK2pKZBHLVVmV6TWR2v5eWQg9hiN1SrHEXks9m61slwXqNKIx8nQzFSWkKzQH88RXKsWGtzkT5DsYNCfKAmL5WKtINvpSRKfK0vNT9bMwokSR/0pxdqKYIqnLhWWC/PoHvZweXkeKd/WqBWW63OV2hIi184s1ddq5Rk/d0/DZuQCJ5Drjta5T55eWiqWZrlQsJsalcYJGfRnYB9gH8+Vi1L2mUHvdJNKF591vFSson4En32sdMIt6ue48BoaIwvjuYXl8pIsb9RSwsdhx79d+ibNQOw7iuVlDIDr+HfWN5u77eOdwWajfXagm+zq+vNWCjXZZsl+iLDMliqCw2IMhqx4oF1uNh+drRznksuO2xq5aqFWWFwE/gbaWsKo6UqdSCcvluaYmi8tz6/NFrAIC1L5JOPAgyuyMxmxzd8n4coiMBf3JMajWrqhIstnP0ZitjSHjS1DP1OqE0UcwMovLTL/oEMha3VMrUA75JOWVhYb5aokHsYaWAEWLC9XZYFfsFC6vqA44MjMQmm1JsELq8S3mnxRBd3WIPcpW3ZJdXGF1V9aqGE9u25epjE3FpfXV5aW0Ja1oyvLbvteIWjgYfVqqYRlVlwp2o0quwxHDlZmpaZL5KriVnuntQRcyeZgZ641FjAT81zIOJRrS3LQRrOF2rESQce2k9wMGSJA4LcizjHO4ExlseJjOUEr8s1EHRhcQoIy8cVsBSiJU6SfuOhUgm721StzDWw87eT0QqEGdGFjcsDi1NGVeqB0/QzGSXt+cEFm+1Adx5VH3YelFs7C4gqGqlIvN1jFkWqzs2NXL6oD3mCfee7L0aZNZed9En9lPHBm2CSsVOJ4joZPSxZ9FhtMepbDuXW0zLFYBXriMZUHyuFscBSWK2U9PsrboI/qG82tts4ICJxaqTEjkzFXlnMLa1ha0NC1nCmdPNnesL2YKuMQqIG8KWBT8ZvZWqWaRCNgoBJPOxz3xcUVNjouAhekkzKKjoS8OrG0VGoI4suhd2WZTNfY/PwilgubTyQwI0f1RAXLEqiCLTQrVRyfrHaxclwCaHNDG13HsgKJUKjy+2wSw66szQjGyRHobHuj22sOOt0dfOMOcWKJmj16I6LYY6Vkycbpz+qDc6QOMn52ZysYdCUfCqvsV7zYbpKMaPQ620pGSCVozNpCya63aHlve73dW9npDEC1ZGoFGdtq+frSotCq6CZIK5aMZ7o7/UEvWVd5rDeBh3wdjKUCEXycTGymPgMikOMwB4iza/pFzkak9ER90Ouebhe2Oqc4Eh6YAcLW4zDCOWqDsRaeae5iR7v+yAzLgDksHVukgoFkJzIaLT1vpbzIs0jpa7uSiTiVTs15tO2TJkIaIp9QCWtP49oI4tdxhQfxp3ObB/FncKMH8WdyqwfxZwlNXa7NhLUfLAExkPJbAx7Rzh5iEtDtTGPxhE06HJZawi4gMmAasoOkIzp0R7sdDvMSSFEZ5WJptSRY0I1iXOx2t9rNncpu2y3P7MqyIhvMCT4j/STDvVLkcStr43rBQRmuUJnJhW6vc1N3Z9DcwucWuQcLxSH4+OgKKL+5snQ3+Xq13Rt0gCmYVuGJGnxaxCqvkNaIl7p7/fbMXq/f7WFwcbIVgL6lcK1SB2IoS/nSiRIxhW7XGIS7VFXFhgf3sjKDDcbFgMNKjmTg3TKHY2KJh4JQwlgv4Nc4334xSHSKKILYbt8qkFS3t9Tp9dgSv5ndQR/pokLNOOaW54UYi2eb/U3FgzHYDeljsm0iwZW6y3JVIbPM0WqJv1F9lT9xdZZsWGapypWVLZ3d7fYGwxs0A8IZpxS5I92FxiWAbJZmRC7B44N4sXmuuzeY73VaCiQ7ssuTdsa6hTPJN9XmYNDuYc0QCZSrsv1w7AiCimR+9wbdWrvfuYntcyMlzZEBSvBS0iKhw3p7Oxt2Ocaz5TpJZkF64NGUDo0EH9bbtu+Yylq9YrF1A+ym9BarTdcOOF9QT8szctQ3SiCZLRGcdWAwmIO2H8mRI1RmyR6AwErNjdP2VHN9WsBxcQNGV2kMnP3gcNz5KqAy8pXFe6OjbHEp6T17IOgHM909NKxnv5v4FnBwYaXBZZoNQOUE1NG9/qBz8hyi54VSLcyAUl4tKR+b0Xix1DiuNE+Wcz6z2dlquX7YyoxCjDxEt1T4AddAo4cGkE9OsPhxOXCkZXVdH3JOKGtcL98A6r4C5ChDn0pQbrG8VAWPiRhz/KxUu/0Olw2OQZ4LtnWFIiZ0RblxKXa8xyMFjQGXXpDdaH81Oxx0uzACaMOjEqHIDnACqtXlM+066YlU8jQiCqrJkiClwtGZWawI/ZElxxKwobmVKoj/0prwtmu1leVGWRifCezf2TJJQVla+fAzIH6V/1SKRyki8RyRyoAEXsIlESAXh0hDhJEos8fNoBeHUQy4SlpqCnPoiXylXG60VIFYCzyBzLWENSODrxZI+7JbmmG5opzGhGWasIwalwAkWSp7mAUdL5Tz8hoYPPfZPkRXKypNmEZYx2RB1sV+H1fh0gGtwi3CgxqF/GNVDlMswh1dHtrDK5RJbJCNBPVhB8sA32C5yCfRnArVYmXF52oVz6JlgiR3vmWDND3JckGKP8omquCuU8DySYqDNZkkKaipJMFD2kcRUgrSdJLiIO1PkhQShskleEgHtaGYRO4yC+xQKtHBO5xKVZAXpNI81CNSUxrohWGag3lRmKggLw6TPMRLgITLM1jsMj+Xgt6G+FHXtUjowJ9VQIEnKZeXmn0SxTLjByEhnFkplmc4zwTtIhF4qSAae44pgy+4XX1WluVSKTn9NpU2oWePj+frVStAmZzH8qQkySVM2aI+YZ+GnCRDd8d0OrFxnKho/1DiAnhT4fE3et2trdlOT7HSt3RMYYSVhJdvifWIDdotIMQByZbS9VWc2IqfSUaQFFT2Y34FB1wU9yEIRWUI50201QU9J0HwEVugk6Jsz0yZ6BT+xOv4k2niT1ZJKXx8lpnnmFlDEkonCTey9CZLC6T6oLuLDzYE6kkT7VqMz6K+wGqzZ+KMLyMBpn12wsTBB5ml5qDXOWuiie1rr2WF29c+jXC2r72OudtPY2J2+2lMzG0/jYkT1WYPx0F5p9XGd/GpvU7LtIJWTONUERYLmWeaW3ttgt0Tdutq0CEY1uXmdttEmZPN7c7WOZSP+sLZ4UMAGfQ3ep3dAWIZlkWbO018srfd7nU25jqn9npKSFlhhsE6tfQQZEDuCkGqSX9a321uyJkYfAuhEOggf5pEkDZZ/n8MgDl7NqQgAPNCzKNfA5OCuhaWIvgarBtOfaB494kwyEIlY5e6SFwtgZ8WoofJPkZOBLcNciSS4dauTgTw3XmfahY4FWVYLBfA8pZ9xpHvSpWxCXTv19vbANXZON7unNrkSZ8UguxaeU1bpAwWp7NxHjgzIAnrO+jxZhf1ybYBbsC5Ypu1DLHAAhCZmzGerLFLXYM8WLmqxcUlHKyU2c3bIxIrv9WurD/fS0eyEIx6aa1hxEud5QyLlnHMA3u6IvGwfFTq6ToqNuFhdG4CSYq90ojBH8qpOdduDmQR/m1UhWRBsMF1Ve2+zlQ8U62rWBQz5iaRM2gvNSYgbiQzk6/UZkVkVJirMX9qdlnPtOWVJRFmgveiYH8/iBCO14FZ/T1IpoyHEyQn/D1cKAgfeAEQmdwfgKuWc6au8YtqqyKaupjYjidI/bjIti+dqR/n72VYwCJ9nJmRG4Ur6kpIP2wBkn38XmkJzKsqtWW272pOOH4fDqKBa+Oa2YbITh4xt1hgPx65NF/jzD6qjv2I30eDsWT9j5kD34Pfxy7o7+MWtN7HNzT+hOfp7xOr+vskMsv4ffLiXJHxp1Sq8vvUWkN+v62q319bPbbMcXraInAyfq/DL9v59FpjkfFn4JfxZxaKtVX8PqtQXGX82fhlu5+DKy7Cee4qGoTfby8uHuf8fAd+We478cty31U4tsB+fPfMUREC/I+ZOUEW3zNTlXhhZqXGckXQT4zP4MTg7+ycwqcomu2Zwy/lJ/P4pdxkAdWyvjJ+Cf/ogvYHtc2zPYsLlaNcN2AxhOhbLoM6w2/laPXZzyEaO1p9DuE872j1udfit3a0ei255Pri0SV+18DlEcuvkMfH7yopRu4a/LId1y8dW2L6ieVFoXVvWF45xnr+J3YK2/W93DH4/V+rGHD8fl+13mD6Gn6Z/v21YzXGm7XqAn/XaytFzvtGHRwKflsNbUe7sSxs6UlME+fv1CoEu/jdXNX8zqr2+/mrx2S9nF6tNTi+W/hlO7frdZxOxuzgl/EuftnvXfyyvy/AL+VMPfxSvtTH77PxO8Avx2kPv8/F75l6HeeaMTfil/DO4pfwzuGX8G7CL+H9b/wS3g/gl/D+D34J7wfxS3g/hF/Cuzmq168jwBdGM6vSwlsYIMgfZoAwX8QAgf4IA4T6YgYI9kcZINyXMEDAP8YAId+KgDT1pQwQ8m0MEPLLGCDklzNAyD/OACG/ggFCfiUDhHw7A4T8KgYI+dUISJtfwwAh38EAIf8EA4T8WgYI+ScZIOTXMUDIr2eAkN/AACH/FAOEfCcCTyfkn2aAkO9igJB/hgFCvpsBQv5ZBgj5jQwQ8s8xQMj3MEDIb2KAkO9F4BmE/GYGCPk+Bgj55xkg5PsZIORfYICQ38IAIf8iA4T8VgYI+ZcYIOS3IfBMQv5lBgj57QwQ8q8wQMjvYICQf5UBQn4nA4T8awwQ8rsYIORfZ4CQH0DgWYT8GwwQ8rsZIOTfZICQ38MAIf8WA4T8XgYI+bcZIOT3MUDIv8MAIb8fgWcT8u8yQMgfYICQf48BQv4gA4T8+wwQ8ocYIOQ/YICQP8wAIf8hA4T8EQSeQ8h/xAAhf5QBQv5jBgj5YwwQ8p8wQMgfZ4CQ/5QBQv4EA4T8ZwwQ8p8jICjqLxgg5E8yQMh/yQAhf4oBQv4rBgj50wwQ8l8zQMgPMkDIf8MAIX8mGhYJgvwckFR4lokcGRqTUF9q7u6SEIzik73uNknXQRd/4+JWd91E0fq5QbtvMpGKJEFDQ29hk/EdUq2gUVvNQVPK5k1mtdNqd00cuzL9p6/0tlio2uwP2vXuXm8DIOJ+D5SrULgRgtRlYIVIgsBBKPZC6/kQTZlocsCGg17ubzZb3Rv7bPMmSDKIYTZBP4Mib7UHzc4WifI2+tsnIQLK/AzENG0IIkmeD9rbIsnWrPyZzjqYfjRjCgw1x0Wrteo7Jt73/7fKDWGj0LcpM7XeI8wdqotMmX3SGBM/VibpsGVRwKvEXVLqA3I+mTOdfmcdAxeZLH7s1eZBk+uDw+mbrWgCsHf6J7u9bbNr8h2ZsTsiMymhxibYkB02HUlTzR0kgpvTaUXKYU0B6QzKHlObNxfIZ8mN3RGzT1M2u3tbLZmopeYOP4/MJb0u6Ftloqb7/ASB/SdHpvQNkTmwmww7sKM52N7uPr9DgraKuwmMcT46dEYW0msjcwT3CKc6O2AdWfPxTmuwiZZdmEpdUCo9by6yQ2UZu8eGXN7F0nQbebgMGCM70aUDjssCVmwR13zAO9PmMp+ERXx5X5YtV2mZnN0Vfcs5TZmH7aq02/FSm+YxNqWB5S2E+Rsjc+UZe5sh0sNtig7vicxVm/6GJJV+tbCP1zS3BhR7ozGP2Ol2+grs7sg8stWmxIqr4VGSIZLSTfPoZV8KTCyvsRuWgscdF7Qs9EZxdsUFsSPTDeXVqOgmWI4vEAxAKC/3+2kRQSrVgUu6ArmBU39LpMoqlBP2awm7aBaow8S50+1z5oyJTiJ1sbPjphP7jimznVNtrJsM+GPPtN2C9c+YZc9yuFB0DKAswTjThFpWo3mKggcGhcMGGnKIT26atPYLNzabItfo9YmPfExqKs9yNcbCj1cwjZBdtxtN7sB70aAtNLZv7s5F+7fk/gO3VpR3oNLJk82trXXIjdmuvjkT7dvuOLmx794F+pWdwOw6Vp9CfHsU5U5tndvd7OOQjSZa/sa3jyM2yq9DlHL6BXtd4uV3RdFhjoQfzXujaGoT89kDqNPF7lmUeWsUTQ/89QnY0J4VVuTMAZvebvlWHdzqnuJilSKN7owbj8rJk/32AIeFmYoOcYYBS+G/LYqOtCARONNucfr65o256MJZTUjG2Y6R7W2U6m2c9BbYNdVb4LlUb3PDvZ0Y7W3+PL2dHO3t1LfQ233DvZ0e7u3+haANJp5Yx21Bq2+eDzmPHn9WKJTZ2Maq7J1qD8z7sWi74KDLO8vtG7GkgEKTnoDby0FW7qvFHklA9pMuQZaGQ8CFMx1gtC1UhN1hm3wMOytvckRsHGwTT3qxFObgRsGm2GfMO8FtwYAfmyxjhf4GdzNOMWzsbq8dahTgODvZ6fUHftRYFxoUxifmObUmntrobkNg0upbUiGRjyFT9pfIBnWTc42g/lHgzdYZe5BOjB4aeUlSLROM8AewDYNDaSrQt4hjykExmqBQfNUkeOxKAwJxOLuIMwKDLslLzR4m2M5D2GgVWuo6x5eMLLcHN3ZR3PYWQ7eNubkJ0lPdAOfDKdwwwKWbsnDRUGA1KzLEqX5js8fZFbKNhUwccWX1TSuK6ue217tbtg19iaBxKK5hV1OftcQQP5JIkKN9DqMLQgOz78A6ijCOrSiTVb0H9dpNXey1m6d3OexaXdQNgYtu6nx7x2oP2Bali+Defg6La56EKYbk3I4cn6ih1Tl5srKzda6GuQSyltIZW215e3tvwIES+kThxmm4iFgMHB/tnx3bOgvsfNmFPvZ9ucWdH0dY+b0OMj4a+YwSks6h3iaj3F44MyQM2uDj6IAUq7VBtsU81pDr2gQ0YGGYOO+kxPIpi38M32JnDzAm3b1dlPlEZDK6xFpgE0zWTmkLHAKITR51GAlEPwXE4aJY9kh5MMLlQggq9kLpVHV6wp0/21V4nnw5btmG2f+uhFt7/z0sduC84ECDQh36/ECgVbCLUwOzq+NwnmLH2+u7QBHnL9DYbG8/RK+IcxZJ0ffOnR8GC5HFeegSM91ttJiXB+cv1tw50+xb4jPOuDLhahhdN3Ii1Jo7pMyZm5wXWNJ6XpTObmztcazshcxWc12w45k2MVBld/QCZ0OvwP0VzvAXSkXGuEFVqaqZhZaz3rCPlIYqUmd3t92q7Nb2dqhqS0IrVoSPPnw1MhGO6sX2zikh9+NdvWIBpvsqSIRem9RDqwIVJZvEi6D/pgbItnGMCnP1NYKX0fkKRk9CytIU22VeeZMr2qm1uXHJ2uDWSAi3Ijnh8k5xD0qJPX6atQ3RkUZCbsywoHocu5g1dirVD2XH0ZiMb0z2v21MzjYG6GRidBzywy2aTLWougV8K2xFnN3sgAfqnavs9mX88f3XgeXSqRyzb6ChNpVjunPKkrF2GICeQTKjtn6jW8CA77TMN8fOR3vLXj3GuR1l+KOTnfZWi9ML6gSZQbMzGxioQWEw10NlpGcGAOHIa/Qzl+x1nWxgMnv/A+QKWlsZRZ6arIOoncS/Ihm5/OEpDEYw4xIDxgPJWZ9Mlr7n+DvkeNSLW7/mKSiNbAaZE1Ymkp/bwhHq9JBw+8zt4NTNoUEwU6qqgmuMi6L5ZWsKkKG9wEpR1T9Ax4FhByKq9sjax5MDRtwQ8FgZxvkxx8ji9D6OjAj0oCivWj59DyzJOZ2GttCInX6x2wMpe74Cuf7eOi8f10HGs3KLkib6G4g1E2Yn3+nb477dwoRtz0K7C6pAWHxJL9Ln6W0x6JUwz52q0kl05/PYKxLW3r8kxnEEOpCkAvEeWtLGRqIsaQoihrY9hwOqJ7anrvDwuDol3gxImz7kh2AtrGgrt6XonPRPo1u3vUYxuce+HTwGiFdF1FpTfm/n5BYZXmoVhSAnO/0VlyVjOKXN9oh+iXIwRykOQY1299a3Ov1NWzGb2+g22s1te9pIa1BJPFwJ8D2QPIbDHbQ4/dHthOgiqMrJ+o1oKbGJFiZFB6SeakKanBoPd/W6bwmy3PdbGkJmZAg06u1hwbiD0q4ANMgfnF8ElOFi2Al+Fd2BVVTc2uv5oyd1kS03pbjxFGWx9i4uKW0pr8hhvMZ7RO1nm+01n6FzBmXhFIQKtwvlF5XacejsayHIQ9QcRJXV1SAskxiEXS96jXJlqiVM/ETB/BeZqCtsJtgBHAGtzh7lgNlExpcLZXwT/V2Q3S1yYrhNvhHrCtLJYhurpSUCVGw3hWFFXGC4EuHXPv3YxqbP2sB+Jyk7IIc79vLBXjJUb4jNIQpPzN2xOUyFBUm9MzYXCNowd8XmyHoy/q+LzYVCayjvjE5dhNb7yJWSV3PdvNiLN/vgy3ZaWN+qFnLSXBbKtS7pt7HG8+aqja3OLjYnbXPQ10sTMdjlKfnYFYm09GG99kmro+Crvbq/297Y22r2CjunRET5cJdAbTcH8pp1nLdblg19xMYmkBoOso0ClDgsBzllHgno9kibxfFo2dJHJXWGAB893BQ77o9JNceJLUeaZDMeN6YlNuvx/V3IV2zkCWMaYbOeKBpv5P2wrDo4HHte+GftIkxgFxHVj5VoDhCPfEU5OT+8Jw4WcZwsXeA2XVCgkcIFlXMLaiJcUHm/oCb7p9s3Xk92nQHKJPYlOnrlnZO8XJCKv9dErT0/GTHOiUGXGbPtM50NK9H0Ok5ewyFQAJY0SDetfgSYTH5YcwKDwFpi5via3NFEQ5WAiJKm3I8xEH1mjAC2mbB4FL/IOOHs8UKIt8TQFQMWxEw5LRVt6GRi9ABNN6cWFzGc6M8y5pTjMqr95krCplOivnDOJnibMrXYQihvG1CEcPIUWAayA17NM+w1FVGh66EKn1S688YYwwA89tUvRVMaVohqlTRanFQiaCc5vWPKSAMo78BQJkkOIcTLTdyuyBhammq5sApVEGEuTGJWFdWPi/5JzF+vxwoTFFEAVB1odysGyJhOEg+0BElMZ029Ni+6QtBZqALsWvXpa6u8fYtnlk6Iiq5CANmFiyKc+vH+PihhqIzhANdrFjbxGQb6aP7m7RXk5c+c4rGvul5g58+cwtUbEfd7sCsQq+wNKG8T6hxEliXz+xSGIJ5HibkuriHUiANkBHSngfIhSCms97tbe4O2lUyB5hDU6nr3QGz2vQCknSKiaXxQ7GzsrUMBrLm9u0WtNLPfdml13jYJXNzc2nIJxoJyxhUWjxdOiG52oudv4gOy+J+jAnYDCi3Y/Tt723XFjX1KMi2GwC0ZkL2IZRW1TpzaE/JaY3l3JEzaSxTz7WYqgOTOMoXmzrIAojvVEqjueJsH+Uepnm2qQ1lAHE4yq+K0zI2B3fWkkEeh0DKU+Qmlbe2g3NK35ms0kKgcE/reWsFmSrDpE52YLHRgoGKnRmei1TNR7O31NysgaXAXZHfheAJDCtrdFtjOwbiDxnayaM+BA8HUyiJJlmjmZK/9gj0QzFwCEPue0rMv7m93uyCzRfERskAZtaFPc6coAw8/Ao/Gw+loh8X5ZSBkzRIP+hwYGYCL24AsMw0zws2X7+wHMR1O/CNcm8hzgVsDrUyIRKwUOgb9aIOZfvsUxdygFLHELHvASQm4A50wS16nWQLHULBAiioPP4FlUaJQiG8SZsNqxYIAA24Sqx9FM0I5qnnb8YUS0OdCGc4YKnMwwWE2dXOd0TKWCW3ebY5Y6xd6G74VoJYwXI5OoeAmiMYdGBj0PFmTUUIbTOxpfLvX67DxrY4QBe7uy0btrWKmurWHG1Rb265EsByFsaTAGR+o/NIWrLW3mrg82dQPsuEH2/bqHJ/Y/cLPOv1ZsJKW1Vza2xp0WHu7N0eG3DGPMb4QqRIFTKG0ibaGtKAgY8p7dSoBOo1ENbrg6Sh62Vb53uuDZ92hl/PH4QS/gRFCoOmcL1kj3cASZMpXWtppiXwbPcW4S1BEcCJQD28ugPDZus/G2AYYIRGyJNkQg1iAoj3d3bJrO9E4xi2M4CSA8mVVXOIO5KXy7CyUw9F+f5+aJOl9qjM36fLaivyHJboDLc6iasdHRZiVC0WXqm2p47qLTaUVfyGFJREK4H4RvfXfU3DiLFFLi0VYwwraAn4qOEsuqAGqW4ugVsViniwRxWHsC9ED3tmxGIXcP+5hzmnpR1j0StiKXiNnxhZ7YzEYNi576zYaVSUWZTlYIPksUETXJ1l5BelzYbpdo7ExOUSxUp/yCHyfuFRwitXTEhMpTnp97Z9DaG2usFQWbdkDErV6owclctxVfkjMbnxbDkNqStMaGhWpXvAFokkdJBzRhGph1tq+XagJ1uDnIo2FsqWLK/xYtE8vCR1EXKrtsr25jEcS3UuszQshdbnEQcqtLC3bpCt8kRloAxPEw8JCLvFKXwwuFzAw0EaeLZEnviosPZR3tf8IXSVR/vCwsE27ZnR54EQRWuSrWLNJ7gzkUacgtawKSS623XYzzNDzQblYXtQBwaZYAD0p5Gps7SGFI6BlbKVqRzCb1qfOjVak5KqZPAEXEWqhDptCdRMDczVZ/9XystCQqA2zLJT7otj052ChKGanEFuoM4Ex8KE/AwUtZ8XwDfR2Q5I8nQyRa5v3zZnRj/GZvczT4fg6CDb92nwT23nkAwpYYidFI3buQKmpb27G5WFSFujRVQm4Mhn87mtxpE2BqAiN4Y07myDaM9nk66V2k8pTPMOJXOsk0UzW2vt6dB5ZBB973mcsBEgCtX9UYnMaZYOuDYEA0lSp5MUZCJS7oH81CkGLnKaK3XjQEY2TPAWt65LnOmdxlIFIVZiQhIkMWC9GJ0FfKeU+DatgldYtQd5lGdbuVstJ+EhoUI5lxW1B2QWVsUPmjymOh3SOQIgw7sWI9nPwoe0tDrs0WhQScP5nKV/HZ6gvoVd4x3/akgK85j+tinlZkFxQR5BziVw9LqpdlaVWB9dG7EB20MEZPwC/UO53n/MsaPQCNBiJnlSCqe4PWLjdKpDjz2xA1OQiWWY4dD85C6PNebGoOw5zvVKxojRuJKZiQgBhz63RRLsiTqbgDKsh6fC+QXdFYlq1CH8YOFzsPpyYK88vFeQ0yJMrsuKMwmJ1garTNOly7hTEP4b1AGMvE21pz7qK2xNvmylqVC4W2yOZN6uguZKPinAqoKcw8CpvvGSnp0rrMEJLTz59XQbSUYzZyi5UJ9sQPZ5tuPEl5UMKlxY/SnJm/DhnsXPP2NoBIlfcu+km8NI93pPXSN7j6kzqwSWQxmQJ2Ag8PPgJc0l2vgC2077RFYAWVIQJH4h6Jq5qoA2Bqya5k0Q/bEVQOMiPqZ+0vQXeN3fiNj0sY7eNDJ6XzOB8BoNTFilTpO61LKWg3tGQCzNt+lMSGm8sOO11ZmOvx8s1W8XdGOQbm30gf5Dne/2tc/qdkKMxpNW22WfAmGAY7OaDEgkIm1a7BHMtyEVk0lSDh3qqVpXVjU1GlASpT6lKiMpW4FalqmJ8qnpg8IBd2FSosfBuK74/665w+asqas/cFV9gtERjQBOfZe8K5eIW92xBVAs8W868fUBl+NWk59j7pxx/Nem5vj2iYhJB/Tu9wN4NzJBGWLdmzM1hohuc2zLRT1qm4DeFE7LqDH0oSJv/Cnjjp9mgtqDd6QPjbSmNGEEvvtO3DKFN+RmkuBsG/vobPeR9TcHKPv1ADPV4ieKGKejBbwYqFj8veAkqLeCVksuyH88MMXLvibvPh1SxvgfciZ0KLpVzJKyJ+URs/gxC6TNL3e4OpCaLsMkTpgfpn8TVS717Ej5YhLNxjXwrOrDc3dH9bIf5l6g/PIa/BJT7w6yEWf14DB39zs4m9FOoHKsDJhzHnS45GDfJuNtl+CGT5De5ZCvX8Rn3+gy5iEgy3uwyKNpJku8b0x5IobQZyP81qz7VQiKLUFHlQ3YhME0Lupw/CHLksETah4M0ezuC1D8MUkXYhLSPBLJCUZXuw44i+q3xLUykjWjle2XFORUJzM1fU4fORh0NKWpWcr8D7JqLvujmaOi+8eWxuQnQJDW9r/53+EF4J/gDYUayJn9Qk8fdDL4ihuazXmamV/orYDc6/uLxjVQP28BhMj77M+5u0ardf9wSFJb+UBLhpRlbSOb+T4fvBj+BYZy5Dj39Mwes7fn4acyQqmQPkSjfSKBwpGfbJ/vmk9noVkoKkmSMb998PBu9VO/oNbGOW5C+eUMu+hurziZj897IvCCJKobhrFGnK1CBwxXj/4FypihP6OWM+hwp7XC6eAjc6u4wIasPril/PN1goDir0Iwr9Wx0GwT8uJAu9NrFvXUL6Jf8zaZeu94eR1/zSmXuxvTVcfR1wfiOZOy6iHZh132wSJIOAq3fircTCuW1GRDpWHZbXcqG/xCyFQadH4rI/FOoNnmxCyvkMg4OVVTg2SGSs0uGkrTgUZ/qNBqmzKXDaVr0GFUNht38PNFcMyZZP2j4HO/Z58nmESOJWniF6eJy6xLzSBfWrFVGA0XOy8yj0ila7Higxzowj09imv29HCGhhc+YJ7iwZv0vAccVdH9knugimvd9dpl5nea3RObvREfdmTZD+tXdWeRVBbgSiuJ/KJWL6To7gCg+LHGzqL3bIrhI5FmEfmBThqVeGJbS85jjFRa5JSwCREbrCCT/cJhcB9mJXXtDu9dF1ovCrLRB+VmY5Y1munVxE2z1xnzqLpF+ABZ8Yb9p8P2DMOYL0vxRfHME4z4cpoGSzQAmb1LU45YPokSidXyleS/si3aAa05VIZHEgAqkyPyRS17EACH+x7HTwhcdZA7SPdnt5llV286ZvwIhfD4tor55URz9jJOGJVT3p3ldPUTYvyFj/kaUb0hA6w1Johzz+xFzcBDDSBzExFDubZlBl3J16nA1rCF1HxaM0R/ACEszoA+byvlw5NXEzfvQCYhfRdXbfDBnPpasRr17uS+KXiRNK3ZanaTan5C0wKXSd5vX0mZrodmCabC9gnpjPKJP/aOZvmrtWMLX0rwvCeySJmxQt8y3U6VasGReQ5r8HYzITdNtkXlbJrmyn7RBLfadof7DlI9o5nfZK9dp/mrS/witn/b7iGZ+TwuNdd6ppqIDQVQLFLbBPqKlh/mrSbPuagO3M1hYqO3eDHPLfXtbh+JHUgn63ZyAIOa+I2N+IyBcKr6nF44k6qfzwGShZP+iMK5FFnCtCLLKGr9MwSApiGuRZU1Sn0yPNFcFUS3wPE2hH71HQynCRTSz5uNypAzMP+M6wvuOeyytp1xMP6iDG9hKiLLHJlHNv0E/SEo8LkzQMv+zLeQf7Cni6Ek2rDlrozfC1w0laUFcw25tzbe7223qEr0/jp4eJmiZU1pzWOoZ6SQtt5k+V0heJs1/fSadWz/d2S1jP0bABYIIcKxyh7atwHxgfmroi8ZmZ+O0WP4NzE8PQxO24gpzV8YvYad2Ad2pOPpdcOwboGmAHhrd3cX2SRwtqTXzSjDhSYEal8VQiduTEsXuAELAMVBeNVxmHKBXJ4WSnA7JCqqCKnXymuEyDTgYTBe5Q8SH4FWItbzJqiCOn4hwEwYRVYFaMdAfQhHzhrx5EwUjI1fft8TQOcXYo9sLQtkh7adtmnbCJ99lk9lzn/gzNlG66lPvtqlYj+C+sFu57+9JqvI78U2pqnzyvUFVPvHNYVU+9T6bqpyTJuOUCcfq5+PEcjCw7r3GXDkuXVdzFTSwxbizhtpKGtHM50s8IfpOh3EtsiVJ1WaLpzCKbIdxLUIye8g53YI5K4nOzdxRc07imjsHsYFEE2IxqeCPNMsRhknGRzVD9XursL9WEDp+VeinastAKICEAvriV1W4JgmTpX4KWvto0mc1K2y4Zs2Zv7NZdG9nPwXPSO9Dn7PwtFkyhUj9+1SqLgIkfz4AI/ChY3sSg/MFWzxwUFczL6O+/sZpq/B9g/UqZH5ck8VLXcP8tsZsm5OZe18M1WfB2dghv4PLybMu8v7UFyk3dqvmTyFuppIlhD3U72Y7US80nEAlRXdkToEvqdES+t6s+WWJAefubYO8QMLbXfa86An8SpCvKe9wBQq4PQbybplfDcr4xHe6YugNSZRfCwrZpHeFddupvT9r/tw3MEn7Cy3KnrglpItu0XwyyUoWnsv8S8kM3BMum5/PCngo+3VvTLjH+yHng2MfnBpgHYpdtcv6RCwIW2bTXxe/lKhN1cbEpstn3JZkJOIKd8C9LEpACZF5XwyvE0maEBffC/8TSdJsog73+ggXI87F2ffB5jopJbdhPZjIiPoCGv0rYHhTzgqvhxlmkkT/hNNw8eDbanXf3hrDOlMuDQIPgTfAz0PQRki1Qe2iPQ+EJZeIlhx2/40wJ+jBuymlhP6DxEFdqRIZPnhPUIHaSdSxLwcFtWYnd5w0NdBs65u35KIHo654TNLCLvW+THqCyFfIZfi7c+bfI1V0EHbv03H0IRtPaUM8GEd/4UaMMi8a7n0uNl9O0qBOwJR/SVKSW/MvxzB4SH+tVNm/pr7XtK8maaFGQd98Po7+M8krtm8CsTBS4q9oyTLm1v9Lsfmv5GOZya/E5l+pwaZJjnPImddkm/72DTxSJvrneDu5hIOmfia6OZMUCS4Tb8mY38lA5jXkWn+/+WeK2nbbZJ686em/eSGxEF3WZg+ze3vWMuFjjAE/GMH05LzZrg+fic1HY95yDZkofiAyX4qeb60CPxSZf4AlcspS8MOR+QLVcgBUZVv/iOFstcVqdJFKUdSBuT1nfhjjZpPFvMG8Omd+Sa7c5DKifaNA+0gO+uvSccuGCRP/OsdeWuTc9zTI66FeB5cIsOA5R9rXvCgLvVO5M9LG5cwvuG/1wluwxofyWF/QuxmItSdrgwSuA81bjsSn8+YnofDG+z9aYDrHfi/PmlfGSbL1r5yHXEsT7WTATALaXc798m1Z8yqbP9OEfUgLiB0bGDmvyED4pTnlnd29gdeYenHO/JTNIEEI/SCM6Z02ZYHyMN0gt2bNz0L4pReVdeDy01bi+nMYPyIAjJFtBrQltZh8jiKfs+BoME4/JeYlOfNim1Y6Iyv2RbnoR22KkwXD8HpPaYBX5KIfCxvPZeufXnl5zrwygxWjNioYtr/PyOrAUeTOdHAzOCJjSdaDK5XzK5qDD3Tlw8I9Cx3YoLjQOZL8q5q81AYx3Jppb8E29q6seV3W40/gdDLnWDknO6Jqyib9CxTF0vmwW8IYdnCkqhALhb4SQ2ps7ZVeHJvbIV+UG7BWG2SPRY0YzM8q9w+5LM693rJY5E+bH6E0EvwP7D8EPlcxrsbUhBJ2PP8RW5kBUqTCN0ya/wzSaBl0a4w7eU2C5xReZSd35D+mGdaF4p2T5tfDhHqbEkqus2nzgUyrQ2HltnXISNn/P+B2miKXGhQdEf28jQZXQV+AYpx8pbIZan7KQHwkCz2nNEChxT6aNf+U/qTaBCvSMh/LApHitg1oYLbDzcoF+A0df8jiStBklYsPyKbuyJn/0IMPGRwUl/HanHlh3BQP2XKVB+coSUzp7GLC+ibkyKGRRC08Qw814gQoVCa+YDRVi5e2cWOJswk/NKxIYpq9pFIjVGXdn4RxLcKDWsitFGfymNFULX5CW+JVQ98dR09JJ2k5rIiU5/DvNE9Np2ixdZ1dXhn1ISWMvi2Ia4kNGEZwzfVPQ9bqRq8/kqiFgd8EdncO4xEZSuBcVAucWR92lf948+jhNC16PWSTLWxf8RHP4bvWPHkoSQt+v7Oc2CcBTfxuqoOWqaQiJvsY+8vSKVpssWn1Rz8Zw1OWOiKQ+AORuTaJauGWJvh2JuLBN4tAIvFC8G5ccWZ0WhJKNRi/G3mXAWTwvji61S9ru9ZeHkGknXI9+/1whKZCrbqoH+tausuW8/ZC90Rao/iM70M33Yolf9EWHPZHuw7PHOpcSdJUOPjL0ICB3o5Q+9jCbl9Ow+mIQvGn0Z/H8C4yco+UltfmcJW2kzZFeFcMB2Q8bIZtOt4WwyGZzXAqRYFm6O+6vPF2GG+PQY+MlAgsJ94Zw6mZuzMiomzB8Ri7T8K6h3ttDp29dxfRH1kLjjmpjE+mWF7PJP9lAoA344RwHgCfiqAGAGH8qVMYzPfm4JDsTBdMgZyo1U24t+Id499EbClpAK6kYhskCKgPyPrZwVb0D/aGkzpLffOpOPpHkZRTdi9L9s6c+SdMCBq6WcH9J40JMae0L/X2u5H5Eegp9AcJA/wSyKxxcCkNl8NtLe4lNpfaQNeS9I4J3K1iHWCe1etEQPO8Ju53cPZATuFuDKvNnTZOWQj14qY86ka59kJjaZH75848zHkoaK9ht5u78uYXJVYYwDZxHSIp+LXJm78NPly0inJvxRnhZH1QuBDvW5H5vDdElobCZuFt3l6ZSHNvW+6AeVjeDi7c51GKU4TRrriqeW0W1h6BXTAz++ZzE9E7w1Qcy7AW/jWfBATa3eK1lqznCSzpsClyLw7uYcL8uk9vYD3sWF2yTyWgN0A99c0XJ6K/pr0+ssX113Dbf0OoZgz+oHnWvCEL1WlRirO+4V6HaymoulgrmldnzMus6FlsH2jGgZX+bptWp2ngIfOgH7vEfqCPu5DoNzOtsfYQH47NezLwUTbG3uEjsfktQh9jtvDR2LzXfaWWGE462ze70ecy694640OxeR86AS6H91WQvtyZ1QZb5AYxH7w9yakZOr4QK+5/d7fJIPu9hw3x8vGRzNA3SH7RJBQ5cS0PTKbYtXQWR3rLEsgvhGlGV6+DPNNyS8YqTODy3sPpg7YzP5LleQRNb73a4nS9K2/+PsZkAKLDXUx+d9b8rk12hDWT35eFis52B4RRcGd2d978XlprBg37YIwtqRzK7Rnz++q62xks3Zs3fwIlOG58h4rVz8XH4w3i8ZreBSYHyv15YG+atyJVabRp8xdxq7uBe0leuwaw78ubvwTsUa1J0O+Z6EElSwtCLAtxCv0IHbbPSItliUuzH8ibfwS/lfIS/aIIGsguzbqFfnFk/g2IQUlvjKka2eu1uwzFq0A+pxyX8M7WsZ5DjnbeH5mvIOtkE9YUw85OWugAiE+VUibfcbAh35DU5BOvV/p7mW1aZlBJcx77XNI+jJXsPl9KPCn8K8AncMs7cxhfIsdbYeEZNCUh5TJg/dbt8do3D+axm50WK7gEsHpBdMRdRODr4Y4slkeSq4hCYNwcmwdQxVaXdGI37ZflCxCUZ4DQh6zHXxubPxYExGjKt8qXI/MxMj60Q5cuuo/Qxy8npvoVimis7pAuja+Oz0zIqX8LOppSuPna2AwqYP5wlizFEvgsTacA5a2Z6DZcX7skqJsnzmOmzYuzCTNs5QxgKgjhWGcwQ41cvSR/CQSXNhWxN2FsfXk/dZDtvUoySmfFRhBiskz0MvF2ydHkGRz4t4GZ/v0ypKptZs+Ft0iSb2Naj+lnHfobdoLzpcj8AiaBIsJUFpr6d3pupJypvwTkIN2PgL8XEySgm8notyWFn2Jhcgq07H2T5m8zzQ70MAeNTbGkf+ek+ZK2MoBgt3uqMnMfkFQqpYyFgx3t1Zw/jUazwZ6chDZChpwb5gB0lnDFf0LPqcV2GyhUsYBydUQCH9dmqN50yoXGn47PSdbsX2OR05uRrHTsuknzZ/JJ4Bv+VpypMp2cMNE/gjKXyq5sc1XhJWM+Jal2faHpkJKicz+KJSOO1nSZUASFqatAuMftw8sJXSxeafYeiHzwjSTI2qbdF+/RstsQCUubpkGswLPfOn2KQK00C8d46nkEY/fejPlZesoboh0+kjFvZHINJJ1X12DGxzPmQ7gSpZk5zvPgwHi9NT4HGbLtNUylr5/KgPRIf5LKfzBjfs7np3I+nTE/lW0KxmyL4wVV7BXVURVJ0BXda7DSWEQODEf5vTYj/o1me02chYT1MWhiBGnYkqUtkaOqpmgeSswbXT2oyEBL6i1Z83M21clKlMObNH+QWR+nkn0XEHE2zBnSnH5jxrwyu7m3ztXhyFdu089nMJE4zLC6QCWTQZWKvpAx7w9UnwnhgxPmo9xash5w1GLOzIcmzBcdwZKs1n8R2s6SBtMQgW13hWPyehufmTAvFXMD3p57fumA+XoGHIew6eoP7ysT5j9AyWB2drtkrizX9d5J8+84ESj9XhDmGkzppPlGRq9DpP23YtCzDljCuL8fUqnMcMWqdjxpvsntDf8TvCHO0hGFHJT/5cv7i4tD5mbfekvsHTAv9EkBz/zTMKFUUa5KOT84ian15byQFgdnFtdsLiNUR/x81rwZ0nh7laFCX4jZ8+bHsskVSeL27+V5cDk4VRbbp5ob54YuTe6S9yQ8vovzoiBL/DrRGUJ1efHeK2oQgeeHlHNPWPxwJdhYDvQWmMMqGPEtvb6HWUiILK0XWKu7HnXAhVLPnjJ6TgDPQ29DRA375m6gygSXW/6cgt1MW0P2EBJvMqljKcY1Q3Cu0nQsOFLVYmKm2z3dwZ0chSvqLOvIukQWcGqI9AA+Chinuh48akH7zel3sYbhPKBml5fBYu1snHMIIUvucNf5+c1hLex0b8TyAPejSRO6/WwMdh2C0zU2iasZnllQWLGGRz4hfdjuA4ytcyBJxRsUEqZ9QrrgfhyYVs/ZFT0QJKULH8QCOg1eHmIrLXrIJ6QLHu43z3gUeAHwCIUGLn4kHOvEQHwaJ6PdJ4k6rjqIgB+vs4mT4XdlTEav8yX6AA27tIbrU4VyNvVEqiy8ZUuqJzOkindmsMZlntTgY5JiCWipmSk7e9S8a5l94uCIa2o67EQaFh9246u16od51r6qM67WsCSeSlarXoINOoIHWs7/kKaWDjr4kE9nptiHZOAvdsYtQ0YiMT16U6dcHFZg0F28Az4gcdjqUptng9RcUlbFaY6jgCMxVzydkd/CkcqRPwn8AGxg1Qyn+t2NjnP5rUn7TnW7UCsquAUtBunT4jK4DlHZhig4n1XfovudsWQLysBNCn4g2sQSTyfzqharO0ksdltwfKdlD6WTtexh20q51L8gaKMkHIEySPEcRBx9ZTMjc6E60q21W3uQPy3JAYhkKPolqwhqFebiYI6C0cfcleasfal71jPCq+uefIpJTCUSAW8ISDKIfD+YfognMKVCMH5I/FhT4E+svFS3TvilIP2r4oAAucUV+n5YVCmYPq5aIvhDSRXuQAbgitKwG84pYIEs9to2sizGtkFTrQt4mG5tQ1QJAkrbite8Poj2ceOD8+nTx5F6JMiMfKvnN61uI9iJFdT7QlCqjj7SyUAavqhonQOjS6cu6ARyxPIDaXDBUMd+sWbVcGEZxNj0IZo0cBELa7eRfOfWjq5gbKraGH0MY5lqFBsSfKulaPwPQ2Vtihia8wF425IRMjhpyye0LakSriliWDMDPXDYM6ARqnmoWx3D+EkdktSXWthMLZRgDL88z0cqjA3znQq80yphPlUBM3wJ019Oxob5YEXWhvlmhbx6D1P/qljhwzaTBtH5Ip7kOfY8eKfXh9OTJgSNg+enxMMhTYJETZwHu1faPhMBs40n+Ycd/bpyQ4UCM7uUy2Rffgy3EIAu+lsA8JDJRy4xARn4gABrlGpaXB6W0PVtNYnbX4h1+STHcEHnRS/tHzhaGKXu8UaHJuqesBFHJemzDiHZr176haQSMwYx/HUnoPOQCkGJAS8o4bp4iQQTAL8LITR762iz4fuFrrVMqoi/YYc1uPrP4fuC8HJTwiNmgu+qeM3dvjuAJ7ZKC3iTTU44PN83BMf5fP2SXexMkw59RVCMaF5Ay0hEYpL+VZxuUPLpKZ8kSV9Hr0Ctb7Q3YcnNm2+bfnN2qG9OPcBPl+KtaHgAXKWF/kjxPsYwSn8AByxojQ7IhH0yzdgHHfTVx3hODGgzcKchTxjj4UY1lh4DJ1UnHHwHnso4t2Bahe34BtbheVoRIDauia9hZLWnmP30NypCGJpKvjsrTdcXbGM87lYcM3kQM7gBTzUZbgzCJpNrtFV8E9Vr1Kn588gYZqDF+5C8HWKvNuAaNpJ3a7xuTTxB0Q35MxKgENF0mosAQ8thaBWpy036YLQKVjzUIeAHiUCNtyXw/+IF30cm5AKKUmU6dNlHr2Ich2oBT9GqI5t5Wp2rtzGbGC+pS5rMyrINwTGCFGN0zafm6sfK1bXEXdSExPlan03IS4J4zJnki6CsRd4lhQW9+LzxynBsr/CY7oXQb62hDihRPBscKOAoZxtPpK0DcPmYNgYIH7gB9k1U7VUanqX4PPhEU3OwGdbPND6h9Y5VTsKpN8aRNW3tA79E6SP0FVlswlRmuORDL0kO9XJxpWG8GjCGci2QDHlbPePRnuGbv8RRsZS4Iwt/IakU8+yALhj2VBP58zVwGBMniXS2ov5NnM8b53gmO+xmJpdyM+OcDU6kU5XJgAOdMNE/WZxO9vzH1GoZDliEdlV/OpawmXYOePZ7dzgH7LM04vBIfSPCI0y6zwfTZaT2kUKHkkKB98SRYodHio0Hd0ERr1XyBWxU6IfwiE20X/r0C2261OhTL7KpWoFPvlge8IZbHj7Hysd2xAXGJTqU4mAn5R3o0tDj0WWhj6PLU+6Prkh5PHpY2j/RlSk/QFdJTJpBNxus/urEgdDDQ19G14x4K3pk2p3Ro+mfEW58sOrW4FoUz6euidu7xyycQOcs/fdYUHxr8BsPd7wACx9AZTAM4cJ4XH0RD6Ja5zwK4PFDzoqeMOqs6InXr1Ur/hnvJwFrJbEn1yre+edTlir6Bjpf/abTX4TpkOipY9I5At9m0wMQ19okYcnk46elUvjZdS4FuJIH3tOtZ0o4OyEW5UfPSCfxq2dWC3jcvlEr40Fo6wHsWUmSegB7tnuhPHwj9jkOa6SUBBL89LoAP4VFHJIa0RnwmIqlrZvtpIxcPVssi8LiSEOv+dPV3olqU3kOszo9VfM6QYoWv8rTKInWYxrW3YA1WsACzMJWQ13Z4AJRAjFSxJggR5J1ywazAgFKmGkNzXRN97iaxpVzPRh9+VkceY8FeB8ADuU+NBhqsYmyHeUqaVhvsbCGi6QBUjVKcszbs3i+N60KLzazCcS3AeKYEtY7kVpkJd6JvBTavCOHxoatoAhBbFIohHlHFuSUGKXYWKosCUYa9Cp7IlT7O/FB8lhhuqz13TO3KL7D1Oei8KMrcuKlJ2t0zB4YmdCxgybqhqi8MKIFkYB6D0CN5J9/MrUoh9J7zhUPQ0aYYHGEM6JbkVT2fl9ZkJ+uTDSdP4DRTZcDJeZk7DK470WJYCa5n+VGA2qFvNTJwhU5dHxVjxyczjaeC9mQ2Iez8KgooEkzanG4YGPYP9lh27jqIIC9QVBUzpLcJQ+SHq+gvSH+JNOkdDw7Vj038TcMR6j6tt2oru7419hTAK3yLsER2Ak5a4Gf0t4p7KMVnmSDEobiv5u62+sdPKGkdubOv1bKhUTgWQZDGrrFxN3F2HIml5BHabnPec5SPLoChq+M8xzesfQU14zM6LGJq5ex/i2AL12v7Jb7FNYH8LtK3/hWxpZcHQ2/7AYvCGmYuL2CCF/H3T0SKtdZluUi4GGHPFmVu9jPBaso3/5FrLVwzPJ6IwH9Pcu+fSlrJsNWToW6Z9CEN1/Omn1paTYE9kFz9Uu+sAb3LBLm4xPUQZEI/EDIKtIYXcltdZv+Va5s+mYx55goy6s6F+UrfVwNctVQdceVIT+p3fZf2a5nggR3EZjGAp8h9hpbaAwq+DQm0nN3fsKp6SDvWPHhUuFWme8OTFEEJZYN0z2UorpJdm9wyTUg+nhAnM66q5sxdQ714gtBL9KFQm7rs/4Q+Bw6kpo7RQVTxYq8/y17RT2xqfNxPkYEWn6mtGY9g2csac194OUOOTyEL14aJ7hbxDdswXJXeD4nqA13rKmlR2kqRRU2Oh1B+VlVR/kghk29ORfhccz0kgQiFlUBArVJ30QnRX25u2W+gm6KJpor/zVsGHW0yLdpOrREsTlfBWLW13NswjewX4aqs2IK+jkvzRXg045DJS735FKovFxdkRukOt5rEhenePcjqQHuhLG4WHGEg1z4Uxzhgg9Eqc33KWOzecJLMWh17mo5aSC1eOVk17lkSec8Et7ygi5AQiNF8SIR1ocqVQQjhfuNZJxG2uQqzTotXk5FeuIccXFLzlCPmfWfv7A9bEKfqfA/C9nJ2nytssI1FankQZSfKXKrQDCyNls5Ln4OxXu+yE6IxvHMPP7oG6jw2V2YWQCvI16gC8D2dTiLptM7RdyNFfLiqGklTLf+GtOWVBC6gLXXs3BF5KTee6H1fRjrZwklkAsdOGvY3qlLkrV5cueZqCh2brJqpTjD5JkEG81ZF5JDxlPWNbp3mGrqJQohGvoqgN+hs+Bx7WBlJBFsIJeh5FqZF/eoZRStmCeszN31+PWlq0fIHG9XZgdg1IgLOaCbwWrxkCTrpe6LPQOaTPBwB+Fx1Po8dS62w/roLlW1r8BrWJWGrFvXt+Uiu2v5QJltLY65hvp84TEHFbWTvAIFZQH6NHDzCv/+cv+YMjs0FzTATYN3LFdVXF6VlVlbKcq7MzPCD2aOFlZxu2XLZKnJzpE9WldHmiIeep74xq6eaCxI4uQ8qaKpuiTvqx8viwRo+liFTjUppqnBFyeFNMVCnRKHg5AE0k+ujNuhpULtmJ3bw77NahOJJ7LK80cLS6BsapxXMwvXunh5OHikGAuB0dhHIWEQkahLABOtXp5dAsSgcBXJPrkUeEDW9y/EuGLICgvklDrudJmhJRboWfwIPVYAjxglip2jHuPIuzpXxE40yONAZYOJNzNbzp3yAY8bGj7Apy45LT4BG63v4RpXpdt3gbPCqev85js/YfJkqzWOAytbTD7ANQClS7qeV/A2kosA41sRIIheDJEMmTw8SqtkbcM+cWYjL7ygGe4dyhweAB9tgnVW6xWy9a2Je3NmqpVOug/NTSfJ8zQDcz9ajteMdkCWUzXNVca37voYCz5ckKROiMlH8NBQji+QzVGNju2vnLTunyYDQjXpGAiU4TZFzHWPtXH9csDscLnhifwAupQ4dWUpt51ynmZVQXloNOCRVt3Wm8WG6m005PpquFis2UazwdOMGS0cV3A0W4Y0jiXxnoQLJw/UhLZEcU5JQcwWPn4r5suZxL8jxzfiAjf9ovWltzAkxBK7p5yHrMdcnB81/T+vjX9igpoy8adGX2BDBGZzxIQIajujzgQm5EJmATZ4SKK2iG+bE2bZJ5aFBub1p2fdoBwDhdUPg1wALaE3XbgQs6MBWjgZl+QqTKgLX4W9HImfMMbTw6h7hsAfRNjxlHOGQFkv6WPQ8bFODvg8TNpnQ/78tmZTozZr+x7CIcS0Ns+LYqai/dhBvaYW8PZ5eDrcgQBxACUiyfbVRubyoQJ+TZ5J9Lp5dXbFsLMJOAFr70D3Knga+4iYz5Os5XQ8MvWM9qNUhhE8R9syB9NpSvY9MGEOpdPN23LmwnSSu4S5SFaZne4XZ83hod7ojWHS2wukPA2h8WafLsyLfVLxXGFbJB/wvSiJ7qoR+pAs+ejg4vWzE9GlPpqszrfnosvSLfVi2Yel071w9sqR8qrcflUgtNVhTES3YoP0WC/P0/WSM1cnKfKBnF8PT5RPxX/xO3PmGp+kSvcP5MwjxKyO72vSP9ZjEkDp68aXZM3jRvLcSfmEBGw4wI/3skltAPk96/Nb35EIe5H4/58DpvZex/EaS/KOVhwkeXfzQZredWWDFH+jhfcAUj0nGepuNRUxWL90CS5JexvBpaClIodU7wLRVcbiS+uDxeSOlU44J+o44o8tg9hKCFk5Z64vVq7HM17CBFTropgDMo76WLgpYGewJhwWFnabhBr9/qDRYV3vwbnhX7kHjWLdYlv5GjWskh0JOjf1sD31tkgx0zTe4Wa5ArXChu0+c1UPSt5rVeUQScjYV/CtfSA9xHsedqZSPbE2u8Lzz/E81heiPLgL0NY3YruVOD/3ScVzPhFK+M4+LqvEjPkADr2hr4HAIMXB8TMEQNPzqdLuNWZgMzGDUOLj4LfgTNz65Xdv8+c2nU8UvHjPl1jVeiI/1vm4U5gM08ikOKvnfU71wWkCp5fafqnB8YFs/IFRb+YHsWyt0xGIBtwIUrqLpVy39+wy0uKdJD3OxAKhF5R40o6IGwcSyK61MHULW5cd2+XcmC5PpEt6tdIhAG5gJ1fRHOqIU7Sgmuv08eZf+o92qbpumy1CO8Zn/eOOVt3dGqdml+BunvJE+KOn8sFTscAToHhRWckA6MwHyf515GL3LGocgqiQ1BUMrB8hKRfFdygjA6WSyIFEWq39AHX4HBY9ernJSJ/feNNR9jc4UOdcSTwiI2TrjWAKAA3UgY3GfQhHbNghIv+x1RH71gGMc9Lk+ms/w9uubZguimEYPCbnfJ04t9yhpqeH5ZuEzqNqqAgn4ZhvuwtOAR51gY30BixNKcgqHXP8881GaxQdHqq0WMmOawQz/18a4k/mocbISS77ZvTkl4M6K1SIHDhqhmSnYfh+DrtYjbaEGncRoFQoMPOtTn05QV6hgPESzBL0pIeVd/gyRW7EKYyV/yao3OnZyKveQlnSzNWdiHya3I6C0Mt2tcAjOGSkyTOfiWXv+R7CE7eXYD4dGeUeV8hDXUwr+yzYuh2YNLoIfCYOralZrik1IbJPpbJNkG0taEk5v4a6gEXo2UfzObCiXt6beg4m78WJyczY5z8spzBcrWteGg5aNw58Vp+L+DJOKHnf2yo5wVlxColYtOM2n1N+9Ds4/Sh7Pvway+D5YIEe8nvRxXXf6MPtePDMlaqI9zG9QiiftN9gXdKdAS7pcecqC2bCp0C4JSn59Jxawi5TXobeBg55fY8SejMa5JsrS2UooOjrSqlPsaXExovP27kBo2+4UzQL5ZWuf9VGHtBT1ldc5mMHq58vN+LyXItbdHY+P49FNZpsTdu+AklHCD6rWNnDz+Dd5HAduq2g15Z8aDKNrPEIn3ZN35jAdI1v0ZiGJi2yQP27AF8D+59qpJwhuMNNziho2Tlo4kjN1sRH4IPx6puv5qJ8YEVrVbX1WSh9gMVSHPEqufxEDu3czkF3A5JOJSUKGJgtsJ9eew+LhyQC/AZBfudvl1wxuCyvwtU5tOxFSgoxtRP/ustH2HX0ButQxFaEUqLkXoTwhpqQPhaRwumTGNDdzreF9A52xj4INFuA5FOEklDOaeCKSMSquGSClhZpabldoiRfZJBiqTsHgRzp3gCsfzlIn0PCTS7et5GnrsLvaanWc7jjKSkFRl2cjtaivP7Jfhg5Mrbf9p2wk0BqpHeUuc6RiBFi56PAX+BKsTE+Bgma3/5wzTLZXadIgCs1H02p+Z4Vce8D9qNTBdIeeLIhF03rokrcmn0iF8H1dpo6gK1BLjogxCJbe1BWqStj8S32/qFU+jhhliDLw6liQ1oqbgc9dqQN6hgpF13gDC91L+GWKRcdCYzIzTcgFBBhlF+m38zBPKe5c5y69hjgizdBOc7RLkf3VmQuCTC1w/i43sxFl8r7BbqQv5gzl6WwpvlSzlzuZ64gB3Adbb/iJH0rVHYC7A4uf9Ov4hdNgLd/aGLoU7noKnEYOEwcPJiLroYFK1UkOBUPl6qs6zZBwNeMgzxE4Xw6Fz2imd6lN0MsI+zDCH3wmVz0qMD/nHUtJ+jVO5drmUdrkRESo4/1+CQnNUo7C2hBmpDGAbfwjfRhVxLJcN8S45309B5/MV5LJ/lC5FU6i1UgE3fvZPREtHTs9n3JhHlKIMqSPlmzbbdbaWarKx2aUd2dc9xlwgPJ1ZpQS6JsYx1nOKIzmxhmO0iWtOIgyJs1yYsDcfgWljzE5K7M5amuQDcrePcq/MZVkZHy/Fj0nif8uQ9tKw/FPRmm1GgdKAB3IXgV5Hl7bXgbSe4hU8w5XsLEsQ2136per9NqY14kNGBSUhCC927tg30QguyKHlHsXIiYV+N2NzG47wdnCB0JqC2VPTCBI3VZgluy9I2+za3MtegcWLWlSXrsExUgan0gvQbJg5Atqn2EVQh22SkjWf0oYuEsKoLBGDCq1VyCoj8RUw0IUlTQkeqpZ/k4z4IrUNMjpx6oPuGQTZpgH9PVR3C9ThRu/x8KMp0Rw2ABzDZJVEe0wlAFt+P2oca0CjzM2YmtcFck68J/YZ9SS5XdSaDcBVE474LD0yaDswDfFnvdZmsDrYRyQ1rbPj0RrwMIGUTzBsynPEYpyvh348re84S+PUxWxTNz5wQVG3AZJIvd3t1amRfXmzs7VQxkyZAnC3ZBSupt4dHz84k4DvRZb3ZPxHXbHcmmzNIiCEUNmUi2t4vfOhHh9ciHQge3TZhrCCG1s18+AUeBo7vx9gnzZFnNcKwfTTBUBOXqzrSriZFgl6RHcV59ixnoP8n9HNC1zZlycRml7zH7XNzaXkly0UyL4y25aNwvwUS2P/RO5UGtuNo8B90nooBDfIQ72cDEHHdMRIeDgfLb87UT5gKK1xKT/SNaLxY9djwdoeDtjD6HbWdjC2QErh6EbIelrBQk+hUkdBFWLW5HcP6K4RkeWeDpBhnIvRPRJZIEm9ok6dJ1tyTha3UiugyUiy7bur6F7m5N8+ZyqadIz3qbKmdMun6F5AWvWMIn2cMgkhXfuE44P22u9E9iyfIkw0OkfRXYxcE5+m0pqwLcIscvMg+nE4l1ug1PWKj2KYH14Xz0CLQOI2mxmbj/P2vuwwELNkYtChM7OgB7FPdKwqgfovx+jANmPN36OD354XhGPOAl9E3ePF76meyte3AwjnjLfmvWPAmzNNI2lXjYmR9CxMM5XkM0HoO2RSqspW0F5v6JKEvdZjggTFUdKHdaNxT/t7Ire5GsOuO3qrqW7tk39yXuS9xmHMd9udXVPVXTS7Vd1aMzWdoJY8fRqMN0DPMoeRAfQggi4mP+gCASgoQ8hCAiIU8iIkGCSAh5CCGIBBGRkN/vW85SVW3iS3fdc88999xzvrN93/f7feIrurEx+9QL1FBvS0dts1IJMRY9LDoXGmC/TNemwWn1tw2jut3BR6p/gBjeWPpmKfFJqNt5CkIpL2xWmtBvcCqnLqULeBrx57CD1yot9fLL0qYnZXaxmRl5wNO38fucLgCYBASXVxAQPYjNS2gAbb9AOmA83tjwIVttjkxiumhymkGDWKPBkbxRgYV+YwOzDoKSc65LqpksvrxV10qOpDb4uFTxzUbRJIpX0G9W6XIZvnY4ra+7y11xHKYUCecesppSSa28qtCtBBpHKec36MVUYaeFX0gvwDmJEV0AIF+KDQgYJ0NAAVlSynHNXY+mYDknUsLiOS+JB1UjdattZqCYVuqJO91bPo4SmQuB6WkN6s0hzr+/ZBvxLH6xnTgeBDJlRNsd/uE7gdXEL7p/sYYhM4OB0yFm9zHEPgXUByDJcG/PuDfvXkNT7oMlaB7x0wGAgiPNgt7cP5JI/6slBKhd9a84EBwdL/D2dDbI2K67vr5dQ3NqA9bTBmxkDdhMG7DlDTFtHzwz4YO3jX/w9kkfuuN/fejO8KG7wmHpOfXgAenFFp6/tEalvr41OGHAfQAeBWSkAyu+pG8A7HneqcY06Q/YqjxrDqDFOxgGynTaM/dDMFO1JEafxhtj0rvwW/Zgc8HteCb3W9B0OC9sg8EsSXm/QeYWcVPXhA8bsNtwt6uXf2yQrCVB1ibPfgyTOA16VtV6sfvpzVUYqrGYJLk+wBK+GQMOhu9oFHudSElwGX7jk0axL7sRHFL1/ovNYr86Geg1HKcPgEHH2jA4HhT7CRsM7oNrbXauXSKguuKdokMvILNweFyRua/W6XFikVHuvBD1ZciSXAnxAEb++hAzJgUzXKzD/9CztICjwuACwk9zTafXacYZxKumsMow2I63UCJ1gPTmWZudeGq5XOXPXaivhOlfX+z3F8R/dPfy3FEdxHt6qMXq2rDLnHtdpjm6Y+sIx9FYU/0ezrQxuTz3Q6G+FGeCMFNCWWcCT8+biGGlfwtXUmURDlBT9dQ2X7a3cSwMGFQXXTk7qkiJN++pzXkOFymQohOi0NEvV0xuI3IALyKhv30Nw05+hcByTKqq0Z+xHCxT4xSc51WPWHNLZmrKw0EoS1bDHwwXwX1Ad5Y4ioU3GfokHMorwUgY4w9Wy5zbTO2edsFD/gs/RhAbNSfFRVGP7XJkTZyP5KRrquWhhqen/jeiS97jGUvoJ87pDnSkBCdYSRHA5pssgNH1EjeOLi/hWqEsSwN7s/BopqQw9FFNrO5mahLcFU5jx7KZALLwIxDUOOklXc3ijAOvOvdpzDD8SKqGXZroGYil+QB9uxXU/2uA1knIU5brrgf5G62ucAfPq/FnyGdC4WC++R9heLiZwGawrSocXU00usaWGYerg0HgszvUYfR8XilJHc5WFY8pSBMEGZCEMQ0nh1PnHqcSPrNEEoRprksC5VCCKkiI2yfDMg3i5jB0jfo5eP65HnwEc2Mhxcetippu1keYbdIqOfQhYjiSqSFm8E5EEFsbV2Mo9/BeciRi+wayIGBlgXgWEh/ZK9jKr4aeHH5Nt21gYAPMuKaI3ymWQhSUzPi6J+ClbO265Uq40s2IXQCmTii8uDorKN43OjNz8/PwRg/X2+zadz3bIyx6R7bZ2Znjq3elmOndOUJ6zxiEeu8kDP++CRj+/eNA7QMCVoaZgxaFC1y6424nxy8RGht3MmK1yfYgNS8gAUNMeWMger9vgqNDf7rJy5+2jb1K9KeQaPklZX4GecgGYlgpDOUZ3wQ2qWVddyt6miCimhv5Od0ECLnq5LJ0UslGO7YqovVLvc1Gx/pWhSHO0eic8FcUN+EVovHKAF5ZmeictI6Yu/AJxRdcUvM3FF9u2U6hYb/iF7HRPt8yr0/aASm3WfwHo3jksznIRT/HIDk4QI/cNnfqyW0woG0TKnmUr0seDoUS7RISdxpKCmXrx5dKErxJ3PY/J9vCKK3VTSlJk4uXoE9Qdk9LALlnVX+acGWutRYFTYt6GeqB+B4nYgqeYo7UY7X8N2Yo2buchk8tHX0AkMQPS61r4dy8Nvw9cqMJDwdly4RudheOjWMvtbpC9VX8jJoJww5EcqjXJtaVSy4dDZVULU48lYSeQLj9IitBzRni4LcyWpxh+IJ916CnycYiHqMwEQ/WllZkrOk5r2IToY30qiBPVwj+CIPfptIscet6BKszFsysSq/Qu8klVZK0Qw0PcZ4gCI0XawKOoH7gSk4zTngrGzMHI76Ortgyn3MisK+KX6BGkbELXVj9wcg3vApVVuQ4wP5GiQ0A1Jprs2VxYljt68R5pi/LmcKAgJA1Ej/b92C/4BEnMPEZhAC4l96saroH6APr9uXyOFsdB109+HTJ1FbvkqOt0SU7W7NL989Wl4xs011ysc10HcS2LeAXts/3AWngrx04fhmVxE7m2dVl6m7MtUJ/ksIf9gr+ct8a/+7H1nONC9FijytQh2kXdjg5X9ThF18M5M+alHEJfs2WIlW4unRJoReX4eyGf5dTXK4Qu/iVlCQRyW8NllT8r2KtrsYAYDnXPIo/13bm+fR1ZbvNal5v2KcbxDJ/46owhJgQ3mzUU982u/4tWEDx79ZBucRsty20Wc/bceLEvzsG0kAH+TGHmHAnP+4wsU34f1e7wxtH2h32zN1YrVmJe6QK9z4m/+5b6c0O9YPvH/TXVgXE9EBvid/zoK3TDy2W7Tl+18OOxnykvQbPYhZWBlxmm/U3+Ak2SkPvvA5+axtisD4OjhABTs3DDVrLOpqQgnRlQHPtFo2VrprHFueOKixxwfVxi9xTSGyT4gmXO/NbOFyuqMutvvOKQFw6y5PI4hyPHnra7dgGrrc8zwLm7GvnraePQmR7OPtqOV04ZuivHpBfq7OEdh1LQYM7otxfqTQvQWivgeFRXITk+Ws7PZL49KUO13f6s2usEoXBW+wWIyRkr2tP3Gbtegf/Q6xYz4PYXbAWh3Cm51vvkm0GPs7eczfIZ9jb+OcF34vfoVb3Dc0g9dAQKrS2CFkZ+rUC9OfsAtyzOXjJXTM7J6JdM4XYFMeR1aTuv5NnGp7GPTGbtxnEoOUdru+c9hwzyi6jqVCuGQR452CltxzqtQu15gDHP0izSOVeipW+dR/pFqxW+9Hf7b6mH+AXcLyz/TTpQpsILuJ/fefFUhNvrEvYPtrslxqLw2X8b0VdzlaDRkf8dODOznwLi3321iKG36Nr8sSSYmQpnhzWfEtfcndAJiSZV8KvR1WwtHrb1Q8ev3Znc9m34pR0lXXJ1R0MQUu7bm5ppYtJlm+8cX5OPM9uClPazRhHYGKY5eyifkH61O0+7O5M6S+PhIntfkw2AZr5AKYcuDr65YN4ks39sE1bj7jqdNWkeJ0zPUmF5IITPvj/9ILz/ppfcPo/7hdcBURUecHF4PEgtyfCEnCSi4l23XfiUvNdjt94NvueiPm6tdX3FU+LX+tLI7FgoCbYPD3L4GgvkEyvEhQbI1Q7WIjTW772+nFblBW09tAobpHRYUcbMeph/U0Cv0B9sHpUll4wJSmBHZum0pkUJYY8y0fLWSG/s8cq2WNVCSg2FogmenYJz9ewH0AkStPMFEeacHoNwaLifjdnoUjoBca10bA6h/2NZizPneP2VHJX6tkbojq/nqjzgxa/4kc6IGicG04o33R0To2V5Rj6NwNV0xvokCzbCNfDWzxCjN4PPiueGDU+v0Z55PBPAxJ5dpeELGCReMWMPpFU4LeoQIjJYGq/ENRHrMZg8kGeTWPBRzAN7OzCE5EcvypHKs0crWojESCSB8UgXdWYa8XbaS0g1NKK76AVAxcC6xRtzbWQ2bgukpPwEGhnoKSHSkMA2gE5gAcvm1pwLJwiLnq9XOFWpd5fFsiQdnyDa/ugPC72mZL3W4M0iqy5LJJIA3OZYYnxU6gM1AV37tnnnz4j+lYyMUIIsDuQQYBVUyx7IyZuCRxkx3ofLyugMtMtA3e0/WWgwgW4ntVF+wxxbhA+HedMEKpAfykRMOQKygu9ctYCjWHwLnmtt7C2kwdBdF2iJRMX/9OVKqaRxA8h+uD+v24LU+JTJ1/4JyifBZnsAT7su7HeiAqjWOzBjqsfbm1RzfJHPagIynsYFPG+DURQKVkUC1XrPoPH3s8yxsgiI+3eXustKjOjU0/J2gyzZEp4MbEkO/9LtT6E/PohR6IMO0aeyiJVsXGuURWbUGFI5+r50DVH9HGOJbhTmVVYdHcsxtzKFNxWdo6T3YW1jal0Ax+vScoz55X7yNwTqIvHcIYpPHs0CZWsB7+kHE4oH2Mou3eaVPMv9Bdz84Gr9kV971+DNZDI+meKn7bEMw9K3+IfeOopiVf8T6xaYsMp/gWhFSkqPoUEmYstTrdwbTxffAaNgybFuCmfw6ZhgKMvmkULaGEsh08WXzaLafpMFF81KzOhScMhF75akxQmCfR3CwRz0IiM33b1SKoraWjkylgBxRuCYhYbGVjChDm2MuzC/oU1FrMLeCuP94TTuCpcxmPJUGwIT6Lu9HVbMuXY52RFntK50Vgoqrb61nxdnsorht4x79fi72T5ilgP9BFClTJwBUMZQYEn7mlJS/4NPSZpOmPCsQRmYYz3LEeDSSFDk24ocPMF2hAW4XBhbTadIvNnhE83VrMW253lim+olCnBJf2pGudNhJz6hk/JBP2NnzLcmQlpfLx+6jxcSZ7Ac2cZrhHqtXPWTcPn6dolZMq8Zd+dM6RpqUHOxySoJhIUVOnfUIYmFw5iF5eCf1PTk/Z7Mh7YGLUNGAFDh0JxFXs/7dxG1rkkMUuuD/Gr4YYav3panVdjfRwRRwORg+pOsCl1yDskJ+NyWNIpIBbSzMQ5dofGjSPBNRZYTnhPSuDevFMmZfKRfpbOq/3nNOY6R3vG15aFRUOoh/GIbzHES85IB/vcFOCNqZCpr+mY/xooU+DkpB7XwnI5CkUdSfTDguDU4IZtjoFSwBQxqvnqUyV0QpiV5dhVTXNQXclML2JCVywrTMCQanRHQEE/Bu3g80SOBuNeDwEn/LdrGsWkOELc75dJnk9gYxSvO9rhg5G95CCrAGDFuCnB4EdyLMzW5MYS7bXQz/kBoj65FDt8AIooRQX2zZDbWb0drk5nSMXpCnGUo2prZzQCptCKSDxVvlM+KHvVZvFyqwJ+HitdIi4KZbhGQGcVgudodQPRXCGdsrlDLeB+26pMJWUi5aVWpQ55ZFlJ3GAOQn2HlODh1auwBmuKNBtiJvqFfq98a5pZP17z+m9rGnlS0uCkaU9ofZ0eSuqs9+Bp32KgBzzoCZ67+HmLzv4s+xXPI3tsl9qC7CTwj9c4t9iExCwoBeL8kzPWXsJeKqeRTXsWtoVWBTO8M2RiOy1Y++idyxgv1Grj1dgZS81ebWG90+JfbwHLlsfzx0kwRvsPnSUG+xi3P7IviNZpRHVN5Ue4QtgiaDlBYo25fHm9A32XMoEliTFz3dwPHbxjFko5oixBAWZehvSJIBPgMEkEnT381OJ1VY9LSYrDDSKszYxFMuJ/CdtTwL8LHNJdcskigP8SLq1OTjBi2+CEDDnnFVzsMAyh52hVALtiviOHaSjytw3tCS699lM39rzyCB1A+G4eIxLcHET8QS38ax/FpgBZRh929Is58yp7QoyqiXkYbasQYqFLcPTUrzACvYyxoJtkSMRxyR3YK4hvw0i0rAUHuqMZA/WFxQ6hR3U+8Zc9LV9u8wQWFBCYd01hgP4YyzZuPnZSN9Wq4+wg7pu9jlhhxp5PLJGpYyDwBMre5o4+IPvSZ01UVHMucpjJn8tdlDex2aSPkjogsSCi1bBLgdMrPs/DrLyBMWwgLvbuVJJfRKmuBVqcU4S48458C1OLRsTw4JHaQOBeGyiPSTHEGKPJD1TpUltqo3HYh41dE5RTU67WB/CAE7UnMZCeuAJw7mophFRTmoyi5Yhb10vZ7TfmweYGVRScNbXcZkiYJcvt+kpX1QetkA78Nwaw3EX6dEgvO+k7Z9L0UMFt0HDjq0QNguxKXuefGgwYO7KPjU+LU25MT95GV47kziIMezC5ylF1T7y12ieSNL5nb7hlJo14a1+8BaqxpLj96Y1QMxjZYioaBqWJYuGCE7D+rLXhENsFzely2RMrnCeGt13kKdInF7NBwAwTbl9ytN9nIAToC6EZFrWR5rzUb5Sr2H5L0mWWtIQhJQmXe0K/HT9eb11htwYLJ3COw/dZ+pWzfEO3v9o7yQM96wxtPJKSL7sKuiKIAVgx1W0GSVez7dUOZG/hWIMOiWVea0lQS7PBrrNL+IqulpZ2/bK4DpdAqsWevSEkpr1wo4owjBSLQRJvOtknE1AKJYaFcWEYZZumABH89AW3JGMG3wrrebx3azoKY2/flg2amH57np4UdEe444PwoLe9PKztfsjTaF3N7txpd+C+ykgLox122G53y8V5gflp8l2ZeIxJzxG7DblYTJLv9mTtobHH7rH7jLiRStO9uaClz6XZ7ssqNUEq78/LkQmDtkBYjzTDA3kGSnoMFiI5HozTDH6lYvjQyB3vuoeziSkkP6JSXtJkU+Yzdqp4+x1WP401KPGfVeGtUc+h0MJkn9ykl6uHWHWPWuwuR0PogspQaTGL9tzJnurZBqyNePu3s9i61amzB3m0qJw9SG1Q9ewhXtXOHhLdkDsfxSC7OHKLZSgGLtQ4F+I3Nin2LlbkNvy8NdYRGEDo5CK6aqobk+i5RQ3xwdTy0heOLoS67MMYiK5h2f8FIAIAACi1L/1kUgOVEAAWVlA/AJOaxvyyn2GEbvcomp1TqLQuvXcSaMrNXozlL/dnGNcGca3U3g2fosPXVh5MhCiazdOvn4UDFtY9RyFEbilTPwA+AEYADiyLpBKxSkRKqurBiFWp2sgBNTU8WBhsBEY8oA2YiaQ7yOepO7Iz5832C/i3j5xW0UAoITJ8iCDlrp/SDtfMcNMzQ+4k5/qXTcyTUPAwAUIgOmSZBAnADgITpmrmmSmeDmErGhY9IjLNgifDtBSQikbBZT3/nWRoZMTAqyomTE4shxwxNlIfRZ8anGZCqqNHBZcLGE4e5gQFS5kg7X4gYeZPMjQfjYcqOjBeZmSueJgkDUJWErQYwAGhxcWIEiwITik3/6M4es0Fr8aO2+vz9vP0uj5cjdF+3qte3n9QzGAbuzxS1B5avNjIghOphgI3Ysd13Aq5IxVF+59sqNGxMlWagsIUpjVAAsSMlQ8RABYyyGpRUaGycUBiJChDIZQ53MxYOrJt8sgVjg/TM6ZbK8aHOx0auC7MshstBnkivXD95NMtCkbHwCHj+86+1bRXmDeRZiir68lu43UEUsyf+TdAXniii0f6+K7j15q3G9xIEACp6CVwWNM04eWdYqFIP29ONISvXP94Q0nydJA2aqvNEjDN8EE5+YH5h3TAWpWk78URmqTct8piEPOPevBs7o6ZxaROcU0bG/q1o3fT2Ucd+S1ueqCFKuBvwbFQSwMEFAAAAAAA+QtxXCdyFmckAAAAJAAAAAkAAABtZXRhLmpzb257ImZpbGVfbmFtZSI6IlVudGl0bGVkIiwidmVyc2lvbiI6MH1QSwMEFAAAAAAA+QtxXLRiaFNDAAAAQwAAAA0AAAB0aHVtYm5haWwucG5niVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGJgAAAAAgAB4iG8MwAAAABJRU5ErkJgglBLAQIUABQAAAAAAPkLcVyE27ZZxmcAAMZnAAAKAAAAAAAAAAAAAAAAAAAAAABjYW52YXMuZmlnUEsBAhQAFAAAAAAA+QtxXCdyFmckAAAAJAAAAAkAAAAAAAAAAAAAAAAA7mcAAG1ldGEuanNvblBLAQIUABQAAAAAAPkLcVy0YmhTQwAAAEMAAAANAAAAAAAAAAAAAAAAADloAAB0aHVtYm5haWwucG5nUEsFBgAAAAADAAMAqgAAAKdoAAAAAA==\";\n","/**\n * Creates an empty FigDocument by parsing a pre-built template.\n * The template was created from a valid .fig file with user content\n * marked as REMOVED — proven to open in Figma.\n */\n\nimport { parseFig } from \"./parser.js\";\nimport { emptyFigTemplate } from \"./schema.js\";\nimport type { FigDocument } from \"./types.js\";\n\nfunction b64decode(b64: string): Uint8Array {\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes;\n}\n\nexport function createEmptyFigDoc(): FigDocument {\n const bytes = b64decode(emptyFigTemplate);\n return parseFig(bytes);\n}\n"],"mappings":"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","names":["zstdDecompress","import_fflate","import_kiwi_schema"]}
package/dist/index.d.cts CHANGED
@@ -95,9 +95,75 @@ declare function parseFigBinary(data: Uint8Array): FigDocument;
95
95
  */
96
96
  declare function parseFig(data: Uint8Array): FigDocument;
97
97
 
98
+ /**
99
+ * .fig file encoder — the write side of the roundtrip.
100
+ *
101
+ * Encodes a FigDocument back to .fig binary format.
102
+ * Zstd compression of chunk 1 (message) is NOT included — the caller
103
+ * provides pre-compressed bytes. This keeps openfig-core isomorphic
104
+ * (no WASM dependency).
105
+ *
106
+ * Encoding flow:
107
+ * 1. compiledSchema.encodeMessage(message) → kiwi binary
108
+ * 2. encodeBinarySchema(schema) + deflateSync → compressed chunk 0
109
+ * 3. Caller zstd-compresses the message → compressed chunk 1
110
+ * 4. assembleCanvasFig() builds the binary
111
+ * 5. createFigZip() packages into ZIP
112
+ */
113
+
114
+ interface EncodedFigParts {
115
+ /** deflateRaw-compressed kiwi schema (ready for chunk 0) */
116
+ schemaCompressed: Uint8Array;
117
+ /** Raw kiwi-encoded message — caller MUST zstd-compress this for chunk 1 */
118
+ messageRaw: Uint8Array;
119
+ /** Original prelude string (e.g., "fig-kiwi") */
120
+ prelude: string;
121
+ /** Original version number */
122
+ version: number;
123
+ /** Passthrough chunks (rawChunks[2+]) — included as-is */
124
+ passThrough: Uint8Array[];
125
+ }
126
+ interface AssembleCanvasFigInput {
127
+ prelude: string;
128
+ version: number;
129
+ schemaCompressed: Uint8Array;
130
+ messageCompressed: Uint8Array;
131
+ passThrough?: Uint8Array[];
132
+ }
133
+ interface CreateFigZipInput {
134
+ canvasFig: Uint8Array;
135
+ meta?: Record<string, any>;
136
+ thumbnail?: Uint8Array;
137
+ images?: Map<string, Uint8Array>;
138
+ }
139
+ /**
140
+ * Encode a FigDocument into parts ready for assembly.
141
+ * The message is returned as raw kiwi bytes — caller must zstd-compress it.
142
+ */
143
+ declare function encodeFigParts(doc: FigDocument): EncodedFigParts;
144
+ /**
145
+ * Assemble a canvas.fig binary from pre-compressed chunks.
146
+ *
147
+ * Format: [prelude 8B][version uint32 LE][len uint32 LE][chunk0][len][chunk1][len][chunk2+]...
148
+ */
149
+ declare function assembleCanvasFig(input: AssembleCanvasFigInput): Uint8Array;
150
+ /**
151
+ * Create a .fig/.deck ZIP archive from canvas.fig + optional metadata.
152
+ * Uses store mode (no compression) via fflate.
153
+ */
154
+ declare function createFigZip(input: CreateFigZipInput): Uint8Array;
155
+
156
+ /**
157
+ * Creates an empty FigDocument by parsing a pre-built template.
158
+ * The template was created from a valid .fig file with user content
159
+ * marked as REMOVED — proven to open in Figma.
160
+ */
161
+
162
+ declare function createEmptyFigDoc(): FigDocument;
163
+
98
164
  /**
99
165
  * Returns the string ID for a node ("sessionID:localID"), or null if no guid.
100
166
  */
101
167
  declare function nodeId(node: FigNode): string | null;
102
168
 
103
- export { type FigDocument, type FigGuid, type FigNode, type FigPaint, nodeId, parseFig, parseFigBinary };
169
+ export { type AssembleCanvasFigInput, type CreateFigZipInput, type EncodedFigParts, type FigDocument, type FigGuid, type FigNode, type FigPaint, assembleCanvasFig, createEmptyFigDoc, createFigZip, encodeFigParts, nodeId, parseFig, parseFigBinary };
package/dist/index.d.ts CHANGED
@@ -95,9 +95,75 @@ declare function parseFigBinary(data: Uint8Array): FigDocument;
95
95
  */
96
96
  declare function parseFig(data: Uint8Array): FigDocument;
97
97
 
98
+ /**
99
+ * .fig file encoder — the write side of the roundtrip.
100
+ *
101
+ * Encodes a FigDocument back to .fig binary format.
102
+ * Zstd compression of chunk 1 (message) is NOT included — the caller
103
+ * provides pre-compressed bytes. This keeps openfig-core isomorphic
104
+ * (no WASM dependency).
105
+ *
106
+ * Encoding flow:
107
+ * 1. compiledSchema.encodeMessage(message) → kiwi binary
108
+ * 2. encodeBinarySchema(schema) + deflateSync → compressed chunk 0
109
+ * 3. Caller zstd-compresses the message → compressed chunk 1
110
+ * 4. assembleCanvasFig() builds the binary
111
+ * 5. createFigZip() packages into ZIP
112
+ */
113
+
114
+ interface EncodedFigParts {
115
+ /** deflateRaw-compressed kiwi schema (ready for chunk 0) */
116
+ schemaCompressed: Uint8Array;
117
+ /** Raw kiwi-encoded message — caller MUST zstd-compress this for chunk 1 */
118
+ messageRaw: Uint8Array;
119
+ /** Original prelude string (e.g., "fig-kiwi") */
120
+ prelude: string;
121
+ /** Original version number */
122
+ version: number;
123
+ /** Passthrough chunks (rawChunks[2+]) — included as-is */
124
+ passThrough: Uint8Array[];
125
+ }
126
+ interface AssembleCanvasFigInput {
127
+ prelude: string;
128
+ version: number;
129
+ schemaCompressed: Uint8Array;
130
+ messageCompressed: Uint8Array;
131
+ passThrough?: Uint8Array[];
132
+ }
133
+ interface CreateFigZipInput {
134
+ canvasFig: Uint8Array;
135
+ meta?: Record<string, any>;
136
+ thumbnail?: Uint8Array;
137
+ images?: Map<string, Uint8Array>;
138
+ }
139
+ /**
140
+ * Encode a FigDocument into parts ready for assembly.
141
+ * The message is returned as raw kiwi bytes — caller must zstd-compress it.
142
+ */
143
+ declare function encodeFigParts(doc: FigDocument): EncodedFigParts;
144
+ /**
145
+ * Assemble a canvas.fig binary from pre-compressed chunks.
146
+ *
147
+ * Format: [prelude 8B][version uint32 LE][len uint32 LE][chunk0][len][chunk1][len][chunk2+]...
148
+ */
149
+ declare function assembleCanvasFig(input: AssembleCanvasFigInput): Uint8Array;
150
+ /**
151
+ * Create a .fig/.deck ZIP archive from canvas.fig + optional metadata.
152
+ * Uses store mode (no compression) via fflate.
153
+ */
154
+ declare function createFigZip(input: CreateFigZipInput): Uint8Array;
155
+
156
+ /**
157
+ * Creates an empty FigDocument by parsing a pre-built template.
158
+ * The template was created from a valid .fig file with user content
159
+ * marked as REMOVED — proven to open in Figma.
160
+ */
161
+
162
+ declare function createEmptyFigDoc(): FigDocument;
163
+
98
164
  /**
99
165
  * Returns the string ID for a node ("sessionID:localID"), or null if no guid.
100
166
  */
101
167
  declare function nodeId(node: FigNode): string | null;
102
168
 
103
- export { type FigDocument, type FigGuid, type FigNode, type FigPaint, nodeId, parseFig, parseFigBinary };
169
+ export { type AssembleCanvasFigInput, type CreateFigZipInput, type EncodedFigParts, type FigDocument, type FigGuid, type FigNode, type FigPaint, assembleCanvasFig, createEmptyFigDoc, createFigZip, encodeFigParts, nodeId, parseFig, parseFigBinary };
package/dist/index.js CHANGED
@@ -93,7 +93,90 @@ function parseFig(data) {
93
93
  }
94
94
  return doc;
95
95
  }
96
+
97
+ // src/encoder.ts
98
+ import { deflateSync, zipSync } from "fflate";
99
+ import { encodeBinarySchema } from "kiwi-schema";
100
+ function encodeFigParts(doc) {
101
+ if (!doc.compiledSchema || !doc.message) {
102
+ throw new Error("FigDocument missing compiledSchema or message \u2014 cannot encode");
103
+ }
104
+ if (!doc.schema) {
105
+ throw new Error("FigDocument missing schema \u2014 cannot encode");
106
+ }
107
+ const messageRaw = new Uint8Array(doc.compiledSchema.encodeMessage(doc.message));
108
+ const schemaRaw = encodeBinarySchema(doc.schema);
109
+ const schemaCompressed = deflateSync(new Uint8Array(schemaRaw));
110
+ const passThrough = doc.rawChunks.slice(2);
111
+ return {
112
+ schemaCompressed,
113
+ messageRaw,
114
+ prelude: doc.header.prelude,
115
+ version: doc.header.version,
116
+ passThrough
117
+ };
118
+ }
119
+ function assembleCanvasFig(input) {
120
+ const { prelude, version, schemaCompressed, messageCompressed, passThrough = [] } = input;
121
+ const chunks = [schemaCompressed, messageCompressed, ...passThrough];
122
+ const headerSize = 8 + 4;
123
+ const totalSize = chunks.reduce((sz, c) => sz + 4 + c.byteLength, headerSize);
124
+ const buf = new Uint8Array(totalSize);
125
+ const view = new DataView(buf.buffer);
126
+ let off = 0;
127
+ const enc = new TextEncoder();
128
+ const preludeBytes = enc.encode(prelude);
129
+ buf.set(preludeBytes, 0);
130
+ for (let i = preludeBytes.length; i < 8; i++) {
131
+ buf[i] = 32;
132
+ }
133
+ off = 8;
134
+ view.setUint32(off, version, true);
135
+ off += 4;
136
+ for (const chunk of chunks) {
137
+ view.setUint32(off, chunk.byteLength, true);
138
+ off += 4;
139
+ buf.set(chunk, off);
140
+ off += chunk.byteLength;
141
+ }
142
+ return buf;
143
+ }
144
+ function createFigZip(input) {
145
+ const opts = {};
146
+ opts["canvas.fig"] = [input.canvasFig, { level: 0 }];
147
+ if (input.meta) {
148
+ opts["meta.json"] = [new TextEncoder().encode(JSON.stringify(input.meta)), { level: 0 }];
149
+ }
150
+ if (input.thumbnail) {
151
+ opts["thumbnail.png"] = [input.thumbnail, { level: 0 }];
152
+ }
153
+ if (input.images) {
154
+ for (const [name, data] of input.images) {
155
+ opts[`images/${name}`] = [data, { level: 0 }];
156
+ }
157
+ }
158
+ return zipSync(opts);
159
+ }
160
+
161
+ // src/schema.ts
162
+ var emptyFigTemplate = "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";
163
+
164
+ // src/template.ts
165
+ function b64decode(b64) {
166
+ const bin = atob(b64);
167
+ const bytes = new Uint8Array(bin.length);
168
+ for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
169
+ return bytes;
170
+ }
171
+ function createEmptyFigDoc() {
172
+ const bytes = b64decode(emptyFigTemplate);
173
+ return parseFig(bytes);
174
+ }
96
175
  export {
176
+ assembleCanvasFig,
177
+ createEmptyFigDoc,
178
+ createFigZip,
179
+ encodeFigParts,
97
180
  nodeId,
98
181
  parseFig,
99
182
  parseFigBinary
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/parser.ts","../src/utils.ts"],"sourcesContent":["/**\n * Isomorphic .fig binary parser.\n *\n * .fig files are ZIP archives containing:\n * - canvas.fig (binary: prelude + version + kiwi-encoded chunks)\n * - meta.json (optional)\n * - thumbnail.png (optional)\n * - images/ (optional)\n *\n * Parsing flow:\n * 1. Unzip → extract canvas.fig\n * 2. Read 8-byte prelude + 4-byte version\n * 3. Chunk 0: deflateRaw → kiwi binary schema\n * 4. Chunk 1: zstd or deflateRaw → kiwi message (nodeChanges[])\n * 5. Build node maps\n */\n\nimport { unzipSync, inflateSync } from \"fflate\";\nimport { decodeBinarySchema, compileSchema } from \"kiwi-schema\";\nimport { decompress as zstdDecompress } from \"fzstd\";\nimport type { FigDocument, FigNode } from \"./types.js\";\nimport { nodeId } from \"./utils.js\";\n\n/**\n * Parse raw canvas.fig binary data (the blob inside the ZIP).\n * Use this if you extract the ZIP yourself.\n */\nexport function parseFigBinary(data: Uint8Array): FigDocument {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Read 8-byte prelude + 4-byte version\n const prelude = String.fromCharCode(...data.subarray(0, 8));\n if (!prelude.startsWith(\"fig-\")) {\n throw new Error(`Unknown prelude: ${prelude}`);\n }\n const version = view.getUint32(8, true);\n\n // Read length-prefixed chunks\n const chunks: Uint8Array[] = [];\n let off = 12;\n while (off < data.byteLength) {\n const len = view.getUint32(off, true);\n off += 4;\n chunks.push(data.subarray(off, off + len));\n off += len;\n }\n\n if (chunks.length < 2) {\n throw new Error(\"Expected at least 2 chunks in .fig binary\");\n }\n\n // Chunk 0: kiwi schema (deflateRaw compressed)\n const schemaData = inflateSync(chunks[0]);\n const schema = decodeBinarySchema(schemaData);\n const compiled = compileSchema(schema);\n\n // Chunk 1: message (zstd or deflateRaw — auto-detect by magic bytes)\n let msgData: Uint8Array;\n const c1 = chunks[1];\n if (c1[0] === 0x28 && c1[1] === 0xb5 && c1[2] === 0x2f && c1[3] === 0xfd) {\n msgData = zstdDecompress(c1);\n } else {\n msgData = inflateSync(c1);\n }\n const message = compiled.decodeMessage(msgData);\n\n // Build maps\n const nodes: FigNode[] = message.nodeChanges;\n const nodeMap = new Map<string, FigNode>();\n const childrenMap = new Map<string, FigNode[]>();\n\n for (const node of nodes) {\n const id = nodeId(node);\n if (id) nodeMap.set(id, node);\n }\n\n for (const node of nodes) {\n if (!node.parentIndex?.guid) continue;\n const pid = `${node.parentIndex.guid.sessionID}:${node.parentIndex.guid.localID}`;\n if (!childrenMap.has(pid)) childrenMap.set(pid, []);\n childrenMap.get(pid)!.push(node);\n }\n\n return {\n header: { prelude: prelude.trim(), version },\n nodes,\n nodeMap,\n childrenMap,\n schema,\n compiledSchema: compiled,\n rawChunks: chunks,\n message,\n images: new Map(),\n };\n}\n\n/**\n * Parse a complete .fig file (ZIP archive).\n * Extracts canvas.fig, meta.json, thumbnail.png, and images/*.\n */\nexport function parseFig(data: Uint8Array): FigDocument {\n // Check ZIP header\n if (data[0] !== 0x50 || data[1] !== 0x4b) {\n throw new Error(\"Not a valid .fig file (missing ZIP header)\");\n }\n\n const unzipped = unzipSync(data);\n\n // Find and parse canvas.fig\n const canvasKey = Object.keys(unzipped).find((k) => k.endsWith(\"canvas.fig\"));\n if (!canvasKey) {\n throw new Error(\"No canvas.fig found in .fig archive\");\n }\n const doc = parseFigBinary(unzipped[canvasKey]);\n\n // Extract meta.json\n const metaKey = Object.keys(unzipped).find((k) => k.endsWith(\"meta.json\"));\n if (metaKey) {\n try {\n doc.meta = JSON.parse(new TextDecoder().decode(unzipped[metaKey]));\n } catch { /* ignore malformed meta */ }\n }\n\n // Extract thumbnail\n const thumbKey = Object.keys(unzipped).find((k) => k.endsWith(\"thumbnail.png\"));\n if (thumbKey) {\n doc.thumbnail = unzipped[thumbKey];\n }\n\n // Extract images\n for (const key of Object.keys(unzipped)) {\n if (key.includes(\"images/\") && key !== \"images/\") {\n const filename = key.split(\"/\").pop()!;\n doc.images.set(filename, unzipped[key]);\n }\n }\n\n return doc;\n}\n","import type { FigNode } from \"./types.js\";\n\n/**\n * Returns the string ID for a node (\"sessionID:localID\"), or null if no guid.\n */\nexport function nodeId(node: FigNode): string | null {\n if (!node?.guid) return null;\n return `${node.guid.sessionID}:${node.guid.localID}`;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/parser.ts","../src/utils.ts","../src/encoder.ts","../src/schema.ts","../src/template.ts"],"sourcesContent":["/**\n * Isomorphic .fig binary parser.\n *\n * .fig files are ZIP archives containing:\n * - canvas.fig (binary: prelude + version + kiwi-encoded chunks)\n * - meta.json (optional)\n * - thumbnail.png (optional)\n * - images/ (optional)\n *\n * Parsing flow:\n * 1. Unzip → extract canvas.fig\n * 2. Read 8-byte prelude + 4-byte version\n * 3. Chunk 0: deflateRaw → kiwi binary schema\n * 4. Chunk 1: zstd or deflateRaw → kiwi message (nodeChanges[])\n * 5. Build node maps\n */\n\nimport { unzipSync, inflateSync } from \"fflate\";\nimport { decodeBinarySchema, compileSchema } from \"kiwi-schema\";\nimport { decompress as zstdDecompress } from \"fzstd\";\nimport type { FigDocument, FigNode } from \"./types.js\";\nimport { nodeId } from \"./utils.js\";\n\n/**\n * Parse raw canvas.fig binary data (the blob inside the ZIP).\n * Use this if you extract the ZIP yourself.\n */\nexport function parseFigBinary(data: Uint8Array): FigDocument {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Read 8-byte prelude + 4-byte version\n const prelude = String.fromCharCode(...data.subarray(0, 8));\n if (!prelude.startsWith(\"fig-\")) {\n throw new Error(`Unknown prelude: ${prelude}`);\n }\n const version = view.getUint32(8, true);\n\n // Read length-prefixed chunks\n const chunks: Uint8Array[] = [];\n let off = 12;\n while (off < data.byteLength) {\n const len = view.getUint32(off, true);\n off += 4;\n chunks.push(data.subarray(off, off + len));\n off += len;\n }\n\n if (chunks.length < 2) {\n throw new Error(\"Expected at least 2 chunks in .fig binary\");\n }\n\n // Chunk 0: kiwi schema (deflateRaw compressed)\n const schemaData = inflateSync(chunks[0]);\n const schema = decodeBinarySchema(schemaData);\n const compiled = compileSchema(schema);\n\n // Chunk 1: message (zstd or deflateRaw — auto-detect by magic bytes)\n let msgData: Uint8Array;\n const c1 = chunks[1];\n if (c1[0] === 0x28 && c1[1] === 0xb5 && c1[2] === 0x2f && c1[3] === 0xfd) {\n msgData = zstdDecompress(c1);\n } else {\n msgData = inflateSync(c1);\n }\n const message = compiled.decodeMessage(msgData);\n\n // Build maps\n const nodes: FigNode[] = message.nodeChanges;\n const nodeMap = new Map<string, FigNode>();\n const childrenMap = new Map<string, FigNode[]>();\n\n for (const node of nodes) {\n const id = nodeId(node);\n if (id) nodeMap.set(id, node);\n }\n\n for (const node of nodes) {\n if (!node.parentIndex?.guid) continue;\n const pid = `${node.parentIndex.guid.sessionID}:${node.parentIndex.guid.localID}`;\n if (!childrenMap.has(pid)) childrenMap.set(pid, []);\n childrenMap.get(pid)!.push(node);\n }\n\n return {\n header: { prelude: prelude.trim(), version },\n nodes,\n nodeMap,\n childrenMap,\n schema,\n compiledSchema: compiled,\n rawChunks: chunks,\n message,\n images: new Map(),\n };\n}\n\n/**\n * Parse a complete .fig file (ZIP archive).\n * Extracts canvas.fig, meta.json, thumbnail.png, and images/*.\n */\nexport function parseFig(data: Uint8Array): FigDocument {\n // Check ZIP header\n if (data[0] !== 0x50 || data[1] !== 0x4b) {\n throw new Error(\"Not a valid .fig file (missing ZIP header)\");\n }\n\n const unzipped = unzipSync(data);\n\n // Find and parse canvas.fig\n const canvasKey = Object.keys(unzipped).find((k) => k.endsWith(\"canvas.fig\"));\n if (!canvasKey) {\n throw new Error(\"No canvas.fig found in .fig archive\");\n }\n const doc = parseFigBinary(unzipped[canvasKey]);\n\n // Extract meta.json\n const metaKey = Object.keys(unzipped).find((k) => k.endsWith(\"meta.json\"));\n if (metaKey) {\n try {\n doc.meta = JSON.parse(new TextDecoder().decode(unzipped[metaKey]));\n } catch { /* ignore malformed meta */ }\n }\n\n // Extract thumbnail\n const thumbKey = Object.keys(unzipped).find((k) => k.endsWith(\"thumbnail.png\"));\n if (thumbKey) {\n doc.thumbnail = unzipped[thumbKey];\n }\n\n // Extract images\n for (const key of Object.keys(unzipped)) {\n if (key.includes(\"images/\") && key !== \"images/\") {\n const filename = key.split(\"/\").pop()!;\n doc.images.set(filename, unzipped[key]);\n }\n }\n\n return doc;\n}\n","import type { FigNode } from \"./types.js\";\n\n/**\n * Returns the string ID for a node (\"sessionID:localID\"), or null if no guid.\n */\nexport function nodeId(node: FigNode): string | null {\n if (!node?.guid) return null;\n return `${node.guid.sessionID}:${node.guid.localID}`;\n}\n","/**\n * .fig file encoder — the write side of the roundtrip.\n *\n * Encodes a FigDocument back to .fig binary format.\n * Zstd compression of chunk 1 (message) is NOT included — the caller\n * provides pre-compressed bytes. This keeps openfig-core isomorphic\n * (no WASM dependency).\n *\n * Encoding flow:\n * 1. compiledSchema.encodeMessage(message) → kiwi binary\n * 2. encodeBinarySchema(schema) + deflateSync → compressed chunk 0\n * 3. Caller zstd-compresses the message → compressed chunk 1\n * 4. assembleCanvasFig() builds the binary\n * 5. createFigZip() packages into ZIP\n */\n\nimport { deflateSync, zipSync } from \"fflate\";\nimport { encodeBinarySchema } from \"kiwi-schema\";\nimport type { FigDocument } from \"./types.js\";\n\nexport interface EncodedFigParts {\n /** deflateRaw-compressed kiwi schema (ready for chunk 0) */\n schemaCompressed: Uint8Array;\n /** Raw kiwi-encoded message — caller MUST zstd-compress this for chunk 1 */\n messageRaw: Uint8Array;\n /** Original prelude string (e.g., \"fig-kiwi\") */\n prelude: string;\n /** Original version number */\n version: number;\n /** Passthrough chunks (rawChunks[2+]) — included as-is */\n passThrough: Uint8Array[];\n}\n\nexport interface AssembleCanvasFigInput {\n prelude: string;\n version: number;\n schemaCompressed: Uint8Array;\n messageCompressed: Uint8Array;\n passThrough?: Uint8Array[];\n}\n\nexport interface CreateFigZipInput {\n canvasFig: Uint8Array;\n meta?: Record<string, any>;\n thumbnail?: Uint8Array;\n images?: Map<string, Uint8Array>;\n}\n\n/**\n * Encode a FigDocument into parts ready for assembly.\n * The message is returned as raw kiwi bytes — caller must zstd-compress it.\n */\nexport function encodeFigParts(doc: FigDocument): EncodedFigParts {\n if (!doc.compiledSchema || !doc.message) {\n throw new Error(\"FigDocument missing compiledSchema or message — cannot encode\");\n }\n if (!doc.schema) {\n throw new Error(\"FigDocument missing schema — cannot encode\");\n }\n\n // Encode kiwi message\n const messageRaw = new Uint8Array(doc.compiledSchema.encodeMessage(doc.message));\n\n // Encode + deflateRaw-compress kiwi schema\n const schemaRaw = encodeBinarySchema(doc.schema);\n const schemaCompressed = deflateSync(new Uint8Array(schemaRaw));\n\n // Passthrough chunks 2+\n const passThrough = doc.rawChunks.slice(2);\n\n return {\n schemaCompressed,\n messageRaw,\n prelude: doc.header.prelude,\n version: doc.header.version,\n passThrough,\n };\n}\n\n/**\n * Assemble a canvas.fig binary from pre-compressed chunks.\n *\n * Format: [prelude 8B][version uint32 LE][len uint32 LE][chunk0][len][chunk1][len][chunk2+]...\n */\nexport function assembleCanvasFig(input: AssembleCanvasFigInput): Uint8Array {\n const { prelude, version, schemaCompressed, messageCompressed, passThrough = [] } = input;\n\n const chunks = [schemaCompressed, messageCompressed, ...passThrough];\n\n // Calculate total size: 8 (prelude) + 4 (version) + sum(4 + chunk.length)\n const headerSize = 8 + 4;\n const totalSize = chunks.reduce((sz, c) => sz + 4 + c.byteLength, headerSize);\n\n const buf = new Uint8Array(totalSize);\n const view = new DataView(buf.buffer);\n\n // Write prelude (8 bytes, padded with spaces if shorter)\n let off = 0;\n const enc = new TextEncoder();\n const preludeBytes = enc.encode(prelude);\n buf.set(preludeBytes, 0);\n // Pad to 8 bytes if needed\n for (let i = preludeBytes.length; i < 8; i++) {\n buf[i] = 0x20; // space\n }\n off = 8;\n\n // Write version (uint32 LE)\n view.setUint32(off, version, true);\n off += 4;\n\n // Write length-prefixed chunks\n for (const chunk of chunks) {\n view.setUint32(off, chunk.byteLength, true);\n off += 4;\n buf.set(chunk, off);\n off += chunk.byteLength;\n }\n\n return buf;\n}\n\n/**\n * Create a .fig/.deck ZIP archive from canvas.fig + optional metadata.\n * Uses store mode (no compression) via fflate.\n */\nexport function createFigZip(input: CreateFigZipInput): Uint8Array {\n const opts: Record<string, [Uint8Array, { level: 0 }]> = {};\n\n opts[\"canvas.fig\"] = [input.canvasFig, { level: 0 }];\n\n if (input.meta) {\n opts[\"meta.json\"] = [new TextEncoder().encode(JSON.stringify(input.meta)), { level: 0 }];\n }\n\n if (input.thumbnail) {\n opts[\"thumbnail.png\"] = [input.thumbnail, { level: 0 }];\n }\n\n if (input.images) {\n for (const [name, data] of input.images) {\n opts[`images/${name}`] = [data, { level: 0 }];\n }\n }\n\n return zipSync(opts);\n}\n","/** Pre-built empty .fig template — generated by src/utilities/generateTemplate.ts */\n/** @deprecated-backup Figma-derived blob (kept for rollback only):\n * UEsDBBQAAAAAALu8cFyLpHS2wWcAAMFnAAAKAAAAY2FudmFzLmZpZ2ZpZy1raXdpZQAAAJJlAAC0fQuY...\n */\nexport const emptyFigTemplate = \"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\";\n","/**\n * Creates an empty FigDocument by parsing a pre-built template.\n * The template was created from a valid .fig file with user content\n * marked as REMOVED — proven to open in Figma.\n */\n\nimport { parseFig } from \"./parser.js\";\nimport { emptyFigTemplate } from \"./schema.js\";\nimport type { FigDocument } from \"./types.js\";\n\nfunction b64decode(b64: string): Uint8Array {\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes;\n}\n\nexport function createEmptyFigDoc(): FigDocument {\n const bytes = b64decode(emptyFigTemplate);\n return parseFig(bytes);\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfig-core",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Isomorphic .fig file parser — reads Figma binary format in Node.js and browsers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -31,5 +31,24 @@
31
31
  "typescript": "^5.9.0",
32
32
  "vitest": "^3.0.0"
33
33
  },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/OpenFig-org/openfig-core.git"
37
+ },
38
+ "homepage": "https://github.com/OpenFig-org/openfig-core",
39
+ "bugs": {
40
+ "url": "https://github.com/OpenFig-org/openfig-core/issues"
41
+ },
42
+ "author": "rcoenen",
43
+ "keywords": [
44
+ "figma",
45
+ "fig",
46
+ "deck",
47
+ "parser",
48
+ "binary",
49
+ "kiwi",
50
+ "isomorphic",
51
+ "slides"
52
+ ],
34
53
  "license": "MIT"
35
54
  }