From bbe1446525afa033216e6fd197194e172fec1a1d Mon Sep 17 00:00:00 2001 From: Zeal Date: Tue, 13 Jan 2026 12:55:05 -0600 Subject: [PATCH 1/5] Improve macOS compatibility: update OpenGL/GLSL versions to 4.1/410 - Changed OpenGL context version from 4.3 to 4.1 for better macOS support - Added GLFW_OPENGL_FORWARD_COMPAT hint for macOS compatibility - Updated all shader versions to 410 for consistency (geodesic.comp, grid.vert, grid.frag) - Added helpful comments about shader file requirements - Added black_hole binary to .gitignore - Fixed code formatting issues --- .gitignore | 1 + black_hole.cpp | 12 ++++++++---- geodesic.comp | 2 +- grid.frag | 2 +- grid.vert | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 4a6127b..e0b8aa8 100644 --- a/.gitignore +++ b/.gitignore @@ -145,3 +145,4 @@ _deps # Vcpkg vcpkg_installed +/black_hole diff --git a/black_hole.cpp b/black_hole.cpp index 926ac7c..5540d53 100644 --- a/black_hole.cpp +++ b/black_hole.cpp @@ -179,8 +179,9 @@ struct Engine { exit(EXIT_FAILURE); } glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); window = glfwCreateWindow(WIDTH, HEIGHT, "Black Hole", nullptr, nullptr); if (!window) { cerr << "Failed to create GLFW window\n"; @@ -199,9 +200,13 @@ struct Engine { } cout << "OpenGL " << glGetString(GL_VERSION) << "\n"; this->shaderProgram = CreateShaderProgram(); + + // NOTE: grid.vert and grid.frag files must be present gridShaderProgram = CreateShaderProgram("grid.vert", "grid.frag"); + // NOTE: geodesic.comp file must be present and contain #version 430 computeProgram = CreateComputeProgram("geodesic.comp"); + glGenBuffers(1, &cameraUBO); glBindBuffer(GL_UNIFORM_BUFFER, cameraUBO); glBufferData(GL_UNIFORM_BUFFER, 128, nullptr, GL_DYNAMIC_DRAW); // alloc ~128 bytes @@ -668,7 +673,7 @@ int main() { double Gforce = (G * obj.mass * obj2.mass) / (distance * distance); double acc1 = Gforce / obj.mass; - std::vector acc = {direction[0] * acc1, direction[1] * acc1, direction[2] * acc1}; + std::vector acc = {direction[0] * acc1, direction[1] * acc1, direction[2] * acc1}; if (Gravity) { obj.velocity.x += acc[0]; obj.velocity.y += acc[1]; @@ -684,7 +689,6 @@ int main() { } - // ---------- GRID ------------- // // 2) rebuild grid mesh on CPU engine.generateGrid(objects); @@ -707,4 +711,4 @@ int main() { glfwDestroyWindow(engine.window); glfwTerminate(); return 0; -} +} \ No newline at end of file diff --git a/geodesic.comp b/geodesic.comp index 9e7d1ad..14aca64 100644 --- a/geodesic.comp +++ b/geodesic.comp @@ -1,4 +1,4 @@ -#version 430 +#version 410 layout(local_size_x = 16, local_size_y = 16) in; layout(binding = 0, rgba8) writeonly uniform image2D outImage; diff --git a/grid.frag b/grid.frag index 5b0ad09..56e4e2b 100644 --- a/grid.frag +++ b/grid.frag @@ -1,4 +1,4 @@ -#version 330 core +#version 410 core out vec4 FragColor; void main() { FragColor = vec4(0.5, 0.5, 0.5, 0.7); // translucent blue lines diff --git a/grid.vert b/grid.vert index 2f3c81c..0b19521 100644 --- a/grid.vert +++ b/grid.vert @@ -1,4 +1,4 @@ -#version 330 core +#version 410 core layout(location = 0) in vec3 aPos; uniform mat4 viewProj; void main() { From ea985c1e8e53fdcb7ff1202cddf2f9ef9bbe55a5 Mon Sep 17 00:00:00 2001 From: Zeal Date: Sun, 19 Jul 2026 17:20:17 -0700 Subject: [PATCH 2/5] Add fragment-shader raytracer fallback so BlackHole3D runs on macOS macOS caps OpenGL at 4.1, so the GL 4.3 compute shader (geodesic.comp) can never compile there and the app exited at startup. Detect compute support at runtime: platforms with GL 4.3+ keep using geodesic.comp unchanged; otherwise render the identical geodesic integration with a fragment shader (geodesic.frag) into the low-res texture via an FBO. Also restore geodesic.comp to #version 430 (compute shaders require GL 4.3, so declaring 410 broke it on Windows/Linux too) and fix the camera UBO 'moving' flag: C++ bool is 1 byte but std140 bool is 4, so the shader could read garbage padding bytes. --- black_hole.cpp | 73 +++++++++++++++++-- fullscreen.vert | 8 +++ geodesic.comp | 2 +- geodesic.frag | 187 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 263 insertions(+), 7 deletions(-) create mode 100644 fullscreen.vert create mode 100644 geodesic.frag diff --git a/black_hole.cpp b/black_hole.cpp index 5540d53..fe218e8 100644 --- a/black_hole.cpp +++ b/black_hole.cpp @@ -156,6 +156,10 @@ struct Engine { GLuint texture; GLuint shaderProgram; GLuint computeProgram = 0; + // -- Fragment-shader fallback for platforms without GL 4.3 compute (macOS) -- // + bool useCompute = false; + GLuint geodesicProgram = 0; + GLuint geodesicFBO = 0; // -- UBOs -- // GLuint cameraUBO = 0; GLuint diskUBO = 0; @@ -204,9 +208,25 @@ struct Engine { // NOTE: grid.vert and grid.frag files must be present gridShaderProgram = CreateShaderProgram("grid.vert", "grid.frag"); - // NOTE: geodesic.comp file must be present and contain #version 430 - computeProgram = CreateComputeProgram("geodesic.comp"); - + // Compute shaders require OpenGL 4.3, which macOS never shipped (it is + // capped at 4.1). Detect support at runtime: use the compute shader + // where available, otherwise fall back to an equivalent fragment-shader + // pass rendered into an offscreen framebuffer. + useCompute = (GLEW_VERSION_4_3 != 0); + if (useCompute) { + // NOTE: geodesic.comp file must be present and contain #version 430 + computeProgram = CreateComputeProgram("geodesic.comp"); + } else { + cout << "[INFO] OpenGL 4.3 compute shaders unavailable; using fragment-shader raytracer (geodesic.frag)\n"; + geodesicProgram = CreateShaderProgram("fullscreen.vert", "geodesic.frag"); + // GLSL 4.10 can't declare layout(binding=N) on uniform blocks, so + // bind them here to match the compute shader's binding points. + glUniformBlockBinding(geodesicProgram, glGetUniformBlockIndex(geodesicProgram, "Camera"), 1); + glUniformBlockBinding(geodesicProgram, glGetUniformBlockIndex(geodesicProgram, "Disk"), 2); + glUniformBlockBinding(geodesicProgram, glGetUniformBlockIndex(geodesicProgram, "Objects"), 3); + glGenFramebuffers(1, &geodesicFBO); + } + glGenBuffers(1, &cameraUBO); glBindBuffer(GL_UNIFORM_BUFFER, cameraUBO); glBufferData(GL_UNIFORM_BUFFER, 128, nullptr, GL_DYNAMIC_DRAW); // alloc ~128 bytes @@ -499,6 +519,43 @@ struct Engine { // 5) sync glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); } + // Fragment-shader equivalent of dispatchCompute for GL < 4.3 (macOS): + // renders the geodesic raytracer into the same low-res texture via an FBO. + void renderGeodesicFragment(const Camera& cam) { + int cw = cam.moving ? COMPUTE_WIDTH : 200; + int ch = cam.moving ? COMPUTE_HEIGHT : 150; + + // 1) reallocate the texture if needed (same as compute path) + glBindTexture(GL_TEXTURE_2D, texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, cw, ch, 0, + GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + // 2) render into the texture through an FBO + glBindFramebuffer(GL_FRAMEBUFFER, geodesicFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, texture, 0); + glViewport(0, 0, cw, ch); + + glUseProgram(geodesicProgram); + uploadCameraUBO(cam); + uploadDiskUBO(); + uploadObjectsUBO(objects); + + // The compute path overwrites every texel; disable blending so the + // fragment path does too, then restore it for the overlay draw. + GLboolean blendWasEnabled = glIsEnabled(GL_BLEND); + glDisable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + + glBindVertexArray(quadVAO); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + + if (blendWasEnabled) glEnable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glViewport(0, 0, WIDTH, HEIGHT); + } void uploadCameraUBO(const Camera& cam) { struct UBOData { vec3 pos; float _pad0; @@ -507,7 +564,7 @@ struct Engine { vec3 forward; float _pad3; float tanHalfFov; float aspect; - bool moving; + int moving; // std140 bool is 4 bytes; C++ bool is 1, so use int int _pad4; } data; vec3 fwd = normalize(cam.target - cam.position()); @@ -521,7 +578,7 @@ struct Engine { data.forward = fwd; data.tanHalfFov = tan(radians(60.0f * 0.5f)); data.aspect = float(WIDTH) / float(HEIGHT); - data.moving = cam.dragging || cam.panning; + data.moving = (cam.dragging || cam.panning) ? 1 : 0; glBindBuffer(GL_UNIFORM_BUFFER, cameraUBO); glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(UBOData), &data); @@ -700,7 +757,11 @@ int main() { // ---------- RUN RAYTRACER ------------- // glViewport(0, 0, engine.WIDTH, engine.HEIGHT); - engine.dispatchCompute(camera); + if (engine.useCompute) { + engine.dispatchCompute(camera); + } else { + engine.renderGeodesicFragment(camera); + } engine.drawFullScreenQuad(); // 6) present to screen diff --git a/fullscreen.vert b/fullscreen.vert new file mode 100644 index 0000000..0bd9d8f --- /dev/null +++ b/fullscreen.vert @@ -0,0 +1,8 @@ +#version 410 core +layout(location = 0) in vec2 aPos; +layout(location = 1) in vec2 aTexCoord; +out vec2 TexCoord; +void main() { + gl_Position = vec4(aPos, 0.0, 1.0); + TexCoord = aTexCoord; +} diff --git a/geodesic.comp b/geodesic.comp index 14aca64..9e7d1ad 100644 --- a/geodesic.comp +++ b/geodesic.comp @@ -1,4 +1,4 @@ -#version 410 +#version 430 layout(local_size_x = 16, local_size_y = 16) in; layout(binding = 0, rgba8) writeonly uniform image2D outImage; diff --git a/geodesic.frag b/geodesic.frag new file mode 100644 index 0000000..66f22f4 --- /dev/null +++ b/geodesic.frag @@ -0,0 +1,187 @@ +// Fragment-shader port of geodesic.comp for platforms without OpenGL 4.3 +// compute shaders (macOS is capped at OpenGL 4.1). The physics is identical: +// per-pixel Schwarzschild geodesic integration via RK4. Instead of imageStore +// into an image unit, we render a fullscreen quad into an offscreen FBO and +// write the ray color as the fragment output. +#version 410 core + +in vec2 TexCoord; +out vec4 FragColor; + +// Note: GLSL 4.10 does not allow layout(binding=N) on uniform blocks; +// block bindings are assigned from the C++ side with glUniformBlockBinding. +layout(std140) uniform Camera { + vec3 camPos; float _pad0; + vec3 camRight; float _pad1; + vec3 camUp; float _pad2; + vec3 camForward; float _pad3; + float tanHalfFov; + float aspect; + bool moving; + int _pad4; +} cam; + +layout(std140) uniform Disk { + float disk_r1; + float disk_r2; + float disk_num; + float thickness; +}; + +layout(std140) uniform Objects { + int numObjects; + vec4 objPosRadius[16]; + vec4 objColor[16]; + float mass[16]; +}; + +const float SagA_rs = 1.269e10; +const float D_LAMBDA = 1e7; +const float ESCAPE_R = 1e30; + +// Globals to store hit info +vec4 objectColor = vec4(0.0); +vec3 hitCenter = vec3(0.0); +float hitRadius = 0.0; + +struct Ray { + float x, y, z, r, theta, phi; + float dr, dtheta, dphi; + float E, L; +}; +Ray initRay(vec3 pos, vec3 dir) { + Ray ray; + ray.x = pos.x; ray.y = pos.y; ray.z = pos.z; + ray.r = length(pos); + ray.theta = acos(pos.z / ray.r); + ray.phi = atan(pos.y, pos.x); + + float dx = dir.x, dy = dir.y, dz = dir.z; + ray.dr = sin(ray.theta)*cos(ray.phi)*dx + sin(ray.theta)*sin(ray.phi)*dy + cos(ray.theta)*dz; + ray.dtheta = (cos(ray.theta)*cos(ray.phi)*dx + cos(ray.theta)*sin(ray.phi)*dy - sin(ray.theta)*dz) / ray.r; + ray.dphi = (-sin(ray.phi)*dx + cos(ray.phi)*dy) / (ray.r * sin(ray.theta)); + + ray.L = ray.r * ray.r * sin(ray.theta) * ray.dphi; + float f = 1.0 - SagA_rs / ray.r; + float dt_dL = sqrt((ray.dr*ray.dr)/f + ray.r*ray.r*(ray.dtheta*ray.dtheta + sin(ray.theta)*sin(ray.theta)*ray.dphi*ray.dphi)); + ray.E = f * dt_dL; + + return ray; +} + +bool intercept(Ray ray, float rs) { + return ray.r <= rs; +} +// Returns true on hit, captures center, radius, and base color +bool interceptObject(Ray ray) { + vec3 P = vec3(ray.x, ray.y, ray.z); + for (int i = 0; i < numObjects; ++i) { + vec3 center = objPosRadius[i].xyz; + float radius = objPosRadius[i].w; + if (distance(P, center) <= radius) { + objectColor = objColor[i]; + hitCenter = center; + hitRadius = radius; + return true; + } + } + return false; +} + +void geodesicRHS(Ray ray, out vec3 d1, out vec3 d2) { + float r = ray.r, theta = ray.theta; + float dr = ray.dr, dtheta = ray.dtheta, dphi = ray.dphi; + float f = 1.0 - SagA_rs / r; + float dt_dL = ray.E / f; + + d1 = vec3(dr, dtheta, dphi); + d2.x = - (SagA_rs / (2.0 * r*r)) * f * dt_dL * dt_dL + + (SagA_rs / (2.0 * r*r * f)) * dr * dr + + r * (dtheta*dtheta + sin(theta)*sin(theta)*dphi*dphi); + d2.y = -2.0*dr*dtheta/r + sin(theta)*cos(theta)*dphi*dphi; + d2.z = -2.0*dr*dphi/r - 2.0*cos(theta)/(sin(theta)) * dtheta * dphi; +} +void rk4Step(inout Ray ray, float dL) { + vec3 k1a, k1b; + geodesicRHS(ray, k1a, k1b); + + ray.r += dL * k1a.x; + ray.theta += dL * k1a.y; + ray.phi += dL * k1a.z; + ray.dr += dL * k1b.x; + ray.dtheta += dL * k1b.y; + ray.dphi += dL * k1b.z; + + ray.x = ray.r * sin(ray.theta) * cos(ray.phi); + ray.y = ray.r * sin(ray.theta) * sin(ray.phi); + ray.z = ray.r * cos(ray.theta); +} +bool crossesEquatorialPlane(vec3 oldPos, vec3 newPos) { + bool crossed = (oldPos.y * newPos.y < 0.0); + float r = length(vec2(newPos.x, newPos.z)); + return crossed && (r >= disk_r1 && r <= disk_r2); +} + +void main() { + int WIDTH = cam.moving ? 200 : 200; + int HEIGHT = cam.moving ? 150 : 150; + + // gl_FragCoord (0.5, 0.5) corresponds to compute-shader pixel (0, 0), + // so the ray setup below matches the compute version exactly. + ivec2 pix = ivec2(gl_FragCoord.xy); + if (pix.x >= WIDTH || pix.y >= HEIGHT) { FragColor = vec4(0.0); return; } + + // Init Ray + float u = (2.0 * (pix.x + 0.5) / WIDTH - 1.0) * cam.aspect * cam.tanHalfFov; + float v = (1.0 - 2.0 * (pix.y + 0.5) / HEIGHT) * cam.tanHalfFov; + vec3 dir = normalize(u * cam.camRight - v * cam.camUp + cam.camForward); + Ray ray = initRay(cam.camPos, dir); + + vec4 color = vec4(0.0); + vec3 prevPos = vec3(ray.x, ray.y, ray.z); + float lambda = 0.0; + + bool hitBlackHole = false; + bool hitDisk = false; + bool hitObject = false; + + int steps = cam.moving ? 60000 : 60000; + + for (int i = 0; i < steps; ++i) { + if (intercept(ray, SagA_rs)) { hitBlackHole = true; break; } + rk4Step(ray, D_LAMBDA); + lambda += D_LAMBDA; + + vec3 newPos = vec3(ray.x, ray.y, ray.z); + if (crossesEquatorialPlane(prevPos, newPos)) { hitDisk = true; break; } + if (interceptObject(ray)) { hitObject = true; break; } + prevPos = newPos; + if (ray.r > ESCAPE_R) break; + } + + if (hitDisk) { + float r = length(vec3(ray.x, ray.y, ray.z)) / disk_r2; + vec3 diskColor = vec3(1.0, r, 0.2); + //r = 1.0 - abs(r - 0.5) * 2.0; + color = vec4(diskColor, r); + + } else if (hitBlackHole) { + color = vec4(0.0, 0.0, 0.0, 1.0); + + } else if (hitObject) { + // Compute shading + vec3 P = vec3(ray.x, ray.y, ray.z); + vec3 N = normalize(P - hitCenter); + vec3 V = normalize(cam.camPos - P); + float ambient = 0.1; + float diff = max(dot(N, V), 0.0); + float intensity = ambient + (1.0 - ambient) * diff; + vec3 shaded = objectColor.rgb * intensity; + color = vec4(shaded, objectColor.a); + + } else { + color = vec4(0.0); + } + + FragColor = color; +} From d15ba71def0c4f5e459848a35deab4cd5e8dc933 Mon Sep 17 00:00:00 2001 From: Zeal Date: Sun, 19 Jul 2026 21:04:33 -0700 Subject: [PATCH 3/5] Keep the fragment raytracer under the macOS GPU watchdog The single fullscreen geodesic pass took multiple seconds of GPU time per frame, so macOS's GPU watchdog killed the command buffer (GPU Hang Error) and eventually aborted the app. Two changes fix this: - Split the pass into 10 horizontal scissor tiles with a glFlush between each, so no single command buffer approaches the watchdog limit. - Use adaptive integration steps: D_LAMBDA near the event horizon where lensing accuracy matters, scaling up to 50x in the nearly-flat far field, and treat rays past 2e12 m (beyond max camera zoom-out) as escaped instead of integrating toward 1e30. Frame time on an M4 Pro drops to ~90 ms with no GPU errors; the rendered image is within a few pixels of the fixed-step version. --- black_hole.cpp | 14 +++++++++++++- geodesic.frag | 15 +++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/black_hole.cpp b/black_hole.cpp index fe218e8..23c6696 100644 --- a/black_hole.cpp +++ b/black_hole.cpp @@ -547,9 +547,21 @@ struct Engine { glDisable(GL_BLEND); glDisable(GL_DEPTH_TEST); + // Split the pass into horizontal tiles and flush between them so no + // single GPU command buffer runs long enough to trip the OS watchdog + // (macOS kills GL work that hangs the GPU for roughly 2 seconds). + const int tiles = 10; + glEnable(GL_SCISSOR_TEST); glBindVertexArray(quadVAO); - glDrawArrays(GL_TRIANGLES, 0, 6); + for (int t = 0; t < tiles; ++t) { + int y0 = ch * t / tiles; + int y1 = ch * (t + 1) / tiles; + glScissor(0, y0, cw, y1 - y0); + glDrawArrays(GL_TRIANGLES, 0, 6); + glFlush(); + } glBindVertexArray(0); + glDisable(GL_SCISSOR_TEST); if (blendWasEnabled) glEnable(GL_BLEND); glEnable(GL_DEPTH_TEST); diff --git a/geodesic.frag b/geodesic.frag index 66f22f4..113c2b5 100644 --- a/geodesic.frag +++ b/geodesic.frag @@ -37,7 +37,9 @@ layout(std140) uniform Objects { const float SagA_rs = 1.269e10; const float D_LAMBDA = 1e7; -const float ESCAPE_R = 1e30; +// Rays are considered escaped once they pass the camera's maximum zoom-out +// distance (1e12); integrating out to 1e30 would waste millions of steps. +const float ESCAPE_R = 2e12; // Globals to store hit info vec4 objectColor = vec4(0.0); @@ -145,12 +147,17 @@ void main() { bool hitDisk = false; bool hitObject = false; - int steps = cam.moving ? 60000 : 60000; + int steps = cam.moving ? 20000 : 60000; for (int i = 0; i < steps; ++i) { if (intercept(ray, SagA_rs)) { hitBlackHole = true; break; } - rk4Step(ray, D_LAMBDA); - lambda += D_LAMBDA; + // Adaptive step: near the hole (small r) step at D_LAMBDA for accurate + // lensing; far away, where spacetime is nearly flat, take larger steps. + // Keeps each ray to a few thousand steps so the whole frame stays well + // under the macOS GPU watchdog limit. + float dL = D_LAMBDA * clamp(ray.r / (2.0 * SagA_rs), 1.0, 50.0); + rk4Step(ray, dL); + lambda += dL; vec3 newPos = vec3(ray.x, ray.y, ray.z); if (crossesEquatorialPlane(prevPos, newPos)) { hitDisk = true; break; } From df9372fa19be8f1b8300fd83989c233b12a8ba13 Mon Sep 17 00:00:00 2001 From: Zeal Date: Sun, 19 Jul 2026 21:41:54 -0700 Subject: [PATCH 4/5] Start the camera slightly above the disk plane At elevation pi/2 the camera begins exactly level with the accretion disk and inside its outer radius, so the first frame is a full-screen wall of disk. Tilt the default elevation to 1.3 rad so the app opens on the classic lensed view. --- black_hole.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/black_hole.cpp b/black_hole.cpp index 23c6696..eac4799 100644 --- a/black_hole.cpp +++ b/black_hole.cpp @@ -35,7 +35,10 @@ struct Camera { float minRadius = 1e10f, maxRadius = 1e12f; float azimuth = 0.0f; - float elevation = M_PI / 2.0f; + // Start slightly above the equatorial plane: at exactly pi/2 the camera + // sits level with (and inside the outer edge of) the accretion disk, so + // the first frame is a wall of disk instead of the classic lensed view. + float elevation = 1.3f; float orbitSpeed = 0.01f; float panSpeed = 0.01f; From 773e0ba53ebb9d43977f7c79ec406d3880e42c4a Mon Sep 17 00:00:00 2001 From: Zeal Date: Sun, 19 Jul 2026 22:01:30 -0700 Subject: [PATCH 5/5] Fix Retina viewport, add macOS build docs and screenshot Size the on-screen viewport from glfwGetFramebufferSize instead of the window size: on HiDPI displays the framebuffer is larger than the window, and an 800x600 viewport only covered the bottom-left quarter. Add a macOS section to the README with Homebrew setup, the fragment- shader fallback explanation, measured performance on an M4 Pro, and a screenshot rendered by the app. --- README.md | 17 +++++++++++++++++ black_hole.cpp | 11 +++++++++-- screenshots/macos-m4.png | Bin 0 -> 109040 bytes 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 screenshots/macos-m4.png diff --git a/README.md b/README.md index b96a210..7a47677 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,23 @@ sudo apt install build-essential cmake \ This provides the GLEW, GLFW, GLM and OpenGL development files so `find_package(...)` calls in `CMakeLists.txt` can locate the libraries. After installing, run the `cmake -B build -S .` and `cmake --build build` commands as shown in the Build Instructions. +## **Running on macOS (Apple Silicon):** + +macOS only supports OpenGL up to 4.1, which has no compute shaders — so `black_hole.cpp` detects this at startup and runs the same geodesic raytracer as a fragment shader (`geodesic.frag`) instead. No configuration needed; Windows and Linux keep using `geodesic.comp` exactly as before. + +Setup with [Homebrew](https://brew.sh), from the repository root: + +```bash +brew install cmake glfw glew glm +cmake -B build -S . -DCMAKE_PREFIX_PATH=/opt/homebrew +cmake --build build +cd build && ./BlackHole3D +``` + +Tested on a MacBook Pro (Apple M4 Pro, 24 GB RAM) running macOS 26.5: about 90 ms per frame (~11 FPS) at the default 200x150 render resolution. The frame is drawn in tiles with adaptive integration steps to stay under the macOS GPU watchdog, which would otherwise terminate long-running GPU work. + +![BlackHole3D running on macOS (M4 Pro)](screenshots/macos-m4.png) + ## **How the code works:** for 2D: simple, just run 2D_lensing.cpp with the nessesary dependencies installed. diff --git a/black_hole.cpp b/black_hole.cpp index eac4799..8275226 100644 --- a/black_hole.cpp +++ b/black_hole.cpp @@ -569,7 +569,9 @@ struct Engine { if (blendWasEnabled) glEnable(GL_BLEND); glEnable(GL_DEPTH_TEST); glBindFramebuffer(GL_FRAMEBUFFER, 0); - glViewport(0, 0, WIDTH, HEIGHT); + int fbWidth, fbHeight; + glfwGetFramebufferSize(window, &fbWidth, &fbHeight); + glViewport(0, 0, fbWidth, fbHeight); } void uploadCameraUBO(const Camera& cam) { struct UBOData { @@ -771,7 +773,12 @@ int main() { engine.drawGrid(viewProj); // ---------- RUN RAYTRACER ------------- // - glViewport(0, 0, engine.WIDTH, engine.HEIGHT); + // Use the framebuffer size, not the window size: on Retina/HiDPI + // displays the framebuffer is larger, and a WIDTHxHEIGHT viewport + // would only cover the bottom-left quarter of the window. + int fbWidth, fbHeight; + glfwGetFramebufferSize(engine.window, &fbWidth, &fbHeight); + glViewport(0, 0, fbWidth, fbHeight); if (engine.useCompute) { engine.dispatchCompute(camera); } else { diff --git a/screenshots/macos-m4.png b/screenshots/macos-m4.png new file mode 100644 index 0000000000000000000000000000000000000000..a5dfee355c7a66e9d3faddf2c604d33336182902 GIT binary patch literal 109040 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

-12UH(iA2RZ*e{?% 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

M2 z$;y)9-RCki$t%b7BBjU>pR1U#TulQ9{5I$<)7g=P#GbbzsLs_Nv?pA@V@mF*2S4e3 zL12$$QMf=wc#m3Ro*s7(&oyMlnZYFX!rJ;E@7_GS{gJ_ync6lkf>L7k?jkh>q0^>s z)C@2fbU^fI@+do2P7`XL1Nyu6dUd3=wwzogcXcDSr2V)j%TMUs<%u zVDn#jP+yZ4Xght4hbla~Q-umMYi+n;xHeI90!oOJn>o4iI5gQV1r`V9nFgx1STYP6 zVfrdkH3Y8Na-nqDLe2pvQvDH<;OpOG3Lg&)0Um^hxDjva(|-4S{d7-M(0~-Eb!YPq zs=tXpi$}~Vlr_<%P0+2N-SJ{QO2E3ms!V=ng@K%Z2P^mlr4+3jDHRw5#5B^meXwB7 zA_LcOIgBJ2w+R44w_s~+v$P~USsgFxwe+^%gzs-#2{D1ridHMOqMaDgNwO$kB<+D3 zxSk0mSQOMiknD!Od*;c|;A{N{qYKbeiz6f^u9*S-cJaojuB~n1<0@&)S#5Q8NprA_ zR(!Gb3bg-*8%Q-krGUc?yV?enryVFM7;OC>_;lwAL`Zmvb3In+HW?HvRAg+=pc%96 zYHxRP@+4Kt6a+o|iy0qT;!e9}VE9NbP^fZ`6b6pAh`u5eXU2e!bWFE2xQTKfJ(*&q0@7^A*GpRbWA^|>>f0rfbQ5{VG; zDk8G|X}8eVB@6-dO^$!arZ2iFOgFyI zZxMIghzziit_aVg6+3st&GwT2+W{tR#&nSwXN89$!g2SSj~4j)_~rh(coQMEx^^F) zxRZB~>2J7Cw5*bl`@L9<9j6NVp(OP#cbtJjct^4VVYT|;m0aLb(M>+9LL&jb>qMp# z2Rib5ryxOj*?k4mO2ay1=RW_p?GbuRf~ddj zsNZ}>q-{hlD<;8y(*ANc@GNmVQti0-sbIujG&=xqhG}9luN@qd9r#l?5_-^zWgxr9 zgC`V4{194!ZLvm|-~IA|mIM`GO_I7mbuA6Zg|Vw?&p&&KiTRpZK+lRuOC0(s!^6Xq z55q#C3!H(Ei;YdRuwkAGLk@D^#@%{0^Km6GFbFlO>zh&zrRTrd2Jf&iH%2##P=BR| zi3O=RHXz>+dlIO`Q{MThlGMAnY#)zNKkda!@sBCeI?6MGU-H6^cT7s-tLy#Z=G7xOIt#8v@rNgH!UB z4l|v;o4sxm-XG7)QOvEaZQ%o?coDw2Wp6QFm$h!*Y2C#ujkCqaT|YX_^$iTz3T1 ziWDvG?#11mB84Kw-JJlz-6gn`;>F$F?Mv^y@Angu=bW>%voo_LmNJ&M4T6@Y-G`!E|nP`zpczQP&c$OM$f9#x4DH9%j1C_P34l+nVRyF zww$B2J>~xggo&D>uMTa_oHI86l(};=O;LM;9SyuK?43)~cl3hPBvzhNzb;exgV*I= z^Ns6v&XV9AH6o;7)W6q0YZbaaIR0{j7dLiQW=Vr8jzbH-7?9jA1Fsm1t5*|LR+nTn z!)66!a~k97`uMCAeDbEy7vJx<#!;|t?D}%0y&qAtb@K^db+m9GP_)Ax^sp`lQzS@N z^HCblKb`8cXH9>&t%KfLr$=n=5L+WZv!zGh%Hp-->hh0Xg-K*!%+5NYi-fu{DocY6 z&UiOWP^gUMfwuq^lL|-7)i-gt*(i;4g-1nhXZj)&FDgmD(im|$r!?lkF9}w4l@@pM z91(0+0PRC=W$TzS=iVnr%W_LHM1IMgxZ4(8;aiKRZH!{dJelYBy9S{JyzjL`4B)Ev z_5p&zm@%xqGo$Bd)dsvO8Cjf!zgOJXo*d~xG9QskBw6Jd*wq{=x$d&=!dvM=Zg(>r z4uf8=C;ep+z5?_BUprrJ1sr@gqMKH|7TOHRZ_O(?r8L9;H z0U}8+>pDF^a?yzwt(y+gxL5yU)T~X(wvJG6?lv4-w1^c-fP4qb|Q z$^`daMBD?ABNXh6?O$%R6x8wH@NdHqznW`%-Wv$M|CUR}f3gi0dJ&xW&+oeLjdFOo z0e_d8nTbpL>LsmQHFC0(VrVRs#eCFLisVrf7F+`TMY zBj^1BHe|gppBV`d9eYx8mt&qZnmc$qA&!!Zg$HK!2?Df&yD!hT`M8jo;B$Z^YREK) z^#uG>T^!+aqe5msd1gACS-eYz`m+ zxr&vdG4(PI^wQE``+?YTzX{+MMkdRI3%Bf<_VV;*rv&j<>=|DASIto#%ESZ2ZerxK z<3nm&9@_6NvdZjQj9y0#U!7r$bl(oX_&5i+?1CTo9dm;)B2hQAAqCZ;PI*2PEOQfcCU~uO}iROSRPskn zcgy6fX;@mRL2fOi7(Uo^aEn2+jhX0^gdUrq&=T14n-E7tWEe#lPLLyNND9oi;8l1* zKQl^rJaehy&I5y@&z_hoat8!Lw7gNR2e%9okJ-28%QKlVt4y^fG4bqWFu{G^uY7MI z%hXh$Uf%a$Q!K3)B+O1hK6K335X6$6X>G@RB*1ZW(qJPCLM39jH7u914DPf%DzaS? zXWM?msR+{RN%f2F%5!Yj8-cgW$k*~bU1j(QR^6OcIh>65jL1LmUZp@5kT#rx3C3or zL&s*gYtdS4S4#%tvWPOBFFVSE8t&~0MiaS-S3V8V=;m1y7oN}&7tK=gt#gR}^3yu| z?v1${yWjt2qnwP8TSXYkZv9udWmyK}Y^m*xsiT5u=2WfKgeP@9tw@)la%Tiv&8y%XOD4co)FPuYNVUH)Z{Ufpzzh= zO`AuFOnBzXxBT_0dcV8X*#28c`WMRf>EP?0fnoT02>G*7BpFWINUu@5|Cuqx?n1NQ zN4PW-?Y!CAWAwGfljedO-hA_Ko@`_%qF=&w#6NR_RA5l~O&EV=4ojKQ(l9H>hq@Pf z2NveDd`+J1XUMc>(PkQG7v+ObVnmHjP^`fYQvS9pjwi-oOqgZb;aY)rQ6brTk-~f)P;xRJjOsl=ec+@b}zbW~zV=BF(aRy}X#4sIpY?9FYk=5*$ z!Ns*Z=&PNPSgI0Jii*S<&N9VAx!yr6q+JekX6wryg$wfu1oP4X0$bKCH)2)p`zH z?iDW&x>@sv`+s=P+tHVGn>x@(wVSf4c3kal%)SqtG?PbH=R%6__2Pb}lY z3!yH^4w1X?fctRNXkwPuj#C3zh45cHElNuiu3aXC0pFi3BTf8Y-J>tWQl(uczSgi9t@=IewTK^+aBFeQrq*C)ZL4$TRBl-Byk0tDd@ zb>Z)Cn{F%3WcaoRTS?ki$E_sK6Xke^Q7*i&L1hQJt!vQCS+EaRRxqT2uGL*BAxv~jn(zMHv)C+ zo&wYu9^Sdk(IfpYUPDd?=b%gO_ zLVL;d-oedut|*29hQfFsHHp)%#gA}I6PXnXGQ+`wC{I_iF2||IQOwCR(rEH*1n{0G z3Z;;*BU>cM6N`41z3Zk@WX!Pn0QUnYinie;^sQh3iV$r5=Q?cq2Po>jmOee2Hh9|` z5`0J9-g-fkkRp1_`hFyw`N;bQX*KLFGm3^!DMso4fm+LQn6Pf|VwNUCU|IK!HuN9t z%kJc^mN5b=d|q(;YP%_3bTex@-|;{bP22(??F8sZ=xaum9uKs3MLy0Cjn}FRqd;h- z*vJKvDkB0v$PvZEIzreYm%JLyaOV24!V*gZS}&kHs;LcbKS9X;xuBK}U#Iur<^jc@ z1$S;1z09`diN`5zVu36uL3~2Y5GxX$7vqm8`8~XYF)I{x-M`lv+>9LKHH};O*%Nr^ z&&HQ|D$*p?oD%a5woy6g{jjSMf0genldjo&VQ>%K^}u>7j@E5<6J<)j%0+n$OE8xm`;4n1dMG_XoH>}q!dk+*a(9z-a9nAixGGfG|Z-p)2w6y(~=Oo)g z`RLP@Mo8an13VuI9JAIKCgHxZ_pJ!rd#6jU*MWu9s)XAJZt*6?A7BN-GTr2k_TeM^ z`ecS?t=7CqlOmR|ZLak2ld*hYRma7H=a0?uYBcFvi~ieERa4#8Y5CP{6{?rb{K}HM zn2|n4ev~mUQszw5^Z*6iRVYC!!DOBOyt96`dm@`QPRh5I{xQ7}hUQ{o7l)~0^wg$a zGlujZQcsCn8;Lc0OT?to9e+-uHNa8aOQ+so=pZ+DqHNOeh5I+Ptk_uCA(aH)Yo&^9scxH=r%o8E=I{`N8>UP5rp<-zhwyA&6(PYB{O=Q} zssx#i3c(Xhqy4o78Ck$@BWRuy88eQg*>mzk<$t9afA_yEfTu{ndVU%-C{QQY^;{kX zwOb(rKln=qU|EM=;>3v=*L;z(=+#^4*>Jxh;md_}rySAwya)}~23e>sCFbQ#bpUg( zDbiLADPlJ1qvDi%!E#f8vv5SWS#*scTSV57^}sDZx2yBkRo(vn$9>7w$+I8inedpC zAq90tBm-HEGuBKPs2`Kl!zFEy35a$JOsaW@C7mUUQ-k1Pq86AMB5*KWNYJQl@f(}) z$ZWk+bhF8|^go<8o-`QahR-b;dtS3O-#Pl8v31XB-o*rmmuwLjzL@N#y9iwhziX>G zc{o9j3;4ULG>##|ca`H2+{l1@6u=crqig1TV@MQ@MqUJ~C<9IWUBzEn16zEs0mYGU z0^nHn!CMZ6iQ+#NlnqZ5qH8x7M)-SBW52@RhgFxg@snE4LCOl{NCNgb(Gaazi(I$Y zB8GT`Mb()eY!KsE`%kSjtY3+LG_c{ubla& z+!A?M_0f&x^x9IicRn&1u3EvLG)#RRNG6pI!o$pZy_j+bs>)OIV<0wOK|p^_HUg&N zAm#)+ER(?z?@8l{DFJh=qZRd)Bt2#MEC*b2I$ncX55btmiP;yI>cJo`GRZzlyYSc& z{%pIj6oF|+fhBvs4qjW#tnu#e)VLsG<9wnx4Tcr3}FNt-;Db6 zv6kb7(!za9C|{&sn<$1I>3-QZ)Ymd0n5Jl@IZj-_%{S zEEaBG_S*C<=iT1+bVYjUAYNY3w<*mEB(D#EB}ALNt?yJI&|IuX7uBhZLN82ssKOtS zHzvcw#!qXpk0~dLqYYAxLXOH|0^}sCog$CxJ?C3}7b^u9FLf8wlDs663lcfWR4NY# z5L!8eabWO6<059#@nq2(v)XXsl*RD%y#v-zG>vMiv4NMl7~d3Q*r0hzUL}=;aZ;`= zjRs{iT8YwnvjVNs`(FD0+NhYnZPY|X^5G>)8(kE5+T<-yBP}8Du#)O#C{Tcl zqEPzm3P7DC>@TD|XUH|+Pwv=gZp-$mc0-Ul4Dku^I72@?)U>oT zw6rW=c8EOGiSR8r<}6sPN;-GX#XQY%YSypdQuMs?7eF$#I#vx+|1vtAr=kS=T-=P_SZP6>R*%mU z4^9y(xxu9rXJFyKxzscs8{FJGzX$nC2+^tpzwNJhip}n+%%Y9dgY9UQ-10NY7v*P> zN0m}`U;KJqzGd(sSK5xsr^#VhU&;GSoNmpJF6culZ_npNHbn)a;H;wIJy<#AiA!(! zYl*UNb5=jXH>Y<`LzHU=(U0+)nYr|bdaJZNPs#36cq6;+z-u9>bmX+0Rcu8OjS=FQ zcDOfcWbeyN!yAR%ft}{$ra#^@6zAm$XV|ce1aAgHZ|nRFJh_-v5yMT8mE~-VSSwHw zp$vaEr(6SXCjc16#}N^B3@K(=#f7a@htf!Bls4wv2)Bq7dgd$Ue`}%ipe6vFzLtj& zNR82Z-7BCA!rG_*S6RjWW*Fe=NpQkJTDuCEv^HI`_A0$%66dp_w+}8MJU`=&Z!%U6 zr#aVu0hJ?tmBhBjATBP!t@!T)_n@zA-^i4WG)eb=BF?@W8d8DVFT#j(^Bdf8`Wjr| zWW~coZUZ|HvP+m*tgQjh+)nwK?#->eZui+Nlik{D;{G80R{xS<0*Ywrl~VL9Uga&k zaoR!D6Lm{k)^l=5N(6PJoSDqCEf3rpe>9Df3evX8K3abWdD10|baB4lc)J`Rn6FGY zjR~o`O$#Bkr7vEh03HffGm-hw{h@y7-~0mWB=;&xQ-PB)CYtPEpgq+qx&yE6>PnIi z@^*<5;n6_82dqVkp)zrzx=;#H&kyCD-J}i45S2QPoY}=;)YO5xeyhogKAU! zgYIB)+)l9i7@^aEitirEv5LUnWv*PXW&9*K{=)h7*BGyc!|o?gH3bh|sjO^Tt|NAI z^Q5d6S~}h}Tr=*E>Z6S4(gJ2~EkRMN-)Klg$6sd~MU5J`k8hJ_ZjUQ}9)(>r2ssok zFii;=IZBz@F4=<@PW6RS9SS2VDAK#CFf+j6sg>8fr0OcYr9B4IVR!bALjwyjoA28K zNo^l^+}nwLgk|d+@T%KbkbuTm1%dR`k>BIcGL3jd!&RJG%MVns39vR3MEz zR{(3KdQxt*Ue=|kCYE@Wc!$=`1L{2>k7hr9sE$h9Fk(!0TXoZ_^}hjq+27~pzy2v! z5`LQneet84E*&onOZuT{n8T{v$59G`T{hG-SQ&>rhZYrI;z>d$O_YhPO{|K~!m3S6 zL2((sDMR?07-BTpx(^`^n;}D-5a7`shFvHE1xOUcYorUnoWwuo2r~E3nV@Sf{|WCN zW~pfm_8>pn535J!+a(NYh0!)OcDRg~n;91>2T8h!rE`_W3Va0h%m~NCs z#Wc*hv)vs&Rt31^AOXjjZ8~;b-AQoa;P6KxO!5oqf$5FvN!`}&fnN3I!a?`_8gC1G zpC)HN+snOv1*Crf>vQb?neH)~4N7M;+R!3`+e7_EuXly;lQS)aTJD;u`8us%e&*k! zash-K6|%`AlUfcu&vXdq7@oA&I$IhX$og$;a8viarZ<5&%eN7FH#2{WOe>D$C~o)? z*$EK#6Jt<+Gm0kyNET>*j$I{-G+{jq={D6JcDFR{^vjB9!swlyD32bK=#b1hW$Ak}dqx)eQLE|ur_%bqMWqhCT{?V# zuL3pF-hxs&^?Ib|4S)mv3q!Gv=Fd1Ws70+-xssm%k=2IZT56J^=V8swVn&~k0cvAt zipDN^nSAfoKW0lA+e`gBGCt?kgrr%-Ud^(%q@f7D;KjAogxc?x|E7&aV^v0h0goRI zP_RZgZShg#pYg8pUjE6%R<^zT#4;aYI$**=#1s;1CZU?Wklz8LYw#v{m6L%0-pSp` z+Y{%qr{IFFwM9eJp64N}$HH;}+0HxbeuN!WllfbRiwx`h1W6+*}JGhR=*Q0HR zEGHbCvLS;BOv3x-l(RsXZu;>KO84XZZX`NmiG*qu+a1dBtm6F2f%n3Twa3iL@`by{ z%8I^&$K=XVBfox0hg~ef$53?hLP9NO)KGQRKUJP)@4RuznY|Wz)jzNcWIwZ0H4VNU zV&ex$)EUuUm%mLVBdf)C8K_~@Y>T3pGAFcW8yiee$Z_>s(S1Gs zw~~|Xp$NM3SjW25$lL#Ynky;-|HRF9c4Q=FQ1po+8oo*?#knnLe;u2Jm4K48g44#- zj{t_xMH3_uwqIn@M$2FR!iB|7CizKGZ4ZbqXZfs0U(H*eJqXYacuXxsG!;70?i@Xu zCDW=mPMEK;I#~`ov5yDY^ZAcrfDOPd+`g72c&AMrh$p!x(O9my{T;>CSAq3N-&6nN!kCYFFM`$4)2 z8>NA5Fs^(*Je{POASHtB7*f&ITKBk;tjkAsBt$_1Xz}s$_&JS^7gT8 zu5<~##f9Mp3>aqmhWlEE-}%I=PVSSJdwx@H8vapOHvC{m4Aj`RdvxmB!QfY}CN{>w zhcUjZxDt!-l3AD_c`^>gdkEmfE%Os*_KfEX z>bZ-{3@?qqo;K02_#H-csx9x&6SKy~3$&huotujHMvMv8KMStN)!)%J}`&kMb*j z*QElYRWG+X90xQA%Rf=9c8X$MQ=#G&teWt#xCB`nQxt!rrxDw*BA38%6_F+HfQ)#(t_7(ON z!-DD8gMxDb3k^c=7dI$skC71QNl_v=OuUJ_l^1pgB?zldO_e^r0x`&k4$1vx)ZgA) zVrwoMz*F}<9J*<(u<=EzS>c(F(HOpL%4&p)BQ#FY75tVB!FW^8}fGfFF9HVE7XbrX~tCQ(_;!x zBWN59GI`09+-Q|O6#PQyiRe{UY=(@HpeBm69XdBd{Juf6m#K+>*9l4-w`PT3zz0+ys?D-(7!jCshy#mEH@a6II6fzar5_Q3pp^<)F= zAw^Fo8`-PzSwk|@&-z?v662RvtXalG{{#wD9b-UY-5*YGq1GY745{?m7vBNnIi$#E zY{^%MP!y?7uaF~cJEaT%M`ln~l9bfsblzCoq%3a;$f}Mcc}B}ZB5K$4e~+WxUzBQf z|adYXQq2nM8!FGR{h4|nG?=;P(Na$bygA9C+p z0^vA@egUK_enmx8WSk5jQ|QL@ntx?`7=waOgU!?YNI0tgk#>&yd*@UHjk>2yBLu(V zb<@{IbQ2Bk5p0AMbgLfEdXhL)@rkYJ+%02@kivC%{wbL+CBH+&{+tV|Kcx- zsSX)JH(AdcPfNHFkasbxl|&hMr-`2?|}Vf3O~x9*?P zmi1-upD&f)PJbyL?k~2{yw9aiuc0~^e?>if%UIw7@ZAyD8ZhEC{mLeb&~pCERDz32 zLyQG2McG-1HmKN$QyD)vDG{nRax`mr{6Dn{nepGxf)wQ-4*4vQ@=jb9YCll^TQbgA z5H<6rbw_-t&Zr`A+l~gkd-JV&P$Iis0X-UH^faGA>=TB|_(E=+J$Y+=+SjOoZRgMxHyi!a`#|2{8D14RY*f|XiCKyzC_$mK!RzHqp02rP zwvVS4qbt@ks<`ZwsCu(Qz2B;>VvzvVm^hWBCgS*Z7MO>!%y@+gJ)Z|TWK3$=98e31 z!+hD%o(j(Qf8B!S@yM1IdegF3JqdL&W1j4n2S>#IF*Up5>gh?*14b%}3;`qIBr8nm zuBs%SUn|Xo?@SwAOJM>p_dg>eD9~zYNQ6_u+Tj^V>~& z;a?@o&1-k$@fl5(QKT&Y)iG%OgS~Ec*oPt5iwiGKK(K|cZ%U$Nn+;wX(U438lPP@( z*(IzZHG-x^23sOw7$2dol_S|3eXn=dPm+@HXr^D}1Fx|kAoBS5}Q8ybX%=K^}NSi3k4P*1i(h`*~lw#l?1Z=)2e*V(J@`xw(9 zVuA7MPH7!*zs_jl9^R7*MQ)2`nss{j%L0wY2xUEADRIqh|tIsMQmvEeFX>yUqfzN?|P&^ z4ZSDOz%V(*TVP6b{qb26PUAuH>p6AM=n6%8qW+;6B^P<28 z*x63`9c-JvkqDGfG(b9Ua#ugphU4fbb{JTeSPd<>|EUqa{lzWRfKFsP#&a_@NO7ik zaWC%?;AWxihJQyiZ7gNl3q7g z3>tE1oJ8e=&9zzHeL=Uv;v=unjy9VBT^g@jV8N}u-Zl*`#Qky3rzeTFdYnDbjv$m; z&ujEpCSM_){>`X^81AKUohW3B6#CaNE!jWS+E#aJ@6ftlM-`_h?>0>+fyrCF@EtJL z3e)Fe+IPk3Czvu>kTMG%Jf|29zW)Vph&z4R@$fE*eg~2YHsSlKZO0eO+yr`3pD*yz z^09NMG&fDx4pjf9(cZKX-KaxRz(&l}YsQ4xPg0|NC<#MG9TC0oSLZl-e#}Agqd>U0 z{H8$878-w$`!mbZS{9u(=^yKW^D9cJU_$GKI}|2Fb_f{9LqV-Nf&?XoAzGab>ETxH zUEu8`%-rwpmr4zY&=2RCKvz)j9d%j(1;tw|-0q_(_T=V~Y&+@dj2>`Y90o=!Lneb~ z?W~7jbOmaN#G<4A#Y?klMu&!L_w1e$tIKUX49d{i>*<-4GSn>!tD{=LtKl2&Q{i%M zqKOR_a76@R_EVeobRqTe*BuikdPhb4e-C6u#?xyhYyhkrhO|b6d04@Fm`WZs*3EXn za&+Y$x9?f6iz#tp^1DxjZcc8ULY6gN$(NEVLG^Ec2&9ICaRZrZ zjxO2?VBb1<0H`!*;~(2u^ZD zeBYrsD=z9oxBoPdw_n@<4|Z0RrHlp#vN9)v@Z4T&6 z_#gbjQ-gGino4HxdLevpX`ufR^_@(sbDG#8FITsm{REu0(a#ckn>_#$3{yIqg^WF+ zoKQ^*$ZHJ;eQ)kQktB@y3tmSZBPY*>^Y)J?@gN#n49amd3u*;uLo43sZx&cGP~*}` zpCI7ywyCRf>)FuojelC$bzxG-<7(|~4ud!S%y&;f@KYrIA|JQA9e9iiNYej@38b0h zlh-kS1Nx-F3;G?VU9UTr>OPU*5WWrq<)1Gh*ySq+5w=@RHaC< z)g}pQgHRA{OkHarwJru%=x~j!N~O?q%TQfdOKEmOwMrZW=`an}8Kp=q-b&$Q0< z7^-Lv55d&NvX9KZB}m6KLa31c=L{KtW!^~;UvIC_lx)3zE0GOD)Xr1(l0Zd0<29Pt zQUECkN;*Pg)V?W85v+a0yS@@p)q7ooF5h`MJz4=@BS2usTCKsS<6BIqUY|gKk0bon z%T!5v_6XvtZT0u*m_2kv@I6q@ft&-8zoc1B$45GL zh+-ob<`G>fdb#Wp8>N||FFOf{9paqnTg{77Yjrt@#}(Y2`kX1ItN}Nifh>MPxkt*G zio}@i3p2|F6CbNZS~%s*!a)_OKq>wYx7Nk8Ufu3jR=ZBk> zTsP}>+tiWK_FDaXY2(M#8DP9c7`%`Uap{3yPdir*m-Y5;bn zdMa3CFlhLsa>y1PUkGrz6D{vYR8GBly{e^DlEk3{rge5yIf(uh;WAZ0`nam*b-K*5 z?t<#TKTwoO2xt0mS*x20Ou-ta{TAX;c8~s3E(j_gaYudRV8tc_KO)0ovonCyP=%*61^>c$Z zeovZ>m_rgHB1B{gde4Cnvmrt%ee#7)cyRU&tNeE)XU`iSWu10~=WOGKW5ttcVlOvY z@Xw3!Iomu&e6zeG1MIp-$;9%@h3Wnp-%#jYJ^&`I>4x}4*KZ~62ms}OUQAFVM6Xq) zf!%NPH?m1k5pT*tb-M})`S8*Fa@GmXP;(B-l7zI7!AwyqF6CQjo9K5CO|d~$DBF#h zYh3#n2z?is{^6h(6z?Vcm`@aB&1NhVE-36RS*FWPHTovG=9z~t`-R-76EwAtfJ!OC zxJ4f`m^VW#QT2&f%vj*+m5qNDjcwrTU+V7KWb%siNwC%SfsE{gz}Uq@;Py|$MRRy% z!8x2LfWMzbrSHO%7s>yEz(9~prv&!M*ET1XEg>pgQg>*E-MBiwOd}&BE35hyhgd<| zQ6y^^>;W9tXg>filiD=dp--Nn*KDZoH<>KGji`RXJa%o{0y#{Nu?w=W36sOYe&EN< z@AG$bB_n}Qj(b?WeRWXBkajtO(o}#M%`oZ}F5*7$fV}QG{2V(bC}BecS_XLG+YAHK z7TLvXR22h?8~MCD6#>}NQ5));kQAM|oZ?~|4Vi%1-f(e@JhbD=SYndC5RCf^uFAmiH)aqFH9%llkiV~)vXU?!4WX3{Z}AS znIic)OW~)qyEUHx6|+Bf(?6KpG?-8yh6C-^77biHT2Ev6&#HWU^gWu6D0KyOvA(=_ z)p7Tz6N-_Ju{JTh{el?+5trp`xTQ+wjf0{`u~e+Ffy_7;jOLGLQ%%SX|VPH6Kwofl;9X-?Q6m(Mum$? z;g3OCc>E#AKGP8n=+GM)JhM?(Ke6IXgP9=^bSJZ85~|CLW`=ZOH<)SwqA(gLab`;i++umPfF@ zH|EIoeu4q-2$Bh#ppmF zOoB>FxRyq#=cQeu;T0}K-IkDU7@r-JjEA}Ad|7>Um zS3WH(iEOjdE?(dGi2E&G#!O$}_(YCAhfL?3_f0Zfrh4#>@s4SW;BO#J^nZW20fY-u zueKi?Ra<8-5A>Jo|2munzSKTcie3XF@y0o&e7C(>8y=;prsmOl7i7n%3vFB22!$>B zBc0t%p(7qeoLWW}1Fa3s!lFG5b>;Uttuc1;WM&=;WS<3<*&(X}`w$YIF{i<7Mm&^e zDygJ4=^hG%2SCmH3}^lkgLxiP;Ap~Kq@P=5L7q{s?pOge0knzTYFe!TQ>QtNHB$>< zb(|aYWHBZw-^2L@ixTqwsV#&_1)_-wDq`0btQtqZ^R*KP<2kJbkfmk#Fs?$IY zp)a7~na@#UR-_Nl*fL2fQb}kNP^$eXDg6=kLxG{>Zbjek(I|RvPR^>9af^iQNz66L zA+*gFzA>&i8snBRBhDaRU3&N~v2%IA%)hpVQWXfxuU-~k!;a?(!z6 z@hLaGmw-e}DlFfY#!Ji|CE01aSk;JDse>xYM@aM*2WuiI;|2;ipiGP@c(jCQ04yWIOwS@ORq#vcXR0K2$O2V`A zJ>A&w^E@#OmV(ftD4C8}1J;~?0b^rwPbLhL;{!5NRS&`9IBw}29mZy}B`vr2frx$C z7xkYsY{B^MnN4Cwp;)#bKLt&IoRyltvVg@M1A+k-PWgv3uaH z!@A9godD|nQ06|-!XF~@f%VoV!WS){yQpxt;R@29Jb=k#L&wAG}r-30|P$lsxc&O*cP?W zD}H~8_P?GY0k2lU*0g)SdUh9y6Pp5-@t6*tSrB1lzcp z`&qQ{J(-S!BrT8KLbK{|gWzu?cOrN{G&r?!Uqrh1s>n_lJ9PQD@}_Qcnj%x;lj4s6}#mc;}iQGy9|=P%2Bu>r#3m+xT^f;Z&z1r_6cg@67w zy^)FQuL4vsMGR3Akt>I!QS;ZWojy%jur2wI@LKHHJjGQ1e~!;8k-;KrtG!@YDba` zlX~RNLcXM8bHG(YGp&tgP)qf^xB?E{6y`o(h z0^8PQnF0fzc7&mVGCJ_4rZsRS#gT+hHEJqnFHNz{M3I}TfF4KpJ}cZUqdDM8CC-(7 z{icb{PO5M@L77aV?2lV9B$&XME?1ldJ*H-1pCFCSsaSA9IggN7Ylc7{7=QJLU4tD< z>$~ni#gr5lQ9l69Eb(8wRSJPy{|GQ+9pJY$pcqD8#I_Eqs3MK1?0yoHhf?t9l5_`q zd}{0+1!!LlUTvdgES>wOU9V@bzH$WC$&ROzKz#iGu(O{`xq{?0=X}Cf6hrVg0CjL? z*GIyw$Z-o*cpcSt?!7K6?`)fg&Y9DNl`2TWu&rI|vaWsGiIKsq9Bb!g&l9=)u2$LJ zqw$-E32;9ka#+RkTUap0HHV#~1B2hqTb+l!P%SOkZC7Cv8XOGWg@OP#vz_ru$qoZ2 ze7SZI-7DG%zlim0B+5~?@q^Db^IbX@`_GiDCVl;tmxga9r$Z5VOkEvq6^xdeS>(^_ zkoDHpZ>JDeQFX8hll-n!xbyJwzIU|q%j*o;99Vj}=CR)A#_4wXsZMw`Vdw4b;1$^Q z$Qp1X@_Ny=*r5|}-v`DNc^&O~op!JGe|vIxJ>SXcd|m22wv>pMa&p;Z>B6Xi)@ zz!_u*8la~pJsDsDTz{r%EpHZ)sB0GoSC)@@s>L~@88E6<6e?wP{06+^hF=MjkY5Ay zEJj6-G-%EE_d5BUid7#J8G7qRNW`Zc>C83ts(!HP|D>0=vsP1uO`Mf!C1ZBlc=%?r zRzjTOe?O}!@(f9q=!t#XA#U3m=B|7_VikGXdwaQX2_<(ZLh(`Me!ags!JqAVI|F~) z+*_W4tjI8W(^&VISvyr{*j(0fzhC(g+bQ&VCsg$%+|d7K@$GT1+D>kCY}pdw?fy+z zcnSR8?rtQ7dT}cxJS)X-ua>B~!f!D-*v(56{G`)dTc?sTXCl3cL%4Bv{g^hr5fS9C zsLssNaecsf2p2s4uG}-qPbw-fpeOJSPzjD)E=OGGA2H8`><2%06?wag<&64S*8-`vL z-{{(9B?!oW%ml^+wF;OPA>9S~1_H%7WcznaNxj7!0GO?>7 z5gf(&EfOf`=5~UC$=eIYJD!`#L*$D{af;it`12NmBA>hAE}7(ST7>z;0&xaiDXG@a zsyiA*>k;B3%9U_<%Ee!joM^3bGh@=@SrM7J-p&6m`YeB5Zth^drqHv`9HTJj(=yvI zAl2i1yk^+=BOjOKyA>toslX=l&QLknd;w!djZu&HM}`==@H2pnrL=5&^6j}~{_W%X zfAI>^tKMcx;A>ri=H z2jVj0o?dpO|Rls@$K+l;Nst)BJZ_FVJQT|_PZX-IQD^`rXU4hPr=9VMB$ z96P{3*tt55xQ^wgal_XSrL&~Uss(k{bT+}aKaL-z_gj8D<=+E;7FE`HIP;MzC*9I8!MeZ)Y*)?86^mBTJ01*qV|9- zrpZ}$pF=xq;~v+3;HUw<^m9WvAL39@VshgYSk3Qc@Tu|&|H5G7ND`X(6q0hd>@k}Y zJ^ww+<_)xWk+6DqPGlK6H1@QX{P|KH_*u>qbcJ|*gAbl}`}3eJR`zgJOL~gs*gzV3 zt?PI=FEJ{(Q^}}>UX164p>EGt;_KbUu(RM@4yyZDOaT?tBprwjZ1Palo+gCxKK=2f z)UvQk{riaZUV_u%@^$4~bZ|||=Ipws+=13`vD#uiBUy;~cj@iIbfA$)C9T0=EK)0> zjCKn3t)8Ry2#UE($S>>RZ4Qon{5EpzE?#{yI7imO&t`2De@9YS{7I#e@z+5Eoz}^w3U^Ysd#k3K z;DX9gVtsMB$|!1ed4o=D|5I@A;upE-;&@fNH%CKlrdlbLI;S6ZLTsqeNbTw{wniPZ zoTIJo$oqVk>|Zji_c|Ty4m;XI*IFGEF#QWzs&?+hX;ziz662pVLw>1QJ)qp$RMeFx z3BUi#H zU%Hg{X}rE0l$&f7E?DMZp6IN)AU0S>H3;9TJkhD$4rQ`#ANUR5!jO@?Wo=<(98`27 z=TPQTmOCV7>c?PsUvwq#Bdxf7(eoUaUZEkfS!Mvt)p34#A-v;>zd3&J^=k@-Odu58 zDgrbFF4$#CYg|ykTpTRw2=BIV{vT0a9oO{!{cj)&CnmFgg?*NDI>W8~1*`kKdo~{j>LZopYY&dFu66nqD14 zE)T2=w3^LkoqW1tKjG_uN-4mvPlr)krOgzzl2d%c!Qz{-XLB9g5jq?Q@Pu3F&&OJpi4hS2J3My`yaf;B7IC@6A+F)r z(S)9qebyQDh(PbhP++1Wq|qoA3Hq~620r~d7Gp)qF1_wd4*vKoOtc*cKLtT{XT{7^ zhFM&88VL2jR`%Rr=@+SR&~=W2U8bU>FwqzLQy$5w&BMQBoJyP}?}Rjf$;y0gOv`{? zaQSBY&|iIi;eIF&NyU&~uSmU?w%~tS1`Y36_(#99v+3oHmYCdgt??8*BKX#iee<4A(-$B`<--v<6EtRp^FQwXE#^G)AlT6P4%cd7@6eCTdMjJrLd(RPDU$M# zwWIBI&&Z=*f*&xE2NE{)fo$q+yAfIgEnpm#&3OI!_o|blQQ`#h^#Ur`C8tu-WD&vW zyoat1WP~Quj%+)VO}gF~o>MIb7N^TASAGl~N?$rvs5{ek8*z*{j4S-to1mZNU9z!XZC5mck7tQh><(XwB!h@!mGp~pHd)D_ z`noZWRIp+Sq4i{Ws?K!Kl>82-awXF+Z^B+pjU-|2>g;xN-1K_bI0nC#vuQ$J^-+FId zU8|qFYNxHYe{oxt*3_>79Y5fN;n4&uoCGRc}?1yIlQ;p%SmkcXg*$XH| zD1x&4Z2gkn_OE8tJ)ueoJlX2BG7 zX(iAMD3t9XPee1} zbmRJ}uQ#Od`M@nth3Tda6Ym+UuF{$lmrO{3;STu%2gCf8lR`RW1< zui^8J58;B|;SXe9?9;eP4-HM?TW#^SntdFPg0YR3>l%r)thp`qq3WjIQS6tYeDZrLtm9`&x<#Ile}u!sg;?$ zN%HfoCdJ@W+^#TTcrpn@%^E1V@Xju8agcu9)NaT(LaU!P;W}>YdXun3;;>pSP&S0V?RonfdQ6`m}K3Wa> zY51O1QUJ(k+Y|EHsOI$>P20o#J{dN3!rOUbYd#N8*d%N9mU~$*q(zU`??pkx&f3qh z;bN$M>4dxEh#I(4krJy|%0uaYf(5qPJp1&AdTDD}?mKq%Uth0tTd9c#jg0vz-rAm~ z;lkOwg0rI#OOO%(F<(+b|J4l2t6FR(JsBUVKIm?TA5KlHkRMbYfv@rh+h_y(DR&ce zoRLJ?zm_`C=uModh$GO|>8i!HOdl{tS{ee868P4&dLM)C#C>);b*-|Bs-JAvO{0CW z_mIjH_nsnVS2>3=y2nM9{NOxX1!%t$uq$g@&{}m`&YcZ5h9l5?jua<(-)~&BBIN`n zhUYf$hO{e|2dXztRLg^MeRbJ&aDoSZ%${j;_%i%H%5?m_5X{fowr1F)R$#?PZ4TP6 zjbw%_F)>cP6sbxxPVUcDuLw5pMI7hD7mUj1KaXcld`zGIf=V_?KanQQMUKaJb{FVL z!#t3pM&q|VmI9&O{>k=k-NvMZ`rD%$E1!Q;oE-J(mx-VB`IX{(%N5F9-d>d8-oA;Y z1B}-xudsZujS>`LG>24$t(1P>RlgtVV00xRNi~#y+}MgB;Zm7#I~1+cTzMLReS^6l}U$7wRhhNtsC0Dr#WMQTw&fiTIfqn$UjNuwe#>Q za9^z=(QxP(F*5LbNO_tXF{j!cHX6tG8r2n7J?NKCO(p61?rJ&TY1+|T?*iph1kNZ< zrAr2;Xk(g7H$~~F-v*KUYb*F#$D*k%`81ous z?yml7d~Txg$>8_~4z#2^3g0V`95Yz#w?C+Hh=8RJN;B=T*I!Eizqeeym2e0wXeDBOg7LrjgAsN#%1vuC|y~*H&E=|JAh}NJkI3ep1AZuZwdcb4W3=Ltyis~ieX<% zO1n-ng|LQm>2eE-~TBR8+)I=P|yP zvFc23mlk@3Hdu9!3sH!Cn1~k2xc;L2yu4}l41OO>GvkfQA_ z4{Wx#8uDbhG8%!22tWz_6G^FkgK@gf>!{r*nyB9DJXg$Qf5^M(47S(Rx_N0p@44E$ z!nLIDi+(hN85xSEX1rp5^=W+gC2%8D#`_08@|V{?hIXS646rx0C)T6Ja~2XxPQTg> z6OwaCA89Cd5~`j)cLC{Nrf=$p-H-1Xp>|RdOTREy0HvCpy#m3IL()HQ>m!Le`wibA z;cjHFY8F-y!+L%$WnwwupGV_r6;;IUk(pms9K`#glj)XK4f!JtLW8|B^Oa7UpW*F~ zEJeA3_(4ns5qU-oj^-81MT2RNHdw|HkyrD?y>)6<2UB%6TPIsh-9~IXI8cZPpiDh8 zM^H%B@<*8)rGInCLV`?hUSbmdKsyrqVraed+UnV~8GXG*Dp!A5R)(bF=114&OQbcE)nbBB-3yggvd-A4AAs1iV;gSe?RbC zCZe}1{)dKHUW+r=XBVDK6>ht4r~$e5EOLdhO+0tV%I;5>vrL}AQ1f2)P@T2=(rKEM zuUDoQu}#gok51Vjyh#9v>&{`w6?yXl9$6)n`9!vO)nVhK$65g;rEU2I87x`T*=?W4 zk2MIQp3YJSndH(UsAOOQqkga3AHXNIw5x$;QhM2|xOnKbW>%^|4zJZC2W}ZeHy|A= zrPQ85F2nZZ2+g&G-(Wvq4%;t|1ihNxNY*^~H(QVq9eKP1p8>4orxrOoj{R5Z zT_48EmEVG3U&o+gbjzM+(pyBk;8Kn($-%gdD;3WY=dvFHO4>aUG&RhQCG}C z?{K%jztt? zdK(p_f~3RWVrSSZ;IqoeY})!H_R6w?#q(l+|xkp-5)yMADu5AJfRak(Q~6wLnMF)X4eJh##=B zK=xy9tCh)L0|+Ho0gJP1uUcP>tzU7ZZR#OPA|f@vc{L_tk;s*Iv#R~!30dVF1le*;@DPLvQ3dt=OFlTe?2z}c zM!5%JLJ4En72C;LQ`?%eeiIg9yLEtZ4O?R{29NN z5|#hDMUt0;iy9#0j(X5_;n_55cr1nHuM00=m!@72lTx&=t+HfCZUGKPq7Dw^45e0* z?%p56inGODLp^$X6{iS~?X?sc2TU*#(1YifOP5wjg}NFqE!l z6Qbp)%eRknB?S;iTSGxg;kUi~(6>8_f2TJhwaXdSN9~zq;78+6uMLVeRf!QrQQwQ##*h7TEaR1WYr& zkjZ7skDJ%21N5;bLd!+CcvTTD&C%0+oYNvQN z7rL6`R=qg`hyuHF6Wv!LEn=~^k;$$K>)R6+>z^@1rbGL#pmZD~mj0v+L)0Rw3kP;N zc+v@!%PHn!q#opp7s+iX%{@`}?g%o3f3?JUC%Y*+pQ4h{KM|kW_dkWB^iVCKyCeud zH8J~io_D?~DPyLQzBUGQjyN2ST;+g?lnvGR*FN6z2(Ec-g;m1PUd_|ME!}3_;gXVc!Ep3Y#q<=UQlF|#+>e9gn+9fsb(rl-{CIiFUIuWj|HpJB zYUAkcA)&m6!HPrQPe&b|!T`o%+Q(~z)BNPC<9em;S9}*L#BH@t5O%an5_Fgh|5&~Q zaRnXDTekBfBLRJuip~E-Q+m(m>xk)Dfm;18_^~n&W=qb7!s<5mV*FWTb z)Rm*DyXK{FfD+j$b?vwOh!{1`cLB~Sa4qM4(u!-Zb&9}qbLl|0~`F>PbARdaj7%fTy^}L z;bHlz(D=xY*h!+7y5x)sFxL9}CtRz6z*+LTx$4StS+Kr~eaA?Xu`{@x6OvG$hfiLF zHP(UdKS6`Il7qVPC}omYxU9_}*MrmNtpJ#sfBcsloV;X3HL}^W=I>`sTK#=TejsJ< zNVv%GUSFYNDz!CulbW)ydE9&X;qj$UIRUE@|Zyj?C~iR}bI-6vaR+TwekDvF?!C9eAE&SBz7ma=%&6rx_#@t>q>67I3e z<~lekY&O{lb9qU}n*0U*-Gm^;#N;zd&^o?CCwV504{JqFi$RX2#)lnCX&#TiJP|$& zVcxHDNnhg&2aH2}k`HTIW=(rC@f*1KZG*(;L{Y7P|;<-AMKzzJ}W%!Nkm`&0-sn!+9F5D`U-J#0+gxqCMENMn~~;-DO-5eh;wE#*!FbmoLU3Ni*tFi#p{IPu4Y+}8h?;E=o{hc_D6$BPI>IX5Mcmurg4T(m zdDEl{kjX~!vIMVB3?|}fjS64IlPWRuHE{y)UNIyj$cA>0%{TyDTEypu93?w0X^jt8 zIJe4Y>9{g&01Jb(HK;Xyr*k20-(S1?TZbmN@D%BZWaw_69{rfLGyA&FGCbp+&!F7f z0a$@a8oV(k(mK{dD5LM=U={fgHix+vXysl$Qi6MoAy!OWf=d`sP( zzNRh9GY<29wZiz0gaFd`NldSdZ8t_iga1ixWxz7A!$dgaJQtU&3}6kw%md?qCRo#J z)H#DHB~%TamC~)=)4U- z4 z=4p0H-n{gdW)Of_2E0nk{}x4T9#$aMyv{TqYKRxQLi}xQTE|5g5$ZJ>!grt<0*cC< zqcUG_0(gY1*;uWhtV!)ruDGpgcsV@>#@NyKLo-sx$XfPIEgIAC-pc*eU{dnnSb(K> z?;Vxx8%>b~V-n$sn@!!-8`nNHofOZCJl(~t?7glD+0H6sdeTJg;OSvj`RgO>mw`l! zX#72pu84(tN=pa-7Pp)2JW(9D!lB0mbG_p+j_m@i*Hl|8w%wY_G{W1PsHu@;EL2~5 z!-oPKoAXW9B>%!s0BDDdBG2i^=9PVZGx)dIWa86QWIpip^J9Q~R|uyr&z~9r zVoiS9MD`!2$!bOCYY)GNo%d?h7cYt2Y(Rc+F5Cxl*bd@lk}R8|s?aW)cNm0DYC_HL z84=lMdX|iLkWMui?;X6jq!o%qv)M~Eo86>L&kv(HGrkV_1CgE$>~)$Ab{iqHHwP(r z!>4{at@yRK%JvnqsbiI{m`f}(>2X6-60SSg3&cbM{J{8B5`vWD{g>~z-`~gJ9CbgN z-x5XpLJk=ZlRW&UEK-1KGp^Py2XO0=F0}s$|L(1TGN;i;E7n-KduaZW_Q^>gW5HTcBbTk?$=qJEZbioKe7P^a<6u2=g0M!W%D zF`hUt@fsvWVclb4(0eH+!UIj1?fqF~ZdybBM3heF+;bILhRttkgF4GQH~k?yFNTkw zLi7ps^j$(la*~T4|FA!)IeKcD*#0PB%MyQ;C!O}-JTlw>TJe_z_dp53`MH-M(1xvHeD={ga@Ckziia|iLII-qa0Tj){oR&+g++)-x|9b>+&tF@|WsTyr^cD4im)&R1L^M@M8%3RwXMPTl=-{ zn|?%5IfpFvH=io%>O>8*Vg-4TcEY}TmQ|5*c~MrU>ZUFU)Y*ZjSE*F+eXMvc)zxTT zY(M!d-t8DiB}X5}j}u@KN2azyNY_jVParP1EZyph-R~N3t9h1D;Mk^m`Yn$y3$}Qq z)q^oB#hI$tQJ8sCeQO`ZWO!s+HYDX}g>%UP9$xx(N<3lH-y$!@;yC`3;Qr6uFW&w( zET$6g)s1722Vy0_nH(ejrKb@V1?=P&l2cETTvLmJ+@I5mTXuHU^tRg)k!AJfV<(7JHR?OLFN zM^G7ixQHU~{(i4y!iH#GW_0VP(Td5mGDP!|J_X2-gV}P4+QBMOrUKNL81sE@0d+7A~0^eWx=RE!H?`xMfVMQ(Z zTN|2NU2bPLmc~Bs3}Nf#9!H#@gTX2bzDA9UDF(TiN(&VpXV?#eESjuUReb338}WhB z$3{aXBG+HrX3=y5tQ6f1XCiL$V4n3hQn#jv>pT>JF4aRM@XcdDqOY0^gP|zh?T4R4 zOJN@`^LNWw>@~|Yy}bv*&H@88qNJNULwhn&h<#YZR4S})*b8&^RvW-2!mfBk@3%|n zwDRA6s?usUZp%=hJcz~B$W%)s4XN?!0`m_Y%lIX zXun3j0!q2yhQ$Pcy|6IFIob$#vT^zY&n;XoCJIg2?*Z-^C4~v&JEDIEOM^jokl9g5u+RW=vL@gv$w?t>ixt$PQ;T}>NBwj zQ=x8Z&nB}oY85J2 zzZ{@!x6tv_=dCOkPS^xu4X5~s3r_B7x7NsTqa@ao9>+7?{|9DVpM)`;SxVJ&d^=C zO!bs$=KH5C_vj{8nptH#j$}?vJ%kIyoG}Fxr9krCs}x7-@Zpek$oO=0z|2m50iC1+!=$1e8@*I3mJm2~Svz(~25g$vGx7xdsm{}g>X9cp@0Lq% z;o$GFfK#4v%w*&^MmvbE$Ci4dP{${91c3LrMqYHqV|{T;QuIJ>h$hQxKB`qNBsf@5 zu7TYQkgBh9n5(p+@T5wkNYI8?PpoK~Rnqq6iwjh=f}XP+Xg{k4wF0PrGdnUTdrRK| zSjJ*YHULF$8U~o$dmYI7BsWh+AhKSAI^neDn$Zo*f&}l0b*kl1jDX%b|L`LZ5O+nY z>)29NPW-%Ds>&QJMq;maIwQr|g-TyE5uC8gxE?ABHwlC`*8csGNiBwaoaQtb=q&YJ zAVyYyPTvK^Zadb%wpTkoGJjC$VgEN4Wb0Zcq=U71m+PuU$7{Bmf{IEC%w;SKLypWd zr->HQsGX{TR7tY>^F(%WH)=F__}%*!bqdY9$Ps+?+)E5(gvx#HbFLOZw;d-^+}9cO z;>Lx#C)$a|S)vD)5%=WF4jNEXMaku^>O)xQ0lRNb^+zx$&|hVj{X`GR57TB%nwJZZ zBH%pYW@KO3v*Qjmv93}^?IYTls9q;An}siWZ(O+tmaYESKXn{oHP$RR8LOU{BZ!NS zg{rp|p&@+R1=tPP1au+Z%c`#WB+&d>48rx*=F$S;D{08tss^pd>>*5y)Ur+?`1NQs zEkPFUP)+J)Xa>zbBThLC3Ss>hzV_F6M?N{e^l6e#<0 zGVXp}>73On*L<~LS60<`?J_vZ^)kbItHb)c&MB!aQyExG@jCx$ zpFcFDHt&ptb*R1{Vsf{ogFEab*NA)8;K$uxmeKm^XsP4H+0uJH!t5zl$%_&-GI@i8 zC8n>s%S)|n8TE#rWNmqW-TMdAmEl~H+Ja6F(J_J~?myd@Cjg&fx>&b~D;z)K$$6_h zn+pt@zwV_gB<;SmOB1-PsU=LTIY#e<6ZUv~RkPbN7KqwujJCCIL#4AUwG9dn-2Sn| zaC&5hFYN_lszi{fo>4{xa2JR=8zTW9ewRv;AAVn>wmDYT3V>jmi`Tv|H!O8NNmn$x z>iBX!z8o3=(kr`GnKc0JJZ9`6DVV(r(W=usvVNmis;VM97jwdm8viag8uW<}CB$9G^yY6Cd}73;y!12ddWSVX3NE0M@dBVafU z<0`>@cGqS^3NvM7YOegr{MVXvsk<>R68g zW#G`5f?PW;?ZS}K+g;37&N!YK2IUs^CP=K+0&^*$D%e*2m1KG4JSxx5`zq5q; zDVWaqpfAQx>S{o#Z|-3Lm3H{{@aS!(lp${Y(ccEy)cyGk8v=K;I^N4@UV3MxAzCSo ze-YH?GKdj6XIS5F+@xycM!pV$>g~jw=^$#XzM%K0r%W?%192=%hW;klOQt#-qC{F@S_uG1TBM1gEOm^T>IM*M z2<&4K;5(1%Ei~*7(&gzRq?Jrpk~?hIy5VgGT>pAUdM01_mzs5rUy@P?K}E+MSPUx6 zl&JnXkVVx)*n!<4IIw;HzJukOyX8E6wJ)c2=Ux_;fZiGY0cl4M6esUfhY(bK=%I}X zRx-nK_X!UvwVB-yLRg1|Za{_D%}5?FJ*|Oi1B_GvlnzO6^efQ9^!Sq~Q#Dae4KAM4 zBXA&I+ivQuU+(N&=iIv?s;`+uZH!SB@c7)8Zo@gLg#D(Cpm}SlsrDw`Aa|J$(d%hR zQboTTnwH;j9F4Rus7g%fm4Z-kLSBfK;f9oF@BBzfly2j!y{iI3NE0>0;q-I>wt2R` zsu^et(vS$HX1mqz^GV-RKAC#EEe{S-LTcC8I;tm1fZ@8!RTE%FyN#mLCN=5_81 zznJ4?nry@7Hzc6+>@r;V9^nEl<|^@7NKQ58qZ2Ya7(HZWlg&nklkp8MeE1-w;&f zsdE8Fw56%a{bwY3*N%S*+q?XG>`oaEBfKAMeNMI~R9v<&kziq*=uG0aND=aD z{wj+I>9VZL-=qZ6IBmmQ7|cdv^tVA~S$_hv9a^(y?>* zR4ber_AJRf%_SQFr%Dxe@V`6H)+I7;81M3wU~s$ZsEPy__cN&?NB=B3OgTWe$~MAfgm34_>C=^$<+qWHX-P=Mvc@RWA8sx;jQ8v*e*l(#*&C%dL1f1 zv-HCYL25n&FOsrrxdE-}0@C-T)$$um6L926<{S*<)|WgPDYVI+&XO7=@x}HbIzc;B@>Bt<3 z*Qnn1a`Qm;15N;&isJ-}qB%rGpRq`m5y8Xo8=ak2GIxQrFJTG;ZL7xbG~bH z)?eI%3K4;{Zq87EmWtoKt+ioU&E&p-wrQ9)OVX=?iGC}qY|f(d*Jeqf z0~>^+cxk$eOka3+CUD~JB`O3`m--OrOMTR>(x>N7i8RNL6vTIxebszblx9C=Qh4OW z8gs{cs>NpiCQ!OV@brky^we$Ax(2ALAUHZ$T|Z~$vx_aygPK2M^|f!kOl;@!2xQ9n zDKCg31}uVFr25$ZAPnwo;39!`y_}iT&Mty@U$mla^0Tj}tahg`gJ|iwoFHaAziHS# zA)9w!EDo#)7-;fgi)ENCSATam;_@>%8~WroFE*poTq%!+ZJHWN z$|P$2GbJG;K4WQ5DS}<$@ZgWn;Xt}qB$~3yoH*$`jvlLn&rnqr4Vb5K8!I{Vj#US1 zZ`%b~cju!&EN34(`egDH(cAiB5CZo}M=S5DAhwqlR&wR4=i8Lj^5G|2{@sI@|A!#h z^GJhrLj;|Nnlb*Hv)0*PDYl7V?ZLEiaFk{V25gj-W|cj23xjT%G|o{%)fX2cScb8j zsagY)0>aqhML`pu_b)0k%GBF=_5Cwf57tYBZfB6HL2H@F7}+;OTv(!Ik}b{Z_VlZe zKhy~zKEw5&R^{sMzy3C0z9RLexY8!iL@QO){nd%4OySKxiqdECJ%u1*lojtSJ$mQX zRIH_vB8ojD!zo|9>DGTvxM%o0^=9k9pMK20_;K&Wwu7z@`%JAB>WyiRQw{8^dWSef zT;3V#snqqL?N(ax;;*j{s6Aj{Pc%A*p9R;28sW<(+Y~Y$5s@`>Pr)Nch38hxn95)@ zlMCX^ z_MUKubb;S^X9h>9s{Q%A{dvtTiOQio|7KA+ceuO1?_MG+1ArTucI`f9|IF{B^IM0V z_M)J<#FP^Qnj&IF6UGVmoNeOgI<{nD7EfNnrxJhdEmgM~skBJ_WJ$w?f zUTy&T0P9+q%8*+Y=`R(vP1JQ&lEx~%n+PSF819hBor*(`$16|^n?L1+y1A2E1bOTD zeS~3UDfoPNuE>h4I5K*#>p-6;A@z2A&wp&=!lnB2ts-!9{3EIjJpXX<(n$!|qwegb zln}|T9R9AAgyY(hu z#xFa(fEW($!xgeMUoH-PPd51^K!Fdpu}I=`&AT4Fap8e`2wZLxCQSt55p>JcK@X`M zJbb)q*rSpEoP1JWAyklxR=kFJ4*#Cr)0fZNkbfp`%-sN6n)!0D`QBik;RXYq%*wU9 zlAK8CbJa$Nm2V#j)z8U3{>>>@=me=h1*4(H^C!44BZ`^Ow+(8~+j54K0w<<81jcym)HrDwmm z%dyM-%X6qjeW{DB9VZ@UH@eQX{P6oTnz^HDQoV!h!8389axLO3i`SA(6tOh7>WlwK z*%Nc$y!j(zA<=Q#UFW*_Od0vE$b5wFtGX(eI6Q=68?)l*iVs z2`U-YAXTe(?ZCQ3kEVZNM<~E*MbKUN>g2xJXmOmLA&CORV)1 zgCTNrp||rv@|W{sKpJ_uLhN*K^MyeESP;UMUv(5M-WT4)I$XlE8uB%I>8I4`?tu*u z?`WG!qNbVO?VogXlYh$L-#P*3`9ZKNojT{c4*!N%k@G_JtwL7Gb2NJXfppWog{+_) z>&v=>Xs~;DsBYh8olh1qCK(EQlFLsPG%y7%;73%7dx^oVDv@(gh0id{*Pq4?quK(|pHEH&* z{Www?#j*YyYNf9Q&WHxjJVy8i4mo6ntcluadlks-lugV$>)srQ+LeEH>-eo9>-?l>m zHACOt|J}Rs$+Go^*KW;##?UzRzJoLOytYkiLubm^-8%tVX7SFcfl(A{Q@OJnAC#4& z^RJ;&18UBN5T};Knt_S`*lxk|8Dv)^3N!V&35d?3uWrs=pp6g#P&V16#6lYxv%D_n zVY;0AL!pWR?{t@Kcpa7l5fBUr4<71@MKX4yGF4D2+D=C1O1)ZWpkA+d>UGz;K}jFg z_daX)W}MjaCUz@%z{;2>VUmWA~ z8fK|d8w=ADW45W1ZYF0rSl-5Eu#Dz6%9WdqM7VQGvYLkyOloyq{Akl`bmB&Wc>N@< zb$^b5rwgF1#TUxJm3rHhxcSbJSKb>}rc@|ytomPEr!ptDbLK=|a;^UF9d(`7@Cyc@ zh)1@>F%~rYgl$L@TW8>^^UGa#-_=M>k`IZ%#0Bl(Tl?A-eYO|vn_9LZW&HIjJMQ#) z8BZ0SJ~(E}L*;}mNXOw@rXwAb?GhzuP)pf{YbYY9ZNF2-7|aC7qAM&Xu z78&y0CT6ih@P;Z;Ea2yF+=PL?|Nr#q`$Ea*5pj$jiip|osyyGxI4iVz#{r9V@q(!yUh1Vp&T`b*}=#t zAEVIUmynY|m3Q*C?5!XD5K_pyhvSum3{z z=J_K1=9i`a;p3Q))8s|z>fM)9z1|!jlvr1z*w-v`ig!7@jy}w_CfsZTe8zZ@?yiSH z5+dJ`d?&Wnq=sZ6XRiDnhkB0!J?H)NK5+zfzpW4U`PRkL!u$4s-&4#iXYx1Tqs;9l zL9biAK85~_Q4Cqrv*phY)p@HV60>8FM{yi7x_LW~ng%0^uv79ueI)%5PY>UD&IUV~ zf5|yDuc+5K-D9)PvJ`pP-)*nXwQtsbpw3=w~pPI=2 zdK!0QwOg4d!igWT>L|izW;t~*SQsZ1sy2}1f!Lf1i?Q%LE}3}4B{s@cyjfjc`j<~%sd|X| z7%i|UDO4|8xMEEtxdouA$eSecnHpS_MwU|I4lR{r_Tu*M+e7IOKk%9?uF|E;QM&`@ zQR4!Q12ffU9lrH^6#t)124AYHDZX)SGVpgYt+%W@U&++--(oU*)337yW{qkLtbh!# ziHD}@zqt4(Bn)c`Z-uxW&zAp*&X?{z98>-n=$yuK*raK+a{bGv*7zk)DWw#RNITBo zI};)K*mrP&OM#^pMm6+@=mZf`*<6@a8B;{>u7Zh?$I`K|Vjoo9=cTw5@%w*?7*)F= z22|~agbqT^`!weaBIfxnUQ%XV@1QVEN%+m{I;^_LwBK7}6hvo|TE@WB=Pmo%*l0_p zmCNfoyt(8hPzm10sfkGA{4%|n!jrw%7`HwUrKPkt0uh$ z&CUAH6%skXWsS;1d)xp~fgU>Q2Je5q+8jVFkhT0_cux7B`f_O^Cf`gYeGPtTUA9J- zM~t6+ehUT6H47solL1Y<)gxUFmB$KPO!ne>gLQy>LbYooN`uSWsz4+y)SYkci289* z9sz-Q_ohJp3=n#G73JNYghy@g*0#I&Q6##r!WxOv8Nl4d2JLZ)|9>DCsa=sy#q*Om z*WSa_=NoG7i5;|u?j^oy9m#Y>L5;O>%tPv06b$qAq0xg-Tv91$%3J!2`DXiKXw=0>5qb#PIPQ5$kbQ6PV2E69{wM= zQ_r6YhwMmd%m2Use?)UkO7Pkf_jyp7O1~STY{?~rR1@>#69fm%QKub!ywhqGg!qf3 zuD~Wfq(^TiI*zp=L&R14U(h|f&V9P#jW2aSDRWs?+Fh+o;rFLuEsrnWDc6Tm=GsSS<8edkERHV$jU0d z26}kqyzbz_%_$`-VtkxXC{PfqL^Z@nv;5BI+y_T z;3m&mN$>{rRv#Jq)w}Wib-d;q?FmHL4)EnQJ8m*bEH%@ z)TX0NPIJ0JB;()Fga4G8NEKR2uH*lNZn%51zWNv}IhidQqHK(s`Yt-u%Pmve-OmUZ zHVg()HZiUB204a{TVEfHxh8LrB2Et$cbT=TPkf{~@T4go8vxddq4p zyGMOIHZe{s%Ujy~)baEGxFjPL1XQ2?Upn^id+u{z%l%jM^A0aT@X=4Za)VaGI||cy zXCPiGJ;i`^yZXJSc%AuITC{yWCm*(8{lnHo&D=M$AeH$w8sOywPbv7f^c^UrTfrnJ zUMyfV>-T>ZM5-E{UQoqj`1)Uo=-i{9(bPsiwwT0=){Co`sItXH{J(atJRZunZQGfi zig==AOT<{BY}v`a@4JU7uVrFr$i5U>EaBJKLZL7+cFQr_4Uc)_4+^C~yaa8YR6DJitdhcQ{t z?~}z3LYE!H$!(MESt24X)g9yPU1k1!r6@ScB>2Naznh=qeoBhNKyesW`6Sixb>d6? zvN}us5#|;AIp_VN+$>UgcX-l(jr&M6CK?kYV=L}MpM2#K+zR@%U?A4!B<7{?HOOb7 zo-~!Yl9OnSbOJ21CbxG-Z|k*fOKQ8Rh5&YZiGMFj=ky+4>5AKTjGvB|J}jd?qP zsYi1V*E-*|W>y$gUCLf^%7WWfVw(-@tVa22jqeXxv4G-;ilz%Fx7cgzoCS&bjxJ12^Na#A z>vik=UJNwEF=OiWrPQ*Q{@?jEDyKre9T$@*Qz-I=!T(Yb4*QEP4EN?DTF}vQ80|XF z$ogd>M!~8rOlSsD`~IA>VA>e+P}u-}10;mlQy2**f6;X+b0adF!&!V*aRME2^m7RH zp~sfy%7(^iflkkI2A}VoxYD~Wm||djWd3R0fJ&}l{@oP8(ilBBX1*}a=5EJ+CEF;e zy+b$sv|M)7ZG_*5N#(Ure)hqh7`Lt%Bd7=M_w_4ho?}$EEx)XvMO)$8?(|&NgH}1B z(e{G+9>+=~JM5cp*$YBfI^d1$hVTGe265Dp#?Gis3lWlFqoQep?7qkHNBx4oz)T?X zXoSvgNyc>7T&Sou%6l2ArSwc%v>G{fqraq6SshvSc4-V|)I8bQVeeTSH#xA7{~5_0 zvKYjij#i+J&A$>qKIs4*>A!k}41GYUhK+9??8cC#T%39QdwC8vHV?raZ{i`dH}p#Q z?M}>uWx9|_01CLmres3<6}w?~sx^1aQ)45;4ZDCcem3BOmY;^1Fan^3gX95+NDjDz z-(uR%j`4}|NESq-jFe0k*VJn98?p6AWGMCxZXJEY`-o6!Y5zHFW7X=iHuJY@=?O1% z>$NVFS}x1t!hDW#fdr(Aq^1dr{Z1ud4hDeBM)*MOFbz%IStL#~RB(8dZPu&WqP5Yw zQhzh3!J?z-#*Z$Ee;(vqxAgTitu@Fv=irmhZ#IB>vvHr9m$(8-@`RMipo5B^%*vYT z3|${aV;~||LD&GLV&Xy5KsIgSCK_>Wkw>V<1=p2N@NT2^xEvA~5i=RJo)#x|_81`r zqn$Tppo{nNu<912UvrNr%FkKM8Ho?1m8}FkM_&Jkv>C>xdSzZ5$lvW_#1I1Z9+Bgf zM*}cf+YR(j$qP(4Lv6yTUp9_DJWrEW)B;@y<<~N~FsF~@3X1QNo?b&G81K3Ev?the z|JX~3v9o_69c)mSZ3ko|Y!rGYJmW42qH@IT<@4q3B%W*HW%aA&XU~XUL2q& z3n})d>Eu*8Ea`6d7ELsKy7;uB)FmQ4dymDK z#I_t+=Ka@$=gjpBVmYLt@<|dUt-5LcLDdE@Ja8@#snOOpEHh;@A1Xc1{-9fn9`WfW z!3wLoX2iSS;8a~vHesXNb@NOqtDIYv>{`WiP|J!{{3#?j+-zb>?Y+Ui20{@ZNC)_e zNBKQ1?qpXT{LlTrbCu0~$7bO+mTo)W)kTB{NA%@SL>mRpOR_jld_ zH%y)ACEyQ(JkXrdJ)r5N|1snM`#R6$VWLBeQ}t+YvJzPrKcn~sk-1mrS+pR}=r(2Z zR7)$TYTV?wwH2qP5sBeyGcAzawH9vJuXZgV+p-BpEytkD)?3~vU3UrX&Vc=g;U7bG zb!d})bp&eT;hQI3ZU3-9ilpTuGu%$hkD!MD7FNfn8;X?v*>A~(t&9(f4XH_Skv}-| zbbzh3AV8!mXUlVg+UXG=%Rf{GuE;-t8~A2$Qcr@Qf0uF<6C~~v2t7T<3n)(tYZQc>#dgKnWdtFvg&E7TWSC`b(P*1 zc+#@{Bu%a7-1r4#PaO<1ei4fJmxEC1C&}S79wl)ELs2c4qeydrYp|-X-QuK!_nf%P z5AAM{VpNeF#O>gCSRoXo3>%%-ctO2-9-?HpsarFNU&i07W-SyO7TPYeR28w_7d?-# z(|WxcZeIC#GB&?Pv#7_?(B-hi_FppOhI;M4-OJ3Op6N*JBCatMpw!1Oe;9G-3fv>{dO^FoI^A|2E4 zvNPIMskFd8%a>GE0h~n)kRRnaE+6cH5LIR-enuswFkvDl#s2up(owYFI&`CGlh7x2 zte(>lx1>uvV|qw-QZNJ-AWv>D|1&6by+0{S;jFU@?}*E8bB>#*{&dR@+-wb(DY=j? zdJ&z3pB>e|A&Pz~pZZ}X}@22@)b^JQwPl%DZceZ<)` zjoj6CubW~&Y6`C2$h-;ETofa*lTz)k^cyg{ogz5|ouXjiLfL5Z@?2t%zVEA%u*xkz3j`1aEYY z5aEL7YV;_4^5Rm2Le17`ZL$H}27;P0)g^IKH`Fw%%PL~yjUj99JkB%uZ&^u$B@Gfd zb)ii2BnxFPC+)A#^SaPA*LB3PMxV#!(FM?7YBS!z_L0Bb)h}T13NoVe68hA#>Js9! zmDq@0q%8xVZD1i5+?bRQq(_+|x5`g{Ihy6oET16_I+84WQqlONt9@k)m=_{o;1XH| z(iWVuKCWX1r_mCialpn8290Nr^vx4mW=w@R{4oAg$e^R#Ul$@2@(ffnRCL)7f!6}U zTC1Xjz`&Hq78IHzSUp+Hv0wl9Tp>gq{DRLEIK^Ro@({+!6|$alKL4er*ed+y+nYnd9RdRfPe*_|hv z{8yl04xjNS?%euk%Q=E6?M4*dbCfxxQPEqdhm{kY37O;7W*S-hZ1fx1smglRJgMVN zz%D@ikOznVh%}T3{sX|jvn}O;-;siXD6)`F`A8uSc_N_Tfr1AL9)2fL$wdn#u~HH% z1rHQCPFbu_#56@QQ4|wJF;NuL|7ksH@0Q|CF)H9svVA&)Rq>Crvp!U75lC@i3`fWiU_3n(n0uz3Jd