rtistree 0.5.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/CHANGELOG.md +15 -0
- package/LICENSE +21 -0
- package/README.md +99 -0
- package/THIRD_PARTY_NOTICES.md +25 -0
- package/dist/art-direction.d.ts +77 -0
- package/dist/art-direction.js +186 -0
- package/dist/art-direction.js.map +1 -0
- package/dist/artifacts.d.ts +24 -0
- package/dist/artifacts.js +49 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/assets.d.ts +16 -0
- package/dist/assets.js +96 -0
- package/dist/assets.js.map +1 -0
- package/dist/benchmark.d.ts +76 -0
- package/dist/benchmark.js +118 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +300 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +5315 -0
- package/dist/commands.js +591 -0
- package/dist/commands.js.map +1 -0
- package/dist/components.d.ts +20 -0
- package/dist/components.js +98 -0
- package/dist/components.js.map +1 -0
- package/dist/construction.d.ts +53 -0
- package/dist/construction.js +80 -0
- package/dist/construction.js.map +1 -0
- package/dist/critique.d.ts +44 -0
- package/dist/critique.js +45 -0
- package/dist/critique.js.map +1 -0
- package/dist/detail.d.ts +5 -0
- package/dist/detail.js +52 -0
- package/dist/detail.js.map +1 -0
- package/dist/document.d.ts +64 -0
- package/dist/document.js +56 -0
- package/dist/document.js.map +1 -0
- package/dist/export.d.ts +405 -0
- package/dist/export.js +344 -0
- package/dist/export.js.map +1 -0
- package/dist/font-inspection.d.ts +8 -0
- package/dist/font-inspection.js +34 -0
- package/dist/font-inspection.js.map +1 -0
- package/dist/graphics.d.ts +9 -0
- package/dist/graphics.js +72 -0
- package/dist/graphics.js.map +1 -0
- package/dist/history-storage.d.ts +10 -0
- package/dist/history-storage.js +59 -0
- package/dist/history-storage.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +18 -0
- package/dist/layout.js +155 -0
- package/dist/layout.js.map +1 -0
- package/dist/loader.d.ts +9 -0
- package/dist/loader.js +108 -0
- package/dist/loader.js.map +1 -0
- package/dist/mcp.d.ts +4 -0
- package/dist/mcp.js +223 -0
- package/dist/mcp.js.map +1 -0
- package/dist/merge.d.ts +6 -0
- package/dist/merge.js +49 -0
- package/dist/merge.js.map +1 -0
- package/dist/native.d.ts +3 -0
- package/dist/native.js +6 -0
- package/dist/native.js.map +1 -0
- package/dist/paint.d.ts +9 -0
- package/dist/paint.js +331 -0
- package/dist/paint.js.map +1 -0
- package/dist/path-edit.d.ts +20 -0
- package/dist/path-edit.js +30 -0
- package/dist/path-edit.js.map +1 -0
- package/dist/pdf-output.d.ts +21 -0
- package/dist/pdf-output.js +297 -0
- package/dist/pdf-output.js.map +1 -0
- package/dist/pipeline.d.ts +39 -0
- package/dist/pipeline.js +227 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/print-scene.d.ts +490 -0
- package/dist/print-scene.js +55 -0
- package/dist/print-scene.js.map +1 -0
- package/dist/production-workflow.d.ts +251 -0
- package/dist/production-workflow.js +335 -0
- package/dist/production-workflow.js.map +1 -0
- package/dist/program-worker.d.ts +1 -0
- package/dist/program-worker.js +31 -0
- package/dist/program-worker.js.map +1 -0
- package/dist/program.d.ts +85 -0
- package/dist/program.js +246 -0
- package/dist/program.js.map +1 -0
- package/dist/project-config.d.ts +91 -0
- package/dist/project-config.js +187 -0
- package/dist/project-config.js.map +1 -0
- package/dist/project.d.ts +897 -0
- package/dist/project.js +347 -0
- package/dist/project.js.map +1 -0
- package/dist/raster-edit.d.ts +61 -0
- package/dist/raster-edit.js +91 -0
- package/dist/raster-edit.js.map +1 -0
- package/dist/raster-studio.d.ts +84 -0
- package/dist/raster-studio.js +236 -0
- package/dist/raster-studio.js.map +1 -0
- package/dist/render.d.ts +79 -0
- package/dist/render.js +437 -0
- package/dist/render.js.map +1 -0
- package/dist/rich-text.d.ts +10 -0
- package/dist/rich-text.js +56 -0
- package/dist/rich-text.js.map +1 -0
- package/dist/schema.d.ts +1912 -0
- package/dist/schema.js +571 -0
- package/dist/schema.js.map +1 -0
- package/dist/spatial.d.ts +10 -0
- package/dist/spatial.js +29 -0
- package/dist/spatial.js.map +1 -0
- package/dist/studio-reference.d.ts +153 -0
- package/dist/studio-reference.js +39 -0
- package/dist/studio-reference.js.map +1 -0
- package/dist/svg.d.ts +5 -0
- package/dist/svg.js +315 -0
- package/dist/svg.js.map +1 -0
- package/dist/techniques.d.ts +74 -0
- package/dist/techniques.js +164 -0
- package/dist/techniques.js.map +1 -0
- package/dist/verify.d.ts +36 -0
- package/dist/verify.js +277 -0
- package/dist/verify.js.map +1 -0
- package/dist/viewport.d.ts +3 -0
- package/dist/viewport.js +71 -0
- package/dist/viewport.js.map +1 -0
- package/dist/workflow.d.ts +53 -0
- package/dist/workflow.js +66 -0
- package/dist/workflow.js.map +1 -0
- package/docs/agent-art-workflow.md +201 -0
- package/docs/agent-setup.md +83 -0
- package/docs/atelier.md +117 -0
- package/docs/cli-reference.md +61 -0
- package/docs/decisions/001-runtime-and-renderer.md +35 -0
- package/docs/decisions/002-composable-scenes-and-history.md +28 -0
- package/docs/decisions/003-editing-refinement-and-agent-validation.md +45 -0
- package/docs/decisions/004-print-production-and-projects.md +19 -0
- package/docs/decisions/005-programmable-digital-art.md +15 -0
- package/docs/decisions/006-staged-2d-art-production.md +13 -0
- package/docs/decisions/007-foundation-first-art-direction.md +13 -0
- package/docs/decisions/008-agent-onboarding-and-trial-lessons.md +48 -0
- package/docs/engine-overview.md +174 -0
- package/docs/evolution.md +179 -0
- package/docs/getting-started.md +107 -0
- package/docs/next-milestone.md +61 -0
- package/docs/previews/a3-production.json +36 -0
- package/docs/previews/benchmark.json +42 -0
- package/docs/previews/landscape.png +0 -0
- package/docs/previews/performance.json +24 -0
- package/docs/previews/poster.png +0 -0
- package/docs/production.md +107 -0
- package/docs/releasing.md +60 -0
- package/docs/scene-format.md +126 -0
- package/docs/studio.md +108 -0
- package/examples/hello/README.md +14 -0
- package/examples/hello/refine.json +10 -0
- package/examples/hello/render.mjs +9 -0
- package/examples/hello/scene.json +19 -0
- package/licenses/DM-Serif-Display-OFL.txt +93 -0
- package/licenses/Inter-OFL.txt +93 -0
- package/package.json +84 -0
- package/schemas/authoring.schema.json +2177 -0
- package/schemas/brief.schema.json +57 -0
- package/schemas/command.schema.json +3154 -0
- package/schemas/construction.schema.json +159 -0
- package/schemas/critique.schema.json +101 -0
- package/schemas/document.schema.json +41 -0
- package/schemas/export.schema.json +89 -0
- package/schemas/fragment.schema.json +1861 -0
- package/schemas/patch.schema.json +3177 -0
- package/schemas/pipeline.schema.json +205 -0
- package/schemas/production.schema.json +452 -0
- package/schemas/program.schema.json +152 -0
- package/schemas/project.schema.json +115 -0
- package/schemas/raster-read.schema.json +42 -0
- package/schemas/raster-write.schema.json +75 -0
- package/schemas/scene.schema.json +2014 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import PDFDocument from 'pdfkit';
|
|
2
|
+
import sharp from 'sharp';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { dirname, resolve } from 'node:path';
|
|
5
|
+
import { readFile } from 'node:fs/promises';
|
|
6
|
+
import { createCanvas } from './native.js';
|
|
7
|
+
import { registerFonts, registerProjectFonts, localAssetPath } from './assets.js';
|
|
8
|
+
import { exportLayers, resolveLayout } from './layout.js';
|
|
9
|
+
import { layoutText } from './render.js';
|
|
10
|
+
import { printScene } from './print-scene.js';
|
|
11
|
+
const alpha = (hex) => (hex.length === 9 ? parseInt(hex.slice(7), 16) / 255 : 1);
|
|
12
|
+
export async function makePdf(scene, root, renderer, preset, profile) {
|
|
13
|
+
const prepared = printScene(scene, preset.ppi), g = prepared.geometry, mark = preset.crop_marks ? 18 : 0;
|
|
14
|
+
const pageSize = g.full_mm.map((v) => (v * 72) / 25.4 + 2 * mark);
|
|
15
|
+
const doc = new PDFDocument({
|
|
16
|
+
autoFirstPage: false,
|
|
17
|
+
pdfVersion: '1.7',
|
|
18
|
+
compress: true,
|
|
19
|
+
info: {
|
|
20
|
+
Title: 'Rtistree artwork',
|
|
21
|
+
Creator: 'Rtistree',
|
|
22
|
+
CreationDate: new Date(0),
|
|
23
|
+
ModDate: new Date(0),
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
const chunks = [];
|
|
27
|
+
const completed = new Promise((resolve, reject) => {
|
|
28
|
+
doc.on('data', (b) => chunks.push(b));
|
|
29
|
+
doc.on('end', () => resolve(Buffer.concat(chunks)));
|
|
30
|
+
doc.on('error', reject);
|
|
31
|
+
});
|
|
32
|
+
doc.addPage({ size: pageSize, margin: 0 });
|
|
33
|
+
const page = doc.page;
|
|
34
|
+
page.dictionary.data.TrimBox = [
|
|
35
|
+
mark + g.bleed_pt,
|
|
36
|
+
mark + g.bleed_pt,
|
|
37
|
+
mark + g.bleed_pt + g.trim_pt[0],
|
|
38
|
+
mark + g.bleed_pt + g.trim_pt[1],
|
|
39
|
+
];
|
|
40
|
+
page.dictionary.data.BleedBox = [mark, mark, pageSize[0] - mark, pageSize[1] - mark];
|
|
41
|
+
let icc;
|
|
42
|
+
if (profile) {
|
|
43
|
+
icc = doc.ref({ N: 4 });
|
|
44
|
+
icc.end(profile.bytes);
|
|
45
|
+
const intent = doc.ref({
|
|
46
|
+
Type: 'OutputIntent',
|
|
47
|
+
S: 'GTS_PDFX',
|
|
48
|
+
OutputConditionIdentifier: new String('Project ICC profile'),
|
|
49
|
+
Info: new String('ICC-managed CMYK output; PDF/X conformance not asserted'),
|
|
50
|
+
DestOutputProfile: icc,
|
|
51
|
+
});
|
|
52
|
+
intent.end(undefined);
|
|
53
|
+
doc._root.data.OutputIntents = [intent];
|
|
54
|
+
}
|
|
55
|
+
let maximumInk = 0;
|
|
56
|
+
const colourCache = new Map();
|
|
57
|
+
async function colour(hex) {
|
|
58
|
+
if (preset.colour_space !== 'cmyk')
|
|
59
|
+
return hex.slice(0, 7);
|
|
60
|
+
if (preset.black === 'k-only' && hex.slice(0, 7).toLowerCase() === '#000000')
|
|
61
|
+
return [0, 0, 0, 100];
|
|
62
|
+
if (colourCache.has(hex))
|
|
63
|
+
return colourCache.get(hex);
|
|
64
|
+
const { data } = await sharp({
|
|
65
|
+
create: { width: 1, height: 1, channels: 3, background: hex.slice(0, 7) },
|
|
66
|
+
})
|
|
67
|
+
.withIccProfile(profile.path)
|
|
68
|
+
.toColourspace('cmyk')
|
|
69
|
+
.raw()
|
|
70
|
+
.toBuffer({ resolveWithObject: true });
|
|
71
|
+
const c = [...data].map((v) => (v / 255) * 100);
|
|
72
|
+
maximumInk = Math.max(maximumInk, c.reduce((a, b) => a + b, 0));
|
|
73
|
+
colourCache.set(hex, c);
|
|
74
|
+
return c;
|
|
75
|
+
}
|
|
76
|
+
async function raster(png, x, y, w, h) {
|
|
77
|
+
if (preset.colour_space === 'srgb') {
|
|
78
|
+
doc.image(png, x, y, { width: w, height: h });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const source = sharp(png), meta = await source.metadata();
|
|
82
|
+
const alpha = meta.hasAlpha
|
|
83
|
+
? await sharp(png).extractChannel('alpha').raw().toBuffer()
|
|
84
|
+
: undefined;
|
|
85
|
+
const { data, info } = await source
|
|
86
|
+
.removeAlpha()
|
|
87
|
+
.withIccProfile(profile.path)
|
|
88
|
+
.toColourspace('cmyk')
|
|
89
|
+
.raw()
|
|
90
|
+
.toBuffer({ resolveWithObject: true });
|
|
91
|
+
for (let i = 0; i < data.length; i += 4)
|
|
92
|
+
maximumInk = Math.max(maximumInk, ((data[i] + data[i + 1] + data[i + 2] + data[i + 3]) / 255) * 100);
|
|
93
|
+
let smask;
|
|
94
|
+
if (alpha) {
|
|
95
|
+
smask = doc.ref({
|
|
96
|
+
Type: 'XObject',
|
|
97
|
+
Subtype: 'Image',
|
|
98
|
+
Width: info.width,
|
|
99
|
+
Height: info.height,
|
|
100
|
+
ColorSpace: 'DeviceGray',
|
|
101
|
+
BitsPerComponent: 8,
|
|
102
|
+
});
|
|
103
|
+
smask.end(alpha);
|
|
104
|
+
}
|
|
105
|
+
const ref = doc.ref({
|
|
106
|
+
Type: 'XObject',
|
|
107
|
+
Subtype: 'Image',
|
|
108
|
+
Width: info.width,
|
|
109
|
+
Height: info.height,
|
|
110
|
+
ColorSpace: ['ICCBased', icc],
|
|
111
|
+
BitsPerComponent: 8,
|
|
112
|
+
...(smask ? { SMask: smask } : {}),
|
|
113
|
+
});
|
|
114
|
+
ref.end(data);
|
|
115
|
+
const name = `Rt${Object.keys(page.xobjects).length}`;
|
|
116
|
+
page.xobjects[name] = ref;
|
|
117
|
+
doc
|
|
118
|
+
.save()
|
|
119
|
+
.transform(w, 0, 0, -h, x, y + h)
|
|
120
|
+
.addContent(`/${name} Do`)
|
|
121
|
+
.restore();
|
|
122
|
+
}
|
|
123
|
+
await registerFonts();
|
|
124
|
+
const aliases = (await registerProjectFonts(scene, root)).aliases;
|
|
125
|
+
const fontPath = async (n) => {
|
|
126
|
+
const s = n.layer.style, custom = scene.fonts?.[s.font];
|
|
127
|
+
if (custom)
|
|
128
|
+
return readFile(await localAssetPath(root, custom.source));
|
|
129
|
+
const pkg = s.font === 'display' ? '@fontsource/dm-serif-display' : '@fontsource/inter', filename = s.font === 'display'
|
|
130
|
+
? 'dm-serif-display-latin-400-normal.woff'
|
|
131
|
+
: `inter-latin-${s.weight === 'bold' ? 700 : 400}-normal.woff`;
|
|
132
|
+
return readFile(resolve(dirname(createRequire(import.meta.url).resolve(`${pkg}/package.json`)), 'files', filename));
|
|
133
|
+
};
|
|
134
|
+
const vectorIds = [], rasterIds = [];
|
|
135
|
+
const simple = (n) => (['text', 'vector'].includes(n.layer.type) ||
|
|
136
|
+
(n.layer.type === 'procedural' && n.layer.generator?.type !== 'noise')) &&
|
|
137
|
+
!n.layer.mask &&
|
|
138
|
+
!n.layer.effects.length &&
|
|
139
|
+
!n.layer.operations.length &&
|
|
140
|
+
!n.layer.tiles.length &&
|
|
141
|
+
!n.layer.regions?.length &&
|
|
142
|
+
n.layer.blend_mode === 'normal';
|
|
143
|
+
// Any adjustment or backdrop blend needs the composite. Ordinary top-level layers remain separate.
|
|
144
|
+
const hybrid = preset.mode === 'hybrid' &&
|
|
145
|
+
!scene.layers.some((l) => l.type === 'adjustment' || l.blend_mode !== 'normal');
|
|
146
|
+
const sx = g.trim_pt[0] / scene.canvas.width, sy = g.trim_pt[1] / scene.canvas.height;
|
|
147
|
+
doc
|
|
148
|
+
.save()
|
|
149
|
+
.rect(mark, mark, pageSize[0] - 2 * mark, pageSize[1] - 2 * mark)
|
|
150
|
+
.clip();
|
|
151
|
+
const backgroundAlpha = alpha(scene.canvas.background);
|
|
152
|
+
const background = '#' +
|
|
153
|
+
[1, 3, 5]
|
|
154
|
+
.map((i) => Math.round(parseInt(scene.canvas.background.slice(i, i + 2), 16) * backgroundAlpha +
|
|
155
|
+
parseInt(preset.background.slice(i, i + 2), 16) * (1 - backgroundAlpha))
|
|
156
|
+
.toString(16)
|
|
157
|
+
.padStart(2, '0'))
|
|
158
|
+
.join('');
|
|
159
|
+
doc
|
|
160
|
+
.rect(mark, mark, pageSize[0] - 2 * mark, pageSize[1] - 2 * mark)
|
|
161
|
+
.fill(await colour(background));
|
|
162
|
+
if (!hybrid) {
|
|
163
|
+
const r = await renderer.render(prepared.scene, root, { cache: false, ...prepared.options });
|
|
164
|
+
await raster(r.png, mark, mark, pageSize[0] - mark * 2, pageSize[1] - mark * 2);
|
|
165
|
+
rasterIds.push(...scene.layers.map((l) => l.id));
|
|
166
|
+
}
|
|
167
|
+
else
|
|
168
|
+
for (const n of exportLayers(resolveLayout(scene))) {
|
|
169
|
+
if (!n.layer.visible)
|
|
170
|
+
continue;
|
|
171
|
+
const l = n.layer;
|
|
172
|
+
if (!simple(n)) {
|
|
173
|
+
const r = await renderer.render(prepared.scene, root, {
|
|
174
|
+
cache: false,
|
|
175
|
+
...prepared.options,
|
|
176
|
+
layer: l.id,
|
|
177
|
+
});
|
|
178
|
+
await raster(r.png, mark, mark, pageSize[0] - 2 * mark, pageSize[1] - 2 * mark);
|
|
179
|
+
rasterIds.push(l.id);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
vectorIds.push(l.id);
|
|
183
|
+
doc
|
|
184
|
+
.save()
|
|
185
|
+
.translate(mark + g.bleed_pt, mark + g.bleed_pt)
|
|
186
|
+
.scale(sx, sy)
|
|
187
|
+
.transform(...n.matrix)
|
|
188
|
+
.opacity(l.opacity);
|
|
189
|
+
const w = n.bounds[2], h = n.bounds[3];
|
|
190
|
+
if (l.type === 'procedural') {
|
|
191
|
+
const auto = scene.layers.includes(l) && !l.bounds && !l.width && !l.height, x = auto ? -g.bleed_pt / sx : 0, y = auto ? -g.bleed_pt / sy : 0, dw = auto ? w + (2 * g.bleed_pt) / sx : w, dh = auto ? h + (2 * g.bleed_pt) / sy : h;
|
|
192
|
+
const gen = l.generator;
|
|
193
|
+
if (gen.type === 'solid')
|
|
194
|
+
doc
|
|
195
|
+
.fillOpacity(l.opacity * alpha(gen.colour))
|
|
196
|
+
.rect(x, y, dw, dh)
|
|
197
|
+
.fill(await colour(gen.colour));
|
|
198
|
+
else if (gen.type === 'gradient') {
|
|
199
|
+
const angle = (gen.angle * Math.PI) / 180, dx = Math.cos(angle), dy = Math.sin(angle), span = Math.abs(dw * dx) + Math.abs(dh * dy);
|
|
200
|
+
const gradient = doc
|
|
201
|
+
.linearGradient(x + dw / 2 - (dx * span) / 2, y + dh / 2 - (dy * span) / 2, x + dw / 2 + (dx * span) / 2, y + dh / 2 + (dy * span) / 2)
|
|
202
|
+
.stop(0, (await colour(gen.from)), alpha(gen.from))
|
|
203
|
+
.stop(1, (await colour(gen.to)), alpha(gen.to));
|
|
204
|
+
doc.rect(x, y, dw, dh).fill(gradient);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else if (l.shape) {
|
|
208
|
+
const s = l.shape;
|
|
209
|
+
doc.fillColor(await colour(s.fill), l.opacity * alpha(s.fill));
|
|
210
|
+
if (s.dash?.length)
|
|
211
|
+
doc.addContent(`[${s.dash.join(' ')}] ${s.dash_offset ?? 0} d`);
|
|
212
|
+
if (s.type === 'rectangle')
|
|
213
|
+
doc.roundedRect(0, 0, w, h, Math.min(s.radius, w / 2, h / 2));
|
|
214
|
+
else if (s.type === 'ellipse')
|
|
215
|
+
doc.ellipse(w / 2, h / 2, w / 2, h / 2);
|
|
216
|
+
else
|
|
217
|
+
doc.path(s.d);
|
|
218
|
+
if (s.stroke)
|
|
219
|
+
doc
|
|
220
|
+
.lineWidth(s.stroke_width)
|
|
221
|
+
.lineCap(s.line_cap ?? 'butt')
|
|
222
|
+
.lineJoin(s.line_join ?? 'miter')
|
|
223
|
+
.strokeColor(await colour(s.stroke), l.opacity * alpha(s.stroke))
|
|
224
|
+
.fillAndStroke();
|
|
225
|
+
else
|
|
226
|
+
doc.fill();
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
const ctx = createCanvas(1, 1).getContext('2d'), layout = layoutText(ctx, l, w, h, aliases), s = l.style;
|
|
230
|
+
doc
|
|
231
|
+
.rect(0, 0, w, h)
|
|
232
|
+
.clip()
|
|
233
|
+
.font(await fontPath(n))
|
|
234
|
+
.fontSize(s.size)
|
|
235
|
+
.fillColor(await colour(s.colour), l.opacity * alpha(s.colour));
|
|
236
|
+
for (let i = 0; i < layout.lines.length; i++) {
|
|
237
|
+
if (layout.spans) {
|
|
238
|
+
for (const span of layout.spans[i]) {
|
|
239
|
+
const node = { ...n, layer: { ...l, style: { ...s, weight: span.weight } } };
|
|
240
|
+
doc
|
|
241
|
+
.font(await fontPath(node))
|
|
242
|
+
.fontSize(s.size)
|
|
243
|
+
.fillColor(await colour(span.colour), l.opacity * alpha(span.colour))
|
|
244
|
+
.text(span.text, span.x, i * s.size * s.line_height, {
|
|
245
|
+
lineBreak: false,
|
|
246
|
+
baseline: 'top',
|
|
247
|
+
characterSpacing: s.tracking ?? 0,
|
|
248
|
+
features: (s.kerning === false
|
|
249
|
+
? { kern: false }
|
|
250
|
+
: ['kern']),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
const line = layout.lines[i], width = ctx.measureText(line).width, x = s.align === 'center' ? (w - width) / 2 : s.align === 'right' ? w - width : 0;
|
|
256
|
+
doc.text(line, x, i * s.size * s.line_height, {
|
|
257
|
+
lineBreak: false,
|
|
258
|
+
baseline: 'top',
|
|
259
|
+
characterSpacing: s.tracking ?? 0,
|
|
260
|
+
features: (s.kerning === false
|
|
261
|
+
? { kern: false }
|
|
262
|
+
: ['kern']),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
doc.restore();
|
|
268
|
+
}
|
|
269
|
+
doc.restore();
|
|
270
|
+
if (mark) {
|
|
271
|
+
doc.strokeColor(preset.colour_space === 'cmyk' ? [0, 0, 0, 100] : '#000000').lineWidth(0.25);
|
|
272
|
+
const x0 = mark + g.bleed_pt, x1 = x0 + g.trim_pt[0], y0 = mark + g.bleed_pt, y1 = y0 + g.trim_pt[1];
|
|
273
|
+
for (const x of [x0, x1]) {
|
|
274
|
+
doc
|
|
275
|
+
.moveTo(x, 2)
|
|
276
|
+
.lineTo(x, mark - 3)
|
|
277
|
+
.moveTo(x, pageSize[1] - mark + 3)
|
|
278
|
+
.lineTo(x, pageSize[1] - 2);
|
|
279
|
+
}
|
|
280
|
+
for (const y of [y0, y1])
|
|
281
|
+
doc
|
|
282
|
+
.moveTo(2, y)
|
|
283
|
+
.lineTo(mark - 3, y)
|
|
284
|
+
.moveTo(pageSize[0] - mark + 3, y)
|
|
285
|
+
.lineTo(pageSize[0] - 2, y);
|
|
286
|
+
doc.stroke();
|
|
287
|
+
}
|
|
288
|
+
doc.end();
|
|
289
|
+
return {
|
|
290
|
+
bytes: await completed,
|
|
291
|
+
vector_layers: vectorIds,
|
|
292
|
+
raster_layers: rasterIds,
|
|
293
|
+
geometry: g,
|
|
294
|
+
maximum_ink_percent: maximumInk,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=pdf-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-output.js","sourceRoot":"","sources":["../src/pdf-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Project } from './project.js';
|
|
3
|
+
export declare const studioId: z.ZodString;
|
|
4
|
+
export declare const pipelineSchema: z.ZodObject<{
|
|
5
|
+
version: z.ZodLiteral<1>;
|
|
6
|
+
id: z.ZodString;
|
|
7
|
+
shared: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
|
|
8
|
+
nodes: z.ZodArray<z.ZodObject<{
|
|
9
|
+
id: z.ZodString;
|
|
10
|
+
source: z.ZodOptional<z.ZodString>;
|
|
11
|
+
code: z.ZodOptional<z.ZodString>;
|
|
12
|
+
width: z.ZodNumber;
|
|
13
|
+
height: z.ZodNumber;
|
|
14
|
+
seed: z.ZodDefault<z.ZodNumber>;
|
|
15
|
+
parameters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
|
|
16
|
+
bindings: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
17
|
+
inputs: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
|
|
18
|
+
node: z.ZodString;
|
|
19
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
20
|
+
asset: z.ZodString;
|
|
21
|
+
}, z.core.$strict>]>>>;
|
|
22
|
+
target: z.ZodOptional<z.ZodString>;
|
|
23
|
+
timeout_ms: z.ZodDefault<z.ZodNumber>;
|
|
24
|
+
}, z.core.$strict>>;
|
|
25
|
+
}, z.core.$strict>;
|
|
26
|
+
export type Pipeline = z.infer<typeof pipelineSchema>;
|
|
27
|
+
/** Managed state is scoped to the scene entry point and checked against symlink escapes. */
|
|
28
|
+
export declare function studioDirectory(project: Project, ...parts: string[]): Promise<string>;
|
|
29
|
+
export declare function buildPipeline(project: Project, raw: unknown, expected_hash?: string): Promise<{
|
|
30
|
+
pipeline: string;
|
|
31
|
+
scene_hash: string;
|
|
32
|
+
nodes: {
|
|
33
|
+
id: string;
|
|
34
|
+
status: 'built' | 'cached';
|
|
35
|
+
key: string;
|
|
36
|
+
output_hash: string;
|
|
37
|
+
}[];
|
|
38
|
+
changed: boolean;
|
|
39
|
+
}>;
|
package/dist/pipeline.js
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { readFile, mkdir, realpath } from 'node:fs/promises';
|
|
2
|
+
import { join, dirname, relative } from 'node:path';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { canonical, localAssetPath, sha256, sceneHash } from './assets.js';
|
|
5
|
+
import { writeArtifact } from './artifacts.js';
|
|
6
|
+
import { bakeProgram, programSchema, PROGRAM_VERSION } from './program.js';
|
|
7
|
+
import { TECHNIQUE_VERSION } from './techniques.js';
|
|
8
|
+
import { projectPath } from './project-config.js';
|
|
9
|
+
import { flattenLayers, assetSchema } from './schema.js';
|
|
10
|
+
export const studioId = z.string().regex(/^[a-zA-Z][a-zA-Z0-9_-]{0,79}$/);
|
|
11
|
+
export const pipelineSchema = z.strictObject({
|
|
12
|
+
version: z.literal(1),
|
|
13
|
+
id: studioId,
|
|
14
|
+
shared: z.record(studioId, z.json()).default({}),
|
|
15
|
+
nodes: z
|
|
16
|
+
.array(z.strictObject({
|
|
17
|
+
id: studioId,
|
|
18
|
+
source: z.string().min(1).optional(),
|
|
19
|
+
code: z.string().min(1).max(262144).optional(),
|
|
20
|
+
width: z.number().int().min(1).max(8192),
|
|
21
|
+
height: z.number().int().min(1).max(8192),
|
|
22
|
+
seed: z.number().int().min(0).max(0xffffffff).default(0),
|
|
23
|
+
parameters: z.record(studioId, z.json()).default({}),
|
|
24
|
+
bindings: z.record(studioId, studioId).default({}),
|
|
25
|
+
inputs: z
|
|
26
|
+
.record(studioId, z.union([z.strictObject({ node: studioId }), z.strictObject({ asset: studioId })]))
|
|
27
|
+
.default({}),
|
|
28
|
+
target: studioId.optional(),
|
|
29
|
+
timeout_ms: z.number().int().min(50).max(30000).default(10000),
|
|
30
|
+
}))
|
|
31
|
+
.min(1)
|
|
32
|
+
.max(32),
|
|
33
|
+
});
|
|
34
|
+
/** Managed state is scoped to the scene entry point and checked against symlink escapes. */
|
|
35
|
+
export async function studioDirectory(project, ...parts) {
|
|
36
|
+
const path = join(project.root, 'studio', sha256(relative(project.root, project.source.file)).slice(7, 23), ...parts);
|
|
37
|
+
let parent = dirname(path);
|
|
38
|
+
for (;;) {
|
|
39
|
+
try {
|
|
40
|
+
projectPath(project.root, relative(project.root, await realpath(parent)));
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
if (e.code !== 'ENOENT')
|
|
45
|
+
throw e;
|
|
46
|
+
parent = dirname(parent);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
await mkdir(dirname(path), { recursive: true });
|
|
50
|
+
return path;
|
|
51
|
+
}
|
|
52
|
+
export async function buildPipeline(project, raw, expected_hash) {
|
|
53
|
+
const graph = pipelineSchema.parse(raw), scene = await project.scene(), before = sceneHash(scene);
|
|
54
|
+
if (expected_hash && expected_hash !== before)
|
|
55
|
+
throw new Error('Stale scene hash');
|
|
56
|
+
const byId = new Map(graph.nodes.map((n) => [n.id, n]));
|
|
57
|
+
if (byId.size !== graph.nodes.length)
|
|
58
|
+
throw new Error('Duplicate pipeline node');
|
|
59
|
+
const targets = graph.nodes.flatMap((n) => (n.target ? [n.target] : []));
|
|
60
|
+
if (new Set(targets).size !== targets.length)
|
|
61
|
+
throw new Error('Duplicate pipeline target');
|
|
62
|
+
const ordered = [], visiting = new Set(), visited = new Set();
|
|
63
|
+
function visit(id) {
|
|
64
|
+
if (visiting.has(id))
|
|
65
|
+
throw new Error(`Pipeline cycle at ${id}`);
|
|
66
|
+
if (visited.has(id))
|
|
67
|
+
return;
|
|
68
|
+
const n = byId.get(id);
|
|
69
|
+
if (!n)
|
|
70
|
+
throw new Error(`Unknown pipeline dependency ${id}`);
|
|
71
|
+
if (Boolean(n.code) === Boolean(n.source))
|
|
72
|
+
throw new Error('Each node requires exactly one code or source');
|
|
73
|
+
visiting.add(id);
|
|
74
|
+
for (const input of Object.values(n.inputs))
|
|
75
|
+
if ('node' in input)
|
|
76
|
+
visit(input.node);
|
|
77
|
+
visiting.delete(id);
|
|
78
|
+
visited.add(id);
|
|
79
|
+
ordered.push(n);
|
|
80
|
+
}
|
|
81
|
+
graph.nodes.forEach((n) => visit(n.id));
|
|
82
|
+
const assets = { ...scene.assets }, results = [];
|
|
83
|
+
const commands = [];
|
|
84
|
+
const sources = new Map();
|
|
85
|
+
const generatedIds = new Set(graph.nodes.map((n) => `${graph.id}_${n.id}`));
|
|
86
|
+
for (const node of graph.nodes) {
|
|
87
|
+
studioId.parse(`${graph.id}_${node.id}`);
|
|
88
|
+
for (const input of Object.values(node.inputs))
|
|
89
|
+
if ('asset' in input && generatedIds.has(input.asset))
|
|
90
|
+
throw new Error('Use a node reference for pipeline-produced inputs');
|
|
91
|
+
}
|
|
92
|
+
for (const node of ordered) {
|
|
93
|
+
const code = node.code ?? (await readFile(await localAssetPath(project.root, node.source), 'utf8'));
|
|
94
|
+
sources.set(node.id, code);
|
|
95
|
+
const parameters = { ...node.parameters };
|
|
96
|
+
for (const [name, key] of Object.entries(node.bindings)) {
|
|
97
|
+
if (!Object.hasOwn(graph.shared, key))
|
|
98
|
+
throw new Error(`Missing shared parameter ${key}`);
|
|
99
|
+
parameters[name] = graph.shared[key];
|
|
100
|
+
}
|
|
101
|
+
const inputs = {}, hashes = {};
|
|
102
|
+
for (const [name, input] of Object.entries(node.inputs)) {
|
|
103
|
+
const id = 'node' in input ? `${graph.id}_${input.node}` : input.asset;
|
|
104
|
+
const asset = assets[id];
|
|
105
|
+
if (!asset)
|
|
106
|
+
throw new Error(`Unknown pipeline input ${id}`);
|
|
107
|
+
const bytes = await readFile(await localAssetPath(project.root, asset.source));
|
|
108
|
+
if (asset.hash && asset.hash !== sha256(bytes))
|
|
109
|
+
throw new Error('Pipeline input hash mismatch');
|
|
110
|
+
inputs[name] = id;
|
|
111
|
+
hashes[name] = sha256(bytes);
|
|
112
|
+
}
|
|
113
|
+
const asset_id = `${graph.id}_${node.id}`;
|
|
114
|
+
const spec = programSchema.parse({
|
|
115
|
+
code,
|
|
116
|
+
parameters,
|
|
117
|
+
inputs,
|
|
118
|
+
asset_id,
|
|
119
|
+
width: node.width,
|
|
120
|
+
height: node.height,
|
|
121
|
+
seed: node.seed,
|
|
122
|
+
timeout_ms: node.timeout_ms,
|
|
123
|
+
reason: `Build ${graph.id}/${node.id}`,
|
|
124
|
+
});
|
|
125
|
+
const key = sha256(canonical({
|
|
126
|
+
code,
|
|
127
|
+
parameters,
|
|
128
|
+
inputs: hashes,
|
|
129
|
+
width: node.width,
|
|
130
|
+
height: node.height,
|
|
131
|
+
seed: node.seed,
|
|
132
|
+
timeout_ms: node.timeout_ms,
|
|
133
|
+
runtime: {
|
|
134
|
+
program: PROGRAM_VERSION,
|
|
135
|
+
techniques: TECHNIQUE_VERSION,
|
|
136
|
+
node: process.version,
|
|
137
|
+
skia: '1.0.8',
|
|
138
|
+
},
|
|
139
|
+
}));
|
|
140
|
+
const cache = await studioDirectory(project, 'cache', key.slice(7) + '.json');
|
|
141
|
+
let asset;
|
|
142
|
+
try {
|
|
143
|
+
const cached = JSON.parse(await readFile(await localAssetPath(project.root, relative(project.root, cache)), 'utf8'));
|
|
144
|
+
if (cached.key !== key)
|
|
145
|
+
throw new Error('Cache key mismatch');
|
|
146
|
+
asset = assetSchema.parse(cached.asset);
|
|
147
|
+
if (!asset.hash || !asset.recipe)
|
|
148
|
+
throw new Error('Incomplete cache');
|
|
149
|
+
if (sha256(await readFile(await localAssetPath(project.root, asset.source))) !== asset.hash ||
|
|
150
|
+
sha256(await readFile(await localAssetPath(project.root, asset.recipe.source))) !==
|
|
151
|
+
asset.recipe.hash)
|
|
152
|
+
throw new Error('Corrupt cache');
|
|
153
|
+
const recipe = JSON.parse(await readFile(await localAssetPath(project.root, asset.recipe.source), 'utf8'));
|
|
154
|
+
if (recipe.source !== code ||
|
|
155
|
+
recipe.source_hash !== sha256(code) ||
|
|
156
|
+
recipe.output_hash !== asset.hash ||
|
|
157
|
+
recipe.width !== spec.width ||
|
|
158
|
+
recipe.height !== spec.height ||
|
|
159
|
+
recipe.seed !== spec.seed ||
|
|
160
|
+
recipe.timeout_ms !== spec.timeout_ms ||
|
|
161
|
+
canonical(recipe.parameters) !== canonical(parameters))
|
|
162
|
+
throw new Error('Cache recipe does not match the requested program');
|
|
163
|
+
for (const input of Object.values(recipe.inputs))
|
|
164
|
+
if (sha256(await readFile(await localAssetPath(project.root, join(dirname(asset.recipe.source), input.source)))) !== input.hash)
|
|
165
|
+
throw new Error('Corrupt cache input');
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
asset = undefined;
|
|
169
|
+
}
|
|
170
|
+
const status = asset ? 'cached' : 'built';
|
|
171
|
+
if (!asset) {
|
|
172
|
+
asset = assetSchema.parse((await bakeProgram(project.root, spec, assets)).asset);
|
|
173
|
+
await writeArtifact(cache, canonical({ key, asset }));
|
|
174
|
+
}
|
|
175
|
+
assets[asset_id] = asset;
|
|
176
|
+
results.push({ id: node.id, status, key, output_hash: asset.hash });
|
|
177
|
+
if (canonical(scene.assets[asset_id] ?? null) !== canonical(asset))
|
|
178
|
+
commands.push({ type: 'registerAsset', id: asset_id, asset });
|
|
179
|
+
}
|
|
180
|
+
// Preserve authored node order for painter's compositing order, independently of DAG traversal.
|
|
181
|
+
for (const node of graph.nodes)
|
|
182
|
+
if (node.target) {
|
|
183
|
+
const id = `${graph.id}_${node.id}`, target = flattenLayers(scene.layers).find((l) => l.id === node.target);
|
|
184
|
+
if (target?.source === id)
|
|
185
|
+
continue;
|
|
186
|
+
commands.push(target
|
|
187
|
+
? { type: 'setSource', target: node.target, source: id }
|
|
188
|
+
: {
|
|
189
|
+
type: 'addLayer',
|
|
190
|
+
layer: {
|
|
191
|
+
id: node.target,
|
|
192
|
+
type: 'raster',
|
|
193
|
+
source: id,
|
|
194
|
+
bounds: [0, 0, scene.canvas.width, scene.canvas.height],
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
// Pin editable inline code and bindings with the scene so candidate restoration restores its build graph.
|
|
199
|
+
const frozen = {
|
|
200
|
+
...graph,
|
|
201
|
+
nodes: graph.nodes.map((n) => {
|
|
202
|
+
const { source, ...rest } = n;
|
|
203
|
+
return { ...rest, code: sources.get(n.id) };
|
|
204
|
+
}),
|
|
205
|
+
};
|
|
206
|
+
const next = structuredClone(scene);
|
|
207
|
+
const { applyCommand } = await import('./commands.js');
|
|
208
|
+
let changed = next;
|
|
209
|
+
for (const command of commands)
|
|
210
|
+
changed = applyCommand(changed, command);
|
|
211
|
+
changed.metadata = {
|
|
212
|
+
...changed.metadata,
|
|
213
|
+
[`pipeline_${graph.id}`]: JSON.parse(canonical(frozen)),
|
|
214
|
+
};
|
|
215
|
+
if (sceneHash(changed) === before) {
|
|
216
|
+
if (sceneHash(await project.scene()) !== before)
|
|
217
|
+
throw new Error('Stale scene hash');
|
|
218
|
+
return { pipeline: graph.id, scene_hash: before, nodes: results, changed: false };
|
|
219
|
+
}
|
|
220
|
+
const entry = await project.apply({
|
|
221
|
+
reason: `Rebuild pipeline ${graph.id}`,
|
|
222
|
+
expected_hash: before,
|
|
223
|
+
commands: [{ type: 'restoreScene', scene: changed }],
|
|
224
|
+
});
|
|
225
|
+
return { pipeline: graph.id, scene_hash: entry.after_hash, nodes: results, changed: true };
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,YAAY,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,EAAE,EAAE,QAAQ;IACZ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,KAAK,EAAE,CAAC;SACL,KAAK,CACJ,CAAC,CAAC,YAAY,CAAC;QACb,EAAE,EAAE,QAAQ;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;QAC9C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACxD,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAClD,MAAM,EAAE,CAAC;aACN,MAAM,CACL,QAAQ,EACR,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CACnF;aACA,OAAO,CAAC,EAAE,CAAC;QACd,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE;QAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;KAC/D,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;CACX,CAAC,CAAC;AAEH,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAgB,EAAE,GAAG,KAAe;IACxE,MAAM,IAAI,GAAG,IAAI,CACf,OAAO,CAAC,IAAI,EACZ,QAAQ,EACR,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAChE,GAAG,KAAK,CACT,CAAC;IACF,IAAI,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,SAAS,CAAC;QACR,IAAI,CAAC;YACH,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM;QACR,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAgB,EAAE,GAAY,EAAE,aAAsB;IACxF,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,EACrC,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,EAC7B,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,aAAa,IAAI,aAAa,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAsB,EAAE,EACnC,QAAQ,GAAG,IAAI,GAAG,EAAU,EAC5B,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,SAAS,KAAK,CAAC,EAAU;QACvB,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,IAAI,MAAM,IAAI,KAAK;gBAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,EAChC,OAAO,GAAmF,EAAE,CAAC;IAC/F,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5E,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5C,IAAI,OAAO,IAAI,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,MAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;YAC1F,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAE,CAAC;QACxC,CAAC;QACD,MAAM,MAAM,GAA2B,EAAE,EACvC,MAAM,GAA2B,EAAE,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,MAAM,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/E,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC;YAC/B,IAAI;YACJ,UAAU;YACV,MAAM;YACN,QAAQ;YACR,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE;SACvC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAChB,SAAS,CAAC;YACR,IAAI;YACJ,UAAU;YACV,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE;gBACP,OAAO,EAAE,eAAe;gBACxB,UAAU,EAAE,iBAAiB;gBAC7B,IAAI,EAAE,OAAO,CAAC,OAAO;gBACrB,IAAI,EAAE,OAAO;aACd;SACF,CAAC,CACH,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;QAC9E,IAAI,KAA8C,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,MAAM,QAAQ,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAC1F,CAAC;YACF,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC9D,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtE,IACE,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI;gBACvF,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC7E,KAAK,CAAC,MAAM,CAAC,IAAI;gBAEnB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,MAAM,QAAQ,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CACxC,CAAC;YAC1C,IACE,MAAM,CAAC,MAAM,KAAK,IAAI;gBACtB,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,IAAI,CAAC;gBACnC,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,IAAI;gBACjC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;gBAC3B,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;gBAC7B,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;gBACzB,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU;gBACrC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC,UAAU,CAAC;gBAEtD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC9C,IACE,MAAM,CACJ,MAAM,QAAQ,CACZ,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CACrF,CACF,KAAK,KAAK,CAAC,IAAI;oBAEhB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACjF,MAAM,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,IAAK,EAAE,CAAC,CAAC;QACrE,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC;YAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,gGAAgG;IAChG,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK;QAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,EACjC,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;YACzE,IAAI,MAAM,EAAE,MAAM,KAAK,EAAE;gBAAE,SAAS;YACpC,QAAQ,CAAC,IAAI,CACX,MAAM;gBACJ,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;gBACxD,CAAC,CAAC;oBACE,IAAI,EAAE,UAAU;oBAChB,KAAK,EAAE;wBACL,EAAE,EAAE,IAAI,CAAC,MAAM;wBACf,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,EAAE;wBACV,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;qBACxD;iBACF,CACN,CAAC;QACJ,CAAC;IACH,0GAA0G;IAC1G,MAAM,MAAM,GAAG;QACb,GAAG,KAAK;QACR,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YAC9B,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,EAAE,CAAC;QAC/C,CAAC,CAAC;KACH,CAAC;IACF,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IACvD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,CAAC,QAAQ,GAAG;QACjB,GAAG,OAAO,CAAC,QAAQ;QACnB,CAAC,YAAY,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;KACxD,CAAC;IACF,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;QAClC,IAAI,SAAS,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACrF,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACpF,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;QAChC,MAAM,EAAE,oBAAoB,KAAK,CAAC,EAAE,EAAE;QACtC,aAAa,EAAE,MAAM;QACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;KACrD,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC7F,CAAC"}
|