From fd5779e67ddbf137a2480dd6efb197eecd81e20c Mon Sep 17 00:00:00 2001 From: Kristofer Jussmann Date: Wed, 29 Jul 2026 14:40:11 +0300 Subject: [PATCH 1/2] docs: add persistent MCP client skill setup --- CHANGELOG.md | 9 + README.md | 28 +- data/tool-guides/aesthetic-quality-guide.md | 133 ----- data/tool-guides/animation-guide.md | 246 --------- .../architectural-completeness-guide.md | 116 ----- data/tool-guides/blend-file-health-guide.md | 47 -- data/tool-guides/blender-docs-lookup-guide.md | 37 -- data/tool-guides/camera-guide.md | 100 ---- data/tool-guides/execute-code-guide.md | 137 ----- data/tool-guides/export-guide.md | 112 ----- data/tool-guides/lighting-guide.md | 143 ------ data/tool-guides/local-asset-guide.md | 70 --- data/tool-guides/material-realism-guide.md | 123 ----- data/tool-guides/materials-guide.md | 128 ----- data/tool-guides/modifiers-guide.md | 142 ------ data/tool-guides/object-assembly-guide.md | 322 ------------ data/tool-guides/render-guide.md | 162 ------ data/tool-guides/rigging-guide.md | 238 --------- data/tool-guides/scene-composition-guide.md | 212 -------- data/tool-guides/scene-management-guide.md | 133 ----- data/tool-guides/spatial-positioning-guide.md | 467 ------------------ data/tool-guides/weight-painting-guide.md | 188 ------- docs/client-setup.md | 111 +++++ docs/portable-blender-mcp.md | 26 +- lib/portable-mcp/guidance.ts | 45 +- lib/portable-mcp/server.ts | 4 +- llms.txt | 7 +- package.json | 2 +- scripts/validate-package.mjs | 8 +- skills/using-vipermesh-blender/SKILL.md | 38 ++ .../references/character-animation-export.md | 36 ++ .../references/geometry-materials-assets.md | 35 ++ .../references/scene-operations.md | 36 ++ .../references/spatial-validation.md | 33 ++ .../references/visual-presentation.md | 38 ++ tests/conformance.ts | 3 +- 36 files changed, 425 insertions(+), 3290 deletions(-) delete mode 100644 data/tool-guides/aesthetic-quality-guide.md delete mode 100644 data/tool-guides/animation-guide.md delete mode 100644 data/tool-guides/architectural-completeness-guide.md delete mode 100644 data/tool-guides/blend-file-health-guide.md delete mode 100644 data/tool-guides/blender-docs-lookup-guide.md delete mode 100644 data/tool-guides/camera-guide.md delete mode 100644 data/tool-guides/execute-code-guide.md delete mode 100644 data/tool-guides/export-guide.md delete mode 100644 data/tool-guides/lighting-guide.md delete mode 100644 data/tool-guides/local-asset-guide.md delete mode 100644 data/tool-guides/material-realism-guide.md delete mode 100644 data/tool-guides/materials-guide.md delete mode 100644 data/tool-guides/modifiers-guide.md delete mode 100644 data/tool-guides/object-assembly-guide.md delete mode 100644 data/tool-guides/render-guide.md delete mode 100644 data/tool-guides/rigging-guide.md delete mode 100644 data/tool-guides/scene-composition-guide.md delete mode 100644 data/tool-guides/scene-management-guide.md delete mode 100644 data/tool-guides/spatial-positioning-guide.md delete mode 100644 data/tool-guides/weight-painting-guide.md create mode 100644 docs/client-setup.md create mode 100644 skills/using-vipermesh-blender/SKILL.md create mode 100644 skills/using-vipermesh-blender/references/character-animation-export.md create mode 100644 skills/using-vipermesh-blender/references/geometry-materials-assets.md create mode 100644 skills/using-vipermesh-blender/references/scene-operations.md create mode 100644 skills/using-vipermesh-blender/references/spatial-validation.md create mode 100644 skills/using-vipermesh-blender/references/visual-presentation.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 186e002..27210c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ All notable changes to ViperMesh for Blender are documented here. ## [Unreleased] +### Changed + +- Replaced the exported private tool-guide corpus with a concise, installable + public agent skill and adaptable reference documents. +- Added explicit native stdio client setup and clarified the optional, + not-yet-supported Docker MCP Toolkit route. +- Added export checks that prevent private `data/tool-guides` content from + entering public releases. + ## [1.2.0] - 2026-07-25 ### Added diff --git a/README.md b/README.md index b45930d..4bc8c47 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ broad deterministic tool surface for common operations. | Deterministic tools | Structured operations for assembly, materials, cameras, lighting, rendering, rigging, UVs, retopology, export, and inspection | | Scene validation | Grounding, support, clearance, spatial-relation, file-health, and render-artifact checks | | Compact workflows | Bounded batch calls plus separate build, inspect/repair, and finalize stages | -| Agent onboarding | Session bootstrap, MCP resources, concise operating rules, and local task guides | +| Agent onboarding | Session bootstrap, MCP resources, concise operating rules, and portable tool skills | | Custom fallback | `execute_code` remains available when a deterministic operation is not the right tool | ## Architecture @@ -84,22 +84,25 @@ npm run build ### 3. Configure your MCP client -Use the absolute repository path: +Use the built entry point from an absolute path: ```json { "mcpServers": { "vipermesh-blender": { - "command": "npm", - "args": ["run", "mcp"], - "cwd": "C:/absolute/path/to/vipermesh-blender" + "command": "node", + "args": [ + "C:/absolute/path/to/vipermesh-blender/dist/public-portable-blender-mcp.js" + ] } } } ``` Start this command once through the MCP client. Do not invoke `npm`, `npx`, or -`tsx` again for each Blender operation. +`tsx` again for each Blender operation. See [MCP client setup](docs/client-setup.md) +for Codex, JSON-configured clients, compatibility, and the optional Docker MCP +Toolkit route. ## First Agent Calls @@ -122,7 +125,9 @@ The public MCP surface includes: - `get_3d_guidance_document` Read the [complete connector manual](docs/portable-blender-mcp.md) for request -shapes, batching rules, staged workflows, local guidance, and troubleshooting. +shapes, batching rules, staged workflows, local tool skills, and +troubleshooting. The repository also ships an installable +[`using-vipermesh-blender` agent skill](skills/using-vipermesh-blender/SKILL.md). ## Security @@ -136,7 +141,7 @@ reporting process. ## Public Connector Scope This repository contains the open-source Blender addon, portable MCP server, -local operating guidance, and connector tests. It does not include the +portable public tool skills, and connector tests. It does not include the ViperMesh application, authentication, billing, private prompts, private RAG data, cloud model routing, private assets, or benchmark evidence. @@ -157,6 +162,13 @@ unusual node graphs, and uncovered workflows. The process retains a serialized connection to Blender. Relaunching it for every call adds avoidable startup, transport, and agent-tool overhead. +### Does it require Docker? + +No. Local stdio-capable MCP clients launch the Node server directly. Docker MCP +Toolkit is an optional packaging and gateway route, and is not yet a supported +ViperMesh installation path because host-to-Blender loopback connectivity still +requires cross-platform validation. + ### Does the public connector require ViperMesh cloud authentication? No. The public addon and local MCP server work without ViperMesh authentication. diff --git a/data/tool-guides/aesthetic-quality-guide.md b/data/tool-guides/aesthetic-quality-guide.md deleted file mode 100644 index 1c754d5..0000000 --- a/data/tool-guides/aesthetic-quality-guide.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: "Aesthetic Quality & Stylistic Coherence Guide" -category: "scene-design" -tags: ["aesthetic", "quality", "style", "decorative", "detail", "execute_code", "procedural", "torch", "lantern", "ornament", "medieval", "modern", "furniture"] -description: "Principles for creating visually convincing, aesthetically rich 3D scenes. Prevents minimalistic primitive-based shortcuts and teaches the agent to match object detail to scene context while preferring direct tools before execute_code fallbacks." -blender_version: "5.0+" ---- - -# Aesthetic Quality & Stylistic Coherence Guide - -## CORE PRINCIPLE: VISUAL CONVICTION OVER SPEED - -When a user describes a scene, they expect objects that **look like the real thing**, not geometric approximations. A torch is not a cylinder with a sphere on top. A chair is not a cube with four sticks. Every object must be recognizable at first glance without needing the user to imagine what it's supposed to be. - -**Rule:** If an object would not be recognizable in a photograph, it is not finished. Add more geometry until it reads correctly. - -## ANTI-MINIMALISM RULES - -### Never Substitute Primitives for Complex Objects -The following patterns are UNACCEPTABLE: - -| Object | ❌ Wrong (Primitive) | ✅ Correct (Detailed) | -|---|---|---| -| Torch | Cylinder + sphere | Bracket + handle + irregular flame shape | -| Chair | Cube + 4 thin cubes | Seat + backrest + legs with slight taper | -| Tree | Cylinder + sphere/cone | Trunk with taper + branch structure + leaf volume | -| Lamp/Lantern | Cylinder + point light | Housing + glass panels + chain/mount + bulb | -| Sword | Thin cube | Blade (tapered) + crossguard + grip + pommel | -| Bookshelf | Cube with lines | Frame + individual shelves + books (varied sizes) | - -### Minimum Geometry Budget Per Object -Every named object in the scene should have AT LEAST: -- **Decorative/props:** 3+ distinct mesh operations (not just a single primitive) -- **Furniture:** 4+ sub-components (e.g., legs, seat, back, armrests) -- **Architectural features:** Follow the Architectural Completeness Guide -- **Organic shapes:** Use subdivision + proportional editing, never raw primitives - -### When to Use Direct Tools First - -Use direct tools first for repeatable operations: transforms, materials, lighting, cameras, render settings, collection organization, parenting, modifiers, constraints, mesh validation, and viewport verification. - -Use direct tools for the object parts they already cover: - -1. `create_primitive_assembly` for grouped local-coordinate furniture, fixtures, props, panels, baskets, crates, brackets, handles, and repeated hard-surface parts. -2. `soften_mesh_edges` for bevels, rounded corners, weighted normals, and less primitive-looking hard-surface parts. -3. `create_draped_surface_mesh` for bounded sagging or wavy surfaces such as tarps, flags, canopies, awnings, cloth panels, terrain patches, and irregular panels. -4. `create_mesh_from_data` for known vertex/face surfaces and custom silhouette pieces not covered by the draped-surface helper. -5. `add_curve_object` for cables, vines, rails, straps, ropes, arcs, and tube-like strokes. - -Use `execute_code` only when direct tools cannot express the required custom geometry, such as an object that: -1. Has **irregular or organic shapes** (flames, plants, terrain, fabric) -2. Requires **procedural deformation or generation** beyond direct assembly tools -3. Needs **vertex-level manipulation** (tapering, bending, sculpting) -4. Needs mesh operations not covered by `create_draped_surface_mesh`, `create_mesh_from_data`, `soften_mesh_edges`, or modifier tools -5. Involves custom shader nodes, procedural effects, simulation, or animation internals - -**Rule:** If you catch yourself making a single `create_cube` or `create_cylinder` call for a decorative object, STOP and decompose it into a multi-part assembly. Use direct tools for the parts they cover, and use a focused `execute_code` fallback only for the custom geometry that remains. - -## STYLISTIC COHERENCE - -### Match Object Style to Scene Context -Every object in a scene must visually belong to the same world. The prompt's keywords define the style vocabulary: - -| Prompt Keywords | Style Vocabulary | Material Palette | -|---|---|---| -| "medieval", "dungeon", "castle" | Rough stone, iron brackets, wood planks, rivets | Dark metals, weathered wood, rough stone | -| "modern", "apartment", "office" | Clean lines, smooth surfaces, chrome/glass | Polished metal, white/gray matte, glass | -| "sci-fi", "spaceship", "futuristic" | Panel lines, glowing accents, hexagonal patterns | Emissive strips, brushed aluminum, dark composites | -| "rustic", "cabin", "farmhouse" | Rough-hewn wood, hand-forged iron, woven fabric | Warm browns, muted greens, worn textures | -| "fantasy", "magical", "enchanted" | Organic curves, carved details, crystal/gem shapes | Glowing emissive, deep jewel tones, gold accents | - -**Rule:** Before building ANY sub-object, ask: "Does this shape and material belong in the world described by the prompt?" A smooth chrome cylinder does NOT belong in a medieval dungeon. - -### Contextual Material Selection -Materials must match the era and setting. Derive roughness and color from the **scene context**, not from defaults: -- **Aged/rustic settings:** Higher roughness (0.6–0.8), muted warm tones, metallic only on iron/steel -- **Modern/clean settings:** Lower roughness (0.05–0.3), neutral or cool tones, polished metals -- **Fantasy/magical:** Emissive accents, jewel tones, gold/copper metallics - -**Rule:** Never use default gray or smooth chrome for objects in non-modern settings. Always set roughness and base color intentionally to match the scene's era. - -## MULTI-COMPONENT ASSEMBLY PATTERN - -### Generic Direct-Tool Pattern - -When building ANY complex object, follow this pattern with direct tools first: - -```text -1. Create context-appropriate materials first. -2. Use create_primitive_assembly for the structural body and named sub-parts. -3. Use create_draped_surface_mesh for bounded cloth, tarp, canopy, flag, terrain-patch, or irregular-panel surfaces. -4. Use create_mesh_from_data only for the parts that need custom vertices/faces beyond the draped-surface helper. -5. Use add_curve_object for ropes, straps, cables, vines, rails, or handle arcs. -6. Use soften_mesh_edges on hard-surface families so primitives do not look raw. -7. Run inspect_scene_grounding and inspect_spatial_relations before final render. -8. Use execute_code only for the remaining geometry or shader step that no direct tool covers. -``` - -### Key Techniques for Realistic Shapes - -- **Tapered forms:** Use cone primitive parts where available, or a focused mesh-data/custom fallback when tapering is the only missing step. -- **Organic shapes:** Prefer assets for high-detail plants/foliage and use focused custom geometry only when an asset does not fit. -- **Repeated elements:** Use multiple named assembly parts for legs, slats, rungs, chain links, bricks, and panel details. -- **Edge softening:** Use `soften_mesh_edges` (small width, 2 segments, weighted normals) to avoid sharp CG edges. -- **Surface detail:** Use `create_draped_surface_mesh` for bounded sagging/wavy surfaces and `create_mesh_from_data` for other bounded custom surfaces; use `execute_code` only for subdivision/displacement workflows not covered by direct tools. - -### Few-Shot: What "Multi-Part" Means in Practice -These are hints — adapt the decomposition to whatever object the prompt requires: -- **Light fixture** → mount/bracket + housing body + shade/glass + bulb/flame + point light -- **Seating** → legs (4, tapered) + seat surface (beveled) + back support + optional armrests -- **Weapon/tool** → blade/head (tapered) + guard/collar + grip (wrapped) + pommel/end cap -- **Container** → body (hollow or thick-walled) + rim/lip + handles + lid (if closed) - -## QUALITY CHECKLIST - -Before finishing any scene, verify: - -1. **Silhouette test:** Would each object be identifiable from its silhouette alone? -2. **Style consistency:** Do all objects share the same era/aesthetic? -3. **Material variety:** Are there at least 3 distinct materials in the scene? -4. **No naked primitives:** Is every cube/cylinder/sphere part of a larger assembly? -5. **Light motivation:** Does every light source have a visible physical object (lamp, torch, window)? -6. **Scale plausibility:** Are objects proportioned correctly relative to each other? - -## COMMON AESTHETIC FAILURES - -1. ❌ Single cylinder as a "torch" — use multi-part assembly with bracket, handle, flame -2. ❌ Smooth metallic surface for medieval iron — use higher roughness (0.6-0.8) -3. ❌ Perfect geometric shapes for organic/rustic objects — add imperfection via displacement -4. ❌ Using only one material for everything — minimum 3 distinct materials per scene -5. ❌ Point lights with no visible source — every light needs a physical emitter object -6. ❌ Chrome/polished finishes in medieval/rustic scenes — match material to era -7. ❌ All furniture same height/size — vary proportions for visual interest diff --git a/data/tool-guides/animation-guide.md b/data/tool-guides/animation-guide.md deleted file mode 100644 index 1bd3c54..0000000 --- a/data/tool-guides/animation-guide.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -title: "Animation & Keyframing Guide" -category: "animation" -tags: ["animation", "keyframe", "F-curve", "interpolation", "easing", "timeline", "shape key", "shape_key", "morph target", "blend shape", "viseme", "facial expression", "same-topology", "target mesh", "slider range", "mute", "rename", "delete", "duplicate", "mix", "bake", "squash", "stretch", "bounce", "timing", "turntable", "product spin", "keyframe_insert", "fcurves", "NLA", "inspect_shape_keys", "extract_shape_key_to_object", "create_shape_key_from_object", "set_shape_key_properties", "rename_shape_key", "delete_shape_key", "duplicate_shape_key", "create_shape_key_from_mix", "set_shape_key_value", "set_timeline_settings", "set_keyframe_animation", "create_turntable_animation"] -description: "Research-backed animation guide covering Blender 5.0 breaking API changes, keyframe performance hierarchy (RNA vs bpy.ops), F-curve access/modifier patterns, and the 12 Disney animation principles with volume-preserving code. Based on NotebookLM research with 8 cited sources." -blender_version: "5.0+" -triggered_by: ["inspect_animation_data", "inspect_shape_keys", "extract_shape_key_to_object", "create_shape_key_from_object", "set_shape_key_properties", "rename_shape_key", "delete_shape_key", "duplicate_shape_key", "create_shape_key_from_mix", "set_shape_key_value", "set_timeline_settings", "set_keyframe_animation", "create_turntable_animation"] ---- - -# Animation Guide — Blender Agent Best Practices - -> **Domain:** Keyframing, F-Curves, Interpolation, Animation Principles -> **Version:** Blender 5.x (verified via NotebookLM research) -> **Purpose:** Research-backed guide for the agent. Use `inspect_animation_data` before changing existing animation, `inspect_shape_keys` before morph/viseme/expression edits, `extract_shape_key_to_object` to materialize an existing morph as an editable target, `create_shape_key_from_object` when a same-topology target mesh already contains the desired morph geometry, `set_shape_key_properties` for slider ranges or mute state, `rename_shape_key` and `delete_shape_key` for bounded shape-key control cleanup, `duplicate_shape_key` for shape-key variants, `create_shape_key_from_mix` for baked composite morph controls, `set_timeline_settings` for timeline range/FPS/current-frame setup, `create_turntable_animation` for product/model showcase spins, then `set_keyframe_animation` or `set_shape_key_value` for bounded keys. Reserve `execute_code` only for unsupported animation systems such as custom drivers, rig controls, arbitrary shape-key sculpting without a target mesh, particles, or procedural simulations. - ---- - -## CRITICAL: Blender 5.0 Breaking Changes - -> **Source:** Blender 5.0 Python API review (ojambo.com), BlenderArtists forums - -- **Dict-like property access removed:** `bpy.context.scene['cycles']` no longer works -- **New `get_transform` / `set_transform` methods** replace older getter/setter workflows -- **Bundled modules now private:** `bl_console_utils`, `bl_rna_utils` cannot be used by scripts -- **`property_unset`** replaces dict-like access for old property patterns - ---- - -## 0. Inspect Before Editing Existing Animation - -Call `inspect_animation_data` before creating or editing keyframes on an existing scene, rig, material, driver, or NLA setup. Use its timeline, action, F-curve, driver, and NLA report to avoid overwriting the wrong action slot, duplicating curves, or changing hidden animation state. - -Use `set_timeline_settings` for frame range, FPS, current frame, preview range, and playback sync before animation or render workflows. Use `create_turntable_animation` for model showcase/product spin loops because it owns target validation, rotation axis, linear interpolation, timeline expansion, and frame restoration. Use `set_keyframe_animation` for object transform animation on `location`, `rotation_euler`, or `scale` when the motion is not a simple turntable. - -Use `inspect_shape_keys` before changing morph targets, visemes, blend shapes, or facial expression sliders. Use `extract_shape_key_to_object` to turn an existing shape key into a separate editable same-topology target mesh. Use `create_shape_key_from_object` when the requested shape-key geometry can be copied from a same-topology duplicate or edited target mesh. Use `set_shape_key_properties` when only the slider range or mute state needs to change. Use `rename_shape_key` or `delete_shape_key` when the requested work only cleans up existing shape-key controls. Use `duplicate_shape_key` when a new morph should start from an existing shape key. Use `create_shape_key_from_mix` when existing shape-key values should be baked into a new composite control. Use `set_shape_key_value` when the requested work only needs existing shape-key values or value keyframes. Keep `execute_code` for arbitrary custom shape-key sculpting when there is no same-topology target object to copy from. - -Keep `execute_code` for unsupported animation systems only, and verify all generated F-curves with `inspect_animation_data`. - ---- - -## 1. Performance: NEVER Use bpy.ops for Keyframes in Loops - -> **Source:** StackExchange "Improving Python Performance with Blender Operators" - -`bpy.ops` operators cause **implicit scene updates** on every call. In a loop adding N objects, -this causes O(n²) total checks — exponential slowdown. - -### API Hierarchy (fastest to slowest): -| Method | Speed | Use When | -|--------|-------|----------| -| Low-level F-Curve API (manual `keyframe_points`) | ⚡ Fastest | Bulk animation, many objects | -| `Object.keyframe_insert()` (RNA method) | ✅ Fast | Standard use — **PREFERRED** | -| `bpy.ops.anim.keyframe_insert()` | ❌ Slow | Never use in scripts | -| `bpy.ops.anim.keyframe_insert_menu()` | ❌ UI only | Never use in scripts | - -### Correct Pattern: RNA Method -```python -import bpy - -obj = bpy.data.objects['Cube'] -obj.location = (0, 0, 0) -obj.keyframe_insert(data_path='location', frame=1) - -obj.location = (0, 0, 5) -obj.keyframe_insert(data_path='location', frame=30) -``` - -### Fastest Pattern: Low-Level F-Curve API -```python -import bpy - -obj = bpy.data.objects['Cube'] - -# Ensure animation data exists -if not obj.animation_data: - obj.animation_data_create() -if not obj.animation_data.action: - obj.animation_data.action = bpy.data.actions.new(name=obj.name + 'Action') - -action = obj.animation_data.action - -# Add F-curve for location Z (index=2) -fc = action.fcurves.new(data_path='location', index=2) -# Add keyframe points directly -fc.keyframe_points.add(count=2) -fc.keyframe_points[0].co = (1.0, 0.0) # frame 1, z=0 -fc.keyframe_points[1].co = (30.0, 5.0) # frame 30, z=5 -fc.keyframe_points.update() - -# Manual scene update required with low-level API -bpy.context.view_layer.update() -``` - ---- - -## 2. F-Curve Access and Interpolation - -> **Source:** StackExchange "Set Keyframe interpolation CONSTANT" - -### Finding F-Curves (Blender 5.0+ Channelbag API) - -> **CRITICAL:** In Blender 5.0+, `action.fcurves` was REMOVED. -> Use the channelbag API instead: - -```python -from bpy_extras import anim_utils - -action = obj.animation_data.action -slot = obj.animation_data.action_slot -channelbag = anim_utils.action_get_channelbag_for_slot(action, slot) - -# Find a specific F-curve -fcu = channelbag.fcurves.find('rotation_euler', index=1) # Y rotation - -# Or iterate all F-curves -for fcu in channelbag.fcurves: - print(fcu.data_path, fcu.array_index) -``` - -### Setting Interpolation Per-Keyframe -```python -# All keyframes on a curve — both interpolation AND easing are valid properties -for pt in fcu.keyframe_points: - pt.interpolation = 'BEZIER' # or 'LINEAR', 'CONSTANT', 'BOUNCE' - pt.easing = 'EASE_IN_OUT' # or 'EASE_IN', 'EASE_OUT', 'AUTO' - -# Alternative: use handle types for finer control -for pt in fcu.keyframe_points: - pt.interpolation = 'BEZIER' - pt.handle_left_type = 'AUTO_CLAMPED' - pt.handle_right_type = 'AUTO_CLAMPED' - -# Specific frame only -frame_num = 24 -target = [pt for pt in fcu.keyframe_points if pt.co[0] == frame_num] -if target: - target[0].interpolation = 'CONSTANT' -``` - -### Material Animation F-Curves -```python -# Material animations live in node_tree, NOT in object.animation_data -from bpy_extras import anim_utils - -mat = bpy.data.materials['Material'] -mat_action = mat.node_tree.animation_data.action -mat_slot = mat.node_tree.animation_data.action_slot -mat_cb = anim_utils.action_get_channelbag_for_slot(mat_action, mat_slot) -for fcu in mat_cb.fcurves: # access material fcurves here - print(fcu.data_path) -``` - ---- - -## 3. F-Curve Modifiers via Python - -> **Source:** StackExchange "modifying fcurve modifiers in python" - -```python -# Add a Noise modifier to an F-curve (use channelbag API) -from bpy_extras import anim_utils - -action = obj.animation_data.action -slot = obj.animation_data.action_slot -channelbag = anim_utils.action_get_channelbag_for_slot(action, slot) - -fcu = channelbag.fcurves.find('location', index=2) -modifier = fcu.modifiers.new('NOISE') -modifier.scale = 10 # adjust noise scale -modifier.strength = 0.5 # adjust noise strength - -# Cycles modifier (for repeating animation) -cycle_mod = fcu.modifiers.new('CYCLES') -# Properties come with defaults — only set what you need to change -``` - -Available modifier types: `'NOISE'`, `'CYCLES'`, `'LIMITS'`, `'GENERATOR'`, -`'ENVELOPE'`, `'FNGENERATOR'`, `'STEPPED'` - ---- - -## 4. The 12 Animation Principles (Disney) - -> **Source:** Wikipedia "Twelve basic principles of animation" (Johnston & Thomas, 1981) - -These principles guide HOW the agent should create animations, not just the API calls: - -### Volume-Preserving Squash & Stretch -When an object squashes, its width must increase. When it stretches, width decreases. -**Rule: X × Y × Z scale product must stay constant.** - -```python -# Impact frame: squash (wider, shorter) -obj.scale = (1.3, 1.3, 0.6) # 1.3 * 1.3 * 0.6 ≈ 1.01 (volume preserved) -obj.keyframe_insert(data_path='scale', frame=15) - -# Stretch frame: taller, thinner -obj.scale = (0.8, 0.8, 1.56) # 0.8 * 0.8 * 1.56 ≈ 1.0 -obj.keyframe_insert(data_path='scale', frame=20) -``` - -### Slow In / Slow Out -More frames near start and end of action = realistic acceleration/deceleration. -Use `BEZIER` interpolation with `EASE_IN_OUT` — this is the Blender equivalent. - -### Anticipation -Before a big action, add a small opposite movement (wind-up before punch, crouch before jump). - -### Follow Through -After main action stops, appendages/loose parts continue moving briefly, then settle. -Implement with offset keyframes on child objects or secondary bones. - -### Arcs -Natural movement follows curved paths, not straight lines. Exception: mechanical/robotic motion -uses `LINEAR` interpolation deliberately. - -### Timing -Fewer frames = faster/lighter. More frames = slower/heavier. -- Light object bounce: 8-12 frames per bounce -- Heavy object: 20-30 frames per bounce - ---- - -## 5. Timeline Setup - -> **Source:** BlenderArtists "Set first and end frame by script" - -```python -scene = bpy.context.scene -scene.frame_start = 1 -scene.frame_end = 120 # 5 sec at 24fps -scene.render.fps = 24 # Film standard -scene.frame_set(1) # Go to frame 1 -``` - ---- - -## 6. Common Pitfalls - -| Problem | Cause | Fix (Research-backed) | -|---------|-------|----------------------| -| Keyframes not appearing | Wrong `data_path` string | Check exact path in Blender tooltip | -| Animation data is None | No keyframes inserted yet | Call `obj.animation_data_create()` first | -| Material anim not found | Looking in object instead of node_tree | Use `material.node_tree.animation_data` | -| Slow with many objects | Using `bpy.ops` in loops | Switch to RNA `keyframe_insert()` or low-level API | -| Stiff/robotic motion | Linear interpolation | Use `BEZIER` + `EASE_IN_OUT`, apply 12 principles | diff --git a/data/tool-guides/architectural-completeness-guide.md b/data/tool-guides/architectural-completeness-guide.md deleted file mode 100644 index 7cb2533..0000000 --- a/data/tool-guides/architectural-completeness-guide.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: "Architectural Completeness & Scene Construction Guide" -category: "scene-design" -tags: ["architecture", "room", "walls", "floor", "ceiling", "window", "door", "boolean", "interior", "exterior", "glass", "opening", "create_room_shell", "create_wall_opening"] -triggered_by: ["create_room_shell", "create_wall_opening"] -description: "General 3D engineering principles for constructing architecturally complete scenes. Covers room construction, wall openings (windows/doors), component completeness, and structural integrity." -blender_version: "5.0+" ---- - -# Architectural Completeness & Scene Construction Guide - -## CORE PRINCIPLE: COMPONENT COMPLETENESS - -Every real-world architectural element is composed of multiple sub-components. When creating any architectural feature, always model ALL sub-components that make it physically complete. - -| Element | Required Sub-Components | Often Forgotten | -|---|---|---| -| Window | Boolean opening + frame + **glass pane** + sill | Glass pane, sill | -| Door | Boolean opening + frame + door panel + handle | Handle, threshold | -| Wall | Geometry with **real thickness** (not single plane) | Thickness for EEVEE | -| Staircase | Treads + risers + stringers + railing | Risers, railing | -| Shelf/Counter | Top surface + front face + supporting structure | Side panels | - -**Rule:** After creating an opening (window/door), ALWAYS add the fill component (glass pane, door panel). A hole in a wall is not a window — it needs glass. - -## ROOM CONSTRUCTION RULES - -### Wall Construction -Use `create_room_shell` for interior room blockouts, room anchors, or background architecture before adding furniture, windows, doors, lighting, or camera setup. It creates floor, walls, and optional ceiling with real thickness so the agent does not need generated Python for the common room-shell pattern. - -Use `create_wall_opening` for bounded window/door openings after the wall exists. It owns the Boolean cut, cutter cleanup, optional glass/door fill, and simple frame pieces. Choose the existing wall object deliberately, provide the opening center in world coordinates, and use `wall_axis: "auto"` unless the wall normal is known. Afterward, validate fill/frame placement with `validate_object_clearance` before adding materials or furniture around it. - -1. **Continuous walls:** Build walls as a single continuous object by extruding the next wall from the corner of the previous one. This prevents texture clipping at corners. -2. **Real thickness:** ALL walls, floors, and ceilings MUST have thickness (use 0.15–0.3m). Single-plane geometry causes severe **light bleed** in EEVEE where outdoor light leaks through edges. -3. **Apply transforms:** Always `bpy.ops.object.transform_apply(scale=True)` after setting scale. - -### Wall Thickness Pattern (Blender 5.x) -```python -# CORRECT: Wall with real thickness -wall = create_cube("Wall", 1, (0, 2.5, 1.4), (4, 0.2, 2.8)) -# 0.2m thick — prevents EEVEE light bleed - -# WRONG: Paper-thin wall (causes light bleed) -wall = create_cube("Wall", 1, (0, 2.5, 1.4), (4, 0.01, 2.8)) -``` - -### Floor as Distinct Surface -The floor MUST have a different material from furniture. In real interiors, floors are: -- Harder, more worn (higher roughness) -- Different color/texture from furniture -- Often darker (absorbs dirt/wear) - -## WINDOW CREATION PATTERN - -### Step 1: Cut Opening with Boolean -```python -# Create cutter object -cutter = create_cube("Window_Cutter", 1, (-2.0, 0, 1.4), (0.5, 2.0, 1.2)) -bool_mod = wall.modifiers.new(name="WindowCut", type='BOOLEAN') -bool_mod.operation = 'DIFFERENCE' -bool_mod.object = cutter -bool_mod.solver = 'EXACT' # REQUIRED in Blender 5.x -bpy.context.view_layer.objects.active = wall -bpy.ops.object.modifier_apply(modifier="WindowCut") -bpy.data.objects.remove(cutter) -``` - -### Step 2: Add Glass Pane (CRITICAL — don't skip!) -```python -# Glass pane fills the window opening -glass = create_cube("Window_Glass", 1, (-2.0, 0, 1.4), (0.02, 1.9, 1.1)) - -# Then call create_material_preset with preset "glass" and object_name "Window_Glass". -# Follow with inspect_material_node_graph to verify Transmission Weight, IOR, and assignment. -``` - -**EEVEE Note:** For interior scenes, using a Transparent shader instead of Glass may prevent light bleed artifacts if exact refraction isn't needed. - -### Step 3: Add Window Frame (Optional but recommended) -```python -# Simple frame around the opening -frame = create_cube("Window_Frame", 1, (-2.0, 0, 1.4), (0.08, 2.1, 1.3)) -# Cut out center to make frame shape -``` - -## BOOLEAN OPERATION BEST PRACTICES - -1. **Use EXACT solver** — the only reliable solver in Blender 5.x (`FAST` is removed) -2. **Watertight meshes only** — cutter and target must be closed manifold meshes -3. **No flipped normals** — check with `bpy.ops.mesh.normals_make_consistent(inside=False)` -4. **Apply transforms first** — `bpy.ops.object.transform_apply(location=False, rotation=True, scale=True)` -5. **Cutter must overlap** — the cutter object must extend slightly beyond both sides of the wall -6. **Clean up cutters** — remove cutter objects after applying the modifier - -## SURFACE CATEGORY CHECKLIST - -When building any interior scene, ensure each of these surface categories has a DISTINCT material: - -| Category | Examples | Material Character | -|---|---|---| -| **Structural surfaces** | Walls, ceiling | High roughness (0.8+), muted colors, no metallic | -| **Walking surfaces** | Floor, stairs | Distinguished from walls — different color AND roughness | -| **Furniture** | Tables, chairs, counters | Wood/upholstery materials, medium roughness | -| **Fixtures/hardware** | Faucets, handles, machines | Metallic = 1.0, low roughness, distinct from all else | -| **Transparent surfaces** | Windows, glass doors | Transmission Weight > 0, IOR set correctly | - -**Rule:** No two categories should share the exact same material. If the floor and furniture are both "wood," use different wood tones (light oak floor vs. dark walnut furniture). - -## COMMON MISTAKES TO AVOID - -1. ❌ Cutting a window hole without adding glass — always add a glass pane after boolean -2. ❌ Paper-thin walls — use 0.15–0.3m thickness to prevent EEVEE light bleed -3. ❌ Same material on floor and furniture — always differentiate functional surfaces -4. ❌ Using `FAST` boolean solver — removed in Blender 5.x, use `EXACT` -5. ❌ Not applying transforms before booleans — causes geometry artifacts -6. ❌ Leaving boolean cutter objects visible — remove them after applying diff --git a/data/tool-guides/blend-file-health-guide.md b/data/tool-guides/blend-file-health-guide.md deleted file mode 100644 index 42d7e0a..0000000 --- a/data/tool-guides/blend-file-health-guide.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Blend File Health Inspection Guide" -category: "inspection" -tags: ["blend file", "health", "missing files", "linked libraries", "packed assets", "orphan data", "datablocks", "usage guess", "path info", "inspect_blend_file_health", "get_blendfile_summary_path_info", "get_blendfile_summary_datablocks", "get_blendfile_summary_missing_files", "get_blendfile_summary_of_linked_libraries", "get_blendfile_summary_usage_guess"] -triggered_by: ["inspect_blend_file_health", "get_blendfile_summary_path_info", "get_blendfile_summary_datablocks", "get_blendfile_summary_missing_files", "get_blendfile_summary_of_linked_libraries", "get_blendfile_summary_usage_guess"] -description: "Guidance for using the non-mutating .blend file health summary before diagnosing missing assets, broken links, package/export issues, or large-scene problems." -blender_version: "latest stable (verified 5.1.2)" ---- - -# Blend File Health Inspection Guide - -Use `inspect_blend_file_health` before writing Python when the user reports: - -- missing textures, white materials, broken image maps, or missing linked assets, -- imported files that behave differently after reload/export, -- large scenes that are slow or hard for the agent to reason about, -- packaging/export problems where external files may not be available. - -Use focused summaries when the question is narrow: - -- `get_blendfile_summary_path_info` for saved path, directory, and dirty-state questions. -- `get_blendfile_summary_datablocks` for object/material/image/action/orphan counts. -- `get_blendfile_summary_missing_files` for missing texture, font, sound, movie, or library files. -- `get_blendfile_summary_of_linked_libraries` for linked `.blend` library path/existence checks. -- `get_blendfile_summary_usage_guess` when deciding whether a file looks like a rig, animation, render scene, textured asset, or large scene before choosing the next tool. - -## Reading the Result - -- `status: "healthy"` means no high-signal file health issue was found. -- `status: "warning"` usually means the file is unsaved, very large, or has orphaned datablocks. -- `status: "error"` usually means at least one external file or linked library is missing. - -Treat missing external files as a file/package problem first. Do not try to repaint or rebuild materials until the missing path is understood. - -## Recommended Flow - -1. Call the narrowest summary that answers the question, or `inspect_blend_file_health` for a full report. -2. If `missing_external_files` is non-empty, report the missing paths and ask for a relink/reupload/package fix. -3. If linked libraries are missing, do not attempt destructive cleanup. Explain which library path is unavailable. -4. If orphan counts are high, mention cleanup as optional. Do not purge orphan data unless the user explicitly asks. -5. If the scene is large, use `get_all_object_info` with pagination or inspect specific collections/objects rather than loading everything at once. - -## What Not To Do - -- Do not use `execute_code` just to count missing files or libraries. -- Do not hard-delete orphaned datablocks automatically. -- Do not assume packed images are missing. Packed assets are embedded in the `.blend`. diff --git a/data/tool-guides/blender-docs-lookup-guide.md b/data/tool-guides/blender-docs-lookup-guide.md deleted file mode 100644 index b6b2b45..0000000 --- a/data/tool-guides/blender-docs-lookup-guide.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "Blender Docs Lookup Guide" -category: "documentation" -tags: ["blender api", "manual", "version verification", "execute_code", "toolification"] -triggered_by: ["search_blender_api_docs", "get_blender_api_doc", "search_blender_manual_docs"] -description: "Rules for using official Blender documentation lookup before version-sensitive Blender Python or tool guidance." -blender_version: "latest stable (verified 5.1.2)" ---- - -# Blender Docs Lookup Guide - -Use official Blender docs lookup when exact API behavior matters. The lookup tools are guardrails before `execute_code`, not scene-editing tools themselves. - -## Use API Lookup Before Python For - -- `bpy.ops` operators and their context requirements -- node tree construction and socket names -- Principled BSDF, texture, normal map, and color-space setup -- UV unwrap, original UV preservation, and export/import operators -- mesh creation and validation APIs -- render engine IDs, EEVEE/Cycles settings, camera, and lighting properties -- removed, renamed, or changed Blender 5.x properties - -## Tool Order - -1. `search_blender_api_docs(query)` for symbols, operators, properties, and classes. -2. `get_blender_api_doc(path_or_url)` when an exact entry needs confirmation. -3. `search_blender_manual_docs(query)` for artist-facing workflows or UI concepts. -4. Only then use a deterministic tool or a scoped `execute_code` fallback. - -## Citation Rule - -When creating or updating reusable tool guidance, record the exact docs URL that informed the decision. Do not promote guidance based only on model memory. - -## Failure Handling - -If lookup fails, do not guess version-sensitive API names. Use a short introspection `execute_code` call only when the scene can safely tolerate it, such as checking `dir(obj.data)`, `hasattr(...)`, or available node sockets. diff --git a/data/tool-guides/camera-guide.md b/data/tool-guides/camera-guide.md deleted file mode 100644 index 2abd70c..0000000 --- a/data/tool-guides/camera-guide.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: "Camera Placement & Cinematography Guide" -category: "camera" -tags: ["camera", "focal length", "depth of field", "DOF", "framing", "composition", "product shot", "portrait", "camera orbit", "aim", "look at", "setup_studio_scene", "validate_studio_scene", "add_camera", "set_camera_properties", "aim_camera_at", "create_camera_orbit_animation"] -triggered_by: ["setup_studio_scene", "validate_studio_scene", "add_camera", "set_camera_properties", "aim_camera_at", "create_camera_orbit_animation"] -description: "Domain knowledge for camera placement, focal length selection, depth of field configuration, and shot composition in Blender. Essential for producing correctly framed renders." -blender_version: "4.0+" ---- - -# Camera Placement & Cinematography Guide - -## CRITICAL RULES - -1. **DOF focus_distance ≠ camera distance.** Focus distance is WHERE the focus plane sits (the sharp zone). Camera distance is WHERE the camera is physically placed. With telephoto lenses, the camera should be 1.5–2× further than the focus distance. - -2. **Always verify with get_viewport_screenshot** after placing a camera. If the subject fills more than 90% of the frame, the camera is too close. The subject should occupy 30–70% of the frame for a well-composed shot. - -3. **Use `setup_studio_scene` for asset/model previews.** It computes target bounds, frames a camera, sets focus distance, and creates a studio light rig. Follow it with `validate_studio_scene` before rendering. - -4. **Use `create_camera_orbit_animation` for showcase spins where the model should stay still.** It computes target bounds, places/reuses a camera, keys camera location and aimed rotation, updates focus distance, and preserves the current timeline frame. Follow with `validate_studio_scene` or a viewport/render preview before final export. - -## FOCAL LENGTH → MINIMUM CAMERA DISTANCE - -For a subject approximately 2 meters wide (e.g., default cube, small object): - -| Focal Length | Lens Type | Min Distance | Recommended Distance | Use Case | -|---|---|---|---|---| -| 24mm | Wide angle | 2–3m | 3–5m | Interiors, landscapes, dramatic perspective | -| 35mm | Normal | 3–5m | 4–7m | Documentary, natural scenes | -| 50mm | Standard | 4–6m | 5–8m | Human eye equivalent, general purpose | -| 85mm | Telephoto | 6–9m | 8–12m | Portraits, product shots, compressed look | -| 135mm | Long telephoto | 10–15m | 12–20m | Product close-ups, extreme compression | - -**Rule of thumb:** For an 85mm lens, place the camera at **minimum 8 meters** from the subject center. For a 50mm lens, 5–8 meters is correct. - -## CAMERA POSITIONING PATTERNS - -### Product Shot (45° angle, looking down) -``` -Location: (6, -6, 5) — about 10m from origin -Rotation: use `aim_camera_at` to aim at the target object or (0, 0, 0) -Lens: 85mm -DOF: focus_distance = distance to subject, f/2.8 -``` - -### Eye-Level Portrait -``` -Location: (0, -8, 1.7) — 8m back, eye height -Rotation: aim at (0, 0, 1.5) -Lens: 85mm or 50mm -DOF: focus_distance = 8.0, f/2.0 -``` - -### Dramatic Low Angle -``` -Location: (4, -5, 0.5) — low, ~6.4m away -Rotation: aim at (0, 0, 2) — looking up -Lens: 35mm -``` - -### Wide Interior -``` -Location: (3, -2, 1.7) — close, eye height -Rotation: aim at (0, 5, 1.5) -Lens: 24mm -``` - -### Overhead / Top-Down -``` -Location: (0, 0, 10) — directly above -Rotation: (0, 0, 0) — pointing straight down -Lens: 50mm -``` - -## DEPTH OF FIELD SETUP - -| Parameter | Effect | Typical Values | -|---|---|---| -| `dof_use` | Enable/disable DoF | `true` for cinematic | -| `dof_focus_distance` | Distance to sharp focus plane (meters) | Match subject distance | -| `dof_aperture_fstop` | Aperture size — lower = more blur | 1.4 extreme, 2.8 moderate, 5.6 slight, 16 sharp | - -**Aperture guidelines:** -- f/1.4 – f/2.0: Extreme bokeh, only subject sharp -- f/2.8 – f/4.0: Product photography, moderate background blur -- f/5.6 – f/8.0: Landscape, most things in focus -- f/11 – f/16: Everything sharp, architectural - -## SENSOR SIZE (affects field of view) - -- Default Blender sensor: 36mm (full-frame equivalent) -- Larger sensor = wider field of view at same focal length -- For matching real cameras, set `sensor_width` accordingly - -## COMMON MISTAKES TO AVOID - -1. ❌ Placing camera at the DOF focus distance — results in subject filling entire frame with telephoto lenses -2. ❌ Using manual rotation_euler for camera aiming — fragile, use `aim_camera_at` instead -3. ❌ Forgetting to set camera as active (`set_active: true`) — render will use the wrong camera -4. ❌ Not verifying with viewport screenshot — always check framing visually diff --git a/data/tool-guides/execute-code-guide.md b/data/tool-guides/execute-code-guide.md deleted file mode 100644 index 47b30c0..0000000 --- a/data/tool-guides/execute-code-guide.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: "Execute Code Scene-Building Guide" -category: "execute-code" -tags: ["execute_code", "scene building", "reference image", "blockout", "refinement", "silhouette", "assembly", "blender python", "staging"] -triggered_by: ["execute_code"] -description: "General-purpose guidance for Blender Python scene construction in Blender 5.x+. Teaches staged reference reconstruction, focused refinement passes, and expert-level prop decomposition without collapsing an entire scene into one coarse script." -blender_version: "5.0+" ---- - -# Execute Code Scene-Building Guide - -## CORE PRINCIPLE: STAGE THE SCENE, THEN REFINE WHAT THE CAMERA WILL REVEAL - -`execute_code` is the strongest geometry tool, but it should NOT be used as one giant "do everything at once" script for a whole reference image. - -An expert workflow is: -1. Build the **scene anchors** and overall layout -2. Verify proportions and placement visually -3. Refine the **camera-visible props** that still read incorrectly -4. Leave camera, lighting, render settings, and simple materials to direct tools when possible - -**Rule:** Use `execute_code` in focused passes. Each pass should create or improve one logical cluster, not the entire final scene in one shot. - -## WHEN `execute_code` IS THE RIGHT TOOL - -Use `execute_code` for: -- Complex geometry creation -- Multi-part assemblies -- Organic or irregular forms -- Rebuilds that need vertex-level or modifier-level control -- Focused refinement of visible props after screenshot review - -Do NOT use `execute_code` for: -- Simple light setup that direct light tools can handle -- Camera creation or basic lens changes -- Straightforward render settings -- Simple Principled material creation when `create_material` + `assign_material` is enough - -## REFERENCE-DRIVEN RECONSTRUCTION WORKFLOW - -### Pass 1: Structural Blockout -Create only the large spatial anchors: -- Room envelope or backdrop surfaces -- Ground plane / floor -- Main furniture or architectural masses -- Large hero objects that define composition - -At this stage: -- Prioritize correct scale, spacing, alignment, and silhouette -- Use simple but intentional materials -- Do NOT spend time on delicate secondary props yet - -### Pass 2: Visual Checkpoint -After the blockout, inspect a viewport screenshot and ask: -- Is the composition correct? -- Are the main masses aligned to the reference? -- Are the relative sizes plausible? -- Which objects still fail silhouette recognition? - -If the answer is "mostly correct but some visible props read poorly", do NOT rebuild the whole scene. Run a focused refinement pass. - -### Pass 3: Focused Refinement -Refine high-value props in separate `execute_code` calls. - -A prop deserves its own refinement pass when it is: -- Near the camera -- High contrast against the background -- Positioned near the visual center -- Semantically distinctive enough that a crude proxy will be obvious - -**Rule:** Small does not mean unimportant. If the viewer can clearly read the object, it needs a recognizable silhouette. - -### Pass 4: Finalization -Once geometry is stable: -- Use direct tools for camera, lighting, render settings, and simple materials -- Use another focused `execute_code` pass only when a direct tool cannot produce the required result - -## PROMINENCE-BASED DETAIL ALLOCATION - -Not every object needs the same detail level. Allocate effort by **screen prominence**, not by object count. - -### High-Prominence Objects -These need strong silhouette fidelity and secondary shape breakup: -- Large objects near frame center -- Foreground props -- Objects crossing strong light/shadow boundaries -- Objects with a very recognizable profile - -### Medium-Prominence Objects -These need correct proportions and 2-4 meaningful sub-parts, but not micro-detail. - -### Low-Prominence Objects -These may stay simplified, but must still avoid obviously nonsensical primitive stacks. - -## MINIMUM-PART DECOMPOSITION RULE - -For any camera-visible prop, preserve the silhouette with a minimum-part decomposition rather than a single primitive or disconnected rough stack. - -General patterns: -- **Structural hard-surface prop:** primary mass + support/attachment element + edge treatment -- **Organic sprig/foliage prop:** stem or branch structure + leaf-bearing surfaces or clustered leaf volume -- **Contained or hollow prop:** body volume + opening/rim + support or handle logic -- **Wearable or contact-based prop:** upper body mass + contact/base mass + toe/heel/end-shape logic where applicable - -**Rule:** If the object is represented only by thin lines, raw primitives, or unrelated blocks, it is still in blockout, not finished. - -## ASSEMBLY AND POSITIONING RULES INSIDE `execute_code` - -When constructing multi-part geometry: -- Build from the base outward -- Derive attachment points from dimensions, radii, and thicknesses -- Compute contact surfaces instead of eyeballing offsets -- Use `mathutils.Vector` and `matrix_world @ Vector(...)` when rotation affects placement - -For close-contact placement: -- Determine the supporting surface of the existing object -- Determine the actual half-extent of the incoming object -- Place by surface-to-surface contact plus a small margin - -Do not hardcode arbitrary offsets when you can calculate attachment or support positions from geometry. - -## VISUAL QUALITY RULES - -- Add bevels or softened edges to avoid overly sharp CG primitives -- Prefer tapered and non-uniform forms over perfect cylinders and cubes when realism requires it -- Use repeated sub-elements or clustered forms instead of bare placeholders for organic detail -- Keep naming explicit so follow-up refinement passes can target the right object cleanly - -## COMMON FAILURES TO AVOID - -1. ❌ Building the entire reference scene in one monolithic `execute_code` pass -2. ❌ Treating screenshot review as optional instead of as the trigger for focused refinement -3. ❌ Leaving prominent props in raw blockout state because the overall layout is "good enough" -4. ❌ Using line-like proxies for foliage or other volume-bearing organic forms -5. ❌ Using disconnected primitive stacks for camera-visible props that need a clear unified silhouette -6. ❌ Rebuilding stable scene anchors when only one prop actually needs refinement -7. ❌ Using `execute_code` for lights, camera, or render settings when direct tools already cover the task diff --git a/data/tool-guides/export-guide.md b/data/tool-guides/export-guide.md deleted file mode 100644 index b071027..0000000 --- a/data/tool-guides/export-guide.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: "Export & File Format Guide" -category: "export" -tags: ["export", "GLB", "GLTF", "FBX", "OBJ", "STL", "file format", "3D printing", "game engine", "web", "UV", "cleanup", "texture dependencies", "missing image paths", "prepare_uv_layout", "validate_export_readiness", "inspect_export_cleanup_candidates", "inspect_export_texture_dependencies", "export_asset_package", "export_object"] -triggered_by: ["prepare_uv_layout", "validate_export_readiness", "inspect_export_cleanup_candidates", "inspect_export_texture_dependencies", "export_asset_package", "export_object"] -description: "Domain knowledge for 3D model export, file format selection, pre-export preparation, and format-specific considerations." -blender_version: "4.0+" ---- - -# Export & File Format Guide - -## FORMAT SELECTION - -| Format | Extension | Best For | Materials | Animation | Notes | -|---|---|---|---|---|---| -| **GLB** | `.glb` | Web, AR/VR, Three.js | ✅ PBR | ✅ | **Default choice** — single binary file, widely supported | -| GLTF | `.gltf` | Web (separate files) | ✅ PBR | ✅ | Same as GLB but textures as separate files | -| FBX | `.fbx` | Game engines (Unity, Unreal) | ✅ | ✅ | Industry standard for game dev | -| OBJ | `.obj` | Legacy compatibility | ⚠️ Basic | ❌ | Oldest format, universally supported | -| STL | `.stl` | 3D printing | ❌ No | ❌ | Mesh-only, no colors or materials | - -### Quick Decision Guide -- **Web/online viewer?** → GLB -- **Unity/Unreal?** → FBX -- **3D printing?** → STL -- **Simple mesh exchange?** → OBJ -- **Not sure?** → GLB (most versatile) - -## PRE-EXPORT CHECKLIST - -### Always Do Before Export -1. **Apply transforms** (`apply_transforms`) — Resets scale/rotation to identity, prevents distorted models -2. **Apply all modifiers** (if you want clean geometry) — SubSurf, mirrors, booleans become permanent -3. **Set correct origin** — Usually center of geometry or bottom center for grounding -4. **Inspect cleanup candidates** (`inspect_export_cleanup_candidates`) — Find helper empties, reference objects, hidden construction geometry, and protected modifier/constraint targets before cleanup -5. **Validate export readiness** (`validate_export_readiness`) — Catches missing UVs, invalid mesh data, missing textures, unapplied transforms, and format/path issues before export - -### UV Policy -- Imported assets: call `prepare_uv_layout` with `mode: "preserve_original"` first. Do not overwrite original UVs unless the user asks or validation reports no usable UVs. -- Generated or procedural meshes without UVs: call `prepare_uv_layout` with `mode: "smart_project"` before applying image textures or exporting GLB/FBX/OBJ. -- Existing UVs that only need cleaner packing: use `mode: "pack_existing"`. -- Bake/lightmap workflows: use `mode: "lightmap_pack"` with a named UV map. -- Treat partial UVs, degenerate UV islands, and UV bounds far outside 0-1 as export-readiness problems. Run `validate_export_readiness` after any UV prep before exporting. - -### Texture Portability Policy -- For portable GLB/FBX/OBJ delivery, prefer PNG or JPEG image textures. -- Use `inspect_export_texture_dependencies` before repair work when a model has missing textures, white materials, empty image paths, packed images, or risky image formats. It gives the exact material/node/image dependency list without mutating the scene. -- If `validate_export_readiness` or `inspect_export_texture_dependencies` reports WebP, AVIF, HEIC, PSD, TIFF, missing image paths, empty image paths, or unpacked sidecar risks, fix those before export when the asset needs to work in browsers, game engines, or external viewers. -- Packed images are acceptable for Blender-internal work, but exported interchange assets should still be validated in the target viewer. - -### Recommended Tool Sequence -Use `export_asset_package` for normal user-requested exports. It runs UV prep, optional rotation/scale application, readiness validation, export, and expected-file reporting in one deterministic flow: - -```text -export_asset_package( - names=["HeroMesh"], - filepath="C:/exports/hero.glb", - file_format="GLB", - uv_mode="preserve_original", - apply_transforms=true -) -``` - -Use the lower-level sequence only when a validation report needs manual repair: - -1. `prepare_uv_layout(names, mode: "preserve_original")` -2. If missing UVs on a generated mesh, `prepare_uv_layout(names, mode: "smart_project")` -3. `inspect_export_cleanup_candidates(names, action: "report")` before deleting, hiding, or moving helpers -4. `inspect_export_texture_dependencies(names, file_format)` when texture portability is uncertain -5. `validate_export_readiness(names, filepath, file_format)` -6. Fix reported errors -7. `export_object(names, filepath, file_format)` - -### Format-Specific Prep -- **GLB/GLTF:** Ensure materials use Principled BSDF (auto-converts to PBR) -- **FBX:** Apply scale — FBX uses centimeters by default, Blender uses meters -- **STL:** Make sure mesh is watertight (no holes) for 3D printing -- **OBJ:** Materials export as separate .mtl file — keep files together - -## SCALE CONSIDERATIONS - -| Scenario | Scale Factor | Notes | -|---|---|---| -| Blender → Web (Three.js) | 1.0 (no change) | GLB preserves Blender units | -| Blender → Unity | 1.0 | Unity reads FBX scale correctly | -| Blender → Unreal | 100× | Unreal uses centimeters | -| Blender → 3D Print (mm) | 1000× | Blender meters → millimeters | - -## PATH HANDLING - -- Use **absolute paths**: `/tmp/model.glb`, `C:/tmp/export.fbx` -- Include the file extension in the path — it determines the format -- The tool creates parent directories if needed -- Existing files at the same path are overwritten - -## MATERIAL COMPATIBILITY - -| Material Feature | GLB | FBX | OBJ | STL | -|---|---|---|---|---| -| Base Color | ✅ | ✅ | ✅ | ❌ | -| Metallic/Roughness | ✅ | ✅ | ❌ | ❌ | -| Normal Maps | ✅ | ✅ | ⚠️ | ❌ | -| Emission | ✅ | ✅ | ❌ | ❌ | -| Transparency | ✅ | ✅ | ⚠️ | ❌ | - -## COMMON MISTAKES TO AVOID - -1. ❌ Exporting without applying transforms — causes scale/rotation issues in target application -2. ❌ Using STL when materials are needed — STL is mesh-only -3. ❌ Forgetting file extension in path — the tool uses file_format param or extension to determine format -4. ❌ Exporting unapplied modifiers — geometry won't match what you see in viewport -5. ❌ Using OBJ for PBR materials — OBJ only supports basic diffuse/specular, use GLB instead diff --git a/data/tool-guides/lighting-guide.md b/data/tool-guides/lighting-guide.md deleted file mode 100644 index 72d4b10..0000000 --- a/data/tool-guides/lighting-guide.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: "Lighting Setup & Configuration Guide" -category: "lighting" -tags: ["lighting", "light", "energy", "color temperature", "three-point", "studio", "sun", "spot", "area", "point", "HDRI", "environment", "world", "background", "set_world_environment", "setup_studio_scene", "validate_studio_scene", "frame_camera_to_targets", "add_light", "set_light_properties", "lamp", "candle", "lantern", "torch", "sconce", "chandelier", "emission", "shade", "lamp shade"] -triggered_by: ["set_world_environment", "setup_studio_scene", "validate_studio_scene", "frame_camera_to_targets", "add_light", "set_light_properties"] -description: "Domain knowledge for light type selection, energy scaling, color temperature, shadow configuration, and professional lighting setups in Blender." -blender_version: "4.0+" ---- - -# Lighting Setup & Configuration Guide - -## LIGHT TYPE SELECTION - -## STUDIO PREVIEW TOOLING - -For asset previews, product shots, or "make this model look good" requests, prefer `setup_studio_scene` before manually placing lights. It builds a reusable key/fill/rim area-light setup, frames the camera, and sets preview render defaults. - -Recommended sequence: -1. `setup_studio_scene(target_names, preset: "studio")` -2. `validate_studio_scene(target_names)` -3. If framing is weak, `frame_camera_to_targets(target_names, desired_frame_fill: 0.62)` and validate again. -4. `render_image(output_path)` - -`validate_studio_scene` now checks all eight world-space target bounding-box corners in camera space and reports `camera.frame_bounds`. Treat frame fill warnings as real composition problems: -- "too little" means the model is distant or visually weak; call `frame_camera_to_targets` with a higher `desired_frame_fill` before changing the whole lighting rig. -- "too much" or outside-frame warnings mean the model is cropped; call `frame_camera_to_targets` with a lower `desired_frame_fill` or larger `frame_margin`, then validate again. -- For product previews, a fill around 0.35-0.75 usually leaves enough professional breathing room. - -Use `add_light` and `set_light_properties` for custom scene lighting after the studio preset is in place or when the user asks for a specific lamp/sun/spot setup. - -Use `set_world_environment` for world/background changes after the scene rig is in place: -- `mode: "solid"` for clean studio backgrounds and controlled lighting. -- `mode: "hdri"` when the user provides or downloads an HDRI path and needs image-based environment lighting or rotation. -- `mode: "sky"` for outdoor daylight without downloading an HDRI. - -Do not write `execute_code` just to adjust background color, HDRI strength, or environment rotation. - -| Type | Behavior | Best For | Key Properties | -|---|---|---|---| -| **POINT** | Emits light in all directions from a point | Lamps, candles, fill lights | `energy`, `shadow_soft_size` | -| **SUN** | Parallel rays, position doesn't matter (only rotation) | Outdoor scenes, directional key light | `energy` (1–5 for EEVEE), `shadow_soft_size` | -| **SPOT** | Cone of light from a point | Stage lighting, focused highlights, dramatic | `energy`, `spot_size` (degrees), `spot_blend` | -| **AREA** | Emits from a rectangular/square surface | Soft studio lighting, product photography | `energy`, `size` (larger = softer shadows) | - -## ENERGY SCALE BY ENGINE - -Energy values differ dramatically between EEVEE and Cycles: - -| Light Type | EEVEE Energy | Cycles Energy | Note | -|---|---|---|---| -| POINT | 100–1000 W | 100–1000 W | Similar scale | -| SUN | 1–5 | 1–5 | Low values, very powerful | -| SPOT | 200–1500 W | 200–1500 W | Similar scale | -| AREA | 200–800 W | 200–800 W | Size affects perceived brightness | - -**Rule:** Start with these ranges and adjust. If the scene is too dark, multiply energy by 2–3×. If too bright, halve it. - -## COLOR TEMPERATURE REFERENCE - -Use these RGB values (0–1 range) to simulate real-world color temperatures: - -| Temperature | Name | RGB Value | Use Case | -|---|---|---|---| -| 1800K | Candle | (1.0, 0.58, 0.16) | Warm intimate scenes | -| 2700K | Warm tungsten | (1.0, 0.76, 0.46) | Indoor residential lighting | -| 3500K | Warm white | (1.0, 0.84, 0.66) | Office/commercial lighting | -| 4500K | Neutral | (1.0, 0.92, 0.82) | Neutral fill light | -| 5500K | Daylight | (1.0, 0.96, 0.92) | Outdoor daylight, key light | -| 6500K | Overcast | (0.87, 0.91, 1.0) | Cloudy sky, cool fill | -| 8000K | Blue sky | (0.75, 0.83, 1.0) | Shade/sky fill, cool rim | - -## PROFESSIONAL LIGHTING SETUPS - -### Three-Point Lighting (Most Common) -- **Key light** (AREA, right side, 45° above): Energy 600–800, warm daylight color, size 2.0 -- **Fill light** (AREA, left side, lower): Energy 200–400 (30–50% of key), cool blue tint, size 4.0 -- **Rim/back light** (SPOT, behind subject): Energy 400–600, white, creates edge separation - -Positioning relative to target at origin: -- Key: (5, -5, 5) — 45° right, 45° above -- Fill: (-4, -3, 2) — opposite side, lower -- Rim: (1, 6, 4) — behind, slightly off-center - -### Studio Product Lighting -- 4-light setup: Key (top-right), Fill (top-left), Ground bounce (below), Background (behind) -- All AREA lights with large sizes (5–8m) for extremely soft shadows -- Key energy 600, Fill 250, Bounce 100, Background 200 - -### Outdoor Sunlight -- SUN light: Energy 3–5, warm color (1.0, 0.95, 0.85), small angle (0.5°) for sharp shadows -- Sky fill: Large AREA light from above, energy 80–100, cool blue (0.3, 0.55, 0.9) - -### Dramatic/Cinematic -- Single strong SPOT as key (one side), energy 1000–1200 -- Colored rim SPOT from opposite side, energy 600–800, blue tint (0.3, 0.5, 1.0) -- Minimal or no fill light for high contrast - -## SHADOW GUIDELINES - -| Parameter | Effect | Recommendation | -|---|---|---| -| `shadow_soft_size` | Larger = softer/blurrier shadows | 0.5–1.0 for hard, 2.0–4.0 for soft | -| AREA `size` | Larger area = naturally softer shadows | 2.0 sharp, 5.0+ soft studio | -| SUN `angle` | Controls sun shadow softness | 0.5° sharp, 2–5° soft | - -## LIGHT-EMITTING OBJECT GEOMETRY — CRITICAL - -When creating geometry for objects that emit light (floor lamps, table lamps, candles, lanterns, sconces, chandeliers, torches), you MUST ensure light can actually escape the geometry: - -### Open Geometry Rule -- **Lamp shades** created from cones or cylinders MUST have an **open bottom** so the point light inside illuminates downward. A closed cone traps light completely — nothing reaches the scene. -- Use `bpy.ops.mesh.primitive_cone_add()` and then **delete the bottom face** (the n-gon cap), or create the shade manually from vertices without a bottom face. -- Alternatively, for simple shades, use a torus or ring shape that is inherently open. - -### Emission Material Rule -- The shade/housing material should use **Emission Color + Emission Strength** so the shade itself appears to glow, matching the point light inside: - ``` - bsdf.inputs['Emission Color'].default_value = (warm_r, warm_g, warm_b, 1.0) - bsdf.inputs['Emission Strength'].default_value = 2.0–5.0 - ``` -- This is especially important for translucent materials (fabric shades, paper lanterns, frosted glass) where real light would shine through. - -### Point Light Placement -- Place the POINT light **at the center of the open space**, not inside solid geometry. -- For a floor lamp with a cone shade, place the light at the **bottom opening of the cone**, slightly inside. -- For candles, place the light just above the flame geometry, not inside the wax body. - -### Checklist for Light-Emitting Objects -1. ✅ Shade geometry has at least one opening (bottom, top, or sides) -2. ✅ Shade material has Emission Color set to a warm tone -3. ✅ POINT light is placed at the opening, not trapped inside solid mesh -4. ✅ Light energy is high enough to illuminate surrounding objects (500W+ for lamps) -5. ✅ If the shade is translucent (paper, fabric), lower Roughness and add Emission Strength 2–5 - -## COMMON MISTAKES TO AVOID - -1. ❌ Using POINT lights for all lighting — AREA is better for soft, realistic shadows -2. ❌ Setting SUN energy to 100+ — SUN uses much lower values (1–5 for EEVEE) -3. ❌ Forgetting light color — default white (1,1,1) feels flat; warm key + cool fill adds depth -4. ❌ Only using one light — even simple scenes benefit from key + fill at minimum -5. ❌ Not aiming lights at the target — use Track To constraint or calculate rotation toward subject -6. ❌ Creating closed lamp shade geometry (cone/cylinder) around a point light — the light gets trapped and nothing illuminates the scene -7. ❌ Not adding emission material to lamp shades — the shade looks dark even when a light is inside, making it appear non-functional diff --git a/data/tool-guides/local-asset-guide.md b/data/tool-guides/local-asset-guide.md deleted file mode 100644 index b57435b..0000000 --- a/data/tool-guides/local-asset-guide.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "Local Asset Library Guide" -category: "assets" -tags: ["asset library", "catalog", "local assets", "curated assets", "import", "commodity props", "search_local_assets", "import_local_asset", "polyhaven", "sketchfab", "external assets"] -triggered_by: ["get_local_asset_library_status", "search_local_assets", "import_local_asset", "get_polyhaven_status", "get_polyhaven_categories", "search_polyhaven_assets", "download_polyhaven_asset", "get_sketchfab_status", "search_sketchfab_models", "download_sketchfab_model"] -description: "Guidance for using the curated local ViperMesh asset library before procedural modeling or external downloads." -blender_version: "5.0+" ---- - -# Local Asset Library Guide - -## WHEN TO USE LOCAL ASSETS FIRST - -Prefer the local curated asset library when the request includes: -- commodity props with familiar silhouettes -- repeated production assets used across many scenes -- realism-oriented decor, furniture, foliage, accessories, or footwear -- user-provided private assets that should stay available across sessions - -Examples of good local-asset candidates: -- shoes, bags, lamps, books, vases, baskets -- small furniture and decor pieces -- plant arrangements and common foliage props -- branded or user-owned assets that should not be regenerated - -## DECISION RULE - -Choose the local asset library before `execute_code` when: -1. the prop is recognizable and reusable across scenes -2. the task benefits from realistic silhouette more than from bespoke procedural control -3. the asset does not need scene-specific topology generation - -Choose `execute_code` instead when: -- the object is unique to the scene -- the shape is simple and faster to model than to search -- the user explicitly asked for procedural generation -- no acceptable local asset match exists - -Choose PolyHaven when: -- you need CC0-safe external textures, HDRIs, or models -- the local library does not contain a suitable match - -Keep the workflow hybrid: -- use direct tools for room structure, spatial layout, cameras, lights, transforms, and render setup -- reserve `execute_code` for unsupported custom hero forms or procedural geometry that direct tools cannot express -- use local curated assets for commodity props that benefit from a prepared silhouette -- after import, always treat scale and orientation as suspect until checked in scene context - -## SEARCH STRATEGY - -When searching the local catalog: -- start with the object's plain-language noun phrase -- add category or style filters only after the first search -- prefer the highest-quality match that already fits the intended realism/style -- do not import multiple near-duplicate assets unless comparison is necessary - -## IMPORT STRATEGY - -After importing a local asset: -- inspect what objects or collections were added -- place and scale it deliberately in scene context -- if the asset is complex, adjust only the root-level transforms first -- confirm silhouette and proportion with `get_viewport_screenshot` -- do not assume two different local assets share consistent real-world scale; correct them relative to nearby objects - -## QUALITY RULE - -For camera-visible detail props, a strong local asset match is better than a crude procedural proxy. - -Do not spend multiple refinement passes procedurally rebuilding a common prop if the local curated library already contains a better reusable asset. diff --git a/data/tool-guides/material-realism-guide.md b/data/tool-guides/material-realism-guide.md deleted file mode 100644 index 7cb4315..0000000 --- a/data/tool-guides/material-realism-guide.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: "Material Realism & Surface Differentiation Guide" -category: "materials" -tags: ["material", "realism", "PBR", "glass", "transparent", "IOR", "surface", "differentiation", "floor", "wall", "furniture", "category"] -triggered_by: ["create_material"] -description: "Higher-level material engineering principles for creating visually distinct and physically plausible materials across different functional surfaces. Covers material differentiation strategy, transparency setup, and surface category guidelines." -blender_version: "5.0+" ---- - -# Material Realism & Surface Differentiation Guide - -## CORE PRINCIPLE: FUNCTIONAL SURFACE DIFFERENTIATION - -In any scene, objects serve different functional roles. Each functional category MUST have a visually distinct material. Viewers subconsciously expect: -- **Floors** to look different from **walls** -- **Furniture** to look different from **structural surfaces** -- **Metal fixtures** to stand out from **wood furniture** -- **Transparent surfaces** (glass) to be clearly distinguishable - -**Rule:** Before assigning materials, categorize every object into a functional group. Then ensure NO two groups share identical material parameters. - -## MATERIAL DIFFERENTIATION STRATEGY - -### Category-Based Material Planning -When building a scene with many objects, plan materials by category FIRST: - -``` -Scene: Coffee Shop -├── STRUCTURAL (walls, ceiling) → Wall_Mat: cream, roughness 0.85 -├── WALKING SURFACE (floor) → Floor_Mat: dark wood, roughness 0.65 -├── FURNITURE (tables, chairs, counter) → Furniture_Mat: medium wood, roughness 0.55 -├── FIXTURES (coffee machine, taps) → Metal_Mat: metallic 1.0, roughness 0.25 -├── TRANSPARENT (windows) → Glass_Mat: transmission 0.95, IOR 1.5 -└── DECORATIVE (cushions, plants) → Varied materials per item -``` - -### Same-Material-Type Differentiation -When multiple surfaces use the same base type (e.g., "wood"), differentiate with: - -| Differentiator | Floor Wood | Furniture Wood | -|---|---|---| -| Color tone | Darker/grayer | Warmer/richer | -| Roughness | 0.6–0.7 (worn) | 0.45–0.55 (polished) | -| Example RGB | [0.35, 0.22, 0.12] | [0.55, 0.35, 0.18] | - -## TRANSPARENT MATERIAL SETUP (Blender 5.x) - -### EEVEE Glass — Correct Pattern -Glass in EEVEE requires a full Principled BSDF setup with Blender 5.x socket names and transparency settings. -Prefer `create_material_preset` with preset `glass` for this work. The preset tool owns: - -- `Transmission Weight` instead of the old `Transmission` socket, -- IOR and roughness defaults, -- transparent material settings when needed, -- optional object assignment through `object_name`. - -After creating glass, call `inspect_material_node_graph` to verify that Blender accepted the expected sockets -and that the material is assigned to the intended object. Use `execute_code` only for custom shader networks -that the preset tool cannot express. - -### Common IOR Values -| Material | IOR | Notes | -|---|---|---| -| Air | 1.000 | Reference baseline | -| Water | 1.333 | Clear liquid | -| Ice | 1.309 | Frozen water | -| Glass (window) | 1.500 | Standard architectural glass | -| Glass (Pyrex) | 1.474 | Heat-resistant | -| Crystal | 2.000 | Decorative items | -| Plastic (clear) | 1.460 | Containers, packaging | -| Diamond | 2.418 | Gemstones | - -### EEVEE Transparency Alternatives -For interior windows where refraction isn't critical: -- **Transparent shader** is often better than Glass shader in EEVEE — prevents light bleed artifacts -- If reflections aren't needed, simply removing glass geometry is acceptable -- For scenes prioritizing visual quality, consider using Cycles for final render - -## PBR REALISM RULES - -### Metal vs. Non-Metal (Strict Binary) -| Property | Metal | Non-Metal | -|---|---|---| -| Metallic | **1.0** | **0.0** | -| Specular | Has no effect (driven by Base Color) | Leave at default 0.5 (= 4% reflectance) | -| Base Color | Bright values (HSV value ≥ 0.7) | Avoid pure black or pure white | - -**Rule:** Metallic is ALWAYS 0 or 1. Intermediate values (0.3, 0.5) create materials that don't exist in reality. - -### Surface Category Material Properties -| Surface | Roughness | Metallic | Character | -|---|---|---|---| -| Walls (plaster/paint) | 0.8–0.95 | 0.0 | Matte, light-absorbing backdrop | -| Floor (hardwood) | 0.5–0.7 | 0.0 | Semi-glossy, shows reflections | -| Floor (tile/stone) | 0.6–0.8 | 0.0 | Harder surface, slight sheen | -| Furniture (wood) | 0.4–0.6 | 0.0 | Polished, warmer color | -| Fabric/upholstery | 0.85–0.95 | 0.0 | Very matte, use Sheen for cloth | -| Metal fixtures | 0.15–0.35 | 1.0 | Highly reflective, contrasts room | -| Ceramic | 0.1–0.2 | 0.0 | Very smooth, near-mirror finish | - -### Cloth/Fabric Simulation -For fabric surfaces (cushions, upholstery), use the Sheen input: -```python -bsdf.inputs["Sheen Weight"].default_value = 0.5 # Blender 5.x name -bsdf.inputs["Roughness"].default_value = 0.9 -``` - -## MATERIAL ORGANIZATION BEST PRACTICES - -1. **Name materials descriptively**: `Wood_Oak_Light`, `Metal_Chrome`, `Glass_Window` — not `Material.001` -2. **One material per functional purpose**: Don't reuse `Wood_Mat` for both floor AND furniture -3. **Create materials before assigning**: Plan all materials, create them, THEN assign in a single pass -4. **Avoid duplicate material creation**: Check if a material with the same name already exists before creating - -## COMMON MISTAKES TO AVOID - -1. ❌ Same material on floor and furniture — always differentiate by color AND roughness -2. ❌ Setting metallic to 0.5 — use exactly 0 (non-metal) or 1 (metal) -3. ❌ Using "Transmission" instead of "Transmission Weight" — old 3.x socket name fails in 5.x -4. ❌ Creating glass with `create_material` alone — use `create_material_preset` preset `glass` for IOR/Transmission Weight -5. ❌ Forgetting `mat.blend_method = 'BLEND'` for transparent materials in EEVEE -6. ❌ Walls with same roughness as furniture — walls should be 0.8+ (matte), furniture 0.4–0.6 -7. ❌ Pure white/black base colors for non-metals — stay within 10–95% brightness range diff --git a/data/tool-guides/materials-guide.md b/data/tool-guides/materials-guide.md deleted file mode 100644 index f26cd93..0000000 --- a/data/tool-guides/materials-guide.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: "Materials & PBR Configuration Guide" -category: "materials" -tags: ["material", "PBR", "Principled BSDF", "metallic", "roughness", "color", "color space", "normal map", "glass", "metal", "wood", "plastic", "texture folder", "create_material", "assign_material", "create_material_preset", "create_pbr_material_from_textures", "inspect_material_node_graph", "normalize_material_texture_channels"] -triggered_by: ["list_materials", "create_material", "assign_material", "create_material_preset", "create_pbr_material_from_textures", "inspect_material_node_graph", "normalize_material_texture_channels", "set_texture"] -description: "Domain knowledge for Principled BSDF material setup, PBR parameter ranges, common surface presets, and Blender 5.x material API changes." -blender_version: "4.0+" ---- - -# Materials & PBR Configuration Guide - -## PRINCIPLED BSDF PARAMETER REFERENCE - -Prefer `create_material_preset` for material work. It creates a Principled BSDF graph, applies physically plausible preset defaults, optionally wires PBR texture maps, assigns the material to an object, and returns warnings if a socket or texture path is not usable. - -Use `create_pbr_material_from_textures` when the user gives a texture directory or file list instead of exact `texture_maps`. It infers common PBR map roles, calls `create_material_preset`, reports ignored or duplicate candidates, and should be followed by `inspect_material_node_graph`. - -Use `create_material` + `assign_material` only for very simple color/metallic/roughness surfaces. Use `execute_code` only for genuinely custom shader networks that the preset tool cannot express. - -Use `normalize_material_texture_channels` before hand-written repair scripts when imported materials look wrong because image color spaces may be misclassified. It is report-only by default. Set `apply_changes=true` only after reviewing the report or when the requested cleanup is clearly to correct PBR channel color spaces. - -The core Principled parameters are: - -| Parameter | Range | What It Controls | -|---|---|---| -| `color` (Base Color) | [R, G, B] 0–1 | Surface color | -| `metallic` | 0–1 | 0 = dielectric (plastic, wood), 1 = metal (steel, gold) | -| `roughness` | 0–1 | 0 = mirror/gloss, 1 = matte/diffuse | - -**Rule:** Metallic is almost always either 0 or 1. Values between 0.0 and 1.0 are physically unrealistic — real surfaces are either metal or non-metal. - -## COMMON SURFACE PRESETS - -### Metals (metallic = 1.0) -| Surface | Color [R,G,B] | Roughness | Notes | -|---|---|---|---| -| Polished steel | [0.8, 0.8, 0.85] | 0.15–0.25 | | -| Brushed steel | [0.8, 0.8, 0.85] | 0.35–0.5 | | -| Gold | [1.0, 0.84, 0.0] | 0.2–0.35 | | -| Copper | [0.95, 0.64, 0.54] | 0.25–0.4 | | -| Bronze | [0.8, 0.5, 0.2] | 0.3–0.5 | | -| Iron/cast | [0.5, 0.5, 0.5] | 0.6–0.8 | | -| Aluminum | [0.91, 0.92, 0.93] | 0.2–0.4 | | -| Chrome | [0.55, 0.55, 0.55] | 0.05–0.1 | Very reflective | - -### Non-Metals (metallic = 0.0) -| Surface | Color [R,G,B] | Roughness | Notes | -|---|---|---|---| -| White plastic | [0.9, 0.9, 0.9] | 0.3–0.5 | | -| Red plastic | [0.8, 0.1, 0.1] | 0.3–0.5 | | -| Rubber | [0.15, 0.15, 0.15] | 0.8–0.95 | Very matte | -| Wood (light) | [0.55, 0.35, 0.18] | 0.5–0.7 | | -| Wood (dark) | [0.25, 0.15, 0.08] | 0.5–0.7 | | -| Concrete | [0.5, 0.5, 0.48] | 0.85–0.95 | | -| Ceramic/porcelain | [0.95, 0.95, 0.92] | 0.1–0.2 | Very smooth | -| Fabric/cloth | [varies] | 0.85–0.95 | Very matte | - -### Special Materials - -| Surface | Key Properties | Notes | -|---|---|---| -| Glass | Transmission Weight = 0.9–1.0, IOR = 1.45–1.52, Roughness = 0.0–0.05 | Use `create_material_preset` preset `glass` | -| Water | Transmission Weight = 0.9, IOR = 1.33, Roughness = 0.02 | Use `create_material_preset` preset `glass` with IOR override | -| Skin | Subsurface Weight = 0.3, Subsurface Radius = [0.1, 0.05, 0.02] | | -| Emissive | Emission Color + Emission Strength | Use `create_material_preset` preset `emissive` | - -## BLENDER 5.x SOCKET NAME CHANGES - -> **CRITICAL:** These socket names changed in Blender 4.0+ and are the ONLY valid names in 5.x: - -| Old Name (3.x) | New Name (4.0+ / 5.x) | -|---|---| -| `Clearcoat` | `Coat Weight` | -| `Clearcoat Roughness` | `Coat Roughness` | -| `Sheen` | `Sheen Weight` | -| `Transmission` | `Transmission Weight` | -| `Subsurface` | `Subsurface Weight` | - -Always use the new names. The old names will cause errors in Blender 5.x. - -## MATERIAL ASSIGNMENT RULES - -1. **create_material_preset** can create and assign in one call when `object_name` is provided -2. **create_material** creates a simple material, **assign_material** applies it to an object -3. Default slot_index = 0 replaces the first material slot (most common) -4. Use slot_index = -1 to append as a new material slot (for multi-material objects) -5. An object can have multiple material slots, each applied to different faces - -## PBR TEXTURE MAP RULES - -When using `create_material_preset.texture_maps`, use these roles: - -| Role aliases | Connected to | Color space | -|---|---|---| -| `base_color`, `albedo`, `diffuse`, `color` | Principled Base Color | sRGB | -| `roughness`, `rough` | Principled Roughness | Non-Color | -| `metallic`, `metalness`, `metal` | Principled Metallic | Non-Color | -| `normal`, `normal_map` | Image Texture -> Normal Map -> Principled Normal | Non-Color | -| `emission`, `emissive` | Principled Emission Color | sRGB | -| `displacement`, `height` | Image Texture -> Displacement -> Material Output | Non-Color | - -After complex material setup, call `inspect_material_node_graph` to verify: -- non-color maps are actually Non-Color, -- normal maps route through a Normal Map node, -- the material is assigned to the intended object and slot, -- Blender accepted the expected 5.x socket names. - -For imported assets, run `normalize_material_texture_channels` when texture maps look too washed out, too dark, overly glossy, or normal maps appear flat. The tool infers texture roles from node labels, image names/paths, and linked sockets. It expects base color and emission maps to use sRGB, while roughness, metallic, normal, displacement, alpha, and ambient-occlusion maps use Non-Color. - -## COLOR VALUE REFERENCE - -Common colors in [R, G, B] format (0–1 range): - -| Color | RGB | | Color | RGB | -|---|---|---|---|---| -| Pure white | [1.0, 1.0, 1.0] | | Pure black | [0.0, 0.0, 0.0] | -| Red | [0.8, 0.1, 0.1] | | Blue | [0.1, 0.2, 0.8] | -| Green | [0.1, 0.6, 0.1] | | Yellow | [0.9, 0.8, 0.1] | -| Orange | [0.9, 0.4, 0.05] | | Purple | [0.5, 0.1, 0.7] | -| Teal | [0.05, 0.6, 0.55] | | Pink | [0.9, 0.3, 0.5] | -| Dark gray | [0.15, 0.15, 0.15] | | Light gray | [0.75, 0.75, 0.75] | - -## COMMON MISTAKES TO AVOID - -1. ❌ Setting metallic to 0.5 — it should be 0 or 1, not in between -2. ❌ Using old socket names (Clearcoat, Transmission) — use Coat Weight, Transmission Weight -3. ❌ Forgetting to assign the material after creating it — pass `object_name` to `create_material_preset` or call `assign_material` -4. ❌ Setting glass/water via `create_material` alone — use `create_material_preset` so Transmission Weight and IOR are deterministic diff --git a/data/tool-guides/modifiers-guide.md b/data/tool-guides/modifiers-guide.md deleted file mode 100644 index 60f74e4..0000000 --- a/data/tool-guides/modifiers-guide.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: "Modifier Usage & Configuration Guide" -category: "modifiers" -tags: ["modifier", "subdivision", "SubSurf", "bevel", "mirror", "boolean", "array", "smooth", "shade_smooth", "auto-smooth", "constraint", "stack", "mesh", "primitive", "cube", "sphere", "cylinder", "staircase", "stairs", "steps", "vertices", "faces", "repair", "cleanup", "loose", "normals", "decimate", "decimation", "voxel", "remesh", "quadriflow", "quad", "retopology", "add_mesh_primitive", "create_parametric_staircase", "create_mesh_from_data", "validate_mesh_geometry", "repair_mesh_geometry", "decimate_mesh", "voxel_remesh_mesh", "quadriflow_remesh_mesh", "inspect_modifier_constraint_stack", "add_modifier", "apply_modifier", "apply_transforms", "shade_smooth"] -triggered_by: ["add_mesh_primitive", "create_parametric_staircase", "create_mesh_from_data", "validate_mesh_geometry", "repair_mesh_geometry", "inspect_retopology_readiness", "decimate_mesh", "voxel_remesh_mesh", "quadriflow_remesh_mesh", "inspect_modifier_constraint_stack", "add_modifier", "configure_modifier", "configure_constraint", "add_object_constraint", "remove_object_constraint", "apply_modifier", "apply_transforms", "shade_smooth"] -description: "Domain knowledge for mesh modifier selection, configuration, stack ordering, and shading setup in Blender. Covers SubSurf, bevel, boolean, mirror, array, and auto-smooth." -blender_version: "4.0+" ---- - -# Modifier Usage & Configuration Guide - -## MESH FACTORY POLICY - -Use `add_mesh_primitive` for common base forms such as cubes, spheres, cylinders, cones, planes, and tori. This keeps simple object creation deterministic and leaves `execute_code` for genuinely custom geometry. - -Use `create_parametric_staircase` for stairs, stairways, stepped platforms, and architectural/interior staircase blockouts. Keep `shade_smooth: false` for hard-surface stair edges unless the user explicitly asks for a softened stylized result, then validate before adding bevels, railings, booleans, or export steps. - -Use `create_mesh_from_data` when the agent already has explicit vertices/faces for a simple custom mesh. This keeps mesh construction schema-owned and avoids generated Python for basic `mesh.from_pydata` work. - -Recommended sequence: -1. `add_mesh_primitive(primitive_type, name, validate: true)` for common primitives, `create_parametric_staircase(name, step_count, validate: true)` for staircase forms, or `create_mesh_from_data(name, vertices, faces, validate: true)` for explicit topology -2. `validate_mesh_geometry(names, cleanup: false)` -3. Add modifiers only after the validation report is clean - -Use `inspect_modifier_constraint_stack` before adding or applying modifiers to existing objects. This prevents duplicate SubSurf/Bevel/Boolean entries, catches missing Boolean targets, and shows whether constraints are already controlling an object. - -Use `validate_mesh_geometry(require_closed: true)` before 3D-printing or watertight export requests. Leave `cleanup: false` for inspection; use `cleanup: true` only when it is acceptable for Blender to mutate invalid mesh data. - -Use `decimate_mesh` for common dense-mesh reduction after `inspect_retopology_readiness`. Leave the default `mode: "COPY"` for source-preserving retopology experiments, then inspect and validate the result before rigging, export, or further remesh operations. Use `mode: "REPLACE"` only when the user explicitly asks for destructive replacement. - -Use `voxel_remesh_mesh` for common neural/sculpted mesh unification after inspection. Keep `mode: "COPY"` while evaluating voxel size, use smaller `voxel_size` values for detail preservation, and inspect/validate the result before decimation, QuadriFlow, rigging, or export. - -Use `quadriflow_remesh_mesh` when the goal is quad-dominant topology for rigging, animation, subdivision, or cleaner deformation. Keep `mode: "COPY"` while evaluating `target_faces`, and inspect/validate the result before binding, animation, subdivision, or export. Other QuadriFlow density modes are not exposed because latest-stable Blender 5.1.2 operator validation did not show stable behavior. - -Use `repair_mesh_geometry` when validation, retopology readiness, or export inspection finds duplicate vertices, loose vertices/edges, or inconsistent normals. Keep `mode: "COPY"` first, then validate the repaired result before retopology, rigging, or export. - -## MODIFIER SELECTION REFERENCE - -| Modifier | Type Enum | Purpose | Key Properties | -|---|---|---|---| -| **SUBSURF** | `SUBSURF` | Smooth mesh, add detail | `levels` (viewport), `render_levels` | -| **BEVEL** | `BEVEL` | Rounded edges | `width`, `segments`, `limit_method` | -| **MIRROR** | `MIRROR` | Symmetry | `use_axis` [X,Y,Z], `use_clip`, `merge_threshold` | -| **BOOLEAN** | `BOOLEAN` | Cut/join meshes | `operation`, `object`, `solver` | -| **ARRAY** | `ARRAY` | Repeat pattern | `count`, `relative_offset_displace` | -| **SOLIDIFY** | `SOLIDIFY` | Add thickness | `thickness`, `offset` | -| **DECIMATE** | `DECIMATE` | Reduce polygons | `ratio`, `decimate_type` | -| **SMOOTH** | `SMOOTH` | Smooth vertices | `factor`, `iterations` | -| **WIREFRAME** | `WIREFRAME` | Wire mesh | `thickness` | - -## SUBDIVISION SURFACE GUIDELINES - -| Level | Polygon Multiplier | Use Case | -|---|---|---| -| 0 | 1× | No smoothing (flat surfaces) | -| 1 | 4× | Light smoothing, preview | -| 2 | 16× | Standard quality for renders | -| 3 | 64× | High-quality close-ups | -| 4+ | 256×+ | Extreme detail — USE SPARINGLY (very slow) | - -**Rules:** -- Keep viewport levels ≤ 2 for performance -- Set render_levels 1 higher than viewport if needed -- Always apply SubSurf before export if target needs clean geometry - -## BEVEL GUIDELINES - -| Parameter | Purpose | Typical Values | -|---|---|---| -| `width` | Bevel size | 0.01–0.05 for subtle edge rounding, 0.1–0.5 for visible bevels | -| `segments` | Smoothness | 1 = chamfer, 3 = smooth, 6+ = very round | -| `limit_method` | Which edges to bevel | `ANGLE` (most common), `WEIGHT`, `NONE` | -| `angle_limit` | Angle threshold (if ANGLE) | 30° typical for hard-surface models | - -**Scale matters:** Bevel width is in world units. A 0.02m bevel on a 2m cube is subtle; on a 0.1m object it's huge. Always consider object scale. - -## BOOLEAN OPERATIONS - -| Operation | Result | -|---|---| -| `DIFFERENCE` | Cut the target shape out of the object | -| `UNION` | Merge two shapes together | -| `INTERSECT` | Keep only the overlapping volume | - -### Blender 5.x Boolean Solver -- **Use `EXACT` solver** — most reliable, handles complex geometry -- **`FAST` solver is REMOVED** in Blender 5.x — do NOT use it -- Available solvers: `EXACT`, `FLOAT`, `MANIFOLD` -- Always use `EXACT` unless you have specific performance concerns - -## SHADE SMOOTH & AUTO-SMOOTH - -### shade_smooth Tool -- `smooth: true` → Smooth shading (interpolated normals) -- `smooth: false` → Flat shading (faceted look) -- `angle` → Auto-smooth angle in degrees - -### Auto-Smooth Angle Guidelines -| Angle | Effect | Best For | -|---|---|---| -| 15–20° | Only very gentle curves smooth | Mechanical parts, hard-surface | -| **30°** | **Standard** — sharp edges stay sharp, curves smooth | **Most objects** | -| 45° | More aggressive smoothing | Organic shapes | -| 60–80° | Almost everything smoothed | Characters, soft objects | -| 180° | Everything smooth (equivalent to full smooth) | Spheres, fluid | - -## MODIFIER STACK ORDER - -Order matters! Modifiers are applied top to bottom: - -**Recommended order:** -1. Mirror (if using symmetry) -2. Array (if repeating) -3. Boolean (if cutting) -4. Subdivision Surface (smoothing) -5. Bevel (edge detail) — usually AFTER SubSurf or on its own - -**Bad patterns:** -- ❌ SubSurf before Boolean — can cause artifacts at cut edges -- ❌ Bevel before Mirror — creates asymmetric bevels at mirror seam - -## CONSTRAINT STACK CHECKS - -Use `inspect_modifier_constraint_stack` before editing constraints. Missing targets are usually a data problem, not a reason to write custom Python. For camera aiming, rigs, and tracked props, inspect the existing constraint first so the agent does not stack duplicate `TRACK_TO`, `DAMPED_TRACK`, or `COPY_TRANSFORMS` constraints. - -## APPLY TRANSFORMS - -**When to apply transforms:** -- ✅ Before export (GLB/FBX/OBJ) — prevents scale/rotation issues -- ✅ Before Boolean operations — ensures correct intersection -- ✅ Before adding physics simulations -- ✅ When object scale is not (1, 1, 1) - -**What it does:** Resets location/rotation/scale to identity (0/0/1) while baking the current transform into the mesh data. Visual appearance stays the same. - -## COMMON MISTAKES TO AVOID - -1. ❌ Using `FAST` boolean solver — removed in Blender 5.x, use `EXACT` -2. ❌ SubSurf level 4+ in viewport — causes extreme lag, keep viewport ≤ 2 -3. ❌ Forgetting to apply transforms before export — causes scaled/rotated models -4. ❌ Bevel width too large for small objects — always consider object scale -5. ❌ Not applying modifiers before joining objects — can lose modifier effects diff --git a/data/tool-guides/object-assembly-guide.md b/data/tool-guides/object-assembly-guide.md deleted file mode 100644 index 37162fd..0000000 --- a/data/tool-guides/object-assembly-guide.md +++ /dev/null @@ -1,322 +0,0 @@ ---- -title: "Multi-Part Object Assembly Guide" -category: "object-assembly" -tags: ["assembly", "compound", "multi-part", "parent", "attach", "connect", "hierarchy", "empty", "root-control", "locator", "pole", "arm", "joint", "furniture", "vehicle", "building", "array", "pattern", "grid", "radial", "local-coordinate", "local-handedness", "add_empty_object", "set_empty_properties", "parent_set", "set_object_transform", "arrange_objects", "duplicate_object_pattern", "create_primitive_assembly"] -triggered_by: ["add_empty_object", "set_empty_properties", "parent_set", "set_object_transform", "arrange_objects", "duplicate_object_pattern", "create_primitive_assembly"] -description: "Domain knowledge for building compound objects from primitives. Covers connection point calculation, parent-child assembly, flush attachment, and common archetypes like furniture, street infrastructure, and architectural elements." -blender_version: "4.0+" ---- - -# Multi-Part Object Assembly Guide - -## CRITICAL RULES - -1. **Build bottom-up.** Start with the base/foundation piece and calculate each subsequent piece's position relative to the piece it connects to. Never guess attachment points. - -2. **Calculate connection points, don't hardcode.** Use `base_z + base_height/2` to find the top of a base, then place the next piece starting there. This works regardless of where the base was placed. - -3. **Use parenting for compound objects that move together.** Parent all parts to a root Empty so the entire assembly can be moved/rotated as one unit. - -## ASSEMBLY STRATEGY - -### Step-by-Step Assembly Process -When building any compound object from primitives: - -1. **Identify the structural hierarchy** — Which part is the base? What attaches to what? -2. **Create the base part first** — Position it at the intended world location -3. **Calculate each attachment point** — Use the base part's position + half its dimensions -4. **Create child parts at calculated positions** — Each child's position derives from its parent geometry -5. **Optionally parent all parts** — Group under an Empty for unified control - -## DIRECT PATTERN TOOLS - -Use `create_primitive_assembly`, `arrange_objects`, and `duplicate_object_pattern` before `execute_code` for repeated objects, scene dressing, local-coordinate part families, and symmetrical layouts. These tools cover the common Python-loop cases: - -- L-brackets, fixture plates, simple furniture, object families, and rotated assemblies with preserved local handedness -- bar stools in front of a counter -- columns, fence posts, books, lamps, table legs, wheels, bolts, and tiles -- product objects evenly spaced on a pedestal -- plants/rocks/props distributed in a row or grid -- circular/radial displays around a centerpiece - -### Create A Local-Coordinate Primitive Assembly - -Use `create_primitive_assembly` when a compound object can be described as bounded cube/sphere/cylinder/cone/plane/torus parts in a shared local coordinate frame. This is the direct-tool replacement for generated Python that creates many primitive children, transforms them through a root rotation, and parents them to a root Empty. - -```text -create_primitive_assembly( - name="Bracket_Rz90", - location=[1.2, 0, 0], - rotation=[0, 0, -90], - parts=[ - { primitive_type="cube", name="Bracket_Plate", local_location=[0,0,0.7], scale=[1.0,0.2,1.4], size=1 }, - { primitive_type="cube", name="Bracket_Foot", local_location=[0.55,0,0.09], scale=[1.1,0.55,0.18], size=1 }, - { primitive_type="cylinder", name="Bracket_Bolt_A", local_location=[-0.32,-0.14,0.48], local_rotation=[90,0,0], radius=0.08, depth=0.08 } - ], - create_root_empty=true -) -``` - -Use `local_location` for each part center before the root rotation is applied. Use `local_rotation` for part orientation in the assembly frame, such as rotating cylinder depth onto a local face. After creation, run `inspect_scene_grounding` and `inspect_spatial_relations` to verify contact and handedness. - -### Arrange Existing Objects - -Use this when all objects already exist and only need clean spacing: - -```text -arrange_objects( - names=["Ball_Red", "Ball_Green", "Ball_Blue"], - layout="CIRCLE", - center=[0, 0, 0.25], - radius=0.9, - plane="XY", - align_bottom_to_z=0.1 -) -``` - -`align_bottom_to_z` grounds every arranged object by its bounding-box bottom. Use it for objects sitting on a shared plane such as a pedestal top, floor, shelf, or table. - -### Duplicate Into A Pattern - -Use this when one source object should become many repeated parts: - -```text -duplicate_object_pattern( - name="Stool", - count=3, - layout="LINE", - name_prefix="Counter_Stool", - spacing=0.75, - axis="X", - center=[0, 1.2, 0], - include_source=true, - align_bottom_to_z=0 -) -``` - -Prefer `linked=true` for lightweight repeated mesh instances when the duplicates should share geometry. Use `linked=false` when later edits may make the copies unique. - -Do not write generated Python loops for simple rows, grids, or radial duplication. Use focused `execute_code` only when the pattern must follow a custom curve, irregular terrain, or semantic per-item variation that these direct tools cannot express. - -### Connection Point Formulas - -**Top of a vertical piece (pole, leg, column):** -``` -top_z = pole.location.z + (pole_height / 2) -``` - -**Bottom attachment (seat on legs, shelf on brackets):** -``` -seat_z = leg_top_z + (seat_thickness / 2) -``` - -**Side attachment (arm from pole, sign from post):** -``` -arm_x = pole.location.x + (pole_radius) + (arm_length / 2) -arm_z = pole_top_z # or a specific fraction of pole height -``` - -**End of a horizontal arm:** -``` -end_x = arm.location.x + (arm_length / 2) -end_z = arm.location.z -``` - -## COMMON ARCHETYPES - -### Archetype 1: Street Lamp (Pole + Arm + Head + Base) - -``` -Structure: Base ← Pole ← Arm ← Head - │ │ │ └── Light source location - │ │ └── Horizontal, attached at pole top - │ └── Vertical, standing on base - └── Wide flat disc on ground -``` - -**Position calculations:** -```python -pole_height = 3.5 -pole_radius = 0.05 -arm_length = 0.5 -arm_radius = 0.03 -base_loc = (-1.5, 0, 0) - -# Base: flat disc on ground -base_z = base_loc[2] + 0.025 # half of base depth - -# Pole: centered on base, extends upward -pole_z = base_loc[2] + pole_height / 2 - -# Arm: horizontal, attached at pole top -arm_x = base_loc[0] + arm_length / 2 # extends from pole center -arm_z = base_loc[2] + pole_height # at pole top - -# Head: at END of arm, not offset from pole -head_x = base_loc[0] + arm_length # at arm tip -head_z = arm_z # same height as arm -``` - -**Common mistake:** Placing the head offset from the *pole*, not from the *arm tip*. The head connects to the arm's end, not the pole. - -### Archetype 2: Park Bench (Seat + Backrest + Legs) - -``` -Structure: Legs ← Seat ← Backrest - │ │ └── Angled panel, FLUSH against seat back edge - │ └── Flat board, sits on top of legs - └── 4 vertical posts, bottom at Z=0 -``` - -**Position calculations:** -```python -seat_height = 0.45 # real-world bench seat height -seat_width = 1.5 -seat_depth = 0.5 -seat_thickness = 0.05 -backrest_height = 0.4 -backrest_thickness = 0.05 -backrest_angle = -15 # degrees, tilted back -leg_thickness = 0.05 - -# Legs: bottom at Z=0, top at seat bottom -leg_height = seat_height - seat_thickness / 2 -leg_z = leg_height / 2 # center origin - -# Seat: sits on top of legs -seat_z = seat_height # center of seat thickness at seat_height - -# Backrest: FLUSH AGAINST the seat's back edge -# The backrest bottom should touch the seat top -import math -theta = math.radians(abs(backrest_angle)) - -# When rotated, the bottom edge shifts. Compensate: -backrest_center_z = seat_z + (seat_thickness / 2) + (backrest_height / 2) * math.cos(theta) -backrest_y = (seat_depth / 2) - (backrest_thickness / 2) # at back edge of seat - -# The backrest's location.y needs to account for rotation shifting it -backrest_y_shift = (backrest_height / 2) * math.sin(theta) -backrest_y_final = backrest_y + backrest_y_shift -``` - -**Common mistake:** Setting backrest location without accounting for rotation. A -15° tilt on X shifts the bottom edge upward and forward. - -### Archetype 3: Table (Top + Legs) - -``` -Structure: Legs ← Table Top - └── 4 vertical posts at corners -``` - -**Position calculations:** -```python -table_height = 0.75 # standard dining table -top_thickness = 0.04 -top_width = 1.2 -top_depth = 0.75 - -# Table top -top_z = table_height # center of thickness - -# Legs: inset from corners -leg_height = table_height - top_thickness / 2 -leg_z = leg_height / 2 -inset = 0.05 # legs slightly inside table edge - -corners = [ - (-top_width/2 + inset, -top_depth/2 + inset), - ( top_width/2 - inset, -top_depth/2 + inset), - (-top_width/2 + inset, top_depth/2 - inset), - ( top_width/2 - inset, top_depth/2 - inset), -] -``` - -### Archetype 4: Bookshelf / Shelving Unit - -``` -Structure: Side Panels ← Shelves ← Back Panel (optional) -``` - -**Evenly spaced shelves:** -```python -shelf_count = 4 -unit_height = 1.8 -shelf_thickness = 0.02 -usable_height = unit_height - shelf_thickness # subtract top/bottom - -spacing = usable_height / (shelf_count - 1) -for i in range(shelf_count): - shelf_z = shelf_thickness / 2 + i * spacing -``` - -### Archetype 5: Vehicle (Body + Wheels) - -``` -Structure: Body ← Wheels (4) -``` - -**Wheel placement:** -```python -body_width = 1.8 -body_length = 4.0 -wheelbase = body_length * 0.7 # 70% of body length -track = body_width # wheels at body edges -wheel_radius = 0.3 - -# Wheels sit on ground, center at wheel_radius height -wheel_z = wheel_radius -wheel_positions = [ - (-wheelbase/2, -track/2, wheel_z), # front-left - (-wheelbase/2, track/2, wheel_z), # front-right - ( wheelbase/2, -track/2, wheel_z), # rear-left - ( wheelbase/2, track/2, wheel_z), # rear-right -] -``` - -## PARENTING FOR ASSEMBLIES - -### When to Parent -- **Always parent** when the object should move/rotate as one unit -- **Use an Empty as root** for easy manipulation of the whole assembly -- **Prefer direct tools**: use `add_empty_object` for root controls, `parent_set` for parent-child links, and `organize_collection_hierarchy` when grouping, collection movement, parenting, and visibility changes belong in one batch - -`parent_set` and `organize_collection_hierarchy` preserve world transforms so child objects do not visually jump when parented. Use `add_empty_object` for the root helper instead of generated Python. - -### Root Empty Controls - -Create a non-rendered root control before parenting compound object parts: - -```text -add_empty_object(name="Lamp_Root", location=[-1.5, 0, 0], display_type="CUBE", display_size=0.35) -parent_set(parent_name="Lamp_Root", child_name="Lamp_Base") -parent_set(parent_name="Lamp_Root", child_name="Lamp_Pole") -parent_set(parent_name="Lamp_Root", child_name="Lamp_Arm") -``` - -An Empty is a transform handle, not visible geometry. Do not use it for renderable pieces; use it so `set_object_transform(name="Lamp_Root", ...)` moves the whole assembly safely. If the handle is hard to see or too large, adjust it with `set_empty_properties(name="Lamp_Root", display_type="SPHERE", display_size=0.5, show_in_front=true)`. - -### Using parent_set MCP Tool -``` -parent_set(parent="Lamp_Root", child="Lamp_Pole", keep_transform=true) -``` - -## VERIFICATION CHECKLIST - -After assembling a compound object, verify: - -1. ☐ **No floating parts** — Every part touches or connects to its neighbor -2. ☐ **Bottom at Z=0** — The base of the assembly sits on the ground plane -3. ☐ **Proportions match reality** — Compare dimensions to reference table -4. ☐ **Rotated parts are compensated** — Angled pieces have position offsets applied -5. ☐ **Use `get_viewport_screenshot`** — Visual check catches issues formulas might miss - -## COMMON MISTAKES TO AVOID - -1. ❌ **Placing child parts relative to world origin instead of parent geometry** — Arm position must derive from pole top, not from (0,0,0) -2. ❌ **Connecting to the wrong point of a rotated piece** — A rotated arm's endpoint is NOT at `arm.location.x + arm_length/2` — use `matrix_world @ Vector(local_point)` to find the real endpoint -3. ❌ **Forgetting that cylinder depth is FULL height, not half** — A `depth=3.5` cylinder extends 1.75m above and below its origin -4. ❌ **Not accounting for object radius in side attachments** — An arm touching a pole must offset by `pole_radius + arm_radius`, not just `arm_length/2` -5. ❌ **Hardcoding heights instead of calculating from connected parts** — If you change the pole height later, all attachment points break -6. ❌ **Hand-writing parenting logic when direct tools cover it** — Use `parent_set` or `organize_collection_hierarchy` so world transforms are preserved and child objects do not visually jump -7. ❌ **Building top-down** — Always start from the ground up to prevent accumulated positioning errors diff --git a/data/tool-guides/render-guide.md b/data/tool-guides/render-guide.md deleted file mode 100644 index 7075397..0000000 --- a/data/tool-guides/render-guide.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: "Render Settings & Output Guide" -category: "render" -tags: ["render", "EEVEE", "Cycles", "resolution", "samples", "denoising", "output", "PNG", "JPEG", "transparent", "setup_studio_scene", "validate_studio_scene", "render_thumbnail_to_path", "render_viewport_to_path", "inspect_render_artifact", "set_render_settings", "render_image"] -triggered_by: ["setup_studio_scene", "validate_studio_scene", "set_render_settings", "render_image", "render_thumbnail_to_path", "render_viewport_to_path", "inspect_render_artifact"] -description: "Domain knowledge for render engine selection, sample counts, resolution presets, output formats, and Blender 5.x EEVEE-Next changes." -blender_version: "4.0+" ---- - -# Render Settings & Output Guide - -## RENDER ENGINE COMPARISON - -| Feature | EEVEE (EEVEE-Next in 5.x) | Cycles | -|---|---|---| -| Speed | Very fast (real-time) | Slow (ray-traced) | -| Quality | Good for most use cases | Photorealistic | -| Shadows | Approximate | Physically accurate | -| Reflections | Screen-space | Full ray-traced | -| Use when | Speed matters, product previews, animations | Final quality renders, lighting-critical scenes | -| Engine enum | `BLENDER_EEVEE` | `CYCLES` | - -## SAMPLE COUNT GUIDELINES - -### EEVEE (Blender 5.x uses EEVEE-Next) -| Quality Level | Samples | Use Case | -|---|---|---| -| Preview | 16–32 | Quick checks, testing composition | -| Standard | 64 | Good quality, fast render | -| High | 128–256 | Final renders, smooth gradients | - -> **Blender 5.x sampling split:** `scene.eevee.taa_samples` controls viewport samples, while `scene.eevee.taa_render_samples` controls final render samples. - -### Cycles -| Quality Level | Samples | Use Case | -|---|---|---| -| Preview | 32–64 | Quick test renders | -| Standard | 128–256 | Good quality with denoising | -| High | 512–1024 | Noise-free, complex lighting | -| Extreme | 2048+ | Caustics, glass, very dark scenes | - -**Rule:** Always enable denoising for Cycles renders under 512 samples — it dramatically reduces noise. - -## INTERACTIVE PREVIEW RULE - -When the render is only for agent-side validation or user preview during an active build: -- Prefer **EEVEE** for fast preview renders -- If Cycles is required, keep it at **32-64 samples** with denoising -- Prefer lower preview resolution or `resolution_percentage < 100` unless the user explicitly asked for a final-quality frame -- Use higher sample counts only after the scene has already passed composition and silhouette review - -**Rule:** Do not spend interactive tool budget on near-final Cycles settings unless the user explicitly asks for final render quality. - -## CAMERA PRECONDITION - -Before `render_image`: -- ensure the scene has an active camera -- if you created a camera this run, explicitly set it active before rendering -- do not assume a newly added camera becomes active automatically in every workflow -- for model or asset previews, prefer `setup_studio_scene` and then `validate_studio_scene` before rendering - -**Rule:** If no active camera is confirmed, do not call `render_image` yet. - -## RENDER ARTIFACT INSPECTION - -After `render_thumbnail_to_path`, `render_viewport_to_path`, or `render_image` saves a file, use `inspect_render_artifact(image_path)` before treating the path as a successful visual result. - -The inspection is not a replacement for `get_viewport_screenshot` or human visual review. It catches cheap deterministic failure signals: -- dimensions are wrong or missing, -- mean brightness is near black or near white, -- alpha coverage suggests an unintentionally transparent render, -- edge pixels differ strongly from the corner background, which can indicate cropping or subject contact with the frame, -- corner background samples vary enough to question a clean studio backdrop. - -If `inspect_render_artifact.ready` is false, fix the reported issue with `validate_studio_scene`, `frame_camera_to_targets`, `set_world_environment`, or render settings before retrying the render. Do not keep rerendering the same scene without changing the cause. - -## RENDER FAILURE POLICY - -If a preview or final render fails once during the current run: -- do not keep retrying renders repeatedly in the same run -- fix obvious non-render issues only if they are cheap and certain -- otherwise stop at the failed render, explain the issue to the user, and ask whether to retry in a separate follow-up run - -**Rule:** One failed render should not consume the rest of the interactive execution budget. - -## RESOLUTION PRESETS - -| Name | Width × Height | Aspect | Use Case | -|---|---|---|---| -| 720p | 1280 × 720 | 16:9 | Quick previews | -| **1080p** | **1920 × 1080** | **16:9** | **Standard HD (most common)** | -| 1440p | 2560 × 1440 | 16:9 | QHD, high quality | -| 4K | 3840 × 2160 | 16:9 | Ultra HD, print | -| Square | 1080 × 1080 | 1:1 | Social media, Instagram | -| Portrait | 1080 × 1920 | 9:16 | Mobile/stories | - -**Use `resolution_percentage`** to scale output: 50 = half resolution (fast test), 100 = full. - -## OUTPUT FORMAT SELECTION - -| Format | Quality | File Size | Transparency | Best For | -|---|---|---|---|---| -| **PNG** | Lossless | Large | ✅ Alpha | Default, quality renders | -| JPEG | Lossy | Small | ❌ No | Quick sharing, web | -| EXR | HDR lossless | Very large | ✅ Alpha | Compositing, post-processing | -| TIFF | Lossless | Large | ✅ Alpha | Print, archival | - -**Default recommendation:** PNG for most renders. Use JPEG only when file size matters and you don't need transparency. - -## TRANSPARENT BACKGROUND (`film_transparent`) - -**Default: `film_transparent: false`** — most scenes should NOT use transparency. - -### When to USE `film_transparent: true` -- **Product/object shots** where the object will be composited onto a different background -- **Asset renders** for catalogs, UI thumbnails, or web overlays -- **Compositing workflows** where the 3D render is layered over a photo/video - -### When NOT to use `film_transparent: true` -- **Interior scenes** (rooms, kitchens, hallways) — walls and floors ARE the background -- **Exterior scenes** (landscapes, cityscapes) — the sky/environment IS the background -- **Any scene with environment geometry** (ground planes, backdrops, skyboxes) - -> **Rule:** If the scene has walls, floors, or any environmental geometry, `film_transparent` should be `false`. Enabling it will make the background geometry partially invisible or remove it entirely, producing broken-looking renders. - -The output must be saved as PNG (or EXR) to preserve the alpha channel. JPEG does NOT support transparency. - -## BLENDER 5.x EEVEE-NEXT CHANGES - -> **CRITICAL — legacy top-level EEVEE toggles changed in Blender 5.x:** - -| Legacy Property | 5.x Guidance | -|---|---| -| `scene.eevee.use_ssr`, `scene.eevee.use_ssr_refraction`, `scene.eevee.use_screen_space_reflections` | Use current EEVEE ray-tracing / probe workflow instead of legacy SSR toggles | -| `scene.eevee.use_gtao`, `scene.eevee.gtao_distance`, `scene.eevee.gtao_quality` | Use current view-layer AO controls such as `view_layer.eevee.ambient_occlusion_distance` | -| `scene.eevee.use_bloom` | Use a compositor bloom/glare workflow | -| `scene.eevee.shadow_cascade_size` | Use current shadow controls such as `scene.eevee.shadow_resolution_scale`, `shadow_ray_count`, and `shadow_step_count` | - -### Valid Sampling Properties in Blender 5.x - -| Property | Purpose | -|---|---| -| `scene.eevee.taa_samples` | Viewport sampling | -| `scene.eevee.taa_render_samples` | Final render sampling | -| `view_layer.eevee.ambient_occlusion_distance` | Ambient occlusion distance control | - -## OUTPUT PATH HANDLING - -- Use **absolute paths** for output: `/tmp/render.png`, `C:/tmp/render.png` -- If no output_path is provided, `render_image` saves to the scene's default output path -- Name files descriptively: `/tmp/product_shot.png`, `/tmp/scene_render.png` -- The render overwrites existing files at the same path without warning - -## COMMON MISTAKES TO AVOID - -1. ❌ Confusing `scene.eevee.taa_samples` (viewport) with `scene.eevee.taa_render_samples` (final render) -2. ❌ Using legacy `use_bloom`, `use_ssr`, or `use_gtao` properties in Blender 5.x -3. ❌ Using `BLENDER_EEVEE_NEXT` instead of `BLENDER_EEVEE` in Blender 5.x -4. ❌ Setting Cycles samples to 2048+ without denoising — wastes render time -5. ❌ Saving transparent renders as JPEG — alpha channel is lost, use PNG -6. ❌ Forgetting to set the engine — always explicitly set EEVEE or CYCLES -7. ❌ Using near-final Cycles settings for an iterative preview render — use EEVEE or 32–64 sample Cycles first diff --git a/data/tool-guides/rigging-guide.md b/data/tool-guides/rigging-guide.md deleted file mode 100644 index 7807239..0000000 --- a/data/tool-guides/rigging-guide.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: "Rigging & Rigify Workflow Guide" -category: "rigging" -tags: ["rigging", "rigify", "armature", "skeleton", "metarig", "IK", "bone", "edit-bone", "bone alignment", "rig", "auto-rig", "mesh preparation", "edge loops", "joint", "weight cleanup", "create_rigify_metarig", "inspect_edit_bone_alignment", "set_edit_bone_alignment", "generate_rigify_rig", "bind_mesh_to_armature", "transfer_vertex_group_weights", "project_vertex_group_weights"] -triggered_by: ["inspect_rigging_data", "inspect_edit_bone_alignment", "set_edit_bone_alignment", "inspect_weight_paint_readiness", "normalize_vertex_group_weights", "create_rigify_metarig", "generate_rigify_rig", "bind_mesh_to_armature", "transfer_vertex_group_weights", "project_vertex_group_weights"] -description: "Research-backed guide for Rigify rigging workflows including mesh preparation, per-bone metarig alignment, IK bend requirements, rig generation, and post-rigging weight cleanup. Based on NotebookLM research with 9 cited sources." -blender_version: "4.0+ / 5.x" ---- - -# Rigging Guide — Blender Agent Best Practices - -> **Domain:** Rigging, Skeleton, Armature, Weight Painting -> **Version:** Blender 4.x / 5.x compatible -> **Purpose:** Guide the agent through correct rigging workflows. This is a RAG-injected tool guide — follow every step in order. - ---- - -## ⚠️ AGENT BEHAVIORAL RULES (MANDATORY) - -Before starting ANY rigging task, the agent MUST follow these rules: - -1. **ALWAYS delete default scene objects first.** If the scene contains a default Cube, default Light, or default Camera, delete them using `delete_object` before creating the character mesh. Check the pre-injected scene state for existing objects. - -2. **NEVER pose the rig after creation.** After rigging is complete, leave the character in **rest pose / T-pose**. Do NOT move IK handles, rotate bones, or "demonstrate" the rig works. The user will pose it themselves if needed. - -3. **NEVER add materials unless the user explicitly requests them.** Do not assign skin tones, colors, or any material to the character mesh unless the user's prompt specifically asks for materials or colors. The rigging task is about skeleton and weights — not appearance. - -4. **PREFER this guide's Rigify workflow over custom armature scripts.** If RAG context includes both this guide AND a custom armature script (like `humanoid_armature.py`), IGNORE the custom armature approach and follow the Rigify workflow described here (Section 2). Rigify produces production-quality rigs with IK controls, FK chains, and proper bone layers. - -5. **Scene cleanup comes first.** Before creating any geometry, ensure no conflicting objects exist. If the user wants a "fresh" character, the agent should clear the scene of irrelevant objects. - ---- - -## Decision: Direct Tools vs execute_code - -Rigging is still a multi-step workflow, but it should no longer default to freeform Python for -inspection and cleanup. Use direct ViperMesh tools whenever they cover the operation: - -- `inspect_rigging_data` before creating or modifying rigs, armatures, bones, vertex groups, or Armature modifiers. -- `inspect_weight_paint_readiness` before binding or cleaning weights. -- `create_rigify_metarig` for bundled human/animal templates. This creates only the blueprint and never auto-fits bones. -- `inspect_edit_bone_alignment` before and after metarig fitting to verify head, tail, roll, length, parent/child links, and Rigify type. -- `set_edit_bone_alignment` for explicit named edit-bone head/tail/roll edits. Keep each call small and model-driven. -- `generate_rigify_rig` only after every metarig bone is aligned and joint bend direction is verified. -- `bind_mesh_to_armature` to bind an existing mesh and armature with automatic, envelope, empty-group, or name-matched weights. -- `transfer_vertex_group_weights` when a clean weighted source and target have identical vertex topology. -- `project_vertex_group_weights` when a clean weighted source must project weights onto a retopologized or different-topology target. -- `normalize_vertex_group_weights` for bounded post-binding cleanup: influence limits, normalization, and tiny-weight pruning. -- `inspect_modifier_constraint_stack`, `configure_modifier`, `add_object_constraint`, and `configure_constraint` for modifier/constraint authoring that fits those schemas. - -Use `execute_code` only for custom bone placement logic that cannot be expressed as explicit named -`set_edit_bone_alignment` edits. Enabling Rigify, template creation, edit-bone inspection/alignment, -final generation, and mesh binding are now direct tools. Keep any fallback scripts focused and verify -with inspection tools before generation. - ---- - -## 1. Mesh Preparation (MANDATORY Before Rigging) - -Before adding ANY armature to a mesh, the mesh MUST be prepared: - -### 1.1 Geometry at Joints -Meshes need **sufficient vertex density at deformation zones** (knees, elbows, shoulders, neck, wrists, ankles). -Simple cylinders or low-poly primitives will deform terribly. - -```python -# Add edge loops at joint positions for clean deformation -import bpy, bmesh - -obj = bpy.data.objects['CharacterMesh'] -bpy.context.view_layer.objects.active = obj -bpy.ops.object.mode_set(mode='EDIT') - -# Subdivide the mesh to add geometry, especially at joints -bpy.ops.mesh.select_all(action='SELECT') -bpy.ops.mesh.subdivide(number_cuts=2) # 2 cuts minimum for joints - -bpy.ops.object.mode_set(mode='OBJECT') -``` - -### 1.2 Clean Topology -Before rigging, ALWAYS run these cleanup steps: - -```python -import bpy - -obj = bpy.data.objects['CharacterMesh'] -bpy.context.view_layer.objects.active = obj -bpy.ops.object.mode_set(mode='EDIT') - -# 1. Merge overlapping vertices (critical for auto-weights) -bpy.ops.mesh.select_all(action='SELECT') -bpy.ops.mesh.remove_doubles(threshold=0.0001) - -# 2. Fix normals -bpy.ops.mesh.normals_make_consistent(inside=False) - -# 3. Apply all transforms BEFORE rigging -bpy.ops.object.mode_set(mode='OBJECT') -bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) -``` - -### 1.3 Scale Check -If the mesh is small (under ~0.5 Blender units tall), **scale up 10x** before auto-weighting, -then scale back down after. Small meshes cause "Bone Heat Weighting: Failed" errors. - ---- - -## 2. Rigify Workflow (Correct Order) - -### 2.1 Template Selection -| Template | Use When | -|----------|----------| -| `basic_human` | Simple characters, no face rig needed, game-ready rigs | -| `human` | Full characters with facial animation (has jaw, eyes, lips, breast bones) | -| `basic_quadruped` | Four-legged animals | -| Other templates | `bird`, `cat`, `horse`, `shark`, `wolf` — species-specific | - -**Rule:** If unsure, use `basic_human`. The full `human` metarig has complex facial bones -that are unnecessary for most agent-generated characters and can complicate the rig. - -### 2.2 Enable Rigify - -`create_rigify_metarig` and `generate_rigify_rig` enable the bundled Rigify addon when needed. - -### 2.3 Create Metarig - -Call `create_rigify_metarig`. Prefer `basic_human` unless facial controls are explicitly needed. -The command returns bone and Rigify-type counts, then instructs the agent to stop for alignment. - -### 2.4 Align Metarig to Mesh (CRITICAL — Per-Bone, Not Uniform Scale) - -**WRONG approach** (causes rig to extend beyond mesh): -```python -# DON'T DO THIS — uniform bounding-box scale leaves bones outside limbs -scale_factor = mesh_height / meta_height -metarig.scale = (scale_factor, scale_factor, scale_factor) -``` - -**CORRECT approach** — per-bone alignment with direct tools: - -1. Call `inspect_edit_bone_alignment` on the metarig, requesting the bones you intend to fit. -2. Derive explicit target `head` and `tail` coordinates from the mesh silhouette, landmarks, or inspected bounds. -3. Call `set_edit_bone_alignment` with a small batch of named bone edits. -4. Call `inspect_edit_bone_alignment` again and verify every edited bone is centered inside the intended body volume. - -Example edit payload: - -```json -{ - "armature_name": "Character_Metarig", - "bones": [ - { "name": "spine", "head": [0, 0, 0.85], "tail": [0, 0, 1.25] }, - { "name": "upper_arm.L", "head": [-0.22, 0, 1.2], "tail": [-0.72, -0.02, 1.05] } - ] -} -``` - -### 2.5 Joint Bends (MANDATORY for IK) - -Elbows and knees MUST have a **slight bend** — never leave them perfectly straight. -The IK solver cannot determine fold direction for straight chains. - -Use `inspect_edit_bone_alignment` to read the current limb joint coordinates, then use -`set_edit_bone_alignment` to nudge elbow/knee joint heads slightly along the intended bend axis. -Keep the offset small and inspect again before generation. - -### 2.6 Generate Rig - -After alignment and inspection, call `generate_rigify_rig`. Do not set -`regenerate_existing` unless replacing the generated control rig is explicitly intended. - -### 2.7 Bind Mesh to Rig - -Call `bind_mesh_to_armature` with the target mesh and generated rig names. Use: - -- `AUTOMATIC` for initial organic-character bone heat weights. -- `ENVELOPE` only when envelope weighting is intentionally preferred. -- `EMPTY` when an artist will paint weights manually. -- `NAME` when valid bone-named vertex groups already exist. - -Leave `replace_existing` false unless inspection confirms that the previous Armature modifier, -armature parent, and matching deform groups should be replaced. - -### 2.8 Hide Metarig -```python -metarig.hide_set(True) -``` - ---- - -## 3. Post-Rigging Weight Cleanup (MANDATORY) - -After binding with auto-weights, ALWAYS run cleanup. Raw auto-weights are never good enough. - -Preferred direct-tool flow: - -1. Call `inspect_weight_paint_readiness` on the mesh and armature to confirm vertex groups, modifiers, and deform-readiness. -2. Call `normalize_vertex_group_weights` with a 4-influence limit, normalization, and tiny-weight pruning. -3. Call `inspect_rigging_data` again to verify the mesh still has the expected Armature modifier and vertex groups. - -Only use `execute_code` for cleanup when the direct tool reports that a requested operation is outside -its supported surface. - ---- - -## 4. Common Pitfalls & Troubleshooting - -### "Bone Heat Weighting: Failed to find solution" -**Cause:** Bad mesh topology. Fix with: -1. `Merge by Distance` (remove duplicate vertices) -2. Fix non-manifold geometry (edges connecting 3+ faces) -3. Separate intersecting loose parts (`P → Separate by loose parts`) -4. Scale mesh + armature up 10x, apply weights, scale back down - -### Rig Controls Extend Beyond Mesh -**Cause:** Uniform bounding-box scale on metarig, ignoring per-bone alignment. -**Fix:** Always do per-bone alignment (Section 2.4) after rough scale. - -### Mesh Warps/Pinches at Joints -**Cause:** Insufficient geometry at deformation zones. -**Fix:** Add edge loops or subdivide mesh before rigging (Section 1.1). - -### IK Limbs Bend Wrong Way -**Cause:** Perfectly straight joint chains — IK solver doesn't know which axis to fold. -**Fix:** Add slight bend to elbows (backward) and knees (forward) — Section 2.5. - ---- - -## 5. Verification Checklist - -After rigging, verify in Pose Mode: -- [ ] Select rig → enter Pose Mode (Ctrl+Tab) -- [ ] Rotate/move arm controls → mesh follows smoothly without pinching -- [ ] Rotate/move leg controls → knees bend correctly in one direction -- [ ] Move root control → entire character translates -- [ ] No mesh parts stay behind or warp unexpectedly -- [ ] Reset pose: Alt+R (rotation), Alt+G (location) diff --git a/data/tool-guides/scene-composition-guide.md b/data/tool-guides/scene-composition-guide.md deleted file mode 100644 index d04d813..0000000 --- a/data/tool-guides/scene-composition-guide.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -title: "Scene Composition & Interior Design Principles" -category: "scene-design" -tags: ["composition", "interior", "camera", "framing", "layout", "furniture", "placement", "spatial", "depth", "lamp", "lighting", "pendant", "shade", "light fixture", "text", "label", "signage", "annotation", "curve", "path", "cable", "vine", "rail"] -triggered_by: ["inspect_viewport_areas", "set_viewport_shading", "focus_viewport_on_objects", "get_viewport_screenshot", "render_viewport_to_path", "add_text_object", "add_curve_object", "set_curve_properties"] -description: "General 3D engineering principles for composing visually balanced interior and exterior scenes. Covers furniture placement, camera framing, visual hierarchy, and spatial organization." -blender_version: "5.0+" ---- - -# Scene Composition & Interior Design Principles - -## VISUAL HIERARCHY IN SCENES - -Every scene should have a clear visual hierarchy — the viewer's eye should be drawn to the most important elements first. Achieve this through: - -1. **Size contrast** — Prominent objects should be appropriately sized relative to the room -2. **Material contrast** — Key objects should have distinct materials from their surroundings -3. **Lighting emphasis** — Use spotlights or directional lights to draw attention to focal points -4. **Position** — Place hero objects at optical center or along rule-of-thirds lines - -## INTERIOR FURNITURE PLACEMENT RULES - -### Against-Wall Items -Objects that go "against" a wall should be positioned with a small gap: -```python -# CORRECT: 5cm gap from wall for realism -# If back wall is at Y=2.5 and has 0.2m thickness, wall inner face is at Y=2.4 -# A bookshelf 0.3m deep: center Y = 2.4 - 0.15 = 2.25 -bookshelf_y = wall_inner_y - (shelf_depth / 2) - 0.05 # 5cm gap - -# WRONG: Object embedded in or touching wall surface exactly -bookshelf_y = wall_inner_y # Will clip into wall -``` - -### Furniture Spacing -- **Walking clearance** between furniture groups: 0.6–1.0m minimum -- **Chair push-back clearance** behind seated positions: 0.5m -- **Counter stool spacing**: 0.6m center-to-center minimum -- **Table-to-wall clearance**: 0.8m for comfortable seating - -### Grounding — Nothing Should Float -Every object must touch a surface. Common Z-position calculations: -```python -# Object sitting on the floor (Z=0) -object_z = object_height / 2 # Center of mass at half height - -# Object on a table (table top at Z=0.75) -cup_z = table_top_z + cup_height / 2 - -# Object mounted on wall (wall at X=2.0) -painting_x = wall_x - painting_depth / 2 - 0.01 # Slight offset from wall -``` - -## CAMERA FRAMING FOR INTERIORS - -### Focal Length Guide -| Focal Length | Field of View | Best For | -|---|---|---| -| 18–24mm | Ultra-wide | Full room views, small spaces | -| 28–35mm | Wide | Standard interior shots, natural perspective | -| 50mm | Normal | Detail shots, furniture groups | -| 85mm+ | Telephoto | Close-up details, material showcase | - -**Rule:** For interior scene overviews, use **24–35mm**. Ultra-wide (< 20mm) causes severe perspective distortion. - -### Camera Placement (Interior Overview) -```python -# Standard interior overview: camera near one corner, looking diagonally -# For a 4m × 5m room: -camera_location = (1.5, -2.0, 1.6) # Near front-right corner, eye height -look_at = (-0.5, 1.0, 1.0) # Center-back of room, slightly below eye level - -# Rule of thumb: camera height 1.4–1.7m simulates human eye level -# Lower angles (0.8–1.0m) create dramatic/imposing feel -# Higher angles (2.5m+) create overview/dollhouse feel -``` - -### Ensuring All Objects Are Visible -After placing the camera, verify that important objects are within the camera frustum: -- Wide enough lens to capture the full room width -- Camera positioned far enough back to see front objects -- No important objects clipped by the frame edges -- Consider rotating camera slightly to include off-center elements - -## REFERENCE RECONSTRUCTION PRIORITIES - -When matching an image reference, do not treat all objects as equally important. - -1. **Block out scene anchors first** — floor, walls, major furniture, large framing elements -2. **Check composition before chasing detail** — use a viewport screenshot to confirm layout, scale, and camera angle -3. **Refine by camera prominence** — objects near the center, foreground, or strong light boundaries should get refinement before background accents -4. **Preserve recognizable silhouettes** — a visible prop needs enough sub-parts to read correctly from the active camera, even if the scene is otherwise simple -5. **Use focused follow-up passes** — if one visible prop reads poorly, refine that prop rather than rebuilding the entire scene - -## LIGHTING BALANCE PRINCIPLES - -### Interior Lighting Hierarchy -1. **Key light** — Main illumination source, establishes mood and shadow direction -2. **Fill light** — Fills shadowed areas, prevents pure black shadows (30-50% of key brightness) -3. **Accent/rim light** — Highlights edges and creates depth separation - -### Energy Balance to Prevent Overexposure -When using multiple lights in EEVEE: -- Total combined energy should not exceed what feels natural -- If key light is AREA at 600W, fill should be 200-300W max -- Avoid stacking multiple high-energy lights pointing at the same area -- **Start low, increase gradually** — it's easier to brighten than to diagnose overexposure - -### Warm vs. Cool Light Assignment -| Light Role | Warm Scenes | Cool/Professional Scenes | -|---|---|---| -| Key light | (1.0, 0.85, 0.7) warm amber | (0.95, 0.95, 1.0) neutral | -| Fill light | (1.0, 0.9, 0.8) soft warm | (0.85, 0.9, 1.0) cool blue | -| Accent | (1.0, 0.95, 0.85) | (0.9, 0.9, 1.0) | - -**Rule:** In warm scenes (cafés, homes), ALL lights should lean warm. Don't mix pure white lights with warm-colored lights — it creates an unnatural feel. - -## LIGHT PLACEMENT IN FIXTURES — CRITICAL - -When creating lamp, pendant, chandelier, or any light-emitting object: - -### The Cardinal Rule: Light Must Be BELOW or OUTSIDE the Shade - -A light source placed INSIDE a closed shade (cylinder, sphere, cone) is **trapped** and casts no useful illumination. The Blender light object must be positioned so rays can actually reach the scene. - -```python -# CORRECT: Light below the open bottom of a pendant/lamp shade -shade_bottom_z = lamp_z # Bottom of shade geometry -light_z = shade_bottom_z - 0.05 # 5cm below opening - -# WRONG: Light at center of shade (rays blocked by shade mesh) -light_z = shade_bottom_z + shade_height / 2 # Trapped inside! -``` - -### Fixture Light Placement Rules -| Fixture Type | Light Position | Light Type | -|---|---|---| -| **Pendant lamp** | 5–10cm BELOW shade opening | SPOT (cone down) or POINT | -| **Floor lamp** | At shade opening, facing upward or downward | SPOT or POINT | -| **Table lamp** | At the OPEN END of the shade, not the closed top | POINT | -| **Chandelier** | Below the fixture body, never inside arms/structure | POINT or AREA | -| **Wall sconce** | In front of the sconce plate, facing outward | POINT or SPOT | - -### Open Geometry for Shades -If you create a cylindrical or conical shade, **delete the bottom face** so it's open: -```python -# After creating cylinder for shade: -bpy.ops.object.mode_set(mode='EDIT') -bpy.ops.mesh.select_all(action='DESELECT') -bpy.ops.object.mode_set(mode='OBJECT') -shade.data.polygons[0].select = True # Bottom face -bpy.ops.object.mode_set(mode='EDIT') -bpy.ops.mesh.delete(type='FACE') -bpy.ops.object.mode_set(mode='OBJECT') -# Then place light BELOW this opening, not inside the now-hollow cylinder -``` - -## OBJECT NAMING CONVENTIONS - -Use descriptive, hierarchical names that make the scene tree readable: -``` -Room_Floor -Room_Wall_Back -Room_Wall_Left -Room_Wall_Right -Counter_Top -Counter_Base -CoffeeMachine_Body -CoffeeMachine_Spout -Stool_01 -Stool_02 -Table_Round_Top -Table_Round_Leg -Chair_01_Seat -Chair_01_Back -Light_Key_Area -Light_Fill_Spot -Camera_Main -``` - -## TEXT, SIGNAGE, AND LABELS - -Use `add_text_object` for readable scene labels, storefront signs, title cards, control labels, and annotations. Keep text short enough to read from the active camera and place it on a supporting surface or slightly in front of a wall to avoid z-fighting. - -Recommended pattern: -1. Create or reuse a material with `create_material_preset` or `create_material` -2. Call `add_text_object(text, name, location, rotation, size, align_x, align_y, material_name)` -3. Use `convert_to_mesh: true` only when the text needs mesh-only modifiers, export validation, or boolean/geometry operations -4. Confirm visibility with `focus_viewport_on_objects` or a screenshot/render tool - -## CURVES, PATHS, AND LINEAR ELEMENTS - -Use `add_curve_object` for cables, vines, rails, piping, trims, straps, arcs, decorative strokes, simple spirals, and path-like elements that would be brittle as generated Python. Start with Bezier curves for organic arcs, polylines for routed mechanical runs, circles for rings/loops, and spirals for coils or helixes. - -Recommended pattern: -1. Create the curve with `add_curve_object(curve_type, points, location, rotation, bevel_depth, material_name)` -2. Tune thickness, smoothness, fill, and open/closed state with `set_curve_properties` -3. Assign or update material through `material_name`; use emissive materials for glowing cable/light strokes -4. Use `convert_to_mesh: true` only when mesh-only modifiers, booleans, sculpting, or export validation require mesh data - -Keep `resolution` and `bevel_resolution` as low as the visual target allows. High curve resolution and thick bevels multiply generated geometry after conversion, so convert to mesh late and only when there is a concrete reason. For closed loops, set `cyclic: true`; for hanging cables, pipes, rails, and vines that terminate at endpoints, keep the curve open and place endpoints deliberately against the objects they attach to. - -## COMMON MISTAKES TO AVOID - -1. ❌ Furniture floating above floor — always calculate Z position from surface height -2. ❌ Objects clipping into walls — leave small gaps (2-5cm) from surfaces -3. ❌ Camera too close with wide lens — causes extreme distortion -4. ❌ All lights same energy — creates flat, shadowless scene -5. ❌ Mixing warm and cool lights randomly — stick to a consistent temperature palette -6. ❌ Forgetting to include fill light — single-light scenes have harsh, unrealistic shadows -7. ❌ Camera at ceiling height — use eye-level (1.4–1.7m) for natural perspective -8. ❌ **Placing light INSIDE a shade/fixture** — light must be BELOW/OUTSIDE the shade opening, not trapped inside closed geometry. This is the #1 cause of dark, non-functional lamps in scenes. diff --git a/data/tool-guides/scene-management-guide.md b/data/tool-guides/scene-management-guide.md deleted file mode 100644 index 6d5ee38..0000000 --- a/data/tool-guides/scene-management-guide.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: "Scene Management & Organization Guide" -category: "scene-management" -tags: ["scene", "transform", "collection", "parent", "origin", "visibility", "duplicate", "join", "rename", "delete", "hierarchy", "organization", "export cleanup", "set_object_transform", "rename_object", "duplicate_object", "join_objects", "parent_set", "parent_clear", "set_origin", "move_to_collection", "set_visibility", "delete_object", "select_scene_objects", "set_active_collection", "inspect_collection_hierarchy", "organize_collection_hierarchy", "inspect_export_cleanup_candidates"] -triggered_by: ["get_scene_info", "get_all_object_info", "select_scene_objects", "set_active_collection", "set_object_transform", "rename_object", "duplicate_object", "join_objects", "parent_set", "parent_clear", "set_origin", "move_to_collection", "set_visibility", "delete_object", "inspect_collection_hierarchy", "organize_collection_hierarchy", "inspect_export_cleanup_candidates"] -description: "Domain knowledge for object transforms, hierarchy management, collection organization, origin placement, and scene cleanup in Blender." -blender_version: "4.0+" ---- - -# Scene Management & Organization Guide - -## TRANSFORM REFERENCE - -### Location (World Space) -- Blender uses meters by default -- Origin (0, 0, 0) is the world center -- Z-axis is UP in Blender (not Y like in some game engines) -- Objects at Z=0 sit on the "ground plane" - -### Rotation (Euler XYZ, in degrees) -- The `set_object_transform` tool accepts degrees (auto-converts to radians internally) -- X rotation: tilts forward/backward (pitch) -- Y rotation: rolls left/right (roll) -- Z rotation: turns left/right (yaw) - -### Scale -- Default scale is (1, 1, 1) -- Uniform scale: use same value for all axes, e.g. (2, 2, 2) = double size -- Non-uniform scale: different per axis, e.g. (1, 1, 2) = stretched vertically -- **Apply transforms** before export to bake scale into mesh data - -## OBJECT PLACEMENT PATTERNS - -### Grounding Objects -Place objects so their bottom face sits at Z=0: -- For a 2m cube with origin at center: location Z = 1.0 (half the height) -- For a table 0.75m tall: location Z = 0.375 (if origin at center) -- Better: set origin to bottom first, then Z = 0 - -### Grid Layout -For arranging multiple objects in a row: -- Use consistent spacing (e.g., 2.5m apart for 1m objects) -- Keep objects on the same Z plane -- Example: 3 objects at X = -2.5, 0, 2.5 - -### Circular Arrangement -For objects around a center point: -- Calculate positions using angle: X = radius × sin(angle), Y = radius × cos(angle) -- Common for turntable displays, architectural columns - -## HIERARCHY (Parent-Child) - -### When to Use Parenting -- **Group movement:** Parent multiple parts to an empty, move the empty to move everything -- **Mechanical assemblies:** Parent wheels to car body, arms to torso -- **Organization:** Group related objects under an empty controller - -### Parent Types -| Type | Use Case | -|---|---| -| `OBJECT` (default) | Standard parent-child, child follows parent transforms | -| `ARMATURE` | Character rigging, deformable mesh | -| `BONE` | Attach to specific bone in armature | - -### Rules -- Child transforms are relative to parent -- `parent_clear` with `keep_transform: true` preserves world position -- Deeply nested hierarchies (>3 levels) should be avoided for performance - -## COLLECTIONS (Blender's "Folders") - -### Organization Patterns -| Collection Name | Purpose | -|---|---| -| `Geometry` | Main scene objects | -| `Lights` | All light objects | -| `Cameras` | Camera objects | -| `Helpers` | Empties, constraints, controllers | -| `Export` | Objects ready for export | -| `Reference` | Hidden reference objects | - -### Rules -- Use `create_new: true` to create collections on the fly -- An object can exist in multiple collections (but usually shouldn't) -- Use `organize_collection_hierarchy` for collection-level visibility changes. -- Use `inspect_export_cleanup_candidates` before hiding, moving, or deleting helper/reference/construction objects for export. It protects explicit export targets and objects referenced by modifiers, constraints, or parenting. - -## ORIGIN PLACEMENT - -| Origin Type | Enum | Effect | Use Case | -|---|---|---|---| -| Geometry to origin | `ORIGIN_GEOMETRY` | Moves origin to mesh center | Most common, after modeling | -| Origin to geometry | `GEOMETRY_ORIGIN` | Moves mesh so origin is at mesh center | Centering objects | -| Origin to cursor | `ORIGIN_CURSOR` | Origin snaps to 3D cursor position | Precise placement | -| Origin to volume center | `ORIGIN_CENTER_OF_VOLUME` | Origin at volumetric center | Even weight distribution | - -### Common Patterns -- **Grounding:** Set origin to bottom of mesh, then location Z=0 -- **Rotation pivot:** Set origin to the logical center of rotation -- **Export prep:** Origin at geometry center for consistent import - -## DUPLICATE vs. LINKED DUPLICATE - -| Parameter | Full Duplicate | Linked Duplicate (`linked: true`) | -|---|---|---| -| Mesh data | Independent copy | **Shared** (editing one edits all) | -| Materials | Independent | Independent | -| Memory | Uses more RAM | Very efficient | -| Use case | Independent objects | Instancing (trees, chairs, bolts) | - -**Rule:** Use linked duplicates for identical objects (like array of pillars) to save memory. Use full duplicates when each copy will be modified independently. - -## NAMING CONVENTIONS - -| Pattern | Example | Purpose | -|---|---|---| -| Descriptive | `Table_Leg_Front_Left` | Clear identification | -| Numbered | `Column_001`, `Column_002` | Repeated elements | -| Prefixed | `GEO_Wall`, `LGT_Key`, `CAM_Main` | Type identification | - -**Rules:** -- Avoid generic names like "Cube", "Cube.001" — always rename -- Use consistent naming within a scene -- `rename_object` also renames the underlying data block - -## COMMON MISTAKES TO AVOID - -1. ❌ Forgetting to apply transforms before boolean operations — causes misaligned cuts -2. ❌ Leaving objects named "Cube.001", "Cube.002" — always rename for clarity -3. ❌ Using deeply nested parent hierarchies (>3 levels) — causes transform calculation issues -4. ❌ Deleting objects that are boolean targets — breaks the boolean modifier on the source -5. ❌ Moving objects without considering origin placement — origin stays at old position -6. ❌ Joining objects with different materials without checking material slots — can lose materials diff --git a/data/tool-guides/spatial-positioning-guide.md b/data/tool-guides/spatial-positioning-guide.md deleted file mode 100644 index 81fd227..0000000 --- a/data/tool-guides/spatial-positioning-guide.md +++ /dev/null @@ -1,467 +0,0 @@ ---- -title: "Spatial Positioning & Rotation-Aware Placement Guide" -category: "spatial-positioning" -tags: ["position", "rotation", "transform", "offset", "grounding", "support surface", "alignment", "attachment point", "local point", "bounding box", "clearance", "spatial relation", "north of", "south of", "inside", "facing", "origin", "mathutils", "matrix", "execute_code", "set_object_transform", "align_object_to_surface", "align_object_attachment_points", "validate_object_clearance", "inspect_spatial_relations", "inspect_scene_grounding", "get_object_info"] -triggered_by: ["set_object_transform", "align_object_to_surface", "align_object_attachment_points", "validate_object_clearance", "inspect_spatial_relations", "inspect_scene_grounding", "get_object_info"] -description: "Domain knowledge for accurate object positioning in 3D space, including rotation-aware placement, relative offsets, grounding, alignment, and bounding-box math. Prevents floating objects, misaligned parts, and incorrect spatial relationships." -blender_version: "4.0+" ---- - -# Spatial Positioning & Rotation-Aware Placement Guide - -## CRITICAL RULES - -1. **NEVER assume an object's position — always query it first.** Before moving, stacking, or aligning any existing object, call `get_object_info` to read its current location, dimensions, and rotation. Hardcoded assumptions cause compounding errors. - -2. **Rotation changes the effective bounding box.** A 1×1×2 m box rotated 45° on X is no longer 2 m tall in world space. Always compute the world-space bounding box after rotation. - -3. **"Move up by 2" means RELATIVE to current position, not absolute Z=2.** For relative transforms, read current position first, then add the offset. - -4. **Use the `@` operator for matrix multiplication (Blender 2.8+).** The `*` operator performs element-wise multiplication and will raise a `TypeError` with Matrix/Vector types. - -## POSITIONING FUNDAMENTALS - -### Origin-Aware Height Calculation -Every Blender primitive has its origin at its geometric center by default. - -| Primitive | Origin Position | Bottom Z | Top Z | -|---|---|---|---| -| Cube (size=S) | Center | `loc.z - S/2` | `loc.z + S/2` | -| Cylinder (depth=D) | Center | `loc.z - D/2` | `loc.z + D/2` | -| Sphere (radius=R) | Center | `loc.z - R` | `loc.z + R` | -| Plane | Center (flat) | `loc.z` | `loc.z` | - -**After scaling:** Actual dimension = `size × scale_factor`. A cube with `size=1, scale=(1,1,2)` has height `1 × 2 = 2m`. - -**Formula — Ground an object (bottom at Z=0):** -``` -location.z = height / 2 -``` -For a cylinder with `depth=0.8`: `location.z = 0.4` - -**Formula — Stack object B on top of object A:** -``` -B.location.z = A.location.z + (A_height / 2) + (B_height / 2) -``` - -### Relative vs. Absolute Positioning -| User says... | Correct interpretation | -|---|---| -| "Place at Z=2" | Absolute: `obj.location.z = 2.0` | -| "Move up by 2" | Relative: `obj.location.z = current_z + 2.0` | -| "Place 3m to the right" | Relative: `obj.location.x = ref.location.x + 3.0` | -| "Place next to X" | Query X dims: `obj.location.x = X.loc.x + X_width/2 + obj_width/2 + gap` | - -**ALWAYS call `get_object_info` before applying relative transforms.** - -## ROTATION-AWARE POSITIONING - -### The Core Problem -When you rotate an object, its **local dimensions** stay the same but its **world-space bounding box** changes. A backrest panel rotated -15° on X has its bottom edge shift upward. - -### World-Space Bounding Box Calculation -`obj.bound_box` returns coordinates in **local space only**. To get the actual world-space bounding box of a rotated/scaled/moved object: - -```python -from mathutils import Vector - -def get_world_bbox(obj): - """Get all 8 bounding box corners in world space.""" - return [obj.matrix_world @ Vector(corner) for corner in obj.bound_box] - -# Usage: -world_corners = get_world_bbox(obj) -min_z = min(c.z for c in world_corners) # actual bottom -max_z = max(c.z for c in world_corners) # actual top -actual_height = max_z - min_z -``` - -### Effective Height After X-Axis Rotation -For an object with dimensions `(W, D, H)` rotated by angle `θ` around X: - -``` -effective_height = abs(H × cos(θ)) + abs(D × sin(θ)) -effective_depth = abs(H × sin(θ)) + abs(D × cos(θ)) -``` - -### Practical Example: Angled Backrest -A backrest `(3.0 × 0.1 × 0.8)` rotated -15° on X: -```python -import math -H, D = 0.8, 0.1 -theta = math.radians(15) -effective_h = abs(H * math.cos(theta)) + abs(D * math.sin(theta)) # ≈ 0.799m -bottom_shift = (H / 2) * (1 - math.cos(theta)) - (D / 2) * math.sin(theta) -# ≈ 0.0007m upward (nearly zero — the two effects almost cancel) -# For thin objects (D << H), the shift is tiny; for thick objects it matters more -``` - -**Rule: When placing a rotated object flush against a surface, account for the bottom-edge shift.** - -### Using mathutils.Matrix for Precise Placement -```python -import mathutils, math - -# Build a transformation: first rotate, then translate -rot = mathutils.Matrix.Rotation(math.radians(-15), 4, 'X') -loc = mathutils.Matrix.Translation((0, 0.25, 0.75)) -obj.matrix_world = loc @ rot - -# Order: Translation @ Rotation @ Scale -# Applied right-to-left: scale first, rotate second, translate last -``` - -### Local-to-World Attachment Points -When a piece attaches to a rotated object, compute the connection point in world space first. - -```python -from mathutils import Vector - -def local_point_to_world(obj, local_point): - return obj.matrix_world @ Vector(local_point) - -# Example pattern: -parent_tip_world = local_point_to_world(parent_obj, (0.0, 0.5, 0.0)) -child_socket_world = local_point_to_world(child_obj, (0.0, -0.25, 0.0)) -delta = parent_tip_world - child_socket_world -child_obj.matrix_world.translation += delta -``` - -**Rule:** If two rotated parts must meet cleanly, align named local attachment points in world space instead of guessing offsets from object origins. - -## ALIGNMENT PATTERNS - -### Center-to-Center (Stack Vertically) -``` -B.location.x = A.location.x -B.location.y = A.location.y -B.location.z = A.location.z + (A_height/2) + (B_height/2) -``` - -### Edge-to-Edge (Flush Surfaces) -Place B so its left face touches A's right face: -``` -B.location.x = A.location.x + (A_width/2) + (B_width/2) -``` - -### Place Object on a Surface with Gap -``` -B.location.z = surface_top_z + (B_height/2) + gap -``` - -### Support Placement via World-Space Bounding Boxes -For rotated or non-uniformly scaled objects, derive the true contact surfaces from the world-space bounding box: - -```python -from mathutils import Vector - -def world_bbox(obj): - corners = [obj.matrix_world @ Vector(corner) for corner in obj.bound_box] - min_corner = Vector((min(c.x for c in corners), min(c.y for c in corners), min(c.z for c in corners))) - max_corner = Vector((max(c.x for c in corners), max(c.y for c in corners), max(c.z for c in corners))) - return min_corner, max_corner - -obj_min, obj_max = world_bbox(obj) -support_min, support_max = world_bbox(support_obj) -delta_z = (support_max.z + 0.002) - obj_min.z -obj.matrix_world.translation += Vector((0, 0, delta_z)) -``` - -**Rule:** For "resting on" placement, move the object's actual world-space bottom to the support's actual world-space top. Do not approximate with `location.z + height/2` when rotation is involved. - -### Symmetric Placement -Place objects symmetrically around a center point: -```python -for i, offset in enumerate([-1.5, 0, 1.5]): - obj_copy.location.x = center_x + offset -``` - -## PROXIMITY & CONTACT RELATIONSHIPS - -These patterns handle natural language like "leaning against", "beside", "resting on", "inside a container". The core principle: **always compute the actual surface boundary of BOTH objects before positioning.** - -### CRITICAL: Scaled Dimensions - -```python -actual_extent_x = R × sx (NOT just R) -actual_extent_y = R × sy -actual_extent_z = R × sz -``` - - - -```python -half_x = (S / 2) × sx -half_y = (S / 2) × sy -half_z = (S / 2) × sz -``` - - -**ALWAYS multiply dimensions by scale factors before computing offsets.** - -### "Leaning Against" / "Beside" (Surface Contact) -Object B should touch but NOT penetrate object A: -```python -# Compute A's rightmost surface -A_right_edge = A.location.x + A_actual_half_width -# Compute B's leftmost surface offset from B's center -B_left_offset = B_actual_half_width -# Place B so its left surface touches A's right surface -B.location.x = A_right_edge + B_left_offset + margin # margin ≥ 0.01 -``` - -**Example — bananas leaning against a watermelon:** -```python -# Watermelon: radius=0.2, scale=(1.3, 1.0, 1.0) at X=-0.5 -wm_right_x = -0.5 + (0.2 * 1.3) # = -0.24 - -# Banana: radius=0.03 at whatever position -banana_x = wm_right_x + 0.03 + 0.01 # = -0.20 (just outside) -``` - -❌ **WRONG:** `banana_x = watermelon_x + 0.25` (ignores watermelon's actual width) -✅ **RIGHT:** `banana_x = watermelon_x + wm_radius * wm_scale_x + banana_radius + margin` - -### "Resting On" / "Sitting On" (Vertical Contact) -Object B sits on top of object A's surface: -```python -A_top_z = A.location.z + A_actual_half_height -B.location.z = A_top_z + B_actual_half_height + margin -``` - -For spheres on flat surfaces: -```python -# Sphere rests on table top -sphere.location.z = table_top_z + sphere_radius * sphere_scale_z -``` - -### "Inside a Container" (Contained Within) -Object B should be within the bounds of object A: -```python -# B center must satisfy: -# A.loc.x - (A_half_w - B_half_w) < B.loc.x < A.loc.x + (A_half_w - B_half_w) -# Same for Y and Z - -# Example: apples inside a crate -crate_interior_half_w = (crate_width / 2) - wall_thickness - apple_radius -apple.location.x = crate.location.x + random_offset # |offset| < crate_interior_half_w -apple.location.z = crate_floor_z + apple_radius # resting on crate floor -``` - -### "Clustered Together" / "Grouped" -Spread objects with minimum separation to avoid overlap: -```python -min_separation = obj_radius_A + obj_radius_B + 0.02 # 2cm gap -# For each new object, check distance to all existing objects -from mathutils import Vector -for existing in placed_objects: - dist = (Vector(new_loc) - Vector(existing.location)).length - if dist < min_separation: - # push new_loc outward -``` - -### Raycast Drop Placement for Irregular Surfaces -Axis-aligned stacking is not enough for sloped or uneven supports. Use `scene.ray_cast` in world space: - -```python -from mathutils import Vector - -depsgraph = bpy.context.evaluated_depsgraph_get() -origin = Vector((obj.location.x, obj.location.y, obj.location.z + 100.0)) -direction = Vector((0, 0, -1)) -hit, location, normal, face_index, hit_obj, matrix = bpy.context.scene.ray_cast( - depsgraph, - origin, - direction, - distance=200.0, -) -``` - -If the ray hits, translate the object so its world-space bottom sits at `location.z + margin`. - -### Direct Tool Surface Placement - -Use `align_object_to_surface` before writing Blender Python when the placement is expressible as bounding-box contact: - -```text -align_object_to_surface(name="Mug", placement="ON_TOP", reference_name="Table", margin=0.005) -validate_object_clearance(name="Mug", other_name="Table", margin=0.005) -align_object_to_surface(name="Chair", placement="GROUND", surface_value=0, margin=0) -align_object_to_surface(name="Shelf", placement="SIDE_POSITIVE", reference_name="Wall", axis="Y", margin=0.02) -validate_object_clearance(name="Shelf", other_name="Wall", margin=0.02) -``` - -This tool uses world-space bounds, so it handles scaled and rotated objects better than guessed center offsets. Use `execute_code` only for irregular/sloped support raycasts or local attachment points that the direct tool cannot represent yet. - -After any close placement, call `validate_object_clearance` when clipping would be visually obvious or functionally wrong. A positive margin means the objects must have at least that much separating gap along one axis; true overlap means their AABBs intersect on X, Y, and Z. - -### Named Relation Inspection - -Use `inspect_spatial_relations` when the task has explicit spatial constraints that a camera angle can hide: - -```text -inspect_spatial_relations(relations=[ - {"type": "north_of", "subject": "Table", "reference": "Rug"}, - {"type": "south_of", "subject": "Chair", "reference": "Table"}, - {"type": "facing", "subject": "Chair", "reference": "Table", "local_axis": "-Y"}, - {"type": "inside_xy", "subject": "Storage_Cube", "reference": "Rug"}, - {"type": "supported_by", "subject": "Laptop", "reference": "Table_Top"}, - {"type": "on_top_of", "subject": "Plant_Pot", "reference": "Shelf_Top"}, - {"type": "closer_to", "subject": "Laptop", "reference": "Chair", "other": "North_Wall"}, -]) -``` - -Use `above` and `below` only for broad vertical ordering. They do not prove physical contact. If a prompt says an object is on a table, on books, on a shelf, resting on a plinth, or supported by another object, include a `supported_by` or `on_top_of` relation for the semantic mesh that must make contact with the named support surface. This catches gaps that a render or camera angle can hide, such as a vase hovering just above a book stack while still passing an `above` check. - -If a relation fails, fix the named objects with `set_object_transform`, `align_object_to_surface`, `arrange_objects`, or curve tools, then run `inspect_spatial_relations` again. Do not use a flattering camera angle as proof that relation constraints are satisfied. - -### Direct Tool Attachment Point Alignment - -Use `align_object_attachment_points` when two rotated or offset parts must meet at precise local points: - -```text -align_object_attachment_points( - name="Sign_Arm", - obj_local_point=[-0.5, 0, 0], - reference_name="Pole", - reference_local_point=[0, 0, 1.75], - offset=[0.01, 0, 0] -) -``` - -This converts both local points with `matrix_world @ Vector(...)` and translates the moved object by the world-space difference. Use it for arms, handles, hinges, rails, decorative attachments, and assembly joints before falling back to custom matrix Python. - -### Safety Margin Reference -| Relationship | Minimum margin | -|---|---| -| Touching / leaning | 0.005–0.02 m | -| "Close but not touching" | 0.05–0.10 m | -| "Nearby" / "beside" | 0.10–0.30 m | -| "Well separated" | 0.50+ m | - -## REAL-WORLD DIMENSION REFERENCE - -Use these to validate proportions when the user doesn't provide exact sizes. - -### Furniture -| Object | Width | Depth | Height | Notes | -|---|---|---|---|---| -| Park bench (2-person) | 1.0–1.3 m | 0.45–0.50 m | Seat: 0.45 m | Backrest adds ~0.40 m | -| Park bench (3-person) | 1.35–1.80 m | 0.45–0.60 m | Seat: 0.45 m | | -| Dining chair | 0.45 m | 0.45 m | Seat: 0.45 m, Total: 0.90 m | | -| Office desk | 1.2–1.8 m | 0.60–0.75 m | 0.73–0.76 m | | -| Coffee table | 0.75–1.2 m | 0.50–0.75 m | 0.40–0.50 m | | -| Sofa (3-seat) | 2.0–2.5 m | 0.80–1.0 m | Back: 0.85 m | | -| Bed (queen) | 1.52 m | 2.03 m | Frame: 0.30–0.50 m | | - -### Street Furniture -| Object | Dimensions | Notes | -|---|---|---| -| Streetlamp (residential) | Height: 3–6 m, pole Ø: 0.08–0.12 m | Base Ø: 0.25–0.35 m | -| Streetlamp (urban) | Height: 4.5–9 m | | -| Trash can (outdoor) | Ø: 0.35–0.50 m, H: 0.75–0.95 m | | -| Fire hydrant | H: 0.60–0.75 m, Ø: ~0.20 m | | -| Bollard | H: 0.75–1.0 m, Ø: 0.10–0.15 m | | - -### Architecture -| Element | Dimensions | Notes | -|---|---|---| -| Door (standard) | 0.90 × 2.10 m | | -| Window | 1.0–1.5 m × 1.2–1.5 m | Sill at ~0.90 m | -| Ceiling height | 2.4–3.0 m | Residential | -| Wall thickness | Interior: 0.10–0.15 m | Exterior: 0.20–0.30 m | -| Stair step | Rise: 0.17 m, Run: 0.28 m | | - -### Human Reference -| Measurement | Value | -|---|---| -| Standing height | 1.70–1.80 m | -| Eye height (camera eye-level) | 1.55–1.70 m | -| Shoulder width | 0.40–0.50 m | -| Seated height | 0.80–0.90 m | - -## OBJECT FUNCTIONAL DIRECTION & CLEARANCE - -In professional 3D modeling, many objects have a **functional direction** — they are designed to be used, viewed, or accessed from a specific side. Understanding functional direction is critical for realistic scene composition. - -### Functional Direction Principle -Every object that serves a user or interacts with another object has an **intended usage axis**: - -| Object Type | Forward/Open Side | Back/Closed Side | -|---|---|---| -| Seating (chairs, sofas, benches) | Open seat side (where user sits from) | Backrest / back panel | -| Displays (monitors, TVs, paintings) | Screen / visible face | Back housing / wall mount | -| Storage (shelves, cabinets, fridges) | Door / access opening | Back panel against wall | -| Vehicles | Hood / front grille | Trunk / tailgate | -| Appliances (ovens, microwaves) | Door / control panel | Back venting | -| Speakers / audio equipment | Driver cone / front grille | Wiring / port panel | - -### Placement Rule: Face the Companion Object -When an object is described as being "at", "facing", or "pushed in" to another object, its **open/functional side faces the companion object**, and its **closed/back side faces away**. - -This means the back geometry extends **away** from the companion, never into it. - -### Algorithmic Placement for Directional Objects - -```python -# General formula: place object B facing object A -# 1. Determine A's near edge (the surface closest to where B should be) -A_near_edge = A_center - A_half_depth # or + depending on direction - -# 2. Place B so its FUNCTIONAL side (front) faces A, -# with its center offset by B's half-depth + clearance gap -B_center = A_near_edge - B_half_depth - clearance_gap - -# 3. The back of B extends AWAY from A: -B_back = B_center - B_back_extent # always farther from A, never closer - -# 4. Verify: B's closest point to A should not overlap A -B_closest_to_A = B_center + B_half_depth -assert B_closest_to_A < A_near_edge # must be outside A's bounding box -``` - -### Anti-Pattern: Reversed Functional Direction -If the back geometry is placed on the companion-object side: -- The back panel/structure **clips through** the companion -- The object appears oriented away from its companion (visually nonsensical) -- The user-facing side points at empty space instead of the interaction surface - -### AABB Clearance Validation -After placing **any** object near another, validate no intersection using axis-aligned bounding box (AABB) overlap detection: - -```python -def check_clearance(obj_a, obj_b): - """Return True if objects do NOT overlap (AABB test in world space).""" - from mathutils import Vector - a_corners = [obj_a.matrix_world @ Vector(c) for c in obj_a.bound_box] - b_corners = [obj_b.matrix_world @ Vector(c) for c in obj_b.bound_box] - - a_min = Vector((min(c.x for c in a_corners), min(c.y for c in a_corners), min(c.z for c in a_corners))) - a_max = Vector((max(c.x for c in a_corners), max(c.y for c in a_corners), max(c.z for c in a_corners))) - b_min = Vector((min(c.x for c in b_corners), min(c.y for c in b_corners), min(c.z for c in b_corners))) - b_max = Vector((max(c.x for c in b_corners), max(c.y for c in b_corners), max(c.z for c in b_corners))) - - overlap = (a_min.x < b_max.x and a_max.x > b_min.x and - a_min.y < b_max.y and a_max.y > b_min.y and - a_min.z < b_max.z and a_max.z > b_min.z) - return not overlap -``` - -This is a standard technique from real-time collision detection — use it whenever two objects must be close but not interpenetrating. - -## COMMON MISTAKES TO AVOID - -1. ❌ **Moving to Z=2 when user said "move up by 2"** — Read current position first -2. ❌ **Placing a rotated part at the unrotated height** — Rotation shifts the effective edges -3. ❌ **Assuming object size from creation params after scaling** — Actual size = param × scale -4. ❌ **Stacking without querying the lower object** — Never assume; always `get_object_info` -5. ❌ **Forgetting center-origin offset** — Bottom of a size=2 cube at origin is at Z=-1 -6. ❌ **Using `*` for matrix math** — Use `@` in Blender 2.8+ (PEP 465) -7. ❌ **Using absolute coords for relative instructions** — "3m right of table" ≠ x=3 -8. ❌ **Ignoring scale when computing proximity offsets** — A sphere(r=0.2, scale_x=1.3) extends 0.26m, NOT 0.2m. Always multiply: `actual_extent = radius × scale` -9. ❌ **Placing "beside" objects at a fixed offset from center instead of from surface** — "Beside" means surface-to-surface contact, not center-to-center distance -10. ❌ **Objects inside each other when meant to be touching** — Always compute both surfaces: `A_surface + B_half_width + margin`, never just `A_center + arbitrary_offset` -11. ❌ **Reversing an object's functional direction** — When placing an object "at" or "facing" a companion, the open/functional side must face the companion. Back geometry extends AWAY, never into the companion object. -12. ❌ **Skipping clearance validation after close placement** — After positioning any object near another, run an AABB overlap check to catch interpenetration before the user sees it -13. ❌ **Using local attachment coordinates as if they were already world-space** — always convert with `matrix_world @ Vector(...)` -14. ❌ **Using axis-aligned formulas on rotated or sloped supports** — derive contact from world-space bounding boxes or ray casts diff --git a/data/tool-guides/weight-painting-guide.md b/data/tool-guides/weight-painting-guide.md deleted file mode 100644 index 28400d8..0000000 --- a/data/tool-guides/weight-painting-guide.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: "Weight Painting & Vertex Group Guide" -category: "weight-painting" -tags: ["weight painting", "vertex groups", "deformation", "auto-weights", "bone heat", "normalize", "smooth weights", "limit total", "game engine", "export", "bmesh", "vertex group elements", "inspect_weight_paint_readiness", "normalize_vertex_group_weights", "bind_mesh_to_armature", "transfer_vertex_group_weights", "project_vertex_group_weights"] -triggered_by: ["inspect_weight_paint_readiness", "normalize_vertex_group_weights", "bind_mesh_to_armature", "transfer_vertex_group_weights", "project_vertex_group_weights"] -description: "Research-backed weight painting guide covering Python vertex group architecture, bmesh high-performance assignment, post-binding cleanup pipeline, game engine bone limits (4 max), smoothing techniques, and bone heat weighting troubleshooting. Based on NotebookLM research with 10 cited sources." -blender_version: "4.0+ / 5.x" ---- - -# Weight Painting Guide — Blender Agent Best Practices - -> **Domain:** Weight Painting, Vertex Groups, Deformation Quality -> **Version:** Blender 4.x / 5.x (verified via NotebookLM research) -> **Purpose:** Research-backed guide for the agent. Use direct weight-paint inspection and cleanup tools first; reserve `execute_code` for unsupported custom assignment logic. - ---- - -## CRITICAL: Weight Data Architecture - -> **Source:** StackExchange "How to set Vertex Weights in Blender 4.0 with Python" - -Weights are NOT stored in vertex groups — they are stored as **Vertex Group Elements** -bound to each individual vertex. Understanding this architecture is essential: - -- `obj.vertex_groups` → list of vertex groups (by name/index) -- `obj.data.vertices[x].groups` → vertex group elements for vertex x -- Each element knows its `weight` and `group` index -- **Vertex groups don't know their vertices** — you must check each vertex's elements - ---- - -## 1. Assigning Weights via Python - -### Standard Method: `group.add()` -```python -import bpy - -obj = bpy.data.objects['CharacterMesh'] -# Get or create vertex group -vg = obj.vertex_groups.get('Bone_Name') -if not vg: - vg = obj.vertex_groups.new(name='Bone_Name') - -# Assign weight to specific vertices -# Syntax: group.add(vertex_indices, weight, mode) -# Modes: 'REPLACE', 'ADD', 'SUBTRACT' -vg.add([0, 1, 2, 3], 1.0, 'REPLACE') # full weight -vg.add([4, 5, 6], 0.5, 'REPLACE') # half weight -vg.add([7, 8, 9], 0.0, 'REPLACE') # zero weight -``` - -### High-Performance Method: bmesh Deform Layer -> **Source:** Blender DevTalk "Manipulate vertex groups via bmesh" - -For high-poly meshes, looping through vertex group elements is too slow. -Use bmesh's deform layer for direct dictionary-like access: - -```python -import bpy, bmesh - -obj = bpy.data.objects['CharacterMesh'] -bpy.context.view_layer.objects.active = obj -bpy.ops.object.mode_set(mode='EDIT') - -bm = bmesh.from_edit_mesh(obj.data) -deform_layer = bm.verts.layers.deform.verify() - -# Get the vertex group index -group_index = obj.vertex_groups['Bone_Name'].index - -# Assign weights via deform layer (fast) -for vert in bm.verts: - vert[deform_layer][group_index] = 1.0 # or calculated weight - -bmesh.update_edit_mesh(obj.data) -bpy.ops.object.mode_set(mode='OBJECT') -``` - ---- - -## 2. Automatic Weights (Binding Mesh to Armature) - -Use `bind_mesh_to_armature` after `inspect_rigging_data` and -`inspect_weight_paint_readiness`. The `AUTOMATIC` mode runs Blender's bone heat -weighting; `ENVELOPE`, `EMPTY`, and `NAME` expose the other bounded parent modes. -Do not replace existing skinning state unless inspection shows that it is stale. - -For a duplicate mesh with identical vertex count and vertex order, use -`transfer_vertex_group_weights` to copy known-good groups by vertex index. This -tool deliberately rejects different topology. For a remeshed or retopologized -target, use `project_vertex_group_weights`; it wraps Blender's Data Transfer -modifier with vertex-group weights and matching group names. - ---- - -## 3. Post-Binding Weight Cleanup (MANDATORY) - -> **Source:** Reddit "Mesh deforms differently in Unity than in Blender" - -Raw auto-weights are never production-quality. Always run the **direct-tool cleanup pipeline** after binding: - -1. `inspect_weight_paint_readiness` — Check mesh, armature, vertex groups, Armature modifier, and likely export risks. -2. `normalize_vertex_group_weights` — Cap bone influences per vertex, normalize sums, and remove tiny weights. -3. `inspect_rigging_data` — Verify armature, modifier, and vertex group state after cleanup. - -> **Fallback:** Use `execute_code` only for custom vertex-by-vertex assignments or specialized bmesh workflows that the direct tools cannot express. -> This guide focuses on the *weight data architecture* (Section 1-2) and *advanced techniques* (Sections 4-7) that the rigging guide does not cover. - ---- - -## 4. Game Engine Export Rules - -> **Source:** Reddit r/Unity3D "Mesh deforms differently in Unity than in Blender" - -| Engine | Max Bones/Vertex | Notes | -|--------|-----------------|-------| -| Unity | 4 (default 2) | Change in Project Settings → Quality → Skin Weights | -| Unreal | 4-8 | 4 recommended for mobile, 8 for desktop | -| Godot | 4 | Standard limit | - -**If you don't limit to 4 in Blender before export, the mesh WILL deform incorrectly in-engine.** - -Unity-specific: In FBX import → Rig tab → change Skin Weights to "Standard (4 Bone)". - ---- - -## 5. Smoothing Techniques - -> **Source:** StackExchange "Simple methods to smooth out weight paints" - -### Smooth Tool (Python) -```python -bpy.ops.object.vertex_group_smooth( - group_select_mode='ALL', # or 'BONE_SELECT', 'BONE_DEFORM' - factor=0.5, - repeat=3 -) -``` - -### Smooth Tool (Manual — for agent instructions) -1. Enter Weight Paint mode -2. Activate vertex selection (cube icon with yellow vertex) -3. Select vertices to smooth -4. Click **Smooth** in tools panel -5. In operator options: select **'Selected Pose Bones'** subset - -> **⚠️ WARNING:** Using 'All' subset causes weight leaking — a single blue vertex -> will expand to cover all selected vertices. Always use 'Selected Pose Bones' -> with 'only selected' source mode to prevent unintended weight spread. - -### Blur Brush -Paint over rough transitions manually using the Blur brush in Weight Paint mode. - -### Corrective Smooth Modifier -Non-destructive post-weighting smoothing: -```python -mod = mesh.modifiers.new(name='CorrSmooth', type='CORRECTIVE_SMOOTH') -mod.factor = 0.5 -mod.iterations = 5 -mod.smooth_type = 'SIMPLE' -``` - ---- - -## 6. Troubleshooting: "Bone Heat Weighting Failed" - -> **Source:** Reddit r/blender "Is there a remedy for bone heat weighting" - -| Fix | How | Why It Works | -|-----|-----|--------------| -| **Scale up 10-100x** | Select armature+mesh → scale → apply weights → scale back | Small meshes confuse the heat solver | -| **Merge by Distance** | Edit Mode → Select All → Mesh → Merge by Distance | Duplicate vertices cause ambiguity | -| **Decimate dense mesh** | Modifier → Decimate → apply | Vertex density overloads solver | -| **Data Transfer trick** | Remesh → bind clean copy → Data Transfer modifier to original | Bypasses bad topology entirely | -| **Fix symmetry** | Delete half armature → mirror | Asymmetric bones cause solver failure | -| **Separate loose parts** | Edit Mode → P → Separate by Loose Parts → parent individually | Intersecting meshes confuse heat map | - ---- - -## 7. Common Pitfalls - -| Problem | Cause | Fix (Research-backed) | -|---------|-------|----------------------| -| Mesh deforms wrong in Unity | >4 bone influences per vertex | `vertex_group_limit_total(limit=4)` before export | -| Weights leak to wrong areas | Smooth tool using 'All' subset | Use 'Selected Pose Bones' subset | -| Auto-weights fail | Mesh too small or non-manifold | Scale up 10x, merge by distance | -| Blocky deformation | No weight smoothing after auto-bind | Run smooth + normalize pipeline | -| Slow weight assignment | Looping vertex group elements on high-poly | Use bmesh deform layer | diff --git a/docs/client-setup.md b/docs/client-setup.md new file mode 100644 index 0000000..0e9d83d --- /dev/null +++ b/docs/client-setup.md @@ -0,0 +1,111 @@ +# MCP Client Setup + +## What Starts What + +ViperMesh for Blender has two local connections: + +1. An MCP client starts the ViperMesh Node server as a long-lived stdio + subprocess. +2. The Node server opens and reuses a serialized TCP connection to the Blender + addon on `127.0.0.1:9876`. + +The MCP client is responsible for the server lifecycle. Register the server +once in the client, then use the MCP tools exposed in that client session. +Running a separate `npm`, `npx`, or `tsx` command for each tool call creates a +new server process and discards the persistent connection. + +Docker is not required for clients that support local stdio MCP servers. + +## Native Stdio Setup + +Clone, install, and build the repository: + +```bash +git clone https://github.com/Ker102/vipermesh-blender.git +cd vipermesh-blender +npm install +npm run build +``` + +Use the built entry point from an absolute path. This avoids relying on a +client-specific working-directory option. + +### Codex + +```bash +codex mcp add vipermesh-blender -- node C:/absolute/path/to/vipermesh-blender/dist/public-portable-blender-mcp.js +``` + +Confirm the registration: + +```bash +codex mcp list +``` + +Open a new Codex task if the current task does not reload MCP registrations. + +### JSON-Configured Clients + +Clients such as Claude Desktop and other hosts commonly accept a command and +argument array: + +```json +{ + "mcpServers": { + "vipermesh-blender": { + "command": "node", + "args": [ + "C:/absolute/path/to/vipermesh-blender/dist/public-portable-blender-mcp.js" + ] + } + } +} +``` + +The configuration filename and top-level key vary by client. Use the client's +current MCP documentation, but keep the command itself equivalent. + +## Client Compatibility + +A client can use this release directly when it supports local MCP servers over +stdio and can launch a subprocess. MCP support alone does not guarantee that: + +- some clients support local stdio and remote Streamable HTTP; +- some support only remote server URLs; +- some require a plugin, extension, or administrator policy before local + process execution is allowed. + +This release is stdio-only. A remote-only client needs a separately hosted MCP +transport or a compatible gateway; it cannot connect directly to the Blender +addon's TCP protocol. + +## Docker MCP Toolkit + +Docker MCP Toolkit can centralize containerized MCP servers and connect its +stdio gateway to supported clients. It is an optional distribution route, not +a requirement for ViperMesh. + +ViperMesh does not currently publish a Docker MCP Catalog entry. The Blender +addon also remains loopback-only for local security. A container must reach +that host loopback service reliably, which varies with the Docker host, +networking mode, and client environment. + +For that reason, native stdio is the supported setup today. Do not expose the +Blender bridge on a public interface merely to make a container connect. Docker +Toolkit instructions will be promoted to a supported path after an end-to-end +Windows, macOS, and Linux connectivity test defines a secure configuration. + +Official references: + +- [MCP transports](https://modelcontextprotocol.io/specification/latest/basic/transports) +- [Docker MCP Toolkit](https://docs.docker.com/ai/mcp-catalog-and-toolkit/) + +## Verify The Session + +1. Start Blender and the ViperMesh local bridge. +2. Open a new session in the configured MCP client. +3. Call `bootstrap_vipermesh_session`. +4. Confirm `connection.connected` is `true` and `sessionModel` is + `persistent`. +5. Make two lightweight inspection calls. They should reuse one MCP process and + one Blender client rather than starting new shell commands. diff --git a/docs/portable-blender-mcp.md b/docs/portable-blender-mcp.md index 7a1cbac..15eab3d 100644 --- a/docs/portable-blender-mcp.md +++ b/docs/portable-blender-mcp.md @@ -28,7 +28,7 @@ instead of reconnecting after every tool call. started. - The addon reachable at `127.0.0.1:9876`, unless overridden with `BLENDER_MCP_HOST` and `BLENDER_MCP_PORT`. -Local checked-in tool-guide search works without database or embedding +Local checked-in tool-skill search works without database or embedding credentials. ## Start The Gateway @@ -44,15 +44,16 @@ diagnostics are written to stderr. ## Coding Agent Configuration -Use an absolute repository path: +Use the built entry point from an absolute repository path: ```json { "mcpServers": { "vipermesh-blender": { - "command": "npm", - "args": ["run", "mcp"], - "cwd": "C:/absolute/path/to/vipermesh-blender" + "command": "node", + "args": [ + "C:/absolute/path/to/vipermesh-blender/dist/public-portable-blender-mcp.js" + ] } } } @@ -60,7 +61,8 @@ Use an absolute repository path: The exact configuration location depends on the coding agent. Restart or open a new agent session after registering the server if the client does not reload MCP -servers dynamically. +servers dynamically. See [MCP client setup](client-setup.md) for Codex and +client compatibility details. ## Available MCP Tools @@ -140,16 +142,22 @@ between decimation, voxel remesh, QuadriFlow, or custom fallback code. `search_3d_guidance` supports: -- `source: "local"` for deterministic search over `data/tool-guides`; +- `source: "local"` for deterministic search over the public agent skill + references in `skills/using-vipermesh-blender/references`; - `source: "semantic"` for a configured private ViperMesh semantic adapter; - `source: "all"` to combine both. Semantic retrieval is an optional private-product adapter. The public connector -ships deterministic local guide retrieval and does not require database or +ships deterministic local tool-skill retrieval and does not require database or embedding credentials. `get_3d_guidance_document` reads a Markdown basename from -`data/tool-guides`. Arbitrary filesystem paths and traversal are rejected. +`skills/using-vipermesh-blender/references`. Arbitrary filesystem paths and +traversal are rejected. + +The skill references describe capabilities, tradeoffs, and validation patterns. +They are recommendations, not universal scene recipes. The private ViperMesh +RAG corpus is not distributed in the public connector. ## Security Boundary diff --git a/lib/portable-mcp/guidance.ts b/lib/portable-mcp/guidance.ts index 259d0f5..8ddbd8a 100644 --- a/lib/portable-mcp/guidance.ts +++ b/lib/portable-mcp/guidance.ts @@ -3,12 +3,37 @@ import path from "node:path" import { fileURLToPath } from "node:url" const MODULE_DIR = path.dirname(fileURLToPath(import.meta.url)) -const TOOL_GUIDES_DIR = [ - path.resolve(MODULE_DIR, "..", "..", "data", "tool-guides"), - path.resolve(MODULE_DIR, "..", "data", "tool-guides"), - path.resolve(process.cwd(), "data", "tool-guides"), +const TOOL_SKILLS_DIR = [ + path.resolve( + MODULE_DIR, + "..", + "..", + "skills", + "using-vipermesh-blender", + "references" + ), + path.resolve( + MODULE_DIR, + "..", + "skills", + "using-vipermesh-blender", + "references" + ), + path.resolve( + process.cwd(), + "skills", + "using-vipermesh-blender", + "references" + ), ].find((candidate) => fs.existsSync(candidate)) ?? - path.resolve(MODULE_DIR, "..", "..", "data", "tool-guides") + path.resolve( + MODULE_DIR, + "..", + "..", + "skills", + "using-vipermesh-blender", + "references" + ) const MAX_GUIDANCE_DOCUMENT_BYTES = 64 * 1024 const DEFAULT_GUIDANCE_LIMIT = 5 const MAX_GUIDANCE_LIMIT = 20 @@ -74,10 +99,10 @@ function validateGuideFilename(filename: string) { function guidePath(filename: string) { validateGuideFilename(filename) - const resolved = path.resolve(TOOL_GUIDES_DIR, filename) - const relative = path.relative(TOOL_GUIDES_DIR, resolved) + const resolved = path.resolve(TOOL_SKILLS_DIR, filename) + const relative = path.relative(TOOL_SKILLS_DIR, resolved) if (relative.startsWith("..") || path.isAbsolute(relative)) { - throw new Error("Guidance filename resolves outside the tool-guide directory") + throw new Error("Guidance filename resolves outside the tool-skill directory") } return resolved } @@ -131,7 +156,7 @@ function searchLocalGuides(query: string, limit: number): GuidanceSearchItem[] { if (terms.length === 0) return [] return fs - .readdirSync(TOOL_GUIDES_DIR) + .readdirSync(TOOL_SKILLS_DIR) .filter((filename) => filename.endsWith(".md")) .map((filename) => { const content = fs.readFileSync(guidePath(filename), "utf8") @@ -149,7 +174,7 @@ function searchLocalGuides(query: string, limit: number): GuidanceSearchItem[] { id: `local:${filename}`, title: titleFromContent(filename, content), content: excerpt(content), - source: "tool-guides", + source: "tool-skills", metadata: { filename, retrieval: "local" }, })) } diff --git a/lib/portable-mcp/server.ts b/lib/portable-mcp/server.ts index 584fe70..d23874d 100644 --- a/lib/portable-mcp/server.ts +++ b/lib/portable-mcp/server.ts @@ -241,7 +241,7 @@ export function createPortableBlenderMcpServer(service: PortableMcpService) { { title: "Search 3D Guidance", description: - "Search checked-in ViperMesh 3D tool guides and optionally the configured semantic guidance store.", + "Search checked-in ViperMesh 3D tool skills and optionally the configured semantic guidance store.", inputSchema: z.object({ query: z.string().trim().min(1).max(2_000), limit: z.number().int().min(1).max(20).optional(), @@ -263,7 +263,7 @@ export function createPortableBlenderMcpServer(service: PortableMcpService) { { title: "Get 3D Guidance Document", description: - "Read one approved Markdown document from the checked-in ViperMesh tool-guide directory.", + "Read one approved Markdown reference from the checked-in ViperMesh agent skill.", inputSchema: z.object({ filename: z.string().trim().min(1).max(255), }), diff --git a/llms.txt b/llms.txt index 0903d37..78ab10a 100644 --- a/llms.txt +++ b/llms.txt @@ -2,8 +2,8 @@ > ViperMesh for Blender is an open-source local Blender addon and persistent > Model Context Protocol server for AI agents. It exposes deterministic 3D -> scene operations, structured inspection, bounded batching, local task -> guidance, and an explicit custom Python fallback. +> scene operations, structured inspection, bounded batching, portable tool +> skills, and an explicit custom Python fallback. Canonical repository: https://github.com/Ker102/vipermesh-blender License: MIT @@ -14,6 +14,8 @@ Transport: MCP over stdio, then a loopback TCP bridge to Blender - README: https://github.com/Ker102/vipermesh-blender#readme - Connector manual: https://github.com/Ker102/vipermesh-blender/blob/main/docs/portable-blender-mcp.md +- MCP client setup: https://github.com/Ker102/vipermesh-blender/blob/main/docs/client-setup.md +- Agent skill: https://github.com/Ker102/vipermesh-blender/blob/main/skills/using-vipermesh-blender/SKILL.md - Security boundary: https://github.com/Ker102/vipermesh-blender/blob/main/SECURITY.md - Releases: https://github.com/Ker102/vipermesh-blender/releases @@ -24,5 +26,6 @@ Transport: MCP over stdio, then a loopback TCP bridge to Blender - Agents should call bootstrap_vipermesh_session first. - Deterministic tools are preferred when they cover the task. - execute_code remains available for genuinely custom Blender work. +- Public tool skills provide adaptable patterns, not mandatory scene recipes. - The public connector does not include ViperMesh authentication, billing, private prompts, private RAG data, cloud model routing, or asset catalogs. diff --git a/package.json b/package.json index d1dd072..b236a5a 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "bin": { "vipermesh-blender": "./dist/public-portable-blender-mcp.js" }, - "files": ["addon", "data", "dist", "docs", "README.md", "LICENSE"], + "files": ["addon", "dist", "docs", "skills", "README.md", "LICENSE"], "scripts": { "mcp": "tsx scripts/public-portable-blender-mcp.ts", "build": "tsup scripts/public-portable-blender-mcp.ts --format esm --platform node --out-dir dist --clean", diff --git a/scripts/validate-package.mjs b/scripts/validate-package.mjs index c5ff037..cac3c32 100644 --- a/scripts/validate-package.mjs +++ b/scripts/validate-package.mjs @@ -8,7 +8,13 @@ assert.ok(fs.existsSync(cliPath), `Missing built CLI: ${cliPath}`) const cli = fs.readFileSync(cliPath, "utf8") assert.ok(cli.startsWith("#!/usr/bin/env node"), "Built CLI must retain its Node shebang") -assert.ok(fs.existsSync("data/tool-guides/spatial-positioning-guide.md")) +assert.ok(fs.existsSync("skills/using-vipermesh-blender/SKILL.md")) +assert.ok( + fs.existsSync( + "skills/using-vipermesh-blender/references/spatial-validation.md" + ) +) +assert.ok(!fs.existsSync("data/tool-guides")) assert.ok(fs.existsSync("addon/vipermesh-addon.py")) assert.ok(fs.existsSync("NOTICE.md")) assert.ok(fs.existsSync("SECURITY.md")) diff --git a/skills/using-vipermesh-blender/SKILL.md b/skills/using-vipermesh-blender/SKILL.md new file mode 100644 index 0000000..cd2f653 --- /dev/null +++ b/skills/using-vipermesh-blender/SKILL.md @@ -0,0 +1,38 @@ +--- +name: using-vipermesh-blender +description: Operates Blender through the persistent ViperMesh MCP connector. Use for scene inspection, structured Blender edits, validation, rendering, rigging, animation, retopology, assets, and export. +--- + +# Using ViperMesh For Blender + +Use one MCP server process for the complete agent session. The MCP client should +start the server; do not launch `npm`, `npx`, `tsx`, or another server process +for individual Blender operations. + +## Start A Session + +1. Call `bootstrap_vipermesh_session`. +2. Inspect existing scene state before changing it. +3. Use `search_3d_guidance` for the current task. +4. Use `list_blender_tools` with a relevant category or search term rather than + loading the complete registry. + +Prefer deterministic tools when they express the intended operation. Keep +`execute_code` available for custom geometry, procedural effects, unusual node +graphs, and other work that the structured tools do not cover well. + +Batch operations only when their inputs are already known and no intermediate +result changes the next decision. Preserve inspection and repair points between +meaningful stages. + +## References + +- Scene mutation and lifecycle: [references/scene-operations.md](references/scene-operations.md) +- Contact, orientation, and clearance: [references/spatial-validation.md](references/spatial-validation.md) +- Camera, lighting, previews, and acceptance: [references/visual-presentation.md](references/visual-presentation.md) +- Geometry, materials, and assets: [references/geometry-materials-assets.md](references/geometry-materials-assets.md) +- Characters, animation, and export: [references/character-animation-export.md](references/character-animation-export.md) + +These references provide useful patterns and checks, not mandatory recipes. +Adapt them to the user's goal, the current scene, the active render engine, and +the evidence available. diff --git a/skills/using-vipermesh-blender/references/character-animation-export.md b/skills/using-vipermesh-blender/references/character-animation-export.md new file mode 100644 index 0000000..ce1f5e8 --- /dev/null +++ b/skills/using-vipermesh-blender/references/character-animation-export.md @@ -0,0 +1,36 @@ +# Characters, Animation, And Export + +## Character Work + +Treat retopology, UVs, rig generation, binding, weight cleanup, and animation +readiness as separate concerns with explicit checks between them. A successful +operator call does not prove deformation quality or production readiness. + +Select decimation, voxel remesh, QuadriFlow, or custom topology work according +to the source mesh and target use. Preserve a source revision before destructive +topology changes. + +For rigging, verify scale, transforms, mesh integrity, armature alignment, +deform groups, weight normalization, and representative deformations. Automated +weights are a starting point whose adequacy depends on the mesh and motion. + +## Animation + +Inspect frame range, actions, constraints, drivers, root motion, and target rig +compatibility before editing. Retargeting and baking can be lossy, so keep a +recoverable source and validate representative poses or motion segments. + +## Export + +Choose format and options from the destination pipeline rather than a universal +preset. Before export, inspect: + +- intended object and collection inclusion +- transforms and scale +- topology and normals +- UVs, materials, and texture dependencies +- armature, weights, actions, and animation range +- modifiers or constraints that must be applied or preserved + +Validate the exported artifact when possible. A saved file is not sufficient +evidence that another application can consume it correctly. diff --git a/skills/using-vipermesh-blender/references/geometry-materials-assets.md b/skills/using-vipermesh-blender/references/geometry-materials-assets.md new file mode 100644 index 0000000..8eed7ec --- /dev/null +++ b/skills/using-vipermesh-blender/references/geometry-materials-assets.md @@ -0,0 +1,35 @@ +# Geometry, Materials, And Assets + +## Geometry Strategy + +Select an approach based on the requested form and downstream use: + +- primitives and assembly tools for blockouts and hard-surface structures +- curves for paths, cables, rails, and profile-driven forms +- modifiers for reversible repetition, smoothing, thickness, and deformation +- retopology tools for density reduction or topology conversion +- `execute_code` for custom procedural geometry that lacks a suitable direct + operation + +Avoid treating one method as universally superior. Preserve source geometry +when a destructive conversion would make iteration harder. + +## Materials + +Use structured material tools for common Principled BSDF and texture workflows. +Check texture paths, color space, UV dependence, and render-engine behavior when +the result matters beyond a preview. + +Material values should respond to the intended substance, scale, lighting, and +art direction. Defaults and physical ranges are useful references, not a reason +to override deliberate stylization. + +## Assets + +Search reusable assets before manually approximating complex objects whose +identity depends on detailed geometry. Import multi-object assets through a +managed root when possible, then inspect bounds, scale, orientation, and support +in the destination scene. + +An asset match is a candidate, not automatic acceptance. Verify that its +license, style, topology, materials, and functional direction fit the task. diff --git a/skills/using-vipermesh-blender/references/scene-operations.md b/skills/using-vipermesh-blender/references/scene-operations.md new file mode 100644 index 0000000..2015db9 --- /dev/null +++ b/skills/using-vipermesh-blender/references/scene-operations.md @@ -0,0 +1,36 @@ +# Scene Operations + +## Choose The Smallest Useful Surface + +- Inspect before mutating an existing scene. +- Search or filter the registry around the current task. +- Prefer a named deterministic operation when it matches the requested change. +- Use `execute_code` when custom Blender logic is materially clearer or more + capable than composing available tools. + +## Group Calls Deliberately + +`call_blender_tool_batch` is useful for independent or already-decided actions, +such as creating a known blockout or applying several known transforms. Keep +calls separate when the next action depends on dimensions, contact, topology, +viewport feedback, or a render. + +`run_blender_scene_stage` can compact common build, preview, and finalize work. +Its stages remain optional. Standalone tools are appropriate for targeted +repairs and workflows that do not fit the staged shape. + +## Preserve User Work + +Treat existing objects, collections, modifiers, materials, animation, and file +paths as user-owned state. Prefer reversible edits and duplicate or save a +revision before destructive operations when recovery would be expensive. + +Use descriptive object and collection names when later operations depend on +identity. Do not reorganize a scene merely to make it match one preferred +hierarchy. + +## Finish With Evidence + +Before reporting completion, confirm that the requested objects and changes +exist, inspect any high-risk structural relationships, save the intended blend +file, and produce the visual or export artifact requested by the user. diff --git a/skills/using-vipermesh-blender/references/spatial-validation.md b/skills/using-vipermesh-blender/references/spatial-validation.md new file mode 100644 index 0000000..4deec69 --- /dev/null +++ b/skills/using-vipermesh-blender/references/spatial-validation.md @@ -0,0 +1,33 @@ +# Spatial Validation + +## Read World-Space State + +Object origins and local dimensions are not reliable substitutes for evaluated +world-space bounds. Rotation, scale, parenting, modifiers, and evaluated +geometry can change the surfaces that matter. + +When placement is consequential, inspect the relevant objects and reason from +their world-space bounds, attachment points, or actual surface hits. + +## Express The Intended Relationship + +Choose validation that matches the user's meaning: + +- `supported_by` or `on_top_of` for physical support +- facing or orientation relations for functional direction +- clearance checks for required gaps +- containment checks for objects intended to be inside another object +- attachment-point alignment for parts that must meet precisely + +Broad vertical ordering such as "above" does not prove contact. A clean camera +angle also does not prove that an object is grounded or non-intersecting. + +## Use Recommendations, Not Fixed Layouts + +Reasonable scale, spacing, and orientation depend on the asset, camera, +animation, target platform, and artistic intent. Use reference dimensions or +clearance ranges as starting evidence when useful, then adapt them. + +After close placement, inspect from an angle that reveals depth and contact. +Repair floating, unintended penetration, reversed functional direction, and +support errors before final acceptance. diff --git a/skills/using-vipermesh-blender/references/visual-presentation.md b/skills/using-vipermesh-blender/references/visual-presentation.md new file mode 100644 index 0000000..0764a65 --- /dev/null +++ b/skills/using-vipermesh-blender/references/visual-presentation.md @@ -0,0 +1,38 @@ +# Visual Presentation + +## Build A Useful Feedback Loop + +Use previews to answer concrete questions: composition, relative scale, +orientation, visibility, material readability, contact, and lighting direction. +Avoid repeated screenshots that do not change a decision. + +For reference reconstruction, compare the largest visual anchors before +spending time on small details. Later passes can prioritize objects by +prominence in the intended camera. + +## Camera + +Focal length, camera height, perspective, and frame fill are creative and +task-dependent. Use framing tools and camera inspection to match the requested +result; do not force a universal interior, product, or cinematic preset. + +Check that required objects are visible and that important silhouettes are not +accidentally cropped or hidden. A camera can conceal structural mistakes, so +visual framing does not replace spatial validation. + +## Lighting + +Choose lights from the intended source, mood, material response, and render +engine. Studio presets are useful starting points for isolated assets, while +custom lights and world environments may fit scenes with explicit windows, +fixtures, outdoor conditions, or stylized direction. + +Judge exposure, color separation, shadow readability, and whether bright areas +erase material color. Numeric energy ranges are starting points rather than +scene-independent rules. + +## Acceptance + +Inspect the final render artifact, not only tool success responses. If a visible +problem remains, make a focused repair and re-render rather than rebuilding +unrelated scene elements. diff --git a/tests/conformance.ts b/tests/conformance.ts index 82a4b41..02964b1 100644 --- a/tests/conformance.ts +++ b/tests/conformance.ts @@ -22,13 +22,14 @@ assert.match(VIPERMESH_MCP_INSTRUCTIONS, /one persistent MCP server process/i) assert.match(VIPERMESH_CONNECTOR_MANUAL, /execute_code/) assert.match(getBlenderAgentContext().context, /Inspect/i) -const guide = getGuidanceDocument("spatial-positioning-guide.md") +const guide = getGuidanceDocument("spatial-validation.md") assert.match(guide.title, /spatial/i) const guidance = await search3dGuidance( { query: "grounding support placement", source: "local" }, { semanticSearch: async () => [] } ) assert.ok(guidance.results.length > 0) +assert.ok(guidance.results.every((result) => result.source === "tool-skills")) let clientCreations = 0 const service = createPortableMcpService({ From 60d817bb709e7a0fe29a626cf455b6e5ca05db51 Mon Sep 17 00:00:00 2001 From: Kristofer Jussmann Date: Wed, 7 Oct 2026 03:05:56 +0300 Subject: [PATCH 2/2] feat: launch connector site and harden result review --- .github/workflows/pages.yml | 32 + CHANGELOG.md | 25 +- README.md | 5 +- addon/vipermesh-addon.py | 1962 ++++++++++++++++- docs/portable-blender-mcp.md | 16 + docs/releasing.md | 17 +- lib/orchestration/tool-registry.ts | 64 +- lib/portable-mcp/agent-context.ts | 8 +- lib/portable-mcp/onboarding.ts | 11 +- lib/portable-mcp/preview.ts | 25 + lib/portable-mcp/server.ts | 17 +- lib/portable-mcp/service.ts | 34 +- package-lock.json | 48 +- package.json | 6 +- scripts/validate-package.mjs | 8 +- site/asset-preview.png | Bin 0 -> 487014 bytes site/index.html | 43 + site/robots.txt | 3 + site/site.js | 12 + site/sitemap.xml | 2 + site/styles.css | 54 + skills/using-vipermesh-blender/SKILL.md | 8 +- .../references/scene-operations.md | 11 +- .../references/visual-presentation.md | 12 + tests/conformance.ts | 33 +- 25 files changed, 2374 insertions(+), 82 deletions(-) create mode 100644 .github/workflows/pages.yml create mode 100644 lib/portable-mcp/preview.ts create mode 100644 site/asset-preview.png create mode 100644 site/index.html create mode 100644 site/robots.txt create mode 100644 site/site.js create mode 100644 site/sitemap.xml create mode 100644 site/styles.css diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..901878c --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,32 @@ +name: Publish connector overview + +on: + push: + branches: [main] + paths: ["site/**", ".github/workflows/pages.yml"] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: github-pages + cancel-in-progress: false + +jobs: + deploy: + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v6 + - uses: actions/configure-pages@v5 + - uses: actions/upload-pages-artifact@v4 + with: + path: site + - uses: actions/deploy-pages@v4 + id: deployment diff --git a/CHANGELOG.md b/CHANGELOG.md index 27210c5..df3c220 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,28 @@ All notable changes to ViperMesh for Blender are documented here. ## [Unreleased] +## [1.3.0] - 2026-10-07 + +### Added + +- Repository-connected GitHub Pages overview, setup and honest capability limits. +- Inline bounded PNG/JPEG output for image-aware MCP clients. +- Geometry/deformation diagnostics and guarded addon operations already present + in the current Blender tool surface, synchronized into the public distribution. + +### Changed + +- Finalize can preserve existing camera/lighting and render without saving a blend + file. Named spatial failures block final output and retain repair details. +- Removed fixed preview counts; require task-based visual review and disclose + unresolved defects instead of treating file health as a quality verdict. +- Blend saves are explicit and refuse existing destinations in staged finalize. +- Updated the public dependency lock and SDK floor; clean install audit is clear. +- Package validation checks every shipped skill reference. +- Corrected retarget rollback after backup or export failure, partial-import + cleanup, cancelled operator handling, enum-flag argument conversion and + implementation-aware addon fingerprints. Added Blender runtime regressions. + ### Changed - Replaced the exported private tool-guide corpus with a concise, installable @@ -30,5 +52,6 @@ All notable changes to ViperMesh for Blender are documented here. - Explicit `execute_code` fallback for genuinely custom Blender work. - Local-only loopback transport and public release validation. -[Unreleased]: https://github.com/Ker102/vipermesh-blender/compare/v1.2.0...HEAD +[Unreleased]: https://github.com/Ker102/vipermesh-blender/compare/v1.3.0...HEAD +[1.3.0]: https://github.com/Ker102/vipermesh-blender/compare/v1.2.0...v1.3.0 [1.2.0]: https://github.com/Ker102/vipermesh-blender/releases/tag/v1.2.0 diff --git a/README.md b/README.md index 4bc8c47..292da6a 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ **A persistent Model Context Protocol server and deterministic Blender addon for AI agents.** +[Project overview and setup](https://ker102.github.io/vipermesh-blender/) +| [ViperMesh Studio waitlist](https://vipermesh-studio.vercel.app/waitlist) + ViperMesh for Blender gives MCP-compatible agents structured scene inspection, reusable Blender operations, bounded batches, local 3D workflow guidance, and an explicit Python fallback. It is designed to reduce repeated Blender API @@ -59,7 +62,7 @@ loopback by default and reports **Stopped**, **Ready**, **Agent connected**, or ### 1. Install the Blender addon -Download `vipermesh-addon.py` from the +Download the versioned addon `.py` or addon `.zip` from the [latest release](https://github.com/Ker102/vipermesh-blender/releases/latest). In Blender: diff --git a/addon/vipermesh-addon.py b/addon/vipermesh-addon.py index 3faf017..d9db359 100644 --- a/addon/vipermesh-addon.py +++ b/addon/vipermesh-addon.py @@ -16,19 +16,28 @@ import shutil import zipfile import itertools +import hashlib +import inspect +import marshal +import uuid from array import array from mathutils import Vector +from mathutils.bvhtree import BVHTree +from mathutils.kdtree import KDTree from bpy.props import StringProperty, IntProperty, BoolProperty, EnumProperty import io from contextlib import redirect_stdout, suppress -ADDON_VERSION = (1, 2, 0) +ADDON_VERSION = (1, 3, 0) ADDON_VERSION_LABEL = ".".join(str(part) for part in ADDON_VERSION) +MAX_POSE_DEFORMATION_WORK = 2_000_000 +MAX_MESH_SURFACE_COMPARISON_FACES = 500_000 +MAX_MESH_SURFACE_COMPARISON_VERTICES = 1_000_000 bl_info = { "name": "ViperMesh for Blender", "author": "ViperMesh Team", - "version": (1, 2, 0), + "version": (1, 3, 0), "blender": (3, 0, 0), "location": "View3D > Sidebar > ViperMesh", "description": "Persistent local Blender bridge for ViperMesh and MCP-compatible agents", @@ -257,6 +266,7 @@ def _execute_command_internal(self, command): "set_active_collection": self.set_active_collection, "execute_code": self.execute_code, "save_blend_file": self.save_blend_file, + "restore_blend_checkpoint": self.restore_blend_checkpoint, "list_materials": self.list_materials, "delete_object": self.delete_object, "delete_objects": self.delete_objects, @@ -264,6 +274,7 @@ def _execute_command_internal(self, command): "align_object_to_surface": self.align_object_to_surface, "validate_object_clearance": self.validate_object_clearance, "inspect_spatial_relations": self.inspect_spatial_relations, + "inspect_mesh_intersections": self.inspect_mesh_intersections, "inspect_scene_grounding": self.inspect_scene_grounding, "align_object_attachment_points": self.align_object_attachment_points, "rename_object": self.rename_object, @@ -286,6 +297,7 @@ def _execute_command_internal(self, command): "validate_mesh_geometry": self.validate_mesh_geometry, "repair_mesh_geometry": self.repair_mesh_geometry, "inspect_retopology_readiness": self.inspect_retopology_readiness, + "compare_mesh_surfaces": self.compare_mesh_surfaces, "decimate_mesh": self.decimate_mesh, "voxel_remesh_mesh": self.voxel_remesh_mesh, "quadriflow_remesh_mesh": self.quadriflow_remesh_mesh, @@ -294,6 +306,7 @@ def _execute_command_internal(self, command): "inspect_edit_bone_alignment": self.inspect_edit_bone_alignment, "set_edit_bone_alignment": self.set_edit_bone_alignment, "inspect_weight_paint_readiness": self.inspect_weight_paint_readiness, + "inspect_pose_deformation": self.inspect_pose_deformation, "normalize_vertex_group_weights": self.normalize_vertex_group_weights, "create_rigify_metarig": self.create_rigify_metarig, "generate_rigify_rig": self.generate_rigify_rig, @@ -301,6 +314,7 @@ def _execute_command_internal(self, command): "transfer_vertex_group_weights": self.transfer_vertex_group_weights, "project_vertex_group_weights": self.project_vertex_group_weights, "inspect_animation_data": self.inspect_animation_data, + "retarget_animation_clip": self.retarget_animation_clip, "inspect_shape_keys": self.inspect_shape_keys, "extract_shape_key_to_object": self.extract_shape_key_to_object, "create_shape_key_from_object": self.create_shape_key_from_object, @@ -334,8 +348,12 @@ def _execute_command_internal(self, command): "validate_export_readiness": self.validate_export_readiness, "inspect_export_texture_dependencies": self.inspect_export_texture_dependencies, "export_asset_package": self.export_asset_package, + "validate_gltf_roundtrip": self.validate_gltf_roundtrip, + "get_vipermesh_runtime_identity": self.get_vipermesh_runtime_identity, "export_object": self.export_object, "list_installed_addons": self.list_installed_addons, + "inspect_addon_capabilities": self.inspect_addon_capabilities, + "invoke_addon_capability": self.invoke_addon_capability, "create_material": self.create_material, "assign_material": self.assign_material, "create_material_preset": self.create_material_preset, @@ -743,6 +761,17 @@ def record_external_file(kind, name, raw_path, packed=False, library=None): return { "status": health_status, + "scene_evidence": { + key: bpy.context.scene.get(key) + for key in ( + "vipermesh_fixture_id", + "vipermesh_fixture_source", + "vipermesh_fixture_license", + "vipermesh_asset_glb_sha256", + "vipermesh_candidate_glb_sha256", + ) + if bpy.context.scene.get(key) is not None + }, "file": { "filepath": filepath, "directory": os.path.dirname(filepath) if filepath else "", @@ -1362,7 +1391,7 @@ def execute_code(self, code): except Exception as e: raise Exception(f"Code execution error: {str(e)}") - def save_blend_file(self, filepath, make_dirs=True, check_existing=False): + def save_blend_file(self, filepath, make_dirs=True, check_existing=False, copy=False): """Save the current .blend file to an explicit path.""" try: if not filepath or not str(filepath).strip(): @@ -1382,11 +1411,12 @@ def save_blend_file(self, filepath, make_dirs=True, check_existing=False): if check_existing and os.path.exists(resolved_path): return {"error": f"File already exists: {resolved_path}. Set check_existing=false to overwrite."} - bpy.ops.wm.save_as_mainfile(filepath=resolved_path, check_existing=bool(check_existing)) + bpy.ops.wm.save_as_mainfile(filepath=resolved_path, check_existing=bool(check_existing), copy=bool(copy)) return { "success": True, "filepath": resolved_path, + "copy": bool(copy), "exists": os.path.exists(resolved_path), "size": os.path.getsize(resolved_path) if os.path.exists(resolved_path) else None, "next_safe_action": "attach this .blend path as benchmark or export evidence", @@ -1394,6 +1424,44 @@ def save_blend_file(self, filepath, make_dirs=True, check_existing=False): except Exception as e: return {"error": f"Failed to save blend file: {str(e)}"} + def restore_blend_checkpoint(self, checkpoint_filepath, original_filepath): + """Restore a saved checkpoint and return Blender to the original .blend path.""" + try: + checkpoint_path = os.path.abspath( + os.path.expanduser(str(checkpoint_filepath)) + ) + original_path = os.path.abspath( + os.path.expanduser(str(original_filepath)) + ) + if not checkpoint_path.lower().endswith(".blend"): + return {"error": "checkpoint_filepath must end with .blend"} + if not original_path.lower().endswith(".blend"): + return {"error": "original_filepath must end with .blend"} + if not os.path.isfile(checkpoint_path): + return { + "error": f"Checkpoint file does not exist: {checkpoint_path}" + } + + bpy.ops.wm.open_mainfile(filepath=checkpoint_path) + bpy.ops.wm.save_as_mainfile( + filepath=original_path, + check_existing=False, + ) + return { + "success": True, + "restored": True, + "checkpoint_filepath": checkpoint_path, + "filepath": bpy.data.filepath, + "original_filepath": original_path, + "dirty": bool(getattr(bpy.data, "is_dirty", False)), + "next_safe_action": "re-run inspect_blend_file_health before retrying the failed operation", + } + except Exception as e: + return { + "error": f"Failed to restore blend checkpoint: {str(e)}", + "restored": False, + } + def list_materials(self): """List all materials in the .blend file with their node counts and linked objects""" try: @@ -1983,6 +2051,135 @@ def relation_passes(relation_type, subject, reference, other, relation): except Exception as e: return {"error": f"Failed to inspect spatial relations: {str(e)}"} + def inspect_mesh_intersections(self, pairs=None, max_intersections=10000, epsilon=0.000001): + """Inspect evaluated mesh-surface intersections for explicit object pairs.""" + try: + if pairs is None: + pairs = [] + if isinstance(pairs, str): + pairs = json.loads(pairs) + if not isinstance(pairs, list) or not pairs: + return {"error": "pairs must be a non-empty list of {subject, reference} objects"} + if len(pairs) > 100: + return {"error": "pairs may contain at most 100 checks"} + + resolved_limit = max(1, min(int(max_intersections), 100000)) + resolved_epsilon = max(0.0, min(float(epsilon), 1.0)) + depsgraph = bpy.context.evaluated_depsgraph_get() + cache = {} + + def object_tree(obj): + if obj.name in cache: + return cache[obj.name] + evaluated = obj.evaluated_get(depsgraph) + mesh = evaluated.to_mesh() + try: + mesh.calc_loop_triangles() + vertices = [ + evaluated.matrix_world @ vertex.co + for vertex in mesh.vertices + ] + polygons = [ + tuple(int(index) for index in triangle.vertices) + for triangle in mesh.loop_triangles + ] + tree = BVHTree.FromPolygons( + vertices, + polygons, + all_triangles=True, + epsilon=resolved_epsilon, + ) + finally: + evaluated.to_mesh_clear() + cache[obj.name] = tree + return tree + + checked = [] + missing_objects = [] + for index, pair in enumerate(pairs): + if not isinstance(pair, dict): + checked.append({ + "index": index, + "status": "fail", + "error": "pair must be an object", + }) + continue + subject_name = str( + pair.get("subject") or pair.get("name") or "" + ).strip() + reference_name = str( + pair.get("reference") or pair.get("other_name") or "" + ).strip() + subject = bpy.data.objects.get(subject_name) + reference = bpy.data.objects.get(reference_name) + missing = [ + name + for name, obj in ( + (subject_name or "subject", subject), + (reference_name or "reference", reference), + ) + if obj is None + ] + if missing: + missing_objects.extend(missing) + checked.append({ + "index": index, + "subject": subject_name, + "reference": reference_name, + "status": "fail", + "missing": missing, + }) + continue + if subject.type != "MESH" or reference.type != "MESH": + checked.append({ + "index": index, + "subject": subject_name, + "reference": reference_name, + "status": "fail", + "error": "both objects must be meshes", + }) + continue + if subject == reference: + checked.append({ + "index": index, + "subject": subject_name, + "reference": reference_name, + "status": "fail", + "error": "subject and reference must be different objects", + }) + continue + + overlaps = object_tree(subject).overlap(object_tree(reference)) + intersection_count = len(overlaps) + checked.append({ + "index": index, + "subject": subject_name, + "reference": reference_name, + "status": "pass" if intersection_count == 0 else "fail", + "intersects": intersection_count > 0, + "intersection_count": intersection_count, + "sample_polygon_pairs": [ + [int(subject_polygon), int(reference_polygon)] + for subject_polygon, reference_polygon + in overlaps[:resolved_limit] + ], + "intersections_truncated": intersection_count > resolved_limit, + }) + + failed = [item for item in checked if item.get("status") != "pass"] + return { + "success": len(missing_objects) == 0, + "ready": len(failed) == 0, + "checked_count": len(checked), + "pass_count": len(checked) - len(failed), + "fail_count": len(failed), + "missing_objects": sorted(set(missing_objects)), + "pairs": checked, + "next_safe_action": "fix intersecting mesh pairs, then run inspect_mesh_intersections again", + } + except Exception as e: + return {"error": f"Failed to inspect mesh intersections: {str(e)}"} + def inspect_scene_grounding(self, names=None, ground_z=0.0, tolerance=0.02, max_objects=100, include_supports=True): """Report mesh objects whose lower bounds float above ground or nearby support surfaces.""" try: @@ -4369,7 +4566,13 @@ def _mesh_geometry_report(self, obj, cleanup=False): "boundary_edges": boundary_edges, "non_manifold_edges": non_manifold_edges, "loose_edges": loose_edges, - "valid": not validate_changed and zero_area_faces == 0 and non_manifold_edges == 0, + "valid": ( + not validate_changed + and zero_area_faces == 0 + and boundary_edges == 0 + and non_manifold_edges == 0 + and loose_edges == 0 + ), "cleanup_applied": bool(cleanup), } finally: @@ -4875,10 +5078,12 @@ def inspect_retopology_readiness(self, names=None, max_objects=120, high_density triangle_faces = 0 quad_faces = 0 ngon_faces = 0 + evaluated_triangles = 0 material_indices = set() smooth_faces = 0 for poly in mesh.polygons: sides = len(poly.vertices) + evaluated_triangles += max(0, sides - 2) if sides == 3: triangle_faces += 1 elif sides == 4: @@ -4922,6 +5127,7 @@ def inspect_retopology_readiness(self, names=None, max_objects=120, high_density "vertices": len(mesh.vertices), "edges": len(mesh.edges), "faces": face_count, + "evaluated_triangles": evaluated_triangles, "triangle_faces": triangle_faces, "quad_faces": quad_faces, "ngon_faces": ngon_faces, @@ -4954,6 +5160,286 @@ def inspect_retopology_readiness(self, names=None, max_objects=120, high_density except Exception as e: return {"error": f"Failed to inspect retopology readiness: {str(e)}"} + def compare_mesh_surfaces( + self, + source_name, + candidate_name, + distance_tolerance=0.01, + seam_tolerance=None, + max_surface_samples=10000, + max_attribute_samples=10000, + ): + """Compare two evaluated meshes without changing either object.""" + try: + source = bpy.data.objects.get(str(source_name)) + candidate = bpy.data.objects.get(str(candidate_name)) + missing = [ + name for name, obj in ( + (str(source_name), source), + (str(candidate_name), candidate), + ) + if obj is None + ] + if missing: + return {"success": False, "error": "Objects not found", "missing_names": missing} + invalid = [obj.name for obj in (source, candidate) if obj.type != "MESH"] + if invalid: + return { + "success": False, + "error": "Mesh surface comparison only supports mesh objects", + "invalid_names": invalid, + } + if source == candidate: + return { + "success": False, + "error": "source_name and candidate_name must identify different objects", + } + + distance_tolerance = float(distance_tolerance) + if not math.isfinite(distance_tolerance) or distance_tolerance < 0: + return {"success": False, "error": "distance_tolerance must be a finite non-negative number"} + seam_tolerance = distance_tolerance if seam_tolerance is None else float(seam_tolerance) + if not math.isfinite(seam_tolerance) or seam_tolerance < 0: + return {"success": False, "error": "seam_tolerance must be a finite non-negative number"} + max_surface_samples = max(1, min(int(max_surface_samples), 20000)) + max_attribute_samples = max(1, min(int(max_attribute_samples), 20000)) + + depsgraph = bpy.context.evaluated_depsgraph_get() + + def snapshot(obj): + evaluated = obj.evaluated_get(depsgraph) + mesh = evaluated.to_mesh() + try: + if len(mesh.polygons) > MAX_MESH_SURFACE_COMPARISON_FACES: + raise ValueError( + f"{obj.name} exceeds the {MAX_MESH_SURFACE_COMPARISON_FACES} evaluated-face comparison limit" + ) + if len(mesh.vertices) > MAX_MESH_SURFACE_COMPARISON_VERTICES: + raise ValueError( + f"{obj.name} exceeds the {MAX_MESH_SURFACE_COMPARISON_VERTICES} evaluated-vertex comparison limit" + ) + matrix = evaluated.matrix_world + vertices = [tuple(matrix @ vertex.co) for vertex in mesh.vertices] + polygons = [tuple(polygon.vertices) for polygon in mesh.polygons] + polygon_centers = [] + material_names = [] + for polygon in mesh.polygons: + polygon_centers.append(tuple(matrix @ polygon.center)) + material = ( + evaluated.material_slots[polygon.material_index].material + if polygon.material_index < len(evaluated.material_slots) + else None + ) + material_names.append(material.name if material else None) + seam_segments = [] + for edge in mesh.edges: + if not bool(getattr(edge, "use_seam", False)): + continue + start, end = edge.vertices + start_point = matrix @ mesh.vertices[start].co + end_point = matrix @ mesh.vertices[end].co + seam_segments.append({ + "start": tuple(start_point), + "end": tuple(end_point), + "midpoint": tuple((start_point + end_point) * 0.5), + }) + return { + "vertices": vertices, + "polygons": polygons, + "polygon_centers": polygon_centers, + "material_names": material_names, + "seam_segments": seam_segments, + } + finally: + evaluated.to_mesh_clear() + + def sample_indices(count, maximum): + if count <= maximum: + return list(range(count)) + return sorted({ + min(count - 1, int(index * count / maximum)) + for index in range(maximum) + }) + + def build_bvh(snapshot): + if not snapshot["vertices"] or not snapshot["polygons"]: + raise ValueError("Both objects need evaluated polygon surfaces") + return BVHTree.FromPolygons( + snapshot["vertices"], + snapshot["polygons"], + all_triangles=False, + ) + + def nearest_distances(points, tree, maximum): + distances = [] + for index in sample_indices(len(points), maximum): + nearest = tree.find_nearest(Vector(points[index])) + if nearest is None or nearest[3] is None: + raise ValueError("Nearest-surface comparison failed") + distances.append(float(nearest[3])) + return distances + + def polygon_center(snapshot, polygon_index): + return Vector(snapshot["polygon_centers"][polygon_index]) + + def material_mismatches(origin, target, target_tree): + mismatches = 0 + compared = 0 + for polygon_index in sample_indices( + len(origin["polygons"]), + max_attribute_samples, + ): + nearest = target_tree.find_nearest( + polygon_center(origin, polygon_index), + ) + target_index = nearest[2] if nearest else None + if target_index is None: + mismatches += 1 + elif ( + origin["material_names"][polygon_index] + != target["material_names"][target_index] + ): + mismatches += 1 + compared += 1 + return mismatches, compared + + def seam_mismatches(origin_segments, target_segments): + sampled = sample_indices(len(origin_segments), max_attribute_samples) + if not sampled: + return 0, 0 + if not target_segments: + return len(sampled), len(sampled) + tree = KDTree(len(target_segments)) + for index, segment in enumerate(target_segments): + tree.insert(segment["midpoint"], index) + tree.balance() + mismatches = 0 + matched_target_indices = set() + for index in sampled: + origin = origin_segments[index] + matches = sorted( + tree.find_range( + origin["midpoint"], + max(seam_tolerance, 1e-12), + ), + key=lambda match: float(match[2]), + ) + matched = False + for _co, target_index, _distance in matches: + if target_index in matched_target_indices: + continue + target = target_segments[target_index] + direct = max( + (Vector(origin["start"]) - Vector(target["start"])).length, + (Vector(origin["end"]) - Vector(target["end"])).length, + ) + reversed_match = max( + (Vector(origin["start"]) - Vector(target["end"])).length, + (Vector(origin["end"]) - Vector(target["start"])).length, + ) + if min(direct, reversed_match) <= seam_tolerance: + matched_target_indices.add(target_index) + matched = True + break + if not matched: + mismatches += 1 + return mismatches, len(sampled) + + source_snapshot = snapshot(source) + candidate_snapshot = snapshot(candidate) + source_tree = build_bvh(source_snapshot) + candidate_tree = build_bvh(candidate_snapshot) + + source_surface_points = ( + source_snapshot["vertices"] + source_snapshot["polygon_centers"] + ) + candidate_surface_points = ( + candidate_snapshot["vertices"] + candidate_snapshot["polygon_centers"] + ) + source_distances = nearest_distances( + source_surface_points, + candidate_tree, + max_surface_samples, + ) + candidate_distances = nearest_distances( + candidate_surface_points, + source_tree, + max_surface_samples, + ) + all_distances = source_distances + candidate_distances + + source_material_mismatches, source_material_compared = material_mismatches( + source_snapshot, + candidate_snapshot, + candidate_tree, + ) + candidate_material_mismatches, candidate_material_compared = material_mismatches( + candidate_snapshot, + source_snapshot, + source_tree, + ) + source_seam_mismatches, source_seams_compared = seam_mismatches( + source_snapshot["seam_segments"], + candidate_snapshot["seam_segments"], + ) + candidate_seam_mismatches, candidate_seams_compared = seam_mismatches( + candidate_snapshot["seam_segments"], + source_snapshot["seam_segments"], + ) + + max_surface_deviation = max(all_distances) if all_distances else 0.0 + return { + "success": True, + "policy_version": "mesh-surface-comparison-v1", + "source_object": source.name, + "candidate_object": candidate.name, + "distance_tolerance": distance_tolerance, + "seam_tolerance": seam_tolerance, + "surface_sampling_mode": "vertices-and-polygon-centers", + "source_vertex_count": len(source_snapshot["vertices"]), + "candidate_vertex_count": len(candidate_snapshot["vertices"]), + "source_polygon_count": len(source_snapshot["polygons"]), + "candidate_polygon_count": len(candidate_snapshot["polygons"]), + "max_surface_deviation": max_surface_deviation, + "mean_surface_deviation": ( + sum(all_distances) / len(all_distances) if all_distances else 0.0 + ), + "surface_deviation_exceeds_tolerance": ( + max_surface_deviation > distance_tolerance + ), + "surface_sample_count": len(all_distances), + "surface_sampling_complete": ( + len(source_surface_points) <= max_surface_samples + and len(candidate_surface_points) <= max_surface_samples + ), + "material_sample_count": ( + source_material_compared + candidate_material_compared + ), + "material_sampling_complete": ( + len(source_snapshot["polygons"]) <= max_attribute_samples + and len(candidate_snapshot["polygons"]) <= max_attribute_samples + ), + "material_boundary_mismatch_count": ( + source_material_mismatches + candidate_material_mismatches + ), + "source_uv_seam_count": len(source_snapshot["seam_segments"]), + "candidate_uv_seam_count": len(candidate_snapshot["seam_segments"]), + "uv_seam_sample_count": source_seams_compared + candidate_seams_compared, + "uv_seam_sampling_complete": ( + len(source_snapshot["seam_segments"]) <= max_attribute_samples + and len(candidate_snapshot["seam_segments"]) <= max_attribute_samples + ), + "uv_seam_mismatch_count": ( + source_seam_mismatches + candidate_seam_mismatches + ), + "note": ( + "This is bounded geometric evidence. The artist decides whether " + "the candidate preserves the intended visual result." + ), + } + except Exception as e: + return {"success": False, "error": f"Failed to compare mesh surfaces: {str(e)}"} + def decimate_mesh( self, name, @@ -7542,6 +8028,285 @@ def restore_existing_groups(): except Exception as e: return {"error": f"Failed to project vertex group weights: {str(e)}"} + def inspect_pose_deformation( + self, + names=None, + baseline_frame=None, + stress_frames=None, + max_objects=20, + max_vertices_sample=10000, + max_edges_sample=20000, + edge_ratio_threshold=2.0, + displacement_epsilon=0.0001, + ): + """Inspect evaluated rigged meshes across frames without changing persistent scene data.""" + scene = bpy.context.scene + original_frame = scene.frame_current + original_subframe = scene.frame_subframe + reports = [] + try: + def parse_names(raw_names): + if raw_names is None: + return [] + if isinstance(raw_names, str): + return [part.strip() for part in raw_names.split(",") if part.strip()] + if isinstance(raw_names, (list, tuple)): + return [str(name).strip() for name in raw_names if str(name).strip()] + raise ValueError("names must be an array of mesh object names, a comma-separated string, or omitted") + + def parse_frames(raw_frames): + if raw_frames is None: + return [int(scene.frame_current)] + if isinstance(raw_frames, (int, float)): + return [int(raw_frames)] + if isinstance(raw_frames, str): + raw_frames = [part.strip() for part in raw_frames.split(",") if part.strip()] + if not isinstance(raw_frames, (list, tuple)): + raise ValueError("stress_frames must be an array of frame numbers, a comma-separated string, or omitted") + frames = [] + for value in raw_frames: + frame = int(value) + if frame not in frames: + frames.append(frame) + if not frames: + raise ValueError("stress_frames must contain at least one frame") + return frames[:24] + + requested_names = parse_names(names) + baseline_frame = int(scene.frame_start if baseline_frame is None else baseline_frame) + stress_frames = parse_frames(stress_frames) + if baseline_frame in stress_frames: + return { + "success": False, + "error": "baseline_frame must differ from every stress frame", + "baseline_frame": baseline_frame, + "stress_frames": stress_frames, + } + max_objects = max(1, min(int(max_objects), 20)) + max_vertices_sample = max(1, min(int(max_vertices_sample), 50000)) + max_edges_sample = max(1, min(int(max_edges_sample), 100000)) + edge_ratio_threshold = max(1.0, min(float(edge_ratio_threshold), 100.0)) + displacement_epsilon = max(0.0, float(displacement_epsilon)) + + if requested_names: + if len(requested_names) != len(set(requested_names)): + return {"success": False, "error": "names must not contain duplicates"} + if len(requested_names) > max_objects: + return { + "success": False, + "error": f"names exceeds max_objects ({max_objects})", + } + missing = [name for name in requested_names if bpy.data.objects.get(name) is None] + if missing: + return { + "error": "Objects not found", + "missing_names": missing, + "original_frame": original_frame, + } + objects = [bpy.data.objects[name] for name in requested_names] + invalid = [obj.name for obj in objects if obj.type != "MESH"] + if invalid: + return { + "error": "Pose deformation inspection only supports mesh objects", + "invalid_names": invalid, + "original_frame": original_frame, + } + else: + objects = [ + obj for obj in scene.objects + if obj.type == "MESH" and any(mod.type == "ARMATURE" for mod in obj.modifiers) + ][:max_objects] + + if not objects: + return { + "success": False, + "error": "No rigged mesh objects found", + "baseline_frame": baseline_frame, + "stress_frames": stress_frames, + "original_frame": original_frame, + } + + def valid_armature_modifiers(obj): + return [ + modifier for modifier in obj.modifiers + if ( + modifier.type == "ARMATURE" + and modifier.show_viewport + and modifier.object is not None + and modifier.object.type == "ARMATURE" + ) + ] + + invalid_rigged_meshes = [ + obj.name for obj in objects if not valid_armature_modifiers(obj) + ] + if invalid_rigged_meshes: + return { + "success": False, + "error": "Every inspected mesh needs an enabled Armature modifier with a valid armature target", + "invalid_rigged_meshes": invalid_rigged_meshes, + } + + estimated_work = ( + len(objects) + * len(stress_frames) + * (max_vertices_sample + max_edges_sample) + ) + if estimated_work > MAX_POSE_DEFORMATION_WORK: + return { + "success": False, + "error": "Requested pose deformation inspection exceeds the bounded work budget", + "estimated_work": estimated_work, + "max_work": MAX_POSE_DEFORMATION_WORK, + } + + depsgraph = bpy.context.evaluated_depsgraph_get() + + def evaluated_snapshot(obj): + evaluated = obj.evaluated_get(depsgraph) + mesh = evaluated.to_mesh() + try: + vertices = [ + tuple(vertex.co) + for vertex in itertools.islice(mesh.vertices, max_vertices_sample) + ] + edges = [ + tuple(edge.vertices) + for edge in itertools.islice(mesh.edges, max_edges_sample) + ] + return { + "vertex_count": len(mesh.vertices), + "edge_count": len(mesh.edges), + "vertices": vertices, + "edges": edges, + } + finally: + evaluated.to_mesh_clear() + + scene.frame_set(baseline_frame) + bpy.context.view_layer.update() + baselines = {obj.name: evaluated_snapshot(obj) for obj in objects} + + threshold_failure_count = 0 + reports_by_name = { + obj.name: { + "name": obj.name, + "baseline_vertex_count": baselines[obj.name]["vertex_count"], + "baseline_edge_count": baselines[obj.name]["edge_count"], + "sampled_vertices_truncated": ( + baselines[obj.name]["vertex_count"] > len(baselines[obj.name]["vertices"]) + ), + "sampled_edges_truncated": ( + baselines[obj.name]["edge_count"] > len(baselines[obj.name]["edges"]) + ), + "frames": [], + } + for obj in objects + } + for frame in stress_frames: + scene.frame_set(frame) + bpy.context.view_layer.update() + for obj in objects: + baseline = baselines[obj.name] + current = evaluated_snapshot(obj) + topology_changed = ( + current["vertex_count"] != baseline["vertex_count"] + or current["edge_count"] != baseline["edge_count"] + ) + invalid_coordinate_count = 0 + deformed_vertex_count = 0 + displacement_total = 0.0 + max_displacement = 0.0 + compared_vertices = min(len(baseline["vertices"]), len(current["vertices"])) + for index in range(compared_vertices): + base_co = baseline["vertices"][index] + current_co = current["vertices"][index] + if not all(math.isfinite(value) for value in current_co): + invalid_coordinate_count += 1 + continue + displacement = math.sqrt(sum( + (current_co[axis] - base_co[axis]) ** 2 for axis in range(3) + )) + displacement_total += displacement + max_displacement = max(max_displacement, displacement) + if displacement > displacement_epsilon: + deformed_vertex_count += 1 + + outlier_edge_ratio_count = 0 + max_symmetric_edge_ratio = 1.0 + compared_edges = 0 + if not topology_changed: + for edge_index, (start, end) in enumerate(baseline["edges"]): + if edge_index >= len(current["edges"]) or current["edges"][edge_index] != (start, end): + topology_changed = True + break + if start >= compared_vertices or end >= compared_vertices: + continue + base_length = math.dist(baseline["vertices"][start], baseline["vertices"][end]) + current_length = math.dist(current["vertices"][start], current["vertices"][end]) + if base_length <= 1e-12: + continue + compared_edges += 1 + if current_length <= 1e-12: + ratio = edge_ratio_threshold + 1.0 + else: + ratio = max( + current_length / base_length, + base_length / current_length, + ) + max_symmetric_edge_ratio = max(max_symmetric_edge_ratio, ratio) + if ratio > edge_ratio_threshold: + outlier_edge_ratio_count += 1 + + threshold_failed = ( + topology_changed + or invalid_coordinate_count > 0 + or outlier_edge_ratio_count > 0 + ) + if threshold_failed: + threshold_failure_count += 1 + reports_by_name[obj.name]["frames"].append({ + "frame": frame, + "topology_changed": topology_changed, + "sampled_vertex_count": compared_vertices, + "invalid_coordinate_count": invalid_coordinate_count, + "deformed_vertex_count": deformed_vertex_count, + "mean_displacement": ( + displacement_total / compared_vertices if compared_vertices else 0.0 + ), + "max_displacement": max_displacement, + "sampled_edge_count": compared_edges, + "outlier_edge_ratio_count": outlier_edge_ratio_count, + "max_symmetric_edge_ratio": max_symmetric_edge_ratio, + "threshold_failed": threshold_failed, + }) + reports = [reports_by_name[obj.name] for obj in objects] + + return { + "success": True, + "policy_version": "pose-deformation-v1", + "baseline_frame": baseline_frame, + "stress_frames": stress_frames, + "stress_frame_count": len(stress_frames), + "object_count": len(reports), + "thresholds": { + "edge_ratio_threshold": edge_ratio_threshold, + "edge_ratio_mode": "symmetric", + "displacement_epsilon": displacement_epsilon, + }, + "threshold_failure_count": threshold_failure_count, + "reports": reports, + "note": ( + "Threshold results identify mechanical anomalies only. " + "The artist still decides whether deformation quality is acceptable." + ), + } + except Exception as e: + return {"error": f"Failed to inspect pose deformation: {str(e)}"} + finally: + scene.frame_set(original_frame, subframe=original_subframe) + bpy.context.view_layer.update() + def inspect_animation_data( self, names=None, @@ -8995,32 +9760,573 @@ def ensure_single_user_action(): except Exception as e: return {"error": f"Failed to set shape key value: {str(e)}"} - def set_keyframe_animation( + def retarget_animation_clip( self, - name, - data_path="location", - keyframes=None, - interpolation="BEZIER", - easing=None, - rotation_unit="radians", - clear_existing=False, - set_scene_range=True, + filepath, + target_armature, + bone_map, + action_name, + export_names, + output_filepath, + source_armature=None, + root_motion="in_place", + root_source_bone=None, + frame_start=None, + frame_end=None, + bake_step=1, + cleanup_imported=True, + overwrite=False, ): - """Create bounded transform keyframes for location, rotation_euler, or scale without arbitrary Python.""" - try: - import math - - obj = bpy.data.objects.get(str(name)) - if obj is None: - return {"error": f"Object '{name}' not found"} + """Import BVH/FBX motion, retarget it through explicit bone constraints, bake, and export a GLB candidate.""" + imported_objects = [] + created_data = {} + source_armature_name = None + added_constraints = [] + baked_action = None + previous_action = None + previous_selection = list(bpy.context.selected_objects) + previous_active = bpy.context.view_layer.objects.active + previous_mode = ( + previous_active.mode + if previous_active is not None + else "OBJECT" + ) + scene = bpy.context.scene + previous_frame_start = int(scene.frame_start) + previous_frame_end = int(scene.frame_end) + previous_frame = int(scene.frame_current) + output_path = None + output_backup_path = None + exported = False + output_existed = False + backup_complete = False + output_touched = False + tracked_data = {} + before_names = {} + previous_pose = {} + target_had_animation_data = False + recovery_failed = False - allowed_paths = {"location", "rotation_euler", "scale"} - data_path = str(data_path or "location").strip() - if data_path not in allowed_paths: - return {"error": f"Unsupported data_path '{data_path}'. Use one of: {', '.join(sorted(allowed_paths))}"} + def coerce_bool(value, default=False): + if value is None: + return default + if isinstance(value, str): + return value.strip().lower() in { + "true", + "1", + "yes", + "y", + "on", + } + return bool(value) - if not isinstance(keyframes, (list, tuple)) or len(keyframes) < 2: - return {"error": "keyframes must contain at least two entries with frame and value fields"} + def cleanup_created_imports(): + nonlocal created_data, imported_objects + if before_names: + created_data = { + key: [block for block in collection if block.name not in before_names[key]] + for key, collection in tracked_data.items() + } + imported_objects = list(created_data.get("objects", [])) + for obj in list(imported_objects): + if obj.name in bpy.data.objects: + bpy.data.objects.remove(obj, do_unlink=True) + for data_name, blocks in created_data.items(): + if data_name == "objects": + continue + collection = getattr(bpy.data, data_name) + for block in list(blocks): + block_name = block.name + if ( + block is baked_action + or collection.get(block_name) is None + or block.users > 0 + ): + continue + collection.remove(block) + + def remove_added_constraints(): + for pose_bone, constraint in reversed( + added_constraints + ): + if constraint in pose_bone.constraints.values(): + pose_bone.constraints.remove(constraint) + added_constraints.clear() + + def rollback(): + nonlocal baked_action + with suppress(Exception): + if bpy.context.object and bpy.context.object.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + remove_added_constraints() + target = bpy.data.objects.get(str(target_armature)) + if target is not None: + if target_had_animation_data: + target.animation_data_create() + target.animation_data.action = previous_action + elif previous_pose: + target.animation_data_clear() + if baked_action is not None and baked_action.users == 0: + with suppress(Exception): + bpy.data.actions.remove(baked_action) + baked_action = None + cleanup_created_imports() + if backup_complete and output_backup_path and os.path.isfile(output_backup_path): + os.replace(output_backup_path, output_path) + elif output_touched and not output_existed and output_path and os.path.isfile(output_path): + os.remove(output_path) + elif output_backup_path and not backup_complete and os.path.isfile(output_backup_path): + os.remove(output_backup_path) + + try: + input_path = bpy.path.abspath(str(filepath)) + input_extension = os.path.splitext(input_path)[1].lower() + if input_extension not in {".bvh", ".fbx"}: + return { + "error": "filepath must point to a .bvh or .fbx motion file" + } + if not os.path.isfile(input_path): + return { + "error": f"Motion file not found: {input_path}" + } + + target = bpy.data.objects.get(str(target_armature)) + if target is None or target.type != "ARMATURE": + return { + "error": f"Target armature '{target_armature}' not found" + } + previous_action = ( + target.animation_data.action + if target.animation_data + else None + ) + target_had_animation_data = target.animation_data is not None + previous_pose = {bone.name: (bone.matrix_basis.copy(), bone.rotation_mode) for bone in target.pose.bones} + if not isinstance(bone_map, dict) or not bone_map: + return { + "error": "bone_map must be a non-empty object mapping source bone names to target bone names" + } + normalized_map = {} + for source_name, target_name in bone_map.items(): + source_key = str(source_name).strip() + target_key = str(target_name).strip() + if not source_key or not target_key: + return { + "error": "bone_map names must be non-empty strings" + } + normalized_map[source_key] = target_key + + resolved_action_name = str(action_name).strip() + if not resolved_action_name: + return {"error": "action_name is required"} + if bpy.data.actions.get(resolved_action_name) is not None: + return { + "error": f"Action already exists: {resolved_action_name}" + } + + if not isinstance(export_names, (list, tuple)): + return { + "error": "export_names must be a non-empty array of explicit object names" + } + normalized_export_names = list( + dict.fromkeys( + str(name).strip() + for name in export_names + if str(name).strip() + ) + ) + if not normalized_export_names: + return { + "error": "export_names must be a non-empty array of explicit object names" + } + if target.name not in normalized_export_names: + return { + "error": "export_names must include the target armature" + } + missing_export_names = [ + name + for name in normalized_export_names + if bpy.data.objects.get(name) is None + ] + if missing_export_names: + return { + "error": "Export objects not found: " + + ", ".join(missing_export_names) + } + + raw_output_path = str(output_filepath).strip() + if not os.path.isabs(raw_output_path): + return {"error": "output_filepath must be absolute"} + output_path = os.path.abspath(raw_output_path) + if os.path.splitext(output_path)[1].lower() != ".glb": + return { + "error": "output_filepath must end with .glb" + } + output_directory = os.path.dirname(output_path) + if not os.path.isdir(output_directory): + return { + "error": f"Output directory does not exist: {output_directory}" + } + if os.path.exists(output_path) and not coerce_bool( + overwrite, + False, + ): + return { + "error": f"Output file already exists: {output_path}" + } + if os.path.exists(output_path): + output_existed = True + output_backup_path = ( + f"{output_path}.vipermesh-backup-{uuid.uuid4().hex}" + ) + shutil.copy2(output_path, output_backup_path) + backup_complete = True + + root_motion_mode = str(root_motion or "in_place").lower() + if root_motion_mode not in {"in_place", "preserve"}: + return { + "error": "root_motion must be IN_PLACE or PRESERVE" + } + try: + step = int(bake_step) + except (TypeError, ValueError): + return {"error": "bake_step must be an integer"} + if step < 1 or step > 16: + return { + "error": "bake_step must be between 1 and 16" + } + + tracked_data = { + "objects": bpy.data.objects, + "armatures": bpy.data.armatures, + "meshes": bpy.data.meshes, + "actions": bpy.data.actions, + "collections": bpy.data.collections, + "materials": bpy.data.materials, + "images": bpy.data.images, + } + before_names = { + key: {block.name for block in collection} + for key, collection in tracked_data.items() + } + + if bpy.context.object and bpy.context.object.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + if input_extension == ".bvh": + import_result = bpy.ops.import_anim.bvh( + filepath=input_path, + target="ARMATURE", + rotate_mode="NATIVE", + update_scene_duration=True, + ) + else: + import_result = bpy.ops.import_scene.fbx( + filepath=input_path, + use_anim=True, + ignore_leaf_bones=False, + ) + if "FINISHED" not in import_result: + raise RuntimeError( + f"Motion import operator returned {sorted(import_result)}" + ) + + created_data = { + key: [ + block + for block in collection + if block.name not in before_names[key] + ] + for key, collection in tracked_data.items() + } + imported_objects = list(created_data["objects"]) + imported_armatures = [ + obj for obj in imported_objects if obj.type == "ARMATURE" + ] + if source_armature: + source = bpy.data.objects.get(str(source_armature)) + if source not in imported_armatures: + raise ValueError( + "source_armature must name an armature imported from filepath" + ) + elif len(imported_armatures) == 1: + source = imported_armatures[0] + else: + raise ValueError( + "Motion import must create exactly one armature unless source_armature is explicit" + ) + + source_action = ( + source.animation_data.action + if source.animation_data + else None + ) + if source_action is None: + raise ValueError( + "Imported source armature has no active animation action" + ) + source_armature_name = source.name + + missing_source_bones = [ + name + for name in normalized_map + if source.pose.bones.get(name) is None + ] + missing_target_bones = [ + name + for name in normalized_map.values() + if target.pose.bones.get(name) is None + ] + if missing_source_bones or missing_target_bones: + raise ValueError( + "Bone map could not be resolved; missing source bones: " + + ", ".join(missing_source_bones or ["none"]) + + "; missing target bones: " + + ", ".join(missing_target_bones or ["none"]) + ) + + resolved_root_source = ( + str(root_source_bone).strip() + if root_source_bone + else None + ) + if root_motion_mode == "preserve": + if resolved_root_source is None: + root_candidates = [ + source_name + for source_name in normalized_map + if source.pose.bones[source_name].parent is None + ] + if len(root_candidates) != 1: + raise ValueError( + "PRESERVE root motion requires root_source_bone when the mapped root is ambiguous" + ) + resolved_root_source = root_candidates[0] + if resolved_root_source not in normalized_map: + raise ValueError( + "root_source_bone must be present in bone_map" + ) + + target.animation_data_create() + baked_action = bpy.data.actions.new( + name=resolved_action_name + ) + target.animation_data.action = baked_action + + for source_name, target_name in normalized_map.items(): + target_pose_bone = target.pose.bones[target_name] + rotation_constraint = ( + target_pose_bone.constraints.new( + type="COPY_ROTATION" + ) + ) + rotation_constraint.name = ( + f"ViperMesh_Retarget_Rotation_{source_name}" + ) + rotation_constraint.target = source + rotation_constraint.subtarget = source_name + rotation_constraint.target_space = "POSE" + rotation_constraint.owner_space = "POSE" + rotation_constraint.mix_mode = "REPLACE" + added_constraints.append( + (target_pose_bone, rotation_constraint) + ) + + if ( + root_motion_mode == "preserve" + and resolved_root_source is not None + ): + root_target_name = normalized_map[ + resolved_root_source + ] + root_target_pose = target.pose.bones[ + root_target_name + ] + location_constraint = ( + root_target_pose.constraints.new( + type="COPY_LOCATION" + ) + ) + location_constraint.name = ( + "ViperMesh_Retarget_Root_Location" + ) + location_constraint.target = source + location_constraint.subtarget = ( + resolved_root_source + ) + location_constraint.target_space = "POSE" + location_constraint.owner_space = "POSE" + added_constraints.append( + (root_target_pose, location_constraint) + ) + + source_start = int(math.floor(source_action.frame_range[0])) + source_end = int(math.ceil(source_action.frame_range[1])) + resolved_start = ( + source_start + if frame_start is None + else int(frame_start) + ) + resolved_end = ( + source_end if frame_end is None else int(frame_end) + ) + if resolved_start < 0 or resolved_end < resolved_start: + raise ValueError( + "frame_start and frame_end must define a non-negative ordered range" + ) + scene.frame_start = resolved_start + scene.frame_end = resolved_end + scene.frame_set(resolved_start) + + bpy.ops.object.select_all(action="DESELECT") + target.select_set(True) + bpy.context.view_layer.objects.active = target + bpy.ops.object.mode_set(mode="POSE") + bpy.ops.pose.select_all(action="DESELECT") + for target_name in normalized_map.values(): + target.pose.bones[target_name].select = True + bake_result = bpy.ops.nla.bake( + frame_start=resolved_start, + frame_end=resolved_end, + step=step, + only_selected=True, + visual_keying=True, + clear_constraints=False, + clear_parents=False, + use_current_action=True, + clean_curves=False, + bake_types={"POSE"}, + channel_types={ + "LOCATION", + "ROTATION", + "SCALE", + "BBONE", + "PROPS", + }, + ) + if "FINISHED" not in bake_result: + raise RuntimeError( + f"NLA bake operator returned {sorted(bake_result)}" + ) + bpy.ops.object.mode_set(mode="OBJECT") + remove_added_constraints() + bpy.context.view_layer.update() + + output_touched = True + export_result = self.export_object( + normalized_export_names, + output_path, + "GLB", + ) + if export_result.get("error"): + raise RuntimeError(export_result["error"]) + if coerce_bool(cleanup_imported, True): + cleanup_created_imports() + + animation_report = self.inspect_animation_data( + names=[target.name], + include_actions=True, + max_actions=20, + ) + if output_backup_path and os.path.isfile(output_backup_path): + os.remove(output_backup_path) + output_backup_path = None + exported = True + return { + "success": True, + "source_filepath": input_path, + "source_armature": source_armature_name, + "target_armature": target.name, + "bone_map": normalized_map, + "mapped_bone_count": len(normalized_map), + "root_motion": root_motion_mode, + "root_source_bone": resolved_root_source, + "action_name": baked_action.name, + "frame_start": resolved_start, + "frame_end": resolved_end, + "bake_step": step, + "cleanup_imported": coerce_bool( + cleanup_imported, + True, + ), + "export_names": normalized_export_names, + "output_filepath": output_path, + "file_size_bytes": export_result.get( + "file_size_bytes", + 0, + ), + "animation_report": animation_report, + "next_safe_action": "run inspect_animation_data and inspect_pose_deformation, then review the exported candidate before acceptance", + } + except Exception as error: + try: + rollback() + except Exception as recovery_error: + recovery_failed = True + return {"error": f"Failed to retarget animation clip: {error}; recovery failed: {recovery_error}", "rolled_back": False, "recovery_backup": output_backup_path} + return { + "error": f"Failed to retarget animation clip: {str(error)}", + "rolled_back": True, + } + finally: + with suppress(Exception): + if bpy.context.object and bpy.context.object.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + for obj in previous_selection: + if obj.name in bpy.data.objects: + obj.select_set(True) + if ( + previous_active is not None + and previous_active.name in bpy.data.objects + ): + bpy.context.view_layer.objects.active = ( + previous_active + ) + if previous_mode != "OBJECT": + bpy.ops.object.mode_set(mode=previous_mode) + scene.frame_start = previous_frame_start + scene.frame_end = previous_frame_end + scene.frame_set(previous_frame) + if not exported and previous_pose: + target = bpy.data.objects.get(str(target_armature)) + if target is not None: + for name, (matrix, rotation_mode) in previous_pose.items(): + bone = target.pose.bones.get(name) + if bone is not None: + bone.rotation_mode = rotation_mode + bone.matrix_basis = matrix + bpy.context.view_layer.update() + if output_backup_path and backup_complete and not output_touched and not recovery_failed: + with suppress(Exception): + os.remove(output_backup_path) + + def set_keyframe_animation( + self, + name, + data_path="location", + keyframes=None, + interpolation="BEZIER", + easing=None, + rotation_unit="radians", + clear_existing=False, + set_scene_range=True, + ): + """Create bounded transform keyframes for location, rotation_euler, or scale without arbitrary Python.""" + try: + import math + + obj = bpy.data.objects.get(str(name)) + if obj is None: + return {"error": f"Object '{name}' not found"} + + allowed_paths = {"location", "rotation_euler", "scale"} + data_path = str(data_path or "location").strip() + if data_path not in allowed_paths: + return {"error": f"Unsupported data_path '{data_path}'. Use one of: {', '.join(sorted(allowed_paths))}"} + + if not isinstance(keyframes, (list, tuple)) or len(keyframes) < 2: + return {"error": "keyframes must contain at least two entries with frame and value fields"} def coerce_bool(value, default=False): if value is None: @@ -11405,6 +12711,237 @@ def export_object(self, names, filepath, file_format='GLB'): except Exception as e: return {"error": f"Failed to export: {str(e)}"} + def get_vipermesh_runtime_identity(self): + """Return a fingerprint that capability sync can bind to this exact add-on runtime.""" + config_directory = bpy.utils.user_resource( + "CONFIG", + path="vipermesh", + create=True, + ) + device_id_path = os.path.join( + config_directory, + "runtime-device-id", + ) + runtime_device_key = None + if os.path.isfile(device_id_path): + with open(device_id_path, "r", encoding="utf-8") as device_file: + candidate = device_file.read().strip() + try: + runtime_device_key = str(uuid.UUID(candidate)) + except (ValueError, AttributeError): + runtime_device_key = None + if runtime_device_key is None: + runtime_device_key = str(uuid.uuid4()) + temporary_path = f"{device_id_path}.tmp" + with open(temporary_path, "w", encoding="utf-8") as device_file: + device_file.write(runtime_device_key) + os.replace(temporary_path, device_id_path) + addon_path = os.path.abspath(__file__) + with open(addon_path, "rb") as addon_file: + source_fingerprint = hashlib.sha256( + addon_file.read() + ).hexdigest() + return { + "success": True, + "device_key": runtime_device_key, + "source_fingerprint": f"sha256:{source_fingerprint}", + "blender_version": bpy.app.version_string, + "addon_version": ".".join( + str(value) for value in bl_info.get("version", ()) + ), + } + + def validate_gltf_roundtrip(self, filepath, cleanup=True): + """Temporarily import a glTF/GLB export, report its contents, then remove imported data.""" + imported_objects = [] + created_datablocks = {} + tracked_collections = {} + before_names = {} + previous_selection = list(bpy.context.selected_objects) + previous_active = bpy.context.view_layer.objects.active + try: + absolute_filepath = bpy.path.abspath(str(filepath)) + extension = os.path.splitext(absolute_filepath)[1].lower() + if extension not in {".glb", ".gltf"}: + return {"error": "filepath must point to a .glb or .gltf file"} + if not os.path.isfile(absolute_filepath): + return {"error": f"glTF file not found: {absolute_filepath}"} + + tracked_collections = { + "objects": bpy.data.objects, + "meshes": bpy.data.meshes, + "materials": bpy.data.materials, + "images": bpy.data.images, + "armatures": bpy.data.armatures, + "actions": bpy.data.actions, + "collections": bpy.data.collections, + } + before_names = { + key: {block.name for block in collection} + for key, collection in tracked_collections.items() + } + + if bpy.context.object and bpy.context.object.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + import_result = bpy.ops.import_scene.gltf(filepath=absolute_filepath) + if "FINISHED" not in import_result: + raise RuntimeError(f"glTF import operator returned {sorted(import_result)}") + + created_datablocks = { + key: [ + block + for block in collection + if block.name not in before_names[key] + ] + for key, collection in tracked_collections.items() + } + imported_objects = list(created_datablocks["objects"]) + reportable_objects = [ + obj + for obj in imported_objects + if not any( + collection.name == "glTF_not_exported" + for collection in obj.users_collection + ) + ] + mesh_objects = [ + obj for obj in reportable_objects if obj.type == "MESH" + ] + armature_objects = [ + obj for obj in reportable_objects if obj.type == "ARMATURE" + ] + def bound_armatures(obj): + names = set() + for modifier in obj.modifiers: + if ( + modifier.type != "ARMATURE" + or modifier.object is None + ): + continue + armature = modifier.object + bone_names = { + bone.name for bone in armature.data.bones + } + vertex_group_indices = { + group.index + for group in obj.vertex_groups + if group.name in bone_names + } + has_weighted_vertices = any( + assignment.group in vertex_group_indices + and assignment.weight > 0 + for vertex in obj.data.vertices + for assignment in vertex.groups + ) + if has_weighted_vertices: + names.add(armature.name) + return sorted(names) + + skinned_mesh_objects = [ + obj + for obj in mesh_objects + if bound_armatures(obj) + ] + evaluated_triangles = sum( + max(0, len(poly.vertices) - 2) + for obj in mesh_objects + for poly in obj.data.polygons + ) + material_names = sorted({ + slot.material.name + for obj in mesh_objects + for slot in obj.material_slots + if slot.material + }) + missing_images = sorted({ + image.name + for image in created_datablocks["images"] + if image.source == "FILE" + and not image.packed_file + and image.filepath + and not os.path.isfile(bpy.path.abspath(image.filepath, library=image.library)) + }) + issues = [] + if not reportable_objects: + issues.append("no_objects_imported") + if not mesh_objects: + issues.append("no_meshes_imported") + if missing_images: + issues.append("missing_images") + with open(absolute_filepath, "rb") as checkpoint_file: + checkpoint_sha256 = hashlib.sha256( + checkpoint_file.read() + ).hexdigest() + + return { + "success": True, + "roundtrip_valid": len(issues) == 0, + "filepath": absolute_filepath, + "sha256": checkpoint_sha256, + "file_size_bytes": os.path.getsize(absolute_filepath), + "object_count": len(reportable_objects), + "mesh_count": len(mesh_objects), + "armature_count": len(armature_objects), + "skinned_mesh_count": len(skinned_mesh_objects), + "material_count": len(material_names), + "image_count": len(created_datablocks["images"]), + "action_count": len(created_datablocks["actions"]), + "evaluated_triangles": evaluated_triangles, + "objects": [ + {"name": obj.name, "type": obj.type} + for obj in reportable_objects + ], + "skinned_meshes": [ + { + "name": obj.name, + "armatures": bound_armatures(obj), + } + for obj in skinned_mesh_objects + ], + "armatures": [ + { + "name": obj.name, + "bones": [ + bone.name for bone in obj.data.bones + ], + } + for obj in armature_objects + ], + "materials": material_names, + "missing_images": missing_images, + "issues": issues, + "cleanup_requested": bool(cleanup), + "next_safe_action": "use the imported evidence to approve the export" if not issues else "fix round-trip issues before approving the export", + } + except Exception as e: + return {"error": f"Failed to validate glTF round trip: {str(e)}"} + finally: + if cleanup: + with suppress(Exception): + if before_names: + created_datablocks = { + key: [block for block in collection if block.name not in before_names[key]] + for key, collection in tracked_collections.items() + } + imported_objects = list(created_datablocks.get("objects", [])) + if bpy.context.object and bpy.context.object.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + for obj in imported_objects: + if obj.name in bpy.data.objects: + bpy.data.objects.remove(obj, do_unlink=True) + for key in ("collections", "actions", "armatures", "meshes", "materials", "images"): + collection = getattr(bpy.data, key) + for block in created_datablocks.get(key, []): + if block.name in collection and block.users == 0: + collection.remove(block) + bpy.ops.object.select_all(action="DESELECT") + for obj in previous_selection: + if obj.name in bpy.data.objects: + obj.select_set(True) + if previous_active and previous_active.name in bpy.data.objects: + bpy.context.view_layer.objects.active = previous_active + # ---------- Phase 3: Dynamic Addon Detection ---------- def list_installed_addons(self): @@ -11437,6 +12974,377 @@ def list_installed_addons(self): except Exception as e: return {"error": f"Failed to list addons: {str(e)}"} + def _json_safe_rna_value(self, value): + if value is None or isinstance(value, (str, int, float, bool)): + return value + if isinstance(value, (list, tuple, set)): + return [self._json_safe_rna_value(item) for item in value] + try: + return [self._json_safe_rna_value(item) for item in value] + except (TypeError, AttributeError): + return str(value) + + def _find_operator_class(self, operator_id): + queue = list(bpy.types.Operator.__subclasses__()) + seen = set() + while queue: + operator_class = queue.pop() + if operator_class in seen: + continue + seen.add(operator_class) + if getattr(operator_class, "bl_idname", "") == operator_id: + return operator_class + queue.extend(operator_class.__subclasses__()) + return None + + def _operator_callable(self, operator_id): + if not isinstance(operator_id, str) or operator_id.count(".") != 1: + raise ValueError("operator_id must use Blender's category.operation form") + category, operation = operator_id.split(".", 1) + operator_group = getattr(bpy.ops, category, None) + operator_callable = getattr(operator_group, operation, None) if operator_group else None + if operator_callable is None: + raise ValueError(f"Blender operator is not registered: {operator_id}") + return operator_callable + + def _rna_property_schema(self, prop): + scalar_types = { + "BOOLEAN": "boolean", + "INT": "integer", + "FLOAT": "number", + "STRING": "string", + "ENUM": "string", + } + value_schema = {"type": scalar_types.get(prop.type, "unsupported")} + supported = prop.type in scalar_types + if prop.type == "ENUM": + value_schema["enum"] = [ + item.identifier + for item in prop.enum_items + if getattr(item, "identifier", "") + ] + if getattr(prop, "is_enum_flag", False): + value_schema = { + "type": "array", + "items": value_schema, + "uniqueItems": True, + } + if prop.type in {"INT", "FLOAT"}: + value_schema["minimum"] = prop.hard_min + value_schema["maximum"] = prop.hard_max + if getattr(prop, "array_length", 0) > 0: + value_schema = { + "type": "array", + "items": value_schema, + "minItems": prop.array_length, + "maxItems": prop.array_length, + } + default_source = ( + getattr(prop, "default_flag", None) + if prop.type == "ENUM" and getattr(prop, "is_enum_flag", False) + else getattr(prop, "default_array", None) + if getattr(prop, "array_length", 0) > 0 + else getattr(prop, "default", None) + ) + default = self._json_safe_rna_value(default_source) + if default is not None: + value_schema["default"] = default + return { + "identifier": prop.identifier, + "name": prop.name or prop.identifier, + "description": prop.description or "", + "schema": value_schema, + "supported": supported and not prop.is_readonly, + "read_only": bool(prop.is_readonly), + "hidden": bool(getattr(prop, "is_hidden", False)), + "subtype": str(getattr(prop, "subtype", "NONE")), + "enum_flag": prop.type == "ENUM" and bool(getattr(prop, "is_enum_flag", False)), + } + + def _inspect_addon_operator(self, addon_module, operator_id, addon_version=""): + operator_class = self._find_operator_class(operator_id) + if operator_class is None: + raise ValueError(f"Unable to resolve operator class: {operator_id}") + class_module = getattr(operator_class, "__module__", "") + if class_module != addon_module and not class_module.startswith(f"{addon_module}."): + raise ValueError( + f"Operator {operator_id} is owned by {class_module or 'an unknown module'}, " + f"not {addon_module}" + ) + + operator_callable = self._operator_callable(operator_id) + properties = [] + for prop in operator_callable.get_rna_type().properties: + if prop.identifier == "rna_type": + continue + properties.append(self._rna_property_schema(prop)) + input_schema = { + "type": "object", + "properties": { + prop["identifier"]: prop["schema"] + for prop in properties + if prop["supported"] and not prop["hidden"] + }, + "additionalProperties": False, + } + try: + poll_available = bool(operator_callable.poll()) + poll_error = None + except Exception as exc: + poll_available = False + poll_error = str(exc) + + fingerprint_payload = { + "addon_module": addon_module, + "addon_version": addon_version, + "blender_version": ".".join(str(v) for v in bpy.app.version), + "operator_id": operator_id, + "properties": properties, + "implementation": self._operator_implementation_fingerprint(operator_class), + } + fingerprint = hashlib.sha256( + json.dumps( + fingerprint_payload, + sort_keys=True, + separators=(",", ":"), + ).encode("utf-8") + ).hexdigest() + return { + "operator_id": operator_id, + "label": getattr(operator_class, "bl_label", "") or operator_id, + "description": getattr(operator_class, "bl_description", "") or "", + "class_module": class_module, + "input_schema": input_schema, + "properties": properties, + "poll_available": poll_available, + "poll_error": poll_error, + "source_fingerprint": f"sha256:{fingerprint}", + } + + def _operator_implementation_fingerprint(self, operator_class): + provenance = {} + try: + source_path = inspect.getsourcefile(operator_class) + except (TypeError, OSError): + source_path = None + if source_path and os.path.isfile(source_path): + digest = hashlib.sha256() + with open(source_path, "rb") as source: + for chunk in iter(lambda: source.read(65536), b""): + digest.update(chunk) + provenance["module_sha256"] = digest.hexdigest() + for name in ("execute", "invoke", "poll", "modal", "draw", "__init__"): + function = getattr(operator_class, name, None) + function = getattr(function, "__func__", function) + code = getattr(function, "__code__", None) + if code is not None: + payload = marshal.dumps(code) + repr(getattr(function, "__defaults__", None)).encode("utf-8") + provenance[name] = hashlib.sha256(payload).hexdigest() + if not provenance: + raise ValueError("Operator implementation provenance is unavailable; review a custom invocation instead") + return provenance + + def _enabled_addon_metadata(self, addon_module): + import addon_utils + + if addon_module not in bpy.context.preferences.addons: + raise ValueError(f"Addon is not enabled: {addon_module}") + for module in addon_utils.modules(): + if module.__name__ != addon_module: + continue + bl_info = getattr(module, "bl_info", {}) + version = bl_info.get("version", ()) + version_label = ".".join(str(part) for part in version) if version else "" + return { + "module": addon_module, + "name": bl_info.get("name", addon_module), + "version": version_label, + "description": bl_info.get("description", ""), + } + return { + "module": addon_module, + "name": addon_module, + "version": "", + "description": "", + } + + def inspect_addon_capabilities( + self, + addon_module, + operator_ids=None, + max_operators=100, + ): + """Inspect enabled add-on operators and RNA inputs without executing them.""" + try: + addon = self._enabled_addon_metadata(addon_module) + max_operators = max(1, min(int(max_operators), 250)) + if operator_ids is None: + operator_ids = sorted({ + getattr(operator_class, "bl_idname", "") + for operator_class in self._all_operator_classes() + if ( + getattr(operator_class, "__module__", "") == addon_module + or getattr(operator_class, "__module__", "").startswith( + f"{addon_module}." + ) + ) + and getattr(operator_class, "bl_idname", "") + }) + if not isinstance(operator_ids, (list, tuple)): + return {"error": "operator_ids must be an array when provided"} + + unique_operator_ids = list(dict.fromkeys(operator_ids)) + capabilities = [] + errors = [] + for operator_id in unique_operator_ids[:max_operators]: + try: + capabilities.append( + self._inspect_addon_operator( + addon_module, + operator_id, + addon["version"], + ) + ) + except Exception as exc: + errors.append({"operator_id": operator_id, "error": str(exc)}) + inventory_payload = { + "addon": addon, + "blender_version": ".".join(str(v) for v in bpy.app.version), + "capability_fingerprints": [ + capability["source_fingerprint"] for capability in capabilities + ], + } + inventory_fingerprint = hashlib.sha256( + json.dumps( + inventory_payload, + sort_keys=True, + separators=(",", ":"), + ).encode("utf-8") + ).hexdigest() + return { + "addon": addon, + "blender_version": inventory_payload["blender_version"], + "capabilities": capabilities, + "count": len(capabilities), + "total_operator_count": len(unique_operator_ids), + "truncated": len(unique_operator_ids) > max_operators, + "errors": errors, + "inventory_fingerprint": f"sha256:{inventory_fingerprint}", + "executed_operators": 0, + } + except Exception as e: + return {"error": f"Failed to inspect addon capabilities: {str(e)}"} + + def _all_operator_classes(self): + queue = list(bpy.types.Operator.__subclasses__()) + seen = set() + while queue: + operator_class = queue.pop() + if operator_class in seen: + continue + seen.add(operator_class) + yield operator_class + queue.extend(operator_class.__subclasses__()) + + def _addon_invocation_scene_state(self): + active = bpy.context.view_layer.objects.active + return { + "object_count": len(bpy.context.scene.objects), + "objects": sorted(obj.name for obj in bpy.context.scene.objects), + "selected": sorted(obj.name for obj in bpy.context.selected_objects), + "active": active.name if active else None, + "mode": bpy.context.mode, + } + + def invoke_addon_capability( + self, + addon_module, + operator_id, + arguments=None, + expected_source_fingerprint=None, + dry_run=True, + approved=False, + checkpoint_filepath=None, + ): + """Dry-run or explicitly invoke one fingerprint-matched enabled add-on operator.""" + try: + addon = self._enabled_addon_metadata(addon_module) + capability = self._inspect_addon_operator( + addon_module, + operator_id, + addon["version"], + ) + if expected_source_fingerprint != capability["source_fingerprint"]: + return { + "error": "Capability fingerprint is missing or stale; inspect again", + "actual_source_fingerprint": capability["source_fingerprint"], + } + arguments = arguments or {} + if not isinstance(arguments, dict): + return {"error": "arguments must be an object"} + supported_properties = capability["input_schema"]["properties"] + unknown_arguments = sorted(set(arguments) - set(supported_properties)) + if unknown_arguments: + return { + "error": "Invocation contains unknown or unsupported arguments", + "unknown_arguments": unknown_arguments, + } + if not capability["poll_available"]: + return { + "error": "Operator is unavailable in the current Blender context", + "poll_error": capability["poll_error"], + } + if dry_run: + return { + "success": True, + "dry_run": True, + "would_invoke": operator_id, + "arguments": arguments, + "capability": capability, + "executed_operators": 0, + } + if approved is not True: + return {"error": "Explicit approved=true is required for invocation"} + if ( + not isinstance(checkpoint_filepath, str) + or not os.path.isabs(checkpoint_filepath) + or not checkpoint_filepath.lower().endswith(".blend") + ): + return { + "error": "An absolute .blend checkpoint_filepath is required" + } + + os.makedirs(os.path.dirname(checkpoint_filepath), exist_ok=True) + if os.path.exists(checkpoint_filepath): + return {"error": "Checkpoint already exists; choose a fresh checkpoint path"} + saved = bpy.ops.wm.save_as_mainfile(filepath=checkpoint_filepath, copy=True) + if "FINISHED" not in saved or not os.path.isfile(checkpoint_filepath): + return {"error": "Checkpoint save did not finish; operator was not invoked", "executed_operators": 0} + enum_flags = {prop["identifier"] for prop in capability["properties"] if prop.get("enum_flag")} + for key in enum_flags & set(arguments): + if not isinstance(arguments[key], list) or any(not isinstance(value, str) for value in arguments[key]): + return {"error": f"Enum flag argument {key} must be an array of strings", "executed_operators": 0} + runtime_arguments = {key: set(value) if key in enum_flags else value for key, value in arguments.items()} + before = self._addon_invocation_scene_state() + result = self._operator_callable(operator_id)(**runtime_arguments) + after = self._addon_invocation_scene_state() + if "FINISHED" not in result: + return {"success": False, "error": f"Operator did not finish: {sorted(result)}", "checkpoint_filepath": checkpoint_filepath, "executed_operators": 1, "before": before, "after": after} + return { + "success": True, + "dry_run": False, + "operator_id": operator_id, + "operator_result": sorted(str(item) for item in result), + "arguments": arguments, + "checkpoint_filepath": checkpoint_filepath, + "source_fingerprint": capability["source_fingerprint"], + "before": before, + "after": after, + "executed_operators": 1, + } + except Exception as e: + return {"error": f"Failed to invoke addon capability: {str(e)}"} + # ---------- Phase 5: Material / Lighting / Camera / Render Tools ---------- def create_material(self, name, color=None, metallic=None, roughness=None, use_nodes=True): diff --git a/docs/portable-blender-mcp.md b/docs/portable-blender-mcp.md index 15eab3d..32df1e8 100644 --- a/docs/portable-blender-mcp.md +++ b/docs/portable-blender-mcp.md @@ -1,5 +1,21 @@ # Portable Blender MCP Gateway +## Result Review And Existing Scenes + +Image-producing calls attach a PNG/JPEG directly when it is available on the MCP +server's filesystem and at most 3 MiB. Otherwise use the reported artifact path +with an image viewer. The `imageAttached` flag indicates transport availability; +`visualReviewRequired` means the agent must judge the actual output against the +task. Image-file health and successful commands are not visual quality scores. + +Stage helpers are optional convenience operations. Set `preservePresentation: +true` on finalize to keep the current camera, lighting and framing. `blendPath` +is optional; omit it for a render without saving a blend file. Saving through +finalize refuses an existing destination. Use a standalone save only when an +overwrite is intended and authorized. Explicit `spatialRelations` are rechecked +on finalize, and failed relations withhold final output. Diagnostic checks cannot +certify arbitrary mesh contact; inspect suspicious areas from revealing views. + The portable gateway lets trusted coding agents call ViperMesh Blender tools through standard MCP stdio transport, including `execute_code` for measuring fallback behavior during local testing. diff --git a/docs/releasing.md b/docs/releasing.md index 408e163..aeaa13d 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -4,6 +4,21 @@ The public repository is generated from `config/public-blender-connector-files.json`. Never fork or copy the private repository history. +## Current Release + +- Repository: https://github.com/Ker102/vipermesh-blender +- Release target: https://github.com/Ker102/vipermesh-blender/releases/tag/v1.3.0 +- Source release target: `v1.3.0` +- Blender compatibility target: 5.2 +- CI: standalone typecheck, conformance tests, build, package validation, npm + audit, and addon Python compilation +- Historical live validation (v1.2.0): persistent stdio MCP discovery, scene calls, mutation, + staged preview/finalize, save, local guidance, and `execute_code` fallback +- Current launch checks: isolated package conformance, inline image transport, + render-only/preserved-presentation stages, spatial failure withholding, + dependency audit, Python compilation, and desktop/mobile site review. Full + live agent performance is evaluated in the next demo pilot. + ## Before Export - Run `npm run validate:public-blender-connector`. @@ -26,7 +41,7 @@ repository history. ## Release -1. Install dependencies and run `npm run typecheck` in the generated directory. +1. Install dependencies and run `npm run check` in the generated directory. 2. Package the addon as a release artifact. 3. Tag the connector version. 4. Publish the MCP package only after its package contents are inspected. diff --git a/lib/orchestration/tool-registry.ts b/lib/orchestration/tool-registry.ts index 8cc8cfa..818ce4f 100644 --- a/lib/orchestration/tool-registry.ts +++ b/lib/orchestration/tool-registry.ts @@ -69,7 +69,14 @@ export const TOOL_REGISTRY: ToolMetadata[] = [ description: "Save the current Blender scene to an explicit .blend filepath without generated Python. Use for review artifacts, handoff checkpoints, and export/package workflows.", category: "advanced", - parameters: "filepath: string (.blend), make_dirs?: boolean, check_existing?: boolean", + parameters: "filepath: string (.blend), make_dirs?: boolean, check_existing?: boolean, copy?: boolean", + }, + { + name: "restore_blend_checkpoint", + description: + "Restore a saved .blend checkpoint after a failed guarded mutation and return Blender to the original file path.", + category: "advanced", + parameters: "checkpoint_filepath: string (.blend), original_filepath: string (.blend)", }, { name: "get_viewport_screenshot", @@ -171,6 +178,14 @@ export const TOOL_REGISTRY: ToolMetadata[] = [ parameters: "relations: Array<{type, subject, reference?, other?, margin?, local_axis?, min_dot?}>, tolerance?: number", }, + { + name: "inspect_mesh_intersections", + description: + "Inspect evaluated mesh-surface intersections for explicit object pairs using Blender BVH geometry. Use when bounds-only clearance cannot prove clothing, collision, or assembly penetration.", + category: "inspection", + parameters: + "pairs: Array<{subject: string, reference: string}>, max_intersections?: number, epsilon?: number", + }, { name: "inspect_scene_grounding", description: @@ -340,6 +355,22 @@ export const TOOL_REGISTRY: ToolMetadata[] = [ category: "inspection", parameters: "(no parameters)", }, + { + name: "inspect_addon_capabilities", + description: + "Inspect registered Blender operator RNA for one enabled add-on without executing any operator. Returns typed inputs, current-context availability, provenance fingerprints, and inspection errors for personal capability onboarding.", + category: "inspection", + parameters: + "addon_module: string, operator_ids?: string[], max_operators?: number (default 100, max 250)", + }, + { + name: "invoke_addon_capability", + description: + "Dry-run or invoke one inspected third-party add-on operator. Real invocation requires the exact current fingerprint, approved=true, and an absolute .blend checkpoint path; dry_run defaults to true.", + category: "advanced", + parameters: + "addon_module: string, operator_id: string, arguments?: object, expected_source_fingerprint: string, dry_run?: boolean, approved?: boolean, checkpoint_filepath?: string", + }, { name: "create_material", description: @@ -479,6 +510,13 @@ export const TOOL_REGISTRY: ToolMetadata[] = [ parameters: "names: string[], file_format?: GLB|GLTF|FBX|OBJ|STL, max_dependencies?: number, check_texture_formats?: boolean", }, + { + name: "validate_gltf_roundtrip", + description: + "Temporarily import a GLB or glTF export, inventory meshes, armature bones, skinned meshes, materials, images, actions, and triangle count, then clean up the imported data by default.", + category: "advanced", + parameters: "filepath: string, cleanup?: boolean", + }, { name: "set_world_environment", description: @@ -687,6 +725,14 @@ export const TOOL_REGISTRY: ToolMetadata[] = [ parameters: "names?: string[], max_objects?: number, high_density_face_threshold?: number", }, + { + name: "compare_mesh_surfaces", + description: + "Compare source and candidate evaluated meshes using bounded bidirectional vertex and polygon-center surface deviation, nearest material-region correspondence, and coverage-aware UV seam position correspondence. Read-only and intended for topology or LOD evidence before artist acceptance.", + category: "inspection", + parameters: + "source_name: string, candidate_name: string, distance_tolerance?: number, seam_tolerance?: number, max_surface_samples?: number, max_attribute_samples?: number", + }, { name: "decimate_mesh", description: @@ -751,6 +797,14 @@ export const TOOL_REGISTRY: ToolMetadata[] = [ parameters: "names?: string[], max_objects?: number, max_vertices_sample?: number, max_influences?: number, weight_sum_tolerance?: number", }, + { + name: "inspect_pose_deformation", + description: + "Non-mutating stress pose inspection for evaluated rigged meshes. Reports sampled displacement, invalid coordinates, topology changes, and symmetric stretch/compression outliers while restoring the artist's current frame and subframe.", + category: "inspection", + parameters: + "names?: string[] (max 20), baseline_frame?: number, stress_frames?: number[] (max 24), max_objects?: number, max_vertices_sample?: number, max_edges_sample?: number, edge_ratio_threshold?: number, displacement_epsilon?: number", + }, { name: "normalize_vertex_group_weights", description: @@ -839,6 +893,14 @@ export const TOOL_REGISTRY: ToolMetadata[] = [ parameters: "names?: string[], include_materials?: boolean, include_actions?: boolean, max_keyframes_per_curve?: number, max_objects?: number, max_materials?: number, max_actions?: number", }, + { + name: "retarget_animation_clip", + description: + "Import a BVH or FBX motion clip, retarget an explicit source-to-target bone map through temporary constraints, bake a new target action, clean imported data, and export explicit objects as a GLB candidate with rollback on failure.", + category: "advanced", + parameters: + "filepath: string, target_armature: string, bone_map: Record, action_name: string, export_names: string[], output_filepath: string (.glb), source_armature?: string, root_motion?: IN_PLACE|PRESERVE, root_source_bone?: string, frame_start?: number, frame_end?: number, bake_step?: number, cleanup_imported?: boolean, overwrite?: boolean", + }, { name: "inspect_shape_keys", description: diff --git a/lib/portable-mcp/agent-context.ts b/lib/portable-mcp/agent-context.ts index f6f2fc4..76f0af5 100644 --- a/lib/portable-mcp/agent-context.ts +++ b/lib/portable-mcp/agent-context.ts @@ -6,12 +6,12 @@ You are operating Blender through the ViperMesh portable MCP gateway. 2. Inspect current scene state before mutation. Prefer get_scene_info or get_all_object_info in a single call. 3. Search search_3d_guidance for task-specific Blender and ViperMesh guidance before unfamiliar or high-risk work. 4. Discover direct tools with list_blender_tools. Prefer deterministic structured tools where they cover the operation. -5. For ordinary scene construction, prefer run_blender_scene_stage with separate build, inspect_preview, and finalize calls. Review the preview between stages. Use call_blender_tool_batch for other bounded, already-decided sequences. +5. Use run_blender_scene_stage when its optional build, inspect_preview, and finalize helpers fit the task. They can configure cameras and lighting: use standalone tools to preserve an artist's existing presentation. Batch only already-decided actions; inspect when the next decision depends on a result. 6. Keep execute_code available for genuinely custom geometry, procedural effects, unusual node setups, and other operations not covered by direct tools. Keep fallback scripts scoped to one logical cluster. -7. For reference reconstruction, use one blockout preview, one intended-camera assembly preview, then final acceptance. At each preview compare required-object presence, relative scale, orientation, support, occlusion, framing, and lighting; avoid redundant screenshots and full-scene dumps. -8. Verify contact, support, orientation, and clearance with inspect_scene_grounding and inspect_spatial_relations. Do not accept floating or interpenetrating props merely because one camera angle hides them. +7. For reference reconstruction, compare required-object presence, relative scale, orientation, support, occlusion, framing, and lighting. Choose useful previews according to uncertainty and task complexity; avoid fixed preview counts, redundant screenshots and full-scene dumps. +8. Verify consequential contact, support, orientation, and clearance with inspect_scene_grounding and explicit inspect_spatial_relations constraints. Bounds-based checks are diagnostic, not proof of exact mesh contact. Inspect suspicious contact and collisions from another angle; respect intentional suspension, overlaps or stylization. 9. Perform visual checks after major changes and before acceptance. Use a viewport capture when a usable 3D viewport exists; use a camera thumbnail or render artifact for autonomous/headless sessions. -10. Save the .blend and final visual artifact only after structural and visual validation pass. Standalone tools remain available for targeted repair between workflow stages. +10. Tool success and image-file health do not prove visual quality. Open and inspect the actual requested output; repair concrete defects and recheck affected relationships. Report unresolved failures instead of declaring them correct. Save a .blend only when requested, to an approved path; inspection/render/export-only tasks need no blend save. 11. Import multi-object local assets with one managed bottom-center root and placement transform in import_local_asset; request compact output instead of manually creating an Empty, parenting every child, and transforming children one by one. ` diff --git a/lib/portable-mcp/onboarding.ts b/lib/portable-mcp/onboarding.ts index 1204205..8ea05fa 100644 --- a/lib/portable-mcp/onboarding.ts +++ b/lib/portable-mcp/onboarding.ts @@ -7,7 +7,7 @@ export const VIPERMESH_MCP_INSTRUCTIONS = `ViperMesh for Blender uses one persis Do not launch npm, npx, tsx, or another MCP subprocess for individual Blender operations. Call bootstrap_vipermesh_session once before the first Blender mutation. Inspect the scene before editing, prefer deterministic Blender tools, group only already-decided operations, and retain execute_code for genuinely custom work. -Use a build, inspect/repair, and finalize workflow. Validate support, orientation, clearance, framing, and the final visual artifact before accepting a scene.` +Choose task-appropriate inspection and repair points. Validate requested relationships and inspect the actual output before accepting it; file-health checks do not judge appearance. Save only requested artifacts to approved paths.` export const VIPERMESH_CONNECTOR_MANUAL = `# ViperMesh for Blender connector manual @@ -36,8 +36,13 @@ geometry, procedural effects, unusual node graphs, and other uncovered work. ## Acceptance -Before saving, inspect required-object presence, relative scale, orientation, +Before completion, inspect required-object presence, relative scale, orientation, support, interpenetration, clearance, occlusion, camera framing, and lighting. Do not accept an object merely because one camera angle hides a structural -problem. Review the final rendered artifact before declaring completion. +problem. Open the requested artifact before declaring completion. Image-file +health checks do not establish appearance or correctness. Report unresolved +defects explicitly; do not assume a successful tool call met the user's goal. +Save a blend file only when requested and to an approved path. Rendering or +inspection does not require saving. Staged helpers may change camera/lighting; +use preservePresentation on finalize, or standalone tools, to retain them. ` diff --git a/lib/portable-mcp/preview.ts b/lib/portable-mcp/preview.ts new file mode 100644 index 0000000..28fd23a --- /dev/null +++ b/lib/portable-mcp/preview.ts @@ -0,0 +1,25 @@ +import { open } from "node:fs/promises" + +const MAX_IMAGE_BYTES = 3 * 1024 * 1024 + +export async function readPreviewImage(filepath: string) { + let file + try { + file = await open(filepath, "r") + const stats = await file.stat() + if (!stats.isFile() || stats.size === 0 || stats.size > MAX_IMAGE_BYTES) return undefined + const buffer = Buffer.alloc(stats.size) + const { bytesRead } = await file.read(buffer, 0, buffer.length, 0) + if (bytesRead !== buffer.length) return undefined + const mimeType = buffer.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])) + ? "image/png" + : buffer[0] === 255 && buffer[1] === 216 && buffer[2] === 255 + ? "image/jpeg" : undefined + if (!mimeType) return undefined + return { type: "image" as const, mimeType, data: buffer.toString("base64") } + } catch { + return undefined + } finally { + await file?.close() + } +} diff --git a/lib/portable-mcp/server.ts b/lib/portable-mcp/server.ts index d23874d..af9db3b 100644 --- a/lib/portable-mcp/server.ts +++ b/lib/portable-mcp/server.ts @@ -2,6 +2,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" import { z } from "zod" import type { PortableMcpService } from "./service" +import { readPreviewImage } from "./preview" import { VIPERMESH_CONNECTOR_MANUAL, VIPERMESH_CONNECTOR_MANUAL_URI, @@ -48,7 +49,7 @@ function toolError(error: unknown) { export function createPortableBlenderMcpServer(service: PortableMcpService) { const server = new McpServer({ name: "vipermesh-blender", - version: "1.2.0", + version: "1.3.0", }, { instructions: VIPERMESH_MCP_INSTRUCTIONS, }) @@ -155,7 +156,11 @@ export function createPortableBlenderMcpServer(service: PortableMcpService) { async ({ name, params }) => { try { const result = await service.callBlenderTool(name, params) - return structuredResult(result as Record) + const imagePath = name === "inspect_render_artifact" ? params.image_path + : name === "render_image" || name === "render_thumbnail_to_path" ? params.output_path : undefined + const preview = result.status === "success" && typeof imagePath === "string" ? await readPreviewImage(imagePath) : undefined + const response = structuredResult({ ...result, ...(imagePath ? { visualReviewRequired: true, imageAttached: !!preview } : {}) }) + return { ...response, content: [...response.content, ...(preview ? [preview] : [])] } } catch (error) { return toolError(error) } @@ -202,6 +207,7 @@ export function createPortableBlenderMcpServer(service: PortableMcpService) { previewPath: z.string().trim().min(1).max(2_048).optional(), renderPath: z.string().trim().min(1).max(2_048).optional(), blendPath: z.string().trim().min(1).max(2_048).optional(), + preservePresentation: z.boolean().optional(), preset: z.enum(["studio", "product", "indoor", "exterior", "night"]).optional(), cameraName: z.string().trim().min(1).max(256).optional(), resolutionX: z.number().int().min(64).max(8_192).optional(), @@ -212,7 +218,12 @@ export function createPortableBlenderMcpServer(service: PortableMcpService) { }, async (input) => { try { - return structuredResult(await service.runBlenderSceneStage(input)) + const result = await service.runBlenderSceneStage(input) + const imagePath = input.stage === "inspect_preview" ? input.previewPath : input.stage === "finalize" ? input.renderPath : undefined + const inspected = result.results.some((item) => item.name === "inspect_render_artifact" && item.success === true) + const preview = imagePath && inspected ? await readPreviewImage(imagePath) : undefined + const response = structuredResult({ ...result, visualReviewRequired: !!imagePath, imageAttached: !!preview }) + return { ...response, content: [...response.content, ...(preview ? [preview] : [])] } } catch (error) { return toolError(error) } diff --git a/lib/portable-mcp/service.ts b/lib/portable-mcp/service.ts index 9e9c64f..4569575 100644 --- a/lib/portable-mcp/service.ts +++ b/lib/portable-mcp/service.ts @@ -37,6 +37,9 @@ export interface PortableMcpServiceDependencies { source?: string similarity?: number }>> + authorizeCapabilityInvocation?: ( + params: Record + ) => Promise> } export interface ListBlenderToolsInput { @@ -62,6 +65,7 @@ export interface BlenderSceneWorkflowInput { previewPath?: string renderPath?: string blendPath?: string + preservePresentation?: boolean preset?: "studio" | "product" | "indoor" | "exterior" | "night" cameraName?: string resolutionX?: number @@ -112,6 +116,13 @@ export function createPortableMcpService( async function executeCommand(name: string, params: Record) { validateCommand(name, params) + if ( + name === "invoke_addon_capability" && + params.dry_run === false && + dependencies.authorizeCapabilityInvocation + ) { + params = await dependencies.authorizeCapabilityInvocation(params) + } try { return await client().execute({ type: name, params }) } catch (error) { @@ -252,9 +263,9 @@ export function createPortableMcpService( } else { if (!input.targetNames?.length) throw new Error("The finalize stage requires targetNames") if (!input.renderPath) throw new Error("The finalize stage requires renderPath") - if (!input.blendPath) throw new Error("The finalize stage requires blendPath") const cameraName = input.cameraName ?? "ViperMesh_Workflow_Camera" commands = [ + ...(!input.preservePresentation ? [ { name: "setup_studio_scene", params: { @@ -277,10 +288,15 @@ export function createPortableMcpService( set_dof_focus: false, }, }, + ] : []), { name: "validate_studio_scene", - params: { target_names: input.targetNames, camera_name: cameraName }, + params: { target_names: input.targetNames, require_lights: !input.preservePresentation, ...(input.cameraName || !input.preservePresentation ? { camera_name: cameraName } : {}) }, }, + ...(input.spatialRelations?.length ? [{ + name: "inspect_spatial_relations", + params: { relations: input.spatialRelations }, + }] : []), ] } @@ -292,7 +308,7 @@ export function createPortableMcpService( commands: [ { name: "render_image", params: { output_path: input.renderPath!, file_format: "PNG" } }, { name: "inspect_render_artifact", params: { image_path: input.renderPath! } }, - { name: "save_blend_file", params: { filepath: input.blendPath!, make_dirs: true, check_existing: false } }, + ...(input.blendPath ? [{ name: "save_blend_file", params: { filepath: input.blendPath, make_dirs: true, check_existing: true } }] : []), ], stopOnError: true, }) @@ -300,7 +316,7 @@ export function createPortableMcpService( } const ready = workflowReady(results) - const expectedCount = input.stage === "finalize" ? 6 : commands.length + const expectedCount = input.stage === "finalize" ? commands.length + 2 + (input.blendPath ? 1 : 0) : commands.length return { stage: input.stage, requested: expectedCount, @@ -364,11 +380,17 @@ function compactResponse(name: string, response: McpResponse) { "checked_count", "pass_count", "fail_count", "floating_count", "high_priority_floating_count", "low_priority_floating_count", "below_ground_count", "part_count", "object_count", "deleted_count", - "softened_count", "missing_targets", "warnings", "errors", + "softened_count", "missing_targets", "warnings", "errors", "camera", ] for (const key of keys) { if (key in result) summary[key] = result[key] } + if (Array.isArray(result.relations)) { + summary.failed_relations = result.relations.filter((relation) => relation && typeof relation === "object" && relation.passed === false).slice(0, 16) + } + for (const key of ["high_priority_floating_objects", "below_ground_objects"]) { + if (Array.isArray(result[key])) summary[key] = result[key].slice(0, 16) + } return summary } @@ -380,6 +402,8 @@ function workflowReady(results: Array<{ name: string; response: McpResponse }>) if ("ready" in result && result.ready === false) return false if ("high_priority_floating_count" in result && Number(result.high_priority_floating_count) > 0) return false if ("below_ground_count" in result && Number(result.below_ground_count) > 0) return false + if ("fail_count" in result && Number(result.fail_count) > 0) return false + if ("camera" in result && result.camera && typeof result.camera === "object" && "active" in result.camera && result.camera.active === false) return false return true }) } diff --git a/package-lock.json b/package-lock.json index be73f3a..02a003a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "vipermesh-blender-mcp", - "version": "1.2.0", + "version": "1.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "vipermesh-blender-mcp", - "version": "1.2.0", + "version": "1.3.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/sdk": "^1.29.0", + "@modelcontextprotocol/sdk": "^1.32.1", "zod": "^3.23.8" }, "bin": { @@ -519,12 +519,12 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.32.1.tgz", + "integrity": "sha512-2DdE+SJDtzLEEWzY1ZjY7Q+VcPhcV1KisD3zI4u0XZyktsjHum1mwbMI+JaulUBi2OZk+KJAi2uPXzxichPkdw==", "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.9", + "@hono/node-server": "^1.19.9 || ^2.0.5", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -1440,9 +1440,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", "funding": [ { "type": "github", @@ -1622,9 +1622,9 @@ } }, "node_modules/hono": { - "version": "4.12.32", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.32.tgz", - "integrity": "sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg==", + "version": "4.13.13", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.13.tgz", + "integrity": "sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==", "license": "MIT", "peer": true, "engines": { @@ -1674,9 +1674,9 @@ "license": "ISC" }, "node_modules/ip-address": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.3.1.tgz", - "integrity": "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==", + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.3.tgz", + "integrity": "sha512-A1kdq/tSb5QjvKvAMgIoEvDBIgL7qaqVP/jkvSwYYRZ9iEzvPpopxp2wQfu3SuZRHtpHNxMn8Fs0bS+gf5Xmwg==", "license": "MIT", "engines": { "node": ">= 12" @@ -2046,9 +2046,9 @@ } }, "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -2056,12 +2056,16 @@ }, "engines": { "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", + "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", "license": "BSD-3-Clause", "dependencies": { "es-define-property": "^1.0.1", diff --git a/package.json b/package.json index b236a5a..3961191 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "vipermesh-blender-mcp", - "version": "1.2.0", + "version": "1.3.0", "description": "Persistent Model Context Protocol server and deterministic Blender addon for AI agents", "license": "MIT", "private": false, "type": "module", "author": "ViperMesh contributors", - "homepage": "https://github.com/Ker102/vipermesh-blender#readme", + "homepage": "https://ker102.github.io/vipermesh-blender/", "repository": { "type": "git", "url": "git+https://github.com/Ker102/vipermesh-blender.git" @@ -37,7 +37,7 @@ "prepublishOnly": "npm run check" }, "dependencies": { - "@modelcontextprotocol/sdk": "^1.29.0", + "@modelcontextprotocol/sdk": "^1.32.1", "zod": "^3.23.8" }, "devDependencies": { diff --git a/scripts/validate-package.mjs b/scripts/validate-package.mjs index cac3c32..7a7f315 100644 --- a/scripts/validate-package.mjs +++ b/scripts/validate-package.mjs @@ -9,11 +9,9 @@ assert.ok(fs.existsSync(cliPath), `Missing built CLI: ${cliPath}`) const cli = fs.readFileSync(cliPath, "utf8") assert.ok(cli.startsWith("#!/usr/bin/env node"), "Built CLI must retain its Node shebang") assert.ok(fs.existsSync("skills/using-vipermesh-blender/SKILL.md")) -assert.ok( - fs.existsSync( - "skills/using-vipermesh-blender/references/spatial-validation.md" - ) -) +for (const reference of ["scene-operations", "spatial-validation", "visual-presentation", "geometry-materials-assets", "character-animation-export"]) { + assert.ok(fs.existsSync(`skills/using-vipermesh-blender/references/${reference}.md`), `Missing shipped reference: ${reference}`) +} assert.ok(!fs.existsSync("data/tool-guides")) assert.ok(fs.existsSync("addon/vipermesh-addon.py")) assert.ok(fs.existsSync("NOTICE.md")) diff --git a/site/asset-preview.png b/site/asset-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..27d80934ca9fa3659d5494fa415d787063678b8f GIT binary patch literal 487014 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%0AT%v^_=GIlk;453$|S5eF;@D71^X( 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

O- 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

OW*x3zH;T0t5vyc>fQ$*eRAQs6Hm4_Hz}oF z7-Uhjwz}wX7021?^6HVJ$NumS|KL}@|GoeAzxfwaw{QIX-FN=uU;Rk%;I-GjdgRCx zX_9yO!y}`E0|RNAc3Uk**%OcLJo5NIx_0BvFF!gzeScmsuTrTiMWxJK+XcDMqA$&8cc!D8!a|UOyZz!lwzIU26XFI_pXI2{TN zus?`>5x19tNgAPB3k17OkzzN)?OiF8!2Q4rgNm`XK%5us^tml?4CPn3eyyN1Im%11 zuu}|2?WEaudjvN9h-;iNF~N;jS~pv*yyi5h5kXfm?ZsKYI) z0;r^wU?K?ouu`#RCT5`k-m`J1k=C`>eFOsYest0kofdjLm6E|^T!)>dQZj)}Lv^{p>`>5SH@*=pIjm)1Ho?tW9# zQ}^%Bjf@OWPVUrs8=BgO(L!=eyUjau928m`+2_tIXWKn1SRsRUQc=V~3^1g_pdw{9 zb?@%#+REtYaDU%GCNm}7@jw9@TQM<*eZVZ&)U}kMC?$h8#Ykxl14mZIv(6y1B+Jq? zNwO?Xvm{F6I7)imJX1$Wnx^^%h##RoMnO;REJ-}=qpN|KalU9DCwT)0FT_rr>rH|9w| zaG{8vzBjeiSby%siJiN5U%zqV;o?%I9&#a+MED(a=a^k+460$&>CVm04)*t*d-dGj zeS3P{ZYHG>w~<7tAP6(98jZ$4z5jy`-yIqm{_w+3u3x)(=G>XRd-j_0gDa_cp2axD zZ@>Na-@N_fmDP2^ye!G6mIn^)KYQlv(IZcE zd)+um2M31+2L@~@MJcJ&>Qd^Px9)!U!ACQ5^Na`8T8$EwNvUNJe#J9> z;Z!5qOfA=%DV->3RU}cl6CAkQe4G?KMVEUOEtoYRwxtmlppGbG;YP-Ix83RXdij%6 z%DC8R6f;)00jXGC_CRO>s;@5cx7(t!+%ijwGO)O&)bl+9XnA=oRm8B^s5F)lCN+*Pz-B1VQv6Zw#o2_Oe48yN{^|fz&?X|&yfsIBZ&osg#lzN^Bg7CqE2Y2t? ztyk;&59}9$cRC$Q)z-kHETIw9Nh#;;0x8SS5$ebq$T=_>%$z?dGe(H#`AbVnQ&Usb zusX4Q!i>N&f*g11HWi$fv_`)qf@^57%jv{w2p}sOx7A3Q;Ll8GQ8rUrg#ZTW+m8Fn`Ew9|Tev1mv0LzNN6J<(u4%dqtyUL}9^PP6**=J8Y^Yrn+_v0*v zE>9}c+>52<<<*rn-{V&m3Q?LM||`>yTdtxk7oxpDsb z%)Z0N{^URY+4%T4r}Wa*n}fr{LxcUhcTNuV4_v=_ePwMej^n+%c75rUSDrZXM5ohE z({yZXqOY%>#8DJSMA2Hku86vOZ~DXcKc1etPXy2ZL}`_!`EBQ>*4D~Z>*gs@6q)N< zYvFr==jCbGWMPK7$R=lN?#4jy&@q@DV<%=yKHG_!w93r=C6)vN0JUA0v|-CUl;%+6 zuNB2{yWL^Tna(+?24UQcGqrp~iWW*s<^1}}8!;Lc=QMN>8r0%Uf25S+l=;3etHYi$ zLanfZU^g}kCN7S$${~rk1ce(4*u*&iQ=vQwQXX_cOEX8O)9LhjJ)@`LGD(RDU5qO+ zmoZHxbsEFC41$4C2^7_Y18vXwNml@K;vLL@9!PojX=nDxUZ?KwNpr@$eSmaku(%Q8i$<( z7N#^aaSzov+{n(Qajl(Wp3SustR=Ktb0@e-0K+qd&#OkRD{~jWsG67&&F)6MD2{yJ zt5s`?Dw!!a3BhEpfnf%tVh!_C>R@n+JMoru#vIoWBxRk~EKHHyqX4_pr6Cr;1PV6x zG|`#xSf|~MqWJk!r@r^S@9v!3*=jXcSJ$}k?DV-7R$A@mC!c)UX?Ko1et2kjIF6FI z7gKJ}h?VV&4W|D@ErYPfBxzVE3097eVqac_dwal_wt(KakuhK9Gw|ZBJ*&Wv9)c(t-!ot=W0om zA5;bB3p4kZmmVHEeDL)*-sE}vE1Ad}UMq-0v`VuqP2z4hYIobcZq#ly+j)L&H(SkK zuiI|5JDqN~*X>2UB#E;$lTtCtJubNCF>ZoFo*%i8D$JcIN^#lI3ufL|1`sCBk+TC7QttqWDg+vhZfvv?nqqJHL+pXr!>FHgQli&E> z*T=_4vrHO$N^ZvoK{eRg+PZV^PNh;k@$9oc=hM?uqZ8ZS{rS6Fjn-Sg@okTZNGCRe zN}`w++!MZW>M;nOP*lq_W5yNHgi=WfOS8-i_|C!VtvgenefZ1Y{qKJ3UtYhvdj8^p z(cs|D{=EZaqST(F9an@`#IOB&8?0x*; zfvKtc@4WZ^&D(cG5Z0U4CAy~Cq;hZ}PEC6)W`HO(E zG==pBkaslyGb=5|Fs01ca3G(Z-!e-Z$uFVMRt?;Yi3u$B*ie%nNHf@$8=I@1@Q3;b z(=0=+R0Bi0#o1D}#v;{KqM+1fZIP+jiL@fsk=dp7J-=3~nJ!S;=d7@rDfqk)>I*?% z35)TBJVMSzu>eTF9Vtirj4dfkrH~k;`3=_=jy_iuFRdX z@!iRF*ow$P&=!>>rA+@wk3h=BO+o%CRVU!Sp8GFVoSdB4w#}xZO10wqzWK?<&|O+uy>g^+2xEkrR#H3FFW?{|Fpa_q1j+tx za=@TJuo`AozE(5v&B5?kG?EQwx!{muRR z_q98nTCFyFe{OYoeRO~JeS$5~{-6V+*9X>cbI1+f_pa1!vYDzX58}Iz$ z{UGqqoju2?2&)w@46KH>&SW?0sr+CV`BLAj)oOk9dXl9ouL2mO(hkuxDTVMKY_=CD zJAUfP}hjtv?wg2dQ@4tWh=FN$TiNE~oA1S4ueB$W#9TSYu z+qdt`%+3+5UwrY!(=WX^IM_cuHFNpOwW*nzm8GRPiuUZ=d-m*?_U_r;ZZ);iW8>SZ zwQ3S)GK&c%)oP6~es5~}=kLCI>)vz_)cWc*DKlxrq76K+sM4U1p^K(2&nzmdnnQ>| z0-Oqqy-J8&%$-IIJjBV>N(<q)%;)rf1Z}2Kf=NVw-(mY?DaGRdWPP|+KD{b z8Ae|1)oayCrJ`hJKTsY$?GTjdl2;oc|8O8+doC;*;D8l*lb{G_QHj|2YKB|7)!MT4 z8__sBW(r+u3mzB!hj=@2QdZ7*#`eexpmTU>?J5BK$JT+lzpu|THZpd=!hn6|K9Vk` z4X(Gh1sHaH3dKY~Y7%vNsJk|#v{`JP*fh=Btrm5T6G%t2qSlR#^=h^H&2PT($}4A- zR$Glmo~lis=m$RKY<7BPc6PSj*FU*qCu1y562m^B#^PK7c7lf5Anv9O)k;vtxk=@Fv9Yeo-**srW~LriD`BnL z=LbRHdwvl3eh_$q2`e#R7{Ny2Uls{kVZrSbUx;m2wF9j20Z>4Pvh!@JR7RBct3kKd zow_sS3vu%K=lAa0m&8$$q^7#C$AA}Wqj17az(TP;QgE#_3WM2QYm=e{WXs6o={OXmfSGnhJZf@SYefP&(!=(rN z_wL=hcc0yl{P^Qfu3Wxy=&{HC=5POIYHH^9{;S_Rbl~9iYd4mcm%T6ugP`4PD=jOv z>hREDU#;HP->)*cu(+7SabJIbtyWirCRsvI`m3*ATi@LL?85oS4sL(u@m(s~iXz!J zx@T~F-~7_rU;V{j-@Se7%{Sk;dgbazpM0FD?DUH-eC?}WA0HoYH=8r__pe^PdgI3R zG)+#PIC1Xmxsj2P*}1vPmoDAAJ2g8y*XpznA3k*U+?hiM4|UsZnX2*a+v@dd6!p?1 zrIb`EA@lf++xOo6#fMWfGhwA#uhsLjk{?A&0Y&anQTkFPvs$g{`@U2e0=`hlQR1>S zM}8`$)@ljVUaY{dGTG1SGoyu`&5F$7Uq-RT0Cq}K&RNupTAjAA=(gaUUa!+`9zXWf z>#x5)IXRhW{cr!*e|z)Bt&!0&>)GJUx*@S+vjgyW{;qKU6q&3Aqt%Tb%^&yI>&$fg zxEl{VU;7=5P+6o?v?44v*zZ84~q z*gvq$2#9H^&2xgH%xTP^3N$hvH8Hzk78~ua*SY7HNn9uyNsyoAXgC_nCFngtc+?eV zNS-HFP9iT#?d%x{v8KeMjMFIU(wAO3-RZQEkV5e8Xjs4p4Q!3HO$KaZ?NYpUdqw4; ze=(-UQ((V~F>79=1?PU?`+i_muBbv8YSdgP^}eM9h<%Nni5k9uxjBaF17GKg5}Tya z9vFDnQZ-vGq;ES+sOXDOn5)1u=%Wok7IdiIMToOnEI5|7oj!|tgda|x^-L2Z1++D+bE@iSmQbE37>nc*=Wwr&UB;R*ywnDU_hpl8!M&hd$)-09^St* z5VYHi#eZ{)&R@9j+G}4MpBQ`lZ-2aV$7Fy1z{el|l5zIj$&+W# zoZY{7U!%1(eed3-OBZk6xS6H;xs%VFIdf)gY;1OB_R_^mw{G8_otc$N9zOEem(QNt zvu97M)8>?okB|Nl6U`ugGBMV5(~>ALbTDZGXy`(}AWq^|cD<)-;H~bDO^n z#(QzE)9!H2q*7a3jq!=G*T3<#r;i_t)41K~1iml4@L&DU|I5OIhl3--GRd4rFM5Y# zw`Xb}ra;%BY=308t}%O91WqxnYgNORwOcn$+*fsKsEUF#8lNUhrok1t4S<7&XYuDk&?~ zYQ+y3H_T@=Vvpm8s_mVcI`*`!=8?W3I!uKbaMaatuy1gFOcAMAVDTVv5`_?d*nJonmQ} zcFwPqYBgK-ZGgWuPV2}MN8ftuTaO<;+-PicyB*2}kwoiMc$FlLXJ+oLuWgKu zO^ghWBylX2WY%dE*7J1<;78;f5U|oZ7kvbX!uC)pNj)#W3XQF;&Gq$KwLUO7m`S?^ zO|txu(EJJsk@s{$_`X-kn_XY{d5X5fDkZZl&Eh2KMcr1b)9$w0?ff5IQ$?p~ViY0r zR}@V6q3`)#C9Kq{CQ}EY?+3yN^8?2fyJf92l^IeBBcAUsJ$yKKe}3PdJ*Q5cs?;j& zX45GASw&5=Nkt2eA+$Wu5m;L#D6Z`M)k<+Yoh)Ye2C4I9285$t3w!OxXPVVTbJxx*SFf!styXIxrCdoxaC6g$!l9s?&zUBR4<4+o ztsOgl^egAiR4Vmuw`*4qG*h)|jZrc^J-xoxc;e_2liMe|old5*AP7G{|2gGsa@UTV zH?IAMKmLC^-OdmH+3%b@@!a~x#`^ju=d7>4uiNXaF0ZVtt`80lj|>lS&olcoj4&1W zq38K4tE=~C@5gDpWBZOYiDvFx8|e!swhe@p>g1k-10xgb>sxd44?g_h2^}>bo zTI!Q0pMUA}i^C&>%Zp2wE?vET^ZNYaJk#{Z<+D!X4F=6%;H!^6Oov%+2$n6Mz-_}$*8bxRFcL~-u1RAqi4>ZIeX^iz!R;lrly)R zk|rq=p67@E=HL9grRC+IQbD4X29gidnW|_>5Dir5jb^;AG3NUrqj_%1Kd@CT!IqyEj$^=VL;D6t z#5GdX%&~}yH%$scPBA@qihFtBJ^k{_?N%FLPi7$%qd7=Ao171Ui`_u)MBtbVy1_Jt;TGI6Y9>O>s;8 zbDncst(FxrD;*aCbSq4@gc7&bRS`xE*!SCAWo_ z@B{;B#UxJ1T5u)+R#A46Qy|a^akGNX zl3yeaG#eYU!_W^1oxSzh!pz-;<>sCzpKbS&R;yzSKqKGtv{J{9J=JP;uU^0Id7dYN zOlL${Z3bwl8Kqg?KQUj3jmF0P`PpsTww*h7ZttGm-F7R>6k|eb83bWa@mH2s=H})m zCMF(#{4gb~)9VRN!!Y>hqfaT}`}Xha8>oHy=_en5^vN5qe{+0nY-MF7lXB1QJz?n2 z-JkD8-FmIYn76R7u(h={J~3Xa_j4+&BdCOiUc`hD{R0D8mVNr^`L}=avu-aM z7#J{X<3`Gu5pMbFsP1I&to#h~JWNAu!}P+@OpYodT{}b>&xoWHjdR^vp?Nd}jzmxz zNx*9{8u&qDb8}^7>DW_8Uw{2qwr$_u+-fM9nr@FsnTA0ns8(-Wzx^kF@~7=?C#VEy zMhB^oV}lCoKOk^S$_97_?p9nGLcIZ~e2*jK%&d+TH&L4bkJVh6LaoVMCXL-15|oIO zHY~Tr#O3H>k_o!U#>cSJ?(}+H&V|yB0fS^pM~HDr$pY7);%?O}oaO;Tgo`2Zlmf%o zh>n!jIH~Uo?uq=4S-zJxd=`)M0>pECSJY~B15V4eaZqo;{=t9MDD;Kq$qqMWjP*KQ zdirHE16DW&!|X}jW|@8@*%f1DqN!w>Dc1<&EYczT3J5pa_y$AQizYJU@4aW}q4KX3 z!Z3yu%+OJs0L7myL{KWGD3wlD7df!Sl$wG&lr~}`b`Ka9v$7OBrcwHGJW{`sG)@{`GHE!|G;ZQz=CmwdNka=e3&cnVG3HlOrRe zLU4mQn~i-tHDzfM+g&Lkd@ek*bDN(La~$v@Gpq1OG^d<<{q;VX^gP)c9qG@M z$|Q?3nPj>br@g$nh&!FA-R(uaZm-wtb-P)T7<^h~S=#AzPn~-Hx#vzsy;Bh*G?Gg$yE&on)DrCCFdKpk5I@17Y4ewm673* z(UGzI>}8ofyPhvN6Ycial}qQhjgLS3?1^3?-+BLopBq|rrB>_py5l3m&pvZ}bZp`m zzj&w9YBA1k-Mx9};Gs9Z`TEmOKka#9ZGCnA{(}pbE?&BDF-y|tUpV#ZxmUOE+_ApC ze&^1et5>gGxqL+_dFr`Sr@!>_$k_1x`}Z$iys|hy-)^@y8k?h|Bfs%$KN#$>1D<7)WuUNlYp2G7S*|dLBkuyW5U>wga}T zAFBD*?{Oh4B5iQXH+8wYu4HVv`L zN&qXQb>f__lvA#BG!Rf1vGx+Qv_1-yp!|9>+U@q}OQ&Dzv^%a(W`$!FaV3V`>V+}4 zQwezFV<}e~*hp*&pp0t5IL|*P7f!zsBeL6|E-DDi@;8K9qiuv~+O~{JxjDa^DU*T{ zfs#?IG~P%0fzi6PgaSpHt)?P>&)XGcI7$qGQj&4&Wp;jnWPIX?)TR$KZ_mpM4G*NC zaL`-g;Gs;0ElmgvXlUM#*$ER)PXHt+ZOXVd%Yp0A*q2x8oYHsxaX8P9*UIur5=SSW zKl#>MZ|>N!W2@1O)P_Y&%g5Qo&%FZNvb8UCA=bOphcMR zkTPHMfaU-7GAa_y(=?0YUJ~b7xxa5pbf#-ljOGAX=(5?!rU<0$^=Pk*-mz(FtY1Y?;@<2c>i z*qj(2-Mwd@?~61^GzzY1qJ{6Jak{W@KTmQaqqV;J)<$D)cCJ#bkBp3PA+jv9AeZlZ zK_Hfv9&W5{+_`)AqfbBEf8ap38?8QEON{Wzum9SwEiWy8`0+1)@SX4V_xGQ_@cD)F z=U3O(4?lM3wXeN){HbHY_ck{+r>AGmpFe-`!bPRk^DjJi=1b=$cTTRYZ_G^JzjXQ1 zts6I`OrARSsv~$Pg?Ck6>fBDhY*4ER{96$B!@$F;7_vaUX^!Cq=J$>TY6VIek zT&+}?CmPM>?DX8`=GLv-w+Z35@7@W*ps%lwQ?9a1gM@&UlEooQ9?B)N6D5u+8m8uC z3ZM>&15l3SWX(W8&n#-@cTrGCiv|(ogwsx|BN+SQ3(vpurI)-wG&i?w_R6%BX;!P( zl;-ce^TAL5_NR+WOOv~H`M#HC5of*$fl9LyN3`H`Yp@4J3Z!dtgo#;35X=CQL~%_@ zOf-no_PdNbjxc5?DBrE9nR|l^1SV@zZas*jrD~)-7Y!tGwHWJkx>3|K5>zPfXv2p> zeO~Ig%a2S3F)d@dx3Yey;e`OF8PA!YWqebG-M7{ysoo-&5RfCWKqf2a@}ik?M0qEE z^e6<6bXtX+E<#X`(FBxk)B_f@vq+-F_7j)~Fx=&4#r~IT#VNLl+W7<%#_VDVjSWK*bmX$$7ZgLviPVfr=*93j|5wcD~}b+wHaWjW7tt zM#s3|NfHAh1+|;47|j-LUSu)!>c}5}Bu+NgH$B0m)}HUx>NPL$l~!4jGQxwvGowds z?UR`hmB3$`pSgGG{YkO)>eD+W>O{tE!nn@k1hw|2nled+q(YIfqy3hci0b+m?r`cY)KgQb!x7CM6NBO|yg{h@$Q!A5u5B1{M4i}}$6Y%Yuw>rIUrLRUZ!&@+~ zC+wLt@yX|6v$3(Xw0QXN z991e65e70-anx;WY%MJ>Rch6-(TOa}+Gc0DuU_B1YiFfWjgwf)v>4vN@>rg1M98CF z@4@_oD2hhMCw5Lw-n@BpadDAoHaa%u`$3u}mT?hQL(W*U*}i!3!rI2#i4!O5mDhiXO}Kq;7mOG+%vDda%RW2$&Jm%)b#Y7+qY)trZzS<4;?u0>Z@m& zp!;@BK7L@&{Os&|?|pdj>dn=y_Tj@ve&=`oiBxiRZGCQbZfR*nQ8GR@zA!ic#L@qc ztp5s`g6|4J?3VjMd<;JDpY0Oy!U+H z_xpb4u$4*u=A&P2Z*I4`ZYGn}I5yBLCW+w`lVjSgk9zwh~oLZQ}`X?sAe zPnDJgfy8SB$P^!{GC{G%{oDAiQ!Vv+zJnlH>Opk?QISx9bWImoEJ?*rjI9(%L>^cs-$RTJRGm6wsll6F9@N2j;Q=Dw|E)^Y3xnIPGD2m@>{4Rx? zmjHYFu73~P=yOZzGxd~asuFw9IGMEvtV@|5fUuW0kqDtt4}@nj0aWH62%Z3RO8cEx8iE_(+R)Cv{)LT*G4BZIB zaBF*uQ7|+-oKB}g-zS9hZcb@4l_(U%hspWENCh+_q+>lIVG#PB=aVS@K-0N&E}P*( z(*TO3at70>bf;avf9+FHef;{-kz>o}cumxBt35UOcN!^4sffVxZrlL8g zmac=)ZS5?Z&dzitJ-%ny!)Zq=;oR_tAOFs_GpTeYi~=cS;@Hj2n>SLaG{9IKbK({e z);)kR+qSkgH{5RbTYvEFefwry*YW)TYdWRztF;VcZGCNi;mOco<Gh5EJGX9|rZGHN z0SMi^_0^TjR|)k=7@a+P?)5ibpPHI-U3YDD?f!!YSFT>&*jPWXfB!pgzw_*~M-WDh zdVP6$`Pz*eH*em844gfC_QJ)N$^(^Fr&Zh8ym9jug5aGu-#9Qc>9!kJFJHcT^LDM- zjR=_Dci?;9{T@W%{=NH+R!i6PbSguT$Uz008ynyF#(TDHEU&J7_S-KO=9h7NS|YWP zlc*w6a!5JqPzEqSx{i?!)${{V!qSl_ngAu`F~fOMjPo=J3A^3S=*Y-hZ@zKp-~rEf zJ=YT!#)Lmr*=(lX==|iTzr1wimT6eES~Zoi3dLL$gc$NXHK~&1d=X_Y55=BFwgmjQ z^WPsgkr*INP=TeJ7L{R;;-RE~skBbT-rY;$?=X4|Co>eQ1vGXWDWiaTPmR*^=pf%BKiUZvEz2(OD|pMa0ptx zv8NE|p7(X)fRzLZsr|dEl$?{MacB#UZHS z`06ofJFaZp)KBb9ehE_v^fEINAVfHVwOTC(;)YSJdO^S0x=QHdxnzA+w}(GSaG%Cg zudeHcp2*kLB1iZTKee||ZbV5wMlw?hYgNh;t`=`FF~*8GuV!B*Ba>qzph?J;kVFgk z+R!xDbGzN{i!Z+L?QeZ6m&>+V9YRFI$T%!vb~>H)wKdQ8$3{n&SC+3`yR2g^pU;)c zm2zb;m(7WQZJ@eK&~rWEbu#H}#oAs)g~t6M7TfK(xkec6?(Vc2&4Gb|@<4^#Ed|n? zrZ3$|*g(s`d;nRJA0jRr?_WiVfe0xQ!UoDzL<_G(mYu?sF5J7i_2|l}>C8*d45w%_ z^jbWW5UTuy%fG1e<;Z<~hJZv_uRRB^A(dPPcSX(+Ul07gz#`JU- z=UlxM;%uw!eEH=U`wtxST#reUYNBDSTCXn5&t%c=o|d7cT4> z8|AEbI=3*ty1c4udcKs?uo)790E`$l45OScT)lqf_RU*Ij~)Hb|K-1)IC1L2i|2p& zi=W@UcOM~m_UzeLUww6QV$$=ywbk`|_wQf6a%p>O`_O^IufO@);ls~hjO&fY^3uxn zYu9evxC%Ax%<0qT&Yuf>cVuw*@Zp1DxAWlM?N2}d?dsZg$Y8Nlx%l$M$%*kNODm0L zqg))YQ+BJ}A`#&qA~FnPWo0RCS>qF9o7+3(%Fwkd*B9m%isdp7IhJHdNiu{~G+xrc zNoLG&8&APOPVhW&Z!o6Tzli(cQQa^R1D#Ggowi?o<-)mhXAr=SBfN4UCGljGwo?eg z&wuy(pZ@$q$7O|LX<>dgpHB}C4+c>HWojuzfGE-`e?TZneEo$3Bx9lAoM>D{$E42; zQ-on@cFPN}SXd+8JW|2%X41hLO0p{VP@t3Lgl)qORbcmqYC@(BohrKE)~Lo1t|-xB&UgML>(_Kz!y864v$rW zkoC5eifjx82}+cFsPcFF%RKL@07gjTrm0HSm2Aq@>N`R1pCT2D+mgbb#`@{OIO%bC zdxhgNjG#=`22e)$!yc(Yj*5M5kqKHYu-I7dVY17vaM=R_Zs>MaWpSDz#69};p zHyRp5eXM0k1?uBCCgE5;y<76b6>I?&`L|EpB!3v<^d3biNH9*hji&O>Ln@|H(-9$2 zye@+yHNSaz1`Jnn2vY%&Q0RKJe%6nLn5J!8=KA8}CtrOrne|^gJ~En$f^Ln)lOLvX zNL15weEVuXFxsHd)c3Tk(Jo5IH?I^Asn`?>bPI@*SLM z>jN%GM>MXZU){Xbb-U$C#Si@Wjw6ULVi?-&+~Y>Ql}=~l7XhW0D1$haGAJd>PnN2+ z-9P^R_m3Sr-syI@n=Z5M6ae)8gZqto~l1pb?EyzV+(tl?BT<$J->((>Z+l7`Jvv7qTDp%EcbA)C8*{~lxX^5x5q zAJ4t}_S+Xwchk3awP^ZA7(FJkFz{?v1)o_+S& z&5iY1qmj=QHA7!rUTim;qkHyPsSFi6H_9{}FFsiq93J8wWNmhK!RffEOd2s|{?2+_ z7m@5tAyH5uR8h-3R~2Cl5J})fni%TE%{xZ0-D+ZpUO0dDrI%mKX4BoS!#xrZ<)f-; zTDG0OcmLs!e*Ck=#r0fih%vY@_pmZl9;gh4VW3uq6bi;Yq)bv*h4~EPyI3lGA`ll2 zNEAGIKNva9T5kOI<%7^Evf5>OH+u@TPm}ko+4EpgeX~@B_)8tBuZ9_ zCS5n4fyLe@;rb|Fp`P@y-yWJJABVzt1=vgZbQm`q8b)fLEaAjtH4gix!sP7lvk3co zwGysoL;~S_6@{S6LllP1i9Ct*0DrZ=1U=0SKi+v5!-bbFb~_#EXWcUxk*jGW1!@5H zq4zyFn_EC(#04RmE||tZCb204Gc`cUV^$_f$qyMp!JJRNL0(GOcJ@q03#c0$ZhmUv)Qmr^Ww`d zoqzrX8nJq#E(ZL#Hfy?NTFXmI%gZY>Gc)7kV-SLRy&<#mQGDo73W6}ybrVn)k*H5Q z1LW+@dhm}V6F{U`b&`W%7-r!6>l^C`fw9qXJ7ovHCnLaPgM zEq%1E@9CmK2r(ask)l#k;jR!53qkyUT>7c;hKK3~Htf`m8#lrr+&jH5623x|`!_%Y zqLA@qBgUeL@H!6>R}`}-3?jx%4KugnS63=laCC2Fc&OY3*#;_haVDgiNFLR7{j<+M zuM7@qnobCTFdn73PcXZC?=GWQ(=C0EHfByLwfTx2vPA8Yo?b~-?a(W`2vIEa| z92a6VH8C+VJW5F9djSxrn>1D6@-RvbO{WO1ZLBXZuEwp2VKK%c5^B0;TlS})e)`&L zuRQzgLDzA`hSN@^0zX(@Tv}XS##k@p3)yUDYjbO1VUAGpqaXeF-FMzSfA0CuzxaI5 z*w~2^Cm3KiZr=LrFfJ9+Z8S6-doH{*N$#^%QT`}eP1y}rAJ3*xyjp3C*!YR&h&(LJMgZr?=^SL@Aot63@*)pkZi5+bpS!4fQk z35#EyM~opX6fJ#^Z2T)UU2`4Bb-T|TI`Gz8Z;$U8aokQsh=zDRETg)nrPJB$_X)BNM}=fq^h2Dq&WnM^Mi5qtc?6Ps1D(2LN-{6qYXz3&9Ql zvdA*0^0m^wSO@+GLS=9+=bI^ieZet|B$FD*_yh-7O47{*vdk5^dOQv4{D@cnff8r$Sw|&~ zPN4S}GBn|9nr2y& zuLaTrSMqJ3G?{|QVq5+u9wCf%U96_%616uML1h+^fX?zt_pB0?50H@hQ0b(qb}9;z zR})x|7Aq-X8h0KBNfo6M5myFeB9%oV6_S^L;}fXWY>Amo;`rP!Ony2n5w$6ix$^YK zNE(Q6We(uc87lZT0R(zhViHJ4eR;h}-Ichv$bA;t;DmGyl{`&$Ig%)VFi#*Ak&%oh zj6d$*j$Oy`g6@gq$6kN^&2qWiYBYt#5fw(f5IC+I_+c0XjaI$cXw_32W|XHaQvWh+X+M^@lGYGA&~-%HH{HktL{3kQy!?4%cU@g zqA-LQ35GJ26;9c5%Lvzk0di5MWlYw!u?{Zy&>%dO0kMQVC9lT{reT_zVOcikxgZh+ z_01L2UEeok>>VHVai$)n9GL48Za>TqBE!JDwd&nF_a`T(yfBb722MM5yYAh4_p`ZN z6vb~I>CiOHo$amJ$B#xvhrjXOd(Rv`9FoZQeI4U;Hdk*nAKbgA>*(Zjr*pY%x7`sL zP!Wj?)7;(O{hPo2&xPUuM66z`d!FZq0fum3aA17Tp2>;HOfKWQUZYvhXLB?AW-5b~ zFbI6lM+l2ZU4B8#dZWJZWU7V?u+i{UD z_Y1nFr)iF{hw=_ z)uYc}FfutRA{8jJEOU15k*1lHh@de1_|a@Omn9_e%wUQAAumYM#E!EjFoIMurNs@* zyIheD&h_fmo$b+~$~*79efXJY!Z7e0H~w25xr8*FN#{J@|INq0{qWbH`w_@y3hhoe ziXULNGE}lsb`V7nXwvmSWQxlEmPl=Gd}tB?kf9k63z;J2UeHYBZwmqpmnkLA22x5% z6`L2y{8lkl6ClEdMG7r<(PhaXD~CzB?L=|E1vRYkWg%62Vd*zX)o85FOc`K<5b8Qz z-}N~>&R-1oKvvvXc}OIDR5frV!WC%>qHz%@L|9k}NEa%W5aR$v%3DK8NR;Wn9LAxV zp%RE%X20|~RI33izBoujl735N)t0p9K1y>ROe#sUd;;#mmtJ|P+v>>uxdH`MGY9%- z4#`R5@$sCT9gp|I>OoQ6pqf_{{z`k$dh)`P$bw#MVvqKeFgp^GA?&?;1sDi~L6|de zwJiocx0gQTppUt$KIph5YPH%_5-DV6NAgDdSZxXy=5K@(oONk<#+1lFzBkw#-W8h* z^!zK;?W}lW3GUGsDA~ImdOq&32dgBMFm9#{CGCde&KP6Ibqj_3+i$-$JvHGtZal?e zU36`RVNyziATmrNWn1wh!PNv^$E`Q2>uZ}^+na$GXu4j^=LagKLa}IBHUJ>x>9;}@ zE4&@zr6x$399o@L<2@#EP_WiVn9)(jGo z-Fl5tl1pciu2D)b7dY^GtQneaS|$m)dy46OWBJiyYG!)O%oaM4;Q-5Lb_9i`S9~%u z!qRE`-rf7PT61V*#1DPBw`RyP^tJVk)wQ)$CQU+W*k-rgnte29=-TUVyz>0{vxETG z>0*pBnS2yQ4<9|M*XzfRADNt->N;*1_`>%aP)Z_VSk{kz_>+3G4FKHQ+Sofa{oLu( z*REb$TznD{f-uTvGLw@NQyHWeI|M_3#^La`G85YG4d|fvz+Xfi@zkmC;`Alwh zZuU1HfBg2_@4Wfuo7|0DGYvh8!rQlRuPm?Z+rR(#v136P-2Ce1)yr4r<`%N)^mC`5 zd;a_j>9kd=)-((c9oml}>$E#pu3Wu-{ifpvnufEv-05>?C#UwVt*+K2^Qm_DxpM)L7NNSXx7&^7rPYav3CD8))~;W< zRw@?dlp`6PjIT=)CkV0MMNsW!sGL|hX3swY!!Z58Z`7*qzVp`WufGZ*4~Bv9EFoAC zxl9%zeC_J3pMUu4ooXYOE4y9V=yY?rtOf(iLWUVvUw}0kb11iOvcHX=51zD$Ak+*^ zLt1=ZGr|SIf?!JlB`P78!9JTPekc(Y8P3N$CS9hul>-62#j4uI%7I8ZMFaUK@cUyK`MLdDPsdjcBi$br?{=9Cc1SvJerIjtr&lNo5$sb%3MsxEFK5Z!YPNA?=wMp_0MdX?3Zzj%Lz=O}#SO zSL_*;Ryc-X2uBDY1>=AzGcdtch}$|jY=OQ^;2!u7lO8#7IZZ@Z$xxh_jL}~1sQA_d zq!&{Wmd2J$)AVMmRVtMJ$N%YH6bt!wr%ecnqL5L5bxcXrYBp=Ny6^e9TrQu_&8Movu_WgOy6LSU^}OQ5cbs5F$u}NKBScE*T&f zvj;)2yIVyVjSP?I8sf-p;zurMqm;uFGNM3?q;k^%lo5g0!Xlu|E@9keGm!YE3R+?& zlXW|d2UkAPJ1cLT8ap(kMV%cM1qk9^JI(F#_|?*UV0BQrZHzXw!M2tUfq@h^AU=zD z-zJtBjdmSSlrI#42;-(i({D<7GLp7IKKC`H>$>P~gJbyO|fZ3;TuZy%%@hiSR;#(Yy;B*ioId>=L}=;B^5)h?7)7RKG6176!Z1E* zx3+h_x^t)5YNs=K2AP5J_U7jIzWc3Hr;fXxgOSE-FcWF#=}flXYJU3ZXO?FE-QWKm zq4Zz>>;J{FY|r(AFeD^I2%DzmIPRT0w>Q?;4<6co^5jWM=$Bt!y?Nv2-25Zk(*OV8 z|Ng|}_&~V`A-H?@{->Y)*6DhNVF3h>9X)dL=*y|34`|7^!|Z?LUncF%J057bml^;Fc^f9ST0#9`|*Q^nrS+ozr9`UG~4A; zLDV6r)DEIcMnqJWp0J4x#qAXXMfm@9RLh#hd?yfErVvW*)VR`FaSuM*Q%HT5_fWtUzML35w_w&9KCMIay-@n4~==Y#}vKfh1dB4NsB=hWNS4y`*3-k*s%m zCxaM62sy3;FTVUzr{nNM(tZ*WOz5}bEmJ}u#(WOcVBa_`%_*MZBK4{)0KHYN{N3^c z?}=-A0&R(BfPT4HAE#MvdTCFp1$$1Sf*p@J;YE^^8A>Qo5(|=ma=YD5HmL%Ck=B8t z*mEOEjF4F1OX_uUp{XRLfnKc#y@6H={Fnq+A?SIDC(G2NV^Z%`R%D^=QZCw1#feEo zKSANu;#Vw|s*QFoUt$yt4wh$Trl%&S#>Pf;O{-OFtyY~zQ96?i1FzF=cO55;0xOj+ z7fYo=DU-?Rx*m~;@n#wG+@waWxwf{tvbt8Q*GNQi`NHV%(BR;JolaqdxJ6$ig#`d< zdVFQ-^=9C?1A~=xE*<$1r6KP>Fa?Qjk^)5#lx=2Wxt&@7xZOiwxUkqVhHKhL8y7-ostvmmWQzDTgnaIU zg*9Br7Z8FGA-b;TGP$+&_1W3ETCJK+r_McpzS*eVz5lS;Xl!k4ctMa#r5)GNH2ly1 ze}7ort^WIe{~su!Rw@ONmdoZ$Q*&Cimru?7$@?$o^Z5-=Z;=$m2240)@`hllzodjl zpM3HeLb{#J6!UoqP(&yOC?wJ2M~{o8!p7$2-0Z@>y;JXf^WEX00jKLk5y6I*&E&SW zw;n!xSjZKQ9Y11Ow(GcjyN~3>M34}YPNizq+TZ`^$E{YUT&}$K+N*=Z6{pkT$+N(+ z3=kLBl}net+}PMKbd$SfYh!yx4jwp|NoTgUHa9jlbNNE4RHT#|I#*#aXc=}8dSBhS zx45{Z>4t7tqHWSJY&9B(45x5RO8V+6Ov)_K9Sy@A~Q z!Nos{wHcQO+Iw2Dm}RK4klNf@9~l{Z_w9F}1|lywe*A>vb}67b*0Sls#>Vz9|J#Sx zZhU20S1&{=nx3uJJ+@IWKNO)i7>?)W|Z*%7Y7js zr3tUbfW(8AF!f>-CjU^B1ej#`5Kh&BSS+DrwH4m>+%_voUrW-Bd!8FmHrXo0n7d9v z3^5m1!oGtr2{D&Nkb6P5eJ?;5i_LBy{@3HMBGyN}f=rJmeM4jk!^B;wr@HBxSM*4* zO10WEh3=7klXsDvCs1ZQ_jznFB>@IK2@m%mVp8G6vs|%`kwQ#_aVP4_CyL*%({)t6^1ewY9Q zdKREk2Bj8<(gLXGHLZRl1W-mDDCKstSOv;;tKH^#z>+#HXMUzAzdXqm8=8(ZjsdFD z%IyU~@5=X%`UGSEiK?wfRTIog{-DyQj6I*a1d=w^M-!A`qrG*olF`dzLlH(!$MFdr z7@c4YhJNTe9R}$5*o2|uT6Oz{^XI1~#sF?dZIgY!zxwE*qw7$CHc#dhCmD0f2*yzAO*|u!~`*b_qYPFiq*p ziYzB+LfmOb$1KKUJGkkSYR&bu$4I(qc*$iCxdcEAsb@41u^{!~hSh5$bJdX6Fu z1`&C(u(-ap*>1H=BULJvD+A^A&9(XYh27m9+qT|(*0e3 z1i<|VpD7PiJlBaR5HgcKAc6AU6#w`qA1o|BIey~g^Jkxjfcd@`7ipvfMqC$!AfBIl za^>>Xt(}c@+Tx{Dd*+#=`wr~eTwA+#{rZb9UC=a4LaOV!W!cNiE4Oanc0J#+(_Etz z&x4{V_Z>Hrvi|H}{SPF5Nz#rlm&x3_cmMY7yAkn+hDLt!;}4dWSN`g+{@u}MkIc?K zUf)=6wVSDQI-SY@1cM-86zV(^y3=XRK6<>mv^+FisSK8$J9%PpVe#|NKHJ>h(RDK* zbb9aJ=bk$a5nNkY#u(?axq7R;wYhP4|I|PK-uo6NKmE}UuHU+s8`x7A9HSHy%0&KS z&ctD3_0sQtJ9YH=RC$CC!5Sl>Wn1^}KV03Y4UJ8=>bs0MCWeGW6mhi~gTmI437cUc z?D&zCs$c{Ni5q3p3e1)M>RRr=|uggNC7ZyWWSt`sm}|d>T@e zE0t>1PC&I>c~2@^#DLUy)=bSSm2(l{*3npFOlLAU5lUMMNV&^CB*bS_@RbM?!Z#vR zN}Qa92&YN$kD3F{yk`&#W0340rBerF8Wm3cBH4^Z+#Cod<~zw)Bd4zS0CN)?{(K|QGc@5f5yALC^L9G18%0vT-@3lV=n< zuFE0lPKR?1kiw`H#LLHIjSG8Kcq)6UeDtBIN!I{-gPrPGlD~s0)3`4oS46BRb3G;}?$ z?fPCoi=|4wTx5i{+m7RUx`so~H4S}y&(NU*2d1W{(v}^CA)$mrXoOJGX}8O>L|cfsgwe6F?ou1C*AE zB|B|LK|rENw@r-j+}zy!{H$qOj8fB1z4GcSfBn~gy|uYHx@Y|0!TlqZfm|++xgT|> z)Bf9amnaU*7(gXr7`Idd3(0&8J?3DGxy|HiqzIMCK z_#@w20mhRNVKihESaya|F!$)um8(};omMuR_JVNV%>J2~y|Z(VYqjbN=U)VXdSP_? z)}7UrHOtOm4Tn)A{R`!3#Pj$__%Hv(f1ggL2v_uHvgvD=udQ$G%uMh7>eh|>_wV1i z_weAsegF2~{F^8Ub-wFqwd#vcp6phuNYe)g2PIC0fN7Z7biUoF-+OTXlTSbHw41K$ zrPEoenBB^eHsbW8-@v zHoPDb3pyn10Ej!9H*bFWkJS+GJNbea@WT^>R3`KA{_Nc1`kwKb-R)H!g&NoF@n@ZT z9dM>E5yxs@a2$|c5==MrMx%})d+Y5trl+TxjTYfS8Bq{mh>smVe(B4rzx>6oH+QxN z1}l_+^{u*<87@}Fp_W3Bwrh(f^ajdBPN~u&f;^uf%`{9ao+y#V15^Ol>xO_5NjqXu zJo9p6A3zuY5wEq3P=Ww~lu$Xa69GpH*F_*4V1?5P&w9dCCVDASrU-XUR!~X|sFaXB zaV=EDM&bP-N{PZ$App8c!vk`};oE75+^*+)4#pbb$xDKjEbJ4NgO80(2TSP$UrA34>J1E2@ivgDV6gs6;!Y=E0F zBTmwi1Fby%<7>!`IN}1_r6lV2(&MB7tm_!76}nW7sJGG=5&&e5bI>2bgjr+z!6>X)QGgu!r3(8iI1o-lEfO; z3{AtB?@feBO2TQDE?aVY0KVP^JuQ)8{VyE$?hI)nnegorOUXVML-MtgiwFB#Qf*8~|7@mn)Y_`C=iJvNfy=m6&G6e{j3*Zf)nulf|{QwaxV{ z2tawDG&wOoIW<+ORCGh9QRMr67=*$FKt$fF4wUkwSiRM5)pl#STt5CMIu61x429H2 zWM@mYA7jw6;}ZDz_El%;=EcLMvj+#YpcZ;vVnJQ_OzBHswrJ6kjOI zvM6I4o12Y#WAF4-zEEtp+7v`7D`gwT+REeghnJ@^^~$m1CpwOE>(=dv&~z%xB0`j_17JYdgXtP}-A<=f|BJu) zi+nyC1z|RunOj)6d-uV?!v~{~cG~SvKlylJeqnHU@PGfyzr+}mD58uRnx-3iyVF@& zTf2GVrfsFUh!p@%3S^9Ent?Fh+1|c!?TVc;&Ye9wF|}uPb+gs#4h;>aQ|Zl(wZVbh z8?U_Z%z=GZFJJj@zxufClF>a=x@9|lD3?stoQK930$SU(A?5(;=ZWNf}Y3Um^dLk1PV10|0T2saLm#hAZFv#=Dkf zH(RavrVT*^Sh-xDdp!5+Uw^c@Q_p7e`9i7PaW*!0Dnt9t+)zYyL&L55QpO6(0}z9`qjp5Q=k` zr$vh)F_fGWVI$3d1Q8M@`2*vp2Qk67rIdFqP%<2QIj*2jEh@Z#WtI((Q=xM8DB(m1 zq)3->i&lOFW2fB>JQv5cSt>w8Vy9^4h5S_0jJ{e&<(Udq`C%%j4kUOg>)&><{wke( zhuXA?zya6;aiPf7U{b)O_|xEN7FTb{`xL`VS$~Oi(zvDL0)6S0k0Eqj7hb%0vE7j> z1p$@wnxzTkIjOQjP9vcLAQt*iWkP_b=Tp|>{i@h$iAzWjU1m>85LqD0>YpiPv~(MQ zibyWjugdXS0t~_f3aCt9c~K=<94eD#9&4dt!Oo|YcAPGyG{Gb^tZRlQ))PQ2o+UCu zrKQjyK8H! z3yX_S78e@zx?x)5qa)MP6QiS}`Fue~I3RIpjrfvHvS0agy|l8twYgoZ)pgAn9IQ-E zP7V)`K*$2$7j9RCFvHMI%UWNYUA*=AfiimY%y>obgxv;X%KVE7n=Tm$K%mwI=_Vd( z>cdSu5TG>Ya3~2pm5UgJbsBk%dQ;Q%a%I3Y4MK=v*p_WOPWQ&u8|_Z3GBl){8Um=< zXkGg9%YFOzfAibl{M*0zPsMy;pj09e)pRYJ%Vg6TO*d-I##gt#+S=I6q%wpC8QXgH z$l*OxQ=S(EfzPFo1VL=-7B=Flzq+>e;K9A^?cL$Q!4t<%9y@lVTrLHE&~>{ZfBO(I zN-@ul;)f~5wrT5@7Wq*S2AW}H)0s|vXYST-bEx^kvtuJ^;CE|rSD_mL#XH?-y-9q1 zC_S_fXDb0fUJzvL)YAOI?R)pH-MD?~xzn$`@=B?gZ#J7@81lzlcBj%@Ob#_HjEIJD zDwF!vhaX+Pe)GVA0}%-Uqt8Eo?z7K6nVVl693In63&mA46#18u*~YgHng%-U_Ug*= z%P(Je_no)66f3@ee(}qHn3*}?`<|}rUww6_(`tFHySA}@^2G5!`QtzKJYUM|0kbT7 zr(XM;|Ma)Rl@X|MhB=NOIH+O7eTIsK;>Ox)v6!(eV}4<7cz86ODNsVUHrF3Nxcl92 zyz$n{XFmAJ2g^I%;>c7cR}3S5D=PA=T(}WG3*Dj?+88Y?t^VxO%f`U?D{sC3;L+mU zd$U$5=Q?gWZIwy`PoCTv9V!V?qs#zT=K>P`f>Ht+-|AR17>OE<-LvPOyLj<}=X##& z0q$y!b;Go+OP4Nx@%u}fZd!KMvQmvkXLGwcI5q?Ias&)h*IV_KTq;akTHpnyof;h* zpPb%5Hn}%dC{jQj$KBnjZ*OgHtZ&q+yBKMW3&8UYsZkXZux zS1E{~iWrJZHK0h?wlV3`B<)WXUaORoFrKXyts5pKM^-Atq>M-LT6$U|hJZM5rM^S} z^`chmJRe?+Moy>e`vJy?_OXzJ5Q)bpUDAh?Qq1XbYNft;FR7bS@I_H9`XbdJez8J^zzj!^qEWqtHmy<#f zM~tK}M4w_q{l|caTWDZUA!Fh1B(;D>?N1&|br#i@y@12cOE%L9g?d7kS>K0wUS zEmOBBA)e=TyIt3DLK3CZsY0PxC>8VBoMo9}OOLepxQQatXf{`tmS^YZ*4Nist)^*O zBZI?}ljB1}Lxp_7uyhhn#sLIiX=Sm+9jbNBB$QNZwN|4=2pyjsKYHY-@B0kEbUN#H zb{|~*T`Jgo=j7PoLCtq|n8*MSqHPY5$s2=V2c$Z9pka(OaK(i=DiWB~2P!}%A#7+g z8@}&VN|j756OqU?OJw>|+R6mf32ye)z)=M)r(tuB{(9u+e}4Dw!-4WZWq2?OL(l0T$nM^`W83MG ziMjeE4W~VR52zA{iK$7?^Mng2Un7Yp10J=wUrQMlP-x2 z^M{m+n1F3rPNz#r@ZNiG?LRovY_vHzK!YI6Wb>_#^OK)^u)4lcD3u6dy!tvj_2$6P zI00#76tHG&ug+#{e`p{*P%0msIWRFbp2}q?Ku!>b1h9DYH4QVR>w4(Bwd&S`2anfR zcMvjlGZpy(ceV}VPld>0Oliac>Il*ZF+$_>K!}kjWt0yRd_CN!2js)90;UroMtqJ4 zx^BNMWa1p8{!?se<*)^$*|Iz$B{!K$R9l?1T*0Gjp5yYc6HLTF!XVO+j&%;SOO=iI5P!p8armVyvwe+tRLD4J#mV zcjOIEl1C+*oj#ck=$j;aaIuPC6kaJ}`h|TdwW?K+2ryrRbM#Ygo&~))48wTPkaZWx zOpZkV3le!Y=)b1DkE>@F0$_i?(^~-p^`51Mh&{F3hY6j&A72-oq~uLX=29PtoFgCz zLF9T)wc4l*4sC31{`sH%%hRWh+_-+N-R(Sj_^{Dz&Caa^6cGkU6f|3{Ogd984Q6r~ zP1C8Iz#(Nch(h1>G)4yp1|}xPXJ)2{hsqd%AdEskf)JR7p=%n{Fd?+-bUJOv=j9=t zw#(&mK3_C#L+6w&02xN{cX~mvv$MOtx;{U@u)4bJI*w@?1A_xo6O$9;V}*Pnola8{ z)$5H$quF)4j8a`U+MRBpSQ;D}jDHxTvv+Pd>klp-DxKS(*Ml1II>K0pYm&u15>al) z69U~qg}O0O)kixhLn#*LKUegLBeojee?dk2MbRYOv^rWaNn6Tr^m-90Hdzs5gPGq z49Eb9f0dnDd@{d2d-L>E>hw$+huz3?5#NcZ#+r+X<71R(P$F1s2ip#=qLDkx%@C)% zPVn;&KdbrL=~v$hBM-Rsb4T`{J9Ru~+fKI=L;*rbZ1GLgs@H0dA3nTu_kOe4Hf(!p z@09C!xm*FIM9s#N1KrUAZ!boL_#P_Hc-vi#t%94)2Yp=d?`0$}r$~G(` zn@(?SZGG|kFZa&u^F1Hw+NIxp={k<*c{|me@BOpyUVQOI-}fxb!U%6}Z9RPWsM+dT zRz^4U`;YDql*@L?j)F);Psni-GDAnTogE0lK)FmJ0yKz#rtA3XrQbHIJKf#QKYaT| zmKoA3Qw~ooU}8R{R0~}jcqNmBZu{!3`x(j2I{*NH07*naRA1bl>jK-#2|w? zpiWo>8O-MMU){a)^Pm4CKt?v3@jc(N(px)KKR|`bm`{*t7YPAQWB1Vh;r)AuhX#v- zM zr9Xy(F_o-G`)EnZV^g&wFj4tZsxlT4f{G-r+`7eW1R;v=$H0#$&1SOkaTP@>JwX+G zakHr8Lhw`<$Hb~wK^k0!*JIHuchPjfUfTtE*e>uJ1)rxm4WU-qCnEB!Dnm z$Y=6}cnCw9)XHh`tr7WQ;QJ7eO1ZRm@8smv#BgQM&^5tJirY#J8m6fujZoqTf$O@R zt`qv9Vc@i#$>lP+QqDF~DkFzSq#zWLXlJ+fWNCR}abbOB)$O*jx!j)7J=1%qr>CaN z2`N^cOZc2Oj_5pW_5Gv-j{o`-diWfikcTXyVBH!$=xIqsmt+YHXN9(>BDt> zqJ;|qFgb!Fb`C@?2LMA@3j?p+Y9WM*#iC`JK^Ra%3;F!@o40=P^M5$}?BT(|ie*}w zrW=;2@mG#8G7Q7AtuP3>g3`5Y1?+(j;0~k^}f1&`|h2)z83<(JU=+}>@)E@ zB@Aom`jtx=ONW$13>&#}p*#?VAwQ>p2zu+b+8b+Y!@~owymDcDeB3lltZ5L!QZfI- zAO09?`pD>56w=xGM~@yoZZ}({Qt>SX?ex4EYmQfh#H38 zXx6tkw)x-JUT)nr^^s$w7f{+qg8W_vv2N5&7K1CYDSnsxW8}*e! z!6@YOSSmtff}I+i5JiY_)i{8#*{Gj7arE_9UkQRJ@I4-p33N*{bnC;9KDu=IYOz#_ z+Y~P}O>=W|*A4LC$h03qY^I_p3Z3fvZ(lfkU_1yM8U`T`#6+3_5N1$gSZ7e9P-9R- z*w78r5529;-DAdnA5{FC7VQrbVqdX23NtaUU zd7fz)re)Dkm~Sx#G{Acon2@ZQN_Bz^#nnwHe3NBmk30jEMFdcRaed?fL_xd0qdszU zAKILdrW36c=n<3q4rTUF1wF~!+4qa2jyX9Hm{^7(zD{Qm^>|nrJbChDCX+@yI*>#} zN^z1fc4b$g(wGyk4Dj{&JmD-QYx&-H^^v26Zd-j7CMF?I(V6<*U#}g2i8E!d%=cam zlfrP+7l{C*4@$%ZtR#xWQX`Yg2n!8L<*GwkVFLl6^=hA@dnIsY&!ZZGrvVGrM@;XL z(V$9{VtpI(qUNsV_ycUB)>*P06#k5mqg*imN( zl0bv<(HGip0mcvpJeX?hV|9H`0~TG7CRm4xmLP;%j2ntV0NS0F<9g*{Ih)Inh>(bA zhNdH<-l+fdgP$!fuV943Ai^4oXL-#qOw%$AE0yBWpE#9Dr_-5~ZJVa48CuFVb=|O2 z_O&aQA3nIBFBFa+KR!7*83bX(Z!G|khT~5Opgt`CgNYff#5qLA&uBb!#4Rtjbdy2Q zY&9RvK3-Z}G!6aGf&Hh?o-X7|H*VZ)w%f;!9@{%T>35q^w`$O40XE8d*JduH5nw%k zSi!sDXd*>+>DRZ`pSUG0H)5Ff2S5Ae^&4N=*-D3Cm*L9L$gz{hhi7ISuS;4xC#J{F z9@)RVF#F||EA@ISmCis4cdOe64;_LKxQ>&_q;K805;;!FGzp0q(x8Jz+fT?^CLC^Ek>1-}nM0$!b z9YP}rDbTQnbhoq9YOZ9`MlqMw;q&$e4_t`o+T z&`c)NYPEmz)1R$uYzz*KL_P^gs2k?m`mPsg!{g5cp&%_qZfEO{zVq6ip+dd3E3}mS z;$Z->pj`rJ01X4(#@Oz3{Ef|8qvh#VF;yHg>^y}w1LTWOKgd{I2SXyj0v1obA)`Kr z0STi4qVY^jS;QYJ$_rQ&PpC|JEAzvO00KFH$V5gXx55#^Vo_36;3h+f+rL_#${A8b z9mdlUL%j{GC{0*~ATk({APfmNUm%v9%4D))xe!Jq3~gtP){T1R~hOC8^X; zB*Sd4OhI9?(5FR$iRFS~%`)W@&_{WdbwIlBCM?**V~7uJecGO6{$$D-SrPQqnluW+ zfP_M6Vwx6w?$oJtI?ZIfD5NYd!<0{WJ?J@s$Hgm>ds($?mnDYv`Wn#7RuJiRDA7=f z?-FrMJ@-m=&0t@Tp-M07U-ko4lBC&l4}sw1Mv>eBlPQ!?8bon#3zQ271Sp%!K!u%i zJAJ~LBO><@i8qE&kABQlCnN(ifs}VBZ*C4K)1S1nj8=Dd3#G!hzV*$sXU=+#_iz7?ze;CH3k&m@MN>0-TJ28YMavso zA%OsCcFJrv8yU;sWT;SsV0d_VV4&)qWmcX!RV7x1b)xaFmgPn*=lz?9R@)vWe*feAddK6Gn2}++RZP1cd1sdFRiQwUSyhv zYA+cCm{5M}0~W=HWXSbVh!V=xRdLrEc%ESxr%xPz``tGHM6XnE87l+Z2#(e^Gtj*0WWKxBPa|;h1 zJ$6G#8SaLWRUV!>cIM#GXBsOH!1jF3h+nB@+KiCu&d&7S>3Aw_HZ9wDGC#Myx|GkP zx!n?XJuuS)BNGrKq+!qLuB|K;3&pqJcx`HG8~|ur7S;@D7ZblMVwwhoczb(yes+Pu z=-AOCxoj@t?DVy@%?A%3bzR>u4X#cR`$wtF({;U3Yi(|AOz)lYyg>R&DUz(1tQHp^ zPftzpLIoM2rfzMluRgwiXKQ`+*i_}@vj?o~Kzz3A#C4o6uHU{nyAtYoY}lQSqiI^c zP{f+SX+j1DCyUdW{lLl-fwJS7B4`ymK*&FFTTrm4UG&38ve zhMKJomLVl5lP}!8d+&n}ex@6Cp;Y$$ATHnf-ml{r|D` zo?mjE=bhjiZVnZ?sxumm&;$uEf=MJL1~F?iT1jJtnKSl|Cwk}X*Zs7!`?rieXZP&d zlI(#RLK%LN_uII;YB2H@;!deZ#GSy`Yat0gdjeTlc=t^ZcG)c;o1isX_P9 zFzoSJ0;NO`igW=FAhXqvw)eWD2)X`DrM|$hn*o#qg8{<}yiw=Dg-?FntXA_hLx2F9 zGnPnRG#3ltq8`%>a!MiNltDlNpaLZ$%56g3sZ{M(IR!$jkEF_^n2?!fRcc+wgkVx7 z(Fomw3OVg{7-Jy(wjcq{WLBI~;lDh^32s zvVfMaDi*$Q%N+;WJ)~vTzqFNgNq*+z8CXnclD!GXLlPJ(UU^w)nTAif%1hT29p__^c?vl8CJI&*JA&N|j(tb8poss3MXksLp(Xd^`qVfu@F+ z1F-Cj#;OM`;zeM>;%gknFrMnc#5TAb__b~3xBvqs?-nnaQkrJz*jSS*92p=O2I1Ht z4CpPjuyT_CAqRTvuUt+Q<#y8cs)U(=QU#CS?c{jORc3*nqV>2xi8Ct^GoN6!LuHL6 z>RfT2_xl4z$=AO6@^}8lcY-jywtDUQwY5Kd{Mq`0?fx(dJ@@GHkwJg3v$H!)Qe@io z`jlnj!C=4{p(LN3omrThF-Glh>_y3V8}{w z*hMpK^JvGI&444t)1nO$wMS-Ci6wBa)uWtF&rZ9x6Q>Dhzz-@2!%JUWx^w6D(vhR5 zA3yVVKmGgL*KTELDtvB>X~!~c(=rX)HpCu-K}dy#CLshNI2;aoozBY16W{&zw^mM` zh?9tMV46l0MeSB+cXvN0X{BDT*J>s<2%%h*ma@s?LVhh&6M%8V*%&R8GY99wzmk!# zQaw1_-#a)ww!Hl0<4^d3HyHGR_8$-hoQQjh;H2$ldkr+Gn~4b`KvE|{T? zuv>ZLr3{&b@jNH4ZDm55wzqru#no%;Te}9f0e5zLNw~Cp`t%91d+U*<=`2k-K!*qW z$CeiAQ_VrYPZ^D);ms?TL(gR_SF;bm1euNbCAU)D+uJ!j*gN~gldpa4t6}IF7&)#h zeUDVwnSAg>TD4`Gwq-Mxr&*4%(P?+Du3bB9bxhkeOss4PQQ67@ncQw#_Oz3+Veg=Xl^EgZXi{pN2k zTyLd@=~t5^r<4gQgPSudyrM9K7JxQ~Mk?sah=VNc4g1@kjeXzsU6*NJbP?16vET=_ zTL&kP9ew}3x3PhvBsGyqS!P*|<9h$_i(h^CyN~AP=N;G2Qerz6;bdcdH)DQd=_zhc zo0dbO{rK?CpM3Al`MFxVbBL6!2a;zIgdAhrvYm|3!&d+BFiL^#*XP|}h667nkYkfU zgPRtI27sVmch@d{bhx!1_+g$#h-Hi>oTZ!-#xh6<1jS@5)WAZa#7I$q1@m2n76{=k zQ#Q;p_q4?F6w(9*%2PJTS|G}iGMUL0EfsTFjYUZ;J}oG?phe{^N-qUv+PruvzUu{^ z$EfnH72N;^#o0{qT+C5r@ToptRgj&=Faek_=$f2>r7&5SW$h3Ba6ar<+N;pyu@5B} zRU{dJW1r2AW(hsBw$`q=c^@v0($kUgGDKf* zO(*+_l9UDb#7cKeelB^^V4}hRIEl$ZZI+~Z)DeF;fUi2xj- z^!w6pSYVmO0Ud;)eql(%-eaOSEuKb2Th};?T4&2_5ZzwM*E6P5X@-+>YS;cSP|f+; zmQ*!ix-=`5RtZgO5i?MdFf+@tUblVfkyAhXS3fxO*rS`9o9E7bcK!PGot^#7t*u^v zy%(krN^vra#83sNwOd(n*s)=cvw&i4LytBErvvL1m>kb?2RV}hy zGfvC~i%q|3GXwAgVz!Lsj(KzhLn_)Mxeb=sv-bRCpqOIm%^P3Zw%KS-d9Lewei&9a zx3)k0!-xG|_vrF5*RcqtUg#GMX+}sw2GM9Vin{IYARZ)foMlB-#>nKtPzqyX6b)U| zc<;S;UwQdu0N8Le5GD?YiS&Y^^8m2h@9*#K4+kULb*5@{+cp?OImslJ!8sZ4vC0EY zgF;Lg`5K1l`TpAK_2yjjr5C4xh~U9!`1Gl{ zm7_C&(!IljX0x%husDiFQIfDMU%PbCGqI3U5P|z44luz+eeOuR)5UJN%o_fT> zDDVT@c7)lpmPAT5on8bn7*LA5_q}ir*u)BNp;`#33-d7%7ID6*gZ$4eU za~K(3J)=C!Xb{%CFn|mYajc6w2?1yTU{QdhByq&6%9HM(x8>TV<5*#(BFLK%V}mkk zT6RWg8jW84>Pyc(e>NJ8Xih~4kAR&A!~g3?KYp;jzBqqWP`9A#dA(tOf4>b-HJm$UEq=-yi|pPH$;jAoT;%`{P79N0|eYBR=$alE^CFc>5ld*RfQGu#91<7?h z-}gAB0=-qn)Pi&?Qtt@KXkNTRsaul^ zU1{Z{VgSZut_f}u9Ggi?HJ@xmn1~`3hG+dga$&CvtF-X34?$Bt#7>b=G&B!3+F!n z;?kwN_wH?P@3vaK{$OC4X0=xDv^o&+`GvXZW>e5Sd4Dh*4TqJmQmOcU7-k|5UqG!~ zt>T$vm4TvuAdqJHaFj%G43XtkDvlo*5K(FHj+m&Zn36n+M`daO}kL!s24B zRv{$M(v%jX2}D@AP72*EHcS%$KnO{aXf%qmG;?jc5>{%pO1;tWT$eGL=aexn5`-+y z>7d`<-F&e7;9h5M6U6PN%a<0Wm!E#6kERk}i6c_!<3x)tm-wnN7CIP!u(`gzvA46! zIiH=K84jbh)vIAx@qAAZjC0}q$T5Oq;58lBu^rbB0?%{OG#LyBNtz6LqfWOQMWg%o z?ysCW^=E(fALkbqcDApK8M?%=ZHUZ|KK|t5rOVH~@Z8&PeSPKlaYpk|G!jHEBp|zS8#`WfK?Z3I z;+C83H(JnU(S`amXO122?Yge}$RjKLem}{I!|v9#D=Z#iES2?APy?}L_LD5h*%MDZ_3}$E zOifMMu2l^K1Dm3ZQLcT_g>+Y#1u{k{H7(09t^4;LT)ldIG>RPGlU`g9D(%#SVq17y6%D&Z02)S-ZQB^4EbR&e2tb-8 z@o-qJRnj!`1ONT^-#fOv-0OBA76%@O)mnXZ?fQ@Z`fmvbjb;;2U|86|=KlV{C`nDH z&h4e@+|!od+~2)6<97b__uiE0`>M1hLphhSo@SH?9Itu7kNI>dm4#SqK{SzK6Iscc;VPvwN> zBnKk!Q8-LUYNgumA_ysCj_V4c1l7||>8qrM6M&0>AS=dU0-4Z)$-#|jy|5ZOHPx2` zFnQK$4e5A>E{R8_!y%vCA5ZQAA)infsbEGhvEKzyYgUT3fDoGJx%}2hjbo~PktZ-` z%(h*4_PJ+$-!C(bq0soSQY0mN8xeOwivvLPLt0!^?uNm`@03pnfJ+QOOJRj(iPpQ<@W*7C)~Dm0YpUs#&8^jz?Ih(EZr%! z|CK0GVt+g~6Gf6<4#u#@#2Q}{5ysz|mwTLtT*1d^fXruRQpYB~Wie18*zXN9lE3`Y zSAO_|Kbme%UA}Vl+~=R)yK`@QXJ>bJpEEu^J?%K|!NEZkN3QEP8gM0eC)`t{XC#6Mn+D~46eXi5A(YvU<9WVmI~)Q^7$ss&DohY4$>S)> zv&{Fr#f7<*M~*Kq9rb;O5thU$W287nMMxwSAR30y#HL{sg)2?6BuSDeqKw+MQ?J$P zQ+3bx4U7n-R4m0sxF$^FxO=#Fu(RIU+x6?s$DTTyq$$RRQadP&jw>JoO7m$Xp)kud z(=^-O-Tva@#r?g*qequ)$H531*c6GnRBU;vd`Kl0CVi+3Y}k(Nd7kI^rc-nefB%!8 z7v@!czPB-!_kK=?xhLK!J3D~qaz<((xTD#lfjGTG&k$2wu`eTos%F=W+igc=}@YU7k z*CM8(_yYq2o{xBR;F7~B*qgR9&or*x-1@~IR`0iYY}Tn)u`3NXtT6ygA&9qa+wuG) zA!|2pU%Y&Ed1>*nM~+1O{&UYg+aLCaqZm@SxpDts=Yeloqyk>M_GG!b%W?zDTndOifKuk%zBfk`oA^ZQHGO_lwI{wzl_N#}mz&bXP|TSX6>M zMYIuqj!5psY}-0)9dLV0*(aaA_WEm{<3@3WjiOt%Ez@@0-~8rxzxmAvwW+4@mXw*n!Xm*n+0Rumg|_kqt3ss2C7~&|bax*{HQ2*hZcW0FM|=idxGlWQ6e? z2wN2)4$j2@!Vo7qyq2k8U~Li%pqeug99Lq*6tJmI%W_GmMo20zFyl-@l0tbb9$b}= z$JFXoHqwIK?s|^z1(J0k`E6qYvqBM--ykUldd70Xq{+PYtkATm{~x-NCbi0c>AYAr z!JU%tj`0a{G$@U}Ab99RpBTtE9B)jDej(2?LULuwfxtfPyGuevtfL#Q7rlLcW(cvb*} zII)$-^w>US!W?Bx9+Q+fsel8L5m4%vr7~6dhr!a*jFsNfTrPa0QQRB!R#sMi@WUTG z_4wmko9mx^^6~Xsw;nuL-`?8IQZhR;U9Z=vAj^p)QDO5a&>dwjJPu_l%6TQM2$y^< z-BRO&0tU6Qy1Xrmy2$~ggboIyQ4|}t?S&Q7b^%A_Q>5NE1T@W(G|uxRbp7MUj-Fb1 zWNC5Ham<|LX_hj=uz`UH8F2KT3Yh`kP?a}?{}G50Td%odbbIiTUxEw{_CIrx6jUBXiPOmLXqs+ zmgBg-=Q*D5xVGmwwrv^MLpk<_^KZTNj^{h3X;p*J_8cM3 z!NqYcD6|->rH%AtaBM55Y<2b8wd*%I2afAY?rys0 ztdlkY!l*@(A0^4zO!GWSBHMNm#*7R*2kVd%%Ql~U{E0VS{n~49ym9N+t?M^#oH%wo z%~MK=Y1oYAfnQ0p>_>n7*Eet7nVFr#$ex0*AvW!UR_-=VPc5G9wYT2= z>d|*zKQm|_P?`Y_38l7Ur%`hC>gE0Y)+maOEg#EL!isvzATkiL05$=#Ahdzu0_-E~ zQfy(v<5<>Uhd~2k>C?vzNH2Z*L11B$4G@nhO*zj1%K@i|5-yxNgfK~%TNRU0u7)sq zIxwb)N065rNx2_TlL(c0vZ~eM`Y4zDhT_Dfj4%-b!>HiYlm;EjC=g+&@kc>@V%#q} zU7s>qd=#t<0@j<>(sEE!k>tiOOEX5P5{dwz!v>)~VZp;%p$V79vY=`-o&TdPsWN1o zSaZUOohs9z65@PgjOIl#%3-PBDS=m@@>_L~ka(4hS(Xi-efF&H`Lb;t%b4X8&0tBP zW+jnZUOdWVzOHu9fMuBCg!_nOoj^XpO5*YfV}O;>_23~(YlSS2(O%t-l)?m^CQC@s z*|L&F4NK>3@DRKJ^p-+Seh61Y0ana4sN68YLq?tgHc>ip#c-BSf?QeX!u`-*LDKZ} z7f2``$qEiiM=jk>lpl|lZgCSA18BF`ac%d#_uu=*`|qb&eE!_IOP4O)fAC;yYq#C$ zOw}9B=@|nQN(9Ag*;RpI>g@Vc8TPY!i`q;nca%5)Ax3~)~K zQIw97G^ap-Lw->|C=mK!;esNKP7q)@jiVuFtP*(3%gc{GvNAt6ITXo` znk88-p&>F12tbymX`GCrh|t_Lt%Ze!W}}&=2}fKwQ(D7*Z)1JqkyDS7On5)3y9RQO zbwDLlsr~8_(6CbZyZ`?8|M2r))u)<EI6mdfG==p?n#ECs5nMj9_?54G<;-I%uIr4V5g|-YdvbbUTyCU`vy4z0 zM@gsG?i{uUgT5d5&H9YzxfC$Rwnn4)!o@4A*RH!kh%FZ|;FxBw-xcJbQQZ$7=T zGlZZv@6Q|wrkad_EF;)742(V3-Pzqaa%9o>!$H4GC^_6e*j>Me0m+h-ivyJdu(P{w zdBHpHf8&WKpMZcnj^lZrZJ9`LorO+Dw&E&$jZtRXmT6e)o12%eT zoSp$3IJUjBz5B(bwP6(dULZ^nSW%x;U?3F!0aE*q#BUY1BQmTwNrrJ0dOl;>!QMtK zFkgT5l^0%o{>_< zSzn5g7{~x6LWx8Hr>v;H;)y7(O*SU_a^Z#w^rle)gh*~&p%Auk%*IeIQzILfDQ8fu z8}dA-lnQFPC?iakMmes?hMa46CMe+?Uo3%{^5hz`CX^sXMj@92fP~8sEE);MbCT0M zSD~>Ju2v-zX>6G>CTa19M8Tz4bRsZUGiN6@$C|k#3B(9M!emk_VLC2Hm!7d4SZ$xc zI0lz7YTGt^?wPY*=xgaQ8i)Lp#YK8y3!Vbhwipt!W|S&4Q<`Q&ZCDH^q_JAm%9W?{ zcz~RE$9i}iFNaHNyMpwg!V8MqJAgd^j9bzS6B%_Nu`6V z>}`;)P@HpIoH)9qGcZnW;Nnd)WjHQwAt-SyP#RV0CL5M(VP3{YsCG`@VQTMX6#e@s z&+`{weEx?&_hp8wK0o*Qg9rET-o3xK*YZ4Xc7D!woT7wKp@Lw10u({2!_bh6 zG*DrTnHc+(s_^<&QJwlFstp6zT>7FXl_92*;mDE9}qGO%xK)VJ z3Bj$oCq zt!M|32z&%Wnd3?byXUZ>N&d}VEOYuhj_(=aKg45(Bc&bd+ab9tT-&-Dmns5Gu& zz%Vgo#VPJM=H|xMv17-vWip!Gy>tJ_!UBWEsRtNj%7mE;vuGoZhF{*k{gszq>)-yS)@U>vGif}8#lup3YSmih4i(mXw&e@!?UZ>sbb;U;0<&+Y}2Qk5B z72sfTarWQ+@posM!JyZ|5HU_&$IkQo+_}&8_Yddh7Xe_&D775p)~#F3siy7Nf`=ip zgMfvQ!J);li3|rLha(df<8Lt#a};pHBpj3CX}~mRfored{%ml#Zkn8t7!(sQg+d%G zHfsa`BIAU`LqUt*2ij~%vX%iDN5m`ZeVGR=9j#QD11n7rAYcMPqJr919K%Ss&~Oh;O$%sMj?gghiLqLIEy*(?1k0izh<`}{6;9f9>befgjjT|y zJ2sx5pSNvi4C(=G!of?nv+RDLT(*_F;o{q1EPY`l$)e;caiHBJ5Smcm@Q10=>cx~l zSbi+hQCWhP@@J}WX7QX5O42MPD)>wk-!j|@XtO^>0FfXw((r>I%8U16*|vt6^*0t0 zEQPd}t0?tSrGcQ*e2Jh>EVyY*i?Y;5i^g$9I%Y!sp$wtbF$|L5FC3Q`y8#$;9yygs&~o%g2wJY=yC#HeG#p05A)&+&=p_bf ztHA(;MURCY&$C@8%JZ%5-5b|#Jy?H`WSQ&vwc3H|@e3skwN%JPhkM#DIYm>^-z&(AT&4i5L@ zI590t7=cOaCWNqwP1CSU)3LB&0f@4k4C81xjPBpN-|2Se=I4d|F1>W&+{VU6nx=-} z5Cmc9`u<=T-MoGK>gu(AzhAG_nvH3MVV0*w_AJ8K~0$3On@`uf)F z{KD+qteokKX#`=hMwR(`^2#7VDl)NMCGK>ey1l{B0O^yD%$z>n3{g5b*x%bb7)2uk z8*!2(IjPpFhG_xLhlBo|8*5%M5)lLdhJ0^-4`TG)AN=r@S6@R2nHH{A0^70>HVnae zFLy?zkDKc_5TI)}Z+>?E{9q6{o+mq`(yl?|f1qKn2LQncy3AWfps_bkiE@{Dp2X9OZA&B5bmPW`X{ z%YUAk_6CCv;tV2C+|`>K=RW%kV{3kKAK%wJG@olnYcS zZHDE)(Btl%=l!la*63$AKYUSv!aq7}}0gi`S#7ln_C9=}i{S$+Zx*P&f z&huP8>;ecx8W}AUlQm3U8f3^XQfET(8JMPl=N9HI)6!J(va};<(_EhHQt|{#R|;84 z#8+eK&&Cz{KaRpxiY@&imSiNLP<5yo%;VUM5_jf$I#VY!FIt=84HJQfA)u|Dr9ui$ z)*lV+>bs_F>6CAaB^!?NxPT9pE~qraqPUOqwlo!xNoF*Zu7yBScVxhs;s=z2B`>e4 ziXfDWXJK!XXJjz!TedYE3>oF${MI-BydcKN7jn6hdU%7NZPKwt-`spB~Kl*mXpy2a0}Aq_`Hh zwQ8hHXn2lgVob7Z)E{JVi~%%E0~_KIV}jc!R0gJLx{hbN?l4O3+*`kS^Y;42dY0#+ zcm=NGFu*Cvfxhd3FkbI;I)lMrs?j(+Y&nk8XiVieqbNgRPYtS1WwpzVj7jo{puIKuW>t#8;b?4rN3zxQccY`o&H0ri# zW@$=fqLEaD7F`5w|lgib0 z4VJd&p!ob9>`zf=s*_mU0ifW*Tq2_WCO?zjWc^g;A7*VF&@tvZUW@S3_?!=xuFnoO*QS z^qDh%|C9gs;PBwY@#EOU`+J8$81m8$SB@PJn#fq+*fdRhb#)C0*-x6Lc~1Qx6l{LQ zzL9c&BzHrU(Ihsq&U_U2y-z8j^aGaQQ+0XN-fUF z)vH%__x8gun4X@-7=QZ7$9L}BTRgJtx?VJjrJ0P-b1=vC<2W7;hhZ4zgeY89OswKG zXJv|{;Nz;Unlq3S1`)I{y?*J#8>{ESz^qk6PIJx)qq%BX1m{^vjRklHG$=GV3<5>B zzk#ds|dy|IW)w4TyoT>*wdR;QFA0OB&fhcj*&re&H;ZYaif zN^%a6zCMnCPxsLPr(#4PJL)ND3k8Dzk-XN3_51QW_AFitfpg|9ZRSoVNLAQhNeY3<%boC4j?^*$#g^|_!0*(WO^el5<_Iq3}NYQRjw9_QISzv zvI~&jyNji{5TXl4fuOuX!!RhN-EMz+X8Nh8pZMsLj}{k}|Kv~p^@$V9H`dlZ`{a}R z4<4+qZ*Ht_dA>h0GiR7ZsViQlptZzWn&(kK2c>=bnA~ z&9A>PJ=2V%h-A588Uhy;D_AhT|B9|t_Q>%eZ{0J84`!{n>6)!U^3mn{AFpkXaGkkR z#BkDR=z`P+c{J!6EIK|DK6`5R_+qV6tG9DwH^!)PB%ED=PAwP90|N{0lDco8>$+*0 zU0uC?|G|CJvMtl$RPg__!T@0eDC=|%9m{;?nWrB+b2^EW4}SOCPd_`?AH|QKc_Pbm z&+}%cDr>8kr>5#}zy0>FfBV5lAAQnjPSc!z{q?sk-`w8Vp^P_Xnpv7lzX&d9K6#d3 zzkbuP-J3VAQ$`Juu9N1pJ~d4UmEjh`A3;2$c|x+03)x)FpKb(U;11$6XfA&BjdxF< zc|6P0LBC(ER5;|n|L_lk;b3uLF-?gw9_Dars=jvh+F$+nuPFqzTAfqcX}9w{bsbwc zwgL!ELP5LRcf6_Tx#dc=ZhK*tvuHFL^x6of3$u0Gpr=oroS&cX4+eRf33&mfJQJ!< zP6#!yaqrH(=1jvh4W?#xflFZwk%@o>k4JJs+x|!1LYX1$fd}TyvmX*M>l(2}J zp&j&vdP17g$XX<~XVOtk+7yXqf>G`}o)`Fv+pkz#e4Nn)_}Hikf|C5ARmw=J5M^7U z6XZcgvOFh%F@&(<9ZhIcWsHCp3u{B*(wRa#u8GqO5=wF+wHi!=aAU$Sm~^+8jKrS+ zw8vFlka|tqg3ms4HV6YvUYZDt(Cu_-F$Tw=|HI!4l;SDL8$(RwI`A^RPfM1@yH*Y+ zU)^}ytjAs{m&$XRr5Oa{@JRs1^F7xdm%2;h0R9unwNe`)US=^t7z6=?5RXJ=z$Gtb!E+-wl|g3c~eaTI;9y!}5%Xyq6ahgMHxRtWN!-F9|& zudH2b9rhf@F>Oa!kusqFvLT!|g5p;d0Cw~Gwf)^4jIkGnN0*n=jI`SAG>)ZXEkwA{ zXw1(q`jrY}MQc173`mwVr)p0>{nRs0KV7K?H*eg$dFzH{In72RsDxn<{_>Zqm3yen)0o7d-T!j z#_C3Yy_3eHxDi?&&X?z>o;)$T*z~G_Q3;Ah0U0=E#&(Zx4iK*_Rpw4Yw~|p|Z-k&> zS{R!T)*q~1yPm|k=etN#G&y9H0|OZbM%`YEll-w$k393tldkKXzxc(ke);R+XgD)J zx3RHRuQ$H>%FE|JKbMS#-}q2ccy<8|x2Rt&Zb3*Va}Up_Xl@aS~^=TA#`ZF_0ltg_PtGC$Wq9blpEP*Te|+ zM{#X>@hh*s@zmL~2%=FOGYT4wsl&sA4?p@a2&>gE>(6-MRFpDg8jk5;glQIc+k35wfCww7a*ncyuw#Qiu%g&krFqAhe-j0&GF#0PJyS=ge~a z%HhGm=bwE70PzAlkNduBEiNwPStitSq?m*AEGH=?IY(5kdWBq@agpS~fs!2oFg|P4 zAgm5>2q+K)=i;RzWtOP|f7Ad1)#gYah6>0O%3W55m1wezAO)N~qlr<<1ksm|r%Ev4!^I_snvHe7+K5aK z&XRjPNkZ4+EeC)w4G~8IYQ2X2d*~>HZ7o zx1$$rg8!+(7j+kN21@hn(&@060}LF570Pw8Bp4eo$-9n~VlO@xWa%pi<)4>ug}~%h zf2gEelmO{F&q0(XNt)#hc&=XwE0$$Z2&phM6~F|Nc5t{DjTy~(nk0D|hrW06#IZAv zp8|kEjD^~OLWD@3ciM;Vy!~#PB@h{<68p**S5{V5T-TBL>S>yeio=nj;`<^7h*pEC zHc57el+rBElO#*x2m%o2*@Fk0H*eh<3}VM|v0)JLZVlmV701y`bB-ezMT1KhE|>@j z4I^}Hw=pvlRKqMzyRCMbCX6y+JW2dYWp;MHUZ29IN%DL&8pZLb68M&BPER*iR*o44 z4uc>Js~>*w;oknfVS9#!-+$-L#~*t%PSQM2L|PIukh!tBnI_4xW5+Q@Nt!Amj1t1h zJzsIV8>UGJyLbQY7Z)#$`hyo8IpM*AuhUC-Ld-t~5$Cu_#EKD`3wq+8}wGGR`!ir1wGuSXw3b#7R`pD+h z<;v_y%c~KD+wI=f)$2QZd#>Y}hQ$Fz!WK<#v#{{&91VI)M`mC7%2yT^7w&#}@2CIp zv-=MoR4X;xvni!f6!&|h`MH@|t%41_y|uHwvr8x)MhPSA-rc)P$BuscJKr$?v|VRo za|>|RXiVj~2<#GDu(j1|5E&-Iw{Bg}^V~G8IEjYCtT{86Q<7&fO=Cn;*I=_Xw^UTLsEO8MPgE{lNp%#9=igIg^YC2#{c7 z83K2AA+{NGAadQH`sLlbmoI%`yAH-?F-YY@&$Ev#E#+w{P%J1CUvJf|wNM-MAnO<5W=NcN6gxpIBFb4A-x6djI>vLp~w zRGcK969j=L9IAzVe92tZbxFU3@&C|4C-5Okvz87k*iTL?0Ll-3k#-cmXL0lY@wT; z3Bx9B1yT|zG)g_rQ-p9FvL{rnrB8`2NnrAIKQsUf2VQYdrczBM+3K)_vGo>N6$mi# zqRXLuVqz`5LiF@46cPvm$FhN5mMPMgUjBlyatVO(01wKq7*i3(%(;oUWF&ZLGE{_9 z!AmQ?tkdhcp7(?A{m~D8@Pi<5;%L}vx4-=I-p=msL92EC!o}Nn?o!H+9$l)}t5l>% zh-E{`SmTqM>heZ|({Y1uXd zeD(S@z`&!YP9;ff7zl_`Z98_a-^bXPot>dMkz{t)b^(H$8yiO!7n3v{jRtX?;Nr5w zl2M|rm3+)0(EKcjkYSn_8%X+YRBOTF;(~3Oy-s%&MTQVcnWn*uJ1}>IMs{=kL8oD zJO@H_@rz4$?%sm{JoUtx?|<*x^Ru(V;YiTjusAW%g9rCb%Q(J#TnIUc68EVGUVHpY zD^5Z&f^)Mor_Y=T!*K1&>PH`a6erP9r(8S(u*&A?Uh%sY5eqOKl|xVewJi;bGnHk$SL8J2Yzt- z&h5Yt!)o}mpZ%OMJ~KPFySvvP40d*QXXoZ$`Rdnv*OjM!#SeFOwrkazG%_>{qtofO zS{>WAAw=D7uPDG6GftB%haC31`xxX?KANkb#p$YTIeYyiLGDYhz5V?k{;S7MpC*LH zQ3N=5JFo2%g2TMokWO2N_Kq%TYHR zLUBsl?crl*p8QY$(|?|wo$a(co))9v|{c7v* zaJo?meLu+(Who@7L)tfoauNjI?%uX9$0Vr*MOcAhT%0yV<7(NCvv&2$jT>uT;1+*I znSmgusc9Ge1TF4{T#8qKz^)+TGI9yXluyp&@==AZL#9p_RFY|c;238>dNQj=nU7D~ z(k-i;ctA-Z(vi^|Pe@*+EJoQ<^5OuoY|CPbz&JKZC~bjDJas%NY9=)-(_#U9$hQkB z-l<5;G)w~v(hQU$8Z?%m!;-JfoTWvFC&MRnY@Jd~je+qA&C#Uu#sp%h#l#92 zD91^|Fz~|Myk(l27lz8eq{&m9tFaW6ei#!3rcx6-zT9J3t^D|~03l^6zRDSbU|bZ{ zJ{ST{2+stiThgqg0awXy)_h+8Ckv$dq2*Xz7Eb-qKa^>&2f=DaxAOHK?Le%5KJNe6Al$^<+rz zc+0ZnvRej{u~HlbMRwi9Dp``}#Zrxr%b6N>OT8FZYHmHCi?J3;-we(e2GF%_&vhB6 z!@(dLjF50qFbz{B14+`Nu%Hr^y|_sRgW-{-qpoXnDog=IYi-;1_V)IP6Dxo-!S%zG zu}Y&pCqNjUigrFh#wHOtp78#HTZ=q_nGCk7(oVPn|6B)uU zFFm!glGF6yaGz7|hJo$5^Ye@KdQDl%G2R>WyWOs3n$6j!W!rh4ixvSALOShMyLFhP zv1M77Yde;k=h^)HOt;&;bMwxEFL9=0P&D;h8k`iD(tu!Ye(v;{GoI&ve(~a`pMDmn@%+LF4yF^}~ zG0vp@7b(KP_HfY5&8aqZdnv>a_!e+%WEiFpIT|AT2dmYi9MTcW^4zhE=}Kj^yZOtX z{B*BJyr~(8jgqA*uRS)5ey^3qqeoAjdiAxhE-cPny}J6BfBB=kckfM4Hyp< z7&^DN*H0Wj%1A2UHDSHagt?Avp(({?@mP)egD?mfp~YmTgPZF z5LU!GOrWn;T1{6&2RiV(L6iql~B+E&jGfEZd zu`~=EpS1v#R*X8iRux^Sm?ZL$L5h`H+E5@j^Y6Ou`^0Kf_MmdL>Zlhz$#;VdUNCD@o? zDvc9;;F##8ab(CbHt^iSoM1th0wXxlU}*J?oQ{z8ODc;LL)ux9D}5N8oI@4N4s=Sp zwEs{k5>%oKd zd-oq4w)!`2++Mx9+UxXo_jc!IXB&-XmZs_&19fNc@q0v)D+S@0g#gOMfU1LX`N3o^ z70>`I#>lcQalb3dn`S$gM03rJ*S?0zCktwuO3jOw3I?@ZmGPTQaww&BPVp@STLCe~ zs1P_hjtwy?4${5DJWov1upLX7?h0>9(ZDldh71vAjGs8ROtM@?G&0J4&+oRomTk_> z&SiNnPyv}^k9K$Ws@1w^V@p20bc1G^rYQvza!gRVwxT&g$iOl~p{VJM5{%K}!rbii z%*Oi0$zx03`~JUp^wE=zsXC{05JiSzO5K{{d$V(MfgcD&n^Q{T(Wuku*p@xhoN+uq zNwZuqp)iE4cAFA1Gq*s6A{J0~xWCu!_0F7m?EByQqs95TUauz}3#^`S0D9f-!s4Q7 zSV@wIheaO7sPvR7n=QHj(PU?ls7^A3;N1Mena3ZuZ0DnoKl|j9kCQlET3V=7szhX~ zYDS`rpe_e$afjO>_GfczYQU@*IMB3R%fxEeFRVnBM>8z?IK%P$`k*_!@Zl$0w{FZe z!rfL6)fRJTAhipWComfHyN{ea@&0@7tUPkEKj{DcPk#Er?|x@FPHn12#QJcoi4dd& z!?Y~NVT5(s?QXZfv$JQ}&I`}KxU#YmguZRtSOOj5esw)}cV{=OR*T;uWMgyFvR$DG z!Gpmd8jVcTWQ31KL(%&gX_~cKUB5E@_%kp3@xT2y@4WqvWt!1wC?1*OW!I*rHaB)Y z{`jL>ylO)9uGD;oSH7w(A|Mu@b`28QkuKsY;9`V4{ohpYt!WMS6^9v@~KaMf6gIBx6{Fp z9+{s>qLK8YkXiY9Amfy>FbEG1TDFX96b`0ppGcW$xs>s9=P&d|Bi9eIj7VXMysbzc zyN*+@)P)R5BpZm3UZG!7&$J9(Fiea^0pXMu_lZ$V!a`RoOj}jvSgCkK8eW>D$f!^R zD3LRLTtOYqBRH@~htfd(T~yjPXWTR_(=wF90VoZHO9m1sCr@3_pvp=Ir3sHzmMMQ) zWiTW)tR)dyTs|=k8{(sI0jp$g|%A*+KsfMr{{q#=cA zs4XZgKWhlaV8`T+xZGhtt(Gd)LE2)ixSxK}_vTSvA zZE;~iWvS>OPVq3y9W~NjI-ih9Lm&uB;-nFDXAChi13wt{`@`Yr?YF=F&O7gL#`?W( zp68WHMJiZGngPI*EEx@lK@c>X)4msC2vd^LoD2uU;jnMnPNUg$TsKY=N||MtL0D@v znnDx-UEA^;>&-Xcc=5#-NS-H2WC&|)@gXwL3oc!{eCO`HBS)8lz-N@E8BsT;WNdH^ z@M&UyDL2$b5^=@}Ng)Ia3k#1w`GjfO7cN}*;CH`ElWb|}NTpgygn)j+-cL3E@|G^1 zV9Q0`OpGf1947=J!xqaaij>C!+{)5^znpuvuxwW;izS-;bjvhVs z-1E=R&dxZV=ei!2Scj+rj1tdthl637BvbYJ-oZh;+chnlF=`?+8VyFnzKIPEc%J2^ zVf1>vTCMu#*Wdcix4--P>#rU?x;X6j2%*?80APk;1b+C%rHeOi+*({bVwhN5D9mVH zt=A7)oj?Ec|91cW`c!iYLwp@BlFoIuECk5J zR=3*?Dn2Dd)g#Jm#~Ve-g)c4>04>MOb0Y9nfhvgq%d@N!2A<~@uS(`{aUm9hRGcGB zvD2kL0Rtlb3nKutEG232CZJM3$WjL$+VhoT&X~2SPElb+qvi>w_lB}Qi#tRc2amr| z@#UsfjKKOfA1hd)Hf<Xp-SuK1b?pYyQl5E(c(|ECwagsAfV2uz~RW{DNhf08UPT3X2}= zrSyIqf(c-64BSqxUdLlA7;l5c`)1OMf@7heg%HQ_D9cOcs>}|Q^$a~M?1v@2yHq%j z-@Zz10*x% z==b{d`t%?E@L{t#_5L@$v3hl_HyC|>{^IrPH=`)t+S-WY=*Z%t=ed+IL%1ktrw%pd zlnYnch4F{XFURW$Fh<$A&LN4qT%Sm#Va@N+`V*p4Iw-;GZO}3o+pRbKwU`(qVSIsdFCY(3`U?k5C z1Q(AioH~8lvYiW`U;OO{zaB=TW5*6peoW`#)Ux;>y)4 zS5BNf>HB_`ro~Mm?i6`KAQ`$Q=O)f<$IP;HYkT{dr=L50=5!baw(oeZUsMICBa*}y zQ_4Kw+u7QhYEIudGqV9$H_2? z2igC})q91>mEHG&C*54RItQSEMw);)nH&z&3^Tfmm;q)67-S4$BXsVrTy^WF6ZX63oO`RVur-1jKzG%x zd(S`oQWzCWCAoB=p661^PrrV;-EGa!Ei%felr|v*s@2+s%UA#NpZ|H1@N&7Fgu_N- zn^9^IBc?n~1P9nHR7&L5ZqG6Tr;S4K;fOkD~gCMXJqf-;r*m5F~x>rgnV zMVbCZ^L+EF!KE*F`m`}+GnWr_P!pBqeapdU*h-r=%d)r_lh}-k;26Fr^7$$s4drx* zL_RxZGEs$^=ObWNyMzuDQZ<1PGmOJ1iis4Ef$U*|8Jw&!*i7MzbZda}NnDFlN58b+ zRi2^?;rMK;#~Ff&D!^n!FVjCW3pjk_d*%f$TWzDUnShtd0 z&HVG!f`9Fd0y7&IkdKB4YQJ1Xa3k38gJIVXf-rjXjW;^IuJ6ZZ&%UFu!`+?jQn9dS zVIjQ;jOlPL1V=Q%bcv!-|@WU%GsI&NnOe=3r8BB%uH%@zpmKY>RFU4)+nM07jD7Z-QFJbyPoH` z1rHLYIQETotqA)BJJ;y6Jt|t>LL>x!GPFpZAGd)wS*Km5b&?g@| z`1P-R`Ov}rK`>0h7|HD*#6+9qaPE19bLYc2y}!EA+HCY6uCDH}77#;$c{{EunKy)4Sb-&_eKj zJMgCWO3MhTcH-PCc)L5h1+Tz`@Lb1rT*ieA7UnPubcaX_Owx`>hH@5*MFNcjhYs3~ zW7?KwIfO_ve?^4JByoZX+qV0D-yizjPLCj!hmpR8Cz@>hg(yxcm106^tJMjD*!A2}skptpbNcj~hH2I(Ce!`^Bfz;KiO@g($MMv~VjzF$_qzimT}spnDXqd#+DfI5SNgCsP6173 z>yu^TUVY~Z9r9qe<=SL-XVY_ydaV>kLH2=iO$U)Dl;EOJENtzp%N>cZZEtg{arNe1 zw^&R&56S_D(g8IszYy6B7O}lBGe2K+084y%E-}ujv`$WhUy5rXD`-PG>Z%pH$fQJL zKK)2LZ)D?;20`-?Q;hb$`7%{kwd`=nJw()uA$RpM!YDgTKpr^&a#%Tg==5dFy^F^Q z$XUG*qXAX7E^^y0(CBpmk?~az z^*F`Vc9Fp!<3<3ch#G zLZw!tar)4pY&swNd71b~A2o0c=hic>zHxZ=@u=denr+R07An3KLu3#`soZ4Mg+hgW zX)K8ASWd1o3e>R*1!rK)u#Tr~Ggo{tq4Z@ydTR;o2{&3&1EtlH^eWCVL}3s!!Tar2 zdv}M?*dGq!C~^yhYJGy3M&Iu@wzk{NUB=n;++3&Esgz68Gc$4eFi6Rs;I?HqcAJjt zOib1jN)doGVZ~CR)$OjXuI*V`jKg6Lh^i}x)Kj2*WX6yyS@WQ6J5dtVLwS?#)Y)60x(<4s6O2=NIDuKG&3`O_|WpcrG1|3wA<}gvq{sV&@ENUHg((gsQgn>aE|ytpubFAL`jq3iQ4%4HIb)9NVnY7n+kbuT+=co? zT`=D3c80!BFkw{0j2o`!6wxo{lYcI?piH@7yzC^jrduJ`2qBW*gRDgq)%Kd4kgb>3tF-d0;(=>^J8I^PlmBkH4P%g-8W=&QKAG0M!^X%TfKvkjyoS= z)uzs}ERfT$a~^%xE`iY`p$XqP^<0HXBADMzdaoh0d>iBnY{t25S-wAH0PS7c2N>Pm z-e5_zchBPF#3YvvGE&!(t*qgw!Be*}f*InQGZHjA8fcP2ZX-5gTnWvAmJgAt(+DEN zG#;_&mRl+nFsC?F%0E^XT;)-!jc`P^&(8c-rB0tio$9X`)Vdc?Er_Bus|F!`!ZAk8 z#%>gam2v?S#AqTD_~XG~ARwyN>(xq?CX^;o82FWH#d6$1w|DTsGSewrK&na8$7Ew; zbNRqBrHPv3Bbv<4&Ypey-KptGix@y#QG#ssjg*J1>S&ST2Xa9OG7Mv5V{>rZ*g$}AlTg9jp7I! z#4xR5sa&p9FhOAu%r7oJ`NWftKXyb2o=_UcF-<6zDr1y&o0#C3($`*lb91|~v)lao z@B9-+#rnh5UZ>M(cRRh_!>ygwja|oaXJ@8ONt4zBf&4)b`PL~nu}ga?DFNq`g<@&X-aUk%I7uX5Cmnv25wilwY}2q!dv#;$^tsDh zP2XV2l$8(~sK_O*_l?;>Czxy5_qKcX^d1hfFfPFz$6i}qgP0^yVp@h$*=dg<^^gHQ z+sbW?;d*YP(Rk;bcc*4%rlx0w0MbxTVL(bxrWg*K5Nw%ttJS{#{`-bun5M}&w+s@; z(dOpblTSSMZ~y3zUU}t}Vc`42fwXT=ue>z1O+3$;nV!9P>B7U+)%k_RwDA%Y0!$ez zl`6e{|4;v)KYRFatzNCgNi-PrfP%nj8qvwJSw03WK$c^>(|Rz6Qrp zj&+hb4w33*kX-O1L2EuUOmNS~H30wA(Za_U>7TBVXAS zjXEvm#FWr#weAmt2Wwkv>)VB51wbUzka_xCaf$n4i;JRFSir(i}w)0|UY3O^LHT8dIyZv=XN0hBkA|YZ}PM0U0Pa0{kQ+H?v^SNdj>EOoVXE z=}C;%dTP_E@-9^Y&LPK~@RJXAFk1y?9{6J9jjXGcVv<3GRGbWk8BKFEBPSKPWpeFrj=s>`Mx(h#&YmK@03K=3gz!L*E++o z&Rh@J>hMZ`Phh=T<1~r2^C46Se)z`xJiH>voekHcZ2IoG|dyX2@|&+w=zm z^^{Ic&ve_}YNb3iITc5tj6C9uCAMjAZEY0_UaeM%;}8OvQ095Xp+CI8a&LM0KomuK z8G$nIc*)*VA==@`$n=Z??@2=dte(gr3R{7$WzVP^w!_PkR)S<&iI_>tx>e`^$^!>2a z^Y1=f+uYtMdZn4k34)QdWzG68MIn}BYcBhcub(4CT(^Kt((n1VZr*wA*RTEj=Rd!9 z?>+#qUYqLl25+4`bMx-asmaOt#d(z0g&2XfCs3T^Vxi~{hG*Y?_v(%Jg+N}h!~y2r z?Fn0&IY>XojCa5R0*teQX|{*a06Au%nvP?#<1tJl42C;9yRPf@`@QL@NepxROu#&x z1VGnyDW&hdcj4Xl&iA_AqeqXIt7UDqt7tLu*I9@BI09{lTDIt{SF+ z5Nxy>2*7{*&2RkPx4z}MZoAW#e55SEQkpD#o*VeVt3UZ^LgT5~*)WWCbPE^t+Qg09 zxBlaQ`hSxs_KF@&lA-VWewYXVF)5X*0KqV(mSt6nWsJnm_U6{sHfNkzwqZMj7}+pMOjcdTW=W!82ce-P zL9ppM1(Q;B-v7ZdE^Fp~qfS{_ z+L11`NS)|l^etd+mnFCHe}2T8x~YN5rXo#)V*PH4IS3P#eX|XXZ|T3ykp?3pykD z!n~rw5yG2UAj7e>^N0(jzmip{%s@=4ROG_hG)+xO7@J2krwm9;!?rAfF_XU(yqv!x zU28QCtnHXbZ!=rdjyfYC#xH~ZTiN`V-c_avb9Ou!!_?F)FD14xqggBJyvR#rmhLfj zWrVJqnS~0$m{=x3m{V3R6^aFKqF%Kvi_%0JP#|oWreT}QbPSQ3$EYq35lkd;T551P*TiKZbRKjjRa)%q;!NzyTSmQ1J? z@7d{}evt#tXj+Kq5@+=cfDE`;b z58ACJ0I*uCdIeXtrbb$nkv!1#^9&)JoT$yt&LnZv+TD%AczR~u^~ybeXj(Qg%wZ7U zytVRh^&uwK^whL%S&|;hrD&K<)F+k?9N4>OPq|d!Nyr(UoSAvE1%jNRUcH`{ZZ?CU!Oi$0u&&&z{Xp-2Dg9*8M<=R_k&JKg9 zR4OBcXv~OPiu;`c2y7&Gq?xu@%V&KHLu_m zE0rjWl(^g?R;5z;)vtg3-S2(RaU9FCDW$z$uh;hhB#u|IY%hvqj7X(awp`l}g01z9 zPOF75F>KdyT$4BeU;!aPL>(9sbbu1z?;lq8Ma&HelLaF&29@!K+O$1Wt4udZ&~c>i{@*)~iEV#1{hJ(B^7=_o8G?`^Qi4hd(32?#`2j5bfpY*g!-BXT>R`^Hg5zi+)NF5H7-^+Y zJd81vB`>$x*qjpw@;?~;9gsO4Ba|0vl(QK1W;>mF<0PFKkj`w^i4SrSi&Y;01f^^Y zM^+ojEJYrU2GtR2JGQIW;@{Eh&uFsxt;@ri5Ij3OW2oSWJj!?sZGj_u#th7TG?OR$ z)+n>x9Kn$QrBiR(6+$#Nm}b{}%*H|~%1y&m{A6k8$Wi{Yg=Vmee1S1)bYSM9q6_5s z;wBeME3${aAP7nsQU)5R$r+9ydoZG00mX(JgWn+-y_M|3%A7Un3@p;=Ha()bE=fyE(86o^D+oVy-vPh0b0c%4|-$} zm3E~i{#pR6abLZOmhR}%`btU#B~cPFt%6W3K=!j#AhMdexj>8Z&H2r*0RUJ?W$0FW|Pt<;i)%0ehi)2dHQHg=mc zGt=c#K??F<+Osq2y58FQda+cf)oYRt4LE0Rp^&iT{=IwqmzLrrlnX!&1}iz1VHnsj zH`X_HcD9%I?R)ZxCk;%7!yrzl-cZ_}@VsS52p~*`zTaxKDW%0yvEUU{iIb~iwOGXv zAdCq{NLmSC#<*=52bK@`VdNAmwpXO-RFcF&AY=wbsZxy@xOZ>;!TpC2p{c29*K?(< zL3-I8$2JHa`u*Y1Cn!DdI7_ByCZB!b`9qIAJ`BT$ckgz0wt|GU{OJDLcDvIlmrE11 z8U!Lq(!m{LWSWNSx&|SQX6yYMH-7ocU;X?Szq)q)=AhRjrfIuQ97cgZn4X&a=*u5B zEpvNwlTlu)P1&xuzPj=D+vi&C=KS2;^vvAm*4F7a-h8;aS}2t)(_&2Db3!tqg*LIt-XK&rUjW99|lMvKuw}ate z@7{%f`aA#lv!D4Cgu?fI*(d456%`(8S+?zZ7cX77aN*+A?5t^<>D`48rOa~+K=8l* zo4+~z)|qOxh7k^jL95w{BI*`PcA=P1&JtEAdBt*(GSO-GyS*NS*syGj2uh1zdNM1Y zHMw*~nrVk1O=5&ZrCKgk%LL;jW}R-&_XCJbY`W!Yt=Vnt`^1NR1MRNdu?gw6S_VP0 zGgEOG8kT8W&cKiE-QT!z`$4naL)bu=M3fQJV3cv5$gUeQfhon9)Bv=nCJK{Po&>u{ zBy!nEB`zTVUR{Nnr9u1`)*eepNHT%VZW zT=cvBUcW~rB5M%CvP^6m0s_hy6Ab2@*^vw{rZMl|A#0*fBOR`cQxAjoCwTELW*^Yju(ut~+KK{S%WjPa+_|6l|R!y*Jr zWj56b1!$a`l;hLcga^T+w5@y+)@x%p`Z`cCLg@rNJ2PjRhO8p_NSS9FW()c}N_GT& z=Bs~=Q)aa?Z8OyeM$#KFa|jzZjml)ZAfs;Sq9UcGwryFm3{y&Zrf8GYUXY#jAg3wi zF9POf1!FvKy*wD9*m|36S|$Q0Us8kYh2&?q-i*K;3x|p-4aOjd{B}?(SS-~(iZC+j z*|OaQ8rvSgF+MzJ>E)Gb90LfDP$tG)yt9?_$hdr5Yzy@MN7-(uA()H2VyluXCtw2; zu0ueznkWm5U6T1~@T%agRNH&ZKc^%tc4L{TH<%Oe;``D~YoanU@*EES6-1d-0T(oS+f z#n@pCrF2k^!a!h%y<+M1%7Y;0#d3{v9)Jv4`agsQR;{+;m{AmaBk}i zwFNl+=GVXWt>62d*_oMcuO~Ri2xSyW)i}UXu{7xWr{8#edwY9!ZiaEes6YTy#>?gM zPGjdk{-^)^aCLR6K9M9zuh(mLdzNKYYgGu1a2VOPGci#&FzNOBZRv9fFp>-uY!X8< zTGI21CJbX>8U&?HIOHM`oRx}&T5ZBG97@43jKZNWg_h>jG-M&|JoQ?I>*|Y&IwcEX$cOIeB4sA5G?E+|D16)3Z2 zXREW*MjY%&#Fz0*;ExFqg7w<%VxjPv&wcupPrPiKcB|Er8dUMxYrj5o=FH03xgN1vRXpG^|h?{@uuFQy40rek}SVFHX8WrFdM2_4V0NpM6{hPjcS z+E8azPUP!Cfq_6;KE#D22$@{2vOp$^%*1jU_RZMXS$>hC;R28gMO395!yeU-mXRz; zq8$-3yii$Hi|nu-s~^fH2$`lyuptjd21b!b5(7k|q(2D8r`G(UjA>>@l~-j4q(=&o zEa*8oZs&iVBj@>F&qmkWn^^y~F(NS3!BYrhBYk$rh<6He(X|-;(|n1acLy5qReuAe zv#^Yj=ah=k+sMG>5%pu#ZK&<7Ow3}=K*)6_d-nDMvdYeZTx3qWP-bKda-Q8_QS*cQ|3AnX#@BYJ82ta*u(lQO2M2Ympv~1IMtT>7M z!N5odJ~N47iMzWK76Y6r5s`}8034vS7iErV2E(8YJhN0| zaz&p`pQaTC!A@h>bG=@-J2N}$dfw{#=C5BrefRzY({UCT_Z&NRY|q}kwq;AiDy_Z> z)-X-eGVOa0?!WfN8yg$zw&P*xB^nNg+nXDwP8|LB|L)&@=*1VpAc*1!V||9GRU_rx zbqls>zVq(8Z@hlmb)9-zVyTL|<^WVH)k~Ky{l#DWC1tcyD*OJh-RdTcS1Wbfar{9f z0I1Y!g;HTS4AN0M2qm*GeNzhSkXmLaceUxnp2TT=v@L^1v28o`iMr!@0vJ(3hkigg zOCNK`u2yP=LPecQ2Eh-z+j~C!!TRAtw|?;k91H+ps}CQ<5xsYRGiJzi3xp6#6Kzw; znGD-7Bx66Vv5aE?-GrHoi?egncI5A1Ao-Gl2__JM1_r%eN3i%qFMjYVU-{D9+-$eo zi{hwKsc!G={OIq02m$=s*S|J9JKOJdIi*n;Cp_^A-rl`?o_^}olTRM4PfWx~(rPpZ z{T>iNa=#sjWEtj)yQg=C+OGh~)gZ{E!P()NMHwJv&!N~`T-o#qXc)va3@yo2haMC; zln%yC@H1L21i9Ba%!RYrW>xEaWt>7f^&+i`QiTZRV;LODSwx2EWOERgCBrg_K^W(h zX(wMDwIjw*XfURL1z^k(1m<~(0FHu^g!F5|v$M0rG_=d4KI~!cHjz)gV$7*8( zpiqJI{*xQ$3=JG%y u)#;6Lit_mC9*)XuhWeV8<=D2eDpX{je6H8}F-;2q;~?~S zvjNB6Kt4TNrUi7k5zMYshBJeaZ`gSIp{*{m1gE@dN_!21=r3uv%gnF{DH3;MjqBIG)kM*cIo$-7T}SU1_wFE zN|LYiw^IF+U?Pk4W*2$-wT;bT5Ml-K6AW=WHl?#B5JSIjV5F=i zrQC?oB$=O|OQJ|b6>@K~A1H_J!a0><3FJrhk!E<4LkA&Mc%X1)}Lj)r0QX1 z+D4LiuC>+VVrKKguw&OT$(PT;(DV9n<`{_@A_`@F+3q=DP?N-P4 z1Fu*r7RzBA4TG>$E?4W7n6Xx?)9dwxU{ceo&OfAqHKajsgb^mlw$0(74e`jJ#olmi8{q&v>D~3jtMngtS34a5(h+e&>nD4}bj|zjgHJ z6T=`F4hD|nSdR7DYp{&EyYVH6VSRERM~@?lKB7Kf&3EiEmbIClKR zv19dGJ&NOIt2r195JFzTBk5eO&lCi+QA+A8)DeX;AAg-bgvRY8xY|uC1(884<(mso zUL`esSxpT9ji*0k``593a6Ue%(i=-FO$E=1v7sgNG-+2T(skz0ghX1y((xq>qc~P&I473tf-O|egvbN+ zb!VQfF%*8Rpic~8u~^IuUGjgPH7!EH$T_=>i_Cmkr8&yy0AR&z%CNEQis;NjRi;J8 zMNrfpy(r---ahA4iG0tZ#Ow0(m(diAMNu5bQCetFrtC!;-PJZ!84jFL>$2^%a-vk4 zA!OK=!#U;o9}8{yuC58!-p))2sGwb;n<^ddFpB4p&~w_pN?^|K^=GFimiO(gl#6>7 z_Z)oU=sV{we&^eN$pQb+i!Xluv!9x%RJz^n+UDk&x6ZwH;X<$PBdlgtyId{-Z0t0f zLcoQEJ;Bg#?l#gR2?`doCr+HOO=mdtKlafNd1)z1AW~ONAPCl1SD%0Gsl~;`Fbs(# zms*aua&Kj8ef{K9r?xhC9z1+ltJRJ^@uX=Xf9NwR;yC73xOTxo3}{`s5^P=s^sxzkl=G`Acr8YB~1K_SXDN{lhPQU~*z& zkg%V={>~fc-aqpAp_iU|Y~OU<5V7FQw9K7m=knDX_a1HvLTuNIhr^)Xo0+aX`_##$ zJ&TOeD2^0}g|Q(x7!G=r3$G}%^9BL7J&et(7vB5Z?|rx1YJBwNkKeg-%eEcaoWM9v zhJ!)9Tt4~Kv17-M&dtnlz+~&sGG<{Wz<{V&D72d0({H}f?RJ};{%FKljZd8NY2-FyCUSgqCeFCRFtZ(pfcFr+gtRG^il&)AL)Ah>z+&ef~$Gn!bo zsScZVyOD(9r$7D5H^2FfiE6deY0DCZc-G^qC%#ZDM#JdzTc@`+Hw(qm)YP;x!9WmF z#%*Y#0j$(fh7^Wek9mLQNZOg9IDgugbw;zPDRJCMlL8MiDNK2U| zFF@iEEJ+|tpWMmG>1t(i5QGZom#zl}v1GNClc8z3o>Rbv-pF zj~C`gL3Xa=N35CmX`F zuuFXax}>BZCPu`xOv4~TKu)FU%edldeE*)+{4vjyJjn?t&XkfNfw9j7KJt&mXz&>U z-dgRW-myy-G8!st_L5GF|! z0UjSYbl}v9C##k8feDl3!o|x!_`wg3pE~)OPrY(z|5Bk??DqP%@2vd%AAWh^;*~gI z2tkvOdaX7+GXaFy-E9P6QmfT%+wli}5=8_dmL!}~+j2^kiXQ}&CVTfRBvGsbc>o~D z5P&zEt>yjuGD%NbcorA;KDd8xV`HQ5_n&<7iNl8v#&Hx3hcu>%qB|;Y0hw$A0BW~d zjaJLG-D1I$@x$1*>}IoZ_RQN5!Re`Kn$QexkOn3)g__EI3?kP%4*Q*9!ea2vn|B3kA2|>optA zNKVXHvN%xgYp7l85rTjqsVWqLC)_a1N~Hu5?sW&ASBWS`7+aPt*JMahR24zXkOX7X zFg@F8H`g7420I>+D%vJaPQQ@slU#X6FoyR4kyVS+X8*z%j~rJ2C^6n1*8-f@zmWh%zRQbm|2;l^Bkh0_WvPPT!oR-5#Y> zo3oB(Ch3Lnh+v)N7iQ~CJwu}$Zi0_a!J`QqVQiWv##qXRrA|8M8;E?fnrU{xX!|Rl z7p?;ZbR6OAjG3xRfQvsG5ycysSXvSh1A#=pv^- zAOtjfJx9`EzGBEX=>lVHTb3zZ7bv4T6%QyL5>)QSaC9X!Nj_i2!>kLiEfeHbQ-x7x zUZG&5@XB_?>hw_7{RF3dI#5}K0nd zo0egNs30k&dl8!R#xsj@kvJU^cvZO4xvKY8lp%F2UAWA~Y-PaQgVps};Fz0*M0 zJa_)WcmM16o2`~X42;m!WOZrZUdyt#w|6!-cOW(qS>K{f&} zC|m!GfG9)r9LME?zx~d+wY9Y{i~)kRT17p-Tn??3O7-TgTYvSPzwWeqh!|m<6bfFk zSY(v>!@w;Rs#Ztj5xazs?4+dVb z;&?^58pO(sQsxCC9WDidWms77UVGE;H67cUnV#u1TAU`$t@{M>B#FzVV*2E&)RXkv zGU>6NwvjT-!lkg>k4jU^FD^ayVxuECCyXKi(9rM3!@+Y;pZwa_zIgD!QW6dsi{<(h z09iq%z6-#A@$;Ycdi_^k`PAgZOdBUOd+G(!D5d3^{xdFoWb^<)%@VnJz>j6C)s3z^lMN`$dt z8emKx19K8|R&4UAR|YCW>2jqu2~d?D{qxmQLWtb?OIiEpo?JS^F+<~}97$h9%BWUy4OJIF9ON1U@kzhm20rQ}K8KlXe5>f}tVKHckemX{Vzo;n!}1H&My3&0pfet@8O z@k1Xl3^NLY_ujiCgm~uZrySSm^?Fq1)X1qfJy+5pP|rVT&>zHcXjrBUC%hJOiohDe82z6Pkf?Sa4Dm5Zf2bFVxeT3cy8{eCef^{`}kD zX|#IBjvsyLg=g!vN_+gsIzrDu*FdH%?f3n(O{&++w*_T~Fqn_D|P>>jK+ zPc2jyOD2nl>2plT`o_++>$ldob}ZYqEywo!$#@6@0|NXx2mrA7_EGU$( zk}AL!g6R+tM?%C*fMRXxz~jfyp1(ZkhwooGYZ92yXmN4Taa_jKu8XNLSRg?u_X9$l zeT`vx;`sB&UioZ)z>v?3evdZS{LMG_O!=Sv#IwtL=lx+1aB3Ka01Rlr8HQ2R?fR?h z8$lSFrd6(#i^Y=bx&#w07*pPO>ikVlIVIuEg=2b6n9VP$@-dmEZPaqSolM zQ_oHbP5+-f&R_f>uppn!GpTRRj>;xWn7dB{s4zL%BBf>6Psf5- zI@;ke#d6Ls*61nH8TtZ3Tr8I4U*Sr$oiprmA(n(Nxa`OgCWe%wFwJ+*_Z~cFNayuB zdjlh@HEoWOMdj;-CIFesuvFLNVgFoDzk2PX7sguW%hh#ZoTrUm94p5`^_lW~3eXs@ z`ln2qQW1$HNe3LY&DM-{u3{Oq4oP)O5}^?c$YEOv{G~56fN>lXC_eG>M~)wTOmKGm z*vU$*HW>PhiI_6iE1!Pj^y_cD*6H;cyPY5kae6Y+qU%2M^r^##58k|U=dCm68oMpW zb*r_CDLn@grs)x;ZJ5~Pl4>WE@(zGK`wmbU-0{+fUMM(T`d5kC*Qal4XM5vA&p%^O z|N6V94)zdm zK@@qOhcRN59zOEep~D9xZHTh;L=}$bcy8hS>$ku2SASWmmcQ}M-+ubk)BorH^?zTv za^(wO{Nl0WPY^;j+x~z3^?PfPvGmwu&p)~R*h~dQAz+FDPmp1E1;4)Cy>x$Tdux*f z?d6JlY+-V)2u0)@7z$*pZ|z*Uc4NEIvYmow7lwl_W#OR%`<^;}VrFKNCUF=whDdD${djjE}R6Xf(!XvMwi<~xrUd_;#@Y6ta} zCcP&aMZ~?@HrEPA@XUcINe~c>Nir&92m-zHRE%YWJg?AdwJu(|w7s+I*p6YO{Vrv+ z+1NdFVELc_-tQedeyl&}B~gM1%2rTZf^BJgWZ71dMDLxy*l0Ewg3Kl;(l+jog+6^fpXNR-4$!utJw!l-4raU4f6l{FVZk=w*dzd{vr zE#EjXh;14IiYST+L9XK(hRGQd*)^wI+p3)AlTEMLHy{0vOplJEI7%qc6^d&|$ULzk zTXZTE*RV`@^5n@v!OJbXGF6p!zT%vvH>C1Jk=+jc2ml_jW6oG4V;4Go*>MtuK^R4me4;ZBm7H;eDl+Q($TUodQAv}q z@=XZR)L9UH()p z%030IQxWt;uJd^_6&q)H8D^@ZR3NU<1TbZ&nEnWifNeR-z>lXzRsAUWylCpPZYET_ zpiCv@)Tor%P&$=I(=)SAKK>X+{Fzh7UwrX{jKesgK@1;dz{ncmo7LM<&N2ItOl_GC8;6{=@E=acg zy0_qz+O~J&_MIEI?znDYdu#KlQzvK=UcGXirf-dfK{z)%H#a}KZ+VaH*hw5C*^F3@ zXFKlp=GOPV|F>t~e*5dc_0_L`(2WPH`%G|MI zPk!);rD@k-5tSk55_3)8nMli`LAnvUvD>})u(7$_^1}AvGCsaopKu|FLyQqIj0bC* zm#^R2X?7gjH7#q{?*T^l?^}H8)bWM6**J*H(~E)mW^OexCT6tieHxlmKB0>-A)N0|nR!X%-I?b^0&NeB?;Q(>G$6SYbhM7M6Q z95{TEI0Z(jLXXqq1T&FDAP77miWUYC7;eF-)tq7(nHDyzU;g4(tM~6pq7|E2m@`Zh zFg@(3dW8T^7}*XMsvrL9hyV3&4JL3u6rur!@2xEl`kz=9b6%eYO?eZfS1b2cLMj9# z9W8ae!Rap|($`FTo!(Bf(dqS~Fg8r1oc^j53LYUuHNh&tN~?{=6f%mqqb?fP#~Khc zmgFN+sg@h9)_1@6Uu@Gx2%f)i&hPdN$11piUB4@h@hsYa-jCEJZA`v64l2B;@rzi190iQ(e*=NK{NPdL zE7#W`!+o_YHRC*rBO1kAei`L4LPFPL4mnC|D>qCF&&|y#|Ld%jB9JdpW#44TUuc9^ zgOM^xWRA(%1{cARa%o&!oT+_A`q*p&Nj@kRoN|Y-MK)7Ez8vLR%3q4*&wX)`wX??8ih*b|H-XCa@|*ETAhKoxt3dq z@g?|J-;gt@c-Fk?wBq?}yty0?#ZqN^YwOyzYqi>ByVahWu7BVIFYH}foSvFUYgWP#gs$rr z-164W?hk+X(?9(Wf9CtcKl(TS`U_wD?Do#qUw!8<0pMT#%2%f6W;y|V^~{x@zrR)4 z|HMnrKJn5M`|38~F@=yw>K_siOGn_ea}|u)2+dWB`)BHA0R#@OGQ68#ium@9Y$cg?hb)(~dI~>6DcIlIi9$N?IoN zX$63sd5Xni&mX+@+H2RYUZ0wrTwL0N5MF!m@cPv&y-vq*Jz^PvNn!!UK=5{}6^Fw( zid@%$7`0oiy?gg6ilq)*)z7z#KtTdq4(;tu8VStwNFy?f#Ggz8VkVl@w955_19|q# zN{-U%YZ|8IIGY=rr%%7Ry0&IXGg<_Z9|qla`}yZj{cr!vzk2DV4-A806h*T4(pr@4 zP~( zo+p=lv7ijdCs8`qp&%e)@rjrI&A)Jtc>w@ocUZi)`I0kud6|~b4vo4PXS;3e zD2z(~f%Ma%TuKTH1#fm{dU0W4W@^$hjef7cv9Y?nwbku*7~`g8OEBIb@^x~Z!Zxy( z0t#N!a9nzd*p7`5e)ZKK|K!zIU;g;ZU-`{1KmE+pFMjC7`T4mhj+>2Ex7&jtopY3F zf>P`n*t9Go&zDnf6}t8-mVf|^F)E`?G<^rboH;xavE~#VO@Yc`MwBJ!WH@hzp#nHI z&BAfVD-E!Ww5+-62#(yTvwL2J8zPe!#2}e%AQ(k8D!3acxiKKbz_T+mhGCAek3gR4 zmEL+p5&$#jL+y$)DkPcxmw1$sHX4ILHd1Rtkjy~?j5%p)3YW-PZeu(y9RZY8PxWOL zDL+PtOOI|-x~QZ*T{^_ET<@G+$=nqu?Xn-?TV+Ai7!$)Vv&nh1D28H`eyEkkdH%A{ zw1tcoAo6#edqYByL9KdA%(Gz{W-DiqQ=!BNPtWRbX1}3m*qMWd7J(~aKsv8dCc8bQ zKgz*o3L!#-sOeZC%F2UMyK}1jK>8q3O}1t#hA^Fq0MlGNn(#QH6O$8`iKnI~E?>G* zDwg`a;jKG&R@c_LolZijV;YPl+uPf%W-E$=>DlSO`@0{#efAxINToI*bGG#yt_j(h z$#n*13ntr4D1EjdCc|M^tW-?Pkp@F>W_pq!k@R+hwTsX0!Jm10PmP4}unPf0f)bdx zI3h_`&_p1MK|}5O1?QNM^A|5uE(o#Ihh8WYrzWS?w>MvS;kl1}>?0VXQmM#Tf)Vrz z1;_E$*SCNClb`?K?_a%k?fMHZJpYG(_^%EfIe6p7jlcc=4-PCJeB~3Lv}|W(tM%vq zaN(wJ9yxma6Hh;OY-!Gff>8kx0a9#|)&PvNKum-IR#(_VaK2VroT?XG$LHvFC%nBg z3=&rH3a*K198OfKhYs$q*Q?D&qt$Ggw&NCxyN%|x>o;~b8^uzwB2x+&rRn2IP-agD zRaAxy)N>#N@4oZy>#x0z4RiUx!BVl%*lAw5d})1c!?Y~RG64saGlB@h*dO)*XG@E- zPds_VBxrYMw@@erL!TJN-27ae)<2Rt`GT~7O7bc)T@egC*7p!o;a4J){ONv?Q`hyj zTLV~{V?bq|LdldAp6!KUeD2)&ix)33PHodtIl+zHor!AgfBYYQ|95}qA33(!>-F^d zlY^1LzXX0=&+W83Z@u-_a2QNZPfM>hp3bZgff4K_;+XE;yJvNEZRPF?K``=%!{M;m z>IFe;SsozvNR{ilDjGz!%uFVN3TQOD#_`|&?Zq#hTHW-GTU&>>w_dKWLynKaZO9XX)UrVj z92ry#Gr$jK2EEcZU6(aU9!}ek|BtLc53=jJ@5J!4-Tl6$_Z4UW4G;jq1t3L=lqiyt zNRc8biK5n-u|2M_J@(Y^m#R!vDydYel0TAEYW_@R5?9TP$DTN{#~NFfZP}tkikrj* zgg^i!KoEO38oj@M`@8E|Qui$PJvy)jl8r{cd+#~-e7DcSFvj&-eQ|MN|HAy(SdDYh zX}7mGw;S6#X_7z$EXTH82SGAA+65^gCAHH`u#un{i8<@ciVee zmb#96_uVHR``qUrIC*Mpyx!{#k~o%fwwkkJTaM*g^4g6n?66o9l(H<(7-cFPm%b}# zCasUj5t=J)c%M{Z?9Ik#Dg;CM6ENPs{ z00-sF#k5mdk$;?e;8f@bU>MewsIR3+?E>=Bntm9}M0rsPaiPVfg(=E)!&h!m4mji` z0veXW+@fsK3u8LW&746=Zm4VJN~9iN<;n%Z!S3P$Bs|Thk!;cC5&J)M%6VUJs$3|@vc1|k+FmW z%d%H)tzP)(^7zDboMhOxlw5#xeF3(OL(iF-n!IxP@`0rTcb_j3Kp8SdkVWVOd)dyS&-Ba(lbeYKAPiZ!SDB8;%h!Xif;B0^Yp2 zdg0Q?jb_^qLfdxxy$;QiLkIUi^xy+CQ0Yb=e-IbNqw|@B+r~K%# z<6*5b==X12y}o{D%W;WiIWo0k5MpTIEQ$O5&Vi-iwuX^B){*61>)>ndF?ar0l4byK z$FVSkSFc{b@ZpDPo_SsX1Va!Gx;>gFFMRE}fA$;yv|6e3dtK=uh~?5E-38JnozU~V z%a<=-y>e}Ayl&Y}p5?*_<>})TfFfcc6nNp!UU}vHGrz6`VNUaYx8Li>0u;|dC}kDN z_j9E7C6e?Yg0X^$;i8Nw{(mrtdV`K_yRPF)?KlO79)b;2L|}qdDn8`=&YkrvXF0>m z$L`CrJc-*7WEK+G!jAO$b8MT~1j$cBsQ6N)T1(RO^2b-tpFORh8584^2w`qI(6Vn2 zx&uTipMCm&`d_pCcF=D;RCA8th$Jn>GF;>(Dhp?d)uEjc457!oekzeda=o~5pW$kr z$2B*C69O$#JPrU+8q;R0xwEs~?zAZ9uItz9W3^h{_gzE~%Q+VmO3aAkdKMwSc=gqb z7e9RdtIs|1=p+4JpXMN*pcx~yfu&rvaYT}979O@V_r4rORDH`c@s;(qALP@%q62@8#RX zxTMi52rQH$g}juLE<4~Q?#cWSV3egvN?9({bfdT+E;zF+M+M+e>7D=piG>N$-B+O- z-=5`gmk7ysyA zM#kwXb}`QLEK8DvDIA32Xz^nCtJNxz7ASH%VuF<&DHp>zGbjZpxEaL*QCcx+I*}OZ z?TZpx4z+9~FnO0EO`GIN%PW_i1^~fOrMX1tafOKDM)67|h@6XmjJMK?lQK|4gehk< z%Vmd#st}J5vMig*c&kvXK++|pU#uDg%gU4&QJ3@b6U%OUk-pt?;>7yq_V)VPsfQkT z@Zrz=?B$hJ2K%Ub<5+`Zm5Ntb+fUpSr$kNX>vybk#57ZOhYhYMJU#>(2%bZre zjud*kwAz5PeQTUL^*b9o=gxhIE!Pi1d6%p>$`}w*>Wb&t?DW*e`W=j|G|f++Ig2ct zGd@udzxmDQ@4x@PIF3)Bem9MhhaY}8s8+Xo$=|$t;c}Br9Xx*TT}zK0-CsdeP+r`P zKnCOvi{szm_JKw`aLwJ8;6|mIju8}=wUgu**PBDggxH$X!zxOXrJ#ebiYqOl$mZfEFBuCNApCkeq zlXK@U?C$PPPE9kGYmFJDKnrzF${548<#_&&{_3yKoc*9$t;KQN>GT1>uIoWqteM0o zI*wy`j^{cSwv=fwRxAe#+qP|GS=QWZa>l)i2LYCTl*kO6q_!BqN?g4>fATbCG)>a1 zALR@C4iO78p4dbR)?z}iI&z9Vj&Tu>13#c#tgWwix_#gE&!0WbX$}A!pO_G(q%1^v zmZveTRQLN+4?Xsse|qem=_5hk7j2%!I%vq&f_xw3;uI^vR9ylg#Hx>LSj?)gpa!Hv zw;)i`O-)54D-nz&#MvU0=G|VmvDez(ZT9*-##tDK<6{%GdeyeUNJ_>(Ng1Vi zrc@@1b3-Rh#uLv#d4^D3h1cQ&p^>>?*)P>NSttxh5t`CUD-sUjKAJJB^_~m{3xX2x zU!t1JDsWhD%aj!W<1wdV3S%@Wj^+%AV)cb!w(Y=E51#Tok1?(WByxt#r0k#KKT3!U zFv+K`K9R`<$_b_BE36kTwW2(PLgQN5ZaLolQ1)fdn!^IFxEhO7S zemrHIW=YP9`W9mZG1j{lK?zip6dehzEN)#IH8BMZQ%cdglcEtfLWudfnZaN{IdAQ? z4&8OUTCa7tH`lkv+ht}Dvw|{!!TGOALTRQxudk@_^KLKejg<^_uQ$$#u zK4AeFk}D#Et>hsXZgo+X2$=~0W&K^ej);(r-r)T0or@ctZo55;;*&GsJqvXYbtBTb_1-5txZv1CP>np<0jDzu*Gx_9oZ|J_f1 z^6+Or%NWn{6a&np))3@K;NrEVG_xHSLiGRq;6GoycsU3w{V0y(#Bvf`@A(*7n;RQDjRwS)7X)GGe{$h`b9WmOGCnb> zjtELwzaJq%7Uq}kzUTf&9{Jpn$}Q~ z0m|H+F)Dy^Uc#z7R>nfDiKU@WT*HPmaN1~AnlYh~J{FqXinv-wp=(2fZYZ4-J`G|T za)Zo&sgR}B0Y{wa5gei4lxkRp~q9d!tX{|AiHvJjsF zWqn$tnhQ88o~SxE2qDjNUB|Jd<&a+_Uw#oX(v(UIJOH_jP*~+b2xzknt?&Vd6KF7m zWNU*bL$_Aoso{)32WXX)3zKzmQ|fEInNR6{axEin5LqUz<67WHln)sh4{O7>Q9)a6 zs8Y&CXq8!n5XKT1pXZ#)B3R?RwCFQ~%p^w8v`n?bQnBTc%1Z#kex=%Iv>>-gP+Q!8 zpt-e?WLe<(MZrpN%5uP|;9?LDq9i7W2sq?6n_6E1&AAX1K{2X4!bfD*C7T^0AuNkT zanxhlMfJ9TBPk*3*ny+R-tlol@_QrU@yghRnxm{n2ch(Q#k zPFO#%d?@sTUauENF_!ki()g0wmeuL?KK$sDshLF%Se_2P@xoVLeBt?8z4GzJix)3` zc;du~W5@4lbhE#G|Kp$D>ZCJ=PaHe)wFeL1Ju}W}CL};sKp9mv9!DO15^h@Lo{~Tc zjWLQ!sGwAIPVHu@Oh$x47Br)fMhJ$dx5BVp+8 z?riTh8kJfdTh8j*?cJT-!-o(5>fLv5-`TKj$8+7l_s{o>oD_wl zA$gv4TFozf;ZX?a`EzHdr>FMq+efoJ%X1{IqyKQ_$~7+ty8V96nCp4AYlpr!F*!LmH$Oi=H$F94tJXZ% z_dVCKZ7k8IQisb;lXQ1yhci*B)ey!^G0G4EBVaSh$U#b<6hcE#lwdeZO5$@yA>cFf z^HPTf=QOiyf-nIH*_Pv2cDvcWe&a@~({+8pLo+j#JnaFVtD})ismm}3cXu0JaVL%>iXx>UsHHWuPd3Ct(VL+v zf%QpSTt5e8jRS|~e^3qk!BC)=3!djGO*6qoSP2$pro(g6u!+e@$8-F^&+@$2?d3U* zi;xscn+vQSvLUqsY?_HfoeSOGM5U5cN#xPz?=WJF_z%ERGEzogG_`>^7D1ltx{eJI zl+0;R7UjbUwK>N%OvAq}Xb>XKSQJMBKqkqpfC+>wxoTWn0y9PUl}D>2e5+ulW++A4E}!9DM~|)Cx|61G zYHqHzw_#%eF|Ss_Xwc`B4rD^3n6JdPl(Lzcy&I^wmX{Nts8aO!S6ZhSl?m0)!NoyJ zkb~`3b8l{O=68SZckexMqSI>11tnYn+qP}Uw{Lw+Ix8n<@l2S}qz46sW>TXx=#YAB z#OsJ)BMy7^K0LNRrr_4CTQ_g60BjMdBA2(7)H?Mh(%v+sZV@bbYViO!yV zzt!nH`p9RI8(!Y%ynJDG6$In^7auyb_@(3fs+OQx4v+wjWAD!p6p%PEB5Tdwxs|P}YukfPXTc{AEmn_=L5s(EnmMkQQ}N-Y zk3aa}941astwe*KV0j!3YSrqkTerumRm-uN;Pu)V&{zbSj0xWBca9uB^z2ujTG}_C z=b7)htxoT!Kl|y~vmdyQ>v=xSX`Br98qFxlx=}tgGsBr6m^}0BGsXH2x$3IprFd=# zM~(5F_mB7q;;F1%xa%CsY1vhPPoej$=CK5t~m2kJQ_schbm9uQ$;yxf? zPAP^U=d2QjtxoSh{Lvq;Z*E$a6AxlYoS+hhp;xWes?}<>R`XnsAc6_v>Q;oTS_LPB z&^&MK?MA)G^F2avmNQO`46M#1O|wd9pMN<^6Ic|vtQs)d7V;f;b#*1B?8xzZuvC=n z^*YsRXkiQ6b{fZ<>l^)k6nFu#EG8Jjh;b2kf$LiDyz#nBWk?v-4;(yr>i$zF?m0d^ zH4de{G{S^fHX=mPv+MPGmZd-Z;SXD_)~QqXg}y&MJyWTKu20t(={mMFwbcPgOZEde0wx5dAB3us_=wfM7$q3N z5e5-7vi%Sum5`~=E^fiV#^N}}2bPwSG%YQAm6COuBw3cpX$ywX;Cmq)?HMCDq%Ogs z=!hAI8(i8DIVHaX8JR3$e1b=TW<&8vBc80AAEnZTL57PGaQx}!yFAXNU8^3=DxSCj zJIURaBykCOQ?uzbP17ueqA2DdBDy3uWBC!dmD!BOsz8+E1Z@@oMmiV9!ndT9tG{Xh z%!YGQlCGdZUW*~Y%NPe5h}N*(Umgdrs6h#YQ1;SQrvm|)>pO$~px5aPl9uU;7PfK=|-GiKN6d_Zp8p^6d51FErftlE&#Cv zCQ`do1IvUo^cM)JcvqZ`NJG^X2nK**dq)^*0211WQ~4zb$}K^s0{8IzAJ4#xs0)iiHWV9o&WRS{^91<4#pOMaC&-n|Ni~+3-dG6 zGvgD}VOXtLpu+o3)*(qlL=8;)An9WuT;J_VnNkE%tx_veD=r13WUE%&zbo*wGJH4T zN*WWZ1}|1cRxJ!`)k>$`iIX%8L*EZDMuTWzS(YF8TU%ReYwG}^APm)kfDp{GoLKhM z)I_~jX*G7IrzW3x@=Gs$^QA9*;jtsj2OJy4QJ-_Bt6K;dW4`NF>XkF6-}_I0@*kI$ zmVWCuexp{a2woHzTRU4jJG-5BFOE}5X~DMRT7)Qcg(;u7F+T^Ii)geOkZ~}VLm^Y{ zjIvZz-VBvQFXDpb8BNj*N!37TdYXz`#ku&izxdG~{mBoaB%hj|699JGjefUP3Ea7v zNooDb6zDe1vMfuASgYO;DK^2Sg?_Q6ieeaXGpII!*f5Yv+g3x$Ru_(jbYC4|O1P}S zbHQ?cAV%n>K%axU32RL7#pvBBJOCJ(&kXBeF3F*1OVRlQ)@$J7NL(%2I?B6=-MAGgE>8+`l_3A>kSPIC_%}OB|AP^>L zl1$G|%}mW-`{a|b8qCel-MDqL-{}Fta8dFqmZ5AEAhSY7jl}Fpt*xRBb@liLny6GH z=$1v2B!!gy#y|W1i{E;2(C_CNv!wdBoUTA&X2*;(+p-CSn^(@G-7635w`ams#4Xt` zw@d>=em9a~khnb-uIFPtGEKe7OrY)Uoom-_T)Td|(QH2Z?9)$u>B%UK02jY_^_7{q z*+T~pMM;Dqih=XNPTB~jo_gZpDZ*KQfGkVv89=0!0!;=60l*6DuaOw?b&&I3R07(S z&%GKUazQk%glUaE-3uwUt%Y#{z@2{j!R_5^=g%EN?PpIdlVXcHtE;!)JALND#Y@w3 zbM@*t1Ym1x9SG=qfhbmlK*KdrOk|qJ<5kxtXmQ`tv(G=ra{6a~{^u(zE46wJOM5<1 z4ikYG#QnW?CyKK{EXKyCD9aIsUw!Ubo-0(o)=$&i11a``qSn~%*=4s6XzKV?LA-0L zTUS@s1wfAN0PI|hoIPh!AkyAz9N4$`z3;ww?D#PyGYJV295O~-&qmn#=)#Auz4oT# zINy5d#gnH_rD+z&k)j9-qq#5ZU=AeLd1q_q-P5Oq;0p^27cX7#MJb@0|y8~t!A?;RkyM<4})s)^BKoL zNVh6lsRs4hI3|{jaeH@b|AB**YRwD$S~aNnf$K`Nm`re)Je2D7v5n0;Kl zyWc&ue5BWDBLpnlWq@T_+V2i}y+M|yS)LRxi|qwr5O{$f$cDRZX~92jC@b9)h7!p- z{^`~)SLr#F!zo@4!b)Iz*%U-dEk%YO-}Budc<=o)fA*jM%hpbFe0mxP(eHHny>8%= ziLn|cm{Bev5?HqG(V#yV#C-^fVSQ@zBWRG85ChwC2qs1;%7Dg(g_wZ?>4TLkaGoA; z%SN9t{vjNc_%kzX9i8@yA*QEn0gvixsTTm1!GTM_jIR2md~uPxA>{<4JKX{d!BY@M zQ3RiO;)!0jE0;k2Y&3K-Ful;CRB~+F^*kvns$fV4k6^~5hJXbAKLczy9D-}c?QrN= z-f$_bBFsQ|G(1BETS2fih$?5Misgf)N=wP+F^zdMM3SGzxq?c-cB@r(CxEVJOXm#z ze%X%Wc^;9y6p0Xqn(-oZTvlp68ggYEb4#Y3L5vG6(V@P~xftor8w!!BrA?qUidH~P z_~ln5d_$huNY}vR<3>l48w-Zwty0plvi4+yC}G+T32>E4mFIHXzSwH6zfcjI#hAx z<;;LVQObYGX0>|W3bmjiA-dTadXDRmi&rjpx9%L@H|=Azx3~A^8?S$G?!4z$I^Evn z%ycEJav`?2HZXur;5o$R(uo0KeV}55@}#%CZ_o1JzPrOj64S8A^BcRHPuC-1xa?t6N@p1up|4661x-;1O4owwh4 z=e>6i9$fm)x4wPw;K3*wWOd!Ea4Dg<&Jr`y_Fm|vXRw=c<32#PHs`@4?gI*x0P)y67e@X9ZK{?SJt zKJ(OjcJco!Ti zT>~9}yWOr3463P_0h5_|tqGs3_|e3+JlC}ySB519HM69IUY8?+VPm)?RgEB*4G_Hi zW?iF#VO%swaEVUBD&!9@rfl(#7``Y1TWRYgM(R+tjkua~0MTi+Mai8KW#XW>n-*u3 z8B_6!dY)xlK#TfowMMfx65`4YOQ~ERJwa8`l@HsnT5&|PgpIB#;3b)t8UB}UFl)y^ z1dx<*)|MiY#RHiX%TSd!P=H%GUr>>p$}eDm7|Y`*QGcCjk!bA|Tpk@<7taD>fdQ5$ ztZE}G%ZL%*!=hGZ(&IquYZ@&T6~9Z>7KPq`MvF`sZFjA6RXhW26RA2X#dAsGWOiZS zzJ2>X_vphR5qsnGxO2Ikg8X%(mm(>ti?cK$&?o4oY@%EdE08-XxzAZbLEa>TY={S!EDQd7H-DkVk^Dt;V-`Q z?eEUcO?BHH&Kbd22q?*&OmNNMD)ty zj8lw>3;Y#(t+2!i2>Gn#7bd$9Kc} z)a_>a&V?K6dy!SC1MI}Y*%%1uP0Fp$l_)wDMV(631X9S|&y@GL0!FL6n`<66P>pD% z-;2VqA_QE!bEn;D2Z7)3bf#wJlzgmoN*47>SgBWm0E|)vzATPz!F<=h>-gPimSKXm z6R2d6S1Ms+Yy0e(_m>YZf9s`}Dq+xWw-6GTU>VGeh^Fe#8q0OY1mzO9&1gomJkRo! zN$G0}g>YTl_x&IUJ>Pe28)H-y|MD~`<>*y`0+DgU8y1He=Ky3k2mw&9)zh5)^yjbq z{mZX1jwYriDW&aZlcrI<>Q{rH$W0hCGFqqvMnQrGMFj36TmqgHMueLb9RY37tr8uJ zSe8WyP}-3)4x>_7--J0+9BW12(v=?=NsW?b14b~@#aS`*_tHh0?%kIq6oEVd2kYgnAB#vkV_%d#xZh2X@(N_I-= zd4f_D1dfgi;0T{c&2vjCm0?=LA;U<|B!-YHIZjhg#BlHp4okBJRBxOKZPc&PX^O<9 zt1DP`?bYlwNmEsm=_3kioZv7+fI>3R0n2Hcra8?a1Vm2qxG?_v8fz^|?zaKt@lRu% zhZBA%hGgK8*0e!CXgIU^F(sqPd@n+<$W;;6MS0m^&~>x1EmpiSH9nEOXiBs46A&1B zAR3*01)he(F@UR`f@ z2l>QU#lch*rHf2hN*=f5fmx6S7PS#iIbPY=3u}`>5We#2tBd;<58rjyR?Pq6-0JIF z`A(b#wmlL0LNLmxW08qkMP!4`wcGtpyIQUKwJOI_mIXmbv?r}$%~%Lxp&qRk`!t{f z34Lb8k)o#gxH!C|q$Gz$9nCRte1{Hts~6A4dz**%&)0nKy?0Ol=&yf#N) zVrt+ZifdzaLWp3z-|s7|zgDr)6EH2Bj0K$)HsRTdTLvy!%evYKB2bl;WgibyIey zPvPXg@BH>3yzq^0LI}H^j_hd=4h(Evz|#K=C`luXvOfZa4l!FWqVmVCBu#B7n7bT1qmM4@xH8jH(tCf|HlNTA1 zO}4f+Z{AuF0E~}MIF8%v_Z^F1O!7SUJa>9((hmbpwb!RQ?`#Wq+ilyjrlzJD<5JJL z$f`Zp_C5FFg>xI5Yv23!x4-iAQ*jdYqk&`=BQ3>;P3O&=I!fRRqhh_Kz%C||;Ou#R z5C+vs&G&tQU>2v{Ucc39c3PdmAj)&51ilC%7-J-f!Mw~4f!3DRN*1!O$r$%M*YW)K z-aq?q|M1_RK68F-Vlu2$+pWD`b1!tQndu47wJFObPY~%*f>zd$q8JF}InDD-dOoT% zQmZYOK|vVjKq!=YSI(G}K{Y=Sn6k`-n_&xi_;I?hHx*aOy3wA5Lw1cpy$dj6RRBux zj)LIHcL!r+S(XflT%|#xymAG}*3?>VblQY8GSBeR!KEb4)WG>4hu+c@(KLb;dYv(r zOY0EEg>*+Us!}CfOMSm6g+dLT&-_C`DA)qu*l7!|=f@?HdN;%{jjF$4gFoR9) zL0C3%k<#*pnyd`ULBCM_MqLV;kLPfhjH&i6#+F3G@ez!53E&&*N9*cR3{g$89F^(; zrCE#6tUq~3WBmmvDKxSL!%blc75)V2u|6neXke+(Cf`GCK&i8;;n)E2Kn}mCyi8us zXn^V)YPOIXm1?!U<>jOMmJTLq#s&2KV0&lx^y&AjmFn?hM~f7KQe<$1VuVvI-$|_Q zJj8v}Op_I4PAwZP#tH=HubRWbk*&UsiJ|7d+sojWu;zxe8_ug*kHOXEpu>>wdo|mFtf;7b*Q< zx<#Z$LL6wpPo2$R&4iY525LM#f~?385G|4s;dm~{qs^>GQwO1|M%^A3S_1d-TD^W^a-wP|Dv>_$Uz2@@rvLrVfJSRr3>+bC} z-h21mt5>fEh)p_>(;VCOfRUBGNYrKyp8VWD`ThUj;=#jv&8C#kbcBIs0yFe3M@CAk zShn$y;5?Jz|G@`8Gc`5!`WtV&_S)-VC0stdOl&Jpb7jJ$8ch%(^9B_W$0JB|H{Jg2 zgJC-7r-;P>7UhXwsreJLAFs84^z+j4e^bu~%S@$rcu2sz_LEz7briF`k()vDv;W3o0?$oXPB z+ZKU<-?)Bd(Ca<;na?Q9zYM;j68cfE^WHmeA6`EA&wukb>tnT|@GT-F24EyFRi&1G zyH!9^GZ>~ppa>BOqL%t}a)3>+>p8V*b*x^ign{F@l(BxVzt`I9wA$TXuh$7op!$|;;PX4!V7TEDZt`S1SdkN@(=KLOaDoSu!NWN&Aa05&%>SqVJOBu7~z zB$0lkz!>q$8CIU>8BGzwT5ZTsPfcVkbs|QAt30Qa=CsH%%etW~Zic0;Fd^1#x-!se zTCLH~8fD3v{-}Vk6n_T8VKYZk$;p;7II@AmAQ~Fxl?F}PGYXiD*Wh6CoZ_XW16h`q zoozF;Ew9DADrIFR=a>j%E~TcjES1liI%1Sor2(;*D9JLZLOMBvL)@g+ z=~vt>2sBmz4)>tZ=@liq4g!%=de^bzlQVO1k|-v)5G<@z1R!VLKfArNd*beU0zXKS z1P$x-vVQ;#XhKO$u#D0A)FP?OUb(#+$8=__P5>30B85Yimr>N_mDzW%_mc3y{-eiV z`^7IRVR+)6`(l9q>cd;taQ(p1Loa^*_|p7b2a;>u_*S!*a#*QU0^1Ti7fgh%UH84L z+go3`6-B*zrRIlW#-;nenx`W5OyqA!@qwjN7X(~M%**@+AjBb}Md1r9$F>05Te-G= z`NNQu5 z04)=se8-BX!&q(;SPxy!r~s(b=~}L<8yV*P=8O}I*p|1k-FWZ)b9Xkk9VbA<0svOS z8i3Gt>?j(zzBf5Fm8Y4~gUqt@-1&3o&!5lpH1Pe9Mj@o!a__VU9pFCm{onqbfBoOx zb??cWw^ny|8=mL7o-6ApjzD?b3GG2NB-}$&e-y78TBFl5h6Gd9t7eEU^n00AubsD!9!^{E^&5QRP5fav?+9~?mSKojA^kwMO zy&$BF890e%8z5p05(X^~7zajkP8lP0qcLQ#KTuNY+}bI`J=!2kAM7s?=(8Iv-=1^ zdpkRMJeZ!UPmb5PC=zIMg=P>{p4dWT>H$I-l~V(VN>r50v5**s6M5{9V6%bZXUlFS zV^lS_5i;lV@Hj7-IAu&mB~ex>HkeaIlr^9^ZboZqJ#i3{ze-{OIAmt2KrYx{l|0E-JD-ZIY|X z4lRWyz)<~ILQ)hSi$jyHfgvUslpHVpWd*h?B86)Aawbe?TMXOwL$tKf_!Q;$K&3k+ zz4}F`-6=Jmb;vRW71yiAb$=6Tiyp(J0*XD05tdLw2TBEYFa(Wp%^N~PHkdM~G5|AC zmbE4PN?o~vamhg~kVP*xVjOD0nc6(sK2Ve7fDn}FN|H;IS#gI{7>Q{Bn4s}s0Q77d z>X{BQ<494O88a>s2!`zhmC~LxcTiCs%Q?F8wNy|mT`U)i!Id&@>9nct#iW615{!`M zvT=o_ROv5gS$6#1`?2j|+3<2~Yh~po0BB*~egILs(W+M5fAXD|9(>?rr`=?f7sUoI zbxlk@S9Zwd{N9oSgU0G7qCB7=E9X5tBThzWFqN;~Fz8D`#890M!sEr$K^fX8vt@Aa3L4?&1~z3yIfFYp7$ z^`IGxs11f8%(Hkbu=Y*YQ<`!P*EY5*wVD*4;f7TKT-R^+qK__KxxKzwylKT!SdK#k z08^7wuImzlxjdksdG?tiobdd{m1`eg`Z&#V&-03f%(H3U^YYf!jrRSIJ^3&H|Nqs@ z!a}>#!%_@&Yiny`eG?HhH8o}17R_>n?o<;r^;q=$L`ygU(}R<`y|mc0VHgae=#AIk zID7W&i4!Nj``zy?EX;Shy_{y!ydPSC@qWWjw#V$)0lCOy!70nKFbFw-Z@+)xm+xGR zC=99B8FNYVt5)rir+nm|sFOB+6IOrqy@#s3&nP)MOgiDVgQISvzI{my2y zxm&5#E0v0Rw{ej}LM}_wQeL?C~!M zj`F-novfld=U1;@-oG&am8ZUh5R3-{Y!d`kjmV+tB$mP&vL=&C)lgG{pmJ)`?K>5_ zlzBw4F=dZSf`*hZ7GuhFi83k!Co8Jbl*Ms67z}#dZol7+k~ofIDumYA!A8 zkg6x-G)*1rybNMx8gCANgD?^tV%nHC;4vqB_> z?!ZVNyAVpY6)_^j+>knS;2e?il|Mv@Y(R21#IcZ?PK@b=XZLW*XBGd15x}colj>ue_idLdJjI5aoDN>-W zOof5+^i#t3(pyP!Ot_hq8ep7I@ly+8D}iTSxf{_A{jFNqN=Ow`q^trMV=8KDeGVPG zNA#tXJA+ml)(lMfFPaA|cyUn1QKSNQk@?6epM)(+E)OWpvDK~X9bDqEfp&$KU%|3` zGc*I;>Ewp%tV?@Qq9_4CN-#uvkTalXHM+|VHNalvS$_D~iJ($~`R zHIGe0%;Gd*R&D0e9)5olJ@S>8&RzJZ(b#?Lu_qX@U-|g@8y#`t6Ca5VOhK2E<-P*c*kv4Z1C+dX23uixk_nr3!gD9+21{vK+tjrmQUMK*H zTD=1N4gd(+old*m3d4}tcJa9aY7qcb9K?AXP1M|(x}UQ=&DqxW z-uT3X(w7n(IIb%IytT6V$<>>Klsc{lI70{!-xfLVbvt3DGB-ajWulx`bMNzyKI(hk znX_j)?T&5R2otG+DhPu8jn(mL@U7qa?XP_GtAnT?Cy8ZQ5+i~g*8&i2ZfvcuZ#a%U zH93he&hi`pW~M(Sj?s__G=W_Dts;#>B7}Huu(7rA^Os*??YRBDsN@>mgFR3`@KQWms$Xd2vsyUg0n zT&prgDO00QCjIuI2F-CPbtVNV9#?b@8uEMs|=XEdRCn&mWO zvUfyt8E=c=n`K#%x#W40CNwMlviwCU<2hrQ{6Pd;toXikc5$EMIQ{-0>vsaro|u?W zC24V#DezE9Ax1_T$p{sw$RZfT1V@8zFYXtqp=?&NvWp5;N>*fMT7QD8mY=TsHS|i+ zC73e4QS4{O!emtB-;~7&fKlD&p~3Iki3|-v(P!&``NKFkaM#leT*I98mRk4MN!^Lr3N3~D6(Frwjb@JhG-G$Z@ z1+I@6`Gbl_1egSs5Ts{u8ifo#rT(ngM%rOoFs|xo<*r-0J`5G5)u&KOqa-$3TL>tO zu6A)$#)D9lL}Z~em0>v5FtcKVFnPneYbNO}Q2RcCa;u55Q4WTnNo{MP#rW0g42_=%Uk^QYrTh``Of-wP{uK8J=|e|z(z+uQASZw&AgzBuOLs$hAV zGHI{FAZ+%d43o(Nhb9jl0*(`>8Pds)UT$@bN?6!&Y!(kTuU=`d-JTBJis#(8e)H|O z-`QH<2*X+i$<9CwNJy%a0NIREBt+8On{ozq&>gQjd(AzJt;MA!2*6&m+3)r$VStGx z8HFkplR|F@rE!05s#5of0HWJZ8_mx6Se*-DVQkypUZ?x%h{oUXB=V7I?*V?n~BI5A! z=qTPa;(9L4>7BLpjjhc}B^)0csAQ5Hpl^2Bmh_mE8Sl7=38%{KYvMJ&+~nj%j{E*A(%?oQbZM_e;H_oMyoXWP#oJrfh8TTC9#+`0=ZS78+B=xaz%kdav2tq7CmSx1YCMTyV zekf_g0AWP1b>rIAr9+2^MY1&6-P!4NyN+eubMJ{G%gad=$7vDUXc6+o`r7S72M+tIhOhOQ~BZMu?v#!0Hk~@{(<0*_H*g zzG4}POHz{BTD-U6qUod~H0=eX8BiXK0(tet=0!y<9RoO{D1g&NvQ!#mNIg(0iS=JD}RvNSo zEftJ{wdz14?L1v<0ZfWm%UKCyQ%i^piCF6#AOkjnrRjr?l0)H7O=;pPcy~K(1^5zX zDy>oqMQ}5^k0v!R0^dV1Z{-nfjI9;f3n6Gbwqv_W3aV7HD(hBV$EvI1+~^gmMvNd5 zsVL(o8&HLNy0svs_CYZ$Wff16vhs?PL}l(!mlH-lQ~Tf}mB>qW zCsgi2TxHeJgy7P{$$U{pQHc~+TpP+YNn6=DXdOyD8Ikq40$`X-Mh-`rv@l?~SibAn zQ|6paS}<{ax?_@ z$p(plhW{iTNEjCcW0H0I>!0-Yb}!!UJoLD8UrHal}C?*GcY zOZQIJirQDs6_v`B(S{K=#>}y9N6G11+ZS(dMeW`s&yIQMaDb~kjEZfPsXbuLs zZOJsVl7$TZp_#{FKgB--fm+ztW>7w=Yar?Mk9&_wMrEt!kKI*aU(SbMI3ea z&y7`F0ukD4w!6KkTB|vpN2$1W{r0WfcK{-`?E(ZtKd>EpZ*QmDZXY44kGM0 zb{xewZr1&l!K`y?0-I<<+~F7yiY! zpFFxy$p>wkXTI+_wtwNmrPp8kWv|-{t2HJtr8xpv%Cd?gBxyRJGUqHp7q%Q|`+I%y z{^hl~<-2O*^*p6|1jJ>sZMd);0M~H@W2>vTw|5(rY9$CmDs;HWvlIzYuh%P;nr2bT zz9kT%TCFs8ccLf>D#4vQcd|4i7zxhDCnh_c4rhw$Bn#J~4(3Um0EDac8s{2}B9$5? zyj?vn1cqD&O+r#4vPk=%NX!#f^FV+VXQ%iRBJH1y$g}SIE4dy`rc?ApM!8Zvl2=!3 zFCn-by%oz&2i<%=|B?wrNB5=t-H|UsBPDmTyNvR$UPS9?*Dtsb@`h!6f4G6}X z>0y^9$C~E>hY%m2y-t8KCPVs=6M$ogm7|j+ua&_Tj?P!=aHVW1j@Ln~s)@KwPkHrz^?>yHuPIW|A(TaWYb^3OF)0R}JM6 zfVR*W0fksX2oPesu5DSis*k0!$FSa)iJk0R8I4L@)V)ZLn7H<1GL1@L{wcSD(x?)= zOe&O`v@j!N?Zsx`7Ru@`r)iu-x+%a6s!}~h-MA8(Y$ty{<3?^@03(vXWv5yzrODvW zbVFW0N6oX5?<_Mjb0EDflp!CMTvuU`fjU;J+=eoC_}JYO)6*O4Yug*^HX%y)Dx=J@ zTrA)qju5sN_bp9KP3Md@wm0`L&i&^1zjyH9Vz1kQ(l@Ep_7r8;Ltc2!a!hQ;3pX}* ze)5x-&!7GEAN;F7ICy0F7q7kc`Ntlcn4Y}2*?jr--t^t~efge)CueIsjse08QkmZnI+qTmzZw~t0^JfkpnOxY% z5RUU)0B&RAVcgx`T)*-$j`|DZ6G@W1{qE`W=Pu+~ZhJv56|LN&!3+q-C=>)RiR|PA zKpLlP(3*lxm$hr5v$eB3J~1^uIf((<-QG^JBn+#?aj!Eqsej9hL_SG62NtJ%38Prs z+(ecWgw@rxt?M^$r8#sQ4Rtd+_)J< zvG4m?mSY<;%2d`zIZx9F3PcdZ1U>!q7oUIb+3BgNZl})}!^PW-Ggx7ZD~o_V zGe5uo!2UEz)zQI}x`TY_h($2A_jVg=x7Q)TwfY!DfN};QWI3gbR>EMcUX>EiT8Uc$ zNF2{a0_-++Z?CRcmaQm-Ot8Tq3d7L09c>LJr-ni*iRM{`uvMQJ&(aJ5-KNwJQcLi0 zpe;`UC?A%QWiT^H)$pR)H&M6B5Qb9W2kE6z$tKiv2<6Ivl+GRm(AJWQf>@Se{pgy< z^<2pYq*8hi4)HF~4D*E6hLyuHq)!n5VacPGPLol;-;V~8S!$@Q#_3T7B`ws9N>G+6 z2u6MxuOczRJynP!Wx|LpViQZw`1C{5td^n4uzF_FEDcGYEVULwnS2?KJPl4LXP=*H z<(k+6OwYGe#?+RyQvDMT1_Sto$BPPBVhhml7RuHxR82=6#D+Jgu}(to1I@lQ4?{QS zfl)4p#Ih7>N%m=_`>ceraWSO+DAJ1#D55;9%O2(kT}jIoi_&*VBPor4pz%Z0MYe=r zsZIjqjCbUz4Mxi3(y<7X%c*ARZMQ(bBkO=UlhSg=N{U>tJH3dlW`PL$xoY zGcPpNn~|v2ua2?WH!@g8!h@Fz9VWNo!YGg#TVNG^Rfk0PktwBdJkSIW?FyixJSssE z>KIkUu}m5CA}~GAmBR)3ermP`Q+a6dYHJvRl2}!KR?_)jZhdKb$*G}T86ggUp zkUdSI6eN$*cyBPkes%KTfvJ7_kmd9{t?f@Pr;XkDv6^j>b01uM_ubQ-UfT<6agG`( z%DhPsjthjj48275z#xDYgh{6lqRtrK3_#!W+|BLn*}3^@wT2~xULrulAAYg_6JdAY|M3C&XhH~$kN<#?D|;Ub!`dM zVp@&{B8S)rqjtBwwXrP^6V~nb0>1)e2R}-pAP5}CSNwi1xI#Zcz$nWRvTetuJcmqL z?n7z^WYDk2*Cf602!Z@bR(PV8;FowH9r zw*&X0R}vry5UeUxr$mvGY*~^OYwU3{^C?-gvhs2Mfvl`dJ|rI`tvGgOJhCh)lqia% zsA92z1Oc#s00Dv^K>+vS_S4($@0+#Xwl_SqOcLP5z2}_0_xn80@A(yiEyFM@6AQkv z7?lB^CxD1AOWz;Yt%(nV?_tHg#b@k z91VxO+ZMGObBc(thY?CD?TMkpLr`X?D^E72U9Ikt7pa&dZN8aK!-jaj60PP;dMKPn zxN2HDNeVX--jfh9LP152QaUGXAeGk(v#cXfj*m#qzFLtv9*^yqyQVr6RYJ;xG^(hTFz)V@J2&~u}=8#JueIc9^-`pWnSR5TH6?r z=FE&?ITzo%a`Wbm!-o&mt99S^kTe+)%~E39cA;23d;Ze@`(K~=@Wvg}E>BHWzwz}a z&RsZn;PAnvUAsSO^`5`ga`qg4^yuQli%l9tiiU%fqFqVLg_)FaoP?_5Nm!%k9Ga`` znyE6|TA{{`3Edu!O$chGBH?Ez!KhSpaGY%4xjk6ljJoZWOPA^x?`Tfly1D%9uV1+M z-uu`vu~Xji&8|7knoF=;qnyl&2__iw7!@q8NZ^fa7(29Ypcp|g9FA-ChG80%C4<4x zAjC2asYrvF*n&s>1oLx^TCF+>l1uMjfB(uyBQLTYmmt$ExusH}*X?#&Tl@F#{le!z zxBtNYVj=y@;Td5B6U(rgQ&W{j{n`iDuDpN6wjCx-#Q>-FB%IjEqbm&(L{Y6)qYPfW zc$Ey%Tc+Z=g&4}EQ%txSelz(Fic}@b#*Wplw8-ejPy*;T=am7 zg4ItmR4^E0fXg5e38Q3nWBY}d{@B@AUuafMjD&wWZ#Gq8oKQw1$-O3)nUKN7rX=_@o}u&x%2UjPaq-nW}RmX0zz;cMgX#A zv(~8B2!ZLit)3kdW5cw3KU`T}*>1Hg+YY118xKovq1){+-ppYLyonbCK^O*67zC5C zU{LUgq4dWhglxmI_?F8tEuL%4v#lMcU|R*-cG7=wY{%yRZaX&r0?V>3GaY;k!!R*7 zjxr5{C*q}lOV3=wBj9-MZp?T2>EkI(zBnqMK$gBiUOZ%ujI_sMK(aphewf3`5U9aR zNnoJ1eN?`UQ0L?VnAd_cfKZskQ5Yel2Yo2Ic21*E>qmLs$v~Q{ECCIM!VC~)AZK|j zPBz4I;*&UvC`V#=odv=R5JF^{rp4{Rw0a3hXB(J9*o0mNDxQ#jFVg-Z_iFTc4FSlV zEBt>^6yRNpyP_y!RPV1vV}sI)r~{NDq+dNRS94ttg}k z<@`8h=_-k}RI+=ZHk6c?N2WQ*YA8CJY&w-C7-WCTpmV6=9VM!qUQR#owfC65PWh)g z{|TbI)c#7wt3_fuLy9R)xdK|#?g`Q`t->LvObdJN^#7&7jzm{9hg}NN#oCck;V>na z(J1r(l0{a&b^g*2R0*E)RUp}k@P{Fa69{p3b4vdjiC3WP%>d0pS9Lu1i0Cg9f%#CT zM9Qy_7S9TGhuV%Q`=?$82?si$E?dGtqd8r0(otzN9B=@NLWsj4=9%r(pZKO_8?yLKKpc;Msi;Dwu8bl0JW4)1(y&nyT6q15GDa>1?Uy#azuNDAdPO&Uf} zB&mUzCe4DqZ@#g!S%oHE3)u&~@%q>|4N|gg3?Yp}1HnqE1i~a34wh!7`rY1(FaGhB z*WZj1W*4j7#M~w|Hnoe?rx-DLMtxd$3F5_9)?a`j@F(K}igD1kae8ql6R*)|LT-IG z9uBdAF}G@$qHaNgL4w~)sLRn*K=c76)z11^|aq z=oFkvr8@Ea^KV@^cj1CS;1Ju21V@?Jv-#p!oSs@2;3!a^L=)z#HFid?sZ z5aKyG+Fpmr=xr6~$#v?~b=@$c|MI6-o_+2&ewZZ4*j!)RziS@R=q^$zR4y_6*e2M- zcJX${f92heuioi|(Asz4;1B-0@7#al_|cr(Us8p+^N`)H$r*+sMM5Iaxk8cF?EElX;p2F5t zvMYII<%LC2O1OBDNY`Q+t0Q1w&M=6gh%>*rcs>11QK_YhN#z$RUpJ(V%&hvU8X`J) zk2w#ea*UFpfgG?gvmG-m=80UmzWk3uUqq)HGmmJ|mcSoKz>X zE(+4x}Nt}c(cRjoo$5zKGy($NSn z?OF=L2r%6?v%BTOS((!h0nA56sL3ts7qV@v9Pp7sc*TH78HnQ8pZFMK%d*sxQwey) zAje>~=+)b2We2AoCl}#=z|6Z;zaE*f2RQ{(qAfBQ zlW9?`l#Mab%yMuliDRfOXQWA+BnvA`IQ2u3cHd*ta8kt}%fS#pszBa!s8!~mP_SL0 zw51f5xrqDWiuDSES&Jec93^#w5H_1Lrd=2gdgJjBbLw;$gnkh4q0T}C2c8cAa7$&% zfI*1o`JHapvYqDCY|P-_Z^C%@Y0j!TUhjLmMZcjDx| zQ9RzcW8vO=@3}J^zxeUmXvg0B5AFQ?!5wB8iTFT)qDvbl(W!{|HerYaF%@lufJvm? zTskcnF`X?qd*>U|)Ah)(R=xPc_HcdZ5sY1~w~eFNGOdzZdiBiN7hd|)a5S;q$_Q93 zK5amZd0Z{RqP;=@5D0_uumBkfI<}F1!ypLj&1TxyCdp_tv@Bc1 zM#(3bN!AP@W^223=Iomr+x^ibES4*VX_v|+z~Z&l6&ghkK6v_5k3BX&zfdd|ip8R3 zn#4#yMuU)QtrmpApI(0DTMZ%Ej4=6GZ`+FRBwUEi)8B zXgZ~Sf?vOK`;Dv1-NJN0fp_A*WA$2fyVX9h??Aayx^m@;;}k8&@qGW<2Or#7 zTX#!kx02q3oHmTZFg7rnpPQ;xE9tmM88?E)fIIaPf;;W@jZbb(CKKCse9s#Wx^uHr z51l@>Fh2(Y+qY}?@#DwqwOY5+X>YgERtq3(psAUeh;#a)B;gVU(buZM6J$e$U|^^b zLCQX1hJfgKNgOjWfm>*208q}Aq7d`i7>gWRDxJN(TyX(+B@O_E$jV_Rj$^#E zxEMyE`YAe{24sVlHXqE@Ts;HpuZQ|8)$gf_D$GwP)Z;g&Of$d;!Iovpfk}Qf1R08< z2e#a-oBtco^+b!Ya}#^^!WG0Sdj}c>0mwO#sU}AW(scLF-FRPPg zZ>hjus76fA-!Tl#nUK0!l6?=;rzX@1Z1*!|+>DmD4i_h;~EL$A`C@WpGe1!R(g5{D$o&ro{KFa5YLu&%h5ZfMo669_X zl=h*Z(VVhuYcTAN#{+_}V1AjVStz*ajKxb)$ib63M+Nynh+5k%KM1RhTDj8r;KS>e zuUid-77HCqz&(GX;RbyEI0UWWH$ZpRboHl@2sl{b+k-WvOht z1Y?XT1gz!ROz)@ZyUvb$g>mqlqwy{3!5!u|O3Y5YbEm#^N~P zNqXsY6-Du2IBd1s!$Hrq?2=n5l}a0%TYvh~pRRv=W9N`4H_JPHjg!|UXs=@gPhUFlq^8TInAKw0Gd5{>TW~ExUOcOCW8Bbn6bEaCY9y)xm z+i5NAn6K8Vw{I_RZMT+}Z~IYHtu_tQNGLUk!AZ(VvsRy*nKq5|mymb7!j;x??7;VL z-@LWeZW)F}2)=P8)Q)w%KTXV2uTJEQc{(>!U4oYjI_>N9t#LUDpJ0A;o_1_C|1E5vEw$VB1%+L z9?P=R=U4Kmn9j1+b78h!(sOWTUMQXWb0rJr_G@ZqnSpj^&3wUM)0ORAuvtYGL;s)eCCD^DHmyko)XtdBE`%iO9@uQy>Xe^@(Z=~AhF3d`rz zYonXH20ryucmdwEE8>CtDyILgAvT*TRSnRE7{Q#6b-pw+UAi+Io@Fh9G@fEt8itiOu&8(_53=W2;QW`u z@jQ7lwu5X|}= zzSbv5c$dl~0{PPf{fs{nymU31Q>J4N2EEB>fDxiR!7~g4LP)Xba-bYTgaM^~;FsL8 zZMz94qmD-7Zl`US=G5#$t2=z_?TcqGytleFEH`HblR1j0VZeIbIec*UiDUP6!|?Yv z*KZc5miF!Z&Z)gFXORhtipX+e0@LC~W=L_cm;w;^r_KaE2N9L#==_(MgVkvrqIA|R z99d|T3Z^j}?JYUBNy3o+f4_RJ)#+F3O~z;l;LvUuJNNtiq{2M2m+&xrEGXsDut?m< z6memCI2e^pM#r0uiN_NUKv=I=A;L)*hMw=(4(AvGsIWRI)JPKBwyL!npv)@R{eEv_ zb+tKF|J>uByZ_{U^+we#xlXZYnwDW;1c_TL*p74c%C+CT@cfNWZkH=HyWqr83}`x_ zB#iRWpK6{hr3p=F6h%A=CVi^BAc&HXAT%C(o12^C(a12&Qn~CDip#f`|K(r)w7I#p zZ}0w@xtTBulQ_YA&___Oa8MWorfKe2*kL=)>gsC0*DJaO(=?NWQ5xB{gE9HzYp*`{ z{ELI3S9Z%FoyarAzU35e-u!4`re3y@FM_X0DDc&G}*NojI`zgv8!w3;H%jc^>#HJjfBtLFY^< znB?c6U>4}4NA#@u$!bOzMhbnFuk^0yZJ8W}_0yvaNYv*G zFy~ZINb%jU0srU_%z~Ae_J0>mrN|W%3U9#{fIw?JrF1bp5*p1Z!>~q!{%AZxX^)b= z!z76(!-4HMZml9FY08^E-}f!6;1t~;iVR{fNZajB93{=EIX?yz61Q59A_^f&7_%$` zg5c4Ij^BUmo?%R1yS0ARtnJ*p^cSZOOko1j)1L@F8^8+r;Dku3@HNIKGzete5r8?A zPppikSB|u5WstFmRxpfKZr209Xmo*h zA8c>8S5}r0f)79Z;HMsYbYbUQrB*Jw702P3!zk^BOK$1T%AMc-_IK~RciFV;YPph7 z#*zf3A7&hcfwsC~%7vEm{*x$-4W13hAe;DH1PnkJg#dx!c(}d2<&7q`ZP)8{LX2zI zKYHVhH-aG8zyCnJQWK;|s4`syKtq!x2*Z-=&M(YR0M=L6Cu6T%DwnI}_4V~%{PMXg zS3Y!I*R(7iObj(AmBy@CEOy(SB=q;p)+v9@mR%}OmT40* z)2uDb&CJiu4tj%)t*uhI^6|$X_xk+@Pe0`QlUlWM-+jj}zjsM&)rW&2hN#i3&&8q0<) zW?+K3uK^H*EJeq|uNz!`x7*bT(8?s1of==lU>?co+ju2Z9Pq zhXCe40(ke>301Xcca8Vb{e!_=3DyN#BARkRo_^j08-{RuZvX&*07*naRF-AKbYh5w z$V^2^F_{q{>Bp+nf}9;Q0C{{MTSx#!;{|!Xk;2>+fr~K~_yGjU(h}yd+-zJG{e(7c z&VF$2ooW0yV~K#=&(&foj4>zHnUITu&Y+PgI#i2kJ3ZwHi6>Iji0*yAQG(UQEwO@Dm|aDT`S%m_F@@ z%-B+un1rYOkxW|5C&ls+qDLj?h2}LQL7*Ea|8szq9B=!3OELnZO1Z( z!(qWGIK=|SWH1^=Nn9)ySvIRk-IQq6f3e|Yt^*C~ayS`G5F7Ugw7gUA;XPbRq*Xj?Me*UGg7naH;PP^rg01}Op)Ve?jiD9nZUf#E3$|Qg|<&QVL z-=6>Q<5pmnr`>9^P_!{%u5B;voLiWmK?L5ub+cS`>-GAbJ8RW?K*%sQg=8`CJ%r${#hpiv9IDl-gI;%gb2A7c z(=y~T0pw!fRm-nQt3VF8+^-!W4N;23CP`t-4k>kR$;pIqWve_zbUqD#E`;-8784}# zIklCQa$uk(H`=98(s_{*%!-32mxPziq$s`IVHAb(MTy!cMAR9Aq7ihhD}GUZT=><=gl0$)?5pwO1E|E3J-_*N!$Ga|83 zailYPp4?bxor;j@QZBzEmTeja;fam%0wgq{Ny0I05#*^&SaPd%**5~D+AV!Qv)rOv z^DDBls-a>i`xVObOzv7~$Rj#O_tKjK!B*4CD~7V|w|LVEkC(-pWuKDx+<8KXU^GFf zJa1Gj5p%5YEYm#g^jN7inxwHn?#^Lg{2O29y!g^d}xC98H;~O|T(kxKSMW z-lX1W07PQ$yIU&PEZa#-kyDB&vkTT_(7yNZ?k|1*Gck)VZV%56lj#F{zxlwy-40=4 zO!z0OBFrSZCa#EldkE@M%Uf2YdtoFCvEb72W`uKnFoF(1SI)lWZ?|{M&30P7pZ@e0 zLCla{{HW#MSRWYJsJRxU5u?;0&>s&OGOTJn4)G>Aax8Q}m01IvKj z-mqLQTegjf(I507goQ#uJd_;2qlRHX2)0|Tk8j*qSy`Exo__l4U;EtWK3l8TOZ+bp zUy2bbxh_EH+_?)cyzpYT+pE@UnBXLifpUw62t-k&h*iwUKb)%E>&vPhVKWjpFMZ^^83xH=APZVAw)so zNjF%9D)B0xlw8*^tuwE`@zP6wY&53RgF@uA>$RDh8$_r=u~ZJt z2WG{s%{Xp}AXqTq!fbQzp53KVvDfXiwzm!(*!$S09`+}}wd>abM8$%8=gyr^KDqh8 z>C>X9A3t&5#`?Nr+l68=41;u*t)h;ujDYoL&m%cZmd(L69N=vOr4%tuwU=VDZ7Q&b^5cAVY@;P|etumF6 zi!xdI$P{jqGm%Oi6@ z1^;9w4;kdCo-XmxB{aROIRnc8AidWTzQvLGwg^g$EbD4VcZ9^35V0GN@PJ3~C%zGlMZPEZZ>& zk1WnZ2I}7vn#6G;MnBJwya3+Z46GgI;^@($rI5`(nb_ zwVwBSd*bfe^Ys0@4^@iHj|jnB)GS*8sP^NcD-_Nf3~BN>!0NL@N|`9pD4@9=6a(l$ z`2OqX{jK)m{M^>Y_CNpA&log9Xx@oY^`3{iiMhSm$ADH`izWeJiEEN^zsrbWm+KK_ z7$eP?(0t99Qrj^6P78YdrUT+}*TASh7?i6u%Sg}bUZ-oB#IbE4Y$Xsh45L37-u&d| z&D*yif?xdn*RFr`t7o6PapPvGT(NCCQIRLA z)#gItBoZ1*nHa+BFHI<9h^9wY5=EhHnuHjX($RPj`hFZnNgR$wBinYG%|@|M+Z{gdSnZ*8p)l44`tEtL$63<#U`>e7zc9rJUe z@o;VR&Qx>iv!DKSu~7W&Z-4*Z#Y+&Q!1w$xD3{BF!Qk?x%O_9X@7VTeJiPDtiOsF8 zjg8G>p~x6B`4ishb#C6c)$0!(r-%{icRLn_2lwuoo0|y&KS`3b^oj?AGwKLV|6Od0 zlY~ZLG&M8JSi;kYFox;>am#4TU7o|nRO7zm_wL`j05?I%zNg>ot*>tI7#@Q=`N)n~ zXoRH2FH;jC#E_}|Aw+V3kojwRQ^9gAb$Z+jvqnCPb2gvsHxZ*Wj%fNo5U5*kxocu7 z4n?`?iwh!E4(dqK@w<09BWD*-xGJD1N-MCkn+8I61|=;e8|S4UU#mlM(4K^WB@t7`blCR}}$W zre!&fBfM+ZQW%CntANyn(ZvX5qpvENDsCVzOU-^1_*Wk`G7ZDF)2UbGZ0t|BWg3o|y4D`+*q5;CeE#K>$kJ1Gt%}8eHYMotEK5neexaA6Ez^&AxII)UF&l^ou%x{0|Nlehn(Er0)pDZkW z?d0zJW@{h_#f}vTa}# z&uwgM|Kz{^3?OU7;07}5kA60;RNP8s;wM`heHeLF*J3P$j1~x-blcD>nB`iSB%C-- zk@O8pKV;LuQNL??z0aRK91OO`y={!qa5S#fYa$!F-|4u;f@zrCjM|LjWMyUf=B-cq z{r=IT2fz27?>uz+v|BC~3Qoy&3p_f|vdv1lytTdk+;cCSJ$C^UQZAK6?w*>$1uu=e z0>=r4+)P+xc2E)1#qS0xOoKrfMBL#a{gj4-;b1VJJj)M4kj{gnvFX^&>FKgtLJ%{^ zCZ4~wy)pLFGF+)u9j9>f_VUYrdU+;3EKv#p341)^C6N`wu?6ZaI!q zZ~>re8yn?vMJ99skR9pTq?})$a=E(M>LaJ*RvQE(1Hp2suxoMW?!^Vm#LLUKAxIv7 z{IdrS9(euDbH9G>h1IpyB#GyzXFl_(Pfa|p)9Tue(;tm4zWvULLh*w}9?~OU< zE`44Lj@|F|Eyt=<(z{pi!6AZJ(!voym^+=s%|`9i$x}LX8rHe&b$ieLvo{_SdXO3AjxM@D%dzx+u8hE|SSd14&Q$VytItftFs zrOan*CK7=NA(mwk!$1nDMyh~<**uMMgdepNP+Y|9)yR)W zzjwLCKr#t32m}2M6k|Xe(ZH5wDkiIC02};ia z*$nVbNf?pycf*i+;)Re-Zq`(4HU!e-7z0>9=*szvlkLvZ!u;Cm#!vq77nl@=QL^p0 z3!neWr094-hzY7zE1nl_ZS)aKY9)&%5n;?GaMJ4b&Pe1+jC%^jD z>FK6n5w}=!tU@|J8K_dJjtAr4{qFZKzWCC3JgJncB4tS48v?pSA~qiZ&O8>OqKq-o zA15r4SCgg#I^}SVX`1P=kbpsdP^naAXJ^xIo5bls29nWmG9HdB$C;X$DVNItf;f)* zgI;TUJB*`Zp;W0<5yl@}`|#ygULFpIhYlX144gUh#-Cm}rvr`W`B4%9mNr)f$6T13I&@%9tzPN0Tb)k({u9R^fBZ8yK3V?h zKR5*x1~6V0Y1V zmv7zr@Z*n0<4LvFfRK&*y>iih;M9G4b}u0es`ZMnwvMBa5JF7CH@^^LDZCQOI?U(b z-e5R8H-`Y@6&gbXu<%|<+fay*fe=hs5(dGpU5g7lcD(uKIm5E#&?DS?K?Y7Tc~k0P z0YRn*76ddxEz2{+Bpu{M${{y(R3bwRyJI%x_UnzLF@e7v%c&=}8zxaf}z2 zmZB(B*YJL>PRA*+C~#9UN!`p;{~&diBzTIVn@K48Y0X?Sa)TmALUtb zdL58q&Z_3hLdV&>l=ABtcp%2TUN;QF zso7aXEC?~Bl$ge7G^PkOrl+A)9TTL$#^~x>mxh~LOY?JUch>&-r@thY+l^?a z(%AW>FAXirk0OE)jUoV9xmxzaq`f^rlvav_(HKEyV=!vBtzrol$}x}YhX7a@g{|#5 zl6>amfw#~6e);2TQ}qf#sMXrC9h*jpWm$~T;b1T|H5G*6M<0Fs(MKN>gg*W0PyP9~ zzIpi2LBlc~$F^;Yo3N2msT3#4E3dxs%rAeva%a62qLf^93XeQVC;&C6s5(!Qo^y8jnnaH0$+BxeWQx z)7oyeT3d`!*DY4c6@cJdZ(Tfp?)*nLKUv+_E)4PgBU|pZ`R{DOy^_a(uDb@2FL(?%(;c*(P&|D!7$0COPAbICFTzEK;$T- z7Yr-O5GUQL0P`$F2Y{R&7b1iWJ_Q1ZgoQoUi!4EF(55HCN(bn{lAoE}V=H^;Syo9| zHYlm_gDFQp$pD5rNhh5)h4VTDQ4qvYAeV1qamsSTuKJcN$4k+6i%cpqk&-$geMmDI zNQ7+5HZ4oqk^_*5Mk3FmkqMHm}~VOu5=l|w1c<^b zT)zg#;USvEjCy&DtLG)ko+i@m@4?zd)}wK0YNa&u#&GWFoG17A8cPrOhL z-+GlT38bPL%Uw8-9(}y_ARS~Qp%9(IA`U2V<2VMs`p%W!+UC;i%-ZVO&wl<(VwE?& zus=Pw_?55r3?e>%Oetb4rU?YBQmcAi+-?mpW3`e2;s`-%!ld77JCz!+iZNvcg8j|) zJr(Mm&Z=E=G@~{5QUjaaG-(F^Mh#(qIM(@3MsoiNGIePfJ z-}&~Vk3H&^i?(AGiiPxv#Adndnx^&E+wc73r$4`ZG(b#4o3q_NWI=Hl}m(>&<{2@H(KqMNr+o2RqM5OyWQ^(5A5F`#SxZ1h>W}VQrC5t zmsd>FfH{~_^ehAu&ztOCTKo_H)Bm`C-`<7!*;6M^Y;SKN1lHHrA%u@S^6;*ur3>dT zJoo&ItLs}dNtPCO{NM+FdGO%==YI3TPk;LJcDr4#RS)dncj(Z;sj2DPw{ER(Y*Z^1 zjLoxeyt#8}>F|*w>vvY?7H01`bmZnIH#axePaZq&IL>x!dtrV~NP`H%TzA3>ZlPJP z3v&`IiYp?B@FAF=CFtHnYg ziDL=pFsKuBcxt_p*ocG{!E<3kQV0m)(-HpwrFRgL!3C6M+$cTRWxY8^1tloSK*CtW z7Y*VeVk)gy1n?`kQ{i_C5vDMkVUW_Hh_@I;Q5c69YOhI@6{Aevqt8N^jjlQ44^EyI zRsy1Q@`!rNvD4BkP9w=t)pxs|XkiA)$_ScDLE$7OFRp z5!liPEQ~_Dv};!wMvP@+9nx-$3;?aZ$W;KQWnM~+z?#2puha?H|Ay<0Yrbgxv^5HpE!2#$)h`* zkn4h>icSTpFXV%O;_-9FFAxS{fKLMq^Q0LCE=f~9=|{{fwS&mjcdm3+Hg=}fcl~ES z{}r*TYko9d*tzS8Ct8ptNu2f*Nx~a_j=^weP`6T^1WC6&G8ruwOq!lM%t3U}+O|tI z+bMdRcMdk3ll$gg{@t%TTkF$}8ux8pd*Z8K`ob5!*z5HU9y)OJ$dOC$zI)@78y{Tz zuwJWv>s#M?`s+{5PEQj97Yh!?24ADPuIpaE{?UK=$A5bL%{Q@OmP=*6^q>%BdnLJX z61oJYl3^*IT%jO4i>MeGGz>Xi)(?DtGCp8G*&E}ya2Y2pRC^*h| zGU|8wlqI!#tzNC!mK7&4e~#gJJnjz$#5Ak5O1V_F3?mGKmD{&R<8i%FcZ1KU>W4&Ih9X@>c?AbSF zrl-H~g~zXd^zrk*dGW&!KaQe=5cuR*zw-3cPhGis<^TEnzkmPA)zha=f9qRMeenyA z-*fcn%-n+ORv!QC;|4*OE?qQj%Po~&eeKNb%*=hq?_FKFQz=ysA3Yq$QQ-NNYSr_- z&5iYig#~`+C)mIub%!!~^VTg4k!d*$2se0P@GV41kTVkSpg)+Kn`KENc+vv&`Og^0i4r7{8FHEu zFT+@T2R*Jp&5aUeOt*(XQjw)EvJzfPC#)s81I`Y1EwzCxGtfY}Rz$6uISm3MWEv(f zy*NFqs9Jw=6jLlRSx!Kf6(`NjVS@i8!Ctu`M7kH3XC@WXFcmrPNO(rFth8q5dyYAz z$|qBR00UfcsA5^f-JyJ4q;Z`hAFEbh-hF)63k}0?IL(TG4V9XlT$jQ$6-*eALM@$? zdtAAVKw4^~q{U1bamrN+r@Jt~?ST={K9?G=S3oud8ISiasF#c9!!Wq(%4K?G#6S+$ z0eRLMP@D~Z7+_==2Ev%%v{YIn10AI#gqc?kJqQ2n_+p7tIjAdznqrglDt(2LlpleAR9wzoI z2w(@}EAPC&y}Z6OGq<_A_OqWoOYF+pBnWox+4ba;9UAe)Dup!R@v}h0Hv-DxER@z@ z&!eraz5(L0Yq2;q5j0sc?si}l@0+U~+tqmOrRTa^8&kE)csOcz+TZ)`Uz~pMRHxOc zmMiUc`#=A~f4+YGdapNl=%EMy?ce^*Jx7lkggCZs+a`d>af)uSxUsqZ!V51x_nQ~J zFsjt*GKWu03A|So;}OhGr1SzKnpR+;#^!l90_x<2IQAf9dnP(O|p;M=!vxy2%t0p!9FCH+4_@Y?Fy z8?V2%bH~p6jvwOzMAjpZJUa2bAN}yh7cX57<0SCCy?b~6yZ`=gY{&e`PyhMc`3tt? z{Kxn@8V{6bK?p|7a`suIUx^-i#)hd_D7tWopR7wv# z@W96Uy6u<;4;=`ju+!cyxTPov*4NV-j7eH89mn0=+gP1A^+5lxb(Kj1iWfz2BR>Hqd=o%avvyE6mn6f)Wmuw=1#|wnhnK)3`MH6VVjmo z5XK_dT(%NI+Qu{^4XM0%O|#9U9#F}bM<8DHz`KdeSnNt%H&0v=?= z6Y7XBh~gx|i@O%XAQWa%*(9pqbC}x-${QlYX_%kcvmsVKo#Hd$Pbc5F z#c5lEB+kRXmMR^c{$QZS4xs88d3YcVgHSI`|E%Z{BW3m(G`PGJrxnUV& zFk3sLOs1wR(M8mWB0^xf{n2I~Kv|4P)Dy`$8Bz*t$1M~~K@bjyLqq1LnL!v;s(I`S(jwR+`r&#d3q`N&JEG`$# zB#BG{KsYAR`Z@;^+ zbK!6P_OBm)Kf;UmBVKHX4pcgOP!8xmGEa%I)n|!7WtEl~$|W zoT_tE##kgP0{&tw+a8Suqv6mkmJ*h5D-I~caFiyUcDrCZubw&MIE9m^?jH^ZNfPhg zy$@l0`O+m5qbHvD(pSFnGHKJS7xTC{`TMg^?UDK+}dtUP0w67f8MgK2Oc=p?RJ8|-@ALaQ?PH}yydzj zn#7x1n~O_}G@(~6UtQnWSeW0@oNA`0C58lxs>%t@kVmy*83$LeoMC@3H8X`d--Wl_ zhyjsAi9{nT{+(bLhT+`oT&-F@^TwOyQi+FEAQc)8<@vAb7$PVwM5f6_`8h9TF|$!& zE{k-ZEOOeQv=0;yPTDMqMF7?6&x{)c`SUJ$dNK%^zfe7v-o4zwx{d>B11D#;FpQ!o zL`rb4{M-aVSw%B2xzK|^=idr4i4aSsbEaV$mYvpKPUx014Fx%>56}U2`3681-`u(q zWY$#5_Dd62xw{rixR+FVB~e;7nB0rQoR}c{m8kdvK*k7!QNW$Bq!p#)H0dgqv;E3t za*9zMA;UF4Wv5T_CgVurB{l^NHkdr~tl9qy_afriN^7iwttk5qzH!$LXY$ z!Kx@LW0L(N3ybQ)m;@pGAW+?z5)X=a0+`!^Wd>Z_wwe&f5#l1GCcPYbEc!70ZWQ}m z&x3bC?8-<|cRGp?jZ|W#DisjvIz_2W^_Qknx_?l+5h(rH<+@ws9f_4&7>4RyLER)N zeuIXd0LXC%5khIBL5T3_l~f0qn~ovOex13YGpJ!rAR!ltg)3TwpoZ`fKq~7XWl53_ z!4QIk#??wmP*E7A|m?!jN>f+Y@itoSC(YF2a@{`gXzScRNo%^|fR7 z9QDHZ{q64gh%6mB@bt;u(-<>uHYwqCMb}W#f=t+eh)aP1$oh3COtD7t93sWl;7&`7e!Pbu9?#;e(4$e7PNkA&o%70Pm9_1u$VKNe?GLDT*1S z6ap595d_R}3SN+O+kMQEs%z3DGB6-4{`l(U&>I&D&Ui8!_If|~!S@dyJTw>#8uj`I z*FOBw4}Y}2wto2Vk$?9;{Oz9od!sPw^*Y63p9N9MiIB z6i<9VJ-l@mNDeN7imW1!3(0*2rOm`>(CKsl1C?s6)~q9hf*`~YGfI2C&S*Gv z9H-u>4Ts}$shkc(VK6&A8$~h5%q7w>*yUasZpjscA%rsS8UZ-y_Z_ET+4kA9=b|Wi z=)u#0=X-&7|A`ZoN@;P&j%Ks*&p-RwwGTcjm8yke@zbCB)TbZ+-2eK&{ijxc;*_iN z3-jOn#?ud+K7I6_dk!5uh!On5?|u&<`}hCu-@pCN#nE`&Xf)5CdkZ6c|NSSu$)w-! z)f2D#jZ$`L{C zg7u0`A&M+}4MM%8=RbZnr*D{_*BI)w;|xufq$8yI7ICd&z5`y2f{?Pzu{*8dOs|Ec zNL!XM#vsPRH-tN9GO_Xpxh(w zQ}KYRIuhK)Fk8q2omi>bEVbm8ouvxEm#;*(3z}Y~fOK&q327Q1>5z!+(|9scl^(&2 zP>y&R3xfb?J&}S8C<8#pGvrzUUV2T{YUp7dDuP@_ua~4WeM3Q6&{LOBmMe~3NM~PSaQPX=n8Z=g@Asx>W-&4iVmXcj5gLvL-EMzjVJ9|>QmMGO zbMD~>Pe1m^=`fBzY!6=Ud9w!(eEq?LizcB_f-z>QTjzib(-@4@_X`|aVl#|M?gsbY z1G1A7em^q#iGc#f*WSIdwY;`4Gre|a^B2!NN38PN#7hnxT>9FVx1x}nJ|%zx7E_QU zyb`CQa9VdMU$i7?4F;65I6@HE1;_W3VW)2*Rw`PICBeiK9uDL2sJ*rMSKt5Mv19j) zN8_ofsY~y@_v0V`xZCe8EbRE}zy3j^S&PE3R4$p86$F7{SnplD{LHU@ee3p$ZKsEC zdJsmT=Z(WKz=TjK-2m#ef%09k4C$dsB8bj>*T7{bG{Klef!}GjPM*B)```awv)Kqd zA3-=64r>`yi7pZ)Y>!@=PB=U+U1`t;`?|LiL-zw8H5rQW=B z`EndbC+|N264vc@2}1i1>|0)034^HU7UmZgDzyraIu=PH^1i|XSWXKn!AMU>>1kv; zg;uNMdH&q&Y!XW#nvY7N{&JC$sGyvu5cuB7Qzt*Xetl(i%_$Vpt0q?@{9`vvVh~xJ zSf-to{6i#(3{3KHDAU?Tmbnq+DiP2^VrgQh3>w5aM@2D&OuOSz?ySTTZqtJVwNfVf zBcQB@fl5x|r(YC>T!sYmN}JpymfI>SzdnI0AqZ{TP6tB57qc`2gq40nPqf-XOOJQi z#{#qNgTc&o326H+Rl8Jy6uViG5gyYdp@1d)>_Dnwf~?qQqnIqnk@SKNBTkT$U;+Yw z<=Dm?&fsoG2pT5e^{RcO{)9C2oKcIkO_!#oXTu=O6=VemWJo2{BPq}~0Lc9Spg#kk zaa)>R>zJEFAcW*@9OWi*dFns}DD#6ryDw+i8c+@SszMTCq^*W!Xq;Q$3oLsddQ#?_ zGl7!nZ~}SxDOA|Da)-)T!axX`p(Y=y>wsXcjAu=oC~OH=0i+Kn!Fnm6iYR~?uNx+e zMsX-?==A1<>ik6E$}E$I)2Y`sZ5?+3P;OhGHvpPw0CSU*V%W*0u|WH^Q6*$|$*rM8 z2^5?SD5IF$5eH#ZDA-6s@QfH~r{8Y3re|hM+XmPux-LnJO1!ds%QVojV~3jc+T)LZ zCQOo#I-{32x|JhGpL+Q4-lEOIh!D(l(z5^((h*6f7>j>mm}^y;$~n*7%DUec7uG@O z$~*6G-(K4>JGZjD{tT>SDrt%36GarK6*r-bPs1Qicv2Zmw#p4Vw@e&^eNcH+L{{={oGr`~zztsnj9N4_7_ z>h-_;{`aP*n%w5l0E|_tH2~p%`rrSLH_xBrhK9uVJfE-CCzEj)`DvfZmyq(9(S~}8 z)XFI10*iF~{#5pf8TI0c>3ul*Vfk0o_+J)V@DSkcU-%6{p88}pLpU6-S)PSURah9 z_#R85(+@mw{rU}rz$1@5u(r0kzP>q{c(d~hSKq(V?Q~8*_y7ZJJRZ%>F8}~;esc5p ziDO>i$4QLDHds=cu_(Qeh;@gk#7JaL3%ywb@|w<(70pz_yVbNO z$gNp(1|Di!;kZW-auziAMpk1MQ|6bdwx(4LA%0t@{RO}ODNv}kel_aYhnXpgM9QU1 z2&$j~pkd5h(aFGSs1Q%th{3%2EGtU-*WyobmPisOX&WdsJi^XElD`pTnhi)p-`Dq( z-dW3GmV+$3^jfB6N)uq!>}YWrR3J{)l&OycY8oNPT(i`=H8=aK+9T&?1T(8oRY%3& zQ4SE-#Z}t6NKpt=z?Pue<*y6m`NuxU8>Rq-c&n)$BV?pQuOaqNl;!pu@>!DIT+TE_ zESjhk`-|sRP@x&r#aLLjXZc4+fW9J_B@@~LfZ`~w*Bf!17zWQF1iXgCJ_R z+Kpzj=vETS3Z)_d382B(zxw4U@E?2RQH0QkcUI4=b)2KezxME<{S_C6ArVR`Op!SF zB$*SdMYi&r5J(I+TGN*DYM;R*^AZSqAn2sC?+2T=R+i=$mRHt({><~lEG-ZF<~;}Z z{`ogH!icX*`6`YkEJ}Fkr7)%_p)g4hr7+?DqjCD5cqL|(VhWf)CZQjW`mr}E6->zY zVXdw8Z$9*#oIm^XKVRIrgWsqI0;uGc2BYEM{rx}m zdwqnEZILkWDT^tK`5KI3h(ykeVVF!hj%fTuSuG%d0ZeElXGxY0zYu^R@HaL#4jno4 zZ~o>7bMy0)iD#K+uiK>wo0^(}fF(3R(mO(!52xc05I%`$Yjb0LeZ5|<-}va`+sn64oH{Y+^HI#w*kmor9EfrS&gVM%d0L)Zv@-m9AI%$xa^mHDR z-dA$b3Z*oPr8An=q{{d_pcCZMf)vGpbk5fT7L_sv6p2G5IAMf{mCi_n$lw=w{wljg zfwwC^;haH)rhonaWW9HgB-eQ-_)PlpT~+O-yT@U?2WAEy7!V*p5}-&55J)XaEy3kU zcZ$6WDfYB`p^dnIHZJb3i@4Ki723T$?urB`OF|$(IKmSin8A40Ju}_Y-dC5e%x5n0 zxy<2VR|3@2(_K}W`M&S_eLrKi(@E8le0nuXq`<+X8X`RgCn1OGZ<@m$F-jvM_`(8) zl%{g2F-g@25=D5+*0=zxF9rik6-J4v*hB3?X{K3Z8Uk*{BfV!cAi4?4 zNPuD8bR@8T^7cTgC~M_(LY@BYPe*gIxL85NhbPt?LY~+-a?ZPK26rJU7p2#8 z9ov?UM;{n3D%!9Er9w7kRZP{RFTvHW3FmCEcI+41^ejC zL8Mv=q*^Gb?C_<=KnCEOnK`}_5Mxw0>uP6Cy~UB(zHmcz?6~M5^{^)07f6zY&BpoG zb~&{KHZVJ4#`jL0$V>)pi2Io(A@+)6FV?LHktpah~m@&Rl-)Ofx*p5er z<;8_uE>rFw2z#A^@BZ6=^C#D@-#BpKkRJq{us1oslIib%?4f%OZYr{N56NH;q>>Sh zB0$zzNr*yO8_(bY4T7p_l_4sE)5bM_y9{)*)nZq{m<+YfI4 z_P6GHVLbU#8oxzGIH52uz!cC3L>y3n7==^<(E^v_91#Kti3iedi)}0&*)>*QnJ)Qq zZ$Ot9=N|deiDO6aAR(z%%jeHu_{+cgD-zFn@QEj$*tKJa>%?s$geb@cy&m~5KmKXA z69pN+zEN{M7s|vc4Z15kZvZXfSSdkgp7f5INXH2m#Cs~-o*@8ht7}oz``vGS<7;1k zJR%`r6d|~i@PAAWr4@_0l^ zwZD8&Ft?*H>a^S4P8%?o&*h87KG*eHjYin(_7C?fczSy3=FE(3yFuVD&MkiU@kfUbAL<_*SXo}l zX0yd&VRGt5E?2m5eX`T;{N7Vfp84X`>2v4y9y~Bu?T^nr*L8hwbknBSUVC+VYVyF| zJ=JRUwKv|_JT|&}_nyVY#fkCpzP`TcspD(d5Uk;fZqcva`_c)z)d-LdMU#a@R zM;`^b0;3{rSc8g+gKLf&=|V3A+)~vEq`U*l@F8hc#B^y^dBOrwly3N9RSb0opd`ou z9q%KhrO{S&cH3?S6CvFr)BnlA~po1`2H4dRu0A%2T9~B0D81Dvp#^S*KXiE zvwa1rp&urTUZ@oi`iH?(Sp{iWTG3>9LYtDrDVR zzRIWE7NysAZ1wpvm13bo(e?H{d0PfFPr4C3Qu8#A*rUlW zAj7NDlRtp^9uUp65N!$v4}i7WRo!)z_j(~ncsB}pjHeUFc5G=xE(ckxZd;^Q56M8N z?@2}7g2o97t5$&aX8!#+&z4-%1lu@pv;=Qy2iE9&)%rQ-1L zaHrj2l-mfeEG+`o9Vi$6>`(uvFHW9x9d~qWbG_N*5R8m$>I>ZF%uUvA_w|*$ARvsY zt1sRlOj-uj!yuLY#8n`v0?c``2a)VIF+%znkDt9Vf8*xp(9qGar5Q z@%q~OZQHgSJb2*m{_*FFiz|J7B?S4tgZt}^`r6w1*yz~$dac{*ZNKfdYuB&)uCrsu z_Am^WmzQ$6j9%c1(HBE$HYvX(rr;z53yFXbjN>M$R^J#H9Dsls&K6h4LW)r<*!vh; zt!8WQ-o3qUc;@W6TrPh5LhvR{l{k~FwOFArxo1ha-${Ov4-1Wa!W#GHz+Ulj6*AS(PNW+^h?D;vXUZOGN(>E@W-sFyJ3$p1`s49bO5(0SXo?Nnwtld z7K%mNbwy1S&8V6NnMu@Ah>$eaK*~u^9yJDl7nCU&U~A(1)wzkAn+AriPtN@FFJHI) z!nKXn(tXEwJ^9V)UYl|PDUE*|;hazuPr4B!lt&y8iYXH$EDi{Vj0jmU1B3xWU4-iM zv%5zJGa&rp!?$yu4FOtOTHL#P$Nl%;!wBuKR_EvE{;$9Izd7fWkfXOBx%b|?Gk(VR z1B6iEd&shX{5L;c-KggaMM5dIP}u39_$ou~W24|a9?$30vOQ_huM*oekuSc7M8isH z{IE0|&D#3fBM+bW_P3u#5cYb#APANgm%82F;LrfXh>#E=EZ034TZ~1?1E8wzg+gJy zR?FwIxqO~cB8OmEJ}|b6g~G&*>zs2Nf-Rdz2_cTq3Qk#Z;-g#&H_HEm4yKQY{)wZnr?z?w+Wx3VreDdjMUwr<>!9#}*9N6zVPJLrV8nuO`en1_({h&F$Yv%I^9kX z1fG|v)i(0EoN#ZAn^i46iXS|&7r}z892Z?6NmgPV?0Rmu7a?r*l?uWH5Nd1}q4Z=1 zb&MNAolg7CV@Ge?xPD`5DhPZ*h(jDum5n6Q1#T6WsPiig0h^_3T=+ScydWfe!G&eL z(*MhIKyJUFl8SQ4bWZRxgKcuCQ>0DhhSL3p#yzO?`BI8x5r!0M5HT6wB$V&Et}XJv z%nYYSTBLoA6xGJ0xh2?L>c0%W3R8coIaVpz6u5Q6ni4G~hFMA7HS#5HI7@oxt88yM zBSd_r$b{>NFow-rgqA=I0vI_mkqTq^^0dDb;J;mH%ps}~Jec@b0FVT%rZ0-|M@u(O z3B0Qt5(sX6zvgZ+GpGJViTc@a{LDsDQ_p1NFqIL!;!f*!J92syib+RixbXB0s(v=o zt4wusLZkjxD-W~SMbPX%mEhQLnbVh1S4$H~t*$3G*Gr;3AoW+Y6bfj(gKKBd6iqSl zGUoa$CDK5gan|j0<=u&~ko7uo>1C#v8`ipcE};UXprH>cJ8w1aXhpEHk5Q&6W~Zz% zCwsyN7;=2yCt;5%9Wn|W9}~8+uslCIj{qzbvbJLpO1VV5RVt+*(#OXi15)3p zVr0yHDfFh|)bg-({o+JieftM)+_?F|i@&zBrE9hIffIM{_|_9s?WR;AfVk)aNGJ~@ zL}^@gA~^~(6pzAGd_!D!v4#ty*E)#bsgyL+ti;p;EiyytoL>gvkSK>6Vl_X7a) zg+gt;_8!;>{LORAYwN{gIf|$x_VhZPFzmXn z%}rX0b{!y;$a<;Qg6eL@0CGxb6iGN{ZFM!9@&4cszIW{C(be@e%eE0lH*em|1er>u z5|Ky>5g7xH>xEGicDugsi@3?e6<_lDNECUV>-oVeFaP?b7hfiXV#_*saNqvD`!GV5 zBT^NFNuxC9>noM2{T0viqzyHR2<0@B%W}rM-R|(FVWyHH;&W8md;R z=g*$$^g3I%Y!$9~G?UFt&(1V98u#3N_m(XqXV08%w_2rQALroR_ud&E-n47Su3BxK zQnF*m&iR@7_4S(T1n<53-p8MO)Mzy~8qKA}#sliv!C@sVqrU%&1@bU z&1M2h=r3P+Mn{j_{@KZs^+r>$--RcI zsG>^PijX>*R2mW23JeGsgDKuH$z;~2kkSijp$gDgG1HNzavou3 zj8Nx-_-#ZPOL1%=5=OmV4+|qtuD&JyOdQv>Z5u<(Ak!a#s$mKzr+sBJ^>AmfLnes zOnF`Wc0VIOE|Vpx?pq9v_ncFpqWxoS;BDbo(6BVB}+l>JefrG>PuZL zW8!ay#uSYasEu|)B{QftOg=DfBs7|+phf8#V}^#GES#1!P9gq7W*rKz79fa%mf^-D z9o3{Pto1``Rtmsqo0J0-F#VwsQ|abexxcE1&)m>l>3;Na0i>2kI!zkOfaKyM*y(oi z`9ee~V@Lgb7L+gm;{3bf^jLl;}u&yUZJ z-yE(EOis=`|I62$O#WJ}HgMwJEx-GJM-R~8;jHVY_L&V&j;Qkk9^5EA)N{FPy|FPjH$N~?&1Hiy>}d)O@_cV) zWp!$DibTZmJZW0Vfac$c3Ysqz*K5t6{N%aQXU;(YY}>l;zI*oU*=<|4>${e1%L|o`V5w)Hk|euT<)*)oR6JA;{ziA@OmHt=Z|>^|h61e>I=WVT2Z! zSFenZudl6-j*PmV6Okxe$gi%hEH2C+I&kpFk%Lo{Q;UmBxm+G&>)p5B?(6G2aA04v z(d>o2W5jLatD3v^#Ti3+K*XJa_)$mCNJfkpi^cpW zpM3n<%P*J9_0J9 zK`ltc6N-le%IXUhjZ*q7LEFNNFvyu$v`6vKudAp^K2bUsh-4lu#*{{$RfawCDNxYgoaXyRGN?m=(v*4 zGwBeFBv}(lKO1q%A>|23DGf!oG++z~*IUPq|3`rKh$|o8#MVDek=Dg6HA(Q)Ii`VW zy}dLCa2hCwx71{iN;g)u=a%}V(Q7lm02K!D|F50mO+r09%NTM7c-(d{fU5)5z|VM& zD-kJ}G*;Za(u6c)hD{CDa&1v5D-co$14zJ2bpaA@|65>NaBFu0H6K%tiabdG()$2I zP}TLwsD7cuhoz4XG7(D(3T2FTy4_x{S1cA>*8>nzk@TX}c1V>IAgxNY_#6q>LkJVn zw5jI6C~Z)}(L-Ds{6SL+bt|PUS-FXyQ1>pBuW#V{{I zLqgJRiAfg$b@y|i9Z?m&FJD0X2xfDIdc9uhuaK|{qTZJueqiUeEr$>8yW{AQU%vFx z&FPsvd-hJQHQ&0rxSksvueGkvEo5A$Qp!1&#kH+D0?2n9PWa;7($f4Q#yDTfTNpD@ zhJ~V%LxvQ~1OOA!C|(S+0Pv7?^}_h<^_v6b>h#Rq^S^w}%a*R!>-`Viv-NksHrHuV zF7-u#6NU%}@w66kLU}|X0Z6QS0gX>OM2X-(^SDk^G4l6%y|tx#kL;Sia_-8hlcjvN z6PI&(;=%h0g@WsOw(CCk?6dO=3$|tVl?snM{7|W{Ped1BgkU~j{QG};{`!rZh=tJF+M4gX-}%mW9(wRWfdEIj zd~R-Lw$*5kjt(P)L{_WBBVpisb91xHD@#F;J$dpJBXn%@7@VX}om~>_RmXOmg~g@eO+&K0%3yv~X{FQ`>5`2-<27cDvod;lZIz!*9Lwwx7*v{0@ojs|w>w&2~r=W006W5YWp&?Lh>zCmvQ` z*43ORpsdhMFlAfAbm5RG3TlQ{{kP`gAea(%iuhvyqKLFw9UEKuV$QZ5K|r?*LZ^8d zNF9@jy#!O;h59`zJ`RE;s1TVh0w&{u8B38i4@y`|W({h1IO!#_NzqG+qo!za?R28C z0~0K-E*Dp^?Hs^}(002G5X3`+L!RSG!mxO{By?odH>tthWF2aI5&&*-tuo{;Gd3mI zZ~`NzRv4O>q?!qIs|S{Gr2Z|pXOyZp8s&wz{QO&AHh`4TP=FhZQG}4^1@WDag^QPn ztOu(2YH7EbMGY4p8jCMY+E#WHvXrT`L?>$n5ELG?;v%xs1#;9fJ0A)iOn?Rf<1<3{lwY1=$QjxVE;sZS(Nczx%DgcP$GY z*uQ`L+O^kSdt?8>1Dy!GJF&PBR3Clv@p~VAV2<$5Z!XQQHay4e3w%q2Fe{xf9KJ;c7qEO`gr_}Ct9JHC4@%|L=ujsl8psLM-K@_6ap~~14c0b&H35md$!r# zjgQ}WrI_~_iMs9f@nc5@hX)+T$!4=Jz3|J4i3vaOUDtW|krVy>m0T|8I4%dgSS-Kz zt5+^vxl*kTgdq_hH4|{UFj2*@)!2wXOv^FGz)&qOU_=PQ7Lbu@ARf&z282XQi%a_t z?0e>!X9oKFSJ&1o3;BUJesw&T&kqj`ciTP6h)T5N+;jcunWhA?{d)mO)_j`#QX z-?n2Lr4%7R2z4CWb^Vur_1a6ndKDon3VUN?qhI~nVeX@2^+!fWqh1&U9torCHztdv{L!OF0e}+|*E~PyE0;g`;C%q$p~Huojb@`+ zKYZv&kO|J6J6|Z~F@_dK5Ks*H;86cP_ujR0=WVA?pZWCTPw%|*=(oT9bh%vVc6!oK zoC6y88JTB%;ld@xx##=w$wQfK+l11Mjg3vi!<0l~?XB=9tT;MCt0X0WNG<^sQcVb@ z6qJf3MkBo^ zCvNZxmE{KemgbpiOop1cB+M%n51OT&fOV9s4t(c{Pf+SsjNdZ{yc>nRURSy}SdQ&E z4#vo~EMde3nFt2qikPa68&rjY+VfDJJF1-rirkwBWXwsPAk>C*X)+=7UKl2{;?x0c zR4qKI>DTNWN18g?B=p8RqfBmWBHi4#F0 z=}Nz&RHaOus&!#C+7xc=p!G{ZAf;8hMWSWu9#r!E7k>|Xo~MYg@fm=TR9G>VmL2i5|BJb-Ns0#Kw_x5N!Dn^5X4p--`lgx> zl$dXtPc13N=0_%AgDF=UL*US;03a}SR)|v4>-7kUv;`MO7`v{+wVvCyY$0A^!04Wm zTN8pr=nPe@hib!-+z!d56s@}IG_)7kEu%8fN(P0;r&jDxO~W98#GnXsMF_PT4GXb5 zj~@B7xxew-EMikM_d3>6zN4OhG{P^RK zGr24w;fWIujE#&I3I)$~5J2Th^^G^*`SkNs)#^YLhGzZ4)oKnR3_6`Q>Ggcy<*G*$ z_X&%i3KB&CVT3Kl;+JPzxL)7rbXwp1#y5WF8((j=+wD%rwr$^Y$0x?W_~NwW>xl?` zF6t|EUGK)^RI}AuTU&eM%{P7Df8fCf?tkE37E!TGh zFI>35I2afl{`jMh!cO<-(WC8Fv(aen*s)`af2XOT3-JA8xpAnthImx6EUVROXXD1p5vnjfgCIp`kjFs$11;QcwU-tb z8}&M+7QNBOO!9Q%x|J!-pD}r0xg+<3gZgQv_3RSH4^AS4S`GZ&_ok(yAV zt%%~5o<&jA>vjbjNmbRj{0t8bIgYC=d?lY%gm=fkSP8{|DTKg$)Y{w3%y=*v<@hbL z98C8eAf;C_;QB37wwZ}l{1wt$PIYc;CJ!+Gf|8zYDzrp8D5Y^@6_J!pwS3r^7!wk^vNrU=YLOqn{uf!0(gY2B@F8kozM0@a~r@<}-+2RtFCrB@1SdQN?^3I@_v zXo<0;$N)vTNqim+iA9&&9Tj+Kl;(Xyzidl zmoH!1xnpNvxzD!UU%vFKUN;=ux^1!1efLHU^ly6N(YuFz48t%$Y@k{g-MPgd9G(y9 z#9Do|-E|!|@Eu1C!jf=eVVrS;s2$Eu&o|aL0?*H7GZG+?FPe(|m50!U)0dW}7KZw( zb2Cf7c=6Z3&rj7ist+FD@vW~;x0>?g;zTNr2#XjOQ!gY0Mq=F?QBFiX7Ky2lfOsGl zY!e58&gx2mNB14s@&2nX)|ciAId5ZiZPW13?%g{a+b;L@UB7ni_19kYGeOwv-h205 zyLa!(X0pELSs3?~s~>#$@q6!oFgP$M+bnI$!gOSc7#J9BH|l}!29*T~eS(Xn@)xJi{kNY!w_a;tgb5`NJ$V0}cOMUe zK-vjF6##)G#wet*2n&QpEdFfCVHSBDj_-Ow;8!Z;p`jr{2}XE$c(_n1GT}8W7Ku!S zB#G?>fM9WP(YE3m?+3x`?A+|!?8xXy5CoiaFYxE*=6l`lzWw{Q@7O+mcVGI|%U7>X+<*W5Pd@o%shDfG z+5&2bTecvR4a4y4+4JMqu48O_t}8xaNg!4LBW1B! z>6yUKFv?ZZC{iZ0629e3(w)_xDwI^^FCf{xN_tgt^m3USjdTq%&K`O~PSOYy(*|9$ zgjKRgM-IbCSet2OmFS{uYW=B4fzJ7D_HvfR=Yxg(mPa`xEZPwP1{B(ev%$sa#zQ zB?@sv)>4!-bCj#9&L|Byr>-txm|e(>M@=oyUo?9A+uBS$bswqswsJn`WNAMZbK zu*1No*Oq5M?witK@Pkwy$ zi_fZk`NrC6F5?|Oyx;fSVxiD(wx9p`FF@Q^bniHP`1ae61eqYn_?CtH`ue{(d+ya& z->mlcGhw)pA|2|9LtIS^QLA3FCEO{W+W54kj7L14%&F`8jYg}szINiF2cLZENyl|s zt(FiT#+SzP{VU@W(*7cw$vCdNw!U%Y>eWuWbN1Z%^^J{-m#$p7a`o8JJHGSnr>m7p zyVZdJxW0$6`-@-v^5s`wbG@L|Zf7&WqmMnjci%qW^Bvbh$kJVc5NAV)K42_ekxc@h zu#fg!CzHt(3%Sv;O%USKXV1+qFXi$D>|hd7JqB=wxRS#F5QRMpTeXdKF~mEJQa|t; z8_mm?FBOWpp@9KPNDyRJ)>hZn*LLmPec-@>n^RM>v-2ZkBiAQyjE|2WK62Qx>~_1= z>2@w(9e?YscRv2;qs67AEnBuc^?OepI&^?WLMJ0+L!KL0j(dIb#+lP+TJ25{1QMpz zr?wh!kuF@e<*u%*ZQ3*>pKxR;4u_g|p{3+0a?y$6L5NV+>9)J=b~cxBJvYAS7$dpX z#L&W4uM;gSE^X8|Y}+m73x!g?)o5P5dZpWIyN zG}4Szy;u!{>i1@Zq$##CFbW)y(wQ3S5l|&pbs-!jx-An2t+7w2RX2JIzyUY@|Hz;a zar+p*02%Q>_v= zL%wn;lT}|AGrh~#D`p`{RU^E%A2+*gZXjy_Q(>QGl9UwYD56o+BN0{LP6~(+k$0SP zX4#hKdD2i$J{wG7;G9Xo5@RHrR&KrLE_|CV#|J{GF|G>Tr7tXg@t;2^7b-Nvmt&p&1pZmMr zd-plMdu49*^a>r_yZ4d%?!csnTwQ*%QD12Z!Vzj*NtTq5j~@0tKNDme+kWw%f4RP~!5QDRbNfB_+?5RiKL~7W^_44^$FIHc z!mrAeiX_WP%WagveLxt{3VJHzjKueb<2sDRa|2_P(TK?;PtG^im#TT^```QhW5yCmgl;; zOfFZ*m5TX%Ha9p>?JJeeobT8 z7|598xq!oK;}ab6&0DrY06Z^fx7%~mGh-v8hmIUvU0a==oEjJ$TwYq97{9i6-=4Yo z*>h(ve)jpPg@uKYk>L|3PCWdjFXeKXcDpTOLLA!-f?$1p{p6|Bv$OM#>$;93&EV4- z6>S3;*D%|*GuiCrE0-Cgo41TbB%bE63fsrhFb1p58WgQCZnrzFW~)>zjEoGEu+JapB(9+rXGBnt z#den?rI=I<8{_!Q6?;ml(6BEaf5S9=mY`Z^OX^~!F^M-ZTWr$KO{ai7^8|jj!@zetXJ46q(XCw z5?sURmJb3}8lcHr!Mxj%@0;N|_l7#y7%^PUu6BwUI4S z598yK#nZ53JN5OA*{NCD?#lK;xS2Kx=*W=Dv~2NYQ@v@1M)L7T~1S zs2{uINU>Nz7?z5~-@N;q@riNlSVM#T51n{0o6Guv?>laxSel-h|Hbn!6ia1IlSA5R zUhc8vlOqU0Vqph4=(d}_gE^HZX_Qlf5M)uWu`u)s(kLPr!?m?lk(6$Wlv{=|_I!V8dUknrb<5Zm z&vjhep^QyV-6-Y@cO1PV47(HK6Xi-}Wo6~cmCL73pRLt43i<4g9XlR>{A+`Q{k?9N zP!`WC2nT`3DY$s?@`Xzm8RveGGulaLR-NKj=i*XWmYoUw)zy{PUVV9CasK{$?3;>r?B z=y{paei-tP8LA)y$fSqIXJ$mAUKGhikA&F7r=t!cO=ODyirDu%8tR1*fLmrzov4E` zwroepw`BN@aUIacmjWl$vYb?z)H9ccZB^*2-lamA^5_FFl_rz^DOy01%wO`itM|>q zD4u(%@KHxN38zg+a}pHb+`@4I9(G(;8A&Mi7zarZzF|Fy=2eLGB&P#uxrr`_nhu=c z$GT_GoF2$i@dQ#cX1Gl1dL&Cm08>*JSDQm1gPC-11UMu#o_Z;XnA$c<6JPBxrtO@P z>;(ip*E4)w)5a)U6{do6h4mpF&wz7eaPf;JFRNlU6tNbo1Up4Oj-lxBm} zB42)PI&~H$^FWfzAVqbW@CSua5$$%n5s9>iC6t19#l+JDW0N3hS;+BRn3!lJG-jA; zBBazx@?nGlBhx=Y0_Y5+pEcvp36i-!VScN}fy0z1jJcl_W`kf9Mw^C*{_saX{Qmd9 zTdh{2s7Fb7@#2L|!^1mw?jnSEzCX9H_~~aSZ{D2UyKisE_~+LaZ}i-w_ug~+o-MrB z7EA>kx7t`a8~`1eiUDvb%{geWnjaV)hNZ$1!h%96A`c5T~5cw@EJ zZZyiJ(!#>hi!c2ex|!?itD7HtaQ9PBOtugs{LyGJ$+GfvCp%Eb#8Km7PZ$F=j> z;L%6FT^*+Qw+Y6BL1`H_e3y8C#>_r-2kL^})T zVIZ_gmW3VP%Vn~;d^VTO`o3>l7D8B61kN&?`#xEHCx<_m7N>EiNrT_Slzw-|KX`w&MT*zpr zaIhaiNGU;LNiNn&u8e)NEX(sfu`-Wa&xvc-CMK@s@+PmLTP>}5j3lasHIVgI}TGF zhPg~K2m&MQxt`Dqv*dCZumL95187m0xV0?-Rf+o=suT#3v6Zq-k&QDn%i{F(uREJt z^52uyQ+$Y9=->X?zj^f0FR!ewFcu-eFI>2=bJxzn$^caCpH0^X_a1uW{-c|Vj@d59nuM!im7 zUupA}trUR8<(2jIb-;Px`PjBuJbqDae+X^IDHKX)&zw7Z?tH0SURhbGluJ*1^|771 zcG#AH3dOe)LOJKIZHuCt&*ied=fy==Fawwhj$@nyp})%CxH0+aYrmdbSS*z*mW3l4 znK)MsIP+U=eYk+iDJ9gk9YUh{`T2IE<+v`8U8*wR1%aQ5qUh?CtNB8%+F#*}`<}nJ zxY%wrj~~CYSj?aN{A9VWzEmBpoL}RJ8)gEwy}QU{Kam!TdtIGTmvXVmR>uH{vG3Xr?o?bKhDg| z`9VM^0bF_;aAh9ERhX|j*_67-%rOclZQB;IfQ)Bj92xTnsI{&J z&V$KF54CtSH8m-t9$;*o)Qn*~Fcb?2Xu_B9S72hd9T7qmsG$yeuA)lx&N{I_gr)!w z4SJ3X^(s8|iW4e9YD=v<7Nq!l!r(%<>p|@=VyZ?`eN~y&nqO#^;--3-WpAqRD#sOs z%sO4oTSPH_DKyY;x)+8D*71t5M6cL(Bb32&WbwVr28BxM+y}=j9 zy|`E7zh>JAF#73dpH5uAwrOw}Fn00$`6IXA?z$djY|n{ zE`9slbgwY*mB$|$E@luR7PL6x@c@jmN@v3o5@3oK4rOKzgbZTB@(_)bgYsylTc}Kj zaCWuUX?L=o=Rm+oJjgn>U0dIH{f&1Kc4wN6O*}%W!=n)b{xoi#r z@WL-&5ZNL8;V*q@`_^ra>tu4dOeSO5*0az4T{k4zT%HnPxWQoj|I}`VLnO5dj4OY8 z4u!^yQ34nvy^dpB?RE=xYTx_nv48i2M+W^~r@m@o3t&qC8S-*b2Si!a>9gAftA}XU z!eC%%XxnYu@`XaL*IQUvY_;09?Z^*IIErx#S?y+Pc7EP-{rQE3+YcRl?6F5G)vCk> zMUF6o5N3mHF`q5ua*ku07&xZbN(hO@4kDP#X6udCTW`O2^3-Y94Kmp*r9>Dg8E8e> ztOEI}wf-<}IvBB#<+<+C%JRhv7gm;*Ereaym7Y3C?w!TaX4^Khtci&UO3B#fQNXw@ zq7_$`*A5*zFgQ545WgMg=&?Hv?AzN5L(8(VnJfh8>eVaf&Y$mg!@v(~IDg&jB1s=z#jtud~K;rw3L?qNnC_M4a z#9VWf1$v`@BnD>WW0qw*wk;=9z1Njad)%zTj5{JTEF>}K3YL}tTp&;hak7YVZS$_& zhZ3$UFbZB^rhDAZOVw+JSt z$121Eno^=tDB^3|3n?W~b;YV8X!;mRRep%Hpa_^APQdW-M5ys;kdSV6U*#fZr`NZPY4RY^ej~v;vop)Nca1i3!xld%aNz4NQ6;7sZt@y@f9E&~* zQJO{8NI6p(F1PdfD_u4@zmy|k$+0cVA`yG*-47|it#&83cl+TVeSe}^r<^k}-Etu! z0)&HzGDhP6O$ZM;h=l88#4!adVn7gq0A-i~n`74Q_EuM5ef_S3J2&@v|NPVcx8U0( z>PEfr?z@g-D}H*4`NGRDzqGox$|<||?mG|cKVV@ipUb+Qo6Q#f;U9jnxVqX`D))Ll znfk{-Tz?_57}Uf7Ci)sV!*B*9Nt6K_VG?#*oi>K>smD+J{#TD>L5FlZK$yD$AVUBk zL|7@@8MQcZc~r#RKHLh}8Yb;rK0iD%I=W>G!fn_aBudb|&jE;DYgOJr|Hm0Yi_w3!ZYwzxD+qRa#g!vFBcfAoWAp4qzfHpg*=aSM%S!-zxnamd&H3VxB}H01#VPjY08Ij^*>k0KgUs0>4&UzdC-k*J&3@IfRg^ z))1>>PCe^LQ)>{T)N}1^o40=U`4{3`6laD2FyqgX0yC9rq7p~Orbawg+TBVqP9yQ2AnDrx-#>5~1w&gg&Csldk7-LDOQA|CbnAjn` z3X=mz-0%rHO9J3YoJf>uZeYm7BUz7Z9C4Eztde(9pes-|JwPf=WDaZ;M!im#(0Iy6 zs^Jl35g9xG)SeimARBF)FGyHJL!Rd;+!q+NZ1Vj;C!8%eq0_R@lQM@q->;6YT}c{HA%bIIhZL(6pFMy==(k} z<9dqmWk6Zudki2?und^~MZi*KX;5uAAcsQZ2+c-8-=KQOY>KPiGeDCQ0u9hF)xMmw zo+!LjblN6_3>a=V0;T~^ublN^pnh>Y0b5uUV3@2B%+_0zvq4Ivoc>6Sf*D!J)@=vS z9_~nOS9Go#&Z`+@uJ{pwd9-L+#U;QYy_fA4_@9tZ`3lgR|1 zeg0{=uPSumH++pbmW>wEc?*Cwt{RR;!pVTh2W zO*M>J9MhI+0{0Y>P9QN*K@ziVcYa}RWMuR|{BQsJ(3WkVp1nM^P-m8x%?5$zN?UlQ zo@^)&7Gb%<5GNK7GZrn`BoA92soNkNiU;ED<^F23*<4>+iF!Rh@M^WSMx*gN-}w68 zeY+_kP{jTOzTekZC=~LJZ3%NxA_b`2kS>ula3mJSekPcnoqOwzcW+EhXR$nw3LiW31z2Mfqly@Cu%~dGpNaFE%zdf*{Ko@3dRhO4+ikcDsWSwp|+`fEDD6 zClnVL67pKn#nGB`O>J<=- z_ANG67^Yh2WG;F7XkP-el;a#Ywq@HkV-igS$tP`gtwx*)c#@&03bR}g%M*YJNx6kE zl;j2Vb);X2+EOC5*fv9(MyicyC3y?_c;+IZE9~{8{0${z4+kK!^EQ060L!9Em4rYX@HEJ2Xg&`l5t#l zE5k%KZR!e%FKp zenV;>t1GP3EMnbFvLvS{^-`pq%LF&;L`s-0yXtWhGfYUt)upn^sf}Cm@g%!;20+4^ zOH902vVPzkShnT4zM?)ty=m7``}&mQ#ytilt$^0UnHd*C=^&_AT@2|cQ%#|i#D>Iz z8z>Ok%lM^5bsbmN1hR$V;&$m*x&;`=vIcnlqrl7o_y$l)8WpTCjcfT8WZ; zka_QePo@`EGeIVbdKiM``T1@X4&HwIdbGaN^R=OyD$CxgI~YG!%nG?TU%M(y<_{9Et|WoR=Hf7nwH%a~!YR?OwiorI^cA`>Tvc z0HB%K*?ggx$z;!*IdlH}#V8`#TowXIIfaRnGSb{Bb>RBG&l&shqxV1j;KTg~_x<_5 z|Mw3)bRr_O)9J|BRHiI*z%YVACK%Z?k_m#>Uw{4OU%k9<&+fbKI?e=Wi!4hFSjLDx z(&8c8!P zwbB=Sb=PqO5^5}mw0wvsJ2MW{R$SjMP?FkxpYO`x z!NltrkXnN-kSd3XkZNKKfGJ&RY8FhDzGOG6cD(wo;T&LW!NW(6j=KXCQSTW`hlZieuMbQNnnj4c*ME6rPU2xE_j2!x<%NAO_O0HGXzw zSIShUrir0crSGtMy*@NJ(C)N$@7epk?|!e4&$QYtgse<1J2O2yK0dK$@9svu@!6-J zZyFh4*!%SI%@1eVk3RL(y>}jBt-51dB2N_p3>gL>KHM<3ZD`vNLlIN}5XKNoa|2bA z70(YM2E{4JLEf=Wzy3}*GrwhE=+jeY&R@P>ELIo~5hGDAjC!59u(Rh+{&j2fXrt3Z zl%X&ZwpIj0OxSKvMi`4Y6ANIAA{f!$#yZ=mZ7v4;NBX_6dG+k)=Rf$EqG4sGAI*>fDhRkUo&A(XDJE>6$Q z)$3hBo(d$wgp{-j(1>)~t%HXT96GeW*9{5d^^Mx%!a_EmwU8Zu8Zr%6#$C!|K$n#G zy*RFITN4u#@4fSOkj?(!htE88;sm3l-R)SG4V3@@VQ~gB&T`odg!rAe-ue0SKd)9Q zPe1ka=-6nZRaa~mXox*xSrZ>06m#Z)2w+T57Gjhy^u6)x*O!+T@4E9?tJOjXbFH#8 zM_<~#&IAFA2cNh>{=fX!=jIkxgG?c$A?7K|J$dP*d!(xRDv)2&*y6)b*h$1EeB5C% zB<>9fAVZa^E$y*c7LJ)Fe!7U)!_OhhNd?5uH3~CU3PE5fhJY#ORHfHv+|11YG8zwDOt8a1Tx6j#ZC3?b zwG86YK*s3CMs0L-tlg@Qjg9{CAOCCD^PA0hI`KTO*=T(B`R6-!?#$)$@4WSPCYQ_Q z3X?0Hm%f-9I&$ZCo_yRUZH#~rD~rw^V_?M}E=34AF0c`H5JEN*tVm&<1EC;BVoASH zM>?PYW?lEfyT4hxczxTZ;Y%0CKlt=at}-~gIOkblQ@M|H+MM)O>NU1^*RDVOqp5Ca z69Ng95&9q!oaeag#BV7cM7y+CtHEYtTQS(vU*PNWS5AF?`QrIryA!yMg<-qZ>UKN* zmGbuOTly>IUZ*P@f4t{^@r#YdM&P zcdCFtnQUpP@S@;?Yt3Yee%!l-VTdfWwz>)d`?G)dKi_rNT`S8=NRY(U)r_xne6rah zg?D{@dFAHS&cZ|iH@8*&!Gh~UNWv~`u;qK1g{6g$KlyZKele5D+m_8Jfe_1kByru*Dha4G zC0tT)|39+cJIc=UybpZK*V`>~r(w{ELVyI(2sTh=6C+t(DYBzjcI?E7*Kyk#@7b*F zv#UM3=j=Zz=fow)CCO%GJ6YM0Y}q13QWSd=zyg2(h(2i3XYS10`n9+0`QGw<7hdWp zVqgGs?^oXEd4A8Y6ax)Ji;Ig_uiY5*2exbH8QEB0uQ$RY4;`4AoM4pbo{<+#A|u5C zO6l6#=EB0t#`*?8&=QXS0-IFlZLhPjb=%a*lP7)GUteGU_>)g|-?tNElL}ig1%Dy! zLckTW;=2C&M*Gb--dI{({OVW#?$>|zXQC+T_j+9D? z+`?DB^5v(V`W$0yI7|#&o;F-0;vnJNUfeJXq(1L9P?th$4NViX1|Y80YcIa=y3wwuY(OkACp{{oXRS`Xj`OW3o<}~VHg=#E{0AfS^HxO3osUpFwF%tcbpHZj}R#7|J+fj$2er&6EUQya}pgxT=f=Ehuu-mq)TE^Z2YI%J@Ahom>FCWw)gQFj?46dk}EM{ZuU;6C554_FIsnAV^14hYQf8)Mi{uQwQ zfo`u~R4@TSL&8AD5GlrQnv!&*Ysc}fnzu7F(&hOJAHF|#;|Ao+_Z?38px4dwWOAZ) zVBg;9Ez^R1*0n5$QSkE1FE1`EVgvu3FZ`VY2lfF3J+PMj|HLs?%VHpzPDv&Cd&v$2Ir+sI+qZHZ99zf zGiT3!{LzOG9K8RRe(9e+_~3y-f0$+jnMkpM#P=7G+#vG9Bu)P6yMOia_g_AC?C96O z{`Ile*r3;^oMJ`VDNkHgH83Y08#d|cIM{SxFGtQgoLaJXai_rmuZ7{a|Kh(Ohz=il zsNe4vbFdzP#JC|iM-0j0#kA$Sz>jm!3+^r~|NH;vTW(Mj&W?mLDh61!C>QSxQ@bN9 zK9m@w2qTOU8J~*vnoppl49Ou#tyEFvn^e|GWvVAdAVvMs@#_p?fvPd;Ii4Q|OjZ=Z zCn$Q(qOu}Um-OmZSq*TdJXD$`Bol){wcO*Nnid3{D{$}PyvisgxzJHE6%hy(XeVVg zf>TyZz4CB`qm@Rsw5X*I4{m|iexKRa(nb6S?##> z(sYE64M)&qHB^HUz$|!ms_k zpL*oPql5l{Gg2J?0J^qw>eMOM_qT7~vAnc$@#4klEi*YspWIx%K0r@?{+T0tx6^oN zAY92E)VnO~FID#nB^gojtpQf2KT@$%;v-WQx!%I1tJmKDa7Sx$b$R90*WRnQCU34S z*PnR!@Gt&c4}dH0zP}|18KaO_@MD|IGXEB)x9vyS8Qa`@K9(woHwG?&Kp6A3t2LMg8t3g4{B#x%v6mUVDAB)1{o9 zJo(s>!w&%rJlAP7n%&OuTYvGFVbnm_tPCckyCg(R-*0i|(BhSs;ECwr5Jv6w)f10A z@>{?4o00E#HaBe3tZ*zHN>fakNRiSg%hN375Y?KK+x8sv$F_BH`_kOT-1>lFGw>YO z70e@AoTwBb#bA;n4$m>qJV-)=1aRo{oV-wxtriwT^;IB1~!e17Q`fj!MS_Wvp9Lc}CM*OM7bV z6vBnungtP(YNb+I3jwB#Wm)lFP)fLpzR-Q7X6nF^HDN_+z31eH)ukzoFZG68T`&R1 z;%Q;Tfkw=nM_i>x47Y&hL6<*%#CQ#s34rjP0x4ICQX(VcZUi*Rba{i)lOYo{E7|yz zvOoPZbr2rZe#|2Sc2&7xg^NP%a|z3vCfg&~+hF9lE`n9)VWk8cN!lE_mZeJv!)g zTzK={?e%&(9KQ7O>uxx<*zJM?dmjGfe|%-oYi-}UarIX3&Yh<3&^$8?+*w}6^}4rp zTQW=##0CYVJIGd6yngRM&AZQ_8=sy1=m#%cJ#!jlX*~=vfW7`E$>ZHSra$-iV~-p^ z68P@0-zOwD4P$9><*m2g{p6FgnE>tg?%DIm)K`*)fvZs`k%gK*pBUZj4`CR z{L;5uwmBj(r>MmoBVYg~;doY5J+#_h-MVf2zx-GK!nN(epvNeoDqsWR%Dq4%X;NaT z33HUtG|Q|Y8r!mS%dUgKZ_c#`vkU9(Ug~&J=m(~Wg%2~6KcA~zrI-h4=JL!#u@4i6 z$2J?9JOxF^iMgL*dM!gH6glz0@U?GX>z3P;6k!vR78t zE}Z|Y-ClS6;^kdmT`^7g#N&@V`si`r4^HvgzaBe!WH9I_S!Ng(6nsos7#J%CiF&=hxw-MjfA~k=`|fv7KKbM?{nKBX znVIhQdq4>M#5=BCLW=rXyo5F#)>wNQE>G~)h;v6Tisr_&Ow*EEK^5B% zWlFMEjRL*vhKiA_V7ZbtJ5qFk5A6m+VM`|zERBt^5SE>_nF&Qun6HiZ1TehtSEm&dK_e^`$;0eGzn^`#W z-_kU!>Odf`203vd1<4*sB$jcOXIYwN`b((2y}aIN^uRBRdf5z=Gac7zBd()XG;j?^ zv^{$CgBU@_b@g~XqNy68$5pjQcNm}~fS0KmaC9lGr!0A5A{~Du#1z8O!ZZw=Wm!Co zxfWMdz8$5Wt@^a(A|GkmGpw2`J-@>;tYXw=W#nKJ4Lg<-Fax8NUSrYg&DvC1Um=@XWo%_M-E!(jXc=?srDR(Z5gVXfB zUE81j+{q&k9&l~5D1;*aac*wz-FM$VbLP`-uMZ#!>(O&hKmF|IpT2YF_VmPr@B5A) z{=eV)cA8P&uMt8d&<+HwF3cQ7V4s-b7!%aQEE^8{{lTEu?e_=6e!t%v4hM1e!&iUU z?ewOmr>CYTP0P;nRMJMoKRS*TjO;o@KA4Ec$BYx7-G2#d{Q2 zJh0T4lzIk%b^`7>?qD#ybmhveTel%XuIKc78*#6R@ z2q9Cr$71OvBeGRc@&1YI|Khiq(&CU?7Mf@^rzR&cHanZ0B#DvGC?aUAZ)^ln02mE| z5D0d;W!a`}Ub=kgg%`h93&P+2t>6CXum61j;h^7>kxp{)qcmZZg+XYV*7sj}>Gyy4 zcP-QU^{c`tEl02HXqAfwN9vW7^8ywvG*iC>N_~txe7GUHC0(ZUL&8fg zF&imG5{9i-W%9vMY95tjSfP4AF`u-dM9KOVU(dEJLP@XJQ*vlDQuanC51_@Ka;6(K z*3?Cy%zP*Zz^b9t)=SzggBhj)j~qD`MFB)w$1*xkk1kRxyI)P#;VNCS6b|W`O~yK~ ziW|nO`XQz`xk2WG!7$4+3^6aOgG|Lx$S*Hj^=g-0qR|qw=Ve6U2%@b%JJ-x@R#M41 z=O)IrdR>P$^U}ju86S^?9qOg4&Q9bSwH>8JiH|L}baO@SSdmJM?7!3OT z9+prlESnRcxK8S^lROl;Y2&2>N@eoJM>?JIYeP+H6W3ia*EwL6T8>?-)dcXMJy0N( zWKQiKU0$Iw|4_8R99A!Y^uQS*2Z}pF)#YNWJU8Xafg_i@8jYZ)PUVUSE zEheUW2j)NaTffm6Z}#E@Qou+WVQ2O~|M}ntuk4$dBFO+Eu-F}pJ@HiQ@z0rq&O{dX zX0P5p|H;a&TNt3g_lj4SkYt#cCcJO=wgdb3OpQ-alEq0<91oPv-nx1I{DsAZWkP6{ zlQ8rTKXmBWBPSYR;5g>O!W;nT#N&_rr~mw&J9ifwjaHr$*=PuunG{o?K#KEB?xZrp zawhl%>gW?Jp)^Z#0E4JL==X<%exn|qIC1<-U;N@j4<0lPV>lef=}@`o3kL}fs4(JS zfGYPMb)sr!1LNF8rikUmo%Y)5+-z^@dc?XrCf%t<;6s?DgFKIA77Zv_d@{3@BWyXQ z*J#J+FW&g9760pZqD$^Sa%xbcYm% z+**l2nPpmD;Ga2j?oYq@&0fF%cfazL#~wXF8A+22Nqh*Fp)>+-1{`r>@j-)cOz<_I zcTARY$@&r8w9=(l$#$XHLG=}LTN>_28S-7L-y3}U+uu2U{FrH=oa92gQO>8LVO1}- zJS2cv4kJpb?b!W6{BQp4zk`Nrnzr_Xh6v*%Pe_sq<3Hilr8QBaJjqfkb6U&&oth1h zwrLb|yS9(kV+Cgbb0&;*C8?e39a3@I9or5CVWkvF3hJMlG(;m(loeDi1?9LV)$B<4 zjca>+b(}J_D&wQGqTGv1>*(U{aRgD4q}^T*Np-Wn)?Aa&K-Dak)v$D#U?sY!t^?QU zgrm~Wl2oLSc_bLJHavRtco_N!R%Hcf8kHP6MogPVj8FBqXPj$SIIhJ8P+OJ()uf0; zyYl9Tl0C~X0!f;sNh(Bg49ef81S4AS1gnClzKQ%~st}eDhl-6YBmR);^i)_ptGG%~ zgz%tRqp8Rg_v~8lr7PdF1m-28qwBnCY!uyIGezYtUP_e}D5GY5jtxBQ5BmMSVVF$g z7*cPcH}$+M$(nst>9I5=L zEYQtLX_zXAj|xcvR6;n)$6fltfYOOl{%I!flV##G9>&A?7yijFe&LH>T3>Hdp)jM2 zaUo$CYmL3}#_R31_M?wIF-+s{efNc#=^5;}*H#B_U+-)=c;M?l^(7xtB+hHOI}&+4 zfQo+++glRhl zGEEaBU@FFl<|88ItSH#t;yo|%HoYF=#g#1zF-b|5W@#E{wD=Dj4&vqI<)y`?-e721 zhHV-5@89ow-r2KfZr-|;)BJ&h2mjCi{r|9RYrVaWO{_?{@+A;V+gcQLJDorKvp+d? z`t*}ep8WAIelhUF!JsE~H97)U0(>GOk5hwZ4bW-vwSaBdJcc|&>d-`r_aRSO)tVcO zb8cAcu->+Jl4vF;+;M}2g~gX%dhvLryCf#$a8L>$gY9!2%fE?xhR zfBF|;a|{AG3ju^tCd?)b!QDY6#3>ok5E-m8vW6Pnoxzz_UM;vo0mMwKwT74zQs|u5a8vkV4?T|@EKa_fA z?eigGB}55HNz(21gk6s$#4%+Xz?e=(W+Rg@uWC8dFXSlwxkRglgQbo+7=cV7WR#n> zg=c1_ZQCx*t3b8)tMKOv+tUjqr1ijXG|Nv9r)pZ)-GV|`#fOlcyEF`=MMIxg1gg

Q5i~; zHsbxEL1|urG-Uxp+P$Z^*@VzyzEP~PlFtmaN=$usUefqRVmPWVT0+5~G`@lwFV~^? zN_1QNuSoc^rG`;UoK@hpnwTlqaUpyZ|A0D*Op_s4881~P9INkNa@CO{?An$&TwkuE z^f!OwzkBkT=a$zynxrOWPsDQUOP4NxdhYzOW5+Gqd*h8a5Q2dptn}jdt}cM)%=4dr zYNF->MzMJ5v3QD$LrcgcBxMCiEx)w;RR9XAb{9fg$~X@V>-<~qqzm&~C&n&cy!6T0 zOHp(Da%bb%Fa1Jz_<_}K2Lldr3Nr!;Lm6{y4<-5SQ}4HG0m)Oy8D{y-bDwnQ?wXv| zBHzYFnxun%-?ZS~Jv&bvKeA`{P6P2|I4J%mMsMG|{m#4ZetPlJAWpJ8M;JZuz`^G~ z|Ll>YhgxIJS{Q~=)EXbhrv1^!XMXgf4{zMO)9DU2H#@^59`pxUT9j-qqiV!Sji8A1 zLr8NvxQgczi+e^X1;Fzop(kLyUdIwK36|rouD4H}{^+&W-@0_^3c_f7YO+~xU;`$S zW5NMOWgJ_%{IA?q#Oa6`XK|8JfTG6ujy(tc*4DKIeRgMUsolpI2Z3W5h|-)>YM6%Y zM{{#4@4fc++>KcW0oO4G8IR2xLk22$fubHDZPcJxKLR^3Eh{7J`nA~`H*QkS9M|mk zdmHWc)-4myJ@aGx_wK>PY$`ee;Rz!x(V(2-#fDpKQ<2{AXgi?lTBL>Pw-r&_zfEiU9q;!v9jBeT?R|!3_hi4|2nek|b-jT2U=}>z#LY?cS}Pi^`Lx z@@oQmttu}M!YE1NT|0MT5eDUXK4nz35{wlsX-T3{0~D7UigHWEWn&=D9;Q2ZZQnd{ zK$f_oGQ>jKkO~3q*$e zl8kKIy5;0!50j!}VYoOYM)p9ezm*&Rk)91`&vo%7nDCROl-0f9`st6?uU+0c)>xWf zc=OF4HJX!GHro5Y_SMN}pIX{jFPiF%f{dFSnJEWro1N>|w_qO6-Rdkagsw~Sj8o!T zmghPEz&J^U{chmd_us$g=#fL)w#}FZO5=eTx$vF4ci(>NoeLK}OS3$qEJ>5Sd-r_d z?>u+>*wOLUSX2+2&Bo-!q#p!Vu3Y;s-}&yxXU=+F*cfYJjEBS6z=pI_mdB%ZG2v4G zCJ#oLy8x99Q1L?xrR@B81m@04!hHjjMyB6j316mWeejo?lqFbopwh+jm@t zak{d+U_$WZcL1AUgbqPA~7s=9`dP?G#@1B`=(Kp zbl0<8$1y}8z}A^9M~@z{ZTpjt&tyruci(-_JoEH3&pZtwBzgAfg-^4b?Ag5=Aef~Y z#;D$GE-fzo+u!^B_uqT}t3UbGpZVFZyRMtWiG*ZFJ(I)>ix4M1-JIYnThLmQuUNE) zI4MaeqUd0mB%w(vYR}0yg`C@t+b8(^t<}XIueY{fWW@1cX8U%8(5WAt-gDo5ImuMK zsni9j%;;k1K)m!YED8_AIEmwj9z3|bxOjVR&h

C}14p;&zC(TQcSt*TP5yAp-=e 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 z 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 literal 0 HcmV?d00001 diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..77cde62 --- /dev/null +++ b/site/index.html @@ -0,0 +1,43 @@ + + + + + ViperMesh for Blender | Open-source Blender MCP + + + + + + + + + + + + + +

ViperMesh / Blender
+
+
+ A stylized spacecraft asset +
+

Open source / MIT licensed / Local

ViperMesh
for Blender

Give your agent
the tools to work in 3D.

Connect an MCP-compatible agent to Blender. Inspect your scene, make structured edits and check the result through one persistent session.

+
+

An agent connection for your existing workspace

Structured operations

Assembly, transforms, materials, cameras, lighting, rendering, UVs, retopology, rigging and export. Discover relevant tools as the task develops.

Inspect, then improve

Check support, orientation and clearances. Review visual results and repair specific problems. Diagnostic checks support judgment; they cannot certify every scene.

Room for custom work

Keep Python execution for unusual geometry and uncovered operations. Batch known actions and keep decision points where new observations matter.

+

One session. One local connection.

Your MCP clientViperMesh serverBlender addon

The client launches the Node server once. The server keeps a serialized connection to the addon. No ViperMesh cloud account or Docker is needed for the local connector.

+

From download to first edit

Connect your agent.

Use the Blender version currently tested in the repository and a Node runtime that meets the package requirements. Keep Blender open with the local bridge running.

Client-specific setup and troubleshooting ↗
  1. Install the addon

    Download the versioned addon .py or .zip from the latest release. In Blender, install it from disk, enable it, and start the local bridge in the ViperMesh sidebar.

  2. Build the MCP server

    git clone https://github.com/Ker102/vipermesh-blender.git
    +cd vipermesh-blender
    +npm install
    +npm run build
  3. Add it to your MCP client

    Configure the client to launch node with the absolute path to dist/public-portable-blender-mcp.js. Start one server per session, not one per tool call.

    {
    +  "mcpServers": {
    +    "vipermesh-blender": {
    +      "command": "node",
    +      "args": ["/absolute/path/to/vipermesh-blender/dist/public-portable-blender-mcp.js"]
    +    }
    +  }
    +}

    JSON configuration above is a common pattern; your client's syntax may differ.

  4. Inspect before editing

    Ask your agent to call bootstrap_vipermesh_session, inspect the existing scene, then discover tools for your task. The repository includes a portable agent skill with adaptable operating guidance.

+

What to expect

Is it a 3D generation model?

The connector lets an agent operate Blender. It does not bundle a hosted text-to-3D model or promise production-ready assets. You can use local assets and your own Blender workflows.

Is it faster than UI automation?

Structured tools are designed to avoid repetitive navigation and generated Blender code. Performance depends on the model and task; we are preparing reproducible comparisons and make no universal speed or cost claim here.

Does it judge the final scene automatically?

Tools provide diagnostics and image-file checks. The agent still needs to inspect visual output and judge it against your request. A passing report can miss mesh-level collisions or an artistic mismatch.

What can an agent access?

This is a trusted local connector. Python fallback can execute arbitrary code inside Blender. Keep the bridge on loopback, connect trusted clients and review destructive actions. Read the repository security guidance before use.

How does this relate to ViperMesh Studio?

The public connector is usable independently. ViperMesh Studio is a broader AI workspace in development for artists and game creators, connecting generation, inspection and specialist workflows.

Join the Studio waitlist ↗
+

Start with your scene.

Try one useful edit. Inspect the result. Tell us where the connection helps and where it falls short.

Share feedback ↗
+
+ + diff --git a/site/robots.txt b/site/robots.txt new file mode 100644 index 0000000..e5b8291 --- /dev/null +++ b/site/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: / +Sitemap: https://ker102.github.io/vipermesh-blender/sitemap.xml diff --git a/site/site.js b/site/site.js new file mode 100644 index 0000000..97291e4 --- /dev/null +++ b/site/site.js @@ -0,0 +1,12 @@ +for (const button of document.querySelectorAll("[data-copy]")) { + button.addEventListener("click", async () => { + const code = document.getElementById(button.dataset.copy) + const status = button.nextElementSibling + try { + await navigator.clipboard.writeText(code.textContent) + status.textContent = "Copied" + } catch { + status.textContent = "Select the commands above to copy." + } + }) +} diff --git a/site/sitemap.xml b/site/sitemap.xml new file mode 100644 index 0000000..661ce6e --- /dev/null +++ b/site/sitemap.xml @@ -0,0 +1,2 @@ + +https://ker102.github.io/vipermesh-blender/ diff --git a/site/styles.css b/site/styles.css new file mode 100644 index 0000000..703eb1a --- /dev/null +++ b/site/styles.css @@ -0,0 +1,54 @@ +:root { color-scheme: light; --ink:#172924; --muted:#52655d; --accent:#0a765a; } +* { box-sizing:border-box; } +html { scroll-behavior:smooth; } +body { margin:0; color:var(--ink); background:white; font:16px/1.6 Arial,Helvetica,sans-serif; letter-spacing:0; } +a { color:inherit; text-decoration:none; } a:hover { text-decoration:underline; text-underline-offset:5px; } +:focus-visible { outline:3px solid #e58b46; outline-offset:4px; } +.wrap { max-width:1208px; padding:0 36px; margin:auto; } +header { max-width:1280px; margin:auto; min-height:80px; padding:20px 36px; display:flex; justify-content:space-between; align-items:center; gap:20px; } +.brand { font-size:22px; font-weight:700; } .brand span { font-weight:400; color:var(--muted); } +nav, footer > div { display:flex; gap:24px; font-size:14px; } +.hero { position:relative; overflow:hidden; isolation:isolate; min-height:580px; background:#14231e; color:white; } +.hero > img { position:absolute; height:100%; width:100%; object-fit:contain; object-position:85% center; opacity:.9; } +.shade { position:absolute; inset:0; background:linear-gradient(90deg,#14231e 0%,rgba(20,35,30,.95) 27%,rgba(20,35,30,.55) 52%,rgba(20,35,30,0) 80%); } +.hero-content { position:relative; max-width:1208px; margin:auto; padding:52px 36px 60px; } +.eyebrow { font-size:12px; text-transform:uppercase; font-weight:700; color:var(--accent); margin:0 0 24px; } +.hero .eyebrow { color:#c4dacb; } +h1 { font-size:58px; line-height:1.05; margin:0 0 22px; } +.lead { font-size:30px; line-height:1.2; margin:0 0 20px; } +.hero-content > p:not(.eyebrow):not(.lead) { max-width:420px; color:#d9e5de; font-size:15px; } +.actions { display:flex; align-items:center; gap:24px; margin-top:30px; font-size:14px; } +.primary { padding:12px 20px; background:#d7f0e2; color:#163a2b; border-radius:4px; font-weight:700; } +.overview { padding-top:40px; padding-bottom:64px; } +.columns { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:40px; } +.columns > div { border-top:1px solid #cbdace; padding-top:20px; } +h2 { font-size:25px; line-height:1.2; margin:0 0 16px; } .columns h2 { font-size:20px; } +p { margin:0 0 16px; } .columns p, .setup p, .scope p { font-size:14px; color:var(--muted); } +.connection { background:#edf5f0; padding:44px 0; } +.flow { display:flex; align-items:center; gap:24px; font-size:23px; margin-bottom:24px; font-weight:700; } +.flow b { color:var(--accent); font-weight:400; } +.connection p:last-child { max-width:780px; color:var(--muted); font-size:14px; } +.setup { display:grid; grid-template-columns:minmax(0, .8fr) minmax(0,1.2fr); gap:80px; padding-top:64px; padding-bottom:64px; scroll-margin-top:24px; } +.setup > div > h2 { font-size:36px; } .setup a { color:var(--accent); font-size:14px; text-decoration:underline; } +ol { margin:0; padding-left:24px; } li { padding:0 0 24px 8px; } li::marker { color:var(--accent); font-weight:700; } +.setup > * { min-width:0; } +h3 { font-size:18px; line-height:1.3; margin:0 0 12px; } +pre { background:#f2f5f3; padding:18px; border-left:3px solid #82b79a; overflow:auto; font-size:12px; line-height:1.8; } +code { overflow-wrap:anywhere; font-family:Consolas,monospace; } pre code { overflow-wrap:normal; } +button { background:transparent; border:1px solid #a3baab; border-radius:4px; color:var(--accent); padding:8px 12px; cursor:pointer; font:600 12px Arial,sans-serif; } +.copy-status { font-size:12px; margin-left:12px; } +.scope { padding-top:24px; padding-bottom:60px; } +details { border-top:1px solid #d4dfd7; padding:20px 0; } summary { cursor:pointer; font-size:18px; font-weight:600; } details p { margin:16px 0 0; max-width:850px; } details a { color:var(--accent); } +.closing { padding:52px 0; background:#173a2d; color:white; } .closing h2 { font-size:32px; } .closing p { color:#c9dbd1; max-width:650px; font-size:15px; } .closing a { text-decoration:underline; color:#d8f0e4; } +footer { padding-top:28px !important; padding-bottom:28px !important; display:flex; gap:24px; justify-content:space-between; font-size:12px; } footer p { margin:0; font-weight:700; } footer span { color:var(--muted); font-weight:400; } footer > div { font-size:12px; flex-wrap:wrap; } +.skip { position:absolute; top:-100px; left:20px; z-index:10; background:white; padding:12px; } .skip:focus { top:12px; } +@media (min-width:1600px) { .hero > img { object-position:68% center; } } +@media (max-width:800px) { + header { padding:20px; min-height:68px; } .brand { font-size:18px; } nav { font-size:12px; gap:16px; } + .hero { min-height:550px; } .hero > img { object-fit:cover; object-position:65% center; opacity:.5; } .shade { background:rgba(15,32,25,.65); } + .hero-content { padding:44px 24px 56px; } h1 { font-size:42px; } .lead { font-size:27px; } + .wrap { padding-left:24px; padding-right:24px; } .columns, .setup { grid-template-columns:minmax(0,1fr); gap:28px; } + .overview { padding-top:32px; padding-bottom:40px; } .flow { flex-wrap:wrap; gap:12px; font-size:16px; } + .setup { padding-top:44px; padding-bottom:24px; } .actions { gap:18px; font-size:12px; } footer { flex-direction:column; } +} +@media (prefers-reduced-motion:reduce) { html { scroll-behavior:auto; } } diff --git a/skills/using-vipermesh-blender/SKILL.md b/skills/using-vipermesh-blender/SKILL.md index cd2f653..b6ab425 100644 --- a/skills/using-vipermesh-blender/SKILL.md +++ b/skills/using-vipermesh-blender/SKILL.md @@ -13,7 +13,7 @@ for individual Blender operations. 1. Call `bootstrap_vipermesh_session`. 2. Inspect existing scene state before changing it. -3. Use `search_3d_guidance` for the current task. +3. Use `search_3d_guidance` when task semantics or an unfamiliar operation need clarification. 4. Use `list_blender_tools` with a relevant category or search term rather than loading the complete registry. @@ -25,6 +25,12 @@ Batch operations only when their inputs are already known and no intermediate result changes the next decision. Preserve inspection and repair points between meaningful stages. +Before completion, inspect the requested output and validate the relationships +that matter to this task. A successful tool call or healthy image file is not a +quality verdict. Report unresolved defects. Save only requested artifacts to +approved paths; choose standalone tools when a stage would replace an artist's +camera, lighting, or framing. + ## References - Scene mutation and lifecycle: [references/scene-operations.md](references/scene-operations.md) diff --git a/skills/using-vipermesh-blender/references/scene-operations.md b/skills/using-vipermesh-blender/references/scene-operations.md index 2015db9..389a82d 100644 --- a/skills/using-vipermesh-blender/references/scene-operations.md +++ b/skills/using-vipermesh-blender/references/scene-operations.md @@ -16,7 +16,9 @@ calls separate when the next action depends on dimensions, contact, topology, viewport feedback, or a render. `run_blender_scene_stage` can compact common build, preview, and finalize work. -Its stages remain optional. Standalone tools are appropriate for targeted +Its stages remain optional and may configure the camera and lighting. Set +`preservePresentation: true` on finalize to keep the active presentation. +Standalone tools are appropriate for targeted repairs and workflows that do not fit the staged shape. ## Preserve User Work @@ -32,5 +34,8 @@ hierarchy. ## Finish With Evidence Before reporting completion, confirm that the requested objects and changes -exist, inspect any high-risk structural relationships, save the intended blend -file, and produce the visual or export artifact requested by the user. +exist and inspect high-risk structural relationships. Save a blend file only +when the user requests it, using their approved destination. Omit `blendPath` +for rendering-only work; inspection and export workflows can use standalone +tools without saving or overwriting a blend file. Produce and inspect the +requested visual or export artifact before claiming it is ready. diff --git a/skills/using-vipermesh-blender/references/visual-presentation.md b/skills/using-vipermesh-blender/references/visual-presentation.md index 0764a65..35d6fed 100644 --- a/skills/using-vipermesh-blender/references/visual-presentation.md +++ b/skills/using-vipermesh-blender/references/visual-presentation.md @@ -36,3 +36,15 @@ scene-independent rules. Inspect the final render artifact, not only tool success responses. If a visible problem remains, make a focused repair and re-render rather than rebuilding unrelated scene elements. + +`inspect_render_artifact` checks image integrity, not whether the picture matches +the brief. Open the image with the client's image/viewer capability. If the client +cannot view it, state that visual quality remains unverified. + +For each required object or edit, compare evidence against the user's intent: +presence and proportions, functional facing direction, contact or attachment, +clearance, visibility, and material readability. Take a diagnostic side or top +view when the main camera hides a suspicious relationship. Bounds-based support +reports can miss hollow supports, rotated parts, handles and local mesh collisions. +Interpret them with actual geometry and stated intent, rather than treating a +passing report as complete acceptance. Recheck affected relationships after a repair. diff --git a/tests/conformance.ts b/tests/conformance.ts index 02964b1..d3cbb92 100644 --- a/tests/conformance.ts +++ b/tests/conformance.ts @@ -1,5 +1,10 @@ import assert from "node:assert/strict" import fs from "node:fs" +import os from "node:os" +import path from "node:path" +import { Client } from "@modelcontextprotocol/sdk/client/index.js" +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js" +import { z } from "zod" import type { McpCommand, McpResponse } from "../lib/mcp/types" import { getBlenderAgentContext } from "../lib/portable-mcp/agent-context" @@ -7,13 +12,13 @@ import { VIPERMESH_CONNECTOR_MANUAL, VIPERMESH_MCP_INSTRUCTIONS, } from "../lib/portable-mcp/onboarding" -import { PORTABLE_MCP_TOOL_NAMES } from "../lib/portable-mcp/server" +import { PORTABLE_MCP_TOOL_NAMES, createPortableBlenderMcpServer } from "../lib/portable-mcp/server" import { createPortableMcpService } from "../lib/portable-mcp/service" import { getGuidanceDocument, search3dGuidance } from "../lib/portable-mcp/guidance" const addon = fs.readFileSync("addon/vipermesh-addon.py", "utf8") assert.match(addon, /"name": "ViperMesh for Blender"/) -assert.match(addon, /ADDON_VERSION = \(1, 2, 0\)/) +assert.match(addon, /ADDON_VERSION = \(1, 3, 0\)/) assert.ok(PORTABLE_MCP_TOOL_NAMES.includes("bootstrap_vipermesh_session")) assert.ok(PORTABLE_MCP_TOOL_NAMES.includes("call_blender_tool_batch")) @@ -55,4 +60,28 @@ await service.callBlenderTool("get_scene_info") assert.equal(clientCreations, 1, "A session must reuse one Blender client") await service.close() +const temp = fs.mkdtempSync(path.join(os.tmpdir(), "vipermesh-image-transport-")) +const pngPath = path.join(temp, "preview.png") +fs.writeFileSync(pngPath, Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+jRZkAAAAASUVORK5CYII=", "base64")) +const server = createPortableBlenderMcpServer(service) +const client = new Client({ name: "preview-conformance", version: "1.0.0" }) +const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair() +const imageToolResult = z.object({ + content: z.array(z.object({ type: z.string(), mimeType: z.string().optional() })), + structuredContent: z.record(z.unknown()).optional(), +}) +try { + await Promise.all([server.connect(serverTransport), client.connect(clientTransport)]) + const result = imageToolResult.parse(await client.callTool({ name: "call_blender_tool", arguments: { name: "inspect_render_artifact", params: { image_path: pngPath } } })) + assert.ok(result.content.some((item) => item.type === "image" && item.mimeType === "image/png"), "MCP clients must receive the actual preview image") + const final = imageToolResult.parse(await client.callTool({ name: "run_blender_scene_stage", arguments: { stage: "finalize", targetNames: ["Subject"], renderPath: pngPath, preservePresentation: true } })) + assert.ok(final.content.some((item) => item.type === "image")) + assert.equal(final.structuredContent?.visualReviewRequired, true) +} finally { + await client.close() + await server.close() + await service.close() + fs.rmSync(temp, { recursive: true, force: true }) +} + console.log("ViperMesh public connector conformance tests passed")