From 53b7c574983b1bde71deb0e00f9e9efa46e736e0 Mon Sep 17 00:00:00 2001 From: nataliasocaity Date: Thu, 4 Jun 2026 13:53:38 +0100 Subject: [PATCH 01/38] schemas: proposal for the 6 missing Pydantic schemas + FRICTION #15 (#179) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Following the research summary at tareas/research_225/_proposal.html, this is a draft implementation of the six modality schemas for the APIPod common layer. Pushing as a proposal for review — happy to throw it away or rewrite. What it adds: - 12 Pydantic classes in apipod/common/schemas.py (Request + Response for image generation, video generation, audio, 3D, vision, multimodal embedding). - arbitrary_types_allowed on OpenAIBaseModel so media_toolkit's ImageFile / AudioFile / VideoFile can be used as field annotations. APIPod's file_handling_mixin converts URL / base64 inputs into those types before validation; the schemas don't need to do their own conversion. - 6 entries in _BaseLLMMixin._llm_configs mapping each new request to (response, endpoint_type). Endpoint type strings: image_generation, video_generation, audio, generation_3d, vision, embedding_multimodal. - 6 elif branches in _wrap_llm_response that build the right response object per endpoint_type. The chat / completion / embedding branches are the template. Two bugs in the existing auto-wrap path fixed on the same pass — without these the wrap never reaches the new branches: - FRICTION #15 (line 87): wrap was passing object='embedding' to EmbeddingResponse, but the schema declares object: Literal['list']. This is why qwen-models's /embed endpoint builds the response by hand. After the fix the auto-wrap path is safe; qwen-models can drop its manual EmbeddingResponse construction once this lands. - Line 81: int(datetime.now(timezone.utc)) raises TypeError on every call (datetime is not int-castable). Replaced with int(...timestamp()). The wrap path was unreachable before this fix, so I can't tell from git history when it broke — flagging in case it's intentional. Tests in test/llm/test_six_schemas.py (21 tests, all passing). No torch / transformers required. Covers: - Registry shape (9 entries in the tuple and in _llm_configs). - Required-field validation per new schema. - Documented defaults per new schema. - Response Literal['...'] validation per new modality. - Full wrap path for each new endpoint_type. - FRICTION #15 regression (outer object == 'list', data[i].object == 'embedding'). - Unknown endpoint_type still raises ValueError. What's out of scope for this PR (deliberate): - Generalising _BaseLLMMixin to _BaseModalityMixin (these new forms aren't LLM; the mixin name doesn't quite fit anymore). Architectural call. - Consolidating SUPPORTED_LLM_REQUEST_SCHEMAS (in schemas.py) and _llm_configs (in the mixin) into a single source of truth. Cleanup PR. - NSFW (#164) wiring — its own backlog item. - Wiring any of these schemas to a real model service. Questions for review: 1. Field set per schema — yes / change-this-field / split-into-two? 2. Class names — happy to swap. 3. The two existing bugs (FRICTION #15 + line 81 datetime). Want them in this PR or split out? Refs: tareas/research_225/_proposal.html --- apipod/common/schemas.py | 219 ++++++++++++++++++++++++ apipod/engine/llm/base_llm_mixin.py | 85 +++++++++- test/llm/test_six_schemas.py | 255 ++++++++++++++++++++++++++++ 3 files changed, 553 insertions(+), 6 deletions(-) create mode 100644 test/llm/test_six_schemas.py diff --git a/apipod/common/schemas.py b/apipod/common/schemas.py index 488918e..89e664a 100644 --- a/apipod/common/schemas.py +++ b/apipod/common/schemas.py @@ -1,6 +1,8 @@ from typing import List, Optional, Union, Literal from pydantic import BaseModel +from media_toolkit import ImageFile, AudioFile + # ===================================================== # Base schema # ===================================================== @@ -10,6 +12,10 @@ class OpenAIBaseModel(BaseModel): "extra": "forbid", "validate_assignment": True, "populate_by_name": True, + # Allow media_toolkit file types (ImageFile, AudioFile, VideoFile, MediaFile) + # as field annotations. APIPod's file_handling_mixin converts URL/base64 + # inputs into these types before request validation. + "arbitrary_types_allowed": True, } @@ -63,12 +69,104 @@ class EmbeddingRequest(OpenAIBaseModel): user: Optional[str] = None +# ===================================================== +# Image Generation - Input schemas +# ===================================================== + +class ImageGenerationRequest(OpenAIBaseModel): + model: str + prompt: str + + negative_prompt: Optional[str] = None + image: Optional[ImageFile] = None + mask: Optional[ImageFile] = None + size: Optional[str] = None + num_images: int = 1 + seed: Optional[int] = None + steps: Optional[int] = None + + +# ===================================================== +# Video Generation - Input schemas +# ===================================================== + +class VideoGenerationRequest(OpenAIBaseModel): + model: str + prompt: str + + image: Optional[ImageFile] = None + duration_s: float = 5.0 + fps: int = 24 + aspect_ratio: Optional[str] = None + seed: Optional[int] = None + + +# ===================================================== +# Audio - Input schemas (TTS, STT, music) +# ===================================================== + +class AudioRequest(OpenAIBaseModel): + model: str + + text: Optional[str] = None + audio: Optional[AudioFile] = None + voice: Optional[str] = None + language: Optional[str] = None + format: Optional[str] = None + duration_s: Optional[float] = None + + +# ===================================================== +# 3D Generation - Input schemas +# ===================================================== + +class Generation3DRequest(OpenAIBaseModel): + model: str + + prompt: Optional[str] = None + image: Optional[ImageFile] = None + output_format: str = "glb" + seed: Optional[int] = None + + +# ===================================================== +# Vision - Input schemas (classify, detect, OCR) +# ===================================================== + +class VisionRequest(OpenAIBaseModel): + model: str + image: ImageFile + + labels: Optional[List[str]] = None + threshold: Optional[float] = None + return_boxes: bool = False + + +# ===================================================== +# Multimodal Embedding - Input schemas +# ===================================================== + +class MultimodalEmbeddingRequest(OpenAIBaseModel): + model: str + + input: Optional[Union[str, List[str]]] = None + image: Optional[ImageFile] = None + audio: Optional[AudioFile] = None + user: Optional[str] = None + + # Supported request schemas that should be interpreted as JSON bodies # by router decorators, even when endpoint authors do not specify Body(...). SUPPORTED_LLM_REQUEST_SCHEMAS = ( ChatCompletionRequest, CompletionRequest, EmbeddingRequest, + ImageGenerationRequest, + VideoGenerationRequest, + AudioRequest, + Generation3DRequest, + VisionRequest, + MultimodalEmbeddingRequest, ) @@ -142,6 +240,127 @@ class EmbeddingResponse(OpenAIBaseModel): model: str usage: Usage + +# ===================================================== +# Image Generation - Output schemas +# ===================================================== + +class ImageGenerationData(OpenAIBaseModel): + url: Optional[str] = None + b64_json: Optional[str] = None + revised_prompt: Optional[str] = None + seed: Optional[int] = None + + +class ImageGenerationResponse(OpenAIBaseModel): + id: str + object: Literal["image_generation"] + created: int + model: str + data: List[ImageGenerationData] + usage: Optional[Usage] = None + + +# ===================================================== +# Video Generation - Output schemas +# ===================================================== + +class VideoGenerationData(OpenAIBaseModel): + url: Optional[str] = None + duration_s: Optional[float] = None + seed: Optional[int] = None + + +class VideoGenerationResponse(OpenAIBaseModel): + id: str + object: Literal["video_generation"] + created: int + model: str + data: List[VideoGenerationData] + usage: Optional[Usage] = None + + +# ===================================================== +# Audio - Output schemas +# ===================================================== + +class AudioData(OpenAIBaseModel): + audio: Optional[str] = None + text: Optional[str] = None + language: Optional[str] = None + duration_s: Optional[float] = None + + +class AudioResponse(OpenAIBaseModel): + id: str + object: Literal["audio"] + created: int + model: str + data: List[AudioData] + usage: Optional[Usage] = None + + +# ===================================================== +# 3D Generation - Output schemas +# ===================================================== + +class Generation3DData(OpenAIBaseModel): + url: Optional[str] = None + output_format: Optional[str] = None + seed: Optional[int] = None + + +class Generation3DResponse(OpenAIBaseModel): + id: str + object: Literal["generation_3d"] + created: int + model: str + data: List[Generation3DData] + usage: Optional[Usage] = None + + +# ===================================================== +# Vision - Output schemas (classify, detect, OCR) +# ===================================================== + +class VisionLabel(OpenAIBaseModel): + label: str + score: float + box: Optional[List[float]] = None + + +class VisionData(OpenAIBaseModel): + labels: List[VisionLabel] = [] + text: Optional[str] = None + + +class VisionResponse(OpenAIBaseModel): + id: str + object: Literal["vision"] + created: int + model: str + data: List[VisionData] + usage: Optional[Usage] = None + + +# ===================================================== +# Multimodal Embedding - Output schemas +# ===================================================== + +class MultimodalEmbeddingData(OpenAIBaseModel): + object: Literal["embedding"] = "embedding" + embedding: List[float] + index: int + modality: Optional[Literal["text", "image", "audio"]] = None + + +class MultimodalEmbeddingResponse(OpenAIBaseModel): + object: Literal["list"] + data: List[MultimodalEmbeddingData] + model: str + usage: Optional[Usage] = None + + # ====================================================== # Streaming Models # ====================================================== diff --git a/apipod/engine/llm/base_llm_mixin.py b/apipod/engine/llm/base_llm_mixin.py index 674efff..e27cd63 100644 --- a/apipod/engine/llm/base_llm_mixin.py +++ b/apipod/engine/llm/base_llm_mixin.py @@ -3,7 +3,17 @@ import uuid from datetime import datetime, timezone import inspect -from apipod.common.schemas import ChatCompletionRequest, ChatCompletionResponse, CompletionRequest, CompletionResponse, EmbeddingRequest, EmbeddingResponse, ChatCompletionChoice, CompletionChoice, EmbeddingData +from apipod.common.schemas import ( + ChatCompletionRequest, ChatCompletionResponse, ChatCompletionChoice, + CompletionRequest, CompletionResponse, CompletionChoice, + EmbeddingRequest, EmbeddingResponse, EmbeddingData, + ImageGenerationRequest, ImageGenerationResponse, ImageGenerationData, + VideoGenerationRequest, VideoGenerationResponse, VideoGenerationData, + AudioRequest, AudioResponse, AudioData, + Generation3DRequest, Generation3DResponse, Generation3DData, + VisionRequest, VisionResponse, VisionData, + MultimodalEmbeddingRequest, MultimodalEmbeddingResponse, MultimodalEmbeddingData, +) class _BaseLLMMixin: @@ -13,9 +23,15 @@ class _BaseLLMMixin: def __init__(self, *args, **kwargs): self._llm_configs = { - ChatCompletionRequest: (ChatCompletionResponse, "chat"), - CompletionRequest: (CompletionResponse, "completion"), - EmbeddingRequest: (EmbeddingResponse, "embedding"), + ChatCompletionRequest: (ChatCompletionResponse, "chat"), + CompletionRequest: (CompletionResponse, "completion"), + EmbeddingRequest: (EmbeddingResponse, "embedding"), + ImageGenerationRequest: (ImageGenerationResponse, "image_generation"), + VideoGenerationRequest: (VideoGenerationResponse, "video_generation"), + AudioRequest: (AudioResponse, "audio"), + Generation3DRequest: (Generation3DResponse, "generation_3d"), + VisionRequest: (VisionResponse, "vision"), + MultimodalEmbeddingRequest: (MultimodalEmbeddingResponse, "embedding_multimodal"), } self._supported_llm_request_models = tuple(self._llm_configs.keys()) @@ -62,7 +78,7 @@ def _wrap_llm_response(self, result: Any, response_model: Type, endpoint_type: s return result model_name = getattr(openai_req, "model", "unknown-model") - ts, uid = int(datetime.now(timezone.utc)), uuid.uuid4().hex[:8] + ts, uid = int(datetime.now(timezone.utc).timestamp()), uuid.uuid4().hex[:8] if endpoint_type == "chat": return response_model( @@ -83,11 +99,68 @@ def _wrap_llm_response(self, result: Any, response_model: Type, endpoint_type: s usage=result.get("usage") ) elif endpoint_type == "embedding": + # FRICTION #15 fix: the outer object on EmbeddingResponse is "list" + # (each item in data carries object="embedding"). The schema declares + # object: Literal["list"]; passing "embedding" here used to fail + # Pydantic validation, which is why qwen-models constructs the + # response by hand. After this fix, the auto-wrap path is safe. return response_model( - object="embedding", + object="list", data=[EmbeddingData(**data) for data in result["data"]], model=model_name, usage=result.get("usage") ) + elif endpoint_type == "image_generation": + return response_model( + id=f"imggen-{ts}-{uid}", + object="image_generation", + created=ts, + model=model_name, + data=[ImageGenerationData(**item) for item in result["data"]], + usage=result.get("usage") + ) + elif endpoint_type == "video_generation": + return response_model( + id=f"vidgen-{ts}-{uid}", + object="video_generation", + created=ts, + model=model_name, + data=[VideoGenerationData(**item) for item in result["data"]], + usage=result.get("usage") + ) + elif endpoint_type == "audio": + return response_model( + id=f"aud-{ts}-{uid}", + object="audio", + created=ts, + model=model_name, + data=[AudioData(**item) for item in result["data"]], + usage=result.get("usage") + ) + elif endpoint_type == "generation_3d": + return response_model( + id=f"gen3d-{ts}-{uid}", + object="generation_3d", + created=ts, + model=model_name, + data=[Generation3DData(**item) for item in result["data"]], + usage=result.get("usage") + ) + elif endpoint_type == "vision": + return response_model( + id=f"vis-{ts}-{uid}", + object="vision", + created=ts, + model=model_name, + data=[VisionData(**item) for item in result["data"]], + usage=result.get("usage") + ) + elif endpoint_type == "embedding_multimodal": + return response_model( + object="list", + data=[MultimodalEmbeddingData(**item) for item in result["data"]], + model=model_name, + usage=result.get("usage") + ) else: raise ValueError(f"Unknown endpoint type: {endpoint_type}") \ No newline at end of file diff --git a/test/llm/test_six_schemas.py b/test/llm/test_six_schemas.py new file mode 100644 index 0000000..d4f7a06 --- /dev/null +++ b/test/llm/test_six_schemas.py @@ -0,0 +1,255 @@ +""" +Tests for the six modality schemas added in #179, plus the FRICTION #15 fix +in _BaseLLMMixin._wrap_llm_response. + +These tests do not require torch / transformers — they exercise the schema +validation path and the mixin wrap path directly. +""" + +import pytest +from pydantic import ValidationError + +from apipod.common import schemas +from apipod.engine.llm.base_llm_mixin import _BaseLLMMixin + + +# ---------------------------------------------------------------------- +# Registry / supported tuple +# ---------------------------------------------------------------------- + +def test_supported_tuple_has_nine_entries(): + """SUPPORTED_LLM_REQUEST_SCHEMAS should now hold 3 original + 6 new = 9.""" + assert len(schemas.SUPPORTED_LLM_REQUEST_SCHEMAS) == 9 + + +def test_supported_tuple_contains_new_request_classes(): + for cls in ( + schemas.ImageGenerationRequest, + schemas.VideoGenerationRequest, + schemas.AudioRequest, + schemas.Generation3DRequest, + schemas.VisionRequest, + schemas.MultimodalEmbeddingRequest, + ): + assert cls in schemas.SUPPORTED_LLM_REQUEST_SCHEMAS + + +def test_mixin_configs_has_nine_entries(): + m = _BaseLLMMixin() + assert len(m._llm_configs) == 9 + + +def test_mixin_configs_maps_new_requests_to_responses(): + m = _BaseLLMMixin() + expected = { + schemas.ImageGenerationRequest: (schemas.ImageGenerationResponse, "image_generation"), + schemas.VideoGenerationRequest: (schemas.VideoGenerationResponse, "video_generation"), + schemas.AudioRequest: (schemas.AudioResponse, "audio"), + schemas.Generation3DRequest: (schemas.Generation3DResponse, "generation_3d"), + schemas.VisionRequest: (schemas.VisionResponse, "vision"), + schemas.MultimodalEmbeddingRequest: (schemas.MultimodalEmbeddingResponse, "embedding_multimodal"), + } + for req_cls, expected_cfg in expected.items(): + assert m._llm_configs[req_cls] == expected_cfg + + +# ---------------------------------------------------------------------- +# Schema field defaults and required-field validation +# ---------------------------------------------------------------------- + +def test_image_generation_request_minimal_valid(): + r = schemas.ImageGenerationRequest(model="flux", prompt="a cat") + assert r.model == "flux" + assert r.prompt == "a cat" + assert r.num_images == 1 # documented default + assert r.image is None + assert r.mask is None + + +def test_image_generation_request_missing_prompt_raises(): + with pytest.raises(ValidationError): + schemas.ImageGenerationRequest(model="flux") + + +def test_video_generation_request_defaults(): + r = schemas.VideoGenerationRequest(model="hunyuan", prompt="x") + assert r.duration_s == 5.0 + assert r.fps == 24 + + +def test_audio_request_all_inputs_optional_except_model(): + r = schemas.AudioRequest(model="whisper") + assert r.text is None + assert r.audio is None + assert r.voice is None + + +def test_generation_3d_request_output_format_default(): + r = schemas.Generation3DRequest(model="triposr") + assert r.output_format == "glb" + + +def test_vision_request_requires_image(): + with pytest.raises(ValidationError): + schemas.VisionRequest(model="clip") + + +def test_multimodal_embedding_request_all_inputs_optional(): + r = schemas.MultimodalEmbeddingRequest(model="clip") + assert r.input is None + assert r.image is None + assert r.audio is None + + +# ---------------------------------------------------------------------- +# Response shape validation (Literal["..."] guards) +# ---------------------------------------------------------------------- + +def test_image_generation_response_object_literal(): + r = schemas.ImageGenerationResponse( + id="imggen-1-abc", + object="image_generation", + created=1, + model="flux", + data=[schemas.ImageGenerationData(url="http://x/i.png")], + ) + assert r.object == "image_generation" + + +def test_image_generation_response_wrong_object_raises(): + with pytest.raises(ValidationError): + schemas.ImageGenerationResponse( + id="imggen-1-abc", + object="wrong", + created=1, + model="flux", + data=[], + ) + + +def test_multimodal_embedding_response_object_is_list(): + """Like EmbeddingResponse: outer object is 'list', each data item is 'embedding'.""" + r = schemas.MultimodalEmbeddingResponse( + object="list", + data=[ + schemas.MultimodalEmbeddingData( + embedding=[0.1, 0.2], + index=0, + modality="text", + ) + ], + model="clip", + ) + assert r.object == "list" + assert r.data[0].object == "embedding" # default on the data item + + +# ---------------------------------------------------------------------- +# Mixin wrap path — covers FRICTION #15 fix + each new endpoint_type +# ---------------------------------------------------------------------- + +@pytest.fixture +def mixin(): + return _BaseLLMMixin() + + +def test_friction_15_embedding_wrap_outer_object_is_list(mixin): + """ + FRICTION #15 regression. Pre-fix this raised ValidationError because the + mixin passed object='embedding' to EmbeddingResponse, which declares + object: Literal['list']. After the fix the wrap path succeeds and the + outer object is 'list'. + """ + req = schemas.EmbeddingRequest(model="bge", input="hello") + wrapped = mixin._wrap_llm_response( + result={ + "data": [{"object": "embedding", "embedding": [0.1, 0.2], "index": 0}], + "usage": {"prompt_tokens": 1, "total_tokens": 1}, + }, + response_model=schemas.EmbeddingResponse, + endpoint_type="embedding", + openai_req=req, + ) + assert wrapped.object == "list" + assert wrapped.data[0].object == "embedding" + + +def test_image_generation_wrap(mixin): + req = schemas.ImageGenerationRequest(model="flux", prompt="cat") + wrapped = mixin._wrap_llm_response( + result={"data": [{"url": "http://x/i.png", "seed": 42}]}, + response_model=schemas.ImageGenerationResponse, + endpoint_type="image_generation", + openai_req=req, + ) + assert wrapped.object == "image_generation" + assert wrapped.data[0].url == "http://x/i.png" + assert wrapped.id.startswith("imggen-") + + +def test_video_generation_wrap(mixin): + req = schemas.VideoGenerationRequest(model="hunyuan", prompt="x") + wrapped = mixin._wrap_llm_response( + result={"data": [{"url": "http://x/v.mp4", "duration_s": 5.0}]}, + response_model=schemas.VideoGenerationResponse, + endpoint_type="video_generation", + openai_req=req, + ) + assert wrapped.object == "video_generation" + assert wrapped.id.startswith("vidgen-") + + +def test_audio_wrap(mixin): + req = schemas.AudioRequest(model="whisper", text="hi") + wrapped = mixin._wrap_llm_response( + result={"data": [{"text": "hola", "language": "es"}]}, + response_model=schemas.AudioResponse, + endpoint_type="audio", + openai_req=req, + ) + assert wrapped.object == "audio" + assert wrapped.data[0].text == "hola" + + +def test_generation_3d_wrap(mixin): + req = schemas.Generation3DRequest(model="triposr", prompt="chair") + wrapped = mixin._wrap_llm_response( + result={"data": [{"url": "http://x/c.glb", "output_format": "glb"}]}, + response_model=schemas.Generation3DResponse, + endpoint_type="generation_3d", + openai_req=req, + ) + assert wrapped.object == "generation_3d" + assert wrapped.id.startswith("gen3d-") + + +def test_multimodal_embedding_wrap(mixin): + req = schemas.MultimodalEmbeddingRequest(model="clip", input="hi") + wrapped = mixin._wrap_llm_response( + result={ + "data": [ + { + "object": "embedding", + "embedding": [0.1, 0.2], + "index": 0, + "modality": "text", + } + ] + }, + response_model=schemas.MultimodalEmbeddingResponse, + endpoint_type="embedding_multimodal", + openai_req=req, + ) + assert wrapped.object == "list" + assert wrapped.data[0].embedding == [0.1, 0.2] + + +def test_unknown_endpoint_type_still_raises(mixin): + req = schemas.ImageGenerationRequest(model="x", prompt="y") + with pytest.raises(ValueError, match="Unknown endpoint type"): + mixin._wrap_llm_response( + result={"data": []}, + response_model=schemas.ImageGenerationResponse, + endpoint_type="not_a_real_type", + openai_req=req, + ) From b8cac70741ab2b9eb7c40ae1dca33bf6eb1cfc01 Mon Sep 17 00:00:00 2001 From: nataliasocaity Date: Mon, 8 Jun 2026 11:06:46 +0100 Subject: [PATCH 02/38] test-services: minimal harness for PR #15 media-file integration check Adds two files under examples/ to validate the new six Pydantic schemas end-to-end as Matthias requested on PR #15: - examples/test_service_six_schemas.py: APIPod service exposing /vision (VisionRequest, image required) and /audio (AudioRequest, audio optional). Each endpoint echoes media properties so we can see if the file actually got deserialized into ImageFile/AudioFile. - examples/test_clients_six_schemas.py: runs three checks against the running service: HTTP request with base64, HTTP request with URL, and a fastSDK call via APISeex. Result on this branch (server starts cleanly): - HTTP base64: 422 "Input should be an instance of ImageFile" - HTTP URL: 422 same error - fastSDK: does not dispatch the request without a registered service (no ad-hoc URL path in FastClient / create_sdk) Confirms Matthias's hypothesis that media-file integration with the new schemas does not work out of the box. Root cause is that the fastapi file_handling_mixin converts URL/base64 to ImageFile for *loose endpoint parameters*, not for ImageFile fields declared inside a Pydantic body model. Fix is out of scope of this PR. --- examples/test_clients_six_schemas.py | 168 +++++++++++++++++++++++++++ examples/test_service_six_schemas.py | 76 ++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 examples/test_clients_six_schemas.py create mode 100644 examples/test_service_six_schemas.py diff --git a/examples/test_clients_six_schemas.py b/examples/test_clients_six_schemas.py new file mode 100644 index 0000000..51fb365 --- /dev/null +++ b/examples/test_clients_six_schemas.py @@ -0,0 +1,168 @@ +""" +Exercises the test service in three ways, as Matthias asked on PR #15: + 1. fastSDK client + 2. HTTP request with base64 + 3. HTTP request with URL + +Run the service first in another shell: + python examples/test_service_six_schemas.py + +Then run this: + python examples/test_clients_six_schemas.py +""" + +import base64 +import io +import json +import sys +import urllib.request +from pathlib import Path + +import requests + +BASE_URL = "http://localhost:8000" +# A small public PNG used for the "URL" test. Picked because it doesn't need +# auth and returns a real PNG header (so media_toolkit can sniff it). +PUBLIC_IMAGE_URL = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/120px-PNG_transparency_demonstration_1.png" + + +def _make_local_png_bytes() -> bytes: + """A minimal valid PNG, no dependencies.""" + return bytes.fromhex( + "89504e470d0a1a0a0000000d49484452" + "000000010000000108060000001f15c4" + "890000000a49444154789c6300010000" + "0500010d0a2db40000000049454e44ae" + "426082" + ) + + +def _print_result(label: str, status: int, body) -> None: + print(f"\n=== {label} ===") + print(f"HTTP {status}") + print(json.dumps(body, indent=2) if isinstance(body, (dict, list)) else body) + + +# ------------------------------------------------------------------- +# 1. HTTP with base64 +# ------------------------------------------------------------------- +def test_http_base64() -> bool: + png = _make_local_png_bytes() + b64 = base64.b64encode(png).decode("ascii") + payload = { + "model": "test-model", + "image": b64, + } + r = requests.post(f"{BASE_URL}/vision", json=payload, timeout=15) + try: + body = r.json() + except Exception: + body = r.text + _print_result("HTTP base64", r.status_code, body) + return r.status_code == 200 + + +# ------------------------------------------------------------------- +# 2. HTTP with URL +# ------------------------------------------------------------------- +def test_http_url() -> bool: + payload = { + "model": "test-model", + "image": PUBLIC_IMAGE_URL, + } + r = requests.post(f"{BASE_URL}/vision", json=payload, timeout=30) + try: + body = r.json() + except Exception: + body = r.text + _print_result("HTTP URL", r.status_code, body) + return r.status_code == 200 + + +# ------------------------------------------------------------------- +# 3. fastSDK client +# ------------------------------------------------------------------- +def test_fastsdk() -> bool: + """ + Hits /vision through fastSDK. + + Note: fastSDK's public entry points (`FastClient`, `create_sdk`, + `APISeex`) all expect either a service registered in the Registry + or a generated client class. There is no ad-hoc "given this URL, + just POST this payload" path. For the purposes of PR #15 this means + a single localhost service like the one in this example is not the + intended fastSDK use case; the right shape would be to register + the service first and then call it through the SDK. + + For now we just dispatch a low-level APISeex with a minimal + ServiceDefinition and report whatever happens. + """ + try: + from fastsdk import APISeex, ImageFile + from apipod_registry.definitions.service_definitions import ( + ServiceDefinition, EndpointDefinition, EndpointParameter, + ServiceAddress, + ) + except Exception as exc: + _print_result("fastSDK", -1, f"import failed: {exc.__class__.__name__}: {exc}") + return False + + try: + service = ServiceDefinition( + id="test-svc", + display_name="test svc", + description="local test service", + service_address=ServiceAddress(url=BASE_URL), + endpoints=[], + ) + endpoint = EndpointDefinition( + id="vision", + path="/vision", + display_name="vision", + description="vision echo", + parameters=[ + EndpointParameter( + name="model", type="string", required=True, + location="body", default="test-model", + ), + EndpointParameter( + name="image", type="image", required=True, + location="body", + ), + ], + ) + png = _make_local_png_bytes() + img = ImageFile().from_bytes(png) + seex = APISeex( + service_def=service, + endpoint_def=endpoint, + data={"model": "test-model", "image": img}, + ) + result = seex.wait_for_result(timeout_s=15) + if seex.error: + _print_result("fastSDK", -1, f"server returned error: {seex.error}") + return False + if result is None: + _print_result("fastSDK", -1, "no result returned (request likely not dispatched; needs Registry setup)") + return False + _print_result("fastSDK", 200, str(result)) + return True + except Exception as exc: + _print_result("fastSDK", -1, f"call failed: {exc.__class__.__name__}: {exc}") + return False + + +def main() -> int: + results = { + "HTTP base64": test_http_base64(), + "HTTP URL": test_http_url(), + "fastSDK": test_fastsdk(), + } + print("\n=== Summary ===") + for name, ok in results.items(): + print(f" {name}: {'PASS' if ok else 'FAIL'}") + return 0 if all(results.values()) else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/examples/test_service_six_schemas.py b/examples/test_service_six_schemas.py new file mode 100644 index 0000000..2564bcf --- /dev/null +++ b/examples/test_service_six_schemas.py @@ -0,0 +1,76 @@ +""" +Minimal APIPod service used to verify media-file integration end to end for +PR #15 (the 6 new Pydantic schemas). + +It exposes two endpoints: +- POST /vision uses VisionRequest, which has a REQUIRED image field +- POST /audio uses AudioRequest, which has an OPTIONAL audio field + +Both endpoints just inspect the incoming media file and echo back a few +properties (size, content type, etc.) so we can confirm the file_handling +mixin actually deserialized URL/base64 input into a real ImageFile/AudioFile. + +Run with: + python examples/test_service_six_schemas.py +The server starts on http://0.0.0.0:8000 with OpenAPI docs at /docs. +""" + +from apipod import APIPod +from apipod.common.schemas import ( + VisionRequest, + VisionResponse, + VisionData, + AudioRequest, + AudioResponse, + AudioData, +) + + +app = APIPod() + + +def _media_summary(media) -> dict: + """Pull a couple of safe fields off whatever media_toolkit returned.""" + if media is None: + return {"present": False} + return { + "present": True, + "type": type(media).__name__, + "size_bytes": getattr(media, "file_size", None) or getattr(media, "size", None), + "content_type": getattr(media, "content_type", None), + } + + +@app.endpoint("/vision") +def vision(req: VisionRequest): + """ + Echoes back a fake VisionData. The point is not the label, it's that + req.image arrives as an ImageFile (deserialized from upload / base64 / URL). + """ + summary = _media_summary(req.image) + return { + "data": [ + VisionData(label=f"echo:{summary}", score=1.0, box=None) + ] + } + + +@app.endpoint("/audio") +def audio(req: AudioRequest): + """ + Echoes the audio properties (or text if no audio was sent). + """ + if req.audio is not None: + summary = _media_summary(req.audio) + text = f"echo:{summary}" + else: + text = f"no-audio:text={req.text!r}" + return { + "data": [ + AudioData(text=text, language=req.language, duration_s=None) + ] + } + + +if __name__ == "__main__": + app.start(port=8000, host="0.0.0.0") From e932d0546e194af2221702b98564934024033cc9 Mon Sep 17 00:00:00 2001 From: nataliasocaity Date: Mon, 8 Jun 2026 13:17:10 +0100 Subject: [PATCH 03/38] schemas: rename OpenAIBaseModel to APIPodSchemaBase Per Carlos's review on PR #15: the previous name suggested the schemas were tied to OpenAI's own models, when the intent is the opposite. The shape mirrors OpenAI's API for client compatibility, but any provider (Flux, Stable Diffusion, ElevenLabs, Whisper, etc.) can sit behind it. Renames the base class and adds a module-level + class-level docstring making the provider-agnostic intent explicit. No behaviour change. The related concerns about apipod/engine/llm/_BaseLLMMixin (used for non-LLM endpoints like image/audio/video generation) are not addressed here on purpose, because that rename touches the runpod and fastapi backends and their tests. Tracked for a separate follow-up PR. --- apipod/common/schemas.py | 85 +++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 32 deletions(-) diff --git a/apipod/common/schemas.py b/apipod/common/schemas.py index 89e664a..f111221 100644 --- a/apipod/common/schemas.py +++ b/apipod/common/schemas.py @@ -1,3 +1,15 @@ +""" +Standard request / response schemas for APIPod services. + +The shape of every schema in this file mirrors the OpenAI API so that +clients written against the OpenAI SDK (or any OpenAI-compatible tool) +can talk to an APIPod service without translation. That choice is about +the wire format; it does NOT imply the schemas are tied to OpenAI's own +models. Any provider (Flux, Stable Diffusion, ElevenLabs, Whisper, Suno, +DeepSeek, etc.) plugs into the same schemas and the routing layer +dispatches to whatever runs behind it. +""" + from typing import List, Optional, Union, Literal from pydantic import BaseModel @@ -7,7 +19,16 @@ # Base schema # ===================================================== -class OpenAIBaseModel(BaseModel): +class APIPodSchemaBase(BaseModel): + """ + Base for every APIPod request / response model. + + Shape follows the OpenAI API spec so OpenAI-compatible clients work + out of the box, but the schemas are provider-agnostic: anything that + matches the shape (Flux, SD, ElevenLabs, Whisper, in-house models...) + is a valid backend. + """ + model_config = { "extra": "forbid", "validate_assignment": True, @@ -23,12 +44,12 @@ class OpenAIBaseModel(BaseModel): # Chat Completions - Input schemas # ===================================================== -class ChatMessage(OpenAIBaseModel): +class ChatMessage(APIPodSchemaBase): role: Literal["system", "user", "assistant"] content: str -class ChatCompletionRequest(OpenAIBaseModel): +class ChatCompletionRequest(APIPodSchemaBase): model: str messages: List[ChatMessage] @@ -47,7 +68,7 @@ class ChatCompletionRequest(OpenAIBaseModel): # Text Completion - Input schemas # ===================================================== -class CompletionRequest(OpenAIBaseModel): +class CompletionRequest(APIPodSchemaBase): model: str prompt: Union[str, List[str]] @@ -63,7 +84,7 @@ class CompletionRequest(OpenAIBaseModel): # Embedding - Input schemas # ===================================================== -class EmbeddingRequest(OpenAIBaseModel): +class EmbeddingRequest(APIPodSchemaBase): model: str input: Union[str, List[str]] user: Optional[str] = None @@ -73,7 +94,7 @@ class EmbeddingRequest(OpenAIBaseModel): # Image Generation - Input schemas # ===================================================== -class ImageGenerationRequest(OpenAIBaseModel): +class ImageGenerationRequest(APIPodSchemaBase): model: str prompt: str @@ -90,7 +111,7 @@ class ImageGenerationRequest(OpenAIBaseModel): # Video Generation - Input schemas # ===================================================== -class VideoGenerationRequest(OpenAIBaseModel): +class VideoGenerationRequest(APIPodSchemaBase): model: str prompt: str @@ -105,7 +126,7 @@ class VideoGenerationRequest(OpenAIBaseModel): # Audio - Input schemas (TTS, STT, music) # ===================================================== -class AudioRequest(OpenAIBaseModel): +class AudioRequest(APIPodSchemaBase): model: str text: Optional[str] = None @@ -120,7 +141,7 @@ class AudioRequest(OpenAIBaseModel): # 3D Generation - Input schemas # ===================================================== -class Generation3DRequest(OpenAIBaseModel): +class Generation3DRequest(APIPodSchemaBase): model: str prompt: Optional[str] = None @@ -133,7 +154,7 @@ class Generation3DRequest(OpenAIBaseModel): # Vision - Input schemas (classify, detect, OCR) # ===================================================== -class VisionRequest(OpenAIBaseModel): +class VisionRequest(APIPodSchemaBase): model: str image: ImageFile @@ -146,7 +167,7 @@ class VisionRequest(OpenAIBaseModel): # Multimodal Embedding - Input schemas # ===================================================== -class MultimodalEmbeddingRequest(OpenAIBaseModel): +class MultimodalEmbeddingRequest(APIPodSchemaBase): model: str input: Optional[Union[str, List[str]]] = None @@ -174,7 +195,7 @@ class MultimodalEmbeddingRequest(OpenAIBaseModel): # Shared output schemas # ===================================================== -class Usage(OpenAIBaseModel): +class Usage(APIPodSchemaBase): prompt_tokens: int completion_tokens: Optional[int] = None total_tokens: int @@ -184,18 +205,18 @@ class Usage(OpenAIBaseModel): # Chat Completions - Output schemas # ===================================================== -class ChatCompletionMessage(OpenAIBaseModel): +class ChatCompletionMessage(APIPodSchemaBase): role: Literal["assistant"] content: str -class ChatCompletionChoice(OpenAIBaseModel): +class ChatCompletionChoice(APIPodSchemaBase): index: int message: ChatCompletionMessage finish_reason: Literal["stop", "length", "content_filter"] -class ChatCompletionResponse(OpenAIBaseModel): +class ChatCompletionResponse(APIPodSchemaBase): id: str object: Literal["chat.completion"] created: int @@ -208,14 +229,14 @@ class ChatCompletionResponse(OpenAIBaseModel): # Text Completion - Output schemas # ===================================================== -class CompletionChoice(OpenAIBaseModel): +class CompletionChoice(APIPodSchemaBase): text: str index: int logprobs: None = None finish_reason: Literal["stop", "length", "content_filter"] -class CompletionResponse(OpenAIBaseModel): +class CompletionResponse(APIPodSchemaBase): id: str object: Literal["text_completion"] created: int @@ -228,13 +249,13 @@ class CompletionResponse(OpenAIBaseModel): # Embedding - Output schemas # ===================================================== -class EmbeddingData(OpenAIBaseModel): +class EmbeddingData(APIPodSchemaBase): object: Literal["embedding"] embedding: List[float] index: int -class EmbeddingResponse(OpenAIBaseModel): +class EmbeddingResponse(APIPodSchemaBase): object: Literal["list"] data: List[EmbeddingData] model: str @@ -245,14 +266,14 @@ class EmbeddingResponse(OpenAIBaseModel): # Image Generation - Output schemas # ===================================================== -class ImageGenerationData(OpenAIBaseModel): +class ImageGenerationData(APIPodSchemaBase): url: Optional[str] = None b64_json: Optional[str] = None revised_prompt: Optional[str] = None seed: Optional[int] = None -class ImageGenerationResponse(OpenAIBaseModel): +class ImageGenerationResponse(APIPodSchemaBase): id: str object: Literal["image_generation"] created: int @@ -265,13 +286,13 @@ class ImageGenerationResponse(OpenAIBaseModel): # Video Generation - Output schemas # ===================================================== -class VideoGenerationData(OpenAIBaseModel): +class VideoGenerationData(APIPodSchemaBase): url: Optional[str] = None duration_s: Optional[float] = None seed: Optional[int] = None -class VideoGenerationResponse(OpenAIBaseModel): +class VideoGenerationResponse(APIPodSchemaBase): id: str object: Literal["video_generation"] created: int @@ -284,14 +305,14 @@ class VideoGenerationResponse(OpenAIBaseModel): # Audio - Output schemas # ===================================================== -class AudioData(OpenAIBaseModel): +class AudioData(APIPodSchemaBase): audio: Optional[str] = None text: Optional[str] = None language: Optional[str] = None duration_s: Optional[float] = None -class AudioResponse(OpenAIBaseModel): +class AudioResponse(APIPodSchemaBase): id: str object: Literal["audio"] created: int @@ -304,13 +325,13 @@ class AudioResponse(OpenAIBaseModel): # 3D Generation - Output schemas # ===================================================== -class Generation3DData(OpenAIBaseModel): +class Generation3DData(APIPodSchemaBase): url: Optional[str] = None output_format: Optional[str] = None seed: Optional[int] = None -class Generation3DResponse(OpenAIBaseModel): +class Generation3DResponse(APIPodSchemaBase): id: str object: Literal["generation_3d"] created: int @@ -323,18 +344,18 @@ class Generation3DResponse(OpenAIBaseModel): # Vision - Output schemas (classify, detect, OCR) # ===================================================== -class VisionLabel(OpenAIBaseModel): +class VisionLabel(APIPodSchemaBase): label: str score: float box: Optional[List[float]] = None -class VisionData(OpenAIBaseModel): +class VisionData(APIPodSchemaBase): labels: List[VisionLabel] = [] text: Optional[str] = None -class VisionResponse(OpenAIBaseModel): +class VisionResponse(APIPodSchemaBase): id: str object: Literal["vision"] created: int @@ -347,14 +368,14 @@ class VisionResponse(OpenAIBaseModel): # Multimodal Embedding - Output schemas # ===================================================== -class MultimodalEmbeddingData(OpenAIBaseModel): +class MultimodalEmbeddingData(APIPodSchemaBase): object: Literal["embedding"] = "embedding" embedding: List[float] index: int modality: Optional[Literal["text", "image", "audio"]] = None -class MultimodalEmbeddingResponse(OpenAIBaseModel): +class MultimodalEmbeddingResponse(APIPodSchemaBase): object: Literal["list"] data: List[MultimodalEmbeddingData] model: str From 8549eab78c037d19679ab8e35307bd95c303a794 Mon Sep 17 00:00:00 2001 From: nataliasocaity Date: Tue, 9 Jun 2026 08:15:47 +0100 Subject: [PATCH 04/38] schemas: pre-validator to convert URL / base64 strings into media files inside Pydantic bodies Matthias asked on PR #15 to make media-file integration actually work for the new schemas with JSON callers sending base64 or URLs. file_handling_mixin converts those for loose endpoint parameters but not for ImageFile / AudioFile / VideoFile / MediaFile fields declared inside a Pydantic body model, where Pydantic validates the string before the mixin gets a chance. This adds a model_validator(mode='before') on APIPodSchemaBase that walks model_fields, picks up media-typed fields, and converts string values: URLs and data URIs go through media_from_any, bare base64 strings go through the file class's from_base64 (media_from_any does not recognise bare base64). Non-string values pass through untouched so existing callers that already hand over an ImageFile instance keep working. E2E (examples/test_service_six_schemas.py + test_clients_six_schemas.py): HTTP base64 PASS, HTTP URL PASS, both return 200 with ImageFile in the echo. fastSDK still requires Registry setup as called out previously, no change. The 21 unit tests in test/llm/test_six_schemas.py still pass. examples/test_service_six_schemas.py: param renamed to 'payload' to match the router convention, response dicts use the actual VisionData / AudioData shapes (labels: List[VisionLabel] for vision, audio fields for audio). --- apipod/common/schemas.py | 54 ++++++++++++++++++++++++---- examples/test_service_six_schemas.py | 34 ++++++++---------- 2 files changed, 62 insertions(+), 26 deletions(-) diff --git a/apipod/common/schemas.py b/apipod/common/schemas.py index f111221..413aa35 100644 --- a/apipod/common/schemas.py +++ b/apipod/common/schemas.py @@ -10,10 +10,25 @@ dispatches to whatever runs behind it. """ -from typing import List, Optional, Union, Literal -from pydantic import BaseModel +from types import UnionType +from typing import Any, List, Literal, Optional, Union, get_args, get_origin +from pydantic import BaseModel, model_validator + +from media_toolkit import AudioFile, ImageFile, MediaFile, VideoFile, media_from_any + +_MEDIA_FIELD_TYPES = (ImageFile, AudioFile, VideoFile, MediaFile) + + +def _media_field_type(annotation: Any) -> Optional[type]: + """Media class if annotation is media-typed (bare, Optional, or Union), else None.""" + if annotation in _MEDIA_FIELD_TYPES: + return annotation + if get_origin(annotation) in (Union, UnionType): + for arg in get_args(annotation): + if arg in _MEDIA_FIELD_TYPES: + return arg + return None -from media_toolkit import ImageFile, AudioFile # ===================================================== # Base schema @@ -33,12 +48,39 @@ class APIPodSchemaBase(BaseModel): "extra": "forbid", "validate_assignment": True, "populate_by_name": True, - # Allow media_toolkit file types (ImageFile, AudioFile, VideoFile, MediaFile) - # as field annotations. APIPod's file_handling_mixin converts URL/base64 - # inputs into these types before request validation. + # ImageFile / AudioFile / VideoFile / MediaFile are non-BaseModel types + # used as field annotations; the pre-validator below converts URL / + # base64 strings into instances before per-field validation. "arbitrary_types_allowed": True, } + @model_validator(mode="before") + @classmethod + def _convert_media_strings(cls, data: Any) -> Any: + """URL / data URI through media_from_any, bare base64 through from_base64.""" + if not isinstance(data, dict): + return data + for field_name, field_info in cls.model_fields.items(): + if field_name not in data: + continue + value = data[field_name] + if not isinstance(value, str): + continue + media_type = _media_field_type(field_info.annotation) + if media_type is None: + continue + if value.startswith(("http://", "https://", "data:")): + data[field_name] = media_from_any( + data=value, + type_hint=media_type, + use_temp_file=True, + temp_dir=None, + allow_reads_from_disk=False, + ) + else: + data[field_name] = media_type().from_base64(value) + return data + # ===================================================== # Chat Completions - Input schemas diff --git a/examples/test_service_six_schemas.py b/examples/test_service_six_schemas.py index 2564bcf..9d0d36d 100644 --- a/examples/test_service_six_schemas.py +++ b/examples/test_service_six_schemas.py @@ -18,11 +18,7 @@ from apipod import APIPod from apipod.common.schemas import ( VisionRequest, - VisionResponse, - VisionData, AudioRequest, - AudioResponse, - AudioData, ) @@ -42,32 +38,30 @@ def _media_summary(media) -> dict: @app.endpoint("/vision") -def vision(req: VisionRequest): - """ - Echoes back a fake VisionData. The point is not the label, it's that - req.image arrives as an ImageFile (deserialized from upload / base64 / URL). - """ - summary = _media_summary(req.image) +def vision(payload: VisionRequest): + """Echoes a label built from payload.image. The point is that the image + arrived as an ImageFile, deserialized from upload / base64 / URL.""" + summary = _media_summary(payload.image) return { "data": [ - VisionData(label=f"echo:{summary}", score=1.0, box=None) + { + "labels": [{"label": f"echo:{summary}", "score": 1.0}], + "text": None, + } ] } @app.endpoint("/audio") -def audio(req: AudioRequest): - """ - Echoes the audio properties (or text if no audio was sent). - """ - if req.audio is not None: - summary = _media_summary(req.audio) - text = f"echo:{summary}" +def audio(payload: AudioRequest): + """Echoes the audio properties (or text if no audio was sent).""" + if payload.audio is not None: + text = f"echo:{_media_summary(payload.audio)}" else: - text = f"no-audio:text={req.text!r}" + text = f"no-audio:text={payload.text!r}" return { "data": [ - AudioData(text=text, language=req.language, duration_s=None) + {"text": text, "language": payload.language, "duration_s": None} ] } From 6932f0941546c6d523a8195f7801be738496ae8b Mon Sep 17 00:00:00 2001 From: nataliasocaity Date: Tue, 9 Jun 2026 08:54:56 +0100 Subject: [PATCH 05/38] test: fill coverage gaps for the six new modality schemas Previous test file had 21 tests but coverage was uneven across modalities. Vision in particular had no wrap test, so the vision elif branch in _wrap_llm_response was never executed. Adds 10 tests to bring video / audio / 3d / vision to parity with image: - video missing-prompt validation - response object Literal["..."] check + wrong_object_raises for video, audio, 3d, vision - vision_wrap covering the previously unexercised elif branch Total: 21 -> 31, all passing. --- test/llm/test_six_schemas.py | 124 +++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/test/llm/test_six_schemas.py b/test/llm/test_six_schemas.py index d4f7a06..cdd6a6e 100644 --- a/test/llm/test_six_schemas.py +++ b/test/llm/test_six_schemas.py @@ -77,6 +77,11 @@ def test_video_generation_request_defaults(): assert r.fps == 24 +def test_video_generation_request_missing_prompt_raises(): + with pytest.raises(ValidationError): + schemas.VideoGenerationRequest(model="hunyuan") + + def test_audio_request_all_inputs_optional_except_model(): r = schemas.AudioRequest(model="whisper") assert r.text is None @@ -127,6 +132,94 @@ def test_image_generation_response_wrong_object_raises(): ) +def test_video_generation_response_object_literal(): + r = schemas.VideoGenerationResponse( + id="vidgen-1-abc", + object="video_generation", + created=1, + model="hunyuan", + data=[schemas.VideoGenerationData(url="http://x/v.mp4")], + ) + assert r.object == "video_generation" + + +def test_video_generation_response_wrong_object_raises(): + with pytest.raises(ValidationError): + schemas.VideoGenerationResponse( + id="vidgen-1-abc", + object="wrong", + created=1, + model="hunyuan", + data=[], + ) + + +def test_audio_response_object_literal(): + r = schemas.AudioResponse( + id="aud-1-abc", + object="audio", + created=1, + model="whisper", + data=[schemas.AudioData(text="hola")], + ) + assert r.object == "audio" + + +def test_audio_response_wrong_object_raises(): + with pytest.raises(ValidationError): + schemas.AudioResponse( + id="aud-1-abc", + object="wrong", + created=1, + model="whisper", + data=[], + ) + + +def test_generation_3d_response_object_literal(): + r = schemas.Generation3DResponse( + id="gen3d-1-abc", + object="generation_3d", + created=1, + model="triposr", + data=[schemas.Generation3DData(url="http://x/c.glb")], + ) + assert r.object == "generation_3d" + + +def test_generation_3d_response_wrong_object_raises(): + with pytest.raises(ValidationError): + schemas.Generation3DResponse( + id="gen3d-1-abc", + object="wrong", + created=1, + model="triposr", + data=[], + ) + + +def test_vision_response_object_literal(): + r = schemas.VisionResponse( + id="vis-1-abc", + object="vision", + created=1, + model="clip", + data=[schemas.VisionData(labels=[])], + ) + assert r.object == "vision" + + +def test_vision_response_wrong_object_raises(): + with pytest.raises(ValidationError): + schemas.VisionResponse( + id="vis-1-abc", + object="wrong", + created=1, + model="clip", + data=[], + ) + + def test_multimodal_embedding_response_object_is_list(): """Like EmbeddingResponse: outer object is 'list', each data item is 'embedding'.""" r = schemas.MultimodalEmbeddingResponse( @@ -223,6 +316,37 @@ def test_generation_3d_wrap(mixin): assert wrapped.id.startswith("gen3d-") +# 1x1 transparent PNG used to construct ImageFile without hitting the network. +_TINY_PNG_B64 = ( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" +) + + +def test_vision_wrap(mixin): + """ + Vision branch in _wrap_llm_response had no test before; the elif path was + never exercised. Covers the branch end-to-end. + """ + req = schemas.VisionRequest(model="clip", image=_TINY_PNG_B64) + wrapped = mixin._wrap_llm_response( + result={ + "data": [ + { + "labels": [{"label": "cat", "score": 0.95}], + "text": None, + } + ] + }, + response_model=schemas.VisionResponse, + endpoint_type="vision", + openai_req=req, + ) + assert wrapped.object == "vision" + assert wrapped.id.startswith("vis-") + assert wrapped.data[0].labels[0].label == "cat" + assert wrapped.data[0].labels[0].score == 0.95 + + def test_multimodal_embedding_wrap(mixin): req = schemas.MultimodalEmbeddingRequest(model="clip", input="hi") wrapped = mixin._wrap_llm_response( From 93fcb877b5e9a746dd32fdc7bf1a2b400740236d Mon Sep 17 00:00:00 2001 From: nataliasocaity Date: Tue, 9 Jun 2026 09:14:48 +0100 Subject: [PATCH 06/38] schemas: drop the URL/base64 routing in the media pre-validator Matthias pointed out that media_from_any already detects base64 without a data: prefix. My earlier sniff was confused by a 1x1 test PNG (~67 bytes / 92 b64 chars), which sits below media_toolkit's sniffer length threshold (it bails on short payloads to avoid false positives on identifier-looking strings). With a realistic payload the heuristic kicks in and a single media_from_any call covers URL, data URI, and bare base64. - pre-validator on APIPodSchemaBase now always routes through media_from_any. The branch on ("http://", "https://", "data:") and the from_base64 fallback are gone. - test_clients_six_schemas.py: build a 32x32 PNG (~100 bytes / ~140 b64 chars) instead of the 1x1, so the E2E base64 path exercises the same shape a realistic JSON caller sends. - test_six_schemas.py: replace the inline 1x1 _TINY_PNG_B64 constant with a helper that builds the 32x32 PNG; documents the threshold reason inline. E2E still passes (HTTP base64 200, HTTP URL 200, fastSDK still gated by Registry setup as flagged before). All 31 unit tests pass. --- apipod/common/schemas.py | 17 +++++++-------- examples/test_clients_six_schemas.py | 31 +++++++++++++++++++++------- test/llm/test_six_schemas.py | 28 +++++++++++++++++++++---- 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/apipod/common/schemas.py b/apipod/common/schemas.py index 413aa35..d8216a2 100644 --- a/apipod/common/schemas.py +++ b/apipod/common/schemas.py @@ -69,16 +69,13 @@ def _convert_media_strings(cls, data: Any) -> Any: media_type = _media_field_type(field_info.annotation) if media_type is None: continue - if value.startswith(("http://", "https://", "data:")): - data[field_name] = media_from_any( - data=value, - type_hint=media_type, - use_temp_file=True, - temp_dir=None, - allow_reads_from_disk=False, - ) - else: - data[field_name] = media_type().from_base64(value) + data[field_name] = media_from_any( + data=value, + type_hint=media_type, + use_temp_file=True, + temp_dir=None, + allow_reads_from_disk=False, + ) return data diff --git a/examples/test_clients_six_schemas.py b/examples/test_clients_six_schemas.py index 51fb365..43dc4ba 100644 --- a/examples/test_clients_six_schemas.py +++ b/examples/test_clients_six_schemas.py @@ -27,13 +27,30 @@ def _make_local_png_bytes() -> bytes: - """A minimal valid PNG, no dependencies.""" - return bytes.fromhex( - "89504e470d0a1a0a0000000d49484452" - "000000010000000108060000001f15c4" - "890000000a49444154789c6300010000" - "0500010d0a2db40000000049454e44ae" - "426082" + """Build a small but real-sized PNG (32x32 solid red) in-process. + + media_toolkit's base64 sniffer needs a payload long enough to be confident + it is base64 and not a short identifier-looking string. The original 1x1 + PNG (67 bytes / 92 b64 chars) sat below the heuristic; 32x32 (~100 bytes / + ~140 b64 chars) is comfortably above it and matches realistic JSON callers. + """ + import struct + import zlib + + width = height = 32 + color = (255, 0, 0) + + ihdr_data = struct.pack(">IIBBBBB", width, height, 8, 2, 0, 0, 0) + raw = b"" + for _ in range(height): + raw += b"\x00" + bytes(color * width) + idat = zlib.compress(raw) + + return ( + b"\x89PNG\r\n\x1a\n" + + struct.pack(">I", len(ihdr_data)) + b"IHDR" + ihdr_data + struct.pack(">I", zlib.crc32(b"IHDR" + ihdr_data)) + + struct.pack(">I", len(idat)) + b"IDAT" + idat + struct.pack(">I", zlib.crc32(b"IDAT" + idat)) + + struct.pack(">I", 0) + b"IEND" + struct.pack(">I", zlib.crc32(b"IEND")) ) diff --git a/test/llm/test_six_schemas.py b/test/llm/test_six_schemas.py index cdd6a6e..c1dd566 100644 --- a/test/llm/test_six_schemas.py +++ b/test/llm/test_six_schemas.py @@ -316,10 +316,30 @@ def test_generation_3d_wrap(mixin): assert wrapped.id.startswith("gen3d-") -# 1x1 transparent PNG used to construct ImageFile without hitting the network. -_TINY_PNG_B64 = ( - "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" -) +# 32x32 solid-red PNG (~100 bytes / ~140 b64 chars). The previous 1x1 PNG +# was too short for media_toolkit's base64 sniffer (it bails on payloads +# below the heuristic length to avoid false positives on short tokens). +def _make_png_b64() -> str: + import base64 + import struct + import zlib + + w = h = 32 + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + raw = b"" + for _ in range(h): + raw += b"\x00" + bytes((255, 0, 0) * w) + idat = zlib.compress(raw) + png = ( + b"\x89PNG\r\n\x1a\n" + + struct.pack(">I", len(ihdr)) + b"IHDR" + ihdr + struct.pack(">I", zlib.crc32(b"IHDR" + ihdr)) + + struct.pack(">I", len(idat)) + b"IDAT" + idat + struct.pack(">I", zlib.crc32(b"IDAT" + idat)) + + struct.pack(">I", 0) + b"IEND" + struct.pack(">I", zlib.crc32(b"IEND")) + ) + return base64.b64encode(png).decode("ascii") + + +_TINY_PNG_B64 = _make_png_b64() def test_vision_wrap(mixin): From c0c8892405dfc848ffe759dce1d6e68361734c89 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Fri, 12 Jun 2026 09:21:39 +0200 Subject: [PATCH 07/38] changes --- apipod/engine/backend/fastapi/file_handling_mixin.py | 4 ++-- apipod/engine/jobs/job_progress.py | 11 +++++++++-- apipod/engine/queue/job_queue.py | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/apipod/engine/backend/fastapi/file_handling_mixin.py b/apipod/engine/backend/fastapi/file_handling_mixin.py index 0c05d62..fb74aba 100644 --- a/apipod/engine/backend/fastapi/file_handling_mixin.py +++ b/apipod/engine/backend/fastapi/file_handling_mixin.py @@ -254,7 +254,7 @@ def _inject_dummy_job_progress(self, func: Callable) -> Callable: sig = inspect.signature(func) job_progress_params = [ p.name for p in sig.parameters.values() - if p.name == "job_progress" or "FastJobProgress" in str(p.annotation) + if p.name == "job_progress" or "JobProgress" in str(p.annotation) ] if not job_progress_params: @@ -290,7 +290,7 @@ def _remove_job_progress_from_signature(self, func: Callable) -> Callable: sig = inspect.signature(func) new_sig = sig.replace(parameters=[ p for p in sig.parameters.values() - if p.name != "job_progress" and "FastJobProgress" not in str(p.annotation) + if p.name != "job_progress" and "JobProgress" not in str(p.annotation) ]) if len(new_sig.parameters) != len(sig.parameters): return replace_func_signature(func, new_sig) diff --git a/apipod/engine/jobs/job_progress.py b/apipod/engine/jobs/job_progress.py index 099e3c9..b9b6ed5 100644 --- a/apipod/engine/jobs/job_progress.py +++ b/apipod/engine/jobs/job_progress.py @@ -1,3 +1,7 @@ +import logging +logger = logging.getLogger(__name__) + + class JobProgress: def __init__(self, progress: float = 0, message: str = None): """ @@ -7,14 +11,17 @@ def __init__(self, progress: float = 0, message: str = None): """ self._progress = progress self._message = message - + logger.setLevel(logging.INFO) + def set_status(self, progress: float = None, message: str = None): if progress is not None: self._progress = progress if message is not None: self._message = message + logger.info(f"Progress: {self._progress} Message: {self._message}") + return self - + class JobProgressRunpod(JobProgress): def __init__(self, runpod_job, progress: float = 0, message: str = None): super().__init__(progress=progress, message=message) diff --git a/apipod/engine/queue/job_queue.py b/apipod/engine/queue/job_queue.py index 985d239..5aa6f0c 100644 --- a/apipod/engine/queue/job_queue.py +++ b/apipod/engine/queue/job_queue.py @@ -130,7 +130,7 @@ def _inject_job_progress(self, job: T) -> T: job_progress_params = [ p for p in sig.parameters.values() - if p.name == "job_progress" or "FastJobProgress" in str(p.annotation) + if p.name == "job_progress" or "JobProgress" in str(p.annotation) ] for job_progress_param in job_progress_params: job.job_params[job_progress_param.name] = job.job_progress From 4cee9af5b4056fd203a092aed256a8bb2084baf3 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Fri, 12 Jun 2026 10:39:16 +0200 Subject: [PATCH 08/38] added field values for descriptive pydantic schemas --- apipod/common/schemas.py | 268 +++++++++--------- .../{llm => schema_extension}/__init__.py | 0 .../schema_mixin.py} | 2 +- 3 files changed, 135 insertions(+), 135 deletions(-) rename apipod/engine/{llm => schema_extension}/__init__.py (100%) rename apipod/engine/{llm/base_llm_mixin.py => schema_extension/schema_mixin.py} (99%) diff --git a/apipod/common/schemas.py b/apipod/common/schemas.py index d8216a2..a25417d 100644 --- a/apipod/common/schemas.py +++ b/apipod/common/schemas.py @@ -12,7 +12,7 @@ from types import UnionType from typing import Any, List, Literal, Optional, Union, get_args, get_origin -from pydantic import BaseModel, model_validator +from pydantic import BaseModel, Field, model_validator from media_toolkit import AudioFile, ImageFile, MediaFile, VideoFile, media_from_any @@ -84,23 +84,23 @@ def _convert_media_strings(cls, data: Any) -> Any: # ===================================================== class ChatMessage(APIPodSchemaBase): - role: Literal["system", "user", "assistant"] - content: str + role: Literal["system", "user", "assistant"] = Field(description="The role of the message author (system, user, or assistant).") + content: str = Field(description="The content of the message.") class ChatCompletionRequest(APIPodSchemaBase): - model: str - messages: List[ChatMessage] + model: str = Field(description="ID of the model to use for this request.") + messages: List[ChatMessage] = Field(description="A list of messages comprising the conversation history.") - temperature: float = 0.7 - max_tokens: Optional[int] = None - top_p: float = 1.0 - n: int = 1 - stream: bool = False - stop: Optional[Union[str, List[str]]] = None - presence_penalty: float = 0.0 - frequency_penalty: float = 0.0 - user: Optional[str] = None + temperature: float = Field(default=0.7, description="Sampling temperature between 0.0 and 2.0. Higher values make output more random.") + max_tokens: Optional[int] = Field(default=None, description="The maximum number of tokens to generate in the completion.") + top_p: float = Field(default=1.0, description="Nucleus sampling threshold. Only tokens with cumulative probability >= top_p are considered.") + n: int = Field(default=1, description="How many completions to generate for each prompt.") + stream: bool = Field(default=False, description="If set, partial message deltas will be sent as server-sent events.") + stop: Optional[Union[str, List[str]]] = Field(default=None, description="Up to 4 sequences where the API will stop generating further tokens.") + presence_penalty: float = Field(default=0.0, description="Penalty for new tokens based on whether they appear in the text so far.") + frequency_penalty: float = Field(default=0.0, description="Penalty for new tokens based on their existing frequency in the text so far.") + user: Optional[str] = Field(default=None, description="A unique identifier representing your end-user.") # ===================================================== @@ -108,15 +108,15 @@ class ChatCompletionRequest(APIPodSchemaBase): # ===================================================== class CompletionRequest(APIPodSchemaBase): - model: str - prompt: Union[str, List[str]] + model: str = Field(description="ID of the model to use for this request.") + prompt: Union[str, List[str]] = Field(description="The prompt(s) to generate completions for.") - temperature: float = 0.7 - max_tokens: int = 16 - top_p: float = 1.0 - n: int = 1 - stream: bool = False - stop: Optional[Union[str, List[str]]] = None + temperature: float = Field(default=0.7, description="Sampling temperature between 0.0 and 2.0.") + max_tokens: int = Field(default=16, description="The maximum number of tokens to generate.") + top_p: float = Field(default=1.0, description="Nucleus sampling threshold.") + n: int = Field(default=1, description="How many completions to generate.") + stream: bool = Field(default=False, description="Whether to stream partial progress.") + stop: Optional[Union[str, List[str]]] = Field(default=None, description="Sequences where the API will stop generating.") # ===================================================== @@ -124,9 +124,9 @@ class CompletionRequest(APIPodSchemaBase): # ===================================================== class EmbeddingRequest(APIPodSchemaBase): - model: str - input: Union[str, List[str]] - user: Optional[str] = None + model: str = Field(description="ID of the model to use for generating embeddings.") + input: Union[str, List[str]] = Field(description="The input text to embed.") + user: Optional[str] = Field(default=None, description="A unique identifier representing your end-user.") # ===================================================== @@ -134,16 +134,16 @@ class EmbeddingRequest(APIPodSchemaBase): # ===================================================== class ImageGenerationRequest(APIPodSchemaBase): - model: str - prompt: str + model: str = Field(description="ID of the model to use for image generation.") + prompt: str = Field(description="A text description of the desired image(s).") - negative_prompt: Optional[str] = None - image: Optional[ImageFile] = None - mask: Optional[ImageFile] = None - size: Optional[str] = None - num_images: int = 1 - seed: Optional[int] = None - steps: Optional[int] = None + negative_prompt: Optional[str] = Field(default=None, description="A text description of what to exclude from the generated image.") + image: Optional[ImageFile] = Field(default=None, description="An optional reference image for image-to-image or inpainting tasks.") + mask: Optional[ImageFile] = Field(default=None, description="An optional mask image for inpainting, where white pixels indicate areas to edit.") + size: Optional[str] = Field(default=None, description="The size of the generated images, e.g. 1024x1024.") + num_images: int = Field(default=1, description="The number of images to generate.") + seed: Optional[int] = Field(default=None, description="Random seed for reproducible generation.") + steps: Optional[int] = Field(default=None, description="The number of inference steps to perform.") # ===================================================== @@ -151,14 +151,14 @@ class ImageGenerationRequest(APIPodSchemaBase): # ===================================================== class VideoGenerationRequest(APIPodSchemaBase): - model: str - prompt: str + model: str = Field(description="ID of the model to use for video generation.") + prompt: str = Field(description="A text description of the desired video.") - image: Optional[ImageFile] = None - duration_s: float = 5.0 - fps: int = 24 - aspect_ratio: Optional[str] = None - seed: Optional[int] = None + image: Optional[ImageFile] = Field(default=None, description="An optional reference image (frame0) to start the video from.") + duration_s: float = Field(default=5.0, description="The desired duration of the video in seconds.") + fps: int = Field(default=24, description="Frames per second for the generated video.") + aspect_ratio: Optional[str] = Field(default=None, description="The aspect ratio of the generated video, e.g. 16:9.") + seed: Optional[int] = Field(default=None, description="Random seed for reproducible generation.") # ===================================================== @@ -166,14 +166,14 @@ class VideoGenerationRequest(APIPodSchemaBase): # ===================================================== class AudioRequest(APIPodSchemaBase): - model: str + model: str = Field(description="ID of the model to use for audio tasks (TTS, STT, or music).") - text: Optional[str] = None - audio: Optional[AudioFile] = None - voice: Optional[str] = None - language: Optional[str] = None - format: Optional[str] = None - duration_s: Optional[float] = None + text: Optional[str] = Field(default=None, description="The input text for text-to-speech or music generation.") + audio: Optional[AudioFile] = Field(default=None, description="The input audio file for speech-to-text tasks.") + voice: Optional[str] = Field(default=None, description="The voice ID or style to use for audio generation.") + language: Optional[str] = Field(default=None, description="The language of the input audio (for STT) or target language (for TTS).") + format: Optional[str] = Field(default=None, description="The desired output audio format, e.g. mp3, wav, flac.") + duration_s: Optional[float] = Field(default=None, description="The desired duration of the generated audio in seconds.") # ===================================================== @@ -181,12 +181,12 @@ class AudioRequest(APIPodSchemaBase): # ===================================================== class Generation3DRequest(APIPodSchemaBase): - model: str + model: str = Field(description="ID of the model to use for 3D generation.") - prompt: Optional[str] = None - image: Optional[ImageFile] = None - output_format: str = "glb" - seed: Optional[int] = None + prompt: Optional[str] = Field(default=None, description="A text description of the 3D object to generate.") + image: Optional[ImageFile] = Field(default=None, description="An optional reference image to generate the 3D object from.") + output_format: str = Field(default="glb", description="The desired 3D output format (glb, obj, fbx, etc.).") + seed: Optional[int] = Field(default=None, description="Random seed for reproducible generation.") # ===================================================== @@ -194,12 +194,12 @@ class Generation3DRequest(APIPodSchemaBase): # ===================================================== class VisionRequest(APIPodSchemaBase): - model: str - image: ImageFile + model: str = Field(description="ID of the model to use for vision tasks (OCR, detection, etc.).") + image: ImageFile = Field(description="The image to process for vision tasks.") - labels: Optional[List[str]] = None - threshold: Optional[float] = None - return_boxes: bool = False + labels: Optional[List[str]] = Field(default=None, description="Optional list of labels to look for (e.g. for object detection).") + threshold: Optional[float] = Field(default=None, description="Confidence threshold for detection or classification.") + return_boxes: bool = Field(default=False, description="Whether to return bounding box coordinates for detected objects.") # ===================================================== @@ -207,12 +207,12 @@ class VisionRequest(APIPodSchemaBase): # ===================================================== class MultimodalEmbeddingRequest(APIPodSchemaBase): - model: str + model: str = Field(description="ID of the model to use for generating multimodal embeddings.") - input: Optional[Union[str, List[str]]] = None - image: Optional[ImageFile] = None - audio: Optional[AudioFile] = None - user: Optional[str] = None + input: Optional[Union[str, List[str]]] = Field(default=None, description="The input text to embed.") + image: Optional[ImageFile] = Field(default=None, description="The input image to embed.") + audio: Optional[AudioFile] = Field(default=None, description="The input audio to embed.") + user: Optional[str] = Field(default=None, description="A unique identifier representing your end-user.") # Supported request schemas that should be interpreted as JSON bodies @@ -235,9 +235,9 @@ class MultimodalEmbeddingRequest(APIPodSchemaBase): # ===================================================== class Usage(APIPodSchemaBase): - prompt_tokens: int - completion_tokens: Optional[int] = None - total_tokens: int + prompt_tokens: int = Field(description="Number of tokens in the prompt.") + completion_tokens: Optional[int] = Field(default=None, description="Number of tokens in the generated completion.") + total_tokens: int = Field(description="Total number of tokens used in the request (prompt + completion).") # ===================================================== @@ -245,23 +245,23 @@ class Usage(APIPodSchemaBase): # ===================================================== class ChatCompletionMessage(APIPodSchemaBase): - role: Literal["assistant"] - content: str + role: Literal["assistant"] = Field(description="The role of the message author, always 'assistant'.") + content: str = Field(description="The content of the message.") class ChatCompletionChoice(APIPodSchemaBase): - index: int - message: ChatCompletionMessage - finish_reason: Literal["stop", "length", "content_filter"] + index: int = Field(description="The index of the choice in the list of choices.") + message: ChatCompletionMessage = Field(description="A chat completion message generated by the model.") + finish_reason: Literal["stop", "length", "content_filter"] = Field(description="The reason the model stopped generating tokens.") class ChatCompletionResponse(APIPodSchemaBase): - id: str - object: Literal["chat.completion"] - created: int - model: str - choices: List[ChatCompletionChoice] - usage: Usage + id: str = Field(description="Unique identifier for the chat completion.") + object: Literal["chat.completion"] = Field(description="The object type, always 'chat.completion'.") + created: int = Field(description="The Unix timestamp when the chat completion was created.") + model: str = Field(description="The model used for the chat completion.") + choices: List[ChatCompletionChoice] = Field(description="A list of chat completion choices.") + usage: Usage = Field(description="Usage statistics for the completion request.") # ===================================================== @@ -306,19 +306,19 @@ class EmbeddingResponse(APIPodSchemaBase): # ===================================================== class ImageGenerationData(APIPodSchemaBase): - url: Optional[str] = None - b64_json: Optional[str] = None - revised_prompt: Optional[str] = None - seed: Optional[int] = None + url: Optional[str] = Field(default=None, description="The URL of the generated image.") + b64_json: Optional[str] = Field(default=None, description="The base64-encoded JSON of the generated image.") + revised_prompt: Optional[str] = Field(default=None, description="The prompt as revised by the model, if applicable.") + seed: Optional[int] = Field(default=None, description="The seed used for generation.") class ImageGenerationResponse(APIPodSchemaBase): - id: str - object: Literal["image_generation"] - created: int - model: str - data: List[ImageGenerationData] - usage: Optional[Usage] = None + id: str = Field(description="Unique identifier for the generation request.") + object: Literal["image_generation"] = Field(description="The object type, always 'image_generation'.") + created: int = Field(description="The Unix timestamp when the generation was created.") + model: str = Field(description="The model used for generation.") + data: List[ImageGenerationData] = Field(description="The generated image data.") + usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") # ===================================================== @@ -326,18 +326,18 @@ class ImageGenerationResponse(APIPodSchemaBase): # ===================================================== class VideoGenerationData(APIPodSchemaBase): - url: Optional[str] = None - duration_s: Optional[float] = None - seed: Optional[int] = None + url: Optional[str] = Field(default=None, description="The URL of the generated video.") + duration_s: Optional[float] = Field(default=None, description="The duration of the generated video in seconds.") + seed: Optional[int] = Field(default=None, description="The seed used for generation.") class VideoGenerationResponse(APIPodSchemaBase): - id: str - object: Literal["video_generation"] - created: int - model: str - data: List[VideoGenerationData] - usage: Optional[Usage] = None + id: str = Field(description="Unique identifier for the generation request.") + object: Literal["video_generation"] = Field(description="The object type, always 'video_generation'.") + created: int = Field(description="The Unix timestamp when the generation was created.") + model: str = Field(description="The model used for generation.") + data: List[VideoGenerationData] = Field(description="The generated video data.") + usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") # ===================================================== @@ -345,19 +345,19 @@ class VideoGenerationResponse(APIPodSchemaBase): # ===================================================== class AudioData(APIPodSchemaBase): - audio: Optional[str] = None - text: Optional[str] = None - language: Optional[str] = None - duration_s: Optional[float] = None + audio: Optional[str] = Field(default=None, description="The URL or base64 data of the generated audio.") + text: Optional[str] = Field(default=None, description="The transcribed text, if applicable.") + language: Optional[str] = Field(default=None, description="The detected language, if applicable.") + duration_s: Optional[float] = Field(default=None, description="The duration of the audio in seconds.") class AudioResponse(APIPodSchemaBase): - id: str - object: Literal["audio"] - created: int - model: str - data: List[AudioData] - usage: Optional[Usage] = None + id: str = Field(description="Unique identifier for the request.") + object: Literal["audio"] = Field(description="The object type, always 'audio'.") + created: int = Field(description="The Unix timestamp when the response was created.") + model: str = Field(description="The model used for the task.") + data: List[AudioData] = Field(description="The resulting audio data.") + usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") # ===================================================== @@ -365,18 +365,18 @@ class AudioResponse(APIPodSchemaBase): # ===================================================== class Generation3DData(APIPodSchemaBase): - url: Optional[str] = None - output_format: Optional[str] = None - seed: Optional[int] = None + url: Optional[str] = Field(default=None, description="The URL of the generated 3D asset.") + output_format: Optional[str] = Field(default=None, description="The format of the generated 3D asset.") + seed: Optional[int] = Field(default=None, description="The seed used for generation.") class Generation3DResponse(APIPodSchemaBase): - id: str - object: Literal["generation_3d"] - created: int - model: str - data: List[Generation3DData] - usage: Optional[Usage] = None + id: str = Field(description="Unique identifier for the request.") + object: Literal["generation_3d"] = Field(description="The object type, always 'generation_3d'.") + created: int = Field(description="The Unix timestamp when the response was created.") + model: str = Field(description="The model used for generation.") + data: List[Generation3DData] = Field(description="The generated 3D data.") + usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") # ===================================================== @@ -384,23 +384,23 @@ class Generation3DResponse(APIPodSchemaBase): # ===================================================== class VisionLabel(APIPodSchemaBase): - label: str - score: float - box: Optional[List[float]] = None + label: str = Field(description="The label of the detected object or classification.") + score: float = Field(description="The confidence score of the detection or classification.") + box: Optional[List[float]] = Field(default=None, description="The bounding box coordinates [ymin, xmin, ymax, xmax], if applicable.") class VisionData(APIPodSchemaBase): - labels: List[VisionLabel] = [] - text: Optional[str] = None + labels: List[VisionLabel] = Field(default_factory=list, description="A list of detected labels and scores.") + text: Optional[str] = Field(default=None, description="The extracted text from OCR, if applicable.") class VisionResponse(APIPodSchemaBase): - id: str - object: Literal["vision"] - created: int - model: str - data: List[VisionData] - usage: Optional[Usage] = None + id: str = Field(description="Unique identifier for the request.") + object: Literal["vision"] = Field(description="The object type, always 'vision'.") + created: int = Field(description="The Unix timestamp when the response was created.") + model: str = Field(description="The model used for the vision task.") + data: List[VisionData] = Field(description="The resulting vision data.") + usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") # ===================================================== @@ -408,17 +408,17 @@ class VisionResponse(APIPodSchemaBase): # ===================================================== class MultimodalEmbeddingData(APIPodSchemaBase): - object: Literal["embedding"] = "embedding" - embedding: List[float] - index: int - modality: Optional[Literal["text", "image", "audio"]] = None + object: Literal["embedding"] = Field(default="embedding", description="The object type, always 'embedding'.") + embedding: List[float] = Field(description="The embedding vector.") + index: int = Field(description="The index of the embedding in the list of inputs.") + modality: Optional[Literal["text", "image", "audio"]] = Field(default=None, description="The modality of the input that generated this embedding.") class MultimodalEmbeddingResponse(APIPodSchemaBase): - object: Literal["list"] - data: List[MultimodalEmbeddingData] - model: str - usage: Optional[Usage] = None + object: Literal["list"] = Field(description="The object type, always 'list'.") + data: List[MultimodalEmbeddingData] = Field(description="The list of embedding data objects.") + model: str = Field(description="The model used for generating embeddings.") + usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") # ====================================================== diff --git a/apipod/engine/llm/__init__.py b/apipod/engine/schema_extension/__init__.py similarity index 100% rename from apipod/engine/llm/__init__.py rename to apipod/engine/schema_extension/__init__.py diff --git a/apipod/engine/llm/base_llm_mixin.py b/apipod/engine/schema_extension/schema_mixin.py similarity index 99% rename from apipod/engine/llm/base_llm_mixin.py rename to apipod/engine/schema_extension/schema_mixin.py index e27cd63..ae3c1f3 100644 --- a/apipod/engine/llm/base_llm_mixin.py +++ b/apipod/engine/schema_extension/schema_mixin.py @@ -16,7 +16,7 @@ ) -class _BaseLLMMixin: +class _SchemaExtMixin: """ Mixin class for Base LLM functionality """ From e1961e0de4dd1ce3f3610bed94befb873fbb8626 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Sun, 14 Jun 2026 11:26:27 +0200 Subject: [PATCH 09/38] Implemented standardized pydantic schema support. I refactored the decoraters to support media-toolkit file parsing in nested pydantic models. In schema endpoints the result is also wrapped into the corresponding response format if the user lazy returns just for example an AudioFile. --- README.md | 53 ++- apipod/common/schemas/__init__.py | 36 ++ apipod/common/schemas/media_files.py | 87 ++++ apipod/common/{ => schemas}/schemas.py | 303 +++++++------ .../backend/fastapi/file_handling_mixin.py | 3 +- apipod/engine/backend/fastapi/llm_mixin.py | 29 -- apipod/engine/backend/fastapi/router.py | 257 +++++------ apipod/engine/backend/runpod/llm_mixin.py | 20 - apipod/engine/backend/runpod/router.py | 100 ++--- apipod/engine/backend/schema_resolve.py | 235 +++++++++++ apipod/engine/endpoint_config.py | 22 +- apipod/engine/files/base_file_mixin.py | 121 +++++- apipod/engine/jobs/job_result.py | 61 +-- apipod/engine/schema_extension/__init__.py | 0 .../engine/schema_extension/schema_mixin.py | 166 -------- apipod/engine/signatures/policies.py | 35 +- docs/README_TECH.md | 132 +++++- examples/test_service_six_schemas.py | 38 +- test/llm/test_llm_mock.py | 14 +- test/llm/test_six_schemas.py | 399 ------------------ 20 files changed, 980 insertions(+), 1131 deletions(-) create mode 100644 apipod/common/schemas/__init__.py create mode 100644 apipod/common/schemas/media_files.py rename apipod/common/{ => schemas}/schemas.py (52%) delete mode 100644 apipod/engine/backend/fastapi/llm_mixin.py delete mode 100644 apipod/engine/backend/runpod/llm_mixin.py create mode 100644 apipod/engine/backend/schema_resolve.py delete mode 100644 apipod/engine/schema_extension/__init__.py delete mode 100644 apipod/engine/schema_extension/schema_mixin.py delete mode 100644 test/llm/test_six_schemas.py diff --git a/README.md b/README.md index 360aba9..6d2b1f4 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,52 @@ def transcribe(audio: AudioFile): return {"transcription": "..."} ``` +### 🤖 Standardized AI schemas (OpenAI-compatible) + +APIPod ships request/response schemas for the common AI payloads: chat, completions, embeddings, image/video/3D generation, vision, transcription, text-to-speech and voice cloning. Annotate one parameter with a request schema and APIPod handles validation, media parsing, response wrapping and streaming. The wire format mirrors the OpenAI API, so OpenAI-compatible clients work out of the box. `model` is optional everywhere — your service usually *is* the model. + +**Chat** — return a plain string (or a dict / full response object) and get a complete `chat.completion` envelope. Return a generator and `"stream": true` requests receive server-sent events: + +```python +from apipod import APIPod +from apipod.common.schemas import ChatCompletionRequest + +app = APIPod() + +@app.endpoint("/chat") +def chat(request: ChatCompletionRequest): + answer = my_llm.generate(request.messages, temperature=request.temperature) + return answer # auto-wrapped into a ChatCompletionResponse +``` + +**Text-to-speech** — return an `AudioFile`; clients get a JSON envelope with the audio as base64, or raw audio chunks when they send `"stream": true`: + +```python +from apipod import AudioFile +from apipod.common.schemas import SpeechRequest + +@app.endpoint("/audio/speech") +def speak(request: SpeechRequest): + # request.voice is a named voice (str) or an already-parsed AudioFile for cloning + samples, rate = my_tts.synthesize(request.input, voice=request.voice) + return AudioFile().from_np_array(samples, sample_rate=rate, audio_format="wav") +``` + +**Image generation** — media fields inside schemas (e.g. `request.image` for img2img) arrive as parsed media-toolkit objects, no matter if the client sent an upload, URL or base64: + +```python +from apipod import ImageFile +from apipod.common.schemas import ImageGenerationRequest + +@app.endpoint("/images/generations") +def generate(request: ImageGenerationRequest): + init_image = request.image.to_np_array() if request.image else None # ImageFile, ready to use + result = my_model.generate(request.prompt, image=init_image, seed=request.seed) + return ImageFile().from_np_array(result) # auto-wrapped into ImageGenerationResponse +``` + +Need extra parameters? Subclass a schema (`class MyRequest(SpeechRequest): style: str = "calm"`) — detection and wrapping keep working. + ### ☁️ Serverless Routing When deploying to serverless platforms like **RunPod**, standard web frameworks often fail because they lack the necessary routing logic for the platform's specific entry points. **APIPod** detects the environment and handles the routing automatically—no separate "handler" function required. @@ -184,9 +230,9 @@ The configuration is controlled through a combination of: | ---------------- | ------------ | ----------- | --------------------------------- | | `socaity` | `dedicated` | `auto` | FastAPI | | `socaity` | `dedicated` | `localhost` | FastAPI + job queue *(test mode)* | -| `socaity` | `dedicated` | `runpod` | Celery backend *(planned)* | -| `socaity` | `dedicated` | `scaleway` | Celery backend *(planned)* | -| `socaity` | `dedicated` | `azure` | Celery backend *(planned)* | +| `socaity` | `dedicated` | `runpod` | FastAPI + load balancer *(Coming soon)* | +| `socaity` | `dedicated` | `scaleway` | FastAPI *(Coming soon)* | +| `socaity` | `dedicated` | `azure` | FastAPI *(Coming soon)* | | `socaity` | `serverless` | `auto` | RunPod router backend | | `socaity` | `serverless` | `localhost` | FastAPI + job queue *(test mode)* | | `socaity` | `serverless` | `runpod` | RunPod router backend | @@ -299,7 +345,6 @@ result = task.get_result() ## Roadmap - MCP protocol support. -- OpenAI-compatible default endpoints for LLMs - Improve async support. --- diff --git a/apipod/common/schemas/__init__.py b/apipod/common/schemas/__init__.py new file mode 100644 index 0000000..f33bc08 --- /dev/null +++ b/apipod/common/schemas/__init__.py @@ -0,0 +1,36 @@ +from .schemas import ( + APIPodSchemaBase, Usage, + ChatMessage, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionChoice, ChatCompletionMessage, + CompletionRequest, CompletionResponse, CompletionChoice, + EmbeddingRequest, EmbeddingResponse, EmbeddingData, + ImageGenerationRequest, ImageGenerationResponse, + VideoGenerationRequest, VideoGenerationResponse, + TranscriptionRequest, TranscriptionResponse, TranscriptionSegment, TranscriptionWord, + SpeechRequest, SpeechResponse, + CreateVoiceRequest, VoiceResponse, + VoiceConversionRequest, VoiceConversionResponse, + Generation3DRequest, Generation3DResponse, + VisionRequest, VisionResponse, VisionData, VisionLabel, + MultimodalEmbeddingRequest, MultimodalEmbeddingResponse, MultimodalEmbeddingData, + ChatDelta, ChatStreamChoice, ChatCompletionChunk, +) + +from .media_files import FileModel, ImageFileModel, AudioFileModel, VideoFileModel, ThreeDFileModel + +__all__ = [ + "APIPodSchemaBase", "Usage", + "ChatMessage", "ChatCompletionRequest", "ChatCompletionResponse", "ChatCompletionChoice", "ChatCompletionMessage", + "CompletionRequest", "CompletionResponse", "CompletionChoice", + "EmbeddingRequest", "EmbeddingResponse", "EmbeddingData", + "ImageGenerationRequest", "ImageGenerationResponse", + "VideoGenerationRequest", "VideoGenerationResponse", + "TranscriptionRequest", "TranscriptionResponse", "TranscriptionSegment", "TranscriptionWord", + "SpeechRequest", "SpeechResponse", + "CreateVoiceRequest", "VoiceResponse", + "VoiceConversionRequest", "VoiceConversionResponse", + "Generation3DRequest", "Generation3DResponse", + "VisionRequest", "VisionResponse", "VisionData", "VisionLabel", + "MultimodalEmbeddingRequest", "MultimodalEmbeddingResponse", "MultimodalEmbeddingData", + "ChatDelta", "ChatStreamChoice", "ChatCompletionChunk", + "FileModel", "ImageFileModel", "AudioFileModel", "VideoFileModel", "ThreeDFileModel", +] diff --git a/apipod/common/schemas/media_files.py b/apipod/common/schemas/media_files.py new file mode 100644 index 0000000..b7e64dd --- /dev/null +++ b/apipod/common/schemas/media_files.py @@ -0,0 +1,87 @@ +from pydantic import BaseModel, AnyUrl, model_validator +from typing import Union, Optional + + +class FileModel(BaseModel): + """ + Wire-format mirror of a media-toolkit file: name, content type and the + content itself as base64 or URL. Plain strings (URL / base64) and + media-toolkit file objects are coerced automatically so the model can be + used directly as a field type in request and response schemas. + """ + + file_name: str + content_type: str + content: Union[str, bytes, AnyUrl] # base64 encoded or url + max_size_mb: Optional[float] = 4000 + + @model_validator(mode="before") + @classmethod + def _coerce_input(cls, value): + if isinstance(value, (str, bytes)): + return {"file_name": "file", "content_type": "application/octet-stream", "content": value} + if isinstance(value, FileModel): + # Re-validate a (sibling/parent) FileModel against the concrete field type. + return value if isinstance(value, cls) else value.model_dump() + if not isinstance(value, (dict, BaseModel)) and hasattr(value, "to_json"): + # media-toolkit files serialize to {file_name, content_type, content}. + return value.to_json() + return value + + class Config: + json_schema_extra = { + "x-media-type": "MediaFile", + "example": { + "file_name": "example.csv", + "content_type": "text/csv", + "content": "https://example.com/example.csv", + } + } + + +class ImageFileModel(FileModel): + class Config: + json_schema_extra = { + "x-media-type": "ImageFile", + "example": { + "file_name": "example.png", + "content_type": "image/png", + "content": "base64 encoded image data", + } + } + + +class AudioFileModel(FileModel): + class Config: + json_schema_extra = { + "x-media-type": "AudioFile", + "example": { + "file_name": "example.mp3", + "content_type": "audio/mpeg", + "content": "base64 encoded audio data", + } + } + + +class VideoFileModel(FileModel): + class Config: + json_schema_extra = { + "x-media-type": "VideoFile", + "example": { + "file_name": "example.mp4", + "content_type": "video/mp4", + "content": "base64 encoded video data", + } + } + + +class ThreeDFileModel(FileModel): + class Config: + json_schema_extra = { + "x-media-type": "3DFile", + "example": { + "file_name": "example.glb", + "content_type": "model/gltf-binary", + "content": "base64 encoded 3D model data", + } + } diff --git a/apipod/common/schemas.py b/apipod/common/schemas/schemas.py similarity index 52% rename from apipod/common/schemas.py rename to apipod/common/schemas/schemas.py index a25417d..bd9704d 100644 --- a/apipod/common/schemas.py +++ b/apipod/common/schemas/schemas.py @@ -8,26 +8,15 @@ models. Any provider (Flux, Stable Diffusion, ElevenLabs, Whisper, Suno, DeepSeek, etc.) plugs into the same schemas and the routing layer dispatches to whatever runs behind it. -""" - -from types import UnionType -from typing import Any, List, Literal, Optional, Union, get_args, get_origin -from pydantic import BaseModel, Field, model_validator -from media_toolkit import AudioFile, ImageFile, MediaFile, VideoFile, media_from_any - -_MEDIA_FIELD_TYPES = (ImageFile, AudioFile, VideoFile, MediaFile) +`model` is optional on every request: an APIPod service typically serves +exactly one model, so forcing clients to repeat its name adds nothing. +""" +from typing import Any, List, Literal, Optional, Union +from pydantic import BaseModel, Field -def _media_field_type(annotation: Any) -> Optional[type]: - """Media class if annotation is media-typed (bare, Optional, or Union), else None.""" - if annotation in _MEDIA_FIELD_TYPES: - return annotation - if get_origin(annotation) in (Union, UnionType): - for arg in get_args(annotation): - if arg in _MEDIA_FIELD_TYPES: - return arg - return None +from .media_files import FileModel, ImageFileModel, AudioFileModel, VideoFileModel, ThreeDFileModel # ===================================================== @@ -42,55 +31,34 @@ class APIPodSchemaBase(BaseModel): out of the box, but the schemas are provider-agnostic: anything that matches the shape (Flux, SD, ElevenLabs, Whisper, in-house models...) is a valid backend. + + Media fields are declared with the FileModel variants (ImageFileModel, + AudioFileModel, ...) which accept uploads, FileModel JSON objects, URLs + and base64 strings. At runtime the file-handling layer replaces them + with parsed media-toolkit objects before the endpoint function runs. """ model_config = { "extra": "forbid", "validate_assignment": True, "populate_by_name": True, - # ImageFile / AudioFile / VideoFile / MediaFile are non-BaseModel types - # used as field annotations; the pre-validator below converts URL / - # base64 strings into instances before per-field validation. - "arbitrary_types_allowed": True, + "arbitrary_types_allowed": True } - @model_validator(mode="before") - @classmethod - def _convert_media_strings(cls, data: Any) -> Any: - """URL / data URI through media_from_any, bare base64 through from_base64.""" - if not isinstance(data, dict): - return data - for field_name, field_info in cls.model_fields.items(): - if field_name not in data: - continue - value = data[field_name] - if not isinstance(value, str): - continue - media_type = _media_field_type(field_info.annotation) - if media_type is None: - continue - data[field_name] = media_from_any( - data=value, - type_hint=media_type, - use_temp_file=True, - temp_dir=None, - allow_reads_from_disk=False, - ) - return data - # ===================================================== # Chat Completions - Input schemas # ===================================================== + class ChatMessage(APIPodSchemaBase): role: Literal["system", "user", "assistant"] = Field(description="The role of the message author (system, user, or assistant).") content: str = Field(description="The content of the message.") class ChatCompletionRequest(APIPodSchemaBase): - model: str = Field(description="ID of the model to use for this request.") messages: List[ChatMessage] = Field(description="A list of messages comprising the conversation history.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") temperature: float = Field(default=0.7, description="Sampling temperature between 0.0 and 2.0. Higher values make output more random.") max_tokens: Optional[int] = Field(default=None, description="The maximum number of tokens to generate in the completion.") @@ -108,8 +76,8 @@ class ChatCompletionRequest(APIPodSchemaBase): # ===================================================== class CompletionRequest(APIPodSchemaBase): - model: str = Field(description="ID of the model to use for this request.") prompt: Union[str, List[str]] = Field(description="The prompt(s) to generate completions for.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") temperature: float = Field(default=0.7, description="Sampling temperature between 0.0 and 2.0.") max_tokens: int = Field(default=16, description="The maximum number of tokens to generate.") @@ -124,8 +92,8 @@ class CompletionRequest(APIPodSchemaBase): # ===================================================== class EmbeddingRequest(APIPodSchemaBase): - model: str = Field(description="ID of the model to use for generating embeddings.") input: Union[str, List[str]] = Field(description="The input text to embed.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") user: Optional[str] = Field(default=None, description="A unique identifier representing your end-user.") @@ -134,12 +102,12 @@ class EmbeddingRequest(APIPodSchemaBase): # ===================================================== class ImageGenerationRequest(APIPodSchemaBase): - model: str = Field(description="ID of the model to use for image generation.") prompt: str = Field(description="A text description of the desired image(s).") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") negative_prompt: Optional[str] = Field(default=None, description="A text description of what to exclude from the generated image.") - image: Optional[ImageFile] = Field(default=None, description="An optional reference image for image-to-image or inpainting tasks.") - mask: Optional[ImageFile] = Field(default=None, description="An optional mask image for inpainting, where white pixels indicate areas to edit.") + image: Optional[ImageFileModel] = Field(default=None, description="An optional reference image for image-to-image or inpainting tasks.") + mask: Optional[ImageFileModel] = Field(default=None, description="An optional mask image for inpainting, where white pixels indicate areas to edit.") size: Optional[str] = Field(default=None, description="The size of the generated images, e.g. 1024x1024.") num_images: int = Field(default=1, description="The number of images to generate.") seed: Optional[int] = Field(default=None, description="Random seed for reproducible generation.") @@ -151,29 +119,61 @@ class ImageGenerationRequest(APIPodSchemaBase): # ===================================================== class VideoGenerationRequest(APIPodSchemaBase): - model: str = Field(description="ID of the model to use for video generation.") prompt: str = Field(description="A text description of the desired video.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - image: Optional[ImageFile] = Field(default=None, description="An optional reference image (frame0) to start the video from.") + image: Optional[ImageFileModel] = Field(default=None, description="An optional reference image (frame0) to start the video from.") duration_s: float = Field(default=5.0, description="The desired duration of the video in seconds.") fps: int = Field(default=24, description="Frames per second for the generated video.") aspect_ratio: Optional[str] = Field(default=None, description="The aspect ratio of the generated video, e.g. 16:9.") seed: Optional[int] = Field(default=None, description="Random seed for reproducible generation.") + stream: bool = Field(default=False, description="If set, the generated video is streamed back as raw bytes instead of a JSON response.") # ===================================================== -# Audio - Input schemas (TTS, STT, music) +# Audio - Input schemas (transcription, speech, voices) # ===================================================== -class AudioRequest(APIPodSchemaBase): - model: str = Field(description="ID of the model to use for audio tasks (TTS, STT, or music).") +class TranscriptionRequest(APIPodSchemaBase): + """Speech-to-text. Mirrors OpenAI POST /audio/transcriptions ('file' is called 'audio' here).""" + + audio: AudioFileModel = Field(description="The audio file to transcribe. Accepts uploads, FileModel objects, URLs or base64.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: only specify if you serve multiple models.") + + language: Optional[str] = Field(default=None, description="The language of the input audio in ISO-639-1 format (e.g. 'en'). Improves accuracy and latency.") + prompt: Optional[str] = Field(default=None, description="Optional text to guide the model's style or to continue a previous audio segment.") + response_format: Literal["json", "verbose_json"] = Field(default="json", description="Format of the transcript output.") + timestamp_granularities: Optional[List[Literal["word", "segment"]]] = Field(default=None, description="Timestamp detail to include; requires response_format='verbose_json'.") + stream: bool = Field(default=False, description="If set, partial transcript deltas will be sent as server-sent events.") + + +class SpeechRequest(APIPodSchemaBase): + """Text-to-speech. Mirrors OpenAI POST /audio/speech.""" + + input: str = Field(description="The text to generate audio for.") + voice: Optional[Union[str, AudioFileModel]] = Field(default=None, description="A named voice of the service OR a reference audio / voice embedding file for voice cloning.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") + + instructions: Optional[str] = Field(default=None, description="Additional instructions to control voice, emotion or style.") + response_format: Literal["mp3", "wav", "opus", "flac", "pcm"] = Field(default="mp3", description="The desired output audio format.") + speed: float = Field(default=1.0, description="Playback speed of the generated audio (0.25 to 4.0).") + stream: bool = Field(default=False, description="If set, the generated audio is streamed back as raw audio chunks instead of a JSON response.") - text: Optional[str] = Field(default=None, description="The input text for text-to-speech or music generation.") - audio: Optional[AudioFile] = Field(default=None, description="The input audio file for speech-to-text tasks.") - voice: Optional[str] = Field(default=None, description="The voice ID or style to use for audio generation.") - language: Optional[str] = Field(default=None, description="The language of the input audio (for STT) or target language (for TTS).") - format: Optional[str] = Field(default=None, description="The desired output audio format, e.g. mp3, wav, flac.") - duration_s: Optional[float] = Field(default=None, description="The desired duration of the generated audio in seconds.") + +class CreateVoiceRequest(APIPodSchemaBase): + """Voice cloning: create a reusable voice (embedding) from an audio sample. Mirrors OpenAI POST /audio/voices.""" + + name: str = Field(description="A name for the new voice.") + audio_sample: AudioFileModel = Field(description="A clean speech sample (~5-20s) of the voice to clone.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") + + +class VoiceConversionRequest(APIPodSchemaBase): + """Voice-to-voice: re-render existing audio with another voice (named, sample or embedding).""" + + audio: AudioFileModel = Field(description="The audio whose content should be kept.") + voice: Union[str, AudioFileModel] = Field(description="The target voice: a named voice of the service OR a reference audio / voice embedding file.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") # ===================================================== @@ -181,10 +181,10 @@ class AudioRequest(APIPodSchemaBase): # ===================================================== class Generation3DRequest(APIPodSchemaBase): - model: str = Field(description="ID of the model to use for 3D generation.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") prompt: Optional[str] = Field(default=None, description="A text description of the 3D object to generate.") - image: Optional[ImageFile] = Field(default=None, description="An optional reference image to generate the 3D object from.") + image: Optional[ImageFileModel] = Field(default=None, description="An optional reference image to generate the 3D object from.") output_format: str = Field(default="glb", description="The desired 3D output format (glb, obj, fbx, etc.).") seed: Optional[int] = Field(default=None, description="Random seed for reproducible generation.") @@ -194,8 +194,8 @@ class Generation3DRequest(APIPodSchemaBase): # ===================================================== class VisionRequest(APIPodSchemaBase): - model: str = Field(description="ID of the model to use for vision tasks (OCR, detection, etc.).") - image: ImageFile = Field(description="The image to process for vision tasks.") + image: ImageFileModel = Field(description="The image to process for vision tasks.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") labels: Optional[List[str]] = Field(default=None, description="Optional list of labels to look for (e.g. for object detection).") threshold: Optional[float] = Field(default=None, description="Confidence threshold for detection or classification.") @@ -207,29 +207,14 @@ class VisionRequest(APIPodSchemaBase): # ===================================================== class MultimodalEmbeddingRequest(APIPodSchemaBase): - model: str = Field(description="ID of the model to use for generating multimodal embeddings.") + model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") input: Optional[Union[str, List[str]]] = Field(default=None, description="The input text to embed.") - image: Optional[ImageFile] = Field(default=None, description="The input image to embed.") - audio: Optional[AudioFile] = Field(default=None, description="The input audio to embed.") + image: Optional[ImageFileModel] = Field(default=None, description="The input image to embed.") + audio: Optional[AudioFileModel] = Field(default=None, description="The input audio to embed.") user: Optional[str] = Field(default=None, description="A unique identifier representing your end-user.") -# Supported request schemas that should be interpreted as JSON bodies -# by router decorators, even when endpoint authors do not specify Body(...). -SUPPORTED_LLM_REQUEST_SCHEMAS = ( - ChatCompletionRequest, - CompletionRequest, - EmbeddingRequest, - ImageGenerationRequest, - VideoGenerationRequest, - AudioRequest, - Generation3DRequest, - VisionRequest, - MultimodalEmbeddingRequest, -) - - # ===================================================== # Shared output schemas # ===================================================== @@ -245,7 +230,7 @@ class Usage(APIPodSchemaBase): # ===================================================== class ChatCompletionMessage(APIPodSchemaBase): - role: Literal["assistant"] = Field(description="The role of the message author, always 'assistant'.") + role: Literal["assistant"] = Field(default="assistant", description="The role of the message author, always 'assistant'.") content: str = Field(description="The content of the message.") @@ -256,12 +241,11 @@ class ChatCompletionChoice(APIPodSchemaBase): class ChatCompletionResponse(APIPodSchemaBase): - id: str = Field(description="Unique identifier for the chat completion.") - object: Literal["chat.completion"] = Field(description="The object type, always 'chat.completion'.") + object: Literal["chat.completion"] = Field(default="chat.completion", description="The object type, always 'chat.completion'.") created: int = Field(description="The Unix timestamp when the chat completion was created.") - model: str = Field(description="The model used for the chat completion.") + model: Optional[str] = Field(default=None, description="The model used for the chat completion.") choices: List[ChatCompletionChoice] = Field(description="A list of chat completion choices.") - usage: Usage = Field(description="Usage statistics for the completion request.") + usage: Optional[Usage] = Field(default=None, description="Usage statistics for the completion request.") # ===================================================== @@ -269,19 +253,18 @@ class ChatCompletionResponse(APIPodSchemaBase): # ===================================================== class CompletionChoice(APIPodSchemaBase): - text: str - index: int + text: str = Field(description="The generated completion text.") + index: int = Field(description="The index of the choice in the list of choices.") logprobs: None = None - finish_reason: Literal["stop", "length", "content_filter"] + finish_reason: Literal["stop", "length", "content_filter"] = Field(description="The reason the model stopped generating tokens.") class CompletionResponse(APIPodSchemaBase): - id: str - object: Literal["text_completion"] - created: int - model: str - choices: List[CompletionChoice] - usage: Usage + object: Literal["text_completion"] = Field(default="text_completion", description="The object type, always 'text_completion'.") + created: int = Field(description="The Unix timestamp when the completion was created.") + model: Optional[str] = Field(default=None, description="The model used for the completion.") + choices: List[CompletionChoice] = Field(description="A list of completion choices.") + usage: Optional[Usage] = Field(default=None, description="Usage statistics for the completion request.") # ===================================================== @@ -289,35 +272,27 @@ class CompletionResponse(APIPodSchemaBase): # ===================================================== class EmbeddingData(APIPodSchemaBase): - object: Literal["embedding"] - embedding: List[float] - index: int + object: Literal["embedding"] = Field(default="embedding", description="The object type, always 'embedding'.") + embedding: List[float] = Field(description="The embedding vector.") + index: int = Field(description="The index of the embedding in the list of inputs.") class EmbeddingResponse(APIPodSchemaBase): - object: Literal["list"] - data: List[EmbeddingData] - model: str - usage: Usage + object: Literal["list"] = Field(default="list", description="The object type, always 'list'.") + data: List[EmbeddingData] = Field(description="The list of embedding data objects.") + model: Optional[str] = Field(default=None, description="The model used for generating embeddings.") + usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") # ===================================================== # Image Generation - Output schemas # ===================================================== -class ImageGenerationData(APIPodSchemaBase): - url: Optional[str] = Field(default=None, description="The URL of the generated image.") - b64_json: Optional[str] = Field(default=None, description="The base64-encoded JSON of the generated image.") - revised_prompt: Optional[str] = Field(default=None, description="The prompt as revised by the model, if applicable.") - seed: Optional[int] = Field(default=None, description="The seed used for generation.") - - class ImageGenerationResponse(APIPodSchemaBase): - id: str = Field(description="Unique identifier for the generation request.") - object: Literal["image_generation"] = Field(description="The object type, always 'image_generation'.") + object: Literal["image_generation"] = Field(default="image_generation", description="The object type, always 'image_generation'.") created: int = Field(description="The Unix timestamp when the generation was created.") - model: str = Field(description="The model used for generation.") - data: List[ImageGenerationData] = Field(description="The generated image data.") + model: Optional[str] = Field(default=None, description="The model used for generation.") + data: List[ImageFileModel] = Field(description="The generated image data.") usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") @@ -325,57 +300,76 @@ class ImageGenerationResponse(APIPodSchemaBase): # Video Generation - Output schemas # ===================================================== -class VideoGenerationData(APIPodSchemaBase): - url: Optional[str] = Field(default=None, description="The URL of the generated video.") - duration_s: Optional[float] = Field(default=None, description="The duration of the generated video in seconds.") - seed: Optional[int] = Field(default=None, description="The seed used for generation.") - - class VideoGenerationResponse(APIPodSchemaBase): - id: str = Field(description="Unique identifier for the generation request.") - object: Literal["video_generation"] = Field(description="The object type, always 'video_generation'.") + object: Literal["video_generation"] = Field(default="video_generation", description="The object type, always 'video_generation'.") created: int = Field(description="The Unix timestamp when the generation was created.") - model: str = Field(description="The model used for generation.") - data: List[VideoGenerationData] = Field(description="The generated video data.") + model: Optional[str] = Field(default=None, description="The model used for generation.") + data: List[VideoFileModel] = Field(description="The generated video data.") usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") # ===================================================== -# Audio - Output schemas +# Audio - Output schemas (transcription, speech, voices) # ===================================================== -class AudioData(APIPodSchemaBase): - audio: Optional[str] = Field(default=None, description="The URL or base64 data of the generated audio.") - text: Optional[str] = Field(default=None, description="The transcribed text, if applicable.") - language: Optional[str] = Field(default=None, description="The detected language, if applicable.") - duration_s: Optional[float] = Field(default=None, description="The duration of the audio in seconds.") +class TranscriptionWord(APIPodSchemaBase): + word: str = Field(description="The transcribed word.") + start: float = Field(description="Start time of the word in seconds.") + end: float = Field(description="End time of the word in seconds.") + + +class TranscriptionSegment(APIPodSchemaBase): + id: int = Field(default=0, description="Index of the segment.") + start: float = Field(description="Start time of the segment in seconds.") + end: float = Field(description="End time of the segment in seconds.") + text: str = Field(description="The transcribed text of the segment.") + + +class TranscriptionResponse(APIPodSchemaBase): + """Mirrors the OpenAI transcription object: plain `text` plus optional verbose details.""" + text: str = Field(description="The transcribed text.") + language: Optional[str] = Field(default=None, description="The detected or requested language of the audio.") + duration: Optional[float] = Field(default=None, description="Duration of the input audio in seconds.") + segments: Optional[List[TranscriptionSegment]] = Field(default=None, description="Segment-level details (verbose_json).") + words: Optional[List[TranscriptionWord]] = Field(default=None, description="Word-level timestamps (verbose_json).") + usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") -class AudioResponse(APIPodSchemaBase): - id: str = Field(description="Unique identifier for the request.") - object: Literal["audio"] = Field(description="The object type, always 'audio'.") +class AudioEnvelopeBase(APIPodSchemaBase): + """Shared envelope for endpoints that return audio files (speech synthesis, voice conversion).""" created: int = Field(description="The Unix timestamp when the response was created.") - model: str = Field(description="The model used for the task.") - data: List[AudioData] = Field(description="The resulting audio data.") + model: Optional[str] = Field(default=None, description="The model used for the task.") + data: List[AudioFileModel] = Field(description="The resulting audio file(s).") usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") +class SpeechResponse(AudioEnvelopeBase): + object: Literal["audio.speech"] = Field(default="audio.speech", description="The object type, always 'audio.speech'.") + + +class VoiceConversionResponse(AudioEnvelopeBase): + object: Literal["audio.conversion"] = Field(default="audio.conversion", description="The object type, always 'audio.conversion'.") + + +class VoiceResponse(APIPodSchemaBase): + """A created (cloned) voice, optionally carrying its embedding file (e.g. a SpeechCraft .npz).""" + id: str = Field(description="Unique identifier of the voice.") + object: Literal["audio.voice"] = Field(default="audio.voice", description="The object type, always 'audio.voice'.") + name: str = Field(description="The name of the voice.") + created: int = Field(description="The Unix timestamp when the voice was created.") + model: Optional[str] = Field(default=None, description="The model used to create the voice.") + embedding: Optional[FileModel] = Field(default=None, description="The voice embedding file, if the service exposes it for reuse.") + + # ===================================================== # 3D Generation - Output schemas # ===================================================== -class Generation3DData(APIPodSchemaBase): - url: Optional[str] = Field(default=None, description="The URL of the generated 3D asset.") - output_format: Optional[str] = Field(default=None, description="The format of the generated 3D asset.") - seed: Optional[int] = Field(default=None, description="The seed used for generation.") - - class Generation3DResponse(APIPodSchemaBase): - id: str = Field(description="Unique identifier for the request.") - object: Literal["generation_3d"] = Field(description="The object type, always 'generation_3d'.") + object: Literal["generation_3d"] = Field(default="generation_3d", description="The object type, always 'generation_3d'.") created: int = Field(description="The Unix timestamp when the response was created.") - model: str = Field(description="The model used for generation.") - data: List[Generation3DData] = Field(description="The generated 3D data.") + model: Optional[str] = Field(default=None, description="The model used for generation.") + data: List[ThreeDFileModel] = Field(description="The generated 3D data.") usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") @@ -395,10 +389,9 @@ class VisionData(APIPodSchemaBase): class VisionResponse(APIPodSchemaBase): - id: str = Field(description="Unique identifier for the request.") - object: Literal["vision"] = Field(description="The object type, always 'vision'.") + object: Literal["vision"] = Field(default="vision", description="The object type, always 'vision'.") created: int = Field(description="The Unix timestamp when the response was created.") - model: str = Field(description="The model used for the vision task.") + model: Optional[str] = Field(default=None, description="The model used for the vision task.") data: List[VisionData] = Field(description="The resulting vision data.") usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") @@ -415,9 +408,9 @@ class MultimodalEmbeddingData(APIPodSchemaBase): class MultimodalEmbeddingResponse(APIPodSchemaBase): - object: Literal["list"] = Field(description="The object type, always 'list'.") + object: Literal["list"] = Field(default="list", description="The object type, always 'list'.") data: List[MultimodalEmbeddingData] = Field(description="The list of embedding data objects.") - model: str = Field(description="The model used for generating embeddings.") + model: Optional[str] = Field(default=None, description="The model used for generating embeddings.") usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") @@ -427,14 +420,16 @@ class MultimodalEmbeddingResponse(APIPodSchemaBase): class ChatDelta(BaseModel): content: Optional[str] = None + class ChatStreamChoice(BaseModel): index: int delta: ChatDelta finish_reason: Optional[str] = None + class ChatCompletionChunk(BaseModel): id: str object: Literal["chat.completion.chunk"] = "chat.completion.chunk" created: int - model: str - choices: List[ChatStreamChoice] \ No newline at end of file + model: Optional[str] = None + choices: List[ChatStreamChoice] diff --git a/apipod/engine/backend/fastapi/file_handling_mixin.py b/apipod/engine/backend/fastapi/file_handling_mixin.py index fb74aba..f782cab 100644 --- a/apipod/engine/backend/fastapi/file_handling_mixin.py +++ b/apipod/engine/backend/fastapi/file_handling_mixin.py @@ -3,9 +3,10 @@ from typing import Any, Union, get_args, get_origin, Callable, List, Dict from apipod.engine.backend.fastapi.LimitedUploadFile import LimitedUploadFile from apipod.engine.signatures.upload import is_param_media_toolkit_file -from apipod.engine.jobs.job_result import FileModel, ImageFileModel, AudioFileModel, VideoFileModel +from apipod.common.schemas.media_files import FileModel, ImageFileModel, AudioFileModel, VideoFileModel from apipod.engine.signatures.policies import FastAPISignaturePolicies from apipod.engine.files.base_file_mixin import _BaseFileHandlingMixin +from apipod.engine.endpoint_config import EndpointExecutionPlan from apipod.engine.utils import replace_func_signature from media_toolkit import MediaList, MediaDict, ImageFile, AudioFile, VideoFile, MediaFile import functools diff --git a/apipod/engine/backend/fastapi/llm_mixin.py b/apipod/engine/backend/fastapi/llm_mixin.py deleted file mode 100644 index 41bb5e3..0000000 --- a/apipod/engine/backend/fastapi/llm_mixin.py +++ /dev/null @@ -1,29 +0,0 @@ -from fastapi.responses import StreamingResponse - -from apipod.engine.llm.base_llm_mixin import _BaseLLMMixin - - -class _FastApiLlmMixin(_BaseLLMMixin): - """ - LLM execution logic for the FastAPI provider backend. - """ - - async def handle_llm_request(self, func, openai_req, should_use_queue, res_model, endpoint_type, **kwargs): - should_stream = getattr(openai_req, "stream", False) and endpoint_type != "embedding" - - if should_stream: - result = await self._execute_func(func, payload=openai_req, **kwargs) - return StreamingResponse(self._stream_generator(result), media_type="text/event-stream") - - if should_use_queue: - from apipod.engine.jobs.job_result import JobResultFactory - - job = self.job_queue.add_job( - job_function=func, - job_params={"payload": openai_req.dict()} - ) - ret_job = JobResultFactory.from_base_job(job) - return ret_job - - raw_res = await self._execute_func(func, payload=openai_req, **kwargs) - return self._wrap_llm_response(raw_res, res_model, endpoint_type, openai_req) diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index 0c43256..5a5745a 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -3,7 +3,8 @@ import threading import logging from contextlib import asynccontextmanager -from typing import Union, Callable, get_type_hints, Generator, AsyncGenerator, Iterator, AsyncIterator +from collections.abc import AsyncIterator, Iterator +from typing import Any, Union, Callable, get_origin, get_type_hints from fastapi import APIRouter, FastAPI, Request, Response, status from fastapi.exceptions import HTTPException from fastapi.responses import JSONResponse, StreamingResponse @@ -17,10 +18,16 @@ from apipod.engine.backend.fastapi.file_handling_mixin import _fast_api_file_handling_mixin from apipod.engine.utils import normalize_name from apipod.engine.backend.fastapi.exception_handling import _FastAPIExceptionHandler -from apipod.engine.backend.fastapi.llm_mixin import _FastApiLlmMixin +from apipod.engine.backend.schema_resolve import ( + SchemaBinding, + SSE_STREAM_TAGS, + iter_media_chunks, + wrap_schema_response, +) +from media_toolkit import AudioFile, VideoFile -class SocaityFastAPIRouter(APIRouter, _BaseBackend, _QueueMixin, _fast_api_file_handling_mixin, _FastAPIExceptionHandler, _FastApiLlmMixin): +class SocaityFastAPIRouter(APIRouter, _BaseBackend, _QueueMixin, _fast_api_file_handling_mixin, _FastAPIExceptionHandler): """ FastAPI router extension that adds support for task endpoints. @@ -69,7 +76,6 @@ def __init__( _BaseBackend.__init__(self, title=title, summary=summary, *args, **kwargs) _QueueMixin.__init__(self, job_queue=job_queue, *args, **kwargs) _fast_api_file_handling_mixin.__init__(self, max_upload_file_size_mb=max_upload_file_size_mb, *args, **kwargs) - _FastApiLlmMixin.__init__(self) self.status = SERVER_HEALTH.INITIALIZING @@ -296,12 +302,11 @@ async def _event_generator(): }, ) - def endpoint(self, path: str, methods: list[str] | None = None, max_upload_file_size_mb: int = None, queue_size: int = 500, use_queue: bool = None, *args, **kwargs): """ Unified endpoint decorator. - If LLM configuration is detected on the function, it creates an LLM endpoint. + If a parameter is annotated with a standardized request schema, it creates a schema endpoint. If job_queue is configured (and use_queue is not False), it creates a task endpoint. Otherwise, it creates a standard FastAPI endpoint. @@ -328,33 +333,12 @@ def decorator(func: Callable) -> Callable: route_kwargs=kwargs ) - if plan.is_llm: - return self._register_llm_endpoint(func, plan) if plan.is_streaming: - return self._create_streaming_endpoint_decorator( - path=plan.path, - methods=plan.methods, - max_upload_file_size_mb=plan.max_upload_file_size_mb, - args=plan.route_args, - kwargs=plan.route_kwargs - )(func) + return self._create_streaming_endpoint_decorator(plan)(func) if plan.should_use_queue: - return self._create_task_endpoint_decorator( - path=plan.path, - methods=plan.methods, - max_upload_file_size_mb=plan.max_upload_file_size_mb, - queue_size=plan.queue_size, - args=plan.route_args, - kwargs=plan.route_kwargs - )(func) - - return self._create_standard_endpoint_decorator( - path=plan.path, - methods=plan.methods, - max_upload_file_size_mb=plan.max_upload_file_size_mb, - args=plan.route_args, - kwargs=plan.route_kwargs - )(func) + return self._create_task_endpoint_decorator(plan)(func) + + return self._create_standard_endpoint_decorator(plan)(func) return decorator @@ -381,62 +365,6 @@ def _create_endpoint_plan( route_args=route_args, route_kwargs=route_kwargs, ) - - def _register_llm_endpoint(self, func: Callable, plan: EndpointExecutionPlan) -> Callable: - """Register a FastAPI LLM endpoint from an endpoint execution plan.""" - req_model = plan.request_model - res_model = plan.response_model - endpoint_type = plan.endpoint_type - - if req_model is None or res_model is None or endpoint_type is None: - raise ValueError("Invalid LLM endpoint plan: missing request/response metadata") - - if plan.should_use_queue: - try: - self._job_func_registry[func.__name__] = func - except Exception: - pass - - @functools.wraps(func) - async def _unified_worker(*w_args, **w_kwargs): - payload = next( - (v for v in w_kwargs.values() if isinstance(v, (dict, req_model))), - next((a for a in w_args if isinstance(a, (dict, req_model))), None) - ) - - if payload is None: - raise ValueError(f"Request does not match expected model {req_model}") - - clean_kwargs = {k: v for k, v in w_kwargs.items() if not isinstance(v, req_model)} - openai_req = self._prepare_llm_payload(req_model=req_model, payload=payload) - - return await self.handle_llm_request( - func=func, - openai_req=openai_req, - should_use_queue=plan.should_use_queue, - res_model=res_model, - endpoint_type=endpoint_type, - **clean_kwargs - ) - - final_handler = self._prepare_func_for_media_file_upload_with_fastapi( - _unified_worker, - plan.max_upload_file_size_mb - ) - - route_kwargs = dict(plan.route_kwargs) - if plan.should_use_queue: - route_kwargs["response_model_exclude_none"] = True - - self.api_route( - path=plan.path, - methods=plan.active_methods, - response_model=JobResult if plan.should_use_queue else res_model, - *plan.route_args, - **route_kwargs - )(final_handler) - - return final_handler async def _execute_func(self, func, **kwargs): """ @@ -445,7 +373,7 @@ async def _execute_func(self, func, **kwargs): Args: func: Function to execute **kwargs: Arguments to pass to function - + Returns: Result of function execution """ @@ -460,15 +388,15 @@ async def _execute_func(self, func, **kwargs): async def _stream_generator(self, result): """ Convert a sync or async generator into an async generator for StreamingResponse. - + Args: result: Generator (sync or async) that yields streaming chunks - + Yields: Streaming chunks as strings or bytes """ import asyncio - + if inspect.isasyncgen(result): # Async generator - yield directly async for chunk in result: @@ -507,62 +435,88 @@ def _determine_queue_usage(self, use_queue: bool = None, path: str = None) -> bo return use_queue return self.job_queue is not None - - def _determine_generator_fun(self, func: Callable) -> bool: + + def _is_streaming_endpoint(self, func: Callable) -> bool: """ - Determine whether the function is streaming data. - Uses quick, robust checks for common streaming patterns. + Determine whether the function streams its output: it is a (async) + generator function, or its return annotation declares an iterator. """ - # 1. Direct generator functions - if inspect.isgeneratorfunction(func) or inspect.isasyncgenfunction(func): + target = inspect.unwrap(func) + if inspect.isgeneratorfunction(target) or inspect.isasyncgenfunction(target): return True - # 2. Check return type hints try: - hints = get_type_hints(func) - return_type = hints.get('return') + return_type = get_type_hints(target).get('return') + except Exception: + return False - if return_type is not None: - origin = getattr(return_type, '__origin__', return_type) - streaming_types = (Generator, AsyncGenerator, Iterator, AsyncIterator) + if return_type is None: + return False - if origin in streaming_types or return_type in streaming_types: - return True - except Exception: - pass + origin = get_origin(return_type) or return_type + return inspect.isclass(origin) and issubclass(origin, (Iterator, AsyncIterator)) - # 3. Check source code for yield keyword - try: - source = inspect.getsource(func) - if 'yield' in source: - return True - except Exception: - pass + def _as_streaming_response(self, result: Any, binding: SchemaBinding) -> StreamingResponse | None: + """ + Build a :class:`StreamingResponse` if the endpoint result is streamable: + - ``AudioFile`` / ``VideoFile`` stream their encoded bytes as raw chunks + with the proper media content type (OpenAI ``stream_format="audio"``); + - generators stream as-is: SSE for token-delta endpoints, raw bytes else. + Returns ``None`` when the result cannot be streamed. + """ + if isinstance(result, (AudioFile, VideoFile)): + media_type = getattr(result, "content_type", None) or "application/octet-stream" + return StreamingResponse(iter_media_chunks(result), media_type=media_type) + + if inspect.isgenerator(result) or inspect.isasyncgen(result): + media_type = "text/event-stream" if binding.tag in SSE_STREAM_TAGS else "application/octet-stream" + return StreamingResponse( + self._stream_generator(result), + media_type=media_type, + headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}, + ) - return False + return None - def _create_task_endpoint_decorator(self, path: str, methods: list[str] | None, max_upload_file_size_mb: int, queue_size: int, args, kwargs): + # ------------------------------------------------------------------ + # Endpoint decorators (task / standard / streaming) + # ------------------------------------------------------------------ + def _modify_result_decorator(self, func: Callable, plan: EndpointExecutionPlan) -> Callable: + """ + Wraps responses of schema endpoints to their given Response format. + Serializes media-files to and other objects to JSON + """ + @functools.wraps(func) + def sync_wrapper(*args, **kwargs): + result = func(*args, **kwargs) + if plan.schema_binding is not None: + result = wrap_schema_response(result, plan.schema_binding) + return JobResultFactory._serialize_result(result) + return sync_wrapper + + def _create_task_endpoint_decorator(self, plan: EndpointExecutionPlan): """Create a decorator for task endpoints (background job execution).""" # FastAPI route decorator (returning JobResult) - task_kwargs = dict(kwargs) + task_kwargs = dict(plan.route_kwargs) task_kwargs["response_model_exclude_none"] = True fastapi_route_decorator = self.api_route( - path=path, - methods=["POST"] if methods is None else methods, + path=plan.path, + methods=plan.active_methods, response_model=JobResult, - *args, + *plan.route_args, **task_kwargs ) # Queue decorator queue_decorator = super().job_queue_func( - path=path, - queue_size=queue_size, - *args, - **kwargs + path=plan.path, + queue_size=plan.queue_size, + *plan.route_args, + **plan.route_kwargs ) def decorator(func: Callable) -> Callable: + func = self._modify_result_decorator(func, plan) # Add job queue functionality and prepare for FastAPI file handling queue_decorated = queue_decorator(func) # Register the function so workers can execute it (dev mode). @@ -570,47 +524,38 @@ def decorator(func: Callable) -> Callable: self._job_func_registry[func.__name__] = func except Exception: pass - upload_enabled = self._prepare_func_for_media_file_upload_with_fastapi(queue_decorated, max_upload_file_size_mb) + + upload_enabled = self._prepare_func_for_media_file_upload_with_fastapi(queue_decorated, plan.max_upload_file_size_mb) return fastapi_route_decorator(upload_enabled) return decorator - def _create_standard_endpoint_decorator(self, path: str, methods: list[str] | None, max_upload_file_size_mb: int, args, kwargs): - """Create a decorator for standard endpoints (direct execution).""" - # FastAPI route decorator + def _create_standard_endpoint_decorator(self, plan: EndpointExecutionPlan): + """Create a decorator for standard and schema endpoints (direct execution).""" fastapi_route_decorator = self.api_route( - path=path, - methods=["POST"] if methods is None else methods, - *args, - **kwargs + path=plan.path, + methods=plan.active_methods, + response_model=plan.schema_binding.response_model if plan.is_schema_endpoint else None, + *plan.route_args, + **plan.route_kwargs ) - def file_result_modification_decorator(func: Callable) -> Callable: - """Wrap endpoint result and serialize it.""" - @functools.wraps(func) - def sync_wrapper(*args, **kwargs): - result = func(*args, **kwargs) - return JobResultFactory._serialize_result(result) - return sync_wrapper - def decorator(func: Callable) -> Callable: - result_modified = file_result_modification_decorator(func) - with_file_upload_signature = self._prepare_func_for_media_file_upload_with_fastapi(result_modified, max_upload_file_size_mb) + result_modified = self._modify_result_decorator(func, plan) + with_file_upload_signature = self._prepare_func_for_media_file_upload_with_fastapi(result_modified, plan.max_upload_file_size_mb) return fastapi_route_decorator(with_file_upload_signature) return decorator - def _create_streaming_endpoint_decorator(self, path: str, methods: list[str] | None, max_upload_file_size_mb: int, args, kwargs): + def _create_streaming_endpoint_decorator(self, plan: EndpointExecutionPlan): """Create a decorator for streaming endpoints.""" - from fastapi.responses import StreamingResponse - - # Extract custom headers if provided + kwargs = dict(plan.route_kwargs) custom_headers = kwargs.pop('response_headers', None) fastapi_route_decorator = self.api_route( - path=path, - methods=["POST"] if methods is None else methods, - *args, + path=plan.path, + methods=plan.active_methods, + *plan.route_args, **kwargs ) @@ -620,21 +565,13 @@ async def streaming_wrapper(*w_args, **w_kwargs): result = await self._execute_func(func, *w_args, **w_kwargs) generator = self._stream_generator(result) - # Merge default and custom headers - headers = { - "Cache-Control": "no-cache", - "X-Accel-Buffering": "no" - } + headers = {"Cache-Control": "no-cache", "X-Accel-Buffering": "no"} if custom_headers: headers.update(custom_headers) - return StreamingResponse( - generator, - media_type="text/event-stream", - headers=headers - ) + return StreamingResponse(generator, media_type="text/event-stream", headers=headers) - with_file_upload_signature = self._prepare_func_for_media_file_upload_with_fastapi(streaming_wrapper, max_upload_file_size_mb) + with_file_upload_signature = self._prepare_func_for_media_file_upload_with_fastapi(streaming_wrapper, plan.max_upload_file_size_mb) return fastapi_route_decorator(with_file_upload_signature) return decorator diff --git a/apipod/engine/backend/runpod/llm_mixin.py b/apipod/engine/backend/runpod/llm_mixin.py deleted file mode 100644 index 225b8b9..0000000 --- a/apipod/engine/backend/runpod/llm_mixin.py +++ /dev/null @@ -1,20 +0,0 @@ -from apipod.engine.llm.base_llm_mixin import _BaseLLMMixin - - -class _RunPodLLMMixin(_BaseLLMMixin): - """ - LLM logic specific to the RunPod Router - """ - - def handle_llm_request(self, func, openai_req, req_model, res_model, endpoint_type, w_args, w_kwargs): - if isinstance(openai_req, dict): - openai_req = req_model.model_validate(openai_req) - w_kwargs["payload"] = openai_req - - should_stream = getattr(openai_req, "stream", False) and endpoint_type != "embedding" - - if should_stream: - return self._yield_native_stream(func, w_args, w_kwargs) - - raw_res = self._execute_sync_or_async(func, w_args, w_kwargs) - return self._wrap_llm_response(raw_res, res_model, endpoint_type, openai_req) diff --git a/apipod/engine/backend/runpod/router.py b/apipod/engine/backend/runpod/router.py index f48e806..6ed2b37 100644 --- a/apipod/engine/backend/runpod/router.py +++ b/apipod/engine/backend/runpod/router.py @@ -1,4 +1,5 @@ import asyncio +import base64 import functools import inspect import traceback @@ -11,20 +12,23 @@ from apipod.engine.jobs.job_result import JobResultFactory, JobResult from apipod.engine.base_backend import _BaseBackend from apipod.engine.files.base_file_mixin import _BaseFileHandlingMixin -from apipod.engine.backend.runpod.llm_mixin import _RunPodLLMMixin +from apipod.engine.backend.schema_resolve import ( + iter_media_chunks, + wrap_schema_response, +) from apipod.engine.utils import normalize_name from apipod.common.settings import APIPOD_PROVIDER, APIPOD_PORT, DEFAULT_DATE_TIME_FORMAT +from media_toolkit import AudioFile, VideoFile -class SocaityRunpodRouter(_BaseBackend, _BaseFileHandlingMixin, _RunPodLLMMixin): +class SocaityRunpodRouter(_BaseBackend, _BaseFileHandlingMixin): """ Adds routing functionality for the runpod serverless framework. Provides enhanced file handling and conversion capabilities. """ def __init__(self, title: str = "APIPod for ", summary: str = None, *args, **kwargs): super().__init__(title=title, summary=summary, *args, **kwargs) - _RunPodLLMMixin.__init__(self) self.routes = {} # routes are organized like {"ROUTE_NAME": "ROUTE_FUNCTION"} @@ -37,36 +41,25 @@ def endpoint(self, path: str = None, use_queue: bool = None, *args, **kwargs): path = normalize_name(path, preserve_paths=True).strip("/") def decorator(func: Callable) -> Callable: - # 1. Auto-Detection - req_model, res_model, endpoint_type = self._get_llm_config(func) + # binding = get_schema_binding(func) @functools.wraps(func) def wrapper(*w_args, **w_kwargs): self.status = constants.SERVER_HEALTH.BUSY - try: - if req_model: - payload = w_kwargs.get("payload", None) - - openai_req = self._prepare_llm_payload( - req_model=req_model, - payload=payload - ) - - w_kwargs["payload"] = openai_req - - return self.handle_llm_request( - func=func, - openai_req=openai_req, - req_model=req_model, - res_model=res_model, - endpoint_type=endpoint_type, - w_args=w_args, - w_kwargs=w_kwargs - ) - - # Default execution for standard endpoints - return self._execute_sync_or_async(func, w_args, w_kwargs) + # if binding is None: + # return self._execute_sync_or_async(func, w_args, w_kwargs) + + # request = prepare_schema_call(binding, w_kwargs) + result = self._execute_sync_or_async(func, w_args, w_kwargs) + + if getattr(request, "stream", False): + if isinstance(result, (AudioFile, VideoFile)): + return self._yield_native_stream(iter_media_chunks(result)) + if inspect.isgenerator(result) or inspect.isasyncgen(result): + return self._yield_native_stream(result) + + return wrap_schema_response(result, binding) finally: self.status = constants.SERVER_HEALTH.RUNNING @@ -74,45 +67,34 @@ def wrapper(*w_args, **w_kwargs): return wrapper return decorator - def _yield_native_stream(self, func, args, kwargs): - """Bridge for RunPod native generator streaming.""" + @staticmethod + def _encode_stream_chunk(chunk) -> str: + """RunPod transports everything as JSON: binary chunks are base64-encoded.""" + if isinstance(chunk, bytes): + return base64.b64encode(chunk).decode("ascii") + return chunk if isinstance(chunk, str) else str(chunk) + + def _yield_native_stream(self, result): + """Bridge a stream result (sync/async generator or StreamingResponse) into RunPod's native stream.""" from starlette.responses import StreamingResponse - - # Execute the function - result = self._execute_sync_or_async(func, args, kwargs) - + # If it's a StreamingResponse (shouldn't happen in RunPod, but handle it) if isinstance(result, StreamingResponse): - body_iterator = result.body_iterator - - if inspect.isasyncgen(body_iterator): - while True: - try: - chunk = self._run_in_loop(body_iterator.__anext__()) - yield chunk if isinstance(chunk, (str, bytes)) else str(chunk) - except StopAsyncIteration: - break - else: - for chunk in body_iterator: - yield chunk if isinstance(chunk, (str, bytes)) else str(chunk) - return - - # Handle async generators + result = result.body_iterator + if inspect.isasyncgen(result): while True: try: - chunk = self._run_in_loop(result.__anext__()) - yield chunk if isinstance(chunk, (str, bytes)) else str(chunk) + yield self._encode_stream_chunk(self._run_in_loop(result.__anext__())) except StopAsyncIteration: break return - - # Handle sync generators - if inspect.isgenerator(result): + + if inspect.isgenerator(result) or hasattr(result, "__iter__"): for chunk in result: - yield chunk if isinstance(chunk, (str, bytes)) else str(chunk) + yield self._encode_stream_chunk(chunk) return - + # Not a generator - shouldn't happen for streaming raise TypeError(f"Expected generator for streaming, got {type(result)}") @@ -229,18 +211,18 @@ def _router(self, path, job, **kwargs): def _execute_route_function(self, route_function, kwargs): """ Execute a route function, handling both sync and async functions. - + Args: route_function: The function to execute kwargs: Keyword arguments to pass to the function - + Returns: The result of the function execution """ if not inspect.iscoroutinefunction(route_function): # Synchronous function - simple execution return route_function(**kwargs) - + # Async function - need event loop handling try: loop = asyncio.get_event_loop() diff --git a/apipod/engine/backend/schema_resolve.py b/apipod/engine/backend/schema_resolve.py new file mode 100644 index 0000000..12a6d4b --- /dev/null +++ b/apipod/engine/backend/schema_resolve.py @@ -0,0 +1,235 @@ +""" +Registry and backend-neutral helpers for standardized (OpenAI-compatible) schemas. + +``SCHEMA_REGISTRY`` is the single source of truth: it maps every supported +request schema to how it is served (response model + semantic tag). Everything +else derives from it: + +- :func:`resolve_request_model` / :func:`get_schema_binding` detect schema + endpoints by annotation (used by routers and signature policies), +- module-level helpers prepare the incoming request (validation + nested-media + parsing) and wrap raw endpoint results into response models. + +Schemas are a stable part of APIPod, not an optional extension. Routers keep the +normal decorator pipeline; schema helpers are called from the existing standard, +task and streaming decorators where needed. + +Note: response ``id`` fields are intentionally NOT populated here — identifiers +belong to the ``JobResult`` envelope produced by the platform, not to the model +schemas themselves. +""" + +import inspect +from dataclasses import dataclass +from datetime import datetime, timezone +from types import UnionType +from typing import Any, Callable, Iterator, Optional, Type, Union, get_args, get_origin + +from media_toolkit import MediaFile + +from apipod.common.schemas import * +from apipod.engine.files.base_file_mixin import parse_schema_media_fields + + +@dataclass(frozen=True) +class SchemaEndpointSpec: + """How a registered request schema is served.""" + response_model: Type + tag: str + + +# Single source of truth for all standardized schemas. Adding a schema here +# automatically enables endpoint detection, body-parameter policies and +# response wrapping everywhere. +SCHEMA_REGISTRY: dict[Type, SchemaEndpointSpec] = { + ChatCompletionRequest: SchemaEndpointSpec(ChatCompletionResponse, "chat"), + CompletionRequest: SchemaEndpointSpec(CompletionResponse, "completion"), + EmbeddingRequest: SchemaEndpointSpec(EmbeddingResponse, "embedding"), + ImageGenerationRequest: SchemaEndpointSpec(ImageGenerationResponse, "image_generation"), + VideoGenerationRequest: SchemaEndpointSpec(VideoGenerationResponse, "video_generation"), + TranscriptionRequest: SchemaEndpointSpec(TranscriptionResponse, "transcription"), + SpeechRequest: SchemaEndpointSpec(SpeechResponse, "speech"), + CreateVoiceRequest: SchemaEndpointSpec(VoiceResponse, "voice"), + VoiceConversionRequest: SchemaEndpointSpec(VoiceConversionResponse, "voice_conversion"), + Generation3DRequest: SchemaEndpointSpec(Generation3DResponse, "generation_3d"), + VisionRequest: SchemaEndpointSpec(VisionResponse, "vision"), + MultimodalEmbeddingRequest: SchemaEndpointSpec(MultimodalEmbeddingResponse, "embedding_multimodal"), +} + +# Tags whose streams are token deltas (served as server-sent events). Media +# tags stream raw encoded bytes instead, matching OpenAI's stream_format="audio". +SSE_STREAM_TAGS = {"chat", "completion", "transcription"} + + +@dataclass(frozen=True) +class SchemaBinding: + """Resolved binding between an endpoint function parameter and a registered schema.""" + param_name: str + request_model: Type + response_model: Type + tag: str + + +def _registry_spec(request_model: Type) -> Optional[SchemaEndpointSpec]: + """Find the registry spec for a request model, honoring subclasses of registered schemas.""" + if not inspect.isclass(request_model): + return None + for cls in request_model.__mro__: + if cls in SCHEMA_REGISTRY: + return SCHEMA_REGISTRY[cls] + return None + + +def resolve_request_model(annotation: Any) -> Optional[Type]: + """ + Resolve an annotation to a registered request schema (or a subclass of one). + Supports direct annotations and Optional/Union annotations. + """ + candidates = [annotation] + if get_origin(annotation) in (Union, UnionType): + candidates = [arg for arg in get_args(annotation) if arg is not type(None)] + + for candidate in candidates: + if _registry_spec(candidate) is not None: + return candidate + return None + + +def get_schema_binding(func: Callable) -> Optional[SchemaBinding]: + """ + Detect the schema-typed parameter of an endpoint function by annotation — the + parameter may have any name, mirroring how ``JobProgress`` is detected. + + Returns ``None`` for plain (non-schema) functions. When a schema parameter is + found, the rest of the signature is validated: a schema endpoint must take the + request schema as its only user input (``job_progress`` and framework + dependencies aside), so that the whole request lives in the schema body. + """ + for param in inspect.signature(func).parameters.values(): + request_model = resolve_request_model(param.annotation) + if request_model is None: + continue + + spec = _registry_spec(request_model) + binding = SchemaBinding( + param_name=param.name, + request_model=request_model, + response_model=spec.response_model, + tag=spec.tag, + ) + _validate_schema_endpoint_signature(func, binding) + return binding + return None + + +def _is_injected_param(param: inspect.Parameter) -> bool: + """True for parameters the framework supplies (job progress, self/cls).""" + return ( + param.name in ("self", "cls", "job_progress") + or "JobProgress" in str(param.annotation) + ) + + +def _validate_schema_endpoint_signature(func: Callable, binding: SchemaBinding) -> None: + """Reject schema endpoints that declare user parameters besides the request schema.""" + extra = [ + param.name + for param in inspect.signature(func).parameters.values() + if param.name != binding.param_name and not _is_injected_param(param) + ] + if extra: + raise TypeError( + f"Schema endpoint '{func.__name__}' must take the request schema " + f"'{binding.request_model.__name__}' as its only parameter, but also declares " + f"{extra}. Move these inputs into the schema (or a subclass of it)." + ) + + +def prepare_schema_call(binding: SchemaBinding, call_kwargs: dict): + """ + Replace the raw request body in call kwargs with a validated schema object + and return that object. + """ + payload = call_kwargs.get(binding.param_name) + if payload is None: + raise ValueError( + f"Request body for parameter '{binding.param_name}' " + f"({binding.request_model.__name__}) is missing" + ) + + # Prepare the request object + if isinstance(payload, binding.request_model): + request = payload + elif isinstance(payload, dict): + request = binding.request_model.model_validate(payload) + else: + raise ValueError(f"Invalid payload for {binding.request_model.__name__}: {type(payload).__name__}") + request = parse_schema_media_fields(request) + + call_kwargs[binding.param_name] = request + return request + + +def wrap_schema_response(result: Any, binding: SchemaBinding) -> Any: + """ + Wrap a raw endpoint result into the response model of the binding. + + Response models share a uniform envelope (``created``, ``model``) where + applicable. Raw results (strings, vectors, media files, dicts) are normalized + into the target response model. + """ + response_model = binding.response_model + if isinstance(result, response_model): + return result + + payload = _normalize_response_model(result, response_model) + payload = _apply_envelope(payload, response_model) + return response_model.model_validate(payload) + + +def _normalize_response_model(result: Any, response_model: Type) -> dict: + """ + Normalize raw endpoint results into a dictionary matching the response model. + Handles convenient raw shapes for chat, completion, embedding and transcription. + """ + if response_model is ChatCompletionResponse and isinstance(result, str): + result = {"choices": [{"index": 0, "message": {"content": result}, "finish_reason": "stop"}]} + elif response_model is CompletionResponse and isinstance(result, str): + result = {"choices": [{"text": result, "index": 0, "finish_reason": "stop"}]} + elif response_model is EmbeddingResponse and isinstance(result, list): + vectors = result if result and isinstance(result[0], (list, tuple)) else [result] + result = {"data": [{"embedding": list(vector), "index": i} for i, vector in enumerate(vectors)]} + elif response_model is TranscriptionResponse and isinstance(result, str): + result = {"text": result} + + return _normalize_result(result, response_model) + + +def _normalize_result(result: Any, response_model: Type) -> dict: + """Bring raw results into dict form; media files are lifted into the `data` list.""" + if isinstance(result, MediaFile): + return {"data": [result]} + if isinstance(result, (list, tuple)) and result and all(isinstance(item, MediaFile) for item in result): + return {"data": list(result)} + if isinstance(result, dict): + return dict(result) + raise ValueError( + f"Cannot wrap a result of type {type(result).__name__} into {response_model.__name__}. " + f"Return a {response_model.__name__}, a dict matching its fields, or a media-toolkit file." + ) + + +def _apply_envelope(payload: dict, response_model: Type) -> dict: + """Fill the shared response envelope (``created`` timestamp, request ``model``) when applicable.""" + fields = response_model.model_fields + if "created" in fields and payload.get("created") is None: + payload["created"] = int(datetime.now(timezone.utc).timestamp()) + + return payload + + +def iter_media_chunks(media_file: MediaFile, chunk_size: int = 64 * 1024) -> Iterator[bytes]: + """Yield the encoded bytes of a media file in chunks (for raw media streaming).""" + buffer = media_file.to_bytes_io() + while chunk := buffer.read(chunk_size): + yield chunk diff --git a/apipod/engine/endpoint_config.py b/apipod/engine/endpoint_config.py index 4f198ae..225a626 100644 --- a/apipod/engine/endpoint_config.py +++ b/apipod/engine/endpoint_config.py @@ -1,6 +1,8 @@ from dataclasses import dataclass from typing import Any, Callable +from apipod.engine.backend.schema_resolve import SchemaBinding, get_schema_binding + @dataclass(frozen=True) class EndpointExecutionPlan: @@ -18,14 +20,12 @@ class EndpointExecutionPlan: queue_size: int route_args: tuple[Any, ...] route_kwargs: dict[str, Any] - request_model: type | None = None - response_model: type | None = None - endpoint_type: str | None = None + schema_binding: SchemaBinding | None = None is_streaming: bool = False @property - def is_llm(self) -> bool: - return self.request_model is not None + def is_schema_endpoint(self) -> bool: + return self.schema_binding is not None @property def active_methods(self) -> list[str]: @@ -36,8 +36,8 @@ class FastApiEndpointConfigurator: """ Builds endpoint execution plans for the FastAPI backend. - This component configures endpoint behavior (LLM, streaming, queue) - independent from provider mechanics (FastAPI routing). + This component configures endpoint behavior (schema dispatch, streaming, + queue) independent from provider mechanics (FastAPI routing). """ def __init__(self, router): @@ -55,8 +55,8 @@ def build_plan( route_args: tuple[Any, ...], route_kwargs: dict[str, Any], ) -> EndpointExecutionPlan: - request_model, response_model, endpoint_type = self._router._get_llm_config(func) - is_streaming = bool(request_model is None and self._router._determine_generator_fun(func)) + schema_binding = get_schema_binding(func) + is_streaming = bool(schema_binding is None and self._router._is_streaming_endpoint(func)) return EndpointExecutionPlan( path=path, @@ -66,8 +66,6 @@ def build_plan( queue_size=queue_size, route_args=route_args, route_kwargs=route_kwargs, - request_model=request_model, - response_model=response_model, - endpoint_type=endpoint_type, + schema_binding=schema_binding, is_streaming=is_streaming, ) diff --git a/apipod/engine/files/base_file_mixin.py b/apipod/engine/files/base_file_mixin.py index eeaf24f..3e0cae0 100644 --- a/apipod/engine/files/base_file_mixin.py +++ b/apipod/engine/files/base_file_mixin.py @@ -1,14 +1,67 @@ import functools import inspect from types import UnionType -from typing import Any, Union, get_args, get_origin, Callable, List, Type +from typing import Any, Optional, Union, get_args, get_origin, Callable, List, Type -from media_toolkit import media_from_any, MediaFile, MediaList, MediaDict +from pydantic import BaseModel + +from media_toolkit import media_from_any, MediaFile, MediaList, MediaDict, ImageFile, AudioFile, VideoFile from apipod.engine.signatures.upload import is_param_media_toolkit_file -from apipod.engine.jobs.job_result import FileModel +from apipod.common.schemas.media_files import FileModel, ImageFileModel, AudioFileModel, VideoFileModel from apipod.common.exceptions import FileUploadException +# Wire-format pydantic file models mapped to the media-toolkit type they parse into. +_FILE_MODEL_MEDIA_TYPES: dict = { + ImageFileModel: ImageFile, + AudioFileModel: AudioFile, + VideoFileModel: VideoFile, + FileModel: MediaFile, +} + + +def _media_type_for_file_model(file_model_cls: Type) -> Type: + """Resolve the media-toolkit type a FileModel subclass should be parsed into.""" + for cls in file_model_cls.__mro__: + if cls in _FILE_MODEL_MEDIA_TYPES: + return _FILE_MODEL_MEDIA_TYPES[cls] + return MediaFile + + +def _parse_file_model_value(value: Any) -> Any: + """Convert FileModel instances (also inside lists) into parsed media-toolkit objects.""" + if isinstance(value, FileModel): + return media_from_any( + data=value.model_dump(include={"file_name", "content_type", "content"}), + type_hint=_media_type_for_file_model(type(value)), + use_temp_file=True, + temp_dir=None, + allow_reads_from_disk=False, + ) + if isinstance(value, list): + return [_parse_file_model_value(item) for item in value] + return value + + +def parse_schema_media_fields(schema_obj): + """ + Replace FileModel-typed fields of a validated request schema with parsed + media-toolkit objects, so endpoint functions receive ready-to-use media — + exactly as method-level ``def endpoint(image: ImageFile)`` parameters do. + + Lives in the file-handling layer because it is the schema-side counterpart + of the parameter-level upload conversion (``_convert_param_to_media_file``). + """ + for field_name in type(schema_obj).model_fields: + value = getattr(schema_obj, field_name, None) + parsed = _parse_file_model_value(value) + if parsed is not value: + # The runtime type (e.g. ImageFile) intentionally differs from the wire + # annotation (ImageFileModel); bypass pydantic's assignment validation. + object.__setattr__(schema_obj, field_name, parsed) + return schema_obj + + class _BaseFileHandlingMixin: """ Base mixin for handling file uploads and parameter conversions across different deployment environments. @@ -230,6 +283,49 @@ def _read_upload_files(self, files: dict, media_types: dict, *args, **kwargs) -> raise ValueError(f"Could not parse file {key}. Check if the file is correct. Error: {str(e)}") return converted_files + def _resolve_schema_annotation(self, annotation: Any) -> Optional[Type]: + """ + Resolve an annotation (also ``Optional``/``Union``) to a pydantic request + schema whose nested FileModel fields should be parsed. + + FileModel variants are themselves media handled by the parameter-level upload + path (``_convert_param_to_media_file``), so they are excluded here. + """ + candidates = [annotation] + if get_origin(annotation) in (Union, UnionType): + candidates = [arg for arg in get_args(annotation) if arg is not type(None)] + + for candidate in candidates: + if inspect.isclass(candidate) and issubclass(candidate, BaseModel) and not issubclass(candidate, FileModel): + return candidate + return None + + def _parse_schema_params(self, schema_params: set, named_args: dict) -> dict: + """ + Parse nested FileModel fields inside request-schema arguments. + + Called by ``_handle_file_uploads`` before the media-param conversion so that + endpoint functions always receive ready-to-use media-toolkit objects regardless + of whether files arrive as top-level parameters or nested inside a schema. + + Args: + schema_params: Parameter names whose annotation resolved to a pydantic schema. + named_args: Current mapping of parameter name → value for this call. + + Returns: + Mapping of parameter name → schema instance with media fields replaced. + """ + parsed = {} + for name in schema_params: + value = named_args.get(name) + if value is None: + continue + try: + parsed[name] = parse_schema_media_fields(value) + except Exception as e: + raise FileUploadException(message=f"Could not parse media fields of '{name}': {e}") + return parsed + def _handle_file_uploads(self, func: Callable) -> Callable: """ Wrap a function to handle file uploads and conversions. @@ -243,7 +339,14 @@ def _handle_file_uploads(self, func: Callable) -> Callable: """ sig = inspect.signature(func) media_params = self._get_media_params(sig) - + + # Parameters typed as a pydantic request schema whose nested FileModel fields + # must be parsed into media-toolkit objects before the endpoint executes. + schema_params = { + name for name, annot in self._sig_to_annotations(sig).items() + if name not in media_params and self._resolve_schema_annotation(annot) is not None + } + param_names = list(sig.parameters.keys()) # Check if the original function is async @@ -254,6 +357,9 @@ async def file_upload_wrapper(*args, **kwargs): named_args = {param_names[i]: arg for i, arg in enumerate(args) if i < len(param_names)} named_args.update(kwargs) + # Parse nested media inside schema parameters + named_args.update(self._parse_schema_params(schema_params, named_args)) + # Convert media-related parameters files_to_process = { param_name: param_value @@ -268,7 +374,7 @@ async def file_upload_wrapper(*args, **kwargs): # Update arguments with converted files named_args.update(processed_files) - + # AWAIT the async function return await func(**named_args) else: @@ -278,6 +384,9 @@ def file_upload_wrapper(*args, **kwargs): named_args = {param_names[i]: arg for i, arg in enumerate(args) if i < len(param_names)} named_args.update(kwargs) + # Parse nested media inside schema parameters + named_args.update(self._parse_schema_params(schema_params, named_args)) + # Convert media-related parameters files_to_process = { param_name: param_value @@ -292,7 +401,7 @@ def file_upload_wrapper(*args, **kwargs): # Update arguments with converted files named_args.update(processed_files) - + # Call the sync function directly return func(**named_args) diff --git a/apipod/engine/jobs/job_result.py b/apipod/engine/jobs/job_result.py index 11c0288..b380970 100644 --- a/apipod/engine/jobs/job_result.py +++ b/apipod/engine/jobs/job_result.py @@ -2,66 +2,14 @@ from io import BytesIO from typing import Any, List, Optional, Union -from pydantic import BaseModel, AnyUrl +from pydantic import BaseModel from apipod.common.settings import DEFAULT_DATE_TIME_FORMAT from apipod.engine.jobs.base_job import JOB_STATUS, BaseJob from apipod.engine.signatures.upload import is_param_media_toolkit_file from media_toolkit import IMediaContainer from media_toolkit.utils.data_type_utils import is_file_model_dict - - -class FileModel(BaseModel): - file_name: str - content_type: str - content: Union[str, AnyUrl] # base64 encoded or url - max_size_mb: Optional[float] = 4000 - - class Config: - json_schema_extra = { - "x-media-type": "MediaFile", - "example": { - "file_name": "example.csv", - "content_type": "text/csv", - "content": "https://example.com/example.csv", - } - } - - -class ImageFileModel(FileModel): - class Config: - json_schema_extra = { - "x-media-type": "ImageFile", - "example": { - "file_name": "example.png", - "content_type": "image/png", - "content": "base64 encoded image data", - } - } - - -class AudioFileModel(FileModel): - class Config: - json_schema_extra = { - "x-media-type": "AudioFile", - "example": { - "file_name": "example.mp3", - "content_type": "audio/mpeg", - "content": "base64 encoded audio data", - } - } - - -class VideoFileModel(FileModel): - class Config: - json_schema_extra = { - "x-media-type": "VideoFile", - "example": { - "file_name": "example.mp4", - "content_type": "video/mp4", - "content": "base64 encoded video data", - } - } +from apipod.common.schemas.media_files import FileModel def _job_status_to_public(status: Any) -> Optional[str]: @@ -208,6 +156,11 @@ def _serialize_result(data: Any) -> Union[FileModel, List[FileModel], list, str, except Exception: pass + # Pydantic schema responses (e.g. SpeechResponse): dump to a dict and + # recurse so nested media files / FileModels serialize correctly too. + if isinstance(data, BaseModel): + return JobResultFactory._serialize_result(data.model_dump()) + if isinstance(data, list): return [JobResultFactory._serialize_result(item) for item in data] diff --git a/apipod/engine/schema_extension/__init__.py b/apipod/engine/schema_extension/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apipod/engine/schema_extension/schema_mixin.py b/apipod/engine/schema_extension/schema_mixin.py deleted file mode 100644 index ae3c1f3..0000000 --- a/apipod/engine/schema_extension/schema_mixin.py +++ /dev/null @@ -1,166 +0,0 @@ -from types import UnionType -from typing import Callable, Type, Any, get_args, get_origin, Union -import uuid -from datetime import datetime, timezone -import inspect -from apipod.common.schemas import ( - ChatCompletionRequest, ChatCompletionResponse, ChatCompletionChoice, - CompletionRequest, CompletionResponse, CompletionChoice, - EmbeddingRequest, EmbeddingResponse, EmbeddingData, - ImageGenerationRequest, ImageGenerationResponse, ImageGenerationData, - VideoGenerationRequest, VideoGenerationResponse, VideoGenerationData, - AudioRequest, AudioResponse, AudioData, - Generation3DRequest, Generation3DResponse, Generation3DData, - VisionRequest, VisionResponse, VisionData, - MultimodalEmbeddingRequest, MultimodalEmbeddingResponse, MultimodalEmbeddingData, -) - - -class _SchemaExtMixin: - """ - Mixin class for Base LLM functionality - """ - - def __init__(self, *args, **kwargs): - self._llm_configs = { - ChatCompletionRequest: (ChatCompletionResponse, "chat"), - CompletionRequest: (CompletionResponse, "completion"), - EmbeddingRequest: (EmbeddingResponse, "embedding"), - ImageGenerationRequest: (ImageGenerationResponse, "image_generation"), - VideoGenerationRequest: (VideoGenerationResponse, "video_generation"), - AudioRequest: (AudioResponse, "audio"), - Generation3DRequest: (Generation3DResponse, "generation_3d"), - VisionRequest: (VisionResponse, "vision"), - MultimodalEmbeddingRequest: (MultimodalEmbeddingResponse, "embedding_multimodal"), - } - self._supported_llm_request_models = tuple(self._llm_configs.keys()) - - def _resolve_supported_llm_request_model(self, annotation: Any): - """Resolve direct/optional request model annotations to a supported LLM request model.""" - if annotation in self._llm_configs: - return annotation - - origin = get_origin(annotation) - if origin in (Union, UnionType): - for arg in get_args(annotation): - if arg is type(None): - continue - if arg in self._llm_configs: - return arg - - return None - - def _get_llm_config(self, func: Callable): - sig = inspect.signature(func) - for param in sig.parameters.values(): - req_model = self._resolve_supported_llm_request_model(param.annotation) - if req_model is not None: - res_model, endpoint_type = self._llm_configs[req_model] - return req_model, res_model, endpoint_type - return None, None, None - - def _prepare_llm_payload(self, req_model: Type, payload: Any) -> Any: - """ - Prepare the LLM request payload. - """ - if isinstance(payload, req_model): - return payload - elif isinstance(payload, dict): - return req_model.model_validate(payload) - else: - raise ValueError(f"Invalid payload type for {req_model}: {type(payload)}") - - def _wrap_llm_response(self, result: Any, response_model: Type, endpoint_type: str, openai_req: Any) -> Any: - """ - Wrap the raw result into the appropriate LLM response model. - """ - if isinstance(result, response_model): - return result - - model_name = getattr(openai_req, "model", "unknown-model") - ts, uid = int(datetime.now(timezone.utc).timestamp()), uuid.uuid4().hex[:8] - - if endpoint_type == "chat": - return response_model( - id=f"chatcmpl-{ts}-{uid}", - object="chat.completion", - created=ts, - model=model_name, - choices=[ChatCompletionChoice(**choice) for choice in result["choices"]], - usage=result.get("usage") - ) - elif endpoint_type == "completion": - return response_model( - id=f"cmpl-{ts}-{uid}", - object="text.completion", - created=ts, - model=model_name, - choices=[CompletionChoice(**choice) for choice in result["choices"]], - usage=result.get("usage") - ) - elif endpoint_type == "embedding": - # FRICTION #15 fix: the outer object on EmbeddingResponse is "list" - # (each item in data carries object="embedding"). The schema declares - # object: Literal["list"]; passing "embedding" here used to fail - # Pydantic validation, which is why qwen-models constructs the - # response by hand. After this fix, the auto-wrap path is safe. - return response_model( - object="list", - data=[EmbeddingData(**data) for data in result["data"]], - model=model_name, - usage=result.get("usage") - ) - elif endpoint_type == "image_generation": - return response_model( - id=f"imggen-{ts}-{uid}", - object="image_generation", - created=ts, - model=model_name, - data=[ImageGenerationData(**item) for item in result["data"]], - usage=result.get("usage") - ) - elif endpoint_type == "video_generation": - return response_model( - id=f"vidgen-{ts}-{uid}", - object="video_generation", - created=ts, - model=model_name, - data=[VideoGenerationData(**item) for item in result["data"]], - usage=result.get("usage") - ) - elif endpoint_type == "audio": - return response_model( - id=f"aud-{ts}-{uid}", - object="audio", - created=ts, - model=model_name, - data=[AudioData(**item) for item in result["data"]], - usage=result.get("usage") - ) - elif endpoint_type == "generation_3d": - return response_model( - id=f"gen3d-{ts}-{uid}", - object="generation_3d", - created=ts, - model=model_name, - data=[Generation3DData(**item) for item in result["data"]], - usage=result.get("usage") - ) - elif endpoint_type == "vision": - return response_model( - id=f"vis-{ts}-{uid}", - object="vision", - created=ts, - model=model_name, - data=[VisionData(**item) for item in result["data"]], - usage=result.get("usage") - ) - elif endpoint_type == "embedding_multimodal": - return response_model( - object="list", - data=[MultimodalEmbeddingData(**item) for item in result["data"]], - model=model_name, - usage=result.get("usage") - ) - else: - raise ValueError(f"Unknown endpoint type: {endpoint_type}") \ No newline at end of file diff --git a/apipod/engine/signatures/policies.py b/apipod/engine/signatures/policies.py index ce4c6d9..cc255df 100644 --- a/apipod/engine/signatures/policies.py +++ b/apipod/engine/signatures/policies.py @@ -1,10 +1,14 @@ -from types import UnionType -from typing import Any, Union, get_args, get_origin - import inspect +from typing import Any + from fastapi import Body, Form -from apipod.common.schemas import SUPPORTED_LLM_REQUEST_SCHEMAS +from apipod.engine.backend.schema_resolve import SCHEMA_REGISTRY, resolve_request_model + +# Request schemas that are interpreted as JSON bodies by router decorators, +# even when endpoint authors do not specify Body(...). Derived from the +# schema registry so the two can never drift apart. +SUPPORTED_REQUEST_SCHEMAS = tuple(SCHEMA_REGISTRY) class FastAPISignaturePolicies: @@ -26,33 +30,22 @@ def is_fastapi_dependency(parameter: inspect.Parameter) -> bool: return module.startswith("fastapi") or module.startswith("starlette") @staticmethod - def is_supported_llm_request_schema(annotation: Any) -> bool: + def is_supported_request_schema(annotation: Any) -> bool: """ - True if annotation is a supported APIPod LLM request schema. - Supports direct and optional union annotations. + True if annotation is (or contains, for Optional/Union annotations) a + registered APIPod request schema or a subclass of one. """ - if annotation in SUPPORTED_LLM_REQUEST_SCHEMAS: - return True - - origin = get_origin(annotation) - if origin in (Union, UnionType): - return any( - arg in SUPPORTED_LLM_REQUEST_SCHEMAS - for arg in get_args(annotation) - if arg is not type(None) - ) - - return False + return resolve_request_model(annotation) is not None @classmethod def build_non_file_default(cls, annotation: Any, default: Any, is_optional: bool): """ Select FastAPI parameter defaults for non-file fields. - Supported LLM request schemas are mapped to JSON body semantics. All other + Registered request schemas are mapped to JSON body semantics. All other non-file parameters keep form semantics for backward compatibility. """ normalized_default = None if is_optional else default - if cls.is_supported_llm_request_schema(annotation): + if cls.is_supported_request_schema(annotation): return Body(default=normalized_default) return Form(default=normalized_default) diff --git a/docs/README_TECH.md b/docs/README_TECH.md index 7b9c79c..fa7b482 100644 --- a/docs/README_TECH.md +++ b/docs/README_TECH.md @@ -1,20 +1,124 @@ +# APIPod — Technical Guide -# Queue mixin, Job Queue and Job lifecycle +This document explains how APIPod works internally: its architecture, the request lifecycle, and the design principles behind it. It is aimed at developers maintaining or extending the package. For usage-oriented documentation see the [main README](../README.md). -The fastapi router backend uses the _queue_mixin to manage jobs. -Every call to an task_endpoint will submit the job via the mixin to the job_queue. +## What APIPod is +APIPod is the standardized way to build AI services for the [socaity.ai](https://www.socaity.ai) catalog. It wraps FastAPI with the batteries an AI service needs — media file handling, job queues with progress reporting, serverless routing, standardized request/response schemas — while keeping the developer experience of plain FastAPI: you write a function, annotate its parameters, and decorate it with `@app.endpoint`. -Jobs are managed by the job_queue. -When a job is created in, it goes through a series of stages before it is completed. +It sits in an ecosystem of three packages: + +| Package | Role | +| --- | --- | +| **APIPod** (this repo) | Server side: define and deploy AI service endpoints | +| [media-toolkit](https://github.com/SocAIty/media-toolkit) | Shared media types (`ImageFile`, `AudioFile`, `VideoFile`, …) used for I/O on both ends | +| [fastSDK](https://github.com/SocAIty/fastSDK) | Client side: generated SDKs that handle uploads, polling and streaming | + +## Package layout + +``` +apipod/ +├── api.py # APIPod() factory: resolves config → backend instance +├── common/ +│ ├── settings.py # Env-driven config (APIPOD_ORCHESTRATOR / _COMPUTE / _PROVIDER, host, port) +│ ├── constants.py # Enums: ORCHESTRATOR, COMPUTE, PROVIDER, SERVER_HEALTH +│ └── schemas/ +│ ├── schemas.py # Standardized request/response models (OpenAI-compatible shapes) +│ └── media_files.py # FileModel + typed variants: pydantic mirrors of media-toolkit files +├── engine/ +│ ├── base_backend.py # Shared backend base (title, version, health) +│ ├── endpoint_config.py # EndpointExecutionPlan + configurator (how to register an endpoint) +│ ├── backend/ +│ │ ├── fastapi/ # SocaityFastAPIRouter + file handling, exceptions +│ │ └── runpod/ # SocaityRunpodRouter (serverless, path-based) +│ ├── files/ # _BaseFileHandlingMixin + parse_schema_media_fields (inputs → MediaFile) +│ ├── jobs/ # BaseJob, JobProgress, JobResult (+ factory) +│ ├── queue/ # JobQueue, JobStore, _QueueMixin (enqueue instead of block) +│ └── signatures/ # Signature inspection policies (media params, Body vs Form, …) +└── deploy/ # `apipod build`: Dockerfile generation, dependency/CUDA detection +``` + +## Core principles + +1. **One decorator, many execution modes.** Developers only write `@app.endpoint(...)`. The router inspects the function and decides how to run it. They never choose a "mode" explicitly — the signature is the contract. +2. **Deployment is configuration, not code.** The same service file runs as a plain FastAPI app, a queued FastAPI app, or a RunPod serverless worker. `APIPod()` is a factory that picks the backend from `orchestrator` / `compute` / `provider` (constructor args or `APIPOD_*` env vars). +3. **Media files are objects, not bytes.** Endpoint authors annotate parameters with media-toolkit types (`ImageFile`, `AudioFile`, …) and receive parsed, ready-to-use objects — regardless of whether the client sent a multipart upload, a URL, or base64. +4. **Standardized, OpenAI-compatible schemas.** Common AI payloads (chat, completion, embeddings, image/video/audio/3D generation, vision) have canonical pydantic schemas whose wire format mirrors the OpenAI API. The shape is provider-agnostic: any model can serve them; clients written against OpenAI-compatible tooling work without translation. +5. **Long-running work returns a job, not a blocked connection.** With a queue configured, endpoints return a `JobResult` immediately; clients poll `/status/{job_id}` (fastSDK does this automatically) and can receive progress updates via `JobProgress`. + +## Backend resolution + +`APIPod()` in `api.py` is not a class — it is a factory. It resolves the `(orchestrator, compute, provider)` triple (explicit args → env vars → defaults) against a support matrix and returns one of: + +- **`SocaityFastAPIRouter`** — an `APIRouter` subclass bound to a `FastAPI` app. Used for dedicated compute and for local serverless emulation (then paired with an in-memory `JobQueue` plus a background worker thread started via the app lifespan). +- **`SocaityRunpodRouter`** — a path-based dispatcher for RunPod serverless. There is no HTTP layer: RunPod delivers a JSON job whose `input.path` selects the registered function; the router converts files, injects `JobProgress`, executes, and returns a serialized `JobResult` (or a generator for streaming). It can also synthesize an OpenAPI schema by replaying the FastAPI signature conversion, so fastSDK clients can be generated against serverless deployments too. + +The full configuration matrix is documented in the main README and in the `APIPod()` docstring. + +## The endpoint pipeline (FastAPI backend) + +When a function is decorated with `@app.endpoint(path)`, the router asks the `FastApiEndpointConfigurator` to build an immutable `EndpointExecutionPlan`. The plan records whether the signature contains a registered request schema, whether the function itself streams, and whether queueing is enabled. + +The function then goes through the normal APIPod decorator pipeline: + +1. **Schema binding detection** — a parameter (any name) annotated with a standardized request schema (e.g. `ChatCompletionRequest`) or a subclass becomes `plan.schema_binding`. This does not register a separate route. It only tells the downstream decorators to parse that JSON body into the schema object and wrap the final result into the registered response model. +2. **Streaming endpoint decorator** — for generator functions, output is bridged into a `StreamingResponse` with SSE-friendly headers. +3. **Task endpoint decorator** — when a job queue is configured (and `use_queue` is not `False`), the call enqueues a job and immediately returns a `JobResult`. Schema requests with `stream=true` are the one request-level exception: the task decorator executes them inline and streams the result instead of queueing. +4. **Standard endpoint decorator** — direct execution. It also handles non-queued schema endpoints: parse the request schema, execute the user function, wrap the result into the schema response model, and serialize non-schema media results through `JobResultFactory`. + +In all cases the function then passes through the **file-handling preparation** (next section) before being handed to FastAPI's `api_route`. + +### File handling: two layers + +File support is split into a *signature* layer and a *runtime* layer. + +- **Signature rewriting** (`engine/backend/fastapi/file_handling_mixin.py`): media-toolkit annotations in the user's signature are rewritten so FastAPI/OpenAPI understand them. `image: ImageFile` becomes `Union[LimitedUploadFile, ImageFileModel, str]` — the client may send a multipart upload, a `FileModel` JSON object (`{file_name, content_type, content}` where content is base64 or a URL), or a plain URL/base64 string. `MediaList[...]` maps to list variants. Upload size limits are enforced via a dynamically subclassed `LimitedUploadFile`. `JobProgress` parameters are stripped from the public signature (and a dummy is injected when no queue runs). +- **Runtime conversion** (`engine/files/base_file_mixin.py`): before the user function executes, every media-annotated argument is converted to the annotated media-toolkit type via `media_from_any` — whatever the client actually sent. The function body always receives real `MediaFile` objects. This layer is backend-agnostic and reused by the RunPod router. + +On the way out, `JobResultFactory._serialize_result` converts returned `MediaFile`/`MediaList`/pydantic objects back into JSON-safe `FileModel` payloads. + +### Standardized schemas + +`common/schemas/schemas.py` defines request/response pairs for: chat completion, text completion, embeddings, image generation, video generation, transcription, speech (TTS), voice creation, voice conversion, 3D generation, vision, and multimodal embeddings. `model` is optional on every request, since an APIPod service typically serves exactly one model. The audio API is split per use case, mirroring OpenAI: `TranscriptionRequest` (STT), `SpeechRequest` (TTS, with `voice` as a named voice or a cloning reference file), `CreateVoiceRequest` (voice cloning → embedding) and `VoiceConversionRequest` (voice2voice). + +`SCHEMA_REGISTRY` in `engine/schema_extension/schema_mixin.py` is the single source of truth: it maps each request schema to a `SchemaEndpointSpec` (response model, tag). Everything else derives from it — `engine/signatures/policies.py` builds `SUPPORTED_REQUEST_SCHEMAS` from the registry keys (schema-annotated parameters are read from the JSON body while plain parameters stay form-encoded), and both routers detect schema endpoints with `get_schema_binding`, which finds the schema-typed parameter by annotation regardless of its name (subclasses of registered schemas are also detected, so services can extend a schema with custom fields). Schema endpoints may not declare additional user parameters; put extra inputs on the schema or a schema subclass. + +**Nested media files**: request schemas may declare `FileModel`-typed fields (`ImageGenerationRequest.image`, `TranscriptionRequest.audio`, …). Pydantic accepts uploads, FileModel JSON objects, URLs and plain base64 strings for those fields; before the endpoint function runs, `parse_schema_media_fields` (in `engine/files/base_file_mixin.py`) replaces them with parsed media-toolkit objects — the endpoint receives a ready-to-use `ImageFile`/`AudioFile`, exactly like method-level `def endpoint(image: ImageFile)` parameters. + +**Response wrapping** (`wrap_schema_response`): if the function already returns the response model, it passes through. Schema helpers also accept convenient raw results (a plain string for chat/completion/transcription, raw vectors for embeddings). Everything else shares one generic path: a uniform envelope (`created`, `model`) merged with the result dict and validated by pydantic — a returned media-toolkit file is lifted into the `data` list automatically. Response IDs are not generated by APIPod schemas; IDs belong to the platform `JobResult`/socaity.ai layer. + +### Jobs, queue and lifecycle + +The local `JobQueue` (in-memory, threaded) drives the serverless emulation and dedicated-with-queue modes. A job passes through these stages: + +- `validate_job_before_add` — parameter/permission validation +- `add_job` — persisted in the `JobStore`, returns immediately +- `create_job` / `process_job` — the worker picks it up and runs the user function +- `complete_job` — result stored, status set +- `remove_job` — cleaned up once collected (or orphaned) + +`JobProgress` is the in-band progress channel: if the user function declares a `job_progress` parameter, the backend injects an implementation (`JobProgress` locally, `JobProgressRunpod` on RunPod) and `set_status(progress, message)` updates surface in `/status` polls. `JobResult` is the unified public envelope: `job_id`, `status` (`pending/processing/completed/failed`), `result`, `progress`, `message`, timing `metrics`, and hypermedia `links` (status/cancel/stream). + +Standard routes registered automatically: `GET /status/{job_id}`, `POST /cancel/{job_id}`, `GET /health`, and — when a stream store is configured — `GET /stream/{job_id}` (SSE). + +### Streaming + +Three streaming paths exist today: + +1. **Generator endpoints** — any endpoint function that is a (async) generator, or whose return annotation declares an iterator, is served as an SSE `StreamingResponse` (FastAPI) or as a native generator handed back to RunPod (`return_aggregate_stream`). Detection is annotation/inspect-based — no source-code heuristics. +2. **Schema endpoints with `stream=true`** — the request schema carries the `stream` flag (chat, completion, transcription, speech, video generation). Streaming bypasses the queue; what gets streamed depends on what the function returns: + - a **generator**: streamed as-is — SSE for token-delta endpoints (chat/completion/transcription, e.g. `ChatCompletionChunk` events), raw bytes otherwise; + - an **`AudioFile`/`VideoFile`**: its encoded bytes are chunked into a `StreamingResponse` with the file's media content type — raw audio chunks, not SSE, matching OpenAI's `stream_format="audio"` behavior; + - anything else: the regular wrapped JSON response (the endpoint cannot stream). + On RunPod the same logic applies, but chunks pass through `_yield_native_stream`, which base64-encodes binary chunks because RunPod transports JSON. +3. **Job streaming** — `GET /stream/{job_id}` replays chunks from a pluggable stream store while a queued job is in `streaming` state (gateway integration). + +### Deployment + +`apipod build` (see `deploy/`) scans the project (entrypoint, dependencies, CUDA requirements) and generates a Dockerfile from compatible templates. The resulting container runs unchanged on dedicated hosts, on socaity.ai, or on RunPod serverless — only the `APIPOD_*` env vars differ. + +## Request lifecycle, end to end + +A client calls `POST /tts` with a JSON body. FastAPI validates it against the rewritten signature and calls the outermost wrapper. The file-handling layer converts any media inputs into media-toolkit objects. If the endpoint is queued, the queue mixin stores the job and returns `{job_id, status: "pending", links}` — the worker thread later executes the real function, feeding `JobProgress` updates into the store. The client (typically fastSDK) polls `/status/{job_id}` until `completed` and receives the result, with any returned `AudioFile` serialized as a `FileModel`. Without a queue the same conversion happens inline and the response returns directly. On RunPod, the identical user function is reached through `handler → _router(path) → file handling → execute`, proving the core principle: the function is written once, the backend decides how it runs. -The stages are: -- validate_job_before_add: Used to validate parameters, user permissions, etc. -- add_job: job gets added to job store. -- create_job: literally creates the job. Can be overridden to use a specialized job class. -- process_job: The main job processing function. This is where the actual work is done. -- complete_job: Called when the job is completed. This is where the job is marked as completed and the result is stored. -- remove_job: - - Called when the job is removed from the JobStore and RAM. - - This happens when the user gets the result of the job or when the job was never collected (orphant job). diff --git a/examples/test_service_six_schemas.py b/examples/test_service_six_schemas.py index 9d0d36d..6cd9b01 100644 --- a/examples/test_service_six_schemas.py +++ b/examples/test_service_six_schemas.py @@ -1,14 +1,14 @@ """ -Minimal APIPod service used to verify media-file integration end to end for -PR #15 (the 6 new Pydantic schemas). +Minimal APIPod service used to verify media-file integration of the +standardized schemas end to end. It exposes two endpoints: -- POST /vision uses VisionRequest, which has a REQUIRED image field -- POST /audio uses AudioRequest, which has an OPTIONAL audio field +- POST /vision uses VisionRequest, which has a REQUIRED image field +- POST /transcribe uses TranscriptionRequest, which has a REQUIRED audio field Both endpoints just inspect the incoming media file and echo back a few -properties (size, content type, etc.) so we can confirm the file_handling -mixin actually deserialized URL/base64 input into a real ImageFile/AudioFile. +properties (size, content type, etc.) so we can confirm the file handling +actually deserialized upload/URL/base64 input into a real ImageFile/AudioFile. Run with: python examples/test_service_six_schemas.py @@ -16,10 +16,7 @@ """ from apipod import APIPod -from apipod.common.schemas import ( - VisionRequest, - AudioRequest, -) +from apipod.common.schemas import TranscriptionRequest, VisionRequest app = APIPod() @@ -38,10 +35,10 @@ def _media_summary(media) -> dict: @app.endpoint("/vision") -def vision(payload: VisionRequest): - """Echoes a label built from payload.image. The point is that the image +def vision(request: VisionRequest): + """Echoes a label built from request.image. The point is that the image arrived as an ImageFile, deserialized from upload / base64 / URL.""" - summary = _media_summary(payload.image) + summary = _media_summary(request.image) return { "data": [ { @@ -52,17 +49,12 @@ def vision(payload: VisionRequest): } -@app.endpoint("/audio") -def audio(payload: AudioRequest): - """Echoes the audio properties (or text if no audio was sent).""" - if payload.audio is not None: - text = f"echo:{_media_summary(payload.audio)}" - else: - text = f"no-audio:text={payload.text!r}" +@app.endpoint("/transcribe") +def transcribe(request: TranscriptionRequest): + """Echoes the audio properties as the 'transcript'.""" return { - "data": [ - {"text": text, "language": payload.language, "duration_s": None} - ] + "text": f"echo:{_media_summary(request.audio)}", + "language": request.language, } diff --git a/test/llm/test_llm_mock.py b/test/llm/test_llm_mock.py index 2695feb..fb09cfc 100644 --- a/test/llm/test_llm_mock.py +++ b/test/llm/test_llm_mock.py @@ -6,7 +6,6 @@ from typing import List, Union from datetime import datetime import time -import json import uuid import random @@ -14,13 +13,10 @@ from apipod.common import schemas from fastapi import FastAPI -# ============================================================================ -# Mock Model Wrapper -# ============================================================================ class MockModel: """A mock model that returns random strings to mimic an LLM.""" - + def __init__(self, model_name: str = "mock-model-v1"): print(f"Initializing Mock Model: {model_name}...") self.model_name = model_name @@ -39,7 +35,7 @@ def generate(self, messages: list, temperature: float = 0.7, max_tokens: int = 5 """Simulate non-streaming generation.""" # Just pick a random response return random.choice(self.responses) - + def stream_generate(self, messages: list, temperature: float = 0.7, max_tokens: int = 512): """Simulate streaming generation by yielding words.""" response = random.choice(self.responses) @@ -54,7 +50,7 @@ def get_embeddings(self, texts: Union[str, List[str]]) -> List[List[float]]: """Simulate embedding generation with random vectors.""" if isinstance(texts, str): texts = [texts] - + # Return random vectors of size 128 return [[random.uniform(-1, 1) for _ in range(128)] for _ in texts] @@ -89,11 +85,11 @@ def chat_logic(payload: schemas.ChatCompletionRequest): temperature=payload.temperature, max_tokens=payload.max_tokens or 512 ) - + # Mock token counts prompt_tokens = sum(len(m.content.split()) for m in payload.messages) * 2 completion_tokens = len(response_text.split()) * 2 - + return schemas.ChatCompletionResponse( id=f"chatcmpl-{uuid.uuid4().hex[:8]}", object="chat.completion", diff --git a/test/llm/test_six_schemas.py b/test/llm/test_six_schemas.py deleted file mode 100644 index c1dd566..0000000 --- a/test/llm/test_six_schemas.py +++ /dev/null @@ -1,399 +0,0 @@ -""" -Tests for the six modality schemas added in #179, plus the FRICTION #15 fix -in _BaseLLMMixin._wrap_llm_response. - -These tests do not require torch / transformers — they exercise the schema -validation path and the mixin wrap path directly. -""" - -import pytest -from pydantic import ValidationError - -from apipod.common import schemas -from apipod.engine.llm.base_llm_mixin import _BaseLLMMixin - - -# ---------------------------------------------------------------------- -# Registry / supported tuple -# ---------------------------------------------------------------------- - -def test_supported_tuple_has_nine_entries(): - """SUPPORTED_LLM_REQUEST_SCHEMAS should now hold 3 original + 6 new = 9.""" - assert len(schemas.SUPPORTED_LLM_REQUEST_SCHEMAS) == 9 - - -def test_supported_tuple_contains_new_request_classes(): - for cls in ( - schemas.ImageGenerationRequest, - schemas.VideoGenerationRequest, - schemas.AudioRequest, - schemas.Generation3DRequest, - schemas.VisionRequest, - schemas.MultimodalEmbeddingRequest, - ): - assert cls in schemas.SUPPORTED_LLM_REQUEST_SCHEMAS - - -def test_mixin_configs_has_nine_entries(): - m = _BaseLLMMixin() - assert len(m._llm_configs) == 9 - - -def test_mixin_configs_maps_new_requests_to_responses(): - m = _BaseLLMMixin() - expected = { - schemas.ImageGenerationRequest: (schemas.ImageGenerationResponse, "image_generation"), - schemas.VideoGenerationRequest: (schemas.VideoGenerationResponse, "video_generation"), - schemas.AudioRequest: (schemas.AudioResponse, "audio"), - schemas.Generation3DRequest: (schemas.Generation3DResponse, "generation_3d"), - schemas.VisionRequest: (schemas.VisionResponse, "vision"), - schemas.MultimodalEmbeddingRequest: (schemas.MultimodalEmbeddingResponse, "embedding_multimodal"), - } - for req_cls, expected_cfg in expected.items(): - assert m._llm_configs[req_cls] == expected_cfg - - -# ---------------------------------------------------------------------- -# Schema field defaults and required-field validation -# ---------------------------------------------------------------------- - -def test_image_generation_request_minimal_valid(): - r = schemas.ImageGenerationRequest(model="flux", prompt="a cat") - assert r.model == "flux" - assert r.prompt == "a cat" - assert r.num_images == 1 # documented default - assert r.image is None - assert r.mask is None - - -def test_image_generation_request_missing_prompt_raises(): - with pytest.raises(ValidationError): - schemas.ImageGenerationRequest(model="flux") - - -def test_video_generation_request_defaults(): - r = schemas.VideoGenerationRequest(model="hunyuan", prompt="x") - assert r.duration_s == 5.0 - assert r.fps == 24 - - -def test_video_generation_request_missing_prompt_raises(): - with pytest.raises(ValidationError): - schemas.VideoGenerationRequest(model="hunyuan") - - -def test_audio_request_all_inputs_optional_except_model(): - r = schemas.AudioRequest(model="whisper") - assert r.text is None - assert r.audio is None - assert r.voice is None - - -def test_generation_3d_request_output_format_default(): - r = schemas.Generation3DRequest(model="triposr") - assert r.output_format == "glb" - - -def test_vision_request_requires_image(): - with pytest.raises(ValidationError): - schemas.VisionRequest(model="clip") - - -def test_multimodal_embedding_request_all_inputs_optional(): - r = schemas.MultimodalEmbeddingRequest(model="clip") - assert r.input is None - assert r.image is None - assert r.audio is None - - -# ---------------------------------------------------------------------- -# Response shape validation (Literal["..."] guards) -# ---------------------------------------------------------------------- - -def test_image_generation_response_object_literal(): - r = schemas.ImageGenerationResponse( - id="imggen-1-abc", - object="image_generation", - created=1, - model="flux", - data=[schemas.ImageGenerationData(url="http://x/i.png")], - ) - assert r.object == "image_generation" - - -def test_image_generation_response_wrong_object_raises(): - with pytest.raises(ValidationError): - schemas.ImageGenerationResponse( - id="imggen-1-abc", - object="wrong", - created=1, - model="flux", - data=[], - ) - - -def test_video_generation_response_object_literal(): - r = schemas.VideoGenerationResponse( - id="vidgen-1-abc", - object="video_generation", - created=1, - model="hunyuan", - data=[schemas.VideoGenerationData(url="http://x/v.mp4")], - ) - assert r.object == "video_generation" - - -def test_video_generation_response_wrong_object_raises(): - with pytest.raises(ValidationError): - schemas.VideoGenerationResponse( - id="vidgen-1-abc", - object="wrong", - created=1, - model="hunyuan", - data=[], - ) - - -def test_audio_response_object_literal(): - r = schemas.AudioResponse( - id="aud-1-abc", - object="audio", - created=1, - model="whisper", - data=[schemas.AudioData(text="hola")], - ) - assert r.object == "audio" - - -def test_audio_response_wrong_object_raises(): - with pytest.raises(ValidationError): - schemas.AudioResponse( - id="aud-1-abc", - object="wrong", - created=1, - model="whisper", - data=[], - ) - - -def test_generation_3d_response_object_literal(): - r = schemas.Generation3DResponse( - id="gen3d-1-abc", - object="generation_3d", - created=1, - model="triposr", - data=[schemas.Generation3DData(url="http://x/c.glb")], - ) - assert r.object == "generation_3d" - - -def test_generation_3d_response_wrong_object_raises(): - with pytest.raises(ValidationError): - schemas.Generation3DResponse( - id="gen3d-1-abc", - object="wrong", - created=1, - model="triposr", - data=[], - ) - - -def test_vision_response_object_literal(): - r = schemas.VisionResponse( - id="vis-1-abc", - object="vision", - created=1, - model="clip", - data=[schemas.VisionData(labels=[])], - ) - assert r.object == "vision" - - -def test_vision_response_wrong_object_raises(): - with pytest.raises(ValidationError): - schemas.VisionResponse( - id="vis-1-abc", - object="wrong", - created=1, - model="clip", - data=[], - ) - - -def test_multimodal_embedding_response_object_is_list(): - """Like EmbeddingResponse: outer object is 'list', each data item is 'embedding'.""" - r = schemas.MultimodalEmbeddingResponse( - object="list", - data=[ - schemas.MultimodalEmbeddingData( - embedding=[0.1, 0.2], - index=0, - modality="text", - ) - ], - model="clip", - ) - assert r.object == "list" - assert r.data[0].object == "embedding" # default on the data item - - -# ---------------------------------------------------------------------- -# Mixin wrap path — covers FRICTION #15 fix + each new endpoint_type -# ---------------------------------------------------------------------- - -@pytest.fixture -def mixin(): - return _BaseLLMMixin() - - -def test_friction_15_embedding_wrap_outer_object_is_list(mixin): - """ - FRICTION #15 regression. Pre-fix this raised ValidationError because the - mixin passed object='embedding' to EmbeddingResponse, which declares - object: Literal['list']. After the fix the wrap path succeeds and the - outer object is 'list'. - """ - req = schemas.EmbeddingRequest(model="bge", input="hello") - wrapped = mixin._wrap_llm_response( - result={ - "data": [{"object": "embedding", "embedding": [0.1, 0.2], "index": 0}], - "usage": {"prompt_tokens": 1, "total_tokens": 1}, - }, - response_model=schemas.EmbeddingResponse, - endpoint_type="embedding", - openai_req=req, - ) - assert wrapped.object == "list" - assert wrapped.data[0].object == "embedding" - - -def test_image_generation_wrap(mixin): - req = schemas.ImageGenerationRequest(model="flux", prompt="cat") - wrapped = mixin._wrap_llm_response( - result={"data": [{"url": "http://x/i.png", "seed": 42}]}, - response_model=schemas.ImageGenerationResponse, - endpoint_type="image_generation", - openai_req=req, - ) - assert wrapped.object == "image_generation" - assert wrapped.data[0].url == "http://x/i.png" - assert wrapped.id.startswith("imggen-") - - -def test_video_generation_wrap(mixin): - req = schemas.VideoGenerationRequest(model="hunyuan", prompt="x") - wrapped = mixin._wrap_llm_response( - result={"data": [{"url": "http://x/v.mp4", "duration_s": 5.0}]}, - response_model=schemas.VideoGenerationResponse, - endpoint_type="video_generation", - openai_req=req, - ) - assert wrapped.object == "video_generation" - assert wrapped.id.startswith("vidgen-") - - -def test_audio_wrap(mixin): - req = schemas.AudioRequest(model="whisper", text="hi") - wrapped = mixin._wrap_llm_response( - result={"data": [{"text": "hola", "language": "es"}]}, - response_model=schemas.AudioResponse, - endpoint_type="audio", - openai_req=req, - ) - assert wrapped.object == "audio" - assert wrapped.data[0].text == "hola" - - -def test_generation_3d_wrap(mixin): - req = schemas.Generation3DRequest(model="triposr", prompt="chair") - wrapped = mixin._wrap_llm_response( - result={"data": [{"url": "http://x/c.glb", "output_format": "glb"}]}, - response_model=schemas.Generation3DResponse, - endpoint_type="generation_3d", - openai_req=req, - ) - assert wrapped.object == "generation_3d" - assert wrapped.id.startswith("gen3d-") - - -# 32x32 solid-red PNG (~100 bytes / ~140 b64 chars). The previous 1x1 PNG -# was too short for media_toolkit's base64 sniffer (it bails on payloads -# below the heuristic length to avoid false positives on short tokens). -def _make_png_b64() -> str: - import base64 - import struct - import zlib - - w = h = 32 - ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) - raw = b"" - for _ in range(h): - raw += b"\x00" + bytes((255, 0, 0) * w) - idat = zlib.compress(raw) - png = ( - b"\x89PNG\r\n\x1a\n" - + struct.pack(">I", len(ihdr)) + b"IHDR" + ihdr + struct.pack(">I", zlib.crc32(b"IHDR" + ihdr)) - + struct.pack(">I", len(idat)) + b"IDAT" + idat + struct.pack(">I", zlib.crc32(b"IDAT" + idat)) - + struct.pack(">I", 0) + b"IEND" + struct.pack(">I", zlib.crc32(b"IEND")) - ) - return base64.b64encode(png).decode("ascii") - - -_TINY_PNG_B64 = _make_png_b64() - - -def test_vision_wrap(mixin): - """ - Vision branch in _wrap_llm_response had no test before; the elif path was - never exercised. Covers the branch end-to-end. - """ - req = schemas.VisionRequest(model="clip", image=_TINY_PNG_B64) - wrapped = mixin._wrap_llm_response( - result={ - "data": [ - { - "labels": [{"label": "cat", "score": 0.95}], - "text": None, - } - ] - }, - response_model=schemas.VisionResponse, - endpoint_type="vision", - openai_req=req, - ) - assert wrapped.object == "vision" - assert wrapped.id.startswith("vis-") - assert wrapped.data[0].labels[0].label == "cat" - assert wrapped.data[0].labels[0].score == 0.95 - - -def test_multimodal_embedding_wrap(mixin): - req = schemas.MultimodalEmbeddingRequest(model="clip", input="hi") - wrapped = mixin._wrap_llm_response( - result={ - "data": [ - { - "object": "embedding", - "embedding": [0.1, 0.2], - "index": 0, - "modality": "text", - } - ] - }, - response_model=schemas.MultimodalEmbeddingResponse, - endpoint_type="embedding_multimodal", - openai_req=req, - ) - assert wrapped.object == "list" - assert wrapped.data[0].embedding == [0.1, 0.2] - - -def test_unknown_endpoint_type_still_raises(mixin): - req = schemas.ImageGenerationRequest(model="x", prompt="y") - with pytest.raises(ValueError, match="Unknown endpoint type"): - mixin._wrap_llm_response( - result={"data": []}, - response_model=schemas.ImageGenerationResponse, - endpoint_type="not_a_real_type", - openai_req=req, - ) From a780ccc95235b0d92e4d93296c55755155f6c67b Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Sun, 14 Jun 2026 11:53:29 +0200 Subject: [PATCH 10/38] Implemented response wrapping also for streaming endpoints. No need to specify the fields of the LLM Chunks anymore --- README.md | 5 +- apipod/engine/backend/fastapi/router.py | 38 ++++++++++++--- apipod/engine/backend/schema_resolve.py | 63 +++++++++++++++++++++++++ docs/README_TECH.md | 2 +- test/llm/test_llm_mock.py | 62 +++++------------------- 5 files changed, 111 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 6d2b1f4..36d645e 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ def transcribe(audio: AudioFile): APIPod ships request/response schemas for the common AI payloads: chat, completions, embeddings, image/video/3D generation, vision, transcription, text-to-speech and voice cloning. Annotate one parameter with a request schema and APIPod handles validation, media parsing, response wrapping and streaming. The wire format mirrors the OpenAI API, so OpenAI-compatible clients work out of the box. `model` is optional everywhere — your service usually *is* the model. -**Chat** — return a plain string (or a dict / full response object) and get a complete `chat.completion` envelope. Return a generator and `"stream": true` requests receive server-sent events: +**Chat** — return a plain string (or a dict / full response object) and get a complete `chat.completion` envelope. For `"stream": true` requests just yield raw tokens: APIPod wraps each into a `ChatCompletionChunk` server-sent event — generating the chunk `id`, `created` and `object` out of the box — and emits the closing chunk plus the `[DONE]` sentinel: ```python from apipod import APIPod @@ -107,6 +107,9 @@ app = APIPod() @app.endpoint("/chat") def chat(request: ChatCompletionRequest): + if request.stream: + # Yield plain tokens — APIPod wraps them into ChatCompletionChunk SSE events. + return my_llm.stream(request.messages, temperature=request.temperature) answer = my_llm.generate(request.messages, temperature=request.temperature) return answer # auto-wrapped into a ChatCompletionResponse ``` diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index 5a5745a..87b0c33 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -20,7 +20,10 @@ from apipod.engine.backend.fastapi.exception_handling import _FastAPIExceptionHandler from apipod.engine.backend.schema_resolve import ( SchemaBinding, + SchemaStreamSerializer, + SSE_DONE, SSE_STREAM_TAGS, + STREAM_CHUNK_SPECS, iter_media_chunks, wrap_schema_response, ) @@ -458,10 +461,12 @@ def _is_streaming_endpoint(self, func: Callable) -> bool: def _as_streaming_response(self, result: Any, binding: SchemaBinding) -> StreamingResponse | None: """ - Build a :class:`StreamingResponse` if the endpoint result is streamable: + Build a :class:`StreamingResponse` if a schema endpoint result is streamable: - ``AudioFile`` / ``VideoFile`` stream their encoded bytes as raw chunks with the proper media content type (OpenAI ``stream_format="audio"``); - - generators stream as-is: SSE for token-delta endpoints, raw bytes else. + - generators of raw tokens are wrapped into the schema's standardized chunk + SSE stream (e.g. ``ChatCompletionChunk``) when one is registered, else + streamed as-is: SSE for token-delta endpoints, raw bytes otherwise. Returns ``None`` when the result cannot be streamed. """ if isinstance(result, (AudioFile, VideoFile)): @@ -469,28 +474,47 @@ def _as_streaming_response(self, result: Any, binding: SchemaBinding) -> Streami return StreamingResponse(iter_media_chunks(result), media_type=media_type) if inspect.isgenerator(result) or inspect.isasyncgen(result): + if binding.tag in STREAM_CHUNK_SPECS: + generator = self._schema_chunk_stream(result, binding) + else: + generator = self._stream_generator(result) media_type = "text/event-stream" if binding.tag in SSE_STREAM_TAGS else "application/octet-stream" return StreamingResponse( - self._stream_generator(result), + generator, media_type=media_type, headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}, ) return None + async def _schema_chunk_stream(self, result: Any, binding: SchemaBinding) -> AsyncIterator[str]: + """Wrap raw token deltas into the schema's standardized chunk SSE stream.""" + serializer = SchemaStreamSerializer(binding) + async for token in self._stream_generator(result): + yield serializer.delta(token) + yield serializer.finish() + yield SSE_DONE + # ------------------------------------------------------------------ # Endpoint decorators (task / standard / streaming) # ------------------------------------------------------------------ def _modify_result_decorator(self, func: Callable, plan: EndpointExecutionPlan) -> Callable: """ - Wraps responses of schema endpoints to their given Response format. - Serializes media-files to and other objects to JSON + Wraps responses of schema endpoints into their declared response format. + + Streaming results (a token generator or media file) are turned into the + schema's standardized SSE/byte stream; everything else is wrapped into the + response model and serialized (media files -> JSON). """ @functools.wraps(func) def sync_wrapper(*args, **kwargs): result = func(*args, **kwargs) - if plan.schema_binding is not None: - result = wrap_schema_response(result, plan.schema_binding) + binding = plan.schema_binding + if binding is not None: + streaming = self._as_streaming_response(result, binding) + if streaming is not None: + return streaming + result = wrap_schema_response(result, binding) return JobResultFactory._serialize_result(result) return sync_wrapper diff --git a/apipod/engine/backend/schema_resolve.py b/apipod/engine/backend/schema_resolve.py index 12a6d4b..e8821f0 100644 --- a/apipod/engine/backend/schema_resolve.py +++ b/apipod/engine/backend/schema_resolve.py @@ -20,11 +20,13 @@ """ import inspect +import uuid from dataclasses import dataclass from datetime import datetime, timezone from types import UnionType from typing import Any, Callable, Iterator, Optional, Type, Union, get_args, get_origin +from pydantic import BaseModel from media_toolkit import MediaFile from apipod.common.schemas import * @@ -233,3 +235,64 @@ def iter_media_chunks(media_file: MediaFile, chunk_size: int = 64 * 1024) -> Ite buffer = media_file.to_bytes_io() while chunk := buffer.read(chunk_size): yield chunk + + +# ---------------------------------------------------------------------------- +# Streaming: wrap raw token deltas into standardized chunk SSE events +# ---------------------------------------------------------------------------- + +SSE_DONE = "data: [DONE]\n\n" + + +def _to_sse(chunk: BaseModel) -> str: + """Serialize a chunk model into a single server-sent-event data line.""" + return f"data: {chunk.model_dump_json()}\n\n" + + +def _build_chat_chunk(chunk_id: str, created: int, content: Optional[str], finish_reason: Optional[str]) -> ChatCompletionChunk: + return ChatCompletionChunk( + id=chunk_id, + created=created, + choices=[ChatStreamChoice(index=0, delta=ChatDelta(content=content), finish_reason=finish_reason)], + ) + + +@dataclass(frozen=True) +class StreamChunkSpec: + """How raw token deltas of a streaming schema are wrapped into chunk events.""" + id_prefix: str + build: Callable[[str, int, Optional[str], Optional[str]], BaseModel] + + +# Schema tags whose token stream is wrapped into a standardized chunk SSE stream. +# Endpoints for these tags may simply yield text tokens; APIPod owns the envelope. +STREAM_CHUNK_SPECS: dict[str, StreamChunkSpec] = { + "chat": StreamChunkSpec(id_prefix="chatcmpl", build=_build_chat_chunk), +} + + +class SchemaStreamSerializer: + """ + Turns the raw token deltas yielded by a streaming schema endpoint into its + standardized chunk SSE stream (e.g. ``ChatCompletionChunk``). + + The endpoint only yields text tokens; APIPod owns the envelope: a stable + chunk id, the ``created`` timestamp and the ``object`` discriminator are + generated out of the box, closed by a final delta and the ``[DONE]`` sentinel. + """ + + def __init__(self, binding: SchemaBinding): + spec = STREAM_CHUNK_SPECS.get(binding.tag) + if spec is None: + raise ValueError(f"Schema '{binding.tag}' does not support streaming chunks.") + self._build = spec.build + self._chunk_id = f"{spec.id_prefix}-{uuid.uuid4().hex[:8]}" + self._created = int(datetime.now(timezone.utc).timestamp()) + + def delta(self, content: str) -> str: + """Serialize a content token into a chunk SSE event.""" + return _to_sse(self._build(self._chunk_id, self._created, content, None)) + + def finish(self) -> str: + """Serialize the closing chunk (``finish_reason='stop'``).""" + return _to_sse(self._build(self._chunk_id, self._created, None, "stop")) diff --git a/docs/README_TECH.md b/docs/README_TECH.md index fa7b482..d3de165 100644 --- a/docs/README_TECH.md +++ b/docs/README_TECH.md @@ -107,7 +107,7 @@ Three streaming paths exist today: 1. **Generator endpoints** — any endpoint function that is a (async) generator, or whose return annotation declares an iterator, is served as an SSE `StreamingResponse` (FastAPI) or as a native generator handed back to RunPod (`return_aggregate_stream`). Detection is annotation/inspect-based — no source-code heuristics. 2. **Schema endpoints with `stream=true`** — the request schema carries the `stream` flag (chat, completion, transcription, speech, video generation). Streaming bypasses the queue; what gets streamed depends on what the function returns: - - a **generator**: streamed as-is — SSE for token-delta endpoints (chat/completion/transcription, e.g. `ChatCompletionChunk` events), raw bytes otherwise; + - a **generator of raw tokens**: for tags with a registered chunk model (`STREAM_CHUNK_SPECS`, currently `chat`), `SchemaStreamSerializer` wraps each token into the standardized chunk model (`ChatCompletionChunk`) as an SSE event — APIPod generates the stable chunk `id`, the `created` timestamp and the `object` discriminator, then closes with a final delta and the `[DONE]` sentinel. The endpoint only yields text. Other token-delta tags without a chunk model stream their tokens as-is (SSE), and non-SSE tags stream raw bytes; - an **`AudioFile`/`VideoFile`**: its encoded bytes are chunked into a `StreamingResponse` with the file's media content type — raw audio chunks, not SSE, matching OpenAI's `stream_format="audio"` behavior; - anything else: the regular wrapped JSON response (the endpoint cannot stream). On RunPod the same logic applies, but chunks pass through `_yield_native_stream`, which base64-encodes binary chunks because RunPod transports JSON. diff --git a/test/llm/test_llm_mock.py b/test/llm/test_llm_mock.py index fb09cfc..3e96e2c 100644 --- a/test/llm/test_llm_mock.py +++ b/test/llm/test_llm_mock.py @@ -6,7 +6,6 @@ from typing import List, Union from datetime import datetime import time -import uuid import random from apipod import APIPod @@ -91,7 +90,6 @@ def chat_logic(payload: schemas.ChatCompletionRequest): completion_tokens = len(response_text.split()) * 2 return schemas.ChatCompletionResponse( - id=f"chatcmpl-{uuid.uuid4().hex[:8]}", object="chat.completion", created=int(datetime.now().timestamp()), model=payload.model or state.model.model_name, @@ -153,55 +151,19 @@ def embeddings_logic(payload: schemas.EmbeddingRequest): @app.endpoint(path="/chat") def chat_endpoint(payload: schemas.ChatCompletionRequest): """Chat completion endpoint with streaming support.""" + if state.model is None: + raise RuntimeError("Model not initialized") + if payload.stream: - def sse_generator(): - if state.model is None: - state.model = MockModel("mock-model-v1") - - chunk_id = f"chatcmpl-{uuid.uuid4().hex[:8]}" - created_time = int(datetime.now().timestamp()) - model_name = payload.model or state.model.model_name - - for token in state.model.stream_generate( - messages=payload.messages, - temperature=payload.temperature, - max_tokens=payload.max_tokens - ): - chunk = schemas.ChatCompletionChunk( - id=chunk_id, - object="chat.completion.chunk", - created=created_time, - model=model_name, - choices=[ - schemas.ChatStreamChoice( - index=0, - delta=schemas.ChatDelta(content=token), - finish_reason=None - ) - ] - ) - yield f"data: {chunk.model_dump_json()}\n\n" - - # Final chunk - final_chunk = schemas.ChatCompletionChunk( - id=chunk_id, - object="chat.completion.chunk", - created=created_time, - model=model_name, - choices=[ - schemas.ChatStreamChoice( - index=0, - delta=schemas.ChatDelta(content=None), - finish_reason="stop" - ) - ] - ) - yield f"data: {final_chunk.model_dump_json()}\n\n" - yield "data: [DONE]\n\n" - - return sse_generator() - else: - return chat_logic(payload) + # Just yield raw tokens — APIPod wraps each into a ChatCompletionChunk SSE + # event and emits the closing chunk + [DONE] sentinel out of the box. + return state.model.stream_generate( + messages=payload.messages, + temperature=payload.temperature, + max_tokens=payload.max_tokens, + ) + + return chat_logic(payload) @app.endpoint(path="/embeddings") def embeddings_endpoint(payload: schemas.EmbeddingRequest): From bf551e4981cce4862b6ad938db6a010d949c3c32 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Sun, 14 Jun 2026 16:41:28 +0200 Subject: [PATCH 11/38] updated the runpod router. Layed out the streaming_store for local apipod mimicking. Implented streaming capabilities for media files. Implemented auto-chunking. --- apipod/__init__.py | 4 + apipod/api.py | 16 +- apipod/engine/backend/fastapi/router.py | 284 +++--------------- .../engine/backend/fastapi/streaming_mixin.py | 171 +++++++++++ apipod/engine/backend/runpod/router.py | 158 +++++----- apipod/engine/backend/schema_resolve.py | 9 +- apipod/engine/endpoint_config.py | 107 ++++--- apipod/engine/jobs/base_job.py | 1 + apipod/engine/jobs/job_result.py | 2 + apipod/engine/queue/job_queue.py | 57 +++- apipod/engine/streaming/__init__.py | 21 ++ apipod/engine/streaming/local_stream_store.py | 142 +++++++++ apipod/engine/streaming/stream_producer.py | 33 ++ apipod/engine/streaming/stream_serializer.py | 156 ++++++++++ apipod/engine/streaming/stream_store.py | 110 +++++++ docs/README_TECH.md | 17 +- .../test_clients_six_schemas.py | 0 .../test_service_six_schemas.py | 0 test/test_streaming.py | 188 ++++++++++++ 19 files changed, 1122 insertions(+), 354 deletions(-) create mode 100644 apipod/engine/backend/fastapi/streaming_mixin.py create mode 100644 apipod/engine/streaming/__init__.py create mode 100644 apipod/engine/streaming/local_stream_store.py create mode 100644 apipod/engine/streaming/stream_producer.py create mode 100644 apipod/engine/streaming/stream_serializer.py create mode 100644 apipod/engine/streaming/stream_store.py rename {examples => test}/test_clients_six_schemas.py (100%) rename {examples => test}/test_service_six_schemas.py (100%) create mode 100644 test/test_streaming.py diff --git a/apipod/__init__.py b/apipod/__init__.py index 402e0d9..6582334 100644 --- a/apipod/__init__.py +++ b/apipod/__init__.py @@ -2,6 +2,7 @@ from apipod.engine.jobs.base_job import BaseJob, LocalJob from apipod.engine.jobs.job_progress import JobProgress from apipod.engine.jobs.job_result import FileModel, JobLinks, JobMetrics, JobResult +from apipod.engine.streaming import StreamStore, LocalStreamStore, StreamProducer from media_toolkit import MediaFile, ImageFile, AudioFile, VideoFile, MediaList, MediaDict from apipod.common import constants @@ -25,6 +26,9 @@ "JobLinks", "JobMetrics", "JobResult", + "StreamStore", + "LocalStreamStore", + "StreamProducer", "MediaFile", "ImageFile", "AudioFile", diff --git a/apipod/api.py b/apipod/api.py index 2bd0b81..e95f726 100644 --- a/apipod/api.py +++ b/apipod/api.py @@ -54,9 +54,17 @@ def APIPod( use_job_queue = True job_queue = custom_job_queue else: - job_queue = _create_job_queue() if use_job_queue else None + from apipod.engine.queue.job_queue import JobQueue + job_queue = JobQueue() if use_job_queue else None if backend_class == SocaityFastAPIRouter: + # Streaming (serverless emulation): when a queue runs, the worker relays + # streaming output into a stream store consumed via GET /stream/{job_id}. + # Default to the in-memory LocalStreamStore; a deployment can inject its + # own (e.g. Redis-backed) store. Plain FastAPI (no queue) streams directly + # and uses no stream store. + if use_job_queue and "stream_store" not in kwargs: + kwargs["stream_store"] = _create_stream_store() return backend_class(job_queue=job_queue, *args, **kwargs) else: return backend_class(*args, **kwargs) @@ -146,3 +154,9 @@ def _create_job_queue() -> JobQueueInterface: from apipod.engine.queue.job_queue import JobQueue return JobQueue() + + +def _create_stream_store(): + from apipod.engine.streaming.local_stream_store import LocalStreamStore + + return LocalStreamStore() diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index 87b0c33..b9859e9 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -3,34 +3,26 @@ import threading import logging from contextlib import asynccontextmanager -from collections.abc import AsyncIterator, Iterator -from typing import Any, Union, Callable, get_origin, get_type_hints -from fastapi import APIRouter, FastAPI, Request, Response, status +from typing import Union, Callable +from fastapi import APIRouter, FastAPI, Response, status from fastapi.exceptions import HTTPException -from fastapi.responses import JSONResponse, StreamingResponse +from fastapi.responses import JSONResponse from apipod.common.settings import APIPOD_PORT, APIPOD_HOST from apipod.common.constants import SERVER_HEALTH from apipod.engine.jobs.job_result import JobResultFactory, JobResult -from apipod.engine.endpoint_config import FastApiEndpointConfigurator, EndpointExecutionPlan +from apipod.engine.endpoint_config import build_plan, EndpointExecutionPlan +from apipod.engine.streaming.stream_serializer import build_stream_producer from apipod.engine.base_backend import _BaseBackend from apipod.engine.queue.queue_mixin import _QueueMixin from apipod.engine.backend.fastapi.file_handling_mixin import _fast_api_file_handling_mixin +from apipod.engine.backend.fastapi.streaming_mixin import _FastAPIStreamingMixin from apipod.engine.utils import normalize_name from apipod.engine.backend.fastapi.exception_handling import _FastAPIExceptionHandler -from apipod.engine.backend.schema_resolve import ( - SchemaBinding, - SchemaStreamSerializer, - SSE_DONE, - SSE_STREAM_TAGS, - STREAM_CHUNK_SPECS, - iter_media_chunks, - wrap_schema_response, -) -from media_toolkit import AudioFile, VideoFile - - -class SocaityFastAPIRouter(APIRouter, _BaseBackend, _QueueMixin, _fast_api_file_handling_mixin, _FastAPIExceptionHandler): +from apipod.engine.backend.schema_resolve import wrap_schema_response + + +class SocaityFastAPIRouter(APIRouter, _BaseBackend, _QueueMixin, _fast_api_file_handling_mixin, _FastAPIStreamingMixin, _FastAPIExceptionHandler): """ FastAPI router extension that adds support for task endpoints. @@ -108,9 +100,15 @@ def __init__( self.prefix = prefix self.stream_store = stream_store self.gateway_stream_url_prefix = gateway_stream_url_prefix - self.add_standard_routes() - self._endpoint_configurator = FastApiEndpointConfigurator(self) + # Let the queue produce streaming job output into the stream store so a + # client can consume it via GET /stream/{job_id} (serverless emulation). + if self.job_queue is not None and self.stream_store is not None: + set_store = getattr(self.job_queue, "set_stream_store", None) + if callable(set_store): + set_store(self.stream_store) + + self.add_standard_routes() # Exception handling _FastAPIExceptionHandler.__init__(self) @@ -264,47 +262,6 @@ def post_cancel_job(self, job_id: str) -> dict: ) from None return {"id": job_id, "status": "cancelled", "message": "Job cancelled."} - async def stream_job_sse(self, job_id: str, request: Request): - """Server-Sent Events for streaming job output (requires stream_store).""" - job_id = job_id.strip().strip('"').strip("'").strip("?").strip("#") - if self.stream_store is None: - raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="Streaming not configured.") - if self.job_queue is None: - raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="Job queue not configured.") - - jq = self.job_queue - job_data = jq.get_job_status(job_id) if hasattr(jq, "get_job_status") else None - - if job_data is None: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Job '{job_id}' not found.") - - st = (job_data.get("status") or "").lower() - if st != "streaming" and not self.stream_store.stream_exists(job_id): - raise HTTPException( - status_code=status.HTTP_409_CONFLICT, - detail=f"Job '{job_id}' is not streaming (status: {job_data.get('status')}).", - ) - - async def _event_generator(): - try: - async for chunk in self.stream_store.read_chunks(job_id): - if await request.is_disconnected(): - break - yield chunk - except Exception: - self._logger.exception("Error during stream delivery | job_id=%s", job_id) - yield 'data: {"error": "Internal stream error"}\n\n' - - return StreamingResponse( - _event_generator(), - media_type="text/event-stream", - headers={ - "Cache-Control": "no-cache", - "Connection": "keep-alive", - "X-Accel-Buffering": "no", - }, - ) - def endpoint(self, path: str, methods: list[str] | None = None, max_upload_file_size_mb: int = None, queue_size: int = 500, use_queue: bool = None, *args, **kwargs): """ Unified endpoint decorator. @@ -325,18 +282,22 @@ def endpoint(self, path: str, methods: list[str] | None = None, max_upload_file_ should_use_queue = self._determine_queue_usage(use_queue, normalized_path) def decorator(func: Callable) -> Callable: - plan = self._create_endpoint_plan( - func=func, - normalized_path=normalized_path, + plan = build_plan( + func, + path=normalized_path, methods=methods, max_upload_file_size_mb=max_upload_file_size_mb, queue_size=queue_size, should_use_queue=should_use_queue, route_args=args, - route_kwargs=kwargs + route_kwargs=kwargs, ) - if plan.is_streaming: + # Streaming with a queue + stream store mimics a real deployment: + # the job is queued, the worker produces chunks into the stream store + # and the client consumes them from GET /stream/{job_id}. Without a + # queue (plain FastAPI) streaming goes straight to the client. + if plan.is_streaming and not plan.should_use_queue: return self._create_streaming_endpoint_decorator(plan)(func) if plan.should_use_queue: return self._create_task_endpoint_decorator(plan)(func) @@ -345,85 +306,6 @@ def decorator(func: Callable) -> Callable: return decorator - def _create_endpoint_plan( - self, - *, - func: Callable, - normalized_path: str, - methods: list[str] | None, - max_upload_file_size_mb: int | None, - queue_size: int, - should_use_queue: bool, - route_args: tuple, - route_kwargs: dict, - ) -> EndpointExecutionPlan: - """Build an orchestration plan for endpoint registration and execution.""" - return self._endpoint_configurator.build_plan( - func=func, - path=normalized_path, - methods=methods, - max_upload_file_size_mb=max_upload_file_size_mb, - queue_size=queue_size, - should_use_queue=should_use_queue, - route_args=route_args, - route_kwargs=route_kwargs, - ) - - async def _execute_func(self, func, **kwargs): - """ - Execute a function, handling both sync and async functions. - - Args: - func: Function to execute - **kwargs: Arguments to pass to function - - Returns: - Result of function execution - """ - if inspect.iscoroutinefunction(func): - return await func(**kwargs) - else: - # Sync function - run in thread pool to avoid blocking - import asyncio - loop = asyncio.get_event_loop() - return await loop.run_in_executor(None, functools.partial(func, **kwargs)) - - async def _stream_generator(self, result): - """ - Convert a sync or async generator into an async generator for StreamingResponse. - - Args: - result: Generator (sync or async) that yields streaming chunks - - Yields: - Streaming chunks as strings or bytes - """ - import asyncio - - if inspect.isasyncgen(result): - # Async generator - yield directly - async for chunk in result: - if isinstance(chunk, (str, bytes)): - yield chunk - else: - yield str(chunk) - elif inspect.isgenerator(result): - # Sync generator - run in executor - loop = asyncio.get_event_loop() - try: - while True: - chunk = await loop.run_in_executor(None, next, result, StopIteration) - if chunk is StopIteration: - break - if isinstance(chunk, (str, bytes)): - yield chunk - else: - yield str(chunk) - except StopIteration: - pass - else: - raise TypeError(f"Expected generator, got {type(result)}") - def _normalize_endpoint_path(self, path: str) -> str: """Normalize the endpoint path to ensure it starts with '/'.""" normalized = normalize_name(path, preserve_paths=True) @@ -439,81 +321,32 @@ def _determine_queue_usage(self, use_queue: bool = None, path: str = None) -> bo return self.job_queue is not None - def _is_streaming_endpoint(self, func: Callable) -> bool: - """ - Determine whether the function streams its output: it is a (async) - generator function, or its return annotation declares an iterator. - """ - target = inspect.unwrap(func) - if inspect.isgeneratorfunction(target) or inspect.isasyncgenfunction(target): - return True - - try: - return_type = get_type_hints(target).get('return') - except Exception: - return False - - if return_type is None: - return False - - origin = get_origin(return_type) or return_type - return inspect.isclass(origin) and issubclass(origin, (Iterator, AsyncIterator)) - - def _as_streaming_response(self, result: Any, binding: SchemaBinding) -> StreamingResponse | None: - """ - Build a :class:`StreamingResponse` if a schema endpoint result is streamable: - - ``AudioFile`` / ``VideoFile`` stream their encoded bytes as raw chunks - with the proper media content type (OpenAI ``stream_format="audio"``); - - generators of raw tokens are wrapped into the schema's standardized chunk - SSE stream (e.g. ``ChatCompletionChunk``) when one is registered, else - streamed as-is: SSE for token-delta endpoints, raw bytes otherwise. - Returns ``None`` when the result cannot be streamed. - """ - if isinstance(result, (AudioFile, VideoFile)): - media_type = getattr(result, "content_type", None) or "application/octet-stream" - return StreamingResponse(iter_media_chunks(result), media_type=media_type) - - if inspect.isgenerator(result) or inspect.isasyncgen(result): - if binding.tag in STREAM_CHUNK_SPECS: - generator = self._schema_chunk_stream(result, binding) - else: - generator = self._stream_generator(result) - media_type = "text/event-stream" if binding.tag in SSE_STREAM_TAGS else "application/octet-stream" - return StreamingResponse( - generator, - media_type=media_type, - headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}, - ) - - return None - - async def _schema_chunk_stream(self, result: Any, binding: SchemaBinding) -> AsyncIterator[str]: - """Wrap raw token deltas into the schema's standardized chunk SSE stream.""" - serializer = SchemaStreamSerializer(binding) - async for token in self._stream_generator(result): - yield serializer.delta(token) - yield serializer.finish() - yield SSE_DONE - # ------------------------------------------------------------------ # Endpoint decorators (task / standard / streaming) # ------------------------------------------------------------------ - def _modify_result_decorator(self, func: Callable, plan: EndpointExecutionPlan) -> Callable: + def _modify_result_decorator(self, func: Callable, plan: EndpointExecutionPlan, *, queued: bool) -> Callable: """ - Wraps responses of schema endpoints into their declared response format. + Wraps endpoint responses into their final transport form. + + Streamable results (a token/chunk generator) become a stream: + - ``queued`` (job queue): a :class:`StreamProducer` is returned so the + worker relays chunks into the stream store (consumed via /stream) while + aggregating the full result for /status; + - direct (no queue): a :class:`StreamingResponse` is returned to the client. - Streaming results (a token generator or media file) are turned into the - schema's standardized SSE/byte stream; everything else is wrapped into the - response model and serialized (media files -> JSON). + Non-streaming schema results are wrapped into the response model; all + results are then serialized (media files -> JSON). """ @functools.wraps(func) def sync_wrapper(*args, **kwargs): result = func(*args, **kwargs) + + producer = build_stream_producer(result, plan.schema_binding) + if producer is not None: + return producer if queued else self._streaming_response_from_producer(producer) + binding = plan.schema_binding if binding is not None: - streaming = self._as_streaming_response(result, binding) - if streaming is not None: - return streaming result = wrap_schema_response(result, binding) return JobResultFactory._serialize_result(result) return sync_wrapper @@ -540,7 +373,7 @@ def _create_task_endpoint_decorator(self, plan: EndpointExecutionPlan): ) def decorator(func: Callable) -> Callable: - func = self._modify_result_decorator(func, plan) + func = self._modify_result_decorator(func, plan, queued=True) # Add job queue functionality and prepare for FastAPI file handling queue_decorated = queue_decorator(func) # Register the function so workers can execute it (dev mode). @@ -565,41 +398,12 @@ def _create_standard_endpoint_decorator(self, plan: EndpointExecutionPlan): ) def decorator(func: Callable) -> Callable: - result_modified = self._modify_result_decorator(func, plan) + result_modified = self._modify_result_decorator(func, plan, queued=False) with_file_upload_signature = self._prepare_func_for_media_file_upload_with_fastapi(result_modified, plan.max_upload_file_size_mb) return fastapi_route_decorator(with_file_upload_signature) return decorator - def _create_streaming_endpoint_decorator(self, plan: EndpointExecutionPlan): - """Create a decorator for streaming endpoints.""" - kwargs = dict(plan.route_kwargs) - custom_headers = kwargs.pop('response_headers', None) - - fastapi_route_decorator = self.api_route( - path=plan.path, - methods=plan.active_methods, - *plan.route_args, - **kwargs - ) - - def decorator(func: Callable) -> Callable: - @functools.wraps(func) - async def streaming_wrapper(*w_args, **w_kwargs): - result = await self._execute_func(func, *w_args, **w_kwargs) - generator = self._stream_generator(result) - - headers = {"Cache-Control": "no-cache", "X-Accel-Buffering": "no"} - if custom_headers: - headers.update(custom_headers) - - return StreamingResponse(generator, media_type="text/event-stream", headers=headers) - - with_file_upload_signature = self._prepare_func_for_media_file_upload_with_fastapi(streaming_wrapper, plan.max_upload_file_size_mb) - return fastapi_route_decorator(with_file_upload_signature) - - return decorator - def get(self, path: str = None, queue_size: int = 100, *args, **kwargs): """ Create a GET endpoint. diff --git a/apipod/engine/backend/fastapi/streaming_mixin.py b/apipod/engine/backend/fastapi/streaming_mixin.py new file mode 100644 index 0000000..24642d8 --- /dev/null +++ b/apipod/engine/backend/fastapi/streaming_mixin.py @@ -0,0 +1,171 @@ +""" +FastAPI-specific streaming transport, factored out of the router. + +This mixin owns the FastAPI-side mechanics for turning a streaming endpoint +result into an HTTP response: + +- ``_execute_func`` — run a sync or async function without blocking the event loop; +- ``_stream_generator`` — adapt a sync/async generator into an async generator + for :class:`StreamingResponse` (direct non-queued path); +- ``_streaming_response_from_producer`` — build a :class:`StreamingResponse` from + a :class:`StreamProducer` (direct non-queued path); +- ``_create_streaming_endpoint_decorator`` — register a plain generator endpoint + directly on the FastAPI router (direct non-queued path); +- ``stream_job_sse`` — SSE consumer route ``GET /stream/{job_id}`` that replays + a queued job's chunks from the stream store. + +Serialization details (encoding, aggregation, producer construction) live in +:mod:`apipod.engine.streaming.stream_serializer`; endpoint introspection and +plan building live in :mod:`apipod.engine.endpoint_config`. + +The mixin carries no state and needs no ``__init__``. +""" + +import asyncio +import functools +import inspect +from typing import Callable + +from fastapi import Request, status +from fastapi.exceptions import HTTPException +from fastapi.responses import StreamingResponse + +from apipod.engine.endpoint_config import EndpointExecutionPlan +from apipod.engine.streaming.stream_producer import StreamProducer + + +# Sentinel marking the end of a synchronous iterator drained via run_in_executor. +_STREAM_END = object() + + +class _FastAPIStreamingMixin: + """FastAPI streaming transport helpers mixed into the FastAPI router.""" + + # ------------------------------------------------------------------ + # Execution helpers + # ------------------------------------------------------------------ + + async def _execute_func(self, func, **kwargs): + """Execute a function, handling both sync and async callables.""" + if inspect.iscoroutinefunction(func): + return await func(**kwargs) + loop = asyncio.get_event_loop() + return await loop.run_in_executor(None, functools.partial(func, **kwargs)) + + async def _stream_generator(self, result): + """Adapt a sync or async generator into an async generator for StreamingResponse.""" + if inspect.isasyncgen(result): + async for chunk in result: + yield chunk if isinstance(chunk, (str, bytes)) else str(chunk) + elif inspect.isgenerator(result): + loop = asyncio.get_event_loop() + while True: + chunk = await loop.run_in_executor(None, next, result, _STREAM_END) + if chunk is _STREAM_END: + break + yield chunk if isinstance(chunk, (str, bytes)) else str(chunk) + else: + raise TypeError(f"Expected generator, got {type(result)}") + + # ------------------------------------------------------------------ + # Direct streaming (non-queued) + # ------------------------------------------------------------------ + + def _streaming_response_from_producer(self, producer: StreamProducer) -> StreamingResponse: + """Build a direct :class:`StreamingResponse` from a producer (non-queued path).""" + async def _event_generator(): + loop = asyncio.get_event_loop() + iterator = iter(producer.raw_chunks) + while True: + item = await loop.run_in_executor(None, next, iterator, _STREAM_END) + if item is _STREAM_END: + break + yield producer.to_chunk(item) + for closing_chunk in producer.closing: + yield closing_chunk + + return StreamingResponse( + _event_generator(), + media_type=producer.media_type, + headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}, + ) + + def _create_streaming_endpoint_decorator(self, plan: EndpointExecutionPlan): + """Register a plain generator endpoint served directly to the client (no queue).""" + kwargs = dict(plan.route_kwargs) + custom_headers = kwargs.pop("response_headers", None) + + fastapi_route_decorator = self.api_route( + path=plan.path, + methods=plan.active_methods, + *plan.route_args, + **kwargs, + ) + + def decorator(func: Callable) -> Callable: + @functools.wraps(func) + async def streaming_wrapper(*w_args, **w_kwargs): + result = await self._execute_func(func, *w_args, **w_kwargs) + generator = self._stream_generator(result) + + headers = {"Cache-Control": "no-cache", "X-Accel-Buffering": "no"} + if custom_headers: + headers.update(custom_headers) + + return StreamingResponse(generator, media_type="text/event-stream", headers=headers) + + with_upload = self._prepare_func_for_media_file_upload_with_fastapi( + streaming_wrapper, plan.max_upload_file_size_mb + ) + return fastapi_route_decorator(with_upload) + + return decorator + + # ------------------------------------------------------------------ + # SSE consumer route (queued jobs) + # ------------------------------------------------------------------ + + async def stream_job_sse(self, job_id: str, request: Request): + """Server-Sent Events consumer for a queued streaming job (requires stream_store).""" + job_id = job_id.strip().strip('"').strip("'").strip("?").strip("#") + if self.stream_store is None: + raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="Streaming not configured.") + if self.job_queue is None: + raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="Job queue not configured.") + + jq = self.job_queue + job_data = jq.get_job_status(job_id) if hasattr(jq, "get_job_status") else None + stream_open = self.stream_store.stream_exists(job_id) + + # Serve the stream even when the job record is already gone (completed + + # cleaned up) as long as the stream is still draining. + if job_data is None and not stream_open: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Job '{job_id}' not found.") + + # Allow any not-yet-finished state; read_chunks waits for the producer. + st = ((job_data.get("status") if job_data else "") or "").lower() + if not stream_open and st not in {"pending", "processing", "streaming"}: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail=f"Job '{job_id}' is not streaming (status: {st or 'unknown'}).", + ) + + async def _event_generator(): + try: + async for chunk in self.stream_store.read_chunks(job_id): + if await request.is_disconnected(): + break + yield chunk + except Exception: + self._logger.exception("Error during stream delivery | job_id=%s", job_id) + yield 'data: {"error": "Internal stream error"}\n\n' + + return StreamingResponse( + _event_generator(), + media_type="text/event-stream", + headers={ + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "X-Accel-Buffering": "no", + }, + ) diff --git a/apipod/engine/backend/runpod/router.py b/apipod/engine/backend/runpod/router.py index 6ed2b37..33b6392 100644 --- a/apipod/engine/backend/runpod/router.py +++ b/apipod/engine/backend/runpod/router.py @@ -1,24 +1,35 @@ import asyncio -import base64 import functools import inspect import traceback from datetime import datetime, timezone -from typing import Union, Callable +from typing import Union, Callable, Iterator from apipod.common import constants from apipod.engine.jobs.base_job import JOB_STATUS from apipod.engine.jobs.job_progress import JobProgressRunpod, JobProgress -from apipod.engine.jobs.job_result import JobResultFactory, JobResult +from apipod.engine.jobs.job_result import ( + JobResultFactory, + JobResult, + JobMetrics, + _compute_duration_s, + _job_status_to_public, +) from apipod.engine.base_backend import _BaseBackend +from apipod.engine.endpoint_config import build_plan, EndpointExecutionPlan from apipod.engine.files.base_file_mixin import _BaseFileHandlingMixin from apipod.engine.backend.schema_resolve import ( + SchemaBinding, + SchemaStreamSerializer, + STREAM_CHUNK_SPECS, iter_media_chunks, + prepare_schema_call, wrap_schema_response, ) +from apipod.engine.streaming.stream_serializer import as_sync_iter, encode_chunk, is_streaming_result from apipod.engine.utils import normalize_name -from apipod.common.settings import APIPOD_PROVIDER, APIPOD_PORT, DEFAULT_DATE_TIME_FORMAT +from apipod.common.settings import APIPOD_PROVIDER, APIPOD_PORT from media_toolkit import AudioFile, VideoFile @@ -41,62 +52,75 @@ def endpoint(self, path: str = None, use_queue: bool = None, *args, **kwargs): path = normalize_name(path, preserve_paths=True).strip("/") def decorator(func: Callable) -> Callable: - # binding = get_schema_binding(func) + plan = build_plan(func, path=path) + route = self._build_route(func, plan) + self.routes[path] = route + return route + return decorator - @functools.wraps(func) - def wrapper(*w_args, **w_kwargs): - self.status = constants.SERVER_HEALTH.BUSY - try: - # if binding is None: - # return self._execute_sync_or_async(func, w_args, w_kwargs) + def _build_route(self, func: Callable, plan: EndpointExecutionPlan) -> Callable: + """ + Compose the callable registered for a route from its execution plan. - # request = prepare_schema_call(binding, w_kwargs) - result = self._execute_sync_or_async(func, w_args, w_kwargs) + Schema endpoints validate + media-parse their request themselves; plain + endpoints get the generic media file-upload conversion wrapped in. + """ + @functools.wraps(func) + def wrapper(*w_args, **w_kwargs): + self.status = constants.SERVER_HEALTH.BUSY + try: + if plan.is_schema_endpoint: + return self._handle_schema_request(func, plan.schema_binding, w_args, w_kwargs) + result = self._execute_sync_or_async(func, w_args, w_kwargs) + # Plain generator endpoints stream too: turn the generator into a + # RunPod-native stream of JSON-safe chunks (RunPod aggregates it). + native_stream = self._as_native_stream(result) + return native_stream if native_stream is not None else result + finally: + self.status = constants.SERVER_HEALTH.RUNNING - if getattr(request, "stream", False): - if isinstance(result, (AudioFile, VideoFile)): - return self._yield_native_stream(iter_media_chunks(result)) - if inspect.isgenerator(result) or inspect.isasyncgen(result): - return self._yield_native_stream(result) + return wrapper if plan.is_schema_endpoint else self._handle_file_uploads(wrapper) - return wrap_schema_response(result, binding) - finally: - self.status = constants.SERVER_HEALTH.RUNNING + # ------------------------------------------------------------------ + # Standardized schema endpoints + # ------------------------------------------------------------------ + def _handle_schema_request(self, func: Callable, binding: SchemaBinding, args: tuple, kwargs: dict): + """ + Run a standardized schema endpoint: validate + media-parse the request + (``prepare_schema_call``), then stream or wrap the response into the + registered response model (``wrap_schema_response``). + """ + request = prepare_schema_call(binding, kwargs) + result = self._execute_sync_or_async(func, args, kwargs) - self.routes[path] = wrapper - return wrapper - return decorator + if getattr(request, "stream", False): + native_stream = self._as_native_stream(result, binding) + if native_stream is not None: + return native_stream - @staticmethod - def _encode_stream_chunk(chunk) -> str: - """RunPod transports everything as JSON: binary chunks are base64-encoded.""" - if isinstance(chunk, bytes): - return base64.b64encode(chunk).decode("ascii") - return chunk if isinstance(chunk, str) else str(chunk) + return wrap_schema_response(result, binding) - def _yield_native_stream(self, result): - """Bridge a stream result (sync/async generator or StreamingResponse) into RunPod's native stream.""" - from starlette.responses import StreamingResponse + def _as_native_stream(self, result, binding: Union[SchemaBinding, None] = None) -> Union[Iterator, None]: + """ + Wrap a streamable result into a RunPod-native generator of JSON-safe chunks. - # If it's a StreamingResponse (shouldn't happen in RunPod, but handle it) - if isinstance(result, StreamingResponse): - result = result.body_iterator + - ``AudioFile`` / ``VideoFile`` → base64-encoded byte chunks; + - schema generator with a registered chunk model (e.g. chat) → standardized + ``ChatCompletionChunk`` stream via :class:`SchemaStreamSerializer`; + - any other generator → ``encode_chunk`` (base64 for binary, str for text). - if inspect.isasyncgen(result): - while True: - try: - yield self._encode_stream_chunk(self._run_in_loop(result.__anext__())) - except StopAsyncIteration: - break - return + Returns ``None`` when the result is not streamable. + """ + if isinstance(result, (AudioFile, VideoFile)): + return (encode_chunk(chunk) for chunk in iter_media_chunks(result)) - if inspect.isgenerator(result) or hasattr(result, "__iter__"): - for chunk in result: - yield self._encode_stream_chunk(chunk) - return + if is_streaming_result(result): + tokens = as_sync_iter(result) + if binding is not None and binding.tag in STREAM_CHUNK_SPECS: + return SchemaStreamSerializer(binding).stream(tokens) + return (encode_chunk(chunk) for chunk in tokens) - # Not a generator - shouldn't happen for streaming - raise TypeError(f"Expected generator for streaming, got {type(result)}") + return None def _execute_sync_or_async(self, func, args, kwargs): if inspect.iscoroutinefunction(func): @@ -172,15 +196,8 @@ def _router(self, path, job, **kwargs): if missing_args: raise Exception(f"Arguments {missing_args} are missing") - # Handle file uploads and conversions - route_function = self._handle_file_uploads(route_function) - - # Prepare result tracking start_time = datetime.now(timezone.utc) - result = JobResult( - job_id=job["id"], - created_at=start_time.strftime(DEFAULT_DATE_TIME_FORMAT), - ) + result = JobResult(job_id=job["id"], endpoint=path) try: # Execute the function (Sync or Async Handling) @@ -196,33 +213,40 @@ def _router(self, path, job, **kwargs): res = JobResultFactory._serialize_result(res) result.result = res - result.status = JOB_STATUS.FINISHED.value + result.status = _job_status_to_public(JOB_STATUS.FINISHED) except Exception as e: result.error = str(e) - result.status = JOB_STATUS.FAILED.value + result.status = _job_status_to_public(JOB_STATUS.FAILED) print(f"Job {job['id']} failed: {str(e)}") traceback.print_exc() - finally: - result.updated_at = datetime.now(timezone.utc).strftime(DEFAULT_DATE_TIME_FORMAT) - result = result.model_dump_json() - return result + for arg in kwargs.values(): + if isinstance(arg, JobProgressRunpod): + result.progress = float(arg._progress) + result.message = arg._message + break + + inference_time_s = _compute_duration_s(start_time, datetime.now(timezone.utc)) + if inference_time_s is not None: + result.metrics = JobMetrics(inference_time_s=inference_time_s) + + return result.model_dump_json(exclude_none=True) def _execute_route_function(self, route_function, kwargs): """ Execute a route function, handling both sync and async functions. - + Args: route_function: The function to execute kwargs: Keyword arguments to pass to the function - + Returns: The result of the function execution """ if not inspect.iscoroutinefunction(route_function): # Synchronous function - simple execution return route_function(**kwargs) - + # Async function - need event loop handling try: loop = asyncio.get_event_loop() @@ -459,4 +483,4 @@ def start(self, port: int = APIPOD_PORT, provider: Union[constants.PROVIDER, str self.start_runpod_serverless_localhost(port=port) else: import runpod.serverless - runpod.serverless.start({"handler": self.handler, "return_aggregate_stream": True}) + runpod.serverless.start({"handler": self.handler, "return_aggregate_stream": True}) \ No newline at end of file diff --git a/apipod/engine/backend/schema_resolve.py b/apipod/engine/backend/schema_resolve.py index e8821f0..5f7d4e6 100644 --- a/apipod/engine/backend/schema_resolve.py +++ b/apipod/engine/backend/schema_resolve.py @@ -24,7 +24,7 @@ from dataclasses import dataclass from datetime import datetime, timezone from types import UnionType -from typing import Any, Callable, Iterator, Optional, Type, Union, get_args, get_origin +from typing import Any, Callable, Iterable, Iterator, Optional, Type, Union, get_args, get_origin from pydantic import BaseModel from media_toolkit import MediaFile @@ -296,3 +296,10 @@ def delta(self, content: str) -> str: def finish(self) -> str: """Serialize the closing chunk (``finish_reason='stop'``).""" return _to_sse(self._build(self._chunk_id, self._created, None, "stop")) + + def stream(self, tokens: Iterable[str]) -> Iterator[str]: + """Wrap a synchronous token iterable into the full chunk SSE stream (deltas, closing chunk, [DONE]).""" + for token in tokens: + yield self.delta(token) + yield self.finish() + yield SSE_DONE diff --git a/apipod/engine/endpoint_config.py b/apipod/engine/endpoint_config.py index 225a626..db10bac 100644 --- a/apipod/engine/endpoint_config.py +++ b/apipod/engine/endpoint_config.py @@ -1,5 +1,17 @@ -from dataclasses import dataclass -from typing import Any, Callable +""" +Endpoint planning: backend-neutral analysis of an endpoint function. + +``is_streaming_endpoint`` inspects a function's definition to decide whether +it streams its output. ``build_plan`` combines that with schema detection and +optional backend-specific parameters (queue, upload limits, …) into an +immutable :class:`EndpointExecutionPlan` — the shared contract used by every +backend (FastAPI, RunPod). +""" + +import inspect +from collections.abc import AsyncIterator, Iterator +from dataclasses import dataclass, field +from typing import Any, Callable, get_origin, get_type_hints from apipod.engine.backend.schema_resolve import SchemaBinding, get_schema_binding @@ -10,16 +22,17 @@ class EndpointExecutionPlan: Immutable plan describing how an endpoint should be registered and executed. The plan separates endpoint configuration decisions from router registration - mechanics. This keeps endpoint decorators compact and easier to reason about. + mechanics. Fields that only apply to a specific backend (e.g. queue options) + default to sensible no-ops so every backend can build a plan with what it needs. """ path: str - methods: list[str] | None - should_use_queue: bool - max_upload_file_size_mb: int | None - queue_size: int - route_args: tuple[Any, ...] - route_kwargs: dict[str, Any] + methods: list[str] | None = None + should_use_queue: bool = False + max_upload_file_size_mb: int | None = None + queue_size: int = 500 + route_args: tuple[Any, ...] = () + route_kwargs: dict[str, Any] = field(default_factory=dict) schema_binding: SchemaBinding | None = None is_streaming: bool = False @@ -32,40 +45,52 @@ def active_methods(self) -> list[str]: return ["POST"] if self.methods is None else self.methods -class FastApiEndpointConfigurator: - """ - Builds endpoint execution plans for the FastAPI backend. +def is_streaming_endpoint(func: Callable) -> bool: + """Backend-neutral: True if *func* is a generator or annotated as an Iterator. - This component configures endpoint behavior (schema dispatch, streaming, - queue) independent from provider mechanics (FastAPI routing). + A generator function (``yield``) or async generator function (``async yield``) + is always considered streaming. A regular function whose return annotation + is ``Iterator[...]`` / ``AsyncIterator[...]`` or any subclass is also detected. """ + target = inspect.unwrap(func) + if inspect.isgeneratorfunction(target) or inspect.isasyncgenfunction(target): + return True + try: + return_type = get_type_hints(target).get("return") + except Exception: + return False + if return_type is None: + return False + origin = get_origin(return_type) or return_type + return inspect.isclass(origin) and issubclass(origin, (Iterator, AsyncIterator)) - def __init__(self, router): - self._router = router - def build_plan( - self, - *, - func: Callable, - path: str, - methods: list[str] | None, - max_upload_file_size_mb: int | None, - queue_size: int, - should_use_queue: bool, - route_args: tuple[Any, ...], - route_kwargs: dict[str, Any], - ) -> EndpointExecutionPlan: - schema_binding = get_schema_binding(func) - is_streaming = bool(schema_binding is None and self._router._is_streaming_endpoint(func)) +def build_plan( + func: Callable, + path: str, + *, + methods: list[str] | None = None, + should_use_queue: bool = False, + max_upload_file_size_mb: int | None = None, + queue_size: int = 500, + route_args: tuple[Any, ...] = (), + route_kwargs: dict[str, Any] | None = None, +) -> EndpointExecutionPlan: + """Build a backend-neutral :class:`EndpointExecutionPlan` by inspecting *func*. - return EndpointExecutionPlan( - path=path, - methods=methods, - should_use_queue=should_use_queue, - max_upload_file_size_mb=max_upload_file_size_mb, - queue_size=queue_size, - route_args=route_args, - route_kwargs=route_kwargs, - schema_binding=schema_binding, - is_streaming=is_streaming, - ) + Both the FastAPI and RunPod backends call this. Backend-specific parameters + (``methods``, ``queue_*``, ``route_*``) are optional; they default to no-ops + so RunPod can simply call ``build_plan(func, path=path)``. + """ + schema_binding = get_schema_binding(func) + return EndpointExecutionPlan( + path=path, + methods=methods, + should_use_queue=should_use_queue, + max_upload_file_size_mb=max_upload_file_size_mb, + queue_size=queue_size, + route_args=route_args, + route_kwargs=route_kwargs if route_kwargs is not None else {}, + schema_binding=schema_binding, + is_streaming=schema_binding is None and is_streaming_endpoint(func), + ) diff --git a/apipod/engine/jobs/base_job.py b/apipod/engine/jobs/base_job.py index c4e20e1..655f861 100644 --- a/apipod/engine/jobs/base_job.py +++ b/apipod/engine/jobs/base_job.py @@ -9,6 +9,7 @@ class JOB_STATUS(Enum): QUEUED = "Queued" PROCESSING = "Processing" + STREAMING = "Streaming" FINISHED = "Finished" FAILED = "Failed" TIMEOUT = "Timeout" diff --git a/apipod/engine/jobs/job_result.py b/apipod/engine/jobs/job_result.py index b380970..8523f90 100644 --- a/apipod/engine/jobs/job_result.py +++ b/apipod/engine/jobs/job_result.py @@ -20,6 +20,7 @@ def _job_status_to_public(status: Any) -> Optional[str]: return { JOB_STATUS.QUEUED: "pending", JOB_STATUS.PROCESSING: "processing", + JOB_STATUS.STREAMING: "streaming", JOB_STATUS.FINISHED: "completed", JOB_STATUS.FAILED: "failed", JOB_STATUS.TIMEOUT: "failed", @@ -30,6 +31,7 @@ def _job_status_to_public(status: Any) -> Optional[str]: "queued": "pending", "pending": "pending", "processing": "processing", + "streaming": "streaming", "finished": "completed", "completed": "completed", "failed": "failed", diff --git a/apipod/engine/queue/job_queue.py b/apipod/engine/queue/job_queue.py index 5aa6f0c..1628d49 100644 --- a/apipod/engine/queue/job_queue.py +++ b/apipod/engine/queue/job_queue.py @@ -6,7 +6,9 @@ from apipod.engine.queue.job_store import JobStore from apipod.engine.jobs.base_job import BaseJob, LocalJob, JOB_STATUS +from apipod.engine.jobs.job_result import _job_status_to_public from apipod.engine.queue.job_queue_interface import JobQueueInterface +from apipod.engine.streaming.stream_producer import StreamProducer import inspect T = TypeVar('T', bound=BaseJob) @@ -35,6 +37,21 @@ def __init__(self, delete_orphan_jobs_after_s: int = 60 * 30): self._shutdown = threading.Event() self._job_threads: Dict[str, threading.Thread] = {} self._delete_orphan_jobs_after_seconds = delete_orphan_jobs_after_s + # Optional StreamStore. When set, generator/streaming jobs produce their + # chunks into the store (so a client can consume GET /stream/{job_id}) + # while still aggregating the full result for GET /status/{job_id}. + self._stream_store = None + + def set_stream_store(self, stream_store) -> None: + """Attach a :class:`StreamStore` used to relay streaming job output.""" + self._stream_store = stream_store + + def get_job_status(self, job_id: str) -> Optional[dict]: + """Lightweight status lookup that never removes the job (used by /stream).""" + job = self.job_store.get_job(job_id) + if job is None: + return None + return {"id": job_id, "status": _job_status_to_public(job.status)} def set_queue_size(self, job_function: callable, queue_size: int = 500) -> None: self.queue_sizes[job_function.__name__] = queue_size @@ -93,7 +110,15 @@ def _process_job(self, job: T) -> None: self._inject_job_progress(job) - job.result = job.job_function(**job.job_params) + result = job.job_function(**job.job_params) + + # Streaming endpoints return a StreamProducer instead of a value: the + # worker relays chunks into the stream store (consumed via /stream) + # and keeps the aggregated result for /status. + if isinstance(result, StreamProducer): + result = self._run_stream(job, result) + + job.result = result job.job_progress.set_status(1.0) self._complete_job(job=job, final_state=JOB_STATUS.FINISHED) @@ -106,6 +131,36 @@ def _process_job(self, job: T) -> None: print(f"Job {job.id} failed: {str(e)}") traceback.print_exc() # Writes full traceback to stderr + def _run_stream(self, job: T, producer: StreamProducer): + """Drive a :class:`StreamProducer`: relay chunks into the stream store + (if configured) while collecting raw items to build the full result. + + Without a stream store the chunks are simply aggregated, so the job still + returns a complete result via /status (streaming silently degrades). + """ + store = self._stream_store + collected = [] + + if store is None: + for item in producer.raw_chunks: + collected.append(item) + return producer.aggregate(collected) + + job.status = JOB_STATUS.STREAMING + store.open_stream(job.id) + try: + for item in producer.raw_chunks: + collected.append(item) + store.write_chunk(job.id, producer.to_chunk(item)) + for closing_chunk in producer.closing: + store.write_chunk(job.id, closing_chunk) + store.close_stream(job.id) + except Exception as e: + store.close_stream(job.id, error=str(e)) + raise + + return producer.aggregate(collected) + def _complete_job(self, job: T, final_state: JOB_STATUS) -> T: self.job_store.complete_job(job.id) # setting status here, because if this is done earlier, race conditions in get_job are the problem diff --git a/apipod/engine/streaming/__init__.py b/apipod/engine/streaming/__init__.py new file mode 100644 index 0000000..3c3ab69 --- /dev/null +++ b/apipod/engine/streaming/__init__.py @@ -0,0 +1,21 @@ +from apipod.engine.streaming.stream_store import StreamStore +from apipod.engine.streaming.local_stream_store import LocalStreamStore +from apipod.engine.streaming.stream_producer import StreamProducer +from apipod.engine.streaming.stream_serializer import ( + as_sync_iter, + build_stream_producer, + encode_chunk, + is_streaming_result, + store_chunk, +) + +__all__ = [ + "StreamStore", + "LocalStreamStore", + "StreamProducer", + "as_sync_iter", + "build_stream_producer", + "encode_chunk", + "is_streaming_result", + "store_chunk", +] diff --git a/apipod/engine/streaming/local_stream_store.py b/apipod/engine/streaming/local_stream_store.py new file mode 100644 index 0000000..5a8ec03 --- /dev/null +++ b/apipod/engine/streaming/local_stream_store.py @@ -0,0 +1,142 @@ +""" +Adapter: LocalStreamStore + +In-process implementation of the :class:`StreamStore` port. This is the default +backend APIPod uses on localhost to emulate how streaming behaves once a service +is deployed (e.g. on Socaity, where a Redis-backed store relays chunks from the +worker to the gateway). + +Everything lives in process memory, guarded by a lock: + - the in-process worker thread is the producer (``open_stream`` / + ``write_chunk`` / ``close_stream``); + - the FastAPI ``GET /stream/{job_id}`` route is the consumer + (``read_chunks``). + +It is intentionally simple — no external dependencies, no durability. A real +deployment swaps in a distributed store; the endpoint code stays the same. +""" + +import asyncio +import logging +import threading +import time +from typing import AsyncIterator, Dict, List, Optional + +from apipod.engine.streaming.stream_store import StreamStore + +logger = logging.getLogger(__name__) + + +class _LocalStream: + """State for a single in-memory stream.""" + + def __init__(self, ttl_seconds: int): + self.chunks: List[str] = [] + self.closed: bool = False + self.error: Optional[str] = None + self.expires_at: float = time.monotonic() + ttl_seconds + + +class LocalStreamStore(StreamStore): + """Thread-safe, in-memory :class:`StreamStore` for local development/testing.""" + + def __init__(self, poll_interval_s: float = 0.02): + self._streams: Dict[str, _LocalStream] = {} + self._lock = threading.Lock() + # How often the async consumer polls the in-memory buffer for new data. + self._poll_interval_s = poll_interval_s + + # -- Producer API --------------------------------------------------- + + def open_stream(self, job_id: str, ttl_seconds: int = 3600) -> None: + with self._lock: + self._streams[job_id] = _LocalStream(ttl_seconds) + logger.debug("Stream opened | job_id=%s ttl=%ss", job_id, ttl_seconds) + + def write_chunk(self, job_id: str, payload: str) -> None: + with self._lock: + stream = self._streams.get(job_id) + if stream is None: + # Be forgiving: auto-open if the producer forgot to. + stream = _LocalStream(ttl_seconds=3600) + self._streams[job_id] = stream + stream.chunks.append(payload) + + def close_stream(self, job_id: str, *, error: Optional[str] = None) -> None: + with self._lock: + stream = self._streams.get(job_id) + if stream is None: + stream = _LocalStream(ttl_seconds=300) + self._streams[job_id] = stream + stream.error = error + stream.closed = True + logger.debug("Stream closed | job_id=%s error=%s", job_id, error) + + # -- Consumer API --------------------------------------------------- + + async def read_chunks( + self, + job_id: str, + *, + block_ms: int = 5000, + batch_size: int = 50, + ) -> AsyncIterator[str]: + # The consumer may connect before the producer has opened the stream + # (the worker picks the job up slightly after the HTTP response). Wait a + # bounded time for the stream to appear before giving up. + if not await self._await_stream(job_id, timeout_s=max(block_ms / 1000.0, 5.0)): + return + + index = 0 + idle_s = 0.0 + keepalive_after_s = block_ms / 1000.0 + + while True: + with self._lock: + stream = self._streams.get(job_id) + if stream is None: + return + new_chunks = stream.chunks[index:index + batch_size] + index += len(new_chunks) + closed = stream.closed + error = stream.error + drained = index >= len(stream.chunks) + + if new_chunks: + idle_s = 0.0 + for chunk in new_chunks: + yield chunk + continue + + if closed and drained: + if error: + yield f'data: {{"error": {error!r}}}\n\n' + self.delete_stream(job_id) + return + + await asyncio.sleep(self._poll_interval_s) + idle_s += self._poll_interval_s + if idle_s >= keepalive_after_s: + idle_s = 0.0 + # SSE comment keeps proxies / browsers from timing out. + yield ": keepalive\n\n" + + async def _await_stream(self, job_id: str, timeout_s: float) -> bool: + deadline = time.monotonic() + timeout_s + while time.monotonic() < deadline: + with self._lock: + if job_id in self._streams: + return True + await asyncio.sleep(self._poll_interval_s) + return job_id in self._streams + + # -- Lifecycle ------------------------------------------------------ + + def delete_stream(self, job_id: str) -> None: + with self._lock: + self._streams.pop(job_id, None) + logger.debug("Stream deleted | job_id=%s", job_id) + + def stream_exists(self, job_id: str) -> bool: + with self._lock: + return job_id in self._streams diff --git a/apipod/engine/streaming/stream_producer.py b/apipod/engine/streaming/stream_producer.py new file mode 100644 index 0000000..0ab8880 --- /dev/null +++ b/apipod/engine/streaming/stream_producer.py @@ -0,0 +1,33 @@ +""" +StreamProducer: the bridge between a streaming endpoint and the stream store. + +When a streaming endpoint runs under a job queue, its result cannot be sent to +the client directly (the HTTP response already returned a ``JobResult``). +Instead the worker produces the stream into a :class:`StreamStore` while the +client consumes it from ``GET /stream/{job_id}``. + +The router knows *how* to serialize a given result (a ChatCompletion token +stream, encoded media bytes, or a plain generator); the queue worker only knows +the lifecycle. ``StreamProducer`` carries that router-built knowledge to the +worker without leaking schema details into the queue: + + - ``raw_chunks`` – the user generator's raw items (tokens / bytes / objects) + - ``to_chunk`` – serialize one raw item into a store/SSE chunk (str) + - ``closing`` – chunks appended after the stream (e.g. finish + ``[DONE]``) + - ``media_type`` – content type for the direct (non-queued) StreamingResponse + - ``aggregate`` – build the full ``/status`` result from the raw items, so a + client polling status (instead of streaming) gets the + complete result once the job finishes. +""" + +from dataclasses import dataclass, field +from typing import Any, Callable, Iterator, List + + +@dataclass +class StreamProducer: + raw_chunks: Iterator[Any] + to_chunk: Callable[[Any], str] + aggregate: Callable[[List[Any]], Any] + closing: List[str] = field(default_factory=list) + media_type: str = "text/event-stream" diff --git a/apipod/engine/streaming/stream_serializer.py b/apipod/engine/streaming/stream_serializer.py new file mode 100644 index 0000000..6874f20 --- /dev/null +++ b/apipod/engine/streaming/stream_serializer.py @@ -0,0 +1,156 @@ +""" +Backend-neutral stream serialization shared by all transport adapters. + +This module is the single place that knows how to: + - detect a streaming runtime result (``is_streaming_result``); + - bridge an async generator into a sync iterator (``as_sync_iter``); + - encode raw chunks into JSON-safe strings (``encode_chunk`` for RunPod, + ``store_chunk`` for the FastAPI stream store); + - aggregate all raw chunks back into a full result for ``/status`` polling; + - assemble a :class:`StreamProducer` for the FastAPI queued/direct path. + +Both :class:`SocaityFastAPIRouter` and :class:`SocaityRunpodRouter` import +from here instead of each maintaining their own copy. +""" + +import asyncio +import base64 +import inspect +from typing import Any, Iterator, Optional + +from media_toolkit import MediaFile + +from apipod.engine.backend.schema_resolve import ( + SchemaBinding, + SchemaStreamSerializer, + SSE_DONE, + SSE_STREAM_TAGS, + STREAM_CHUNK_SPECS, + wrap_schema_response, +) +from apipod.engine.jobs.job_result import JobResultFactory +from apipod.engine.streaming.stream_producer import StreamProducer + + +# --------------------------------------------------------------------------- +# Detection +# --------------------------------------------------------------------------- + +def is_streaming_result(result: Any) -> bool: + """Return True if *result* is a sync or async generator.""" + return inspect.isgenerator(result) or inspect.isasyncgen(result) + + +# --------------------------------------------------------------------------- +# Sync/async bridging +# --------------------------------------------------------------------------- + +def as_sync_iter(result: Any) -> Iterator: + """Return a synchronous iterator over a sync or async generator.""" + return _drain_async_gen(result) if inspect.isasyncgen(result) else result + + +def _drain_async_gen(agen) -> Iterator: + """Consume an async generator synchronously (for worker / sync contexts).""" + loop = asyncio.new_event_loop() + try: + while True: + try: + yield loop.run_until_complete(agen.__anext__()) + except StopAsyncIteration: + return + finally: + loop.close() + + +# --------------------------------------------------------------------------- +# Chunk encoding +# --------------------------------------------------------------------------- + +def _to_base64(chunk: Any) -> Optional[str]: + """Return a base64 string when *chunk* is bytes / bytearray / MediaFile; else None.""" + if isinstance(chunk, MediaFile): + chunk = chunk.to_bytes() + if isinstance(chunk, (bytes, bytearray)): + return base64.b64encode(bytes(chunk)).decode("ascii") + return None + + +def encode_chunk(chunk: Any) -> str: + """JSON-safe encoding without SSE framing (for RunPod transport). + + Binary / MediaFile → base64 string; str → unchanged; other → str(). + """ + b64 = _to_base64(chunk) + return b64 if b64 is not None else (chunk if isinstance(chunk, str) else str(chunk)) + + +def store_chunk(chunk: Any) -> str: + """SSE-framed encoding for the FastAPI stream store. + + Binary / MediaFile → ``data: {base64}\\n\\n``; str → unchanged (passthrough); + other → ``data: {chunk}\\n\\n``. + """ + b64 = _to_base64(chunk) + if b64 is not None: + return f"data: {b64}\n\n" + return chunk if isinstance(chunk, str) else f"data: {chunk}\n\n" + + +# --------------------------------------------------------------------------- +# Aggregation (full /status result from streamed items) +# --------------------------------------------------------------------------- + +def aggregate_plain(items: list) -> Any: + """Join text chunks or serialize each item for the /status result.""" + if items and all(isinstance(i, str) for i in items): + return "".join(items) + return [JobResultFactory._serialize_result(i) for i in items] + + +def aggregate_schema_tokens(items: list, binding: SchemaBinding) -> Any: + """Reconstruct the schema response from streamed token items.""" + return JobResultFactory._serialize_result( + wrap_schema_response("".join(str(i) for i in items), binding) + ) + + +# --------------------------------------------------------------------------- +# StreamProducer construction (FastAPI queued + direct path) +# --------------------------------------------------------------------------- + +def build_stream_producer(result: Any, binding: Optional[SchemaBinding]) -> Optional[StreamProducer]: + """ + Build a :class:`StreamProducer` from a streamable endpoint result, or + return ``None`` when the result is not a generator. + + Schema endpoints with a registered chunk model (e.g. chat) wrap tokens + into the standardized ``ChatCompletionChunk`` SSE stream; all other + generators produce SSE-framed text / base64-encoded binary chunks. + """ + if not is_streaming_result(result): + return None + + raw_chunks = as_sync_iter(result) + + if binding is not None and binding.tag in STREAM_CHUNK_SPECS: + serializer = SchemaStreamSerializer(binding) + return StreamProducer( + raw_chunks=raw_chunks, + to_chunk=serializer.delta, + closing=[serializer.finish(), SSE_DONE], + media_type="text/event-stream", + aggregate=lambda items, b=binding: aggregate_schema_tokens(items, b), + ) + + media_type = ( + "text/event-stream" + if binding is None or binding.tag in SSE_STREAM_TAGS + else "application/octet-stream" + ) + return StreamProducer( + raw_chunks=raw_chunks, + to_chunk=store_chunk, + media_type=media_type, + aggregate=aggregate_plain, + ) diff --git a/apipod/engine/streaming/stream_store.py b/apipod/engine/streaming/stream_store.py new file mode 100644 index 0000000..fa0feb0 --- /dev/null +++ b/apipod/engine/streaming/stream_store.py @@ -0,0 +1,110 @@ +""" +Port: StreamStore + +Abstract interface for reading and writing streaming data chunks associated +with a job. Implementations may keep the chunks in process memory (the local +test backend), in Redis Streams, in Kafka, or in any other append-only log. + +In a real deployment the producer and the consumer live in different +processes: + + - The **worker** (producer) calls :meth:`open_stream` / :meth:`write_chunk` + as result chunks (ChatCompletion deltas, encoded ``AudioFile`` / + ``VideoFile`` bytes, or chunks of any generator endpoint) are produced. + - The **gateway** (consumer) calls :meth:`read_chunks` to relay those + chunks to the client over Server-Sent Events. + - Both sides use :meth:`close_stream` / :meth:`delete_stream` for lifecycle + management. + +APIPod on localhost emulates that split inside a single process: the in-process +worker thread produces, while the FastAPI ``GET /stream/{job_id}`` route +consumes. The default backend is :class:`LocalStreamStore`; deployments swap in +their own implementation (e.g. a Redis-backed store) without touching the +endpoint code. + +Design decisions: + - :meth:`read_chunks` is an **async generator** so the gateway can yield + chunks straight into a ``StreamingResponse`` without buffering. + - :meth:`write_chunk` / :meth:`open_stream` / :meth:`close_stream` are + **synchronous** because the worker writes from a (sync) worker context. + - :meth:`close_stream` signals completion (optionally with an error) so the + consumer's read loop exits cleanly. +""" + +from abc import ABC, abstractmethod +from typing import AsyncIterator, Optional + + +class StreamStore(ABC): + """Port for append-only stream storage keyed by ``job_id``.""" + + # -- Producer API (worker side) ------------------------------------- + + @abstractmethod + def open_stream(self, job_id: str, ttl_seconds: int = 3600) -> None: + """ + Prepare a stream for writing. + + Implementations should create the underlying resource and set a + safety-net TTL to prevent leaks if neither side cleans up. + """ + ... + + @abstractmethod + def write_chunk(self, job_id: str, payload: str) -> None: + """ + Append a single chunk (typically one SSE ``data:`` line) to the stream. + + Must be safe to call from a synchronous (worker) context. + """ + ... + + @abstractmethod + def close_stream(self, job_id: str, *, error: Optional[str] = None) -> None: + """ + Signal that the producer is done. + + Writes a terminal marker so the consumer knows the stream is complete. + If *error* is provided, the marker carries the error payload. + """ + ... + + # -- Consumer API (gateway side) ------------------------------------ + + @abstractmethod + async def read_chunks( + self, + job_id: str, + *, + block_ms: int = 5000, + batch_size: int = 50, + ) -> AsyncIterator[str]: + """ + Async generator that yields chunks until the terminal marker is read. + + Parameters: + block_ms: how long to wait for new data before emitting a + keep-alive (used for timeout / disconnect checks). + batch_size: max chunks returned per internal read. + """ + ... + # Make this an async generator at the type level. + if False: # pragma: no cover + yield "" + + # -- Lifecycle ------------------------------------------------------ + + @abstractmethod + def delete_stream(self, job_id: str) -> None: + """ + Remove the stream resource entirely. + + Called once the consumer has read the final chunk, or by a periodic + cleanup for abandoned streams. + """ + ... + + @abstractmethod + def stream_exists(self, job_id: str) -> bool: + """Return ``True`` if the stream key exists.""" + ... diff --git a/docs/README_TECH.md b/docs/README_TECH.md index d3de165..b8f1240 100644 --- a/docs/README_TECH.md +++ b/docs/README_TECH.md @@ -29,11 +29,12 @@ apipod/ │ ├── base_backend.py # Shared backend base (title, version, health) │ ├── endpoint_config.py # EndpointExecutionPlan + configurator (how to register an endpoint) │ ├── backend/ -│ │ ├── fastapi/ # SocaityFastAPIRouter + file handling, exceptions +│ │ ├── fastapi/ # SocaityFastAPIRouter + file handling, streaming mixin, exceptions │ │ └── runpod/ # SocaityRunpodRouter (serverless, path-based) │ ├── files/ # _BaseFileHandlingMixin + parse_schema_media_fields (inputs → MediaFile) │ ├── jobs/ # BaseJob, JobProgress, JobResult (+ factory) │ ├── queue/ # JobQueue, JobStore, _QueueMixin (enqueue instead of block) +│ ├── streaming/ # StreamStore port + LocalStreamStore + StreamProducer │ └── signatures/ # Signature inspection policies (media params, Body vs Form, …) └── deploy/ # `apipod build`: Dockerfile generation, dependency/CUDA detection ``` @@ -110,8 +111,18 @@ Three streaming paths exist today: - a **generator of raw tokens**: for tags with a registered chunk model (`STREAM_CHUNK_SPECS`, currently `chat`), `SchemaStreamSerializer` wraps each token into the standardized chunk model (`ChatCompletionChunk`) as an SSE event — APIPod generates the stable chunk `id`, the `created` timestamp and the `object` discriminator, then closes with a final delta and the `[DONE]` sentinel. The endpoint only yields text. Other token-delta tags without a chunk model stream their tokens as-is (SSE), and non-SSE tags stream raw bytes; - an **`AudioFile`/`VideoFile`**: its encoded bytes are chunked into a `StreamingResponse` with the file's media content type — raw audio chunks, not SSE, matching OpenAI's `stream_format="audio"` behavior; - anything else: the regular wrapped JSON response (the endpoint cannot stream). - On RunPod the same logic applies, but chunks pass through `_yield_native_stream`, which base64-encodes binary chunks because RunPod transports JSON. -3. **Job streaming** — `GET /stream/{job_id}` replays chunks from a pluggable stream store while a queued job is in `streaming` state (gateway integration). + On RunPod the same logic applies (`_as_native_stream`): the request is validated and media-parsed by `prepare_schema_call`, the response is wrapped by `wrap_schema_response`, and stream chunks are base64-encoded when binary because RunPod transports JSON. +3. **Job streaming (serverless emulation)** — when a queue is configured, a streaming endpoint does **not** stream on the request connection. The job is enqueued and the response returns a `JobResult` immediately (with a `stream` link). The worker (producer) then relays the chunks into a **stream store**, and the client (consumer) reads them from `GET /stream/{job_id}` as SSE. A client that prefers to wait can poll `GET /status/{job_id}` instead and receive the **full aggregated result** once the job finishes. This mirrors a real deployment, where producer (worker) and consumer (gateway) live in different processes. + +### The stream store + +The **stream store** is the pluggable backend that buffers a job's chunks between the worker and the gateway. Its key idea is to decouple *producing* a stream (sync, worker side) from *consuming* it (async SSE, gateway side), so the same endpoint code streams identically whether it runs on localhost or on a real platform. + +- **`StreamStore`** (`engine/streaming/stream_store.py`) is the port (abstract base class). Producer methods (`open_stream`, `write_chunk`, `close_stream`) are synchronous because the worker writes from a sync context; the consumer method `read_chunks` is an async generator that yields straight into a `StreamingResponse`. `delete_stream` / `stream_exists` cover lifecycle. +- **`LocalStreamStore`** (`engine/streaming/local_stream_store.py`) is the default in-memory implementation APIPod uses on localhost — thread-safe, no external dependencies. It exists purely to *emulate* deployment behavior; a real platform (e.g. Socaity) injects its own implementation (such as a Redis Streams store) via the `stream_store` constructor argument, without changing any endpoint code. +- **`StreamProducer`** (`engine/streaming/stream_producer.py`) is the bridge the router hands to the worker: it carries the raw chunk iterator, how to serialize each chunk for the store (ChatCompletion deltas, base64-framed media bytes, or plain tokens), the closing chunks (`finish` + `[DONE]`), and how to aggregate the raw chunks into the full `/status` result. + +`APIPod()` wires a `LocalStreamStore` automatically whenever a job queue is in use (serverless-localhost and dedicated-with-queue). In plain FastAPI mode (no queue) there is no stream store: streaming happens directly on the request connection (path 1/2 above). ### Deployment diff --git a/examples/test_clients_six_schemas.py b/test/test_clients_six_schemas.py similarity index 100% rename from examples/test_clients_six_schemas.py rename to test/test_clients_six_schemas.py diff --git a/examples/test_service_six_schemas.py b/test/test_service_six_schemas.py similarity index 100% rename from examples/test_service_six_schemas.py rename to test/test_service_six_schemas.py diff --git a/test/test_streaming.py b/test/test_streaming.py new file mode 100644 index 0000000..870333f --- /dev/null +++ b/test/test_streaming.py @@ -0,0 +1,188 @@ +""" +Streaming over the serverless-localhost emulation. + +APIPod on ``compute="serverless", provider="localhost"`` mimics a real +deployment: streaming endpoints are queued, the in-process worker produces their +chunks into a :class:`StreamStore` (the in-memory ``LocalStreamStore`` by +default), and the client consumes them from ``GET /stream/{job_id}``. A client +that polls ``GET /status/{job_id}`` instead receives the full aggregated result +once the job has finished. + +These tests exercise three chunk kinds: + 1. plain text tokens (any generator endpoint), + 2. binary "video" chunks (bytes, base64-framed over SSE), + 3. ChatCompletion deltas (schema endpoint with ``stream=true``). + +Run directly: python test/test_streaming.py +Or with pytest: pytest test/test_streaming.py +""" + +import base64 +import time + +from fastapi.testclient import TestClient + +from apipod import APIPod, LocalStreamStore +from apipod.common import schemas + + +# Deterministic "video" payload: a few non-trivial binary frames. +VIDEO_FRAMES = [bytes([i]) * 2048 for i in range(5)] +VIDEO_BYTES = b"".join(VIDEO_FRAMES) + +TEXT_TOKENS = ["APIPod ", "streams ", "tokens ", "one ", "by ", "one."] +CHAT_TOKENS = ["Hello", ", ", "world", "!"] + + +def build_client() -> TestClient: + """Build a serverless-localhost app with streaming endpoints.""" + app = APIPod(orchestrator="local", compute="serverless", provider="localhost") + + @app.endpoint("/text") + def stream_text(): + for token in TEXT_TOKENS: + time.sleep(0.02) + yield token + + @app.endpoint("/video") + def stream_video(): + # "Any generator endpoint": here it yields raw video frame bytes. + for frame in VIDEO_FRAMES: + time.sleep(0.02) + yield frame + + @app.endpoint("/chat") + def chat(request: schemas.ChatCompletionRequest): + if request.stream: + def token_gen(): + for token in CHAT_TOKENS: + time.sleep(0.02) + yield token + return token_gen() + return "".join(CHAT_TOKENS) + + fastapi_app = app.app + fastapi_app.include_router(app) + return TestClient(fastapi_app) + + +def _submit(client: TestClient, path: str, json_body=None) -> str: + """POST an endpoint, return the stream URL from the JobResult.""" + resp = client.post(path, json=json_body) + assert resp.status_code == 200, resp.text + body = resp.json() + assert "job_id" in body, body + stream_url = body["links"]["stream"] + assert stream_url, body + return stream_url + + +def _collect_sse_data(client: TestClient, stream_url: str) -> list[str]: + """Open the SSE stream and return the payloads of every ``data:`` line.""" + payloads: list[str] = [] + with client.stream("GET", stream_url) as resp: + assert resp.status_code == 200, resp.text + for line in resp.iter_lines(): + if not line or line.startswith(":"): # keep-alive / blank + continue + if line.startswith("data: "): + payloads.append(line[len("data: "):]) + return payloads + + +def test_default_stream_store_is_local(): + """Serverless localhost gets a LocalStreamStore by default; plain FastAPI does not.""" + serverless = APIPod(orchestrator="local", compute="serverless", provider="localhost") + assert isinstance(serverless.stream_store, LocalStreamStore) + + plain = APIPod(orchestrator="local", compute="dedicated", provider="localhost") + assert plain.stream_store is None + + +def test_stream_text_chunks(): + client = build_client() + stream_url = _submit(client, "/text") + + with client.stream("GET", stream_url) as resp: + assert resp.status_code == 200, resp.text + body = "".join(resp.iter_text()) + + assert body == "".join(TEXT_TOKENS) + + +def test_stream_video_bytes(): + client = build_client() + stream_url = _submit(client, "/video") + + payloads = _collect_sse_data(client, stream_url) + received = b"".join(base64.b64decode(p) for p in payloads) + + assert received == VIDEO_BYTES + + +def test_stream_chat_completion(): + client = build_client() + stream_url = _submit(client, "/chat", {"messages": [{"role": "user", "content": "hi"}], "stream": True}) + + payloads = _collect_sse_data(client, stream_url) + assert payloads, "expected at least one chat chunk" + assert payloads[-1] == "[DONE]" + + import json + content = "" + for raw in payloads[:-1]: + chunk = json.loads(raw) + delta = chunk["choices"][0]["delta"].get("content") + if delta: + content += delta + + assert content == "".join(CHAT_TOKENS) + + +def test_status_returns_full_result_when_not_streaming(): + """A client that polls /status (instead of /stream) gets the full result.""" + client = build_client() + resp = client.post("/text") + assert resp.status_code == 200, resp.text + status_url = resp.json()["links"]["status"] + + # Poll tightly until the job reaches a terminal state and exposes its result. + full_result = None + deadline = time.time() + 5.0 + while time.time() < deadline: + s = client.get(status_url) + body = s.json() + if body.get("result") is not None: + full_result = body["result"] + break + if body.get("status") in ("completed", "failed", "not_found"): + full_result = body.get("result") + break + assert full_result == "".join(TEXT_TOKENS) + + +def main() -> int: + tests = [ + test_default_stream_store_is_local, + test_stream_text_chunks, + test_stream_video_bytes, + test_stream_chat_completion, + test_status_returns_full_result_when_not_streaming, + ] + failures = 0 + for test in tests: + try: + test() + print(f" PASS {test.__name__}") + except Exception as exc: # noqa: BLE001 + failures += 1 + import traceback + print(f" FAIL {test.__name__}: {exc.__class__.__name__}: {exc}") + traceback.print_exc() + print(f"\n{len(tests) - failures}/{len(tests)} passed") + return 1 if failures else 0 + + +if __name__ == "__main__": + import sys + sys.exit(main()) From 49da15fc63730920c5535c15b6eaab45c65ecdc4 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Mon, 15 Jun 2026 06:06:11 +0200 Subject: [PATCH 12/38] Refactor APIPod core: implement unified streaming, execution, and job metrics - Implemented backend-neutral streaming with and centralized serialization logic. - Unified sync/async function execution across FastAPI and RunPod backends in . - Centralized endpoint planning and streaming detection into . - Refactored and to remove platform-specific leaks and unify progress reporting. - Introduced a dedicated class to consolidate job timing (created, queued, started, finished) and simplify lifecycle tracking. - Simplified to be self-describing, removing the need for external status mapping. --- .../backend/fastapi/file_handling_mixin.py | 10 +- apipod/engine/backend/fastapi/router.py | 11 +- .../engine/backend/fastapi/streaming_mixin.py | 15 +- apipod/engine/backend/runpod/router.py | 113 +++-------- apipod/engine/base_backend.py | 63 +++++- apipod/engine/jobs/base_job.py | 82 ++++---- apipod/engine/jobs/job_progress.py | 55 ++++-- apipod/engine/jobs/job_result.py | 186 +++--------------- apipod/engine/queue/job_queue.py | 26 +-- docs/README_TECH.md | 2 +- test/test_streaming.py | 2 +- 11 files changed, 207 insertions(+), 358 deletions(-) diff --git a/apipod/engine/backend/fastapi/file_handling_mixin.py b/apipod/engine/backend/fastapi/file_handling_mixin.py index f782cab..ce34d22 100644 --- a/apipod/engine/backend/fastapi/file_handling_mixin.py +++ b/apipod/engine/backend/fastapi/file_handling_mixin.py @@ -6,7 +6,6 @@ from apipod.common.schemas.media_files import FileModel, ImageFileModel, AudioFileModel, VideoFileModel from apipod.engine.signatures.policies import FastAPISignaturePolicies from apipod.engine.files.base_file_mixin import _BaseFileHandlingMixin -from apipod.engine.endpoint_config import EndpointExecutionPlan from apipod.engine.utils import replace_func_signature from media_toolkit import MediaList, MediaDict, ImageFile, AudioFile, VideoFile, MediaFile import functools @@ -250,14 +249,9 @@ def _inject_dummy_job_progress(self, func: Callable) -> Callable: Wrap the function to inject a dummy JobProgress instance if the original function expects one. This is used for non-queued FastAPI endpoints. """ - from apipod.engine.jobs.job_progress import JobProgress - - sig = inspect.signature(func) - job_progress_params = [ - p.name for p in sig.parameters.values() - if p.name == "job_progress" or "JobProgress" in str(p.annotation) - ] + from apipod.engine.jobs.job_progress import JobProgress, job_progress_param_names + job_progress_params = job_progress_param_names(func) if not job_progress_params: return func diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index b9859e9..3dde124 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -53,14 +53,12 @@ def __init__( job_queue: Optional custom JobQueue implementation lifespan: Optional async context manager for custom startup/shutdown logic args: Additional arguments - kwargs: May include ``stream_store`` (SSE backend for GET /stream/{job_id}) and - ``gateway_stream_url_prefix`` for absolute stream URLs in JobResult, plus - additional keyword arguments for parent classes. + kwargs: May include ``stream_store`` (SSE backend for GET /stream/{job_id}), + plus additional keyword arguments for parent classes. """ # Extract user-provided lifespan (explicit param or kwarg) before parent init user_lifespan = lifespan or kwargs.pop('lifespan', None) stream_store = kwargs.pop("stream_store", None) - gateway_stream_url_prefix = kwargs.pop("gateway_stream_url_prefix", "") # Initialize parent classes api_router_params = inspect.signature(APIRouter.__init__).parameters @@ -99,7 +97,6 @@ def __init__( self.app: FastAPI = app self.prefix = prefix self.stream_store = stream_store - self.gateway_stream_url_prefix = gateway_stream_url_prefix # Let the queue produce streaming job output into the stream store so a # client can consume it via GET /stream/{job_id} (serverless emulation). @@ -339,7 +336,7 @@ def _modify_result_decorator(self, func: Callable, plan: EndpointExecutionPlan, """ @functools.wraps(func) def sync_wrapper(*args, **kwargs): - result = func(*args, **kwargs) + result = self.run_callable(func, *args, **kwargs) producer = build_stream_producer(result, plan.schema_binding) if producer is not None: @@ -381,7 +378,7 @@ def decorator(func: Callable) -> Callable: self._job_func_registry[func.__name__] = func except Exception: pass - + upload_enabled = self._prepare_func_for_media_file_upload_with_fastapi(queue_decorated, plan.max_upload_file_size_mb) return fastapi_route_decorator(upload_enabled) diff --git a/apipod/engine/backend/fastapi/streaming_mixin.py b/apipod/engine/backend/fastapi/streaming_mixin.py index 24642d8..a4e3f13 100644 --- a/apipod/engine/backend/fastapi/streaming_mixin.py +++ b/apipod/engine/backend/fastapi/streaming_mixin.py @@ -2,9 +2,9 @@ FastAPI-specific streaming transport, factored out of the router. This mixin owns the FastAPI-side mechanics for turning a streaming endpoint -result into an HTTP response: +result into an HTTP response (execution itself goes through the shared +``_BaseBackend.run_callable`` / ``run_callable_async`` runtime): -- ``_execute_func`` — run a sync or async function without blocking the event loop; - ``_stream_generator`` — adapt a sync/async generator into an async generator for :class:`StreamingResponse` (direct non-queued path); - ``_streaming_response_from_producer`` — build a :class:`StreamingResponse` from @@ -45,13 +45,6 @@ class _FastAPIStreamingMixin: # Execution helpers # ------------------------------------------------------------------ - async def _execute_func(self, func, **kwargs): - """Execute a function, handling both sync and async callables.""" - if inspect.iscoroutinefunction(func): - return await func(**kwargs) - loop = asyncio.get_event_loop() - return await loop.run_in_executor(None, functools.partial(func, **kwargs)) - async def _stream_generator(self, result): """Adapt a sync or async generator into an async generator for StreamingResponse.""" if inspect.isasyncgen(result): @@ -105,7 +98,7 @@ def _create_streaming_endpoint_decorator(self, plan: EndpointExecutionPlan): def decorator(func: Callable) -> Callable: @functools.wraps(func) async def streaming_wrapper(*w_args, **w_kwargs): - result = await self._execute_func(func, *w_args, **w_kwargs) + result = await self.run_callable_async(func, *w_args, **w_kwargs) generator = self._stream_generator(result) headers = {"Cache-Control": "no-cache", "X-Accel-Buffering": "no"} @@ -144,7 +137,7 @@ async def stream_job_sse(self, job_id: str, request: Request): # Allow any not-yet-finished state; read_chunks waits for the producer. st = ((job_data.get("status") if job_data else "") or "").lower() - if not stream_open and st not in {"pending", "processing", "streaming"}: + if not stream_open and st not in {"queued", "processing", "streaming"}: raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail=f"Job '{job_id}' is not streaming (status: {st or 'unknown'}).", diff --git a/apipod/engine/backend/runpod/router.py b/apipod/engine/backend/runpod/router.py index 33b6392..6ee2fca 100644 --- a/apipod/engine/backend/runpod/router.py +++ b/apipod/engine/backend/runpod/router.py @@ -1,4 +1,3 @@ -import asyncio import functools import inspect import traceback @@ -6,15 +5,9 @@ from typing import Union, Callable, Iterator from apipod.common import constants -from apipod.engine.jobs.base_job import JOB_STATUS -from apipod.engine.jobs.job_progress import JobProgressRunpod, JobProgress -from apipod.engine.jobs.job_result import ( - JobResultFactory, - JobResult, - JobMetrics, - _compute_duration_s, - _job_status_to_public, -) +from apipod.engine.jobs.base_job import BaseJob, JOB_STATUS +from apipod.engine.jobs.job_progress import JobProgressRunpod, job_progress_param_names +from apipod.engine.jobs.job_result import JobResultFactory from apipod.engine.base_backend import _BaseBackend from apipod.engine.endpoint_config import build_plan, EndpointExecutionPlan from apipod.engine.files.base_file_mixin import _BaseFileHandlingMixin @@ -71,7 +64,7 @@ def wrapper(*w_args, **w_kwargs): try: if plan.is_schema_endpoint: return self._handle_schema_request(func, plan.schema_binding, w_args, w_kwargs) - result = self._execute_sync_or_async(func, w_args, w_kwargs) + result = self.run_callable(func, *w_args, **w_kwargs) # Plain generator endpoints stream too: turn the generator into a # RunPod-native stream of JSON-safe chunks (RunPod aggregates it). native_stream = self._as_native_stream(result) @@ -91,7 +84,7 @@ def _handle_schema_request(self, func: Callable, binding: SchemaBinding, args: t registered response model (``wrap_schema_response``). """ request = prepare_schema_call(binding, kwargs) - result = self._execute_sync_or_async(func, args, kwargs) + result = self.run_callable(func, *args, **kwargs) if getattr(request, "stream", False): native_stream = self._as_native_stream(result, binding) @@ -122,19 +115,6 @@ def _as_native_stream(self, result, binding: Union[SchemaBinding, None] = None) return None - def _execute_sync_or_async(self, func, args, kwargs): - if inspect.iscoroutinefunction(func): - return self._run_in_loop(func(*args, **kwargs)) - return func(*args, **kwargs) - - def _run_in_loop(self, coro): - try: - loop = asyncio.get_event_loop() - except RuntimeError: - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - return loop.run_until_complete(coro) - def get(self, path: str = None, *args, **kwargs): return self.endpoint(path=path, *args, **kwargs) @@ -153,11 +133,7 @@ def _add_job_progress_to_kwargs(self, func, job, kwargs): Returns: Updated kwargs with job_progress added """ - job_progress_params = [] - for param in inspect.signature(func).parameters.values(): - if param.annotation in (JobProgress, JobProgressRunpod) or param.name == "job_progress": - job_progress_params.append(param.name) - + job_progress_params = job_progress_param_names(func) if job_progress_params: jp = JobProgressRunpod(job) for job_progress_param in job_progress_params: @@ -196,82 +172,37 @@ def _router(self, path, job, **kwargs): if missing_args: raise Exception(f"Arguments {missing_args} are missing") - start_time = datetime.now(timezone.utc) - result = JobResult(job_id=job["id"], endpoint=path) + # Create a BaseJob record so the result can be assembled by the same + # from_base_job path used by the local queue worker. + job_record = BaseJob(id=job["id"]) + job_record.metrics.started_at = datetime.now(timezone.utc) try: - # Execute the function (Sync or Async Handling) - res = self._execute_route_function(route_function, kwargs) + res = self.run_callable(route_function, **kwargs) - # Check if result is a generator (streaming response) + # Streaming response: hand the generator straight to RunPod, which + # aggregates it (no JobResult envelope is produced for streams). if inspect.isgenerator(res) or inspect.isasyncgen(res): - # For streaming, return the generator directly - # RunPod will handle the streaming return res - # Convert result to JSON if it's a MediaFile / MediaList / Pydantic Model - res = JobResultFactory._serialize_result(res) - - result.result = res - result.status = _job_status_to_public(JOB_STATUS.FINISHED) + job_record.result = res + job_record.status = JOB_STATUS.FINISHED except Exception as e: - result.error = str(e) - result.status = _job_status_to_public(JOB_STATUS.FAILED) + job_record.error = str(e) + job_record.status = JOB_STATUS.FAILED print(f"Job {job['id']} failed: {str(e)}") traceback.print_exc() + # Adopt the progress handle the function reported through, so its final + # progress/message flow into the JobResult. for arg in kwargs.values(): if isinstance(arg, JobProgressRunpod): - result.progress = float(arg._progress) - result.message = arg._message + job_record.job_progress = arg break - inference_time_s = _compute_duration_s(start_time, datetime.now(timezone.utc)) - if inference_time_s is not None: - result.metrics = JobMetrics(inference_time_s=inference_time_s) - - return result.model_dump_json(exclude_none=True) + job_record.metrics.finished_at = datetime.now(timezone.utc) - def _execute_route_function(self, route_function, kwargs): - """ - Execute a route function, handling both sync and async functions. - - Args: - route_function: The function to execute - kwargs: Keyword arguments to pass to the function - - Returns: - The result of the function execution - """ - if not inspect.iscoroutinefunction(route_function): - # Synchronous function - simple execution - return route_function(**kwargs) - - # Async function - need event loop handling - try: - loop = asyncio.get_event_loop() - if loop.is_running(): - # Already in async context - shouldn't happen in RunPod handler - # But if it does, we need to handle it differently - import concurrent.futures - with concurrent.futures.ThreadPoolExecutor() as executor: - future = executor.submit( - asyncio.run, - route_function(**kwargs) - ) - return future.result() - else: - # Loop exists but not running - use it - return loop.run_until_complete(route_function(**kwargs)) - except RuntimeError: - # No event loop exists - create one - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - try: - return loop.run_until_complete(route_function(**kwargs)) - finally: - loop.close() - asyncio.set_event_loop(None) + return JobResultFactory.from_base_job(job_record).model_dump_json(exclude_none=True) def handler(self, job): """ diff --git a/apipod/engine/base_backend.py b/apipod/engine/base_backend.py index 64cd5d2..e1316f2 100644 --- a/apipod/engine/base_backend.py +++ b/apipod/engine/base_backend.py @@ -1,5 +1,9 @@ +import asyncio +import concurrent.futures +import functools +import inspect from abc import abstractmethod -from typing import Union +from typing import Any, Callable, Union import importlib.metadata from apipod.common import constants from apipod.engine.compatibility.HealthCheck import HealthCheck @@ -23,6 +27,61 @@ def __init__( self._health_check = HealthCheck() self.version = importlib.metadata.version("apipod") + # ------------------------------------------------------------------ + # Execution runtime + # + # Executing a user-registered endpoint while transparently resolving + # sync/async is the one operation every backend shares. There are exactly + # two authoritative entry points so behaviour can never drift between the + # worker thread, the RunPod handler and the direct FastAPI path. + # ------------------------------------------------------------------ + def run_callable(self, func: Callable, *args: Any, **kwargs: Any) -> Any: + """Execute *func* from a synchronous context, resolving coroutines. + + Used by the two real sync execution sites: the local queue worker thread + and the RunPod handler. Sync functions run directly; coroutine functions + are driven to completion on an event loop (a fresh one is created and torn + down when no usable loop exists, or when the current loop is already + running the call is offloaded to a worker thread). + """ + if not inspect.iscoroutinefunction(func): + return func(*args, **kwargs) + + coro = func(*args, **kwargs) + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = None + + if loop is not None and not loop.is_running(): + return loop.run_until_complete(coro) + + if loop is not None and loop.is_running(): + # Already inside a running loop (rare in sync handlers): run the + # coroutine to completion on a separate thread to avoid re-entrancy. + with concurrent.futures.ThreadPoolExecutor() as executor: + return executor.submit(asyncio.run, coro).result() + + new_loop = asyncio.new_event_loop() + asyncio.set_event_loop(new_loop) + try: + return new_loop.run_until_complete(coro) + finally: + new_loop.close() + asyncio.set_event_loop(None) + + async def run_callable_async(self, func: Callable, *args: Any, **kwargs: Any) -> Any: + """Execute *func* from an async context without blocking the event loop. + + Used by the direct (non-queued) FastAPI response path. Coroutine + functions are awaited; sync functions are offloaded to the default + thread-pool executor. + """ + if inspect.iscoroutinefunction(func): + return await func(*args, **kwargs) + loop = asyncio.get_event_loop() + return await loop.run_in_executor(None, functools.partial(func, *args, **kwargs)) + @property def status(self) -> constants.SERVER_HEALTH: return self._health_check.status @@ -60,7 +119,7 @@ def endpoint(self, path: str = None, *args, **kwargs): """ Add a route to the app. Can be a task route (async job) or standard route depending on configuration. - + :param path: In case of fastapi will be resolved as url in form http://{host:port}/{prefix}/{path} In case of runpod will be resolved as url in form http://{host:port}?route={path} diff --git a/apipod/engine/jobs/base_job.py b/apipod/engine/jobs/base_job.py index 655f861..411429a 100644 --- a/apipod/engine/jobs/base_job.py +++ b/apipod/engine/jobs/base_job.py @@ -7,42 +7,46 @@ class JOB_STATUS(Enum): - QUEUED = "Queued" - PROCESSING = "Processing" - STREAMING = "Streaming" - FINISHED = "Finished" - FAILED = "Failed" - TIMEOUT = "Timeout" + """Lifecycle states of a job. The value is the public API status string.""" + QUEUED = "queued" + PROCESSING = "processing" + STREAMING = "streaming" + FINISHED = "finished" + FAILED = "failed" + TIMEOUT = "timeout" -class PROVIDERS(Enum): - RUNPOD = "runpod" - OPENAI = "openai" - REPLICATE = "replicate" +class JobMetrics: + """Storage for all job timing and performance data.""" + def __init__(self): + self.created_at: datetime = datetime.now(timezone.utc) + self.queued_at: Optional[datetime] = None + self.started_at: Optional[datetime] = None + self.finished_at: Optional[datetime] = None + self.time_out_at: Optional[datetime] = None -class BaseJob: - """Essential job record shared by all job types (local thread, remote service, etc.). - - Subclasses add domain-specific fields: + @property + def execution_time_s(self) -> Optional[float]: + if self.started_at and self.finished_at: + delta = (self.finished_at - self.started_at).total_seconds() + return round(delta, 2) if delta >= 0 else 0.0 + return None - * :class:`LocalJob` — thread-pool execution (``job_function``, ``job_progress``). - * Platform-specific subclasses (e.g. gateway ``ServiceJob``) — remote/Redis - (``service_id``, ``api_url``, ``endpoint``, ``input_data``). - :class:`~apipod.engine.jobs.job_result.JobResultFactory.from_base_job` maps any - ``BaseJob`` subclass to the public :class:`~apipod.engine.jobs.job_result.JobResult`. +class BaseJob: + """ + Essential job record shared by all job types (local thread, remote service, etc.). + Subclass to add domain-specific fields like service_id, endpoint, etc. """ - def __init__(self, id=None, status="pending", created_at=None, updated_at=None): + def __init__(self, id: Optional[str] = None): self.id: str = id or str(uuid4()) - self.status = status + self.status = JOB_STATUS.QUEUED self.result: Any = None self.error: Optional[str] = None - self.created_at = created_at or datetime.now(timezone.utc) - self.updated_at = updated_at or datetime.now(timezone.utc) - self.progress: Optional[float] = None - self.message: Optional[str] = None + self.job_progress = JobProgress() + self.metrics = JobMetrics() class LocalJob(BaseJob): @@ -51,31 +55,13 @@ class LocalJob(BaseJob): """ def __init__(self, job_function: callable, job_params: Optional[dict] = None, timeout_seconds: int = 3600): - super().__init__(status=JOB_STATUS.QUEUED) + super().__init__() self.job_function = job_function self.job_params: dict = job_params or {} - self.job_progress = JobProgress() - - self.queued_at: Optional[datetime] = None - self.execution_started_at: Optional[datetime] = None - self.execution_finished_at: Optional[datetime] = None - self.time_out_at = self.created_at + timedelta(seconds=timeout_seconds) + self.metrics.time_out_at = self.metrics.created_at + timedelta(seconds=timeout_seconds) @property def is_timed_out(self) -> bool: - return datetime.now(timezone.utc) > self.time_out_at - - @property - def execution_duration_ms(self) -> int: - if not self.execution_started_at: - return 0 - end_time = self.execution_finished_at or datetime.now(timezone.utc) - return int((end_time - self.execution_started_at).total_seconds() * 1000) - - @property - def delay_time_ms(self) -> int: - if not self.queued_at: - return int((datetime.now(timezone.utc) - self.created_at).total_seconds() * 1000) - if not self.execution_started_at: - return int((datetime.now(timezone.utc) - self.queued_at).total_seconds() * 1000) - return int((self.execution_started_at - self.created_at).total_seconds() * 1000) + if not self.metrics.time_out_at: + return False + return datetime.now(timezone.utc) > self.metrics.time_out_at diff --git a/apipod/engine/jobs/job_progress.py b/apipod/engine/jobs/job_progress.py index b9b6ed5..8e4d062 100644 --- a/apipod/engine/jobs/job_progress.py +++ b/apipod/engine/jobs/job_progress.py @@ -1,29 +1,54 @@ +import inspect import logging +from typing import Callable, List + logger = logging.getLogger(__name__) +def job_progress_param_names(func: Callable) -> List[str]: + """Names of the parameters of *func* that should receive a :class:`JobProgress`. + + A parameter qualifies when it is literally named ``job_progress`` or when its + annotation refers to a ``JobProgress`` type. This single detection is shared + by every injection site (queue worker, RunPod handler, direct FastAPI path) + so they can never disagree about what counts as a progress parameter. + """ + try: + params = inspect.signature(func).parameters.values() + except (TypeError, ValueError): + return [] + return [ + p.name for p in params + if p.name == "job_progress" or "JobProgress" in str(p.annotation) + ] + + class JobProgress: - def __init__(self, progress: float = 0, message: str = None): - """ - Used to display _progress of a job while executing. - :param progress: value between 0 and 1.0 - :param message: message to deliver to client. - """ - self._progress = progress - self._message = message + """Live progress handle for a running job. + + Holds the single source of truth for a job's ``progress`` and ``message``: + the endpoint function receives this object (via a ``job_progress`` parameter) + and reports updates through :meth:`set_status`, while the job record exposes + the same object so the public ``JobResult`` can read the current values. + """ + + def __init__(self, progress: float = 0.0, message: str = None): + """:param progress: value between 0 and 1.0. :param message: message to deliver to the client.""" + self.progress = progress + self.message = message logger.setLevel(logging.INFO) - + def set_status(self, progress: float = None, message: str = None): if progress is not None: - self._progress = progress + self.progress = progress if message is not None: - self._message = message - logger.info(f"Progress: {self._progress} Message: {self._message}") + self.message = message + logger.info(f"Progress: {self.progress} Message: {self.message}") return self - + class JobProgressRunpod(JobProgress): - def __init__(self, runpod_job, progress: float = 0, message: str = None): + def __init__(self, runpod_job, progress: float = 0.0, message: str = None): super().__init__(progress=progress, message=message) self.runpod_job = runpod_job @@ -34,7 +59,7 @@ def set_status(self, progress: float = None, message: str = None): import runpod runpod.serverless.progress_update( self.runpod_job, - f"Progress: {int(self._progress)} Message: {self._message}" + f"Progress: {int(self.progress)} Message: {self.message}" ) except Exception as e: print(f"Problem in progress update: {e}") diff --git a/apipod/engine/jobs/job_result.py b/apipod/engine/jobs/job_result.py index 8523f90..1c8d76d 100644 --- a/apipod/engine/jobs/job_result.py +++ b/apipod/engine/jobs/job_result.py @@ -1,10 +1,10 @@ import gzip +from datetime import datetime from io import BytesIO from typing import Any, List, Optional, Union from pydantic import BaseModel -from apipod.common.settings import DEFAULT_DATE_TIME_FORMAT from apipod.engine.jobs.base_job import JOB_STATUS, BaseJob from apipod.engine.signatures.upload import is_param_media_toolkit_file from media_toolkit import IMediaContainer @@ -12,115 +12,36 @@ from apipod.common.schemas.media_files import FileModel -def _job_status_to_public(status: Any) -> Optional[str]: - """Map internal JOB_STATUS (or legacy string) to public API strings (gateway-aligned).""" +def _public_status(status: Any) -> Optional[str]: + """Public status string: a JOB_STATUS carries its own value; pass strings through.""" if status is None: return None - if isinstance(status, JOB_STATUS): - return { - JOB_STATUS.QUEUED: "pending", - JOB_STATUS.PROCESSING: "processing", - JOB_STATUS.STREAMING: "streaming", - JOB_STATUS.FINISHED: "completed", - JOB_STATUS.FAILED: "failed", - JOB_STATUS.TIMEOUT: "failed", - }.get(status, status.value.lower()) - if isinstance(status, str): - lowered = status.lower() - legacy = { - "queued": "pending", - "pending": "pending", - "processing": "processing", - "streaming": "streaming", - "finished": "completed", - "completed": "completed", - "failed": "failed", - "timeout": "failed", - "rejected": "failed", - } - return legacy.get(lowered, lowered) - return str(status) - - -def _format_date(date: Any) -> Optional[str]: - """Format a datetime or ISO string for the public API.""" - if date is None: - return None - if isinstance(date, str): - return date - try: - return date.strftime(DEFAULT_DATE_TIME_FORMAT) - except Exception: - return str(date) - - -def _parse_iso(value: Any): - """Best-effort parse an ISO 8601 string or datetime into a datetime.""" - if value is None: - return None - if hasattr(value, "timestamp"): - return value - try: - from datetime import datetime, timezone - dt = datetime.fromisoformat(str(value)) - if dt.tzinfo is None: - dt = dt.replace(tzinfo=timezone.utc) - return dt - except (ValueError, TypeError): - return None - - -def _compute_duration_s(start: Any, end: Any) -> Optional[float]: - """Compute seconds between two timestamps, returning None if either is missing.""" - s, e = _parse_iso(start), _parse_iso(end) - if s is None or e is None: - return None - delta = (e - s).total_seconds() - return round(delta, 2) if delta >= 0 else None - - -def _opt_float(value: Any) -> Optional[float]: - """Coerce to positive float, else None.""" - if value is None: - return None - try: - f = float(value) - return round(f, 3) if f > 0 else None - except (ValueError, TypeError): - return None + return status.value if isinstance(status, JOB_STATUS) else str(status) class JobLinks(BaseModel): """Hypermedia links for job status polling, cancellation, and streaming.""" - status: Optional[str] = None cancel: Optional[str] = None stream: Optional[str] = None class JobMetrics(BaseModel): - """Performance metrics populated as a job progresses through the platform. - - Segments (chronological): - upload_time_s – file upload duration (gateway) - platform_queue_time_s – our validation + dispatch + Celery routing - provider_queue_time_s – provider-side GPU / resource wait - inference_time_s – actual model execution - execution_time_s – orchestrator end-to-end (queue + inference, excludes upload) - """ - + """Execution metrics APIPod measures for a job.""" + created_at: Optional[datetime] = None + queued_at: Optional[datetime] = None + started_at: Optional[datetime] = None + finished_at: Optional[datetime] = None execution_time_s: Optional[float] = None - inference_time_s: Optional[float] = None - platform_queue_time_s: Optional[float] = None - provider_queue_time_s: Optional[float] = None - upload_time_s: Optional[float] = None class JobResult(BaseModel): """Public job snapshot returned by GET /status and job submissions. Unified response: same shape whether the client just submitted a job - (``status="pending"``) or is polling for completion. + (``status="queued"``) or is polling for completion. The ``status`` values + mirror :class:`~apipod.engine.jobs.base_job.JOB_STATUS` + (``queued``/``processing``/``streaming``/``finished``/``failed``/``timeout``). Null fields are excluded from the serialized response so the client only receives relevant information for the current job state. @@ -133,9 +54,6 @@ class JobResult(BaseModel): progress: Optional[float] = None message: Optional[str] = None - service: Optional[str] = None - endpoint: Optional[str] = None - metrics: Optional[JobMetrics] = None links: Optional[JobLinks] = None @@ -176,75 +94,29 @@ def _serialize_result(data: Any) -> Union[FileModel, List[FileModel], list, str, @staticmethod def from_base_job(job: BaseJob) -> JobResult: - """Map any :class:`BaseJob` subclass to the public :class:`JobResult`. - - Works for :class:`~apipod.engine.jobs.base_job.LocalJob` (thread queue) - and any platform ``BaseJob`` subclass (e.g. gateway ``ServiceJob``). - """ - status = _job_status_to_public(job.status) - result = JobResultFactory._serialize_result(job.result) - - progress = job.progress - message = job.message - - job_progress = getattr(job, "job_progress", None) - if job_progress is not None: - try: - progress = float(job_progress._progress) - message = job_progress._message - except Exception: - pass - - service = getattr(job, "service_id", None) - endpoint = getattr(job, "endpoint", None) - - metrics = JobResultFactory._build_metrics(job) - - links = JobLinks( - status=f"/status/{job.id}", - cancel=f"/cancel/{job.id}", - stream=f"/stream/{job.id}", + """Map a :class:`BaseJob` to the public :class:`JobResult`.""" + m = job.metrics + metrics = JobMetrics( + created_at=m.created_at, + queued_at=m.queued_at, + started_at=m.started_at, + finished_at=m.finished_at, + execution_time_s=m.execution_time_s, ) return JobResult( job_id=job.id, - status=status, + status=_public_status(job.status), + result=JobResultFactory._serialize_result(job.result), error=job.error, - result=result, - progress=progress, - message=message, - service=service, - endpoint=endpoint, + progress=job.job_progress.progress, + message=job.job_progress.message, metrics=metrics, - links=links, - ) - - @staticmethod - def _build_metrics(job: BaseJob) -> Optional[JobMetrics]: - """Derive timing metrics from orchestrator-provided values or timestamps.""" - execution_time_s = _opt_float(getattr(job, "execution_time_s", None)) or _compute_duration_s( - getattr(job, "created_at", None), - getattr(job, "completed_at", None) or getattr(job, "failed_at", None), - ) - upload_time_s = _compute_duration_s( - getattr(job, "upload_started_at", None), - getattr(job, "upload_finished_at", None), - ) - inference_time_s = _opt_float(getattr(job, "inference_time_s", None)) - platform_queue_time_s = _opt_float(getattr(job, "platform_queue_time_s", None)) - provider_queue_time_s = _opt_float(getattr(job, "provider_queue_time_s", None)) - - values = (execution_time_s, upload_time_s, inference_time_s, - platform_queue_time_s, provider_queue_time_s) - if all(v is None for v in values): - return None - - return JobMetrics( - execution_time_s=execution_time_s, - inference_time_s=inference_time_s, - platform_queue_time_s=platform_queue_time_s, - provider_queue_time_s=provider_queue_time_s, - upload_time_s=upload_time_s, + links=JobLinks( + status=f"/status/{job.id}", + cancel=f"/cancel/{job.id}", + stream=f"/stream/{job.id}", + ), ) @staticmethod diff --git a/apipod/engine/queue/job_queue.py b/apipod/engine/queue/job_queue.py index 1628d49..ee9dd92 100644 --- a/apipod/engine/queue/job_queue.py +++ b/apipod/engine/queue/job_queue.py @@ -6,10 +6,9 @@ from apipod.engine.queue.job_store import JobStore from apipod.engine.jobs.base_job import BaseJob, LocalJob, JOB_STATUS -from apipod.engine.jobs.job_result import _job_status_to_public +from apipod.engine.jobs.job_progress import job_progress_param_names from apipod.engine.queue.job_queue_interface import JobQueueInterface from apipod.engine.streaming.stream_producer import StreamProducer -import inspect T = TypeVar('T', bound=BaseJob) @@ -51,7 +50,7 @@ def get_job_status(self, job_id: str) -> Optional[dict]: job = self.job_store.get_job(job_id) if job is None: return None - return {"id": job_id, "status": _job_status_to_public(job.status)} + return {"id": job_id, "status": getattr(job.status, "value", job.status)} def set_queue_size(self, job_function: callable, queue_size: int = 500) -> None: self.queue_sizes[job_function.__name__] = queue_size @@ -86,7 +85,7 @@ def _add_job(self, job_function: callable, job_params: Optional[dict] = None) -> return job job.status = JOB_STATUS.QUEUED - job.queued_at = datetime.now(timezone.utc) + job.metrics.queued_at = datetime.now(timezone.utc) self.job_store.add_to_queue(job) if not self.worker_thread.is_alive(): @@ -105,7 +104,7 @@ def _create_job(self, job_function: callable, job_params: Optional[dict] = None) def _process_job(self, job: T) -> None: try: - job.execution_started_at = datetime.now(timezone.utc) + job.metrics.started_at = datetime.now(timezone.utc) job.status = JOB_STATUS.PROCESSING self._inject_job_progress(job) @@ -164,7 +163,7 @@ def _run_stream(self, job: T, producer: StreamProducer): def _complete_job(self, job: T, final_state: JOB_STATUS) -> T: self.job_store.complete_job(job.id) # setting status here, because if this is done earlier, race conditions in get_job are the problem - job.execution_finished_at = datetime.now(timezone.utc) + job.metrics.finished_at = datetime.now(timezone.utc) job.status = final_state return job @@ -181,15 +180,8 @@ def cancel_job(self, job_id: str) -> None: # self._complete_job(job_id) def _inject_job_progress(self, job: T) -> T: - sig = inspect.signature(job.job_function) - - job_progress_params = [ - p for p in sig.parameters.values() - if p.name == "job_progress" or "JobProgress" in str(p.annotation) - ] - for job_progress_param in job_progress_params: - job.job_params[job_progress_param.name] = job.job_progress - + for param_name in job_progress_param_names(job.job_function): + job.job_params[param_name] = job.job_progress return job def _process_jobs_in_background(self) -> None: @@ -244,9 +236,9 @@ def _clean_up_orphan_jobs(self) -> None: return for job in self.job_store.completed_jobs: - if job.execution_finished_at is None: + if job.metrics.finished_at is None: self._remove_job(job) - elif (datetime.now(timezone.utc) - job.execution_finished_at).total_seconds() > self._delete_orphan_jobs_after_seconds: + elif (datetime.now(timezone.utc) - job.metrics.finished_at).total_seconds() > self._delete_orphan_jobs_after_seconds: self._remove_job(job) def _start_queued_jobs(self) -> None: diff --git a/docs/README_TECH.md b/docs/README_TECH.md index b8f1240..85ba046 100644 --- a/docs/README_TECH.md +++ b/docs/README_TECH.md @@ -130,6 +130,6 @@ The **stream store** is the pluggable backend that buffers a job's chunks betwee ## Request lifecycle, end to end -A client calls `POST /tts` with a JSON body. FastAPI validates it against the rewritten signature and calls the outermost wrapper. The file-handling layer converts any media inputs into media-toolkit objects. If the endpoint is queued, the queue mixin stores the job and returns `{job_id, status: "pending", links}` — the worker thread later executes the real function, feeding `JobProgress` updates into the store. The client (typically fastSDK) polls `/status/{job_id}` until `completed` and receives the result, with any returned `AudioFile` serialized as a `FileModel`. Without a queue the same conversion happens inline and the response returns directly. On RunPod, the identical user function is reached through `handler → _router(path) → file handling → execute`, proving the core principle: the function is written once, the backend decides how it runs. +A client calls `POST /tts` with a JSON body. FastAPI validates it against the rewritten signature and calls the outermost wrapper. The file-handling layer converts any media inputs into media-toolkit objects. If the endpoint is queued, the queue mixin stores the job and returns `{job_id, status: "queued", links}` — the worker thread later executes the real function, feeding `JobProgress` updates into the store. The client (typically fastSDK) polls `/status/{job_id}` until `finished` and receives the result, with any returned `AudioFile` serialized as a `FileModel`. Without a queue the same conversion happens inline and the response returns directly. On RunPod, the identical user function is reached through `handler → _router(path) → file handling → execute`, proving the core principle: the function is written once, the backend decides how it runs. diff --git a/test/test_streaming.py b/test/test_streaming.py index 870333f..f52d059 100644 --- a/test/test_streaming.py +++ b/test/test_streaming.py @@ -155,7 +155,7 @@ def test_status_returns_full_result_when_not_streaming(): if body.get("result") is not None: full_result = body["result"] break - if body.get("status") in ("completed", "failed", "not_found"): + if body.get("status") in ("finished", "failed", "timeout", "not_found"): full_result = body.get("result") break assert full_result == "".join(TEXT_TOKENS) From 003725d662c1e8a5720e947bf651c86d30edd63e Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Mon, 15 Jun 2026 06:24:41 +0200 Subject: [PATCH 13/38] housekeeping regarding function analysis methods. Moving them into the right files --- .../backend/fastapi/file_handling_mixin.py | 4 +- apipod/engine/backend/runpod/router.py | 3 +- apipod/engine/backend/schema_resolve.py | 6 +-- apipod/engine/endpoint_config.py | 33 ++----------- apipod/engine/jobs/job_progress.py | 20 -------- apipod/engine/queue/job_queue.py | 2 +- apipod/engine/signatures/analysis.py | 47 +++++++++++++++++++ 7 files changed, 57 insertions(+), 58 deletions(-) create mode 100644 apipod/engine/signatures/analysis.py diff --git a/apipod/engine/backend/fastapi/file_handling_mixin.py b/apipod/engine/backend/fastapi/file_handling_mixin.py index ce34d22..4913d98 100644 --- a/apipod/engine/backend/fastapi/file_handling_mixin.py +++ b/apipod/engine/backend/fastapi/file_handling_mixin.py @@ -7,6 +7,8 @@ from apipod.engine.signatures.policies import FastAPISignaturePolicies from apipod.engine.files.base_file_mixin import _BaseFileHandlingMixin from apipod.engine.utils import replace_func_signature +from apipod.engine.signatures.analysis import job_progress_param_names +from apipod.engine.jobs.job_progress import JobProgress from media_toolkit import MediaList, MediaDict, ImageFile, AudioFile, VideoFile, MediaFile import functools @@ -249,8 +251,6 @@ def _inject_dummy_job_progress(self, func: Callable) -> Callable: Wrap the function to inject a dummy JobProgress instance if the original function expects one. This is used for non-queued FastAPI endpoints. """ - from apipod.engine.jobs.job_progress import JobProgress, job_progress_param_names - job_progress_params = job_progress_param_names(func) if not job_progress_params: return func diff --git a/apipod/engine/backend/runpod/router.py b/apipod/engine/backend/runpod/router.py index 6ee2fca..07f35ee 100644 --- a/apipod/engine/backend/runpod/router.py +++ b/apipod/engine/backend/runpod/router.py @@ -6,10 +6,11 @@ from apipod.common import constants from apipod.engine.jobs.base_job import BaseJob, JOB_STATUS -from apipod.engine.jobs.job_progress import JobProgressRunpod, job_progress_param_names +from apipod.engine.jobs.job_progress import JobProgressRunpod from apipod.engine.jobs.job_result import JobResultFactory from apipod.engine.base_backend import _BaseBackend from apipod.engine.endpoint_config import build_plan, EndpointExecutionPlan +from apipod.engine.signatures.analysis import job_progress_param_names from apipod.engine.files.base_file_mixin import _BaseFileHandlingMixin from apipod.engine.backend.schema_resolve import ( SchemaBinding, diff --git a/apipod/engine/backend/schema_resolve.py b/apipod/engine/backend/schema_resolve.py index 5f7d4e6..3ec988c 100644 --- a/apipod/engine/backend/schema_resolve.py +++ b/apipod/engine/backend/schema_resolve.py @@ -31,6 +31,7 @@ from apipod.common.schemas import * from apipod.engine.files.base_file_mixin import parse_schema_media_fields +from apipod.engine.signatures.analysis import is_injected_progress_param @dataclass(frozen=True) @@ -126,10 +127,7 @@ def get_schema_binding(func: Callable) -> Optional[SchemaBinding]: def _is_injected_param(param: inspect.Parameter) -> bool: """True for parameters the framework supplies (job progress, self/cls).""" - return ( - param.name in ("self", "cls", "job_progress") - or "JobProgress" in str(param.annotation) - ) + return param.name in ("self", "cls") or is_injected_progress_param(param) def _validate_schema_endpoint_signature(func: Callable, binding: SchemaBinding) -> None: diff --git a/apipod/engine/endpoint_config.py b/apipod/engine/endpoint_config.py index db10bac..1eca91c 100644 --- a/apipod/engine/endpoint_config.py +++ b/apipod/engine/endpoint_config.py @@ -1,19 +1,12 @@ """ Endpoint planning: backend-neutral analysis of an endpoint function. - -``is_streaming_endpoint`` inspects a function's definition to decide whether -it streams its output. ``build_plan`` combines that with schema detection and -optional backend-specific parameters (queue, upload limits, …) into an -immutable :class:`EndpointExecutionPlan` — the shared contract used by every -backend (FastAPI, RunPod). """ -import inspect -from collections.abc import AsyncIterator, Iterator from dataclasses import dataclass, field -from typing import Any, Callable, get_origin, get_type_hints +from typing import Any, Callable, Optional from apipod.engine.backend.schema_resolve import SchemaBinding, get_schema_binding +from apipod.engine.signatures.analysis import is_streaming_endpoint @dataclass(frozen=True) @@ -45,26 +38,6 @@ def active_methods(self) -> list[str]: return ["POST"] if self.methods is None else self.methods -def is_streaming_endpoint(func: Callable) -> bool: - """Backend-neutral: True if *func* is a generator or annotated as an Iterator. - - A generator function (``yield``) or async generator function (``async yield``) - is always considered streaming. A regular function whose return annotation - is ``Iterator[...]`` / ``AsyncIterator[...]`` or any subclass is also detected. - """ - target = inspect.unwrap(func) - if inspect.isgeneratorfunction(target) or inspect.isasyncgenfunction(target): - return True - try: - return_type = get_type_hints(target).get("return") - except Exception: - return False - if return_type is None: - return False - origin = get_origin(return_type) or return_type - return inspect.isclass(origin) and issubclass(origin, (Iterator, AsyncIterator)) - - def build_plan( func: Callable, path: str, @@ -92,5 +65,5 @@ def build_plan( route_args=route_args, route_kwargs=route_kwargs if route_kwargs is not None else {}, schema_binding=schema_binding, - is_streaming=schema_binding is None and is_streaming_endpoint(func), + is_streaming=schema_binding is None and is_streaming_endpoint(func) ) diff --git a/apipod/engine/jobs/job_progress.py b/apipod/engine/jobs/job_progress.py index 8e4d062..9817909 100644 --- a/apipod/engine/jobs/job_progress.py +++ b/apipod/engine/jobs/job_progress.py @@ -1,28 +1,8 @@ -import inspect import logging -from typing import Callable, List logger = logging.getLogger(__name__) -def job_progress_param_names(func: Callable) -> List[str]: - """Names of the parameters of *func* that should receive a :class:`JobProgress`. - - A parameter qualifies when it is literally named ``job_progress`` or when its - annotation refers to a ``JobProgress`` type. This single detection is shared - by every injection site (queue worker, RunPod handler, direct FastAPI path) - so they can never disagree about what counts as a progress parameter. - """ - try: - params = inspect.signature(func).parameters.values() - except (TypeError, ValueError): - return [] - return [ - p.name for p in params - if p.name == "job_progress" or "JobProgress" in str(p.annotation) - ] - - class JobProgress: """Live progress handle for a running job. diff --git a/apipod/engine/queue/job_queue.py b/apipod/engine/queue/job_queue.py index ee9dd92..292e423 100644 --- a/apipod/engine/queue/job_queue.py +++ b/apipod/engine/queue/job_queue.py @@ -6,7 +6,7 @@ from apipod.engine.queue.job_store import JobStore from apipod.engine.jobs.base_job import BaseJob, LocalJob, JOB_STATUS -from apipod.engine.jobs.job_progress import job_progress_param_names +from apipod.engine.signatures.analysis import job_progress_param_names from apipod.engine.queue.job_queue_interface import JobQueueInterface from apipod.engine.streaming.stream_producer import StreamProducer diff --git a/apipod/engine/signatures/analysis.py b/apipod/engine/signatures/analysis.py new file mode 100644 index 0000000..7f41d91 --- /dev/null +++ b/apipod/engine/signatures/analysis.py @@ -0,0 +1,47 @@ +""" +Backend-neutral analysis of function signatures and return types. +""" + +import inspect +from collections.abc import AsyncIterator, Iterator +from typing import Any, Callable, get_origin, get_type_hints + + +def is_streaming_endpoint(func: Callable) -> bool: + """Backend-neutral: True if *func* is a generator or annotated as an Iterator. + + A generator function (``yield``) or async generator function (``async yield``) + is always considered streaming. A regular function whose return annotation + is ``Iterator[...]`` / ``AsyncIterator[...]`` or any subclass is also detected. + """ + target = inspect.unwrap(func) + if inspect.isgeneratorfunction(target) or inspect.isasyncgenfunction(target): + return True + try: + return_type = get_type_hints(target).get("return") + except Exception: + return False + if return_type is None: + return False + origin = get_origin(return_type) or return_type + return inspect.isclass(origin) and issubclass(origin, (Iterator, AsyncIterator)) + + +def is_injected_progress_param(param: inspect.Parameter) -> bool: + """True if the parameter is a framework-injected :class:`JobProgress`.""" + return param.name == "job_progress" or "JobProgress" in str(param.annotation) + + +def job_progress_param_names(func: Callable) -> list[str]: + """Names of the parameters of *func* that should receive a :class:`JobProgress`. + + A parameter qualifies when it is literally named ``job_progress`` or when its + annotation refers to a ``JobProgress`` type. This single detection is shared + by every injection site (queue worker, RunPod handler, direct FastAPI path) + so they can never disagree about what counts as a progress parameter. + """ + try: + params = inspect.signature(func).parameters.values() + except (TypeError, ValueError): + return [] + return [p.name for p in params if is_injected_progress_param(p)] From 1a813378d8f5a2a94be020496c73421ec39bc89a Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Tue, 16 Jun 2026 16:22:22 +0200 Subject: [PATCH 14/38] Replaced the orchestrator, provider, compute triplets with a single command. apipod --simulate serverless-runpod. Introduced the simulate and --direct flags for developer flexibility. Introduced a cert for overwriting settings when managed by socaity --- README.md | 320 ++++++------------- apipod/api.py | 225 ++++++------- apipod/cli.py | 214 ++++++++----- apipod/common/constants.py | 5 - apipod/common/settings.py | 24 +- apipod/deploy/docker_template.j2 | 1 - apipod/engine/backend/runpod/router.py | 19 +- docs/{README_TECH.md => TECHNICAL_README.md} | 32 +- test/test_config_resolution.py | 129 +++----- test/test_core_functionalities.py | 2 +- test/test_streaming.py | 14 +- 11 files changed, 432 insertions(+), 553 deletions(-) rename docs/{README_TECH.md => TECHNICAL_README.md} (81%) diff --git a/README.md b/README.md index 36d645e..929ed03 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,17 @@

- APIPod is the way for building and deploying AI services.
- Combining the developer experience of FastAPI with the power of Serverless GPU computing. + APIPod combines the developer experience of FastAPI with the power of Serverless GPU computing.
+ Write your service like FastAPI. Run it anywhere with a single command.
+ Think Vercel — but for AI services.

Why APIPodInstallationQuick Start • - Deployment + Develop & Test • + Build & Deploy

--- @@ -25,14 +27,16 @@ Building AI services is complex: file handling, long-running inference, job queues, deployment, scaling, and hosting provider choices all create friction at every step. -**APIPod** solves this by standardizing the entire stack. +**APIPod** eliminates that friction. It abstracts away the AI infrastructure stack so you can focus on your model. You write the service; [Socaity](https://www.socaity.ai) handles the deployment and scaling across any cloud. -### 🚀 Highlights -1. **Write Powerful APIs Instantly**: Built on top of FastAPI, it feels familiar but comes with batteries included for AI services. -2. **Standardized I/O**: Painless handling of Images, Audio, and Video via [MediaToolkit](https://github.com/SocAIty/media-toolkit). -3. **Automatic packaging**: The package can configure docker and deployment for you. No Cuda hell; the package knows compatible options. -4. **Streamlined Deployment**: Deploy as a standard container or to serverless providers (**Socaity.ai** or **RunPod**) with zero configuration changes. Auth included. -5. **Native SDK**: Built-in support for **Asynchronous Job Queues**, polling & and progress tracking via [fastSDK](https://github.com/SocAIty/fastSDK) +### Highlights + +1. **Write once, run anywhere** — the same code runs in development, in serverless emulation, or on a real GPU cloud. Zero changes between environments. +2. **Drop-in FastAPI** — if you know FastAPI, you already know APIPod. Built on top of it, with batteries included for AI. +3. **Standardized I/O** — painless Images, Audio and Video via [media-toolkit](https://github.com/SocAIty/media-toolkit). +4. **OpenAI-compatible schemas** — built-in request/response schemas for chat, completions, embeddings, TTS, transcription, image/video generation. OpenAI clients work out of the box. +5. **Built-in job queue** — async jobs, polling and progress tracking, with no Celery/Redis/Kubernetes to wire up. +6. **One-command packaging** — `apipod --build` generates your Dockerfile. No CUDA hell; APIPod picks compatible images. ## Installation @@ -42,46 +46,41 @@ pip install apipod ## Quick Start -### 1. Create your Service - -Zero-Hassle Migration: Replacing `FastAPI` with `APIPod` gives you instant access to all APIPod capablities.. +`APIPod` is a drop-in replacement for `FastAPI`. You get all of APIPod's capabilities with no migration cost. ```python from apipod import APIPod, ImageFile -# 1. Initialize APIPod (Drop-in replacement for FastAPI) +# Drop-in replacement for FastAPI app = APIPod() -# 2. Define a standard endpoint (Synchronous) +# A standard endpoint @app.endpoint("/hello") def hello(name: str): return f"Hello {name}!" -# 2. Use built-in media processing -@app.endpoint("/process_image", queue_size=10) +# Built-in media processing — uploads/URLs/base64 are parsed for you +@app.endpoint("/process_image") def process_image(image: ImageFile): - # APIPod handles the file upload/parsing automatically img_array = image.to_np_array() - # ... run your AI model here ... - return ImageFile().from_np_array(img_array) -# 4. Run the server if __name__ == "__main__": app.start() ``` -### 2. Run Locally +Run it and open `http://localhost:8000/docs` for the auto-generated Swagger UI. + ```bash python main.py +# or +apipod --start ``` -Visit `http://localhost:8000/docs` to see your auto-generated Swagger UI. -## Features in Depth +## Smart File Handling -### 📁 Smart File Handling -Forget about parsing `multipart/form-data`, `base64`, or `bytes`. APIPod integrates with **MediaToolkit** to handle files as objects. +Forget about parsing `multipart/form-data`, `base64`, or `bytes`. APIPod integrates with **MediaToolkit** to handle files as objects. Whether the client sends a file upload, a URL, or a base64 string, your endpoint receives a ready-to-use object. ```python from apipod import AudioFile @@ -93,262 +92,143 @@ def transcribe(audio: AudioFile): return {"transcription": "..."} ``` -### 🤖 Standardized AI schemas (OpenAI-compatible) +## AI Services Streamlined (OpenAI-compatible) -APIPod ships request/response schemas for the common AI payloads: chat, completions, embeddings, image/video/3D generation, vision, transcription, text-to-speech and voice cloning. Annotate one parameter with a request schema and APIPod handles validation, media parsing, response wrapping and streaming. The wire format mirrors the OpenAI API, so OpenAI-compatible clients work out of the box. `model` is optional everywhere — your service usually *is* the model. - -**Chat** — return a plain string (or a dict / full response object) and get a complete `chat.completion` envelope. For `"stream": true` requests just yield raw tokens: APIPod wraps each into a `ChatCompletionChunk` server-sent event — generating the chunk `id`, `created` and `object` out of the box — and emits the closing chunk plus the `[DONE]` sentinel: +APIPod provides built-in request/response schemas for common AI tasks (chat, TTS, image gen, etc.) that are fully OpenAI-compatible. This allows you to focus on the model logic while APIPod handles the boilerplate of validation, media parsing, and streaming. ```python -from apipod import APIPod from apipod.common.schemas import ChatCompletionRequest -app = APIPod() - @app.endpoint("/chat") def chat(request: ChatCompletionRequest): if request.stream: # Yield plain tokens — APIPod wraps them into ChatCompletionChunk SSE events. - return my_llm.stream(request.messages, temperature=request.temperature) - answer = my_llm.generate(request.messages, temperature=request.temperature) - return answer # auto-wrapped into a ChatCompletionResponse + return my_llm.stream(request.messages) + return my_llm.generate(request.messages) # auto-wrapped into ChatCompletionResponse ``` -**Text-to-speech** — return an `AudioFile`; clients get a JSON envelope with the audio as base64, or raw audio chunks when they send `"stream": true`: +## Asynchronous Jobs & Scaling -```python -from apipod import AudioFile -from apipod.common.schemas import SpeechRequest - -@app.endpoint("/audio/speech") -def speak(request: SpeechRequest): - # request.voice is a named voice (str) or an already-parsed AudioFile for cloning - samples, rate = my_tts.synthesize(request.input, voice=request.voice) - return AudioFile().from_np_array(samples, sample_rate=rate, audio_format="wav") -``` - -**Image generation** — media fields inside schemas (e.g. `request.image` for img2img) arrive as parsed media-toolkit objects, no matter if the client sent an upload, URL or base64: +For long-running tasks, APIPod provides a built-in job queue and progress reporting. When configured for serverless or with a queue, endpoints automatically return a `job_id` and run in the background. ```python -from apipod import ImageFile -from apipod.common.schemas import ImageGenerationRequest - -@app.endpoint("/images/generations") -def generate(request: ImageGenerationRequest): - init_image = request.image.to_np_array() if request.image else None # ImageFile, ready to use - result = my_model.generate(request.prompt, image=init_image, seed=request.seed) - return ImageFile().from_np_array(result) # auto-wrapped into ImageGenerationResponse +from apipod import JobProgress + +@app.post("/generate", queue_size=50) +def generate(job_progress: JobProgress, prompt: str): + job_progress.set_status(0.1, "Initializing model...") + # ... heavy computation ... + job_progress.set_status(1.0, "Done!") + return "Generation Complete" ``` -Need extra parameters? Subclass a schema (`class MyRequest(SpeechRequest): style: str = "calm"`) — detection and wrapping keep working. - -### ☁️ Serverless Routing -When deploying to serverless platforms like **RunPod**, standard web frameworks often fail because they lack the necessary routing logic for the platform's specific entry points. **APIPod** detects the environment and handles the routing automatically—no separate "handler" function required. +* **Client:** Receives a `job_id` immediately. +* **Server:** Processes the task in the background. +* **SDK:** Automatically polls for status and result. +## Develop, Test, and Simulate -### 🔄 Scaling services, Asynchronous Jobs, Polling and Job Progress - -Let's say you want to serve your service to many users or you have a long-running task. -Usually you need to set-up a load-balancer, kubernetes, brokers and a lot of other complicated stuff. -If you deploy to socaity / runpod this is taken care of for you. No Dev-Ops for you. - -We allow you to emulate this behaviour for testing. - -For long-running tasks (e.g., inference of a large model), you don't want to block the HTTP request. -Often you want to be able to give a progress bar or updates about the current task to the user. This is what job progress is for. -It allows you to communicate a progress percentage and a status message to your user. - - - -1. **Setup test environment for serverless (Job Queue)**: - ```python - # Initialize with serverless compute on localhost to enable the local job queue - app = APIPod(compute="serverless", provider="localhost") - ``` - -2. **Define Endpoint**: - Use `@app.endpoint` (or `@app.post`). It automatically becomes a background task when a queue is configured. - ```python - @app.post("/generate", queue_size=50) - def generate(job_progress: JobProgress, prompt: str): - job_progress.set_status(0.1, "Initializing model...") - # ... heavy computation ... - job_progress.set_status(1.0, "Done!") - return "Generation Complete" - ``` - - * **Client:** Receives a `job_id` immediately. - * **Server:** Processes the task in the background. - * **[SDK](https://github.com/SocAIty/fastSDK):** Automatically polls for status and result. - -3. **Opt-out**: - If you want a standard synchronous endpoint even when queue is enabled: - ```python - @app.endpoint("/ping", use_queue=False) - def ping(): - return "pong" - ``` - - -# Deployment -APIPod is designed to run anywhere by leveraging docker. -

- Build & configure • - Deploy -

+Just say *how you want to run the service right now*. -## Create & configure container +### Development (default) -All you need to do is run: +Plain FastAPI. The fastest iteration loop. ```bash -apipod build +apipod --start +# or simply +python main.py ``` -This command creates the dockerfile for you, and select the correct docker template and cuda/cudnn versions and comes with ffmpeg installed. - -- For most users this already creates a sufficient solution. -- However you are always free to create or customize the Dockerfile for your needs. - -Requirements: -1. docker installed on your system. -2. Depending on your setup a cuda/cudnn installation +### Simulate a deployment -### APIPod Configuration -APIPod provides a flexible deployment configuration that allows developers to: -- Run services locally for development -- Deploy via the Socaity orchestration platform -- Deploy directly to cloud providers -- Choose between serverless or dedicated compute +Before you ship, run your service exactly how it will behave in production — locally, with **no code changes**. `--simulate` takes an optional target string `{compute}-{provider}` (compute defaults to `serverless`). -The configuration is controlled through a combination of: -- orchestrator -- compute -- provider -- region -- CPU/GPU - - -| Orchestrator | Compute | Provider | Resulting Backend | -| ---------------- | ------------ | ----------- | --------------------------------- | -| `socaity` | `dedicated` | `auto` | FastAPI | -| `socaity` | `dedicated` | `localhost` | FastAPI + job queue *(test mode)* | -| `socaity` | `dedicated` | `runpod` | FastAPI + load balancer *(Coming soon)* | -| `socaity` | `dedicated` | `scaleway` | FastAPI *(Coming soon)* | -| `socaity` | `dedicated` | `azure` | FastAPI *(Coming soon)* | -| `socaity` | `serverless` | `auto` | RunPod router backend | -| `socaity` | `serverless` | `localhost` | FastAPI + job queue *(test mode)* | -| `socaity` | `serverless` | `runpod` | RunPod router backend | -| `socaity` | `serverless` | `scaleway` | ❌ Not supported | -| `socaity` | `serverless` | `azure` | ❌ Not supported | -| `local` / `None` | `dedicated` | `localhost` | FastAPI | -| `local` / `None` | `dedicated` | `runpod` | FastAPI | -| `local` / `None` | `dedicated` | `scaleway` | FastAPI | -| `local` / `None` | `dedicated` | `azure` | FastAPI | -| `local` / `None` | `serverless` | `localhost` | FastAPI + job queue | -| `local` / `None` | `serverless` | `runpod` | RunPod router backend | -| `local` / `None` | `serverless` | `scaleway` | ❌ Not supported | -| `local` / `None` | `serverless` | `azure` | ❌ Not supported | -| `local` / `None` | `localhost` | `localhost` | FastAPI | +```bash +apipod --simulate # serverless emulation: FastAPI + local job queue +apipod --simulate serverless # same as above +apipod --simulate dedicated # plain FastAPI (dedicated compute) +apipod --simulate serverless-runpod # emulate Socaity routing requests to RunPod +apipod --simulate dedicated-azure # emulate a dedicated Azure deployment +``` +If a provider has no serverless offering, APIPod warns and falls back to the job-queue emulation: +```bash +apipod --simulate serverless-azure +# Warning: azure does not support serverless. Defaulting to FastAPI + Local Job Queue. +``` +### Emulate a provider's native worker (`--direct`) -### 🔄 Queue Backend Support +By default Socaity is the orchestrator. `--direct` skips Socaity and runs the provider's **own** serverless backend locally — e.g. RunPod's serverless worker (requires the `runpod` package): -APIPod supports multiple job queue backends to handle different deployment scenarios and scaling needs. +```bash +apipod --simulate serverless-runpod --direct +``` -#### Available Backends +### Configure from Python -- **None** (default): Standard FastAPI behavior. No background jobs. - -- **Local Queue** (`local`): In-memory job queue using threading. - - Perfect for local development and single-instance deployments - - No external dependencies required +The same intent can be set in code. Socaity **overrides** it with env vars once the service is actually managed by the platform, so what you test is what you ship. -#### Configuration +```python +app = APIPod() # development (plain FastAPI) +app = APIPod(simulate="serverless") # FastAPI + local job queue +app = APIPod(simulate="serverless-runpod", direct=True) # RunPod native worker (local) +``` - ```python - # Job queues are automatically enabled based on your configuration. - # For example, serverless + localhost enables a local job queue for testing: - app = APIPod(compute="serverless", provider="localhost") +## Build & Deploy - # Or via environment variables - import os - os.environ["APIPOD_COMPUTE"] = "serverless" - os.environ["APIPOD_PROVIDER"] = "localhost" +### Build a container - app = APIPod() # Uses environment config - ``` +```bash +apipod --build +``` -### Troubleshooting +This scans your project, picks a compatible base image (CUDA/cuDNN, ffmpeg included) and generates a `Dockerfile`. For most users this is all you need; advanced users can edit or write their own Dockerfile. -You are always free to create or edit the Dockerfile for your needs. -Depending on your OS, your machine or your project setup you might occur one of those issues: -- Build scripts fails -- You can't build the docker container. +Requirements: Docker installed, plus a CUDA/cuDNN setup if your model needs the GPU. -In this cases don't -Advanced users can also configure or write the docker file for themselves +### Deploy -## Deploy to socaity -Right after build you can deploy the service via the [socaity.ai](https://www.socaity.ai) dashboard. -This is the simplest option. +```bash +apipod --deploy # coming soon +apipod --deploy serverless +apipod --deploy dedicated-azure +``` -## Deploy to runpod. -1. You will need to build the your docker image. -2. Push your image to your dockerhub repository. -3. Deploy on RunPod Serverless by using the runpod dashboard. - * *APIPod acts as the handler, managing job inputs/outputs compatible with RunPod's API.* +The managed `--deploy` command is on the roadmap. Today, build your container and deploy it through the [Socaity dashboard](https://www.socaity.ai) — the simplest path, with auth, scaling and routing handled for you. -Make sure that the environment variables are set to the following: ```APIPOD_COMPUTE="serverless"``` and ```APIPOD_PROVIDER="runpod"``` +## Client SDK +Generate a typed client for your service using the [fastSDK](https://github.com/SocAIty/fastSDK). It handles authentication, file uploads, and automatic polling for background jobs. -## Debugging APIPod serverless -You can configure your environment variables so that APIPod acts as if it were deployed on socaity.ai or on runpod. ```bash -# Orchestrator -ENV APIPOD_ORCHESTRATOR="local" # Options: "local" (default), "socaity" - -# Compute type -ENV APIPOD_COMPUTE="serverless" # Options: "dedicated" (default), "serverless" - -# Infrastructure provider -ENV APIPOD_PROVIDER="runpod" # Options: "localhost" (default), "auto", "runpod", "scaleway", "azure" +fastsdk generate http://localhost:8009 -o myClient.py ``` - -# Client SDK - -While you can use `curl` or `requests`, our [FastSDK](https://github.com/SocAIty/fastSDK) makes interacting with APIPod services feel like calling native Python functions. - ```python -# The SDK handles authentication, file uploads, and result polling -# create a full working client stub -create_sdk("https://localhost:8000", save_path="my_service.py") - -# Import the client. It will have a method for each of your service endpoints including all parameters and its default values. -from my_service import awesome_client -mySDK = awesome_client() -mySDK.my_method(...) +from myClient import myService -# Blocks until the remote job is finished -result = task.get_result() +client = myService() +client.text_to_speech("what a time to be alive") ``` -# Comparison +## Comparison | Feature | APIPod | FastAPI | Celery | Replicate/Cog | | :--- | :---: | :---: | :---: | :---: | -| **Setup Difficulty** | ⭐ Easy | ⭐ Easy | ⭐⭐⭐ Hard | ⭐⭐ Medium | +| **Setup Difficulty** | Easy | Easy | Hard | Medium | | **Async/Job Queue** | ✅ Built-in | ❌ Manual | ✅ Native | ✅ Native | | **Serverless Ready** | ✅ Native | ❌ Manual | ❌ No | ✅ Native | | **File Handling** | ✅ Standardized | ⚠️ Manual | ❌ Manual | ❌ Manual | | **Router Support** | ✅ | ✅ | ❌ | ❌ | +| **Multi-cloud** | ✅ | ❌ | ❌ | ❌ | ## Roadmap + +- `apipod --deploy` managed deployment command. - MCP protocol support. -- Improve async support. ---

diff --git a/apipod/api.py b/apipod/api.py index e95f726..97f11a3 100644 --- a/apipod/api.py +++ b/apipod/api.py @@ -1,162 +1,133 @@ -from apipod.common import constants -from apipod.common.settings import APIPOD_ORCHESTRATOR, APIPOD_COMPUTE, APIPOD_PROVIDER -from apipod.engine.base_backend import _BaseBackend -from apipod.engine.backend.runpod.router import SocaityRunpodRouter +from typing import Optional, Tuple, Union + +from apipod.common.constants import COMPUTE, PROVIDER +from apipod.common.settings import ( + APIPOD_COMPUTE, + APIPOD_DIRECT, + APIPOD_PROVIDER, + APIPOD_SIMULATE, + IS_MANAGED_DEPLOYMENT, +) from apipod.engine.backend.fastapi.router import SocaityFastAPIRouter -from apipod.engine.queue.job_queue_interface import JobQueueInterface +from apipod.engine.backend.runpod.router import SocaityRunpodRouter -from typing import Union +# (backend_class, use_job_queue, runpod_simulate) +_Resolution = Tuple[type, bool, bool] + +_NO_SERVERLESS = (PROVIDER.AZURE, PROVIDER.SCALEWAY) def APIPod( - orchestrator: Union[constants.ORCHESTRATOR, str, None] = None, - compute: Union[constants.COMPUTE, str, None] = None, - provider: Union[constants.PROVIDER, str, None] = None, + simulate: Union[str, None] = None, + direct: Union[bool, None] = None, *args, **kwargs -) -> Union[_BaseBackend, SocaityRunpodRouter, SocaityFastAPIRouter]: +) -> Union[SocaityFastAPIRouter, SocaityRunpodRouter]: """ - Initialize an APIPod router with the appropriate backend based on the deployment configuration. - - The resulting backend is determined by the combination of orchestrator, compute, and provider: - - | Orchestrator | Compute | Provider | Backend | - |------------- |----------- |---------- |--------------------------- | - | socaity | dedicated | auto | FastAPI | - | socaity | dedicated | localhost | FastAPI + job queue (test) | - | socaity | dedicated | socaity | FastAPI + redis (prod) | - | socaity | dedicated | runpod | Celery (planned) | - | socaity | dedicated | scaleway | Celery (planned) | - | socaity | dedicated | azure | Celery (planned) | - | socaity | serverless | auto | RunPod router | - | socaity | serverless | localhost | FastAPI + job queue (test) | - | socaity | serverless | runpod | RunPod router | - | socaity | serverless | scaleway | Not supported | - | socaity | serverless | azure | Not supported | - | local/None | dedicated | * | FastAPI | - | local/None | serverless | localhost | FastAPI + job queue | - | local/None | serverless | runpod | RunPod router | - | local/None | serverless | scaleway | Not supported | - | local/None | serverless | azure | Not supported | + Build the right backend for an APIPod service from a single *intent*. + + Socaity is the implicit orchestrator, so you never wire infrastructure by hand. + You only pick how the service should run *locally*: + + - **Development** (default, ``APIPod()``): plain FastAPI — the fastest loop. + - **Simulation** (``simulate="{compute}-{provider}"``): emulate a deployment + locally. The target collapses compute + provider, e.g. ``"serverless"``, + ``"serverless-runpod"``, ``"dedicated-azure"``. Compute defaults to + ``serverless``. ``direct=True`` bypasses Socaity to emulate the provider's + own serverless worker (currently RunPod). + + In a **managed deployment** (``SOCAITY_DEPLOYMENT_CERT`` verified) ``simulate`` + and ``direct`` are ignored: Socaity injects ``APIPOD_COMPUTE`` / + ``APIPOD_PROVIDER`` and the real backend is selected from them. Args: - orchestrator: "socaity" or "local" (default from env / local). - compute: "dedicated" or "serverless" (default from env / dedicated). - provider: "auto", "localhost", "socaity", "runpod", "scaleway", "azure" (default from env / localhost). + simulate: deployment target to emulate, ``"{compute}-{provider}"``. + ``None`` runs plain FastAPI for development. + direct: emulate the provider's native serverless worker instead of the + Socaity job-queue emulation. Only affects ``serverless-runpod``. """ - orchestrator = _resolve_enum(orchestrator, constants.ORCHESTRATOR, APIPOD_ORCHESTRATOR, constants.ORCHESTRATOR.LOCAL) - compute = _resolve_enum(compute, constants.COMPUTE, APIPOD_COMPUTE, constants.COMPUTE.DEDICATED) - provider = _resolve_enum(provider, constants.PROVIDER, APIPOD_PROVIDER, constants.PROVIDER.LOCALHOST) + if IS_MANAGED_DEPLOYMENT: + backend_class, use_job_queue, runpod_simulate = _resolve_managed() + else: + backend_class, use_job_queue, runpod_simulate = _resolve_intent(simulate, direct) - backend_class, use_job_queue = _resolve_backend(orchestrator, compute, provider) + if backend_class is SocaityRunpodRouter: + return SocaityRunpodRouter(simulate=runpod_simulate, *args, **kwargs) - custom_job_queue = kwargs.pop("job_queue", None) - if custom_job_queue: + # FastAPI backend: a job queue (+ stream store) turns it into the serverless + # emulation; without one it is plain FastAPI. A deployment may inject its own. + job_queue = kwargs.pop("job_queue", None) + if job_queue is not None: use_job_queue = True - job_queue = custom_job_queue - else: + elif use_job_queue: from apipod.engine.queue.job_queue import JobQueue - job_queue = JobQueue() if use_job_queue else None - - if backend_class == SocaityFastAPIRouter: - # Streaming (serverless emulation): when a queue runs, the worker relays - # streaming output into a stream store consumed via GET /stream/{job_id}. - # Default to the in-memory LocalStreamStore; a deployment can inject its - # own (e.g. Redis-backed) store. Plain FastAPI (no queue) streams directly - # and uses no stream store. - if use_job_queue and "stream_store" not in kwargs: - kwargs["stream_store"] = _create_stream_store() - return backend_class(job_queue=job_queue, *args, **kwargs) - else: - return backend_class(*args, **kwargs) - - -def _resolve_enum(value, enum_cls, env_default, fallback): - """Coerce a value into an enum member, falling back through env default and hard default.""" - if value is None: - value = env_default - if isinstance(value, str): - try: - return enum_cls(value) - except ValueError: - raise ValueError(f"Invalid {enum_cls.__name__} value: '{value}'. Choose from: {[e.value for e in enum_cls]}") - if isinstance(value, enum_cls): - return value - return fallback - - -def _resolve_backend( - orchestrator: constants.ORCHESTRATOR, - compute: constants.COMPUTE, - provider: constants.PROVIDER, -) -> tuple: - """ - Apply the configuration matrix and return (backend_class, use_job_queue). - Raises for unsupported or not-yet-implemented combinations. - """ - _raise_if_unsupported(compute, provider) + job_queue = JobQueue() - if orchestrator == constants.ORCHESTRATOR.SOCAITY: - return _resolve_socaity(compute, provider) + if use_job_queue and "stream_store" not in kwargs: + kwargs["stream_store"] = _create_stream_store() - return _resolve_local(compute, provider) + return SocaityFastAPIRouter(job_queue=job_queue, *args, **kwargs) -def _raise_if_unsupported(compute: constants.COMPUTE, provider: constants.PROVIDER): - unsupported = { - (constants.COMPUTE.SERVERLESS, constants.PROVIDER.SCALEWAY), - (constants.COMPUTE.SERVERLESS, constants.PROVIDER.AZURE), - } - if (compute, provider) in unsupported: - raise NotImplementedError( - f"Serverless compute on {provider.value} is not supported. " - f"Use provider='runpod' for serverless or switch to dedicated compute." - ) +def _resolve_intent(simulate: Optional[str], direct: Optional[bool]) -> _Resolution: + """Resolve a local run (development or simulation) into a backend selection.""" + target = APIPOD_SIMULATE if simulate is None else simulate + # Development: no simulation requested -> plain FastAPI. + if simulate is None and not APIPOD_SIMULATE: + return SocaityFastAPIRouter, False, False -def _resolve_socaity(compute: constants.COMPUTE, provider: constants.PROVIDER) -> tuple: - if compute == constants.COMPUTE.DEDICATED: - if provider == constants.PROVIDER.SOCAITY: - return SocaityFastAPIRouter, True + direct = APIPOD_DIRECT if direct is None else bool(direct) + compute, provider = _parse_target(target) - if provider in (constants.PROVIDER.RUNPOD, constants.PROVIDER.SCALEWAY, constants.PROVIDER.AZURE): - raise NotImplementedError( - f"Celery backend for socaity + dedicated + {provider.value} is planned but not yet available." - ) - if provider == constants.PROVIDER.LOCALHOST: - return SocaityFastAPIRouter, True - # auto or any other -> FastAPI without queue - return SocaityFastAPIRouter, False + if compute is COMPUTE.DEDICATED: + # "Standard FastAPI"; with a named provider it emulates a direct client. + return SocaityFastAPIRouter, False, False # serverless - if provider == constants.PROVIDER.LOCALHOST: - return SocaityFastAPIRouter, True - # auto or runpod -> RunPod router - return SocaityRunpodRouter, False + if provider in _NO_SERVERLESS: + print(f"Warning: {provider.value} does not support serverless. " + f"Defaulting to FastAPI + Local Job Queue.") + return SocaityFastAPIRouter, True, False + if provider is PROVIDER.RUNPOD and direct: + # Emulate RunPod's native serverless worker locally. + return SocaityRunpodRouter, False, True -def _resolve_local(compute: constants.COMPUTE, provider: constants.PROVIDER) -> tuple: - if compute == constants.COMPUTE.DEDICATED: - return SocaityFastAPIRouter, False + # Default serverless: Socaity emulation = FastAPI + Local Job Queue. + return SocaityFastAPIRouter, True, False - # serverless - if provider == constants.PROVIDER.LOCALHOST: - return SocaityFastAPIRouter, True - if provider == constants.PROVIDER.RUNPOD: - return SocaityRunpodRouter, False - # auto -> RunPod router (same default as socaity serverless auto) - if provider == constants.PROVIDER.AUTO: - return SocaityRunpodRouter, False - raise NotImplementedError(f"Unsupported configuration: local + serverless + {provider.value}") +def _resolve_managed() -> _Resolution: + """Pick the real production backend from the env vars Socaity injects.""" + compute = COMPUTE(APIPOD_COMPUTE) + provider = PROVIDER(APIPOD_PROVIDER) + if compute is COMPUTE.SERVERLESS and provider is PROVIDER.RUNPOD: + return SocaityRunpodRouter, False, False # real serverless worker + if compute is COMPUTE.SERVERLESS: + return SocaityFastAPIRouter, True, False + return SocaityFastAPIRouter, False, False # dedicated (queue injected if needed) -def _create_job_queue() -> JobQueueInterface: - from apipod.engine.queue.job_queue import JobQueue - return JobQueue() +def _parse_target(target: str) -> Tuple[COMPUTE, Optional[PROVIDER]]: + """Parse a ``"{compute}-{provider}"`` target. Provider is optional; compute defaults to serverless.""" + if not target: + return COMPUTE.SERVERLESS, None + + compute_str, _, provider_str = target.partition("-") + try: + compute = COMPUTE(compute_str) + except ValueError: + raise ValueError(f"Invalid compute '{compute_str}'. Choose from: {[c.value for c in COMPUTE]}") + + if not provider_str: + return compute, None + try: + return compute, PROVIDER(provider_str) + except ValueError: + raise ValueError(f"Invalid provider '{provider_str}'. Choose from: {[p.value for p in PROVIDER]}") def _create_stream_store(): from apipod.engine.streaming.local_stream_store import LocalStreamStore - return LocalStreamStore() diff --git a/apipod/cli.py b/apipod/cli.py index b2fecaf..c614019 100644 --- a/apipod/cli.py +++ b/apipod/cli.py @@ -1,10 +1,11 @@ import argparse +import importlib.util +import os import sys from pathlib import Path from typing import Optional from apipod.deploy.deployment_manager import DeploymentManager -from apipod.common.constants import ORCHESTRATOR, COMPUTE, PROVIDER def input_yes_no(question: str, default: bool = True) -> bool: @@ -21,6 +22,13 @@ def input_yes_no(question: str, default: bool = True) -> bool: sys.stdout.write("Please respond with 'yes' or 'no' (or 'y'/'n').\n") +def _parse_bool(value) -> Optional[bool]: + """Coerce a CLI flag value into a bool. ``None`` (flag absent) stays ``None``.""" + if value is None or isinstance(value, bool): + return value + return str(value).strip().lower() in ("1", "true", "yes", "y") + + def select_base_image(manager: DeploymentManager, config_data: dict) -> str: """Interactive base image selection process.""" recommended_image = manager.recommend_image(config_data) @@ -64,7 +72,7 @@ def perform_scan(): else: print("Scanning project...") return manager.scan() - + if manager.config_exists: if not input_yes_no(f"Found {manager.config_path.name} in {manager.config_path.parent}/. Overwrite?"): return manager.load_config() @@ -99,40 +107,32 @@ def run_build(args): target_file = None if args.build is not None and args.build is not True: target_file = args.build - + target_path = Path(target_file) if not target_path.exists(): print(f"Error: Target file '{target_file}' does not exist.") return - + if not target_path.is_file(): print(f"Error: '{target_file}' is not a file.") return - + if not target_path.suffix == '.py': print(f"Warning: '{target_file}' is not a Python file (.py)") if not input_yes_no("Continue anyway?", default=False): return - + print(f"Using target file: {target_file}") if manager.dockerfile_exists and not input_yes_no("Deployment config DOCKERFILE exists. Overwrite your deployment config?"): print("Aborting build configuration.") return - should_create_dockerfile = True - config_data = get_or_create_config(manager, target_file) if not config_data: print("Error: Failed to obtain configuration.") return - config_data["orchestrator"] = args.orchestrator - config_data["compute"] = args.compute - config_data["provider"] = args.provider - if args.region: - config_data["region"] = args.region - service_title = config_data.get("title", "apipod-service") final_image = select_base_image(manager, config_data) @@ -146,106 +146,156 @@ def run_build(args): print("Please configure dependencies and try again.") return - if should_create_dockerfile: - print("Generating Dockerfile...") - dockerfile_content = manager.render_dockerfile(final_image, config_data) - manager.write_dockerfile(dockerfile_content) + print("Generating Dockerfile...") + dockerfile_content = manager.render_dockerfile(final_image, config_data) + manager.write_dockerfile(dockerfile_content) if input_yes_no(f"Build the application now using docker? (Tag: {service_title})"): manager.build_docker_image(service_title) -def run_start(args): - """Start an APIPod service with the given configuration.""" - from apipod import APIPod +def _resolve_entrypoint(manager: DeploymentManager, entrypoint: Optional[str]) -> str: + """Return the service entrypoint file, scanning the project when not provided.""" + if entrypoint: + return entrypoint + + config = manager.load_config() if manager.config_exists else None + if not config: + print("No apipod.json found. Scanning project to locate the entrypoint...") + config = manager.scan() + manager.save_config(config) + return config.get("entrypoint", "main.py") - app = APIPod( - orchestrator=args.orchestrator, - compute=args.compute, - provider=args.provider, - ) + +def _load_app(entrypoint: str): + """Import the entrypoint module and return its APIPod application instance.""" + from apipod.engine.base_backend import _BaseBackend + + path = Path(entrypoint).resolve() + if not path.exists(): + raise FileNotFoundError(f"Entrypoint '{entrypoint}' not found.") + + spec = importlib.util.spec_from_file_location("apipod_entrypoint", path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + app = getattr(module, "app", None) + if isinstance(app, _BaseBackend): + return app + for value in vars(module).values(): # fall back to the first app in the module + if isinstance(value, _BaseBackend): + return value + raise RuntimeError(f"No APIPod app found in '{entrypoint}'. Expected an APIPod() instance.") + + +def _run_service(args, simulate: Optional[str], direct: Optional[bool]): + """Resolve the entrypoint, apply the run intent via env vars, and start the app.""" + # The user's service calls APIPod() with no args; it reads the intent from env. + # Set the env BEFORE importing the entrypoint (which imports apipod settings). + if simulate is not None: + os.environ["APIPOD_SIMULATE"] = simulate + if direct is not None: + os.environ["APIPOD_DIRECT"] = "true" if direct else "false" + + manager = DeploymentManager() + entrypoint = _resolve_entrypoint(manager, args.entrypoint) + app = _load_app(entrypoint) port = args.port or 8000 host = args.host or "0.0.0.0" - print(f"Starting APIPod (orchestrator={args.orchestrator}, compute={args.compute}, provider={args.provider})") + mode = "development" if simulate is None else f"simulation '{simulate}'{' --direct' if direct else ''}" + print(f"Starting APIPod ({mode}) from {entrypoint}") app.start(port=port, host=host) +def run_start(args): + """Run the service locally for development (plain FastAPI).""" + _run_service(args, simulate=None, direct=None) + + +def run_simulate(args): + """Run the service locally while emulating a deployment target.""" + target = args.simulate or "serverless" # bare --simulate defaults to serverless + _run_service(args, simulate=target, direct=_parse_bool(args.direct)) + + +def run_deploy(args): + """Placeholder for the upcoming managed deployment command.""" + target = args.deploy or "serverless" + print( + f"`apipod --deploy {target}` is not available yet.\n" + "Deploy through the Socaity dashboard for now: https://www.socaity.ai\n" + "Tip: validate the target locally first with `apipod --simulate " + f"{target}`." + ) + + def main(): """Main entry point for the APIPod CLI.""" - orchestrator_choices = [e.value for e in ORCHESTRATOR] - compute_choices = [e.value for e in COMPUTE] - provider_choices = [e.value for e in PROVIDER] - parser = argparse.ArgumentParser( - description="APIPod CLI - Build and deploy AI service containers", + description="APIPod CLI - build, simulate and deploy AI services", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Examples: + apipod --start Run locally for development (FastAPI) + apipod --simulate Emulate a serverless deployment (FastAPI + job queue) + apipod --simulate serverless-runpod Emulate Socaity managed deploy to RunPod + apipod --simulate serverless-runpod --direct Emulate RunPod's native worker directly + apipod --simulate dedicated-azure Emulate a dedicated Azure deployment apipod --scan Scan project and generate apipod.json - apipod --build Build container using current directory - apipod --build ./main.py Build container with specific entry file - apipod --build --provider runpod Build for RunPod deployment - apipod --start Start service locally - apipod --start --compute serverless Start in serverless emulation mode - apipod --start --orchestrator socaity Start with Socaity orchestrator + apipod --build Build the deployment container + apipod --deploy Deploy via Socaity (coming soon) """ ) - parser.add_argument( - "--build", - nargs="?", - const=True, - metavar="FILE", - help="Build the service container. Optionally specify a target Python file (e.g., --build main.py)" - ) - parser.add_argument( - "--scan", - action="store_true", - help="Scan project and generate apipod.json configuration file" - ) parser.add_argument( "--start", action="store_true", - help="Start the APIPod service locally" + help="Run the service locally for development (plain FastAPI)." ) - - config_group = parser.add_argument_group("deployment configuration") - config_group.add_argument( - "--orchestrator", - choices=orchestrator_choices, - default="local", - help=f"Orchestration platform (default: local). Options: {', '.join(orchestrator_choices)}" + parser.add_argument( + "--simulate", + nargs="?", + const="", + metavar="TARGET", + help="Emulate a deployment locally. Optional target '{compute}-{provider}' " + "(e.g. serverless-runpod, dedicated-azure). Defaults to 'serverless'." ) - config_group.add_argument( - "--compute", - choices=compute_choices, - default="dedicated", - help=f"Compute type (default: dedicated). Options: {', '.join(compute_choices)}" + parser.add_argument( + "--direct", + nargs="?", + const=True, + default=None, + metavar="BOOL", + help="Emulate the provider's native serverless worker instead of Socaity's job queue." ) - config_group.add_argument( - "--provider", - choices=provider_choices, - default="localhost", - help=f"Infrastructure provider (default: localhost). Options: {', '.join(provider_choices)}" + parser.add_argument( + "--deploy", + nargs="?", + const="", + metavar="TARGET", + help="Deploy the service via Socaity (coming soon)." ) - config_group.add_argument( - "--region", - default=None, - help="Deployment region (provider-specific, e.g. 'us-east-1')" + parser.add_argument( + "--scan", + action="store_true", + help="Scan project and generate apipod.json configuration file." ) - config_group.add_argument( - "--host", - default=None, - help="Host to bind to (default: 0.0.0.0)" + parser.add_argument( + "--build", + nargs="?", + const=True, + metavar="FILE", + help="Build the service container. Optionally specify a target Python file." ) - config_group.add_argument( - "--port", - type=int, + parser.add_argument( + "--entrypoint", default=None, - help="Port to bind to (default: 8000)" + help="Service entrypoint file for --start / --simulate (auto-detected if omitted)." ) + parser.add_argument("--host", default=None, help="Host to bind to (default: 0.0.0.0).") + parser.add_argument("--port", type=int, default=None, help="Port to bind to (default: 8000).") args = parser.parse_args() @@ -253,6 +303,10 @@ def main(): run_scan() elif args.build is not None: run_build(args) + elif args.deploy is not None: + run_deploy(args) + elif args.simulate is not None: + run_simulate(args) elif args.start: run_start(args) else: diff --git a/apipod/common/constants.py b/apipod/common/constants.py index 59f9bf8..62936a1 100644 --- a/apipod/common/constants.py +++ b/apipod/common/constants.py @@ -1,11 +1,6 @@ from enum import Enum -class ORCHESTRATOR(Enum): - SOCAITY = "socaity" - LOCAL = "local" - - class COMPUTE(Enum): DEDICATED = "dedicated" SERVERLESS = "serverless" diff --git a/apipod/common/settings.py b/apipod/common/settings.py index 4dcf34d..ba23eeb 100644 --- a/apipod/common/settings.py +++ b/apipod/common/settings.py @@ -1,12 +1,17 @@ -import sys from os import environ -from apipod.common.constants import ORCHESTRATOR, COMPUTE, PROVIDER +from apipod.common.constants import COMPUTE, PROVIDER -APIPOD_ORCHESTRATOR = environ.get("APIPOD_ORCHESTRATOR", ORCHESTRATOR.LOCAL) -APIPOD_COMPUTE = environ.get("APIPOD_COMPUTE", COMPUTE.DEDICATED) -APIPOD_PROVIDER = environ.get("APIPOD_PROVIDER", PROVIDER.LOCALHOST) +# Deployment target. Socaity overwrites these env vars in a managed deployment so +# the right backend is selected in production (e.g. serverless + runpod). +APIPOD_COMPUTE = environ.get("APIPOD_COMPUTE", COMPUTE.DEDICATED.value) +APIPOD_PROVIDER = environ.get("APIPOD_PROVIDER", PROVIDER.LOCALHOST.value) APIPOD_REGION = environ.get("APIPOD_REGION", "") +# Local simulation intent (ignored in managed deployments). Empty = development. +# Target string is "{compute}-{provider}", e.g. "serverless-runpod". +APIPOD_SIMULATE = environ.get("APIPOD_SIMULATE", "") +APIPOD_DIRECT = environ.get("APIPOD_DIRECT", "").strip().lower() in ("1", "true", "yes") + APIPOD_HOST = environ.get("APIPOD_HOST", "0.0.0.0") APIPOD_PORT = int(environ.get("APIPOD_PORT", 8000)) @@ -14,6 +19,9 @@ DEFAULT_DATE_TIME_FORMAT = environ.get("FTAPI_DATETIME_FORMAT", '%Y-%m-%dT%H:%M:%S.%f%z') -if (APIPOD_ORCHESTRATOR == ORCHESTRATOR.SOCAITY or APIPOD_ORCHESTRATOR == ORCHESTRATOR.LOCAL) and APIPOD_PROVIDER == PROVIDER.RUNPOD and APIPOD_COMPUTE == COMPUTE.SERVERLESS: - sys.argv.extend(['rp_serve_api', '1']) - sys.argv.extend(['--rp_serve_api', '1']) +# Socaity deployment certificate (SHA1 of a shared secret) for detecting a managed +# deployment. When verified, simulate/direct are ignored and the backend is chosen +# from APIPOD_COMPUTE / APIPOD_PROVIDER. +SOCAITY_DEPLOYMENT_CERT = environ.get("SOCAITY_DEPLOYMENT_CERT", "") +_EXPECTED_CERT_HASH = "7b35ca9da2f0c280d48f66c780a0a0d5d3f8ad8a" +IS_MANAGED_DEPLOYMENT = SOCAITY_DEPLOYMENT_CERT == _EXPECTED_CERT_HASH diff --git a/apipod/deploy/docker_template.j2 b/apipod/deploy/docker_template.j2 index a1689d2..420eb7d 100644 --- a/apipod/deploy/docker_template.j2 +++ b/apipod/deploy/docker_template.j2 @@ -58,7 +58,6 @@ COPY . . RUN pip install --no-cache-dir . # Configuration for APIPod deployment -ENV APIPOD_ORCHESTRATOR="{{ orchestrator | default('local') }}" ENV APIPOD_COMPUTE="{{ compute | default('serverless') }}" ENV APIPOD_PROVIDER="{{ provider | default('runpod') }}" ENV APIPOD_HOST="0.0.0.0" diff --git a/apipod/engine/backend/runpod/router.py b/apipod/engine/backend/runpod/router.py index 07f35ee..b9e0a73 100644 --- a/apipod/engine/backend/runpod/router.py +++ b/apipod/engine/backend/runpod/router.py @@ -23,7 +23,7 @@ from apipod.engine.streaming.stream_serializer import as_sync_iter, encode_chunk, is_streaming_result from apipod.engine.utils import normalize_name -from apipod.common.settings import APIPOD_PROVIDER, APIPOD_PORT +from apipod.common.settings import APIPOD_PORT from media_toolkit import AudioFile, VideoFile @@ -32,9 +32,12 @@ class SocaityRunpodRouter(_BaseBackend, _BaseFileHandlingMixin): Adds routing functionality for the runpod serverless framework. Provides enhanced file handling and conversion capabilities. """ - def __init__(self, title: str = "APIPod for ", summary: str = None, *args, **kwargs): + def __init__(self, title: str = "APIPod for ", summary: str = None, simulate: bool = False, *args, **kwargs): super().__init__(title=title, summary=summary, *args, **kwargs) + # When True, start() runs RunPod's local API emulator instead of the real + # serverless worker (set by APIPod(simulate="serverless-runpod", direct=True)). + self.simulate = simulate self.routes = {} # routes are organized like {"ROUTE_NAME": "ROUTE_FUNCTION"} self.add_standard_routes() @@ -405,13 +408,13 @@ def minimal_func(): return schema - def start(self, port: int = APIPOD_PORT, provider: Union[constants.PROVIDER, str, None] = None, *args, **kwargs): - if provider is None: - provider = APIPOD_PROVIDER - if isinstance(provider, str): - provider = constants.PROVIDER(provider) + def start(self, port: int = APIPOD_PORT, **kwargs): + """Start the RunPod worker. - if provider == constants.PROVIDER.LOCALHOST: + In simulation (``APIPod(simulate="serverless-runpod", direct=True)``) RunPod's + local API emulator is used. In a managed deployment the real serverless worker runs. + """ + if self.simulate: self.start_runpod_serverless_localhost(port=port) else: import runpod.serverless diff --git a/docs/README_TECH.md b/docs/TECHNICAL_README.md similarity index 81% rename from docs/README_TECH.md rename to docs/TECHNICAL_README.md index 85ba046..24dd744 100644 --- a/docs/README_TECH.md +++ b/docs/TECHNICAL_README.md @@ -18,10 +18,10 @@ It sits in an ecosystem of three packages: ``` apipod/ -├── api.py # APIPod() factory: resolves config → backend instance +├── api.py # APIPod() factory: resolves intent → backend instance ├── common/ -│ ├── settings.py # Env-driven config (APIPOD_ORCHESTRATOR / _COMPUTE / _PROVIDER, host, port) -│ ├── constants.py # Enums: ORCHESTRATOR, COMPUTE, PROVIDER, SERVER_HEALTH +│ ├── settings.py # Env-driven config (APIPOD_SIMULATE / _DIRECT / _COMPUTE / _PROVIDER, cert, host, port) +│ ├── constants.py # Enums: COMPUTE, PROVIDER, SERVER_HEALTH │ └── schemas/ │ ├── schemas.py # Standardized request/response models (OpenAI-compatible shapes) │ └── media_files.py # FileModel + typed variants: pydantic mirrors of media-toolkit files @@ -42,19 +42,31 @@ apipod/ ## Core principles 1. **One decorator, many execution modes.** Developers only write `@app.endpoint(...)`. The router inspects the function and decides how to run it. They never choose a "mode" explicitly — the signature is the contract. -2. **Deployment is configuration, not code.** The same service file runs as a plain FastAPI app, a queued FastAPI app, or a RunPod serverless worker. `APIPod()` is a factory that picks the backend from `orchestrator` / `compute` / `provider` (constructor args or `APIPOD_*` env vars). +2. **Deployment is intent, not code.** The same service file runs as a plain FastAPI app, a queued FastAPI app, or a RunPod serverless worker. `APIPod()` is a factory that picks the backend from a single *intent* (`simulate` / `direct`) locally, or from the `APIPOD_COMPUTE` / `APIPOD_PROVIDER` env vars Socaity injects in a managed deployment (see [Orchestrator, compute, provider](#orchestrator-compute-provider-and-simulate)). 3. **Media files are objects, not bytes.** Endpoint authors annotate parameters with media-toolkit types (`ImageFile`, `AudioFile`, …) and receive parsed, ready-to-use objects — regardless of whether the client sent a multipart upload, a URL, or base64. 4. **Standardized, OpenAI-compatible schemas.** Common AI payloads (chat, completion, embeddings, image/video/audio/3D generation, vision) have canonical pydantic schemas whose wire format mirrors the OpenAI API. The shape is provider-agnostic: any model can serve them; clients written against OpenAI-compatible tooling work without translation. 5. **Long-running work returns a job, not a blocked connection.** With a queue configured, endpoints return a `JobResult` immediately; clients poll `/status/{job_id}` (fastSDK does this automatically) and can receive progress updates via `JobProgress`. -## Backend resolution +## Orchestrator, compute, provider, and simulate + +Three concepts describe *where and how* a service runs. Historically developers had to set all three; they no longer do. Understanding them still helps when reading the code. + +- **Orchestrator** — *who routes and queues requests*. There is exactly one: **Socaity**. It is the implicit orchestrator that fronts the service, distributes jobs, and handles scaling/auth. It is no longer a flag. `--direct` is the one escape hatch: it *skips* Socaity to talk to a provider's native backend instead (e.g. RunPod's own serverless worker). +- **Compute** (`COMPUTE`) — *the shape of the machine*: `serverless` (scale-to-zero, job-queue semantics) or `dedicated` (an always-on box, plain request/response). +- **Provider** (`PROVIDER`) — *the cloud the compute lives on*: `runpod`, `azure`, `scaleway`, `localhost`, … Not every provider supports every compute (e.g. Azure has no serverless; APIPod warns and falls back to the job-queue emulation). -`APIPod()` in `api.py` is not a class — it is a factory. It resolves the `(orchestrator, compute, provider)` triple (explicit args → env vars → defaults) against a support matrix and returns one of: +A developer never assembles this matrix by hand. They express a single **intent**: + +- **Development** (`APIPod()` / `apipod --start`) — plain FastAPI, the fastest loop. +- **Simulation** (`APIPod(simulate="{compute}-{provider}")` / `apipod --simulate ...`) — emulate a deployment **locally**, no code changes. The target string collapses compute + provider (`serverless`, `serverless-runpod`, `dedicated-azure`); compute defaults to `serverless`. `direct=True` emulates the provider's native worker instead of the Socaity queue. +- **Managed deployment** — when the service runs on the platform, Socaity sets `SOCAITY_DEPLOYMENT_CERT` (SHA1 of a shared secret). When that cert verifies (`IS_MANAGED_DEPLOYMENT`), `simulate`/`direct` are ignored and the **real** backend is selected from the `APIPOD_COMPUTE` / `APIPOD_PROVIDER` env vars Socaity injects — so the serverless-RunPod path runs the *real* worker, not the emulator. + +## Backend resolution -- **`SocaityFastAPIRouter`** — an `APIRouter` subclass bound to a `FastAPI` app. Used for dedicated compute and for local serverless emulation (then paired with an in-memory `JobQueue` plus a background worker thread started via the app lifespan). -- **`SocaityRunpodRouter`** — a path-based dispatcher for RunPod serverless. There is no HTTP layer: RunPod delivers a JSON job whose `input.path` selects the registered function; the router converts files, injects `JobProgress`, executes, and returns a serialized `JobResult` (or a generator for streaming). It can also synthesize an OpenAPI schema by replaying the FastAPI signature conversion, so fastSDK clients can be generated against serverless deployments too. +`APIPod()` in `api.py` is not a class — it is a factory. It resolves the intent (managed → `_resolve_managed`, otherwise → `_resolve_intent`) into a `(backend_class, use_job_queue, runpod_simulate)` triple and returns one of: -The full configuration matrix is documented in the main README and in the `APIPod()` docstring. +- **`SocaityFastAPIRouter`** — an `APIRouter` subclass bound to a `FastAPI` app. Used for development and dedicated compute (no queue), and for the serverless emulation (paired with an in-memory `JobQueue` + `LocalStreamStore` and a background worker thread started via the app lifespan). +- **`SocaityRunpodRouter`** — a path-based dispatcher for RunPod serverless. There is no HTTP layer: RunPod delivers a JSON job whose `input.path` selects the registered function; the router converts files, injects `JobProgress`, executes, and returns a serialized `JobResult` (or a generator for streaming). It can also synthesize an OpenAPI schema by replaying the FastAPI signature conversion, so fastSDK clients can be generated against serverless deployments too. Its `simulate` flag chooses between RunPod's local API emulator (`apipod --simulate serverless-runpod --direct`) and the real worker (managed deployment). ## The endpoint pipeline (FastAPI backend) @@ -126,7 +138,7 @@ The **stream store** is the pluggable backend that buffers a job's chunks betwee ### Deployment -`apipod build` (see `deploy/`) scans the project (entrypoint, dependencies, CUDA requirements) and generates a Dockerfile from compatible templates. The resulting container runs unchanged on dedicated hosts, on socaity.ai, or on RunPod serverless — only the `APIPOD_*` env vars differ. +`apipod --build` (see `deploy/`) scans the project (entrypoint, dependencies, CUDA requirements) and generates a Dockerfile from compatible templates. The resulting container runs unchanged on dedicated hosts, on socaity.ai, or on RunPod serverless — only the env vars differ: Socaity injects `SOCAITY_DEPLOYMENT_CERT` plus `APIPOD_COMPUTE` / `APIPOD_PROVIDER` to select the real backend, while locally you drive the same paths with `APIPOD_SIMULATE` / `APIPOD_DIRECT` (set for you by `apipod --simulate`). ## Request lifecycle, end to end diff --git a/test/test_config_resolution.py b/test/test_config_resolution.py index 269c42a..0b534b0 100644 --- a/test/test_config_resolution.py +++ b/test/test_config_resolution.py @@ -1,117 +1,74 @@ from apipod import APIPod -from apipod.common import constants from apipod.engine.backend.fastapi.router import SocaityFastAPIRouter from apipod.engine.backend.runpod.router import SocaityRunpodRouter -import os -def test_socaity_dedicated_auto(): - # socaity | dedicated | auto -> FastAPI - app = APIPod(orchestrator="socaity", compute="dedicated", provider="auto") +def test_development_default(): + # APIPod() -> plain FastAPI, no job queue. + app = APIPod() assert isinstance(app, SocaityFastAPIRouter) assert app.job_queue is None -def test_socaity_dedicated_localhost(): - # socaity | dedicated | localhost -> FastAPI + job queue (test mode) - app = APIPod(orchestrator="socaity", compute="dedicated", provider="localhost") - assert isinstance(app, SocaityFastAPIRouter) - assert app.job_queue is not None +def test_simulate_serverless_default(): + # simulate (bare / "serverless") -> FastAPI + Local Job Queue. + for target in ("", "serverless"): + app = APIPod(simulate=target) + assert isinstance(app, SocaityFastAPIRouter) + assert app.job_queue is not None -def test_socaity_dedicated_planned_celery(): - # socaity | dedicated | runpod/scaleway/azure -> Celery (planned) - for provider in ["runpod", "scaleway", "azure"]: - try: - APIPod(orchestrator="socaity", compute="dedicated", provider=provider) - assert False - except NotImplementedError as e: - assert "planned" in str(e) +def test_simulate_dedicated(): + # dedicated -> Standard FastAPI (no queue). + app = APIPod(simulate="dedicated") + assert isinstance(app, SocaityFastAPIRouter) + assert app.job_queue is None -def test_socaity_serverless_auto(): - # socaity | serverless | auto -> RunPod router - app = APIPod(orchestrator="socaity", compute="serverless", provider="auto") - assert isinstance(app, SocaityRunpodRouter) +def test_simulate_dedicated_azure(): + # dedicated-azure -> FastAPI (direct client), no queue. + app = APIPod(simulate="dedicated-azure") + assert isinstance(app, SocaityFastAPIRouter) + assert app.job_queue is None -def test_socaity_serverless_localhost(): - # socaity | serverless | localhost -> FastAPI + job queue (test mode) - app = APIPod(orchestrator="socaity", compute="serverless", provider="localhost") +def test_simulate_serverless_runpod(): + # serverless-runpod (no direct) -> Socaity emulation = FastAPI + job queue. + app = APIPod(simulate="serverless-runpod") assert isinstance(app, SocaityFastAPIRouter) assert app.job_queue is not None -def test_socaity_serverless_runpod(): - # socaity | serverless | runpod -> RunPod router - app = APIPod(orchestrator="socaity", compute="serverless", provider="runpod") +def test_simulate_serverless_runpod_direct(): + # serverless-runpod + direct -> RunPod local emulation. + app = APIPod(simulate="serverless-runpod", direct=True) assert isinstance(app, SocaityRunpodRouter) + assert app.simulate is True -def test_socaity_serverless_unsupported(): - # socaity | serverless | scaleway/azure -> Not supported - for provider in ["scaleway", "azure"]: - try: - APIPod(orchestrator="socaity", compute="serverless", provider=provider) - assert False - except NotImplementedError as e: - assert "not supported" in str(e) or "not implemented" in str(e) - - -def test_local_dedicated(): - # local | dedicated | * -> FastAPI - app = APIPod(orchestrator="local", compute="dedicated", provider="localhost") - assert isinstance(app, SocaityFastAPIRouter) - assert app.job_queue is None - - -def test_local_serverless_localhost(): - # local | serverless | localhost -> FastAPI + job queue - app = APIPod(orchestrator="local", compute="serverless", provider="localhost") +def test_simulate_serverless_azure_warns_and_falls_back(): + # azure has no serverless -> FastAPI + job queue (with warning). + app = APIPod(simulate="serverless-azure") assert isinstance(app, SocaityFastAPIRouter) assert app.job_queue is not None -def test_local_serverless_runpod(): - # local | serverless | runpod -> RunPod router - app = APIPod(orchestrator="local", compute="serverless", provider="runpod") - assert isinstance(app, SocaityRunpodRouter) - - -def test_local_serverless_unsupported(): - # local | serverless | scaleway/azure -> Not supported - for provider in ["scaleway", "azure"]: +def test_invalid_target_values(): + for target in ("invalid", "serverless-invalid"): try: - APIPod(orchestrator="local", compute="serverless", provider=provider) + APIPod(simulate=target) assert False - except NotImplementedError as e: - assert "not supported" in str(e) or "not implemented" in str(e) - - -def test_invalid_enum_values(): - try: - APIPod(orchestrator="invalid") - assert False - except ValueError as e: - assert "Invalid ORCHESTRATOR" in str(e) - - try: - APIPod(compute="invalid") - assert False - except ValueError as e: - assert "Invalid COMPUTE" in str(e) + except ValueError as e: + assert "Invalid" in str(e) if __name__ == "__main__": - test_socaity_dedicated_auto() - test_socaity_dedicated_localhost() - test_socaity_dedicated_planned_celery() - test_socaity_serverless_auto() - test_socaity_serverless_localhost() - test_socaity_serverless_runpod() - test_socaity_serverless_unsupported() - test_local_dedicated() - test_local_serverless_localhost() - test_local_serverless_runpod() - test_local_serverless_unsupported() - test_invalid_enum_values() + test_development_default() + test_simulate_serverless_default() + test_simulate_dedicated() + test_simulate_dedicated_azure() + test_simulate_serverless_runpod() + test_simulate_serverless_runpod_direct() + test_simulate_serverless_azure_warns_and_falls_back() + test_invalid_target_values() + print("All config resolution tests passed.") diff --git a/test/test_core_functionalities.py b/test/test_core_functionalities.py index 52ed88e..d645b58 100644 --- a/test/test_core_functionalities.py +++ b/test/test_core_functionalities.py @@ -9,7 +9,7 @@ from apipod import MediaFile, ImageFile, AudioFile, VideoFile, FileModel from fastapi import UploadFile as fastapiUploadFile -app = APIPod(compute="serverless") +app = APIPod(simulate="serverless") @app.post(path="/test_job_progress", queue_size=10) diff --git a/test/test_streaming.py b/test/test_streaming.py index f52d059..52e2d3d 100644 --- a/test/test_streaming.py +++ b/test/test_streaming.py @@ -1,7 +1,7 @@ """ -Streaming over the serverless-localhost emulation. +Streaming over the serverless emulation. -APIPod on ``compute="serverless", provider="localhost"`` mimics a real +APIPod on ``simulate="serverless"`` mimics a real deployment: streaming endpoints are queued, the in-process worker produces their chunks into a :class:`StreamStore` (the in-memory ``LocalStreamStore`` by default), and the client consumes them from ``GET /stream/{job_id}``. A client @@ -35,8 +35,8 @@ def build_client() -> TestClient: - """Build a serverless-localhost app with streaming endpoints.""" - app = APIPod(orchestrator="local", compute="serverless", provider="localhost") + """Build a serverless-emulation app with streaming endpoints.""" + app = APIPod(simulate="serverless") @app.endpoint("/text") def stream_text(): @@ -91,11 +91,11 @@ def _collect_sse_data(client: TestClient, stream_url: str) -> list[str]: def test_default_stream_store_is_local(): - """Serverless localhost gets a LocalStreamStore by default; plain FastAPI does not.""" - serverless = APIPod(orchestrator="local", compute="serverless", provider="localhost") + """Serverless emulation gets a LocalStreamStore by default; plain FastAPI does not.""" + serverless = APIPod(simulate="serverless") assert isinstance(serverless.stream_store, LocalStreamStore) - plain = APIPod(orchestrator="local", compute="dedicated", provider="localhost") + plain = APIPod(simulate="dedicated") assert plain.stream_store is None From 96797211364c31dbffd425e071c48a2aab6b444e Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Thu, 18 Jun 2026 05:33:32 +0200 Subject: [PATCH 15/38] . --- docs/AGENTS.md | 83 +++++++++++++++++++++++++++++++ docs/EXAMPLE_DOCKERFILE_AZURE | 32 ------------ docs/EXAMPLE_DOCKERFILE_RUNPOD | 40 --------------- test/test_core_functionalities.py | 11 ++-- 4 files changed, 88 insertions(+), 78 deletions(-) create mode 100644 docs/AGENTS.md delete mode 100644 docs/EXAMPLE_DOCKERFILE_AZURE delete mode 100644 docs/EXAMPLE_DOCKERFILE_RUNPOD diff --git a/docs/AGENTS.md b/docs/AGENTS.md new file mode 100644 index 0000000..9c1ebf8 --- /dev/null +++ b/docs/AGENTS.md @@ -0,0 +1,83 @@ +# Development instructions + +## 1. Think Before Coding + +**Don't assume. Don't hide confusion. Surface tradeoffs.** + +Before implementing: +- State your assumptions explicitly. If uncertain, ask. +- If multiple interpretations exist, present them. Don't pick silently. +- If a simpler approach exists, say so. Push back when warranted. +- If something is unclear, stop. Name what's confusing. Ask. +- Use thinking methods like Elon Musk's first principle reasoning or design-thinking for complex tasks. + +## 2. Simplicity First + +**Minimum code that solves the problem. Nothing speculative.** +- No features beyond what was asked. +- No abstractions for single-use code. +- No "flexibility" or "configurability" that wasn't requested. +- No error handling for impossible scenarios. +- If you write 200 lines and it could be 50, rewrite it. +- Don't repeat yourself. + +Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify. + +## 3. Surgical Changes + +**Touch only what you must. Clean up only your own mess.** + +When editing existing code: +- Don't "improve" adjacent code, comments, or formatting. +- Match existing style, even if you'd do it differently. +- If you notice unrelated dead code, mention it - don't delete it. + +When your changes create orphans: +- Remove imports/variables/functions that YOUR changes made unused. +- Don't remove pre-existing dead code unless asked. + +The test: Every changed line should trace directly to the user's request. + +## 4. Code quality and style +- Code like a brilliant senior full-stack software engineer with deep-expertise in python. +- Write high-quality, developer-friendly and clean-code, use design-patterns (Refactoring Guru) where helpful. +- Include docstrings and comments to explain the why of a non-obvious method or code. No decorative comments. +- Write memory and compute efficient code. +- Write pythonic code and use builtins when it simplifies (generators, list-comprehensions, functools). +- Reduce complexity and boilerplate. Remove unused code. +- State unclear variable names and rename for better readability and clearity. +- Avoid local imports +- Do not write "deprecated" or backward compability code. +- Update the README.md if there's user related important changes. Update TECHNICAL_README.md for architectural, or project maintainer important changes. Keep the .md update brief use technical correct terms. + +## 5. Reason and thinking style +Do thinking and reasoning like a smart caveman. +- Cut all filler, keep technical substance. +- Drop articles (a, an, the), filler (just, really, basically, actually). +- Drop pleasantries (sure, certainly, happy to). +- No hedging. Fragments fine. Short synonyms. +- Technical terms stay exact. Code blocks unchanged. +- Pattern: [thing] [action] [reason]. [next step] + +## 6. Public facing texts: Readmes, prints, logs. +- Write as technically brilliant European expert who gives you straight answers, backs claims with data, and genuinely wants you to succeed. +- Ttone spectrum Formality 35% (lean casual) · Humor 25% (dry, never flippant) · Complexity 40% (lean technical) · Confidence 80% (very confident). +- Direct without being cold. Say what you mean, no corporate padding. Warm without being informal. Complete sentences, measured enthusiasm. Committed, not hedging. +- Committed, not hedging. "This works", not "this might work". +- "We" for the platform, "you" for the reader. Reserve "I" for rare authored guides only. +- Developer-first, technical correct terms. +- No em-dashes. The character `—` (U+2014) must not appear in ANYWHERE. Use a period, comma, parentheses, or colon. +- No marketing adverbs like seamlessly, effortlessly, robust, powerful, cutting-edge, automatically, intelligently, revolutionary, game-changing, world-class, best-in-class. E.g. three steps, ~X minutes" beats "easy onboarding". +- No bullet-everything. Bullets only for true enumerations (statuses, regions, tiers). +- Subtle transmit socaity's vision and use emotional-intelligence and marketing techniques for end-user intent based messages. +- Use google docstring format. +- The four brand hues (each tied to an ICP) with Tonal scales (50/300/500/700/900). Apply where makes sense. +| Name | Hex | Meaning / ICP | +| ---------------------------- | ----------- | ------------------------------------------------------------------------- | +| **Neon Green** | `#5A8F00` | Developer. Active system health, engineering precision, technical truth. | +| **Silicon Blue** | `#0A86BF` | SMB CTO. Enterprise stability, secure infrastructure, professional trust. | +| **Creator Violet** | `#7C3AED` | Creator. Generative potential, creative momentum, warmth. | +| **Signal Pink (Rose)** | `#EC4899` | Alert. Warnings, critical status, high-priority attention. | + +# About Socaity + diff --git a/docs/EXAMPLE_DOCKERFILE_AZURE b/docs/EXAMPLE_DOCKERFILE_AZURE deleted file mode 100644 index d9d8aac..0000000 --- a/docs/EXAMPLE_DOCKERFILE_AZURE +++ /dev/null @@ -1,32 +0,0 @@ -FROM python:3.10-slim - -# Set the working directory -WORKDIR /app - -# ffmpeg needed for media-toolkit video -# Install FFmpeg and dependencies required to install ffmpeg -RUN apt-get update && apt-get install -y \ - software-properties-common \ - apt-transport-https \ - ca-certificates \ - ffmpeg \ - && apt-get clean && rm -rf /var/lib/apt/lists/* - -# Copy the shared connectors module -COPY . /app - -# Install dependencies -RUN pip install --upgrade pip -RUN pip install . - -# Configure environment variables -ENV HOST = "0.0.0.0" - -# Expose the port -ARG port=8000 -ENV PORT=$port -EXPOSE $port - - -# Set the entrypoint with explicit host and port binding -CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/docs/EXAMPLE_DOCKERFILE_RUNPOD b/docs/EXAMPLE_DOCKERFILE_RUNPOD deleted file mode 100644 index c302cd0..0000000 --- a/docs/EXAMPLE_DOCKERFILE_RUNPOD +++ /dev/null @@ -1,40 +0,0 @@ -FROM runpod/pytorch:2.4.0-py3.11-cuda12.4.1-devel-ubuntu22.04 - -SHELL ["/bin/bash", "-c"] - -# Install dependencies -# ffmpeg needed for mediatoolkit video -# Install system dependencies including CUDA and cuDNN -RUN apt-get update && apt-get install -y \ - ffmpeg \ - libcudnn9-cuda-12 \ - libcudnn9-dev-cuda-12 \ - && apt-get clean - -# Ensure CUDA and cuDNN libraries are in the library path -ENV LD_LIBRARY_PATH="/usr/local/cuda/lib64:${LD_LIBRARY_PATH}" - -# create the folder for face2face -WORKDIR / - -# Install Python dependencies (Worker Template) -# added runpod directly in dependencies -# added other libs before which keep failing in requirements file for unknown reasons. -# note that fairseq need to be installed differently in windows and linux -RUN pip install runpod>=1.7.7 && \ - pip install . --no-cache - -# Configure APIPod for RunPod serverless deployment - -ENV APIPOD_COMPUTE="serverless" -ENV APIPOD_PROVIDER="runpod" - -ARG port=8080 -ENV APIPOD_PORT=$port -# allows the docker container to use the port -EXPOSE $port -# allows any IP from the computer to connect to the host -ENV APIPOD_HOST="0.0.0.0" - -# Set the entrypoint with explicit host and port binding -CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/test/test_core_functionalities.py b/test/test_core_functionalities.py index d645b58..01bf5c8 100644 --- a/test/test_core_functionalities.py +++ b/test/test_core_functionalities.py @@ -56,13 +56,12 @@ def test_single_file_upload( ): return file1.to_base64() +@app.endpoint("/normal_endpoint") +def normal_endpoint(): + return "normal_endpoint" + + -@app.endpoint("/make_fries", methods="POST") -def test( - mymom: str, - file1: fastapiUploadFile -): - return "nok" if __name__ == "__main__": From 1ab3e6862dd63cc031cd354ce518a2c7c2d07509 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Thu, 18 Jun 2026 08:15:17 +0200 Subject: [PATCH 16/38] set-up a comprehensive test-suite for all apipod features including different build configs, endpoints, media support and streaming --- .github/workflows/publish.yml | 34 +- README.md | 2 +- docs/AGENTS.md | 12 +- docs/TECHNICAL_README.md | 24 ++ pyproject.toml | 29 ++ test/__init__.py | 0 test/conftest.py | 141 +++++++++ test/files/hermine_clone.wav | Bin 0 -> 1115244 bytes test/files/socaity_logo_for_white_bg.png | Bin 0 -> 335078 bytes test/files/test_video_ultra_short_short.mp4 | Bin 0 -> 186424 bytes test/llm/test_llm_mock.py | 173 ---------- test/llm/test_qwen_llm.py | 333 -------------------- test/services/__init__.py | 11 + test/services/core_service.py | 103 ++++++ test/services/schema_service.py | 117 +++++++ test/services/streaming_service.py | 33 ++ test/test_cli.py | 89 ++++++ test/test_clients_six_schemas.py | 185 ----------- test/test_config.py | 79 +++++ test/test_config_resolution.py | 74 ----- test/test_core.py | 84 +++++ test/test_core_functionalities.py | 73 ----- test/test_demo_fastapi.py | 48 --- test/test_schemas.py | 101 ++++++ test/test_service_six_schemas.py | 62 ---- test/test_streaming.py | 201 +++--------- 26 files changed, 899 insertions(+), 1109 deletions(-) delete mode 100644 test/__init__.py create mode 100644 test/conftest.py create mode 100644 test/files/hermine_clone.wav create mode 100644 test/files/socaity_logo_for_white_bg.png create mode 100644 test/files/test_video_ultra_short_short.mp4 delete mode 100644 test/llm/test_llm_mock.py delete mode 100644 test/llm/test_qwen_llm.py create mode 100644 test/services/__init__.py create mode 100644 test/services/core_service.py create mode 100644 test/services/schema_service.py create mode 100644 test/services/streaming_service.py create mode 100644 test/test_cli.py delete mode 100644 test/test_clients_six_schemas.py create mode 100644 test/test_config.py delete mode 100644 test/test_config_resolution.py create mode 100644 test/test_core.py delete mode 100644 test/test_core_functionalities.py delete mode 100644 test/test_demo_fastapi.py create mode 100644 test/test_schemas.py delete mode 100644 test/test_service_six_schemas.py diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 54d963d..f8df7e2 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,11 +1,41 @@ -name: Publish to PyPI +name: CI & Publish on: push: branches: [main] + pull_request: jobs: + # Tests gate everything: no version bump, no publish unless these pass. + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install package + test deps (incl. fastSDK) + run: pip install -e ".[test]" + + - name: Run tests + run: pytest -q + + # Soft checks: report only, never fail the build. + - name: ruff (soft) + continue-on-error: true + run: ruff check apipod test + + - name: mypy (soft) + continue-on-error: true + run: mypy apipod + + # Runs only on push to main, and only after tests pass. publish: + needs: test + if: github.event_name == 'push' && github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -18,7 +48,7 @@ jobs: with: python-version: "3.12" - - name: Install dependencies + - name: Install build tooling run: pip install build twine - name: Bump patch version diff --git a/README.md b/README.md index 929ed03..a2b3c12 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ def hello(name: str): return f"Hello {name}!" # Built-in media processing — uploads/URLs/base64 are parsed for you -@app.endpoint("/process_image") +@app.endpoint("/process-image") def process_image(image: ImageFile): img_array = image.to_np_array() # ... run your AI model here ... diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 9c1ebf8..03f74f6 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -39,7 +39,6 @@ When your changes create orphans: The test: Every changed line should trace directly to the user's request. ## 4. Code quality and style -- Code like a brilliant senior full-stack software engineer with deep-expertise in python. - Write high-quality, developer-friendly and clean-code, use design-patterns (Refactoring Guru) where helpful. - Include docstrings and comments to explain the why of a non-obvious method or code. No decorative comments. - Write memory and compute efficient code. @@ -49,7 +48,13 @@ The test: Every changed line should trace directly to the user's request. - Avoid local imports - Do not write "deprecated" or backward compability code. - Update the README.md if there's user related important changes. Update TECHNICAL_README.md for architectural, or project maintainer important changes. Keep the .md update brief use technical correct terms. - +- Write flake8 formatted code with "flake8.args": [ + "--max-line-length=120", + "--ignore=E203,W503,E501,E261,W293" + ] +} +- Avoid using direct cmd python calls and pip installs. Work with the local venv if necessary. Always ask if necessary. + ## 5. Reason and thinking style Do thinking and reasoning like a smart caveman. - Cut all filler, keep technical substance. @@ -78,6 +83,5 @@ Do thinking and reasoning like a smart caveman. | **Silicon Blue** | `#0A86BF` | SMB CTO. Enterprise stability, secure infrastructure, professional trust. | | **Creator Violet** | `#7C3AED` | Creator. Generative potential, creative momentum, warmth. | | **Signal Pink (Rose)** | `#EC4899` | Alert. Warnings, critical status, high-priority attention. | - -# About Socaity + diff --git a/docs/TECHNICAL_README.md b/docs/TECHNICAL_README.md index 24dd744..2a9473f 100644 --- a/docs/TECHNICAL_README.md +++ b/docs/TECHNICAL_README.md @@ -144,4 +144,28 @@ The **stream store** is the pluggable backend that buffers a job's chunks betwee A client calls `POST /tts` with a JSON body. FastAPI validates it against the rewritten signature and calls the outermost wrapper. The file-handling layer converts any media inputs into media-toolkit objects. If the endpoint is queued, the queue mixin stores the job and returns `{job_id, status: "queued", links}` — the worker thread later executes the real function, feeding `JobProgress` updates into the store. The client (typically fastSDK) polls `/status/{job_id}` until `finished` and receives the result, with any returned `AudioFile` serialized as a `FileModel`. Without a queue the same conversion happens inline and the response returns directly. On RunPod, the identical user function is reached through `handler → _router(path) → file handling → execute`, proving the core principle: the function is written once, the backend decides how it runs. +## Testing and CI + +The suite (`test/`) is built so endpoint definitions live apart from test logic, and one helper boots them under any run intent. + +``` +test/ +├── conftest.py # build_service (in-process TestClient), live_service (real subprocess via CLI), config matrix, file paths +├── services/ # reusable services: register(app) callbacks + a runnable entrypoint +│ ├── core_service.py # scalars, custom model, mixed media, JobProgress, file upload +│ ├── schema_service.py # one endpoint per standardized schema, an extended schema, raw/typed mapping CASES +│ └── exec_service.py # runnable service for fastSDK + streaming (predict, echo_image, chat, text, video) +├── files/ # media assets for upload/download tests +├── test_config.py # intent -> backend resolution + /openapi.json loads for every backend +├── test_core.py # core endpoint plumbing (types, model, files, queue lifecycle) +├── test_schemas.py # standardized schema endpoints + response-model normalization +├── test_cli.py # scan / build / simulate produce the right artifacts +└── test_execution.py # fastSDK end-to-end (subprocess) + SSE streaming (in-process) +``` + +Run `pytest`. Two primitives keep tests DRY: `build_service(register, **config)` yields a `TestClient` for an app built from a `register(app)` callback under any `APIPod(**config)` intent; `live_service(simulate=...)` boots a service as a real subprocess through `apipod --start` / `--simulate` and yields its URL. Backends are parametrized from `FASTAPI_CONFIGS`, so a single test asserts behaviour across development, serverless, dedicated and runpod. + +The fastSDK end-to-end tests skip automatically when the installed fastsdk lacks the `connect` API (e.g. a local in-progress build); CI installs one that has it. Pytest config (`pythonpath` in `pyproject.toml`) resolves `import apipod` to the in-repo source and the `conftest`/`services` helpers by name, so no `sys.path` shims are needed and each file is also runnable directly from an IDE via its `__main__` block. + +CI (`.github/workflows/publish.yml`) runs the `test` job on every push and pull request (installing `.[test]`, which includes fastSDK). The `publish` job `needs: test`, so the patch version bump and PyPI upload happen only on a push to `main` after tests pass. flake8 and mypy run as soft checks (`continue-on-error`): they surface warnings without gating the build. diff --git a/pyproject.toml b/pyproject.toml index 4561b03..f7c9f54 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,8 +28,37 @@ apipod = "apipod.cli:main" runpod = [ "runpod>=1.7.7" ] +test = [ + "pytest", + "httpx", + "ruff", + "mypy", +] [project.urls] Repository = "https://github.com/SocAIty/apipod" Homepage = "https://www.socaity.ai" + +[tool.pytest.ini_options] +testpaths = ["test"] +# Make `import apipod` resolve to the in-repo source (not an installed copy) and +# let test modules import the shared `conftest` helpers and `services` package by +# name. The sibling fastsdk entry is used in local dev when the repo is checked +# out next to apipod; it is silently ignored in CI where fastsdk comes from pip. +pythonpath = [".", "test", "../fastsdk"] + +[tool.ruff] +line-length = 120 +exclude = ["venv", "dist", "build", "*.egg-info"] + +[tool.ruff.lint] +# Mirror the previous flake8 config: ignore stylistic rules that conflict with +# black/our formatting conventions. +ignore = ["E203", "E261", "E501", "W293"] + +[tool.mypy] +# Soft static typing: a warning signal, never a build gate (see CI). +ignore_missing_imports = true +follow_imports = "silent" +warn_unused_ignores = false diff --git a/test/__init__.py b/test/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 0000000..74b5f7c --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,141 @@ +""" +Shared test infrastructure for the APIPod suite. + +The suite is built on a few small primitives so individual test files stay +declarative and DRY: + +- ``FASTAPI_CONFIGS`` / ``QUEUE_CONFIGS`` — the canonical matrix of APIPod run + intents (development, serverless, dedicated, runpod, ...). Parametrize over + it to assert behaviour holds across every backend. +- ``build_service(register, **config)`` — build an app from a callback that + registers endpoints and hand back a wired FastAPI ``TestClient`` (in-process, + no socket). Used by the config / openapi / core / schema tests. +- ``live_service(simulate=...)`` — boot the example service in a subprocess via + the real ``apipod`` CLI (the same ``--start`` / ``--simulate`` a user runs), + yield its base URL, and shut it down afterwards. Used by the fastSDK + end-to-end execution tests. + +A registrar is just ``def register(app): ...``; keeping endpoints out of the +helpers lets one helper serve config, openapi, schema and execution tests alike. +""" + +import contextlib +import socket +import subprocess +import sys +import time +import urllib.error +import urllib.request +from pathlib import Path + +import pytest +from fastapi.testclient import TestClient + +from apipod import APIPod + +REPO_ROOT = Path(__file__).resolve().parents[1] + +# --------------------------------------------------------------------------- # +# Test asset files (used by the media upload/download tests) +# --------------------------------------------------------------------------- # +FILES_DIR = Path(__file__).parent / "files" +IMAGE_FILE = FILES_DIR / "socaity_logo_for_white_bg.png" +AUDIO_FILE = FILES_DIR / "hermine_clone.wav" +VIDEO_FILE = FILES_DIR / "test_video_ultra_short_short.mp4" + +# Entrypoint booted by the fastSDK end-to-end execution tests. +INFERENCE_SERVICE = Path(__file__).parent / "services" / "core_service.py" + + +# --------------------------------------------------------------------------- # +# Run-intent matrix. Each entry is the kwargs passed to APIPod(...). +# --------------------------------------------------------------------------- # +# FastAPI-backed intents resolve to SocaityFastAPIRouter and expose a real HTTP +# app (the only ones that can serve /openapi.json or run under TestClient). +FASTAPI_CONFIGS = [ + pytest.param({}, id="development"), + pytest.param({"simulate": "serverless"}, id="serverless"), + pytest.param({"simulate": "dedicated"}, id="dedicated"), + pytest.param({"simulate": "dedicated-azure"}, id="dedicated-azure"), + pytest.param({"simulate": "serverless-runpod"}, id="serverless-runpod"), + pytest.param({"simulate": "serverless-azure"}, id="serverless-azure-fallback"), +] + +# Intents that boot a job queue (serverless emulation): endpoints return a +# JobResult processed by the in-process worker. +QUEUE_CONFIGS = [ + pytest.param({"simulate": "serverless"}, id="serverless"), + pytest.param({"simulate": "serverless-runpod"}, id="serverless-runpod"), +] + + +def build_app(register, **config): + """Create an APIPod app for ``config`` and register endpoints via callback.""" + app = APIPod(**config) + register(app) + return app + + +@contextlib.contextmanager +def build_service(register, **config): + """ + Yield a ``TestClient`` for an app built from ``register`` under ``config``. + + The client is entered as a context manager so the app lifespan runs: that + starts the in-process queue worker for serverless intents. + """ + app = build_app(register, **config) + fastapi_app = app.app + fastapi_app.include_router(app) + with TestClient(fastapi_app) as client: + yield client + + +# --------------------------------------------------------------------------- # +# Live server (real subprocess via the apipod CLI) for fastSDK tests +# --------------------------------------------------------------------------- # +def _free_port() -> int: + with contextlib.closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: + s.bind(("127.0.0.1", 0)) + return s.getsockname()[1] + + +def _wait_until_healthy(url: str, proc: subprocess.Popen, timeout: float = 40.0): + """Poll GET /health until the service answers, or fail if the process dies.""" + deadline = time.time() + timeout + while time.time() < deadline: + if proc.poll() is not None: + raise RuntimeError(f"Service process exited early with code {proc.returncode}.") + try: + with urllib.request.urlopen(f"{url}/health", timeout=2) as resp: + if resp.status == 200: + return + except (urllib.error.URLError, ConnectionError, OSError): + time.sleep(0.2) + raise TimeoutError(f"Service at {url} did not become healthy within {timeout}s.") + + +@contextlib.contextmanager +def live_service(simulate: str = "serverless", entrypoint: Path = INFERENCE_SERVICE, port: int = 0): + """ + Boot ``entrypoint`` in a subprocess through the real apipod CLI and yield its URL. + + ``simulate=None`` runs ``apipod --start`` (development); otherwise it runs + ``apipod --simulate `` exactly as a user would on the command line. + """ + port = port or _free_port() + cmd = [sys.executable, "-m", "apipod.cli"] + cmd += ["--start"] if simulate is None else ["--simulate", simulate] + cmd += ["--entrypoint", str(entrypoint), "--host", "127.0.0.1", "--port", str(port)] + + proc = subprocess.Popen(cmd, cwd=str(REPO_ROOT)) + url = f"http://127.0.0.1:{port}" + try: + _wait_until_healthy(url, proc) + yield url + finally: + proc.terminate() + try: + proc.wait(timeout=10) + except subprocess.TimeoutExpired: + proc.kill() diff --git a/test/files/hermine_clone.wav b/test/files/hermine_clone.wav new file mode 100644 index 0000000000000000000000000000000000000000..fd5fe0c4a9589c4923d379464b06e702f9d7aab3 GIT binary patch literal 1115244 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

PHJ=i-aqHm>ttm_88?Ip0E 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%0AH$iiPyo2%s^YNAXfu{nd1%wB@^FQoA+27#5 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 z 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

qD)BSrxwp29)>o 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�Mprn*SU8OJBb!8a;BzW8vwIOe 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�YuTi)7v=Vau|IFd0qFO_#@x+#rI%Ac^xl8N+=D%vCTZuL+k z)E82A*lvha8Lg(eb%w z0vg{A_X_7%c>Nz`cg-&Pe}||&Yf4snmj6$B*0-$1+1Ij`w6!zY;e zLOO8|y;O_jJrsRZb>KK}r0J}kq$_FIXc}Q{owzo6U}}RrP14Wid6sr0ZB?E->12j6 zy=R&=<#6IT+YQT6(;I_Y-%DFlGY~khQ5~Y*Q!}ZfDoOE#TuvO2+Tm35VoI&YE=RW4 zpje~WkXY^5(Wn?X6H!M`M|;Fbs9`3s9l6tBr;C8!=*e;1eEtX0A4iD|;sa!p82E)B%#upQj+ zz+S?xbo6x%_1*~F3Y*!-!ru5PViX`1kUY^RN zF=@@x+N2H0<4oU{u`GRNnjux0QV&m%&T2KE1;%v?tx8|PNp{ryhUaKDolW&ry$55R zLVh7y#F6_bUK1F8DOZWz$V@_h)`-~JXeVT_tc&$w6l_0ycVny-4yq|^VO9UZQlNFay>cJ;wvnm``f#RDO{n5jAxe!rf0OF6a+0zP-n9$JnOv#} zAr)sQdRnsKl{*b|d7$)~w!NQFjCZ?c)yye}&63rO-S#2Q5~u+{-Hv{bdF{1UuD@@XZhmjg zvOP^Gm{c@*Zt}|HU&#eiC#9`S+mqTaB{OMr;>CpSwqcemQ>v+sF`z%M`=*_#J*R!G zEu^(-w6vGnr)sRsfrs-cM9SbKkf(q|L9wXNieJfngp%wOvjJQBe_ocq*$eC=wk~^z zsST&enb^_T;Mgpv`oH7$)*xrUxL9B6i44;JG*&vGRc~Z6@{jBq`cTdyQ?eBLt*1h< zP?Km1M^|;UHLW5jSuzSu^r2COp!&7p_HJZNjpME<4- zZoVUNm8g!^`bN+{3?eEKH1Q5>XNP##_~-a2;Fcn>8yig-u#a}^15+@COcv`x-IC2` zp&@P|Hk;M#Z)PNXIL)EQZpo~K8%K#@b9ETMuH>$)o%mqF)S(YKI1El{LK0OuG+bh6&tpejR z`~P~0n9x|5i_hpdlmJj?<2$yP>B00zZhtUL=H{J9azqZUN>KRT@#`^(ouCO^*Qv;9fxLUfMU9Q6tq(np+#6v z6d*RllaRd-!E3Jc8@m4U|Hs5WLmMZ-lXskV@@Yb8ye0}3;Fq68BUBP|kZIBZ8ips( zKTN@Qd?t4JWB9f=##4FfEl-BUVGlmWHsR2aSU2qAXC!5y-l~ zOS~ZTvh^|>HvgSKA!=a4*C?WLhde6(g;w*O@)`04@`liQog_aZBdkCE7$I3`d~4$0 zy%o;Rzv5>lBieCj@u*NzD9@LMie?4eQ)YDRy6_DXV)ub{%VWKweItgjJ=8h$Cs;rD zIdC*k8~)d`a5(i3Gzm(9)_#vS!@n<7IbsiMat{YLgxrxBa}pUCFIiF;gT9Ohvd83k zvI`lJ%P2e5OLbe>l{!Uxp&=cqy{_Z+PYtJx-;kWy2tG5Tr3={nB+DxEX;W=zD!zg( z-l;FFpQ}5lEvYSvB(e;xO?yF8Rl}h(_bM%;tEz89VY))KTj^A+QB1?8eN)~E8FYhX z2W5F>S!i}^ijyQE{#|+v1mPMyu5ZMKIK5NA&X<74v;c6!kSV9Z|>y$x%x>-Caz8C(*|9&IToFU?6aRvNIDMD>1wddhU9WAWD zH{gN52nC?$TP*!6^#z+Bf-_kL&t()Tkrm^2yS+BPS*n7Ln9*p7_!pY7 zroj63(k*Z>LAa-$^3(V)m^03@J=r|03_ANAOf@DemKJM;Y$$E4TeM@OXM~17^J;El z?k9BdRzX@;gJ8ix1}6UYAv!cAUTzjGa-)qzKWui-Ati)e@33gJX{yl|4=$1dmm z;-vT%NfVzg%Y{a;0Qy)fDcUIiQeUL+sw=6F&DgRBzSSkY1-25)X%7N;Ld6)UAY|z z50_Q7m3yG0I40j9FG?1a{gRz03zA8)=Ey034Hw9FBiHeCA9Q^q3fUyv?yh+`dErym;b~XPEDBcC`k#JjV4ClaPob6+g?wknbcR2Z%ya*1z4nl{weF{Ot){c4fwrAiu9-LAdqRY2(GK|A&w?G0;?S@1VpoD0F%R0FH_9&W-HvWvI}T7tP+ zLcEO+!Mt!8dW`azxYmJDxdC_IWpHera9*azPr=znONYb};wrJKlnqpY!yR@>>;8!(}+|zwX>>=6o!LO%lEc|0C%tz?;ar zb|$X1w5g=204>l0Efh+D;=Z`+;_mM5?(T~(?(XhRTcB=n*O|#o{&&Cs$USG>iS#K%jmcC1?EPe zIv59sm{QIFVsKy#I!{hc2)857W%1k$-bLOqDE_X6a_JpGk#LOYv+$CzlPC}9?d#%U z&|q2#73E|JD|U&ck|gljW=hl&w>Vf5BdHLt5^slc&?B*2{8iKzj@Bnd`-G!}JW+R` zn0^ares94G{PqZljWhftLB1eKa1c9$n16y>$Q=hZoC$h>A5cZU&eiaOcms%+0SUJa zp9fujAtwzv!UrN3ik?yMUUZ|@{f?Q-MsPXYbKt9`5eY;*966378@L0m(C;RDkdXZen# z4hX<7auRtAjL1aP59OXe?h*8Gf2CLCIq042%RrqyiQMFE2aS(?zCzz4U#0gtREU${ zOlx&tBnLAc==Z)pbSyj4e~6v}hOU;$WZ!be68pf$RC3S4EA%+$Aa@qOGoRtF5;PE` z3zk98db+5+=$T-Pz#vjf_K8*tmxvO9lz9k+k6My5k~<<+NMRg%VinyHj}YAxUH}$B zAbu|?iKDdoN6h;fuc^{w|@{Sh@PiHfy z7gr?c!tETmg!=d0z;0qXuX$h>vj8s80|Q&xU+|Dz3Rd4<=-da`BY`9AU(6+DaNs8U zi`~T8#R&WZIM)K#sYU(-LdRB+F?1`=4bC!pFWHi<&za1S{?AN(@P98rfo&I~KyH2) zI@34cQ$aBs{6f~mjPQ?T|K{+Rw`3ZV!)eQ0p&GG`13Q>_xJ5Rg4zYVU!Bmbffo;Z2 zq}l^xQq8YnSI{EVQBbj?)6tdMLu!4CsMh|5)Ije?Qo84tzF_x2YN)@h=Z0s!{|7b0TSR`Ry7*?3M!%aL`QL6x{RA&W13o64=h#$q zA|C)h?_(+gb-B~vTxH|PcpIU6{RjQC8pJ$!ApR2k-kFtNmT z&Q9_b1wZD%G2{$URDGs9@y!2*Dq$_eq(Eb`2DO%0%+tW(T1S@yN1e!K1->#@=t+J% zXDZQ~3iwI`79tJ;wUoW6rqAZ3!6*}iJjWcIdy6}gRE z2eysVli(eKh^&GZbr^CdxQ#G56ya*_>m9Jur@Z?}Cmlv5dRa1sS?`oyCv!dTKED*$sZUT$T+Ul6 zc8d=4n)BO3uk$^$9u3^7!te57vYH~5=$m-H?4>+hY!)>+=9wmW~Isf9!9vBfWsF5lCb9QeP-l zAeooXogNs$d|>(9ZQvE1C#DlQ0wb>;ME)XB!=5c$X3OGsFP3!@`<^q4dSfU7% z38aIhhehqgS@J}A6LdkUNk(GFx+J+HKPvlI_(k{_oU|U2m6BHConZG}6JHVC5|jv= zL6mG9&n)~PP7@|_4-r2Fv?z~nM1A=t(T4Bhk0+$epn!<4;(lX@Kn5>BwDs5WZvpCT zLBP*eV_$&bd*Z93}mX{M+9w;6X2JBUP0=!~}8PF>Rnr z_nskveV^#>&WKn(+tnXNU7dsQlilg}WMfaR zcdNgS-vBjek#Dz`Cd;XE?@M>7H;g{zTY?;&1B~i&pVgyr)pN%9SpODsscW`7-#g9M zp4^XYB!+y0-H!6r0LJRBe=K#2ddeJUL%}2O%gzjJCMEz6c%3MR+R!5O^WK2@wL~xx zs_4Pu3!?kNqoN^_N9Y&Ukt~+gm;0nEq>rUFQO#a}EdI7^J9Jc@$mYpT$R5fha$4$@ z_@%35D2~ZW(XWYxQ3TMD{-gu%F_#4AHi#W@mq8$U|LKs_*y$DRZ4B5N`njfv8{*ecTn{EF7(4&;F z1DF;56ZAg%CbI7)ehvERGGN^W%qagXdO02XKlcm|vmHv&S@c_f5O^|wF-Dxe@A!A4 z$}|ZoP8nbs?)8rb_R;U}2*1hiU=wbJ9*EVi1$!zK`UqEmNv)46%W}Vh$)Uj}p{7Ik z=_-{(jRSN1IK`*lLs`KHMGKnjOb#Y3YemxhM1J|!) z=uOY#N%$GiAABWfAsh?`u~niW$oe$!hRBv)lLn;MWsBsbJVbFFb&4Q(4FL=ey|2r z(cbI;>_iN%=n3H59z!?9>@V@BFk?`0oa3JWo(vB;n+2$=<-kFh{FOKxpZ1T!ydUPz zhd0Y~Xceh|xzoadwIj0@jKWZ?p?2&{c0Eq)-{GNpo_z}aqBc0UrGlC6MkU1#X3r^R zJy7;pOj9uUYXkH07o)=aEyT(E7f#^=X%Yy$>F5iX;S(~FNG>MS$xF5^*)35RB{$p4UDi^@j^s)z5u zk=Q{EhU!=i6XtsaJnUD`a?fl}x<}x#yZ>>YbX(no$LcP1``j@= zGT-ym_l|&GO{njsZ#k)^9#LKC@9<~b0tF0~-3uKQhGQijaToEFP&KXs$BuQvNup0s z{uBY-QUq>#ec5WLX*ZOgf+CMg9YeQDI=TE1+3ei;jVsCPne+INC#1 zQknELR4+zCHRdZgMEmjY<$eeK5WP1rMU`WIM7eIJ=eTChYgM2L7)m;^i@KC$G*k5xAR$?pBb8 z8Rhaijm{$HUFQSmd*=@)=}dLC#iP?*16=>O8oJN9MV=a-P9C+_=k0@Y+g{}TQ*pZJ z;P?1Pfb0F8y$gg|3H)bE(9hWom#D#l1A;85o$Ezi#rfh9k_%ADJ1K1}t1F9vD(4-j zQz_)lfW{jlpDe#C*CK*GlJCJ!etE2-nu1W|%L%BMe8Dp^qKkh6wGb813x5Ik{yU&U zH)AOju6~1|n*yZLdFU)9Kx1kGYLLy4y(FRvt42@b5$gUY>4WG1q|=RP6?j52RDB*I zyCb1@cmTIW)F80C+5n+45)8XjsIC`Mada!_@7;pt4-c zELdcT7*{S;N#>K6$7iF z!5g^eaeLOF>c7nQ1G$Tj{7lWKOR@ja{y%WSiba>=7AK4NOcZj@^F(|TKVA4%C_zuS zP`p~=kjzHaYMZP~)>wW6k#Up4qzDd51m^oG*eZX5N}%B}Ie1C%Y^YJLf+kj8um}o4 ztAhUtegRd!Ca6+|p${`5C@ScJB2jT)J{3A;(C;s%hYlhCWV3Z}yVFcH78+mLO^a5jDd#h~`U zNA3EbZVw-tiAU)kU?vtqvGyXguqFVpoKD42F49bjuu5FO`;`NQ=^@joG^or-k*RN@ zwqeg&L_Nl6=R&`xHfl;sO9o$LS52peXXMo$rC3kxu<2IuET_4X4@vZiylK+5fz(;mifl)Nj}<6&7(*;{FC=?lq5 zpkeetyVVoth?W62d-H!ff2>!!$DDe$J4E15nt)jLAH#>#eNc8}Eb|rNZ zXj(YNhf{1<%7a>)qk zYiT2Bls1$12RG@XJP$ldx4es@J7Q*rV!q-ycE*;9!HPYK6=0GrRZLJQ6y?Zd40zsV z#L`-FlkBLhk1R^|1ZP4SP#8w>KJf^#Q?x`R6KxV^2py=Rsi7J>5tyQ*a2Q$%Y%MY> zth#qNH7LP2-jCjimOTuu6&-qQjTjd3Yob4?7HLI>)V0z(towU0q8{z^VNlV*GRAiX8G3oa(tc0L1Y$`XTOpqxb7~X zZW>UX5n~r(U;7tIQU%mKD!>X3rdvRjA&Q0_8TQo3|NSJzI@M#> zeN0_|9@PyvSKY$*9n@CLp;}m#Uf>`eAS;!SKYTNNZm@g00RMT0-^^+4=+0<=LK*9=}?;6iGEBX zdmp~1|K%`evF;N53|7(rT0p{pKc(*PphE77pqk)oJ3#{wY(5syYm)1jA zeKVo>brRf={m5v}A$!`1-FFF|nGfBgZ`66L{2kOfoVL4S$Mr%N`XaK>u~6l);@yV= zX>h|k9G-DwJwEq)yCA|6uV&xIt96&<``!la0)ix0+It(d^)1U zZT~1_$+_&8z-7)5q6_$(ByTyoZ+)Sgb4S!(>=z#dKJu${myDIA%g@OhDNZ5B42RC_ z8uY9$V+Z^kqz(EIbRRhOI7H5nU>|lwA~-I%Fla~6COoTukS6FiqGu0keXfW+=5{2`bIPtu$GIAo)Td2M;6+&PG!hlt_8 zby$JLXpdgB0d?kufx*E3ve3Bb498q6I2@Ub7-zk?{(%_B--wAP>6P$J>;(MW2jrix zaTWXH8mcLh%)>k`g;&U9@-)7RNGlnJ48JLM$@3Vk5?px$6@}Q^m)?faS%3<_2V|l@ zkcIl`B(O+_BBFNmck}lJS8EK;4lB^7?Ta4JGMp@%LA5m(Im~I~Fyk=3GoWOWNLL3V zB9exL9$xzb)KmK5d|#UikUJ0`s*-QfS6u>UuI|3tzA~H;pL)-FFM@aX8vHuen})se z2qMTQpMw00T#t_40pKR%5${u>Lo^+AiYd?*9T}*Hu6!a`T_o|IyMT9x=j0vaj~7^= zgY-=}4}8!8;#_eys$Fj+tRzJ`QhH2!S9%4gwByoeQXYESHIZkolI=#WGfy@Hh|8<8 zg|aks?SxRV{fuYNl@6Eol_p3(VCU;Dkwe|Hlb9p^1$~+NILn_G&V=@u4H)zq0zNnk z9r;DPE4;~wq>tedL=pR-u~(PKM=TA+3Y?1-C_!IlDV!cXP#5V5EZ0k%_~w8;QWd%X zeR?6?1S99BeqcPTh&f%bE0rLk5|o1a4erP(vM*{Ht-xZ)023<~2(MJc&mLrdat5OA z8S)&S^OAguk^V^*Am>w2LS#KI(uU}ohbl@U)e^e$e}kbiotlG~JqUUIG9Y@!BI>rp zK06he(_88#qUTFwx$E$ZI>?d;RADU0o&Mn7hu5mW?D>g&bSsn>kK=11v_LwN8tj-F zU=T9NF62%;qX;=`HEK9KvKJwihvTHPpJwPDINcIZ-aWz8V3$DoMh-Qc*WkJPIj6yN z@69daj^+L2_26H|$?#tw{U^dCUXQ? zOq%GnaF~#QR*+Kgjei}eG&%n%Zw{{`FAnZqOM&-@70TY-FtfX7TaGUI;!o>-~7{6A2`6EX3)_RE3O3qYAT z9gZ41QG>OzDd=lIg3gE(eE#)tZ~lQbwF^DS0HFr6d_0u9?g5w7nb!|WVHbE>UO2xE zoC}Wg-$3n+3)Qzc!BF&3uYqIA2+V>nf)cF2-*B@1hQ8Vw!Ca^i*MsM56f*o${uii9 z{Nm^0`)mFYsMU|fYiXcLc@b!*k-YZMtucb-^PjR-FYa(u#l8{Wi9)DAoQ101C1N&K z)CBN2>k*Maa8giWIEl}j53bZ#psZGKh5!+l$r0lG9tCZc5RMA?s08ePbf5%#wwhxG z8sq`Au(lx^-3k`_XXvZ^K^HHKQxjubjS~yZk2O$^$KF6~<0=#(a=`{NL)kBwQv)cT z37lbghyFkbbwHOp3z(!7Fs;WyJ*XR02zsE-`X5tkIcF+Rde^|!dIqG|P2jv<;S)Xu z>Mj@OW<9iU|KKkVzzaT%e#|+r=x=lKpvZL!Rodm8Rk&XPHr``kj`kya9tO@?N6ui* zXuM->@Sb9UPST*V)E#kU1ZOGOdK)=&F>aTj>;4w{E=Tco9FN|@INHEL<^prZ0m^J7 zltqq#>3SApdk{Yz1Da_$v_{q;<7)+6Su{}tT&D4erXz`dPzcH(mZFO`l-Q5k3}Pbw z#>d%u0sd#(z?|&QX@Squ5$L9dK+(Db@4+Lyg*s)UKx!ZZ+LA%g1NZ@D+nZ24e}?-r zz{*WSC1pCB0rp^jb_UywRio-S3ck6M*sg3ASX?AyhL`RJD0c5brEv#ym?>g}EDx+I zHLBJv*^baC9>aEmdqH!Y=$ipq)Df?c0-WeDyviJ4Lau?g^a`#gx1k>K6z~58`cOwu zy;+O<1Hhad!+Je|?>F$tPCz5-U#O`az$%!uKxy0C`rKq;60$%)^+o(1# zgcJ2I;4s8s@3e(t##&UD9snJ91iCy+kYzu@Jo5(-iwjhj*;Ju^YSOGhEteZr+_~H8>g=h zs3@z!Ce@=NazAhq`eVC+h#L#H^Da<-j)w->2lxOCM^@1W|L2xar4C^^U~ZA{-8l=* zxk@V+S{c7sX44K5+uC7Ow@b8E`g( zc#FVpTE<(5J-rjJId3#?JD650u{X@b&!fQ(-O3w>zpvn>0$r}>-scX1tEQg_f(}F; zQ9_vU?ku6fV^4wETm#g36g(iGW91*<^a9Rs2s$(EIL)!D|36Z>F(Yn6+3zu;l^zl3 z0dQ2GF;nKC3Ko!nMrCiQpdA>@UPcIUIw!0I%Ja(+LdhiJX~Ge!7Ub^%C=l zhd9s-^Q}KV{bph>R9G$%FNjj;Mg@p4T*sy0`d#LJg4S3GI+98`p$NK9}bMPbvque6SU7 zfK9j>wV>hLR$y9cFp4b3^fhi*P+gdbDAfo)0?l#X9;+di;1I8Hraq6DI1o8=8fx!< z0mmE<6eo=seib$N=9o(#fl9O^0&Hd%u?yG@h)Deqfo38C=$J3)s(fIc0~hsxd5d}Z z5cfBjb*QpuLm^s*`OihY{v)auDy)WpUxF%p5D?aUs2NuRQB{aa{WZ+>Q~vG#!?<6I zHF5^^jg?Tj+l;#V9@PC#`hWU?s6gksDf(~2poZK7D`7aQlP!=#bOX}59o9zY|LN9G zM}OufQ^q)%O2z^dTnntvRfu7SG4i*daPWxDXMbbV9f(F{=q*r)L;>vQZGd!L7}$u& z@(OiO8a!4eV26Gf3pJ2nPF3t7D#Y&5K!W$d{S@q63D`3UJQ~i4!|t{ltLr(qu6pcP zpRhAM#9DjAxq_&)6MNipu#a~D$x;l&Sr~NG?Hm_&w2$B`%YaYH!gyq1R9XX?o>ejEEgt$<$m+d4dF8+g&1IZLn$cEvtSLuKv;6uYJYu|5?0&}_ujtlgI9_-Ue8S(Z;R?+HUbQ{eLjq!REBrhG*X;-}!f%iVJjYMBvA2Ey z9~;<RfX{^*AP?;#jGh&e=Bw@yN$F;4GD=9;5=)?k&h3#&Y`NIc@NNs)HGvfKOf z4I?%USO33V{ywsVDYypvp~ABd@qRBJUyR#QR7}UZ4e>ysEeisR%|B9bbJ5ad?X2pRDWBm56O;Sl5=U66aE#(ZJc(M0|mkG2HPwKt*vp_=D{O4WVM!2r8v=D2zJ6KFEho<8|!O zUolfFQNhai#445A1U(PcEb9f@I z?PO$r!*P8E{_pxEVXW#RnzzFkFT?dch~4QCGO{n2`5atN84&xRMS~MY5DFp`YKNid zR>%kezJkFL4FIoa=M-U0yg_z&AI{g?Fgq4wmMp?7pN$V#;G6vtW0{SN;WR$abEy9-k#pq1|DrRrPIe;iTY}8)BhiXG z11?1;h#%a^z;FLWT;T)+&u5j~*2vdw@NAjKX~XVA=Olp<1pdM7 z8;$*T4;(U2F&CHx*mD-bUu`GR9ohRGB!ejYGL;`lkEVi$2lWQe;jT6mnz)`Vdp(!u+GdPKM@JDgt*fQS*dauAQ zY6up=9@(#;kHkU82wRCS9J^S)zmUA;pF`9po+G9QaGk^aMkTT`uHOQeE%6vCsDclALtZ4M0ew|bcXl}DzDRd>t^=7(nd1jD)@)FsYq|t+T z;u}Tpp?JQwp1ba~?p5wc&m^EK^zK)lV84fbLS1!!vp4jfW6rZK-)+YL=T6^7CXQ3= zKMf4bdbXHu;Kje7RufJ6#Q`N1@T7Vt(HeFkImsho>hhC$S%Hg84_fPu_g$mw1~O68 zs$j#&m9C@Sx$F_nef9^_3q0q;elscYW_$DKXgF6tCHjLIevXZTHoA%Z1>N*YdMH_) z{+n%%_0~SX12TaMjN{x2)F*BLK{1{)h<-sP_^+^fDEWqP!dW?U%U{B@;B@6K<)!nj z+}eQ+Of*N%l@k3q7r3j0cSRHV?Vz7=n->ioc^6m5X+%uI>}t;g@19c?82L|NOb-yG zK*i`MznCisgfee{s2j+O7aS3k@#lhDs^Wp=L4^>LJdM8gZZP7V+*!OBC?q`L zuHsfFsvz5F&)JHzbSv%&{$q4VI|?Fs?co5)4L1^nflxfnW)<+kXlg)y=7F(&<$}ui?0t z0b_*)8{)KMq@$s|k2S$E%6uCdBkxUnOcK*=<7eYN;|=3X(<<{c%QkCcdvmAMO?s}7 zEBzFEf_TKIL{FsAimSn4VYQUqlxLND!k0w!Q(cJ6jvgE{M_o;0iEEgkNqn8?Ph6PT zCm}aZsL6{t67^lxI%1phMChjAu8MEc4&q$F37(!9#QDZP##v=ER5)U3Is8jMd3$(P zx{f*G?RnOHmVe9wbCKz9a~(^F)n;8|OS04U1CA)C+bMH*g?HRJvMqhq|Ax83mIPK4 z8s18Ng_SON&+@HWzy6qUyJdo_ zh;GK)Ev*~Ik3OVnoFJ=GR7G5MebuSeb|;Nbo|=3=`E>P7HB>2WYW=8vyw0mSwd*Kq zXQ%eA*{{aD>PwP>s@6*U9rroL98nZpSlXcWCU7|Fi3}@+{TOElrum z_J+Co5xSw!yC0w(jeCW*HgxVc8izueua=oH55b6bcFuOM^eGq>x27;jQYqUQv@S#) zwnw=w+z9Q%wQvU>6!j&lMRe1cNc9@^Np-0DNHjO9Ld8)%4!4Ir3^^5~ms4=PekaJ} z{l%%lG@<_Xws&>3ceW0(JTs3nw>E2_yA^KsLd~}xerpFMn{bJkacU5y}iN6b99)HaTEMeGdkqwE|;g`@>9R|LuXNPEJ?p)db3cQv8lM6$j8 zjp$QUIXM$p;xN}vd$EOQda2*9YoL3qYi95oZ<}4#UXH%5`JPX{(-a3<&t~=k=M?uZ z{%gTlkzLG3wY(Iy*s)R;zTryXOGg8j=o1VQs06XlgImX64;P4T93^{-?oTFry{;>c zG}{?-3*$#!i^`m`F(urhrUlacHNWrY&CNCBe8?ek59Ai+9sa!|Kd>Txm>>XoGrNjq12ZE9N04K>13&ZTy&wXN3hT1`@W z*3=~@RO^{ICT_fXWmHClDU=8~7E~!~B5uYX9#}+faEvilseDq(7WoR&3VIbZE4*6N zz9hZuScOV=!qD7ow%oVYw_kC#^>pwxp>+O&Kr8NO{!ZaS@e@gHbaigXF34Xg`h`>p zZyMDnHZfsh)eA|6CedF0WTF>an;zn8?D@-8 z*O6iCV3}oVX*_O7M=`0pp}?Rv^5Ji@!XPoMgKDxvpJ6<0+HPrN@9jF`4WhTRKBBYW zi+G^?@8I2`TxF?pYWR|Hi?X5e0W^4bgf2uZx}#VqD;19yT6s-~z3e3aF-q?n31tYm z`-8KsV~g#%<)|s#P)A!>mQp+|pZ81mGyZ$@SN@kRpI3Y?`MmwhfUhCnGQX$(4CKcA zSy8yM^g?B4Lz?A+lcvV=_Q~BUU1E#WH+4s3)@b}7yJOSF*+&}J$_S7;C5Rm}i$$XrE`qH7aPP7{ zvZ7*=1ZHuoJWfo-@eJ;9LOqSd&yI%2LJKeC@Jj2$&`OzKis{<7*J##g1inzxM z57U?YwBaZ(ePjpbyu^SDY@JU%H}1Up%w8_&-5_!fW}Des9S;pOgGE^vC+|^S%eZ z$Nb!xQ!|hLm6>lToLu_7a+L9owU+C&PwOux_KEj}^ow3xby%HY4No*()v9^BJMBg7 zC$=5cx?zjpCLim+uj8m8u39hdV$9IUzTrK?T8FHYj}dcfx+!p>N z+#%?|-_GsBS;usvj(HY4vMeR~wH4b-dKTXKQ~me!U;4cFc@uv%`knqKs9-};tI{16 zhxIbcUdIscG=C@JzMxz(L(wc`MOfYN9ua|vj;e*KyDCX!$H=RZ+oM)Q*N%A_6R-X^ zrhW9}$YBxB!zKqy{BedH#rY+D$}%d>X(>ab^)F|p zw;4SpFoyR@RH1ki;fPDFnUYbZNqLKzZD({?-(h0A0d4BEVw)~)n3#UP#)QPGF$v0s ziv3~>-$}e@9n?1OPWLO!gDCS(Lu-AeP70@hf3-98L59ZquDU#JU+vGz36-46xXS8U zg^tiY(v=z4+9tbmsjkEv@wng>5vO7zaCM9 zs&tIo64Ng7p|Wf6-_kOHh&!1bN;fANs0w6w{hnpexH{&p>NYtO9He!FIp6SJ`?P$1 zsj#G|$XvLx@N?m^q9w%w3yl-Tyv*2LzeMY+ zxL3ZjtWRnEl9k1A#b=A!6shsGx9C+7T{NJ0OYzX+%;EvX*NRmouS>|%L*;EN^R?Ub z*@$`-=CRfh_JhvOp1WjqrZ~`(+g$KS?34S#+N-Ylk3(vQ=`24(BwMRdL@=?dc=5D`<2p=8FHO?mO#vX%~sM` z#G}cOj|5YWLN#|M*CNX!`Z@J=-KbnlNYJJbdEoo(?Jj`A0Pfv zBdp%7PC~|*%nw;r8ZT>nr_qpx^7@kW(3G?)S7UC4uMD0oT`8zTB(TfqGB4{)vOlog zF!t8XsJKwptE@`-wu+@%ul|}T&FZw(#k(x_T=ZQf-=Uv9h@9xtc!l1zJ`ZJPB8fHp zY2tbEn2`F)5vqddGqHW+X2fq!C`%-(gj5|}8^##68iI^hjOR^U z%PH$h`($Tr_jAvD-)L$XPQuTKBK|~ig1jR5xAJA=3UyK3vcv&ZXH~mgjjcMPN~?r_ zG=pO1sZzrZD=NfQ_=^L4`o8C~!(iEJT&NpTak}(D@x-FDg@+3>i~1E8l&mT1Qjw{R z(o2oEOg?jG>m1u{TSwbIYb#4PQ+0z@`>Z0hd`j7rve#uR%Rf~N)Y^6J4O5KyrdO6v zHi7f4yU2HfzR&auWD$S!vn7?md67*M2Gy95mQsIJ=DLP;vU+62H9S^-N!?ksZ&kmZ za6URixn6NjoXj@`y87FZM?JkD*F_j9IV}Gkax#2hWZRhLn&S9LiS?^gRC!f(akZ`0 ztW_(k>`pYr@6+syIT=|HzAdz;qNBKsyM*cL>+L*lsW2RaYtXPtW##osHT>$=89$r6 z<_K$^HQttK8)v&|yJqWWQ`zG2GuIyMxZ`xY`}#IeoBWH}$(%-9ninkWB|a`qQ&a@M z2$QN-Mwi4265dwfBy~#empnb`O4VNpH8nS*&M8L+QR2}&HG75(xc4}^S(loWhNs&3 z6sMmdYk}n!E0=~cey*vIl{KfTxd9_ z%h0Z?Tv7SFvbL71)953RotGLfn}cm<96jBB?`-O_ziwbRw}EJpVpGJ_xJAjPS}p4h z&U9oYHD1{`y79WKmJMpBn`#QHepi1Fe-v~dwDGqm!@MfD-LcW8vb;84)Mx89 zVtx+PZ8uP+kCsukI*t@q15ZO=E2^jeCsT`E%q)l3$2Gb-ItMS=<^+#_Q@BBLNd7yR z4cid0K5}*RPW5^XKi(gICP9|?GGTlC7fqwsQ1#8|k&&IlOG4y|h2jo84x2_AU19d& zW>UXOTcvUu;^DN4ah312Wx8wnorWjINOP3su%(*yqji+6!iIg+K{?f)_P%-4R{t!p zQInuTC4f>`gm{4j{y*}yLH>}B%BQNe(OR`$vpIfs!o7s<33cM_u_vPsM94xV@)yDz zgo?TEJL4*~4Kvp@bk)8nKT`U&xNT9F!mz^j*oBNmFG{k@3Zp=!dm_+@cvnpf%?F)>jyBf`Uq z6|DFfuPY85Hs>nq7GpEr{EC)ko{~)^`%3DT&M6D3cvQJX*WX|>PB4GB{IE`jud(0W z$obyZbXqL;7)F^o4<5GA@L4wu%DDdoT9(-dmpc-MvW4?7-SGjc=pP4xkdF>Zc* z-}ruU9b*SYKa8jwS|VE`970s{M|n3mMp(`nW@#^%4=g=be5{C5bf|Df;l;w~MOTWm zOS8(~R9@0gH>s>o?a{6rw;bBrJH0SL%UaktJG*n!iP=pWZHHk)uNoT@ z-bBg60Y$);+99EbCAbU6NKhrA${IuKlDhFtxLNb)H3q z@M7RE?ijfEz5uhh9Nq&@P}xSO70#ZU1%HWEvT=$J!NbDtgkMuNiMkv;T5XKIr#Y;# z$M%eUrw&tR#k7qUMpaX#DS5#SrSk;uIHh!+NA2*KyBYkI9m9)Dlvd5~hIc?J&Y8T~}`C3wE{k%XT(V2HZ@Iz#foRqzlZ&joPJq#KH zkK7lbTa=?Bf+9~xG0~owJ?i(U2rP`Q6{!qw7s8QG6@BEUvWrR9m1onK4f<@Yv|>^j zQ}U?zYf;mp_@YBa$BKhX17!^>_vn(1XU)ad3VV)on7bjAzFxa8xiXyX>~*b6%;QWq zjFHBZhTVoQ1~HVcS!06vwFTOPj`uFDr!`qghXtnbR!U++2Sm#fFIJyldv3kV%)?oy z8;{LCo_(P4vCN3N8&V!uy%>8x;%;!7^a_7{pnwYUR&`Cc+blOt8HR`2vWnT|=gVr8 z>nob;4jcZMwpuG4BRzKVHM5qu#eXkc3g)&E7{)rnc|yBT4)(xV={=c7@gnGTh)kIp z!H>KbH6-Sv`c>>uO{u15T)Vh`G*4pfP(eEo(>r=nWW$JFVXcA|N)Gd%1@u%i&o}!K zbE&?ha!UEG()T58(R;~~K7BM{Xb=1A+(J?u=WyjQuUL6@35g)cBC{{XA z@Q4%QALHdYDNAi*p*FMPM`>>Hj-ua%({SS#)hc$DbSn?mYV{8gm-vqAt}n<8Jy3G& z?CarGc(%DtI?X}^OalZMt)oQ=z6njRICCoP7HEFQ& zj`~>DZYjIcer8N-IHqxp?5Wukn>@(6mhq;Rui7k)NwqmdB#q+#9oS93^p-hg_SV+n zW{+W_Zc1hSilOBNWuwa_m4vQLUtpYN33D{}=t-0Rc0hwV_dOs--*8`Z>w*twh3A^?d@}WuD)43`Mt{Rx;BP$#wVtW=7$!$wT^v@ zqmIkve&X#%=1|}L@RaA4@|TFr61jYaA`IT?-+~4OXN0s19f5k_7dV_9QB{qc7P%r) z7Wp%RAHE^9ZO}+*oG_d4(w{s<_O|9WdT!-}vc4q`i_R1hg}DVC3Y!$&D!y2HrF>px zecexe8{>6kXzA8&wsiXu`@i-^_J%fx<%{`&=_a!6k%lS;n|_6!(ml{wbTjoG4A+c> z=C!uoPVA-Rzy54OD7vHwjwp*=P)(L9NWYVz&z#*z*<@goH;s;GHm%pG*3D{!riJQH z@Nvlt-e2qkva08-W21GB`G)a^{+YI*VrIFdyjJp^`(TZXSt4UUq>3{g*sZLL|Y$~n-{20ck~W*hFi^s@!Ct}pGvX$m7FZ)mgiU8 z)Xvi{G;Todm}84~RCUI>;@w{NHP0JwH_}0!_rGK35F7cQMIo|)Vp_@*cIBnA z%_U8W*B6Z`x?6O*xKXL1oL|{nchzv*)W&kqdck(ozSXh9+0r%N)z#&8Hg@tH*KCii zU9DP6e~ZQvWZ7;0VM>KQzra*%s%MF?&2?0|dU1hO(@xQ7|WTRM;D(Dk4~QP-Rp_MtW5DRVP&wRdUtNh_~V6m90X@1ck|( ziym{0Ock=9Yp*rKn5I2f_Ok5g&T_hl+M5@c8@`8dTnWLTVbE!&^zSL zPmU^%T6VW}jis@L*z!O(PR)ogHMjyVsB%pse}2O<%O-SQ{~b7-qBfsH@uCK zQ6aX-0rC9gh+0+ZKB}M5FuRegiK)r4#@@_&_14rnkkk}e)9R4d(jJ0!fx48@z10zA zt7#cz8fvVEvlD^p%_k; z_*bYAtq}DRmr2aBnn5Q*nka8ZFp;mKZx!@t>aJZ7*?9*S%%m$9ebVqTsGGM zcQ81|yFFIVI`1|gOTML(*>qwhDvE2Qy%k|0cf%S+42jH$E{mbmO;AHTsCLJUjd>b< zC2C0Im59HU@ETCmlVl5O5HI|-d}p1_tZoBSxw7nB@qxmw1^4pH@^cDy7JWch##6ah zpJ-ZW8Ez}GH*_|Fs%@Mr)VaWZ+4|YcF>Nr6(?8a2(oNM3)Xmo2)kWy{>bn_M8he`8 zS&jBEm)5QGHl;rKyK|NZLgmYqV)dcK@an~>fwY*6YYl?4Ha4o&Xi?^^x__rOsg|i3 zrn(S(Qqq&35+KPg?jT31?X~5Kxy01jBrvTvelqO9`Syabn`w^el4+kg)cVYJ)N#}G z-cuFq!N2<4)zb7A=$JDx{$|l&>RZN9IIHW2UI@#dg!A zY7WPKRR0~*Axfgw)p>pALuNpA382*{x8k|^!2NC?Rf zn-TFL@Q#7ZSnXhm{DXL_AcK3K?Lr^$Zgn2C5+;Xk zYvq&jab*ii9VNvj%}aS@gUTCJ#_C?{|294~{ehELTkBM7TkB3sJ@XjjO8sZ;=*o0B zrd}_vR`IA}OXY0sR$YuiXsT;@WqaY&d3@vrzXVD@@Ay7(K(Rwf#Jo>9n_N5feI0eZ zF%1F@r#505t!YGM^6Sk`omy?D#;qC`!jm@ThX!g<7u>n_Osmpz6&)(ANo#6to^5V{ zpH1dxmR{Bz>nYnCdoyQ_tB$9qcaE z>Z$BeO7*+gDslYybMb8w$`fiOUQSpR|5I~D9UR?8)f4gQv7$)2RAk`I=h*z||{8pU#q{X4>Ob+I-82jldTT8%S~`f!S(IpN^_}P@wgxA`r}&c9_IN0 z6|GtRJAqBSWulp~rNRA`_f-#~hs7?6^TmHka3qXRm=hlr*D%(L-04TSJ@igcs_c$v z9=|5>m03X5@hV)5O>9|(Q)~xaUG3h=jg=oNJ8J9ddg=EXM5f*5fW>M(VoR|n+85Z? zTANsQo30uz>dGrORh%quTRy&=R}qBgAJo+}d^K)2zp)N+aNGyH3DkUCn}wVm+}DCJ z(gq<%RR6}tR>`hDBDHCq)9D!*Pa2$QIH_S#{hag#sjsWu(?mqJ4o#N3gwu$T{%oJn z{npXOzR&jER?i-=t+A!pqHN7<)oc$iA2O_btJ*r=8fKed*E?=GOPy*EC5C$bcsG(? z>1#MS(CPsIT*{`<8{?asy3y&M2k;dwxH%Io0P$*x7 z3<)|cdm)YxX7e&Q1DPjOYu`P02WM-n|1p+@=F_Gk<8)&$;|SwT<2utPGtc_P+TFIu zHpHf}eY9@3ZneI)Cfl~#V(kjYEaxWoL|+;GB@n}(E8Zb*8*)SGSLH@mjs2nd6<0mJ zBJK_Pdh(dO$n=OgVON7o<#nWEME~$>a!&;$%vq|JkL&R`;~aC)!+l^bFpV_%jIWFa zW2$M1smzpaUJ1{rD2v^^+w3#Nn<9;`_5E~C#L>~^|KQ}iwQNB7oCnmTdD|m#w|0qL51qrE9tX}*jwnYhhs8e7&e-&}i?&Jl z>WW%pd&gkMB1a5zis$Zi-WlWy`WX;8=Lnjo6m6GU72Hs}a)K%%s#$ccn7o+D>O%Ds zbuFChiqYj99kD=pDbyIO4(cdxA(e`4f^)nG;uJf}-x(va+#^K~?1W>0-D@qdw6K`X zT60~?9*YTBfU6dRIoZ6(Y2aYK1j$RXt; z)yU}X>T$8#V~y(HF^y4ibSr0urUZYJFP63tHxRDjt9a*#ZX9V~Goz!&Q&wLe?^*Y6 zC)c5|rK9_{+PKWHPamv5s8i~WYiDT3XoqPVY6~luz~_Kl@v-bvX>jSzlJO;LOC+Vi zWqr%{R#+>Sp#sP^eKm*LHaH%*3OzN*5%e}jz-iCBCu*VyRSKfB;;Cv2YBsI?C|#Q| zE>oN}GwZL0?dtDIi%1EpwoKC@k_kN^j}h(Q?qJ_hN?)XBvFnp_r1Q5U*KyQw)Lvp+ zZM$Z@W2pz9m`&yd=7Z?$Z?WhsRjoIzS8c5Qr1Ofq(hCJ{e;2kcX9Ty4;D$I+-Y0l^ zSnG&|k?GMZV}`1$#y*UFi*xo0b(fgCQHsc{h*ruTp-a(`ER^Xb0a21L6|;08=NhYE zmeLYxgU<^$gTBrgKxVA495dH6m%^9kf@v^DVXHC2m<~rLq3MJv%lyZD$g;}H+R~hb zZoluGe&TN?5@C<49EZqUtn zDjFxu<12VmiHCuojLct+s`TD)?{)UIx3V5G{~t$Z0T$KPh2e9~%$(^SN=mW25bU~k zcV1huTkOK_?ryQWuic$UNH+`&OvkDJ^MB^S>s5i_?7dg*wcf93iMyC93M=Yc_+LSr zg3SDP`Csx6=GVwSo>!V%kn=m+k<~LRFlz#`(Q~NJOv&Aym!IFP@J`VkbGT)8`8V5Y zP}J7@GTEy_KM^gvr5<8h6l|$9xO#;;W%Uail{UHCbY1hNE!s5aqv%H0Y7eQhFmyq{ zbA2mS73oOo8&~LU;J)gN#^j>Tb;niedgPk#vN(;-x{hL7JL}1^Dwf2OOmkPW3*6+T z&=B=E_bnN13AI*ojC4QpZRTDHU8&^~QodUirkiDq@b?4+2fah*OmOg{;11|Uc#DX( zaZrzd>3(+OGJ{(;O}kY+M>$SDMmj@s0$lM6L_>jtTI3d{hA+p{+r7wn&u+KQFP~J_ z8Co?XO4^upxT_jo_yhM-lM6kC`9+Dv+LF(uNoC`0$D9Ma(VUmqC8lJ0Wp$c~a#HCZ-w>#VN2HcT9NS3gB{RGLT41c5Y|84dQyVRXw4WKV#`GK}2~RlZuD zZ_a)8f!0TsVI^_J1*m=P&ri<#oOcw2{-EOPB`3-r+HB7L-eR_pXe~J;|E@l!e`bnA zWcj&5M)2kkDl{pC3eg7N4ayG)_n&J@HmugS)Ty)$G~?9ARivu7a+|^{ZzhkF8KoB` zq__^1FGO=gd_&y*922ZBEbB{l7Mlw%7Oc!alh-$|W8Rs(1NqkrvI}PwmztwXUt12B zud+RG3~~D*hFl>y$Ohtx^dZ?1MXai&<|owt3iK-sUkyq4_+;1vb<$$}W__uynl4P6 zgU+RkiaoMU^chh$;m3zEwLF8IM{U~jKcy8*z7>Bi3jTlOIt?UzzTjQK@q&5 zR^<{od$U?*=BB5oHBI}O`Zo1vDwVc2ZFu^Tj4oMIbA-II!pdzu2-&?ZW14&5}?OE z1bx*XiCyGkQouaIE=fBLAu0r{80G<6kxKbzn~5tw3X-e}K~eo2i}gseYWUt@a$42#+

E&MKZ}o>OwNG{e%PJi^w@G1rym8OMC$8WPW`{*pB56vZ9YCCv!kQ~giF z592n|8`CM%d{bLfDe6>>42|{cbi1_$>Lle6d0(khe2SV+==c%LGfzubzP;Sq4cdeM zmA-~Ak2LQru3vn!NM5wK@O8nyd{f?}oP$}HGF0i`Q_KEL`!nFrgFi8;hO}>Kztbg| zle7BfJj**=m~P%)w%oqLUBt8`Z%Bi+X8%uN>#8-V+p*D{C`t1rE#I}8(fU`bel1={ zoo(=}W>!R_kS+c<48yc8eaLc87H#jdA*7nT9o!IFxO5H2gKiGKUAG{Mx&qKc>i+$&Hm^7 ze5PKeamF~qX8j&rvUY-YqqdK3uD-;u%T(Z(;J+|H5jY}{5Agb5@XI##)*CdN6{qOY zR3pB&Z@8=2_N8oi=|yw<;(A4Q3a3E(eO93o+REdKbBeo|_nP0Czo*sA%fy7wMnrUp*i=AklxY{|3LFrelUp zx^|kk%3%2f`jJRU4(3lY25**&a}2lp*{WN|m7guslx?&4N*9z`N^Iu%;%Y?^1vhhR zXCKYzo;LE&)8uJMw-fgz#wX?`u1ShX-k4H3wQl;+%+WdX^9zf*m)Zk z6m<<`1$V_i)q2!60v%6>bQdj>eOHpGl3{C5p8I;?j@KZ^g zHOLj?o5PQy+R+Ua-_)yhO$`Nx{f1czHW0SH}$=YqfAP_ zDSk`+>igX{bu^tf<{Ro6*6N?=zN6E65l%)m#UNRK`X8}{>>=D?o56>(&Sj1+_O7<^ z)?MY+vN>f%mXVgzr5j5cn^zT0E2xwAC3`|_NG6^OFnX%(X2i%l+-uk@@|@Zx)3r!u9OQJCEyA5%pBfXU!RnL33Rl z0}X>D)nnBu)eTjUTBZ4<<@C)>Tl_NvT@^-$_(JH=^C72#uLpVk9~%E?mnf6yDC!G$ z*6VXtw5OCeDO+agZ<%WOX&G5YmM_OEy8KNUYq?t*P_nW(1ULPI3i=e}7W6GzYL2oj zv(|LVyd;-HEI~~5L@`?3TYE&ePEQ*M!xd;J2kUJ*mA-*KP@keZtQ)LL&}M1&s%xlD zD-vZh=+mM+blHz#SkF(_cj!`$w#v$_7Eftp>FtsZCCAJ!iXRtkC~Q+unzu2xVb15Q z#hC{)g!GZ=0qOnI3(}8g9Lv0ubvyf1&f(lcd7k_`g?EdEk_BZ3TY%H$dBBYo{i8_G z%Yvqd*R8s=mZ5%|Mq?t2nk;X!tI@D}s+y${9YZSw)-|rtzEF);ER`?AlzuH`s`|P% zR3Bpas^6%qsac~~NxR5c_AKPy_L_ACr*dqWH8ZBAFH7&7@iLRm?wLQP_>!f8eWcs& z>&`bPt)iXuW*H-wC|fCI%0$IzMUni2{G@yfcyb#QRg`U@eQ41hGX(h!3fLahJh)9r za>(_NK2_LlZ#_EGjSTijpm zuJX9Drk0B((_zj1in|qunx~cYw%jRSZQtg4<88zZB5H^{l3ubv#eL;ZC^2=?){buvC>Y|1>G zC1fwo9hiT=u&24MWxMr=bD^(45hWd`spBUL`4Lg4hN4cZ`o|lJ8eebJzk#(*c+J$x zPeWG)&Ne;L%XH^8eKn1=F}jh4W2T3GXZ_a&#QS@Uc5RyCg(Q|3;G5@|RYv1%h|vY| zHRnq%m$$s&-=bsYjuxqPx4oe&+tZq<$Zg|a3Vp~rqFnK4daU%LbU!GHB3C7Wu0wlcV~L`qg}F+x zz3@&!Z2pA2E4eYb?Q_Z8qMU`f{qtt!S1cS-(sU^6ugsKHYoRX|qO@8A~Hdc9$G3by|TOFl5 zCYwWd6kjDr3&*%%A6J|d5ooAr1x1PEssv@~U=S#D}^tQ=IC|rs)N{`Z~oT2=IGy4jx_TDm9 zdRZDQ?M!!*M2c&Q{HfE#dyr~R`G$K0=Uw}AtD=0grE=+`5^u@D(v6n%vQgIKwrL>a zX&n}OM|(}%sq$Txp(U-0rxaExXqA67Z+~8H-aq*t^G6jlDcn@_w%Caq`b0}4w4VFg z6C4LzH@yj5AgL6emR(XW)&DTn3LF&tEi^8yU)YN?FHB+^}7DN7GIfCBH(S7p*2X@@=43ruC@Z&!FrS;kn`|_Z|QVX(r``_SRby*( zopFV`Lp&`(WgP~t)+}}ew})RT#Dd(BMLh>cS_@vseHvXb(mm1u>0g!OchH;uP01*M z2q3m%*1Qwg00B^jIK?mKrm%;Y|Db$w)HB*$$@SPV#lGF2US{!El^wpexAr)j8R@$8p16(|!w8q{X%dwwI_c^VXKOZ?>NHL!kKP zItGA>cgPj*?u6SH9~Vsy7GI_7%d?cP)a|t;xzTor4I3TDgvs1abz{j;@>5gPv~GBr%eU&?PJd_xyuogyazjuT8}kXs((hDzTr>=GNhQ!$n8W*H+PfjJNyMod0l1E1N)WpOD`EXw1QP)FH; zspkd!NIsCC#2o>5t;~1N>+{U_WVze8r@8Kes1)H`>`*!~?DOorZLV#SbuQ|ZKn9hi zmTf7^C_7m0L8UIky4Ds1ZP1@~H$DpOCI`lV!E&wU7yz>CSH~VlA4jZXxkKgHVjpJT zW$)ss?NmXR@r(PGN9KFZ#Bh~`5VDZkC@zqEq(4FvGD7)}`d@IbnrP(sDA2UhPSfUS ztLqx+!gM}uYu#mN3~$h-X<)UBtzzt4Kd|D4ytjZKpyE&Zi8mreLUk4m?huJ56ArY0?f767Mci$Fq8HQ zGqoKEFQ$k$@K-q(h>-0uHF+OomeWilHj*m>OSe0i7=L(%&%iAA9H=;0`SqBkO&0E8 z-Hr<~%udcmuh&5+td)E3fmXK4UCmwQ>ft);JmQ?{q@3>^9UN!vYoVcNvY)ZFw~;oF zwaoh7`o~(^w%S(Fo^IDUbdL9q1ZR8KaMw@Q0e25ihG&5H64*eyp`&L2DbLJApti9W z6YGt+Ibb-i2IGv7?$z*|05#1rb zCO-%gPozSoSPo|Ea%FF2CFK=mTh##76;&N|e{~b}T~%$UXf9QTD=mti$`{J@%0k5? zFtAwJ5D<7+*=Fbv9)u!bH~KvYGA{8saVPON(J63u1hNa*S8K_^R4MhZ=#r?W=pdDV z-yej2O2XinKtgB<7QtabSfu-9JoHQA~5bWwx><{)i zR&XkF6da@x-bBwdPo!t7rv*q$W^j-)z_{%L`q@m7Cg(!uP4B7dE_dpk2OJw624{|Q ziz@;QGQo4q8v%AtcV-2<1hf1*_yo)_{=sa2N3K410n~vh;0vUICmRn|nvV(QqM^T2 z3Jy(QOfQeXM0%Pq6w}z3Fq8cXw4~pd2p)zh*eaqi;u_Ez=_cJGJt&Ny;Bkts8`>_LQPju?abzR(TF;K_lfCWLpuje5R{OCDO*y zv!GkGgThl|Xw|Qx--C_RMY2ge7Ay0fszT+GzroM=P3;#g2J2A+PDT~buA;CO$>cfm zBF@Mv;u>bbd-Lm{?DPn}WI9OGE^xv|;Yqd!`_Kf1plJRrc*V(h)|I#qU?%DCeBb%L zdk=apfy_4q5!PEEb^(@85 zF;5N812^e80_yYt?>wkCO#p%Fl&=Hma(9@Qp!1&g&4a4U5YV%Rdnu?`)?k(~Uzk?l z87^Y&>|g!$+x&Fw5sh$(pA7{a71%h}z=zuaRl8JLLKLLZ_VNElK0DcfUu`!X3z z9ikpn)xif@AgYA9&U)lh%+oI+*HZCRXR0Tqreg5#-eHP6lgJ}y;5mg*(bN(uQe+mb z5(mNhoRi!E$(9$j7f%I!SQcA&)X6D&j{ z=&G2dSc^X)@GDTu|adLCv)=i;lR^PO?iPm?P#8NU{si7P|`JXi}bn;Mc9 zOlvnMJ_^e*)xT8;19_kW_$+Ox*Pu)Np(V8K9XXK;7sLxa=(uL64y{^wgJXAfufIHCzllOOs2jDp{_{tN(MHo&dVDk0{ z8AExXjSVsmh>bUip_u%i0|vaE{|$CQGUysX!ZYxLjtVRA*=@lX%7s!~A=ecO!8O?w zrXol*{@fb22ImKz4mWq0d%=$37J*@~2db2Bxg&U@J%s~cYn8JCtK{ag0}wwA^W}JF zvkm!7mSPCzJakzGfqUctdGR&(5}Lh3p*qqBcK1JS4Rm0d^EW^qI4kr3EutJ0j}VY9 zBB28P1*D*4{+Do*9F0li0%&0U5**+l6!1?$wHOEP!heXXVuhPv1V!O_HwQ1iAK?Mv zVi}l78w4#;UFZy6(t2=_1`3Z)*1`TNv{||nh2=38E(08T$cUZ0xuCvgcEX4XA26uS?wH#VT9#Hsh zQHMc?DItULR6N2Z!U&DC4*!3x2PORxRZhLYd8s5S0<~Qs;=q;ZL~f;MQEze&CXg3` zDcwLcft*S#rACN%h~lYUlmyXHl5hgLcHPNo#4U0o7zgbTQ9Af-LJ={Ij3n<7lW}Ub zLJ5BXQ@bBAS^W#_l01+WzLRBmH4(KERixUIv7mOIrLu_^f{r{-xxp8U#xA--_M^s; zTZzGBRq7n26UCD@VGP+(G?*GomXlVJ1IfKV;RlY`T<}PCA?o%gkAkoHo1B0-?iZ9C zbK|kpLTVVaOZ$U)+ZHx@12|%_pr}j(sU!s4oX&{i9+DHu%OFV{2ibo$$RM52yLt@K zUMlz`QHa#83s=A{aYGe)rqC2DphNhMrx6c+6|zCM`j^vkJE8Bi1Ei!N{sh+m6pSP2v;4ieJbLK@@U>UBf-bi5SP72MZ^MZNs&Ij!tj(6(eV} znJS<~o?*3IFZjo+(BKQ=0{DL1M5y^~;I@H}lMjsm8I%HAaE-WgAYl*Urb7?nA!1P} zc2qQ|d9mPk*|{iK-Uj%(Ge9$9_&Y)cp&Rt%_CW=92cOP27M>tZx(UkHVs0ki030g` zJbMK32E>;sM0LUplBbyb52UqEh?}dBmtd7H5{tkox(Rk%8NB5rsv&inTn#d@57Asx z>MQ=H38;R5Fa^IE?1`taslF=7bnhxYLC>osu`6LMRxXr?M z(30K?a!^=afiC_7Hg7A~#q5z$X7)XHqw+1p&r5W%D}hEz|YkeG>enuJ7_Tu!oO}psi+wsPeqc;Kz}hJ zbD_v-)ct0$37S1JelzERCo-FbqJJNP$iHbM!@bo1r6>Rd~hnf+cxa!1o*JKAb)@0 zPYQn(PxpZ8X2$0!gjJCM9=(`0|c;fDa!$ zdu{MjhT)x#!zwHXmtsBGIi+C7{1)cn`3(kfZ5%##B-m3&aVA%QZdn0*ntWjltavI; z`wxCNEN~>4TVs(W2*N4oBtOUAnhG0{1=7n0LQZ}IOKBH4GKHW9zC=Fo5uC#I!YlaK zx3Jb@h1VduxcG8-oh5>mF9xmVEB0gz{;X6GlPU1W_wkH+V10U#<-$z(DK+@%D}`3D zO-I4)sR~=vA9R`JVEwHEA!{{hM3hn=`=uUPj5y^7zWaM{)WQfSJmM}8=%#`haSc(; zBd;DIM*3!CTi@i zw@~s)fHhkTZxssL)(SU#Pe3xCk0)Liu-6pOQVfPx*g|lM95~A_ zutTZ}O~E~?i?xjs_CZCgEojP_U>L6DM93HZ38^3q1iMQR-tb4b%fItA`mzU8Tk8${9!1KT*YY}DjWctss%WVnIKv11*0kj z(ZygyZFBL}A7BryJoa$`-e&<%;XV4`>9p9p z$HJyj)@uAT&Iy0|6>3Lq`Q6+AZYcbB z8Z>;`L!tFC7lAsQn_Gi;t{8;7U))f>4;YIiRDXWsnMVr;`7_)>egNtiAz0CoP_PL= zG&%r#<+wn@deR7a{D=dCSrs2b#R_}C}jL15T61pD?5siWSKr=Tf&l_V(824LYg;63MnI@cfg*hKQP z;NkA_*WkUD3!iXKF5^tx7G8rGx(PLmHyp{Y0R>UQ9}+h4?b)T=K|IT7@Y*h-p1c#* zbSn2BG*H%a5m1}@jp{}TDo)R_3Zp=G?T*;*16LEeaX;AosHZIl`}I8c5&!lkG*1t5 z8tk}%d>nrSy5GlevZMHH>}w0EX1ihY`g4Ehun5Fk?}(552ChE#W^H~fp3@0Fotpyw zQg@uFt-?M;c21murpPBxagF&m@QAZ;s^SpM9fW74ke|N58T_j=9?5Oymy=h8Biw2s znOKDrwG`a9_nd}rM}|?Gg+S1O=EGtIA(Ng3P2|SpHL#u}h~=B{x4CzGBcV320~V|~ zY{Fa6_ei|!vxpzIz>?k zS=4n=KXD_`FYNG#_*WI7_t9RYL)LNyb%)7h1{ntql}^+iJ~)(YN_2vcZcJ6D?!*87 zAeT`uQNj2_^&r2I2dOit8J(pls!W(g9H6FAuLzP#qrM}`sE0a5BXTCOmvn=4eSkQF zEUY(mn5rtegH!jA3J{+V^`O?1K~xk;gYjqsi`j{~)Jeq1cc5hYhI&ROAP>_cQ|g5i z9)vgo+NmJ0!VdB+!5e&oxa%7E3r~15xeMp>0b;$Mhyjy+pKpi=wI7VAt{F z6=;4=LET~pPO}TOgbCm;$C2ZRa{@^w!y-Nu+Q9By!THpXWAL|q$S7hY&Up@5PV@sw zun*$pr|?Wq_!-E;+7cPCH!;Xm{y}%yJ?yBONc%~xHdRn!w}PsL3|L#wMM<74oIZoh{3~AJqtwku#O6DEbS+>N6xaLoIw~#48~{a;7!tyh1|#Y+sSu9 z#pVT6$$lb6{rCU320OtLoe%q%346bWP{YEX#gq93VsbPx$0SgCAMv#iIlM$fki}OP zKJi<)WBk837azDKJc*m1w$K~&2Ys|6u~g^_|8-he!}Iv*ha#7lkAALl!ARc4I56RI|wb=R%nF!)LUVq&;!+nbBN`2sF^+#?n9^3#nb_(^(=Q0Ok6)G z4IbjQg4s2eJ)OgQTdph*^5zhT%Vc7_#Ae$df^+M7-id?aYJh;%|Ht3Zid1)^{eq z8l+e|Z0{qGniullP#qWs%esY|1dp%7&+xZSV1uo+atT~5Xk%YzZ-7>NoPENsg^q$1 zN>nqr5vZ2mw(^S47IeI+qk|sYd9Y{GNIs;YTxdt;hgJW?J;)3 z-pKyWb_!h^R_jD`OYgN$cHVG2wN-RvxTbr`JYk;O?gH;e<_uK3u5nBMR*;bcJ|qTG zo1m;UNgN}YL5E2HkOi%FBv=isSOzvS-pxP^qja&4uE`V)1D4Hqk{8m-kRo zYB6~gHt-=b!eihL#)1|60o=a5Tw|zYf!hggcXQZ@D6RmsOAVODmAIQw1vm}G;Nz%c zzQs=3j4b*g&TDtK>Ga1 zwdDSRCf6ibm?rE5W$!T*=hjQ6T*Dl=U_JPLL72Iku zPP6l;v#Im4UxBqeca@7NyVYg?#H4X3bK}#$Xx?r4XdGIpg=V94R<&zpeScyYC#bt8p>1ep-glKdYHeVfRPXFh66qc zROM=;&tWjs;M#(vH~@CNJvRsy;ApM^D2rZb#3ivh)Q~sh&Ts_0z+Lno-)9vdLm$Ph z$u?Aqb*SlXL2bV-tY89olsULd5yQ%N29dry>cC3mBi&K+?}S)aC0qvA-pwmv<9DFO zVdPJ7R<;Xk0KM@#ltudE?!BJ3zPF#Z1C%??K$|Jha}%ecrQ70K?22$DI^&#`oEID+ zjyU@Zo56O(`m%g<8F+h^9+tw=iKVL2Zlx71{VZ2XQ%h4Vd&?%2M_K1uOgruks(7!6BC;AH{8k{m{t?%dXrZ$DOV%HqJ7MaRn)})u-3|SB{S-q@quF3K zoG~6S%8X|Wzw}}H6S_lM4bH_hO?`Aa`l&mp7Aki_9a64LP~HZJQcKDGs4mn-9&bi%F%J8_H*U+#zC0*OCHb^ai2LQUKw~4>v&WO|egL(Z z7M>-ZXSg@&;Jx5&o!bu9Sc zN_biVF=H~k)_vk0^fCfq-NUFG8~Q^qrNc&6}|VU*=z)*{Xag8PsN#S!DX|<+3!#fY3SSLP4%?&_<4NpFYcevQl0Nw zfoZ*H~+H z+dBId$3ACOce3ZJ_oh$J)pS8Gd4M`5dLaHG5lh2m9pqCLG0Od_pX!ww zo%WixuI`kM(6`bL*DusR&_B}8#P5B&O*&pXTiabbPdij=#N0)xCR{s6yH>jmf7%6q za#O>q>!^>Y)R;YZsF$(XVVChVKs1t8tbJ;H3BB(;_$K9}-Q$r`@F4E&j)V6N@ zpTph)ap*wQSh}DB6^ZPs4)RkcIPNFFV_^^>*5c1Wt3nNJ?#WQ6YRi^F6YB!ghY@@~ ze4~BOp`G*qxA$iEB=;iMUT3O9?oilk*p^#wl)o&K!Matmh%D|>cPR}k_s9}iR#bMX z{5xJ1tyiplZ3=si-Q{TD8t>lix#&IU`@}?Z{rFDE7@rUe$=;L!EaD~Ns?hQ4Cmkc} zC~vIjq^zd;sp_jft*)y%rMaqk0rka?cpcZwg_>qlja2hPy$(8yc9lQW`yQ#zL!r2; zdZ;>F{Yv!;I({*#0M$*UpK^iXoxDKil~$7uqo+Z+Hdd??FU76!JSrPE7*WVe7NZjQ z8ah56=qgp< zrFVySKQt@bc*{MHJjXpNpgeiTbK8^SsfL^Md)``DOMhlGL$TWtJ!-kt+*dA?-vvd9 zR=BOYk4z~HD}oFZ8PQx2(mNuC2tl2%0xF6VP$!>_*BeyVHY0i%0X@jAP{VqT9*El@ z3QvWNJ_W7n@oXOR8RvN(qh%g}Uj5QL7fMJ*&k(3C)^#m(rZ@&V66}%o6*k)T$-2Q> z&zf3(vHUssIGe3bYg5}T+hp{C_3)IPpWM zy;Y%;=y>Txbg>La?@G8zr2eKps%fV^uC-zcWV!CGPOa~yUyLc4bNUndzIw0j3MN9_ z+Cr^QOY1~BP8)#f8MihOuaDZ@+Pd0%nl_sAYPotFG;D7{|GOE8%`@a*WSwPSq&1`q z=^Whk(~^7QIpQkfi=y688hJu>fo`pWT8K<{8B__*AgW&u-)@Gl?|_WvKRoGw;jufT zL$W4L+E*x8o?(tLo0;KIT?}KcL7%I+uh@ITyAK-8W1+j%14>+jpvdL(wu0_fqOT>o z9tz>NF0kKNH`@w%<`!5L<^OL+j^qBjuFwZc31d;4*n>)aiBJtEyannU-BH7l|{KJK}zq8?a{dkp^)GXg4PEHk&dQE% z_6xQOw!79L*0S>3m@RBv9#K94|J_{vvb?7Ctknco^jljLP88wvI#0XqyDNJ;K%s9S zYDB0Bp%Y0>n#p-oZBc)59q2WWqZfmtks*5|*C;FFoOD-L(Hzk{(0DZiVB-d8XK0^k zKWXo16SPIzd~L4wrFNONq1LOhXg+9WX{u=|{ht9)YL|GEy z5o-TIJa~zSv0Zq|Ctwr*s_{jDLGMG~$xQUrY6>W0aQZ#pxZqP`Xi;Njg7+X`%2uddBE8pj{b~7 zp#>BMZlRXWL!-rl>gNDd4-4Vv{=qGU1G))2a5p>^S=($p6DuaR(Fnee6`oHAF&Ox*{pl5TdcdRF__L>iQhlM?0z@fDx2PZ z(q7$>;<)FuyBZ<)x$FJtdkU67Ja?HtAuPuk>rZtTsl_wJoH&FImwuIAm#vV8DeTb1 zR71tmp_;6AsW)ieLr1tbB8Dm2IPDtkNbMNyKJ7xSPjf@FU(-wDugO&(Q1?duvtKn! z)l*dqz16pskDzASR#~iArC`yG-$5>wpO>|hWk{P#SJPl?NV3F@#dqPc;-C~`$NhX8 zc>2ayl)*dlU>eD;F}B0(94iU zzDIm9MjVYE%187P=``6;xk-_z*r{x#BB5l-spHU%Sqs{vQ*qYfwO{ah23t8#+frK$ zRm?ceOifp)UaB;DXbd-pR%U?4t+uG+)!m@(eFyrr4y;`V3PiZi${agqy1XoVC7C=-GuV)5E@H zub^)$l$E1%EE{%lH7p{{e8V|w>Pvz>9O(5xUpC+K0zT|9m=_5i12py`;q`L7D#RhP zpb`5Mim{weiO#=9h$W9gah+#6;rzZt7S@ED2o0cO#H1!v7FysAWhNrYLI3a8+yxc0 z3FxW)0|n#FTns8E6`=(51NuH2*>lkNxd;uQorqm5HfD>N704p;pgDcPTOEAu zyKaTMn`;$%1k=$UD|Y;_zp|gVZ^Y}7-DPL+(b93lp~pOMmh)ei2#T1;JhRYc_}llA zIf3YXIqtGe=xs5RU#MlGmgp_ckvygMOFPI?WUxfVl z-U=0<--u1x;s*LX;)Dp~s0FC$Jwa}|1(8ZyzBYQHHoz)b333Q zcaFP+8sRtYJ6DGLSu4)mZf-WteH$*6v!E7s9-n&(D>aG@VDpiiZ^cYPZN}ky043Xx zm;oN(3-|e;sW}wc;&~6{8Q^~C@^hVYu5vbX<~d$Cx;kFi587wgd)imokJy*mCt$i~ zh5eU3(yIy4oI6}CkYB#?%<(qBZrjcDN8RNbI&8Y4M)Zw%kDe446)&10j*w(Y zw$Ov6b!E?F-Q^kb_KH0ULOEV}5fcrqR6SJvRK0PEmZ;XKPC^O#ylRfBtICJJjZsEn zedLOSkz|TDihH8B zZh@#Fs+9-PVdaPX=PtS$tCFR-qZ*GJq3`hh6@?eL5p0ckG633q&!I)tfeXQtyM$BH z7e3C+#G{9D02H7vBi>jG4>rX&5Sft8>qLxi^YY$6Ji&(0say$t^js(dSA|{ch+gPh zOcIldiG$(bik@I?Y-QxT6QDKsgG++9Q=(I@Ej-=^WY@8{^;rr3)fra%F4pf9d~Iha zZMxYK)&TwRZ|Gpoz$y-7JFzv`OsJ@yK!mgnipDA?3#zeA!L;Ayt?P~VXg#akTK7p; z8!(YCppQDjS>X8PxbN77)!N`V?bz!$?r=D&I|n%*Ivcs}x@5=_>U;ipVo<-i?>mgy zi0bH}f5ESXj^rC+114g`qI;qkaiGK_DWf+bGvj3Y&=I{(;ZgKe?pJ!1JyjDh!Dm(l zV4iO~&f;l!wPotT>UwHU^;C6GwMaExH45I%sPZabDeo&cE4wP2C?(1dip`2}#Xb2j zxlMLL)=y@UZj&~WzNe?r8u~D_H1CNAi(5kLd9$byqR0ujaq*|V!D2Q+mUaS_>Au8I zVKq9*TH$7DH6MuD+%cSsS@`IWoo~aF`;E@;SakXcQ2E`22?7a|=-cNT0aXtZGPLjB zJLna^2}Rjw(0vs{Ve}}fsU^J))_}s0bXvO^g9rSrG%u#m2sXMH?jCx{{DqZyf`58)I&|&AHv;Gx1+BwxO)ppf1 zRdZx&R{Z;yP!etp4PlA$yrP35OFl*JliifXq0@aQW~f6jxi*omj(LQGm=*DtToAVv zdvQ~+7#;R{kr8)*4?!)Pfx83^dRkYIJ>DtF=i>WR zVuNtz(wJnNxqq1Ij1T){zOReV>7DPb1AnXZKJ=Ufb*cka>xX-h+Yj~kbuPkn&$-h% z!P(bY6VnW3j!zDYqn~r3bAvPA+0`}2b;+ebz4)fPCi?6-&tC6nUnTqmbyz7Xp?%R8 z{~4W;bD^@hld3OD6b%)BLPqD3JfS;E&q-U$Zppl|QS!%frDCY!h@udL)b>!|?yOvZ z*J9;4c(gXkiOMd@JVlb?x8gdqpf@QNDdsDp6h66Io-RKlpDeEnjqdR>5`FR2q(AAw z@N$1|A^sD$5|@ddLHRKPamr3q`bx-qm6v5TDt+kFNx${D#(wM%mUa58d}~*ph4Wn*BzE(h;ORzrtgU_1)jMnGatI{+i>$z6T5Fco5I#Xr>BJ* zjeGxXLL~Y?{vqF!?V#v5N>nPE4eejExV=P5FNT&8kH{rm+Etb<)5;slm&jMj@5w7G zq7}mwpA=%HM^RTfS2;{M0(IXB%8trdJ1eKB~Uf>fjkCf+uCG0YPZkO zgV^o=J&4ibkoVQx+RCXdNo2PM_YQTSO;r`%Ot}WC~2jW!+5#~C) zx}&~0g&)kf;-k<_R*3rLduT2_$FG-=J#^>(MXh8sBF+PdacbgpE=Q$oJoH(2pkgo{ zJM1aeHwa4X-ghKay#>CHsKj?c!g5!f|{|6f;C z;|8M(_QX~89$SSQiSH7QUhkQ>e>{ZglLqL991O*_Lb4HbtxWQC3@4O*T{p5{c}ZEI{50Iy{|lwz6a&WUpmUWJ_fA zWo={~QFU}lUt)r#wY0iaEnP)7rn}PB=x>r;lI@tAt1T%PzY#A%hVT(8qV+}T)M9EN zI(l!RhFb}W!~;<|H=$?jBKmUHqna@tRx$)rKR*z=RO4TA3-GK`kX_{>+S`N(eIfSy zGR&hiVYO@tYL|bfPfs&DnHgBIPE2dYgqnK|#(?TZC?kc^)k}E4$EZMipg$kRG(cq0 z4AqZ!@Jn5pU0C72v8WB7KaJUf=!QhC(E*)qF;3|?UsvCLD0Tbe{+ci|Klb1um?l3IsIoU8- z7g;^ocj-0hed!FT6DM~l-Ik{5Ym#9SFLpr_@jKA~sQ;a(hN3h15xOTjqYLB#qTF}T zLYxNG(PQY=d4%5IrLdBV5SuhXZ)h<(2rlEK^~Pkxf5^D5A){)IIAR2Dp*glSCr774 z6k@$+$gUP))xy~$AFIPw)?(}7J5_-vU4k2-u~1pxg0HX_w|BQN1#$~L@bhs(2XnFL z+HZhU+lhO?RYG-d2VVz0RK3s*W`GiBMf7ujC;yNVswNc+-|wS(i4Kc$q2iV(8Y|u@ zjuZa}o%AyCbjbruUMEN}xl8-gj+RywHPOfochh&e#Op?yg7A zVIB1JsnDnS8a+B0(40L7h1qQ0%Nx*dS`}H`D9nTuAf`NnUac{(_p#_6c!w^-b+8;q z5RoLJ-Z2c-_+A{3=<5SCp?g4&ejT380obV%c*@uC#LwY(L)d>%t#=}JzYZ@p8UHo1 zZLnG$5TkTu8RjW$Yz)-g45)@A`$A#4<}oATb21qhlMi3#f?eB-{IC{o{rCHN;bvhB zX2~nzce4;RZp8mh!~KK5?+t3)BfL$}4IuHBdfc8`-o{=()CGp%l-=;2_NE|98-gq* z-`5cqJ`oYWn{9-Sv19m|_o7nr0)2~G>KmxCokhu_DBQk35X)etr1S{-0Ud}5JXYEW zr>&!Why1hLh}$n6KDyyd%|nE-K(SkKQE^Zahu@7+G)G2#MLu2LS#FhWkoA()kV#~A z=@;oDX^`|cPFFp|h-)Q-CDkP<;tS#p;=b@+shEUZA_@{cLye>t{Fenf%wN&_zZacW zvFP45Lj!&@y3U56gXFJ9Yjt!JO3|;#K+n{N?lcMR>_bqIC(+AUfNq<=lb-uwGj*_) z<%r8e(RD8su478!6~79R`g`;Zb%(BMGxP+^LCbJxV%4 zd>J#FE66N93z@cswc%_&^o95crX0_ZW0dHc>xrJzBIJ54*#0cdw(!02tn$VoPu%6n zbT{yH^Zax#b;r23xc_xuam{eGa-};7*DG)uQk>OYl(UnAceot}`)#WM9Ra;F4<9$aJ=Jv+gUN5L6-?anl6_wN|uLtVDgk9b)bP>0xP{bT3ZKP7ovd%3CP) z>b@GQHbLLWs4}fF-7yuI9+^6uDw#ac9^7as(no^|bxxb3DO5L9yO6={M%0m^Y^EBj zYNPU36)NW|KPlX}jkzwJM*BmbWMGCCCTS1se-R#mCG&OOILBgX=2T!oVt-#WxerlZUCdYJcj& zLB!DM;Iu$;Msvw{jZo~x&U$064VxY``UT;yH7eAGcz4iM^P_`^YV3oxZW&Z_ric>|3nw zE$_`-A@n(NI%X*|I;JK5*_kpUd1sO`>3d>iQupMXl*H7+^qrYkvsPy7a~~EYl&*4; zyhIwW4e*}~Ug_4DYmws&4XI5{c+GaSs~547_Mxc0ObA_V)13m$u<$`Q{ddLvnXz zCZ(yPp6BYQW1oaTkcJFPO%A=8|E&Bk8@XN9ZL87u_dob>YCX4_ws~F34RG35)u-$ zi8qr9l5eKW`J+u;o#xJ3TeQQrhOHyrs;dJ+WoDpXpw>Uw)Y`bqINUVO&oA&s2o=$@ z#;5v=quRFU-uiZHUyH%fISs4SonNza)#QpO&W6MUt@dwXY^pt~JR&no9*It1GI6%> zjd!y%ebwCp$Xol12j+XSHltk4$WODc}6w6zjhDL1@USaEQdpauTj zO~Z`MjYo|uO`H7&fY|oMFTk`+e@%Tx=Ac;C>x!{HD_K%>zo0|Ghl1Qfaq*Ahf##WJ z(%hnWWYMO=(t`8&^QIs{lf_zdwUW`L_d&+f+uZhkuKwO{>?Wd*n3UC5PF8Q!EYQ?c zmnquGj!X84W}_OpmJ*4_(Us&El=IZRadVfTYOh#EUnQHfYg}^c#F7t%iFq?}wq!9G z&(oi$y-hv#XJ|@La!}HZ#EitCBx~Zf#FmK%6ZY(@aq(;t8A{7(IBu%Z1m}<>y6IV{io)us$(Kfg)a(Q5t&8>&v&P3N>|gtj=htZwxcF_3Px{ z%738WWYb$?KVvQ9H6!h}#s6r)=D;>VHG)P2a{i-D=XKpxvC<8cg_HQExcyzzoV%Py zT+iM6Jt1B<`cHse$ku4Fr1T4MemERmT1a$Sc4rqT~9oheBIe8TpW6` z&k_HUtwC1sQ3_EH5hYejI@6`n6#05(p30@3rRk5GIGH+L>5_Y;PbBk1jmajMbk?#9 zeH^;_lAKTM3hT4dg~hW9X6N3_>Xwn6dOIaDd1lh&BvrB{*^-j|=Tz#0wBeZz^KP2$ z_8(j@bhDE*JvF10qi6#~VU~#{x=9);Kj}{f235?ik*i9C>bjutLINS#Ni zPQJaUH@634MdX|6TS6zW(R_!%jL-o1i4G&>DhapgXIO=nqVl^)mM)tpeMFQac1cu{ z1L6TZz5IR&oV-ADrc|3 z4Zqv`?)c|+ek1EGcPnm!V3u@(yqYXWa#Bz^G$ddS-V2WrwUc$$RF2XoeoNDrj<0a; zua6Zfl|7qzA^B2VrG2Z3w`Cx3<2J<`xSuJr?XQ*hmBKgg1`(AXWU~9fBpC}q`WgW{sed#k? zn*bkb1sBg|)I0xy65U&g ziH4{8j{23l2HGcTfy$v!%LhweNrsE#MP~)+kv5^|z(-K&V(1@Kcd9zog?fiffW5w} zzFEFI)C2E(Pk}qb{n-`eCOpf%gTQa9fqa0X&{_}--a@mo3x3jusGiRa&w!t|rf82? zNz{^3()LKap+T1EEm+|R3?JO0m+ zKNWMAH zy_sFV?Avm!%i6NHq=N1hHN^PF@Y6Uhswg%iu~c$?vL)G=tVwJU_cm&<;g*_FoRMn8 z$0M@PKmM~Ejqc)VUlBEms!ACtA$8d+hkkRM=d`=Xskgr?E>XBFe`@~kf$B9zlgjE>v>LV5PufzX&JLYP^iU!PVm0u%GB= zz7O7Uo~G`puBu2GG7dd0HQGSnJnhgQ=)l)6PH zvy0hvYzy`tvxJ$66M8cyjV1Wh;A(+bdPG@KCon?LuEZqXEXo&+6~7a|6?YVm5cL+8hP$JBXj$M8zn{HK zNBdrb8x;0z@^++tP~&|`bYHq7J)K^I{#SLnIbDg)^*uxvdNEyr>B+w3qWx6@!_a;9 z!MR3 zB}-)ysa@h%nC@z7svfHs>3c?q_s`2n0C5E!^DX(C5>jyFL`H4ZDH5Q`EW^S zV^+YQdKfOtn1~PLy$)QjsHTW0&MD8TXK8i%GKSBF z%Eo@ip+>)9pMICNta>Kd0u<-HSSjAh_Q*-a3;92?WN8aYFVQYRiO2=GFrN4i@&}+O z`N68VPT<;z!3|30dazxX3p2CCr}RTSDTZb=^0oih)PTa)Zeo1M8m>t^QN z)LjWr%saJ{RQ=R(`rA>?gvlwsv^nW_Qr9HUh#wGzW4dal%qhN%)jJ|+BKjBmR}PUa z5sGF;P6jvfBbZ*)e)lowA4e^x#^u4yv5KdbN9S4MW?eU-Q@-N*<~rnRh14LC`=lqs zca3?>CHWoxZUH`!6Dk)OEEGye)Rj-bDbieaURF`jPI*9mQ2SQbP@kw@pnI&Xq%G1| zq4cV)nWf&OI)#o;U*%n;5Wjmu)>ee2`y}f{F9b{Ao$*4i{T{S{x1pM$Rl!$*V*h!* z2KRs&PiOeRPW2{I7pc9z6ZAaB&3KrzOgpB4UQYK0pFQ7q8}!KW^jmri)0s`<4sbv5 z-eqywYzCvI?@;5tO+0_O%R`6lbZkUYz1f~@OSKv-m5RyY^Tjqx0Qr4j^RoD(NExq?els;K`A=MjsGx45GDbQ=*d?rlgC{G}Q216fMC=v~NB;1nz(-c> z+vLu3Y_{cD##_c%yW1N&m%CJMnfslqzw3#!oAWm^N{-uW*k{-eJNmnFJ$B!A_8>0{ zY)5xvXRvg*8$5ko#0ip4;HX`e@-ibiPW3`_R(DCiNk2sQL32v2Q$JKaN1uC-Do*u6 z`9oPwwNaIdUUwU)z;7x_$cBRRJ^^m#;ou#F;f)mt#zZ!RkA)TmL%8YYvz3_%zUtIf z?|1J$%)aK#7&eBh2O6D-EutO1D!wDs5NZ;tJuOfN`b~$K6wZX+^htgoZ|4Z^I&*>c zLCH%{aY#O@=N|03<7@|C!e#p%tTt~gt1ZKkWRc*w>yS7Dj$vS>OXv&!0>MPt5mln* znzFm>xu|92Tj*qDqht(uL3_g#ihY`NEj1%^MfTC`=9ybl(&HPNhHLk0a`c8MSNzJ9 zJsHEYmSmnvJCVFCjyE;d{;Oy}JQ02dui~JvqvV@(kbHuik;X{~LCrun=7p!dvpy18 z*4r{1>s%$hX5V}8@vc$|Z-RT0Q|ZXJ#oA6=-PV5gfOE80%hc!Z1`^?=?HCN9=V=Qz z4Hra~3Qb6K^Ad6LALJc%XPwS4$S_!cSbI&Kr0S+Tp;W1VYWjgDnPpgS@Eg*M-wZts zJ@oyx|Ej8!*JO8yOOkVvR;V3smp+s>mFkI6;$y-?kzS$tfg${9wjz^FU-Nl=7wK!z zVXor5=)10DYcbn>9`6Rvc6Xe+46;dTc?AD~ z_=8=71>s`xShAVEO!U6^70J!giZbk(?K5AbbxUp?>ok0X!tA6zE;=S@Ou8tW&c2-W zE-gLD7^5`IRlSu7BuhaR*dY8Q4oc4`6w39a0r|V_A}{$hzLD<6jxM(Hw&r$~bFSM= z<@q)s3wtkB%`*k(pib7mEVGMy7B{k#v0ZYcd5rV`?uI{v{sQN}3WdQYZYqD(pA+mG z?jYzS`Xo6mJ4`NAuhUl5?bMnz231*7q6o<2Nm}Vv@7L10xB9LI+A!DH#W>1Ps5_wH zl)V+zWPaiZks_@MZNW%rfe*@-N`*vuad+W>2&h_tKKv1OGt+~)!z^a!a$`U&JIH_H z{$>}@yC@UR3-v%@Q;@%`4OEG5nGP`C8GpD7NOKcW>9wVrU@mTby#KN>^S$#|X&c2)BDq)Gg95qe< zU3Ej=f*2_7CALWx%j%FKm0p!eu93bGt`3f29p06$(~d;P6-OgiOV4iVAiarc!W{OA zz45NP_N$hd;tECgKvAu1xoXRIF7h6r@39%KY6F7Azgaj1--x9GLx zZ&_!>Lh>~kQcRV9k}d)%a3e8ImPUS5mD0L(V#6%ME_`_P1<1B|q86!|l5vV_a-rh6 z;yrmq8BvZ^HYL}}`%2452+^;IDSRtyu5fxm zVnM3{s-R5K@!~6%&elG*3XWB-JZ~8;H%v>c^7SO8_$3`L>JibxqhF3FBEf+E?tR{QzP_|Gu@j=$FPUlf0(McwM~NO?wz-iPl#&f4gdPkGeMRlOEyn& znVdjYRE(7^Cx)UA+fBM(K1`Xe>8PXhb&QQog(k6it!bR`g8qW`mO4|_S2;?lQfbs? z%^FR*CZt-ebSWs=5~8{It#F&5e1wL^WKvL%Ez695fY3}Rg6?#POrY?o6 zgsY;<;Ckv@>m23m>Z}1*(+MQQjItlH(bjp^1nV|SNy~Xumwq6DLsQT=|3co?yvF%` z3wjrQw-ENxjsebgu3qla-ZS)jKQz(AA-P*I1*3I8{PdhiDm5wf`aV%p<60(FN{z`l zmH8{nmbEUUX3C(1#WBTEFQYrh-zkxmnO$mCnM-AeQoS=eme9nXH5cfz)GJ5_^mI+g zU#ha&MYa6k!%D_aC68Ua@R!Wx!KHls*d}z{QyqErowXt z8w&Rq&#*mls=P~mxpZUZG<5P!y}#Te+$o-I-YveeEX8jMHjESrTS`*Flx-k8B^^e{ zBn`w<#YZG}rN@!>Olhv_Sp5Yi23BHDTyAN2uaKkbkB9sq3z%bQiUR zhEQErOp;9^_J~Pvc`AV&cMB^2L{JM3MHYjEJjef&txre1wLNC{Lf1^BaQAk9K<@Sj zq-AmN!@PD3v|qE9wy26TigF6M08z_=n6tRQ+7ihotgsYN0)1oN)UU0f#VPUi4yVli? zG45#UjxXSA<`YxRJ(pdTUB#{uo^@0bbDygbSQxqu5C2*5J4qG7E(yV>rWI8djTEmX zs>;>>(fPH@bWQXR^qf9le_XHE%XF_b-_^a;ZPhQ;zcop^1pPjJU;QLqqPB^;ma>+j ztgJS%LEKz4NcdK;3Cy_rf+Jw-^p8*>N8m8uj%9sb?^4eWcUgB=_XD@qQ^(WVBlV1R zpLSh#4s=*-JFQbK#2c)Rc@GSxa1zAKOynDcAo9mqYCdm*n=L240Gyx;o6 z#@lhT_pWDZ2KNb@5^7lxorN#Lg>Y}Q5e_1@lO=WQ&Gq8qlOCjePoJN8FLQQ=Idx)U zOzdB{)xU~PN_du1H7mbVYMCmfS7c95KbYJ&?u$vQQ>n@++_H}Hq2y$BIh{qHY8aq9 zs@fn^iPi_VvY)B-p4;x$oVbJX1KQXtE{APB|@} zxxN5ho0&|1pb9-h-49$LSFFeCHPF4;=X}fH%W$$VC`y!6lS~E$^0wd(Y^pAzkQe_>O3oEUcPjXcIj>-jXykg-9!#b~fcvQXsBY^dVDg z)6l3kalMj{r(en*S?XCybJnNSvx&W8h8R`at;!SV3&)Z*RCdib-A=t+zgE+R3`+(^ zD*4ly*;G64O7Cmx2A#*A;5YfZ`U|+>3_-PU*=!XogNtm18;UfR3btL2h${w(f48Wv zR7LL+WaJh*ZaOAAi(PfSvGgI<$JY+(K-UXK{zlDh6r5wnK->EfnIW`_Iq7>vJyiuw zFYN>E4eeO1R67Y{eY$$6dJCLvrL_a$s$PLLNM>wm2^2PbH^CG$Hawp{yc_s4u6g(&_jcRs+wU_N*$1Klh`knt&BtyJG zqLjpo-bMzZ>M}?;n;1l%*Pb`2W1|y~mZ+7sHhn_+jnvx7Z{nInk4C!4UonY^^Hb|( z?JwmieWBFatYK-hl8mwMjVraARBzF#|D5IZNS`?UeQ>Mo6BDYk{vhN7Nq5wh*)% z*TTPpxBUmXMa&YPk;?SW^JqM8-FMsz+!FU%m&rBWc@*^f1Gb6QPL{gG^^1lVUMXl% zphNCJDI!2YFC6K_4_viCdg>EahC<*z`te<`R+kVKK2$x6OfQB4I>{GwG`A1tlHXH!@qK zWhWns`)VGg|Df)yTtIeGc2U3AUf0huywgv|9C#$XC=3Tn@^g_ZqCrySX?iA`!6PHU zUxEL~yr$N>7di;rXynQyT54ItHi5I0ySG;lchY@d9yQYY&3(ny-Sxp0=h0AY>7DE= z{%l}Mhy?%i8W_4`u^ZM#&3+F$5F+tXqPlzn8LgVA9-?`q`K`I5>7u!+4x{^@p{fiY z=0kP1c9yQc{*Hc!{*!Kr_PyGs6qD8DN2Hr@8r>q#*v?)@j;(|EuX>7VD9)jV%FWm zsler|fKVSJzz^kuAI=ayhvSmD}Qlbo!nl3zWiSDd-(53zmNS^VO4LJTOm)M z|0jQSfw1sV;r!wWwkfVQzTW(+P(-i>KJiPaCRT?YGE-1Z+(2ek9@A|$FN-^nbSLFT z+LyE%slAeS$9tkrnKzi%M5o7hO>UUBDsxu$vTRr8+OYf=UWxNU07ViU(&pp+>&|S{c&AXKf`1UcS!5gm;xE=I{{($o5iF5^9 zZ;^0{=!tj)p^?pzzlDqPFIAHIiMprefaWCpcu(}Xgw$xYJoXo4J`}u{&xHdbOI;%8cpKYh0;|2aPtlu#8Tljgw&bSezW=l5&+$Ju{yhF8%e|WWAa+5I@`+NUs-ao}UqNlvP-SiM zoLngDL);d(6rlwMzSOa>G@OIyekt(Wzml)c1(~b#3f~IMyh~Wy1Fm>iWoIQvfo+9# zlx0kDm!gt|83jG_pXW`_E1&1iWpYd9t<0N{|E{27(Trk?CC651|K#lDneQuPvjgUE zOTkJZ4UO+}ka0_kHj1|r&E?yb2JLl2uc$Gx0wmvVO{$voJ;4)ajfsvvX(r8s%tNC7 ziS8cjiIXNwOGr!j9rrb+YE+t0qDxipCEfBY`FH5MtIMy*!}6E%%JSASm2|LVG}7(P zgiD4(fsDW&tmx&S7Yp$J@M}PO&*DFFeYiYuE+WiwrWI2S^^psV5RQO1>=?MwWqz0c z9DKrG;E#=gPx>;nLg`SIsi4Um8}tQNgZdzaYH=udp|7D@o(jfp^~im!J4?g&KxVrc z=>ksMJa8K?i;Pf1))3o8>p^Az0=L>M{M<=U*D1vN#FZuMC8s2NCG#a^p>V4Qtz;F^ zE%1;2r$Gt76Rz;C*V6*;&AMi~m8L1o#0~`HY`CZ%r_6+lju1N3j5xxaf0=3aw zg!BDU_eXR^PdeveM7?(Qb(L`2-7h`&y!TPr*^eInP*w}Cgo7Iez5iI$_>+TeLNmjM zBT2%2B2GMmh>>lP|5Q97Co2o_x&S{z8D*Fxl?{}uly>D{RX*zTU)3=hqb98WuAZyr zRIOC|luG3?vI6)Hnb7w-$-c@L%F3$IsPr(<^(?0-rKLKvNEAUwk0PF8Ih}J*g z4%~%Ajq2#4wS{JI1GKiEpt$tEKyzs%4tfr7o3`B(mK+7=yPikFC-%* zLdh~@T|5B~rH`m1sI^t0=rf99pvJui0^?#(^RtDYq328k%jQ;OKD6!iK%@yp-IP`~z3RRE+!z zl1Kl~9?^;BgGBuHzkC6#DsQ0#o(0}M166Q6;5n~BJKGYD;4Jt!dcxJZ4qEBsQ0M>W zz@HnQ1A6&fa004?!%#%efGV5}y$aq7THv~B1NAf?%7hc7XShH7&5iMIc)-FufmDD# zaK)8^GdzI#@;vw%^vnQ~G%i7JULv?U@UK77-;>|UIoKZ1bc&gwpqVuB9jBC3AMZ&| zmgkDQjhjIAILkf6eGavIKRUexwFyq}K6D>u2K$st_O}hxL^21MJLu{54qw9BC>4|f zH8M`}hu9*krr1qBRldXNY_htuTA-e$%2Uooen@@zac&`f(twm&Qsp0i=f`(4_YY>;*xqh>PQT zu@6w)z63w%4quFKC#9vPcpaXJo-&>^&=VebGQCT^VQ*{rgx^ySeN~uz_BM1T&qISF zOTbI`E&PIcZiH9jKIoR|qSs;%(N+F{tgG&-J*gX|pQkU>$#oj-H}yuk zl~LVT(?-i{YwLJzRjp2QPt{3zM==rfo&xD$ba<9Y6|!-%b+R$w?d40GOM4MxB$trS z&>4#1VMvpTfQQRqbXE$#gL5bWo&2}(y+6bFDi2rD!O(d;$9eEAIN${u9*l>7Lic~d zQZiKeo8Z?i35Uiacn<5s8TbZn_g2t$i@?KL3O4abaADbq6;IQP41H4D!X z*H_Ro{zm#yGBQhOc#10EJ+2B>`b#|d+2D{=Mfyqs$kczs3#AV40~sLzznUa?4GyK& z&@x|vn!lod3EaGwp_Dj8LqSDFz&t4H9*KO*=gwWusm=x9D>2TNt|zX>?q%*`_f$^; zMt(it1$qH{p7#cRgt{V2=Oxk*I>J@?DKZrmqO+nKlA5xYil(X&nmV`(4Kyq@v^K2M zuLB!yqUM6Sj=Hk?vHCKylofi1zJsBu;W09TZy=zpn(7)9fqHp)*$!ztX?3_TmcW;qICC$XP&feuLE@4#Q@8gbv)LF_x6!gj%{S<+|08Go|7vn$hSa8yQOqRZOX>a|?3 z9KpvQOO7=Lxw}$_!D(>4ajkV<@N}k*(5tw+0ZHVcaJP6O+$aulA0!E#6HOEca0Be7 zAXFYrvZ0yzbM&KFdAvN{7h5+*8FkpWOn*l^O5;)2)+A^T=!P3SMzwj2x!5$x7^TnB z)KLzVzapNB8-VWG5nL)QT)i1^(-=^-1!-2$C9)uN0U7gqxE!`AGlw>T?RbXn#%MuM z>(A}wE^&vs`P>Tb0vz7i@LPU`%Sz$ThEq!g&3@-#RpbGsf||YwuD7xxF$kBdBvC|r zIBT+qQ<9#Nns8)n1?A)#ab0>?wpiX%;ZgiWmLTscv1sk1-^C&nO}KGx{E@u zk9V~}3j7aSZ5xv6tyOJXZF2h{`)>O+dx5>7my;rK^T1UF21`zJ@3#s!}vU6IYfPnA$i^m$p5nUGkuWgjk=M zGxXIx0MFy9=BIX!{x9QXlLa}|4UHr83T+jYP_c_>C#n~j7tHZT^Y75JT;abFcpcmT z&caIg?Cu4+`r%+>o?&MGgL~;acRkF%p43%eg#HV8O>_9|{;}Y-oyD1}C;YsxLS?ZY zi~`-X6i(hGd^M}#4P}td)?Jo`JHur~MRGcMl)Mi==r!^%d5qjjwuMu7AKZii5HB9e zFM$;rEuSpg2r^cJCY8)7CEBwFt($JOlXL~Yz=&rsA z)H`o4Z-%!v7%A;3A2rJN20r9XzCub&{q(GIH-eJysC~L^ua&gEvfQ(Luo$h=tzWHW zZL4kN?E(8&$0ujLOW>*IT}!p0?d+t$NMz3UlRYOh)a^A(Gz~Qt^+~88&Z|utLc3Vk z-*DCRK6-NetEBXljj2u3@>5HtOidad-zr9C-m5>R*{bRaVqSHnUZq!SG?Q@q4#6i- zO3_;?7x#*s3{>T!>EqrU&|OY>E_-RJIX#W(!Ty7+EC)Os-+g7M(ViH01J^6(FXsuD z!E?(y!B>OPa2I*jPX)dQPlQT`$Noplh5s&95D-X3jWMQQ6Gl8|vErR#8tEa&!NH!Y zDyx#Ko+{@l6O{Mij$Q#b?m2~C(MaAvR$DrRI3jri52i<`5HgXA;WeRs!N>41$M{R} zwYh=p0mlFTjJh{qm@M-RMiyXwBmh36E}#lFovK2`Q)()P>P>B=HsfO_bqHS{0qsW_ z?^pa}1+FE|dXCcezF1d2TJx;|>mTb?>wBxz*2wn7cGkYuF~NDjRmt<+d)ODxF7yuy zR~LneDT)NuZS^9}LyXy_ng!rOoz=u^OX_CoeTK5;Ix(Z-YbR|f(L1$H8kf2{rEGF? z!sD29b6fpawOXlFyqDF2swhuZBrjHUhVQr{*-7!YY@?*D&>rgHzs~HX7J6p8v)%pO zEj=f^S-uJM0%j`aX>}y?)nRKgCFuxN;4SM-^?vY@z7=!_wjrN^8POtqHX?&tRs(o z`M(29!Kc3R%vv^=^YJJBB#0QR{VVuhTr)O~x#;UomGhSNG;wcp)xm3`>wycsO7|^y zXZIJ^Xji_oyR(XOzjKOfgu4T%o*jLAm=^rOpjEJic%aa#r)mlPA+R4)^!IgxbY*n~ zpg3h~&uc5_j~h=$3FCGrzAy1Oby`~Gv^uF%N*qh1V_CD=kfG^HHj&jOx?=U*Bq@#D z(q^(4C?j-ov#b@dQba~l0<+kizQNub?%S@#*h5CU>v)EGHRzX4We;$b_-3fk=(&#! zN6)1D(^u#!jEl+UF7aamtwYg~r-H?zN|MFINO*p(fdz0@o}}2Ns6txFQ_8lgOPE;*h5e+hNV)o)hSN6GJM{#TxnJvh=r`-OY16f*w3GGeroyO;vF{R=C8wlZ zPT7`1rtD4DCoYa{YgX!0)MFIwrKyrnpw0aPbNY!WLDC+c#d=Z)NFozO8=%ok_KUc9 zW`IvkRe{gxn1}S1p*Y_QCX1^GFV9y0G0;Iqf*Csi-pV+CDn{Utz`)?R5VAIqx3We2 z4YaRXG96C-<>BGKtB_)ieop2nKZAj?Mm1Np7$mPgDyMRpGD*3RyoHs!kNmT&wrsnU zkoF}Gfkl&uoqROd^IIZa!ZcK+W&9tx3v3ZswAC0AG|g7HGqz@*vCZI-{>?q%`f?xH z{_HQNFa8VMLJK~kK4-GI@qq; zO4ujcKik_lo;$iYN!M4`Dfd{9$J5_i3ANWp%nm*&R9V=LcqktXeMLj-=bTjw;Pn^MbY14AIDcq?3yG>KA$u>aa{bWm^-E$y05Cg6daKwZVgqK z8+XBMsNTvU1!J3NiD;VeLgYxOS0KVYWnTDVsrjDr?(MFNu14+=o>(gEyTZhC?f5ES z5XHc0o*XFh9{}s&9Om!wz_#G|5Et$%xG9Vk@01v&wPlq+otdYwD%ykm^Mx#>T#eiC zZRK|5EaY(tmCH#bxd>#0=dye7lPZYjl6B&sXe7qLK%ooiEiK?1tPqI}UkSDeyhio> zCi8^meYJgOs0q|ou=#rWs?*gl!{)LQt_nx7W1z|I&%B|_(MRB3NJd|#Hu^0$P`g^q zPDJI3Kt5&_PRmZGk5OkmYg`i@*KA9ym!a68i>q0#TRK>kwzBp`j#JLxt{l%}?{CWH z8^_$^HU)Nu?+Il@Y56nqovNp1x^}s4ANtKkL$UshK0`l3S6?U9cQJf2t~dW3-4^FW zNkV+W{`jeJD`G^b@!r;Gl}c1}4WiuaGQT}*3JYu#McEBP#9y+|sk z8Xkt5_J zKX7BHS=fV2u?(<6N+K6#4Jd*i#XTh+$$G*pZG*h=FVZ$p{+7deZ;YZEc!Kkk#md&I z)7U51fsgf8`35?EUN%Hp2 z6V^-b_Z^@_)C+GaRX~a8u?)-h;V=1RAP8STRm2}!7J3uppa+cgFW?z&H8&b{{yUtG zU&4EMCFl*C`8(V!mZnSj>UhVvKRVkv>^Ql!zT-DCdS2GSbDb1C@R_<$xH*VGE!AJX5FElncZ7~ms?h^YT z?rpp^;X&f&#FT_>vE!nI#xmL<8Ii6Lj}eRuIsD!E%iLF-#H;&T1||i|;f}ZkRQD;! z>&pvF@L%UDv9IXbJ^{7byViTk`xB?#s=h(=877^3&L0je2&qsjeIu8@!EMY&X;-&G7d#K_hrV{Xt2;3%a2WuG)=UL#U?zrb)Uq)b7d9S~F}C z-`l?>@HY4-v<2yG^^lzQ7F9?;Dq(`qAgty?K;$?D=4m^Bmj4zX3n%Ijwkq@9w}`6i z{ntItRnA$`(E{DyPT9bf3}b-JsuLcxKEtFOHJNjET*R)5aZ*y%KXd>Z|d+ z?u~jP`9PW}{uP0%G$8lC1+C*ScN{eFeH_VO1I2VUZjpWc-}sAMA9fh?9E$$^$i==2 zHe5HVHJFWUeX~J4J4Lm<7H9JP$Tp}8>R?mUWTA3r*YUi+Zg4`VE%vKts4?$Af4OI9 zbZ|nTyI;%u*k;&m$1*;86WtUlO*ItTOT2bZx+lRca9JH9M@@S_+cK-h>ahTuY^h{b z+d9}cIcVoSw~_iuNAuf*odqVzG}%;Atd3|7>KYl28T*?Cnktzd87~{=V$>JvYUrQn z9~hMIL9U4^igv~@vGzDq{IIyx*rw4!^Gw4OZHh{zh?WxK(gHfv31cb7zZ~q_o_sfc zEXbYN{)7JS=n>TP@8v~&6R4O=vKD3=)0h!4G+jhLM-gu-V`7Wh+gM)*`KJf&2U~@I zMj9bqXSt*a7_%+pf8<>hdlZ+U9=)h&q%AhKwK;q)b$Us3z&>LLmEnrK1N1y2$vWZ$DEzW`({(yVE$n`D@6(nj@+t`Z}Q=^FhYszg+Rxw1)N8gBYwN-)ng&yRW) z{VZl|Y*yUQIBQ%ac5TeNs3)fJhLhU$s;P>d(lp6wVUx&Z5al$%U;YUH0JN%`sHJS; z|M2BN*?a|setUjCKN|djcicH{5@*Ma=^I>K4UqCYnytw7=EwP$2dLn#a2?PP`-}aO zc~VAJNg*Sbp;i$l--Ar<#|gfn;*vaH)?QW)e4sBkTrcskYCJI;cMF&qS!ZJ}SNhZg&v@f$dTZAV`Q zL420`k8`18n0H)$$4Tf-RQYmTJ~h)_S(4mh0h3e zL>qZ^ zacg5M#`KOFZJKNVfm&UH94QkJr;%y+1l7`$!SjK0{+l42RKrj97oNac{x+DAy^bI{nrD0a4J#{7YhFsb&=SJwz3?#L2*sd zlAJ>>B*&52;r^2%K%`fC(;unIMPV45orI$%cl2 z3M2$;{zXKDPU|xy#(6;Pzl7|;rAXA9CRmMGaS4>C5#g>OKCsNM;K#5x=wFoEQ_cMu zs-{i$3$`qq&3eZ=!&=Q+&$`1Zw=J~|w$E~`a;|i3b~`+eC@r&@>lIiYzAv0Cc`I$E zxS@>E^ww20bT(Enwmgz10*XNC&jrWmB5iy=aen>BKa@5zTR?*#}Uq*?d(#)i3 zwPAy0^UbvHWvyHgH7^_X8anhob_ayizB#1N?^hI`8Kx`&n6Wy>g)JE^BSoRLx z#96ZHvUSoYL{;KD2r+{}gntGy-EUD((MM3tl7)NFHEfK8l7DaxXo?PDW$X+?!FMbM zQR+T;a?deaAsj`5{l8$$MT1W@&c7F{XFS%Z!Ki`y0;NDkJr7zWgL`ZpFsHVo11Lsa zUX2^=SJdtnf&8-!9YiO%W_+M*pdl)PKiN%;o*qHH@CB%J%uS-Gs7Tb_sIF1}n%|lR8%>5Qx>uSls%hjG0)3m^d~^N>(&Y=dj{H3E?FV2r*a!~(0)9WZr44Y) z?d*T+UkHlcm*AFAH>?G89_NErDC{ilQAxDCcRxmTzi(!`}9F`iv9SW&;x2`Cv{ zjM`2U|G!8fSX#ZMe@j&Al{woW)F)wA`t zxouamI?Z=3cCB!)_nh^X^f~C)Y*l}QP-B5Z)Q&hUYfL^+v6>8hS0ih>Z7vx#4X^m9 z8|D+{H|B@tp5`;Awx%UW3Ym(05Jgnj{1soDW?Fy@mo0j;uDqs>Y99GUPRhCyZt=gU z&1VR9gu5dp`cU8(nCK3E8+c3;IXCL^J~kB$`Lf(1E-8{EgF_b}hD%pUCrfAG4EtSr7_?2jbPJJ0 z%#i#8D$798UL?I%5{y8C<^T}US0j61A_$FVK%NaFz1oa?;tuF{OTsTfv(lkk(*}F4 z9-KH6=FoI-tg7M(*F`c{ZFt#UA&IdfC|M=ISo)59)rmN@TElnIqil;$%1C`-rpa$85eLL6Q)&A2q-Bt>x)}Ym6)!2sF679U*inHq; z*J*cEZ&}|+#>>$GePplDBzYojrC6sdR5#ZBZQzYs^I`K%^8xcFe4NL7&>V`KPUbXo z4f7=PeRI%EnH}aG=CdZJafb1p?{Otiz` zr)>!of`i@`=aakeK%M8pTs?j`-;b||Idcqqs2IG;4dB^nkofT_P#ayW)>sQ@WJjgp zep^QH9`hs%R521+Xl*24CG|n^`%3r;AK@k}#J|K{VkJ=*X+05fEAcrHG~o1o%AxG%B3Jt=Qb#9Dd;9n1xswK|1oY6jkpZ< zKHc2++q>9P(QS7=b-b~MY}IXRtTn9BR@!2>l(Vk1^486^8g@5s(Vv{JTp!(9uh2J| zdB>FsoCu8)#E5$nyJhL*bk$7FU|m2@7FSuNcTqjQFBv0Mr9=@DQd|7k~NpsCXyuq(Kca8fdf>$R-um|-}%w~ zJd6B*KKv6dhs)qJVBbz*JF)H9j_g1T?@vU! zgBH2HE1+C335P=A6b+sF7g3gYz1S_T2c5$ei4@vZJCZSmOAM$GeHNu65qh3r4e~v! zh3{ZRsSci039w=lp%l3q5};GK2mkVIWYE0~e?kA|Bf1JTBTYbF%)u;}iSF)gFvsdZ zyRtwq4{E82$ZF9d1^OluWdBCe<85dpCWbqM0~`v8(BCfxr+Ym}o9fV3D7jh(=K3%2 z&yY-Tl37f*fG=0$m3gw=U0gGrMUDlI3h)|+>~W4}j**UYj^@rN*H70j_Z-iD?+1#c zS2BCKn81Y4!H84XLNZZ0OMaa!rEaTD)E_ZC#ED97PBynQZ#I81w~tyDRU=9fl^vBD z@uG~y+Qhbw_kgH`*Xm>V?hl`pEyCOIA z75dugq58pf*j>&dW2PO{Yz_T-aKn?}F53orzXHs!xgZs4kr(6$cEX++4*i#FBSEgA zJJJB8iNkOyc#-}$0bRmO(M-{IQ5kW2klxOSKZ%9d*CXNr@n$H6{trZz1_X}yEvR}o zg;RY6^OUyuEa-a#JPHqd2CgyAyAHxJ&91dyvCV)ZF~io(w$AnmcR;n{i(?JcZUfzG zJm0+ae7ETJ>>hpt{5Fdt2ZT|QS<-p(HRMaxDUCy`)>kroHB>V`GL|*9Fm*B2H8p@! zf;a9qZZZxqem4v=m<&7h@%n|jm)cluj%JPevFe91h-&jXqzZ&U5bcaQL={PnxQ(bb z(mDUj!E=HoSvoi*@Dk^nO#ex~0bdgLkvBLEzvg@##aTEFQqUIjk3j$13Cd?{a9wl3 zg=~Xa^aZMhWN00b>53f1-blRs5$=v>SsqU^g6z;6LWj^KN*0BLkD**i68@KItwnxp z1E_+oK=0fdx}VY5nRCLEk&-thJOQ8gg7anzr^5|>3#;W}dzkAroYCJL>m98eW=EQ%7k>B6QP=sxx!<)F zT^_<~^?s%Nz8vNmJDl$n=mw=kjdm>vtgRSs&A=3u6v<%YkFwTBHid0G+LL)Byx;mh5R(` zaUAx6C6YrpCDjvs0*AL25}Wmrm0+%H2FMYYFK(V=#D(5v`u z584|zwqY(MJNG)9xFW9C?)RP;stQ!drh9>$RYg&B!zu}mu(pOcX_&nx_I4bZ6~cu(@*n7-A~P+XCpyf zF9js}{-hN=Y=?XV`ZaZAC!m!(M^q>7N?IVrNFp9AIu82vG~_w;g??lJ)^j&z%0Zl| z`r_3Q`kfZg7gm90svKS^aJ73thrShj3f0iT-~wm}CqrM<8huP7RBc+^BEEu}+z)*Z z^Z$9%fBbLIds>A4$2|XFy#H-M)NKpe$PDBOyu)3EL?*;4B#v32D9Ayj(Szz|SDY7e zLC2kg8)Pr!qgO`$M4_Ooa6MGbB}J=6m%v$diF8oLTouhgqVhB0B5;Rdg+DN-$6~Bx zBi*qO+OR_)W7b55;Bm}i2HK{csJ|Qr=QR&^);A#0SKw!Jk6DhX&&;FG`2M8`sxMT& z<2{L<_wY}mTkJ07uHl~U-s%409_1kGZigEeO zKVz5P!snqL6@aSz0u#$jqJQ|h`tqSjXi53Jm%T5%0*dv1^t!yYQ6aTblYDOUWe%a+ z{D9fYoG?RA~%aI?D zh`w}9`BPaBnH1T%vqAj*2)asvq=)1VIH32T9kF4XH*t_Nlwjg698^p^jr1$-X^70)L?N{N{IOG4GtXzzR z?a*IN#P_Yj82gGU!+7KtZ$Vy2SCE|lW1DLO_pvgx^S?lSu_Y=@2JRr+h`q}6M5Xr% zeF|9u-RRDA8`P?YBkiMz)-n~DVazo~hic0&wjFhNlsbI&6`h-71%Y?&-xwqIHeisK%HoOmu-i1XcfC}Aby zyP~(kh6Oh)a+!eL}#&+)yKa03c2E2KwXXtf5e!+j(g}3+%3bne?0)R zePXalFedm8-OESN-1h@{vo7AV7>xCuSS^R4Z?eb#6B!;7q-a(}eP`AATOHhcPe=`{`)R>0sy&5`o8sqVQ^km0>ps-uY0Tw*cA1ivM>KI&05y zmo)jWqdL2ShiZ-cj|1@xXS3zpNH}py;;s|N$+&XdV$=lwLEhGEa9=`vdysP#7^6Ng zsVra_3g8(KA^WVC;9o%*P?1lG(vXf)Rgxze0`JXUWKb^w3B4Ow=4Rv=Em0g-xD?5x zh7=-Gc{%iD8=#H*PhnO>%Ag_tMcPP{l7iA~9=VpBMAjh-6dRxs`Hx(GUA|1-0aSZN zb`ur2T5ww5md=q@mD-8_adZ~YZCqOv70-;AC9^HtVNM!o8fIor8fIo_n37V{JOTUie^;>H+@7;IrIcLKwBTRy0VgtIMH3cOEpFl(EgZsLa*B2aE z4Q~l{pqV)Bs<|@Ega7lU?1dlv6TF{0(8FPoOOyhw><9cFyo3ehbxGm_{#1-=emvIO zDj+4*#5Z2N)AC{o6Uj#5mOh@&J8rC(XUR;Rf={9yqRyfs;orh7xJUb;+-xG)%kRo>i!|+Xpz`)cYJEO;EcU)Na365F zuQ|K0lUPw94#6t=0p6jB_>`OC1xUDdf>HDsyPgGg#wL8e*MK_J4StJXsA+Z~hrS}z z(6#X-UV)Av6v@KMN?>jMj|(jWU%?PP0JcURYL@#Tw7kLBD={Y>1HOp~8eq&5qdV}f zPXSM$JG>QZk)^!_Y_jwCIu>q%pZgeI50$V8Ou_r8f#!fY{uLaK!>EZ@BImp}n5ylN zeZD(<11_0dutomHpB3TSsGb(!N$ZPAb}s79!}$I=R8XZrIc^Rudtsy*ygLn$eV+@y z#9R0Qe!~gBO=2ZJolS8zt;+4h^>Wwo*6>b3HTa2NU$9&d7feL|zq@D;^v*fNpF~BX zA#t2|i_Y|J;x=)ec!BB6YvkVa07<0_*^ulHI!6-_`+9>4ahh06{6kzIG6*d(l&DW+ z5uL#l`v!7+Unr;>;%T~zp3!aLXkkNPWnm%i*9d_DJlfAV9qr>c;+Mjc^*gxd&3Gl@ zq5jNW$L)i2v4C5I1oSnWA)MQo+nff!av?rnlhF_2!`*%y>rz|vt_yGn8Jw8?*t0C? zKAZq8cpp}(0{rhT)cmudYo7?0MpBFbmB<2a$7uA8PJkP+>Hllue=FlRbf=V{aGZ&q zK(+e;o&yioxzkW)uY;PtIy$^E>{mOnFIL6(N8t0(HBO~r;ur_8^HA8xE8;61p z^C6TJUK>_HG5&X?G5)`h#s|j_6J3hmPlr2bj-Lnf*o3-v4Oh<-@E-H-;N4rvZz^yJ z5`uOhag(AK!Zo7$L`z}?;UFmF(61%Cl8sR9o8Vd6OSUI}5>3fdxOaBYJm#av{Q$|x zTfv|I7a8?2Q8{GQPlA%Hny5S`LT`i}5HfERN`*g_Hv_xQCs#v-8l%Iq>rF;901?%ZFmaK z2))pW$%mePP$UVisk_(#pJT6_g_Ul2qyqFcsgbP63vg}bfB`-oz3E}$jd*H0!);a- zU*CcvYZ3?^Yw=|L1wCA)aCs==%HSFMh7$@mEXDdL3~va{0B%AHIVbb8gf@8Y#cGy`kYgx$)HD)SBqU;p`R%&0LNfZ*}p ziue}0eQWpwOM{Pi9(znjJVSj@gC~Il(FUXp27Z$l(HNL`U*Jl+h?8L>5XuTM2k#H3 zL<*jt!?C@w2eCw~Br1zjxc67E*7ia-_&L@nFZjb5=ukxpicEFOegr#Jcm z?U64x1D&=yAixYkozxo7YR}j_oJBfeowMN-@)7ImP&gE~VU2AMD%}*UyDibD+YR4E z6}T_DLBVoAvI2E(3slMNFe!K$8wuy#=>PmI2|Yfw;?_V~^>uW+yP$7VL$F7n z5;nmc;+-%ACC43TXy%9(h^ipTw;!IGUf9u&V{Sbf>t0D>60wn3gH@A{xpp#qI^RVf zL_)$1j*bCI2EikfUxr_eFU0!Sk>}=)!Yt?<90un= zTE3rX4VU0Z^uCWn!LbPEaRTp8A?n4$Sf_?zZOTV)eIjk?ap-LYou6K0R!@UwY%V*KEOREb=O)Qs)}2jn}x>W$M#4(6GB@OUaj^3fF- zg#BKvmOQ zbd@Ne27*+tAvfUERtuVrkcdxyCu>mCFafVC_Ct#x1R?!8r4)~VTedUS$ReUQaaB|f zd?~;1U*RR;9ZUu9g9DN-N)jCsZ56G9y7rc!tw4|TRRJ%Z+nMtvQ8qCbz1h8}C2ryr zHUfPnQ|tqtgu$2)&BBUR8fvpNc&T<{8eSiLk=h_}5%|QGiB`wybs8L;Tksy2kG=)z zYZmIXrx8sw9ryAso|#S{asy}zlEhBbj?eM$nTXd6y#6C8zKSc5PhA%-tEJ%2Ttf;* zTU0o$I2*76R{`aP0guL=xC4En5Knj%w7JcR&S0uv!gJ*Ztx5;lOHHUBs^TP29^W~G zU2-U%tcD=R1*0~c1h1l-6NU$M6WC_D$V2!omWNM<{|M(oiE|sX)qkNt5JIU|I`|CA z-JXHsz&m6$9RlZVLEt%@-JxJb?00VLbypz0yN;7dQKVMv8Z?~Ek(46k*B1OC^a|&T zDiI6F$6)jw6rYm_!Bbo+O9k6>CpsjD zgOg4X{{TnnE}WpZ#Fk^%LodIX?X6RtJY}6H-gkDw; zo?P%&IE@ICQ^oHjkEF;IkzZG=RrXT7Kt|;@^)2;z^>JiW22?9lSCsn{^X0>23#F@& zO*j-!*DHcY@I(nghM+4>#dUax(c!6reMpL=$Bp>SD{#E%6o}E`xrk3^B31;}&huOZ{7;EpoC$D?9p)v0gX-c} z6*Lxf5%dlp5GLtV?O^U z?=DDm^>_iS-*dTDxt~#~O+ae#-(X`sL)Y;Z?$t}I1d`}Vs4HGWfuDql{%B}Q++cl3r$&v4Rzjs5)xJo`!TYtBRW z-T*CFV_a46sY(GG@&V{KTR@2H4{cIgyqe+~4&G>KbOXj={reR?8JioQk{HaX!>x}j z+wB6sumv%JTtzJtkCQY9lX{m-A@7aklD+bJ^4rMikxJv@b5t8LB-#!S*h*+{8YI@l zMA0qb`XK?*eHZyAu}hKp-kR3XE^orym_9?dU|h^uc9(CXe@EbJ(1d>8s_2WDC{cq0 z#~v?>FBW_h%!j&ZipYv2{u{)<#A6~4Sr%7OE4L(+#AT6IGz09jk%B`0{Qq+W&!f(5 z0(W0+aAeje!svjEkKKV1qh@3VR9OKiXLC;NEp7J^EOU9h6`=uFQ~?Z+&GtydGaH{2Vo83B{>UeO6z1Xc`al#ms0;w zkJ8vcJ=w3_u5F@ysG&5JnpS>NER(yX6(yCZi0F{O#M_zZ90NHqG$HWPSBhOt%e@QS ze3!%VhvS+3sNHHG2xsXH=M2{b_jb=$Z!_jAyUJfLSQy$C86T^bxXP)?yT>;P$B7;i zU&%dG8S!ecuuDmLNVZA7N@DQU1<-{(Bz_K#wE*;kZSbB9!P#=W;0Zs-OXX#8^&C|~ z7Eg^eg?45-p7erXnc&R83xAq_sBaqEjPZFFdp@}`om-IW{Mhoh`DL-8cv+FDsIc%Q zE>Y2fqQ=FgkY&@$y5Dx&?sg1vmGbnW+xaL6a365y3xuRtaz!>o*+sKRe>bThmCe{_ zI+L@fMEO$s(sxU@D>JH$zD(WH$hXa1n$2boNk5pf$GA?{ORZ6m($C~jVT8Lb-Y#+| zxE`wKK}>VHhj%ozpSxVoom%HE$002?{GBz`QJMoUgYfc|_;Pta5JipZiCiN8q1pp}Q@ z8x(d$MP+BWY@TAyF${S*ZpVMe|YbOlq60!!O+*}G_FtTlpIWM zo-!yUH)TX}<)jgYa=IPrJVixWdvQ8Z#J|Z|5o;2T`|}vPhvzD9Uu#J!eo%1!CzWsh z(FxbHAG`9d<|qGJQJ^h)R=mz~(e|6u;!e;V;fnekr4x^M1BDL>nud~stiq7(H(uI;v;_6gOaw0KCRA1=ecjGPRJdd}F380@9 zhwFr9LC50uN0Hz1g}F~3_pbG9b{}_LgnMPaJ=L}oxufTcx)+u$X!vW~&!hR7`OZ8A z^15_C>7SVeiwot&Tg(niE!#=^B45Y z^~wIgTHR9Ce4w~Q@%kb`QQN|61>Xw36;3X$ZmDGJ=os#5=Xv90X${-icg}AL9tf!; z<)Y=my5qbMkH2>LI{$0=Z$rKp{8*Jg^Vh1vUBy2wbL|^lditx+7it#o&2tM$aFjmF&MKP0 zv-VWGQ(xb>D5-w(oaCm-=aQnvbYqU8roN=^ibk&fLpe%*L8_LVqSla$i4LN-g1Y>T z+^Y$1tY6dtHS0(8<0l8UVdB|^l`{*x9IS^nX9ed~$5=-VhsQqJzSTC{TE+6K_)*cv z!mPqa1*Z!(6kIGwDLh^{xM*qWWig(4)nza5@kpU^_^M+&r2E-?FY&oih-)# z>U_;F?G#-|w^d)?AT|1oPm-D>w@-eXbkCS(h-&w#n<;94LDsEXq8C08)?gG zBwarj3x_0x8GIYb;4P~xzDm~Z0=Hgsi;ZO+rnjq6AJs|+Fr;h+FmrP_>j4z^}FqkW38*QXP5T_En=tm`UdDw z{a9yio)FYnnMFB5^OtU#!JVW`yO6mqCs1-xnK|X2ly6dDc7>r8ZkFekPcOH;Oirmv zxeC*x^pYte!xQy3dAfMG@HwY*lo!0sY;{NNsn(ap(xT4=?|wb~>CNwue7H%p(!2eq?P{=_Kc`8wnWXNCC8F4>k zH(i&mm2H#XRD_gq)m!y0=<-HuecHvkV%=E1#4z44%TS;nr8^9^%^gJpnMb^rEH8Qr z(v>d$S9rhw0DaIEu>CNXF535NO#aayx!?c!%6!@S<=B_XUu%3@{Jm^m?VtM!N*9Z) z9UX*6!Bz{li#Foe`6Y-jHA%WpepC5VO>0@b#W*;*QOeeowkb1{TO_?Ptk4hC<19<&j&VrMPFO{4rmB-(>a_^8u-;dC1l)c9n;2 z)Ztj_=;+`(E+PB}}>@W|`SjY%k{GtB83GlJ&|Wi~N?OCOns?z0;Uf z-yEdP4-D=N&5FE={VydiH%)ymcCep-qCg~6P3HI;FHjr$o*InXC5z4K#LYbtMURa))a9k zFj8ws-bwmN?@Rqs4|2B{X$#q9Su43t@j)?7X;x}gU6BmgUCpYmYi4SnYG-KAXcnly zDg}y0vZa#eR0i2jWDs=XQt`QApML=3ayuP8Y&n)@#rq2>Fyq?h_s#qD-uPa(`-|1S1gfrl5nYCBBgLLpM*=lOCkt_G-LiJsi&-c)eq;uda2-zkLEF)>#LGjDy{_khPE1YdLROgv)N(XPsgjX#XIz?iq%iW(J&Nw*&8k`tbb-6;I}V65J&FN*61_s+*c@-EFpycagc)+87%DVU5- z=S>kGbGF0ClDJE5r2Z0DlAM$Hkpy2&I$Qcm+FZs#HbXCkLoq~oM#)pH1%dOL`ghGl zO^&7mGRzMtD#(vXYe;O=9P*}Uk$~ok60aj`gI#=G=(q0K&Ia~Bty|0oiYx^iel0+5 z=e_(=KRLh37hEe`Qas2q)%MEK!<|8EeN}=RBJQ}3ClcNz28%t?c8YDP3z{{$Ttg+} z5nKa}UPA-JEd67hNaxcWP^YK{Dn=l!JDF-u>=fz*7kHJpvlCZio=B_k+u(X=L(0MJ z+{t&8jWU&(@^n>if6q;KeYex~#Ptw#fcvght{SMnyFsOO%Te2L-QLdbu+6nmw%gX1 z)?|ED#-8fPa+Y(oa*y^b^X{ZKW5=tHB<$IN+M)fCjd3scFX2hDhD0lyC4T`&Vq1+v zXH1%qx+KGy^;dRoPNke!_Lgia`!Cb;tZSJgGv1`VP1%%W*YDD3l)a=q$;pCOV7L{B zk^-w(Ieo%C-Z|IKv2C?fF=rL`D`E>JMR!3YC}$mFKjPfsR(RXctC=Tky8lB!7CsxD zoN#js`K^T+NR8?sY6Ry(M0B2*i)w{Iy;4g2o|;Ehrv%{QO@Zf-lGr4pq(7t$WGj&S zrGn<@r2L9}Jd#St`n`rG#?i+1#tOzFLkGhK{d`?aQ%YT5*;?LA+E2Wnd?RuTO#C|BhKas#Wo_S$CLdkdvx{_6VK$$?4D5~ZDg|4&{ES@ks_&0 zeBm$Pbcu}&&kP)6xpYrA(O6 zu56@irfj$Dmh7p_F4M>b@;kEeGKp-e^pnISser^0DIpNP;I#$YZdqh?<#ZA zyV>2M>#oHajNkb5onTkfgchPjV&`sP@&Yi4&bMKb;AGg6l% zebU`hU69$Sk)jm-&x9jdIov5Q0{po_?sRZxIJP`X#Jtcv-Tc|S*Yef6);`5q&3(j^ z@b+d-vJ(I6Kz=AUx-nkJDdde7bP+xfaz#}{i$p5o32_*?M;DNYJzr7-C*SW#C(%nmG`oS_5wCl@``7nuHSp^Rid(KJCHUR6%Hc$H|0 zaK&IFertIBGwY72BP^lc4O4C4%9LpyzUok@E@%_@6=yONOT#3qsk4|5Qg zlh_*V6&@74hFroa>>Q>ax?M*-_dq1GI~zE2pkwXeD($8``#t}7Zg>uPRwKW7BN_?q zk(;;LJJqZ5{t24KM^}z(EyzL3o$s7Ik<*dqzUo=(Z3gP{F=i;6=5v6W_bylz9v|Du zaq(Y?OkgZaWj|4K88n1GH_4cKDg91nSrcu_Me@%|6J=VG#blPtOwG8F=1EzRG*NF> zw^kgH1c;%6y4;!Z(~(y}rN1+C!86R&%+c3ox4bu3Hz(sY+1w0!ahiRQQ|@=-eA zJkcI{qwS!;Hx^eGR~5GqUldoAbVrIr3&{s@1@RPW1G$x$A<7n>g)`?WoRp1Y^CLS$ z#{=7ZJ((un4(|TWv-Uo=2G(_!W|m5pKP+P{uaSx$vW9H!9UK?o8B6PZ&jVY+onlWD zb$PD@b%_g9bLknmO)1gXwS)9y4O-)H;}~NZ<9S1-p|8G!P68j}bLAKL6X|?$O)?_f z&+p7_oM;m36xkk92aotW`h@H=`l0um$Ko#Ie&E`MWFR{@E2q(EnvFzxC$guvd+X5- zx(hO$3K%c5hmkXL>6o{N_pGO{r@5z_XRk-Y2_N^t$Y$5;oVJGqWmx~AY{9Gt*+aSEM%;&w;VI4m=nb#&6O>GSdZ9B zJ8n1|xOaF8(LtnHaiDbw9{hMsPAcyK-vh;88_`+#y#FQcl6R?>;$@P1lFO2zlDlH9 zcm;gOGZ5b~A5-^^Q2mv|j`z2C6qJ7NF@bL_IV{sxS(>@33yLeU zU6S6EhAvdD@l5sX^StmF zz019s^gr0)OvvskX5XOqt7SJbD&{D?ke*F%rwi$Z%qb>`9mwuy6~2u=t$&BVTHsgU zaZnV#81cq-aYpgWh)$8O#4DsJ(3{KDm$WAgFOrX@O$? zB+Z(WF(~cdutS@z#;RjmCiE;DQHVqq+K z)=Ya($2jK!7soT+t617m-99eZ}9!$&yQwAIQTg z7B?4PqXtmD;O*}S1?N!7V(2%`;(p=~^^0Pu65^F&8vSC0xO=dze;_-BKJH0#A9oIMbhY=jownArez)wg9JGWjr>)0qR{L`2 zX!lI-1xD!~65Ja89&MYr!p#<32D2$wx=DUTIa~cxQ>@*stERuK=Nf7m`Ww`SR{Hw7 zADYtY@=BvzF4c$?BrDA47jeHQ9>tzUzJ!9fhfa1q(+w$b6Fi4OO1keFiJW7ji*Siu zHC;eL=LOhcaky2?oLIn<3i}dGkyExx`cOVh)j~VUurgVe_Bh>@aVN7;)?ZoI zvc6><%j%o;E3+V@eR}KE+et6=i!}L)&eBxM14sJi#M$V>&?Wy4=BP*M`eqMUhgx#X zO^e@S*CC7N6n8WKZPA0{an>Pst#SY9?ZK?`1p@uTccS_6W1Jei(NHOo!Vkh5qPIjI zxs~dJ9Ol)iPlky%Qt!#x(EK zA(yid^WAoW9`J0<<+kB`inof*j*Jft4D|N3U^;p?xns`ljyd3D9s<)~p{2BiuvD`= zvFx(mwbgM1oD5DDec2QKL~vl_pI8fyl!)vL5F2+HX(N^N z(>TJo%FsoBPg|h=tUM#1Bb^}bLrO$<_-nYm5|v}h2qMD#F*b)e?*+laea4mHy5U^r z><>SVz?tdn>1FVpvxJ;xqr=dlfusMi+r*le~AJAj?Y zu4jwbk=P3d`ak%q1SSR^21W+whLR%B@nPalNS*=VHO_xpF?0cw9d0BsDv`m|mJlIe}`%O7imL*OhY6u2!|B8=}bPBfi zO{HZXxvRCK*v7XFwdPr_SP1K3>onUO`yGeM)zf{4(E&Ql$mNSJ}dH`C zv_#6u0z8d7sLy0FIR<)*gs_2dfM75vK`%I^5+h>kurqFe!}$vH)tlux>gwRkaa6Fk zx2?CztS2pVEITcv^_5j?KZ0q@7|&7q8T%Gq+DehpvHOX(yqMrE`fJHxJIzoLn(A5; zx_ZyCKk|)ZaRm$|3@+WD+Ewax%H{IEqyxll$@-$-1lc@CVt;I0q-Cg0V43eVQ{{Wz=K1D*hI^UC4r9l#tywYqUl!sb2jCwO-ROGPEf%hY;FSeCCe zXmbs(lJuz`(qifMjLVr#vd(1bO)X4AOm$6Nv+ig7lQt@4m{F#?qFN~LEon#g7Y^Zd zN#sVK1c&>6r$@P)f(%>RMq31yCFZu~M&^~~8kXwT>9)7_7EY(@pl33@iH-S3hF(Q7 z;~kOl7UItrei7M;Z{!E+2N*efrPYyoK3?`#8kdxoj6h0gwgc+3{cxe=2#tapyx+L%68B@ah&Zeb{^lRXZlQ}k zJ=`wmNyi%dMVrR9+L~*PS(2>_tbJ@Z?PHt`-Hp7Rm>Rw^fd-)okdtFEsJ<$m%I-;SQCom$p$2#9T`?=EGB9GErj;_v>XJhOv-(k2x zR{KWd$yE8w$UwV?-LfBB6_efVV3kh8y*cuDjsP&FLP zy?To>$eQBE(nE@M>czSy#+u11Q*NccN?Vv-3Uu!cnW4;&nN>5pWO&k^rOZ!~83fuF z%5O4-qzqX}SeloSkVfAGkNG_GGEWQFY)6j$hxN3jz&zgE#eBv*-?H8M!X|K3b}n*h zJ&(M%8N%NycqyD7>zpXVJ;xIWstQ|(dK1&hWz} zMaG4;1y1`OGXc0a?-F<&C>d-LY=G-`xDCuuBux*PkYrlM{}okES9nOe!bP&t=kj#~o%^=G zJ@~Yu(8TZp>{V5`qxmz0Q2^dvh7hw*A9!jbR6B42$b&vVrkb^LAL1aj?2R27Y_ zudOF+8|~X1ADlJahdsa1QnrqNDemRt=-c>3uzAn%odQynPE;XVP)(pz8!kC1IWHM5 zvEYg0inmh>sH4<9>IyX%PNHMb^&TfC!-aB>$RZDrN~$K6Ou5KBthZ~(ab!oFQsy8- zTrCO-4uCQg1MA^c%ouHrs%Myg9ea^}>q&JV1{biEy{BzI_REcyp_Yx7x*#xhvR`ye za5eHI(Iwax{z<`?;W4qcoTmInqRP}qNv=Fw`BBwLa}kL{Jq>>uyC+>uI+~Q3)W|3? zY}E<19n=$)Q{`i%EyN=7IG)UNoEC9svUVJ?z!%^m{-(%0%zV=1@Z6Zg2iBnU+J+3voBz8moW%dROx(vd@NxZ30{);lGA`ywn0Wv2s|jz4mXY_xr(}B7U~OH)m87#N;xsCqPQRbA zDYGlq*&kU2SrxKQW|-6NrSOw%x*zK2inj=F(h%hYIo#*5Vd0ViF5Ae_(y;_dL%AIwdIkqi-opc_plh7l5^Ae*TEa6is9X#ys(wJWE`ucry3cwpy=XB7N0dY@TEp zU|ni^Zg1xFxXyW2V;6Yk&k0?L?2aGco)cUpW{KTWsp1RrxL<2>b<_1%4PT7+lS(I- zPCk*e-`LP_NOw!~uS%utET1TyD(+4ugp2tsXAn3$uR_j4!aYcWDt#n>?`&U-xS{+q;+xqHl%y<{2t$Z-z;BA-zRnrI}TOP zLiPb$!MDTbfwQX|a&<=fSNf|5HU=k!cSYmzN!)$>#>kNVjWmhJNh>J2sQ2g=86PLF zO#PC!Je|lW$he-Fk~KK%A?nzatd|*I(srlFlD_D6s&6R@rBSLiv0kv3yCXg&QYTo} zHbIJ0ukD{5T2}}6GtWwTIk-!Ag8zp1MQg`jBr>^8 zdGq-<1VLdVq7z9VFYI6HGS!o!;UDTsP6E%e0ksWJ<}$d$c93c0eK?f%Kx2Oq>0^&5 zn)-oL$^tyGSID{e`3k6R=MXnUmxR4RHVkvBC5FfLM~XtqU|s)A_84tN*3Nck6-Us< zSUXyaEn6(REX9^d*3P!Y_9Dl4OzaX~WNrFN2KR>B#Q2=!ygI@=giNfKa^+7I%~d(^{4uj zY=n-2x-!Uf-`&UE!adl%4{Y(Xo`GK0yO7p0vzQ-DBX%?H)eUw&+mz*ik5Cy5v?+9H zbnTvcFM7{;@8TrFqwCPSX(=;-dBb#LyZAo(&jjy=<*~VmOWalbKZU)BMHF8emN!+; z(@iw$QhrannEpJYI5V2%Gkwb5nj^?%a%$#8OdYezWo%BpoAf~ckA|bFEUzx9PBs)W z+#c~K;nsm%_K+m+9H`6Y<5p$K9z)nY>{7x_to)mkW_{@FE z-zn^gQ{~^1b@J1yC)yi^j>+{>FQ(Dyyv)MPms!_Le`UYVK9wCeS+hE1D$<9gY%tE% z{iU9**d{H;E>8$vaAw6)!vFYRg5TQ4ebU*%QQO|twj9d2OE`H?vBs_c*erIfv$yMq zdy98E)6Z8YkQVZWH%CqI!lZKh^Um;t0=-B;+#ydCl@bIMNYe>HmKE!p(73XO+p{Y^^D zn5-|Ssi|x%Yb|a=v=vn2eu>Qq4-ZUZ|Mfm}XSjAd+S?o1)>+f6pDi9sf9ree7+Zh) zOvf7MeOE6}En3GG`Ys11ge>74I5FlSBk?iE$*sm8D9Ay&&^LHI?MTkNBJ>IW5N#7R zB+SGg(CBx9->fFt22W}k%8y>&LCH|*TPZO0(x1}j(z8f8m?G^eWhAvFy~XvYn}k=G zEGWa1bAH8cN4BC@*UVRm`OVwSz0CO))ed2enJb%*70(3MHWNGfP0M?0WqZD3k83hk z|9{x3ft#Uu(JqMucc$Q}$VnE94@m3Fql)b+i#n{aKyk2F*H`C3u1R}Ms=82lMp0jW zRoY5&nR-ARMX&b}_j!VeO^-H4IxQ1S1hfGqI(BWbVv3jp^k4K|I!t%Oy-?!xKapLD zYa!d4WtdTnn;t~J!=1k5DeF1t&T^l3jRiM5*;N5Fl&h`)PUd;;R-Tuh-QKtKV0N^> zIJh#B9-qqD!rL#nC<>FuB>%{3syFKP8C#?bNYiJ`&AgdqH3@Ql<}Av6pL-=YIX98r z)zmz*FfA)3*Vs@uQoTs=Qu-S>@~MK?(34FFuLzjgCv zc;MLJoZuRdq_?M-9bad&{hI>P(7^Dv$Wu_C5=cHZa$V@!mEq6iU*Z??6MPw*ehmfZ zkx?!deHP6oZ16s{B>SSOiI5MeH)5NlSb9Y^2wHy!xC$zTM4?9(3@hIy56O74Ct$tL zBA1C~2nO=%awPGh$nDUiKrLS;!|}#kwVhk-C2aYihmZV!Pq>AdF~7Eav`Xwlp}#xn z-t4{0{Nev6*d-E<9pq^F&4ulVQWPz|Djg(`C}yhesc&f}YR_utX?5Cun%?SWSXJeU zhq49IDw0jqL*f&XSif-PoHp@ONHHSA*Mh488~kH^71@@|O}Y=AL-S~oZcAULlhFbA z#3XR`&u6aV>on#p)X9&%3TQfA?jc~!4|6G@gd6Vcj%&R0qBGrf*3}8b>d{bklJs1r z8`6X`&{?dLXwMzX-zYpne5W=_KPbv*D(h8An^P8~In$Fe4O!o_Hkc}7hI~GIa`tJ{ zgsk%!z0!^*7a2%hn!20fi*%Iu7V$#xoO?IE2@`kH@4%eyZpI{ggz-EhRQ8v+u_ykAqKI)lRCH-AS$ydk|@;Zu|ir*D2@G7a`DR#8LxQ7y}Fwvb6>Kf?eYsFOaws)_FZh941@MiSRr(h4)S+81`*e2M= zJGMI&?)#qO^cS`^_{fc-U*nayBl(Mktq2!+L_Az-l0Q>4RZUg5)tuFw(Dc=ON2X96 z)ez+r#R~Z*Ss$qZw96P#S~OGe3Z02OWL4dV3jYOMMzU}zB(L@koP_HCgYUZUw(qsi z>y!CK{zBj1zTv(mKAmq7`vESA({!O%?H%cP2`W)3*A{1r^QL1P`a%aCUmPVcQ#N6O zVt0*mcl0du^3cI<8nA~ZMgNTpxDMW3fk(86>L?wmxTF568)BT1Tr2fqnm7G(2Ai2| zdTshGyLYzVlx!-;+drTKv z>@9T5-1}UAx*8x=W`m1$4MSqqcuY`p>CVht=uDU56l@AcgV#cf!$aU%{u#Z8`GV6-q9iNp%jqZE2Occ^@E8EGe3Z8@blrQj)BD5onY;WbBD z7knf_kt&Z%_ei+n=HxI@TR|OOYfgoDAmR#r4D9#q#u-H9ndK_ur0rH)1$5D8S}!1P z?SXBTeFAjv`(59_XK%_>^tBIM2q~gnzh#QRpdilpgp>7O2{& zeksQ&y+}v-Ca)+TidpC=NwWAP_!(b?%LHTiqj*!fn>ptbuaP-cGFA^7??YiW)FJd4 zncj_phM+7M4ZIJm50pZRM1AD32ibb;bdX6r-tykbUC3S(*AY&7B^~ zh-Kc-`rWkAbjj4pG$yNDX8m+=>aC=92DkQ_dbYBuTqC_pbtBApzg8zY#Rj6A@^_#V zILPOi+q4DbY@v5QI{9-wYcN4|czSw&dAHERnBQ4H*b@r>R`h|N1O^4Ggeo9E(j7S% zO^0K42{O%#k&<^VJ_kvX6S#|b^Z1S7ESxP=Vx7H793dZ3LP@$bCOs}|BENvdpjvn@ zXDFsB8Y|35n3)f5YFo)SDwpgpT8nEbS%hWBW<;9n`~xV zE&EP;6jP;Fj-}2Mu8JNFJ&kP`@Pm-vDBcjhf@*@*qWRPVsYek|-_ykmdy@ny9aD#< z%|{>oUFIzG0}8VGXN}1;r%Tf+r<6_#=`GrjI-ty#pOUr{KOs_u3wSL!o#WG@ufsh; z?!ZcaZ{IxjJ5vj*eqXu~R18fqr&&Tjp(|lG_>J8K5>W|XKlCwpNR2fHW(UH7!r)nq zcz=bMkSRPN%!Z#tZon^jAbudR2KfmrcNwoWzYbWl+e8UsGo_U@k#>`{lzZh<6kI%! zkCddUscM9(mFkPKp>nXIlzcz9zTK&T#6alQW^tD#4#sXqeuZS{z)ojv^fGT}&jjp3 zBVBb}t+5xag4(H}yBG?TzrB2BIcq{<`1R1x$ggOZ_~k@|Q=2yf-j5v7P+~Gpu!MLl zX53rFi^V;}WyKNd9Q7v^CTC)zW*}ONRtZmltEl6zMsnI+?hyF84s%kFnyXDLM25xk zST&@Ye1|9PKUSI;$$Bb~59Woo1kVQk_D}JZWb^1P-ew-1TkFbkHgL?g3+*nO%jUJE zBWHG`eU<&Ky{coiqolKqE8vcKXJU2zHv}wl%$In}J;BcxZbilOMJ`w80Sma-7)r`W z8Jc=J?G{#8OXf=S1a@T=WX{gGkai{IMG|4`jag1}&EKjYil4HDk}$bXG*K{|cbZcn z@gO!WS`P{2+E9bw<^U%!&#wfNu9HvW`@r5}t#Dk-^KJ8;^?mYv$8K=~|IGC-@caCW z0?EPY!JWaAxYh)Bp_h0(v^8vxw2#e?F9Cs62>$0P-gN$DL2D70Tuv2;%r?lwrM8ymfXRNB8nX~7H76vUXP^a1ZS&oRuRGhI`ig^tkdob zOi7sH9Ar4IjTFJHwmzf@eLIN1w$$;czx&3}v>f<^GPJ>}Kro#NI* zw#HK2;UYMQZOE3X7psOo&^F|!{_7v@)3UedndtOOF}2}3>pBkE>)Wf?N7xV9U)uSO z){a$JS#{1qPKVR%>gK6Hw_(@#&*3w7E#iw-i*HCQMWZPRPD~|~>s52r(=_|E zXLL6G2y_?UB(F+2ol-ZYcd|U`xM7_BPhB(Z@0#}NEY&fbp)N?DV3&U?nk*az_D3yV zc`n5<$A2M}UKy>Al-FY+RcL1LW}rmiwSTO?s=op{ihqJ&(2(^o7nxyTGR$Y5GuiAY zb{*&|)7bv(EcRb^5PJO!p={8H+e8LM`@>c3hRdxD_bzXkAR(LrmECsqcS=d_!jEVM zSv)QqE#EF5D(A|_%Wg{vX_iDFE+(HKp}U<>kGuJadx5huu^>J()*qF}vhc-_F?2t; z4mn51!NHY=(n1RScdA3#NR228O@@Q?VWeer5i%~WM0bMQdl)3nchOq0t+883CA=Bi zgM8vq$Qh}FRD zq89wutD=vhbz<+p!e;PHl!T8v#+k$|g!_F5kLCTzKZo?22wy08&L0E!@C-Oj+j8@e z62`)-Um>vpJ~(mA6s;DiigQZEVEe#Y|4(0O=0~QZ*ZtAeVNG z{)?e}Qp4o;$=>9}$s3Y-8><`Y>f7qNYbR z@OAKUeJQ>TzApZDfyu$cp_Adwk-5=6v2ys#59NI2cH_SnR1>u)s*?_6CqAPxQG0mA z%|J1n0&4C_kU9HNJIN2Ac!Y#$!q$TM{P!SkzvedOKHzjf3fB-+A78;9XX6#|^?IbL zUO`&%exx3bMoQ>rWZ4NhjghU_0^alC$hs^M9}{yTVd5|3RQw6Qvov}Nzd;z8OvjOW za62pnm+wcUUUVN)tVbiGw-WLw-^7y=T@s7`pBHc|aXzs(u{O~(aUf2`_aH6hW^_Gr zFe*nsAdTh&C~LVPZqVVU{55?uk+eIQanVQUxpa3rlMZ@CbTfJZSUz89g2@6?F$KN6 zzTgX=U?2L#fmuOss5Iz+MYxkI<9?*xpwEX300{CD~wkGetvXNmT@X zrhnB(K)XGxx~^mt0~KH8E#$XkW#PJfi`0Z#NWJJzE+@QT!!yF!c<*e;i|z>~{4^wx zYyz|V9k)Ly)s23Nu0R69^>|s3&d(#avl!Wdb&(7-5;-dqIL$d}NNzow7??07 z9wFJJT|5`rfIOrE)dG9F53=ay$Co4ZgpGH^sa1_^Tt7Vb8{xX=fT~^t`CgOYwV%nG zf~yyp(+p~?_1x*m!|sHPoA$^TU^q{aQMeo_3L`i@IYT*f!I>C>6v|e}FD!!;fJaDp zXp$h1t#U2C7zuYJ@JyeM^*~kA8JPoRkeQGd>Ku9(9EY>yqre(uTlBy+C2%<)#$34u zsD=4~&4DCjC#&I5ZHxKjaNjcD7T;zlK34h`_y)iyQr;)=`B<^9nr|Gs3pxJh{tJN} zNShoPUKE)UZ4xU55A5DJi~%6QF2e6}pok1X1Y1RBli|n>W64|g6i?Jt@GKhReJsTYnD1AuJz&(;0ekm4 zSo}2+<82`SM1j4P58l#U%}M525W2E~oY4?O!TI>pcR`qxSPV<1&pPfuO;7WIN6mdj4LeR(E!Q7)4riwD0 zL=J*WQ~^8H_oR7Jeb7)Yz^QbwSOpZX&%za99hfL3g^YsAU*~6omlp|I^D1r-I0sJd z0X;!igFKWM4B%&E7N{f@Nh&gsmdwtMfmXQ(6t7jN1IB}zv>VUNVlau`;t4-woq)&p z^#3y?Q*qv10~39fxdcvMeQ*y{#k-#uw8&iW$4ECqh6CLB-1vyZuRZvkv!LwF1HtGM z2r;X`kgTI;)h)0s&uf>p7n-FN(X;C*@RoU|-2)r%J%0ZvewB)^p24+XKODpxgQWjW zeXQPsThVKH(Ub;RcsfXWx3wRL+gU;4s|?=We0>M_PbqpSkckd}9s&g~s5f2^ygynM zaldPO9`{E5bfut?-A?3M|QTc=t8_HUF5u#82Zp z^WDJ)uMDnQanN6*kOwH-ZRGa*@wpuN{cv2F!nii?={ayj*CPu|q=je@u`P*oCh;VS zq<~+(n=Qk2nhCOKXFRtB;dlSedJdBRJ;b(UxL*CNy5PqZ2V=4+Vr!58N7u37=XC?q zA_0-F7+7EBK`7~nr)CPS@Jzfb)A8dfbeFDK_u&Vi!sFe8O5rt5y?^oX-1>mO{Vdq$ z&#l`aXg#w0AQBbD|Gg5+%N*>d^#uRrUOb0;z(<+^2d2h&?g{ev5Qy_~OS$)4c3hJMxI%I81#c`&6t2QauckO2w8;zNH|%vJ zNM*rVYb`B=EBry}DwwiA(F>2XF}UpAkxod<@xA;~At{&Slx$K)DTfq+Jmm)_TemRZ z>L^wco#K1pj4)MbhdZL6;O8%Z6n})D%(v!C@m@a29p^@JZMc%0LGRNebT@c1^=VlU z=~eQU9LA~E1r+D+h${=gov#fd;y3FQ;%O~J-hJjUxW221KTE*TD+X4j%}9f@$8oUp z7J;SJ5oEA}V7Y|x{G3I8a{vsyUWi+*P%AgZR}-`a;7K0DbM{M%)boKMHeO!~%I6*3 zuSenU>wp|-6NukFBP)6U6Y#8mLN(PKq@&&7#@RqUEx{_oW2+S#&(`3CNC91cBuF@~ z{_luz1k<5>Tqlqx_i($o>s&JGQy%=BwtOFWBAml}{*r&gCxbQULv9=`6c@?}g)u+s z3X)GFVW==o820~XZj~@wn1!#J2zfDIih-v>GXA><{3HH0zYEuHBHx>D$d~2w@(%th zNQt|^Rc?pO;VnGnC*r-#M8mk^*U3L*4bHRd#6bdh#T(fTnw!tgT?PStptaMu2fE-r z{a<}JIA!<2Pg@MeZdSyqQ>e)|Bg3DJyK1d50J;AcqcjJwZW;qUXggf^fG21NyaU0LB}KLGh$RF8&960ipH7UaqKTo!H@tw@tVH){o|QZZ|$`5mnI z@3^;XfvI{6K4eQlbG)KuLJs!~Ow_L6MLhve^Cs@tw}>>iP3@$G}(aD$c`;|M!GwkEiobR2`eyYPh!aXN5pu`(^p8mpC=|AkHqpT~ZCc zLSGP*{={in9u?(9u&qiPFF=g#4L+ZWlkmTI_DhpB7tXSHT?ZSsla^82sai@kWuV+5 zTs+hf3gm>q7JqjCz4VvqQT~el=I{p9vEMNn72(pL5K0Pt3Qth%+EYE%e9OktRIZfp zLdY(j6E8?lFiFb>ZCZABMfWB5U!Hg9eN>J(7m+>kpUCo2OQO!B;_nz;H~L7_*GL-q zAH!vuXP*1HtCFjSbD*QIJ)7-3923{_^SSfL!2dx1@GvOz(U{FNW&151b#jvN9It#L zUiEYJn0gQF;3w)95QpQ{bP%FztC!Uwpy9@Wdo3Vem<;!(28hl5SUQ`8u3Hm&mF7fm z>n2x;AH}ah|Kk^L1J~_|P*a>Jt`wJwE#Mb82B+#`L=sGDz~Nei?DixGz!A7p>JcBV z!BFHel@TdbIJM*h=h8&9x`#9182T*Vt(xo<7492jk>D zfs=PS?L@25@?gfr(`+C=7XVp*D8AdC<_1r5F3Crpfz#d@u`ixkc>UYq-Xek^Tg6O9 zgb0GQcpAK~i^^QNV)z~QKBoECr(g8(zENp0X&*7!UzIusADdHeqkU%3ArMjpKNEvt9&%KjO1kntdHg|@Ny3# zQ=4ua(m!duX2FkpPxxdgQ|J~Hmz$xH9v>Qme&t>$-q!_NhgO7ZD}^*!AB4GLaa2-a zHj8AUr|4gBJxSw_3Wu>b*AMzC!`>Jh0XH2V9TlAyoo!r-YovR&yQsUDtE%(6eY&l( zlv&J&&d^h?7PpOlCl$zF=zN?*C!wiv5${+g{Webj#oBn##_nOdcUh^Uz!VB(wy+|= zWiu!4n0vTe)}hDJ5FQ{CNj01>%eg$Dbw37wn(+#s4*u#_J_a@+_+bIAnRQXx_vh|mTWZ-Aojlljs7TzQL*8Ff|Ua=po-HmF+BU*`Fr`V zO20l~8@yI>-Q=0cHgHmA{o3^F!>>WVKc?LGy$|M9^I?b4u%ojjks zsS)iWH%G=qX;E!s24;wh{S`YXW6O;DGiHmcn59>?{n^K6FPN=PmdBY|#FmKp7P;G- z*K@;_%h}ytMN*(H+eXr?Eao&!#~fN!ZG@In>#M>$THYBxg`Psle<7VqAL0w79ZS2P z*3_3Z{cgGjHQuT8YW^mH6wERe<-Ru7*lo_WTC*RR8MdI^Fk|uvhlF9`Kxvijf&GW$ znzMmxJm~j}TwSmwcgmIS@}ll6j*0Ii`!%Ve_?BP94X2aIX2jlSAdg32V$xO{4F}+* z^006l^s{MjOJEq-2&DtR{fGQp@%hXTPe61s3doxjzZ#{R`Z=RL$jm3fcAaK@w#p*= z_K=;V4gHKW<0?*#J~*9PA$J}nW`bWXr26oGTP4mCX7Y(#JzAQSWX-JY$Q_p=W1O!O z^j{s?Aa$SeQ2r3U6-o>~^P?C{_5C)J8~l9oef76>U*#_wzV!W4>PuDp-23aeZ|A=U ze_VxjYxS@9DSLb=f$_>k^Bs*6ii(^x9cNW(dnT9Pb2_4Y)ZOSk@c4R}VRS}k+}X^9 zvTo11IO~?I{j!C#56ZD2hZ^t8elP3JxY@BAqQ7FI)ZP8j+1qi*#-N{X#Gj`5Nf&Dg z=n*SHA?^#O!mG+LIK~YR6@$|9boxZ>Kc7kUrF=@6lloWMWuKCM4ZD;F0*le>j0pFJ zpRkCY&mC(ctBa>Ag|6d<@a=?n@q>5~dsI~%A?HCi=Y8iL95FqjK*TlgFmKSa)-%H6 z@sxMV&ZUml_6WF^-xUO*FnX`IX+Bzubb`B32eXw?Q%{GRU>iAWI0w#;lYypz*gyo- zoQY7AdC)U25o#a4i;axKT7JwQ#(;bH7+ruoh><24L!Z;y$dm73!!js-l^)t=L2cI) z`qyXRxz}{IhnMlcj%<$H_OSF#OcP%5H{fE)P_e&9Pr=J>!bizO=2+YuX-v~sBP!lh z#><()lY=w;3w&o&1HbG1`uLOlT!ektr{AA`|M>mr_pRScU^D%Cvh^!#N}kla*fMLI z9v_@6kJMkWH~e0y8~TJX*gCr8?i+DCYGBNm43%PIGG@zEIc|F9TUl~uTbsRae8zYZ zzaf5Dj!p^J6GAx}#%IkoDf5er!!u-wei5<3GuibN-W)4zGo`L#lyH(Of}PoZW*#`` zb=7~N@<>!(gB({X*dTDp-`2k+J>Wa%3;2dXi?=C|D>N;6!(B>Wb*tty;7|{4 zRBiH}45sm%0~DgkVjkN{`+3J3=MUE}cTR7^2rZ&)q#4mBVv2W@XPJAt>xQ$UbCzSj z{g7>n)Cd&D-f*>9&K2So(=?o7HQ6t7zL8fy1l7uIP&|tV1yJL@LUnrvEQ6kY!+$U^ zB{(WH7O&)kQXP!!Kj6r+4SaMLTsLweJ2`DFVynnuxFg@>-wQ9r$IuD%v%j@S^q%sy5PIx$CV#*e%8QLch0XIze}eaOOpfd zl~!gZ>JdJQr==#g7WPXX}wY zL;Udgrtzh-H_v(_?o8}iup$z?t=yMDspw%-#FxTZehO!&joBQtqwx{W2bJ{|+7kHs zOp>F*Ey1n03NFMzpUrnG?M_-Z@Tyh?DquJ3Q@D+M0q(``6$-V?R^x&RuNnAsY{RMc zkYwgI^Hs!MQnIa?$}F6`u=9(4~x^YmuGq zMCMloJ`lYu_<9%*wYutI*%s~_{O#Y9e%@CSo7Z2{O8R#D%B0_cF0(fFkjjO|z&HJG z^{Mt%|6oi(rThU@Y=WvBi%p~y9l{;q-C|cM(N@=<(Qyo2@r{m&j`j}GG1~6K?#@e0 zb#>tve;y}k2)ztDIf(w;0AyiLt!S%@IoBAWchUx{!<7N@i10*A66)bpYwSCdnmuLN zuO7*xe(wKK>PO^{oIl$9n21mD$Gh*5KlcCF|8rw<+g}BKXG$rYn$@=`P+O^P?xVfM zqV_)>OVMi#J5RfZdFw}hj#?7EGx}h3Tuh}5+hdiC(=qGwWnP^5T;_gRI%F-At!}oa zS$k*Rka1$n!pQfYb*>|hSGEDt9MI)+@`TGpTakXOw55ZN{1UzP``}j((b}qU%DM1# zI5O1_I)cf8EWusD{-NRFPx1kEt6tWm=-l=OAG|56L?+T#sEP^-4TN068~#1iq{GD* zQbBtb$34eD&`#1^FWr^F51#9u;!1T?u&=1(UzV#*on)ic%xr7y)mx$B9i%7f zRpCfeP;0L?RBFo=!qFiqm?==fe>Qzr`oHN#{ono90{4TN!|miz%0bo8TEN}64%k6eStn=k3E6&}n`cTo7Cq+yWK88H^4EutnMy z#&^R4FG0%i`WvP%@@4jIMNT{JN?RQ1F8agXEBS6>UJa;`V?@!NDPg(Dxh$d0fqZh}V&(Im}ya^ePWbB!#YTSsp zx|s^cPK{m~;r0A*p0NLhbMzs>CM5F#J|lcmHee=s5_$J^xT{@6x8f-(+tw@wdj|LP z)_Oy|2&%HfS~PS_h0JqS7qWtun3%|#E=OtB>&Y`TN{Pbl)DqhiMPA z3r)ooWGMluDQN3c;4V=X5o!YO^*q#SK-ZY5xof&toM(on*3TW^g1RYcE1A2 zf4bU3sUx=zPlA5vk6?jdBW&Nc3k?o$laDKB)q`51UL3v21Li!OwMpb}_|PswCulAv z3`5Z$&5q8(7GVdrm-pL7!y$MG_5+GxV<)FQvu!`_-+%bM+&Z|76ecCuXH0(Xz+ojj z90Xcv)8Nu^7}e-7oc+bsUD!q|2-U%?aD8xw$AmwG>&TbnYH+UVr<7LS$}O>_CWL#3 zHU+N-0{#O2;iwNX`6i_)*afeN>Ft)(VQCkAx&5)2h$do7xRk7`EzE6XD<3KSV~hX4 z6F>&rPTLmyF-KqQ+TL+ibJ^U*J*&J05m(cqZ^lGr$OCuZj~TqN8DpDg*cp8&vcI>y zdq4EjFW@A09DOSqWI8>K-L1&ynlN z88K1pE+3LRDD~m>Na1(0*XU+uL`QNU)7efEi9SI$^fz8(W-%H4(mN!ceuN_P1o|d> zg%RMq*Mi$cPdHsHg#T7~p*~-XtBNSpn=OPlMZDP?T=uQ-U&;=h%Q|@MoB_MpjhS^Z zeVz7O?WVfa$C&nSSKcb+)s^sf&h>wv>89{}&IQ-!;ZU8#Vg~;rG(Xre&;<&t=ip}C zN^1%Z%H-7QsXbF;(`>$jzS#7M>8a^^{2haO__ey%SjMt*J>cA6!qIgRUreYfE|eD9 z(rg8>n{wQ7&Y8h|&oepVV&s#k^U=M7iJnx_<>B|DnQF;Vxl^Q zU9>7$_b~xl4MO)#Ow4((<_DwBE{p286Wqk2F8!gmc&UJsyq|EEe3;Z|azl88R8 z2v@Son89bq^!*ilHD*}vK)@IADo^6;G3X~h!IXG2Jmr?7H{jq-aEW|YIM{3xx?!^Q zol_BghQr1A8oU9@G8wPE9=xl5gLz*Hud6cp;4bSG)RTXjCE;Vx#dwN7%Mx6(N9ZS; zm|%X;%D@L9r=E^((n#%{T1y?Hbd?*2yM=n74lL{c6MD_1K0E66%uqV5NWGjoDlI>_ zH|U`rh49Z zA4jy0JRR9J>Pu9s=m+4ay@|ROxgesbH`)E#746#LoabEPob9aZ{NlLg(BKx5!5MPA zaI8npmeFz8{?jI7U$?t>1X*?pl-m1gV_Je%!5nlLT;$$RHkHwA)WEo5RDvtQZuosHf!<~$vY54` z1f5M!VvhSS-9Z1wM0YbiP3>?j+|MPzv1B!W2C-oUKLxHpC%M|32lMEybRmfGmoPQ1 z0kuIccGg;fyP%uZ855^5)?|1h^um0j7Ca2|g2x|%Z^A~nC&_$6M|!68E55_NYuGuh4`PavzSU8eJ!^SW~-C^PMywXsKb13RFR4#ob+KGJ@}W=S2T58?zd z1&(8T_)dHV{sVWOn~MI#CiIWT(u{N`909Vy-(fFiq2J)(*57J{8BRQ^DL=eZ6*#0s zV$MN1fbZ63%&LxHCclU_MK_zE_q_m-A&9JcHav+3qZ9fG-M8bIO_j2!br%z%j+hU( zMCMZw?jmb2i&fx25~0`E8mq08-g2XG=1}%vi$G8Rxb!E!AwG{UDXjrC+}Bgjr@l>% zOG^Y{V+p8W%fY-!^&5dgp+CYA%1+g%IgIM&D(fg4ie6rBXyHyFroI&Jh{;ke`$(wH zuezSQ*L$e9k9W8Cp!b;fmiLNxxp#;+(c9GP^Ds}MccHf~sA^w5pFCeZ*F8y|mH0g7 z+2rX1T2~z0Id{8TyBYS$zTz3Z?C1)2)lT+nwpO+%+h zGV+nnc;c(Wi9$dhm9SelH>z5N;M1d;I$TAzz@w)=6coL1a^}^mXqBO)tsoafhq`-k zRp37MWtOIUK#=O|V`;O~%3`-ECt_&Mw3cam(n?{YsbTsNkZ$6!&s{K7KD<#b1`mom z`g!BCnQV>2gmx~p5?Q$dd|9ChoE)FqN`e=Y1zgGn(ClUKFxvWneNi=E3P`O+sNhb1wiM zb3r8+T=q(WV9;8bq+G{!Y@yy&8*0b3{BXBwU>t^@LLtmhDWdK!JVTk-5Zpa8;ZHIb zI*G&VHH#!2$tfb>$|chIh~|Ibsr2CqU4{OOgFI*F@n?(RG(7@^O*>q@bez+TQE|M) zlq0*bOV6S=)tX@jlvNhPpMtLget!mkd${0^^;Ps`@cGlOrESDs@cXoi=uf}Hwt_!> zs^1k@3Y~k6(1viToCSW4SM}=15%R&W>^r$i+i~}}UdZV!d;WCacC~V)IE!Nv;dFcl$wIO9vlYS?{VVhgt3czlP;4S5h!>FGUE`->%Dx-k z00(JH`UBIrc2GFT>@IuDK10oNo1OW;LaYM3*!x>=;H`4SC}GUiUHTfWEvBQAb{iSO zLR`Dv`0S}xRNbnI`NbEgK?Xs=xIx(rU(1QgeC37GT0Ns?(l%=i^qXLaCqYZN64ALL z=HSPyEI2uD;{Wv&&M$TG{O5xrsRwjX;}A)&5f^PlM`MmM5;Nb0m{nGzI{8Xo;EAjZ zMa&oUO3O0_C&?8!^M1l@h8Zj2p*loAr1{lqYJcbiYavsa8eAOM;eVOl3VTbpe0_Ym zeF^9})c3XUP4+$a@6e1FgBML3C?L*o zYxzq82ZDhKwOLEo2=^3^=oP&gp^Z)S*6_w)OE1RT%sUjn>f&vQbML=s`PTEI+xg3eGdoEH!jIvKO@fW9wxrVtXX@1FPaW z+?SStC9_88jOp$!IHzBQ4#UZ9fvW2>*-K_ZK~@Lz?dt z%e~@G3UvdEx?J0lTSh9;V%&PZkho2f?A0A3oD*HK?w;;d?)&by?)CVpqkA4AW4il}I}Xut zrKhu}yob3T;p4b_qPv#6F8;b|P95ebz-z*!h z(?lsw+ADTJ-Bbn7)iAyY=Cjk_`d*J-gVO04T+1?`M*JI@cRlDz5}>W~z~!_ow2@QI zAo9XJILkZ+oP5yzEvKcUTJoWmYNCYXH}ZGcrNki;wnH~{hw?#rq8vq6b)Rw?AJ3E= zP<{l|Mu?=lwO4T9>jG!ZzmaW58+D-H^rCt^j(l@0GF1;8uUew|oQ#a47L_gMF*9xiu=?3$9*V;BDY#@N8&X_>#=4RZvaj zG1{1;tj^GxJVfujG#A2C)mZ2xE|t#PQtXN&*%^k4vx8@*=O&_JeQ$OzL?GV0-rn8` z-qGIa-b3DN-o@VL-iqE5-b`M_^WDSas}k6&`~q%oCU3H5wWl0>b54T8^_MFIx4@8N z7AU{l>}Bk4Z1ZgeZMUSsl7LMekGKQd9@&Hwd`0Az3%NYpY1$T5+ci8_d*IJK6LF{y z6tsn*iExoqaNe$p`fmpGLGSU-6f)l#(~SbgFF3dj)*I=Kq1Gy-=SMbDOwWyTBL-Tl zQaJfzkh#U9gVsTx4PU;TaFDxW)PlEaNo1@+s|rr4cdRtJ1n-DKGSeb72L9xap~o0Bm934Oqc4 z;imEwC8YMzyBU?uK30FkW`%IrrdY-|$5f~(l$i(YPaLnn%DU+u;Q80%#VORuI}sm) zyuG|5aB@vV6dd85?_J?tgpXM`&DMHX{r~I#PPHS5jl}!F6ZBm0M0uuT2Ko$?&(HTXgDUR~=}C&fVS6L)>Y}Kj-#|rh z2EML;BhT-MN%K~8N$lokc#wX88lo=TzJF-{`L-oudfEm)u?|GRbmWP*)EnwW}`iFtCIN07xBY;$$Q89)%yzHNkZ1Y4`_ZIYi^X&Ar^rX9IxHZ=( zSJ*ki`5Hu?9Z*`H!)bL&ngMsfMDe4r6#m1fp*$GKeWK0bF;IO7wHYK+m#ZrI)vQo$zSVQWnSC&uOpep5+$_F3_K%xM9LRDmhwj+y?1bwT zk2n~H$AjNnBH}`XHxiqA5p5z5Mb3z<9N8Yb$R#3^Bi`XVQ=x7j9nmAA9J0l(5pD5f zxd=zZG4E7wXYUVBU1S=S+O*U!!`zryyxO%Q4{_Y;)Errvd?gh zxZ}t!ULq#-#npR0qkR4z=@(-xv+P` zK}Y`Dx`Ai0Cpx30P=iw|1>LJVsK{$T(LNB__A~1hqzh4Sx^u8R@NO)M>%gF^6xd}% z*xFFPUxsG3BYHCV;p>S^4CHhP%lJWL@qKH?XQ&4t<_J)EHvE!M4j?YY0h#tDVG2P%KXtCW-|> zqIx8qu{DM>cWF$0%Q_c0bGaV5`neCg_qms$uCh>(CA)9oS6i^{XyJFpxjVb7xD(t? zFa|%lZh>ny2K<$Fu3yf!&PZnvT6O_MvtIU0*el&@Yj67vb>(bmD0f27_7Cz5ik^s* z-;RFY7W9i+z~#F!eAsW$EvUq{p_kN*Mqv}GGBRd`+`viuntXtI=mNBLn~*<$MklTy z)c@azjISmk+a8SXEWs8+A=KF2agEC(Lr|$}1ZoXs$S8Qk z9!8CKpM79Gp}Ks6ZiXLMwI=-D??4kpd)3-nMR*?CSS>_+1GqOmyE7X8q99ur(7;&z+ zRosqwKrHmDhs5FHb1_ZoZo4j}i%n5kt(Pi;pSghFF9e}6h!zSUzbFc2)^?$q5a8WV z+{{GXwTCDCcy0~X5*tqj!sB2 z6s?D2_eF75Z!A4b&&A^a$uMS0Rp8H+Pv1y{uNjNHOl??E3?1 z{_2`TjntQz!;B8swAw~tdD@)Q-44t2Cz z*Kp~*<&3Hg>gU^Pi|}#vB=X)98qox76f7}6u%>3DnxcAHSK8eAt@F?g9=5VT-|><0 z&{933SvW5}0v&n6VnPpLKevG%<9mrW(R+9eg}H>e%rdE=ZH-t8n%I2OdfO2x zPV5E7Z^$-F>@Dn&TH6=Gf99f)AF9iN(tTm2FkGr*%OQ#4-`FXSkgf?I`8z@ZD4DAY zyZM3QYq)vc<$4R_#c$Bh4dn~)FYvUV<>&I3y!eP=_Bxf6|})O}-xY zfga^vLc^}Z2mCF!pKrl8!v6OhkQo-xs=SAvjCgT`eq~;Mmn85FtZr;Bcn^8_BIE%2 z0(0QYn1g<@vaxlv3LGY;VwObdF0L6ZZXGoJ)@PD~t7)CqHkfZvPqniy7%k0IOnPS^ z7jak*jU8rZb`z8SQP{3)huz6iWU{qf6U;O+hc&}CL0+3DtY_$@{dJVKc*m8majmIVblLH{%eAF1fca_HR7m$a{M115VhZ`IfXTo6W70>WM8;q3wpA+e;Im3$I0-=5<=xzLAeMu39ztgV4i!#6J9g zKIM_L9CX4X_g&@XHT`EE{9M(By+bs=6Gp!T6>Xrj4{RphD|Ny-VbOxSC> zjm<>11U)NDY$c4KQ%~t*gt~OUahMtCjTFYY znvI)h{x*JN3h6=q-_n-g_@!T0AMq|eS|31*I>(Zc@-foX_9w~0cxf<4Rh>z$>iiOQ zA`1(T*iQ4J@JagH=oqffUHASaeU-1M4@Ivtm2S{0(kFZeYc6#&OTPR_j(VAh8YOUhcs!NYZTmL4bmN!Aj z<~tJn+i}r#M%@)o;{PQn@+um(bEn?7PTr1Nj2;*xjbfhs}6reEG!&AjZuLsj%o3D zzAATv9AX!^cVb!o04Yy4&{o0;?hsKik9Q!7HR7*=v36HF!9T~A?Ljh7SRe+-zv%zY zF?R_mwyex;ed8yipOwSjNUUQvwVLtCLQb+)y=xT!qxdBoVlLJ0(GiYheu*{0+;7&U zE4c}nzh>hnTkFHKtTvwcQWa=CTMDghzs>CGAo{1R0qv-7v8s@JaKHPPpGlH*r_ou+ zEWX1`_!J9Uosf~-HnQmF$ZjbMpI>bpzDVym_OM!7L#_tNqh7L#NlW;a#s~G5)sgQ@ z4_g5;kiC$58(-{G`8@J|y{b@|Hq&!i6~zNol?SR-c(-k`RU)*`7$se_%BWMg+ODx#ITwnwA7kmlSpsnrrC!KFv^)@xaY*JrkJg4Q>}O5tSnMkPuE+=jAmAEM3s6Z zFQ(ubjD^}oc2`(UOX!Bt1E<1C?kZhuR57cuS$r1TN7E@Eqq`hESc*J=_LugM`&J@z zW6xxWnT2a^FUgBDxT%u5(Tvj&gDQu+`qygSCQ#EQXu`Y65 zB#8`F9%#qud~pFc7(1+gk%B^yGp#CWJ?(+;)qa-kk%#Mx`4@sp6IoYlCcVeSkQVG3 zyTc6^wpxX>=7uKpc11Gy6C0o4u3Nw?AKJzSxN-^$v?A=3ke4Kxk#JNmj%_Ld8mHUl zdUYw^#5JF^k@uVRY>mVz`X*xuHvt_t%0DA@^aI8?aUw6P?U`Td!9hKUuK08Dt#i65 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≶wZ;3us z9kDWB1Uy?W7|xfJyMjNuOgco25?}HArJ%G+$l;euRh6=G8&Svm#IH%jyP&GKuqAC)1K;!{G;^i?(sXB8)7q!JZB zasjMFU1k#XRTAY9OfU8noN@i>vTQ4|hdhT2vFn*maNXaedr~`;^YnMs7V5n`opi8s zm`TKHYMuHKt0PWRl{FKX@nlK17^ZrQpc_A?;_2e-NOdmwMt7+dbUkpzY?PL4ts1W$ zOm?R$X?D_Q$W3@+c;*uwqK?wPh=TN=s@ddJr7QJ@p2QGTc>>;K`Znn%c2Vz$Zt`>{ zo4qVd5zDEx)JuK>IiFo9mg3_;O!a{2I)><~j0RQCBtBCr(90#eL{Mq+R&Kabn%rM)s#& z%3h(kydPYs&qx6e5XYz?%I|U}R)2@I5gFhA5anr;vP#^HlWcE-Wzv+69C>RqiQP&CVkR|+8i`NnIOx2i<;G+!dIGT# z9>7sbY09o@3%XMyRbQ%vVxdCH5AuU5ll}@e#B|J9C2|~nSiOwU3Z>ZNng+@tqOE!w zaY}s1_Sdu~326e6q^YQ$AUma2%qG=7Dqn6z*JIyG-=(Q+9y^T;;6(8^V^Cd!`qF^B z4Lda%i3vN&_wpra4mqA;!7y^d!TXqO$T*c5QaO4!Ge&-@T!O#AAeIptGV9c{h&Ey? zsRB8NZB2Cs*DHllv$w=o!c@$CCJ0}Mu52rDGhd4xz-WYD;u89ABA0J2Poj`2iCMu` zu>YEomB|CbCTR(MP;zmHp$_aXv=qw_Wu=nJB0co_CbO{5N7XGhQmpy&yKSTa___Lw-ZvRffxJFwL<3M~Fe@%{XG6+);_6?-F&z zQbcoVzj#`{PyawC=^oJZLFp)ck327ym#gDkmn6THHV|K_y2Na8tWui}D@~+n(9_ot zuL*1E1mcVkPrqdrh~2pr#8g!`r9JQRI8#b8MkJ1ru=q;-uG8SENeZ zZfOg#Rz55g7iTN;rSigT)MCZC&%Bkat^~MG!YMgdTr8cFDCtygiaH zUL~#Q*?uL|V(W-3Z>0zDMWOQ}==WD<6tTtejNyYvEajPjnTMQ#_9 zm3!=9MkNs93ncAKMO~q#84KUu7*nL$L5Mf2GHqPG0F<+A+&x?=@@x2 z$I!)@_uLTiE7eW5Npo?M@4%nn%2O)3wy;E;23|rzskrb{c|;#oUI_OIEfW!*NB^Zq zs($h1BE5;R>J;jGbPK0QdJtKOT}fXOK1lu4x2SCH4`nq| zgSaR!236-5dVMM6IylTb$ybyvbS9W*9&~uxP-)~;`97(lekc0UtH?g$OL;i^7qd#d zBd&z=?k~|OPosNKl(HPT#xZbfbi=CJ92t+(QM(k8qo7R=7hOaGvq|ct+@s!0@8z=0 z9;!W*{;kLX%u(g1L^58wvKS{d#D4im?uI9_GxaxfQ~o40A}&*#g7x{<0PCP{V z$Z}!{*+M4-NCJ-aU$;wOhPWmg~LN+p6N!&HWD{8KM zRGNh~x)k{p^P7FlLwst*l&|b5qK6biLme(XS7tCn=}YL@45uo9w8T=Ch`%t?yRLL1 zpHhpcqU0E<2vu5LA1B-y>}=w#)J5f@EAUgK2ve4p2|x8!F2~&`8tHei+qrApD*Ax> zIdMX8Dp{Bi&yZ`9O<61Ml&$nda=5aMe4wOJRhV8waD;n}Joku;xggZjE zQ=Ow%Nc%8ydPVv4E>5sfexEhey(#m8bj=X{;hhMUfJ5QYfUDs6_EhBo!x(s-l@Y zAy=b#@nuDZ6xZ-3gK8=%1lTd>LosxUQ6X(qOojWn{k#U-Fo1mqXuZFv$R5Mf@f2h5q#bc(bxR2zLwzEzC7c zFK-}AZ@HWgb#H$q9zFk7=xEJWx)T}bf3ospB@L8S6wZBWt(0?x8Ok#_Qx7($)|jsKH81G$aq=$^GkcIis=^Zt9{OOog1 z3~>r}!VIMR9me~8i@sW2^b3lC=P+CuL!O|%5PyNnPym+2X=GdK9+^(~$QjIac+8SX zFWH)2Nu434Qb(Cx)B)lMmB%cEZm>16kk+%6@u$9kvipE+#&l!VH!!06=DS$Lth~GC_HfvD&uaT6Sbh*Vzt&Po2eC~2@cQN)E%NM zPEGYdh#o4>kRB6nsUbLVmnH^KZbc)%RgR&?QL>9S9G0IkCkWT4j8F%rHt* zE%4+VB0doh(G@?Uj3p{jb4VZbm}dGYre4#?2DF(vAoo`WP|t~)@-^ZMwNy!!{!|9z zdn&1@kcJlm{c;o-eM7+Dam#I$Hu$btd9#v8{-Lx0nW!$|k{xiNEtfY*6TsbhARm@0 zqQcBa-*^iWBBw#ck^+v^A>|8*u?3Lx`5C>#Gx8o~Gfv81@qfx9<9alh!{?+|_;VHI z=h93}`D2hRdLL;7F~~NvBl&cnJpDiB41T=}G=gKL%HlvIO^BGd_9KQqdW|K`>WCk@Z@eu>(Lh;EH1@Vq>?O&@fX>TF{p3E%Vo(h~qo%8b3BrG=vqg~BcmY|-U6psTQE{P9 z#h~77pqxj4brkN_YtV4jkVi{eWHUaKG}1k>COVI`q!+?HAx(S-J!^ZY9Z&v0b6~9a z4wdK`X{fYboQi4IE^s9K;A`Lf?{gzf)D%)j1u+8-Q5xnd98&{9F<7d~RsB@8SNGOD z0(mDxW7HM{|L=+}sw;(jnQywCx^LR%x&-|V-B@iuxKO>?8JecrUb;rw5+E22)_hPq z(C2EaR;f>@wy18XoalRwVJD%Ic+EUza_KL0O=c0Tp}&JIyB{p>3gj{9IGP~)M?z=* z6uSFu6-qgVE7e%p1@dJ;DgrKDVGv|)ibJ5zISPfqQ0%g&q+K9Z{Vo*-_pBIba95!| zq@=~js7aN2NteXU;z!Uo4vG%3tJFq1hP$D(JWg5w^20_D11EvXm>`|U*O`XDVHJ`s ztnwZ?6MCw}$he&WwrydM=^kT#IttvCO!PMrh~Jb_m@oXJyaXfeH~f2)LW9>^5-*c- z1Uk7@m{U}PV(=%fR4ne?%b0H*LPo|gDG%StPs}{Nfizkd`C{e7*TP@IMsTx(@GjLA zR)fB#1_izx7}&-5!Q8uO3YX4#ql>v1=<~x+Ynb^0{6>D0a9e0AoDh0oqVififc^V{ z^rw6RU8YT#MeZgVke5LNJ44Z!WSN))OcHV`CbE7uRn=QXs4FAAq6|D&>(w9CJvApZ zJ2d+>FEnd49W-+^_ccE?4CtIAv|pinJE7SQ#q&G$88xpirin)~;T!c{bwl+!l}#nH z57{=DLG)B% zuH2irPI!@3d;_|pkMd}A3rS@l^kLcfx_@Dgv=-XCF>*I~k$hC%gel|`{GBJ|68K%a z@tzf^B$^KPI!Jyke;O+b;=vk^Dqv!$hiEc(rQ8#Ato5N!wnef;ZkKBnoMrKPw z)PuQoe{LYZ5cAFqP$hjx+o>w|P?}=z5#Yl%P{XJg=sw0W*~~NcIXKC?)QskcrUqsO z4sCngF`ZrC9{F^=^yl=~^jq|E{-17RHOzw|c%yzBQi^IoOJ7x=0HyFoOpvm)C$xQW z4~zmyDWv`fth-qCd(}u>_bm1xTZuizv_!9M0$l{UkTK{jbwP^wcjOgsMuu~7r50AV zbUaHfF#-Br>MB)`USJZ)gN3s}oGF$BWkm}Ooerw97s5-Vzcvz*K)238p2>6m17=Gi zUr)FzID|`rPgsO!W)xl*#4F+s(8aY_>++$187!q^<`gf#zzWbEyZByY6dLdxR!0`p z5#=6M(v?aaX7o1fVgr!1Y(*Zc5BbVxarKPYMax0kx&g1b=z{mh6|0YlW1Rd6mB}sq zGXfJFJ@Rb!KrP!^azX9aS1c+%6b|6KO%+yPCVhmvk4&(5OcbP$HS`<=l}o|D{X=}a zLEtff`#%s9+?&42e#ZaGcg5c`@X;^%i@}>xGgLMl7r7A`9UaBZ1?B!vp_()wYkLXM z==veq<_y!6WmPlPJutVMqP?pdu79Z?Y!D4=p+S0vlm-^e*1yez!7jXD-eew)#D?=A zk{iv{k*U!PX<%hdCQyV<8=DwO<10fQ!!Xc6|I&Tb*47@nOubfRQ2oQ!haNM9 z8G!58n7T=(lFe}K8seUAj!$$dbV&}p_g-RgT%}jY?H!1uUc12I>TKbsfgv;$)A(wb zsa1eNt^%I|1*-}__TCnSPJo*A1`zNDiAv52L$)arzx=P$#HiUXh)^5WWHeY!&b_&*QEbjI5Bx z$d?|EciRd-8v^}VE2V~#i1YbG%t3q#+6v;VKv+8jm9P-52c;ZFB8=O(y)bT~zDY%Xmf! zx<0i4IVsJMWW(SjwG|m|T}5aikwN$zn%f7_dAN`Lk$sV)k?oNdkwTH`k!IlUwvX(= z+H*f5MS4MV_bA$kJI;~F0Q(!yXeNIhc~P`r5fY$jtu6e4=i(GtFFBy`_QO2%7ZQn@ zN_(WA*lRaJnN}71c?vR6-hm3E&&o&dMv6sdhaZRB@HVIdH9`Jpk-{&*>H~Cu!vIAp-smNk_8qR=Ys3m_@m?u5Mx%LAwh6>Y-*!`*jnvdEG zx<~ph$SxI3PtDEY+>fz$2Ct+~%)FS%F`Z)dasR}2jcpmr#BPqU#w@j)?7eIotf|&Z zmb#Xc<^*$h(+YT+Rv;#=jeZeWzKfA8+7dpnPpVOv+PiS)ccjZwR#HQ-N*Q?y&NUfA zy0DHHpl-Shmh0cp26lGD= zzC^ZfYt*f6(GMRfDdL}E9`^Fzp^c7*9{vJUSbcGCrX#822-l4>ahcH5X>p&fif+Pd zXLK)i%m&dOpxJiE&re5ZgJ@d~9Fe1uhLHo|)bPyEm0)`CSztmSDNqnJ&Y5tp6bsY| z)CBD>Ij{yA<*vbt!9HL>jtrNM)CTqU8sA*JCzV&u6D_Ea8RF* z6xjDrJl%#<>;|;D%i)|J0|jgox)(K;d;q=jC`^iaNL9pAn0xo+E=4~^gcY>y|6L778%}8f+@jOfvO;t9S6Oq zwZDabu>Vg#IQXEd{Sl}eY#Uk+7v^4m1bVU>B8!|w_hN^DhxknY**M8u%KFh(C1y$N zi@00ylM+%APbT^kXC+z_^@-aP*2nLN%Z#^h{_T+{A16t=E8k^)K8f`?#7>CQ=ZJpo_s`!9#&sfdEq5 zulfW2N`c-`0i6l%3Qb4KRwC%jv-wP+m9$XarQAm{XoPw~4}xa!2-{Hg8cAEL)F;&! z)OT?X9}SJiWmOYo+n#2Jvm`qi`{5mWAgx0OeHNI@4)OxI3szJAjXTU;Xt_x8ad+=n}91(-EPau4q9edub9fcs%B5<@-W z5?sw+!YH8wYMrt8u@|V7hmah~Lp>zJdFkUz@NrxoxG5pHsCN3-`gVX773=BjzUhj0 z^>aRR40ZH&%ycYqoODQzF3#8B*Ov4Q_I(Sq4LhQn1WGQ6zHBOUKs8sp$Z*`;&o(-y zR@~0`Z3)K{cP6DKA53llr`Oz+m=s$wpZF?aNBr8j4zV}vm2BTYf&OH=VBBxGqb~r0 z-c_hO{Oaeb%j|RLrfqaJY9Exjy@|rgE=dwP^N+Fj-w8hm-2`v)r~jib%gcC2fKxri z-bGt&M7QK38X5Q-i?#FvAO=)uPoS8j)ul28-%i><< zNXR}W+mkE>V)JJ5fShqUN{hJW`N!pU7S($}*D;W-rfZSJRsrs*dh!OkF+ZWt>}Q@a zel@&E<|d)kz(s#M--oozskuNcTc7eVrB&+A)c2`>q!slRhi~|G;8f_TdDvbrV(DO| zwpPj!=i1{=^b`rN6_FDuGd-i?qe`Yz(`}7vfRp_ak`x|PCv|pmjMjT$#@$ot&nD4{IGgH97K?#>H z_yq381aB&G=xU}ONhyYBGk40Clt%5M6t10am-BuD5vwn%BD zzE+!Q^R*7zHgzJ%ft|=w@xab)?KAp>ehZcll=9cWPq-^B3h(q^srl08q}@t;ft|ay zSM}}lj}1BP&GHVLtzB^BbmesK@T>`+9C;#Lo9G!aS2B&yd@*yE%%?IH%yc;>Earan z@eGj}a-~m*l1Pfl8u1gkow1%c_Ydb;hpEp5iLVl z8SYGQEOa>W6#u}Uau(iBm3EdZpmIG63V$$o4^_uGUn_4%5I+~DW>3wT`YiQs+7NH7 zued)purg3P*eH}2we(=KJ$CF#$Zx(4_vlk__xm7wXf3S?&Gb0*e*RWBX#>DZO>*=` z-@tGbaD3FtsAJh>at+gxiRQG>=)f@Fg0y2PFOza5p8B!u`<`#^ZwJ2){aW&?`)lj3 zzkdt=@g(tJYRSMIGhU=;^VD~GjO!0it%&34!ZQXk<<2r9E6sK!>y0cQV{^q;$UHF9 z=NL2Nz36h$YIMB}k?AAS)rzVcStz1W_?@tpVP`xAJ$Kxd+!b9e=P~`7T92)gm+W^& zi{L1KWnUNXrL@A}bM=AG@NUx8q{hj+Q+A~N?UMl>`pX<)KjmdG-S5dRDnT_r^nXVj zS)5&+E71wP>ip<@1+Q*zX9=fpIH0`z*SXcz)BV|9$m8;KaL;ia!n(`uxTQDLmuY>~ z8(?a06vgZ$!wNPGyz{O1j!7Grx*aam{h$mcCO1g=kg_RtU|JjRK;KILm%xNjI=Hbm zV#e1RncNI_)zh*(GC-Rm&viEP3BQBmmlIx(eM&L)r+QqgqhG=PUBKbf@949T0bNe( zug-)HW)wKi)x~S1z11}Rq4&t)>xw6?inn^&h}43qJwU70kl}RG+rf9lR}0ja#(`CV zia~-*i0?>P`C^>Hr|m-5W;!n?(x4z)Kn6fr(Oj9R9@7$Z?nrQ6admLda`$v+abI-} zaYegMp@VqHaa^CERZ?HFvUCjSrnSIwx``?%pTC5+FZj%vlNSCQ_G9h$z26Rh4J7nU zh>sr|-#30|e0+TFgc%9NzQ%uj{O!aKe^OWPkkCTDi{)};b^jW+BZ8zGmSJiPk8P6u zd0fX_B=^}|YjYNed!D^Xw!vB6X1)M=^V;a{8ET}z6E!%}8Bs56fjhxj$#E9BG(XuM zdWfuod*>fJ-1-KZcDS!?YNzBPNy`$?Cr(S64OX$8(mpjNt&q33uSj4=XsDG>oFsXb zn(!r#1f6+0dS??o$)5UQBg1xv{Sy`$UIcmTeZxzJp9$+5#=-`A3gP^&Z!7-^q6Mm4r#yvU2Mk@v3>3XDH(bqW!INu+UInK4oBGyzJK{CVyTQBL`@s9f8v~!2=0D(H z5$GKB1s5a7uRM5}1iIO=#$hAEe1+_qN%mrXL%2y7`ju@{i|8{QPn~HlrzblyXoiH} zLe|Ny@Vp>IYo6_{tf2Lm(jF^QSyNhrptmaK@$=AKZ-9P2%m1sp^?_>sE8fy@^jAp! zCvnNo3O^FQZT;Flp+o$MFWtUO{}L1Li;w(T>D#pL6@H#cs-0#8rrP6JZ)eN!?C=_o zi%FN+7uzqJm7`g%zj7DLvod$9TodA2WdAMe(AZ6x?q>{(9+sY_dyDQ^p9n8h@dLsd zc(|*TbEw`&t;uo|w?0YhLxSi1k`xx|K_3u_Se68+MRo_Npnu-@S%;W*0${>ABt zd=b--Vk?j#x5&NJRU7Zdc$Ko|atqYvJ<;yMS3rAxly-owaiD(Nk=|7p4uCRYrNfIv_#(z5 z&H5v{fLkKQhky3?T~8fHwQb5=Iumq&zIJ8ncXNWV2I}<*fx7;@z6{S}DnpcMG3fGtrwbwD(yLO=(m#CWWpc zh3mEdn(u)3P}&LXd<&9iCM`|e|MTFFE#EKV1eo)+@z;)D*M9x}wa&LQ-==@x_T&D~ zT1k0RKBl(wX7vvVb}?&-j!H{c)5uZLtuiNP>74DaYzf)=X0MsUm!nx+TwJLfm$N<0 zGB5L?n77e$(szm46>%Z#p}RZyJvp4aQO#e_daHw>N;t(cS|sH04^AtdvJl@v@aO!W z7U-dSzjyrJ{5$`C{pXD2%W2_(x<&&#N?wK<=ZrqXdDnH$UCq-6J#r;%W>{{}OW!2-DW8+?CnqGQM@s#a)S+oLy>Y%5z7qb9{vrOs{hs%nee0evKeQHH%I*Po;Iw}^cqUbm6?GuE5c=*S=p$aR zI@lkOH`EmFlkxU4tG8LwhzmJ_iT)h^!@jP*D!%r}AzcQ}|84Yb@&pP72Zpv7)6LG- zCVL&U8cVhQ?p~1-GQ`D<&9pev)|fvtp2_ITSU6^B%=(yX8AnI^z|O3n?qgJTa2bb0 zc*37}YI$zBTezFLOS%W5K8V*!D3zhv$z{$B*6|PaPDLif&a~6u1Aj%D$i=jAUfY)* z)Xpe-qxe7$vpVWWt&8J?^S`@N6Zd!cHS)R6x$d|thy5E~GcrGN$!|x^jLH#pJ91g% zWMsOgMYM|eBis|V+K}$VRgxPd`3O3(q?z`erktupaXjt43D_r%0QyO8af8k ze0|~e8jSz1<9q2{;oa>0;oal=*FPZm3(^I`c}QF(Em^$M6FGgW9K)RDa2CY5hr+G5 z-aQfD)q8aO=b$Pb>d55ypx;KS)GED6vY8e+ElU5K45+bwF(AspFQq9pLP%V zoUcLI-J3K#X=#!_>0t8Zl(4k!-W|UC{^x=F!Cml5y3B2Go#nDi@d4tREI}`@it1$T zD4e)XP=Q){_Jn;4S0mp?c8ppSRV!*_WakJaytQWmIQ*(!MxDySpqZ#E0`@iQsmaU= zUqe#?%Bn}2xvT}(Ohg8 z+@4;zm}?O#mvG&lY8Eowp$xbWpYrDhEvE!%RI6~ZHVTvqeh&^0l|lEtF4QhVwaM;p z5jWHM(qBlwCSAFx=8=ftimV*jG%`B!AZYPB!>5H$4j+L0uGsJiVe33E-7}Ende>dg z-NlvPSx2{(TJ#z(W>yM*_jT~@OFNM^!<*tO9=L*(@G`;r!B@e`26S1RiwR^GUBZSd ztx>OE)qc?@Baf{T=B6F=HI6>6@t*PFZzI+MEqy(*Kx9uOTbk$vbo7jKk3#1+q;J&v zsM(a||2dw7v|n1WaP8(aUFeG5#tEIl5O~kN`;Yogct4<${fug^UfQO#aPM+&XE``q3HoRowu^88r_3e{DXZXyvNe&rsYUO1XXGQ(9JuiO+ilK4`gw4 z@b2+i-od^k5S;P_)(7&#e-mxwFo$5`FmhDXE!_?AuGVws zc6(hXToqlLK|Y)7_^$WSgIW*m6ne;=&5lf931sOT*c@ zz`F>qyP(uI_U8=Pff!6l3!0h1f%fj0XMuaD_#wA?Q1A<3;OG+oQl@9ah&kr)ys z@9@QT1M7!zG_(VWr?>nc@toZTul+R`;8~IXd^crOsyl5AQvGuIN$8ukkDSnIxtE9c zjpUK%BFjXkL_}Z~w={BVWLM;qW{#|Z*Q!WIRAF$+rbey<4{JbpeAqqI45s^cS5`+0 zwFAvB-k4v4{ruOx`Md?aoxHca^?aLrZ}Evu^fyBl@Hn*9%mW8v5`QfIky&YVN)MP-q{)BCShR_(;}-x4UNhgwJq|u$R!c$!*_(u^E7m;u04)Q`c<{DQjj&F zRpCmI&>VcS8d{Ic#>nQL0S!UrP^RE@BvCZ?4oYK~O}tA-{ezA1Z4g_4liK0nD+vt_|+No);eO34x8Y!!yFu8VTkRp0n^o+OD>) zl}MX!G!2`8B-0G&=Onl@ zx|_O=JC8VG^(nYxWTu%V=wjfSB?N~0LrAKY=xrIv*^{RwsY%xoA12bI=1F^!qLPEj zD^g4PQiJ{A)F`PfbH=+(PoA*sVdKL}gue`*AJHw+f=BmrRQ2?mGAxLmnz38V!I;tL za%{~wDr3crucP}$m(CE3ni%oHv)fr$E6SS6*EX{P#wrl+YvWZBJ>1)&k(iH6K=NW+ zW0A1|T$8-!6f+IEF9}vTbl&~;Wzeu&lHb`@%sOT{%e%XHZhDeX;dnh~P{TfQS9i}s zeYe2ragM~qSaaOf$LiVit>~k4SL2ZkznxvA7synoSj*Ub%=_qCmBvK0od2zF7pj>o z{!W;eO~jo0R-JGds99OW@$XZ=b>{&kIeTWCPW?T1)+tUIH|c zo{m~@G2VvS;HUQcf37O!7o`spEB8V}Qc7+Vl|(8(0!>YBegc!DAf~ccLZgFC0>Ap( z`gVAWdKFA!hk74*JNgv=Nq-;g%QtX#4L0hS4XhH#3cbN6!h0H$D@ZvS#0uY{Y*g23 zYxPBrsm>0r7cLzM&;i$JS0&eKpi{1lJC3&?Hm zL5BK=PKo7?8`YUN zMe4F<8sK462`&$q{y#AL83qo>FTRPsm%fUa2A%b14g4Eu7&>YGr6*ka z_c6~Z&K`oX@qm;gBjrLdop-YHSZ_e_I21gMthPS>WZz!jWZzidR$qdzk^ic{C^FR5 zU^`^(WkW`=85(7LGJ2W9TyJ%=>+&k1hulcs)27N%^(6>lSK#XW;T+)l>Z;_f=`QB} z>gwzI=={aG0c)ojx*?a>jZi~IwxX_4O}%SA0gRhv8NXT*r`>7Fr2beO5# zQf9KG!kh}P0Zm^8kDzYCN)xB>H_5AX`gH!uGM#FN>gsrUf3PC9WzT$XVl zp?(Ba=)cb{O^eWf*BhZTK3>zbEov*UYU-&Q)qpx!OVIM8llF&R7~RXG_~$*fSai6K zf%h>P+^)aGUG9T7JqLJruW^rf1pQaM_1)6#kJchgnqsU?(5a|qJgTO1#&d(98_@~L zN}H|8&~>g5o3IOXqygHTtwhSqRkoYKeTSsgQCKxI**10^`eY==C_eUz9m9mJ5sSdI zYc};ktJp)f5*2xVB&Bsg=ibIy(m7Nd6ZqMo!=bmKFeAz^!ARVM`Si3&}Px~WxLvPlFuD~AjAGNHSep)Ytiv16;O=e*&pVtOz?U4do0F%CZ>U!wx z?t^raNjb@Cv3rawfY zlc56rFMIbHkHyTPlyKnFSPbXh1iV*0kfOcXY-9#eTTa0~qJpXFWf6zDeZgXxeO z`zEx*@S9n9ynMjMX?GpnFez&7y5!95-0YYP7xZ1nb^PypM;{P*zJt(z5q+YTVI#tN z<8>W7Qq%CaVWwxT`+#!|YJ^l)k^Td<`QPF&cn_OpcBr&+L)mdrc7TfV12mNBprzdg zrBE^67Hj4hZwXg@3{+Wld3MncT4x6%Tn7oMq;diDqhj=}Tp~L1YIZkFACDsyZ3_N3!OR5}!U5|e(jiuX z*LL1i%xPe*ybT=yTWT*}*FzseHKBuXna|CSa9;k+?}=&H(-)9?cs@UnQ}`>Wo#id) zUG{=E0_d_aVX58JTKn?aB3b2hv5o2elQYbp~1^S`c z!4bjs_%Q>d?9_x632>u7=W2yQBZ(IO@!S?&Ud`jkK=ZZp&51 z-5G?77*rq+!d8SwL&sJgO19r3T1MnRuH#fBJ2nVQa<6k0agNlJ)f37_WDD0vD)bSu z4NT=Y5D{zAUbGx^745;Zm?U+10{ZdeP+U%hjO5k^bN26eeQ0cYAIC0rTDzR`~K94Q37 z{B)?t+8~eYz4$6pKoPkK4Pt$e=f=R--4l$HS{B4WRvPq-IjxeY!8d>hH2}` ziQ;k-yr3uX>n~_x-pcb>F=z4jk7ORw11qT*2u>^D%lZjc-ejqm3k^xjElFYZk;; z&$lZ=J(>yB6erkU`B^LEHD^#pfk1RXnTOXY<(r~GW!DO)`59=kGU7crg%h=w`V;Sg z$@*gl{1w$-1#$#)=`Ua;cKy!-1M1#5=;v18UD%2w@nz6`w8rl@5smPx3p64)k`Oq6MD$Opl+3*f0N13 zEJZ;1Ta0vohvOu9ML2TgtI>(jSag72DFuF*TjV&X3kgs;$Ki&#mae9kL4f)I1$GAp zjw)M=6Xia-_*2l!4`Yw%V(i>^P>WoUo1sDe18U=ya)(?iyFzW81v=qDVz{U#-a|cJ zgg-&L`4s41ia^5~IXf5Mjq|()G?U%H^~5PKyQIb!Rz14uU^w0TjD`iY@rstymkS@!b69#OV$-_+e=Bi}E}8$y(rN z6V_|+o#t5u(J#7c{*AM=H-W7)!ko^rFGHs zuV+o0=fL=AaSKZ9PC`^$DlRN&K@;AdfX9SxKsVgZbbPSq@(D zpU_+N#p^eG$`iR8ROur2IgnC+VrN(k#cmGMM!s$kTEJdr5(u=%&A&j?in9oIk8DT> zW!AqS`{XbM-mx^0(X&A9xgMIzeAWPK2X2me?6T0*kF}SA(bdGRZMVlPcsJBptKg)W z47L6SypE%0?Z!*u)1QEyEd<$F0n(X_BRjxi`btKEVHXE2=QI{%PnFB+K<$m@fTp~? z{#wuM$n2;CdiO&|ykkFZfo&X}90MFz9L3O;+Tpx{WbF4~kDqX!{QvAV+Bwm&3-#gz ztq!WAkLpadgnC<<0x#Hi@C}b)V&-Q=c?G6YKgLn7bwK6)C$#dDi3Xq2TWIsQh+S|8 zy?_F_uh8K$It@K!L(mj|;nlc>#MWl^V|Xq{TjNkiuC~^Lb(9Zkmtydw&p?F`hIFFR zI16v#ES!Y*X1-0~UPwZU-E(+BH_2FhRvTyqc8%4*2{TdIs-%YxqpWsP%c$qpGh^>r zr>E$n9qDm%8{*mpmHq^fd>+AXvCO#*j*O#)Ms!lB~B%|eA%e;A&~0Z@m1fd09n@Q85Gw!-jAFMgnQUk6sxCcXwPjemGNAHnm2 z&v_Ko+h5?l$Y9^ICRiS8KD6Iwv0Gm=KBMl;XU>2Q_a!LDH_Zj+?@)4nFcuhPL4{02 zN3gol)tF|yGHRKlab6uUr$g;I8$Q>j)_gqas$CSTtP)hctMNKuU$gJo(yj_h>on|O zxv?`|gtziDSYeAmv#1R^*fen)gtzLbs#;>FnJD+m2iR>gl0k5+cE;J6N^^tqauA-= z+^Bpa6}aOuLGPsespM6A<81$|=7Eo;IZlBD^*EFiYruMI2$pFv|cG!!D=b4 zyo4UI3)rSfaJ3wUUuhirh%UN_6eTzDUk-?a;50A6UX~lHiNlvr1Aq01Pl1bIpRJ|pr}|q6&0pD#$D$Q`@|edR^=mV0-a@m1G@@ygQqov z4#b}{i|(XL=m?x~ck!OaVWpK|d6!v1r`?#;h|J6D}=un)o&(uCi|y3Ap>vk$`$caIy~ zhIVlrFAQ4hORVH1oS9AG=4b%Ib_<-X*YKXthXQ#i+$AsV*I04e>{$MS_lEO5o!E%) z!3llq1FW}cpwab$$NP=^AeVtsc31v_9j!RM21R;(vW_H@-cUuVOwdFcjkUsYZ#;-v zB1qSR+4P((#0|2ya#Yy`%6dNKSH)C%;|8z6$rwov?cr)@fzPHNPJ|jzT>b#dE0R?~+D=2ba{r{I;X17kf7)H> zH0PprxdP5eIN48X;d`47%HkKCx7B4?(t!NuI9v#~rUqxgWK_}rl1HQ^wB6t78u|&h z_v@%bJ*YlYXcG`co8f-5mrYSFvGbsc3S!gUr~}KvW1EdWrq7}FTE&Keuy>Fx!|&F{ z4xEJVc^cabm2no<5c}U)C5Y!|7_!MbDMOVBtO$Kbs$=C$!`iIGnxZqbjl{D-ikn$D zMjN+>t#m*=Rerej4Pws+Wu@JhG* z7td-r+&o;eGDw40zI8c9(7y&v9>CCZ|DRe+&O6IF(pI<51srWrfH( z{#Kl2xz!Z<3eLe<0xmsaRQ%DEwV}k@Vi~)buyR!$N2gauJ3(Nz^;hCKvNONvIa zG5y9~ku2!2O=l&QhGea{PS!9+9eB4D+(8b&y*vfUu>skLMxq-U2VHpqI+HYkGkp&3 zk_o~V??JsN1@%vV>}31EOzA*2qT6#A=kI0E8(YHH{+d;Xzj_wmE^c6zJ%%>?AMp}h z-PSS*)$@E%>}!MQQyEoqTbb{_yAIaCC0-f~86O{=uGhB$_PQ8(cj1#zR4QK+p!JmJX#v0rdUxE?^7e%TyBN#eij`2^;kJ-^5SsG z_T@9^4yMSn7Q9NNrt+8+v+J7s>~i2mjugpuJKSi#T1Tu~ViMfih2Tm23m%YLSOS+`})LL2H$K2v*M<>rbl`A1;oQLP}?P(z!}6 zUokr!&*l)^8u=kM35w1_a)ce?-PsOxIqL@Ed{OYGuh2?lhnPt#gG5*hM9Js4>y1Ts za|LTf&)Bs^1?2-ee!W;5)=-qRKZ}~mMi5s{+sDmpqM){2-D+pB4uNFQjkKj2Z3M+! z22k0$(^}9rpBL+RHdb2|!ezITSIIhf3noCHS&&B4#{jFtC5d$x7p+bFl^97H zu!A60E*1ZI<86HZ|IPN^fyeTYC!-R%ClYa2Pqv2|o{I?H8k0o&ynScmV)Fm?sb zgc~fH*0!?Sy`XVeLHmkRW`667c*oY$t*GBtAi2FGc8?gg6FYEgUfupjEXAF}%a2)< zCb4)_BTdkU+6=8oQ4mZ#AgS!PZMIZxXvG@aNdt8g>4VB69#2L%$&YuunS6pjCDqKc;kHtuYBXM7xpQwnx+^8Niu(EO65T z@9zS7eS_gBTFE+sPB_SH4~9c?+bI`oH^~TNB=3n7);n^T(wa!)Po6=0K~LDDz;F0! z&lJZorI>2fGP2Va&IE;mb-tPo(%lU1S12N-$V8iIwP=j-*gUBeRdXN%dK6nAzi>&m z(jw@RxWOkFEc$^<@mOpyNAWZ|lT9G~_-iY-kmNaTVd=yKYno^W>f9Z9SiC{HNl28y zIoO-bkT8oq(>TcXAChAmQZxlACDBtKID@mn#2cX1XB!8m1&yG{>D&DCx*njTh$>=GXk=g7W`33#HUGg`& zkxYP}xV}u~>Cug@h_5Q5ydcB*c77Ga*Q|K{CqVsFg72aC*%NVwd}f2t@$f5+lw4#y z_yImp$xhp2$$Ob9Ef`;6yKl1cqs-@Ncut+GF`PaM>#FT(3vj`^_Pw zE*MBX#R%N~dhxX!1+$Gbr0#x$f*?BNr z$AXTtPuZjPl}GFaBnJ&8&VTzsZqorB+sPVVAh0#5oqzRC}a6q)bq2 zlAXK^d!#X?ub9GfDt|ei(ROA-@vl}~&&P&hQuczhMuz7EzSs5#>#_IF;$*A;RcH)SqGs8JWVAM3 ztPS?!S(NmcNQLO1JkbP;o%~c+vo~gMqo6F#Zi9j}L&SkbvJZD|mx#hG?}*)#L~DO2 z@68>7eIiloMZ4Q?IOln6E~YDw$PF`O6{7jr1CVAwdEk9nNj+Yi_P??osNhC{nwh|B z8wt9;%Y(H`lf`wXvekRtdZ95tQ}3nRHhE!A?wlVKg|#P zCvN?J;y!T>wMQ4agY=PG_?4$*2NB!6K` zP;K3m>rvh3kpb)yeKEy|(97v7tmYuBb#zjC!2XLU?2PD3gZg(;G_ce<>UyRh37t2m z>Y5U;oa}G4tk`LHrrXqPw4zl&T52W&HxONen7%Nu0Gg?JwRiSaGmm0w4SBS6K+B;s zLosYMNn0du*<0-t(oO5HyyWYQ>9U3EH>I1=Q#4hJ(sH6Yp~_13w-nZUo~GqfGJ*%U zhYiKOqP46)-&}tY6Uyh{7BKIq>Zd(u~B`7N@|H6A#yur=tu1hW+a)e_El%eX7*Hh1sa!( za)*deYO;IqzARKsVe{Rzo3e&9mEBM^jgi;H5BU==q^Y96u~#&N2LNZPvDCV)6mS;M zE0Pn&0ec3LlrGW{)^2+ec7as(3oA(`*jssBt+0L&YPhRP8IlLAsS?_C<))Bg9CL!{ zy&7GdMMx}o&njqjX*)Ry&QVjAp>FjC@u7-zv4Qaa{waotEwrt+RB6pCh(+)tXv!;j zMJy(VKwTS12gp~nE~`u~kX5WBYXYvrIk>(v(<5LVG}r#6QC0??s_M=Lw58&9FP)JE(+PiGb7{k4mF9jj)j5)=|uMJs-hMbY`#ff}hvRteLq z^i=;az4kqQEE@}@oRe8N7c%hb==$XmZ!sBPEd!ylyo-{Pgo`myouu%Spu@gX!t}8+ zx6#asWIeQhS#_SroX8z&J*~dHZ*>PR>MhIZC@gLVmyl-aWZX!;)34|=bYxS=EtP=A zf;T~>-8dfE>J)Y#^f#1amEs3OsQuq_?h*%gn&qwLI zNlGB6wOpA*7U0fji6iz%bb@Qr{<>Gz3p6&{BhB%r)!xX8%$kG7RXYQo)ir@gtFWr5 z*R6Ab5`3+CP!2K;^v$xGUByVXrfeBR*cb^Yqr_3Gfn3e~#z$U)F6Q0sA@VqHX%4pQ zpkLL=&S`k~V=x0M+9!-C(Tg<%VY#RM1JB(=QQKZ17J})P9(3zL_6_+0RI`9J-aNpY zA=zlO7;DZCa=Wj3QMt<>2A>2e>8W>Nk>)z%taQ=saDsf4XTa9XA1ouPIX=mK!KGLO zm5@q4U8|v7GRKC3q@ANb+idyF1XS7>C1`KdD=bW^mMOY|s!>IaV~KWtVkq%oa9yHD zX%=z-otzWwwfafMLf>(fU3aRiqm>OzwF;y^{GRvtAND-*LTMuFh*)-8%(W|lBv^&b zQ<(g2bQIn6y4p|C1eAs{n&q6#e}r~|8rlcvyHlA$t66t>4W+5PYY$R(X@%tryD4rL z7ik5MN=B(Gnab;mhPd5RW+@)>$m~ZcZOO-jf@>jhrKfCVui(dMOVo-BtiI+& zWwG-QGR|6oYAGZKpqKqgeg@g>4*TNxLcfJ#L@s9*rI1~beNa|`-nU0ZuTW+{{r4EW zvz9DU>!t;5YV1}N_ghlls3#9;Ti6dW5ya94Ech!wq0d*3gUA*Rod;uwphh54=Mf|d>gq6g*O(@Usk2!R<`xe_8I`W? zb$nFl4(3q@M0QlXlXxujJ6**B%whV7O01nWNj^81k%nxGn5mR^+!5`9^~GV=BJE8m z(YU1*bB+)LEJ3rw!Jb7(Io5kq`#~!xb9xc<;7*Uzd(!aAa z(5YR9hW8qM#11IS3CG@6lYLOPD)mq)s^XivMZY9#8(BpWIJYv7Uj7b~UpU?V~TDg~0Y)B3Ia%$!zr;^IJLXS1h{{ zzzpdc*0l?a!@YD5zlJ_gGC8ZPB6o}!s|+ov?xr8n>)$BfFqLHD9K3@m=T#ZZ5ql|9%=`N?W+=O*oxa-@JJ)pT^xbQg*Xl$oHvkSG8P1qcfD!B*A(vp2*_XQ$8Pk(NXpYOc#!b;%u;b zRqP0)S=aRX%0Z}uF0hSicC6*en5(t5-^*X=C##d}rJ)}k+$TF|FJ*o^i?T)iX8mn+ z7BTEBv+QBUE4zz0z-NG{Uy+*Qb%$g z6I#KGyM`%)gIkU1WDvNUlf+&-ho~Ws(spbezi(B-^mU|2ll$2na@Lp=idAmuads0k z4~rse?1u2{{xqM3_Oe9vxOK%!zyP?IRm(h}jB;j_$^N|7HAkEy!dz`^qTis}> zKQt80`BZXEX()?YANWpCXKxA+a%n$(D81pYU~Jb@b*H^Fw1S<~zo1WBRSoK^<S|`N&C2QF&ex(^=$y>%<6hgzsNJe(6*RXN1|jm9`8>LW=v`y?r&{a~liB~Mf%l#5)&`IV+L(`{1CIw5`P z-^v$K9j=ZH*)w z^aknv~8djKlUW<)HF6cUft&pdM6eL;cr7wvcn!1+@g(ZqFCHpu`#t z&S*UCgh}02DE5>20DBYjf}*`m+$Is2+x?>~W25<4I}!X+hMM*lwX-Z9NU>`;XDMfm za1ijD=r?7Iv4yyuP3gMe7(3GWMHy#I;#*Z0En(fpbJCLy=IQxHwpFp=w3Oq8wkkBu zKSZhMX-uyhlZd9iHwOp5F}J%Adv7$fBb9XOJ)EZV&<$?|(pejlhF(Px_Euk~jKojj zWnbhPo}x_A9@8h z$;j-C;D_aUx*Wv8p-3UzjNLFz#4FeNK$~j=lzqYS)@#%k}ZqSrDnn620!w5vExE3gXC#qC!bDz)s@Ao$jn@#ZRdKBV1Mzs_7=EHN8=$shaKGq(3LiDjNkuK^9elXEc z;f%DR1AXKZH3B`T-!Xx_%oAiYx|=kTv!V9x#T%2n>Iu@^D9YC=jP3#(b~^t3u9!(N zk%;MAQ|ptJs-{<`SrzSm^raYOFCtyoRXLUS#M7I|&smwZ2Kp1@VbD~vIOBOz$VXZ! zBkel!cgGqU3hm*$lu9%WnKaXAW}_j`;OMVp;ps6MPO$Qe()v)%u+oJV(MFyGt+lz* zD6ceeZDSGEbU8-p1-`^AN3=3Il*6p6b<%5z-J+&?f@T$6$VK{$j$$5kltzFE|Eu~d zIc(P9n~@2lq0VV;bw>Yt7xcGbvW9(0=&UlB$L-}Q)B*|O4?2ZD21nB)G%=c%Rv(aB zmXB{|i;?#*S=*qFGWHrLR6mUjjuhiPMU`K@*@LZ|)jePA%AtQSjox9#(L}w0y)qc9 zRdE%uo&|rhcIw|YD7|3I_cZ2-e2zzKseNB`P(D+^|DxNq@A3}Pr@qk?xY#=LL&him zKxwL-VfVq#7IF(z-ATyHZAo(ChKhL^EkPEGnPdY}TCZRQ5q!3|v`(TX@5kGjEUxV+5#BC|PM zFzthSSZ=fjqwYUV!{`k5Ru(tM$wbFRddYCfB3fU1!|qT1Q7@Ab)7=Dc9!OBO zRuuUQ>bfnmgn3VP)k`Q%?1yFo`V$@XRCuwK@_Zfs%~)z_tW*z1gS3e>Bph)cuPf#XN znLlNPwZG*RbD(7?X--Uk{XgtadH@|4GgzDi9h>Pat1o%al0kI{!z|*o5iMdgO*syd zQwJrlV+gAArs5P7r)6b6%+XA%f+)xm$tI{)CXfIK*T10xxyyH0W9+$NmRdkBA^Mst zWmU|-2O%f+Pt5ykpnh*Fs;bHCBA0xcFyvJ=o({6p@lSj$JL>o*rui}3z%g+wO?pMl&^-<97?(?(WI>C%4*UIW=$mJ>~qW^)6CwyDfHx@ zFt3lKP-2<)#U$Kl>WJ=SD=%o&qkp=RXzO5?&}CNL70Y6c5@u%f=5~PCzm7-2opQV7wByCb=iJ-1YMNh=|kF<4={?`2Navtv?iGaSONWS zX@{`OB5lUOLdIybE)?U-Kx*Rrs5x9FDV31WbJ|WX%d-ch9?y=G;616RW)yz^F?*zQ zp}Hbe+Nh*1(sG+af}NDx&d%hA@rD;wPJqE)(5h^XQsP_{#An|jyS$@@w#goCRwPT6 ztfVX7LBiGUq=g-nrO;{UEY^_+pwnFe3qBm`|DVuFd6bqKZvOT!Jd7SiPV`K&8?2)} zYEAVDUm{Y`!FvxT zJJ5R2{q!T*kk$KD*&;54j@jwe@z{er;F5QjQ*jf%D=v`PIIWhF&fr*AgR(c9TF7D0 z2G&q>J(I2}Y5-c3Nl?%40k0uS8%?%bgjILsBTJ1ikxMgBu|MFAt^K@^`bqnPegtLX zFo}ac4xL}MH%`u-JY4Q$U6i%-Fo~6ZJ{A+xTZH2VtixTUVv2u3rOqMPsnf{<;OoS& z*Yr7*s<)LlYF_)d&>@=O+NZ`KAFC#rCs&aP>;l+v1xY?AI?E$pEu^$&TexjCrk9mA zU>z4xb|BTDG!g_-?AauX63N~m?WYPy78KM56=YMT0?BDjlp(0K8vf^-v3HxZNEM{0 zt)nJ(swLJc^oSPYuL~=)c%(I*u14ipk*ufLJLS&iFCjpbc)&ynHnF-pUAMwZH{EaP}wtDlXyct%nJHly`$aQO2-DX8N43%(!T7e zxB*uFR`F4;!71e7`NS6}Hx|;eYSvU%MD4_@S*3Blc)>9}%!aEMczrvDooBmw zdz;I$?2PaZUg!%t)hjfXO3lDNtSYlGy*kigS?QlCt0GbbO4WRCjEPJIn` zm{s7-XvBt7YXc6Ri>**Mkf)(y#!y;DZ7<8BhTN#Em$Qte zqOSUo)Uk6~=R}O+phrQ?pK7PbZ_opI`5UPG`-5McAYR!ENlk4G85BBYnyjbt9-4Nj zhIuyl)}5GWC&ATH4XX6($Y|J)Px+cMSQ^%Ns1HwAeeE4;ZD&>z9T*WH{Mj^~1|s5vbQb$nK^x1Z3Z zcs~n>zgU{O3GdimP;^K0>{cZbj_g*AM#;~zBb;j8$y>Fqa!h2Fd1X`j20QCo-WheE z4Z0RZZ}+8sovpK5iOujQ6@q%}w)TSk#DwyedR8kZ!zfh58BJcLv^2WN@fuwMI0zAUqK~*DDK$r#KlrQp;`9=Em21#mcLTWEuOP|FQHHP;D(;+s7gVcXuzP6iVH1-QC^Y-EZC9^{um1GHUZW_NZ)$%t~U!C%~c26TeZH<>v_pvjf*r zHbU8rSYbIK^hH-c2W}D1eJPWQ99l<7Qwa=Zo*y#nMjsa%K`LB!k6Qzz(~TgJ^^Ffcr=JGYn0*t)SoAY*kv+^&T#9T3t>=b{?|>=W4IS!Q>|py) z=kXP)=xap1`HM&@_7KA?KH^HImb_>QVlT=P6>0n=a|cxLo&m#oAHP?F9z$>HANg$Y zlIaj!QYRpiJVV6k2b_incNZRyXNkS=PtGEeq2O9Y9KosT4bTgHWp2a{%Q)dMO;UZ} z-nxXkN-hCD{}j;QYxrHLJo_DTDhEm9ntgnI6Fp(SsT z*3u?&I{VwuLM%`)^h?VX%VqFN8^m9HJ!(gud`m*4;ellC#=VuL%9UJ!X%7@k##&s= zcgP<=B++aoy9I7j&)Iuoq^ud0YT0gCK-VD``^#qWA1pJ-I{LfFuur(l^kjJvIUN<1dhRyw zNN37EBlk0Nlf*SZan^~BNaga~BnYO*JKJEO&7<`;Rya^BLF;^m*nWVvt|0qj*9OM+3Y3dQu!^5 znTtW5O$##Uwm*kLEy?s!ULzt{cX1!RhJFXU_YQH8peH{d*L*HbC69@-#W*l_AHw1H z4tD*a&}d$UJ-D587d0jVk%A(JGVjPx{*|-=IJG&F2H5&)au;x$Q%M!P9eUB->0CH5 zxg+N{OXc!*3XXWmkB|uF3l%K^^+#_9ck(K#7UkFh6{I)yo!LZ3kmbTc-iB(B<-;Mi zClt#6NIpQv=F>@V6(291!)V^1Yh)?XOwNu-VXhDZ#EVQmy^dEPXUfKJCqM;i3h+Mv z5Hz@^tBAwQMtOpG#N0v}Ag`xdim#}%vKB(P`JUjwd}O)+88U@9NnSt~&45b1nOsEG zi(5G#LdiIjErcV&MrtdA?lgBw*aeR@8j8c6!I{qnza)hC3>*q0EhaOG^I$@&sR1+v z_2h-Pj=%n=ZHNw-8&~KPR5ouiM@YrW5sZV`ja?09%X#?AFGF|N7rKXKRA=e~yz2U( zzHvfyfXjjzN&zGOk7+uc41hwXGqUox&?|J4Lg`y%A=C#p5=qQ#ztBBo0P zWIhSc1K|MwSeg%RzXQ2~A7~!S>*$`8LD&H2o>o9@r$AwT9&w2OWH!SUcD(E_|F|<; zQbWXR)Hx!Gzskpxxj;L6a*g<_(sQbTXw9F)4BJ4pBhA7ERD5s2o2onc8c6dH;vT%N z?XeC5sLoJB+%6s!r%OlSLufA8(a&Gm`mQI9wH}d1dk#Q%r~9*oZX5Z>Qwm*A<6V!yhHy3 z{6!^ti@AUK%RuE_5byG_#2l)PxSjt9mUmO}rEmw&H4Kc(+w^2=G@Ld9==ZYD;x^M- z;kSGZ^Pack(u8^70VKhrV64RRhmdD}6x^sdrkgZ|ZOX4Cv!EDZBqV+}drqvTCy}YV zGtLu9miMeeW{^GPx|$}D9Ta2536^G32YQvHdu|FUjikU(yK9uSQ2fhEmIe;sm^o#6GwG;00O6se8EOQqphH3Dt>_~^A z=79WFv|^^xZG?{eHsm5!beV7qvtTb=s|S$L^c-MmM6j$?^h7vqMzdWc2iajJ8lA&z z{MIdUsj!W>Ap0LRLnP5%RMVRktYBj2g3LS?*tIF-AmI9%F;m2w{5xqr9Z&ZcX9{8TCT0gem_0(r z%2YV>tf%_mr1nq*E0hW#HxX|{R;UBV)KvnCTPo&Egbl4jw`eNu$vhGI@J@s;d7V5) zZU+<11&Fuaz$~8^*CP+?#QPIx=~1E^{}PS|PEaJs6@0gCHf3qP5Sn)5z!w`v z)kt#Dop=kk#MQ)W#+_UX^&)2~KpsYo0w3_W6fRZ?3FIH93B3_?qywS=caR)uG}(@R zgHB_LxBz~VG1Mp^pvDm+#C^arv>@+-skaF(Sx3mv@)I(aU1%OcHkZZ0g>eIB|1j|* zzlWU4JSJ1c>%wU16}(DU6Jf$e=_6eWwEb4`i#USrzLjqVHo1G>N+rHRxaayR@t zL&Vv<0_glsQW3Z&i8yOyg7@%EIt?cPAK{bPhKr-)W$(lS?yZ<9Fz_B<&I}aqaB#^* zy~~I1M>tXk$gbiD#M5YC{f+^vzn5=D-jw8g2Wc+c=+mVE!Vhp=5}*lsL)rt}MkQq{ zj^GpEcx*+4(%$3_ev-5m6>bJ6N)8)oUhH z_51MSgi+)I;sDSo^WfW5177nxFo5iEe!B$M?2cpZp^cQ|UkXQGap;AkJBC>~{LWooh1lLino1n(2{TmTRUnJM^X~JbFe*Y9VL661; z`0d^F4)Ph_ly6BT$)oAn*iYw@1nN`&0UK6FEFi3Kj?W|>a5C)371UAmatnZdYz>6U z6)^p(fKym5&4w=TKKNWqybm}nx4?^hDc14xrD^0x;tsfX!vqQa!BAAbn*tqrQ*0z@ ziKSrp)QLGjqYek}<`oeQWwIr3p;|4yp~8@JJMlBnE!oJGNo{54hY7Bx~WA)RKBh;EsW5?F{viJUF)|VSfph zeiOf_Bh*CE$X!OaGzLA5zQ7K=g&X!1;wW4^B8W?1TjT&+F$Nx`=LsijJUJ2y6M14T zuBR>dNb{t4ag#WV*bZ*m4@ymZ5j%^!#OJsdWC_(6j58N14h*vpsun!2 zEFub{rU5oGj&xz}QY3K$?5-T3rIN_&zJ+TYF zB9D@5iG6T49SRK6YOqz?z~8M7?nBGKj?DunX0(fI-|vS;wV{0H-UEyhSGodm;QhwNdM^c&2+Y2f??5G$ed zcO4Gf*Tf8{))Y#8!I&LP>?Tf1?!+AAm<3V}SaErxh|U#-n%+yPDKbI@`JEUly$8eQ zCmjDgaZ+|6hJ!b-9p~#Aq?TF()R$_?Om>ni5UDD$^HJB~kq&z8>oJ014kM%>;Tar+tTMUkx9gxH> zIHg>b9)hd42>yAFP(GMMx)Pg^S@xk0Ly>9{;Q==6TtwcVQZQ<%GOW%i=meYuUxEcv zv=`=znw$XEsw;5<8XLdRAqpT3L_U7)@&S9RIcl=|f!o*y)b=_&s|PWRT=bV+2_1_y682HDKO#{Z zU>diBWxbtnk({xs#9^csfG08u{NM-Z+1W_L#eXCcdIRX1VV_6>F`u5| z#Bmw>+!;86Hi2LCQoP?-c*>fj4vII#QE)8`0{)E`nux=|v9t$z zgn)xg0vNUZgip}x@DxZmaqa@nrW^A3E5cQ{B;SDQ$P;Kb4HC8kt93wl4F-Q05M4*0 zAn*@r3M=6GcoRFqPGKJY>O8PiBjCh25$Mt>VCl9Ho`ThV1<$$~{Z^y!46N|k(Ab#` z&s0Y+;9npH?FGa39BPpcSYgl;!8HtrtK$~%Mm>pYu$o7s+S~?b%44_}r*Ov1fSN`M zKF6VQ+l>58gp$+Y+*?QNAm6~(YC2Ad_rPqw2flMM&LGbb*^dE>b_74^4n2hn{kQ8Q#dtG2)x?s;A(c)d#L~oiOH61c{k( zLpqDj!8~ACdZI4cMzVt2o)H`>omhZtbHnKSVkYH41*A9p3Dw{aM`8!D!a2kqCjwuv z{kuvXC3noBF8KQxJs-FzhHf zsPl7Bwb7E!R4nwPx=@R#BI*x#=_DOXd%DO>8$i(S-2bD;@ zgBDH<*z059>0UxwpaWte1+pCc??gOjCi#ctvA_O;T0<&23fIXSc-=-AVlQl6=OIFd&6Mx@K)jLz8K%m_{kt?Jiap)2%LYh543<* z&rs}?TcBhR3*Cj4(nQ?NrTELW6#P8gZc|_Q^Q7Vh+LD zAA#qbiaXaD=)n1iG(K=-%EP^F1U5;3yxJ&uupPvGy@|Dd6rYdbUH;XGx`WRN(1t37 zT2wOJycNJQxf9L6v<)SEaa~5q3;R$R_5+5{!-2Rtv|;ijd))OxL~#{Z=u4oxkcihF zg?G^r&dYtk>9~k1T_i2TZahIcAT7twR%35HFCD?x`!IuMOCu2*`akMOg_h-&}CyW9l*nW^|`Ydmuw$$%L>0#``k;g8oL5Y>hO{lVbtMu>LL;DY{4 ze1uhu{01!HbY#(PD80QbEII2O0@n9lwzP$HE8yf7bR!EiQ^IBcS<8Qlt|4EKM+j zS**TrXqYu7_rv39Eu3=8q#uZ2t5NHd#0gS7G6n~!0Amz~+W&p=E&Q6xpsjTi@y{MH zxF4>4A2Q_KV6U_l<1re$;X>O8{dt%FQ&Rd*NJZq_iYOh3-<}0FlRXp>-b1tL9ddC` zkwctL5n78akyq1V4Dx`Uq9>yK6R3FgM~Cw}au+l11dG?7gADNnSngn*L5FM~Do0-t zEgli0h;!(>%!VS`X6!kM@SYRF9x1>_e{v`CubzmWXMy6`NiM{?Jw#r^xSYZmF2MKZ zLOJp{`52!&1BH`7PC;ZIfl=HA)cIhXP!^KQ@z?XFv1H;8qJ}f^GS+CwxJ?KX*u@X3f!sr zL@>~5&yXt}gaXrYtgyS_x^Khm+Jco8j1{mNIPbxT9n-)EU4`|$9Z?|)xxg#LhpDJb z?v!|VmS4l)kCqO@`T8Uj0Q6Yn1jboJ_GX4B@iXZwMqUYRI~8L05@Hy3mB%>WzW{Ic z6+G%c;NKLy<3D)k?r{0Ljtt`;%*7FyXEQJ|7szzXN${AVBew`F&_UPiQkxt z-cSHC1z(^&`(uP15P2V990|b1lo7h54!qNjKOt2YiSWUsgtv0^@E{0Kb$ z6N{kebX0ta_0b&)My;T;r4WCE&vgTuXDftBLJxQb&qq$OKv)DUX#h@`?Syo=4!lPe zQp0Qb_Q*iKK-+2ozXa-PFQB!S11FAT&H;)<_Phbz#zZL2L_&{^T63?r^@FLINaxQm04ugym8_8ist zB;q(>hBC#;|I0Owlm8>L$s)|=Ea>VqgR0Iad=&w|Js0erlb|ZI0P2o&paug*1J#2% z2<5SsR5VnMI#Tbkhc=}gs7=V1Z^F}YF4+?IIUTDa6z93Qh&a2M4ZIV6ITfytC~YB+6*0}pEw&vQd=mFbcEOaBveRl zQ5xz1Fh%{Ls_F*~q$}{DJw-2}_4GKVn4Uv-hW_CNs3Y}dk{O2C0VV$erYU%QBbaSa z9cAf_%zmiU4~MQ-5;Ka)V@ApZ#u?w454=HNuv11cBbknL6#l=5*+q}0)9IJ+Ad91O zp;7h(-kLe22USU`!M!|y-Q*5%u>{2ua;(suWHzFy16e`*OB_T#_7*E?4p#mpq9;yi zcd^g&zz`n83F#YlR(IU900|5(SkVebs{Y*I>PRB7yS#O45 z6taU*_$^>&$PU1PpuMc0>>T{jUNVDZm*H}o$y}3tmifsnOlzq8<}k0AJIo8_JTn@u zveUtXJ^>tLE$&Ys^j_nk+xZ4ayaiYZBy|K?;~8{iyCJqGVGn9Y`T;u=i`bKZ`JRdF zC;&0W8+|8V#LRz@^DU4{FwgtrOlFG{eLHaZ%aFy%kj>N~Mi;^DG7OB{{kY;)Q2CjU zJyH){sJ77K=p!x@?r`ql%nm1uxg}f|5n798rKN-&V6hm!=-(ROn7$fb>1P`f3~5GR z^8(`)U7oHL98Vk#dvto;Ji{WWPJe+T&oTW1a{+soodreLqc|6>GEXzNlqu=0g+NTA@;2RRky|DngZE&@CSg z=UFGXzHd}5Qw>&aP?f8iSeL5$sgkVvS!F^$uR?iR*#VA!Ds(ExD<&x7;O+iMUMRaI z`&V`utg8e%hAJhmQv&&sxPdsXLS#OIOj-gSxFf1oZ7~wBgd6-ru9l171GyiTewHxk z!1|l*&5g~Orb$piUu(Q(&>3DCZyVnmZtGj<$LVeKISr5DE%#kJSDUQ)Qun2HPi++* z2W#)u#?%e1Yh3paTu1bE3*e69rqyeEHVl9xT61H7Ine?~Bw-dXrF!BN95qJJbLqx7 zZA_)>nO}0FVu95X>r|VkwrabD4nrLOI1F>R>M+M)r+st#3HE30zS$&NS6g4SE>?9_ z307u|%RtpfRTEWvnEpjVM?FnZhHCu~Xo2>TbwTI&In^Gx^fFWt8i?W8(>kH*U`4#g zd9481)zm6KSA41TcEjBx389}T~zaL_1UUV>a@ysm7bM+MQw$t!l80hWmcu1+E3k1 zou*E!Dyb&mZ#G)nu3?Iv21{rF|3(^3+sQ+r_n&Bez$VN#*siyI2ZwmagHHWjw60y; z$9NQadiiwsOY^S`7#dg;Ff+g};FAAZKYw3;pWj|N9^URFT&n3Y+y!kSmx7?NBdn{p#(sv+x;72< z+A>W;9b21SGqQT4`e;RZnQduJ(Yb=eyji)8a(uG)X6?*6ll3vHUv_o&f*ecEg50WH zMgGfz|B5b_EGtW|aIG$=OKx}$ZYvLTzo0C#9s?h!Q*aUf;gsTX*L|Lsy-%udT|jh5 zP}sBZe;Rp4vrQhwOpk%3T~uPD1C0_RKZJJ-Z5-?$c*T$LdEj~1{i*9M=XA$G4jt|K zSua)|lMBp8syA^!uw!2uPw3w@tkKS^>t0(>)1zj1^{uMrRk>`?<)`It%h{BjkkvHnYUYEC7wKer#%LXss62eSdVqCw;kKs zt+(!KC07h%y8PuQaHVFo;b?=0rc3qbiukgM;vR)<@(<_zo3}I1kQbi+E$?F9ko@Td zjS3x$#ux7@xmBtx-(C@{eqME@#!@$@-cMg_oMY*Zp2if~ARn%}ZTre$kn>j8ju@|p zo-*(LK7)O|{j%XUHVl4aI=?}FF}?=x2(O#&om?L{y|6!Tv)5{++>xFHj`Ccsi`TKlKJ1;e(RD#lXm`k{;M!4 zF*zZvP1gN`(MuU-HJWldk6XL4%iVK7xp3Ian!UX zXPZ8YtBfDh@eZ6~!Q+MI8>HQp*VIocy?UBuha;lVotFZ);c{O~lnMY%XTmf1$C zHppHRulV+sa>MxscTMZ+Jr$!$yA(y{&&}DCH8yi!#+HoZnGV@&a(?CJ$yy{);Gi{M>tSJFp>$^lbZL5e@4Y6J3aLjp&+dR)6J`sLV{?GlZ z{D%h=1cU^R4jdNPIq*Q>xxmQ4bpf{i?|iy?EpazFJ2`x|j#N}onc{j@WxQD5x7J(j zRyMHcW!`}7n)HsTJCb_**!s=q%cxHSKkfMP_ff@hVO4|r!A}MU;e20pTf$#LpjmeYqO4Jx@RV2-pKOHK9~J9=UrZP!S14u#TQBj zl};@?T)w*EPo+<_P!zi1VN1>+fytvEOB%gJ|7L(US@jkW1(mYUWl4S2&bB z%kPzaEqzOBzu&ihIDfnK>CpSKHmBAa5?4q-M3{R8R8!HJmPC(huHS>D)vBE!~<$MCXSU2kh{E>^9ZO+5U%(Ud1W<$g?Q9 zq+{P3J2t3lzgA?Hv@RN+ug`9j**jgI=96|Ub$RNj)U&A{(k`Wc$!wi7Cx3o1UshCc ztkPf2sZ*;8tIf4x^%i{xOJ7k<7b-j37C4S@(|h*v>FfK&cd_4O|D^#h0`)<4!RJEG zh5QN52+9of3oH%zUqG4vN53Y%5#DD#TwKpP@S|SbLUK-yu zIB9aLj+8ekNi5uzpO(`*t3$>=e`-?Oq|N#>K7DLP?<~JuRe@JgQE@_9S>>;)^y>VY z-L-#eqcjH_TusNgp~NNG50#buaVN<&%=5YTci-XuodV_tv<(;+urJ_5z{h}$fWvUc z_VQ$~clj74S{ z?@o9zdlhr6TiTa62DmJ68|P8!Inleq$Hs4h-!Q)>erJ3i_#E?Y>s9FS!hM0;ZINN_W_Dg~&3*O-)CD&V zzaJSL^{VlNnCiH?<~v$WXf>ggu|-t#q47iGd&hT*UmgD@{zANcykoO}W1lvuXf!u$ zSfIk^quVaWwziX0U6l{zdt^UpC7CNsU;~VM>xa~CRF5flFMV0;R@}JgX8}?0Uw&O) zeXcRLEH5d4W#OWdE9LXmPpgmB-qa`>EIOs(rNPbg$h-ykmDbcYd9iAz{cY!GZhJkN zc)EF-@$V7O3Qwcw3(r2DWge?M7P~)owRK5!YVSD7E>BgikjY*{GlOP37-ndFtCyCw zElkU?%lw^oH|1k;Y%=}Z@s}o1@jdD5#;@1E{`|J#XP?xv%&WPx3q}?1DqUaJth{l> zlgf8h^J_oW7a7YqiaKJo!f~TVm2Xj?I;3|v85!27Gpssp$Bc-3+{`XMDE?%#^>Mpm zm&aaWDYrzxs`uB*~7G3+xw zFvqh?;lVRhMD0Yj(dvOsQ+u=HbeAcvI=D^Wc0TDm(|NFSj+5E3pW|K!AA7;(h{{Dd zQ}zT}leWS|OQ7*$!=Acyby(Sy!ml|tnREVpOO<8z)l+L-HRrT-x*BsWF#JJ^O1o#SZM;qXwZV?zFC!;J-HB@6 z_(k;im<~+?n{JIc*koSxm&Okpk8S)m>Ko?LsOVRX$43=M21ZN?T@k4CZRtTdH?ixa z>Zk~kRna}@3qW|tpoVw@jO9D}T5UnCwmPBeocd;E*UC9?;m#OIas$;FA%t`4O zZy#t|uUe=aEz1M?XdO4vT&tf_-?8pbwRKfU<=(PA#kUI<=dH~#WHw2s(k7(%B~Sa^ z;rET-OHvkQ%*l@_^{(7r{jTnVHnx6V{i=ptx@r0a#y6I2e4VJEJ6UaXAlx^3>-|Oq z^$%?m?iCRg**EG_^vM{esaMR3=+LOth=bu$Sf8-g!p?@Jhn@^c4lW7098l-8 z#p8o>x}9iMBnzT90?mps+suYRGPRC&E(W5u9~k>z1! zOj$&ENyTIJ#p<86owdO_D`P+NJLn%o@f%QCpN8roD=s4`rn#I_CRlB@-eEJ==8ko; zYN~3ls@{rH{*e(3L2Z=!^CQg@^;z0>wSCpA%Z?SN6s{`>&VQV{C1+)JLFVyv>$F43 z@xSwu0)JmkKK*Ax?&Ff0%GEWAn*I$gQqk$rw!IW8fI-YS?`N;iW z2fBn@3f&P#h8x0jB6U&m(cc>Pi%O216+wnGVJ$;fhZuuZA zW^U6R$J)NN+98hvW3W5aBYKj(p_00X>tTUEp1xjtv36I@ks8OEUe%4OmsOM1N7QX9 zcUL^A_<=Rss&>9+M17X-rEw?RMNU{gK(Fl_{~PW?y}+pzsGYJ&ic|1XI|hfK!%9NY zP1c?nPd@~LqZeOc*=TC5kJc({=2jjqb1Ye0Sd{lE=S}w2?4j9dnXA%W(xOxT`@JTq zb5f7rsVVx5;DXe$-c{Xdn`$c>N_Bm7;ku7{XVXKo#JWqTX;CrSHrC~l*B!s2fX>0` zp$o#tg#Rx*su2@Cxk+r3$Bkb$`VrA6d{me&bb6>=XkN(UkX<3(A^n4g2UP`3@muBf z$W`vx(Kb*Op;*MMryl>+t0LNpGvN=`oAt6RG|e=$)?KQ9qCKn0sBKwurMkXqih6M6 zp~_sfbxnPpM}tm37>L6E{cVGb1vAj!`N8=t--ZHRo_OVu6x+(M02xjmAXm3u_v>GGuqM;kA23Vtbn}4;zgA^Ypk_fbytiPW*R<< zjd)*SBb0vs0B3*LCc^2tdo!Qj{<8w_1&4)2N34jP*eE$_X7t7A4~@@9{nIEVVtx4h zu(hFELh6Fg2T#IdeQ;E;A@Ga;bDuXJ^IQ%&^tPR^idJrtbIfXZc|QTd^fy0-vt=F3 zlMRD(4;sETtY}zSzf7B}>8Y`=8(u?I=T=o$XV%tYmk8EPG}M?_OBeVNZQ$Di*}(&6 zr{(5CC+CT{72Pix`UV`7rg<)eonk&>T&N#g|GM^CRg20uWxtEd3XbL#)wFx$AnWiBegwYt;wXEeQQFI0I{-Y(lwl2zngn3Lz5J259Mdr)>vcHiuc*==$T=nEtsAJ%Fe}&%y?@$lIHQcF} z{TZA8sqEqB=Os^MWRnaXlD9h+F@#GYGSfCJ%xkwVgq65WhgiJ7#|o+@ae6>s;RCI(+;UCubEpN zuHINax0EmTE!v;|GdBc#-}>x=EYIvO*|&0(dEfJA7tScYT~?qTUHelL*KkeW*7Vfk z!};@Hpchp{7BG;^vvz}fb9=W~FUohff3F~2h#@R5yhB9O$mWea8cmG+FTy<{Bs@K| zWoX;bgpgh#b3(?3v<>+koD_5*FxS76Z*#9H?yp@QIgYo>v7Vr+P_|H9lQm)Ls7CO) zI6_2;x3J>BSrW{(Mr%WY?qI`!`aI3Dy7Jm)b+77nYg%hdv|SsDbv}l7h7b7A7)lJI z3_bM|bfws#b1_EIT0`BCIZBsd;ym47=30p)Le$Ch9waq)8+bMT% zE}2)B_pKnSXh>=M%B3}LHDenB4JXV?;OdqRwU3iT5!6_h%Xr0Q)fw9*jtgD)d*pfb z@^uXu9b_BwB(!mO*9duJi^wYxzr&k{uL|oKS{_^!G$qI_s4(#FLlG1iv^?;c|3u$k zUNb#fxV>}!x>b_Sb*b-q0k}k#*y0-`A8>r&V27_o$p#VJY`6 z_b)qM>Q~ySWMuK5qU}X(if$CXEU3vpkYAslR*+RVvbd_WqHI6RK9W_4aC~yRN0~kzU0<2mO}?UI^+Qk{Wg(;y{EUTne8Uks0nC z_B2FiMXn@|R4%*EKfx5HmP%M@tL)DP6}*FCFWt*Nfn z*EFe7)KE2E)n}@fSL>?JRL`v*Q0-dnfXB!xdv({!*vjmRlJaR~2TGb0e=OQnlu~%V zATEDK-oE_ELZQH>;Bdi_qDCbLO172QmCi03QsGs#wYEaju70L&fKg=`&NV=v@jTI% z>P1&D9Ti8dK3PZFU2$-AZtwcZZH&ixuWX+!evtv~gQkY83mp?0AG$KMU+A3>r;xm$ z?tx7L?)#td-{&9fpYCTyGh?r>%$xN{av$wB-esE8d=u=R0&1GEHU1DC2Q`uZCjH@VZ&GUy#GnHU8+8D5@T*tJIEF`>Hfm{#EA68I`V; zlPjK;PcENcR#FmF^0}BP_9@z3xU%q0;l!e8#rehkN;;NyEgMokw_--+T-1tfYd2_8 zv_TCW^m=2JMZ&4OJ|*>Tli8*2dn?ah&s2mqo5W-B^zf-kW^d_^$W+ z;y*ILFHjzo9vBhWDR5k19V#-t{HOar^*`<3#(%xvMBg-TrB|khw@0M=1=pL-y_~K& zo_0vHi?DrV{oASz{Ltn99))fp9EE1FeiRCraKC{HQ7P^v4@m86$+E8&aJlyoayR9aV> zQdU;(R_UnzR5hb^75WKI4Tbun<_T;H8w;1zYhnP=i(E{V)4OCl6dkQfR3@8yc2gYo zJ9Tm?bZzMo;$`v5^$zfj@tf)w=r{lG!#BqFj_(oQ6~4oLU--Q6nc#cLH_xY!x4+j` zPmM=6k6`y+uG5_tJ4HF&a=2%E);dw;Z#7Fk6h7KPP+7YT+}3MhFMpQ(pLv4mfU&z_ zvhI3)yf#+jrcr4w*Y>N9LGBq=ZCB-^o?3aXqP*g0WoiXmUR*IBD|2nx{?hTKj%BUN zwPm?jp>E}^D`P4{D-KlTsef0uul-gxQoFBVlYY5DY1(RufnVNm?kbNCD-lRtf}%~C z%vD)pb^S!5w=X&?cu7pdvQ?Sz_$H@+l?P!~!R^62s6i)I(Ob9)Lq=|D- zq-n}mvJ=cfaJ0W-pbbwN;x&GCI_->x#VOgCRhSk56g8+ zA=h4@#gmdVkRZRQq0BB>U->S~*e=$~ZI;>w+5h7h?0ns2kn49>&h4{%qPxmtl1HM) zWlxi5S5KLzhnJ`KF|Spg_MVjuy;!^FDVpnhd#M;s3yK1|_ zn~8^~W;7iRy|F6bKUVPLI2Ue!<+^d9;kRyzZn6Gy!&!~9hS3Dqkm`i$R`r#dFO^Tr zOzJarMvyxb)Dcz3s}j_)>N!<)RgKj*D+($dYUbAtsXnhhUj0bZreRh6XU$TrLC2Wh z8J`*2n3h`7Eu$>sStqCm=ml@#sd$GBr7zQZW{cce`NPV~I?X!7rotxQF419_V~FEJ zN3GLZ=l0G)&Rd<^yUcS5aJlBfy7q9J>bk-;(`~rB*0q(3#kmQhYLr8b{aA-M`}wwq zZF<^Fv|eTPQ=yiJ$p^`8z`cUnnU9I1( z57OGy9@Dfn_?cae$qjpT{$`FH&2F}Yvw?8YxCO_+VmLh*iI3pH-ljjv+AD^^b=TF( zPvvUU!LF_CCDj${mG(ZU!f0)-+ctHmamcezun%@PZXfN?(y6!O3tPFZwL_#+H;2}? zYi%CbthV`N6KxxB{X^bHc2IFZc@4}Mk=RVlh2rN(;VL@RKiDp&uNFtHIcH=~mwfFVzjzEz|ebzpYzeyFs_cWM`#>EL7^W9MS8bBJ@wb690_(Avde zoYNhL(Y6m%J#2Q^^Y*DW|0;hdMPLAiDr;pY6p>asS$~;MRxcgrcTi>p!GyC$(-o-+ z(}r;6wxM%<&S>DqlRoU%`VPAH<|*7VcCXpW5LW+E*PXk{ZPJ;wKa8)F*o1noqO0%oB`@%rChKJZE`iiGrKkWWJ1_E*ygjPYxL61XvwTKs&CX zw9r%|;F7LoRzTlrp|X|rLIndZ@mAGX>pseSd7_n@^>eF*$_(X4>)AFc)k@`awG*8Nx&TzS0I6KZ9Dnv^|Oj8gtamTT+V)?4Vs%zNW{sB?{xu2>umGdMpYk)6su;yW5z z=yTwfv(`L8TVR+*_|rYP>&6O8D)*S5Dyov!QCcpB=?^7nP*7w2GU_e*msJ zP3R=v6~9VuBqhxjbyPL@u{DAx92#GU&)6>nZFOHZUdZF!sSofBwW8igoHT_pGQ;F8 z=|jL+O=GqyJIi;7UeHi|rVydd>JN>w_xw$2gt9+VV(w(*sW{bOVzWgQwgb<-0P3PI zx$jWg*&(cfdO;oW4}F+BWPB-Ymz@$kEn|2Uc+mdRJfR29GCf2K`7ig6p+q<%w9$_M22j2;v5yE|0?nw-Oc3YjDwA zMBFA15f*+o`9XdPN;MJUc;K(*0!5n+4#;k51#?jn`Q212`8L#!0_1M86G9*H4SA1B zC!?hs!ZoO0p8>P8njb2TmK|rp;bm+Rft`W6fFCysT>R}&>|MwGvV0&%DJ7|s@i-4F z16m8!t9{gExTd)>K#8)gpc#2m^0Hi)X31@#<$IFPA-^)sh}-N(;RO(MdEz$GLz=@T z5jOJW(pB!PbP<@y1Swq%BgfF6pk2C+t$#*yslkl;;7n@pb zk+UHnbWg73jiehpVjJd#sHnFY!Z)CEhTFkU7RGX6R@5bW&D zbhR{#Uv8N#oRWW_Q_Ke}|517>lfA+wQ#3u1yKOlyf$b`JLo?gZs0qj!Yq0y8LzOv72xIQat`ddN$N5cPmibWU_yKSc zxXN_5@cd2X3i( ziVgcYi7zB8pnhD-7D=AKB4-i@I7gv^E+j|7@wWrLMR8VqZ(JswQrw`Rz5$hu`{Gc= zDus^su`HoF$ls9jskhWU@u^Tkdv)kT_UMkr&7h0$DqT>O!t3Cos?C zR)jr24J!P>c>X=)IntR}L}kj{q2}O4JR}|DUQ`(Okv~RRdSY%8fJ?I@gw%fkhNh3Cvfp%a+W>%?;D zfS}@X3d5Bl3_0mOll{8+~AhzOeOQQHr+7DIqXYiwq z5ZuY7)OWCo1`>`!7CVZrvYtV#)j5mN)`OV8j!G`XV)~=3u{2*)${JBk;dyh4;i;=q zG!VIdbc2k8V%SHp$Nv)}_^#9?I3OgmXQXxV{Zs_13~sWfY>4N!zXn`C39_|h2MkI(cq%Ba*+sbReLNrR7 zC^I<)UH}qb4)pCs?woW&{#bBgTgl3maiVCNM}1MoODp-#OiNj$*p)lLd{Tvx1QgnC zD1RzHa&K90+~cKS89oF?Z?DjU@Kh|JMw%^LAK5{u(_8>Q@f3d+o)%ym11Ee|(z4Ec z5wo0(GTnd@?hKhxd}Y1?Z<1ZoQdICgz)V{~Un9zlp_Y~O2bsW4)P3R4$XoFTOi|Pb z!rwH6{YXuKzkyEwl-o!*r^2L2(TQ7QE|VrG6R7^CRK26L-f9kGva~aw;|1!WYzbj9 zkKxSBa>V;X;&r0A)J9w_-Jvdlwd#tqz$9Wgbq%QAA=F25q|`{XBQs=b=v=af_L8-A zgbdn+>|@zV3my%DJL39W52e9wp49Gjn_eeAN9^`PvDA`l+3TvT?6C&?TC38w58`=%;;2~Nm zb%A>DEO|F5W-WrU{4cr>wFZ8fr$`llo=j0*Cl_04_!V$}S3tpJ9q`8-xlw9Q?4de< zKXDTpBhKPk`Y5du^EjRu4^IVup;#IN--zYhFX=kjhhL8DWQv&1KL=8LH1Scq&ILhL zY!DnKc5;279PkbG`Tl$_mL=!ORuf<0fwPf*1y411F$)p2CA}WXHzV0}+E%q)+F-sc z>gm?Zd@`N?Px!-plhq+grh*;zgkC1UPELl>qKQ&4e}JK{0z1E>*jhGRE{L1>lk^hB zU8p_w0Ke`#@exY0;2DFx7)C1L4!?}D5x<&WNUfC?GQ;wm?MV2`k5ZS|dLacqlIx*I zl0~zWJ(tA~glgefeh;sK7wc8w39lt@(O%MEF(3NoEs688pTtH>KW;l5V_q;v`K=~5 z;S_CPY^f8%LqS1-_s5?lkIEb*nPokHpK)Vsp}IPdI%j#yRmzvkzwmL~ajJyzAl~rL z#W}dXKmxS@@dgQRVab>Imwq6e6?)KbnF??d$1qKpLOz3=Pv4QxBl>b}q))UUPGZjx zf8?9!g+e0lO7)kelE=l#L>DRpIZTf95KQRLBkTz>1W1|N#9A^`O2_HISMsK&)2pRawuC=Ry{6M8wXg>IYpgH}oQdx6>3t1n z$i>u2FwAHwUzjeanHyAk1cwrNl!161N1^%@)X@nh1$psjwP+whN*POop?>Rnk>xFwSCcKrb|t zOJWn@^EaLQSIQyUvAx(e=*WJz3@}fIf7was9|oGcT2@LgsKHWCb{Th?*d%S^Mv8$H z*x15IxKE7&vjmNCQ6{Xw9y^ymVM!7XP*6I86C4Nb{|QmU<ezWI891`mzZ2UM4Y2XkU?Au??C-^g;hzNc|v$YB%p8QLKKQ^xE^9xnT95X zBV4g~5DdznV78`WU+V?FdzSDK8vdwSvwhg-)Hc})X%xqaF61zgCcn$Fi0`Zw_PjGx zJIX>Sh`ER+Ub4kdkC`n+NL!%~;3NA+&EZ41!IZbvQQ2_8mw!usmHE+MpyiSUg#Ja^ zR?fj4Yz|*dO=KE@M>mpEAp7hO-Gb|+9vT4!P+7pK0lQ##K2@+FYZ*aLm0Iyb#FlWe z`$mnFF7tQ9d*J8QN?n2O-yrtGo_&*SPb`3nY#(V4Q4a;C#?pGIQS29H6MLau7sQI} zNob5`SawOY!btd;5-oPJR>~-1F*jBmf_!EN`HPac5o|Ne7+<(Zt^p7DBC_kNln=3j z+arqfB8n9cK=aBD`9cNt68?KrxgGon;stb^x(f@~G~p@LR#ri)B_FX&>IUcJcp^~@ zf>z07as{-p4uMBmOAMvEQ}y5yPlI#ONcbds6EmbLAqJi}2jQF8p9v>d3rB<}l8TOH zz7ofTA$%9%3^h;Yg&OHEyr=8PlK0X-!8QuUiSU>3|42Fq@W!^TkH@yz)R<039d&H` zj&;Yj?U{~kcWm2chqc?-=1Fq$t^0mYp0vr6laq5c)?Rz>_5ZDCWF6)j;V*74S-J0Y?ql#l93=ZGs{d1k11fm+V3cUvGgr%TJS&gEx)7Vs26zTKbP>h_n*K^qyex=eAjW`>;(_I`0qp@~t{TiPsMFoJxiL&%tzpI)PeS<6=+dTqDaIH#5pP60C}V~p%Xx*a0?g!^J9HrC0vZ} zfXx66%0EE0*$`tB&J&tLeoJfQDrP-y_J7$*qAbXe*$ieWy)k`(!J2~}LHA$+*jfxf z_6-={hp?~l)z~$l6{mq-m4M}d#vOxc0(#_iFoXIOTMSCacaW!{8C(|^*B3V(_Y_oq zmp}u^2VN}`v|oC35@auE0s09M=5~~dT|zM68iTGOAKRSJ3jZng45dRJF9KGBsYBJ# z55WJpjE#X}{3*5>_&72w7Wg_&Obz-3X1eEq7vMnC(IGK8kQ#1)D!vr0FFsE1LYVr2p+=LP7V&jSf&HR!OeVw+>vU><;`u*5UgU+5G z^P`P{=sp_qc^`q?We=g%&5xVG1^!N_#0p) zK#4RN&S-&e32~+ym93d7yv%3>m?TV1&B_ zis)8AV^E@rkP9Rel#rc36}=XnhzNTLXmV#z=4(N~hz#ljX5noO?V>gSW$?8 z#{3j0*)Ks>!@cnSDQG<>N8grT6rUJS=@p@&b5m4RN84DIv}j4(N%n_LCD zMG=rjQb3vGh3{U6($dA~pdW1o1eA`L*>KE6$P(HX-oFNIbpq(-RsgXo0JQXUP?~Zv z$)La7gSiaark$Yi&c$rTYyk2|29U5gpf$BXO)-I^(-pW41UPmL)apu5u>Qc51K;5e z#BrPeRbdSDg%21(HNO~WJl=t&`wR-#e2f8(`2&AH zfvS&;)xvM?16n~9Fg@0QD%KA~m6xE|t%c7DFxTLmH5e1Hg>|64%>y-?4D3KY9RD7U zvtSOw{mp`7c)+iC3)l4>bdI%{*4VaK@&B}rCO9i3F9Id+9MCzlfz^@+>ZD#kPZ$e2 z-?2ck(8A|gSQ~sR1Pqp&m?&trkAqV87pPD-V6x!+dobIfWR_$4V+O)~+=mid1Wb`V za1GCZtkDsah}|#|V6RLD3S%nN%TiD%{(>t34iOyv7WBvqF*s026QM3yprEpXn)eiZ zo(ot13UdI?d<0@*&SU<;3GJIA9 zmh(EC<1?J;I~;9<*+CtsnYY0IMWCuZ2wL0zFozfmz5ghDhXPrWSA*Tq{f{m20j_pD zyb8sfa7~9}HW&f6!K(>y&tD*Cg%oP!8!(-^!}Zm``5(f&$8g*$;72S6M#DMKoZkl( z`V5FsBfz>&v)B{3t6|X7PeTu!0sZwbe4Y#*BMo>E;@Drb6_98s(6<+XI=yL(419<= zV22)n=iV+Rfh+xgjzuSk>&XIIMi@w5O@Jj)0qY|^i1`@>9GUAtX1N->3mV-P@cuP$ z3W`t;Sn_(H({_Qf@&qt)Sg~`cJT@h!M^B-4R2<6(n!_!$22FuAx&Q3v8n7cYAV?g9 zQfUCT`Ufa9M*?SKEnGJW^|}}COa*Fl73MGGLmvj#!U~k0TR{9EfPVi5uz>!?PC{Gz zkDb8=&Ecy>bhvf&JcUcEJfgI8i>i9E!z7V(s$-n~9K^tocc47ncz0Y75K7##w06k+ja116x+g|`Z z_&6|;$}s_87$t+&{~CDBZNNfw!6pG?=^I$JG_Vai;8E0pW$O$)hHfy*qCmm7gFT7? z=ixrsqo=U0mImY4W3W~t1nAPn??_w8Za$boOphV#jx?VNxkM?eYY0B30i^eHloBTs-{ zuna7JA&dk&Kr{aa?&>(^5NKqtg7vP05<04?gmXrLlyDaQXF}bLgLd5wEZY>A zWf_3{k`8pN|A;?7p>>=GHbhfkCH!Z#KEN3I5^NF~DCsX?RIP?ya|Fh-F;H4T@NLGx z*$BXq&;n7a3)r`YP*R=XuE&90o&*}-)iAPjgYx+Ytm_>36(*EWA{;RTJ}U<=B?&`^ za;t_jra}pJfxZQ#RT%r1g6&{|1zQBHm*iL?^wv7?7l*Vts2K+#Uz~7k&zSU^p4@6NJ z&@Ku8>w{6~cO0+*TjAG9Fa!Ms){p|%8wBE3Hw+%EI{`{V2qQ=iki|Su9s{A4Nl=S@ zVf;z~uOJnC0U3N^f)U^V#OzLoK4u5~JQrp+ZJ{?yz<(nGErt~P0sR^>S%XdN0KeZJ z?4S+p3)f=soKwKE_!jF6<2wm60d)KXXi;P+ z#lB!`Zh{Vd3V11hfkQPJM&{N)COH6Ob6;p3?Xe{6XJ|tjpq90RmNEf*3%DtH*e5{Q zZ~*748`QxK@Mrem&4h)RU0@$aL{5ixB5tHxxDYuOtPAx*9|0%N2=kjx(4K85NDafY zAiIzl*@cvapG98*xv&k8n-cJu1P@^lp$;N6a zNPwAO1Mm7j&)JCXjJhKGqBkLH*-5k?%)q|jPGXmW&i*K>2i|af=h9^6WXL569@LD0_*`E+W@Rw7Iq3|5R3;MpcPsnV(t-U9!3wja85#h zUI2Yz2#kzr(DKv33-N%D*ah0V9gegB+aeD<%P83POlY~2z)G%w9=#fR+5>n$6g=d2 z&_<0w55dEn@HPswV#on92-?nCuoVA|As@k#pMf5T1&`z-W;ymOP^vlsf8Zz7_XMcf zFlHt8A<#I;xI`Qdmk->P=}?>3pdYote1Pmb`=Fohg?U8}Xj3oYI_h9n^BvY=8$l-M zrI53aiyMrchFJ|W+2N4EJq_}8xKKG*o@|)Y-G%m$i~RsI=0UgtI2mMJ>4R$kYscGQ zrack23%3(@1$HdfLGF|QFnV&Zf54(fL$oRSEp`c7;y&D4{663hxbQi^{Yt^DfcbHKn2i#k--LkI z9mV|%>%t94>0}RyPPz_S_ZPSTjL5&CU(SK~`#}6T0+y&IXo2Dof@@^}=MZ*Gp?}`T zjKem=O~Ca8LiI?f&#BS9c>-og-J{PV10%6;YNSP^EIc~$ z3b>NrVby9dc$>YzUwQ&(uLhb%5qJ=J;HeMCK8L!*1No^EEc->EiZO5p2#X23fvBDn zTL$Nw6}6x|XbaiUE-!&!Zu@UOf*y_5M6}_p2nlJ4@Ninc3DuJ4ohieKXM>qV!JQ%|l zfL}cjI2Y%!25cHG2E>67c);_a?=%LR@DHXxTs0A>YwhrTU;?laX9d<#Ti|rY0m0!0 zl=n86mmP+cg=J_PG#mIWPr$=l0!+ly@I4czL985zdsm{Vz}0#ZrNL}+33w#=z{h+I zEqV{wy9eNzodBQiC7KWRS&#kzzBC&fftk;9%ya0=tH2gE2TI*m7@@wx_(cJG_Ft=8 ziM@n511kW%Vh>R}u>Kl?WmyKk8y|YYS9D)AKhg>;)FYsUKMeCD#)va|AH1tfU~KMy zRsG)4?vV*$1nCDX9&h+&Bn|xyp5hd!dujB3q<3U%_zSWg=?_eSnc*GLH>eKX5c?Oh zdA=eu34P(}9!C3znj_<)yJ3%7iyp=DaJR61@cD!ZK)QGf`wN4>tLTqS!qvyS@G`RCXR z= zJQ1M*4RL!^2_EttuuwB%t-%Y|KrMU++D*sklIXW+d+@R6!)GM$P5QvBb{ed`#z7{v zvB1QUK*p3_=vACq5<~0M$kgX(MS9=@zLQ`60O%nMJN5kE4{3N0Qe<#1V_~ z8~7m`$zRCL$RyG%;JO?qwjm-gp1dXuC0L=%9^>#3op}Rn%~*CDTKh-%R(RKVX1JTXZaUKK0$Z)6hdItP);PzoT>nKkSSQ!v zbqw8D-2vSnUA2CJakY80?Ua-3%?&g~UWV62egM5@IB-*TN6to1$8vE7Vvu^0)tP@( z?2-8tua()#mvTg^6JtaiVL#y&QJG}1To$(=9-BBfu{>d9e68}R?1PBRZ_4S&I>eYx z9}ZDtLB>4hDP~jVZ~9Ftnfwgj2DtnNq*W+2csig9d=Bmp5s;3^Y@`9g4$TS_`$l-H z+_znPSGtSn9^?7!ZS4OL=o-Qxg`wpkXYgGh9dsmV?(WWu_Kh~g`oNlR71*S<7`(z; zUFNZ-Glr>poIa$x3y&lE7lubhy9u?tcRclO3>Cm`emfux&4(z-mbe>OA$A1zIc_6y z3)RY0^Y%%waqSYvC$~?wB$mg&Q#O$`5uXwE5bhMN6YZ6pkw1j7sJ^3d=pS3& zxZHu((RSD=_{$IpwhOx%Y*;MzFLoGV7G)Z96aTDiZvsEu>&}={=HBUT6PO*^ z8#YI~K~~;8h-T8`+YpmT=SU67X7YZDgEEBLnRbsZWJ*~1tT^^@7M1y#mOx<>KVq+g zu5?kbmv5H)qocL$wRx6thJJyT0jlkk%8_Nyigy*xE;v~5ps;%}rnI7LRK?NC=ha8m z?~K1)g2+pPmln_7%4xuw4=J~6iOJ*~ii+;%hCQ-|M}73hyO?Rube+;3f302EZJRNQqw}e+ujICBH!R{l^j$|Rn|$J z{L}0StZLSA&TGLR+5PxMsq3;jH4C=B+u?1ejva+<^0UWh%#Gs+|FW{^_b4iIA*mI4 zI{7F$iIPO=N4k$oL=OP2@rz}(p;}uC`is-*p4tz(VTS#tEbARR+cnP<^K}m)k!9fV zZp3EdJK#6My!`>5M_x&7<_=Ew~|yll+ycO z|82teoF6_QEVL^5QE{+#gYKN=iANI+P%n#)ChW;@XBo3@WQf#1Ig?C{FlJ+y?ymO*|WG@wym75fP*)-{N z$tX#NbeQahyuC6>bquIS_Jn?k%!J9xQIa6f$Y?>@jfq57A&g)@|0!RoceSUVdzdTY z7-)ZB(I>_8GB8RDVow)UDJq zwNrH641VKBOBd&L@3p{JWPfZ1;VtD~jnuEYopAEhUXZzR6W)HJ%;SkPc+YJsA@Ad{6y3xc1KM_a%w=1da)ko{EECeo8$ ztL{i%vL4`>p`hcKsg=G`dr-SXH_5Qflxt~auXR3hkMx%NruuXIef_e)te__JJNyal zf*VG(lNZu-jEU^?yicMmIV1jJN^-rMnS#vI8P8MqCj29}3zu_q8419n*$BS)bJ%gY z5}OZmbYFBGGSjbg-?lwA?bA2Y>eR>J!O(2bPSLk8_BKDac5qyA5xmR%XM+6@b=Vpq zMJQJk+PcGf*E+z4bxibF zkfwyCta6DV-kuyxCL}D8WeSw+g|zWxDH$Q>QJTgn$Bdv5rq2R;O|k+et#x+*pmcD#Pz?Zj$wl)8cOjAdhw;B4a5 zaa!}df?krz@`Z5&5_TolOZX7yQT&m`i_h>nuqIPC;h#nuhj#h(J_(eh*}ougz<<$O z=x*d1?zm-JX5DWoFjLJZOgUzi#b)Vhf8)CCJsdz0O|%bYIqnJmIN=s}kB7jsXoKpjAgE3Q}`>zALLzCYZJyMDB{LTu5oYBRD`V9hH%GV zoL}X;?5P4~0MC8U-PMElO%1FHoeUp>tXV|_BUwW4#yrEKb68v|_de$*XD#;;Z=Jv^ zlFE)N>&5?wPmRxy>#Eow!3&14t7%!J7nq^p0fDdH`)-AcFVh`;wZA8wrQ-@ z)=$=`wa&K7j&Xc*oN``w?ee_$4GL<)7a`ASZ=#8Oka`Q^@ZZr(XpN{_NKwea+7J=@ z|8;M%cd}eD#&lOS&+5L^jH}jG{i%vnIjj5CT5B`wwyFE+@=YnOHsM0jT3&0#kHiBh ztmMb46!{0yeqK*bjO}4_IE%S01=V7@qGkNyBvs10q`oS>q?&txR*f%3waC&yd*3Ec zmMhmW&2h)UbPjht_dNB#2^BntCS9IIN!U`wZXB@-pVepKd=q6b+cWub+K32?>P#c z_gz$X*yV7wbDwmVyFYp!`WgkBhi{>ia05u+s1q1tS-aUs*cVy57-`f$gp$}WH^%4k+5J}o8-imYs(N>9EN&e!g_1}!(361-!moIj^-~rbs0jB&A8oqL-Xkv@3*T=;F{{AH{Rhx!=Cs z`oR1RuG(Y{TRS^fc}s$4fihM{D5TWTyRsYbhl_ei4oNr3cFXQcCDLk12gy818(BoQ zMS4QALLwFY=AK~HXY8l6A}BE@!Uz0?u5&iAd6{9b{-i$5@W{~E)Y$UX+RW~A+;PQu zPIRGyjI#Bkr&|IvO%u^B{9>HgzCvFnu+{&RD|uN$*b^Ozwv7i(U?Xam#ES zjWTWfT3OZWa(n5E5_j>E;*-UPN-9dr%3hb3SA;5ORJ&@!TA@YeT^~D7pC+D}ke1## z^K8A+RBGaC<$5VoEEUBIGX)xcKEH_nNRTM%CLSrS5&C)WSv{$P@C=lLZ~|kzRQCYq zCi@2~%i7FZX^q&=xjp_b;Z*DkQfEdS7cbl(IVUerVpYRb^;H++N|e79ujLKpbL1uR z*YbAq<+7Giy!aE)%qB3vSH*vg)&^DH1CHC4XGW4?q&}u=sDEr|XI^GKYCq~a?Y-sS z5xftvOS#cguyS%4;xEgwLi~8bPGSbR8#R@Fi1CPdh(%*>V*O;CpyiV<;t!(JLpi`6 znqbmum(|Uz{!tMq`&OD(`m$tx$)6H^slCiq-n{Z$)#;iH^>E!dv&=1xkSI$9IVwf^ z#|DN*^&7m+xR7!iyb80ZiI64O$eYVO#P#uN1&u_VMT>=R`DvUnw9oh)RE&)FSGw0Y z(;X4pW9v!_)6xYz#xbsZ@9WUh*lXfY`XSCs;RcybxfJ+P{`j)^X{tQsc*OxZMSfb= zSGHF+Sk9GKO1=y401@mc?I7_t=1OF6aFAye_{2{PI9GY+tvvlHFj zd?SM$AX8a&Y$*00+*h0c{{w%P(2;nNR7rVEYr*)+FMU4wL7rZJU6s;(3QaYl1NM*xnYHfmggs#1r?7E0>$V|Zl z)v*kFqfgnl8kg7qnYKK!okA#nAQ13(aL%&cvAk>yw?1zizde62*T$@*+{3vdLxU&1 zQ(gD%R?zu(FjpC?j7esk)onlISrs}ETS%;+@8wy=Pvm&j(*$OcFVU88H-3|NbrEp~7x_+dI zVT*T3eXoPvBV8fKYcWKK*Ctd!4)g2rq-OSyP!=l&2>Br zJi=XIf0SQLX_z&=aZclvS)EN%_(Sk{#lUqHBVY+_B6#)CI(H%){_Ae_JNWuM%ehJC^E8G|C9<$XjTGv=pS~t4x zdEH#iSiQ?sXrsCZ`*FzQ$UDf#lnCqi6v$xc!Byhr#7U%qlqRqhx-myga3nSB=z&)qAuq z!woCf6Cc4+-UyQ7#Ti2zwrKLCkt36r)->r}+R4Pp&h=o@>QhPMVy?Y|}7vd+RWV&vP)eKUPkZG2U`li40Pf zqJ#32^03mZ;3*c#J+dJ(g)AsTS*iR8(xQDG~H}WeQjK$*?5%!VS z(DE4XVa=r*w*mJ&N5Fo-Xb#>;Eq*Ew&fWEa?su(B>7_D~qconmML1uDb9%>O!$1DU$iQao6mkhGR26CdL%U#FP1( zxLQtUPB+eTu7h7E{3>oIT`Z9Z?{Y@da|tEU!r*JK-$}OXEv2S9gGt}nu-kajJjpKe zc0uTvIMQgwSuP(G+9zOzW;=ZIn3yWA7Nv?WiwzQ{yruGH+)7nj)o$e(*(XsBZz^*p z#gEH~(u4iH)z076E+(2`wT_~dYOZQN>ed;XSu8fAlke^7CkCzu&IgUblfnGp{SYpU zL_)Dc_$A~G^a7TbGlBPzw}-o!eVcIzH2N{z?U*$(26+&u^=e$d?RzbVVU>1QoxXZd zWny`=(woI!ieiO53zrvmDr!}{4%R-}m#eD0wF&y4Hd630!OT0WYM-&VQU9j%n#9+~ zr96-OCL!?evpO>`GTqE4tO?xB!Uobuvi7pM5`&-z8zB$F)I(nSHo15AHdR`HYYn|Xp9G?Wz zmN-<_Q{>=yX_p8V^jGMHm*PBN6`OO6WW!~BSHnT0*!;rs##ZiF=$hpYxz~D#KrQ!s zR>1oAM}J}PLbxyJyd0!iv@uK$8^@W#Im;HZjxe^+mXUW7M7VyjO_3zzQULXKbN6&K zw5m**`X!pG+NA1p701e!m9#3lQot@K{!1!oP?%9Xw$xw#w~AS3)Ag~f^gqEW*!2{j zQriOoxpzZpJ!4`&c}F3EJBAfy64*?RiQ7haL()Y4S0Pn4mwy#4;xwW@!+MeFK8tg! zZMdb#bj;{Bv@(7+^|6k3%@w~Ey_yy-*x{jEL=@_06;Ce^8>N)=7NwBOgOOa)%^_Xpn-EP0- z$aTiMa$O|%CHGih47BiF^e2SIL~OADz9*#vV;XxHw~9NL+lBKF%RnDXHIr@=rs5!? z64gLPjS)yBxF#^sx7^KlthKx{khN=T`G|!Ktmh5h<$)pL~XH+oe zGIz5~?2}v#@GmFGro`D3L@EBX))}ekSt%(A!xc+JyV+^fbb>lo6Mh~n@;iNVeM`Jz z&ph`$x7lTM_Hp)d<~UC{!gi74rK7*|s&lD}#M7j~l&7>-OboDUhD+KgS&8`6vh;rS_GHXTeVY)ca0m~x zFH;*46L9&le&{jKE^dz;2@e2%$2tExZ>IZ^qqi;7QfHcDT5oD%-fl^;?Y7rBuDMvi z&Ekig;W@DaTstC#e2}u7dX74n`i|0+vVnYu#3IclY6%|*mkDx0Zy>ULjh%|mrg8SU-7AOO!e|wrMA@c(ls~2pl%fm zSCW(8rxm7J5;7Ggagks(w-2m>wCC>;PLUi_j80gZlAX3LMVYWzK0>gAejZm4z8`qu zz2+M45IbUy0nU0(woC8s?;Y-Y=5l%k zj@AOp4$DFd!`jZ4Za-)r?nrd4@K}Avg4aPs^B%hwa)QbXAHx|^@)FKPI7@zwN-E2T*B=AtQuvcju{*Nc$i z$)(@RtQE^@ere^_XTE#bT$W7Ai8m#sCHIOCOS1$uoQdp-torQBkkYL}#!_V_lQRBh zF3en%rj92|J96fe|HLjK^@HR6sosdYnP;J=nMdF`;_2+2>h0+5<{jtVUHi5p4=9#_KLwuN;x^GqHW*qWI~`Ea^Xj0L(OI(b+UIHH+GfMyAiF zJ*Au`$q5rN7s9OqRUX7S$iC8AW?@>dTaVjL+ebMiL9DL^A0v1(_zx1?L~+oJg5Nb#7`*5z@PzpI+oPSu_>|8NhC)~9yk<7IYbVcbu-M%a}z zk=c+DrM;z-IctS^vW4;f)W7woH5%NgbN$sRvy~qNCG@xWF6gxIkkG)udVljk_n;vN ziacZo;tMH5MFF8d(bvdF@lE!MydS-lzBm5GK}UEjrV()q4Z~?6#LFs_MinN$ATC#N zTcYJxvsXgCg|75{^g+yBY%{E5e&=Lz-Y~mU4-nR2WRd9sx_6R$xNDd5igQ0O=_=gm zo|T?E@Yv~D=PCB=^-lEl@^1??4izEYBbCu(u?*}%P$*6#o+JGtU!c6FWKo3VUBsPu zCH4-Q7kQ32g2Mv4egArtuA}z(7MW3?Q<-DhLpo}87Am>uYuxE=Z6?2l9^#(M|X)?9(uKE*G_A6%! zvze_(@wnZPyYm5LFAvp?c(MMDfqkLM zh!%5&NT6@yqzi@M3-y#)CA~#k`8AxWuyS&RafBJi9?LcG-w5+W+hDh!%+oX5QnwOR zm}ZfQAv7>FKnwH^Tn>B*TnPN|ANRfWKJ)Z-w{%@`c5!Aq?>XPOx_a9CHV2-Dio#@+ zjM)P7@%jWA@gE|VIDxPYzZ5qBI~tT5F32#oJvum&j}!)Le2d-99lI@i4MeTAwrzE% zN^kkX@|)#@D-tT_RAyFwsq9;GQbRT`^c;*~>63VPkx`T)IK~`9;^7)Wrl)K8X_N=- zrsBbIzLexFbK_OnqZ&KwMH0G6*K_yL_7lHAE}Y~yY^jdN&I}-q-41R7Eno(58Fe4i$IjsNWVdD=WXuLq`zy*Fs)b(2 z+RvROSSda$?JU~_D`tcEE!p|B_N2u)EaoL-kDC=e865;M%)6tlB8!oh!D3%W&q3!A z`#RevYgg+`>o(h9M}3#XlkQ6lgoAUDf5J^7sgP^yNpwxLakK#_FRw*gg4Toxk-&Q( zGWP&Vie5)L299_#ooB5&;}Bhcb<5hz)nlt*EUR8zL#-WIJD~P`?Gg2R9ourn(+6Eh zb}-hmzq0Q$=95-o;vpWiAl4hFpcvWN;^uK%QVf}|8e$ubsJ}FYuWTn&vr4HSNqMao>xjR{6cX2>;)!;1EDjJt0rj4#=9s#@&fsiwp|Y`mVaKIBr|RCX*qmb86P9>#3)! zpQ)vqE*g(|pcMcy|9{*K3T2R7X#3-R-STi}TxM|##+&u0u&L3u!_K~~+{}kkK$}&SY5M9}1;K@ZS$|A;xrCv^i*h4x)Nc&W(zc1NrwjdJMaX$fb>7ZQ~{hnu?+# zvuKZqB9!r5tmBL^unTg8<^>whFeaYap0S30n;IsC@v|@=BBx-d>4oRFD;GF>9USu< zBxlIUck?`KuiW?5XY+aCam|7rVew!fyM#-i5N?XMkH^QOk4{$UW=Yy1~5aPtf0C50w2Qj(HnZQe^4N#DTK-lcQ&cEy zBD}*Ss8vAG+$uejd03S949O!ox$dG~Zr zsdu5jO>hu0CQ=WS%9kNJ-4FViZZR2pI1)u(h9(3Z{uRzt?oHeW^ZU5IDXB+Qr%vzK}9V#n_$U9{z`(sAr|W2XH&Ck&m(QBA@(d zB0v3jMvF93k}&SE#K?DX)^J+!u);~=$C7K(XR=z^5~)HwMBw6t8AmB%!bJ>d*CLNX z9Rsg?TfOr<7|(vsE$?;6jD-(04JZP?!NVTvJ@1x5G+2RSnH%-J4{1>zp)>g$wGrb0 z^B%K`na$eD6ftb{9Og7ucTP2bfq1`kv#gJ-PGS%p6==B<_GQK$+H}e};v{?kA}!ls zp2jNC15s=EZ>VR$;O*ftxJEh0f`9kN{>#42am;CT6?k6x2!YbT8W^nu!Emr&=y`|) z5ngtrPk3LL63LJFfR=eBydL=zxbL0rI&Yh2E;6js9oF90?$S=sq8hvUsJc?qQ(t6` zx>kp>Vmly$W+)~*ay(G!LEV1u@4(3LYRq)f2S#r}o!pzyH1%g1HC2+}mZgg>@F(y# z@_q}#VzI1|JY6AI&Qe~0z1e1xa=~?ukl`TTBDBNFFqfk#;pU-RflaVO8}Xw7Z!kI3 zFE}dD%|FmP+@0ydI-l5^+56kYj!&+}{w>IGG!-|Bs3PwqParQL(<$pHhbRfuOSD@I z8*4gug5b7zgzTAIsyHRjmQ9i*iH7lya^|o$Gdj^aQ?8Mpk~@&UkyerZB@V(rz}$;| zL|O-fK9%>A`;%*w>j>=pb%!3S^#1my`mBnL(<9>zV~Mf8@rC}YPN^H9P1HGz4*N4-=kUMi;+PQi zg>rl~uEx$q&V%kbK5eiU+Ll;Lr}A1#9E#p?3l*CsCHzEAQ`R=-7?uj|W})b;I8U-g zDwH*mjgmGIj}dI;j$)P5QYdFhGl>uJhp<;6gL<>*^+dX_niq*6^+LS@HQwE> z8TN}-mGy+Rt^J(ys3+eq4|PKZgoj58BK}A*WQQz{xT23?wXqFuIPB=%g|#CMvlF{B zC&a$VcC&l4yR&++Ii|pa(nLally{=-2uu1ZD*i19$u%e8;_yJs;egU6Y)1 z9MkM`Y%8pXEgdY4Ef39Flh1g}favP9I33N9WI5FOT(j*W+ZWpd z$1hhY#1h)j)dZBfl68wy#6HfLNEu7`0GU^hLaam+$`~4!(S|8yrLm83^0+%8Dx?|P z!KkF6kU7msWzf3PoKztdOT9;JLo?GB(WA5oRZYQ@w-8R@wql!MdZ6Oy>gXQu<`!Wd z0{Q7UZWFdCMi@&(r$*mJ+~H2)&Ec~UvF(VaL7Z~}#I9?w>v4l2E8=Zn>P2uaPyr3a zvT%Q4W&0OFOQezAyTrU zE!mQ1ysO`&JEPsF-Jzdr-e^DU>I|9J_PNg4`&){PXAC_JKErg=2ur}W$Hnr$L+of0 zZY%I4UdCQUejq#~3mF!k5nUbAU|vD?JO_Rqu`4;BGLsrlT}XLIrjo;?et-=d%(}(x zBJ3sIr#PY{D2FRX!LHc_VG5tf<+8`JgzQ`n!h0ebB6}|XEW0T=B*bu^(|?mOBn{yo z{0^)XvkdY`V?hOT9#jkqV)GzR*HvUqXnUwlNE+-Pxab%7xSkKLsOzOC*}pbeigbx~ z0`^TdWYdj-Ug|!&E3y%pABsboMQYHlxPM9asg3D3={bz8jG>H7h97dQX=$ajh4fVn z8fy?|C(p(IB4{jZEKGyU7yk;b@z3y1a#k~&(_WHuiEO+bGcD$ij*p1KQp6ps2G9Ds zZ-%GTS>Ha*^2g}Z*XqXU+UXK?7~LdYRM$bjNdHZrZMbcyHW&?l1IF0Sc-iPN4l+GA z;muRcR`UVN9BY4@3G$l#v5#~7b|{=Ho!wkJAzMkVZ&RQbazEMtYbH#mzGbZwoROYU zE|0&Mz)a|@+N;Qw_7@vO-6bbvSC#V<#-{8_Z(MIRJpN>uQ$HmvRJ;^l;jvg0dKxvC zl1Hf^8;FnaF>FsvIywVr|A#|I0x!LY^O!BiQfut5zoTuZ4QmKmfo_^XV?J&-!u~DZ zPx5noNuHjrbIvN~5m$-(gjeIg7XoGu<^*9nT(mbKD;(S5^z3`s&qVrB!uYcc!gGVCePmCy^Q-->H62z<=fMvBZCy{TQZq#TU)=GDy2W)P>L6yYwyO4c zZO_`qwg1#Uu5D9yw$4~5R<~8}Ru`)S>OmTYHl|hTXBaLTBPNSwl)cE=(c|*Phn__+ z*a@VTjDNW+gkvN&>3UgbS(W65c#34GEF{0Aq{QnIYg3Hr_cQlqr8k(KWvQo1yP8Bz zxDlsTe3d_xp^|N)8~kKgXJ@mTF+$Y+x+|oMUzQJj71GPU;8~llkjZVfa#rugL z$&0DO=rKks)>5{gbA-20@Ib_sc9yqLl2m8n^AcVrbWG?M-%2$yE?K!n-clBl{41u2 zehR4k-{1{I=-a6E$e#!kflMMqE#b={lmDIPGjQDpSdW`orWb|{`gJ;^cBR#=!;gt%+kur^sZ{Xt8BorW~w^Ir73$T zp2}0?{bg~|A>trJVJJ9Xf$UsKwUDcb-|#=MA7YE67NkdTwQq}inPZamp6Q)orhbQx zqx+)$SNl|>R_p6@wZCf$t8vxitNvF0TN$X>RH3N&4q3R?l%FW~l~1e)RFJA#RPV0Y zTbHjX)e()o%ss4W_UX=>o+ZIy=n6cGe1NuqRmGXk)o|zYhYE*_8i;#Ha};mlBnhd> zFVim66W4EBe}86fy@eT_fS_+l{g^r~WpI)$UK*F8I4(<&1cd@&nE!~2Wm^~*ft{Z~ zkrR2iYv@j-$UoU@b{}xHac=+LI>a}d*tXirw*Il)u~02%OjnGDjDL+@V-pj_Y&0t@ zn=PlUa(f%+HMiI&4n~omk+x_kb_UDCUn4XmEr4i;)ig20jm_l73j`vocn_@ctd^N& z9pr1|zvQ3fE#$*w66pzXeNmBMCO^pC!Ev&(n0M)OX?*G;@=#(SE)ye<-VYu1|MJLO zM*Cu0n$>0|n418*y~2_ntvEgL66H57pD~PenZ1@Br`s)pmC!nv^W6=1j2=Lb08OeZE*bLKuEyUa*hyEZBE}2Y zyPCsU!d3Fl@#^y*@fm_F0m^U94{;xIP601}C36(xBJCNaCpnEIC8iK^@Y8U!uuo$> zqT`Uhfur7h_Y>D_=NUT>^5NVC-}8rgf%%W=g>keYQ=g;D)~0KAsAs6>s++0b*LANe zuRU3NyB1T|2woqpTdnqKM(QT(FBs~XwnH>ty1kief%jx!dU$JW7j7D1DCs(7Ev+BD z0mI8&#tyOHbAIvW3(ew{GOqGn+-_B)_;K;<_`dPu6Yz;U6K=$BSG`a+Q*@U5q&vaZ z9uSoZJiPi`BiqZK&RNUOWB#EZrxuY~5+>oWSSFB3--RzA149ji$$@!kV@oEq+M(XHjE44=Mrp$zQl7x zDTz;hMQK4BK%dS?VXkEAncr9}4i*U0Ih;MLam*lN5@P_p8*Lx;52c8Fnk4*h4G-T1 z@5BwkHNbX{IU-k(f?%J(dEa*r&ArFD#&OX8(ALQ|#J0zF)0S()*mzdG*<CAo*Ih4bC%$mXJ%j+wcFJeoAlD*P1vObC)O1AR4Vz;8Z;-x$$(@S$C z{Y9-|jpMIiD1R#V3;PdiJ8Lw{%k0Z^&{Z@!^#Y|C`4Axi=Lbb%f1nf1fxVuj@DJoR zatE1%aFKMR5NQLtpD&?}q3)qq!M(v7koos_aA>F=G6a~py+M1)z@uc5-pBChdvSV{)*_UXclS$^*4C{(6@IJ;(>kF9rD$W z1a+pT$Q_8Ro5KwfVdGmU)^5Yx`#BIP;w+Tvyy!?^oaQz~12X(6R7x)Q-gy zXOa5BJopUxA>|5{OII*-^viS^a}RqocOGvEf4X3hu#0GeNcVpfods~*NESf5Thf5X z%#=8e?U=&M%*>3=ZkU^%rmqzbk(=jZIPCVIiv?f z_nm>Bv=`f<587$yE+qnIv;hKiHLXeC!PKBPYoe8_RM`x(=63M+o=kUAM?Mxd_`G4m zvJn4)J??0sxq!r$VkQ{v=aHR46RDO|MVt%X^d3?jT_4>F*w3vE%*CxjOJN!QKi@Q( zI?yNTDzzB$(3nh8!idRq}(UsOK=>Rp;(BgoiV};dPyn;Q2UkV!+ z78lUM>Baks{}df6I#4vb$OM&|R>dC*V+x834ixE1wv;pjSI}#-N9j^v(VH#5!Br4e z@lnpEk@SYrRE=P@$q!)-sZMH3@4%a;7=GyH8}6D;I9MGnI%xI_>^nF#b*gZ7a(U*| z7T)NFuFu`hyJfm~JD+ko;=BoFDNIgo4iila>{fu|oI#E8kg={o(x<>T5|@2Jnx z)zjUQrbx@hW?;ViLp+7Ht72N=y zX(&zAZcrDww`DU_;c~54D!!NBuCP_Kt8j(MiC^ZZvi9(aJU1JQub2my!t8WO1oUp2 znx6v?z6(_HoXV<|&nv%P_7Gev?@Ak0EUVaDzP-$$tZ7-7@&T3u))Y(gioxZ)qMJMu z=2`lxQ!iB!1Lax2tE@#n{}q*?7e`$*zWJv1ymd-?YWf z!!*_*#p#~Y1qUyO>5dJYE;=rD+~fGo;hnv&eLQ4@BkVtzf=qAhF4+yUTV}Bo z7?>!*=7WRYU>9cJ(DYMJbR7(9?Y7zVFv+Iw#ud^x$<6Moz0K~t-d-PU_@TGx`WjN~ z987}@9i;1GU$D5jIi%?O3X8-N!&{TPsjhyNm?%Z)&*(Pk4(mOQ(NI6SE7sRF&>xh- z#qClf{YX96cQVwMW|J|JgK?(b8Q$|7qPJLwI14YumqL5;6L!aCeh6QK&HV^IR&7eJ zp%p?u>`r&u_A8FS(D)%wu;}HT>NRSH| z%lxf$WJReZ(E{r~WejWwmn*)N)~YzHoL7%q^UG$IU$a$$*@#9KH)|th1;y$bnxeDzDll=5F!nQy(R=Dt=_A~2#rnfQ&W|vhH5epU>4zc8&_e7e z81$R%4jX6dI*Nf}eSI&}5>qeO=lG0|=!5L`>M=Mf4vE#I4qz$tu-gUI=#fG-siAH- zY`7g2*5I*1q7+B33RUrUl;EG|%gR+q2+10=|EhQ-nWb%J~sB?-e>m@UmF zLnY+~KX3b5_8;g3W}&Kdi^a9vWP7YWP@JJZl5TY}rxahcjRfNBNsBl5ERHH&aSi!G zNkv%~IBl0$@@$c+w}Nb!Ey(sxu4c8A4^TWY%&3(OEbXPH;(qL{T&{Z1hZeoHCU+G_ zG0AeqI+9l=WqdFFs$A3RPK5FgzB!VOeOR|0p&9qT@aNI{iGMH!v)giWa@2t|bs> zYJid8A8{LRM6QX=#C_sYc-t?)e*FHgFE0r%e#HVyBx zc5JdRRkHGBv>LihuJA!xg4UF8CF8_2HrLu%4kFK`iO44ZlurV6Vzyd`>%^KU%4%Pc zt2Dt^G1j)pxnOIlLEWL>nkv^(+R^W{P<{!!1*4RKK$P)POJ!%}lWbJC13zZJZGFWU z+c_G+Z_uZf+7)k=9PY%9C>!ZrzDS!dTjh7!IH1j6RkmAKv2W-q?GN)DU%{+VolcU+ zX|04G(k~pPl*!%EZBod0!cKlQ;JiMA?fd6!H!mdrir;t-bp%7wTHStN2+zP>4LV`);Ai4kNhb}LJb_#8$9oyF zOnY?aHKS4&k2HNT#gSsgQ(L6JXLk)Js}XpL9!oxKpLPWg03t+`_(ZIV>#nuyQNxmZpBHZF4<2gP_MQD{V)nRu3y#0KqQ_ee1Usy4(($rkoO85 zjP=p(iiYxUDb(&?947m#V_+)kG0vwG>0mY-FBI#M4@$6d2~QOMuxvIA7qUU>7kUH# z6uXm9iqy;KjN~M4(q^fbd3WH^*#W)e|0Ic-nya=8of4Xp3FsgYJ}>ibLWb}fZwCrO zD4W1PlgolX8b}{2+1eerE6V6ic?1qO?2BQ1pZXF##27 zA>ajhB&6Xu7Q_?qB4LkY6*s~5?QxzYnWegDh&B}O6%7K#yM>EF1ey4|WZ ztY`LW6*Nb;LC6E5XQDJ*G-x~2dx!}M!gTx#xZi*IX^6k(q1IXo+e^ZDw6a}GApOJy za*nkF3alschREsy{y{x$_mxTHtB8n+h0v$`0qUWyrje4rPSrBx8$b#jMZWMJ)P;S* zFZn&nwdW|D)WQ-!uLWra;9LKNd8VyU%e};o@~Q-=d*Dp0ie8WgP_YtKoBWc58V`s) zv}wu=^#Lyz8VD_cKDJO_vrqxd!Sm?XlP!_`Ts zR0@%n@`p4KShV{{Dtd$(k(=P)s7HngpHMrF$Yx-}&P2UmlNHNnT& zD_LjzuDOWLxUYQEc3+DEhSCyzi#uuu)$O*`@-jS3`oj)bwp-%(Abn%p&`RXTXp%4h zj{|Y-b!6-y{%4?%8iG`rt+BRun)1P?L` z>}>EE0pn~mJ_-b+dcXlZ1{|Sb?6dYASSe4~H++e>sBg>0D$Dgx4R_gO>jC8m*-aj+ zuT^&;OB%=aKm~e&5NF85^=vyT@@OZim3UK|t*ll3*-T_0HSi7X86C>+BLfQ2Mk-IW zR%AIokGk;fD%PS2Sb6zOwhmvy(b_M1ia*40cs;)ZC(C7g1?^&ssg9+S3sR(5itdBg z;3hCA`rx*#1zUjXlDAN)o&=<<8bI`)C#@o%)hKy6t0FEF{P-N;hR+ff3oGEen?RFU z6X7=20|DDe+Ciohr8z29*ic-?*6|=QLA*y}%hxNdbvcFsWTQGuRkg|N1Xvli3p40) zbt#S@^R+7co486^#>ZM4*v^r5hDYLBK9vGXP$NHl|`qgy188DUOi3vl{x13hLXZwpMQrMQt4E1YI)v;tlmF9JHQFOdB%kYmCw zrm6}%iK~iXQWw5JS%yC8+e&l6E4&mXz;5gg?Gn8On=DmuYmy4KoAbCe*xih1ESR&F z09k1v*#fSB79@fVQ}09PodLhtz?YMB!4aQjKlm3iQ4k@cYlT;-JCqmvi5Mr;0p3{} zie=$iAZ{U*A(7ret8{&EE!$LenEs(*KdU7BvAN=JX_EAg9HD*HrsT8!fH+jULqC&F zx&Uzxe@CnE1mTu249ICaB~cfO1AqvWB`mP>)z^mYl$L0TE>1WIXL34uLk#>lx~c1| ziw2(KH(Uu%L}#GNyo-d>-n2Rpoi1o&w8iAT6icpaS?U~qN4l(c7mDc=^)0F_T|gVv zNo)jpg`(JO)Ku(2uF=UXL@WXS#R+s8{28xV2-XSZ!XMm)mBM@33gWH(;y3bvN2}}A zbaYot26pv1zJe}OC-JJ{0P!aojE<<6pj{R14fnu|Guk>$nTc&e zcX9%^LqFwb76)b%gUC76lhy)i)&iO)p9G%udF}!9v22YhwP`d^gT`yU*mmGVjiZxn zm*shAs+NjDV zKy+(BMx~!JhgS%yaEbL$c4*s3K7XoA(7XgAISQuc0&$0Q1eMBzY>uoGY~f8L?P(Y5 zT6Gv~bU#7UHL4}@&A{baM*bDH(V>?|<#ig+-7$%@o>bO$R2f_VxrR(+Ly@SF}K2|&?*sfEKF6j+Cq zCh&w*2;nGEc2v6ILDD6hN9zDJs6?BIPoZjBnl=WvL=)9Z3UKVjjiiyboKAoVszAID zOexE>)xsU=8~2tyRX^e>UWR-43TSq6$!c|{(tuplCkxlr5^DoB4vmI*zdCc*YO*%$ z9a}7P)3w0g=m55nrE612JIRf|wE>w)H(u|@cEfg_A5b&Ck&UP`+}jBZIBVheDy9+dNzn(bt)dHwPovo zOjTd?P+UkS!yGA{cZT^~XI+JE7Pivc^oq6yl}ir{#|48nm17ADO?h>62&h3QUqHT%;g|4D{1|9oXQ)m6M*o5M zbAfOOB8ydAhPg@$%OI~v9qpvz4AIdTVKq9XIdL7n#wTje=^CC-uA)fIlW#-2|4(Xz zr_7?wV;AA1{RG6yBDz<0RZlQ08YhH{|Df%PtE^}xcnpuCXL${AF8QSOqA@f@GeAr> zl3rksh*_#Gm1=!$H^CYaja~v3>^yQH0t;3&Y7d;z@jylM!rz4`;sKq~`7rJB8Fd$K z0!Q&B3ITJ%T4fIHLApwgq(1XyHGmyDkS#)yLJ4}Ty#%+z9eCE(z(i7lJed}VCym*n zFY84gsfvtg5_zV#NJr5$Z6a_4hiRXcDeQ|_C?U9;z2MK@gw6rMcpbZsQ*^VSCUAjH z*CMrb5SREHFX)@`L-ZobL6xPHqLfeYXdbL2ko*vLhXjigaF7l;DkiK zw42H$dH_uq@`wcHxJPOuRDfH8x7!U|V|P(g>a0$r9Z{4xR-nLNtHq9MPFRO#%m2!Y zkgGIYNQa8Rb>0tAwi_6K-?*>VRlQCRp?Gn#-~cCLZQx)&2Nt}K)`cy=Z^(6A!Iv;Q zmdnG*eKc81*J`0_%!`)NJ_tTFX(c(tz$XEwoTccFd{OR;lXOGGo;(UH8|}4uoQOK1 zC6GV;&^4jCZipnHaSBo=KuxtDPJpbi8}A}K72hGV+L)G+PR6eKhujYGj}K%u_GErQ zsC)uXiM^p4d84|h3s`HQbq0aY%TEd+Gr2vB;t}YMHV`uY0m5Tp3~xs}vzoBIGDsK; zZ+Z)M0&e(5$Pt)iZoqwf#=D_zK+H(`sw3K$0`# z7UU%mZ12I}^)o$)U8KJJjO~spN@e=NI9FXmIhC{#`hQvVqUens}b!ajP0Jq03ltt&L zE=&a)`yOyUb|k0uPjz-YP$ilt`YcqHhT$)8I-GsCs~fsNV^bzz;9*p^EqmErz@FHoHo{Lmy}$kCFTgYXwT{$Ya#G$V40<{<^G%su6sYxJryd`{+!n z10SEK;L4xDT-GtZLrM@BTge9zR~*d#11e$*I!Zf+_evJn+>25wXiZ=zXYk8xx3&v5 z&wj%bpRWW$Ug-lKuqC8OxCHgMn?OXoL|f9i+*7W1=z~PM=WVn8qP2)Dr$`Ta-!K44{J71aAHYvYK=S zVtsAw1huCTu$L3ao?4?-pofX&{EYSkZWbqTk?JAm(ScAGE5ozJ|D;|*1`rIM+CHHn zh7~%v+vsqfh-$N+Y8UmUR!fM}Ip}=xRb`sZL)os5hYCuu@J8w-{sC9fa9opqx1NwG zTQBs6Os6Z@OumvNo};8f-TFHT*1r)9kc;(&>gfd%3697>EeX6x)X4;61#7 zwhNQRQodVV&E^V6$Q!LS-HRn~j=rKsbpyQTS!5P5ax1+Ax9E5AI8-R6A&tz&v04J1 z1SiigFbuB3U~ZHq3inVha7)(!PxKaBL6%GXNug$=F?_RlR0Phb>df4r5=7Ys;K;qj zGVnYz&@|y+p#_?urO+}~2_l|;+ENM(bRdwuBlW?H)QH>{=A-M{1ZEPh=}(F8Rio`7 zohnGud)|fahd0TN90G^j1Z^Dm1TGy^V0nMqo*l>gv4KWNb*&bn$ zU|>Jx3<^>dofDcbhuFrbuGmegEKY{=|C)N&7AJ4kZsTmIw0nVZKrg%^gP4yJqzq&G z$zAe--_Yu?$*3(<6GrnIz(gM)B#X=NWi`mAm*=vcP%Et^8iBPQhEuh4>jY~p))Au1 zKG4s5N=h-FtK%w5o^g!|50%nC` zV6#4k?9I%UsXJ}HY7DwW{&KE4!FR9~^1He$2q?^f^d%jKI|*j~gXXAi>=49^Md~Ky z0^|q1;qyPPja2`mekc+$-HlMwccz$36Wa>~Pz~HE9F6 zQ2oOj0ZDude1kX9Njh7praGWkLKuoy+jASxR7==md5oN)Jfr3Orl{x-iapqEssf8~ zAIz!NWlKaK{WI}5asyWuVs%gu%p9D7JL(=ufxU=ivLAu}1}NO)*;vg)G22LrfZ^H+ zXHknH)1Sa+Zh`)Th+wqX2#ZIp{1cj z?@69hXF6Ql4UDg8V51l!BuIUPmtfm1)RM8i)E(*~kJJO&OX0huaVGCo-wO9&HztL* z21e>=u7^y$3z!|wk~;bfX&!qfZ&vT}L~>NfMxwSz8}k2cCxjpiaK*)9i4-i};V)G? z+M6BZ1a}lBz;?_Qa0&lb_o}zF6=Z;D0mAPQAwXpK0(%2S#;)Lv9wxa8*Z2o^8viRU zLe=E&wzo*rZ`Y@Ttu9pS2ORiEl&VWmLtR__eX$OXfF1!t-n_2%0B*_eR8O3BPo-bN zDC9$jK&2o8trF1?yEggn>?he#ds{_68KeQU3j(>=srJ?vVR5iM(iS#OD-z$W* zXgD`xi;#z>(wCNrmd)__P1Vho&Vc`L1ytLjHKsOJCaPEQc}d3WXaqgar;z`kI%=hk z))4tA>L<3ry|o;wLG&?(d*S6^hU*A5Y!h&F?fEYF(RDrb&t`?Fv!bA=v&j zgCXT68%tknjqy%0f}F*h`7EteQ+Xt|;{L)7!GJ4kkLeLKSxCoqAxjGeK13xjEuF^y zuRqQJbHEuKEvyl?p{C&BKF2pezE(&a@Fs`|ZopKg1wDazk1*~hHZh#g%>;|R6|Lv% z)L^BaT7y?e#|?|2zHkVQ7ZxMES|Cqh7V?e!116uFU{+Iksp?Kg@Dx;ybQX@lJoZ9f z9iq$|;KTNyPi#}QXCf0Ha2-&5J#m<{1gdMNXc(&t(eom%fDLyNTT9dV9;n;8^ZQ`b zK8E`VrN~p;0r^iy_>%^ZXJ`mR+9T~hei;77!NN{HmnLZkVE5$-FVPgOCP|VG3*LM& z`-6ZEt=TKJl}BK>yiD#0FNBZ61$bJDZ6WG%JYI4j>!^p80X9@Hi>ZNh3wsU!>t$hw zW(T&wH?Y?|9p(y-;gMpN?ip#N3@raz7Gul8GmZO=?}ZKE@krFJsZG^2T2)d@mkM2O zNh?#QvwXCgGk8igz7RX&Li|8jCxr3pYA@|DkljB~oqSbWsn0O3#s;~jst5tPx!g}? zvM25=5j;)ZLkE+#QW-9y_u==f1XERYn3vDzx3pnst<=_VO++->;t6+56?B!Wq`iKQ zG!5;iW8~UOQ`A-(C>22@WP*wCqm;|P!G<_oyd%1ha{hupW1C=$uM=M&5M3wIf*k-# zcoKa~Tl3Xm6WWRXAuq);Aq2^)0hot3co>;NM&Xy>DC!Oq6bqookO!akHjLr?o~q^1 zY2YGXC3*@y@dTK+SPNCkIF=4?X(>c`dAa~$iWUwTL_Gcg=j{Ym!qbNn4D(weIhSXVuDl9b7Z!!C^{3Dl?ID0z{xLAWpd(4NW{`Ba^~ z-c97V8d|31s%KDJ*6tO4AWNoW;xD$Xg- ziJ;#hKII#=;Y@?N)&R)2W;0izwG=J*<2BkT+ZKyvYt1r*ExP0I_AEz7q36HQGQ-w@ zBf|(|3$mIvgN>FvwSsl!`+&xiMskE0Nobig<{rOtp#!H3nfw=OP(8o^`p5cBjr83 z_fRuu0~L|hC+l?k#IbCKxf6f<(yBSR0t3^unD z(3#CtYpd%uJ0aXKM1L3UQD(?t^g90oMD2Yrg|C8L>I2MTtz=#3T;L|Q5>EX^vRIe+;IDWwS%=1IPqhEg zBbdWnfNa`AG*rAKp2gGId^Q=%~DhI#m@R6(%ZXT~BtoqT9d@tlbcc~2B?sMX7as(`MDNF=^Y8MjEPiO{u zOxuSqkhX9`6oSR~8(0U^=p&lRf052)4kPp{UnK1nFL48l1#8j)PIxo}gBN*%Ke7<* z2X8B!Bb(3ws2|J)B3dED*BihvJ(NzXNB^}t7Lj^xw7hSFtAiX9{HNEwq z#YFqyUg8(sE12Ou$C&1eH)20-gqk>XKE%O>-%=*Cs#k$Keot*dTaj71*WxvFk_pHW zztIk>%ef%#k-m!kQM5XpzJnUw57t)gNZoLpct>g=&c#olDv-e{X+2a-RqiM{!!DZx zA>h6|&A93X&c=_dtri4X-UBg5%mB{8GUzJ2L#_D)nh0CY^YJF=!FASJ(S~4z+z);R zFER(e20w5LaMuOwjuB zw*0Afmc@`&&^=oT(e@nLj(r7gZfhW6oRa>CVJHdc5VsWt1&A-madJ_rBbI9ql&4U? zoQLn?XhhH*a5tVNb;v&UOkJgEqynP(jXWOe485Uixk@vFl{r$942n1h<~wwd-DPTz zwUg`>L_hJuaot&6JT6f6u*-B1p6v;ICe-7f3Jvi&R81%ox_;Oy9~dYP&@56S zWMGLkQXeZ9)nNKTJ*GVoo*FvpX7e`cbY-$~N~xzr%QfkJ++1>ydXObd_`m0Xex^TQ zMzfbTkPpFxTt{|nEBybj!bv%eJp_B@3e5sPdo*f}S3}g}tm>dnx>KvA+>jrz^I|K} zoi~Q=)FO12bV7l&gIrH_L<|?fcYYAa66>LIn+N8n2tF7xd}sWP*Vej0By>?&PL69o zASWthi&Q829GtU6bQ4N(1^Ui%R8@{t@9^GYuDBNc25V_M@gh!C*UMq*65c^XKm_~9 zPq3!o^qk0@pu$y%T*blSZY9^E9}GReMws)~472rc zYs^Pma3j2re?*sH{&fQ6qg}xgY68Ph5W2{^@L>=SedY7W7pa#nlSF}+qMZMLsfP7L zkBn>_#Nm1|7P3t%HflfQjcP6QNmwdg6_cce@MgZ$W@^6d`2Xioz~_{Qmg1!_K^iQK zmmZ6`s0FxbCi4#P=^!$ae}Py&0vtXsU{n4#lfVU80jI4QY5)y{UF039L>BUi>RO2D z@8YlI6B@&YvDGA1nk`J^W-U%T&F+A?_5_Xr8;%3Ih{2c02zWl)lc~BsVlK;8vuIm5 z1HX}$6n9>h_?a_Cb(MwhiXn7pU5qdJjYB{#+D z;sUU{Z-&XW6Uq?zzPtx=&Z$Cotm6n`{bzUubl8Gf0aRq{czZCoc7YqJ9m~L8!ce&N z%heM48#02)m>m$T>6_>X|jv3b`kE8-lq% zeuH@l(#~y!b&Lv>!oS)CoAKqR41{AeF^d;^AY>r>pjqD(&Ng28fQ!XtP z1MR>9@l>)DW-mUX4!9G!Ni>wAO;bBVpTQZ2@iGnaN};y&SeS-hXoF}4^lr!V_vkI0 z`4@Q?Y!a>rUc{I0p~qE$PSGCoZFmxRwYFhTp%f~Ywct5>!alH3V3e#6CboaUsBFbE z@nY_(d1+B-4V)m`HG7~sO@eQEJCIA7@MIh!Y#{AX0Q4fWm@^pKM!-)u68XTJ|A`z& zZqOBtglgwNm`=f{g|JTNAs*0P%Se65$B7fAaqu4Zg*V1kxXxr{iSijL=+D_Seh~b; zGWi3!Q8}MUPb)3yIkpx|jWu8@>KU9G3#hv~4C+H6%m&ke=a3ytP;Ul*VpB%ona6kn zRC?xV_G(S#w34HaVRP|W!AFb~j>DYC7L9@jsGByKe?dAt2i=5zy%Q36Dnx3{*nTt? z?wV%!56|M;!I6^%PNyqiWqZxaSQ7Z}4#Km2iq`~RUmSEZPl0Xh9k}!Dghz98vN$v3UXB z8fP%V)mHncOxXujutK?>9AoPQe3G+DeHsP*_|5FCb{(bxFVF_sXRruw;xlm@Qigky zT0*q2MHnr(3mb(uqD2z)9zai_hQ`KyV3PT1JO&)EJVR>(GF&&DG0p~K$b5%r#}5v> zV9tNI-cKK(_s~Dn4>5+DQeorxlA(%jiAcmF!b>=@O7I={EV>9;q!$^3n}BtC17upA z=_J*n>{NTvUUUo0yT`$1PEEy5{?B^LGQyH-Ic0rdJ#4)XG{fQ60*jwTEl()JWmiib z%F@avm-i{3Rc@-N4BUbNr3=g_iffodOHP&?D>+hf4JZcP%#pCi(7aeJPBzaixd@Js zd!^^g&Xr%UsIVNgwN%!tcWJpsIORoXFFr!`e=G4%6w99YT zVE1D8G2mip;A!<-?6u459&G*|@;>e@dbjkt?^)fmuSW;>DQ+KKgI$-n9CWVkbk1Rk z{co7ZuVm^AGxqllZ}iKc3ON}jnyg^6%>%dHV{ni5h4XzeWD0rODXo#VmKMNwxmyWQ z%yLboOu41@r8c@k`>K7=HfqDPf3%C59UIPWuoM;#|9k+0R3LO`&T0j4{{PD+GDY); z6Xp}lwI?dM@&Ma^YYLqTabW|n z6&)>TR?r2!MRST~7yl}*Z@y~wDmh;=t2D68R(81JigmVpA7Z5MbS#jQAfpvDFK&^l^v6_ zIB!IOXHlnOPxD@I4n>zVE=?;0ftOm|J6Oi`wTc3+L5##M%E`UkqD5{Dk$L<}xu$Y++? z)QURgX{Ap}?wMnX2N(A#b}RNNI$iKR?`Mu%cF)Y6>C@6;Qe#rTr@3a_$he%b7yfw- z|8_d#YsU1<`B^#HKXQlW_lGUrTINBey~|rz8r$Z9XxxA%3X^r4jinBi-NL+(&q$wI zK9Sy&J!g9K^z7r^#cxx9d+^gxOL*gmec=PbPlnltjtyxa^u5aTfE$&US8D0Mz;BS> zCBKG#GkrX~7Q5edsqA#XUJn}tyQSyC8`z0ltvRTtY?~~NE0W7EmDer*PZ3~taE-W5Vl3Z#JXOLidZK-D+3)G?G)|Ix(N(7B&t}w5x zNzDvjjPLALm_C?l*!OT4>6qp?*y*K{(RsFWvNLzqx%j!*xvX{G=G4ORw!NKctWkxT zmO@bwj5w6<(fsKg<+;tyTBo9BS>=*?#eEA$=ReC`kuw`MvyWw7$hZd7sMcvUQ*-|w zNbZ$1HPJ4y5VnQ~Bw7-8By~w%`S)tdj?{-~qcYBA9nWo2U@c54u35I*I$f;|lO+v} zzwDcXohjOR1kfvYI(~HybdT_U@t*9F;p*tD*qiL?>i3GRfD8Ijd#NVMqilVw11;Su#=tIS zqtZR*7e&UxmHCFe7dcKjG`oJz;+)30PxB5J)Gu0HJjr~)JlHH3JDMk%{Ys9OelD+W zT`d1m*RbihrYKa#gQ_jL}-Zj*f` z>r>{Y3?aQi>WIHDl13-iNaz)Bj#J|1#y12u^29`c*uZ}J_i-x8_?tO6yLRs0{F{Y6 ziv3EbS^ZeBSZ26uZ*`=O(GElG``T}CXzbj~J;(;m zjr`uW0IR`r8OS_6%r6QL3uSlYJ(8WKPH2g?YI^->g#fsOVWyo1)K! zb&D1k_bYi)Hp-%t6V$ED0k49(>Og(GA;_-4uBxe>>8r_NpXE5z<&#^0r_Q^H5Atp7 zyUS;`cQdb>9)H|oUA{SShh6qNO?h^c?Cu&58bbAhVA9UauL5hYi)Ch6y!m-ilfsCC z4f&4wqw-efF354oZky?o{xRit^6SKU310C-j%57a>DQ;bHT%CaTNz1^Z;coZP@Ej(hqfH&165V9)$@1I`GbG>IT&qW@A?g_3jE;U?sILA7LI=MNnw@fN26)M;DltxJrhJE(4U0!-l^7jgC z9~>F#8BrYRQGHpYXQWp|Zs_|E5^^AhpVPkj`G{;9ph2q zI@H+VI91%^r8Tt;! zuclLuGh8fg+#|{>$?KSxr&oW^eI8yO-`qF2`@7$Ao8?x?ZKCTy7nAb{$6@wO>|W_X zJOW$aD`T#m zT^Os6-5k?8W=2fE*t|HLI4`+P>g9CjOsA}=ISz%tO554Wsf@5#LmCPu#@=AgY^r~3 zKgV^WSGM1c030M$TOM{V{7`su*vC+*TGOENDq(?TL03aRMs$QvuwI0B*piTSRks9e z@ZaSV;~DFA+u6<0*Z#F#f$^h3r+*@9*oQBtRe&$Hy<%qBvXZ%Qj&IN3oadWopBI)_ z4m_7*IdyaLvyWwW$j;81oRyz>Gt)0?b#{4fk`4DAdboY}zF+B9U`WW^Fmpt9ZQrN))& zVJUHPk{*)3z#iWFlHbL}g*6KD z@*3vF0%_<*Zin21InFr`v&Ur1S=+OGVXJ<7W>{98>{B_#dAcG~$@;S072(#UK>4kz zE`bS!4SW#>3nI*v$JzaINOm6S*1}__=XkGduioDCygPb(d3W=E?(OB{>hl=>+hebE z&%+*ZZs{(+oxV8yHoY~@(z{D33lAX|}g) zRhy$?nDIR(^d$^>$~~mbc6QFYJyLyZ1l*{a7IHeQW5ke%L*eVg)>nHT^g6I2uu<^N z(Bz1zHOAJwTH|+QmGI*s&jWu|8s~e?E74u&`qZhqV}FM~_CHL&j5>X~5Ra%9ruMZR zujpIWxuj*WeW8|jF1I{qZBAIug6!E@XMsmhJu@X^bjF|bKIyq>@oDYS8)VpJ73G8# zq!(GuM@kLl{ecngZQCRJs_E1ow!}6Hm2{1ayX@~e`MK_N8{+=lox2b5uz0-neBosU zg2sN|HNM`y8+|T%xA2QGpizctU8+dF$p=8g32seS*pN}8Wwj4zDkF(YFt{v7`^0)9REGd^ZftXF*Z#3RX} zDJdz=X%91==bS6-R%VbdYyD7Pu#GoDW$X%XB{VlQc4+Q8$E&e_%PJ{BB-Ar}eRy`* z-Oy7ZF;(3I{{+Sa{|Y-(ePyjpwexB@)$9~m5*i#lvC4o-hk@(#+Qa7d*tM5yJ=fJP zH=IiBPZ}%f9+8cF4SgzivbL!Br)+x3h2kYe*@Y(yTNchKXr2E#cWus+>{(e8GB;#= zOdpcIC4Fqhi_BZuJ@Q-%I|7-oPDwN{y}p!smw&7{W&JL1qNn+5@?9!6c-!B0?CAW> z`LJ_a=aJ4eT=u%ob>Hv#**nH}jK85$l7BP*hJKfPE_x01aCNKXa@py#V}#>GhmH2# zO|y&@x*ssDIU8n4Lu@ZAPL*W<*`s}N@1pR+YxxDaN!jZ%OVhfgn3KX1Q{s!_YR9dK zwZzBVgs`L<$>D$hOWBv!DsxM2bn&=~G}#3hXvJ{cwmpsGWP zb*=2Hx%Tur;`cLPe~^1MQ|O&)+d_^6^$uJZkXpGbP^SlnIaU9+=7?HfYM!lrHGE99 z6ICx)roJD&T6;LT4R`tC?CsJA{fWu{NgJdr&x?`J`D(R4ry1_DX2Pst&O#ottb zlR$~qnjxdmL^s9w#AI-|;_%C%3~2C2oE%)9xkkGW^t5@Edw1|@?W6Zu;Qg=HeUGnh z$aSf6Kc@kXZ5%@FiRqB>iT)pOwLV1;VCHct%pu-|x20A|RPnh&nm;ygbI$Iptr<~i zJyNzNyC%gZoQfYE=O0@u=H{QTf1+bf#OmU2Bt#|cOs@5}WlDLPQ+8o~&63!P54Nhx z3?&)1;KtfEC>PlZ;k%)uqrY26FO%Pf$~^*iR2^4!LEyW9=9PN-J@Z>!`BBx&p-$D) zYNpqUtGS^1*znsSKLe*$-r=w;^65{MuJu7LXl~7I3uk03fp2 z`_A=S7*G=YJ3P3?iJG@+j;OIB!d7irkg-Z=C0Dw355omROHj7F9ehYf;j_=wSZP+;!Qbvl23wWcJBCnK>-0 zZnkHRYc9_)WTgxo7EHReVwqa^G&lilw-wywP zS@WZ>Yh|A**Q>Z!=~lU_{{`QxzKQ0YlQq9qmm+Rg`!^`8N}Ec5 ze7pJxK5;((`U#bGRvO{|(WjfIkLyc^8{q!67rgNgo(Z&*g<81w1uEg)l_S<#<%i8f z3!j2)AvJqx_T}u>IR!a0b3f&J=XD1kW&hkcIh%m`o10afJukO!{?)=r^U~7m<)i|slZf^~JpS>!L&rmM3DRIdifRjnV(eM{#SYX$%1Ey>xO zbt2?;(&^zAFC=2mA-!7*_Lw&Pot1{ZHBIGNWgw{Ol7$PeddCu9%L$;ug#J0kZ~&aUi3 zSu8Uvb7xjc_KaNj{J4UwBB=zI*#lqdr7cB{1{e5lbuaC~UZLy4V_mc{$0Rsjagv?g zTuWRBxm9)>=(^U0IllyYi|SIt&B1+$yQ_OY;ITP6TOsS-Vr->%k^+Qi+#ZeQn_ye{ zzWP?4X}wndy~I@9qu^=oob2A2ebSGm`lq~3-k3Bwaah8D_%U%mViRL~#>K_WjIW(A zIMFG&ZHi<1gRJv;R|=zxcbikp6M;Ch(Og*C$YPZjvLV73{dZH6(|xzzo}<0?c=h!% zdRB73>XzjBjH!VGO9%ej|#kBxs`vAubodzpVq$n{W?_IR(VO~ zSpPg9Z_iYhPY&(uPU+*N9pVG1de0XwKyT{}>5Ol(#_Ccq6f82w74|PUmOm%|T)sKK zV*zlx3!Dot6zs`&&HE=u$?BQ4Dr;VLjocpjoeEuwf1B$8V`>-}#_w5{S!L^b+dSCx z3V}J@>B25u4Pyh-di$PWny&Ad?Rd_qf%7?M*}0v|Q~fNz&%?9RLjYFF3lC~h21!lS7`6mQSt?gvHVua=Hh*YFY^;}&Dmy%GXJJ}q+Cco znpB#&3w}vSsY&PI=6U%yDP?!slZ)Tq51?d35*eW*^q3+Sj0{K-Yj|f9#j$ zbJwT0?`6M@mAVJ$s&o%RtA^ zEUG-YyhFu-&6Cw3OPaa(m`3@43a?Xv9#nckWz*$=V5W#81H+#%3uoAV== z)2>~>{5Q+BuFEAS>d?hL6RMQ=4Of78oFi!>0>XGLAkKcLO_hb#gz{abbIl8i9u`!| zACS8;`)Q_-(J}2-%J9D}k|!tCNm`xcko+$B#@`Dm=Ta?cB^fKSL-QsUSPBb@))(&u zy1AFRsN`VzSL-pDm3||P(j(J!N1e+g*T1e0U8}n8a9QIr$MwDYXzvOBo>iQJP{@*y z3&FL6#st<0$n;P29q;o$j?Mx+ie!tzt>ZJ9OxzP7IAn1P?(XisIEy>M-QC^Y-Q5>= ziQ8n{+TYpt}!kE*82so z^JnMF`6UYvSu5MN*)KU3In}OVF1PEfyAArnJ-l^%ll)nM&-_1c$9ENR%#D^H%Lvl~q+|b<91S zqD@tbL0e)B-1lyAPs8fItY|~wxBQ`bT+Wp2Qdx#fHltzsvp=){EdKNCPmT1v^oJQC zS>NwtCvRZ@bRpD%Es%aO>S8 zL1k|1xN9p{R9F~Scng%nhlMUHYb#}M?a(;qB9nNw>$a<+`-;1g=ac7yx1nDO*m+vA zfmsknt)Ndcm)KX(4$ae4*E+QebUxii{V+pm<2&O-(>Id~pG!?~rp3k!h7bCix?$SJ z;PbVFXYL-O&>^&goCkl>c5x(MIl%fru5&iAH!Rvx7+G*VZ$WO|obOrVGGj7`^d5go z|LOZD@6U?#G8vf}>6zWL`{ZuUe_RNfmp#K?%u&~o=IHN?b|3Iw3<$z_g`;Y#nrJH; zmY71!kC6_(!#u=12yvmMZo0i;7N4% zb_Khtxh8^t?Q#xsZgh08zbzVVtyrSUL*3}p3 zAluw~JY{|L0(1G@;vx_*8j&fKg;wY+<`la`wN(8NP9~ysjQ+EJr=f{)ANcV*jSGzf zjB&>96=TOmCN!U_qKBzoB>f^5 zdDU{c>>XLDndLHurw9J%(|e?^Pk)hKFQZK6m8`Ehxx{V@}kR+f3eY34=dS;1c{&qL=&42gaddo?~eF+cHkVqwC4 z&|$kpYa&;N7lb8*>(FiJ5tSG9Eh;+dSj4oj=N7%WoAC>hauU@Iz(cB}I;8pvCf6W# z4c#7`fVV;!?v2mkS?pf!YUEnr(z;K&%Xk`kF1y#ciaB@NtJumH-Ln3+HYrlsD%;mO zcxP327tc_T+bj9n__{(d|JZjFX$2a=D5b!Y_z8r@yKI)~xq6buqiLaCqni4b&V7z_H+6Q+tVfwgGxua($+ToG&x+0-kTWW8L%~VwJ6oY+ zs;iW{y?eX6ES@8eHz+^|7P*LsXMU;2=zEzCn_F4Rgs>q^E#HHk!SgJ(kSgKfQ59ov z#IH{f!<_JgR{-~`{k0Pb;xuM&FPn$gY8QQ+; zYwR6nHglZuGHUi1^N>zKGRj10FaN^d&|ArU(fJuCcW>~#RCGOceR0ioeZ+a$Li=>v zwW83XCsvPjWKn0^V$7$Ju66EzJukgueMfx1d@cM1{$Oq=A1xl0+CxdykXl1OVI&q; z2~7UAc=~7P?7G2vn?B9pG?WB&v5T>U(T=l>@dmfPlYW%0g7&exv+6T5k#01R%CX!?AO^( zbK2&m7F4xrZIA3DoM|q_wZr|u)50hDWB6C%Q)NH=JwrAB>OY!3noCXCLW9DtphCD4emUG1b|y42 zq(+izx;~=Ke$@LcJzx=lwL$f=$#IMC9h`Q z!?#jHJyY{QOX!OmSmPdJS<^hz3{yGNI^%CcWy3iATisG!UtMLLR`*N0TwA1J(82D_ zK7-D;4zU1=_l`m?w<*xt|J&Qbv)%R7@x|u07B3u=Z_S;Nlb9WwwK;Q1=JU+nS;p)s z*;})3XIIYA<&MZx7i1Rtit_A#JLkFnb`STg^Jaj;-WMJ1k#fO*{#|uX-CAQ6b5+aC zkWV2OLuR6D9T$=v!iIGWw?~|gsvC1VHYEN{{PXzw@ulNt#mtFX6OkFVEc8{#u8^(x zJQ4DDNFmO2IdjjTwnnFJi)OHDB>bVNWLaX8@<0wqNm6aGp-`501eW^0BTwM8Ynrp4 zW1~IR{>C=n)&ie5kV#`i29Dj{*s&8M*z2f(nt;O?2y@>>V)tdQ-B%{Cg=;H(6BFd# z$|#~DG+33OV%b4AWy-U4RbABcHP^K+o!aom(8$=|XfaMSoYp_rebD+eO*DJd-&BdJ z{cI9Di#bQ{rCO0tILR?$1Roku`@%e>T~Ur=wxQOS1%vZbaK20AWMxU2jWQ2p^v@WQ zF)QOnM%_$zrYoycPQ|?O1wXAxb}g>vGIxJZ6K@S9X)OsP@UMl3Qb{74lG)bU{e~Yw zeJl?`4uw_+r#>!hT^JGGJ3Kf1Ktvik4uPnAB)Q+j$AH*lF*BmWqr4G+Mbr=P9JVv` zM~K712eZMhplha4$n*N4>wrwY+p34`OL)3gQT529@X@QqvHa^masNJVC#?D>kcE@# z>h0Qu1jHFGldHRP7i!Z-;9#DyzqJQBHac268@qbB2YW_%+klqW%74zU_`3vXt~`H4 zC@BpSF2#s+p=v zDl5B}jbuAP8Pb-r5*?Lg(kbBpx7feSoA2)K@WxP#+XC(`&YpKj+3?!E!TIwr_Og1WF4;IG zXiRWONRQB{u+3q*@L}P5!ZX7gN34uE81W$@GO}c3WTYwbS48)S)8V1v!*P~+BqYaD z)3PbJz#NCHi1H>I#=-=hPJ0RD!bhxu9R*FUicX?J$Pgj|9-RB)X{c95qEFHp88(f4 zFy{KI`dZ>s@xI5$H*c1=v~P~@o-f&t^(SyX5XYV7#`0=mg%B@p5p~d!Zh_LWI^hTH zaxxW7@1|KKW$$8KOl5W<`;7h0T3Ht9fuX8se08&T*rBYAZW5P@JH)%t?6#Cv zN{^*)(p%{rKHtCvR#I*!FO)yX<&}ldJk~)j*GEDm%9HKLj%0uMj=n(m_7~L)KKb3$ z0jTH}g5i@)Jq0JVH)$rHKrc6xh=V5S5~yYA;7G*DhoxlclGqL%nj;{P8iarOIdH$; z;+k?_0;2+j{vqfU?e#VEef4fYPEn?3xu=@vqkAB7aPGL4ySlsTyPCLqxhA=exd?Y# z_b#{Kp5$S@^N}04#@7o;S(UgLP}g`UA&VrtoTVHi+CkH}36Rlq6XhVY$#>*Y=z}NW`ZXmh!5zwy?}$Cb zIHEk1hGW4lz9F}kZ%aL(0iP{uptjWt%fU}R&2{4JfmMN+z)^oof3|OlueLAUyU1JL zOLz}^I(dSjYun_mfhqE=Yo;s7^~rhLdBu6n`N7FMOSlHOw!1#K%NF0$`nwA?C_^;l*h^Kv)BrGGlzv<0wG*LFTE`I#?QEe+&bWgWV6Hw zu+gwvknT!Pz^*wC-R2JI5!?!~cuqdcv{GE@iY)FlWi~!WD&62>o~En?g@S-Cy*>zV z1w+Xf|t}X?&<9yK1LsM{6f(m*BIzww|`QR;T@lKOKRj$8YKl z>YnOw^(j>yRSvt6MOG&JliAMv#ay8~)7c>N9wf^^nOlpimWdr2!j z5@(5JkfO6jXdt-xBj8FA@GFerN^&`Y8-bO9W&wwPyT6yete@~d@@>TUoeq6wD_=cd zg6}_dnbsHU`^%T=YwsK8>w|s9NZ$hAX8p1((nj z*H|M>2H#~g+-Xx4J;*Tz@*vp=&t@WY(N&n8j1$bNJ?vN3&X!V5gEQm-`0UHnKcPzP zquHW4p*as7>OReKO)pI`jY*@ZKdT>N=J=w1sXnfrqaKHk*6LvOSIh>JR83XIkg@of z-OQ%3ZCMjsIa`==hMC5^!`O%2JLw*H5ja!ij7%XF9+l@%2cIDnSj}<0et%!st@$&k0~qVrruKzKp}dJk6)Ay9@(bg^qr<1ba|!= zc031}Q_Lo26`tL>%uGDJHJI+q5T*h6Y73do%yp)K5tyIMIsAGaGm>e?v|uJOY0Mam zo@>kwW(|JbmMO*v^aISGZQz*ifv*La8|Pt`^x&0@A>+wxcsuWbDtU}(Pauepa48=Y zcuw$ibjQ4SMV=(5fRjVW7C9Izn*)C9chYINFZv^wavGks%2I+vOPOLi{58kKdEzj! zIXv;ApvGF14Nemw>O{S$7Nf+0;z9AXSWDW6x#6nxN7BoJ^b7p~*Q6fGj-}LnN}wvzgXshCoqVDFbSMN;3Jh8iz{@JIf|>Y zhB=0JzX;cB4$}u!#&dcL=sGd}3?03}EJMt>I9keJ1v5n|J{6>aijPgf5 zAWxRNK=}@)o>U~gkk(0ar4dq9>6bWFOcFDNQ^HiC8)hQ4kd72OJO7S&VsOn&EQ@RNn=d--7tAAhWIFPw@Bo zEM6}p3uQ3BwG$SDD9K`08zf%9IBFqHLhWFb6XjI7FVw?JL! z8V=X+29QN3!X>efYDLN9cXA&&n5;>LgP;&ks>uxE9dU-(P8s5 z)>e5sRLo7~1W+)1(nrj*XEE!qm8M9&@N~7s2w5vFlvZK9T*RN;l^#fE@YN-ikjKks z@nmGlF-iy2Ks%J<%2$Pf_J0g<9gvTa?T4e%K>#@W;lN=*-^8_^L+=KvE0-V-176)x`2sJ_xrODv`)fHCu51y&K)vmCCF z4VA`zatIlMEJHii#9MgPN5I~iL-Zvo5ye3G41(V&gvi9YvQVk7l!6Q78&=21@>}_b z{2My(y||Oh;jGvN zXX`X#IME#$jP>zR2P=FcQ3Je=7I^I);5mxJcZU*I<*IT+d7wPO(|APL2`A1y<*o8j zkrYnJQnXn4gHau*@Y6%_GrEK4Qu_ZtsR4dwC2;-c6U#9kpJC*DBEAu?h%3Zn;ydw+ z01cB2Cd-j2n47C&jJ3l^8v%djK2&FO$sMTD_Jg~+6BWq<{P!$*nmj?SM%^|7w1;@) z(FKs5=^*qjK_gU38)DUP$I7NE#;K5PML%e)g0HOsWM2JfveIFSEn|vnI7Cu z5?;3Z@^$$M*esvrM5VG4jNc6gA0iz0s6J|enb7zz#U9=7JJRB%!Xag7k+v zL`Py6?(ru4%a`!)@5j5GfZu6G{Pq9$uO)0?O*r9q`Gos^4nJcuJ{ICNOjVXE6Hy~A z0cD{dUQLV=gx6zGB9s)o&Z>$m|B_$I2jP)l0_V?Cc@xIRQGA}1UtmVem(}39b^smt zA7w6n>M49Y!g>;l`__UOLTtd(d7b!-tD?X!R1(jv8sjn@|CbMc*)xz3FJp%>f@nvi z;NBME{-xu-Uc@uE9j|K|UfD3E8C;~Tl!i)Ur3HT77~Y&JxE?()Gfq>s;O<{ge&EhG zApWDkH76gD-@vI|O}0kX#V-(b@-dFLN~5GSI8z$nHTS_dyrnF|b!{!rmU!_zc0ymo z!Eo$7kZUL-Ks*_Tzs1QjuoC~kyzx-_AhnU-%UzUjN(5^1I=G^>FlG-Z?UliJEoxM3 zC2*yWfE0EYE}@_B{FTGMd|ElA`~o57GnhV?@f@njI;0ivGn9zIz1WI(*oSycJc2tZ zn%s%f zT#9H&ELN_`q4GOvkMvcXA^s!nm8U43h~~sdRCV!6h+G9Vof<^3@$egt1^u@HsUg?k z<2#M^-?;MqcNinriQ@BH-LDJan%~<+qs~i zwIl7+O}a5P4-WndsKUaD8t~3!f+}$V^Y}aJH1!&D^GJ9>_1HgjM$IvgC`Oh*wS9!F zMV2Qo;x0}gEF?vIm&ah7zLGmBtFgLmAl4B^aucbd)_@Pbi(tuIkV@y^&TNx+5wk&| zL<$Je7Jq7iI^Zzo&O!1JVi37d83q#O0;IP7k)ts#NX*aOF4D8 z7E>njiZWK_r1463Vh-DlgM=El}=Nm??Si?!EGG%qiFKY^kwhnMTx;S4twh+q=N* zIf6ggDu06GZ66A2*NRL4l$kG1{<7z1aeE#hIR5@yE{iiXT5rzxG} z;g~%h$W4)_>PIcO1vB5@#9HD8c6nvM4oO2!&?UI`dSS(zh?=P}eqLWWNNJ49zn)SZ z{Kdt@C1o&bl+wyed7l(7*CV>4qUb}$f#uQzzEcA9kPp%XT=kux$t|R=G4JR@ge?0| zzuc3nfHkp`zC-!3*92Px{f!{Z017Aq>&W@=YX`{J7$4^`+N)yZH$)9k9c;M({SV!Q zh(sslHHbjfK;w>}pE8}>KQ3Q1;*LB47v`IiN;ZKz=?EN6COk(LVxb~S*Wg*^q>18L zv8SjKt11#LFrjo0^f#YN&xL$(n^?%FNUzDt^ki^sL$G=h@CVJ4!!TE6qYC(pO4%d* zkVH85<3MsKt^83w%iF|fVz`n*{6yUztZb2E@f6mSqp=TeqP&F1@*A;LnTqjYCP0>oKbOQ5Fzwnt<4l07w23r4Rasdof4qm z7J>;JkBabl&X8A$yTq>G<1Lfhk;e&8e#t4+9c7$!Oim-tDKDivV0-B3bgUe=@m$?d z=F&B3uWSLqK|?M0uTsE#H--ohcgRu7ZfPg(%_?xOb`e8Ssg0lvjDVTDEFH_Fkex)M zuuF`ST42QAM4dg1Vv)-`SxJ_gz%y?nIw<#vuH;lX6T70LETx7oFe}P zLd7hQzS8I#OkaWp3#O8M1+>qX_`PTlBCYI8x=2pJ9Nb%J3=%_@yja$e@l-mQff`^Q zYND<3Uhs%JU|#mgHNeY_rCWfeVk4f)6_rrZsce%M5!=A7stlgQ0O~57uZOUgZUjos zHzF80!I)!|AL0l2j=EuI+5p7o67bnqCyeq;Fh(*!#_T2aASTk8U`6Ojn*Kvv7B31V zq3`-4v!JWRU{!d69c>YO-Ge|yu!8fIFLCg0ZXybBjgyGepvk@`|EmB@F@ zl`p|F&%mYs0Z+?$tlb1=qOy3p3Z%`LvBp6cJX6^~_5>mBhh)GgswXCj(};!CJeDr@aSH(p>Z^2BQ;5AQ|DJ97(*9EgJ5x)7>Rw!0#I|32vRyGMk?FoFG5|Z zD)ocuKqum4_dDActm@7D8gUenBj*cEqzp0*x|}0qLwJ5Q^f;olm?iuKt4K|iU>$TY z84FkQLn23-C2t_Kc)#700D>XMVuPq5RInX}X~jG75bB_$43%Y0%ic?OkWH>w!(6|U&cBtfkp zEtH2SDen|#O1IF*yg}5Y*E4?@bYZaagkZ*o2VF3O5!RRPN{^(Q(PPME${G2V*irln zx^6eJGPqY&2vC(#d0bNNfSjSn*})Oa1+$cQ*k68^667~nBf`k;U@yFoXA-Ft0mTZ1 z)!`zjxMh$5^+=uswoqd#hPh8ZC02lWvsI`d-jh$mJ^m7PPBMC$62@#2s;Z&N0U=tP zOg5%3D;Y@WdPCVjr>csvWmQUpnblKHmivP}F$m8R2y)=f))Z?i&&V=FO{|Aw!1(4Q z8MVDj!22Snfbz5nf8(pvL7XPqr0vL5=*m1&SD}%Hhn`(ai4tciw}=~3gt#0@2!qM> zN^|+A9Dyq7JDEsJ#7HSl+%K#ZUPz6_g2t&^wdpDtsG?aLy9F%_$x2ZPdF0eOI&C8F$I$0}~B)v>sI!Boz zuanAS@7!LQL%yata-F0|=ZR0qH+d=6LE=pf;Z~8Mx zxIF5lIpk2R$s>d=B5GQykZecip_8d62Z*S0h;%WB{|8L(XVew!adXH)s6K+IrG!`7 zCr*$%lecjd?~seAv#7{xVNTDaCJ_~}r+cJSMQ#05Q4x03oDpPCIZoL^g)pE7gYH8V`-uO7&@xRPjVir2=8Ot# z5H$fk^6%*8?34~krHFTQTh)DbGN}W_W&uWEO`N2yRE`i0=@4cx-e+0Rn-`<|R|Xxt z?@~Qw4|ShjMhrsdXExUV3&c~@6z3J}GqAtjNGz2r3NA4LmBmUjoE@yHPi5m=Y@J+B ze8%4gpYs6WBNb9dcBaNKz>v$;V(i$l{k!;jjE|P@lC0Z(Yun~f)!vc zdMpRf&E6nq5iX3e4`eh|iTH~1gK@+V+@mK{Jd$zxFguVo@fR`|N<&lM9^I%=)QBQ& zW>XmrISf@*889?o%9Y9T=+j@JRxm#L1-fdAaz?7FEJg?Ir*fT`&b(HCW$zRBu@kvS ztV2rsC(J4viTPw_<^yw^`i#+#&ZxmoYt47#e+W(FNn~B-2Q=d)aW+~Ed8wbpiPC(f z2i27Bi@x0_YBm*y&fXlNiFhc`jqgKkQkP>IC`QnM4$-?MM}XwDN+`Nv;n)YQCnljD zIjCIX_lUcR2H==1LMLUqRET7n*2Hh@8gs$D>4t9lL~?{g@te4z!fvE~x!KvO5zI6t z9MqEjIAcf!$pkzfat~vr8-niD3}oSC;j2^z9FsTb-b_P}HCw*I+l1pF3vHzqD-SUH z+(ZYYfmA4NAo8e-*vsbPyiSe&{6_GXc5=-E7C|5k;QVAV2kGlX6p~qb^H2OO136+U z*^{mdn#D`@2@*Gqplp@E7$jnEa)MyQpW|fvVn{YDaej z;Wu6?52acGcVDzB$;1*O9{j6R+Dx^Sh6ldj-LAvA-+j3fnNF^wrqbnzYy50}4SIi- zz;nKi6p9bZ5V<#cBIU?9@D2N-H@cGufX!A{{3;xgBqY8$=~3u`Yg8NQi8#ynSGg{& z5O-qL>Vb5@WSoy&!P&@KuxnN$FR3zk%-^ZebbU}79wN-7Bhg%LESCQ-&jtO>+sq8M z6Wy6;rtFbH)Rw#AoCFj%sv~P*XHr|S&&`!fk(F7EdI0k;9l_Y-d+1x=5q?QBl?A%W zb9x9H!A>Op7MBSl#T=UlGydAywjdE>Nj(yQ@n@F+rIuO`2puuDi$#gBUq$qP<&cQ#BWh#!j zz`Rr6)r_ZZbI0IIp6r<+6ldA#bMGE@gr6_i8=uqb}6ML zX4|D=KY2V=3+aiUKt4{z4#KPq0)w@uYLa>&@q&9U)I+5duUrz-L1hLh7_`N=(kpb^ zHp)lDNYFF?rdES`*@0d`ES8&L^-Ez^(AAWS!h6(H*W{*3UwSV)7L4MZQaN!0l7F_S zv(y9W`skgEm6me@xa-nZay>Ipb%!}XWs-Z9a?(ces&tstF~7kioJs5>#>mgGXZ%Re zpq_N3>e4bQ>UYQ`>MQrge&Vq*0CN@xrq2s`GZBU-W+gg+)lsL=V3-()NG4RZT6K)Q z1RwVnWr4gO#LT|JDKKh3f-_84@0lbCW;E;usn<;_Uz zXp42&Mct)qQ^nxo(hyD2?e9(0mu_<<13ScCm^%`bRALAEUUu}6gUAtbKjFFXPE^Z> z$g9i%W;~vu64WrdJMs`0ApxL?P@JDAd{vsTrPMo+TGWK@KrJTrDubnV!ZtBp8Y=XV zuQHY4X1oIG>~^GX@k%@7i-i-RN>8zdJO*7fGkSmJv4a?b-f14u3(2$_NfmirnThO_ zba1Y6lruy&x+9?^ON5CAAw;Q6cLZB&1Q_C7(P>MjhAG#PWs?dO*B4?hgxJND@?UF7L?^mPwNBNU+=o*kN*d#D=e;Ftp(n8f`BX52 zGe4YsO_-&woQTZ7X7pULqV!yRuIPxi(s;3}5&;%yIGHO?5$lL0g{y(Pdh{M1uP^l|3??AKajB52JxQivI{bXsZe;284R9TR>ddYLZN!v~? zB+|)b@YEL~|L6kWTA`?R=(%>MX0j(#lW8ZqgzJ&dGJ^XQcr895Ly<}{g4)FFWxHda z+W<52YNa|^6Z@6+R2vnXN_0h{NNGcymPkp5lh##AMRfZ9fNy<=x=RsE7#&Kk1v~UI z^bvW|V)7Dm2A#1CjHv*2#`~2JvOATFM4x@g=n4M68iOOVnIyI!*x5nEbY-WoBM`?g zl*dusnGrY#)-bh+190q>;GPFY3I~)VdY$T(`X2_pRQVM@JK*Jh2pxoF{Bhy3e2xl6 z{>TULDd+MZgaCfVe9|v`=0dSoOu*`0McyHA!zn>)X}NGw7$oh&=wF~jl1HdAbS|YK z%c7TP5MuakVhZ}CMye6rp1wzpQEv*xC!0srB2QChBp?iyiU)LXKR6_w zbTM;~)cYHJpqu13FgL#QANeB^4N6}l`UWLpwU|Vkm`h})R3OZhzfsR=a9pJYVngye zk{#wD>EypWk=0~vFgZKpROYBMmu!ZU#TN7(oG>rNzF?HB5xxhi3jv}Y+gM#j{gF9I zbta~Zo%lq7l715cdtWUuG2}C4G}L8J$#C>5o)aI*cc2)@V(yu)%$GYzljR2F3d~pz ztVPXKcj(UYNkNoCkz%_9d)l5z_E|z*CYFf=bS?=H(}_fa52 zImUW0j{2}i=$}MAX$V&%z;SND3UBWjVi&!Tji(5*y4oYp} zCMh7(do51(B%E0lQ@Tqx#6MCQFw0}fnm9RK3S!vb)FIMCtVa)V13EJ#XsY*AwCWn$ zh;A!~2qlGK;#8yywMNa>jrorp+6tafoIrx(d6N1?zX4OSv{M^h(|)N23`h= zaTxLP0GvGhM1}kvb#gSd9}K@E{EtA%KzQJL;0W&&D=C-A(M)~hs0<=?Vp>4)z4UDk zyc9O$Z!Tvhu+ymR(rNCu|C9e?U@32e|ML@G;35&>{;a*;+^7a={Mubj^uuFTj1}M&;jqDRKY%{8_vhNg3xt@c!=)#Rk{z` zQ7vlv=;rIU7zkqz!yEl=eSdwDeyo0-K2`rgw?WrJN9b7HG~}TV(wEea(9J_u`Ux!! z%8XY#Tsu+|q&|jgR)Wb#f^BK$7PE*QtEvdSP(}3>RddyG_6Ab{9Me(gK@Dc_f-7oM zbyXizzf(U}KT+RQk5NmiajFbxeb+;&HC@$AHGthkZ$j?sO`Ne}`2MD;_%2 zvLpDI`H$%z<6MJN&lkwTrS zzN%WOx~{UTGF7A0vow@;mbQ)Vi*BI)hklv9fo_$?qe5+sEXZl(CY&7{!TD{LEJ-Tq zFR`yMicjF4`0x0hcwcy)x_`SWg3h%Hs@`SxiSXn-vHR^c9n&3`pn?xL);JnDRE|3K z1TbR8T8j#E3!R0&!kN~gMZTg`+eP?!YCGQHN`7)yfSc>ByPJ2Ze>uNfCYha@ce-7M zN2aMk=S^RX-Hee&-mui@HSIN@vP6ZYL{x~PV@kxXime;lGNxyA<*3UM$HJe6Ee#zJ zveYs+xUPAD>AGRO-li>3FH+sbGZ})pD-j7jH_$KNiJXf+fjz#Oo}M72{cJbT{b{JRDF3RA43 zti7!73(bYy@n_d^hvc-$u9tN_^JC_~tSZ?=&Y7Gixxx7z3;4qKMU(8i9mAZHT$1~& zR~^U@#*!P=PYjRDVu&LwJ*-=3<&ZCyg5XNQwJpJ+@!^5U^q4jAJCdrEFeI-jajZB| zY;r<_xQa3JA~VA7gj@_RY0fv5FpkhC=v10=Y*V@t`td64Lcvfc=E%j7sxZ|E2#z#IEr@y(xhP_L z*dNR5pf!dF?H?qgj3jEw0 z?~WU;DxP%jRsZLJiA&`k@l9kSeOjXnDjT*v>T!%Z_Coah$gqf=;p4)`MeK-b7jr6h zb^M&f+r>5}Czg6%a#YD4$u){)#?!ISBIkxDhrP1o2JJF-)*sMF>;$@y$d%hkm4%L+ zg}ce+a%H&B{vxl_HQrvyYRS*Z83M0!dd?FMhcHglDqL0q^h?%zSNZJ#0ps zv*>+M=OVjxoV8zJor3uM_qkhger4auZk|&*cVb?vf|l0Swo#7Gu3Yy(?>b*Gzs}#! zSHYX+zUnkPhS-9Ou3Oon@kJ(Ej*W4wa#nU<^NjKR6-ebOaN`3hfl1slaWJ`9?K3_L z$&W~mIuMZ*79BDoIN3bboEcmyWM1g#@X?WZ(QV>KBt;f~ReW0Uu1Rm=+D4~E%nLgc zGCG(J3Ih}MllFl6E!&+bN!?S@B}U}=OTt-ntbxn(qPd=VBYv-(;i~qWsxJLbxh9t5 zqXHX!ySxuPS?(e3RCi@}L-!7MqNlMZ;J)o%>DIdYy9%8vo%xO^$3XjU+h^MbJLP=k z+T$7MV*@QgYR%^t2@jCrT7zF3Sm^8GsR-v^WBV>!TYR*#HMR}3Ewp9Y`q@|5@7nu0 z+QZjb-u1`1-F4rS=dUAbsrs7k#zONl%iiE#LGz8h3`gNSCQR|>mBBuX5c)czSxi*? z`h@9;s}hNX=CScnxnV~`R#`rpyPCEbLiMb+pZW&7kzS1b=52AIP(m0f>=!42gF0AL z2~7f5JQJOaeQ;3&>+!-(g|7;4SU=dNIVsN^-;qESzLIbVS-RnZiLc3(=K66XxV79= zzP6|!A!jF9p6P{M_n!1`pEx8tTNKnX1kT)L$QEjHzeprsJAkWkq_kLs|DVAIrlhM1?NO~o5LN`9Fv@*T^9F9cQ^M>_#~D) zA2_NyPT6@|KU<_tWh)DU-w!zVnz`F~`}=!vW?>L`*&U==qR5x#I1owuyLN!2SOVm$ z6NM8CR~0@hWUZ;zH0vL0{i5|nC2gd=H{6P?@oSeo-Tg9_8#GcZAWPja3ep(R-t;>mLBt!3K-l-_%~pyOx*B5SRmj(q`FW}$H%@>YI|0>O( z&VNU`aE4qPCkao$bJ`EWSQ~rWqCJHN3ziqWEzlIk7Se?;3w9S=Eof3$-de2aW|2@t z*u3BXq&tWD;=~&C9-R_If)4eMd0^0YW3J(tG2OH~C?R-MNVTw#h+Wam5?&OWS0XZb zZHeW@4kuKPdl^$U`clNjupXf|EicVGOqC5swKmWn&w=bw4f?fBL?V(emi7L;b06IMRzW!$2qvBj;$%NPGAX??=6xJ;}$1H-3)Gp1<6L~2I6xYPuGJ!_x&;vUlcA>Sh144t)FA_L;%#HEtKVz?GNhSCn9l{@0g)y= zbWX^6ONrpBL84)@u7n0`3}z~=r8m=ynJ;XL`lx!kno>Vu)9JhDK37Fn-(v2$zmo5S zXAhiJGhIDgX|A0v)=hch;XwT5-_Dg1mWZpN^7|>VNZQ-Nw?f4+AAIC3{^fz@e0?!S zehM~wA0)j@r|Tg9>==@|Zb~JEE`c;}p=+MwZ`&*DxWeiM!}EXVwE>a!Y%Y`AFQ;FQ zBd1E<`TX_;mV$5j_WZ>K6RaB?M}2>!QmkD!$yCyO&^*rk9**#xrbZ@<>56fh@ulf? z@S3n<(L3S~CKWI4E4DqUPvY_TyqIcH7sJh=w8b8jVw7|pwSMH$-ywd9jrkqiF)o7t zgoKE?LWIzSH*xR%#eH7)IcI7680-7|e{=ifdh<$`%cw_mMRuZUh}y3abo&hLO!tBwnaf$Oglr1U3H>|N6tWq-zG&l1?F!Wf zx(~dHtrQy+D=(2oKZ;y|Cq7#lD(@1n@w);QeT&?2&N24!wzoyAiu^?->?a&UT_rtd zy%qgm0@wKSpkHrRx*6}$)q3{q+wra`_oDJNdYp|PCyVUWTFin5; zeReo~g?KLQ=12P5dAd1g+0qMt<^P?RoEw_cD*Hf|I%{cWXy&X8EN=>|t9Q(#_w%-??VFXIW>-4Cc+V%md7G&6O-a!^%eI#upUd z436Ed(#1-hOzvEKYeE95yA`1e&DV_E_3O0p>ORbKq{7`4HNtJ~e!v;H#m(WW1^)Ox zc~iWzJmuXJoGJD+>x6>t`L*&l7aX?!vfXtCd;15b3s0m?%1rVHRUbXK45*HZ(@9Ky zwxenUPA)d-dKsyx*c^&hpQUJiF^Pj)d*yR^!F z(Z^B#o}L=6x{eXHyVjcEgKo_`4mxC5PO{P;y*tL--Lt2}gn<^P9>uPBpvtH^cvN(O%6ZZmNTQ77Lj`IDuDuEOJuKpE1 zkEf+eZ{KAdQ)nq%3>Fh<|K-f}{PMr$8%rgjP5OuWfV|N$RBei zu;uU~M)KKkAeQuP_w;smbRBnYbC!Xp{ha5Z_oDBme{*0k*ABfMUN|qFltPvDgiQ9K zN8n7VE4z=q1rOj9cyXt))!{5N!b4S&y~++yodKW1%Z9R7>0;C|=mJ;b1k%cH<;n*x z`Z{@^xW78x_BOWT){w%7`MdM>(P2m#QhRlIeWtgjUObF;;v5ug^c|LH-nWqKjEyc*7s% z-2UD^+WW$-a$j*Ra~*eeaaZ@0^p5mp`HkY+AI8k~q zn*Zch$z76T%z2T$0UtDGns2#8{*r>4)|W-I?Q5KaJY@p^h_8r->|$-EfeM;#o*uk7 z_>tKW)GjF9biu>~@j(xQ8-#8SpBC9LdQi;Tn3gdOqnXGSVVf8K{bGi~ovN@eO==SxAR#$9Lx{2S|Ty-*fL;?|ST9NBCO% zs{~qbn~;n4LR<(x^=oL}uHxJ-20o4U&_$m@|8XZ&gDiB{8^~ScD6$Eh5k@#8K0`5* z2u0*@sL^}kU)(9a7k=^=xGkVGjK#?B0em2lX>s zf*V_EhTaL=9o{gaYlJDHarm;(la}}9r=~dLY!FUvt9z*QYz@>F#i&n21oG7^$ew$S z{D|i81niMUqJ}Ri283(y-B%XgVGTCmS3B{v_eItgK{m#0vy%Qn2k7EVEt~-Dh30x8 zocQONA?#B&NVQz`P32cLP>)tOLe|Gi6?~a&I#Z5Wgido4sxP^eI18Ou2iXhv(Mveh zzesoCTo@#oq%~rgcwLx@%#ySG4*oZiVulKrga{IT+6!mHoK> zU7)vn1BE^V_d*2DLj!OR*CO^QA~YH;;8PEh<|73~C0yidBB#q27#g_dFYZ6!Yv!vC zCu$8}MW4;P%v;<01ABwRZk>CmYrWIsC~y=5h3KtwoGS|CrZmiak1+G;xPknBAzQ2m zJy1<#fwW+{scL8@!+U;0S607A@5atF!q5c7mPpWBQcVMc{sfIR$AIyznD3hzbKRhY zrmjX=|3o)VJ6@BZd9QA({-o-sdW&wnh836x@Lo=5Ix<0E&OD|I=tFdWs2I(39<_@a z05$msxHmK4H!Gkb>52G`KeQLA>ybmW*#zSrJ9A_(2k^5Cfw!&$-Rho{p;}Ged*hNei z#^c(b;)nCm{5g29E!?ZXxPai_?N9U1_OC}~%ME;f_q#yKNDWL4%n0lXFkBn1J^a}P z*qxmW(km>+inT==5u>s~1 zbCtQn9Ac2i$G%|G@p+S7%C?42x;eh%5;GaT&ofLF<{O<&Ux$0ohP!fs+KSw%4fxs< zb5d<86}88|aBp;j_skBx-aTkS=0T^}6xZw)uJ9gQ*){OdrNEul9M4`gjO9Fef;?9K zPhnGAE(b?@dE{5-K;f;H_rUl14?M58!N2GOXJbWpq1($IJTq=MfO<$-qC?Dw#(XuB z8lOW?Hc477EtLjJKj78AjHDMQzZ1^k+Q^>!!tdc%@WXf`f1g{z4THNl6{$bd0;a$P z|2o`}%l>@-4*vrGP5%YBv3muk2L=UdVyDJ}>CiQB$Unue3hWKUNZ5-kE( zAX01$w{3HH!;9m;??h2d6W58Qr7YZzEm-1EbR6|v}!L5G{|N98`5lgDF z@m(pZCaQ*DW4yyX>W%xOXa6umG1CMyT95~v^j&%e&S!Vxc_~fTrdQCL=vK5F-ppRe z^K3>MFqT)r)wUcyv)ypCkw~*`3FYS=%-BoefMXP=?2(Vi|KQI24ZZbaR7ou{zQ@38 zV8GgOOFV*JM@#9YcmtZf#*#)#l+4g`y%w9`^nI`R0Vm7X@X3MA@i&s!Ka1!*L5ft*54C6_{VSQbyn zD9j=i>E`qt%rMQF#?S$lWi~ONn8&#K3NwJM#AY)VT+L2wUv?X+xxH*APPgiUkJb?X zSBrfO?c6Us2gyt&hGAyW-9W`mplP}S=9>EW+K?`WCombV*>&)J8=z*1hBh^dOoiXF z2j=MJ@E{F`^YRf~mZjkqYX^T!bD|`iWIFih%D^caLVSnjx+>f|7jRatRi4NWWQ9J0 zV{d@mSUx0ogJRw#CCR`4$I)4UM|Cz)c-=K_xVyVk+#QOP;x2!2x8m*vik0Fn#ogT< z3KU34vXZRt-nIXQXP*SJ+1=dx$;^B+=bQ;o4Id9DMN%Tgz(s$B=Y1%A8_kpZVPCjA z7Re6IEnj3P8WAmd#W*-cd-*!XBOR-eNd+zj{-&Oezn!D2v3O#t#Ua?H^noPXaOgOO9(HnRL@8wte(9Vb5c>&FfzoRE%Y0h9h)PZ## z2Y0qF_@&>#Abf-Y+y>T)8BRzC`ZTWtAM>4W{1;qfD-776XccRBGDwr&AOgQ}M;*BG z8~D~FIKvt$Y4^FuPJHfRuEq!-ra+|M_j4|hN)JX|9Ff7gc}vb{1L&lMk*<+4k^La4 zpEI)KQQcX<_%3DjilXs!l-y13cJ*Z0?DoPz#=V~H=lkgho&dv3{0mXe2ZbDvo)ni~Hx8iOxqT8Y$ z$)xP_)Q_Df-~moD@a8i_xN>q*L?HXuV`;gL8;yj1c44|5N%Z^Ozxm&nk}lGDM@2Ag1! z#3w!hPo^`Bhj{U0Q66kj6>QOLFnt$bBR=C^i=aw(j(zeooau{n7hH-ZUCGrPVdorX z&GukTmxZltk0eFU!ipTj^8zep5m&y7>pn{-zzuwrhQm7%OlNIIU@|e*2GndEa4)-I z7eeq|%m3h_|I5hS5$%D^QyYb#4QN_@XW#ZCl6}k7Mc}Y5Cu*3^s5asxu}Aa^K6I$K z68t1RUQ0{_wtz8R%cGI#6!SJ3)arbqx98DQu)Mp&VLiYIE`aU&Iy#({_#gLFoblC0 zt&s<;{qG#`L)^(~IL{S%-CI_@mKA>q)Zi|5Pa?Z(ChPAg_9Bf=iYr*DTG)TBu&gV< zFHC_^dO2E@zuE_e#&rB=FKp!hxL*ZGW+f-1`rQ9Ac8Cl=+YbJ6BN+CNL3*x&Qya@` z#G=tKk^3;hAHbG*K-tv+CD@bL=ms&;bjI`vv#=prjn(u&c;t;m-sopy{^BrO8_=7w z0({XEaC82J10UiyPojN@wib$Rh$f5cF~=R?`NxV6ab*ddhifo$&wuE%Y!USlU*MFy zA8UI{+)fh4CfmgS5*s(ksuaVEH8l=v+7DZv6)AwVDh_-82xGLK-TIB) zyp~Z~4qvBQbU#0>;&0Ssgx~PVR(SgvM3^z`uu!BKKH+HOWTZOCXA3s=KRjxMh%3Ar zEKgr-V+HKEA~GF~m7l}&V0(NZvdj+cAoeIh%n=TCL8YVw`24BF`HxU$`6oP!Q{&%Z z5lqpEXthkmK3$45h&Jcm>cg~Dp?0;7RdR>5_z=5ui~W)xo70RF#cC`@23Ddnr{-%| z^;)8_?3+f+Y7IuO-;WWi#forZmG2Ybf7f1k8BJromB%a7vzxKi(F6G^BM{=QO?;M$ zljSs4PF=JYYN9RB48L-O{jeGvX5p`|V7z>MHHk*?`CAyt@m$s1Xl?fQduE~spK%uq zd}g!|9No^?%_ZzC5gdl;(OuZZlb}tN?A5*OWBU)D{J+=^H@!UHa+)g6bq^(mn8a^m z#LrL&u&~2DJcglLwUId=46n8ho@Fnex}2+MO?=ae2*k{6{2lodFLj*mo{u8$iFmA$ zQvALgbDo4sKowq{2Y=~fFD9ZRH6vP;m7?ZObBK*PusV96a&Y;FHLbzOY-5cK{$3wK z%b+0EC_g=?8**)O_T>up=mR*Nx7Zo4iOcjLhUDq;6} z@R0*i`4WkOtjI8Yq*}ao7XGx1c(}MKC#6Q>bVhe9$^lQ<#|ikR2Kb+{=E zHQ4?4P=$!%6^<}^UC0AG0GS=;r+=B%i(J`VIPUHF8*8!3wa}dS!e{CE`6>6&0)I7` z_4O5;&Z_n`qg_t{~*h|0I-OQ_w{q#RZr7gZ~ zA+|bGbd&r418jCVI@AwhEv&)TUEu666`PdJ6=&iL2l0vRz`4J|?o8v=JMf@ei4|(V z`4-S0ND#kfjVQ%Zd_rG*+ZFz%O>`ZPF_&374}115S*2z8%JF!EJIvNIRMVF7$^YPw zM~j}bgHFR7)-i()=IMJ(d5M{FA)%Cs7a1yEiv6mGzxjzMb3O0q$KGo}gm_G35_e+U z>!ONMhB$Q|>!JncpfCK@3C!X^*3h5WsSPl`{=zGEGU~C!%0>A74A#>`;`<`(+WN#9v-xSiD3@#O$Q?}LxmecJKK9%i zY#d!_zy#{e0qgp71Lo53gcXPa+OVz#inqH#FdNqp&>lP+}SI zL)B#xYrZP6Uryu;QF1D*q@t*1W#G#n!Y7$Z4xuaggNEeRMsiL%NObs;I8%+~H{sjg zapL(4#$#t*x0>Ibqavw6r7REjuMP?%iy5b3{Kc6>5Ba!)I$Uch#=S2#>ihr85c_l{ z5|9x^xKLAa5;+$_T_ypApoZK}3F3%eT=Vx=r$pVn;sV+odn4yzalXOptRZ&2i5kv* z{(q3zV>akV2Nry^cHuNF41Ie)(!_O25%UIN=!nP&zuPrI1at;|s-UtgKA z47@>6A|X4LJAh4caca!VD(=Ca>&SlFOZ2&!JriIzv}3oz zc|-GNH#>73EBg=;z(V%8N2?>()V4w3SEz7AnYeI!%bL~?a1YsSasuA z0kiQNlla|o^q7v|Kj;0(Tb;t!D%hJv*aJo^goy7oS>v5}tYie!8EdgP`$x{}=8v(~ zVqY2%`SvAZ>VTDRfhOh{@l^5>bBL)Xlb2Y5w#=VcsqtvdRKypFu(>j^3)}XPb9Op5 zbqh2025b8POPR|#%Y}Wtk6OYVtlcRrV{>fLV8#;OCCWt4dF4w^-#(Fu=+7wj!+eV8 zgzd*Z+IZf{dAu5WP(^tz$O=g3neTtkCQ@-C=)(0Th-1W`v21Us_1|MQ_hI)pu#SRQ z-NmpBUbBW?^SjGf_A~qjMjJ73U;I^+Q(|TOK~+4)7_4ny=C=ZK+m;ztkx@`$b0k01 zE{owe(#UpHBxY`dwco*A!uLVzq%dB?s{XVooaBqkAIZQ*eU^y3VaV%oEEr!r4tHM)v6z|+V_BA$zp zdz{w4@ckBc;{|qV0~YL0atQ|_*RdZjBH27%^R82z*q`(Ivz$>5^LN%@%ixXh>VL2* zn|S8|e)F8ua01MM;#_+RuDA+2pfge5ed6bzv6_%vBLZ0+a&jTLtgll#v`l>{o*wTa8&Ogja0M2$w-| zXB6kI|M9MEL=y+uM`!VFH`q;Mcz!cGZvdX>06uRT-ft7OcRBWLEz#&QzE9$DfjxYd z*|^8JqB5o&|ypBb9#u?}qpTCuS#XM}pRV<~I9qYm7 z)MA(RB3h}*x@*IFY|eV<%;P6kSqZMYDqrZkkT)tx%x(B_Iumhnc!Jk_%*yzMF+{}! zYu^+Lk%V`sh(Czu`yxEoR<83Mf9W~v=msP77q)sb_q7xo^B4d2nHa+B8RO|o+ zR@?ohV)v-l-5@$0na+zkbEeqaEt;b7$}s>rrDEM$|L{dtRNf8^xY4f`yJ}w68$nCtk0W6a80*5jccYvdtw|9!UK5``>c{%5h87P5=4 z6Q6t~9`WEMo)Nd*rEd8*zn#DeS@t7hddd7^_h>t`>@_ASntvS;y zA;=A8G##kTV>kKuMv&_mGyy$hT?F(#Okk{Vf`7_wF zJycu|@|Q1jU7M)@4rT{7VDFh2cR4v+ACW+QMzsX%z6|5)VO(x-@5kA}-$&*mnJy2x zFcBxp#g# zT*-SDGNR-7eP1l&_ZVs{p!&H3AU{-K*EXl7t`s1lu^Lzpt*wZ90 z#A$G-1Ht8icm555ETLX_VYCG{DNW334xdM@k;cZl>wdAWmg`ZLX*dO_>{CAxlae{otS^P&0?szV9Q3m~y zvgB32XG`9YS< zd)JERkVRUCt>Fgbrrr^CVv)pR$#ydTeIyF$6m&ZOh1uLsw1@SyQnX+E37)=4OOEalJR6NkAi6WMRHjDFF3STkxFPG_7lB`6bg3@r?Bt8>s+|RV@1D$^Sg)A zV2CV18SKb-Z2edCY69Vg=;>4wO$j#%HV8#g)yX5iP4=8TuXuaJAN(BpA6;HTqFs^L z(4}C-@XzG==880uba6$|m++F{YrzyTO6SVvNH(F*W@aAxhnqy^qIBXAPlk27F`Q3w zQ@ToWPDGzM^e`@!KURApBMiYT^BxyLPB}0rcC?{rNJj~gyu!;q7hU|i!&Pv zs@vaS4k@AsL~E&TPZF=dD~^-o$WBPBii(5Oc1ONRuE?^bGwHiFC0Zj=HCjac61Cn! zQnxHY_D-aXxI*XP8c&reEGmp`cbpFB-$hXRd!Tqs1$+_@zaEvKk){QA$7pmJ-ipeHS3V z@jJSOb0jKh5Z!JWnj7CDB{}7+7L7*4l9B!3Ok^CA>3au8(gerj%zJ-$6 zMbV;gR5%&z6)h?KRb~;bvePh<#v5!Qr? zh)zq($h*jn!$LkAIvP$9HASnW71)G#VmdB`-i0QKM$7KV{n8s~qkIl|!WBe|Bt>PP z(ZMMX3v?d$dQW6V(fq1(qeL&NNK{u3Ww$|61$)Cm?}4w>Ca06DxIp~85kKh>^(W6- znw@n?To%3fd)SqeA~?J75}RYQrL61j!4?zmnl%)WKUs zx1ce08T@d;@Snk1!TO=s;V&Q+O_FD#v*8KCYkwVKXJmn-F8Yj{f?m`<{s{I!O*9-% z3AaUAdK0|u5!7Wn2mcY;2;snQLKG(LeK_MM0|$IF{P}~e(Mg^iUJGXKjZh*m2F&D! z&^_YP5n*rep)f}%A3PD79NEsyC!)YM06fH%(3GUB;Z08u`~tGUE~q0GHn z8ZR5fN<0IKu_G9UIkGqMj*2pLCs>8@dvkeZxlGq4+Nq%P#ikz#& z<3&wjBgW$0&S61Ip@A_xTsAxx+(2bi@OK4|1n&pSqA^bOIyh1IDR9XDKmTa|HGjRp z^}x-5$KTFB+{(`c!;OT3+4| z9Ke3%b7d=46R=&IwLNqjbr*CB{V@Gn{bc=4z1VOaMIicaI7 zBh*Q%MKaMddIXDiVK6TE4%PhrLU}<90;6BxnZJSmrmv1~z4yIG>S+x#A+b&NWVDLj()lS*)5X5WR@x@9Wm_*;bF3F&6*S46P0yL-&VV!3?eNs{ zOM}sHGtmL@2}yk^x?rrS5PZtZ3azTN`mMT%R;w2o+rmwXiMt$kH?CgXi`Y)FF|mDO z7shst^~BVR8BVullc|#Ni{YhViD8_fm*Io{H~lL*dJWK&R13;milOpCGObi6=}ax< zkSLX%yMdE?m@@+>s0ck}&}8oyN(ik4Nhb|@1QqD*zfnj#4<_O->I9pq2fruJex69a z3Dxt;MD-=mKQc(P=&Zkz-9)cxx8f_kAqyx|m0m@zLat1KaT`+1Rn(xb%SW{N%gHy& z#Ii-;3@%eA*U_J27}cH(@?4D~`@%iYMOhUp9kQXIJ~)^Xya8^gl&}?k$11-4H^95w^N;(jtA=Z~^SNUHWBw%fPVR5HFLMUuXmhsPN7)bA zd&2?E?~ppLIOozUskb-7pC{yt?v$n}Ix5#GYbpOzY*dU;SQRBzYt*MTVQoXBxbW@_XGG-Ai3JT|=!} zvsIO=5X%KgG4WV*0Gq&6swk8YRtQgoPl5#H_76fZaN6IM>y~*RdA7i!h`Nuv2fE9; zE4UZ92YOa}U-;Sub_uYTh^hXHY>HMVM{pSL<>HJML3=Hq#3s#=i&eAK^*~8>(azHz z*M8Riqivx5tl6Y#u6d{Kp^m6D>Za;^>Mg27Ra<307|&TUr}QcQStRNinIHNrY!0mU z-vOx{^zQSn^Dd&NkIgg3V{vzPA91~aK{?tHq+g#mH`dY1amx{LWI6UZ+Bx3kR>>Wk zbHx70cHjENlFu?GJ30Fi{gD65ypp+_ha&4l*5>SOmX+42wsH0`bf_ETZ0|`5Y!1(q z3{)&r{i{BsnW0&zma8YIuWMTAp6QLIJ29i;ha^o)_2+TtODu3Z|F(Q}@~%tkm%1pW zYx1(BAxY;FrzM!;3&*CKR~pM296FP(srDdUzy_)Z)BP_-J^}rx`Jp7i>$~JB?w;jZ z>1ymQp9 zWg^z-UGWrYt}I@$MKO+^CxX{%>zU|VLh*?QYu_HH?=a*o0FI$)353fNqh7un+M z30c*$>hP7ArOdKrKFutc^)Bmcb~Wrtv7F+$LT-xls;jGasBkx0O+HZ_tJCXu>Kbcz zs!OT+Xu9YY7G<36-cg-y znZ2BLM?FWOTusgj`#t;aoCmq19Dh3AvGd}wbdy~7-G{uH{#L;?;a<^~qLz}QQoXzi z7Ndl+2wgm;D>f;{DLtw(+B5oG;|}xrm}J9&D3neDoD zy>-6zigmi}ussIWb6fgXZgGX&b$zRZMp2*ai~5G{j=q?_o;FuiM_F3=PPI^b&T!a# zJ$6O>ogJ*(gx#xk$O+QMd_ZXhBjeC{rva>#qrOrfVK;iD= zUQGmHaPM|ib{%tyoMwkHw^`0fdtLi;+YDP_+eT})rM%_$?6~ZF*?Y79v8Zhe>>qQ+ z&`r3G!|r_UX({MMpXJ>&R^561FZ6pC$pw=8Bo|Gdm?(+Q7xU6kKsR4=hVE?})O*w?)Cbh5YO!iA+`M<9 z!QlkqsW;C3tMj%)%epw_QoBR0!d!PxcU?G$%Uwp-S?*@8bF(wemFB+fKE(ZWad&ik z+{eB31C>IZqYWhUWKQ{3#YOB$g5te=o;*Q*O|~76UO;hMxlO%R+g9JlaM7^KP}VS1 ze?#}1uDEW8Hliu6v8Z|~vrw)WCG89++6D{i`8HxsT>G#!F(^suml~-JqJ`rsV9~P?mYk1>4 zaq!Jgd&l@(KBfP$?{D8~*7+)*$UonI!~fi$Nav>~fzyGB0d=6iU+Qn}uSxV-IqZtw zl8llsP<~OZQ=e3iR_oM%s03vj;-01SSj`K+^o#0_db_3~ov_|&{)S~xPm@m*q|?$K z)huNZ#d6sb^o&zPWujw<{6>+vE>0FHoh*wy`YpUH^ik*;_`_ezuk;u9FYs#ugHcIq z9~c!F2Nri`;8Wmd;i1qim=UZODjwP$lmvej&cIGR?*Ehte_*FL^elpMO{(n(SI^NHg}7yAO9(_RLaiO#%Z3^cPZ?7yakow5^ozC2x!WO{7246dYr0*mxKi3b)%%q{$p=dQj4;G^j%|uYatAm4r zWr_a|3JdxACKL~jgGs$9xRz+}3ask-!M(y|lwRtA_|6E#h3=r1pCdgizo1A|DwP)$ zKPleIf01vHeV|K=nQPpVMFg7zH%R=Wa-?7s5f$!TN`Jv@ z_^`|AA5$BSOek0^*i|?XsDrXqo4`nVFx`NiaxxGXF#4Bx=ej#NtLK)nFR@OwT+FVK z{UvKoRyea)=7nz^zV-d~`P;$F(^-464VI3U;nv;u*AAt(9Yo;q@(?N}Rg}+UiPC`N zg0zRcs;ZH8oL*tvYuX%hC{9S2o4hi0Ra)P)wA3ld!;*3n-zL6DOiA1t|0Q;&xvb$= zt)T9t?nalkV;VuD(f*@RY2@l*%J%XsNo{ycJ%aV=!M8Gy6&NjC6s`%g>1p;Y;08HA zN7&2HSA@GlHjf*^I8GqH(`#;`e>E$AoG>BuBqBrQ@ORmKc`9RXVQilA;a}%f(WP=esAFdM41{rOKvwkRC8Ptm>Qt?N9;8rvbx#z_oMS4>&mqd%A2e~

XtOZCWH(cA(#lWh&G11)E>%Vi(VDv`A#vrOiLZ&$ym zGOuO2v&vXvt#_=GY=7Auxl`Sb{0mUMcFLbAKhlwWoxH4Uzx255oWiUgqMf22WE^g; z6?-QZN$rv}Ni`Ga#FvQOYAR-s>qcv4tMjX?tBMU`m~_xOeC zNyErm&{Y41!l6~+-y>8}M0>?kCBI1X(qAfpHJ-z1HLq+v9FP;_0aGN~U_=iUUE`f| z>C;dW%;(Wa5%Sf?sRB#`DQk!r!s1X8noC-`iR}?O1=XO@r@@M?0iLt~ncgv?QuH)Q z1_8fHaz=6&4b`LY7p_Z=peVc^yzysAOX*RVJt?w?bdR(=y*}iUA>wz`XTDI&sS-U7 zF0DhjOQ?KsbKr#UwMXyn?EHW_!AbjDx*t!s3NW+hW&e{U%bJtfEOUBhAoKUE`q@&; zRLd*NIO_@9ft-rYDxO9Dp223}{gIj9vtDGNXN%Us(_Jh5CR20L-=kWr`IXMn5knFB z%G>Ec{?K%d?-^)R^g^Lxv7x`dkj_iT$8_~h&H!E2HF*4j6+WrHtzM?Cq<)~PsT!}` zrwGVr$XhXvH)VBX2kGb-BdIOkNj;+%b2J~^e`C)19U09aI>-;n7MsbmEuyNjin(h~ z_0Wz5ze+W68jtVztSO+$JCcb@ioC>96bk5ou)@umhcX4#4cf* zFrR(4oW5N(f`>r#r-xQD|LY@avWHom$5xQ@l~ct!LQZOgH?O65>qP|i?xq$_7jx=B`{qv23xFVvq5%KeH;ibvR@g|dHP@-(L7{S(Ov`Xg?q zr(Fc5T|V&{st=#3(Y}rpimVT(hGCw-I@$-DvSiRF+!V$Lb%a(zFJTxnViU>+e)DA+C(A1)12{tkG) zeAECEWnQ^cnWWL{_UmsL>KP{(Z@?{k!I#<8)3nvJ-t@a^r|FZathuUrk15Xd!MN6# zXgq2-XQ*jBX?$YLGB%>u{6tQh(|I<@uwL)iH7Bc6PJ2mHQZrHgMKw&7SCvU#v7)jN zx@D&n)9?a$6@K|HSiL3X_hd1$s?zRo$U0Iv?Lmd@5c#pYpx5JI@x25U+5+awB~&pt z!_{9WI0L-{7IKAo{SQzZC`dQh$KFh@+?POK)3tDm3e)LP8kiACrXQUo*o8Uy5Y)mU znn35KcVJCBg%_fU+$1swv_NgLlUdY1B~+*DvvUWLo$ExsDL}34H5Tv@o!=}ljtYjh z1TzF1{Pn@Uh-Z%bqqC($$jP;bZFy`ft?jW)3oS)0{_MBe2eQ}m^)34si^sB%&c63; z>rkz^pWDmX+P%_i@#hF5u+@F3O&vk^zASvlzS1VLYVto7{Z&0QjdgOvQDc(%j@e_r zWgcnnXr7LG)-3a3vngg$%-ERN76ErenrV#tOz##-7H1jFn*I_cj$Z zr5gtsZyU^p;d+;Df-YBES35%U8pXMXssgIz%En5Sa)BaKJ{UezoIF)7m1oMn$t<#4 zu-N8GuS@bt`cj*4Q{~c;`7RQ<2VcMn`>R8!awrOesC!Tx94|Z!G=pnb!oSQ{&FArM z^#0^kd7pWXcusjfd-8aDcn^3>`wsdNQQWJKlHM#K4fPc_>uz62g!Xt{I8Fz!R)2w! zm=w)Ry|psv`=4N>NXWXClUBqd-IXjM`_>3_eOKyp@h~2mMLpEy`m#6T=`;`*d>H8D zzwJ%(^m92J4|6Z)Y_R`n)7uVN%UO3=8e7bko7tnX+h)(m{*pbw;QkzSa*$H2JOID!fqb&OyS#xszr3KlsN9QcVlCM$=}nk^ zBk=Va(PS!z=iu!xjQnuN}%7=?$aiE%8T{;O>CIKiM1W zIZoH`B93ag6LP+wyyUT+u#K?2v^KCxt#2*+EVnF!&R zabRz-bhtd4JoCVBUlp~5rL;@(KpK{r6a$rG)!($w^b(`glx1pXc9@!)%%+*9sHw4e zomn0;JmzxD%b2w>onlgB-kQ6ZN0{~-7hssa8z&i~TKqo9IjJ^Q`oA@s#wuanE$Ob=Py3AeWH9 z33sOZy}P|9%QM#-4;!+(KgYi~5F<?O*EQrNA?LL0r^=@$;QOs0kMc`Gx+0J-&S2!|qhq9>>Vs z+BsG1i*0GPW7bmEEtbNTgV|lO^Jho1QnG)=R?Xlfx51iV)7h8is2ro6CES(0dVlLc zLtzMNNmQf4JK$uef&?omsVzMuyQc7{?rVnY9_cR_QjBiHPW<(LLqX$o<6&a~(|*%8 z(|glN(;w`Wt|p6dmNAdSVWXz$(NFlH0&_lL!>6VG}Z zyI!9DtlydbWr8ml&tjhW6@wOAsr>Xf_i*k z`o1rc^`px3U17HYeYI{&*3mt#5sbOjRGm{qjiU5lrAN?uAujNTuY~uhd!K8E^BDZ^ zp1DtRTI5_qZ^T2a)R~M@Y1?4iAzQ3{y}ew{iJWlG?A&80a0%`=-Y(TQy-+m{zM^ zDD$Bk89{er5MKJ0tfA~U%uYGhX^Nz&qyi@f3wq~2Q3IR;9_9=_`y5K>agh`B5Rfo0 z)8Gha(uMdxp{j6_ez70?8~oG#gJAv2{jcfe+|s8;W%7>qf%iEc+~sZI+w05k-|H_+ zhvEvTytbk~*f4Ytr6W&xWu!Eo+D>1vxiAafP{U3H+kcgMcptb}Dd@w*u~PQ3KMG2+ znXf;^v&4PC!GEKEHU(y!gnk=}@Xg>7p>E)kuaVd8KI9tgEQPIFl9Pp==}B8P+hglI z>rYmVRl@gu)`+z>neNZFBztxH4SROZ?~d87cb@A0dcv1rm2fFyhhFf_?u%B6TT1BT zDic#t9jTh6acE2H+Ze<~weg5yvSB{!zK(GnvD6?_jw!!6Y&uG$)D_6XVBv3&+VknuWzxo{=rY|a;iuMXYzC)hI`8h&2 z;5uY4p0Fz4Vy)i8Pg?+g^O1NOJ;t6B#kT@yw+PHmO7ve)i@(8S-AbNfMkwQZFB-uW zI7Q~6PM|tI#0eArD%IAq{yhFPe|~>4G%}L?9sCRZM`6r&3miZzsiQE0GsyRSQa|(( zEx|io#YpB94eVNH$8cBt<#fl_dX~NC(^fl7W&IlE(DsEli(}*I2Uw z;AVTXUaHdlWPf-=Xi;#8kQ&(F%kli|jySJ5Hswyw`N#eX zO{A{yyLP$u7i~NK_f}I?b49&gJxcvAmg=CggYvmzqM`&9m};D(|E4qbj2}B=ChPAt zonANbSVH!qE&lQo%#bcvgul4sTo705>7}jU?0$&;GNr@kLv2v)C?6avd_V!v?_Wo) zy9Nr+@qPz&#KqXDxxNv^xf9WjS>{{gJL|Lf$}uyq;L1;?H^+D(iHuiGPJlDP3@irI zl?)bZB#5vy?3Yc{4fU3SSf+!VZO%$EaHOaLaXP;u$pJNCLbEv_d4$imf|t%CJ`S#C zJu7Bm|O7_C)^KpLqjN1=QD0 z7#bP35I;3#N4zi$Gqxwv`pG=RyvRJt>@jsWsZ80%^TuAr!-lW=26`*XH`{cR`Fcc- zu&M4}?HFyc_MD~;XTDKtD{6hUm9rH^75~BXPeJqcFIijJZs{x7b{23SlR*fEVN_KE z)0qis=O)PVieN3hAiY*FZZXlPFbC%1h1-zr8;iEuh|nXH!}oL6D;vs7_WiablwOWg4Z3LcSbN&;*xK2z z*)8^JIR$d(I*cxh`)A*mKzguOczC1^JQRgkOE>B|vRK&orxkxFuTf7-)J@X&BIQ%h zs4$*2Ts0&RSG_fAO>H@4Xo;zYG9#^x2IEuqj@i&d|3o)L*GacrH-qZuBCS)iL^D$} zM3YzZKs`mRRyR^LRrXfwmKT!WM-O12thnqQ3MAv`^K^jwb&2nxA8?9MNI+%l7ue{1 z=?wH5Mr}7xw&|cecm6;Ewg-n<8Lrtr5ROr};2+=xHVW&*FVWfgGgO28YvbSrp*#7h zr-41>yvNYrzE_}Lpi-b63gQ0+TGF4qbubV-9vTs@1ln;ue4r{Ypq_!rr9%&ldpkX7 zPta3a2Ew6|G+7#we3jTh(7a^7+@QsS*n(* z3aY2d>dN&BnWDVhA$=oh$y!T?p*o*c*$mc}4t3`7;FqW3N&ZJhaROM)b?6QJ3G-yo zcU~o!hapI)1g^>r3I^#^`@6_J2VG=}h2Pp=Qv4HbqPH09t_OFGw5~hIcm>W=1*Yr~?SK z>pYH&4~UO}4(S2EuLgMR>Y#pW@~8@mrk1!koVOQXcWaW(90oRSFR<$};WD8dVM5@Y zudH{R`-D^B*qSqzEXri-6U!(|Da*&~RoOkW%M%?}&7P0mW{PFACB@nw)yLbmf;qXl zi(RL@{|k%_mJMHw%INasHJ&qWGG-I;zBP0= zZZlrTcKu;&V4P#vtC#Ap>(X_8-CZiEMbV7!u05;~Yj&$=Gbf!@|0riGQGG)>CKr@S zMa2PBdjym&)(~keVs$+OAA66zaFZ2Vhw-<7;D1Y$ItJ#*Q)+PgK{U7H`HEnSKEX=~ z@%YNl8481?6Nvos?3@kE(iZX>#n4<>6Rr{d80s5xQBSEB3<>wa4{Z|qfk*o@(3A*T z94N%TSsC~oXolx+5quRKk3Pu7aBXlldho|3;LJ>*`@;bI%0u>rOA;^r300up(gAei z`;Fc{E%^T+X+P-*lu~9&XGlkKs;nz5B6XuT)QQ~haj-RIV7CqtJ>qn43!e$KN0<1U zFU{M-{TG_G>fCZUEA3|cVcW;`;uErN#xOKIprCH8(IXFjX+sKu7Wk3QDg` zsiywM^9GS&wf?%kr{TU~ham?~gVK_&taiL6UUNs?PJL6=QT0tZUim?hs^~+l)GW&{ zjgyoRFJLcZfW0mSLuDj5>&9TqZh;oIz=MAmX$^w5F=y+SA_G{?2>G_o;-j1<-V!bS zfprt$hQ1<3D+Md>VPqxzcN-co-BCFDGo%iU1^w4wFjA*m5m=0h?7%?dKuSP~(v&Dr zKQKP9CUBn@}Z zz_3hmMspw2AK->9LUfi%#^n~-7FSkgR^IH1*;li3$;wBv6D%hzHEpkR%DbL>`wA_? zU7}*~J;_PgJw+3BNL$x1+h{fBH%&9en+5a7nANdm<4VL8h}~wci+*hr<04ewY8jsC z=4%UTLaL)G9r^f*)I=| zUq$X{6{DL0>sbdDz6i{W+Vr$drE6S8JkBcmmU*PL(DkVU`sjnyL_Yky?1gNm?6%Z` z+MQ862b8~^IzkuJ32H?4go}pH5)%{;8q7n+rJL6>tfdR>|K_6R*`L@eP`})S8-o7 zXs2C850y)EN*B@(F>W(Yk1LpXGO28`HR(uVM*P*dVR5Hox5Vr<_crA*^wSno2b4>d zrIcH!q)wtPeM3AG9fQUaFWqT65)IFhenCB^5K-kRBH%uvlW-CG!$dg68SW{(fnwkL zf6{4to%prHDD%kX$>%K|8Zoc8Z>qLHgiO6>bN(o!YI`<5|42~uyFCQL< z-pYiqGCcoB)%}(5B(Relvew(#J;-@5w_VOKyUo_t*3){;vfnbnqOlyy{wq5pyN@Mg zS!4}cf1?Roy&RLXkaw3*I@(eCo1(m`m-?!vvMyJD(bOkSo;WA*V?u?5H*rs68gRNS zYVK-s8~)Po&@ND)QH@u9QvRY`p)kwGW2+j&2KXlKOY9PlhDmM7bg>gY#ZkB&FQ`EE zr9SmLRhhy>Hw~pdvEZ??|H<1aYp5S+K53VsFMbuh$u9c;>3iribl1TVR#iPfHEXGC zuXK^bDhfvQ;c1-Yo^yIXjnd*Df!~S1)(0$9>{F?TpQ2yOYC11{2&PdHHWq#Q$`8q{yUh-y}=LMMVQ5-9s8-ov*eh*;T`_F-L3f zXx*D#JnP7}!5P=nucueYNY6O(ZB%CStfSezZC@RE{NczVc@OP!<6?8Km@={T<1*t1 zC5clfr&&{1C(ldxIku`P*-%+8XoKqFpn1Na^cE}IA|I%X1HD#G`A%M+&XHfJ&~}vd z1T|Jba)*9o^uH7K`17Gpe96<;`>*e3Az%13oxJ{&4v~wLxvEauM8i{4eC+7BDRDbu z@5Fe`8%%o)zv=vHqtZk-)*;dN;cwKE>IEgj8+JlNPLtjJzXiGo#ez?QU9cY0Lc~VF zA?O&!3%vuk!LbbD^k2oF?)&S2m6EnehRyPIsC`1VBlMVfT)6QVx{08!mWTb zFxYSRW%zz3A9^@&NH`HZ96AwxOwa5V;&qa@QnCCq`pU1-KD8^RfX~<=e?va{1f8BH zh_ulqbYnR$g#3AZg**zE93|nowsPpaYO;%Dwax7RZAix9^nU3Z(mQ4}`sVyLC9_?Y z#M0Hi+0{|FATF-%Xv`DqkBdq8mXJ4TcFNj3`SaH<5TCzHp8P4Q#6z)T%vDX54I8yh z)VT_Ue44C;d?fkkTFUB*zhq@48c{R$O@2CPPYjAwO3ip5z!&4>V{j^wHc1-oh%qD;*0G!-Yqz zB+3&l1X?bChz?7E7QT(>hn@hxHNf4}Gm#!jSN(?qr-b{#GoXHVadwJHu8~5ql$0HwCe2V*=@O5#9DXWOZY#X0*&$-%HGLj{4uFn%&An{vLnWPE{kK^od zgA=MJl}N6fJSu5K!s6HjnxQl|{cPHZ9{6zmBkgQWY0X&8UCm_8CRICmH*qu+AE@lT z>~cCbJDxkvIKqy9o&UMA-OoH%ydC`8ghkIu3FhMmUu#-?Bl_fqF+WI6&; zU2Ev8Pt_OKH`T}MtLxTiR;jFt&2-e*D4iu$N%x7LMjwYS2A2jJ_hDeTrj>AuQ=;@>(*L^eniqzL8VZy)Fgr_zRKQo4N*ZNi_>uPolYodLB?n3uU;gaN#c4F*L$q9LCMfNXZS}qO;cV~L~&HMK>Ag@J6bKgK)B;u?Qy!E()+^WP&rRISGgv;A9||# zYWk}L>It{N$ekm?x-J-kErJ`V#EQc2pnM%+sFI4$!XE z{Hk^+e^*qLhorA1XT@tp6QUC%JHom2uCoWXp-|e4zQQ3Y(fNcffdT%$z8cg1mBJLM$8a4#C`3re3xGFe)wvV)|$b6Q*^-HbKEZ+<2GO>kW02Pd4;Vh);W!cWvGxX_t~FCmc;k zN&1vjAUQ4hTB0TH@0kD0@68or3dOuO?KQ;e&ck>)L0q;>u~9xuaxB%$d2a7<{aaN2*|+Z)7iBX?1{ITZIi^NjJn^wvd5 zG{xT=jNfc}J*@QXbIaX@++O#u-rwk)sSW=gb&7-1tMb9hld8Yfo#7pf)0ESkRDV{b zD~~EV%ZthyNUwlT%A(itb!iOa>X8nY&cIf}T}HM07+Ab*-XY*v`?%&f|8gXQg1_h3 z<;-%G_4M<;@wEsHp%d$TI?JD@mUv9 zDqVfu3+)X}ThOH26joV%>HqjU@4z};75dWg=O16D_l>8MdlXvnn`}ARyE9*8Y)+S@ zkNbM_i}}ma&#gXh`F!)s#q^}idfBfmLpf79ToZ&}q^6VpqnsPN=U%jR zvL;a-SLQ@>*Kro;Aeca}7(=~-ABCMl@1P~LC{j^$l)gXN(wp*$s)pM8`d>{;Vgj-H z_(}=K5}PH*ri@LVl{h4>w&}Qbx3aU$C<&1-(u;O-^18$6u@;K5+rl?OHG@3^-Fy{1 ztz1_e^K#|6s$7!(In8s`j$fVS-0i&o`42Im z-*xYO&wuWZE{n5*^N3@lV+i`or<~7SKY0|sQ~r6vfzXY}CDC)qHd#oXraVc9y_Iej6MgSmJHxDwtcwHZ!|@ z=FN;t=~dEOrk_bKoiT!@j` zkc&?T1Ku&NyN)>ywbSIP?vC@i{gdh9Z3MMt4;1u0b)Rz8a^Lg3_SF+6g_cIDiO0!a zDJN>{8q;Dr#BPn%$7RMnkMET*GU0ywzSth7GrATi_t#g5m2%ZnRX24{^)A(DWl6h^jVe<;2u$^JwMpF&9QjI4?KyI{Tm{m9zhX0)m6`GfvL|$? z>n}Fo@1}%y3RnGiy=KoP*Hx$7Inq(lG1eh>W;mtpGM>7eOeR31(j9V6)qJKC5WSLD96r0>+vG_#7&&^ zz0sjCpic=`U@{bN|LRy{|6u8#wfo!Aj5-o0NmEQ_xnJhD`<83AE z1MJW24IDSU`y*SFXH8?1dZhJFjZbWD?yb#H4p!aPbkJ`#HHd4MAWDo&u8`+Q{wW0- z=3kR%a?%3x3+;8HiCT)AifW2J(nQh6aHG&Op`7qmXhbLHgm6_jZG*$@Lrn#lZ=_4& zD4IJZSLTfM6h_4KL$tS~oP4>mnEGdw=;fNy%+v(c8dWECjP{PMpS~Y8M3w%yE=^y7 zO8rdZ3ZswSb<;Ekl}O>0R*-z4f9HPC8%=>+)Z6M&O)xg zT?O4c+{HY*J+r*0eFyzB1FJ!goe4@&7`_RHY)JTCI3>~)Zt`9@Uv}~Dbc>y#SguS~ zbyAg6%}_poQ#XY^4JtY^*O4!k-(Xp zpOyVd{!S=E7pDT&hM(8?Pth@?WFVOuWpVOdl|Y?-3eAheiAI5CRY?nzO*B*aO_zKF z$305=hFs1v*#nfe|C9EU3>2l)Z)UB(yLXYhpzEt+C%wTg*cw~YEPb=fWY5eFX2)5U zW@lx6$SP@>X&>pH7y3h%q8S6jWrFIYcuKHUV6t#B)J*hHUQBz{;4|k*7?CnPk1^lX zyv9plLBXjy>xhOL$Az}AQo?hGKm-~ zq7OKZZraOCIJUzYnd_Lbhe^wwN z*fumTd=)l7Du`5smWWS_+DCs2cMjGK4DfyMY;oUm&2jyoqq6{y>e{04xJ#6{0Kwh8 zI0f1Q4|hs&w?c7ur+9HMQmnX3(c;iTaf#cw&%N{h@a0PgNoMBGJ?Cs)d#%NeF^(Ec zhS+S^toJOfEpkgnq2AKOl46-}$+vYx2dlPxk?t3BTG(B~J=LX9A76@lrl(%8glv)K zi|IzBCZ>PO}T3$p7HZRm{9H~7fE!dI1=#T5U@;9WGVi+KNJl1E~3;qSoT{x`lszW2VefjD7D zXuYhovXyFxst*%j6BIY)59I-QKZO=Fg#wN6^Xeb8hjlOX>4wVmo9F5hw27MU)Q?pg z$Z#W+SLD6GdJn~i#!ENS@u&g@&Ii}TMY<|q0^R-T-WkM^k6mrubv<*ur|31#@Za{0 zLhJUvyFO^VW9~|xSa3XZ{ci&Oh38^+XgUliFW_%}CTS;4mEDo`lj{_d6l)b*=#TDE z>{J}0>UmpXQ+%u3r;Jd|SDjKV0-yO%(M8@)HX2lTIJ{4X;evV|dMa9k?}FWZyU~wn z>R4p+Tld-0?Qfj5J&k=?{$qi^(B)q2T4G;s&9XeUw6&hLt#K&PW~@aXq@`vV6PzDB zM%N(%6qP?1A)XB_l&a(d6xWn;?4?FGSwGQWGpsfA(_6L6HFeY-RZe9%mEFzQmHC|jk&i34OYu%U826OQG zD1Lap1Ce;m`^FU25g;rQg7|e@`Zte~@P?CbC+4 zRCo+kiu#Ir0G*z@+KH(9*3ezh{-Eutalr3CSlJ41askZyMmmR17!UfPo!lQi<5A*r z=7lc@M>7F30L9u4e783^H>eEuq9eB7SK4PlnaAO~=sytH9_)`jZ9|>fP50nEtOLWq z3h!XXCpUCXGE1tZLbZ_IXNFW>St635|ul#md6$O@-66xACP>6lkIG1 zyrhP-CpGfUpmE>Rml!Ih2qyx^{9l+On&h+i&imIffzgEaQk_7IKg`$Kdw?3~W={pC zh=%x^1@ncmp)ARBSXzE&lD!eQhZaRaiCY5J%ZDIUvSNy5cW{<-c9 zM;XTl$5hu@&!6l$n|GY2rF*?=kt^W(&VAa|$@$ve*EZ5x%qG}lT{6#1?;_s-I@PO# zRm24_h#FzK7%RLCGz=(%RmB9UMzL8nN3&RK(N?1$@|n<1`mkRz+7lZgb{O7cj3^8;s|FvI_Edvggvak}2ZWV1UUUHJyVWz0FW# zIPA^wrlN}x<2&NjgK1phc7g1D=rX%!x(iXO`NuPv%EJ^m8qT7wK5dg6mEM=VlD}7MWy-1^F=m|VFD9*|%4Ldjiahy0 za;c&%U6=KWaSEMcsC)(caWg!!X{ZB#Cl(VuLbh;ISOjl|fj)?y^E1NV-!}ymMmt=DX#?Y6$ zAzdw-A}^!ptSGKnC?71VEiK|i&4oLoul$*!lB$(jquHQ&T4a4dPeaY4?5Sw1c%t~M ztg7CkxvH(Ki`5+k<^D;1Rdq_~Crckfhcg3&z-{_%E#x_%d8}*A>oeP)~7zXd$BCc~h9p|RD7R}+K2vc0a79?@X!(>yXMIcU?hlI(|+fIe6jq9FkwYxn! z@{PU2LEiWDjC0G}W8J$w?R*Vj^-+apNp?zqmPzH~RdGRePm`-V zZ@9`#M-O9f!wUU9-2?42O?6E<%~j1Y?F(H4!x-Ze;~3)+Ltp(7`bwiziOLjIY7|sD z+MoroRM z?j`#>07^=Q-pg)w>M1mZZ~MN0WNYOg=f6z9p+#VJ;O{^^DrBQze2S;L*B4HWGpKU3 zr#GbsZF32}$@=65QqU1&WP{MUX&_4kp;H=LJQFWbgcNx}*We7;&w;XXvMjuHGy1$a z)I=Y^B(|3R<5VUJV&Hi0MTdJgjD=2NpD+tF_c$gA7okivQ}|J6BDl~p?+uPs47>sj zd?#=@un}dyrF{GpC>s#`pQubd_q+Yt!1w5Q4GCVO6TcS};$}MWYng3Z5BFp@P!R^Y zZs*x`>*+6cQPx-4RVUOxY5pO0GiuW{|7k=`F>P_}0PR28+PVe0*SZ9Kvi_s4t8TmY z9{V>HJV;gM^KQfaGE^B-Y*REPR+q`Ymn|d~lYzT!2;YnX)q)gu=5#a#CWA>=1{(z? z_;>madv7pQqAD5hiuw+S`DNj4I%kr5pZYTy}Z5eT7e)64%2Dnl3j zP3V_YW}-8NUTX{HPp`8oFTqXR{K}o-W&&tBD2Xs;ghmH+fhS;CZ}~0$8m#1>tmvh{ zKLHonQ#`XM?coqnf>+uYIEODCLQJp{1k*b7>}SId^pbhLXrT%dN0DS_Wnsj6EF?1* zR1bxcsqD}<)S1e{xi%GczE7wvM1lt2@RddHgXAfww(ZP+ZGmTOFMKl(B}qgzmr*nu z$j*4ql*KgOdzN$`eg5VkWE-FuvP}9)T9P}|9R%7-V(&)M2kfXKyjf4s?*o}Ot1`0ynV(gmWCvz6zvIEf{asfQ`F=ZNAS$;SFi7 zG>YkiF|wVqYgksl%p)_(E6}TJB_GRPzd|h36@9DU6&DrHm}@((XpPOwmLFxx@TUAV z6Nfql%}YKESj?C5)7a5<^0mZJ>*Pn!*Gs@&Hc|Ybr~~uMKk@_A0o(H2#Xw3vBUXMd z^J4U+@(kGx)P5F&&KpLy(+|YNIS>^RFzQ~ah%aPEWoy7$_C+@?1@)8`L~BoYq(N># z73i^SFOM6K1u4Q!+rL&E`f&H1;HgT%`PG;@SwE(oeg|_{0p#WUU>PP1mIvAe+5|?z zFtw4+>C=D^h$3!|!T)6iZUuJm`@_t0SI2h9@r*m@adxD;c@gi{8m7S6%*JNZi>V1- z>maPdQD1cms=y*t0Tg6;_-oz#)b^F5wlsHq2b@jQ*(+_iE;CHIK`=xjT=Ow>E8;;` z^#wh-iFNs&pQu3P-Gqfv27=`ie^nd4oyN@S3}S+?jI;#!t4!FZ%1GPryxW-Wd4rxt zE?A)lAjXIDeD~O&^T{bX!)98G2{<3zq9b5qc8cfdL`RALQ2Us}9!f$NKnQ+DuV{3z zOE8J-Cxa8D4$8O>@tn{gnns`T0Z%wx^8>>JQ@JPm0xtqO7yu_QZ}cu`r2E^06Vw?M z>wZigEfG#IiATAL4;j`tn}73!3?T<5J`djqgtA~i=fad<51!%==xubNA2$b<+o>>g z{sfa=U#_}6$hetbSqyKGSACLHg*ER2N>pC3wvE`SZNVed_>znpoUUGnL~`vv@Nj;uXgb6U{g>*+SthjZA#dfo&P zw4KS+G5DksFr)8;$x#lQVH?iyUQqk-f{jzU3tKcOSUH%=PJ7Kn{XzWEXL{<%=t&I@ zE)Sk%!rBpxVxQLLEYB5kL4+-ZTQ>)7)ke&?eh)X~FQ91;6Tw(H(-lCZ)dh?9KTw3t zVYt(Rr+GwAxQMS+0Vd7LB)uKAlOtpw&A@d&WGZPdo^1i27wFUfg`y5%BEG(a%l8aQ zlas{W)RfDkG8BR8PX}}+#k|fJZ~~mSUAY4Vs1uZiyIBe%?igIEbKw9z%r&0lx-JqGJ_PfZ0e55; zERVP8=5AvuVi&C33*h%0z*U-H^%TWquCG2EqMdlZV~KN@@h&#=cgMlUzl2df57b~u z)(M%T9W;gv08_*J7 zt+`l(-`M%9*wqI?y2^s0WnAN;Tr65`0kIUfWHorZLUcwaSJsWWj zV)?9t6-t6dJBK}clRJA8Z0l1P63=qKAF%>OcX~Dcb}*6q8qUo=SO=aGqi1k8uYTpV zKE{6foxfX1Jaz&8(+hAD9A|dEXrJBqx|=@25qlEs@_E+s9uvQ1Vd-qm6|RIav<<5s z&AO)$E5@)g9`phdv5mdC_HN*Cm-4ZkceDT`>@>I|8^Ru0pGOar%*IbI2l06T-@Ji$ zwHFlV60GZf?#q6DvWPqJC+uA7SDT(luj0 z$5Gq3#_EiQTekrx1wJmU&1N`iFYw;1AvxS-uQ*?uVa)BxNgPJSVhB9Aqd8Y&m~?D{ z7C~_=$tQHb-oo?!gc?l&Iw~@Lnt(==6IC%q$V)s^$V6op`YKV_n>KLg*5n+vglBUy zT(s@^9Kz=$7)ZBbYwUa!GDTE$_ln+g4ETPv#EaMV@g4&FM$L|B$R6&@-RsOAp2%IA z&3j(W?i~Qr;spHBC{P$1S@|LztQp+N)`PW;Y(i*d+1Iq@)4}TPEPfXuU6m~cHlTX!RI;Ge_)*p zVAf7%2lwLK%?5crn$;OV6y1dNE#i)raJJ*HHa%IDUs<*JtW9_RY6fdu9A4m9R^0`6`-hYCC#=}#d9Bs#rDdG8 zxmd|}#DLk%N4%j^afkDKjXkxIopp|@T12cqi<90NJ34^(I*`-)2X;9JorWkB5Q^eU zC5)B^VoAN!K_+sY9O4Y0SNS}`2|f*K{Vf(bm+aM#uX#y@`aM>?h^_lCG!TlEGji}i z4v_4{zxsd_{6s3g=o43ShwD9n{n&&LxWZ%3N^bEQuX)T%p5-I2vI842jp%n2cex*D zX9e%*3RiH6uP3o2J9zvJUTZ7&cQv+gJ>TEOd)(sDHs1Sdv}Al-S%42U??Z|ojDaP^ z!t+1m^$u|_*7De$JkwdQ`S-amr+D@=T-g)+%w{a)9M-Yuqey$BDK=ij!&k++RmH;g z1u-?7weNx7t;OklgHJg~+`b4OvzT4ih*MMv9*$RVM!ZD(>JahJE9}oRrpSs^Px9ES zY8bAs5Os9poFt10C@dOa5GjX-VsA3^;d~v(DVe}|8N~m(lV!{RXTF`;inpA_bWs}m zLWK1n@rehk^^WKNf@VQvD3WNr%GbywkvJy>+gE^%GgIe`j+fDS=1 z-hYu|PkElP39C^C1+@VBhi{4MZo%nd6_dV3TJ7*C!&t9@TyIq#Q<3MW#mY73XJb%g zScQc=Lkw3Gzg-7Qehdry3=12=@~hbky|Ls)3Rl13vk$Qcce584vp0|8;fnUqFMK`0 z=L&Y(ZvN)d*T1>NS$hatFav&k9hw3fc4j=b!Ol+)u`gG%`?qn^PQ1N=Asi|W&ayE!$weoCHZRMY`)^0 zJmWe4#5&~g*nc?57V2gB?EL3Ed(mllLKW;juU&MNPq7_;U^#Yi?u+!C`4hM$adaKQN;Ke z)r%taJ~{P&6BCMVc1tch`4zk|B0S!WxL*^nAk*0yMOJX@*Z8nVL!uA%dn)&K95!zf zdFl+JgckgLEqsrkm_tgWE8vR~h&dAACGN^ce=PW5YSOF+2mySd`CcS-A?tVl9Xa!@qtg;ISyfx|ZQ5t-rof zk$&ZPzH81p*ZrD#$a&2i-diRs9*43*8Z`kso^ZQlF|6mUQRp}dcjjK|OFK|3=)(l0 z6Aqg(R6pN_7BkOD-O@)SE}H+lfj27u>I+$gLJ9BZcQVM4Yh=k8A{6o{rTT&U-(K759nv#VyQIXMkSm zKs6#C9yEFIT|f;Vc9Y=8U`PW2AixrwZBN}eYa&MS#fC}G}_vP&QpDL3Qy=g>hPt{@Q^h)-^;j)6ue|_ zGK8w!8Ly~DY3_5>}sbqDPCxIxqrB-i5!Y z#5~G4Gz5R=&hKQ3b03j#3CS*e>=H4J)AJV{u`fay;*~<~_G0qo&BSzB?12MVwP?wB z{BbKR_ht4$9lZA;vX9d26g#IO4L?}q6Yo;7YlI~nBFP}S2*+C$Wspr#W|hh`G8+m3 z7Aj;CaJ%JEX=s3LZ-}?AM;vpAOtL0>?HA6{Q9N@!A{0MynV#67SV$A{liNg6yKYW> zcE*e$cYTFyRPD`ej`(=fCBbQ z;ejB~gPlNJ7emeKAk)pw@ELokY58Hf%H*q-=e~#Mi$)1%3GcH7(b-wDd~2vPng@lP z#lu`-ZIm)g;=>^=?^)qaqR7|1PK7xqY9m z0~^v7UwVdUa-G-&do^2l0rTY@>eWHvcd;#Tg+25G5tJG0`8$4i`_~A&FX!Sq*>ra% z9yQopqA4owr^sWL!i%zyO5GxC?g0Gm1LE{W)U_58cmEU$^12JfhaeA==uUno{Kib- zUMAS0g=Sc(ETJ;q_b*XJrhFVtMWeW%TKWy)Eb~>znRJukOV0%B)7SY?93u8416N?t zB}9E~i5jb*ejnsd=R^ib@NVoG`99<}tMv^Mwg14_#YvaTp~?`18+B;C*nILmXNMi-$R ztGSL2RSl}cx5@YQoRv%Lc@w9vCozSQX6w9(MIh?cIWFk|DfR^#-Ncte_nD9Lf3(yFjsh0HO zSC8`x5o8Cv#Y~=W1b#IriNoey!Ww4dU;pCOY7n)RXNQI1K@Kuo-4q-5nLIk1?D&@S zUs->6hLYto*=Kvn_;=yWj`9rUh#E>V?-a?oe2^9rg> zXqz&v)Duh5f;G$`uGmgyy-zxaE<$DIvRBJ1%6|qCGMZRQDP4>O2=JcP5+QsPyN5<& zb??w&ZUisIec2FrTGO$gN2OjOJvTmmGFjm|=IV+R@2L$*2Gi}i&m7W4dULt*0-nE` zY^*d39<7zs?0X1j=?c~s-U@$;H$v+<#~IQJ^xZ}+c#6H;hD|ex)r6XGI31v~ep3i%<)@?Q zREO(&Cw@=Oy$cMZ=L9dk*LtwvG@!dtifP_og_&5^lA!IrqZjiQ9*EM?K_I(LurUr4 z`oX$Z4}5>N@Jx)yyHsF*yp?9k2Fdrx&2Se!WVZbUU7Cr~8IqV#U;Nc)&hz5nBjK|+ zm@~YKeHKGx_7MJ){&aLof;1i zmXloJg#Ju+aFctSh9{Bp$iw0gIusZ2$K~j$<;#NLEM6&Rt31jHu*h{*RK(jGB~!%# z!jfPMxG|;*1;RA(M93+bE^Q*a14bw$Pn2&$gM5Z`yJTYMd(LtX;UzukX2B`Ka_(7w zabM`3H0mn@#%GzA6{$`QcMVbcWh!h}IQ{LwtSqO>_M9`hmCU6pSGfjTl7XVhGorR4 zKYWbb!;Y6Ii$>Z8>S=qh^Or(x!1TA_EahMyMv3{b)|935`6G;{BSFB_5&Lr13Q_Sm zM;D|7k<&9)F;(>PdN*JXZNr^Ok#t5;JsKvCiFCfc$SW!a%X@%RjFuF_S^FDxz;E$~ zb9lZ)x=8DYXNTZN)x@Lk$xTmFvDrk{lqflX@9rP^SJW`O>H}+Gq(fZ}>vv3eAT9uN z6O?*j+d2VjYG=7sD&nClO1`jvqqtx0poaeBY9WmXAH_VdgFT2co6=>!E*mZv= zIOMhD9c9zFd!;08Lbb(-bl4ohN^n|EB3@d8FWxKp3EPtnbJ7*g-3!TEEOv<6#2gfN zJ=7!XpsU@G4Cog2uDtXT?>ikkxeFX-A1p;35O7b0C87@NeU_fi8KSQhRQRSajn_zW z37g~P-tEIOHvn;PJ2+ps%_PSI;^})5QR)COT?4ko!C-=(QyG5Eo!bY(?s4!Qc$%$& zhCwy&uM}3l8x>Y5Imt-w-$ml3%96XGQN#pJ>Lpc)gx-qtiM$#T_4vs1i!_NlU}JaC z5&d3zpLpd=XgFEeN$S*DFd%Ig57NW?2S%?vYFb_~9=@TX_$@tDhFsw!xpNP^Y!i0K zA#&#q?ELZUreVa4{W*7~WTNZ|T+u(nEa8+%Wn-||y(E3a{GdHpP52fs)i2aY(gVi4 zX>?N=MUv^{8)Va^C-Hb{NwZJ~m@l%0T}ZIgmbWBCK|8qzxtQspIV-N@)h?<_JM5 z+zaj$zHo(FEK@tU&ib-PoU#!4;%N{@Lx>vZ!kN3tE`nF^b$t6Z)H~c?GW3 z$lh^rCl)eW_*s4dR*qeu>KvhJ#1YHLI2sGLLA}fk))Jc0>)y!y&yXA=wmXB)qMN*V z5^?HO$q($?EV}Wo;5WhXuo!e99(XQv3hkG)2AeTob{6)V_So!Al8eN+^NEm(sw|7C zj$eeW?F6~_c{I0sQkz;LDbi=`Oy!^odHEO4o-|aM-19gV zIaRc-aLN5ZwzLpl>mON-X~dXwz>#*57GO;W(_3^FAq}YI#8UNp&RzDh{=d;Hm>?Vy z2EiWF24q6Il!_6$8e}Ro`qVx%ol`)hHw_IZ}S6GPs`yk|l=sqA#fb(*@ z;=LkX`4`C8gYcL{%etaIcbralIx$OsaJ(mj2|{(@q)>&4PLITlB`S>`QkEiCc~CJ~ z-d5I6Dv|sJmPjcIV4YV5i{XtlSdF8?E%7#y^=rvJP?!xslYA%ZE}cmgq?n{1=lQwt z3*Narou_+Lzb=qTc7Xx(sTjfCctXuLh5FD4;*5MMZF4|ll#u?*bFHLyJSTKSd`lL8 z6!wsK{Oiwf4?h;hqH{HyPU2n3Fm_2L{{9|y!PSySArD!0ve*g6^umLKbl02)kZQSw2hkaNiv-)q0-W-R4LxbZpuaYTsniGamp4*H)7kjgm#G?nCU(Z zKA>r^sqmhi-b+lAG@*KUQc_PUkv)*DBED!XlYwJz#f0Q;(G7<8GS!AeVLliGU!chD zRukmddi2y$UXx>+nkzOcuF7YjTBeh(Vurl|d+$4@>@JF9sEd4-RENK0lDwLtG=H^I zZjv{YUE$1iliUV<@H4wBE_9Ndbeg0pY+nlU+VNnTi)v&?slhKKpSnjrQN)(>9Xs-r zxEgHcZKCha)N3ZfC4WQQ8~Ou{#el4a{3_Usu4KChC35o0hUi?(#0K2OgDu4$o5-Q+ zV6{{{(*!DSgXxM?l6t^Y{f=&ZbFw-;IqnR0T&yHK^bHIz>xGBGWpEKTf;VIph-$B2 z23BQ=FjX8KYC?~@5)7ZyrB-6zJ=jLQ_#8||jNl3G2}WQ;Z|NL3iq@ zkMU?*$qI*(D-|Iv6!@asc&uNDT_=L@cn9LDA}EC$#IFB^D%0zKP9)u#%&w&LJ85J3 z_yeV@iTM23;J5hYBK6KDWS&)6-~WhVW>SS(16#y$vcPa6&DF%7*SN}$RHaUm<&Be+ zr}OjxYc!QeXB2bxcNg8CwA3~FDI5Ev5?0PJf zhj;Kgs;Cd=p?mqKB$0PIg@|~%bO0xcRccSxE=xA*&K0499|2Cq5rf2eB`>`2KjTLTXv3I8AGXi^AXH zbNt0G%$WC(?WfLIO!km?K_;C*6`*lwJ%8yIq~dty180Ityc^gWoJNhMEA^~Hp&`8A z)#Udzhz5!@O8bXII;Jg&F;YPKBw|x`2NwjZgH5YLt?)k~EtCmwN-rvS3-M1mU7oK$;lo}wV)4O+)BjJE_VJp?9wHsJc1w|^VtoXsF0iuy(L@j@b&X2x@>k( z;=_puB2j?8Dy_gZwk8H1O)hqWm^L0Yx{~<0U9cvvAZNIMzFb4uXx>X@SqE8ytTpeZ zh^1};6_~+PZr<>2HgF4)zT%@ z)$UMXt4StUS^5Vj`4yeB`BV+Iu*2I?C3wi4TtXLX4JfVElG4)soT~q^)8>=8PUAVN zk>Od0darUlPqDc+>iuKck==Rx64Z+wp?TDYi!#*zi0?#ddfmx({~_*7CMsM7K6Dl6 zyL6b~MuAvPp%x>+d_I*dz(Mr45f2wh4Wd=(4v0Il9;P`q6OZhpj#McgLbVL#3WrM5oMK2Q-p=DxwwC`^{%9E`H=9+64im@)N$paOngB$F^}5eW$}$T9UnOYE7}@Mc#ZqkL|Q-$bd4dqdhEl9>q<)}P+t)7 zfg*E7`(+>TYyTs19RhB(E6CADM2p8{ZP;C}KwtL3o@KHM136LWc;+r-yQ9e&e+NhE zlwE{N^&g&LBP(41s%jrA+>x`YOEh$Gm z`d8`z{|lAI;(fXM{eC6e8v{)*L{Kq@oDGLp0vVA9_v+keV(S?3$P-s^qJtp3J>%O zTnqFMUJM=vLs*?G>o_(mlGx@Ee&(L!v9zxIf#SV#lB$}zK>dSef##E@Il3ELwG){< ztfVc*2NE9I)7s8DLAy}9So=^LqkFB5)lSg7gB|8QQ;A{y>4j;ukHB4zJ>J)YZkVJsq;nQFv~T|Nb5~o6~_{1k~_hB$lqQ#9@-%D zD(`7h^#hH?&HcjehhL4z3?CcTIjme*BU3YYUF!VIFfMQ-A$l&05t$MW%FCC_@+-tQ0un{~tOYeqXl#6HNS1f*zq5K0Zi|n&xnUz`R-jFYa9J zR?SxRR@EBiw&GQItQy4OxD!4l8{E9uXq3cZ6n0_lF0-|l^bUPHXQx~sc$yCdEH zKYOCxWPfP;$=2KU$u}4F|9P1r+M^k4Fr^T_!(bRFvUfuq?&1maqU1PZj zw|wiuynGjP4&Q7ZN-)2MPm0(dDUW^{9Z{?x+7p)njYGYnJp<8*zs zPW2E~NO6REMl0!2dI7hv*Qe;?`LR%4@PQKazD-nY>Is&>JHHy{LAn%O_zo#vQQnXYe+S1GhYpxAATeJ zoA63u3FdpofA!b3qPmmntYUzCtSpCqK@}p9mGZ^pY~7U8lns37i|T$uJ)EpOD}LqJnOt6Um8~IOCS$S{zYEBvTrm@&Hs6Bcy@R)JSXAw zPeB{&6Z!vSoxd-DY%F@m%-+Dn`h)ntg_+VMn6!V?M^8OPZbXPs;F=q-1?!c3k_I8Bxz8 zx+R0vTJnDn3Zum6S^nuNG_AIFL`_7khnY1C&KR=)~Hv>lEv-*Ri0(ey)fPk zwePi8a44M9Tq8VA?^`CncLs7$NSWdP?EA&1^7Ug!?DH(~bn>)7PokCgqi=fPez2XG zEcsj7Tdq@HRGrhP^_hloCZG9zSefw7;kClg!_QpV{H>{tv6W$>{<*H9?veJ5wv+CL zE>*uzA7`j*c%={N{?=B~lvdf~v!s_rcc72Y?SACcJDg~p{)6s7qN9TISJx`{51xk1 z=AM9iY^!I3dy8webCBbA`*Qm_`!o9-$2ZPw=RMaM_asji-2HPrcidB5`yB`1Wt&m3 zKCfJER8Fz%QCUsUNV}9(Ci`gitegY6p1ffNzQRe?&$dC1F|JNtA<#-9RSH^A9S}B?L+hY6WvW5`POEZ7KN1xb(UYP4eh%fpPbFyzv1kQJbO<87`Q@(4ndn9u|HkEM&Ht zE*Uo)9_i!t6?C1nFEyt$g>au(w1;#p^>g(b^u6FFP1bf(zgHy5=7#nMfANiSKXW{^ zb+C4^_zSyPHd~k4TRN}0#(VztF7dtf{fSD&YtKOUac5J(}b<;|gbfzvzijS)jHQ7{NGgEd#sN`Gcn(vqlU&|%? zWrqaLpGTe--dSYJjnNb6#kq31Zaclql=Z^LE_c*+PIrpVESJ|^!+Y7cAn=WFU92ZL zAuWflsHlq8n)PnOe$xl@w6Ha(xg0V}%yFg!3f>oXw+^#^arW`7^bHE+2GwBiJ`fEr4ovhta;G^D+p1a~=1cP| zIW2Q+*|9l$aysU^bI0fH&TE*rKDT`Cot*kP%d(qhXJnVjotjs-KyJO~Xzsl#6juz= z-7znTlEw{5bR?Bdewmb*v>>5t-0+x1(YX-^Vd&lwemZhYvG;Lvlh&m^D$zdeSlXA8 zrAkyyxg9?^dYgHVcCTD5&hqtf_j3-$(~fagcB{OjearlV1G{16tL5M4z39I0d}Fs- z8(GR1mW4UI(9*%y)3MIg7IpeJzBPejf*xe=;m}gaAZZ&}3;AK@JY%)p^-YbRObx@z zqgeD)xCVy1d12^7nYxe2yFIu@!f|iDA(b()wiBNhqy+;=7LLwe_G2q?z>id zn*|mLE$BN8CBOPjQUk5X0)Jnx-*v-r(Dv3cs&I6{!~C&mR#q+W75r9cD|}Vhsjy?g zYi!1*>={{sOlxM%EPvMGoXdID3fJ52yO#?`6od5d!q3M1mrynNS<1E4o~g+xzb7?G z7#g!C@@7~zsy=z9k>NX{o5j~o7K*7Xws;;D;`7pxvKS`Z$|{$u`e=ISq78$L%}_>*G?y{!;iy|@N;UmwylcE{j5Ya9 zx#sI(H^P69a7OHocpg4Htd424zK6!7d@6k;YJ-=35neT#y!YK5J>9&keVhE_n5a4i zbL<^o3Ga9A{?1YMZPsrrLkbHKiI!VVSWnpXu9Kc>{%?aO@kcT~FWBcbVn#4IFvRzV z$LpHmoCKR%Ir})<7wa}_59@178Ov}Oo8RZ3%d44t2G+Rk8L{c#ekuQD*Ow*fFEbWo z<>pi^NVKK9q`~U)?{&??w9$XZ8WI*Ks1mBg7sTEub|vyin9Q_JUsac>yKZa~krVSV z>2S$OWsg^wR_SV`ViiY}ZCUbQ;_IlJhKGtWLeO2u(cAXg`o=cWY4q+3%oATp7BX+Q zQd%wKgRkhhW2|LzUft|`*t7;_+|BHpb1lD=wWQ;y%j;45N1%pk4K_lr(f%{KjF zsH%IeUaK4;pD4AXW4M`a+9Y}|otWya1xG=JfX?63+lEsgX-~HPRH!ZJ`c=`QRKcpk zvDPj2i_WF)`pne7@x6pUwT!Qica7(>`v-R}O0&uCgYJQzs!ZiK^C^7acuk(!uBi^a z?Qr35`G4d_=Ge1zS>I&t%NUZeD#Mj=JF|Os<=jVg;0?h1Mey!8S-M6E1BbyoY< zaNnF7ahvFSd-URHNwhEWe8iUU1!2q0dFa&iGLfg74f&Ov6`ly0ccdc@S+q0}`)^{ibN1&42&JpLzaJTl(_5B1_K^u7B zOM0ic520q*+5WwKt-ZCw?VRoT)*nC{xvaE5xwcAHPGS^ZdF9R;meaX6G7G-+|9s=q z^G|I*H~R8d`jE^ASwG~sb6eym6dWx0o6pMy;|u3lM>x?wl{8lGHP5>=X2__vfkrE1I*(<)W( z&_3S@R~zSA*HrJ|V1MZmRe|nDqXT`z?b;QJuHto1U0c(<#LVc=t`FfK&7Un9<@3U9 zr9F#-y(C9uJLDzh3#8>j{eoM3de5IkS!e7v$7XjM|06L={#cW5NC_JlaV@enOmTli z9*x)&emd;D*=+ud(qbL+Q8fShW3@Y=7Nj=cHx4lr==y6TG|}oZs`|xg!19m$B(7nZ2^_ z=2k4wTWpp>OC^h;@ErcKOwN(4EtzqdM>6kZAIX1YHwQF|8ipp3?_!%IMkG~9)Fe!b zn^WvSL|wDoa2Af@fcm|DWq94VKZ_@qJ6E}Q^@cT?SASjkr*hJg!xA<`+|yo?zV*x9 z_Z@xFBI^fGSUA8xLZSmd@?v{S5GV5f<#^yi5>W5bhe;k$)HiSDp z$W+}l%5>RO8Qq4z!otGqlBI0rH?gKOhO+v3+IpG=YEjh#HS;FQ>56aUe@I;+mH0NW z#n;|ra%I}{tRpS|7Mf9tx@${tPI6!L-t|`sZbzkWUcl{}=egzVZf|eBLzbLqX=xke zG{zl_RX)_>aian{GkPnAFSOgCmn6ts8z>u)9BtG^y`DyC}u==e9W@?wV~ zs+xoPO4@;{rf|=utB&jQBBY5cOVzD>yymxcAJ^?%dqcJVRX9@eO8mp{>)N(5TcEjj zgQvRhb8wvOo#vBiYNWPU<6_FFUgn1yjr64Vy|qQ|lk~G6PrjFZsPQR3{rlV-*4my+ z!9$XZbRAboltP|&svv~%~D2LovE7Vl^i*C5d7@iQZE4)qESW{I) zv~HKiqW-8JrrDt#sBdmeHCGC+962K@C3<>vWOVY-^n2cGzszH{{zPqYpt|cr# zKIcp3x(t7MdipmRhccWQiJ6l!OJ_CAo{_T{)$?L`t@6g^H?=%)9P!PQ+*ezSO)vAM%$J0Wo7u$*uGsdv zzYClcGr;*g4;J^$bVgXG=Bsnv*^xP=bHnqW7LK-WbvFwPldM#p)>bssF}5>yHZ0a% z*Ytva{Jd(9x zTmWA+MAV}~)Jgam&EbCN0S|UBbh(_v;U$@acKm<#zwK`9cDm!FbEj*TJIQm*^8N}eUUx#c?zpSuI#V4CEF}%DE0_k@&p_= zt@6TEdBL33IX81E<{rx}$UT+&GG}nMCG$kamh|A4M_;ylne|1Tz9gee_MLo*^I$Mi zInPib;$>9#C`)+ARN3%IE7v?#MZhj-P`A)cF$aq+Pj!|XP_1(9&2>iAs#>*IxnU(9 zCNzj{ZoaGAte&ClubicRr)yxY9aSqfCjM^RfS4x{Wu%PUk(=Yo%wms*Y z{3e!V_V=#)-o5m;r2b)^&5nVVKk_Q%n6sN@U(Y$6H?*LiMQ?xQyy%GzED%RXSIG+$ zOJMMjD#MjGlz*#gYf^Pms!X+E$9-(B6m})-Q25J;jL2W3qN6)SXGFb?ycV%CJUncs z>6GDT-3N7FWd(V6X;r53+tVR?0q*u%sFqkeSi*1eD%|y*htTFovEH}XEwingZS@_| zuHW2yJxjeMU=bSc{m0YC^U>YM-3D#9g`SPxV(`nE=`pPWsUHW<4zvJ#DR7%pBX0%n zVLjce{xBbw@zwBzxzvs-wiW2xMitoeuIA3kQD?Wx+?BrJ%lBUnd|8@)Bx8SO@2rUI z$~j%~wphlv+lw8PN_}1P{IEr)pY?6EJJlN1Ol4E}jZdqibal-s#p)yvE%UyLqE^q^ zr)%n~=9QgTd{DyjVl^YOO~YVF{Ka_1{4}ygtTHhyWo&A8^2+$-Q45TlmA8bM9+l&* zCAP3m;aiK@KGGTQIpS*r*Ua6(xBm8?b<j*!)A;uQJPIt;p_^`!fHbWu$!=`iXVD zI)976Nc5Nk!asaY6%)`TlgTBjBbqw;qsH0hG3baE3m=EZYo&+-5w?ie5ep(@5rf0u zptQR$?2oXfs9(gJh8q^>-cnaRrh25j4!&uTv{fitNC~X*-S!^$enJ5x=zZ%Q=3VEx z==Qp*xqf!uc0@Wx*fsVP`yckjj$6)^?h)RXz6}3{z%M@w6ZO=d|%k0U~zuW{08|4@($!y&G|O# z+YI}cj$bN#S@UI0`p+5XGU77RvWMpPwx978mlbLsnf^B4HrCKRRBo2m0^M^y6fK=1 zk5ix1yTj+i*GWsMw6VtdTJjnjD=ti{llUlVig~D^f_@5&m7h(rh~#2Vc8G25J_tNdMIr2wk|Cj#!^W@Km zzx2!Som<=^e&;rl#gn=vmGP8)nWlRxlLT_19EY8&%g7CFOGIVR2^g zt-l_6@yp5T74%WS69w;*HIH@Ac7C)Evz4+Auq?CuWxZn`>)Pa98Q3mtXGS6;xWg~? z&POHnf&HERonyZ%*8ACiURW-Pl0Q|9fGB6=eHTZW`CDkKTnFDR3EF^H8U_@rqcYY zQ|J$ChAP^jnz33eBWW-1p-$J;H{Fa7Vt-9tQFeTlmNhO_e^sei>ETH$qkD$6Gj%gH z54#dsJEnI0@T9$|hf2OH^{UkE65hn?QFZhcWc&QxT?O_C$8+a?PrlzRbeFt_Wz`_F z5k=f|-?c{Nb<3>sCGctK=X>d+vlr&Cvc@|9bXP{HPUC&!_B)^3>)WPT$6Eu|e)jXu zhn~fOKSJl_!_+_N5)2y*%?-WuwRB^&34CnQHiXl(jXurL-56tbh4qhU7TGMaWJJ9% zr*W5lyH=vvp{k=iC9h7c_ILVnWkJ2wlOI%6QJzvXl!r^ligN=Wz2~Vgj(2>rKetbF zM7qB9yz|Wt_C?QL8`6p~!4bYS?j+}6`*~ZGy*9s}<}vy=1kb@MdKlcxTk#Xjvt7Ka z-FscLTs_~C^a zd6~H*bDN^!F{yB+W17E_Y`SKjUS%k)o2No63@qDD*%W0L%@BQrc}?WdxLc{el@%(R ztKX_RtHPm@V-i+H{TSBI><=puH9w|Le4V6()U_oBr%6hkDOo+$7B?n*zGkIlzQ3X8 zmHUKuN}!&2Q8FK9uu}43viuNA1l|VDd6o~k+p@Z6{+T&EyItP(LWgY``Q;XrP=oGQ zWEMB=%WWU5pR9{)x9yLeQ#{}JBLyb5r* zSS_B#mItbWf1fP~flOZq&v55?+Z@ZMf=~Hf^5gRL`I*$u zBJ&D!CS=#k>XK>6sFazWc_wQn9gJPMWeZl={_tE9Yb)2G$?!qjRh2INUequ#LGM&) z)ebb3jqDZcO`4gur~JE0T`Em1_pHQ=_^Xjy%n9Z);rF7J#-%2gDgLTNQrg+Hh_u8K z(~|GT_7DF-+fQ~;=nYp-PvJX>Pv%ubsXlJ@Seb zrdzu^hUNQ$-}0VQQ%xwiZ@Fy$;*$Di2bKv-LmD_@y!7~gX0Buy zlgzzABc&*3sP}3s>&qG3hPBkxijhm4HZC>D^&`mB>Z@~9aq8u2tGYTXU{}9T=cqmE zlc=tHm8%seWci@vRSud{xFA?Vf1?_(N#$dAZdG)Y zRSnGyO!CxoRI)tDJCf5Rr&g{#uT9|z>uCEJ$9u;Um>SR84qK)atjw#GdpBnUJ%mAp z!)*hdH9fCg&8<=4(Do?9`eTK2bD z3o`F!)X(UhQ7*H4*4yl#I_9 z|C$y@{u?tPu}g7Zse9!%R@hx$Ql@M1`U#_pc_L3mt%$v!^rFP^()Y?XEjP35;L>R& z8>K9XmqrgVN9k@VkIH3=kn+A}lwM`D7)t4zXl^Qe61`yZ^>cN%$6F5-#ugqZ>|h;f z|IXRX^}Xvm=T`eXYm>sn{2sZ+oGIBSv-jn+&Rbqk)_UBY@BHX4h648i?@sUcbeR8# zDt#S~!aL6w2w26Z(lv^Qs#2PF8Y?Qg2h~AUS=BhDU2#nDT5(0$PhC^%)h##lGd41| zHJsPkG->K_%C_*{O_raR|D@=pyrJr$`CYq6_ej@3C(+JOe^z!!nM;B;_;19rKcHy( zQqdTm>sE^YWRE3##L>ZD{1wo8Nc0Z%dc0eF1O1VxK;-*l{I|UM?sv`%d!p@w<(Q?j zwY_bTU2ybrHFYm>cXj{ey5{W0+DNTE3)KZN`LpuMb+Ll%JIBGwaqz#oFQO8M8xIx732|blISNb$z#`)p9qvym4 zNefC`FEy*o&@%qC!KtbQbHJ@+EdHTK$S*ICDO zTLVjrf(vrg;L7{8>cl)}4>THj(~h(B8`Ny+h}iX@6o1 zT1#7JSn>-O7Y;4#i8i#OU|PW)6!5ZgAE2!ko?S63C9{6Uk@U&wC(^fOq-Nd8u990S z??c|>{ON@wZF^nQ{RyGjGM9Xw{H63+XsuWiw!<8SsOe}7gw>5w$Bs&zoI0-Lr8Iq7 z$KtOO(_(u>OQT;E^T#KpPEK1?re?Vb<<^zGP+F36m}{Klecq6`i}!+56kyx7NEPX_D}fYtLQh-to1?$@siur8`0|ZeDmka$Wjo z&P-2An}!st!s))u9@)qImxIwz+3@wy!{F#ZUH{6Qi8-%xR{8D02H_jgMFKL4)rnA5 zzk^@nq54@FgUrE+>RWA0tOL=3>Ws9oN2U{IBl4zSMfDCsMbjkr_iX zH)T!Bu9d^(Wcj7wsptslr#6NFN0sSA7o#4Mm8s5{bQQKNv5$3i@xG4#n0!7@{Q{|l z8W)~Wkj&pR&$X0s$?a1%=iZ+0XThUI_7xjZJYVq{#TphpTc}?CPPq#wwT;{58RDMj z-tH;r8x?1Z{}a8Zldj$NmKMr*n>uB1>0g!B;Fw-V5^5@L`zPeRQns)KQ>0D7Km60P z9a$-vH!})l*2p@aUBW*HnwPZT(O`9)w{M^)D(@fWcLZXA`Jp|L*BmL9moF-RAj_kv zdP!-lBq%+U0^lz;(C@^i5#_+*oy49*`k>#KU<@$p>A#Q)*#IQo2;GhSWNc<0V(D#l zfrWp-`WeL5-KGb|DX1hynD(3Ftg~$A>}%069`ERB|7?}8-X+)tP*wy<1`N6iNKmZA zGy;cq7L`TV3>n%<)OpFGgq}bG-xg`_-Gx1v;B&l$IY+!I_EtQuS&IOgA9d7nw+}n=Zv3J>i5*=X)n{~ zW&F&Tm3c60Z;mk(;;JcmVpXBa97kM=6^2&S9!nx-QCrw5mhbit?zQn7QV!;AU%*o^ zIe+8aWs)kyJLCR|E0EYI*YbQX3)+fQDmu34r6Q#Z|17XNZ~GJ}zP9(0>xpxdYo%wo zkBQ$9|1s{OcbBWQeYZJ3dxo4AyQ+SdgUGpCFKL&%sP|RA-j9dE&uf3^6=B>Q@%X7{XS`% z7)7o{D`B%RTwEY!$TQWv`peiRq8Z#w5`?RO{yvY{C0ZmDBkZ;RkIr8(!hR=6~0!11rWj%}SK-88{CnKhz1G_o$% zjJ&CXjDX}hgFb?smiOu)n08?tI=(itVv52lSy8=BTXtwUNv{ET)Y0B^EB;i*74h62{`f~f&PdOVX8FEINbKQlT;sj~16cSsCyM@uhMP%6x zm2Swj)u?tMHXdi&M7j$UMjzKW~*h9b*R0L^R(-;dyFT}^V8MH*~8w>+Rc34xS9zT+hhx(Cff$e^Y$j_RkMA2nK_VLbXCE zq5DBH_{Kjf=UG4u((gg>H2^A_iTGoiv@&UITD7#7X(Q5$W*o@4fIjrk?5@FK z(R<=E^;0a7*bAT82_%Vl^$oEiWFKaqiL|NCHogTo$&@^QKZg zM3OJ&X;I+cLYoWUFFe0+n?ltKw8*q68Z);bY z?UeZe8&AI=@)}aW+DU|?X#%GF^9--`ZEBp{TR0Z|Gki68G++sQ@b?R>4CV@NiY$&^ zj{XwO2~P`^3ziB@@|*ne{&W8Q0e9$aczd)TpDkP!&x)Mz95t5-ip^164}Pc6Q7Wr2 z+82F^;X82@ZmvJceneZtFu1qE`juFQp*?w*DvPr$)%e6T!F&$NR2wFdZj+3=R=`vY z$pues79^(cccwbOI@ddoK|#XWwpa$@hJ4dF%2>+C7zv~Y4Fe_oD!m2I!gGTwRzq8@ z6qapLJ@K3{L8v4=L^8&9?osr5WG_;uHUtj_-a+AbHRoYYg1?)8m;asru78?8HOH2d zlFej&&&WvE(}*-CwcXF`AKQOy{Bie(19NWw&&<@y>D@BgW!BB=p8X)_T3}bWKA$1I zSD)%nL6=E@_Iq}$7BP}~!<;dFvog+xo(pmAq?IYY+?{j3Nhy}JD!y*q{WvY*Y4ViZ zbiO79Ru>csss$Ss9FTuco>3{`gp0nuo)jpRT6q$D6XNc~#e5^Y<=yKYS=N%~g=|^6 z7`X(z=yFiqyWsYE8oR8UwexZXsQlhW8i%uk?*jz`&oMJx8JH667D`7J+r?1T(753F zKu_!{b^iY~Emv3h1Kfp|+W zBq`fl7WXdjy;KQg*!49M7lc?y^5$abLe`s|+?d=~!3wUQ32^J8O)79bIv z#M8fzI82VAW!7Tx*iEipUU$O4rPVc1kTsmyV!Hu)6{#~d(%6~d)hPH{lLlD37d);MgrcqQs}Kc z291S>`!h{*YX6+d&0fL zB`_0Pid3p&p-SPpk%iH(TxaBzG(k?lMmbaV;5*k1>dBW%J9ua>XjAn8v0CsL*ubLu z9S)am1W$}0NopNc5_hy*NDNA2TCqD=oAHowl&K#0-fpXEJ!oU>c6&N@&ZxDi^%XK7 zt5~}ImxW|)XB`H0@3+Pi~XUvaI>sgiye{*E2+I@~m*V>WYw zsR|3l@^A$~+3s1RHhEtC{I^)I32pQZc?2C$^v0385q74S@!qT-qa=5-?S z#T&twotr*R*J9o?W7smr0w&U&VUD-fvK6vFvfCXu?Un4CZH(Ya!RffE9S<}Q=>Dz#hW?j1#dD@-|H!JGH9zxl#xEIP(+^?o zMyKCRUzssKb3oS6?2|dE{!f8rp>5H(0xwlThVTPzCsb~Qz!)2WRQYdY1?HV`jb*+4 zy-V{xi$9(im$WF6NUWcb96u)RVcY=Z$Zkz|lGrx+_mpEPo?M<>DJip)E+howzIrc1 zWxmqY-4#Zrc^}6m`vQAKdvlxDdd1upaSmsglJpL8FuX{QWAk)_c3pXeGy_V$hP?M< zNOC$ZloST?J-9*9E0L;^JK-MTtk8+jx6p9pW0r{4h(jotc|>b zc7A8H0at=AAQVA8nODjswUbsL1L23nU=nmpuByCK2Erxx8B~M4v7T@iF+?W(O)ubV zE&*QTGw7qwfI5M!N#+Q9%6J)P-YfG*^CEK+lDYet8k?G#Dj+#&g6X=+VXkEMnfICU zn6?B%dl%EhYjH$p;Mt{p}wJH>@drM*5J5+3BHLQIP*H>yuh8VZFbS@n^|qMVwptN z(yUe4{+teh{=s^odf}sy@mxirI6B0Oz+P~H3$~jmfvU0uJ&Um#&zpX?M6CwLdRJ5L z>bM#S#S%v+R!p3qa4Wu9e6jcu@uB!B2?Z1PCWaIHCIypPB)3Ukkd%-(Ctmi=_V(~} zb^qbo=kz%LaGbJ>$R6x(J#HzE+=Pp!6~-p4lPO29q+XNP;BRJ-qB~f-0-n=erKM6r zVU+E1s$`Lxiu;Ai!bM~f_2jf@YV;ROc)Id0`Fuh_p&S&~9KVL2fId)LemcJtc}4kz zv%*}lixiZ4B4;2GZ{GxEDHNJdm1KBu`XhyH3cNH8;L;ec=K@u0Iy@}J;lw)$zeW&# zu;1bT+lvg2Gt^po88eyv-RMW9($dr)2}-+7)lJ)tzaw3Ai}4@h1mmy9@9b&J=_ezP zuOuepuc+?ST{1Vk$x{q7Vu!)U>8!O=dn?OitNa`t#=O!S(oj{f#A&c!Xk>Lx~KK{aa#*9)xN6gJNPwZL~S(Xu?&U=y%91DfA{T( zD->TkJ~5t0R^sxwJaIu^sknJ@KjV7fp0+rCY5e{8)A6ym9ABolxOcm!fM>q@m}|H5 zxI?%1w4bs0ttRU)mWgH$(k~jD&KfHix3j6tYkEI53QDy%@b>nBVz-T!0l&-%btahT z+m!suHT1&oN>!xG;&$<($crtIKz~Vc$_r!(DLA8)=^)UjDS45o)?FbJ|TohKI26YJ)gqrcY8HwHuLmCmnNWw&meBbSi#g%X z=t?N{n~17ZN<9h{OnH5ZZU?_w%nvCpyXv2MoN%`rVSHa6Zz(pot- zKT?G_W)Jen{d5<4BlQH;;6cMOa7WVM@4umzQ$N7F@j!{->mGVnt(Azp0m`24(mEss zQQ`x*9%=~naqm72FU?BPDwRT}&?4-bTaa{g8Gqg_t(N*pm853UM(G>Wnop&+axrB! z-pj?HxZF}6p_h0QB$52^h8&Y^$W-5tL>DKtSzWY`T76JGo`4_G9<-)=a1*w`nbs3E z)?g4>cYr}xA0AlF@R6{RepIrhNSYh~r|%l@N^8LPp9=S09XPYs!SU}l9MYF)&9s~F zz&6u%DnZFF){y$jTjW8~BJr+RQCcnyf(~XCc3i(yRbC;_k(*!wHx@a>x1{G1Ay1Oa zAX`R~m&w1&guDYjmPMjjB*dZO7jc?M3;Vg3+;#pCe+Jn=uNp3^5Gq)O@n=D}% zw5ZFZYjPL0pLPIF;QDY;&H~4$2ayZ+!Ro|&@+56zlZ}LFh)FWFw?wQJ?Pu-d?C+4+ zve4Gi&e?z1r`Sg#^=F8qg7Y8eCFdFEUFUb_E$0^JOsC(GV=reDKbd zsJUQyV7Y}1-*4us<|C$Jrjf`+u7ec9ceIIKPSwM1)e8wcEJ>0wyphA;mOc*ZN)+zk zTIjM?)t#X7?1A6#6kO!bwSu5dm(W#YK72#A%3IWgosoSYBS+&H6uZ+@7dU-;HLJE? z?Wp|;_6MPl(>8x}Yo}KLifqjp%I5rHYX^;5Rf7t3aGTk0&7=)B(T#pR@H8xOXE!&*Jd= z*U(0R=&)5Ap-zO7a+DtBVFkR!1bsbi1z_2dEOBD0yQLtdjQ880GFwSf5voG4Q<&njx`V9RCOY;6k_ z$4_J(m$p^1)kQBO+1?yeos-Duk!>4oAFLy+ZSxUxS91Wlmc`7OIEzfC zOU4bx1IB5_Gq@M$LEg_pIuFeu8$cl%kY9+rc&1ii($WtpH4>2*B$rtr&D;hf;e=rt zswG{Yh}{z2X6&Dp;q5L!+>ZSYU+WOVCOnHZ^g`%&9)+8qi*3`VYklB;KLQHEF%VBo zm`vv=lC~AhhLZYmzz-g&yTP?#^^ZzOZ5O)_PwF>4w?^vw3?Wo9=fMdtZfFSVz&%43 zeSmh;aGicb@<^zDsC^=3I)U7!Y7(iHAqP^2Vhz;C|4#!-ik%~(vAt0HPg7*jjhboS zm9tpE5ApzQt6Ef^CpA;-+D#<^${Z-wa7#W5o%lBC0+cyhmDSwd=sxKrND~*O*Qm&c zOA;KzDYFhatbft-;>Vwr|FxcQAKB0^MaT4|INJ1*6 zodI*Mt=1oBZoJwOe1^H|K&2CyE47siaw{!WYmN-X9ypojpdt#wS-wvWh%WWF*g-9f zRJt0VUd>gf;2h4Uoj{(FRiC1kkiRHzK}jj6{H-hpLH3=>g1XfoUgvR2Ux`yH7({)V zG*_&uFCgP%ze$>u96M#Gtou|=sRK@xs7?p1>jV-?bE}%rQ*I8fMhg({p3Cp}OlbpQ zrsm6@NHgK9!9X2UH$!*yoBR#g#|@SGk)k|hXi9BRw?Y#$M)m3;bd3WNvVFAS>O-ll zd;=awlk!14Blp6cqo{IR^s2XFBeneUQe_diK$k$A85pZ=uiFGT z8^^O=rW+$MM{v?6Fo)@H)K)5uzKfjGuVe~%StF>YR6jb2>Wh8&G1;2_PR%508`=>C zr~y<@VmzpYDdZoNmoyt%fb2|=H{h*3rmfJ*65pxYu|mo;?K@GFbj9AQceFuZNp^(a z)dXMi74TpWsi{g?!ym+4?U}j~PK!Qpt^Hxh6Z-^>=V@@hXuYd;Ddr+->-*GG`UB7c zW`j~S6(o^LU`MFn{p3Q51yYir<$JGh0~5ib>GFG30ITr0c3iot%+)&SbKwUWqq@}b zst**DBg#Ixv3?@fReKJN#{~VA`mb_QU8MgVi_@pF*bZ)AAm$;a zQd7u*n0WcgV&I46qc+nL+1OBptjPwMKI9QYCF(Itu~Bk7^@*9o45U)2ku1Yb2j%Gy zazNKmOX+yFBr}a_Ob=p*gLd4EDncirIxNSGqe_wE$s?2v-RO~InxQN1Mu~I@P)m5^ z?UqOPMFmr-CGjUzQ2oHxEJchWPZQI@IIBTUC9mWCeWQN`1FT`Ju+}H`gBWP|6@;Oa zpz}yt0n$uu(qE_^LtA3M?vCvPmDY&+&o#q!vSnXxNf=#dm9i|^(QPhU7eGEt^6TxL3 zZHVYomFn6%&^7mJiCFuGS`~Gxb^sK$bp43>H>T2O&_|rF#nf)GKfnV^KnG&KmY^Xk zhEzbU_%k*Mv)i@gd5Vjb(W=EhBgv^Gm>%bFe|`@q_z?V6gY4*<#Xi9TE1r8NcLX_?kga~l$f2C;yeU&{~j&8t{3 zeYy4!zei2Iuy#ogfk#pZOfOy^8T%VljxZ*yXXPwujDFNm9xl>4N=PXVO3+u_*jKAP zkTjO0-q*^;j;nULlsXla^cv6s#v+yMEWVrDP@m9hBk7RJkmvM4Vr|)gmF$UBvJGIY z1=Ob?aNdzSL7nh#tOP35o_NlW$cv?gpy=mUf9e);wDv*Dt;Z4HkmSL~7_7=5{Rr`U zEK%#Px6v(H&Db_lGb~dU$t*FQT}D<_+9-#Jk#r%$bF~IIY&SpyG*N>LJrs|21<8y( zbRjm7TwqAktAR^d9i)`ku?(bufpbJX)m8b0wgJ0jTfghViJgRH&1e zgH%@(okGkEW97+zh@R-j#Pr_`2av7x8kN8!;yv{%SVt7yix{O@njXo&fcZQf!O_l+(wt97J;fz0$h-y)CBSy zNWT9XT9W-hyBKHK0>aQIbg5QhLY@SDR~``cJA-a_)6gsSNGlHFNkS$(IP zK|2`)x@!)~;DRQv5N<=Y3}0~%E}|tO zB!^=w8?18SSUaXG*j zJ*mkc%-*K&F}cWmv1PdVK~(z)=ep{?E`_AGVIZtp~@Ys&ocDZ zSEKiF20Qgv&5G>3f_emf+H2tD4c83X8o8jnJ~oUPp}dziA%oAPu2frN&s-iGuB40O zwYp>xLr|sFWpYoo715F`r#F=@$`ZMe8K57PR%pk;-}(ezy{aBk(+ySVu|#*!RZD?} zdrnU=w4)s4Pt0>)7?#uLsqW~b9!Ij;7V0{qVKvfXM-5S83+W?+$dG&vsnnH zQO7VKb{?zfWL^;uK=v(ZxJjL5hLfl8naYqEY%b~-u#uV~t4}A|kb{WQu{ydQ+lO;f zj7XZ#&<-CcRi)!9 zSY(FWN-IfM7Z@h!S&~=jiJ6H@jf#HtCebz4P4>zJ=v>d#h2Z2h1F`0j(ovnEO+)p# zNNp)Qm3PQQECWK?UfdYZ$;Z_(;3WPc&lZ0uh2X_VP#D3e)+ST+E5dI=jI{*Jd&+ga58m@pv7OrF*j^Am zS@3ID6YHsLG6v$hkGxKIBrTvm)g<%Lo4^a(OKc+VQ#HUzSwpR%?=$U~j!5!cgjDfg zsRhJOY6<%fTb2>QeJsNqHhRoYST9JYI_lnoP{=*Rd+~v~&TeL>P(O*a6bCQPaB30V ziJeIg03UZ4(}XTf{tH651dee*(7LlggKA8=k)u5V=_E6$Ld1T%UY$d0@9$%b9Xp`9M9 zrv9ZIjJ2Q#l9SXM(nGB3Q_4jKRGVA^>czLnk$$LEmv+b{@jH=*eDYB7o-!nMBz9hz z$#3MBYLiJ*EF?PkTEbVABCe~*6_56nCTM-sMPhsYA+!|{)h1O0y<~~94tnJKTs`S8 zb+B?oTrc`$+*rl&!Y15(|COF__xKWcpRa0#fgHO{z509R1^E$WkYbr_2Ry&8$5!D|K30*~i#hT3Jh5YfZ;Q=YIP# z5G#Ck*0BXli@W%Fs&%F9JNi2sI3X>pe^~cg3t7*a%b2zrFPXNO6HOPfCU@D<#;Ghv zzXUI95Y?NyNbbeX9VE(KwTN56fA^OF7?Xb>om$cpiK|HNJZBiM zr>a3MnJ7Y@)UV1BIiH>zO5V-dEoH9qP?fZv`tPWWdPx0bE2^xM@>X=++RMq{z;}^5 zN{ys_(Esd!rnjD0PpBgvmnuq4h3fny{t;hAcr5h6+_Ej#g>!OVa8oV`UHLrG%t$M) zBR`*S!%yYk2%n_q=hgV>~53yShsnh=^4wiK4X3J zTgw&8Ix}NlY94H9VEq+bqT;q!*73G6_IvjF_8qqFHpN=by2eu8a@D-vyx&~bT+=ki z*w08p>z~);Gd5@MGJi9(aUV>k>mxaLA-Ros4T9ZdbY40@xlucIO%I^|HbYBO3#tz= zl|*j1at4*>1ZkY~3Ax;>!410z9rI490(P>c(lq?)duf#9k!Fh7!e{i7FN>mBN=gSW zbH1`jxvVr)N2msMCGv5npzq#a=?aGaajK*6O-y0$ zpu%f|G>7Gei^K<1=V5XYl?PeD>#1>+fF7ciTmgdGH^VY;EsB65cn0Tp4dMuTL{7sG z-1isZiD{;-Qm^1$dV&1#P0DY|P3)($RTqT^n9Z~dSpV$tAeNxL}vGg}TH03ij zKu2IPvw^-(Ngyk`iJ4%>KgCY723)w$dLg}yHVur;zvVB|bg8OzSDYhW$5j8WR6_2J znTQ#`zDsI@+0a|@g;-2#EbW08bG!UP{!Ll0oKpfy0{G&Kksg~LJ)&=&AI0+Df;<6DZ)ltU*#(#rH@iwi7dO=gt=!q2EIVQW_lJ+~5ti zQ4{gTJ;%)Ev79JhmS$t(T2pEw)tAbEhZGV&ioM|atpXOqOui6*hwBdq>fh0_(RGnS z;e#Pl=vJ^va9^Nq;3JedWZ+I_XewN2Ui>k7K8^i)+8@D(G(2Tw7f0T_0W5Juke?^{iN7UINSu~fJ8^$P zr}zxaurw&a`nlh^#<_~QMCT9ZbmwWuN3g^CVMmR(W|>Et>Km)FY4mU^lNf9GGxk=W z3l%^ee9qZwBlVk7R&mSoL?@K9W#9_nG2=fCs?w+E98Tf9nBcA8YD0OHKl)dsU1V{@ z9^DZg&CTJb3q9fN+$kwiJ$bVnr*u?0S$9yOD)Q5aYlvtb`P# z$K+?w3TKil@iPzAiMmb=r`s_#SjsrrxYXDmTBvK#8@6Gd(og9M%yuR}dyGvqb~R2k z)`bgrAF~E0y9hS&dUVr8_*6!MiTD$@h|{q!=+=$FFKwl~l@DRw@weO>RKC%8>vF`k zm|`6edJ3b2%V0z~#lGSiaf|q`xKJ!Bei5eNU0g0q6>-iXRF~*E;2Ry+Jg#C~*jLH--P_6c#5Xx^Q~c6|(TP2hZYJqT`I0Lo{grSh zu7z)?cfY5bJIU48ndr<7-BBmUd3z)K37g3#Sbj6lGy0i1*hRhM1w*@7d2r(kYF?yl zM8UZH6}!!Q=}++~zl!@O%0|~le33I@xDF!~qYSr%`^g!3j(g3G;I`qjjfz}|w2GR! z=iGR{r?6hUAl;LvDJPNUTmwwQT9{FL)GjKmz1H@iKejPe$lwF@^9T70HHlgQHE=q# zrH#QFT~EeQkEp@)7kVYrgUw{S8;=?98aEq*Y*V%t>tlB_hjCM#!iJ#r$ZI?d9cfR{ z7^{L^Fp%5=_tHPelKB^O;s|JVQ_+9ug)Yo!bt2xnM)DDOhZL7IeV! zfm--cD3BD$6<8i<7(5Y70g)j!v_4!gI+Xt){w7YF-Da5UY@Mwa;*XY|30S zUN&27OC9H3gFGqF*Ua}6@!WLh^927-CFvG_FJWBL%H(IsTau+DUs9#SckxWzXzx(Z zC3in}3vkdZ?kldIu5Zq4$KUpLwo2CL=H4c+@gnmZ`ktW*E%Pe0bzBB|peI#89sx$KN?-V~^E9uNe`wA0Dg zWKHT0HI$a_E0RTbhkBFPI#ttiCcG*$3=fmS?LOJK}7wU~J1aVs_BA z>BmTd=tmYN<8Vt}1ypVkM{?7V*zOA)3UO=D%|jI0Lso+8-{ZP0+7s;gR8=ShHV4 zS-~yAGQn4Y`vDqi@R6YsI42#EvC*b*`(#S@m7`i^oJ}EcUBByjz-;!C8|dZi7}F=q zRC~~A@>KCI@XqpPc)q#g+^<{<-Km~QzTxp*5_csnNRCfoQtBs15?dxLiA(o3_hh}#_TBNh$ zZhXgPi~GgW(mQFdyh*vJavFvFq}%B7BoG$teGfs{tqvbxT_nSIpng)FkgHXMna&(w z9x)>0WQ()i*mdlE_7VFHt2WVi+?dxi0t$~qrlU}KOfpq7(WVc^<;D=(kNt&Jn3v3D zq=ba&HuPrdInt6SB%NGDHpf~JVQ=D0+^zOg^Q$`*1+`;D>V@vk1NhCCh-1VF;&O42 zC`0ejNH7bpuznoxg+gGK;1~LdJFx2Y#5ck)!3s*oHtrfI84K|2t_%yIk)e1HQ1=Gk z1+#*FsE*%+TA=2+8eRhT&_w>F*g>fZg}^`hZy>j4VbbG9&c!xzH{IO$$lTV}%$eZ% z;ce%;=XHBco`5UEmF-UOp7rHQ=$#}dTXRj#RW(;!kjY zz^SBi&G?C^rsMe1aLoQ4xrE$aF z_s;jm`-_KmZMRpqelzW0f6xT|2=2Rg^jW4h8_(8d?on5X5wUVw1!bhfiWP9 z7BK^J_P^A{&P4*!e<<>TM< zNM;^8-dNrA%%qzxn8umvnVvyWY=zRQx-p+|gfTbX(HGE-uQz=$3Ru%3Oli6R6l7m; zb1DytxQ{%Ail>_4Q0yG&%3IXa$`d)aoF-*TFTfzy#7X$SCB>7dcB1?iz9V0lF9u%N zBK`wkT{t1+6MKU4`VUm@_r!o0!5cgl|NLF(dj94QQY+*NNE_cup>n_{kLN;WoQpECv7f>4dLFxgBNV{s;xd}HvztJg-!!ky}^_+2c5 z&n`&~UGxeO>RcnkM>1@m>Z-OMRLAfypcm3~3qN{=%;8b!7 z)som!9VD2!#v7gy?#$Coo#=~$@4Tl1$A9ITyNq3|x&}KS> zK1m1a6ln&}w>Pv%0&aAI)>q4fqHH;;@*m0|R6!+h-<5E7+CcKXB777g!h7L7h_d6M zMv50mLEuw)g|9En#;+Y0?m?%uOz0ux2K%En_`Qv|W6`gX2uRAmfRMaDP$>}hZ}YbT z|7o+oK;T_qSI``?g(`siXR*PG z7vgHguZ_$0u65sZe6!Xyt87#3wlqBq&d%{{Cn!8FU@G~VOfbyRIw?D(;o@~+hrkOn z#9Yu-aUhgdka(df-#xk|JT_#;)9DR2i>!`rXk-OJg9 z4WeDHrFbx_ovRMQe)AEZ<_ade)3Bng_3p7rh9OW>)d6kh9Taso%yC zTZFmAlx91!mDxAUFvi7Pqc_tx=^D(xjFp|knvAuL$;RhUmc7A=S&TVPH>cz2I`lI7 z5b|OAgEij&|LZy&sU~-01wgU?3;nTD&=*YBY)IaUVP&7nopCRIC@qw_pv&(+#wk(JRX|6E$GZa`9tfZKY4PH9oqug#5JBnHuqjCJ7@ zSnu5LzUJBN>F!?SlcxU zX{g)?v&3e&wfrkT5f|}IqBFyjL&HPW;j_1J`}u1^FKFy)iYtT*`~~busgW6xtC7Re zf_$cMUTUq(fd-@qZarZoSs5z(&|O(BPg0(!Lv(|o6KMLYFvHgL|;?#!g13aXQ@hOX!{8#UCb@kk`qk zNU7_DK0+z_6!nrkifVlzvY!^9B5H)Ri+S2^Ok=wv_3KadxbhP>FiP5u_jR)PNTj7| z=o`$HdPu)P8R!6`F&ll6^Wr<~R@0?@(vANs1+Pmdp-NdG6_XaDv)5Z#&F|;#N8jPC ztsA}>5`Dm?TFfh7GYtdM{|~GLWyf6D$$~lCx&(eW3s-th5CyeYn&e ztJX}uf^J7KrMO~HM#}r808Y@$!b><=2(0)eX^gDl39qW$m0QUiRyq#!D+xUak2pto ziaM(aS2AjdR0$u3%kEQfVz5*&9#p+M!Rol%d;)$#=`Dlqk=TEy^5p%R}hz{-xAbjLHpp3Urp& zu7BfC9JU$Yz8%Si_jW4pL#_GaWODOUnxh` z-Rc&lj9eSt(b4i!bw=zWxt*zDx^4N6J-ENaZx7j)TYFgwS$x*~_G+$g-ew7ZC;gFJ zGC7#|Hol+lr~4>qlnd+)9Uq)W+#9`x<4(ubh`a7x=H?xZZ9mLL(_OYPly}37>rLm( z{VXjlZ9wYC&5XwMOx4!n$$FvmRtqAtqb{C%0ZA)qNMd2AbgTJCHI32p1 zNl;dm0_$*+_FnD%-=4300q3wCG9ur^%tQiiuQBo!$PSx`+elGlkOce{1Sy5ANe@C_ z@FvT#Tae(9L4T&=s0+}%yQ#NSHXUVdvek|Gjcr&Xa~vHAhIo$TB{P&&>tgMZ8C4w~ zlgr3SpQY2zt05lF8dci>id%ooq>4ikixhR8(b_8qq*h`h;TXJ< z&x9<|fhT$v)b4YjbT15TcTxT}_mK1Or}*`_tQxsav-OO84Lp@*NG%u)s@+Qbv6>Qwy4@*n!}(hsz55~3 zVJRZz#tiA2R2gc{^}=xeSB{Q;4d;X^g-!;$!53x|@=8s`kN3eVEt6m4ot;U}WeAfCYWB|dEc;UXQrmF249i%WSr6H- zx(fRKOxTmuE_n|;L!aUX;r4pWsevRfIQP1@djE*q9Uqr4G=8Jc=jrKuXggtPYrbx> zn7@K;QXL5(9{WsNZfn5Qgk3?^BX-B`=vSd-tb^pZ#qfJxGwhEQhsNtI-1z&28~il5 zhE563#h20qc`YgLFPu_#zzJ=xbxOPs@BLB{6g_xGmTx$Of+mwge^xrUqVt zBvArigM*2oUg5UUv-}G&NnRp%kPk_W^j@4J*_4LbmsnqNC%u*Z#njt8(UQv=v^2J? zH#Y_aZL8(0?Td3OYNcP}m&f0XYwla)Npp>LPIvTzLHC(6ultIpi0_r}qVL)NI};!5 z1#GV^AxuZ(EE1lRv*4gsv`++^%W8gy7E%qx+^#F`1SgziP0=^T2* zpV=zxNv1LLgWiBX@hePG6R1P~e~THA9PY+i#@^_EV&Z-rckcS=3f)o%t7arcH9&gJ zJh>x2$!~Haxv2b6>MPwB1tF8a#~q4pj2sPzL!CpZV9JjR)(!fCg@bKzzU~ZO4n7Hf z3dVwWLz^P$TvQl`XSp8S5qrdH=uvKx9w<}vI!M*%!`x<{8JC#y!moJJG{@A_w8%6Q z2?Z7h=^pPT;+n;^@on=wbTx5$9DVJ}?SDAtIWM?gxzAvRn&6%6DdH~V4A>H^B6xU$ z`MhP7wXyApZ4U^$l4X?nkTHuH2gUVvvOT#Gd);7aER~lU26esBa9`i9jfbWqhWhcY zoPt{7hmuR>l!?l9`4MWO{NiC@laMNO6`zWYuvgub{sFlwQCj`~nQ;Zdi3v!3Ot4zO z$CDo`*cNwluKb6R|NF_FY--f&eT-CDqqziNHcq5 z$Rz$Ef0Eg_+3ZI);T!0!jr31iV7{|~||od+J3t~gQZLuJUtp24}5120W0#Bc<^qPmTuxKT7~DX04n|tSj%=`ul+!G>ILqCZfTzA7di<#|Cay6=MokOZgkIY z<6gK3bdC!`6HJsJ@n%dacq4C)O%?xZGSWC7bX){Y$2ixwb$Z3UY2yq}U~6 z79WNJb2R4Ry^*Bb2+HHp%qLVw*V*OlHntl31M`5N%tFS?yg;VW4Q3L1f}H@5)OltB zxa|s*#FvnIy$dOKilG+K9$cjv$mUH&=IlmwiE;<;VIHh!54kViM;p9EMrjBfaV^k& zddM&18}nBF6jzvAin(#=NQdx@&~}`m^#XqXcYlq5D@cYGg*GA2=S=8P=tt;VI5V0g z>=EZ7C9AkR1#3DSJop5)3Y4Wg$yW4JCdK&O*vs_Rq?wkQN||<=GT;PUZNKjn-5tH- zyiYwJ+~-`+oxeF{$0tW|XSVaXYp;8@C&8QK{nHag;?P2SYuf{Oj{4&4Tx)-4Pq#n7 zdTvD>-P2+MLzgLD-e3%-|L|P>CrI)J;h1o`8hTb5QR6f;n0>)UQ2| zW;&XzMzx26p$eP9?lZnOjseGU2>T3*eTM0anN1tk0-x?NV;$pJHjXthcQCtYMdm`% zXd$F8_rQ<*Y2*E_TZhAUxDfdI&4CjB$ang6Y0#t@)Uxleyo+X0L7UWItt>>|dZzq3s)NAFYoq z&&+<4#q_7qVSEi`-zZG7(wO#4JGvTG6Lg2&$OSu$oV9XL9Q*ZK$WC?Xec;^-V0Zk2 z6ScWK0PoW--2DDUe=R>w#xl|&v4nUJo$~KOQE>#`K|5~V6>)!`EymDWEg^iu?0^Ez zM-_HsmtGI==Y6<9Tj8zvB&yJ5y_Js1$CL}|6A%zaVrNW;hakVf3}$vq% z2U62ybQ8CL4mcD%x_p>eG@!rJJyG#~WPWG6qqEqHNv8|at*P_i%@iOx!UG;>4XBVl z5`TaPkcr&utC$_d;4=Dzll!{nM^5zus8=?qc1&K&f<3YwbcdF>nN`J;dlpaWPVu1- ziOq2uQ;%{QB@oo%CV8}03|IG)>Q*^}&r>{IPK z?bqxzkd$I}%|pi0Y-AmDM5VOO{?&HbX0rFQ-?kS7VY!myy}dGe8TqYwEM3jJu&TF= z`;Ci?9dLs`&vsy^<2%)XYDrGS^kXr41v;|tULm)%IWk)N>JK$1(hSexJuL|4R#-|# z9n=k9zoXt6B7G41h!&^_UJ2-eX93EbhQ;h*xL z-%jFWEr~Pv51gsPB`cm18&noSr9PBO5v2RIga3ORzUKpw`I{9RZMcZ+;BDw2zr|bY zC2L`_UY2Zu9PgK;0@cI>DEa$RW@;HGIID;l$mxF|N%tM9>C^ZOeUN{=3_7Yccsqxp z_fF#snS-67v~pZ-iyA0SR-{|fDfE{9MqiAOHi~Feg-iAc62DV)GCie39QO91wJ{ybHd1@|WcgODW4Ib4~C_c4M+NfK7n! zp)zvOn_)i2<2xjfU&-xANE}F{5LciHDG4WFGh}C%g16xj@?{facQI!(>j%;AbZR-O zs4A*WE2%l4W10lL)^o69>L_0D?Cgq3Nm6p7KWtUfBjKYTLH0)V6KgZffJy zb{jTM#G#b!ZJOD8zwh%t&sz8L^}@Z{(pS=_df$3adxv;Eo{OIQo?jlP zrvsEr8NNyAqSh8qiC@I4=w@`rZqq|d5p$szAByw-6V!M8sA%dv=)jRk9yXvCww#^E zjpfJaEcymu939mE)_>IB)msf04a1Gmrk$n~Q#rq$SW$Q(+UPDv4BB&vRTpT{U_vlYfSDvHiP!C-uCwz6o zFh#o#{h6lDK{9a(A{`pfOsxJlFo#(N)nuZUtChpmT||sRrfWRvCmGLR6D=E8el608 zk7A!_1BGZ9l5Te?rIdp>Z+(&u;eJ^TjqV7k8r<=(aK3ILx`ZUu>2EQ=NkM|DA96h6 zaHWT%@7qW$1{dcR;S;L8`Q9@~pfCwbv0Fq4VZQ39qc{}?C2_?niVkT$-+k`2| z!YwMfr1997H^GDYRk;Rs+EFzIS@OwR1l&c9$t{$Z{>J1o7Z?ZA1byqLOd2{VB=?ES zzr6=t9BhF67hs8M+X?2YQb{{S#dG5&G}C0mwV~%y&R_Me4djlV#!$ zaYpVh8v{;4Am?G{vwN9GP^>G|VO^cD~2@s&dAetAp`x5(p}Lh7v&k~9B;yT^_Bb(yo+;^N!lhhhbR3ue$v^(GGQYA zIS+l$ctQ02@qP2<_zXg8obfB*d0C9T>yCI1^_Ev?CLYK0+ChqigJGQ92;R%*(j2II zKj7R-$~VAPkR`WtNje4{X%osu4+ru&6I_ddENE`h;%J5=l}m6y-TkFd79L#CQy&$YjS`x4s-Beup|$o7j{|U;3wUHBzhSg$WQR8KZo!C3t5*wjMq%malP0A z<|6xp>j@V33QQ5NabLLce2{Lh&QCv3e?k9AzgOQ%-xU9=rQttA9pee(E8|Ebi`Qqv zM!Xgn78$M?ZW`7Z1{j(dsv1xoBM14Aex|+~R@TqB?!EcX=%{_-8uPiJE6w2Nax1{U zF9RiWD07eLz&1smKs?h2iKfTMN#rsld(Qz!{5gC?6F?yBL;RZm7`_Fy3l$5(<<8{VDuIImAa>boqJ!@T-3`hHvFWAZeamv2J-{7ItaRQWzS z%e|FfausWwjo0hP>!bCLbaQnw)E*Z83EUQMjT zDhkM1uRx50BOw#{@FMsU$5DB z64snsSUVR(^O>xqD-mi5tbyy10=`9UrDnqkIT-orJX{hClHSj$pOvY~WMv-KwKXj?Q#1yxOA@+9(|c;b^H;7q04|c%8y?I~D(BdAK4T z;$(G4)JrtzSoOq}sB}l8DmR0>Qv%)Xx6&YaId+Rbl8SpWN`5KdQaYiF8UVjdw)#Z7 zfR1t(I54UsMR+#(nqrvGsKk$h5xoWTrfbv^`Y349YuJfgEq)8%7jwi_Tmtuu-NI(D z?NOJ`;7ahf`Dc6|J_Wt8V*ClN4it3{a7~Nh>fYq4a7ow?lTg`j0kKYEt}#29E=)OS z(cjRM&`ZdtULwoA5(p)aknSEvt|WTnG`^AeOhl1a;V0HZ=W|EBu0DcKGf#`cJN>kW zsz;fKu33Gh7q|yi)Eep;B?ub)M$oM+mVd}b5DrAFcgygs`~`#XlQ<3g*COm*JEdtL zf{c(TsjJvk{4Ms9E`wa4lb=DkT~)dR9rt4~S6m`>k?%tN(h|?|VEn#{@_zie9Z{FA zLQOLTD`h8Kt?5b+Myh9j6?+u&^|YB;QKsqe1eqF3}~jVIA9*bVNSfDZ3Jbdj=j&Ga7qU_)nv z)$mO}3tW;dAX}tkl3W%~=z6XV*Oc?;u#w{~$i&QIA_yh-nGrb2Wz);)`ZpPmCPC?dr(z6r z*ao>KKDAAlX1vGA<2-yU!*K=QNLG9vS<-XtcB8@Fy92I=4o}v8eD#NN`x6LmrLj8x zk_gP(Jopq>%XLx1oRR;No8#97SfyRkad=`b!69=1)UYB@ksZaVy#@PfzO)vu00HL@ z4LdPV%;AiA{a+usmS^-B(Urf_lqZ85#f0x(N7fjMhi@ovG?Zz4Lq|jL`f^*9+ z?A}9A5hSUll|3tS~pQ$SY{pu8bAH7xoS6{_g4WuU%x^^UbJ0lH04N=C{ z#_z^B(*N7)H@sGWA~aDsr)*Jbpt3b7D(c$ts9W{W8^mZc zv=;yGH0yxh^-AswzjZQJC=i^TfrrogBeLCo{Y=5PnO9C zaD9`Z_O6PjYzodFMrA6dCq8i=R7QQp!B{Wnz}tCWl*Go;1ZgWYpeE7ji-8Wq>^lx! zMtP`;O8c&(v)T{Jo1Y*ASMkk6jd~Dg#i5u2+Qo9v{jS6`r~-QP+oUh@0w^Ez)HbM1 zIh@8TlWuY-wUBy69i$0pkApacP2zU(e$W}$Lgo1c&seVEr?J4;7|if|5Sy|LbBzy; zl}x-}MZcvcgQ>uH-nh=F8E=^?_z9-rCW~pBae|?k;klud@quB4VJI>tX#IHXnIrk9 z;8BOMeVL6ot46R>8Gq(2y^L0&LcdJjA^U>wv0G^K7}8^A43k_Y|wuqnLG3#`aQLZS`8K64{|HmNrT{t zE{n5tQBbuWVQ)#nE|MlSgRiUtP6W@}Gd#%m=SNYfVUu+#>{cJstYsOmM znWsR-m+be!kMLV*+-6t>hT3DpT7y4w7m{!)+`)(O5!@KICi@V*nQXYU20%^S4p;0S zJdmxBs~ZD~Y>?)UD)0&Z&Y!?OYlmI`6zYSy=)hFO&hZ%2_{q56b$F@{z%j5I=VF&I z5OteHoGi4*Nw_%rA+K?+yNSwuuG~W2jr(<#G*LPu-Iq6Gjccax=!UIAPj4W0KjdVB znOGm3v-5C>j+chuzKD?W@Ldu`PTY;I*hBab`uUprx=L&b7QZ4M_?9@GariK^5@W)3@uYpyF|7-%@Ek2AC|_BNg|4uU>15}KS_ zek;uNELSYct#kdi`iJ>{!ILCfW?EKSL`#3`7HgWdk$-vr`_?+vxtL6KLcT>!zyC}} zOvg|5i|TSv7_+ECqg3~=Uakwh4Iji_VHZz?0{O}pQoIc^uF-i z09EvkC&?pvc0$MY%i9&nK_`7@q4#*^s|csw4iN{Z1ckOho5$rQaztZ7plPk9>m?0p5Tg z0b>IH1&s|(3u1$J1rHCtAJivkPf-2f_QA!2*9SksJHf#ZgE|JC56lQy6p$ED7fG={ zakc&+^>3wRv$?T(g3b*=n!>Ogs7r9N&|15}O09%5`En z(z7zu5cM!RA|di3tU&w4Yw*Hm;xqgT=RsLa2`fTlG|_AFN}d=@cwa!7GYY+-XWlTV zG)DNcF(K^ljrA6Ix}jg>kB(sr(TeBmIdqWof|*7f1{2{b9Zt-cE3T_H-R_^3FPr zcJ`#gwuQF~Y8MFkU-NT7V@)jpySh-utbIYj>H^;W(oukXJSVQ?HP;u{26(sLdhd%* z&>LT?^n{xw6+Den%wg2uo46=lC~D|)hA*ab=AlSRA7R~XeQ!;dlk2v^scrSH_CEJk zM@_K%|H-Joy#?M{zB9g3=-)*lKfIPi;Y9O7uA><7@T#6g6|o4@Q1o?$&LEF3gzDMn8su_gI@8^egy~yf(Efe-J@Sv` z9mu_#Gc9L8PT8EKoWXg0^AF_h&dtc(mY+~q+y2ikI$UpZ$X! z-34FnE$<)fqT}4v+~wTgp<24-`scdrYVJ~;ADwrdznm$~t=|&;T=4woF7Dod*>;SRaeOPhP_QX~L*9zqaXCA) zL$b$b9my=2*)sEI<`%HRN9L@~8Iv8F6_D+pSE-9cMSFK zBTUAA!Bf%! z>IuK(6Pf`^@UmctoMlS03*qId!?)AVGE_2+wwMBI24@8Cv)Mvs+IAujJR>;XmJ>YL zHa&EA_|J&s$WKv|qbEl%j`Bv#53d&1C$wAW!B91HL0GMDM|hElUE$8K(P4E$?*@Mf z$g*Zxs#{uGN?PYx(=5#_AI*3Db|RH{J713bfh?o|sv$J%?Z}lN)V3tY5Q$n*wYfY( z3`S~lOJ6mtOD5k3IMn03+dMnn15w3L&b5v>M=D7D6&xqvm^|RP>v-eX;OON@a1_OB zhhqq+peoWaW?)yJg{fa@=uG~nA+Ie}kgF->(5<_qjX)3I3pUtraubxeNmO5GGdD3h zHi{LIUAGZk<2Up?+Dgv^cX&Ng7(QcaGevs|m)l>3RIGBG2F0FQ72hDSB5(-$32V&@zaoR3Hx6zXqJ;9{Qn(@VV&s{~){&heZie*_-5t^}#ARD!TV_iL84~Ijb~7|IbX7<- zTTb8r|EiWfetl74MVc;~MwqS`+Zmr3rs-SrE!bSTH#LrMW6HQ44B&<6YED7g=u-4(mebYB)_-7e&H|2LN zd=EwQI$S+R?!mmlg(Y2meQEN3;wZ&4WuYDNvC}ZG<+z3XM}1pUeao+aW45tjb;7@g zT@ITO#)l5G#oC&NtP70{>lPjvRXXNEOq1BRv7xbsXm5lXzB+ti*xb+&q1LcFVO_(& zgg*$62_G1?A~ZDQLeLfeh8Ehq+AqOxGL#*s{WK_<6OG68ZTRwFFKr@|w6^%^cH@pc zsuqXNY=Zg?ipUV5qBqIybtSvP-5uPU+|S)7-L>4uk@pblblNN0KVr@0P}?hoyX{r+ zghV-)IX60c;*>1$$!T2mjQ{{ZJEp_|L+a_!J(^q^b39`muI zDHMlGqOJR-vz_C2VS|F9xYIvnHOgy_lW)v%^-#-qkthGg9aE}w2iO6qm_ zx_CjjCp-}+%h!}BWNr+Sp9!VBM_o-E_n_meS?DY*u-^q6Bj4$QW4|JP?g0gX`Qdqs zauailNeZ+=B0Vqk$TumL8!fd2?nrs4>=ddh9mp`|AlsCu^!G8X+otP* z`c^iq^y}-t)7Cm-LUdd#7rP<)Q{=bsYoSc2FVq-bJ7P}M@YuicK}CxerHfWCVve&% zPmKB;(JVYF>_TX{uoq#)!(W9DjTjoSEPQ-uiQskqbIdhNm!NO@U$0ZAFQfmf^V5Cd zGMIJLSRw~x;i|p^9uaQjJ>GY|1<)YH2rax3?$?gCg$t2svN`Ws-oX6Gf_LzEmbbS9 zktU%qvfyprEhL?^&)J^yKDTMUqu`;vnA3_CZ85wJ16|`>^RQ#s-9g@#zW;>h(raZf zCYc+^7Ssf)Br1j8)D>z0{e$VnJ>xaqGkq;Xal;aQj;^0>4S$uRpbl-t7Gcw&7cRmi z(8Z`5L@8~Fatkxq10ablhI_h-+w4kmEVmCYOv%5R+b)~T{FrV|JDGAUIqR?KukUy4 z@9bY?e&7DB|Fh?JUHtm*&+KF^_3FRkIjeGq<}$epbGl?N%bJ>#Q83gs$oEY?L>6Ob z!a@3<&R_qWPv#zhGcr%t%XGniU`X-E@R)tEk7JpbVUbhA>xRt>-4gmbY)3??C?UE| z+~W9?@#o`}xSFvWqdP~Pjkq0FGjsxWjQb(yLNA7$!fsMN{6y#^TeZNGme-~ohWomw zxW`Bkt)}WGp+i!EtIx~=OE^@j?W=|C;}z~Ho(SJ&p(XNJdI>YUwELFhO5uk5l6hio z<-9+6JqvymCfgGoE6{29TsWv8Gw)iiCAT1FLvDKB`hvCgbIw`rcb?N;7Cxd|-VxsN zID0(vzVU&%u>e`+SPl5_Gc;B*S-Rj|t%Rkyk;UmRi9`YVDx}4 zV&}fGzu+;BWNI>FFm39?B+)ymhs1I9n*2#reSN(OXg=SZq_eJLh&`%sTK?-?eNLsU z4*$BQ?@t|*@)%;_XDRDb+omz;rPB|ky-pjKaWAuI&ZE3}g+Y!z_Unb83sVcj?7tl^ z+*O1NavfqS(_eSNFv!H4C!06^i~1YgKlXZDLcBiyVceBiW6aa2evu=>kArG-B&0^@^3Y46*O8+0-nJt6 zPvCw3;TD@;u(6?jGZI8|Fi&%{6t|D1*$eb`a-3E~xq=kkHQq39H}6Al0{BcWUoBq^ zui4YUWpfNHtX8l&|6Klpf^?+J_i;wL9=i6sPC8dQX4y9vMi+L0gJ-*=uB*5w&)Wnp z@~2`ZoG}^D47JATtfRC{ZUDmLO|m8(!@Nh=`3LBq9HY@s=oR!y+JMh`5!0AGgxT+W zFtTf~o#5CnO_e9#YBx~1`jlC4R=vek`7GEAtA*aaY)=n2<&qtm{U5ZlWI^rxguJj^ zCdZO3XFmKlE5nv9q#jRAO|6hdrgzO~{BOp;@XV~NLpdFCWAfS-Yz7(3;0Shpat(A} zbQgF-r9hl2-XSgaA=gUR)1VlOn2MNY`#m;invYq`0ULw**!qN)34a#u3ojqBJN#T& zUT8$dAh- zW8N<~Lw9uR;aW~}r+Z|u%&tMxwneBYtU;G!5_%kg-b8OrUrk|&m?Ek25u`DE#JM?6 zNkpgi3+DX~xCrm%89Nq{!Xx?h z@+#-P&MC;za^#%#x$E<4(?duO|a&wE@@ z3;0B4`p@*Q9xytvT2N@v=)frf8~kJa8~LxmKlfSY`)xHQ84h5kbqhN8I=bJW>g`2M zcooEfY*ZevFgb2cOxF6V`SKG?*qWe6`U8`_&(KSBg08ikkm~!2IYy$dk#7i6*~uv7;Cz?DYDJ&yO{~_j~47(!9egnx`Riq_V|mE`@(P#jm<~ znE4A7s@wbyLT^0D*c~3~8pipCoBAsHUi#98#>NlGAc;pR*$3SZzA{wE{(KI18~acO z7tELAGrBQvGgXt8wkmIN)r*PW9m%I3`eLBWFM4K4ym2gL)3hIe07A6 z;xp)F{4nL(h&zA3a1na$Vcs#`vEW{WfPZlW-L1C1p6GN1dDA?dyequvpucdQVV)8A zYVUdFe(m;nhGDKUMhNwF@q7fA=&|o2$dmPb0p2R$h{Op!Fuxs*F4|dXJ=iHxzFmR~ z-LEQQd&v#H{WUO`cw#ipvX`}satrX_UaPfm(i}k^r1Z=`#?4$r3ePP#u{*$j(vDfi zW}(vl&GzLEb4@T+zXhdx30<7-I^PC!+J(Bx&^5*BPJ)o~lY0jah{~s9B2rOz4Cx^E z_{)42-(UA!m#rJCyTm`>=jzoTAJ&5Qhc=>7Zg4!)Dl2%@16 zJgZRdG@Ht9X1BnLHXH7aUCbe76*Codj+G#L&!scqOYKR{&?3|YNceb8D%1v=0DVm) zE~+)q|8DtZBAoGIRNGB2L>S=8bk%8_&0L`;* zdInNCLO{1QKv~*|DZ`)9H__Fg3$*=UXpA715Z|aj&<+0}e`uRXigmJY=}};e4X0Nj zi+BT(A_fY(r5?m-wi{~LXlB2{2H3O%J0 z9dR>qJzC29k>1`wxi1;K9i8cJD04|GrE2q(*>GJ1p--IyErcjP19x9gC&&U63^B@m z3eF_}IdDIbtLMJL&%LV=U8BtPu3l~nlnxWmK zJWvnxC5(z&Ua#C&DiIT@YQ!O>GVuYK*OJx~6JdX~3V7gm$@<8%+=qnb2xW!ur%;|K z4_#nux(L}=bE_XgOgsdoPj}?Wj3f4Fw}@w;eSO!)pd<1X&`sd%YB4bZxh5L;%9W5>Qv=k%XHcy#MQY4D@H3vM zSCBrWsY9fB;vPv=o)N!jF9?h0)I@KN>w|Z*jO0P)1)Zg3LO~TRPnURg3RRY#g$x0k zHkoQmbu(M|C5ct7oL?$}jRF`-X4NFJ{)j*Es=Q##YpS%op${bI5m; zlUYd(LFaV@<>ikXmgwfQHJNlOftZb5B$o)_EcyfdIuP9J5&6h4c?WgRE}|s8o;A_m zpj88J8a~1aL`zWjFDU<`KMX)(%^<1*p3)OY^Dap)BF+;%v@TLp!6S9WdA=bv0Q8Qp zWN9^2?x6-z%_vf|mrtRi!eerbx1^q}4*w`6>{5cOg?q0@wAcHiJA$ zjUXO?2J}GNPM4+^Xg`$?+7GHb+lt%6R3^76+r>M=fAT2WqHm$=Pfb?>6mXiU5OSju zDfd?wlC6mXIRwcSb?C0-Nlj1*xH^x?9LT5W`ly-2a`HQplDDf@l(NtOSu~x}U8p5h zp}fo+!Udmvgc_%eliz~iQjV&{EGO5<%Q1)hEVn1DbRuIVCUo6eM?mV;7U8M``9He@;eI#WygDjX4aP>Xbz*p`|i zcOc#~de%mM!#yN{KemFHtx@ECVjbKLgUA;265^2BhT4Mc+e2(B`3z6iZ{Zqog04e1 zWDc=sX*nfNKwlv0=pywuh*3z>W5JE;H7gpU|P$jTz6Klmme=yas6 zoRZ7qiav+pq$d@L?35eicO-&%q3WBXt;T9nkv>juMgsN&?U#0tC{IR_)5)>a17fSJ zlV&OH$Rn@V>gVx*G7961a8@z3-_B0=6M$?AP_Ar(fo(VB~HPfKAaVdECE%ZcjB zCS=1Tsu#tVVjGo2rm(Etl5dF9m0CzliNN}qNGz8!gyD(}87O0w5i*Nhlx1`p{gK>5 zTmzrHi(){Hn?(-Ntz~zpvqf6Es;xlMKpCQ%Tvghs^dgHeNlYgBSk4ocNFF4Sk0Yyd zW4X<0RS)ASs#uxT>`5wD-6fS3$H=d=v1B1AR7j)nwedccS5Xz{?rJ<{ivzT$bPZ|_ zCc-vth;kjupB&Xp6(#%0n|ybL1l%z*h&1gOxt)Bk{6mUlxI9gnq+KF<;Z7Q>CwX-!N~iYZ$(nXIV=qO!27X0|Tl(O!W4 zaa!hy2TT>Zxbj2XuUsG-GEM0v_@s<-4DpPhwBqVbl_d*ln%S+j0X69c*-3v{w~|N} z{=>d^jk-fD!k@94Sjs0DZZrR3SBQ`sYsk}Kqv6ioM4eG@$)&Z5R1o=BolS(IThWn# z?vBtX6;9=^NRSz$)~C}Lm0XS!%|o>j^@qNIXKe+U0+!x=ts{A!EKqyPlhhDqA3u-X zLs04(Wv4PsTSgXwf7udwXvK*~vZ@tjdXPipk?LZ0A-{+mD$Nyd$S$oYQf!*5I#OXD zuz!&Va2*r+FOp0x;Zx{9uqN%@}eQ#wX^xN_`MWk1OOE>hu-@l}aV!WZ9J zh3!=NT{g~^-T{tPu zYQrfVZc(OaU#*of6QkS5Qv0k;IG8;x#0}(xdm`)5-rpdp_ zfx2b7`jk~#Elf~1k^QvmiV?)tRHZa&!Fjv{*}-RVuT#F@@A(9Wm1jw!4%Wg5at?c(Ek^voxiVeNN6#spC?wY~cCxf`Qu>XG__dl#$MJQU zX3BK&rfR||HC@Yo~$m>LLYfF@f4nlFnmfIwaSV~`Xuy`V##sbFjh}q zQ+KE=6yYIYvi4P*lL2_TLx|R5Z?7bVP)*r^^jzY)Iz~$*yAx&PKSDYAHECjxQchwb zy^?w>E%1$(okVNu0hLY{&}WG=N+Yd25r90h25eE?D6*~?FNsI9eA2C5IW05zABDr;E7u}X^2K>bR; z=Sr}jkQS7!2BJUJiB45Z6OF*GEKRh5qQ1Sh7k<;zLS`oSy z=cbA&u~K>M7dxA8MzvDHlxo^G@IoTs!X=Qe^FTX->f-`4n7pNImyn7E@_J>pQ1U7D znajFE%pm2kT#YP??^Rni$qCeT{fjP`WPG`W@0tfg3N(7X*{_bw2_kJ z3h0-Uh)s+UISNxmPANgpg4*d3bwwKNnd6&E3`1|}5NU#D<1dn{ugFQhauUIQH3jJI zNatNmy&%SOBiTvXe(Acrp4dy()&8e6C&|U=knff*c?L^??0sE(s+N%9?k%uHDl>uk zLL60Qi35DY#VqwHr7$b#JdiWaA$vSa?Bc5;m!V5>E2$&$3~{2;4Q`P%?K<|bm&86M zk^4f%i|x=EU#5;>d+_6!3Djk39$7>_f+(@P_`B3>HRYxs5PW?;_z}z&I z*sr>Le%=@beQG*Di-!~HfJ!KTt^OjT2A# zvg91H43)07QJ!LFD2mLo6GT1DrTr!~vM<3YLxrv4a>9@O%;XY%5Y2b_MHEA3`zqmmG~OwqMjz>J$B!5aA#?E1%UmGr#ce zPv$vQ0B=n@VjK8#vE(cDv9^?2hT8LpGD~hny7`}aKlZ&6E%jCJkWI)CZJlRdWj40 zy0oF}^eY9HM5{={;*sXCDur{$?-sq1WIrknOv zSx&H2oHkI56gn!^>5t%El%+|nrkbP#iKBdyT$iEs3;7UYf)Fb-Q@i78exdiuf@hlW zlq|#Tr=rp4orbjSyI^j=CbE$x5la>)qSY}_fYn!cB7qu0&`KA1yJiOA-bU_`i;FMB z_UZ)k9Qg>V-!`PHJGEGe0W|`rVG$fNqFUWi~wXbvwt`obE zx~V>qOR3Ma=|nndLuS%L;tuF*gjNKVZ*Qh2lnFP~dA@7DD8k4O;A#*jWvjLVzNhub zgVP}okAz;J3^bwBQQP)cT+(fA8FJ_=?6rlJlj`U zXs!N*2eKjcMQ-5ndPZxE}c<^}W0teU#E2OWmb4MY2Y9 z`X72UJ2V4ZkC~$I-iF@OvPev$OR)W!jU=l~2eG4x>f}D~9P!mxOe{wbRG9i0yZbdo zp^oupCP4Cf&iXD%qqTit5+cJ09l>brK6-1KRH>nCfle%5W2t`Z zDtd>~N~|jBapH+Uw&W2imAyjOQ#K0G%0RL>PPk)~Vf1FUDYDPP<$6qUzKk~3-PAXd zy<$AfaN>E-W4R+p`!7)KIQwo#+KpMQThHaH_kFv>Q$$&+I=ZDj z(08~@&Jl+povIdnh-*U6R%RzMQJ+g{&0jIh4xLyJ}S@qRNr~x}M z3)m!L8dTtBEtUEM$Iu}1h_p#8s#U~!(~syNMN7fN0_Hq+vHjXROhFeDYn24?p7elR z!u4eT)6yiXl1W6M7ubzRBYu)w;UiYbOGv89*V>SOamF`*VrOMGaszPJY!;FvMf(mf zZC&CoIz{!FIPy8PX;$=x)-opTH*&ffvpHl6IE0mmN_;ZEj(j0^RYnt)s6;Z6_(UwG zhj4o430!yQkT+#QGFX2`$1h@T5L>hnL+aWrux z@dH;XgbdY4(dBEV?n9<*IrW$@LuyU!0Vfc>GGCsji1d;0A}#cq@*4XNmLLQnVcWiEFe#c?j5GYmos}sIFE5wMXCx z9|wm`QERK$mF?;$;t+XN+lfwnAbb~IaNhe7f9X=l77UdNh1yzqCV+}YXO}16fS`I! zswK#>2c5+jEn3@*j@MOUG~5q~>St}D)&jlTD0%|rRbOMJp9R*yNtM!gDDQ(b2l|YS zv2PToo8dWIEWaT7P!F`P$dDc@xzMAii@efwWa(We&rwCFQ(75miZ4kFCKl42Nk2T@ zaoS#duZ?mMsiHDho31_)?+c%mbTSuxinYkm%_Y;d3~{n|fv{Z-q$<-Ex;5r)ois-N zDwbD9X^qs;aEzTG9y0{JN@*@tQ@fxe+7E=>yGnx4(04{;)Pclfq)Y~BJ@G6mTB>9g zM@vhU(wY;@xVmIHB2W!eUTRNJ(-six)QKQbt|d-TUZO1KN<&B=)sY%cSTWJ+q56~U zDKq+^9ca{HY>*Z$tijyVOoUP0$?C{7o`$4g9lEAliDPQA+*75nj~*d^f~ygaE>BH{ zC&nRJvJdJdKjOKt-`7Sh&w5ciKSG+qI+7v}t6in@aF5(m7BMf7%UPVtRf?&Dh|$2>e|aBoXgj=8i_v}fs*MMctiHMnI}1sz;x_AMbH7MVtB(74 zCZ^RVRTI^Od&4(myO0ibsHTyj@PcfnJy0NRq5Y^lOcrXO+I~Y)j6!G8S25LEPZm|1 z!qID0D-fq}C;Wh-uo2l>>#e$!Zt_O)uC!NMOC3eMyBA!}ZAupqa>|g+!Rx)L)t3ct zS5G_Pj#`usWWOQfW(D~k>tb8XmrjdrHHMzXerKjo8?-F2fMcN0s|d35BPixBLcQ1r zlZ?95UYcTq*yl)>z6(Z3FZDQhM}5_4egVzpiV{}x{sW#o&>wCIoKiXrM5EqwKylN&;<0NM6n-;arNP= zeGZrAV_c=>YAIzLx+A%wDn-GModUJ_U2qagNi{I%J}2sByV4LI;vvd2sf?5l!h{K) zr%LK6Z7LB>u4GC1=HKseq}(Zr}>|TYP`6Caz;4$cZnJO0*Xqz*AuLeS)fN_r-=sduet7YFq6g3m&dERIB5E-`iREBr#B$vfg!q;DFr1A7@Zm)i>NoV2w>3|&nk^w1!U2G#lKZKQvC=#_Y=1|iYj=mRFJMwzicH6$d9BWgv#W;pnk@FVFWPpK_0Y!Bc z;-ET8z9F>resF(u{cEs%6F75PzpLA*Wb8HTKypT1DBE1s)4sKIlP zHKRk$xrUi_7F87*f&=VZ?hYK2`*nA8UQiN`K!>ykIb~r?LpqIYM)+$+wXbXwlf8f3 zN1cRyM*i;H!tC744;g>b>ZBGVpZGiY&olrE`~1H6Cm?xZ^55j%sYla3r9DZDNxzg{ zC*x$s!hg-OHsw6Y3oESRoa3n?JeJawKY030m@M>Tn{z=r)sXC$VwvLKA}~1kJv=d- zEij~3=%cXI$Z>H~i&ZPhl>SueT8R(EP8CsNibZY?yBXpM9uibM@NU43KvxhGygjH< z(DQ(X)(d`j35zJ3IClMCUEZj?TQ6Zc9!2>;66L z*R3C^-)?>h{?z|{pSR?jcCT%32EXg^vGmu?KZpJGri7>0_;)eWmgS$-I_qK9uI%o) zf0)R(CX1?Y(6&%9G;te zFR(q%a{a&wsE+%nouRz>E3z}@+J=UhLb}-g3r-3u85kZA>~FQ)GQBn!^hwZ<9Om|8 z9{USC*aIL4h*(3Hs0)-+(q`eRx2wCgV`f24u77r;e~;7Jr{w<$|9$u8s2}aVPx{vF zYx3vapK5%Z^S<1>H*agc>+qq@m)}2@{hgfNI-AKKQTW4t#L>{HIER41KfvA6drDX@ zrxQV3oMDTfF`&7vM%dE`COSN3Zp`hNQZXl^)<(9EjKwP<@>s@NvTBy5`aH-S{ps1|8!wIkuO~uI0iA1{=m5{v z?5*pri{`Ih z#X0Dycc16JyFSt<8@b1MO8Tmbmt~|`(ve)4u05W__DIg1!i{G3qiYkX&XXI+HpQb( zA$u{e_*}zplgWJF{MJ0loaDFAlx!%g-^C|Gzfl!EW+Qs2+c5Wu!pv(2=Bc^bRqR&H zF&)24EY)r(L!_a;y6*Z8Q^DGt#LV^?7t*??j!wx;PDmd4_uwD)&&}V4Kf!;eCYMZI zly1%p&VHD)ATJ!WbVs4PaA{!z+=YV*?-ic3w{Y%s*Yj-`LHW>bAgApZ{DMC8>YuQ2 z>_uh)I1mbR91Pl24ygw`q5ov~;70~jv9%5hifj~fA+BZofw=v#AEFmTlnyx((8wHO zxX8VSccmEHj_avAWte9A>ql71;{FLXJ=2@{Jaicwp!@0d?s8v*0yNit$u8Rq9p_y^ z-W@`Q)Lo4r@6%t{SpFN|9ICDn+!AIMwG4VfH=JV$P|6f#CUaYLFTj9aWkP|Jzfz__h6TDyTo8K=q~nh`S!^MO5;KTv$f>+bP6scjDm|YnO?K1H%58-6ZlAq+ z{@d)Y|Ei{&Qy(QaO8)hC>feTcoBbXC_ru?$lpYiPNkWJ?Jn$**AU!Iw6XZOvcM&or@? zRo070h8=4;>vz*oiN8tTB_1mm#SuQAXOCOw`s#S?80>uHY~WhyKI;ucLd9HlFHxUr zLcgK!(Mg!Gegs7|6&k5=pbY)SZq}ZRrz^4ww*{W|Xk%Mrg0Z1dHcT*V(r?w-`3`&n z(m#JO`EqH2 zX{S@ar%X?|nqo*Do7ywYo}T$HE9<|UHF>QHei!E0S2^qsoAZT3vIp3=!D&3hzSZ%{ zS=C+Wx#tT2;i8KCpYmA^1Hb4t7@9SqT7M%9MwJ&VH$qmyAFT&jhrYsc`W1fV1M@;p zMv!P<(YfCFrd;L?sqV9nHobjGHB4AEXM(_;VkKn(7I{%}7 zZ}j)sbaInwmmUf)yj49$cUjj)XE>CnH=N0?L{Gl&pmays1}}4Mx)c<}J(vx2XUYyW zP#X-=K2xPK4QC#SVbb*FSrt(|r| zee=J>tRp#cUS2_IyU}sQk>ywm7gKwrm8>cpT-dX4NnvGsV@EY-w)3s4DE!KOQQ5u` z>Vc5?1WXto*bDo_>%w|4=C=zc#TC*)Orzgvl_?|l#z+JX3wOslilvquT`HwSt71g_ zy{LU*Gi?_G_WK>y&(HXUk6!gY4g3?v!yc{%tHGZl{(=?oAeam+kI5mQ zA%srn+3=Sr3-bggB5k1-F_JkbZ;{}R&~wf>xbtl^}wy_sPp z+FLthu0iM^HwmZ%C&AYF22Dlxx!So{E|sg$wHRIKF7zDt8ocG+OI{_=>R)+K&s|6( z%b{7ua0gw#UD@bZ6h-qq7rZk6p}@S5GI|PQBOIi)1_lo)mM+&sO0A~gJ5^D%+IBNy#F-y%}#GcA_vNp2jvb@a8 zi~!9{Nhke*`Tv!0(BH;$$Jy5&Hup6y(`W0(YP)E!Yq#o3^$U$Ev(4hL&4lM(wxfxo z78#7(w>P#sY)5P|o5tGMR$=>Q7difRP65}|5x6@$qG@PjxKP(<*JkGzhtkmsxouY> zonSrI6g}py05|B-z}0ZSxSi03nIW2?kSD)QACdJa^F`X=rwazh4w|CVA>K|Q0nQsST{H~ zcz%ASKo5RyKQGQp;4}Dn{2qKN|0J&|PtX0$)o|Z(M{^yV(VR5)a;B3$owf`%NOyeeJuE z?~eJdf83kA6`bi4d-|Ymhux;N%(ZN^oU$yk zp0wK>gIte+6mIfe_B;LCfoU_w*^aJAvi+Rxwr#7elWm}FmaUtut?jApkv+??$d&8~ zd+ET99v*%g%fe%6$$YW=KlRr1PT6~M24-DOYm_oYeKv8STrHJII*F1+d`X#fs*;zi zN*|O_nzkWjMba;MuDCOA3#*K_o758*h#4c!P@}*+uhd=ce2QpoL#;O~bF2Yd$bJu5 z=)}0wya#+Y{l@|?0z3Q@yh8VE*KeoF)e;@&+39Z_wt0&&0&S1_2vtJ(nZ$TsB zBY~g4QgA@nQ-l*UBu2^MgaYX-X?JOXR4ARDFio;md_*)^s1m&85xI0Wleq~JLl)ek zxFf9fGd&^adgPRCh4qJJfMvYJY{{_ltr9E6y2*0Y{N7Y=6dKPNmKm-a&Kl#UPL}Of zFMP+V95~klSEXx)>!@>@BW}NAI}M-tEx4Y-XYH_5Se97WmI6yBYl*EN5_C*QKX~4F z5BUV4HJHQXcdSJ5=fuj?+>Bls3F-MMH&vsR%jAC&8jHiiUqXy%w3s35sQQ(XoPIie zMf%Uw%Sl`0LnZ44)$B}qh(yM-F->DlBWHqgf0c)hjz@Y~jpi!z8_OT)`=ugc=XTd9 zbh$ef{HM*mN8F{Ze;v*3oo#m8dL-Y4^KE*;wnfRo*sd$$tU36N=5Ul0yWU1&a$pv^-+#KTh z3p{nMAC5Al7PQ?p(KsHLY2fp2?m?qlDAHey;Xh)qw91qE>KcTUKB;O5B zp68VNE}Dl%!M&2;JdLRBtE`L6DMq($n0BnDokpr1pxdu+U`#jDp}(xPQyn!9jPt0& zgBa{nY~L(1%%e>YjeFsf^cvfm=9>mAE5_>9NDn83?(m=v`**E1vb;GocnOWKOS>_CN>S&cf z-dOUTuV#Os*-3u$1h@FH;4-I#QA-&?XpLzdeG=Lg=mEYZ zsjq{#r>8Zv)clSJ(+R1vMagAw_xt*obBCr}P zTP!5YB=Z$hol$DsU`R9k(SL^yztPadIL#O`9y5(IbF2sLYUh4b=56SY`~MBB3NOHR zr`T9?Mdy^KQl_TuOZ}A6A?2BRyQ+KQ9i>@5UAig3DDAH}ugXtdnz=uFYqm10LwZQv zMF~+n;Ug}K`G(Ss*c6TnenspJZ4djT#anzwf zF5B*#bBxpUb99e%0mA_c4$(Qsdmu9tPL5y1rIE%{lBm0>-DrihM>IYCG3zY%G2bR! zAz3HADO)CArFf_Oow!PsmxNbeR=-u>P;XP;Px2*N6dPreBrgTuI1d@WD1(X3V8)pW zCNpQ)2R@WY0O!BunUB()4eXhgDMmzhLqn+d)o!hQQ@gJ2U_GkYq4Vq6MylzLsg-%K zd5(Fk*<{K!O*O7IjM5L&m1rMo4cZ;LHTs2yRq!d^H4n8`+7~4Bia?mKR75bgXx7;B~kd@-aaEC0r%+A+{oQCp#%+^ug?o zylsLFq7{-XX){^2e4WCsT&wDj`0xp61{B4Rx*SM%LY^yIr57ov7QcuQy0cbIhl#a}l3&fcq}= z$3FR*`%i?LV}_AdF!Mz7mHOnCX+P5jrA6VpU9DcOev)KNv?_WiXv*b@a&=Z3K1-SN zBP%XqqI7vJ|+`|9W?Q=TpdiWeYrjh3FX0C;7X<|8H znQi%FmY55TP4rzfuG;%GQ))KUj@9HDnpzmhJXdG1rv4r55wXQ2*d4gB_@0DG;Gv^Y zs%gVn$GCF@A4LZwzY=Pt?c_fcI}*J~(^6ih?n`T%?o9iW`X!}x@>^Aoa-8gtcoyHo zu3@0mt7HM`8(|*ag`EhqMSP@rFvs@_ZRWt)FlLRum9~5RrrNZc71fQZS=B?U(`uYG zPir5;CpAHnt|jTN>XP*<^o#W#olxi2T(93&7p%>wL+kQ1AGN#nEsP&cn=Auu2}oPm z-?D*4cftPwGHq|e-!XSd*{q@B!o;eSY3Wxo)@IyG!=&0$Qd0j)Q6`U3|4w?F^iwTN zddnG0TpEr~J51mQwifj>4?y1i8c8j%{m1P}o zef$5dSBCAi^_r!F`LMA}_oV($?Zui6)v}t#^?!6><58>HvDnqeUFN+I_zBs;hVcqa zJ{TKYk-n4r(W;o=IX`$+f;A$$=$g1bK_w?E4XT+bMQOr}jhWN3mS_6Xf23VWDM)&u z7$$8k`kPnG{>uDBUjV(zd6WgDorD&+y4bGp#(>|`!6iT%SlgTS>(6QL)X%Q1t>#oW zth!&>u*z4pw|ZmEv)b~ys`?_$U2R1BTRU0XLUW;RL~X~K9@W_DXVrsY(o&%b=}HU= z(?s((OK)2qa@>ic3q8xcJABXmmf)$Fm6*(8h!!X=C$~vY%D4b~nU-+vO`DjuEA?th zRr12*St5QyF9w3k5cV?U0+QItOyxNG>|D_pNn^JwJs;GKM-Ciwfm}tqj`;l_zU+(?h zhyH}n$cQHTCuV~zfeAmGw3&LJF`s>ktLLHc?rticp72UOTXiLQQko{?a#r7LS$40i zs*I8}M#@vwTt!JjM^QC@9FN0I;hbjQV&ySM&?_ka67jhCv4)^xEW>1I9-B z3e7FxE!?U8R5iM4Qx&E9YxR#BTP;%ewtlweqNcBAO?|t%<2A3U#Ff7C>E+MM@s;K( zN$sfmd0IA{aeOism^Qg5W>0{3E9%8In5nH_UP4bC<^+wgIoDBF`RO)XWklMX9q%4SRAf*YLf3>SGm zJ~2KyoE<3iWV;4CG93)ZV`K|*)*iB&U?(6j{i{#aZmT<9-K4T(Mc0aN6{PB$b=S1d z^w*8q=9QKwwsVf&=vL1{pAgI~KSI|czhX16)dVV~2Q8Da7PyRZ&IR6R(Lw2aWr})d zYGL}+418wK%qbavrH@WKmV#0Ll{iyw1tJ7b+*~wPNES5bi8=F_eP}w;I6N0q6d4?R z=uJnzA$zT}O)vDlv_I<})FfA%Dg~9#D&AMHD`!^zsm!lh23OOndzD`+j+GBCqm@!h zwijP59#L|kbYMBVvZU%^&Dgq^^_klBx*Gi-<1&jMW}{7<&Cx@ifPZe(NodCu3h&F# zs)iq!gTMI6tpJPF7Znj9^+Y zWl_>&#rFiS;0Ajx?I4kdn-PzNhX(4r?LB1oLX?RzU6UN2?Kf;Kt&dHW`ZR6tI%oC8 zs`|?Pl`X2iRZHt=nyBWr_PcJ4L1mWNCOSHxZuepDO@Dr{0J{0pAmj7|_ncrM4WTrq zZlw?Ad=%c2PD`AaEJ?eVo}SSmL!L1q{bbs>v?r;Ol-i`*iSHGob$fE>F?9C(;4ZW^gWrp98$it;AYcR z%|VE327O-5gjZ#@a7+U+N~;uhi_+w%7kO_P2btzO!vXZaaIT zQTGyGE9l0qj^g6oFw?LvpjCL1x|Y?6ZxajTvl4G536f{0OimpM*PGN{sUMSPt2ZTG zSItq;k|rcsRXEiyWq%3v3IlBj5hsC?dSUa zbx&*2ntL^WYF5+~R==#;R_QN4Tz0<{Q<__{pt!84ana#FUH**tQ}Rb!G`>VpW-lLF ziLDx5Ra})=v$C#0OE$zza;ws&wC{4X^ehXRu&ZgScyX~o+C=V=M-opG!HJ zB2KAIR;OrF7iM#=2le10wHrd*k-*8QX!o2yp>$00>W~Bv_nklwQRtxgEX69kq z6mmA9BUTerMO#D$hCc_J1z!6ud9J#)BkQcKO=*_xeNDkc(H;kFFa?)a&gVmAm75z?N$uBBC zD6>`PlV$|+2-lSh+e6Gt&;;iXqRSheYkdNO+xjp${`gC%5Rp{m!_AlD*0aA zwir`9rMO8+*V1)mcgo*ZysDgD^}MQ6^@*CIx-;5KhH+-QWsUWRjp|f;PlZ3@a5Nid zf~Zfz3F%SUMfqZ7N)ju1P4bN7jO4D#?vz#OHJMFw=QUhhFuY0cf~-b$`6c;ap&iVeF#h6Z7#bTyN|Q3?{CL+z6Eg>Ulo#12FAV*D8p0W?d03*&wzH+ zKIjjq$jNjM>o)JK@Uz&JP$@IYb&AZy#feVkR^6-6# z%WC`7gsNUvp0Bu6ZYt|ucDJ+_T&1P=%MO=st7uudqY|mSUbVQIQIlTVrT(UNgZ_#^ zZ$!*rZTp-)Z++woei}8z{K;)DC;)a}6UiTGPx)3kQE@?WPqA51nn)jr^ ztp@$`(sGM(xViG&VL5}cdZf!zwyT!OTP5g4vjrEq2&)t0B6TqNIVbekWlC&^LQa7E9Jj$O**>cVMrn zfwjF#{z?>WNj0EALb=D^``u;96CVulQQ=qHt}ooukCr4kdViH4=Oi=^Vd-9ZuLunosFPJ3!yhIKZ6E>cBPu zeVNMT@H+Bkf^~w6f`fuHf?IIi7fceo=jZdA^5$`JSy+aPx{+K;NX9LT)1rouDtOG_ z)Ti(^hMl_zeF@CTdB{KZdA5eui21AOZ)2&xi|(GLLp`ZZP@4{`&zn`9s)Vq%idNmO z?oe~2W*7X*t3_)o>Y8h6wMX@Hj4ePvvdccxMfAN4WyDcj9dQ&ni-J&ZGMudK?A7d5 zoH$p)Z!7328j+AD7b=m&dr4E(4b-#L50mRt5>t1<-U(5EOuC==k7AgtVZwfKQxQ!t zn%kE>fi;rVhjp15V$6g@SQ+&gWe|Bjk%^CD?!sEcvcN3=P@pNd^&EF6yRV>s zquWuIdx(3Nd$cFPEBA7}eZB3ybsnu}ERgjYLE?cBxC(EodC}hS0_-nbC&F8z4JaKm zDFeY%q@d5D|3f#>`!cREB+Qmf5mUun&SbOxW;JH9fd!kv%wr6s%V<+6^GOQ`Q*r$; z+hc!4J4A+tw*jAIE)W(b`lfg{cz(L0ur?vMY8)RClf8v~v2CaIh~=>Pmg$A@q@hAT zNRR5YI=Q}w{%`#?J>M|Su*mS2VTfUZvB+dKtE>ZT7TY3wUq?6hQok|SEb=y9f*VE{ zM3j(^P*2mJGyY=!!#vIW&V0ct96xlFyJClmbcvU`)RQa!G`wBi#by%yQBuQYA5$_%ERlUxO3k zaM&O5^)U%FG&X^!-51#4Z{%C;B0JE4+yaGW`I7h^X=?h76MdA~)#duLv z&{nX9Z|Ak(ZRPZ2&1JS=?Pe`!rZd*jyVCWv5n$`ML_I?3OM zuoO;#mGu(1+}gw$&3d?MtiPeCG85?dKP9_Gwfw4&kHms=xIldtnR&!xeEWx$K-i92$4|6v* zC*qAfifY2Af?*&M-|;K_cYJ+(d%@1o(Yw*z%Dvm2=U$7(T#a2qr_1rndDWTc=#Pv< zWC#`^f;av-GSUV!(F|Cs-gJDB~JIf|)g-er}u7Ba`u_kc`mE&V3FAw7q-n>rB~Iy}m9pvSSu z`$&U{+kpxP{X2Y5NH_)m`dI_1fKjXTGDgtGTDWC+u>;vz+P* zK}P7AbDopzu-T1v6cIR*?GEdI_D)VMvdr4TW4jy0P5o3opB0*oZBnQ5%IjI*?Nw80D>qX678ej1lPntFmV zhFV2wPj-=Zf>CB9=`mOkR}zZwLxCoI7&06k;Qp(^G9g7u#$&wHSA}s9L`nl0M2jlzusncVm$!ntAbU-$fIAP8yNi=x4`35 zz?eqw3P$;hv^BJkU{Bjgy-bagMiH-&jARKkOqT=ce>dq55DjkPI}*MUc0k^%3E>so znS1av2p56EuLYj+2pop+20BSe&`e$pPWGeF#`%v(CitTZ<8_2@gpQb%;XaWQgd?P% zkvaZ_k)b#{{!Tm`I1v~Sdw{8rmW4-#%6uRE&tkLUc|HoN5B`cqykpUw;KlKyt30?s zj@Ra@cTe%Y^&E#J)B@Kp_cza5S1y2$N$wf$1D+*l$X<$Mdl#=#?1~!B`gB|g1Xh~#hY;k;SJQ*_#Xh9nMQ$h)}xAu}R zQF;MY6#$`D#QICH(UJ#Y#5^k6ywfggLphNNln=A*j~^H(c-$3z7Q@z z)A$hOH*p1I!3L4@$sM5~NP^bJp4fTZMqKOgcHg*IC;ZRgG#@2)C~gm_0yhJ*LX_Zr zSYvz$w1iYB8=M<79}DadGhppO1xjqXZ>cxkv(Y=oyAl29?i5(!TkXtr-tsJgKOK(_ zLbo`7IvTo{`DXcAd&arCIi9#W1cyh~c&m`x=mTgh-0-dQ6a^kee?ZUk&8*oz$G?;Qc65d{s)*O3}BRvCG8?U1lx{; zl1Y9F2IIYuC9fnD6MGVyLL0C*%<9&XR$vFj)VLJVI(#VpFLowQjJbyy1WY3rwg>(a z=5cI)ybO%A%`i_fB1~OmO_&T+#3|5E`Wi8Xc1N|85EJHxCQVuXb zu~yNWP>s}Kv|+R{^!xP2Gzzs9try)({YaS%d9WK)5||X5(?-&sQJR2juawdi?ocP` z6u8*llJ=8wNZUyDzyz907z}iV9(WR-LRv+>j++F8kz>G;8;JW69fjKs+1ccHkC*}1 zjxZ9x0zU(@JH8wz$CO0UFarqz4;SNQ(`b5sfpcf6bH+K8qH9)?W5n{KYB-oHJZ8vNw-`)`KVM4NzjaR<1*zQi+e zFX5Ti2Rj*u!o24u{sn;vS^7ET3*_4rIW0zePW?jpm(~$hv>}F{dVr1v(+L$!7%^5J zi^X`yXv~_$jL_#Wb}*kX7Sh+#PtbGdo#_1;!x$tQj=GONk-3uYq|{Lqa5vweyrSF% zUY>xsjMxp5{1v1|#QTJLu;(2H{pbY3AF#NeB3cN?aT!1yI!bs!ctH37%&%e`iZemS zTSrX5AA*+tVw{-p2^dt$s2)sV0%(o~!`wgy&?8TQpXp3=KolRsfko>_;97tapn%c% zR^YO?jXM)anjL&$PhU8roajCP_palAoKtVU2O>Z&o#(3irRyr{L>IaSJ9At=+($hl zQ5U3b<~e41RK6=Nll=iga~pt(O!VyYcJ{A@*2}G!O3z0nx$r3 zA)y6{L}^0_l9(hpIZFG&JWuaRAydROI=Sh}MNMfZ2q89DKTZYExik*MM{6Bs@bu(AkhM){*Z~2(;7i{Fq8pw5_HOLHI30?OsbV~w# zBD{bZ?dO&NT{9J09VgH>u9-m9)S+L{d+x#LLB}4)XV*P)R>BZ5=g=q6Wz6Tyam>xkK|t3W$K*4pjB$*XjA3*!ymtyI zM4(%Lg7-TC%!&_TheII~$S=r^sbi^1a({vpe~ZAPjHG%=h4}SAdVP$;lQt2rVtdC| zV0Pfg5LV;v10!!M77KTv5ms5x;+tY;a2sJlxHPsXS{~G^Ul_5Y|c$ z$s5U;K*CI-uqhL2{G&lIX+;{s(RnZXg~7$Fl}@JN=<4>%pqA zMC@MdGPnoZ0KMoCG;MES4&i3v7vnNv4SyHkfjAJKfbD{f_-n zx{J}bkaIP=#4e39-L)6eUn`IWkm$`uN^N5x>q)jx1Fr|p%C)YuHMFzsV!Ih$A}J1s z>j0`ipFxN0fR7SPi%bJH^I&|KkVxJ}-9aD8w6kWgv)MSdiS?BgV0~b>=U(JRc{*M> z|CNv;&Jp(%BjR+4Skhj?ljuZ60xvI#H zsu-x;t>DP3rQH%XilCXsZO$Igm`xoCbRImuJJt#|+W?%5Tmr9iLBtQv?d>6dXfiY^ z?}n4ZD7eXz11f*E?<|m^<*)|n=DX%Q?NgJpuGvXQ(lj+C`C4*X3NPh{`jTo|;^)NKs;KH|(yOGUDvI)u z^rz?{uQO{CtugsBOvjEzb3*z4eQ=($((~PY5*4^Y;IFxe+(I5Xrn*MDUqkaJ?%{f@ z=sDL`=M3jdr@=YPH5ILKXZoH7`iI*Ag=rQ3H;^tzQhq^~h{JltN#aKZ4@9@b_r?E- zpNdB+6-NxF0Om7+XX+*=`##^1K+gO9JFk=31N-eB+w(ao%DfyQ*=+-SotVv zYceZkZtAl1!5Np*d!{Wkvz!<(zecwa(HN=2^XLJK<@a<+|*adb530|1h8- zzxQ7Dgx#0GOL5yX&HDl9kH;ffm~8w9Vm9?E;}%QF8O%E`=pn<>S-8#3GjEGsO#E$1!2Es$Wa%rvhxU4a=1 z84NBW!#l$c_-_vyRmM+-`v$*Ztx;u)K--FB-DG`aTjw0$-xd#$_j1${w|re9w-HNrM*539!MC|C{-0MUf8=WDv%DXerG29a@;U;L0lOy{> z8-sO$s=(7=IHUw)$O;URaFx7=-VLT4sr(IsEyCBrXOJ`=D_$U(3I>cP2>~%hv`}!6 zca<}W-GjBBxschLd6vpZTXLXnbZEs>kSznr@o5ngg0VtxHSONwt@?TTR`a`2jm-1wBo8L%Lr+60&{- zWim{>S|>hBe61wPu?Z&8ebEI;mGqI!E6bJlk{Km`L|4QZ89_NG@kHW20m zHs4uap}%pE4;0RiK$AH^8cTCBXL82~MvF4VH$`iOrv+UFy#!ALQ-q&{(8l1O?m`?UY}x*61%6!*$(h za$ay5(HoxaK7L?4>@bs|!MP)n6zvi%jgTY1L!2Pfzref2Q|6|+O7i#_5JJK)LyQ|)Fssas&7=kyzXTEaQzJHXtyldm7?Y|WtoYBq^{~o z>cXTANdoorq#KD?#RDlNp;$6jYM0%V&sSVgh~ys05Yc4Odr6Y4M)pp2Og1)wCiupD zOMZ(5?wS7+x&&ElonV%k@=c%2eQh3u;z~e2qc`1Z56N@FbI#W@cq9CGv?W;RKSs5Y zdEs|(u6s3D8Hg`3grB~yv4j_JUnj$r!ng_ zeI(UM(!uQS4G@jhKo?2IR$(51(;EY1yl2tg;Sqr+9*S!s^4li0?X{7SLI>ZKf|jE@ z+{-;Hy$^iN0&Bp4N(rwFe-7sY$Nlf<9&ns0Bk|Cb;2OWfYxjiQAJLVrh$9DDB~2_; zQ?lWOZnXAgy}9;W^{L9Y6@4n+m8&WqSLRhOukKa-u;#wzn(2ZwC!9oP^M*?8iOrM8 zr_4qt@%DqlN?ewfe<|W~Nq_W44(NjjO$z=1KBS_8syU1k1vSaSQe) zeiLCIp&BNkZ!xJosf#f>E1ME*QIkgQlL$`uYz}mYXT;YV!7I0#94?O`w%ST@i&q>!NI9E5=|3Pw` zv(QH#r;i@|6>1dO6(z-oV~%1gaX;~WfpM^u(1!37kK(>!y8&S%DRM5j!r#{$Lfy`0 zj`8+6)=}mL#$w$J4ZRLm)4Hl_MQYjXlD~_;6j6%hB|SV?b!PokM{1Z& zZp>>Tw24!Yv6=d(uewUS$8HbL`LRDBk6-*g2d4h6lVuG@>jF}J;y?}=O4cV)#1m^TMbe)9f|e(_PejsVlAdUS+AEl?zLc7b8Xg6*Vp1Trw204u>l!RhhL{ zbjNL{eI0RSthv$(^|*`)IhA?%{EGZR4cj-ACixQXa+DL;?;38MXPB<(T#KuzsV=IH)GVq;v}+7HbCJEq zHOreGxEXpBEx>9BUnv2GhVzF%LbyQqMbKGb;m_xf?q?gY(D! z-eEqcuN@e=$NRtgCkKjy{eXvFhkZ`yLheh&(`wnnCWSn>G4EAi+1ZI@p zkJbxFgc5uXh99jCx_zxY16-q!)zF?^raz#0S}U!tsi2ncFP%`*r+8fvrO5neUD2oF znWdA;4_0oh?pMpvaE&JrRiGcfjBS%0Pi>OZD!)&ol*X4EhZ~P?yslw9uY1nqjKj%k zs#nT8Fvn~lYn6~Gy22aA)-!t0?@%{UR>MyFBasGA{k(9dcZGv!IjLjSk*fczTvpk$ zvbOSA_5NC<{-J)qrM+W@dzb%Scv$=zZXv0Pc7i=j&{MKonj-rqMH3Ezxvfg55o{Ou z;9YZBxJYyf-r%n!dnK>M8$<^L2f5JygG^*+f&$w!_ILP4V1@6FdzzDH$6DqX2k6VR zf3%JDK?B+R(7FzBIj$i3ihn%xT5ANjXU@!+!$r$}lX7*%MEVo(y_D z3g;B-OvCSb9V9C!SC6lj)Lg9HRL|EfGWsp`$R+pSK<@|=-;G~KuAs-+5BR6W?PZCI znTk=0$MROPlL;FoE5*k}J4B!0LPhPw4aB!Z{|evmsk}~{!_0BCx#TfG)w>l9ggU}0 z5E-mFtoS3$b=(!gbm#hRzB8QkGTK1uFtU@N!X?MSo*J}xx1m_aMC*5B zrtVtZlj?DmyUUxF^(-wcA(r$m{#10Os8jLDk|$+tDj7BUI;^&vj$$Y=-*%||Coo=m zrg*$+cKWoOkqyWV`!w3tm{l;Nadks#1AW%Ww13q?RePmVrjn*5tPs8Do?%|29U~V3 z>$@LrC9p6T0Bx2NYUH!I2HLlq?&_LqKGbE_Ro4>h*!9yi8f_!Pd9&HR8yyO~*~Iua z+*48k&{6vGZipI4x5!^Aw2CeYf?O)y0#?)^V!qfZ8ZY_=7EiixmEa@)0&hGw#I9pT zX?pT|!cOe9m@=|ExYGaJJJfyK*&8`*jhJ$bAN5%M1pP_qQWjdSKu@W++vIH(7!sNd zwAhpJ*4Wdy7x)NaB&mozmWqJ?Y9#Y36LgiVhs=&l95cZ9$mj=_$r^C>w4@9rkqKL{ zn0Ri46)f{EM9oMWYk%WvZI8N*)s#wl`K{6iCD!6m#lE7OMVg{>#kD22vNM(AAuE=v zU8%1#_O}*0&joUDLm5<2p>k&Grp%q$opW;=tj^DFxVho&d{^$*EPTe3lwC<_sx#oy zS}(mM>dkA)x=!BHX*&AZcu%b*E8) zYC92JB1W+Nv5DRBZLyzY93X{F_O*1McD%6CO>1XGDaz@q*pPqm|Z-h zxI@X4(r4uZtFmj4)UVS%)PFP8+uEXIf*H71^k)Kz{8&<#)RXB4Glyh1&G|3qSnj*r zU^X}NV_Lh^bIH|7u|&J#wd|TiCRhcXj-QldQWBvpI5n^sG`1_UGPn``|7nhx<-YNT z{+KSHJ*0iA?GALGafU3@ZA-+y-{tmr{pBHE>@s#TaW=Jtna(o`-I5aNYgvx`nXI=I zmFUIKMI=#~@HE`1!-Yix2cOKhaSs50p#>z+P-;1O7m<$t0OYQY(FNf>!R!7p-hJo| z2ML-Gz0HG6gG>#~*DbGYSO>=?hck7N-yXOg`a6;xV*+z82qdA4L;<-IWiIs^?HoOo zF@T|9%%DGqxeJe0OD&>SQeRLTP{ov^K!5#(8;v;>{TlN5pLx`-DfZK5RDVwsul-S- zTV<@!l{YHiRTeI-DjiU^zWj2fyk=pYO*2Nn&!{mM*|J=7{J;UGRC0Dp7>QGoqp6qE zbs1B#s5x_Tu4g~a>X8{v+nRDvJtwJB^)|7;qN%itc!^*QH;tvFv#HC;dZL{0ALKsF zQAyb4tAj>`(K-fN9S03f;7n!={3}1pb`-vamg|4uc0bB#57W|IdKu*c=`3LfZX>2D z);!uX3LltG>N+Z)%B5@~T>wKzGmJL6C)_Cb%GbiP z!*u|5FDp!S`s3P}_5Es3S8u7hQ(0P30N447u9ah}@@iVuIqRosZMuF2tch$r?^x^I z9+^fEF@Ev3NJNTFsxiqMQln|3GAtR!^mWkmDoDAeR;ceJO;x>D9+WRh;EKNU_OaJ9 z&QLw1rvwd7f;|*J9orLK9PS$U<~ihAfMi?Go4OdA8w&Inb**&Sx-9({!%EXrO9%Tx z#~W88&pO|{U{3TGrXArexiNh(tCF*a_k@2!5EJYaJmTZ|hj~kQdw2)o=NMiF?*R7? zC!2Gg-45LBCz!(+MEZ2%3*rLvn{*de>983=G zl5dljliB1xK+UHScHzn}gg7p`FZA4h+SAfiZns$anSSVhYj3hN=w`5; z9tA(~dU|_?k+F+8kY#4IVJ~IBX9w9O>>cdJ?0VJ~7MZn*S;uhEwX_%1Nt6I-67e*? z1UTvYqJ;3>z;j=YH_fxvEpz_|r|!RDhDL_eO)VH$D?N+7ZG1SeL*EZv3BC!f4VQ)| z0Ff{i?9hvWz|X@B$Ls@wwH!S<4d`wtkC1+jaP+R&@OKfZ<@gX@H2 zu6>2|wmH$HGknndbr*C~b@{r!x?8$V`ecLHNH^7+u9>e|I@rD<W%i%a?EQwC9 zWKH4egl0)InN6-xK2-;9{$D8qPa)z;wF{zAn`axP7 z+Gpw`N*|a5XAwBK3-MvmGvRD_x2^V-d(OEppdVe$T#a0ppzD4X#ke=RmwA4Av;6x4 zi$nJ#6|tw76*wAUIB^GQ9JqZAI{-K?w)zW6r ztLZ^HiGgKQ(!bJg(MQpJv`MtS)GG2EI1y-qe~cZ5F~_z>^WpRO77T)2P4A!J|Lt4m zYwJ_{hC=^sf?p7L9at1h3;hgT3@?i)qmO|rHX*hsHZ?X8l5Bps!*|5J@idG8V~HP# zOXAmopZFAH`P;Y~N_l2bd~nIjIgGFdA~fi2B7c1Xu-C=5OY(xsBzd zB^`W)0{d*Fm-7u;?>!tG6Kw~cqkU8l!^8IQE(_O*Pf1oM$faYTMZFHL9n#IxCg4Za zii<@zgfV^}=ns)N-&ji_>4-q;;U;|{y(9fH?JRX8Whgn1ltg3#bN4;$w7eiv=~x&T?wt=Y6>P6HKeQS2=3KN?ZOstjx-Lv4E7Dy2POfz@gNvPH~GroL_N=iBev2HPYyyS2>fu@>02*plr5`+MZ1qsX}d9pGv2gU(uLa`aC85BC2!x(e_n zvMxF^ahE2k3lvIAfkleDJ1p+<TS+}#(7yBBwNS**}PsWGkNd& zz3&{8aHP0}^ogvi;*RpAYKywFCPAA6yq@8@iMpz~YufhOe>E*NnQEyzLDfz99^8VT zu;RbPt3|P*4`2#;A&*pcrJ+>z`f-<@mKg?d4)Td?x>q4}w8~1g^CK%yF;y1HhCu@He@x9Lc?7kFsmn zx$Jm$Hai8pUA@`u>?c;swcsX!rQ5|dJ&9?=3}9eQCq@y2FylCw_?zfO z^e1W%N^q=g;_L8FxQ5&db^x2p%w}pcX6#T$I-V{-FMCQTA#^;b2sRFk#_Z`gugcrc za~Rde1FpYZ2Z4Zf3%spT$8Y-)`%L?I)KN#-@7Tq_CsI4_I!C%Xx%+uKqhfUtEV?go z3hXw0k-5$mahUs~#!7BVr^pV-hRHHzi_u|f4UR~+B3!vx z`B0guJfvKPXFHWMF`w2?SyLHMArZIxUX0uzA4%*+60!^D_f2z=1=oW`DJ+Y<;(LN z_XcRz{{vrS9j*gcmx}~1p_MIU{j7&|vO2CDzEc+8uY<38P6cG%yX-o49NUZ)vCo-Z zz{zXQcv>|jH&$foB0X6{|;6R#$nP~ z9L&Ld$L_#_K+AwG@XLSRzr(-K-_>8=-vjKf)BTgd?z#-$S?Ryx_xRHSBLh<~TN?

uYBzRD!>4)Qtj?ehEbQq0Jd%3oq)^9`)H2mc}zocxpg z2yA;3IU&!HJ(TU0O_ueM)s+RMS5P0RDg9S6LsC)lSv(im%r4O>(Ns}eQ6x@%92Aa( z{c#8m3p#@X@)6j{+hfXbBRau$;yBTb@bMXZPhJCgo`tS((Vw|wHWsUz%UlBM<1i)# ztf&^c1RnMhD!>E5yIO~irGsF9I1pM9S{IrTsuPL{nLW-S~rBGog5_+|gzD~bI9iOEKF_)QFOg1peJ3@oEuqW7`Y)3F2z2J;|V`%zbFzWu` z!=S(0FcB;wtHOTl21mtR@av{hgQ#WHdFnI8fj=-zU_fttgkZ8@z2KDKqTs2(Do|n? zbDHppFj4fksE25dXuD_~B>y9q!e=+<;i-m0}IIg>PY-ve?qPKY71|08E(9oCWC@oCS%`yC{ofGtf#390f_ z8c^|5U}d9lf+Cr!O;w;MAO=6ds=Ov8V8KYF8sRlD6hr1?y?`f*HM)#xj=SW2JYJF^ z;Qki?Q~e&+c`$Y)g{%Ne-3M#93A6Hl>Lzx=9D=C5040X(>JYb_6v5$o4g< zroc8V!8?A&YcLg#Y0qESiSwAk&jy2645h(q^YEUS2qojlPsBk);|b_Cedli@LYxAd zzm^{ebVUXK2@JGrxqk5dPT2Yf?0WVHG76Rq)A(};SQ;0{6~iV)G<03zK7{xiRupAKe) zp?pQKA(**m++nc(JcIRm&n59QaF2WVOSr?c{5r%olkwWY;B%eLZ|Ar0I}!05!TmGf zSp^w0k%&mLDJ;iWVg&BK1sIoW5Os)lL$^b^a=%q<;_{-NxTp zhHDWdunpfHy4w=>(g8e80})Ft=GWuBmhm&OO9Lq2ofb9P~Sx?2PI9wqzCHt&So`ki8&b)4?@4gPewIBXs#Rc@a7t zB9&Ar*N zJ)c5!2UAcRta>e?JXSmw*z`KEQ~rxx|Hj`%T)GP@JsN90h;PK#fNe419!Z|zd|Wp7 zj(ZOKFbA0Py|~_ZbmnGq7rB?*cP<>e-VK}vov<_UJjD~d5c~!v*o|iRq*L(sHuD#; zQ!6164`IiC0OgkE%fXA(C5C|6cpaFMzd%wW!Ae}8tc$p-K5%jEkmXDG*&)nhpF;0* zF)@djh?uq`IBWmhcR3=3sDQswAClXSs7%NpW#17Utl{TD8k^zXHMkQTvE}S|d`GnY zg}Vc0u9e(oJQi@Pah9nASDR}C#MD0AXv7n9xE0(+u-~r1v)S00Q`{ox`+4pzrfO|K zryh!Ro(*Xm&CkWB`G$&b+YC+Zg|%+`-->s{ z^Nx^+_C!@8i3lS&J|FV%1D5><{~Vt58vf#O{wDH-|M7ERb4K&^@N5k~4zfNLYuFnr z+z>XR2`oijSbx-N`1*V~*roE&igt)g(;@vY!Hg5)6W}wd5>b!>nwS1}kF8)g7GVYF zV@1y+*7*5{PX`&wJ1_%0CLZD0easp@!*vceV$6CDN&nxFc-bP>*{({~y{A+xcef(`@g+lpbj08m!@8L^ar7C1j5075~XyC44Q9JDQHX zYbthqKK6bhF&ff57V?~q$5zbF6R`>{U0y}mFGY~JaOWCmTpP(5MvJyU75*b4p@u{Q0 zL|GXp$>bzKe#YxJz|z(tB5{{B!SpC4+^~pp#Ln-b>(^mh_raTQ!YX%$WG#dporAn) zC+x=t*npM%u>Ul9AY`f)Ebd5X@IR2xQ`nI#*yr1j){}Vk0ers^-yFK%1#w6sq%avf zIum|iJ*3#oM`7&>k>h5-i|&PNuEcL_L5IR&7Wa1p_x=w&(H2

woP=fjtD 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 literal 0 HcmV?d00001 diff --git a/test/files/socaity_logo_for_white_bg.png b/test/files/socaity_logo_for_white_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ed563b1645ed9eaddf619996dc8c46b4a541a313 GIT binary patch literal 335078 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 qS+Lb2O`{a>KKk38^Qkl`_bE1#%gsH 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

n_9Rx7-@5FT_D>5FMKa#0Jh(OPNqD`1P+Jb7 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

DD*cndB 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

T&fU2 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�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%0D& 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

  • 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 str: - """Simulate non-streaming generation.""" - # Just pick a random response - return random.choice(self.responses) - - def stream_generate(self, messages: list, temperature: float = 0.7, max_tokens: int = 512): - """Simulate streaming generation by yielding words.""" - response = random.choice(self.responses) - words = response.split() - for i, word in enumerate(words): - # Add a small delay to simulate processing - time.sleep(0.05) - # Add space between words except for the first one - yield word + (" " if i < len(words) - 1 else "") - - def get_embeddings(self, texts: Union[str, List[str]]) -> List[List[float]]: - """Simulate embedding generation with random vectors.""" - if isinstance(texts, str): - texts = [texts] - - # Return random vectors of size 128 - return [[random.uniform(-1, 1) for _ in range(128)] for _ in texts] - -# ============================================================================ -# Application State -# ============================================================================ - -class AppState: - model: MockModel | None = None - -state = AppState() - -@asynccontextmanager -async def lifespan(app: FastAPI): - # Initialize mock model - state.model = MockModel("mock-model-v1") - print("Performing mock warmup...") - yield - print("Shutting down mock server...") - -# ============================================================================ -# Logic Handlers -# ============================================================================ - -def chat_logic(payload: schemas.ChatCompletionRequest): - """Non-streaming chat completion logic.""" - if state.model is None: - raise RuntimeError("Model not initialized") - - response_text = state.model.generate( - messages=payload.messages, - temperature=payload.temperature, - max_tokens=payload.max_tokens or 512 - ) - - # Mock token counts - prompt_tokens = sum(len(m.content.split()) for m in payload.messages) * 2 - completion_tokens = len(response_text.split()) * 2 - - return schemas.ChatCompletionResponse( - object="chat.completion", - created=int(datetime.now().timestamp()), - model=payload.model or state.model.model_name, - choices=[ - schemas.ChatCompletionChoice( - index=0, - message=schemas.ChatCompletionMessage( - role="assistant", - content=response_text - ), - finish_reason="stop" - ) - ], - usage=schemas.Usage( - prompt_tokens=prompt_tokens, - completion_tokens=completion_tokens, - total_tokens=prompt_tokens + completion_tokens - ) - ) - -def embeddings_logic(payload: schemas.EmbeddingRequest): - """Embedding logic.""" - if state.model is None: - raise RuntimeError("Model not initialized") - - texts = [payload.input] if isinstance(payload.input, str) else payload.input - embeddings_list = state.model.get_embeddings(texts) - - # Mock token counts - total_tokens = sum(len(t.split()) for t in texts) * 2 - - return schemas.EmbeddingResponse( - object="list", - model=payload.model or state.model.model_name, - data=[ - schemas.EmbeddingData( - object="embedding", - embedding=emb, - index=i - ) - for i, emb in enumerate(embeddings_list) - ], - usage=schemas.Usage( - prompt_tokens=total_tokens, - completion_tokens=0, - total_tokens=total_tokens - ) - ) - -# ============================================================================ -# API Setup -# ============================================================================ - -app = APIPod( - backend="fastapi", - lifespan=lifespan, -) - -@app.endpoint(path="/chat") -def chat_endpoint(payload: schemas.ChatCompletionRequest): - """Chat completion endpoint with streaming support.""" - if state.model is None: - raise RuntimeError("Model not initialized") - - if payload.stream: - # Just yield raw tokens — APIPod wraps each into a ChatCompletionChunk SSE - # event and emits the closing chunk + [DONE] sentinel out of the box. - return state.model.stream_generate( - messages=payload.messages, - temperature=payload.temperature, - max_tokens=payload.max_tokens, - ) - - return chat_logic(payload) - -@app.endpoint(path="/embeddings") -def embeddings_endpoint(payload: schemas.EmbeddingRequest): - return embeddings_logic(payload) - -if __name__ == "__main__": - app.start() diff --git a/test/llm/test_qwen_llm.py b/test/llm/test_qwen_llm.py deleted file mode 100644 index 1b043e4..0000000 --- a/test/llm/test_qwen_llm.py +++ /dev/null @@ -1,333 +0,0 @@ -""" -Local API Server using APIPod - Optimized for AMD ROCm -""" - -from contextlib import asynccontextmanager -from typing import List, Union -from datetime import datetime -import time -import json - -from apipod import APIPod -from apipod.common import schemas -from fastapi import FastAPI -import uuid -from threading import Thread -import torch -from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer - -# ============================================================================ -# Model Wrapper (Optimized for ROCm) -# ============================================================================ - -class LocalSmallModel: - def __init__(self, model_name: str = "Qwen/Qwen2.5-0.5B-Instruct"): - print(f"Loading {model_name}...") - - # Detect AMD GPU with ROCm - self.device = self._detect_device() - print(f"Using device: {self.device}") - - if self.device == "cuda": - print(f"ROCm GPU detected: {torch.cuda.get_device_name(0)}") - print(f"ROCm version: {torch.version.hip if hasattr(torch.version, 'hip') else 'N/A'}") - - self.tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) - # Qwen requires setting pad_token for batching if it's missing - if self.tokenizer.pad_token is None: - self.tokenizer.pad_token = self.tokenizer.eos_token - - # Use float16 for GPU (ROCm supports it well) - dtype = torch.float16 if self.device == "cuda" else torch.float32 - - self.model = AutoModelForCausalLM.from_pretrained( - model_name, - dtype=dtype, - device_map="auto" if self.device == "cuda" else None, - low_cpu_mem_usage=True, - trust_remote_code=True - ) - - if self.device == "cpu": - self.model = self.model.to(self.device) - - print("Model loaded successfully!") - - def _detect_device(self) -> str: - """Detect if ROCm/CUDA GPU is available""" - if torch.cuda.is_available(): - # This works for both NVIDIA CUDA and AMD ROCm - # PyTorch with ROCm reports as 'cuda' - return "cuda" - else: - print("Warning: No GPU detected. Falling back to CPU.") - return "cpu" - - def generate(self, messages: list, temperature: float = 0.7, max_tokens: int = 512) -> str: - # Standardize messages to list of dicts - chat = [ - msg.model_dump() if hasattr(msg, 'model_dump') else - msg.__dict__ if hasattr(msg, '__dict__') else msg - for msg in messages - ] - - text_prompt = self.tokenizer.apply_chat_template( - chat, tokenize=False, add_generation_prompt=True - ) - - inputs = self.tokenizer(text_prompt, return_tensors="pt").to(self.device) - - safe_max_tokens = max_tokens if max_tokens is not None else 512 - - with torch.no_grad(): - outputs = self.model.generate( - **inputs, - max_new_tokens=safe_max_tokens, - temperature=temperature, - do_sample=temperature > 0, - pad_token_id=self.tokenizer.eos_token_id - ) - - input_len = inputs['input_ids'].shape[1] - response = self.tokenizer.decode(outputs[0][input_len:], skip_special_tokens=True) - return response.strip() - - def stream_generate(self, messages: list, temperature: float = 0.7, max_tokens: int = 512): - """Streaming version of the generation logic.""" - chat = [ - msg.model_dump() if hasattr(msg, 'model_dump') else - msg.__dict__ if hasattr(msg, '__dict__') else msg - for msg in messages - ] - - text_prompt = self.tokenizer.apply_chat_template( - chat, tokenize=False, add_generation_prompt=True - ) - - inputs = self.tokenizer(text_prompt, return_tensors="pt").to(self.device) - - # skip_prompt=True is critical; otherwise, you'll stream back the user's question - streamer = TextIteratorStreamer(self.tokenizer, skip_prompt=True, skip_special_tokens=True) - - generation_kwargs = dict( - **inputs, - streamer=streamer, - max_new_tokens=max_tokens or 512, - temperature=temperature, - do_sample=temperature > 0, - pad_token_id=self.tokenizer.eos_token_id - ) - - # Run generation in a separate thread to prevent blocking the generator - thread = Thread(target=self.model.generate, kwargs=generation_kwargs) - thread.start() - - for new_text in streamer: - # Hugging Face streamer often yields empty strings at the start/end - if new_text: - yield new_text - - def get_embeddings(self, texts: Union[str, List[str]]) -> List[List[float]]: - """Batch processing for embeddings""" - if isinstance(texts, str): - texts = [texts] - - # Batch tokenize - inputs = self.tokenizer( - texts, - return_tensors="pt", - padding=True, - truncation=True, - max_length=512 - ).to(self.device) - - with torch.no_grad(): - outputs = self.model(**inputs, output_hidden_states=True) - # Simple Mean Pooling - embeddings = outputs.hidden_states[-1].mean(dim=1) - - return embeddings.cpu().numpy().tolist() - -# ============================================================================ -# Application State -# ============================================================================ - -class AppState: - model: LocalSmallModel | None = None - -state = AppState() - - -@asynccontextmanager -async def lifespan(app: FastAPI): - # Initialize model - state.model = LocalSmallModel("Qwen/Qwen2.5-0.5B-Instruct") - - # Warmup inference (prevents first-request lag) - print("Performing warmup inference...") - try: - state.model.generate([{"role": "user", "content": "ping"}], max_tokens=1) - except Exception as e: - print(f"Warmup failed (non-fatal): {e}") - - yield - - if torch.cuda.is_available(): - torch.cuda.empty_cache() - -# ============================================================================ -# Logic Handlers (Pure Python) -# ============================================================================ -def chat_logic(payload: schemas.ChatCompletionRequest): - """Non-streaming chat completion""" - state.model = LocalSmallModel("Qwen/Qwen2.5-0.5B-Instruct") - if state.model is None: - raise RuntimeError("Model not initialized") - - response_text = state.model.generate( - messages=payload.messages, - temperature=payload.temperature, - max_tokens=payload.max_tokens or 512 - ) - - # Calculate usage - input_str = "".join([m.content for m in payload.messages]) - prompt_tokens = len(state.model.tokenizer.encode(input_str)) - completion_tokens = len(state.model.tokenizer.encode(response_text)) - - return schemas.ChatCompletionResponse( - id=f"chatcmpl-{uuid.uuid4().hex[:8]}", - object="chat.completion", - created=int(datetime.now().timestamp()), - model=payload.model or "Qwen/Qwen2.5-0.5B-Instruct", - choices=[ - schemas.ChatCompletionChoice( - index=0, - message=schemas.ChatCompletionMessage( # ✅ Correct type - role="assistant", - content=response_text - ), - finish_reason="stop" - ) - ], - usage=schemas.Usage( - prompt_tokens=prompt_tokens, - completion_tokens=completion_tokens, - total_tokens=prompt_tokens + completion_tokens - ) - ) - - -def embeddings_logic(payload: schemas.EmbeddingRequest): - if state.model is None: - raise RuntimeError("Model not initialized") - - texts = [payload.input] if isinstance(payload.input, str) else payload.input - embeddings_list = state.model.get_embeddings(texts) - total_tokens = sum(len(state.model.tokenizer.encode(t)) for t in texts) - - return schemas.EmbeddingResponse( - object="list", - model=payload.model or "Qwen/Qwen2.5-0.5B-Instruct", - data=[ - schemas.EmbeddingData( - object="embedding", - embedding=emb, - index=i - ) - for i, emb in enumerate(embeddings_list) - ], - usage=schemas.Usage( - prompt_tokens=total_tokens, - completion_tokens=0, # Embeddings don't have completion tokens - total_tokens=total_tokens - ) - ) -# ============================================================================ -# API Setup -# ============================================================================ -app = APIPod( - backend="fastapi", - lifespan=lifespan, -) - -@app.endpoint(path="/chat") -def chat_endpoint(payload: schemas.ChatCompletionRequest): - """Chat completion endpoint with streaming support.""" - if payload.stream: - def sse_generator(): - state.model = LocalSmallModel("Qwen/Qwen2.5-0.5B-Instruct") - if state.model is None: - raise RuntimeError("Model not initialized") - - chunk_id = f"chatcmpl-{uuid.uuid4().hex[:8]}" - created_time = int(datetime.now().timestamp()) - model_name = payload.model or "Qwen/Qwen2.5-0.5B-Instruct" - - for token in state.model.stream_generate( - messages=payload.messages, - temperature=payload.temperature, - max_tokens=payload.max_tokens - ): - # Use ChatCompletionChunk schema - chunk = schemas.ChatCompletionChunk( - id=chunk_id, - object="chat.completion.chunk", - created=created_time, - model=model_name, - choices=[ - schemas.ChatStreamChoice( - index=0, - delta=schemas.ChatDelta(content=token), - finish_reason=None - ) - ] - ) - yield f"data: {chunk.model_dump_json()}\n\n" - - # Final chunk with finish_reason - final_chunk = schemas.ChatCompletionChunk( - id=chunk_id, - object="chat.completion.chunk", - created=created_time, - model=model_name, - choices=[ - schemas.ChatStreamChoice( - index=0, - delta=schemas.ChatDelta(content=None), - finish_reason="stop" - ) - ] - ) - yield f"data: {final_chunk.model_dump_json()}\n\n" - yield "data: [DONE]\n\n" - - return sse_generator() - else: - return chat_logic(payload) - - -@app.endpoint(path="/embeddings") -def embeddings_endpoint(payload: schemas.EmbeddingRequest): - return embeddings_logic(payload) - - -@app.endpoint(path="/stream") -def stream_endpoint(): - def simple_stream(): - try: - for i in range(10): - message = {"index": i, "text": f"Message {i}"} - yield f"data: {json.dumps(message)}\n\n" - time.sleep(1) - yield "data: [DONE]\n\n" - except GeneratorExit: - print("Client disconnected") - except Exception as e: - yield f"data: {{\"error\": \"{str(e)}\"}}\n\n" - - return simple_stream() - - -if __name__ == "__main__": - app.start() \ No newline at end of file diff --git a/test/services/__init__.py b/test/services/__init__.py new file mode 100644 index 0000000..5bd6003 --- /dev/null +++ b/test/services/__init__.py @@ -0,0 +1,11 @@ +"""Reusable APIPod service definitions for the test suite. + +Three services, each exposing a ``register(app)`` callback: + +- ``core_service`` parameter shapes, file I/O, JobProgress; also a runnable + entrypoint for the fastSDK subprocess tests. +- ``schema_service`` one endpoint per standardized (OpenAI-compatible) schema; + schema extension and raw/typed response mapping cases. +- ``streaming_service`` three streaming modes: plain text tokens, binary frames, + ChatCompletion SSE deltas. +""" diff --git a/test/services/core_service.py b/test/services/core_service.py new file mode 100644 index 0000000..5272462 --- /dev/null +++ b/test/services/core_service.py @@ -0,0 +1,103 @@ +"""Core service: the parameter shapes and file-handling an author actually writes. + +- ``register_minimal`` two trivial endpoints (OpenAPI smoke test, config matrix). +- ``register`` full set: scalars, custom pydantic model, predict/echo_image + (used by fastSDK tests), broad media+model endpoint, + JobProgress lifecycle, single file upload. + +The module-level ``app`` makes this file a valid ``apipod --start`` entrypoint, +so fastSDK end-to-end tests can boot it as a subprocess via ``conftest.live_service``. + +APIPod normalizes ``_`` to ``-`` in routes, so e.g. ``/mixed_media`` is served +at ``/mixed-media``. +""" + +import time +from typing import List, Optional + +from pydantic import BaseModel +from fastapi import UploadFile as FastAPIUploadFile + +from apipod import APIPod, JobProgress, MediaFile, ImageFile, AudioFile, VideoFile, FileModel + + +class MoreParams(BaseModel): + pam1: str = "pam1" + pam2: int = 42 + + +def register_minimal(app): + @app.endpoint("/echo") + def echo(text: str): + return text + + @app.endpoint("/add") + def add(a: int, b: int = 1): + return a + b + + +def register(app): + # Plain scalars — verifies standard type coercion. + @app.endpoint("/scalars") + def scalars(text: str, count: int, ratio: float = 1.0, flag: bool = False): + return {"text": text, "count": count, "ratio": ratio, "flag": flag} + + # Custom pydantic model. + @app.endpoint("/model") + def model(order: MoreParams): + return {"pam1": order.pam1, "pam2": order.pam2} + + # Clean scalar + media I/O; also the primary targets for fastSDK tests. + @app.endpoint("/predict") + def predict(text: str, times: int = 1): + return text * times + + @app.endpoint("/echo_image") + def echo_image(image: ImageFile): + return image + + # One endpoint, many input options: optional/required media, raw UploadFile, + # union media types, media lists, a custom model and plain scalars. + @app.endpoint("/mixed_media") + def mixed_media( + job_progress: JobProgress, + anyfile1: Optional[MediaFile], + anyfile2: FileModel, + anyfile3: FastAPIUploadFile, + img: ImageFile | str | bytes | FileModel, + audio: AudioFile, + video: VideoFile, + anyfiles: List[MediaFile], + a_base_model: Optional[MoreParams], + anint2: int, + anyImages: List[ImageFile] = ["default_value"], + astring: str = "master_of_desaster", + anint: int = 42, + ): + return anyfile3, str, anyfile1.to_base64(), img.to_base64(), anyfiles + + # JobProgress + queue lifecycle. + @app.post(path="/test_job_progress", queue_size=10) + def job_progress_demo(job_progress: JobProgress, fries_name: str, amount: int = 1): + job_progress.set_status(0.1, f"started new fries creation {fries_name}") + time.sleep(0.2) + job_progress.set_status(0.5, f"working on it, lots to do {amount}") + time.sleep(0.2) + job_progress.set_status(0.8, "almost done") + time.sleep(0.2) + return f"Your fries {fries_name} are ready" + + # Single file upload — also verifies base64 round-trip. + @app.endpoint("/single_file_upload") + def single_file_upload(job_progress: JobProgress, file1: ImageFile): + return file1.to_base64() + + +# Runnable entrypoint: booted by ``apipod --start`` / ``--simulate`` in +# fastSDK end-to-end tests via ``conftest.live_service``. +app = APIPod() # run intent injected via env by the CLI +register(app) + + +if __name__ == "__main__": + app.start() diff --git a/test/services/schema_service.py b/test/services/schema_service.py new file mode 100644 index 0000000..55e376e --- /dev/null +++ b/test/services/schema_service.py @@ -0,0 +1,117 @@ +"""Schema service: endpoints for the standardized (OpenAI-compatible) schemas. + +- ``register_all`` one endpoint per registered request schema. +- ``register_extended`` an endpoint whose input extends a schema with a field. +- ``register_mapping`` raw + typed return endpoint for each mapping CASE. + +``CASES`` drives the response-model passthrough vs. raw-value normalization +tests (text, embedding and media-envelope schemas). +""" + +from dataclasses import dataclass +from typing import Any, Type + +from apipod.common import schemas +from apipod.engine.backend.schema_resolve import SCHEMA_REGISTRY + + +def tag_path(request_model: Type) -> str: + """Public route path for a schema (APIPod normalizes ``_`` to ``-``).""" + return "/" + SCHEMA_REGISTRY[request_model].tag.replace("_", "-") + + +def _schema_endpoint(request_model: Type, return_value: Any, name: str): + """Build an endpoint whose only parameter is annotated with ``request_model``.""" + + def endpoint(request): + return return_value + + endpoint.__name__ = name + endpoint.__annotations__ = {"request": request_model} + return endpoint + + +def register_all(app): + for request_model, spec in SCHEMA_REGISTRY.items(): + app.endpoint(tag_path(request_model))(_schema_endpoint(request_model, {}, f"ep_{spec.tag}")) + + +class ChatRequestPlus(schemas.ChatCompletionRequest): + persona: str = "pirate" + + +def register_extended(app): + @app.endpoint("/chat-extended") + def chat_extended(request: ChatRequestPlus): + # The extra `persona` input field is parsed and drives the answer. + return f"[{request.persona}] {request.messages[-1].content}" + + +@dataclass +class SchemaCase: + request_model: Type + response_model: Type + payload: dict + raw: Any # raw value the endpoint may return + typed: Any # the response_model instance the endpoint may return + + +CASES = [ + SchemaCase( + schemas.ChatCompletionRequest, schemas.ChatCompletionResponse, + {"messages": [{"role": "user", "content": "hi"}]}, + raw="hello there", + typed=schemas.ChatCompletionResponse( + created=0, + choices=[schemas.ChatCompletionChoice( + index=0, message=schemas.ChatCompletionMessage(content="hello there"), finish_reason="stop")], + ), + ), + SchemaCase( + schemas.CompletionRequest, schemas.CompletionResponse, + {"prompt": "hi"}, + raw="completed", + typed=schemas.CompletionResponse( + created=0, + choices=[schemas.CompletionChoice(text="completed", index=0, finish_reason="stop")], + ), + ), + SchemaCase( + schemas.EmbeddingRequest, schemas.EmbeddingResponse, + {"input": "hi"}, + raw=[0.1, 0.2, 0.3], + typed=schemas.EmbeddingResponse(data=[schemas.EmbeddingData(embedding=[0.1, 0.2, 0.3], index=0)]), + ), + SchemaCase( + schemas.ImageGenerationRequest, schemas.ImageGenerationResponse, + {"prompt": "a cat"}, raw={"data": []}, + typed=schemas.ImageGenerationResponse(created=0, data=[]), + ), + SchemaCase( + schemas.VideoGenerationRequest, schemas.VideoGenerationResponse, + {"prompt": "a cat"}, raw={"data": []}, + typed=schemas.VideoGenerationResponse(created=0, data=[]), + ), + SchemaCase( + schemas.SpeechRequest, schemas.SpeechResponse, + {"input": "hello"}, raw={"data": []}, + typed=schemas.SpeechResponse(created=0, data=[]), + ), + SchemaCase( + schemas.Generation3DRequest, schemas.Generation3DResponse, + {"prompt": "a chair"}, raw={"data": []}, + typed=schemas.Generation3DResponse(created=0, data=[]), + ), + SchemaCase( + schemas.MultimodalEmbeddingRequest, schemas.MultimodalEmbeddingResponse, + {"input": "hi"}, raw={"data": []}, + typed=schemas.MultimodalEmbeddingResponse(data=[]), + ), +] + + +def register_mapping(app): + for case in CASES: + tag = SCHEMA_REGISTRY[case.request_model].tag.replace("_", "-") + app.endpoint(f"/{tag}-raw")(_schema_endpoint(case.request_model, case.raw, f"{tag}_raw")) + app.endpoint(f"/{tag}-typed")(_schema_endpoint(case.request_model, case.typed, f"{tag}_typed")) diff --git a/test/services/streaming_service.py b/test/services/streaming_service.py new file mode 100644 index 0000000..45c1bd6 --- /dev/null +++ b/test/services/streaming_service.py @@ -0,0 +1,33 @@ +"""Streaming service: all three streaming modes APIPod supports. + +Endpoint types: +- ``/text`` plain text-token generator (generic generator endpoint), +- ``/video`` raw binary frames (byte generator, SSE-framed as base64), +- ``/chat`` ChatCompletionRequest with optional stream=True (schema endpoint: + returns token deltas wrapped into ChatCompletionChunk SSE events). + +Constants are exported so streaming tests can assert the exact expected output +without duplicating the data. +""" + +from apipod.common import schemas + +CHAT_TOKENS = ["Hello", ", ", "world", "!"] +TEXT_TOKENS = ["APIPod ", "streams ", "tokens ", "one ", "by ", "one."] +VIDEO_FRAMES = [bytes([i]) * 2048 for i in range(5)] + + +def register(app): + @app.endpoint("/text") + def stream_text(): + yield from TEXT_TOKENS + + @app.endpoint("/video") + def stream_video(): + yield from VIDEO_FRAMES + + @app.endpoint("/chat") + def chat(request: schemas.ChatCompletionRequest): + if request.stream: + return (token for token in CHAT_TOKENS) + return "".join(CHAT_TOKENS) diff --git a/test/test_cli.py b/test/test_cli.py new file mode 100644 index 0000000..9294903 --- /dev/null +++ b/test/test_cli.py @@ -0,0 +1,89 @@ +""" +B) CLI commands: scan, build, simulate. + +Each command is driven through its real entry point (``apipod.cli``) against a +throwaway project, asserting it produces the expected artifacts: +- ``scan`` -> apipod-deploy/apipod.json +- ``build`` -> apipod-deploy/Dockerfile (Docker invocation itself is stubbed) +- ``simulate`` -> applies the run intent (env) and boots the resolved entrypoint + via the app's ``start`` (uvicorn.run is stubbed so the test does not block). +""" + +import argparse + +import pytest + +import apipod.cli as cli +from apipod.deploy.deployment_manager import DeploymentManager + +SERVICE_FILE = """\ +from apipod import APIPod + +app = APIPod(title="cli-test-service") + + +@app.endpoint("/ping") +def ping(): + return "pong" + + +if __name__ == "__main__": + app.start() +""" + + +@pytest.fixture +def project(tmp_path, monkeypatch): + """A minimal apipod project; cwd is moved into it so the CLI scans it.""" + (tmp_path / "pyproject.toml").write_text('[project]\nname = "svc"\nversion = "0.0.0"\n') + (tmp_path / "main.py").write_text(SERVICE_FILE) + monkeypatch.chdir(tmp_path) + # Auto-confirm every interactive prompt. + monkeypatch.setattr("builtins.input", lambda *a, **k: "y") + return tmp_path + + +def test_scan_generates_config(project): + cli.run_scan() + + config = project / "apipod-deploy" / "apipod.json" + assert config.exists() + + import json + data = json.loads(config.read_text()) + assert data["entrypoint"] == "main.py" + assert data["title"] == "cli-test-service" + + +def test_build_generates_dockerfile(project, monkeypatch): + # Never actually invoke Docker. + monkeypatch.setattr(DeploymentManager, "build_docker_image", lambda self, title: True) + + cli.run_build(argparse.Namespace(build=True)) + + dockerfile = project / "apipod-deploy" / "Dockerfile" + assert dockerfile.exists() + assert "FROM" in dockerfile.read_text() + + +def test_simulate_applies_intent_and_starts(project, monkeypatch): + started = {} + + def fake_uvicorn_run(app, host=None, port=None, **kwargs): + started["host"] = host + started["port"] = port + + monkeypatch.setattr("uvicorn.run", fake_uvicorn_run) + + args = argparse.Namespace( + simulate="serverless", direct=None, entrypoint="main.py", host="127.0.0.1", port=8123 + ) + cli.run_simulate(args) + + import os + assert os.environ["APIPOD_SIMULATE"] == "serverless" # intent applied as env + assert started == {"host": "127.0.0.1", "port": 8123} # entrypoint booted + + +if __name__ == "__main__": + raise SystemExit(pytest.main([__file__, "-v"])) diff --git a/test/test_clients_six_schemas.py b/test/test_clients_six_schemas.py deleted file mode 100644 index 43dc4ba..0000000 --- a/test/test_clients_six_schemas.py +++ /dev/null @@ -1,185 +0,0 @@ -""" -Exercises the test service in three ways, as Matthias asked on PR #15: - 1. fastSDK client - 2. HTTP request with base64 - 3. HTTP request with URL - -Run the service first in another shell: - python examples/test_service_six_schemas.py - -Then run this: - python examples/test_clients_six_schemas.py -""" - -import base64 -import io -import json -import sys -import urllib.request -from pathlib import Path - -import requests - -BASE_URL = "http://localhost:8000" -# A small public PNG used for the "URL" test. Picked because it doesn't need -# auth and returns a real PNG header (so media_toolkit can sniff it). -PUBLIC_IMAGE_URL = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/120px-PNG_transparency_demonstration_1.png" - - -def _make_local_png_bytes() -> bytes: - """Build a small but real-sized PNG (32x32 solid red) in-process. - - media_toolkit's base64 sniffer needs a payload long enough to be confident - it is base64 and not a short identifier-looking string. The original 1x1 - PNG (67 bytes / 92 b64 chars) sat below the heuristic; 32x32 (~100 bytes / - ~140 b64 chars) is comfortably above it and matches realistic JSON callers. - """ - import struct - import zlib - - width = height = 32 - color = (255, 0, 0) - - ihdr_data = struct.pack(">IIBBBBB", width, height, 8, 2, 0, 0, 0) - raw = b"" - for _ in range(height): - raw += b"\x00" + bytes(color * width) - idat = zlib.compress(raw) - - return ( - b"\x89PNG\r\n\x1a\n" - + struct.pack(">I", len(ihdr_data)) + b"IHDR" + ihdr_data + struct.pack(">I", zlib.crc32(b"IHDR" + ihdr_data)) - + struct.pack(">I", len(idat)) + b"IDAT" + idat + struct.pack(">I", zlib.crc32(b"IDAT" + idat)) - + struct.pack(">I", 0) + b"IEND" + struct.pack(">I", zlib.crc32(b"IEND")) - ) - - -def _print_result(label: str, status: int, body) -> None: - print(f"\n=== {label} ===") - print(f"HTTP {status}") - print(json.dumps(body, indent=2) if isinstance(body, (dict, list)) else body) - - -# ------------------------------------------------------------------- -# 1. HTTP with base64 -# ------------------------------------------------------------------- -def test_http_base64() -> bool: - png = _make_local_png_bytes() - b64 = base64.b64encode(png).decode("ascii") - payload = { - "model": "test-model", - "image": b64, - } - r = requests.post(f"{BASE_URL}/vision", json=payload, timeout=15) - try: - body = r.json() - except Exception: - body = r.text - _print_result("HTTP base64", r.status_code, body) - return r.status_code == 200 - - -# ------------------------------------------------------------------- -# 2. HTTP with URL -# ------------------------------------------------------------------- -def test_http_url() -> bool: - payload = { - "model": "test-model", - "image": PUBLIC_IMAGE_URL, - } - r = requests.post(f"{BASE_URL}/vision", json=payload, timeout=30) - try: - body = r.json() - except Exception: - body = r.text - _print_result("HTTP URL", r.status_code, body) - return r.status_code == 200 - - -# ------------------------------------------------------------------- -# 3. fastSDK client -# ------------------------------------------------------------------- -def test_fastsdk() -> bool: - """ - Hits /vision through fastSDK. - - Note: fastSDK's public entry points (`FastClient`, `create_sdk`, - `APISeex`) all expect either a service registered in the Registry - or a generated client class. There is no ad-hoc "given this URL, - just POST this payload" path. For the purposes of PR #15 this means - a single localhost service like the one in this example is not the - intended fastSDK use case; the right shape would be to register - the service first and then call it through the SDK. - - For now we just dispatch a low-level APISeex with a minimal - ServiceDefinition and report whatever happens. - """ - try: - from fastsdk import APISeex, ImageFile - from apipod_registry.definitions.service_definitions import ( - ServiceDefinition, EndpointDefinition, EndpointParameter, - ServiceAddress, - ) - except Exception as exc: - _print_result("fastSDK", -1, f"import failed: {exc.__class__.__name__}: {exc}") - return False - - try: - service = ServiceDefinition( - id="test-svc", - display_name="test svc", - description="local test service", - service_address=ServiceAddress(url=BASE_URL), - endpoints=[], - ) - endpoint = EndpointDefinition( - id="vision", - path="/vision", - display_name="vision", - description="vision echo", - parameters=[ - EndpointParameter( - name="model", type="string", required=True, - location="body", default="test-model", - ), - EndpointParameter( - name="image", type="image", required=True, - location="body", - ), - ], - ) - png = _make_local_png_bytes() - img = ImageFile().from_bytes(png) - seex = APISeex( - service_def=service, - endpoint_def=endpoint, - data={"model": "test-model", "image": img}, - ) - result = seex.wait_for_result(timeout_s=15) - if seex.error: - _print_result("fastSDK", -1, f"server returned error: {seex.error}") - return False - if result is None: - _print_result("fastSDK", -1, "no result returned (request likely not dispatched; needs Registry setup)") - return False - _print_result("fastSDK", 200, str(result)) - return True - except Exception as exc: - _print_result("fastSDK", -1, f"call failed: {exc.__class__.__name__}: {exc}") - return False - - -def main() -> int: - results = { - "HTTP base64": test_http_base64(), - "HTTP URL": test_http_url(), - "fastSDK": test_fastsdk(), - } - print("\n=== Summary ===") - for name, ok in results.items(): - print(f" {name}: {'PASS' if ok else 'FAIL'}") - return 0 if all(results.values()) else 1 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/test/test_config.py b/test/test_config.py new file mode 100644 index 0000000..eafac83 --- /dev/null +++ b/test/test_config.py @@ -0,0 +1,79 @@ +""" +A) Configuration: every run intent resolves to the right backend and can serve a +loadable OpenAPI schema. + +``APIPod(simulate=..., direct=...)`` is a factory. Part 1 pins the intent -> +backend mapping (FastAPI vs RunPod, job queue present or not). Part 2 boots a +minimal service under each FastAPI intent and asserts ``/openapi.json`` loads and +documents the routes (fastSDK and Swagger UI build everything from it). +""" + +import pytest + +from apipod import APIPod +from apipod.engine.backend.fastapi.router import SocaityFastAPIRouter +from apipod.engine.backend.runpod.router import SocaityRunpodRouter + +from conftest import FASTAPI_CONFIGS, build_service +from services import core_service + +FASTAPI = SocaityFastAPIRouter +RUNPOD = SocaityRunpodRouter + +# (APIPod kwargs, expected backend, expects_job_queue) +RESOLUTIONS = [ + pytest.param({}, FASTAPI, False, id="development"), + pytest.param({"simulate": ""}, FASTAPI, True, id="simulate-bare"), + pytest.param({"simulate": "serverless"}, FASTAPI, True, id="serverless"), + pytest.param({"simulate": "dedicated"}, FASTAPI, False, id="dedicated"), + pytest.param({"simulate": "dedicated-azure"}, FASTAPI, False, id="dedicated-azure"), + pytest.param({"simulate": "serverless-runpod"}, FASTAPI, True, id="serverless-runpod"), + pytest.param({"simulate": "serverless-azure"}, FASTAPI, True, id="serverless-azure-fallback"), + pytest.param({"simulate": "serverless-runpod", "direct": True}, RUNPOD, False, id="runpod-direct"), +] + + +# --------------------------------------------------------------------------- # +# 1. Intent -> backend resolution +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("kwargs, backend, expects_queue", RESOLUTIONS) +def test_intent_resolves_to_backend(kwargs, backend, expects_queue): + app = APIPod(**kwargs) + assert isinstance(app, backend) + if backend is FASTAPI: + assert (app.job_queue is not None) is expects_queue + else: + assert app.simulate is True # runpod local emulator + + +@pytest.mark.parametrize("target", ["invalid", "serverless-invalid"]) +def test_invalid_target_raises(target): + with pytest.raises(ValueError, match="Invalid"): + APIPod(simulate=target) + + +# --------------------------------------------------------------------------- # +# 2. OpenAPI schema loads for every backend +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("config", FASTAPI_CONFIGS) +def test_openapi_loads_for_fastapi_backends(config): + with build_service(core_service.register_minimal, **config) as client: + schema = client.get("/openapi.json").json() + assert schema["openapi"].startswith("3.") + assert {"/echo", "/add"} <= set(schema["paths"]) + assert "apipod" in schema["info"] # APIPod stamps its version in + + +def test_openapi_for_runpod_direct(): + """The RunPod worker has no HTTP layer; it synthesizes the schema itself.""" + app = APIPod(simulate="serverless-runpod", direct=True) + core_service.register_minimal(app) + + schema = app.get_openapi_schema() + assert schema["openapi"].startswith("3.") + assert {"/echo", "/add"} <= set(schema["paths"]) + assert "apipod" in schema["info"] + + +if __name__ == "__main__": + raise SystemExit(pytest.main([__file__, "-v"])) diff --git a/test/test_config_resolution.py b/test/test_config_resolution.py deleted file mode 100644 index 0b534b0..0000000 --- a/test/test_config_resolution.py +++ /dev/null @@ -1,74 +0,0 @@ -from apipod import APIPod -from apipod.engine.backend.fastapi.router import SocaityFastAPIRouter -from apipod.engine.backend.runpod.router import SocaityRunpodRouter - - -def test_development_default(): - # APIPod() -> plain FastAPI, no job queue. - app = APIPod() - assert isinstance(app, SocaityFastAPIRouter) - assert app.job_queue is None - - -def test_simulate_serverless_default(): - # simulate (bare / "serverless") -> FastAPI + Local Job Queue. - for target in ("", "serverless"): - app = APIPod(simulate=target) - assert isinstance(app, SocaityFastAPIRouter) - assert app.job_queue is not None - - -def test_simulate_dedicated(): - # dedicated -> Standard FastAPI (no queue). - app = APIPod(simulate="dedicated") - assert isinstance(app, SocaityFastAPIRouter) - assert app.job_queue is None - - -def test_simulate_dedicated_azure(): - # dedicated-azure -> FastAPI (direct client), no queue. - app = APIPod(simulate="dedicated-azure") - assert isinstance(app, SocaityFastAPIRouter) - assert app.job_queue is None - - -def test_simulate_serverless_runpod(): - # serverless-runpod (no direct) -> Socaity emulation = FastAPI + job queue. - app = APIPod(simulate="serverless-runpod") - assert isinstance(app, SocaityFastAPIRouter) - assert app.job_queue is not None - - -def test_simulate_serverless_runpod_direct(): - # serverless-runpod + direct -> RunPod local emulation. - app = APIPod(simulate="serverless-runpod", direct=True) - assert isinstance(app, SocaityRunpodRouter) - assert app.simulate is True - - -def test_simulate_serverless_azure_warns_and_falls_back(): - # azure has no serverless -> FastAPI + job queue (with warning). - app = APIPod(simulate="serverless-azure") - assert isinstance(app, SocaityFastAPIRouter) - assert app.job_queue is not None - - -def test_invalid_target_values(): - for target in ("invalid", "serverless-invalid"): - try: - APIPod(simulate=target) - assert False - except ValueError as e: - assert "Invalid" in str(e) - - -if __name__ == "__main__": - test_development_default() - test_simulate_serverless_default() - test_simulate_dedicated() - test_simulate_dedicated_azure() - test_simulate_serverless_runpod() - test_simulate_serverless_runpod_direct() - test_simulate_serverless_azure_warns_and_falls_back() - test_invalid_target_values() - print("All config resolution tests passed.") diff --git a/test/test_core.py b/test/test_core.py new file mode 100644 index 0000000..30ce8b2 --- /dev/null +++ b/test/test_core.py @@ -0,0 +1,84 @@ +""" +A) Core endpoint plumbing on the FastAPI backend. + +Exercises the parameter shapes an author writes and the file/queue machinery: +- standard scalar types and a custom pydantic model, +- the broad ``/mixed-media`` endpoint (model + media + scalars) builds & documents, +- single file upload via multipart and via base64 (round-trips to base64 out), +- the job queue + JobProgress lifecycle (submit, poll, read result). + +Development mode runs endpoints inline; serverless mode queues them. +""" + +import base64 +import time + +import pytest + +from conftest import IMAGE_FILE, build_service +from services import core_service + + +@pytest.fixture(scope="module") +def dev_client(): + with build_service(core_service.register) as c: + yield c + + +@pytest.fixture(scope="module") +def serverless_client(): + with build_service(core_service.register, simulate="serverless") as c: + yield c + + +def test_standard_types(dev_client): + resp = dev_client.post("/scalars", data={"text": "hi", "count": 3, "ratio": 2.5, "flag": True}) + assert resp.status_code == 200, resp.text + assert resp.json() == {"text": "hi", "count": 3, "ratio": 2.5, "flag": True} + + +def test_custom_pydantic_model(dev_client): + resp = dev_client.post("/model", data={"pam1": "burger", "pam2": 2}) + assert resp.status_code == 200, resp.text + assert resp.json() == {"pam1": "burger", "pam2": 2} + + +def test_mixed_media_is_documented(dev_client): + """The broad mixed endpoint (model + media + scalars) builds and is documented.""" + schema = dev_client.get("/openapi.json").json() + assert "/mixed-media" in schema["paths"] + + +def test_single_file_upload_multipart(dev_client): + with open(IMAGE_FILE, "rb") as fh: + resp = dev_client.post("/single-file-upload", files={"file1": (IMAGE_FILE.name, fh, "image/png")}) + assert resp.status_code == 200, resp.text + assert base64.b64decode(resp.json()) # valid base64 back out + + +def test_single_file_upload_base64(dev_client): + payload = base64.b64encode(IMAGE_FILE.read_bytes()).decode() + resp = dev_client.post("/single-file-upload", data={"file1": payload}) + assert resp.status_code == 200, resp.text + assert base64.b64decode(resp.json()) # round-tripped through ImageFile + + +def test_job_progress_lifecycle(serverless_client): + submit = serverless_client.post("/test-job-progress", data={"fries_name": "curly", "amount": 2}) + assert submit.status_code == 200, submit.text + status_url = submit.json()["links"]["status"] + + deadline = time.time() + 15 + while time.time() < deadline: + body = serverless_client.get(status_url).json() + if body.get("result") is not None: + assert body["result"] == "Your fries curly are ready" + return + if body.get("status") in ("failed", "timeout", "not_found"): + pytest.fail(f"job ended unexpectedly: {body}") + time.sleep(0.1) + pytest.fail("job did not finish in time") + + +if __name__ == "__main__": + raise SystemExit(pytest.main([__file__, "-v"])) diff --git a/test/test_core_functionalities.py b/test/test_core_functionalities.py deleted file mode 100644 index 01bf5c8..0000000 --- a/test/test_core_functionalities.py +++ /dev/null @@ -1,73 +0,0 @@ -from typing import List, Optional - -from pydantic import BaseModel - -import time - -from apipod import APIPod -from apipod import JobProgress -from apipod import MediaFile, ImageFile, AudioFile, VideoFile, FileModel -from fastapi import UploadFile as fastapiUploadFile - -app = APIPod(simulate="serverless") - - -@app.post(path="/test_job_progress", queue_size=10) -def test_job_progress(job_progress: JobProgress, fries_name: str, amount: int = 1): - job_progress.set_status(0.1, f"started new fries creation {fries_name}") - time.sleep(1) - job_progress.set_status(0.5, f"I am working on it. Lots of work to do {amount}") - time.sleep(2) - job_progress.set_status(0.8, "Still working on it. Almost done") - time.sleep(2) - return f"Your fries {fries_name} are ready" - - -class MoreParams(BaseModel): - pam1: str = "pam1" - pam2: int = 42 - - -@app.endpoint("/mixed_media") -def test_mixed_media( - job_progress: JobProgress, - anyfile1: Optional[MediaFile], - anyfile2: FileModel, - anyfile3: fastapiUploadFile, - img: ImageFile | str | bytes | FileModel, - audio: AudioFile, - video: VideoFile, - anyfiles: List[MediaFile], - a_base_model: Optional[MoreParams], - anint2: int, - anyImages: List[ImageFile] = ["default_value"], - astring: str = "master_of_desaster", - anint: int = 42 -): - content_one = anyfile1.to_base64() - content_two = img.to_base64() - return anyfile3, str, content_one, content_two, anyfiles - - -@app.endpoint("test_single_file_upload") -def test_single_file_upload( - job_progress: JobProgress, - file1: ImageFile -): - return file1.to_base64() - -@app.endpoint("/normal_endpoint") -def normal_endpoint(): - return "normal_endpoint" - - - - - -if __name__ == "__main__": - # Runpod version - #app.start(port=8000, environment="localhost") - - app.start(environment="serverless", port=8000) - # app.start(environment="localhost", port=8000) - diff --git a/test/test_demo_fastapi.py b/test/test_demo_fastapi.py deleted file mode 100644 index a89ac29..0000000 --- a/test/test_demo_fastapi.py +++ /dev/null @@ -1,48 +0,0 @@ -from apipod import APIPod -from apipod import JobProgress -from apipod import ImageFile -import time -import numpy as np - - -# define the app including your provider (fastapi, runpod..) -app = APIPod() - - -# add endpoints to your service -@app.endpoint("/predict") -def predict(my_param1: str, my_param2: int = 0): - return f"my_awesome_prediction {my_param1} {my_param2}" - - -@app.endpoint("/img2img") -def img2img(upload_img: ImageFile): - img_as_numpy = np.array(upload_img) # this returns a np.array read with cv2 - # Do some hard work here... - # img_as_numpy = img2img(img_as_numpy) - return ImageFile().from_np_array(img_as_numpy) - - -@app.get(path="/prompt_helper", queue_size=100) -def prompt_helper(job_progress: JobProgress, text: str, enhancement: int = 1): - """ - Submit a prompt and we will improve its quality to make the best out of your images. - :return: a super enhanced prompt - """ - job_progress.set_status(0.1, "enhancing your prompt with fancy addons like 8k, ultra high res") - time.sleep(1) - text += " 8k, ultra high res, perfect anatomy" - job_progress.set_status(0.5, f"I am working on it. Lots of work to do {enhancement}") - time.sleep(2) - job_progress.set_status(0.8, "Still working on it. Almost done") - time.sleep(2) - return f"Your enhanced prompt {text} is ready" - - -@app.endpoint("/test_no_queue_endpoint", methods=["POST"], max_upload_file_size_mb=10, use_queue=False) -def test_single_file_upload(file1: ImageFile): - return file1 - - -# start and run the server -app.start() diff --git a/test/test_schemas.py b/test/test_schemas.py new file mode 100644 index 0000000..0676c60 --- /dev/null +++ b/test/test_schemas.py @@ -0,0 +1,101 @@ +""" +A) Standardized (OpenAI-compatible) AI service schemas. + +1. Auto-assignment: APIPod detects a registered request schema in the function + signature and automatically assigns the correct response model — the author + never writes ``response_model=...``. Verified by checking the OpenAPI 200 + response ``$ref`` for each endpoint against the SCHEMA_REGISTRY. +2. Schema extension: a service can subclass a request schema with extra fields; + those fields are parsed and reachable in the endpoint. +3. Response normalization: a schema endpoint may return the response model + directly *or* a convenient raw value (string / list / dict / media); both + normalize into the correct response model. +""" + +import pytest + +from apipod.common import schemas +from apipod.engine.backend.schema_resolve import SCHEMA_REGISTRY + +from conftest import build_service +from services import schema_service +from services.schema_service import CASES + + +def _response_ref(spec: dict, path: str) -> str: + """Return the $ref string from the 200 application/json response of a POST endpoint.""" + try: + return ( + spec["paths"][path]["post"]["responses"]["200"] + ["content"]["application/json"]["schema"]["$ref"] + ) + except KeyError: + return "" + + +# --------------------------------------------------------------------------- # +# 1. Auto-assignment: response model comes from the registry, not the author +# --------------------------------------------------------------------------- # +def test_response_model_auto_assigned_from_registry(): + """The 200 response schema is set to the correct response model for every + registered schema, even though ``register_all`` never passes ``response_model`` + explicitly — APIPod reads it from SCHEMA_REGISTRY via the schema binding.""" + with build_service(schema_service.register_all) as client: + spec = client.get("/openapi.json").json() + + for request_model, registry_spec in SCHEMA_REGISTRY.items(): + path = schema_service.tag_path(request_model) + expected = f"#/components/schemas/{registry_spec.response_model.__name__}" + actual = _response_ref(spec, path) + assert actual == expected, ( + f"{request_model.__name__}: expected 200 $ref {expected!r}, got {actual!r}" + ) + + +# --------------------------------------------------------------------------- # +# 2. Schema extension +# --------------------------------------------------------------------------- # +def test_extended_schema_parses_extra_field(): + """A subclassed request schema carries its extra fields through to the endpoint.""" + with build_service(schema_service.register_extended) as client: + resp = client.post( + "/chat-extended", + json={"messages": [{"role": "user", "content": "ahoy"}], "persona": "captain"}, + ) + assert resp.status_code == 200, resp.text + body = schemas.ChatCompletionResponse.model_validate(resp.json()) + assert body.choices[0].message.content == "[captain] ahoy" + + +# --------------------------------------------------------------------------- # +# 3. Response normalization: raw value vs. typed instance +# --------------------------------------------------------------------------- # +@pytest.fixture(scope="module") +def mapping_client(): + with build_service(schema_service.register_mapping) as c: + yield c + + +_IDS = [c.request_model.__name__ for c in CASES] + + +@pytest.mark.parametrize("case", CASES, ids=_IDS) +def test_raw_value_wraps_into_response_model(mapping_client, case): + """A raw return value (str / list / dict) is normalized into the response model.""" + tag = SCHEMA_REGISTRY[case.request_model].tag.replace("_", "-") + resp = mapping_client.post(f"/{tag}-raw", json=case.payload) + assert resp.status_code == 200, resp.text + case.response_model.model_validate(resp.json()) + + +@pytest.mark.parametrize("case", CASES, ids=_IDS) +def test_typed_instance_passes_through(mapping_client, case): + """A response model instance is serialized unchanged.""" + tag = SCHEMA_REGISTRY[case.request_model].tag.replace("_", "-") + resp = mapping_client.post(f"/{tag}-typed", json=case.payload) + assert resp.status_code == 200, resp.text + case.response_model.model_validate(resp.json()) + + +if __name__ == "__main__": + raise SystemExit(pytest.main([__file__, "-v"])) diff --git a/test/test_service_six_schemas.py b/test/test_service_six_schemas.py deleted file mode 100644 index 6cd9b01..0000000 --- a/test/test_service_six_schemas.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -Minimal APIPod service used to verify media-file integration of the -standardized schemas end to end. - -It exposes two endpoints: -- POST /vision uses VisionRequest, which has a REQUIRED image field -- POST /transcribe uses TranscriptionRequest, which has a REQUIRED audio field - -Both endpoints just inspect the incoming media file and echo back a few -properties (size, content type, etc.) so we can confirm the file handling -actually deserialized upload/URL/base64 input into a real ImageFile/AudioFile. - -Run with: - python examples/test_service_six_schemas.py -The server starts on http://0.0.0.0:8000 with OpenAPI docs at /docs. -""" - -from apipod import APIPod -from apipod.common.schemas import TranscriptionRequest, VisionRequest - - -app = APIPod() - - -def _media_summary(media) -> dict: - """Pull a couple of safe fields off whatever media_toolkit returned.""" - if media is None: - return {"present": False} - return { - "present": True, - "type": type(media).__name__, - "size_bytes": getattr(media, "file_size", None) or getattr(media, "size", None), - "content_type": getattr(media, "content_type", None), - } - - -@app.endpoint("/vision") -def vision(request: VisionRequest): - """Echoes a label built from request.image. The point is that the image - arrived as an ImageFile, deserialized from upload / base64 / URL.""" - summary = _media_summary(request.image) - return { - "data": [ - { - "labels": [{"label": f"echo:{summary}", "score": 1.0}], - "text": None, - } - ] - } - - -@app.endpoint("/transcribe") -def transcribe(request: TranscriptionRequest): - """Echoes the audio properties as the 'transcript'.""" - return { - "text": f"echo:{_media_summary(request.audio)}", - "language": request.language, - } - - -if __name__ == "__main__": - app.start(port=8000, host="0.0.0.0") diff --git a/test/test_streaming.py b/test/test_streaming.py index 52e2d3d..83aa4ab 100644 --- a/test/test_streaming.py +++ b/test/test_streaming.py @@ -1,188 +1,81 @@ """ -Streaming over the serverless emulation. - -APIPod on ``simulate="serverless"`` mimics a real -deployment: streaming endpoints are queued, the in-process worker produces their -chunks into a :class:`StreamStore` (the in-memory ``LocalStreamStore`` by -default), and the client consumes them from ``GET /stream/{job_id}``. A client -that polls ``GET /status/{job_id}`` instead receives the full aggregated result -once the job has finished. - -These tests exercise three chunk kinds: - 1. plain text tokens (any generator endpoint), - 2. binary "video" chunks (bytes, base64-framed over SSE), - 3. ChatCompletion deltas (schema endpoint with ``stream=true``). - -Run directly: python test/test_streaming.py -Or with pytest: pytest test/test_streaming.py +C) Endpoint execution: fastSDK end-to-end + streaming. + +Two layers: +- fastSDK over HTTP: the inference service is booted in a subprocess via the + apipod CLI across a queued and a direct backend. fastSDK drives it exactly as + documented (connect -> submit_job -> get_result), including media upload/download. +- Streaming in-process: the streaming service runs under the serverless emulation + (TestClient). The worker relays chunks into the stream store; the client reads + them from ``GET /stream/{job_id}`` (SSE). Covers plain text tokens, raw byte + frames, and ChatCompletion deltas. + +fastSDK tests are skipped when the installed build lacks ``connect`` +(local mid-refactor state); CI installs one that has it. """ import base64 -import time +import json -from fastapi.testclient import TestClient +import pytest -from apipod import APIPod, LocalStreamStore -from apipod.common import schemas +from conftest import build_service +from services.streaming_service import CHAT_TOKENS, TEXT_TOKENS, VIDEO_FRAMES +from services import streaming_service -# Deterministic "video" payload: a few non-trivial binary frames. -VIDEO_FRAMES = [bytes([i]) * 2048 for i in range(5)] -VIDEO_BYTES = b"".join(VIDEO_FRAMES) +# --------------------------------------------------------------------------- # +# Streaming (in-process TestClient + SSE) +# --------------------------------------------------------------------------- # +@pytest.fixture(scope="module") +def stream_client(): + with build_service(streaming_service.register, simulate="serverless") as c: + yield c -TEXT_TOKENS = ["APIPod ", "streams ", "tokens ", "one ", "by ", "one."] -CHAT_TOKENS = ["Hello", ", ", "world", "!"] - -def build_client() -> TestClient: - """Build a serverless-emulation app with streaming endpoints.""" - app = APIPod(simulate="serverless") - - @app.endpoint("/text") - def stream_text(): - for token in TEXT_TOKENS: - time.sleep(0.02) - yield token - - @app.endpoint("/video") - def stream_video(): - # "Any generator endpoint": here it yields raw video frame bytes. - for frame in VIDEO_FRAMES: - time.sleep(0.02) - yield frame - - @app.endpoint("/chat") - def chat(request: schemas.ChatCompletionRequest): - if request.stream: - def token_gen(): - for token in CHAT_TOKENS: - time.sleep(0.02) - yield token - return token_gen() - return "".join(CHAT_TOKENS) - - fastapi_app = app.app - fastapi_app.include_router(app) - return TestClient(fastapi_app) - - -def _submit(client: TestClient, path: str, json_body=None) -> str: - """POST an endpoint, return the stream URL from the JobResult.""" +def _stream_url(client, path, json_body=None): resp = client.post(path, json=json_body) assert resp.status_code == 200, resp.text - body = resp.json() - assert "job_id" in body, body - stream_url = body["links"]["stream"] - assert stream_url, body - return stream_url + return resp.json()["links"]["stream"] -def _collect_sse_data(client: TestClient, stream_url: str) -> list[str]: - """Open the SSE stream and return the payloads of every ``data:`` line.""" - payloads: list[str] = [] +def _sse_payloads(client, stream_url): + payloads = [] with client.stream("GET", stream_url) as resp: assert resp.status_code == 200, resp.text for line in resp.iter_lines(): - if not line or line.startswith(":"): # keep-alive / blank - continue if line.startswith("data: "): payloads.append(line[len("data: "):]) return payloads -def test_default_stream_store_is_local(): - """Serverless emulation gets a LocalStreamStore by default; plain FastAPI does not.""" - serverless = APIPod(simulate="serverless") - assert isinstance(serverless.stream_store, LocalStreamStore) - - plain = APIPod(simulate="dedicated") - assert plain.stream_store is None - - -def test_stream_text_chunks(): - client = build_client() - stream_url = _submit(client, "/text") - - with client.stream("GET", stream_url) as resp: - assert resp.status_code == 200, resp.text +def test_stream_text_tokens(stream_client): + url = _stream_url(stream_client, "/text") + with stream_client.stream("GET", url) as resp: body = "".join(resp.iter_text()) - assert body == "".join(TEXT_TOKENS) -def test_stream_video_bytes(): - client = build_client() - stream_url = _submit(client, "/video") - - payloads = _collect_sse_data(client, stream_url) - received = b"".join(base64.b64decode(p) for p in payloads) - - assert received == VIDEO_BYTES +def test_stream_raw_byte_frames(stream_client): + url = _stream_url(stream_client, "/video") + received = b"".join(base64.b64decode(p) for p in _sse_payloads(stream_client, url)) + assert received == b"".join(VIDEO_FRAMES) -def test_stream_chat_completion(): - client = build_client() - stream_url = _submit(client, "/chat", {"messages": [{"role": "user", "content": "hi"}], "stream": True}) +def test_stream_chat_completion_chunks(stream_client): + url = _stream_url( + stream_client, "/chat", + {"messages": [{"role": "user", "content": "hi"}], "stream": True}, + ) + payloads = _sse_payloads(stream_client, url) - payloads = _collect_sse_data(client, stream_url) - assert payloads, "expected at least one chat chunk" assert payloads[-1] == "[DONE]" - - import json - content = "" - for raw in payloads[:-1]: - chunk = json.loads(raw) - delta = chunk["choices"][0]["delta"].get("content") - if delta: - content += delta - + content = "".join( + json.loads(raw)["choices"][0]["delta"].get("content") or "" + for raw in payloads[:-1] + ) assert content == "".join(CHAT_TOKENS) -def test_status_returns_full_result_when_not_streaming(): - """A client that polls /status (instead of /stream) gets the full result.""" - client = build_client() - resp = client.post("/text") - assert resp.status_code == 200, resp.text - status_url = resp.json()["links"]["status"] - - # Poll tightly until the job reaches a terminal state and exposes its result. - full_result = None - deadline = time.time() + 5.0 - while time.time() < deadline: - s = client.get(status_url) - body = s.json() - if body.get("result") is not None: - full_result = body["result"] - break - if body.get("status") in ("finished", "failed", "timeout", "not_found"): - full_result = body.get("result") - break - assert full_result == "".join(TEXT_TOKENS) - - -def main() -> int: - tests = [ - test_default_stream_store_is_local, - test_stream_text_chunks, - test_stream_video_bytes, - test_stream_chat_completion, - test_status_returns_full_result_when_not_streaming, - ] - failures = 0 - for test in tests: - try: - test() - print(f" PASS {test.__name__}") - except Exception as exc: # noqa: BLE001 - failures += 1 - import traceback - print(f" FAIL {test.__name__}: {exc.__class__.__name__}: {exc}") - traceback.print_exc() - print(f"\n{len(tests) - failures}/{len(tests)} passed") - return 1 if failures else 0 - - if __name__ == "__main__": - import sys - sys.exit(main()) + raise SystemExit(pytest.main([__file__, "-v"])) From f804692887eb960826a36f86b72677ea6afe2f1d Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Thu, 18 Jun 2026 08:31:11 +0200 Subject: [PATCH 17/38] added pull-request clause for CI --- .github/workflows/publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f8df7e2..9128725 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,6 +4,7 @@ on: push: branches: [main] pull_request: + branches: [main] jobs: # Tests gate everything: no version bump, no publish unless these pass. From b83ef3da64533ffd2e5db11f564b497a417f1b6e Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Thu, 18 Jun 2026 08:34:15 +0200 Subject: [PATCH 18/38] changed verbosity level of pytest in github workflows --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9128725..3abae71 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -22,7 +22,7 @@ jobs: run: pip install -e ".[test]" - name: Run tests - run: pytest -q + run: pytest -v # Soft checks: report only, never fail the build. - name: ruff (soft) From 4549964655fcb96dc09f10a0f31d5a7f6cc66ccf Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Thu, 18 Jun 2026 09:29:46 +0200 Subject: [PATCH 19/38] fixed a bug ocurring due to the new async generator check that goes deeper than simply checking the string. This bug prevented newer python version to correclty render streaming endpoints in configuration mode local serverless with a local jobqueue and stream store in place --- apipod/engine/backend/fastapi/router.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index 3dde124..8c392f7 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -346,6 +346,16 @@ def sync_wrapper(*args, **kwargs): if binding is not None: result = wrap_schema_response(result, binding) return JobResultFactory._serialize_result(result) + + # Python 3.12+ follows __wrapped__ when evaluating inspect.isgeneratorfunction(). + # sync_wrapper is never a generator (it returns a JobResult or StreamProducer). + # Without this, FastAPI would mistake a task endpoint wrapping a generator for a + # streaming route and serve the JobResult as iterated key-value NDJSON chunks. + if hasattr(sync_wrapper, "__wrapped__"): + # Pin the signature explicitly so FastAPI can parse parameters + sync_wrapper.__signature__ = inspect.signature(func) + del sync_wrapper.__wrapped__ + return sync_wrapper def _create_task_endpoint_decorator(self, plan: EndpointExecutionPlan): From dd93acba4c80c398306acf1855066ed7fb3e48ef Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Tue, 23 Jun 2026 11:52:44 +0200 Subject: [PATCH 20/38] apipod now returns more information in the openapi.json --- README.md | 38 ++-- apipod/api.py | 4 +- apipod/cli.py | 249 +++++++++++++++++------- apipod/common/settings.py | 2 +- apipod/engine/backend/fastapi/router.py | 11 +- apipod/engine/backend/runpod/router.py | 20 +- docs/TECHNICAL_README.md | 12 +- test/conftest.py | 10 +- test/services/core_service.py | 4 +- test/test_cli.py | 4 +- test/test_config.py | 5 +- 11 files changed, 240 insertions(+), 119 deletions(-) diff --git a/README.md b/README.md index a2b3c12..ad22417 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Building AI services is complex: file handling, long-running inference, job queu 3. **Standardized I/O** — painless Images, Audio and Video via [media-toolkit](https://github.com/SocAIty/media-toolkit). 4. **OpenAI-compatible schemas** — built-in request/response schemas for chat, completions, embeddings, TTS, transcription, image/video generation. OpenAI clients work out of the box. 5. **Built-in job queue** — async jobs, polling and progress tracking, with no Celery/Redis/Kubernetes to wire up. -6. **One-command packaging** — `apipod --build` generates your Dockerfile. No CUDA hell; APIPod picks compatible images. +6. **One-command packaging** — `apipod build` generates your Dockerfile. No CUDA hell; APIPod picks compatible images. ## Installation @@ -75,7 +75,7 @@ Run it and open `http://localhost:8000/docs` for the auto-generated Swagger UI. ```bash python main.py # or -apipod --start +apipod start ``` ## Smart File Handling @@ -135,36 +135,36 @@ Just say *how you want to run the service right now*. Plain FastAPI. The fastest iteration loop. ```bash -apipod --start +apipod start # or simply python main.py ``` ### Simulate a deployment -Before you ship, run your service exactly how it will behave in production — locally, with **no code changes**. `--simulate` takes an optional target string `{compute}-{provider}` (compute defaults to `serverless`). +Before you ship, run your service exactly how it will behave in production — locally, with **no code changes**. `apipod simulate` takes an optional target string `{compute}-{provider}` (compute defaults to `serverless`). ```bash -apipod --simulate # serverless emulation: FastAPI + local job queue -apipod --simulate serverless # same as above -apipod --simulate dedicated # plain FastAPI (dedicated compute) -apipod --simulate serverless-runpod # emulate Socaity routing requests to RunPod -apipod --simulate dedicated-azure # emulate a dedicated Azure deployment +apipod simulate # serverless emulation: FastAPI + local job queue +apipod simulate serverless # same as above +apipod simulate dedicated # plain FastAPI (dedicated compute) +apipod simulate serverless-runpod # emulate Socaity routing requests to RunPod +apipod simulate dedicated-azure # emulate a dedicated Azure deployment ``` If a provider has no serverless offering, APIPod warns and falls back to the job-queue emulation: ```bash -apipod --simulate serverless-azure +apipod simulate serverless-azure # Warning: azure does not support serverless. Defaulting to FastAPI + Local Job Queue. ``` -### Emulate a provider's native worker (`--direct`) +### Emulate a provider's native worker (`--native`) -By default Socaity is the orchestrator. `--direct` skips Socaity and runs the provider's **own** serverless backend locally — e.g. RunPod's serverless worker (requires the `runpod` package): +By default Socaity is the orchestrator. `--native` skips Socaity and runs the provider's **own** serverless backend locally — e.g. RunPod's serverless worker (requires the `runpod` package): ```bash -apipod --simulate serverless-runpod --direct +apipod simulate serverless-runpod --native ``` ### Configure from Python @@ -182,7 +182,7 @@ app = APIPod(simulate="serverless-runpod", direct=True) # RunPod native worker ### Build a container ```bash -apipod --build +apipod build ``` This scans your project, picks a compatible base image (CUDA/cuDNN, ffmpeg included) and generates a `Dockerfile`. For most users this is all you need; advanced users can edit or write their own Dockerfile. @@ -192,12 +192,12 @@ Requirements: Docker installed, plus a CUDA/cuDNN setup if your model needs the ### Deploy ```bash -apipod --deploy # coming soon -apipod --deploy serverless -apipod --deploy dedicated-azure +apipod deploy # coming soon +apipod deploy serverless +apipod deploy dedicated-azure ``` -The managed `--deploy` command is on the roadmap. Today, build your container and deploy it through the [Socaity dashboard](https://www.socaity.ai) — the simplest path, with auth, scaling and routing handled for you. +The managed `deploy` command is on the roadmap. Today, build your container and deploy it through the [Socaity dashboard](https://www.socaity.ai) — the simplest path, with auth, scaling and routing handled for you. ## Client SDK @@ -227,7 +227,7 @@ client.text_to_speech("what a time to be alive") ## Roadmap -- `apipod --deploy` managed deployment command. +- `apipod deploy` managed deployment command. - MCP protocol support. --- diff --git a/apipod/api.py b/apipod/api.py index 97f11a3..f35b5d4 100644 --- a/apipod/api.py +++ b/apipod/api.py @@ -3,7 +3,7 @@ from apipod.common.constants import COMPUTE, PROVIDER from apipod.common.settings import ( APIPOD_COMPUTE, - APIPOD_DIRECT, + APIPOD_NATIVE, APIPOD_PROVIDER, APIPOD_SIMULATE, IS_MANAGED_DEPLOYMENT, @@ -76,7 +76,7 @@ def _resolve_intent(simulate: Optional[str], direct: Optional[bool]) -> _Resolut if simulate is None and not APIPOD_SIMULATE: return SocaityFastAPIRouter, False, False - direct = APIPOD_DIRECT if direct is None else bool(direct) + direct = APIPOD_NATIVE if direct is None else bool(direct) compute, provider = _parse_target(target) if compute is COMPUTE.DEDICATED: diff --git a/apipod/cli.py b/apipod/cli.py index c614019..af8aa6e 100644 --- a/apipod/cli.py +++ b/apipod/cli.py @@ -22,13 +22,6 @@ def input_yes_no(question: str, default: bool = True) -> bool: sys.stdout.write("Please respond with 'yes' or 'no' (or 'y'/'n').\n") -def _parse_bool(value) -> Optional[bool]: - """Coerce a CLI flag value into a bool. ``None`` (flag absent) stays ``None``.""" - if value is None or isinstance(value, bool): - return value - return str(value).strip().lower() in ("1", "true", "yes", "y") - - def select_base_image(manager: DeploymentManager, config_data: dict) -> str: """Interactive base image selection process.""" recommended_image = manager.recommend_image(config_data) @@ -88,7 +81,7 @@ def perform_scan(): return config_data -def run_scan(): +def run_scan(_args=None): """Scan the project and generate apipod.json configuration file.""" manager = DeploymentManager() @@ -104,10 +97,8 @@ def run_build(args): """Run the build process for creating a deployment-ready container.""" manager = DeploymentManager() - target_file = None - if args.build is not None and args.build is not True: - target_file = args.build - + target_file = args.file + if target_file: target_path = Path(target_file) if not target_path.exists(): print(f"Error: Target file '{target_file}' does not exist.") @@ -154,6 +145,25 @@ def run_build(args): manager.build_docker_image(service_title) +def _looks_like_entrypoint(value: str) -> bool: + """Return True when a simulate positional arg is likely a Python entrypoint file.""" + return value.endswith(".py") or Path(value).is_file() + + +def _resolve_simulate_args(args) -> tuple[str, Optional[str]]: + """Split simulate positionals into deployment target and optional entrypoint.""" + if args.entrypoint is not None: + return args.target, args.entrypoint + + if args.target is None: + return "serverless", None + + if _looks_like_entrypoint(args.target): + return "serverless", args.target + + return args.target, None + + def _resolve_entrypoint(manager: DeploymentManager, entrypoint: Optional[str]) -> str: """Return the service entrypoint file, scanning the project when not provided.""" if entrypoint: @@ -188,14 +198,14 @@ def _load_app(entrypoint: str): raise RuntimeError(f"No APIPod app found in '{entrypoint}'. Expected an APIPod() instance.") -def _run_service(args, simulate: Optional[str], direct: Optional[bool]): +def _run_service(args, simulate: Optional[str], native: bool = False): """Resolve the entrypoint, apply the run intent via env vars, and start the app.""" # The user's service calls APIPod() with no args; it reads the intent from env. # Set the env BEFORE importing the entrypoint (which imports apipod settings). if simulate is not None: os.environ["APIPOD_SIMULATE"] = simulate - if direct is not None: - os.environ["APIPOD_DIRECT"] = "true" if direct else "false" + if native: + os.environ["APIPOD_NATIVE"] = "true" manager = DeploymentManager() entrypoint = _resolve_entrypoint(manager, args.entrypoint) @@ -204,113 +214,202 @@ def _run_service(args, simulate: Optional[str], direct: Optional[bool]): port = args.port or 8000 host = args.host or "0.0.0.0" - mode = "development" if simulate is None else f"simulation '{simulate}'{' --direct' if direct else ''}" + if simulate is None: + mode = "development" + else: + mode = f"simulation '{simulate}'{' --native' if native else ''}" print(f"Starting APIPod ({mode}) from {entrypoint}") app.start(port=port, host=host) def run_start(args): """Run the service locally for development (plain FastAPI).""" - _run_service(args, simulate=None, direct=None) + _run_service(args, simulate=None) def run_simulate(args): """Run the service locally while emulating a deployment target.""" - target = args.simulate or "serverless" # bare --simulate defaults to serverless - _run_service(args, simulate=target, direct=_parse_bool(args.direct)) + target, entrypoint = _resolve_simulate_args(args) + args.entrypoint = entrypoint + _run_service(args, simulate=target, native=args.native) def run_deploy(args): """Placeholder for the upcoming managed deployment command.""" - target = args.deploy or "serverless" + target = args.target or "serverless" print( - f"`apipod --deploy {target}` is not available yet.\n" + f"`apipod deploy {target}` is not available yet.\n" "Deploy through the Socaity dashboard for now: https://www.socaity.ai\n" - "Tip: validate the target locally first with `apipod --simulate " - f"{target}`." + f"Tip: validate the target locally first with `apipod simulate {target}`." ) -def main(): - """Main entry point for the APIPod CLI.""" +def run_help(args, parsers: dict): + """Print top-level or command-specific help.""" + if args.command: + parser = parsers.get(args.command) + if parser is None: + print(f"Unknown command: {args.command}\n") + parsers["__root__"].print_help() + sys.exit(1) + parser.print_help() + else: + parsers["__root__"].print_help() + + +def _add_run_options(parser: argparse.ArgumentParser) -> None: + """Shared host/port and entrypoint options for start and simulate.""" + parser.add_argument( + "entrypoint", + nargs="?", + default=None, + metavar="ENTRYPOINT", + help="Service entrypoint file (auto-detected from apipod.json when omitted).", + ) + parser.add_argument("--host", default=None, help="Host to bind to (default: 0.0.0.0).") + parser.add_argument("--port", type=int, default=None, help="Port to bind to (default: 8000).") + + +def _build_parser() -> tuple[argparse.ArgumentParser, dict]: + """Construct the CLI parser tree and return the root parser plus a lookup map.""" parser = argparse.ArgumentParser( description="APIPod CLI - build, simulate and deploy AI services", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Examples: - apipod --start Run locally for development (FastAPI) - apipod --simulate Emulate a serverless deployment (FastAPI + job queue) - apipod --simulate serverless-runpod Emulate Socaity managed deploy to RunPod - apipod --simulate serverless-runpod --direct Emulate RunPod's native worker directly - apipod --simulate dedicated-azure Emulate a dedicated Azure deployment - apipod --scan Scan project and generate apipod.json - apipod --build Build the deployment container - apipod --deploy Deploy via Socaity (coming soon) - """ + apipod help Show this overview + apipod start Run locally for development (FastAPI) + apipod start main.py Run a specific entrypoint + apipod simulate Emulate a serverless deployment (FastAPI + job queue) + apipod simulate serverless-runpod Emulate Socaity managed deploy to RunPod + apipod simulate serverless-runpod --native Emulate RunPod's native worker directly + apipod simulate dedicated-azure Emulate a dedicated Azure deployment + apipod scan Scan project and generate apipod.json + apipod build Build the deployment container + apipod build path/to/service.py Build from a specific Python file + apipod deploy Deploy via Socaity (coming soon) + """, ) + subparsers = parser.add_subparsers(dest="command", metavar="command") + parsers: dict = {"__root__": parser} - parser.add_argument( - "--start", - action="store_true", - help="Run the service locally for development (plain FastAPI)." + start_parser = subparsers.add_parser( + "start", + help="Run the service locally for development (plain FastAPI).", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog="Examples:\n apipod start\n apipod start main.py --port 8123", ) - parser.add_argument( - "--simulate", - nargs="?", - const="", - metavar="TARGET", - help="Emulate a deployment locally. Optional target '{compute}-{provider}' " - "(e.g. serverless-runpod, dedicated-azure). Defaults to 'serverless'." + _add_run_options(start_parser) + parsers["start"] = start_parser + + simulate_parser = subparsers.add_parser( + "simulate", + help="Emulate a deployment target locally.", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=( + "Examples:\n" + " apipod simulate\n" + " apipod simulate serverless-runpod\n" + " apipod simulate serverless-runpod main.py --native" + ), ) - parser.add_argument( - "--direct", + simulate_parser.add_argument( + "target", nargs="?", - const=True, default=None, - metavar="BOOL", - help="Emulate the provider's native serverless worker instead of Socaity's job queue." + metavar="TARGET", + help="Deployment target '{compute}-{provider}' (e.g. serverless-runpod, dedicated-azure). " + "Defaults to 'serverless'. A .py value is treated as the entrypoint.", ) - parser.add_argument( - "--deploy", + simulate_parser.add_argument( + "entrypoint", nargs="?", - const="", - metavar="TARGET", - help="Deploy the service via Socaity (coming soon)." + default=None, + metavar="ENTRYPOINT", + help="Service entrypoint file (auto-detected when omitted).", ) - parser.add_argument( - "--scan", + simulate_parser.add_argument( + "--native", action="store_true", - help="Scan project and generate apipod.json configuration file." + help="Emulate the provider's native serverless worker instead of Socaity's job queue.", ) - parser.add_argument( - "--build", + simulate_parser.add_argument("--host", default=None, help="Host to bind to (default: 0.0.0.0).") + simulate_parser.add_argument("--port", type=int, default=None, help="Port to bind to (default: 8000).") + parsers["simulate"] = simulate_parser + + scan_parser = subparsers.add_parser( + "scan", + help="Scan project and generate apipod.json configuration file.", + ) + parsers["scan"] = scan_parser + + build_parser = subparsers.add_parser( + "build", + help="Build the service container.", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog="Examples:\n apipod build\n apipod build path/to/service.py", + ) + build_parser.add_argument( + "file", nargs="?", - const=True, + default=None, metavar="FILE", - help="Build the service container. Optionally specify a target Python file." + help="Target Python file to scan (project-wide scan when omitted).", ) - parser.add_argument( - "--entrypoint", + parsers["build"] = build_parser + + deploy_parser = subparsers.add_parser( + "deploy", + help="Deploy the service via Socaity (coming soon).", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog="Examples:\n apipod deploy\n apipod deploy serverless-runpod", + ) + deploy_parser.add_argument( + "target", + nargs="?", + default="serverless", + metavar="TARGET", + help="Deployment target '{compute}-{provider}' (default: serverless).", + ) + parsers["deploy"] = deploy_parser + + help_parser = subparsers.add_parser( + "help", + help="Show help for apipod or a specific command.", + ) + help_parser.add_argument( + "command", + nargs="?", default=None, - help="Service entrypoint file for --start / --simulate (auto-detected if omitted)." + metavar="COMMAND", + help="Command to show help for (omit for the overview).", ) - parser.add_argument("--host", default=None, help="Host to bind to (default: 0.0.0.0).") - parser.add_argument("--port", type=int, default=None, help="Port to bind to (default: 8000).") + parsers["help"] = help_parser + + return parser, parsers + +def main(): + """Main entry point for the APIPod CLI.""" + parser, parsers = _build_parser() args = parser.parse_args() - if args.scan: - run_scan() - elif args.build is not None: + if args.command is None: + parser.print_help() + return + + if args.command == "scan": + run_scan(args) + elif args.command == "build": run_build(args) - elif args.deploy is not None: + elif args.command == "deploy": run_deploy(args) - elif args.simulate is not None: + elif args.command == "simulate": run_simulate(args) - elif args.start: + elif args.command == "start": run_start(args) - else: - parser.print_help() + elif args.command == "help": + run_help(args, parsers) if __name__ == "__main__": diff --git a/apipod/common/settings.py b/apipod/common/settings.py index ba23eeb..8aecf42 100644 --- a/apipod/common/settings.py +++ b/apipod/common/settings.py @@ -10,7 +10,7 @@ # Local simulation intent (ignored in managed deployments). Empty = development. # Target string is "{compute}-{provider}", e.g. "serverless-runpod". APIPOD_SIMULATE = environ.get("APIPOD_SIMULATE", "") -APIPOD_DIRECT = environ.get("APIPOD_DIRECT", "").strip().lower() in ("1", "true", "yes") +APIPOD_NATIVE = environ.get("APIPOD_NATIVE", "").strip().lower() in ("1", "true", "yes") APIPOD_HOST = environ.get("APIPOD_HOST", "0.0.0.0") APIPOD_PORT = int(environ.get("APIPOD_PORT", 8000)) diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index 8c392f7..8cefa98 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -211,7 +211,16 @@ def custom_openapi(self): if not self.app.openapi_schema: self._orig_openapi_func() - self.app.openapi_schema["info"]["apipod"] = self.version + compute = "dedicated" + if self.job_queue is not None: + compute = "serverless" + + manifest = { + "compute": compute, + "version": self.version, + } + + self.app.openapi_schema["info"]["apipod"] = manifest return self.app.openapi_schema def get_job(self, job_id: str, return_format: str = 'json') -> JobResult: diff --git a/apipod/engine/backend/runpod/router.py b/apipod/engine/backend/runpod/router.py index b9e0a73..953fc11 100644 --- a/apipod/engine/backend/runpod/router.py +++ b/apipod/engine/backend/runpod/router.py @@ -248,8 +248,13 @@ def start_runpod_serverless_localhost(self, port): rp_fastapi.RUN_DESCRIPTION = desc + "\n" + rp_fastapi.RUN_DESCRIPTION # hack to print version also in runpod - version = self.version - + # Add APIPod manifest like in the FastAPI router + manifest = { + "compute": "serverless", + "version": self.version, + "simulate": self.simulate, + } + class WorkerAPIWithModifiedInfo(rp_fastapi.WorkerAPI): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -259,7 +264,7 @@ def __init__(self, *args, **kwargs): def custom_openapi(self): if not self.rp_app.openapi_schema: self._orig_openapi_func() - self.rp_app.openapi_schema["info"]["apipod"] = version + self.rp_app.openapi_schema["info"]["apipod"] = manifest self.rp_app.openapi_schema["info"]["runpod"] = rp_fastapi.runpod_version return self.rp_app.openapi_schema @@ -403,8 +408,13 @@ def minimal_func(): description=self.summary, ) - # Add APIPod version information like the FastAPI router - schema["info"]["apipod"] = self.version + # Add APIPod manifest like in the FastAPI router + manifest = { + "compute": "serverless", + "version": self.version, + "simulate": self.simulate, + } + schema["info"]["apipod"] = manifest return schema diff --git a/docs/TECHNICAL_README.md b/docs/TECHNICAL_README.md index 2a9473f..bb601cf 100644 --- a/docs/TECHNICAL_README.md +++ b/docs/TECHNICAL_README.md @@ -51,14 +51,14 @@ apipod/ Three concepts describe *where and how* a service runs. Historically developers had to set all three; they no longer do. Understanding them still helps when reading the code. -- **Orchestrator** — *who routes and queues requests*. There is exactly one: **Socaity**. It is the implicit orchestrator that fronts the service, distributes jobs, and handles scaling/auth. It is no longer a flag. `--direct` is the one escape hatch: it *skips* Socaity to talk to a provider's native backend instead (e.g. RunPod's own serverless worker). +- **Orchestrator** — *who routes and queues requests*. There is exactly one: **Socaity**. It is the implicit orchestrator that fronts the service, distributes jobs, and handles scaling/auth. It is no longer a flag. `--native` is the one escape hatch: it *skips* Socaity to talk to a provider's native backend instead (e.g. RunPod's own serverless worker). - **Compute** (`COMPUTE`) — *the shape of the machine*: `serverless` (scale-to-zero, job-queue semantics) or `dedicated` (an always-on box, plain request/response). - **Provider** (`PROVIDER`) — *the cloud the compute lives on*: `runpod`, `azure`, `scaleway`, `localhost`, … Not every provider supports every compute (e.g. Azure has no serverless; APIPod warns and falls back to the job-queue emulation). A developer never assembles this matrix by hand. They express a single **intent**: -- **Development** (`APIPod()` / `apipod --start`) — plain FastAPI, the fastest loop. -- **Simulation** (`APIPod(simulate="{compute}-{provider}")` / `apipod --simulate ...`) — emulate a deployment **locally**, no code changes. The target string collapses compute + provider (`serverless`, `serverless-runpod`, `dedicated-azure`); compute defaults to `serverless`. `direct=True` emulates the provider's native worker instead of the Socaity queue. +- **Development** (`APIPod()` / `apipod start`) — plain FastAPI, the fastest loop. +- **Simulation** (`APIPod(simulate="{compute}-{provider}")` / `apipod simulate ...`) — emulate a deployment **locally**, no code changes. The target string collapses compute + provider (`serverless`, `serverless-runpod`, `dedicated-azure`); compute defaults to `serverless`. `direct=True` emulates the provider's native worker instead of the Socaity queue. - **Managed deployment** — when the service runs on the platform, Socaity sets `SOCAITY_DEPLOYMENT_CERT` (SHA1 of a shared secret). When that cert verifies (`IS_MANAGED_DEPLOYMENT`), `simulate`/`direct` are ignored and the **real** backend is selected from the `APIPOD_COMPUTE` / `APIPOD_PROVIDER` env vars Socaity injects — so the serverless-RunPod path runs the *real* worker, not the emulator. ## Backend resolution @@ -66,7 +66,7 @@ A developer never assembles this matrix by hand. They express a single **intent* `APIPod()` in `api.py` is not a class — it is a factory. It resolves the intent (managed → `_resolve_managed`, otherwise → `_resolve_intent`) into a `(backend_class, use_job_queue, runpod_simulate)` triple and returns one of: - **`SocaityFastAPIRouter`** — an `APIRouter` subclass bound to a `FastAPI` app. Used for development and dedicated compute (no queue), and for the serverless emulation (paired with an in-memory `JobQueue` + `LocalStreamStore` and a background worker thread started via the app lifespan). -- **`SocaityRunpodRouter`** — a path-based dispatcher for RunPod serverless. There is no HTTP layer: RunPod delivers a JSON job whose `input.path` selects the registered function; the router converts files, injects `JobProgress`, executes, and returns a serialized `JobResult` (or a generator for streaming). It can also synthesize an OpenAPI schema by replaying the FastAPI signature conversion, so fastSDK clients can be generated against serverless deployments too. Its `simulate` flag chooses between RunPod's local API emulator (`apipod --simulate serverless-runpod --direct`) and the real worker (managed deployment). +- **`SocaityRunpodRouter`** — a path-based dispatcher for RunPod serverless. There is no HTTP layer: RunPod delivers a JSON job whose `input.path` selects the registered function; the router converts files, injects `JobProgress`, executes, and returns a serialized `JobResult` (or a generator for streaming). It can also synthesize an OpenAPI schema by replaying the FastAPI signature conversion, so fastSDK clients can be generated against serverless deployments too. Its `simulate` flag chooses between RunPod's local API emulator (`apipod simulate serverless-runpod --native`) and the real worker (managed deployment). ## The endpoint pipeline (FastAPI backend) @@ -138,7 +138,7 @@ The **stream store** is the pluggable backend that buffers a job's chunks betwee ### Deployment -`apipod --build` (see `deploy/`) scans the project (entrypoint, dependencies, CUDA requirements) and generates a Dockerfile from compatible templates. The resulting container runs unchanged on dedicated hosts, on socaity.ai, or on RunPod serverless — only the env vars differ: Socaity injects `SOCAITY_DEPLOYMENT_CERT` plus `APIPOD_COMPUTE` / `APIPOD_PROVIDER` to select the real backend, while locally you drive the same paths with `APIPOD_SIMULATE` / `APIPOD_DIRECT` (set for you by `apipod --simulate`). +`apipod build` (see `deploy/`) scans the project (entrypoint, dependencies, CUDA requirements) and generates a Dockerfile from compatible templates. The resulting container runs unchanged on dedicated hosts, on socaity.ai, or on RunPod serverless — only the env vars differ: Socaity injects `SOCAITY_DEPLOYMENT_CERT` plus `APIPOD_COMPUTE` / `APIPOD_PROVIDER` to select the real backend, while locally you drive the same paths with `APIPOD_SIMULATE` / `APIPOD_NATIVE` (set for you by `apipod simulate`). ## Request lifecycle, end to end @@ -163,7 +163,7 @@ test/ └── test_execution.py # fastSDK end-to-end (subprocess) + SSE streaming (in-process) ``` -Run `pytest`. Two primitives keep tests DRY: `build_service(register, **config)` yields a `TestClient` for an app built from a `register(app)` callback under any `APIPod(**config)` intent; `live_service(simulate=...)` boots a service as a real subprocess through `apipod --start` / `--simulate` and yields its URL. Backends are parametrized from `FASTAPI_CONFIGS`, so a single test asserts behaviour across development, serverless, dedicated and runpod. +Run `pytest`. Two primitives keep tests DRY: `build_service(register, **config)` yields a `TestClient` for an app built from a `register(app)` callback under any `APIPod(**config)` intent; `live_service(simulate=...)` boots a service as a real subprocess through `apipod start` / `simulate` and yields its URL. Backends are parametrized from `FASTAPI_CONFIGS`, so a single test asserts behaviour across development, serverless, dedicated and runpod. The fastSDK end-to-end tests skip automatically when the installed fastsdk lacks the `connect` API (e.g. a local in-progress build); CI installs one that has it. Pytest config (`pythonpath` in `pyproject.toml`) resolves `import apipod` to the in-repo source and the `conftest`/`services` helpers by name, so no `sys.path` shims are needed and each file is also runnable directly from an IDE via its `__main__` block. diff --git a/test/conftest.py b/test/conftest.py index 74b5f7c..0a6666b 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -11,7 +11,7 @@ registers endpoints and hand back a wired FastAPI ``TestClient`` (in-process, no socket). Used by the config / openapi / core / schema tests. - ``live_service(simulate=...)`` — boot the example service in a subprocess via - the real ``apipod`` CLI (the same ``--start`` / ``--simulate`` a user runs), + the real ``apipod`` CLI (the same ``start`` / ``simulate`` a user runs), yield its base URL, and shut it down afterwards. Used by the fastSDK end-to-end execution tests. @@ -120,13 +120,13 @@ def live_service(simulate: str = "serverless", entrypoint: Path = INFERENCE_SERV """ Boot ``entrypoint`` in a subprocess through the real apipod CLI and yield its URL. - ``simulate=None`` runs ``apipod --start`` (development); otherwise it runs - ``apipod --simulate `` exactly as a user would on the command line. + ``simulate=None`` runs ``apipod start`` (development); otherwise it runs + ``apipod simulate `` exactly as a user would on the command line. """ port = port or _free_port() cmd = [sys.executable, "-m", "apipod.cli"] - cmd += ["--start"] if simulate is None else ["--simulate", simulate] - cmd += ["--entrypoint", str(entrypoint), "--host", "127.0.0.1", "--port", str(port)] + cmd += ["start"] if simulate is None else ["simulate", simulate] + cmd += [str(entrypoint), "--host", "127.0.0.1", "--port", str(port)] proc = subprocess.Popen(cmd, cwd=str(REPO_ROOT)) url = f"http://127.0.0.1:{port}" diff --git a/test/services/core_service.py b/test/services/core_service.py index 5272462..e710778 100644 --- a/test/services/core_service.py +++ b/test/services/core_service.py @@ -5,7 +5,7 @@ (used by fastSDK tests), broad media+model endpoint, JobProgress lifecycle, single file upload. -The module-level ``app`` makes this file a valid ``apipod --start`` entrypoint, +The module-level ``app`` makes this file a valid ``apipod start`` entrypoint, so fastSDK end-to-end tests can boot it as a subprocess via ``conftest.live_service``. APIPod normalizes ``_`` to ``-`` in routes, so e.g. ``/mixed_media`` is served @@ -93,7 +93,7 @@ def single_file_upload(job_progress: JobProgress, file1: ImageFile): return file1.to_base64() -# Runnable entrypoint: booted by ``apipod --start`` / ``--simulate`` in +# Runnable entrypoint: booted by ``apipod start`` / ``simulate`` in # fastSDK end-to-end tests via ``conftest.live_service``. app = APIPod() # run intent injected via env by the CLI register(app) diff --git a/test/test_cli.py b/test/test_cli.py index 9294903..217d27f 100644 --- a/test/test_cli.py +++ b/test/test_cli.py @@ -59,7 +59,7 @@ def test_build_generates_dockerfile(project, monkeypatch): # Never actually invoke Docker. monkeypatch.setattr(DeploymentManager, "build_docker_image", lambda self, title: True) - cli.run_build(argparse.Namespace(build=True)) + cli.run_build(argparse.Namespace(file=None)) dockerfile = project / "apipod-deploy" / "Dockerfile" assert dockerfile.exists() @@ -76,7 +76,7 @@ def fake_uvicorn_run(app, host=None, port=None, **kwargs): monkeypatch.setattr("uvicorn.run", fake_uvicorn_run) args = argparse.Namespace( - simulate="serverless", direct=None, entrypoint="main.py", host="127.0.0.1", port=8123 + target="serverless", entrypoint="main.py", native=False, host="127.0.0.1", port=8123 ) cli.run_simulate(args) diff --git a/test/test_config.py b/test/test_config.py index eafac83..11f9512 100644 --- a/test/test_config.py +++ b/test/test_config.py @@ -61,7 +61,7 @@ def test_openapi_loads_for_fastapi_backends(config): schema = client.get("/openapi.json").json() assert schema["openapi"].startswith("3.") assert {"/echo", "/add"} <= set(schema["paths"]) - assert "apipod" in schema["info"] # APIPod stamps its version in + assert "apipod" in schema["info"] def test_openapi_for_runpod_direct(): @@ -73,6 +73,9 @@ def test_openapi_for_runpod_direct(): assert schema["openapi"].startswith("3.") assert {"/echo", "/add"} <= set(schema["paths"]) assert "apipod" in schema["info"] + assert schema["info"]["apipod"]["compute"] == "serverless" + assert schema["info"]["apipod"]["version"] + assert schema["info"]["apipod"]["simulate"] is True if __name__ == "__main__": From 20560da6fe3cba06e4d07067cdb02040189b9c1d Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Wed, 24 Jun 2026 16:33:58 +0200 Subject: [PATCH 21/38] empty returns or incomplete returns of schema endpoints now get correctly wrapped. Added a debug file for local test debugging especially when working together with fastsdk. --- README.md | 4 +-- apipod/common/schemas/schemas.py | 15 ++++++++- apipod/engine/backend/fastapi/router.py | 5 ++- apipod/engine/backend/schema_resolve.py | 36 ++++++++++++++++++-- docs/TECHNICAL_README.md | 2 +- test/debug_test_services.py | 44 +++++++++++++++++++++++++ test/services/schema_service.py | 16 ++++----- 7 files changed, 106 insertions(+), 16 deletions(-) create mode 100644 test/debug_test_services.py diff --git a/README.md b/README.md index ad22417..e2406e4 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

    Build, Deploy, and publish AI Services with Ease

    - + APIPod Logo

    @@ -232,5 +232,5 @@ client.text_to_speech("what a time to be alive") ---

    - Made with ❤️ by SocAIty + Made with ❤️ by SocAIty

    diff --git a/apipod/common/schemas/schemas.py b/apipod/common/schemas/schemas.py index bd9704d..506d385 100644 --- a/apipod/common/schemas/schemas.py +++ b/apipod/common/schemas/schemas.py @@ -13,7 +13,7 @@ exactly one model, so forcing clients to repeat its name adds nothing. """ -from typing import Any, List, Literal, Optional, Union +from typing import Any, Dict, List, Literal, Optional, Union from pydantic import BaseModel, Field from .media_files import FileModel, ImageFileModel, AudioFileModel, VideoFileModel, ThreeDFileModel @@ -36,6 +36,11 @@ class APIPodSchemaBase(BaseModel): AudioFileModel, ...) which accept uploads, FileModel JSON objects, URLs and base64 strings. At runtime the file-handling layer replaces them with parsed media-toolkit objects before the endpoint function runs. + + Serialization omits optional fields that are ``None`` so wire JSON matches + OpenAI-style responses (no ``"model": null`` or ``"usage": null`` keys). + Pass ``exclude_none=False`` to :meth:`model_dump` / :meth:`model_dump_json` + when you need explicit nulls. """ model_config = { @@ -45,6 +50,14 @@ class APIPodSchemaBase(BaseModel): "arbitrary_types_allowed": True } + def model_dump(self, **kwargs: Any) -> Dict[str, Any]: + kwargs.setdefault("exclude_none", True) + return super().model_dump(**kwargs) + + def model_dump_json(self, **kwargs: Any) -> str: + kwargs.setdefault("exclude_none", True) + return super().model_dump_json(**kwargs) + # ===================================================== # Chat Completions - Input schemas diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index 8cefa98..ba5b69b 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -405,12 +405,15 @@ def decorator(func: Callable) -> Callable: def _create_standard_endpoint_decorator(self, plan: EndpointExecutionPlan): """Create a decorator for standard and schema endpoints (direct execution).""" + route_kwargs = dict(plan.route_kwargs) + if plan.is_schema_endpoint: + route_kwargs["response_model_exclude_none"] = True fastapi_route_decorator = self.api_route( path=plan.path, methods=plan.active_methods, response_model=plan.schema_binding.response_model if plan.is_schema_endpoint else None, *plan.route_args, - **plan.route_kwargs + **route_kwargs ) def decorator(func: Callable) -> Callable: diff --git a/apipod/engine/backend/schema_resolve.py b/apipod/engine/backend/schema_resolve.py index 3ec988c..ff1f5dd 100644 --- a/apipod/engine/backend/schema_resolve.py +++ b/apipod/engine/backend/schema_resolve.py @@ -187,26 +187,56 @@ def wrap_schema_response(result: Any, binding: SchemaBinding) -> Any: return response_model.model_validate(payload) +# Empty values for required JSON-schema property types (`created` is filled by the envelope). +_SCHEMA_EMPTY = {"string": "", "array": [], "integer": 0, "object": {}} + + +def _schema_defaults(model: Type[BaseModel]) -> dict: + """Required-field empties from pydantic's JSON schema.""" + schema = model.model_json_schema() + properties = schema.get("properties") or {} + # Only top-level required fields; nested item shapes are validated by pydantic later. + return { + name: _SCHEMA_EMPTY[prop["type"]] + for name in schema.get("required") or [] + if name != "created" and (prop := properties.get(name)) and prop.get("type") in _SCHEMA_EMPTY + } + + def _normalize_response_model(result: Any, response_model: Type) -> dict: """ Normalize raw endpoint results into a dictionary matching the response model. Handles convenient raw shapes for chat, completion, embedding and transcription. """ + # None → empty text or dict; dict gaps are filled from schema defaults below. + if result is None: + result = "" if response_model in (ChatCompletionResponse, CompletionResponse, TranscriptionResponse) else {} + + # Shorthand raw returns authors may use instead of a full response dict. if response_model is ChatCompletionResponse and isinstance(result, str): result = {"choices": [{"index": 0, "message": {"content": result}, "finish_reason": "stop"}]} elif response_model is CompletionResponse and isinstance(result, str): result = {"choices": [{"text": result, "index": 0, "finish_reason": "stop"}]} elif response_model is EmbeddingResponse and isinstance(result, list): - vectors = result if result and isinstance(result[0], (list, tuple)) else [result] - result = {"data": [{"embedding": list(vector), "index": i} for i, vector in enumerate(vectors)]} + if not result: + result = {"data": []} + elif isinstance(result[0], (list, tuple)): + result = {"data": [{"embedding": list(vector), "index": i} for i, vector in enumerate(result)]} + else: + result = {"data": [{"embedding": list(result), "index": 0}]} elif response_model is TranscriptionResponse and isinstance(result, str): result = {"text": result} - return _normalize_result(result, response_model) + payload = _normalize_result(result, response_model) + if not isinstance(payload, dict): + return payload + # Defaults first, then author payload; drop None so defaults apply. + return {**_schema_defaults(response_model), **{k: v for k, v in payload.items() if v is not None}} def _normalize_result(result: Any, response_model: Type) -> dict: """Bring raw results into dict form; media files are lifted into the `data` list.""" + # Single file or file list → standard media envelope shape. if isinstance(result, MediaFile): return {"data": [result]} if isinstance(result, (list, tuple)) and result and all(isinstance(item, MediaFile) for item in result): diff --git a/docs/TECHNICAL_README.md b/docs/TECHNICAL_README.md index bb601cf..3968a54 100644 --- a/docs/TECHNICAL_README.md +++ b/docs/TECHNICAL_README.md @@ -98,7 +98,7 @@ On the way out, `JobResultFactory._serialize_result` converts returned `MediaFil **Nested media files**: request schemas may declare `FileModel`-typed fields (`ImageGenerationRequest.image`, `TranscriptionRequest.audio`, …). Pydantic accepts uploads, FileModel JSON objects, URLs and plain base64 strings for those fields; before the endpoint function runs, `parse_schema_media_fields` (in `engine/files/base_file_mixin.py`) replaces them with parsed media-toolkit objects — the endpoint receives a ready-to-use `ImageFile`/`AudioFile`, exactly like method-level `def endpoint(image: ImageFile)` parameters. -**Response wrapping** (`wrap_schema_response`): if the function already returns the response model, it passes through. Schema helpers also accept convenient raw results (a plain string for chat/completion/transcription, raw vectors for embeddings). Everything else shares one generic path: a uniform envelope (`created`, `model`) merged with the result dict and validated by pydantic — a returned media-toolkit file is lifted into the `data` list automatically. Response IDs are not generated by APIPod schemas; IDs belong to the platform `JobResult`/socaity.ai layer. +**Response wrapping** (`wrap_schema_response`): if the function already returns the response model, it passes through. Schema helpers also accept convenient raw results (a plain string for chat/completion/transcription, raw vectors for embeddings). A bare ``None`` or dict with ``None`` fields is coerced to the same empty shorthand (empty text or required-field defaults from the response model's pydantic JSON schema) before validation. Everything else shares one generic path: a uniform envelope (`created`, `model`) merged with the result dict and validated by pydantic — a returned media-toolkit file is lifted into the `data` list automatically. Response IDs are not generated by APIPod schemas; IDs belong to the platform `JobResult`/socaity.ai layer. ### Jobs, queue and lifecycle diff --git a/test/debug_test_services.py b/test/debug_test_services.py new file mode 100644 index 0000000..485b819 --- /dev/null +++ b/test/debug_test_services.py @@ -0,0 +1,44 @@ +"""Launch test services locally for fastSDK development. Not a pytest module. + +Run or debug this file from VS Code. Uncomment one ``launch_*`` call in ``main``. +Each call blocks on uvicorn until you stop the debugger. +""" + +import sys +from pathlib import Path + +# Allow ``from services import ...`` when run/debugged as a script. +sys.path.insert(0, str(Path(__file__).parent)) + +from apipod import APIPod +from services import core_service, schema_service, streaming_service + +HOST = "127.0.0.1" +#SIMULATE = "serverless" +SIMULATE = None + +def launch_core(port: int = 8000, host: str = HOST, simulate: str = SIMULATE) -> None: + app = APIPod(simulate=simulate) + core_service.register(app) + app.start(host=host, port=port) + + +def launch_schemas(port: int = 8000, host: str = HOST, simulate: str = SIMULATE) -> None: + app = APIPod(simulate=simulate) + schema_service.register_all(app) + schema_service.register_extended(app) + schema_service.register_mapping(app) + app.start(host=host, port=port) + + +def launch_streaming(port: int = 8000, host: str = HOST, simulate: str = SIMULATE) -> None: + app = APIPod(simulate=simulate) + streaming_service.register(app) + app.start(host=host, port=port) + + +if __name__ == "__main__": + + # launch_core() + launch_schemas() + # launch_streaming() diff --git a/test/services/schema_service.py b/test/services/schema_service.py index 55e376e..7722792 100644 --- a/test/services/schema_service.py +++ b/test/services/schema_service.py @@ -22,7 +22,6 @@ def tag_path(request_model: Type) -> str: def _schema_endpoint(request_model: Type, return_value: Any, name: str): """Build an endpoint whose only parameter is annotated with ``request_model``.""" - def endpoint(request): return return_value @@ -59,7 +58,7 @@ class SchemaCase: CASES = [ SchemaCase( schemas.ChatCompletionRequest, schemas.ChatCompletionResponse, - {"messages": [{"role": "user", "content": "hi"}]}, + payload={"messages": [{"role": "user", "content": "hi"}]}, raw="hello there", typed=schemas.ChatCompletionResponse( created=0, @@ -69,7 +68,7 @@ class SchemaCase: ), SchemaCase( schemas.CompletionRequest, schemas.CompletionResponse, - {"prompt": "hi"}, + payload={"prompt": "hi"}, raw="completed", typed=schemas.CompletionResponse( created=0, @@ -78,28 +77,28 @@ class SchemaCase: ), SchemaCase( schemas.EmbeddingRequest, schemas.EmbeddingResponse, - {"input": "hi"}, + payload={"input": "hi"}, raw=[0.1, 0.2, 0.3], typed=schemas.EmbeddingResponse(data=[schemas.EmbeddingData(embedding=[0.1, 0.2, 0.3], index=0)]), ), SchemaCase( schemas.ImageGenerationRequest, schemas.ImageGenerationResponse, - {"prompt": "a cat"}, raw={"data": []}, + payload={"prompt": "a cat"}, raw={"data": []}, typed=schemas.ImageGenerationResponse(created=0, data=[]), ), SchemaCase( schemas.VideoGenerationRequest, schemas.VideoGenerationResponse, - {"prompt": "a cat"}, raw={"data": []}, + payload={"prompt": "a cat"}, raw={"data": []}, typed=schemas.VideoGenerationResponse(created=0, data=[]), ), SchemaCase( schemas.SpeechRequest, schemas.SpeechResponse, - {"input": "hello"}, raw={"data": []}, + payload={"input": "hello"}, raw={"data": []}, typed=schemas.SpeechResponse(created=0, data=[]), ), SchemaCase( schemas.Generation3DRequest, schemas.Generation3DResponse, - {"prompt": "a chair"}, raw={"data": []}, + payload={"prompt": "a chair"}, raw={"data": []}, typed=schemas.Generation3DResponse(created=0, data=[]), ), SchemaCase( @@ -115,3 +114,4 @@ def register_mapping(app): tag = SCHEMA_REGISTRY[case.request_model].tag.replace("_", "-") app.endpoint(f"/{tag}-raw")(_schema_endpoint(case.request_model, case.raw, f"{tag}_raw")) app.endpoint(f"/{tag}-typed")(_schema_endpoint(case.request_model, case.typed, f"{tag}_typed")) + app.endpoint(f"/{tag}-none")(_schema_endpoint(case.request_model, None, f"{tag}_none")) From 22e48240398fd7dc76af9cd2f028e989c49845fa Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Fri, 26 Jun 2026 11:43:26 +0200 Subject: [PATCH 22/38] removed leaked apipodgate code. Introduced a cache for the endpoint execution plan. Only return the stream url if the endpoint supports streaming --- apipod/api.py | 9 +- apipod/engine/backend/fastapi/router.py | 112 +++++------------- apipod/engine/backend/runpod/router.py | 4 +- apipod/engine/endpoint_config.py | 2 +- apipod/engine/jobs/job_result.py | 4 +- apipod/engine/signatures/analysis.py | 2 +- docs/TECHNICAL_README.md | 2 +- test/conftest.py | 6 +- test/debug_test_services.py | 15 ++- .../{hermine_clone.wav => test_audio.wav} | Bin ...y_logo_for_white_bg.png => test_image.png} | Bin ...o_ultra_short_short.mp4 => test_video.mp4} | Bin test/services/schema_service.py | 69 +++++++++-- 13 files changed, 112 insertions(+), 113 deletions(-) rename test/files/{hermine_clone.wav => test_audio.wav} (100%) rename test/files/{socaity_logo_for_white_bg.png => test_image.png} (100%) rename test/files/{test_video_ultra_short_short.mp4 => test_video.mp4} (100%) diff --git a/apipod/api.py b/apipod/api.py index f35b5d4..287f7d2 100644 --- a/apipod/api.py +++ b/apipod/api.py @@ -10,6 +10,8 @@ ) from apipod.engine.backend.fastapi.router import SocaityFastAPIRouter from apipod.engine.backend.runpod.router import SocaityRunpodRouter +from apipod.engine.streaming.local_stream_store import LocalStreamStore + # (backend_class, use_job_queue, runpod_simulate) _Resolution = Tuple[type, bool, bool] @@ -63,7 +65,8 @@ def APIPod( job_queue = JobQueue() if use_job_queue and "stream_store" not in kwargs: - kwargs["stream_store"] = _create_stream_store() + + kwargs["stream_store"] = LocalStreamStore() return SocaityFastAPIRouter(job_queue=job_queue, *args, **kwargs) @@ -127,7 +130,3 @@ def _parse_target(target: str) -> Tuple[COMPUTE, Optional[PROVIDER]]: except ValueError: raise ValueError(f"Invalid provider '{provider_str}'. Choose from: {[p.value for p in PROVIDER]}") - -def _create_stream_store(): - from apipod.engine.streaming.local_stream_store import LocalStreamStore - return LocalStreamStore() diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index ba5b69b..f6b447a 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -38,7 +38,6 @@ def __init__( prefix: str = "", # "/api", max_upload_file_size_mb: float = None, job_queue=None, - lifespan=None, *args, **kwargs): """ @@ -51,20 +50,16 @@ def __init__( prefix: The API route prefix max_upload_file_size_mb: Maximum file size in MB for uploads job_queue: Optional custom JobQueue implementation - lifespan: Optional async context manager for custom startup/shutdown logic args: Additional arguments kwargs: May include ``stream_store`` (SSE backend for GET /stream/{job_id}), plus additional keyword arguments for parent classes. """ - # Extract user-provided lifespan (explicit param or kwarg) before parent init - user_lifespan = lifespan or kwargs.pop('lifespan', None) stream_store = kwargs.pop("stream_store", None) # Initialize parent classes api_router_params = inspect.signature(APIRouter.__init__).parameters api_router_kwargs = {k: kwargs.get(k) for k in api_router_params if k in kwargs} - api_router_kwargs.pop('lifespan', None) # handled via composed lifespan below - + APIRouter.__init__(self, **api_router_kwargs) _BaseBackend.__init__(self, title=title, summary=summary, *args, **kwargs) _QueueMixin.__init__(self, job_queue=job_queue, *args, **kwargs) @@ -72,27 +67,20 @@ def __init__( self.status = SERVER_HEALTH.INITIALIZING - # Registry for functions that workers can execute. Keys are function names. - self._job_func_registry: dict = {} + # Queued endpoint plans keyed by worker ``__name__`` (see ``_create_task_endpoint_decorator``). + self._endpoint_plans: dict[str, EndpointExecutionPlan] = {} # Stop event and thread handle for in-process worker (dev mode) self._worker_stop_event = threading.Event() self._worker_thread: threading.Thread | None = None self._logger = logging.getLogger(__name__) - # Build a composed lifespan that merges internal worker hooks with the user-provided lifespan - combined_lifespan = self._build_lifespan(user_lifespan) - # Create or use provided FastAPI app if app is None: app = FastAPI( title=self.title, summary=self.summary, contact={"name": "SocAIty", "url": "https://www.socaity.ai"}, - lifespan=combined_lifespan, ) - else: - # Existing app: replace its lifespan with our composed version - app.router.lifespan_context = combined_lifespan self.app: FastAPI = app self.prefix = prefix @@ -116,67 +104,6 @@ def __init__( # Save original OpenAPI function and replace it self._orig_openapi_func = self.app.openapi self.app.openapi = self.custom_openapi - - # ------------------------------------------------------------------ - # Lifespan & worker lifecycle - # ------------------------------------------------------------------ - - def _build_lifespan(self, user_lifespan=None): - """ - Build a composed lifespan context manager that runs: - 1. Internal worker startup - 2. User-provided lifespan (if any) - 3. Internal worker shutdown on exit - """ - router_self = self # capture for closure - - @asynccontextmanager - async def _combined_lifespan(app): - router_self._start_background_worker() - try: - if user_lifespan: - async with user_lifespan(app): - yield - else: - yield - finally: - router_self._stop_background_worker() - - return _combined_lifespan - - def _start_background_worker(self): - """Start the in-process job queue worker in a daemon thread (dev convenience).""" - try: - if self.job_queue and hasattr(self.job_queue, "start_worker"): - def _run(): - try: - self.job_queue.start_worker( - func_registry=self._job_func_registry, - worker_name="api-worker", - stop_event=self._worker_stop_event, - ) - except Exception: - self._logger.exception("Worker thread exited with exception") - - thread = threading.Thread(target=_run, daemon=True) - thread.start() - self._worker_thread = thread - except Exception: - self._logger.exception("Failed to start in-process worker on startup") - - def _stop_background_worker(self): - """Signal the background worker to stop and shut down the job queue.""" - try: - self._worker_stop_event.set() - except Exception: - pass - - if self.job_queue and hasattr(self.job_queue, "shutdown"): - try: - self.job_queue.shutdown() - except Exception: - self._logger.exception("Error shutting down job queue") - # ------------------------------------------------------------------ # Standard routes # ------------------------------------------------------------------ @@ -240,10 +167,15 @@ def get_job(self, job_id: str, return_format: str = 'json') -> JobResult: if self.job_queue is None: return JobResultFactory.job_not_found(job_id) - ret_job = self.job_queue.get_job_result(job_id) - if ret_job is None: + job = self.job_queue.get_job(job_id) + if job is None: return JobResultFactory.job_not_found(job_id) + ret_job = JobResultFactory.from_base_job( + job, + include_stream_link=self._include_stream_link_for(job.job_function), + ) + if return_format != 'json': ret_job = JobResultFactory.gzip_job_result(ret_job) @@ -268,6 +200,23 @@ def post_cancel_job(self, job_id: str) -> dict: ) from None return {"id": job_id, "status": "cancelled", "message": "Job cancelled."} + def add_job(self, func: Callable, job_params: dict) -> JobResult: + """Enqueue a task and return a :class:`JobResult` with endpoint-aware links.""" + if self.job_queue is None: + raise ValueError("Job Queue is not initialized. Cannot add job.") + job = self.job_queue._add_job(job_function=func, job_params=job_params) + + # check if the job result will include the stream option + include_stream_link = False + if self.stream_store is not None: + plan = self._endpoint_plans.get(f"{func.__module__}.{func.__qualname__}") + include_stream_link = plan is not None and plan.is_streaming + + return JobResultFactory.from_base_job( + job, + include_stream_link=include_stream_link, + ) + def endpoint(self, path: str, methods: list[str] | None = None, max_upload_file_size_mb: int = None, queue_size: int = 500, use_queue: bool = None, *args, **kwargs): """ Unified endpoint decorator. @@ -298,6 +247,8 @@ def decorator(func: Callable) -> Callable: route_args=args, route_kwargs=kwargs, ) + # save the plan for later use + self._endpoint_plans[f"{func.__module__}.{func.__qualname__}"] = plan # Streaming with a queue + stream store mimics a real deployment: # the job is queued, the worker produces chunks into the stream store @@ -392,11 +343,6 @@ def decorator(func: Callable) -> Callable: func = self._modify_result_decorator(func, plan, queued=True) # Add job queue functionality and prepare for FastAPI file handling queue_decorated = queue_decorator(func) - # Register the function so workers can execute it (dev mode). - try: - self._job_func_registry[func.__name__] = func - except Exception: - pass upload_enabled = self._prepare_func_for_media_file_upload_with_fastapi(queue_decorated, plan.max_upload_file_size_mb) return fastapi_route_decorator(upload_enabled) diff --git a/apipod/engine/backend/runpod/router.py b/apipod/engine/backend/runpod/router.py index 953fc11..c88323d 100644 --- a/apipod/engine/backend/runpod/router.py +++ b/apipod/engine/backend/runpod/router.py @@ -220,11 +220,11 @@ def handler(self, job): del inputs["path"] result = self._router(route, job, **inputs) - + # If it's a generator, return it directly for RunPod to stream if inspect.isgenerator(result): return result - + # Otherwise return the JSON result return result diff --git a/apipod/engine/endpoint_config.py b/apipod/engine/endpoint_config.py index 1eca91c..740b689 100644 --- a/apipod/engine/endpoint_config.py +++ b/apipod/engine/endpoint_config.py @@ -3,7 +3,7 @@ """ from dataclasses import dataclass, field -from typing import Any, Callable, Optional +from typing import Any, Callable from apipod.engine.backend.schema_resolve import SchemaBinding, get_schema_binding from apipod.engine.signatures.analysis import is_streaming_endpoint diff --git a/apipod/engine/jobs/job_result.py b/apipod/engine/jobs/job_result.py index 1c8d76d..0e08e32 100644 --- a/apipod/engine/jobs/job_result.py +++ b/apipod/engine/jobs/job_result.py @@ -93,7 +93,7 @@ def _serialize_result(data: Any) -> Union[FileModel, List[FileModel], list, str, return data @staticmethod - def from_base_job(job: BaseJob) -> JobResult: + def from_base_job(job: BaseJob, *, include_stream_link: bool = False) -> JobResult: """Map a :class:`BaseJob` to the public :class:`JobResult`.""" m = job.metrics metrics = JobMetrics( @@ -115,7 +115,7 @@ def from_base_job(job: BaseJob) -> JobResult: links=JobLinks( status=f"/status/{job.id}", cancel=f"/cancel/{job.id}", - stream=f"/stream/{job.id}", + stream=f"/stream/{job.id}" if include_stream_link else None, ), ) diff --git a/apipod/engine/signatures/analysis.py b/apipod/engine/signatures/analysis.py index 7f41d91..6409a47 100644 --- a/apipod/engine/signatures/analysis.py +++ b/apipod/engine/signatures/analysis.py @@ -4,7 +4,7 @@ import inspect from collections.abc import AsyncIterator, Iterator -from typing import Any, Callable, get_origin, get_type_hints +from typing import Callable, get_origin, get_type_hints def is_streaming_endpoint(func: Callable) -> bool: diff --git a/docs/TECHNICAL_README.md b/docs/TECHNICAL_README.md index 3968a54..b86ee1e 100644 --- a/docs/TECHNICAL_README.md +++ b/docs/TECHNICAL_README.md @@ -65,7 +65,7 @@ A developer never assembles this matrix by hand. They express a single **intent* `APIPod()` in `api.py` is not a class — it is a factory. It resolves the intent (managed → `_resolve_managed`, otherwise → `_resolve_intent`) into a `(backend_class, use_job_queue, runpod_simulate)` triple and returns one of: -- **`SocaityFastAPIRouter`** — an `APIRouter` subclass bound to a `FastAPI` app. Used for development and dedicated compute (no queue), and for the serverless emulation (paired with an in-memory `JobQueue` + `LocalStreamStore` and a background worker thread started via the app lifespan). +- **`SocaityFastAPIRouter`** — an `APIRouter` subclass bound to a `FastAPI` app. Used for development and dedicated compute (no queue), and for the serverless emulation (paired with an in-memory `JobQueue` + `LocalStreamStore` and a background worker thread). - **`SocaityRunpodRouter`** — a path-based dispatcher for RunPod serverless. There is no HTTP layer: RunPod delivers a JSON job whose `input.path` selects the registered function; the router converts files, injects `JobProgress`, executes, and returns a serialized `JobResult` (or a generator for streaming). It can also synthesize an OpenAPI schema by replaying the FastAPI signature conversion, so fastSDK clients can be generated against serverless deployments too. Its `simulate` flag chooses between RunPod's local API emulator (`apipod simulate serverless-runpod --native`) and the real worker (managed deployment). ## The endpoint pipeline (FastAPI backend) diff --git a/test/conftest.py b/test/conftest.py index 0a6666b..9aebd4d 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -39,9 +39,9 @@ # Test asset files (used by the media upload/download tests) # --------------------------------------------------------------------------- # FILES_DIR = Path(__file__).parent / "files" -IMAGE_FILE = FILES_DIR / "socaity_logo_for_white_bg.png" -AUDIO_FILE = FILES_DIR / "hermine_clone.wav" -VIDEO_FILE = FILES_DIR / "test_video_ultra_short_short.mp4" +IMAGE_FILE = FILES_DIR / "test_image.png" +AUDIO_FILE = FILES_DIR / "test_audio.wav" +VIDEO_FILE = FILES_DIR / "test_video.mp4" # Entrypoint booted by the fastSDK end-to-end execution tests. INFERENCE_SERVICE = Path(__file__).parent / "services" / "core_service.py" diff --git a/test/debug_test_services.py b/test/debug_test_services.py index 485b819..1d254c6 100644 --- a/test/debug_test_services.py +++ b/test/debug_test_services.py @@ -17,6 +17,7 @@ #SIMULATE = "serverless" SIMULATE = None + def launch_core(port: int = 8000, host: str = HOST, simulate: str = SIMULATE) -> None: app = APIPod(simulate=simulate) core_service.register(app) @@ -37,8 +38,18 @@ def launch_streaming(port: int = 8000, host: str = HOST, simulate: str = SIMULAT app.start(host=host, port=port) +def launch_all(port: int = 8000, host: str = HOST, simulate: str = SIMULATE) -> None: + app = APIPod(simulate=simulate) + core_service.register(app) + schema_service.register_all(app) + schema_service.register_extended(app) + schema_service.register_mapping(app) + streaming_service.register(app) + app.start(host=host, port=port) + + if __name__ == "__main__": - # launch_core() - launch_schemas() + # launch_schemas() # launch_streaming() + launch_all() diff --git a/test/files/hermine_clone.wav b/test/files/test_audio.wav similarity index 100% rename from test/files/hermine_clone.wav rename to test/files/test_audio.wav diff --git a/test/files/socaity_logo_for_white_bg.png b/test/files/test_image.png similarity index 100% rename from test/files/socaity_logo_for_white_bg.png rename to test/files/test_image.png diff --git a/test/files/test_video_ultra_short_short.mp4 b/test/files/test_video.mp4 similarity index 100% rename from test/files/test_video_ultra_short_short.mp4 rename to test/files/test_video.mp4 diff --git a/test/services/schema_service.py b/test/services/schema_service.py index 7722792..7243dcb 100644 --- a/test/services/schema_service.py +++ b/test/services/schema_service.py @@ -9,20 +9,46 @@ """ from dataclasses import dataclass -from typing import Any, Type +from pathlib import Path +from typing import Any, Callable, Type + +from media_toolkit import AudioFile, ImageFile, VideoFile, media_from_any from apipod.common import schemas from apipod.engine.backend.schema_resolve import SCHEMA_REGISTRY +_FILES_DIR = Path(__file__).resolve().parent.parent / "files" + def tag_path(request_model: Type) -> str: """Public route path for a schema (APIPod normalizes ``_`` to ``-``).""" return "/" + SCHEMA_REGISTRY[request_model].tag.replace("_", "-") -def _schema_endpoint(request_model: Type, return_value: Any, name: str): - """Build an endpoint whose only parameter is annotated with ``request_model``.""" +def _load_test_media(file_name: str, media_type: Type): + """Read a fixture from ``test/files`` into a media-toolkit object.""" + return media_from_any(str(_FILES_DIR / file_name), type_hint=media_type) + + +def _schema_endpoint( + request_model: Type, + return_value: Any, + name: str, + *, + media_loader: Callable[[], Any] | None = None, + typed_response: Type | None = None, +): + """Build an endpoint whose only parameter is annotated with ``request_model``. + + When ``media_loader`` is set, the return value is produced at request time + (raw media file, or a typed response model built from that file). + """ def endpoint(request): + if media_loader is not None: + media = media_loader() + if typed_response is not None: + return typed_response(created=0, data=[media]) + return media return return_value endpoint.__name__ = name @@ -51,8 +77,10 @@ class SchemaCase: request_model: Type response_model: Type payload: dict - raw: Any # raw value the endpoint may return - typed: Any # the response_model instance the endpoint may return + raw: Any = None + typed: Any = None + media_file: str | None = None + media_type: Type | None = None CASES = [ @@ -83,18 +111,21 @@ class SchemaCase: ), SchemaCase( schemas.ImageGenerationRequest, schemas.ImageGenerationResponse, - payload={"prompt": "a cat"}, raw={"data": []}, - typed=schemas.ImageGenerationResponse(created=0, data=[]), + payload={"prompt": "a cat"}, + media_file="test_image.png", + media_type=ImageFile, ), SchemaCase( schemas.VideoGenerationRequest, schemas.VideoGenerationResponse, - payload={"prompt": "a cat"}, raw={"data": []}, - typed=schemas.VideoGenerationResponse(created=0, data=[]), + payload={"prompt": "a cat"}, + media_file="test_video.mp4", + media_type=VideoFile, ), SchemaCase( schemas.SpeechRequest, schemas.SpeechResponse, - payload={"input": "hello"}, raw={"data": []}, - typed=schemas.SpeechResponse(created=0, data=[]), + payload={"input": "hello"}, + media_file="test_audio.wav", + media_type=AudioFile, ), SchemaCase( schemas.Generation3DRequest, schemas.Generation3DResponse, @@ -112,6 +143,18 @@ class SchemaCase: def register_mapping(app): for case in CASES: tag = SCHEMA_REGISTRY[case.request_model].tag.replace("_", "-") - app.endpoint(f"/{tag}-raw")(_schema_endpoint(case.request_model, case.raw, f"{tag}_raw")) - app.endpoint(f"/{tag}-typed")(_schema_endpoint(case.request_model, case.typed, f"{tag}_typed")) + if case.media_file is not None: + loader = lambda f=case.media_file, t=case.media_type: _load_test_media(f, t) + app.endpoint(f"/{tag}-raw")( + _schema_endpoint(case.request_model, None, f"{tag}_raw", media_loader=loader) + ) + app.endpoint(f"/{tag}-typed")( + _schema_endpoint( + case.request_model, None, f"{tag}_typed", + media_loader=loader, typed_response=case.response_model, + ) + ) + else: + app.endpoint(f"/{tag}-raw")(_schema_endpoint(case.request_model, case.raw, f"{tag}_raw")) + app.endpoint(f"/{tag}-typed")(_schema_endpoint(case.request_model, case.typed, f"{tag}_typed")) app.endpoint(f"/{tag}-none")(_schema_endpoint(case.request_model, None, f"{tag}_none")) From d2ede99cf1015ac852ee2fb729b7ec2fb0f29714 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Fri, 26 Jun 2026 16:17:42 +0200 Subject: [PATCH 23/38] detect if an endpoint is able to stream. If he is not then remove the stream attribute from the pydantic model --- .../backend/fastapi/file_handling_mixin.py | 42 +++++++++++-- apipod/engine/backend/fastapi/router.py | 17 +++++- .../engine/backend/fastapi/streaming_mixin.py | 2 +- apipod/engine/backend/runpod/router.py | 22 +++++-- apipod/engine/backend/schema_resolve.py | 59 ++++++++++++++++++- apipod/engine/endpoint_config.py | 2 +- apipod/engine/signatures/analysis.py | 22 +++++-- apipod/engine/signatures/policies.py | 18 +++++- docs/TECHNICAL_README.md | 2 +- test/test_schemas.py | 40 +++++++++++++ 10 files changed, 201 insertions(+), 25 deletions(-) diff --git a/apipod/engine/backend/fastapi/file_handling_mixin.py b/apipod/engine/backend/fastapi/file_handling_mixin.py index 4913d98..dc1cc56 100644 --- a/apipod/engine/backend/fastapi/file_handling_mixin.py +++ b/apipod/engine/backend/fastapi/file_handling_mixin.py @@ -8,6 +8,8 @@ from apipod.engine.files.base_file_mixin import _BaseFileHandlingMixin from apipod.engine.utils import replace_func_signature from apipod.engine.signatures.analysis import job_progress_param_names +from apipod.engine.endpoint_config import EndpointExecutionPlan +from apipod.engine.backend.schema_resolve import openapi_schema_annotation, resolve_request_model from apipod.engine.jobs.job_progress import JobProgress from media_toolkit import MediaList, MediaDict, ImageFile, AudioFile, VideoFile, MediaFile import functools @@ -224,13 +226,42 @@ def _update_signature(self, func: Callable, max_upload_file_size_mb: float = Non func = replace_func_signature(func, inspect.Signature(parameters=body_params)) return func - def _prepare_func_for_media_file_upload_with_fastapi(self, func: callable, max_upload_file_size_mb: float = None) -> callable: + def _apply_openapi_request_model(self, func: Callable, plan: EndpointExecutionPlan | None) -> Callable: + """Swap schema param annotations when ``stream`` must be hidden from OpenAPI.""" + if plan is None or plan.schema_binding is None or plan.is_streaming: + return func + + sig = inspect.signature(func) + new_params = [] + changed = False + for param in sig.parameters.values(): + if resolve_request_model(param.annotation) is None: + new_params.append(param) + continue + new_annotation = openapi_schema_annotation(param.annotation, is_streaming=plan.is_streaming) + if new_annotation is param.annotation: + new_params.append(param) + else: + new_params.append(param.replace(annotation=new_annotation)) + changed = True + + if not changed: + return func + return replace_func_signature(func, sig.replace(parameters=new_params)) + + def _prepare_func_for_media_file_upload_with_fastapi( + self, + func: callable, + max_upload_file_size_mb: float = None, + plan: EndpointExecutionPlan | None = None, + ) -> callable: """ Prepare a function for FastAPI 1. Adds file upload logic to convert parameters 2. Injects a dummy JobProgress if the function expects it but we're not using a queue 3. Removes job progress parameter from the function signature (for OpenAPI docs) - 4. Replaces upload file parameters with FastAPI File type + 4. Strips ``stream`` from schema request models when the endpoint is not streaming + 5. Replaces upload file parameters with FastAPI File type """ # 1. Add file upload conversion logic (must be first to handle positional args) file_upload_modified = self._handle_file_uploads(func) @@ -241,8 +272,11 @@ def _prepare_func_for_media_file_upload_with_fastapi(self, func: callable, max_u # 3. Remove job progress parameter from signature (so it doesn't show in OpenAPI) no_job_progress = self._remove_job_progress_from_signature(with_dummy_progress) - # 4. Update signature with file upload parameters (converts to Form/File) - with_file_upload_signature = self._update_signature(no_job_progress, max_upload_file_size_mb) + # 4. Drop ``stream`` from schema body models when the plan says the endpoint is not streaming + openapi_adjusted = self._apply_openapi_request_model(no_job_progress, plan) + + # 5. Update signature with file upload parameters (converts to Form/File) + with_file_upload_signature = self._update_signature(openapi_adjusted, max_upload_file_size_mb) return with_file_upload_signature diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index f6b447a..021a43c 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -181,6 +181,13 @@ def get_job(self, job_id: str, return_format: str = 'json') -> JobResult: return ret_job + def _include_stream_link_for(self, job_function: Callable) -> bool: + """True when the endpoint plan marks the job function as streaming.""" + if self.stream_store is None: + return False + plan = self._endpoint_plans.get(f"{job_function.__module__}.{job_function.__qualname__}") + return plan is not None and plan.is_streaming + def post_cancel_job(self, job_id: str) -> dict: """Cancel a background job (gateway / orchestrator integration).""" job_id = job_id.strip().strip('"').strip("'").strip("?").strip("#") @@ -254,7 +261,7 @@ def decorator(func: Callable) -> Callable: # the job is queued, the worker produces chunks into the stream store # and the client consumes them from GET /stream/{job_id}. Without a # queue (plain FastAPI) streaming goes straight to the client. - if plan.is_streaming and not plan.should_use_queue: + if plan.is_streaming and plan.schema_binding is None and not plan.should_use_queue: return self._create_streaming_endpoint_decorator(plan)(func) if plan.should_use_queue: return self._create_task_endpoint_decorator(plan)(func) @@ -344,7 +351,9 @@ def decorator(func: Callable) -> Callable: # Add job queue functionality and prepare for FastAPI file handling queue_decorated = queue_decorator(func) - upload_enabled = self._prepare_func_for_media_file_upload_with_fastapi(queue_decorated, plan.max_upload_file_size_mb) + upload_enabled = self._prepare_func_for_media_file_upload_with_fastapi( + queue_decorated, plan.max_upload_file_size_mb, plan=plan, + ) return fastapi_route_decorator(upload_enabled) return decorator @@ -364,7 +373,9 @@ def _create_standard_endpoint_decorator(self, plan: EndpointExecutionPlan): def decorator(func: Callable) -> Callable: result_modified = self._modify_result_decorator(func, plan, queued=False) - with_file_upload_signature = self._prepare_func_for_media_file_upload_with_fastapi(result_modified, plan.max_upload_file_size_mb) + with_file_upload_signature = self._prepare_func_for_media_file_upload_with_fastapi( + result_modified, plan.max_upload_file_size_mb, plan=plan, + ) return fastapi_route_decorator(with_file_upload_signature) return decorator diff --git a/apipod/engine/backend/fastapi/streaming_mixin.py b/apipod/engine/backend/fastapi/streaming_mixin.py index a4e3f13..20e3b79 100644 --- a/apipod/engine/backend/fastapi/streaming_mixin.py +++ b/apipod/engine/backend/fastapi/streaming_mixin.py @@ -108,7 +108,7 @@ async def streaming_wrapper(*w_args, **w_kwargs): return StreamingResponse(generator, media_type="text/event-stream", headers=headers) with_upload = self._prepare_func_for_media_file_upload_with_fastapi( - streaming_wrapper, plan.max_upload_file_size_mb + streaming_wrapper, plan.max_upload_file_size_mb, plan=plan, ) return fastapi_route_decorator(with_upload) diff --git a/apipod/engine/backend/runpod/router.py b/apipod/engine/backend/runpod/router.py index c88323d..f4caf49 100644 --- a/apipod/engine/backend/runpod/router.py +++ b/apipod/engine/backend/runpod/router.py @@ -39,6 +39,8 @@ def __init__(self, title: str = "APIPod for ", summary: str = None, simulate: bo # serverless worker (set by APIPod(simulate="serverless-runpod", direct=True)). self.simulate = simulate self.routes = {} # routes are organized like {"ROUTE_NAME": "ROUTE_FUNCTION"} + self._endpoint_plans: dict[str, EndpointExecutionPlan] = {} + self._endpoint_source_funcs: dict[str, Callable] = {} self.add_standard_routes() @@ -50,6 +52,8 @@ def endpoint(self, path: str = None, use_queue: bool = None, *args, **kwargs): def decorator(func: Callable) -> Callable: plan = build_plan(func, path=path) + self._endpoint_plans[path] = plan + self._endpoint_source_funcs[path] = func route = self._build_route(func, plan) self.routes[path] = route return route @@ -272,16 +276,20 @@ def custom_openapi(self): runpod.serverless.start({"handler": self.handler, "return_aggregate_stream": True}) - def _create_openapi_compatible_function(self, func: Callable) -> Callable: + def _create_openapi_compatible_function( + self, + func: Callable, + plan: EndpointExecutionPlan | None = None, + ) -> Callable: """ - Create a function compatible with FastAPI OpenAPI generation by applying + Create a function compatible with FastAPI OpenAPI generation by applying the same conversion logic as the FastAPI mixin, but without runtime dependencies. This generates the rich schema with proper file upload handling. Args: func: Original function to convert - max_upload_file_size_mb: Maximum file size in MB + plan: Endpoint execution plan (controls ``stream`` in request schema) Returns: Function with FastAPI-compatible signature for OpenAPI generation @@ -294,7 +302,9 @@ def _create_openapi_compatible_function(self, func: Callable) -> Callable: # Create a temporary instance of the FastAPI mixin to use its conversion methods temp_mixin = _fast_api_file_handling_mixin(max_upload_file_size_mb=5) # Apply the same preparation logic as FastAPI router - with_file_upload_signature = temp_mixin._prepare_func_for_media_file_upload_with_fastapi(func, 5) + with_file_upload_signature = temp_mixin._prepare_func_for_media_file_upload_with_fastapi( + func, 5, plan=plan, + ) # 4. Set proper return type for job-based endpoints sig = inspect.signature(with_file_upload_signature) @@ -366,9 +376,11 @@ def get_openapi_schema(self): fastapi_routes = [] for path, func in self.routes.items(): + source_func = self._endpoint_source_funcs.get(path, func) + plan = self._endpoint_plans.get(path) # Create FastAPI-compatible function for rich OpenAPI generation try: - compatible_func = self._create_openapi_compatible_function(func) + compatible_func = self._create_openapi_compatible_function(source_func, plan) fastapi_routes.append(APIRoute( path=f"/{path.strip('/')}", endpoint=compatible_func, diff --git a/apipod/engine/backend/schema_resolve.py b/apipod/engine/backend/schema_resolve.py index ff1f5dd..e786626 100644 --- a/apipod/engine/backend/schema_resolve.py +++ b/apipod/engine/backend/schema_resolve.py @@ -26,7 +26,7 @@ from types import UnionType from typing import Any, Callable, Iterable, Iterator, Optional, Type, Union, get_args, get_origin -from pydantic import BaseModel +from pydantic import BaseModel, create_model from media_toolkit import MediaFile from apipod.common.schemas import * @@ -83,6 +83,63 @@ def _registry_spec(request_model: Type) -> Optional[SchemaEndpointSpec]: return None +_OPENAPI_WITHOUT_STREAM_CACHE: dict[type, type] = {} +_OPENAPI_DOC_TO_SOURCE: dict[type, type] = {} + + +def source_request_model(model: type[BaseModel]) -> type[BaseModel]: + """Return the author-facing schema for an OpenAPI doc model, or *model* itself.""" + return _OPENAPI_DOC_TO_SOURCE.get(model, model) + + +def openapi_request_model(model: type[BaseModel], *, is_streaming: bool) -> type[BaseModel]: + """Return *model*, or a cached copy with ``stream`` removed for OpenAPI / validation. + + When ``is_streaming`` is false and the model declares a ``stream`` field, a + sibling model is built via :func:`pydantic.create_model` so non-streaming + endpoints do not advertise or accept ``stream`` in the request body. + """ + if is_streaming or "stream" not in model.model_fields: + return model + if model in _OPENAPI_WITHOUT_STREAM_CACHE: + return _OPENAPI_WITHOUT_STREAM_CACHE[model] + + fields = { + name: (field.annotation, field) + for name, field in model.model_fields.items() + if name != "stream" + } + doc_model = create_model( + f"{model.__name__}OpenAPI", + __config__=model.model_config, + **fields, + ) + _OPENAPI_WITHOUT_STREAM_CACHE[model] = doc_model + _OPENAPI_DOC_TO_SOURCE[doc_model] = model + return doc_model + + +def openapi_schema_annotation(annotation: Any, *, is_streaming: bool) -> Any: + """Apply :func:`openapi_request_model` to a parameter annotation (incl. Optional).""" + resolved = resolve_request_model(annotation) + if resolved is None: + return annotation + + doc_model = openapi_request_model(resolved, is_streaming=is_streaming) + if doc_model is resolved: + return annotation + + origin = get_origin(annotation) + if origin in (Union, UnionType): + args = get_args(annotation) + new_args = tuple( + doc_model if resolve_request_model(arg) is not None else arg + for arg in args + ) + return origin[new_args] + return doc_model + + def resolve_request_model(annotation: Any) -> Optional[Type]: """ Resolve an annotation to a registered request schema (or a subclass of one). diff --git a/apipod/engine/endpoint_config.py b/apipod/engine/endpoint_config.py index 740b689..5a9691c 100644 --- a/apipod/engine/endpoint_config.py +++ b/apipod/engine/endpoint_config.py @@ -65,5 +65,5 @@ def build_plan( route_args=route_args, route_kwargs=route_kwargs if route_kwargs is not None else {}, schema_binding=schema_binding, - is_streaming=schema_binding is None and is_streaming_endpoint(func) + is_streaming=is_streaming_endpoint(func), ) diff --git a/apipod/engine/signatures/analysis.py b/apipod/engine/signatures/analysis.py index 6409a47..13a937e 100644 --- a/apipod/engine/signatures/analysis.py +++ b/apipod/engine/signatures/analysis.py @@ -4,7 +4,19 @@ import inspect from collections.abc import AsyncIterator, Iterator -from typing import Callable, get_origin, get_type_hints +from types import UnionType +from typing import Callable, Union, get_args, get_origin, get_type_hints + + +def _return_type_includes_iterator(return_type) -> bool: + """True when *return_type* is or contains ``Iterator`` / ``AsyncIterator``.""" + if return_type is None: + return False + origin = get_origin(return_type) + if origin in (Union, UnionType): + return any(_return_type_includes_iterator(arg) for arg in get_args(return_type)) + resolved = origin or return_type + return inspect.isclass(resolved) and issubclass(resolved, (Iterator, AsyncIterator)) def is_streaming_endpoint(func: Callable) -> bool: @@ -12,7 +24,8 @@ def is_streaming_endpoint(func: Callable) -> bool: A generator function (``yield``) or async generator function (``async yield``) is always considered streaming. A regular function whose return annotation - is ``Iterator[...]`` / ``AsyncIterator[...]`` or any subclass is also detected. + is ``Iterator[...]`` / ``AsyncIterator[...]`` (including inside a ``Union``) + is also detected. """ target = inspect.unwrap(func) if inspect.isgeneratorfunction(target) or inspect.isasyncgenfunction(target): @@ -21,10 +34,7 @@ def is_streaming_endpoint(func: Callable) -> bool: return_type = get_type_hints(target).get("return") except Exception: return False - if return_type is None: - return False - origin = get_origin(return_type) or return_type - return inspect.isclass(origin) and issubclass(origin, (Iterator, AsyncIterator)) + return _return_type_includes_iterator(return_type) def is_injected_progress_param(param: inspect.Parameter) -> bool: diff --git a/apipod/engine/signatures/policies.py b/apipod/engine/signatures/policies.py index cc255df..af0982e 100644 --- a/apipod/engine/signatures/policies.py +++ b/apipod/engine/signatures/policies.py @@ -1,9 +1,13 @@ import inspect -from typing import Any +from typing import Any, get_args, get_origin from fastapi import Body, Form -from apipod.engine.backend.schema_resolve import SCHEMA_REGISTRY, resolve_request_model +from apipod.engine.backend.schema_resolve import ( + SCHEMA_REGISTRY, + resolve_request_model, + source_request_model, +) # Request schemas that are interpreted as JSON bodies by router decorators, # even when endpoint authors do not specify Body(...). Derived from the @@ -35,7 +39,15 @@ def is_supported_request_schema(annotation: Any) -> bool: True if annotation is (or contains, for Optional/Union annotations) a registered APIPod request schema or a subclass of one. """ - return resolve_request_model(annotation) is not None + if resolve_request_model(annotation) is not None: + return True + origin = get_origin(annotation) + if origin is not None: + return any( + FastAPISignaturePolicies.is_supported_request_schema(arg) + for arg in get_args(annotation) + ) + return inspect.isclass(annotation) and source_request_model(annotation) is not annotation @classmethod def build_non_file_default(cls, annotation: Any, default: Any, is_optional: bool): diff --git a/docs/TECHNICAL_README.md b/docs/TECHNICAL_README.md index b86ee1e..0383da7 100644 --- a/docs/TECHNICAL_README.md +++ b/docs/TECHNICAL_README.md @@ -119,7 +119,7 @@ Standard routes registered automatically: `GET /status/{job_id}`, `POST /cancel/ Three streaming paths exist today: 1. **Generator endpoints** — any endpoint function that is a (async) generator, or whose return annotation declares an iterator, is served as an SSE `StreamingResponse` (FastAPI) or as a native generator handed back to RunPod (`return_aggregate_stream`). Detection is annotation/inspect-based — no source-code heuristics. -2. **Schema endpoints with `stream=true`** — the request schema carries the `stream` flag (chat, completion, transcription, speech, video generation). Streaming bypasses the queue; what gets streamed depends on what the function returns: +2. **Schema endpoints with `stream=true`** — the request schema carries the `stream` flag (chat, completion, transcription, speech, video generation). OpenAPI lists that field only when the endpoint handler is classified as streaming by `is_streaming_endpoint` (generator function, async generator, or return annotation containing `Iterator` / `AsyncIterator`). Non-streaming handlers get a runtime-derived request model with `stream` removed via `create_model`, so clients cannot send `stream: true` to endpoints that ignore it. Streaming bypasses the queue; what gets streamed depends on what the function returns: - a **generator of raw tokens**: for tags with a registered chunk model (`STREAM_CHUNK_SPECS`, currently `chat`), `SchemaStreamSerializer` wraps each token into the standardized chunk model (`ChatCompletionChunk`) as an SSE event — APIPod generates the stable chunk `id`, the `created` timestamp and the `object` discriminator, then closes with a final delta and the `[DONE]` sentinel. The endpoint only yields text. Other token-delta tags without a chunk model stream their tokens as-is (SSE), and non-SSE tags stream raw bytes; - an **`AudioFile`/`VideoFile`**: its encoded bytes are chunked into a `StreamingResponse` with the file's media content type — raw audio chunks, not SSE, matching OpenAI's `stream_format="audio"` behavior; - anything else: the regular wrapped JSON response (the endpoint cannot stream). diff --git a/test/test_schemas.py b/test/test_schemas.py index 0676c60..88d54a7 100644 --- a/test/test_schemas.py +++ b/test/test_schemas.py @@ -20,6 +20,7 @@ from conftest import build_service from services import schema_service from services.schema_service import CASES +from services import streaming_service def _response_ref(spec: dict, path: str) -> str: @@ -33,6 +34,22 @@ def _response_ref(spec: dict, path: str) -> str: return "" +def _request_schema_ref(spec: dict, path: str) -> str: + """Return the $ref of the JSON request body schema for a POST endpoint.""" + try: + return spec["paths"][path]["post"]["requestBody"]["content"]["application/json"]["schema"]["$ref"] + except KeyError: + return "" + + +def _schema_has_property(spec: dict, schema_ref: str, prop: str) -> bool: + if not schema_ref.startswith("#/components/schemas/"): + return False + name = schema_ref.rsplit("/", 1)[-1] + properties = spec.get("components", {}).get("schemas", {}).get(name, {}).get("properties", {}) + return prop in properties + + # --------------------------------------------------------------------------- # # 1. Auto-assignment: response model comes from the registry, not the author # --------------------------------------------------------------------------- # @@ -52,6 +69,29 @@ def test_response_model_auto_assigned_from_registry(): ) +def test_stream_request_field_on_streaming_schema_endpoint(): + """A schema endpoint detected as streaming keeps ``stream`` in its OpenAPI body.""" + with build_service(streaming_service.register, simulate="serverless") as client: + spec = client.get("/openapi.json").json() + chat_ref = _request_schema_ref(spec, "/chat") + assert _schema_has_property(spec, chat_ref, "stream") + + +def test_stream_request_field_hidden_on_non_streaming_schema_endpoints(): + """Non-streaming schema endpoints omit ``stream`` from OpenAPI even when the model defines it.""" + with build_service(schema_service.register_all) as client: + spec = client.get("/openapi.json").json() + for request_model in SCHEMA_REGISTRY: + if "stream" not in request_model.model_fields: + continue + path = schema_service.tag_path(request_model) + ref = _request_schema_ref(spec, path) + assert ref, f"missing OpenAPI request schema for {path}" + assert not _schema_has_property(spec, ref, "stream"), ( + f"{path} should not expose stream (handler is not streaming)" + ) + + # --------------------------------------------------------------------------- # # 2. Schema extension # --------------------------------------------------------------------------- # From 2c19ea8011500d6256724567e1f17bc04c5b7071 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Fri, 26 Jun 2026 16:57:12 +0200 Subject: [PATCH 24/38] added ast inspection for a more reliable is streaming detection also for generator expressions --- .../backend/fastapi/file_handling_mixin.py | 4 +- apipod/engine/backend/schema_resolve.py | 30 ++++--- apipod/engine/endpoint_config.py | 2 +- apipod/engine/signatures/analysis.py | 79 +++++++++++++++++-- docs/TECHNICAL_README.md | 2 +- test/debug_test_services.py | 30 +++++-- test/test_schemas.py | 10 +++ test/test_signatures.py | 29 +++++++ 8 files changed, 158 insertions(+), 28 deletions(-) create mode 100644 test/test_signatures.py diff --git a/apipod/engine/backend/fastapi/file_handling_mixin.py b/apipod/engine/backend/fastapi/file_handling_mixin.py index dc1cc56..658d897 100644 --- a/apipod/engine/backend/fastapi/file_handling_mixin.py +++ b/apipod/engine/backend/fastapi/file_handling_mixin.py @@ -260,7 +260,7 @@ def _prepare_func_for_media_file_upload_with_fastapi( 1. Adds file upload logic to convert parameters 2. Injects a dummy JobProgress if the function expects it but we're not using a queue 3. Removes job progress parameter from the function signature (for OpenAPI docs) - 4. Strips ``stream`` from schema request models when the endpoint is not streaming + 4. Hides ``stream`` in OpenAPI (not validation) when the endpoint is not streaming 5. Replaces upload file parameters with FastAPI File type """ # 1. Add file upload conversion logic (must be first to handle positional args) @@ -272,7 +272,7 @@ def _prepare_func_for_media_file_upload_with_fastapi( # 3. Remove job progress parameter from signature (so it doesn't show in OpenAPI) no_job_progress = self._remove_job_progress_from_signature(with_dummy_progress) - # 4. Drop ``stream`` from schema body models when the plan says the endpoint is not streaming + # 4. Hide ``stream`` in OpenAPI for non-streaming schema endpoints (validation keeps the field) openapi_adjusted = self._apply_openapi_request_model(no_job_progress, plan) # 5. Update signature with file upload parameters (converts to Form/File) diff --git a/apipod/engine/backend/schema_resolve.py b/apipod/engine/backend/schema_resolve.py index e786626..b131d39 100644 --- a/apipod/engine/backend/schema_resolve.py +++ b/apipod/engine/backend/schema_resolve.py @@ -26,7 +26,8 @@ from types import UnionType from typing import Any, Callable, Iterable, Iterator, Optional, Type, Union, get_args, get_origin -from pydantic import BaseModel, create_model +from pydantic import BaseModel, Field, create_model +from pydantic.json_schema import SkipJsonSchema from media_toolkit import MediaFile from apipod.common.schemas import * @@ -93,22 +94,29 @@ def source_request_model(model: type[BaseModel]) -> type[BaseModel]: def openapi_request_model(model: type[BaseModel], *, is_streaming: bool) -> type[BaseModel]: - """Return *model*, or a cached copy with ``stream`` removed for OpenAPI / validation. + """Return *model*, or a cached OpenAPI variant that hides ``stream`` when not streaming. - When ``is_streaming`` is false and the model declares a ``stream`` field, a - sibling model is built via :func:`pydantic.create_model` so non-streaming - endpoints do not advertise or accept ``stream`` in the request body. + When ``is_streaming`` is false and the model declares a ``stream`` field, a sibling + model is built via :func:`pydantic.create_model` with ``SkipJsonSchema`` on ``stream``. + The field stays in validation (OpenAI clients may send ``stream: false``) but is + omitted from the generated OpenAPI/JSON schema. """ if is_streaming or "stream" not in model.model_fields: return model if model in _OPENAPI_WITHOUT_STREAM_CACHE: return _OPENAPI_WITHOUT_STREAM_CACHE[model] - fields = { - name: (field.annotation, field) - for name, field in model.model_fields.items() - if name != "stream" - } + stream_field = model.model_fields["stream"] + fields = {} + for name, field in model.model_fields.items(): + if name == "stream": + fields[name] = ( + SkipJsonSchema[bool], + Field(default=False, description=stream_field.description), + ) + else: + fields[name] = (field.annotation, field) + doc_model = create_model( f"{model.__name__}OpenAPI", __config__=model.model_config, @@ -213,7 +221,7 @@ def prepare_schema_call(binding: SchemaBinding, call_kwargs: dict): f"Request body for parameter '{binding.param_name}' " f"({binding.request_model.__name__}) is missing" ) - + # Prepare the request object if isinstance(payload, binding.request_model): request = payload diff --git a/apipod/engine/endpoint_config.py b/apipod/engine/endpoint_config.py index 5a9691c..71fd96b 100644 --- a/apipod/engine/endpoint_config.py +++ b/apipod/engine/endpoint_config.py @@ -65,5 +65,5 @@ def build_plan( route_args=route_args, route_kwargs=route_kwargs if route_kwargs is not None else {}, schema_binding=schema_binding, - is_streaming=is_streaming_endpoint(func), + is_streaming=is_streaming_endpoint(func, schema_binding), ) diff --git a/apipod/engine/signatures/analysis.py b/apipod/engine/signatures/analysis.py index 13a937e..8421556 100644 --- a/apipod/engine/signatures/analysis.py +++ b/apipod/engine/signatures/analysis.py @@ -2,7 +2,9 @@ Backend-neutral analysis of function signatures and return types. """ +import ast import inspect +import textwrap from collections.abc import AsyncIterator, Iterator from types import UnionType from typing import Callable, Union, get_args, get_origin, get_type_hints @@ -19,13 +21,14 @@ def _return_type_includes_iterator(return_type) -> bool: return inspect.isclass(resolved) and issubclass(resolved, (Iterator, AsyncIterator)) -def is_streaming_endpoint(func: Callable) -> bool: - """Backend-neutral: True if *func* is a generator or annotated as an Iterator. +def is_streaming_endpoint(func: Callable, schema_binding: None) -> bool: + """Backend-neutral: True when *func* can produce a streaming response. - A generator function (``yield``) or async generator function (``async yield``) - is always considered streaming. A regular function whose return annotation - is ``Iterator[...]`` / ``AsyncIterator[...]`` (including inside a ``Union``) - is also detected. + Detection order: + - generator / async-generator function; + - return annotation contains ``Iterator`` / ``AsyncIterator`` (incl. inside a ``Union``); + - schema endpoint whose request model has a ``stream`` field and the function body + returns a generator (AST: ``yield``, generator expression, or under ``if request.stream``). """ target = inspect.unwrap(func) if inspect.isgeneratorfunction(target) or inspect.isasyncgenfunction(target): @@ -33,8 +36,70 @@ def is_streaming_endpoint(func: Callable) -> bool: try: return_type = get_type_hints(target).get("return") except Exception: + return_type = None + if _return_type_includes_iterator(return_type): + return True + + if schema_binding is not None and "stream" in schema_binding.request_model.model_fields: + return ast_suggests_request_stream(target) + return False + + +def _is_stream_attr_test(node: ast.AST) -> bool: + """True when *node* tests a ``.stream`` attribute (e.g. ``request.stream``).""" + if isinstance(node, ast.Attribute) and node.attr == "stream": + return True + if isinstance(node, ast.UnaryOp) and isinstance(node.op, ast.Not): + return _is_stream_attr_test(node.operand) + return False + + +def _is_streaming_return_value(node: ast.AST | None) -> bool: + """True when a ``return`` hands back a generator (expression, yield, or async yield).""" + if node is None: + return False + return isinstance(node, (ast.GeneratorExp, ast.Yield, ast.YieldFrom)) + + +def _statements_suggest_streaming(stmts: list[ast.stmt]) -> bool: + """Walk *stmts* for generator returns, yields, or a ``.stream`` branch that streams.""" + for node in ast.walk(ast.Module(body=stmts, type_ignores=[])): + if isinstance(node, ast.Return) and _is_streaming_return_value(node.value): + return True + if isinstance(node, (ast.Yield, ast.YieldFrom)): + return True + if isinstance(node, ast.If) and _is_stream_attr_test(node.test): + if _statements_suggest_streaming(node.body) or _statements_suggest_streaming(node.orelse): + return True + return False + + +def _function_ast_node(func: Callable) -> ast.FunctionDef | ast.AsyncFunctionDef | None: + """Parse the source of *func* into its top-level function AST node.""" + try: + source = textwrap.dedent(inspect.getsource(func)) + tree = ast.parse(source) + except (OSError, TypeError, SyntaxError, ValueError): + return None + + expected_name = func.__name__ + for node in tree.body: + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) and node.name == expected_name: + return node + return None + + +def ast_suggests_request_stream(func: Callable) -> bool: + """True when the function body conditionally or unconditionally returns a generator. + + Detects patterns such as ``if request.stream: return (t for t in tokens)`` without + requiring a return-type annotation. Returns ``False`` when source is unavailable + (REPL, dynamic ``exec``) or the body has no streaming return path. + """ + fn_node = _function_ast_node(inspect.unwrap(func)) + if fn_node is None: return False - return _return_type_includes_iterator(return_type) + return _statements_suggest_streaming(fn_node.body) def is_injected_progress_param(param: inspect.Parameter) -> bool: diff --git a/docs/TECHNICAL_README.md b/docs/TECHNICAL_README.md index 0383da7..890fecd 100644 --- a/docs/TECHNICAL_README.md +++ b/docs/TECHNICAL_README.md @@ -119,7 +119,7 @@ Standard routes registered automatically: `GET /status/{job_id}`, `POST /cancel/ Three streaming paths exist today: 1. **Generator endpoints** — any endpoint function that is a (async) generator, or whose return annotation declares an iterator, is served as an SSE `StreamingResponse` (FastAPI) or as a native generator handed back to RunPod (`return_aggregate_stream`). Detection is annotation/inspect-based — no source-code heuristics. -2. **Schema endpoints with `stream=true`** — the request schema carries the `stream` flag (chat, completion, transcription, speech, video generation). OpenAPI lists that field only when the endpoint handler is classified as streaming by `is_streaming_endpoint` (generator function, async generator, or return annotation containing `Iterator` / `AsyncIterator`). Non-streaming handlers get a runtime-derived request model with `stream` removed via `create_model`, so clients cannot send `stream: true` to endpoints that ignore it. Streaming bypasses the queue; what gets streamed depends on what the function returns: +2. **Schema endpoints with `stream=true`** — the request schema carries the `stream` flag (chat, completion, transcription, speech, video generation). OpenAPI lists that field only when `is_streaming_endpoint` classifies the handler as streaming (generator function, ``Iterator`` return annotation, or AST detection of a generator return under ``if request.stream``). Non-streaming handlers register a sibling model where ``stream`` uses ``SkipJsonSchema``: hidden from OpenAPI but still accepted in validation so clients can send ``stream: false``. Streaming bypasses the queue; what gets streamed depends on what the function returns: - a **generator of raw tokens**: for tags with a registered chunk model (`STREAM_CHUNK_SPECS`, currently `chat`), `SchemaStreamSerializer` wraps each token into the standardized chunk model (`ChatCompletionChunk`) as an SSE event — APIPod generates the stable chunk `id`, the `created` timestamp and the `object` discriminator, then closes with a final delta and the `[DONE]` sentinel. The endpoint only yields text. Other token-delta tags without a chunk model stream their tokens as-is (SSE), and non-SSE tags stream raw bytes; - an **`AudioFile`/`VideoFile`**: its encoded bytes are chunked into a `StreamingResponse` with the file's media content type — raw audio chunks, not SSE, matching OpenAI's `stream_format="audio"` behavior; - anything else: the regular wrapped JSON response (the endpoint cannot stream). diff --git a/test/debug_test_services.py b/test/debug_test_services.py index 1d254c6..f5b128a 100644 --- a/test/debug_test_services.py +++ b/test/debug_test_services.py @@ -2,6 +2,14 @@ Run or debug this file from VS Code. Uncomment one ``launch_*`` call in ``main``. Each call blocks on uvicorn until you stop the debugger. + +``launch_all`` mounts each service group as a prefixed sub-router so endpoints +with the same path (e.g. ``/chat`` on schemas vs streaming) do not overwrite +each other: + +- ``/core/...`` core_service +- ``/schemas/...`` schema_service (all, extended, mapping) +- ``/streaming/...`` streaming_service """ import sys @@ -39,12 +47,22 @@ def launch_streaming(port: int = 8000, host: str = HOST, simulate: str = SIMULAT def launch_all(port: int = 8000, host: str = HOST, simulate: str = SIMULATE) -> None: - app = APIPod(simulate=simulate) - core_service.register(app) - schema_service.register_all(app) - schema_service.register_extended(app) - schema_service.register_mapping(app) - streaming_service.register(app) + app = APIPod(simulate=simulate, title="APIPod test services (all)") + + core = APIPod(simulate=simulate, prefix="/core") + core_service.register(core) + app.app.include_router(core) + + schemas = APIPod(simulate=simulate, prefix="/schemas") + schema_service.register_all(schemas) + schema_service.register_extended(schemas) + schema_service.register_mapping(schemas) + app.app.include_router(schemas) + + streaming = APIPod(simulate=simulate, prefix="/streaming") + streaming_service.register(streaming) + app.app.include_router(streaming) + app.start(host=host, port=port) diff --git a/test/test_schemas.py b/test/test_schemas.py index 88d54a7..c5366fd 100644 --- a/test/test_schemas.py +++ b/test/test_schemas.py @@ -69,6 +69,16 @@ def test_response_model_auto_assigned_from_registry(): ) +def test_non_streaming_schema_accepts_stream_false_in_body(): + """OpenAI clients often send ``stream: false``; validation must not reject it.""" + with build_service(schema_service.register_all) as client: + resp = client.post( + "/chat", + json={"messages": [{"role": "user", "content": "hi"}], "stream": False}, + ) + assert resp.status_code == 200, resp.text + + def test_stream_request_field_on_streaming_schema_endpoint(): """A schema endpoint detected as streaming keeps ``stream`` in its OpenAPI body.""" with build_service(streaming_service.register, simulate="serverless") as client: diff --git a/test/test_signatures.py b/test/test_signatures.py new file mode 100644 index 0000000..f05d7d0 --- /dev/null +++ b/test/test_signatures.py @@ -0,0 +1,29 @@ +"""Unit tests for endpoint signature analysis helpers.""" + +from apipod.common import schemas +from apipod.engine.signatures.analysis import ast_suggests_request_stream, is_streaming_endpoint + + +def test_is_streaming_endpoint_for_conditional_generator_return(): + def chat(request: schemas.ChatCompletionRequest): + if request.stream: + return (token for token in ["a", "b"]) + return "".join(["a", "b"]) + + assert ast_suggests_request_stream(chat) is True + assert is_streaming_endpoint(chat) is True + + +def test_is_streaming_endpoint_false_for_plain_schema_handler(): + def chat(request: schemas.ChatCompletionRequest): + return "done" + + assert ast_suggests_request_stream(chat) is False + assert is_streaming_endpoint(chat) is False + + +def test_is_streaming_endpoint_for_yield_from(): + def stream_text(): + yield from ["a", "b"] + + assert is_streaming_endpoint(stream_text) is True From c60c7856d5e842b1537703f8f87e86c7fec3b6a7 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Sun, 28 Jun 2026 22:36:52 +0200 Subject: [PATCH 25/38] Fix multipart and JSON FileModel coercion for wire-format uploads. Parse FileModel JSON strings in multipart fields and MediaList generic annotations. Coerce dict/JSON payloads into pydantic FileModels on input. Extend JobResult serialization and prefix serverless job hypermedia links. Serialize tuple returns like lists, media files to FileModel, and omit JobProgress from responses with a warning. Pass router mount prefix into status/cancel/stream links so prefixed services resolve correctly. Add include_router with mount prefix normalization on FastAPI and RunPod backends. Mirror FastAPI include_router for SocaityFastAPIRouter; normalize mount prefixes and propagate them to job link generation on both backends. Join binary stream chunks in aggregate_plain. Return concatenated bytes from plain stream aggregation instead of a chunk list. Update debug test services for prefixed router mounting and mixed_media JSON. Switch to app.include_router(child, prefix=...); return mixed_media as a JSON dict with base64 fields instead of a tuple. docs: note router mounting and job link prefix behavior in TECHNICAL_README --- .vscode/settings.json | 10 +- apipod/common/schemas/media_files.py | 11 +- apipod/engine/backend/fastapi/router.py | 28 +++- apipod/engine/backend/runpod/router.py | 35 ++++- apipod/engine/base_backend.py | 4 + apipod/engine/files/base_file_mixin.py | 70 ++++++++- apipod/engine/jobs/job_result.py | 69 +++++++-- apipod/engine/streaming/stream_serializer.py | 6 +- apipod/engine/utils.py | 8 + docs/AGENTS.md | 11 +- docs/TECHNICAL_README.md | 2 +- test/debug_test_services.py | 154 ++++++++++--------- test/services/core_service.py | 7 +- 13 files changed, 311 insertions(+), 104 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index a751c48..7ef3806 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,8 +13,12 @@ ], "python.analysis.diagnosticMode": "workspace", "python.analysis.autoSearchPaths": true, - "flake8.args": [ - "--max-line-length=120", - "--ignore=E203,W503,E501" + "ruff.lineLength": 120, + "ruff.lint.ignore": [ + "E203", + "W503", + "E501", + "W293", + "W291" ] } \ No newline at end of file diff --git a/apipod/common/schemas/media_files.py b/apipod/common/schemas/media_files.py index b7e64dd..8545800 100644 --- a/apipod/common/schemas/media_files.py +++ b/apipod/common/schemas/media_files.py @@ -1,5 +1,6 @@ from pydantic import BaseModel, AnyUrl, model_validator from typing import Union, Optional +import json class FileModel(BaseModel): @@ -18,7 +19,15 @@ class FileModel(BaseModel): @model_validator(mode="before") @classmethod def _coerce_input(cls, value): - if isinstance(value, (str, bytes)): + if isinstance(value, str): + stripped = value.strip() + if stripped.startswith("{"): + try: + parsed = json.loads(stripped) + if isinstance(parsed, dict): + return parsed + except (json.JSONDecodeError, TypeError): + pass return {"file_name": "file", "content_type": "application/octet-stream", "content": value} if isinstance(value, FileModel): # Re-validate a (sibling/parent) FileModel against the concrete field type. diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index 021a43c..4e42f1a 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -17,7 +17,7 @@ from apipod.engine.queue.queue_mixin import _QueueMixin from apipod.engine.backend.fastapi.file_handling_mixin import _fast_api_file_handling_mixin from apipod.engine.backend.fastapi.streaming_mixin import _FastAPIStreamingMixin -from apipod.engine.utils import normalize_name +from apipod.engine.utils import normalize_name, normalize_mount_prefix from apipod.engine.backend.fastapi.exception_handling import _FastAPIExceptionHandler from apipod.engine.backend.schema_resolve import wrap_schema_response @@ -83,7 +83,7 @@ def __init__( ) self.app: FastAPI = app - self.prefix = prefix + self.prefix = normalize_mount_prefix(prefix) self.stream_store = stream_store # Let the queue produce streaming job output into the stream store so a @@ -118,6 +118,28 @@ def add_standard_routes(self): self.api_route(path="/stream/{job_id}", methods=["GET"])(self.stream_job_sse) self.api_route(path="/health", methods=["GET"])(self.get_health) + def _apply_mount_prefix(self, mount_prefix: str) -> None: + """Record the mount prefix used for job hypermedia links.""" + mount = normalize_mount_prefix(mount_prefix) + if mount: + self.prefix = mount + + def include_router( + self, + router: "SocaityFastAPIRouter", + prefix: str = "", + tags: list | None = None, + **kwargs, + ) -> None: + """Mount another APIPod FastAPI router (mirrors FastAPI ``include_router``).""" + if not isinstance(router, SocaityFastAPIRouter): + raise TypeError( + f"APIPod include_router expects a SocaityFastAPIRouter instance, got {type(router)!r}" + ) + mount = normalize_mount_prefix(prefix) + router._apply_mount_prefix(mount) + super().include_router(router, prefix=mount, tags=tags, **kwargs) + def get_health(self) -> Response: """ Get server health status. @@ -174,6 +196,7 @@ def get_job(self, job_id: str, return_format: str = 'json') -> JobResult: ret_job = JobResultFactory.from_base_job( job, include_stream_link=self._include_stream_link_for(job.job_function), + link_prefix=self.prefix, ) if return_format != 'json': @@ -222,6 +245,7 @@ def add_job(self, func: Callable, job_params: dict) -> JobResult: return JobResultFactory.from_base_job( job, include_stream_link=include_stream_link, + link_prefix=self.prefix, ) def endpoint(self, path: str, methods: list[str] | None = None, max_upload_file_size_mb: int = None, queue_size: int = 500, use_queue: bool = None, *args, **kwargs): diff --git a/apipod/engine/backend/runpod/router.py b/apipod/engine/backend/runpod/router.py index f4caf49..7bea495 100644 --- a/apipod/engine/backend/runpod/router.py +++ b/apipod/engine/backend/runpod/router.py @@ -22,7 +22,7 @@ ) from apipod.engine.streaming.stream_serializer import as_sync_iter, encode_chunk, is_streaming_result -from apipod.engine.utils import normalize_name +from apipod.engine.utils import normalize_name, normalize_mount_prefix from apipod.common.settings import APIPOD_PORT from media_toolkit import AudioFile, VideoFile @@ -32,18 +32,49 @@ class SocaityRunpodRouter(_BaseBackend, _BaseFileHandlingMixin): Adds routing functionality for the runpod serverless framework. Provides enhanced file handling and conversion capabilities. """ - def __init__(self, title: str = "APIPod for ", summary: str = None, simulate: bool = False, *args, **kwargs): + def __init__(self, title: str = "APIPod for ", summary: str = None, simulate: bool = False, prefix: str = "", *args, **kwargs): super().__init__(title=title, summary=summary, *args, **kwargs) # When True, start() runs RunPod's local API emulator instead of the real # serverless worker (set by APIPod(simulate="serverless-runpod", direct=True)). self.simulate = simulate + self.prefix = normalize_mount_prefix(prefix) self.routes = {} # routes are organized like {"ROUTE_NAME": "ROUTE_FUNCTION"} self._endpoint_plans: dict[str, EndpointExecutionPlan] = {} self._endpoint_source_funcs: dict[str, Callable] = {} self.add_standard_routes() + def _apply_mount_prefix(self, mount_prefix: str) -> None: + mount = normalize_mount_prefix(mount_prefix) + if mount: + self.prefix = mount + + def include_router( + self, + router: "SocaityRunpodRouter", + prefix: str = "", + **kwargs, + ) -> None: + """Mount another APIPod RunPod router under *prefix* (path prefix only).""" + del kwargs + if not isinstance(router, SocaityRunpodRouter): + raise TypeError( + f"APIPod include_router expects a SocaityRunpodRouter instance, got {type(router)!r}" + ) + mount = normalize_mount_prefix(prefix) + router._apply_mount_prefix(mount) + head = mount.strip("/") + for path, route in router.routes.items(): + if path == "openapi.json": + continue + prefixed = f"{head}/{path.strip('/')}" if head else path.strip("/") + self.routes[prefixed] = route + if path in router._endpoint_plans: + self._endpoint_plans[prefixed] = router._endpoint_plans[path] + if path in router._endpoint_source_funcs: + self._endpoint_source_funcs[prefixed] = router._endpoint_source_funcs[path] + def add_standard_routes(self): self.endpoint(path="openapi.json")(self.get_openapi_schema) diff --git a/apipod/engine/base_backend.py b/apipod/engine/base_backend.py index e1316f2..3830516 100644 --- a/apipod/engine/base_backend.py +++ b/apipod/engine/base_backend.py @@ -115,6 +115,10 @@ def cancel_job(self, job_id: str): def start(self, port: int = APIPOD_PORT, *args, **kwargs): raise NotImplementedError("Implement in subclass") + def include_router(self, router, prefix: str = "", **kwargs): + """Mount a nested APIPod router under *prefix* (FastAPI ``include_router`` semantics).""" + raise NotImplementedError("Implement in subclass") + def endpoint(self, path: str = None, *args, **kwargs): """ Add a route to the app. diff --git a/apipod/engine/files/base_file_mixin.py b/apipod/engine/files/base_file_mixin.py index 3e0cae0..5378e17 100644 --- a/apipod/engine/files/base_file_mixin.py +++ b/apipod/engine/files/base_file_mixin.py @@ -1,5 +1,6 @@ import functools import inspect +import json from types import UnionType from typing import Any, Optional, Union, get_args, get_origin, Callable, List, Type @@ -28,6 +29,63 @@ def _media_type_for_file_model(file_model_cls: Type) -> Type: return MediaFile +def _file_model_class_from_annotation(annotation: Any) -> Optional[Type[FileModel]]: + """Resolve a FileModel subclass from a parameter annotation (also inside unions).""" + if inspect.isclass(annotation) and issubclass(annotation, FileModel): + return annotation + if get_origin(annotation) in (Union, UnionType): + for arg in get_args(annotation): + if arg is type(None): + continue + resolved = _file_model_class_from_annotation(arg) + if resolved is not None: + return resolved + return None + + +def _coerce_to_file_model(value: Any, file_model_cls: Type[FileModel]) -> Any: + """Parse wire-format FileModel payloads (dict, JSON string) into pydantic models.""" + if isinstance(value, FileModel): + content = value.content + if isinstance(content, str) and content.strip().startswith("{"): + try: + parsed = json.loads(content.strip()) + if isinstance(parsed, dict) and {"file_name", "content_type", "content"}.issubset(parsed.keys()): + return file_model_cls.model_validate(parsed) + except (json.JSONDecodeError, ValueError): + pass + return value + if isinstance(value, dict): + return file_model_cls.model_validate(value) + if isinstance(value, str): + stripped = value.strip() + if stripped.startswith("{"): + try: + return file_model_cls.model_validate(json.loads(stripped)) + except (json.JSONDecodeError, ValueError): + pass + return value + + +def _is_media_list_type(target_type: Any) -> bool: + """True for ``MediaList`` and parameterized forms like ``MediaList[ImageFile]``.""" + if target_type is MediaList: + return True + return get_origin(target_type) is MediaList + + +def _coerce_wire_list(value: Any) -> Any: + """Parse JSON list strings from multipart form fields.""" + if isinstance(value, str): + stripped = value.strip() + if stripped.startswith("["): + try: + return json.loads(stripped) + except json.JSONDecodeError: + pass + return value + + def _parse_file_model_value(value: Any) -> Any: """Convert FileModel instances (also inside lists) into parsed media-toolkit objects.""" if isinstance(value, FileModel): @@ -209,16 +267,22 @@ def _convert_param_to_media_file(self, param_value: Any, annotation: Any) -> Any return param_value try: + file_model_cls = _file_model_class_from_annotation(annotation) + if file_model_cls is not None: + coerced = _coerce_to_file_model(param_value, file_model_cls) + if isinstance(coerced, FileModel): + return _parse_file_model_value(coerced) + # Determine target type for conversion target_type = self._get_media_target_type(annotation) - if target_type == MediaList: + if _is_media_list_type(target_type): return MediaList( read_system_files=False, download_files=True, use_temp_file=True, - temp_dir=None - ).from_any(param_value) + temp_dir=None, + ).from_any(_coerce_wire_list(param_value)) # Attempt conversion m = media_from_any( diff --git a/apipod/engine/jobs/job_result.py b/apipod/engine/jobs/job_result.py index 0e08e32..972d511 100644 --- a/apipod/engine/jobs/job_result.py +++ b/apipod/engine/jobs/job_result.py @@ -1,4 +1,5 @@ import gzip +import logging from datetime import datetime from io import BytesIO from typing import Any, List, Optional, Union @@ -6,12 +7,16 @@ from pydantic import BaseModel from apipod.engine.jobs.base_job import JOB_STATUS, BaseJob +from apipod.engine.jobs.job_progress import JobProgress, JobProgressRunpod from apipod.engine.signatures.upload import is_param_media_toolkit_file from media_toolkit import IMediaContainer from media_toolkit.utils.data_type_utils import is_file_model_dict from apipod.common.schemas.media_files import FileModel +logger = logging.getLogger(__name__) + + def _public_status(status: Any) -> Optional[str]: """Public status string: a JOB_STATUS carries its own value; pass strings through.""" if status is None: @@ -60,9 +65,24 @@ class JobResult(BaseModel): class JobResultFactory: @staticmethod - def _serialize_result(data: Any) -> Union[FileModel, List[FileModel], list, str, None]: + def _is_job_progress(value: Any) -> bool: + return isinstance(value, (JobProgress, JobProgressRunpod)) + + @staticmethod + def _warn_job_progress_ignored(context: str = "response") -> None: + logger.warning( + "Endpoint returned JobProgress in its %s. JobProgress is input-only and is omitted from the JSON result.", + context, + ) + + @classmethod + def _serialize_result(cls, data: Any) -> Union[FileModel, List[FileModel], list, str, None]: + if cls._is_job_progress(data): + cls._warn_job_progress_ignored() + return None + if isinstance(data, IMediaContainer): - return data.to_json() + return FileModel(**data.to_json()) if is_param_media_toolkit_file(data): return FileModel(**data.to_json()) @@ -76,24 +96,47 @@ def _serialize_result(data: Any) -> Union[FileModel, List[FileModel], list, str, except Exception: pass - # Pydantic schema responses (e.g. SpeechResponse): dump to a dict and - # recurse so nested media files / FileModels serialize correctly too. if isinstance(data, BaseModel): - return JobResultFactory._serialize_result(data.model_dump()) + return cls._serialize_result(data.model_dump()) + + if isinstance(data, tuple): + items = [] + for index, item in enumerate(data): + if cls._is_job_progress(item): + cls._warn_job_progress_ignored(context=f"response[{index}]") + continue + items.append(cls._serialize_result(item)) + return items if isinstance(data, list): - return [JobResultFactory._serialize_result(item) for item in data] + items = [] + for index, item in enumerate(data): + if cls._is_job_progress(item): + cls._warn_job_progress_ignored(context=f"response[{index}]") + continue + items.append(cls._serialize_result(item)) + return items if isinstance(data, dict): return { - key: JobResultFactory._serialize_result(value) + key: cls._serialize_result(value) for key, value in data.items() } return data @staticmethod - def from_base_job(job: BaseJob, *, include_stream_link: bool = False) -> JobResult: + def _job_link(link_prefix: str, suffix: str) -> str: + prefix = (link_prefix or "").rstrip("/") + return f"{prefix}{suffix}" if prefix else suffix + + @staticmethod + def from_base_job( + job: BaseJob, + *, + include_stream_link: bool = False, + link_prefix: str = "", + ) -> JobResult: """Map a :class:`BaseJob` to the public :class:`JobResult`.""" m = job.metrics metrics = JobMetrics( @@ -113,9 +156,13 @@ def from_base_job(job: BaseJob, *, include_stream_link: bool = False) -> JobResu message=job.job_progress.message, metrics=metrics, links=JobLinks( - status=f"/status/{job.id}", - cancel=f"/cancel/{job.id}", - stream=f"/stream/{job.id}" if include_stream_link else None, + status=JobResultFactory._job_link(link_prefix, f"/status/{job.id}"), + cancel=JobResultFactory._job_link(link_prefix, f"/cancel/{job.id}"), + stream=( + JobResultFactory._job_link(link_prefix, f"/stream/{job.id}") + if include_stream_link + else None + ), ), ) diff --git a/apipod/engine/streaming/stream_serializer.py b/apipod/engine/streaming/stream_serializer.py index 6874f20..5e5997f 100644 --- a/apipod/engine/streaming/stream_serializer.py +++ b/apipod/engine/streaming/stream_serializer.py @@ -103,8 +103,12 @@ def store_chunk(chunk: Any) -> str: def aggregate_plain(items: list) -> Any: """Join text chunks or serialize each item for the /status result.""" - if items and all(isinstance(i, str) for i in items): + if not items: + return items + if all(isinstance(i, str) for i in items): return "".join(items) + if all(isinstance(i, (bytes, bytearray)) for i in items): + return b"".join(bytes(i) for i in items) return [JobResultFactory._serialize_result(i) for i in items] diff --git a/apipod/engine/utils.py b/apipod/engine/utils.py index 2b18c92..6840fc3 100644 --- a/apipod/engine/utils.py +++ b/apipod/engine/utils.py @@ -84,3 +84,11 @@ def normalize_name(name: str, preserve_paths: bool = False) -> str: if len(name) == 0: return "no_name" return name + + +def normalize_mount_prefix(prefix: str) -> str: + """Normalize a router mount prefix to a leading-slash path segment.""" + prefix = (prefix or "").strip() + if not prefix: + return "" + return prefix if prefix.startswith("/") else f"/{prefix}" diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 03f74f6..9628794 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -48,12 +48,11 @@ The test: Every changed line should trace directly to the user's request. - Avoid local imports - Do not write "deprecated" or backward compability code. - Update the README.md if there's user related important changes. Update TECHNICAL_README.md for architectural, or project maintainer important changes. Keep the .md update brief use technical correct terms. -- Write flake8 formatted code with "flake8.args": [ - "--max-line-length=120", - "--ignore=E203,W503,E501,E261,W293" - ] -} -- Avoid using direct cmd python calls and pip installs. Work with the local venv if necessary. Always ask if necessary. +- Write ruff formatted code with ignores E203, W503, W501, W293, W291 and lineLenght 120. +- Avoid using direct cmd python calls and pip installs. +- Dev tools are make, ruff, mypy, pytest. +- Always ask before writing a test file. +- When executing python code, always use the local venv of the corresponding project. ## 5. Reason and thinking style Do thinking and reasoning like a smart caveman. diff --git a/docs/TECHNICAL_README.md b/docs/TECHNICAL_README.md index 890fecd..ff6c3fb 100644 --- a/docs/TECHNICAL_README.md +++ b/docs/TECHNICAL_README.md @@ -167,5 +167,5 @@ Run `pytest`. Two primitives keep tests DRY: `build_service(register, **config)` The fastSDK end-to-end tests skip automatically when the installed fastsdk lacks the `connect` API (e.g. a local in-progress build); CI installs one that has it. Pytest config (`pythonpath` in `pyproject.toml`) resolves `import apipod` to the in-repo source and the `conftest`/`services` helpers by name, so no `sys.path` shims are needed and each file is also runnable directly from an IDE via its `__main__` block. -CI (`.github/workflows/publish.yml`) runs the `test` job on every push and pull request (installing `.[test]`, which includes fastSDK). The `publish` job `needs: test`, so the patch version bump and PyPI upload happen only on a push to `main` after tests pass. flake8 and mypy run as soft checks (`continue-on-error`): they surface warnings without gating the build. +CI (`.github/workflows/publish.yml`) runs the `test` job on every push and pull request (installing `.[test]`, which includes fastSDK). The `publish` job `needs: test`, so the patch version bump and PyPI upload happen only on a push to `main` after tests pass. ruff and mypy run as soft checks (`continue-on-error`): they surface warnings without gating the build. diff --git a/test/debug_test_services.py b/test/debug_test_services.py index f5b128a..0cec051 100644 --- a/test/debug_test_services.py +++ b/test/debug_test_services.py @@ -1,73 +1,81 @@ -"""Launch test services locally for fastSDK development. Not a pytest module. - -Run or debug this file from VS Code. Uncomment one ``launch_*`` call in ``main``. -Each call blocks on uvicorn until you stop the debugger. - -``launch_all`` mounts each service group as a prefixed sub-router so endpoints -with the same path (e.g. ``/chat`` on schemas vs streaming) do not overwrite -each other: - -- ``/core/...`` core_service -- ``/schemas/...`` schema_service (all, extended, mapping) -- ``/streaming/...`` streaming_service -""" - -import sys -from pathlib import Path - -# Allow ``from services import ...`` when run/debugged as a script. -sys.path.insert(0, str(Path(__file__).parent)) - -from apipod import APIPod -from services import core_service, schema_service, streaming_service - -HOST = "127.0.0.1" -#SIMULATE = "serverless" -SIMULATE = None - - -def launch_core(port: int = 8000, host: str = HOST, simulate: str = SIMULATE) -> None: - app = APIPod(simulate=simulate) - core_service.register(app) - app.start(host=host, port=port) - - -def launch_schemas(port: int = 8000, host: str = HOST, simulate: str = SIMULATE) -> None: - app = APIPod(simulate=simulate) - schema_service.register_all(app) - schema_service.register_extended(app) - schema_service.register_mapping(app) - app.start(host=host, port=port) - - -def launch_streaming(port: int = 8000, host: str = HOST, simulate: str = SIMULATE) -> None: - app = APIPod(simulate=simulate) - streaming_service.register(app) - app.start(host=host, port=port) - - -def launch_all(port: int = 8000, host: str = HOST, simulate: str = SIMULATE) -> None: - app = APIPod(simulate=simulate, title="APIPod test services (all)") - - core = APIPod(simulate=simulate, prefix="/core") - core_service.register(core) - app.app.include_router(core) - - schemas = APIPod(simulate=simulate, prefix="/schemas") - schema_service.register_all(schemas) - schema_service.register_extended(schemas) - schema_service.register_mapping(schemas) - app.app.include_router(schemas) - - streaming = APIPod(simulate=simulate, prefix="/streaming") - streaming_service.register(streaming) - app.app.include_router(streaming) - - app.start(host=host, port=port) - - -if __name__ == "__main__": - # launch_core() - # launch_schemas() - # launch_streaming() - launch_all() +"""Launch test services locally for fastSDK development. Not a pytest module. + +Run or debug this file from VS Code. Uncomment one ``launch_*`` call in ``main``. +Use the **apipod** project venv (``apipod/venv``), not fastsdk's. +Each call blocks on uvicorn until you stop the debugger. + +``launch_all`` mounts each service group as a prefixed sub-router so endpoints +with the same path (e.g. ``/chat`` on schemas vs streaming) do not overwrite +each other: + +- ``/core/...`` core_service +- ``/schemas/...`` schema_service (all, extended, mapping) +- ``/streaming/...`` streaming_service +""" + +import os +import sys +from pathlib import Path + +# Allow ``from services import ...`` when run/debugged as a script. +sys.path.insert(0, str(Path(__file__).parent)) + +from apipod import APIPod +from services import core_service, schema_service, streaming_service + +HOST = "127.0.0.1" +# Override via env before launch (see apipod ``APIPOD_SIMULATE`` / ``APIPOD_NATIVE``): +# standard FastAPI: (unset) +# serverless: APIPOD_SIMULATE=serverless +# serverless-runpod: APIPOD_SIMULATE=serverless-runpod +# runpod native: APIPOD_SIMULATE=serverless-runpod APIPOD_NATIVE=true +SIMULATE = os.environ.get("APIPOD_SIMULATE") or None +DIRECT = os.environ.get("APIPOD_NATIVE", "").strip().lower() in ("1", "true", "yes") or None + + +def launch_core(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: + app = APIPod(simulate=simulate, direct=direct) + core_service.register(app) + app.start(host=host, port=port) + + +def launch_schemas(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: + app = APIPod(simulate=simulate, direct=direct) + schema_service.register_all(app) + schema_service.register_extended(app) + schema_service.register_mapping(app) + app.start(host=host, port=port) + + +def launch_streaming(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: + app = APIPod(simulate=simulate, direct=direct) + streaming_service.register(app) + app.start(host=host, port=port) + + +def launch_all(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: + app = APIPod(simulate=simulate, direct=direct, title="APIPod test services (all)") + + core = APIPod(simulate=simulate, direct=direct) + core_service.register(core) + app.include_router(core, prefix="/core") + + schemas = APIPod(simulate=simulate, direct=direct) + schema_service.register_all(schemas) + schema_service.register_extended(schemas) + schema_service.register_mapping(schemas) + app.include_router(schemas, prefix="/schemas") + + streaming = APIPod(simulate=simulate, direct=direct) + streaming_service.register(streaming) + app.include_router(streaming, prefix="/streaming") + + app.start(host=host, port=port) + + +if __name__ == "__main__": + # launch_core() + # launch_schemas() + # launch_streaming() + launch_all() + \ No newline at end of file diff --git a/test/services/core_service.py b/test/services/core_service.py index e710778..6b75d06 100644 --- a/test/services/core_service.py +++ b/test/services/core_service.py @@ -74,7 +74,12 @@ def mixed_media( astring: str = "master_of_desaster", anint: int = 42, ): - return anyfile3, str, anyfile1.to_base64(), img.to_base64(), anyfiles + return { + "text": astring, + "anyfile1_b64": anyfile1.to_base64() if anyfile1 else None, + "img_b64": img.to_base64(), + "anyfiles_b64": [item.to_base64() for item in anyfiles], + } # JobProgress + queue lifecycle. @app.post(path="/test_job_progress", queue_size=10) From 19b8c5b77f6df61339f38f8d6f81cfd872bff6f8 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Sun, 28 Jun 2026 22:38:00 +0200 Subject: [PATCH 26/38] fixed formatting problems --- test/debug_test_services.py | 163 ++++++++++++++++++------------------ 1 file changed, 82 insertions(+), 81 deletions(-) diff --git a/test/debug_test_services.py b/test/debug_test_services.py index 0cec051..15a85f1 100644 --- a/test/debug_test_services.py +++ b/test/debug_test_services.py @@ -1,81 +1,82 @@ -"""Launch test services locally for fastSDK development. Not a pytest module. - -Run or debug this file from VS Code. Uncomment one ``launch_*`` call in ``main``. -Use the **apipod** project venv (``apipod/venv``), not fastsdk's. -Each call blocks on uvicorn until you stop the debugger. - -``launch_all`` mounts each service group as a prefixed sub-router so endpoints -with the same path (e.g. ``/chat`` on schemas vs streaming) do not overwrite -each other: - -- ``/core/...`` core_service -- ``/schemas/...`` schema_service (all, extended, mapping) -- ``/streaming/...`` streaming_service -""" - -import os -import sys -from pathlib import Path - -# Allow ``from services import ...`` when run/debugged as a script. -sys.path.insert(0, str(Path(__file__).parent)) - -from apipod import APIPod -from services import core_service, schema_service, streaming_service - -HOST = "127.0.0.1" -# Override via env before launch (see apipod ``APIPOD_SIMULATE`` / ``APIPOD_NATIVE``): -# standard FastAPI: (unset) -# serverless: APIPOD_SIMULATE=serverless -# serverless-runpod: APIPOD_SIMULATE=serverless-runpod -# runpod native: APIPOD_SIMULATE=serverless-runpod APIPOD_NATIVE=true -SIMULATE = os.environ.get("APIPOD_SIMULATE") or None -DIRECT = os.environ.get("APIPOD_NATIVE", "").strip().lower() in ("1", "true", "yes") or None - - -def launch_core(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: - app = APIPod(simulate=simulate, direct=direct) - core_service.register(app) - app.start(host=host, port=port) - - -def launch_schemas(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: - app = APIPod(simulate=simulate, direct=direct) - schema_service.register_all(app) - schema_service.register_extended(app) - schema_service.register_mapping(app) - app.start(host=host, port=port) - - -def launch_streaming(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: - app = APIPod(simulate=simulate, direct=direct) - streaming_service.register(app) - app.start(host=host, port=port) - - -def launch_all(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: - app = APIPod(simulate=simulate, direct=direct, title="APIPod test services (all)") - - core = APIPod(simulate=simulate, direct=direct) - core_service.register(core) - app.include_router(core, prefix="/core") - - schemas = APIPod(simulate=simulate, direct=direct) - schema_service.register_all(schemas) - schema_service.register_extended(schemas) - schema_service.register_mapping(schemas) - app.include_router(schemas, prefix="/schemas") - - streaming = APIPod(simulate=simulate, direct=direct) - streaming_service.register(streaming) - app.include_router(streaming, prefix="/streaming") - - app.start(host=host, port=port) - - -if __name__ == "__main__": - # launch_core() - # launch_schemas() - # launch_streaming() - launch_all() - \ No newline at end of file +"""Launch test services locally for fastSDK development. Not a pytest module. + +Run or debug this file from VS Code. Uncomment one ``launch_*`` call in ``main``. + +Use the **apipod** project venv (``apipod/venv``), not fastsdk's. + +Each call blocks on uvicorn until you stop the debugger. + +``launch_all`` mounts each service group as a prefixed sub-router so endpoints +with the same path (e.g. ``/chat`` on schemas vs streaming) do not overwrite +each other: + +- ``/core/...`` core_service +- ``/schemas/...`` schema_service (all, extended, mapping) +- ``/streaming/...`` streaming_service +""" + +import os +import sys +from pathlib import Path + +# Allow ``from services import ...`` when run/debugged as a script. +sys.path.insert(0, str(Path(__file__).parent)) + +from apipod import APIPod +from services import core_service, schema_service, streaming_service + +HOST = "127.0.0.1" +# Override via env before launch (see apipod ``APIPOD_SIMULATE`` / ``APIPOD_NATIVE``): +# standard FastAPI: (unset) +# serverless: APIPOD_SIMULATE=serverless +# serverless-runpod: APIPOD_SIMULATE=serverless-runpod +# runpod native: APIPOD_SIMULATE=serverless-runpod APIPOD_NATIVE=true +SIMULATE = os.environ.get("APIPOD_SIMULATE") or None +DIRECT = os.environ.get("APIPOD_NATIVE", "").strip().lower() in ("1", "true", "yes") or None + + +def launch_core(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: + app = APIPod(simulate=simulate, direct=direct) + core_service.register(app) + app.start(host=host, port=port) + + +def launch_schemas(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: + app = APIPod(simulate=simulate, direct=direct) + schema_service.register_all(app) + schema_service.register_extended(app) + schema_service.register_mapping(app) + app.start(host=host, port=port) + + +def launch_streaming(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: + app = APIPod(simulate=simulate, direct=direct) + streaming_service.register(app) + app.start(host=host, port=port) + + +def launch_all(port: int = 8000, host: str = HOST, simulate: str = SIMULATE, direct: bool = DIRECT) -> None: + app = APIPod(simulate=simulate, direct=direct, title="APIPod test services (all)") + + core = APIPod(simulate=simulate, direct=direct) + core_service.register(core) + app.include_router(core, prefix="/core") + + schemas = APIPod(simulate=simulate, direct=direct) + schema_service.register_all(schemas) + schema_service.register_extended(schemas) + schema_service.register_mapping(schemas) + app.include_router(schemas, prefix="/schemas") + + streaming = APIPod(simulate=simulate, direct=direct) + streaming_service.register(streaming) + app.include_router(streaming, prefix="/streaming") + + app.start(host=host, port=port) + + +if __name__ == "__main__": + # launch_core() + # launch_schemas() + # launch_streaming() + launch_all() From fddb81602be0624cbb366f24efc504145f4b9eb8 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Mon, 29 Jun 2026 00:02:37 +0200 Subject: [PATCH 27/38] moved schemas into shared socaity-schemas module --- .vscode/fast-task-api.code-workspace | 11 - .vscode/settings.json | 24 - apipod/__init__.py | 3 +- apipod/common/constants.py | 2 +- apipod/common/exceptions.py | 2 +- apipod/common/schemas/__init__.py | 123 +++-- apipod/common/schemas/media_files.py | 96 ---- apipod/common/schemas/schemas.py | 448 ------------------ apipod/common/settings.py | 2 +- .../backend/fastapi/file_handling_mixin.py | 2 +- apipod/engine/backend/schema_resolve.py | 31 +- apipod/engine/files/base_file_mixin.py | 2 +- apipod/engine/jobs/job_result.py | 2 +- docs/TECHNICAL_README.md | 5 +- pyproject.toml | 8 +- 15 files changed, 134 insertions(+), 627 deletions(-) delete mode 100644 .vscode/fast-task-api.code-workspace delete mode 100644 .vscode/settings.json delete mode 100644 apipod/common/schemas/media_files.py delete mode 100644 apipod/common/schemas/schemas.py diff --git a/.vscode/fast-task-api.code-workspace b/.vscode/fast-task-api.code-workspace deleted file mode 100644 index 9dc6fae..0000000 --- a/.vscode/fast-task-api.code-workspace +++ /dev/null @@ -1,11 +0,0 @@ -{ - "folders": [ - { - "path": ".." - }, - { - "path": "../../media-toolkit" - } - ], - "settings": {} -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 7ef3806..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "python.analysis.extraPaths": [ - "${workspaceFolder}", - "${workspaceFolder}/../media-toolkit" - ], - "python.analysis.autoImportCompletions": true, - "python.analysis.indexing": true, - "python.analysis.packageIndexDepths": [ - { - "name": "media_toolkit", - "depth": 5 - } - ], - "python.analysis.diagnosticMode": "workspace", - "python.analysis.autoSearchPaths": true, - "ruff.lineLength": 120, - "ruff.lint.ignore": [ - "E203", - "W503", - "E501", - "W293", - "W291" - ] -} \ No newline at end of file diff --git a/apipod/__init__.py b/apipod/__init__.py index 6582334..00f8bc9 100644 --- a/apipod/__init__.py +++ b/apipod/__init__.py @@ -1,7 +1,8 @@ from apipod.api import APIPod from apipod.engine.jobs.base_job import BaseJob, LocalJob from apipod.engine.jobs.job_progress import JobProgress -from apipod.engine.jobs.job_result import FileModel, JobLinks, JobMetrics, JobResult +from socaity_schemas import FileModel +from apipod.engine.jobs.job_result import JobLinks, JobMetrics, JobResult from apipod.engine.streaming import StreamStore, LocalStreamStore, StreamProducer from media_toolkit import MediaFile, ImageFile, AudioFile, VideoFile, MediaList, MediaDict from apipod.common import constants diff --git a/apipod/common/constants.py b/apipod/common/constants.py index 62936a1..1b8e0cb 100644 --- a/apipod/common/constants.py +++ b/apipod/common/constants.py @@ -20,4 +20,4 @@ class SERVER_HEALTH(Enum): BOOTING = "booting" RUNNING = "running" BUSY = "busy" - ERROR = "error" + ERROR = "error" \ No newline at end of file diff --git a/apipod/common/exceptions.py b/apipod/common/exceptions.py index f614b3f..6d96a6e 100644 --- a/apipod/common/exceptions.py +++ b/apipod/common/exceptions.py @@ -24,4 +24,4 @@ def __init__(self, file_name: str = "", message: str = "File upload failed"): class InsufficientBalanceException(JobException): """ Gets raised when a job is rejected because the user has insufficient balance """ def __init__(self, message: str = "Insufficient balance"): - super().__init__(message) + super().__init__(message) \ No newline at end of file diff --git a/apipod/common/schemas/__init__.py b/apipod/common/schemas/__init__.py index f33bc08..5ff2ba9 100644 --- a/apipod/common/schemas/__init__.py +++ b/apipod/common/schemas/__init__.py @@ -1,36 +1,95 @@ -from .schemas import ( - APIPodSchemaBase, Usage, - ChatMessage, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionChoice, ChatCompletionMessage, - CompletionRequest, CompletionResponse, CompletionChoice, - EmbeddingRequest, EmbeddingResponse, EmbeddingData, - ImageGenerationRequest, ImageGenerationResponse, - VideoGenerationRequest, VideoGenerationResponse, - TranscriptionRequest, TranscriptionResponse, TranscriptionSegment, TranscriptionWord, - SpeechRequest, SpeechResponse, - CreateVoiceRequest, VoiceResponse, - VoiceConversionRequest, VoiceConversionResponse, - Generation3DRequest, Generation3DResponse, - VisionRequest, VisionResponse, VisionData, VisionLabel, - MultimodalEmbeddingRequest, MultimodalEmbeddingResponse, MultimodalEmbeddingData, - ChatDelta, ChatStreamChoice, ChatCompletionChunk, -) +"""Standard request/response schemas, re-exported from socaity-schemas.""" -from .media_files import FileModel, ImageFileModel, AudioFileModel, VideoFileModel, ThreeDFileModel +from socaity_schemas import ( + APIPodSchemaBase, + AudioFileModel, + ChatCompletionChunk, + ChatCompletionChoice, + ChatCompletionMessage, + ChatCompletionRequest, + ChatCompletionResponse, + ChatDelta, + ChatMessage, + ChatStreamChoice, + CompletionChoice, + CompletionRequest, + CompletionResponse, + CreateVoiceRequest, + EmbeddingData, + EmbeddingRequest, + EmbeddingResponse, + FileModel, + Generation3DRequest, + Generation3DResponse, + ImageFileModel, + ImageGenerationRequest, + ImageGenerationResponse, + MultimodalEmbeddingData, + MultimodalEmbeddingRequest, + MultimodalEmbeddingResponse, + SpeechRequest, + SpeechResponse, + ThreeDFileModel, + TranscriptionRequest, + TranscriptionResponse, + TranscriptionSegment, + TranscriptionWord, + Usage, + VideoFileModel, + VideoGenerationRequest, + VideoGenerationResponse, + VisionData, + VisionLabel, + VisionRequest, + VisionResponse, + VoiceConversionRequest, + VoiceConversionResponse, + VoiceResponse, +) __all__ = [ - "APIPodSchemaBase", "Usage", - "ChatMessage", "ChatCompletionRequest", "ChatCompletionResponse", "ChatCompletionChoice", "ChatCompletionMessage", - "CompletionRequest", "CompletionResponse", "CompletionChoice", - "EmbeddingRequest", "EmbeddingResponse", "EmbeddingData", - "ImageGenerationRequest", "ImageGenerationResponse", - "VideoGenerationRequest", "VideoGenerationResponse", - "TranscriptionRequest", "TranscriptionResponse", "TranscriptionSegment", "TranscriptionWord", - "SpeechRequest", "SpeechResponse", - "CreateVoiceRequest", "VoiceResponse", - "VoiceConversionRequest", "VoiceConversionResponse", - "Generation3DRequest", "Generation3DResponse", - "VisionRequest", "VisionResponse", "VisionData", "VisionLabel", - "MultimodalEmbeddingRequest", "MultimodalEmbeddingResponse", "MultimodalEmbeddingData", - "ChatDelta", "ChatStreamChoice", "ChatCompletionChunk", - "FileModel", "ImageFileModel", "AudioFileModel", "VideoFileModel", "ThreeDFileModel", + "APIPodSchemaBase", + "Usage", + "ChatMessage", + "ChatCompletionRequest", + "ChatCompletionResponse", + "ChatCompletionChoice", + "ChatCompletionMessage", + "CompletionRequest", + "CompletionResponse", + "CompletionChoice", + "EmbeddingRequest", + "EmbeddingResponse", + "EmbeddingData", + "ImageGenerationRequest", + "ImageGenerationResponse", + "VideoGenerationRequest", + "VideoGenerationResponse", + "TranscriptionRequest", + "TranscriptionResponse", + "TranscriptionSegment", + "TranscriptionWord", + "SpeechRequest", + "SpeechResponse", + "CreateVoiceRequest", + "VoiceResponse", + "VoiceConversionRequest", + "VoiceConversionResponse", + "Generation3DRequest", + "Generation3DResponse", + "VisionRequest", + "VisionResponse", + "VisionData", + "VisionLabel", + "MultimodalEmbeddingRequest", + "MultimodalEmbeddingResponse", + "MultimodalEmbeddingData", + "ChatDelta", + "ChatStreamChoice", + "ChatCompletionChunk", + "FileModel", + "ImageFileModel", + "AudioFileModel", + "VideoFileModel", + "ThreeDFileModel", ] diff --git a/apipod/common/schemas/media_files.py b/apipod/common/schemas/media_files.py deleted file mode 100644 index 8545800..0000000 --- a/apipod/common/schemas/media_files.py +++ /dev/null @@ -1,96 +0,0 @@ -from pydantic import BaseModel, AnyUrl, model_validator -from typing import Union, Optional -import json - - -class FileModel(BaseModel): - """ - Wire-format mirror of a media-toolkit file: name, content type and the - content itself as base64 or URL. Plain strings (URL / base64) and - media-toolkit file objects are coerced automatically so the model can be - used directly as a field type in request and response schemas. - """ - - file_name: str - content_type: str - content: Union[str, bytes, AnyUrl] # base64 encoded or url - max_size_mb: Optional[float] = 4000 - - @model_validator(mode="before") - @classmethod - def _coerce_input(cls, value): - if isinstance(value, str): - stripped = value.strip() - if stripped.startswith("{"): - try: - parsed = json.loads(stripped) - if isinstance(parsed, dict): - return parsed - except (json.JSONDecodeError, TypeError): - pass - return {"file_name": "file", "content_type": "application/octet-stream", "content": value} - if isinstance(value, FileModel): - # Re-validate a (sibling/parent) FileModel against the concrete field type. - return value if isinstance(value, cls) else value.model_dump() - if not isinstance(value, (dict, BaseModel)) and hasattr(value, "to_json"): - # media-toolkit files serialize to {file_name, content_type, content}. - return value.to_json() - return value - - class Config: - json_schema_extra = { - "x-media-type": "MediaFile", - "example": { - "file_name": "example.csv", - "content_type": "text/csv", - "content": "https://example.com/example.csv", - } - } - - -class ImageFileModel(FileModel): - class Config: - json_schema_extra = { - "x-media-type": "ImageFile", - "example": { - "file_name": "example.png", - "content_type": "image/png", - "content": "base64 encoded image data", - } - } - - -class AudioFileModel(FileModel): - class Config: - json_schema_extra = { - "x-media-type": "AudioFile", - "example": { - "file_name": "example.mp3", - "content_type": "audio/mpeg", - "content": "base64 encoded audio data", - } - } - - -class VideoFileModel(FileModel): - class Config: - json_schema_extra = { - "x-media-type": "VideoFile", - "example": { - "file_name": "example.mp4", - "content_type": "video/mp4", - "content": "base64 encoded video data", - } - } - - -class ThreeDFileModel(FileModel): - class Config: - json_schema_extra = { - "x-media-type": "3DFile", - "example": { - "file_name": "example.glb", - "content_type": "model/gltf-binary", - "content": "base64 encoded 3D model data", - } - } diff --git a/apipod/common/schemas/schemas.py b/apipod/common/schemas/schemas.py deleted file mode 100644 index 506d385..0000000 --- a/apipod/common/schemas/schemas.py +++ /dev/null @@ -1,448 +0,0 @@ -""" -Standard request / response schemas for APIPod services. - -The shape of every schema in this file mirrors the OpenAI API so that -clients written against the OpenAI SDK (or any OpenAI-compatible tool) -can talk to an APIPod service without translation. That choice is about -the wire format; it does NOT imply the schemas are tied to OpenAI's own -models. Any provider (Flux, Stable Diffusion, ElevenLabs, Whisper, Suno, -DeepSeek, etc.) plugs into the same schemas and the routing layer -dispatches to whatever runs behind it. - -`model` is optional on every request: an APIPod service typically serves -exactly one model, so forcing clients to repeat its name adds nothing. -""" - -from typing import Any, Dict, List, Literal, Optional, Union -from pydantic import BaseModel, Field - -from .media_files import FileModel, ImageFileModel, AudioFileModel, VideoFileModel, ThreeDFileModel - - -# ===================================================== -# Base schema -# ===================================================== - -class APIPodSchemaBase(BaseModel): - """ - Base for every APIPod request / response model. - - Shape follows the OpenAI API spec so OpenAI-compatible clients work - out of the box, but the schemas are provider-agnostic: anything that - matches the shape (Flux, SD, ElevenLabs, Whisper, in-house models...) - is a valid backend. - - Media fields are declared with the FileModel variants (ImageFileModel, - AudioFileModel, ...) which accept uploads, FileModel JSON objects, URLs - and base64 strings. At runtime the file-handling layer replaces them - with parsed media-toolkit objects before the endpoint function runs. - - Serialization omits optional fields that are ``None`` so wire JSON matches - OpenAI-style responses (no ``"model": null`` or ``"usage": null`` keys). - Pass ``exclude_none=False`` to :meth:`model_dump` / :meth:`model_dump_json` - when you need explicit nulls. - """ - - model_config = { - "extra": "forbid", - "validate_assignment": True, - "populate_by_name": True, - "arbitrary_types_allowed": True - } - - def model_dump(self, **kwargs: Any) -> Dict[str, Any]: - kwargs.setdefault("exclude_none", True) - return super().model_dump(**kwargs) - - def model_dump_json(self, **kwargs: Any) -> str: - kwargs.setdefault("exclude_none", True) - return super().model_dump_json(**kwargs) - - -# ===================================================== -# Chat Completions - Input schemas -# ===================================================== - - -class ChatMessage(APIPodSchemaBase): - role: Literal["system", "user", "assistant"] = Field(description="The role of the message author (system, user, or assistant).") - content: str = Field(description="The content of the message.") - - -class ChatCompletionRequest(APIPodSchemaBase): - messages: List[ChatMessage] = Field(description="A list of messages comprising the conversation history.") - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - - temperature: float = Field(default=0.7, description="Sampling temperature between 0.0 and 2.0. Higher values make output more random.") - max_tokens: Optional[int] = Field(default=None, description="The maximum number of tokens to generate in the completion.") - top_p: float = Field(default=1.0, description="Nucleus sampling threshold. Only tokens with cumulative probability >= top_p are considered.") - n: int = Field(default=1, description="How many completions to generate for each prompt.") - stream: bool = Field(default=False, description="If set, partial message deltas will be sent as server-sent events.") - stop: Optional[Union[str, List[str]]] = Field(default=None, description="Up to 4 sequences where the API will stop generating further tokens.") - presence_penalty: float = Field(default=0.0, description="Penalty for new tokens based on whether they appear in the text so far.") - frequency_penalty: float = Field(default=0.0, description="Penalty for new tokens based on their existing frequency in the text so far.") - user: Optional[str] = Field(default=None, description="A unique identifier representing your end-user.") - - -# ===================================================== -# Text Completion - Input schemas -# ===================================================== - -class CompletionRequest(APIPodSchemaBase): - prompt: Union[str, List[str]] = Field(description="The prompt(s) to generate completions for.") - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - - temperature: float = Field(default=0.7, description="Sampling temperature between 0.0 and 2.0.") - max_tokens: int = Field(default=16, description="The maximum number of tokens to generate.") - top_p: float = Field(default=1.0, description="Nucleus sampling threshold.") - n: int = Field(default=1, description="How many completions to generate.") - stream: bool = Field(default=False, description="Whether to stream partial progress.") - stop: Optional[Union[str, List[str]]] = Field(default=None, description="Sequences where the API will stop generating.") - - -# ===================================================== -# Embedding - Input schemas -# ===================================================== - -class EmbeddingRequest(APIPodSchemaBase): - input: Union[str, List[str]] = Field(description="The input text to embed.") - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - user: Optional[str] = Field(default=None, description="A unique identifier representing your end-user.") - - -# ===================================================== -# Image Generation - Input schemas -# ===================================================== - -class ImageGenerationRequest(APIPodSchemaBase): - prompt: str = Field(description="A text description of the desired image(s).") - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - - negative_prompt: Optional[str] = Field(default=None, description="A text description of what to exclude from the generated image.") - image: Optional[ImageFileModel] = Field(default=None, description="An optional reference image for image-to-image or inpainting tasks.") - mask: Optional[ImageFileModel] = Field(default=None, description="An optional mask image for inpainting, where white pixels indicate areas to edit.") - size: Optional[str] = Field(default=None, description="The size of the generated images, e.g. 1024x1024.") - num_images: int = Field(default=1, description="The number of images to generate.") - seed: Optional[int] = Field(default=None, description="Random seed for reproducible generation.") - steps: Optional[int] = Field(default=None, description="The number of inference steps to perform.") - - -# ===================================================== -# Video Generation - Input schemas -# ===================================================== - -class VideoGenerationRequest(APIPodSchemaBase): - prompt: str = Field(description="A text description of the desired video.") - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - - image: Optional[ImageFileModel] = Field(default=None, description="An optional reference image (frame0) to start the video from.") - duration_s: float = Field(default=5.0, description="The desired duration of the video in seconds.") - fps: int = Field(default=24, description="Frames per second for the generated video.") - aspect_ratio: Optional[str] = Field(default=None, description="The aspect ratio of the generated video, e.g. 16:9.") - seed: Optional[int] = Field(default=None, description="Random seed for reproducible generation.") - stream: bool = Field(default=False, description="If set, the generated video is streamed back as raw bytes instead of a JSON response.") - - -# ===================================================== -# Audio - Input schemas (transcription, speech, voices) -# ===================================================== - -class TranscriptionRequest(APIPodSchemaBase): - """Speech-to-text. Mirrors OpenAI POST /audio/transcriptions ('file' is called 'audio' here).""" - - audio: AudioFileModel = Field(description="The audio file to transcribe. Accepts uploads, FileModel objects, URLs or base64.") - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: only specify if you serve multiple models.") - - language: Optional[str] = Field(default=None, description="The language of the input audio in ISO-639-1 format (e.g. 'en'). Improves accuracy and latency.") - prompt: Optional[str] = Field(default=None, description="Optional text to guide the model's style or to continue a previous audio segment.") - response_format: Literal["json", "verbose_json"] = Field(default="json", description="Format of the transcript output.") - timestamp_granularities: Optional[List[Literal["word", "segment"]]] = Field(default=None, description="Timestamp detail to include; requires response_format='verbose_json'.") - stream: bool = Field(default=False, description="If set, partial transcript deltas will be sent as server-sent events.") - - -class SpeechRequest(APIPodSchemaBase): - """Text-to-speech. Mirrors OpenAI POST /audio/speech.""" - - input: str = Field(description="The text to generate audio for.") - voice: Optional[Union[str, AudioFileModel]] = Field(default=None, description="A named voice of the service OR a reference audio / voice embedding file for voice cloning.") - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - - instructions: Optional[str] = Field(default=None, description="Additional instructions to control voice, emotion or style.") - response_format: Literal["mp3", "wav", "opus", "flac", "pcm"] = Field(default="mp3", description="The desired output audio format.") - speed: float = Field(default=1.0, description="Playback speed of the generated audio (0.25 to 4.0).") - stream: bool = Field(default=False, description="If set, the generated audio is streamed back as raw audio chunks instead of a JSON response.") - - -class CreateVoiceRequest(APIPodSchemaBase): - """Voice cloning: create a reusable voice (embedding) from an audio sample. Mirrors OpenAI POST /audio/voices.""" - - name: str = Field(description="A name for the new voice.") - audio_sample: AudioFileModel = Field(description="A clean speech sample (~5-20s) of the voice to clone.") - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - - -class VoiceConversionRequest(APIPodSchemaBase): - """Voice-to-voice: re-render existing audio with another voice (named, sample or embedding).""" - - audio: AudioFileModel = Field(description="The audio whose content should be kept.") - voice: Union[str, AudioFileModel] = Field(description="The target voice: a named voice of the service OR a reference audio / voice embedding file.") - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - - -# ===================================================== -# 3D Generation - Input schemas -# ===================================================== - -class Generation3DRequest(APIPodSchemaBase): - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - - prompt: Optional[str] = Field(default=None, description="A text description of the 3D object to generate.") - image: Optional[ImageFileModel] = Field(default=None, description="An optional reference image to generate the 3D object from.") - output_format: str = Field(default="glb", description="The desired 3D output format (glb, obj, fbx, etc.).") - seed: Optional[int] = Field(default=None, description="Random seed for reproducible generation.") - - -# ===================================================== -# Vision - Input schemas (classify, detect, OCR) -# ===================================================== - -class VisionRequest(APIPodSchemaBase): - image: ImageFileModel = Field(description="The image to process for vision tasks.") - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - - labels: Optional[List[str]] = Field(default=None, description="Optional list of labels to look for (e.g. for object detection).") - threshold: Optional[float] = Field(default=None, description="Confidence threshold for detection or classification.") - return_boxes: bool = Field(default=False, description="Whether to return bounding box coordinates for detected objects.") - - -# ===================================================== -# Multimodal Embedding - Input schemas -# ===================================================== - -class MultimodalEmbeddingRequest(APIPodSchemaBase): - model: Optional[str] = Field(default=None, description="ID of the model to use. Optional: an APIPod service usually serves exactly one model.") - - input: Optional[Union[str, List[str]]] = Field(default=None, description="The input text to embed.") - image: Optional[ImageFileModel] = Field(default=None, description="The input image to embed.") - audio: Optional[AudioFileModel] = Field(default=None, description="The input audio to embed.") - user: Optional[str] = Field(default=None, description="A unique identifier representing your end-user.") - - -# ===================================================== -# Shared output schemas -# ===================================================== - -class Usage(APIPodSchemaBase): - prompt_tokens: int = Field(description="Number of tokens in the prompt.") - completion_tokens: Optional[int] = Field(default=None, description="Number of tokens in the generated completion.") - total_tokens: int = Field(description="Total number of tokens used in the request (prompt + completion).") - - -# ===================================================== -# Chat Completions - Output schemas -# ===================================================== - -class ChatCompletionMessage(APIPodSchemaBase): - role: Literal["assistant"] = Field(default="assistant", description="The role of the message author, always 'assistant'.") - content: str = Field(description="The content of the message.") - - -class ChatCompletionChoice(APIPodSchemaBase): - index: int = Field(description="The index of the choice in the list of choices.") - message: ChatCompletionMessage = Field(description="A chat completion message generated by the model.") - finish_reason: Literal["stop", "length", "content_filter"] = Field(description="The reason the model stopped generating tokens.") - - -class ChatCompletionResponse(APIPodSchemaBase): - object: Literal["chat.completion"] = Field(default="chat.completion", description="The object type, always 'chat.completion'.") - created: int = Field(description="The Unix timestamp when the chat completion was created.") - model: Optional[str] = Field(default=None, description="The model used for the chat completion.") - choices: List[ChatCompletionChoice] = Field(description="A list of chat completion choices.") - usage: Optional[Usage] = Field(default=None, description="Usage statistics for the completion request.") - - -# ===================================================== -# Text Completion - Output schemas -# ===================================================== - -class CompletionChoice(APIPodSchemaBase): - text: str = Field(description="The generated completion text.") - index: int = Field(description="The index of the choice in the list of choices.") - logprobs: None = None - finish_reason: Literal["stop", "length", "content_filter"] = Field(description="The reason the model stopped generating tokens.") - - -class CompletionResponse(APIPodSchemaBase): - object: Literal["text_completion"] = Field(default="text_completion", description="The object type, always 'text_completion'.") - created: int = Field(description="The Unix timestamp when the completion was created.") - model: Optional[str] = Field(default=None, description="The model used for the completion.") - choices: List[CompletionChoice] = Field(description="A list of completion choices.") - usage: Optional[Usage] = Field(default=None, description="Usage statistics for the completion request.") - - -# ===================================================== -# Embedding - Output schemas -# ===================================================== - -class EmbeddingData(APIPodSchemaBase): - object: Literal["embedding"] = Field(default="embedding", description="The object type, always 'embedding'.") - embedding: List[float] = Field(description="The embedding vector.") - index: int = Field(description="The index of the embedding in the list of inputs.") - - -class EmbeddingResponse(APIPodSchemaBase): - object: Literal["list"] = Field(default="list", description="The object type, always 'list'.") - data: List[EmbeddingData] = Field(description="The list of embedding data objects.") - model: Optional[str] = Field(default=None, description="The model used for generating embeddings.") - usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") - - -# ===================================================== -# Image Generation - Output schemas -# ===================================================== - -class ImageGenerationResponse(APIPodSchemaBase): - object: Literal["image_generation"] = Field(default="image_generation", description="The object type, always 'image_generation'.") - created: int = Field(description="The Unix timestamp when the generation was created.") - model: Optional[str] = Field(default=None, description="The model used for generation.") - data: List[ImageFileModel] = Field(description="The generated image data.") - usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") - - -# ===================================================== -# Video Generation - Output schemas -# ===================================================== - -class VideoGenerationResponse(APIPodSchemaBase): - object: Literal["video_generation"] = Field(default="video_generation", description="The object type, always 'video_generation'.") - created: int = Field(description="The Unix timestamp when the generation was created.") - model: Optional[str] = Field(default=None, description="The model used for generation.") - data: List[VideoFileModel] = Field(description="The generated video data.") - usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") - - -# ===================================================== -# Audio - Output schemas (transcription, speech, voices) -# ===================================================== - -class TranscriptionWord(APIPodSchemaBase): - word: str = Field(description="The transcribed word.") - start: float = Field(description="Start time of the word in seconds.") - end: float = Field(description="End time of the word in seconds.") - - -class TranscriptionSegment(APIPodSchemaBase): - id: int = Field(default=0, description="Index of the segment.") - start: float = Field(description="Start time of the segment in seconds.") - end: float = Field(description="End time of the segment in seconds.") - text: str = Field(description="The transcribed text of the segment.") - - -class TranscriptionResponse(APIPodSchemaBase): - """Mirrors the OpenAI transcription object: plain `text` plus optional verbose details.""" - text: str = Field(description="The transcribed text.") - language: Optional[str] = Field(default=None, description="The detected or requested language of the audio.") - duration: Optional[float] = Field(default=None, description="Duration of the input audio in seconds.") - segments: Optional[List[TranscriptionSegment]] = Field(default=None, description="Segment-level details (verbose_json).") - words: Optional[List[TranscriptionWord]] = Field(default=None, description="Word-level timestamps (verbose_json).") - usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") - - -class AudioEnvelopeBase(APIPodSchemaBase): - """Shared envelope for endpoints that return audio files (speech synthesis, voice conversion).""" - created: int = Field(description="The Unix timestamp when the response was created.") - model: Optional[str] = Field(default=None, description="The model used for the task.") - data: List[AudioFileModel] = Field(description="The resulting audio file(s).") - usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") - - -class SpeechResponse(AudioEnvelopeBase): - object: Literal["audio.speech"] = Field(default="audio.speech", description="The object type, always 'audio.speech'.") - - -class VoiceConversionResponse(AudioEnvelopeBase): - object: Literal["audio.conversion"] = Field(default="audio.conversion", description="The object type, always 'audio.conversion'.") - - -class VoiceResponse(APIPodSchemaBase): - """A created (cloned) voice, optionally carrying its embedding file (e.g. a SpeechCraft .npz).""" - id: str = Field(description="Unique identifier of the voice.") - object: Literal["audio.voice"] = Field(default="audio.voice", description="The object type, always 'audio.voice'.") - name: str = Field(description="The name of the voice.") - created: int = Field(description="The Unix timestamp when the voice was created.") - model: Optional[str] = Field(default=None, description="The model used to create the voice.") - embedding: Optional[FileModel] = Field(default=None, description="The voice embedding file, if the service exposes it for reuse.") - - -# ===================================================== -# 3D Generation - Output schemas -# ===================================================== - -class Generation3DResponse(APIPodSchemaBase): - object: Literal["generation_3d"] = Field(default="generation_3d", description="The object type, always 'generation_3d'.") - created: int = Field(description="The Unix timestamp when the response was created.") - model: Optional[str] = Field(default=None, description="The model used for generation.") - data: List[ThreeDFileModel] = Field(description="The generated 3D data.") - usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") - - -# ===================================================== -# Vision - Output schemas (classify, detect, OCR) -# ===================================================== - -class VisionLabel(APIPodSchemaBase): - label: str = Field(description="The label of the detected object or classification.") - score: float = Field(description="The confidence score of the detection or classification.") - box: Optional[List[float]] = Field(default=None, description="The bounding box coordinates [ymin, xmin, ymax, xmax], if applicable.") - - -class VisionData(APIPodSchemaBase): - labels: List[VisionLabel] = Field(default_factory=list, description="A list of detected labels and scores.") - text: Optional[str] = Field(default=None, description="The extracted text from OCR, if applicable.") - - -class VisionResponse(APIPodSchemaBase): - object: Literal["vision"] = Field(default="vision", description="The object type, always 'vision'.") - created: int = Field(description="The Unix timestamp when the response was created.") - model: Optional[str] = Field(default=None, description="The model used for the vision task.") - data: List[VisionData] = Field(description="The resulting vision data.") - usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") - - -# ===================================================== -# Multimodal Embedding - Output schemas -# ===================================================== - -class MultimodalEmbeddingData(APIPodSchemaBase): - object: Literal["embedding"] = Field(default="embedding", description="The object type, always 'embedding'.") - embedding: List[float] = Field(description="The embedding vector.") - index: int = Field(description="The index of the embedding in the list of inputs.") - modality: Optional[Literal["text", "image", "audio"]] = Field(default=None, description="The modality of the input that generated this embedding.") - - -class MultimodalEmbeddingResponse(APIPodSchemaBase): - object: Literal["list"] = Field(default="list", description="The object type, always 'list'.") - data: List[MultimodalEmbeddingData] = Field(description="The list of embedding data objects.") - model: Optional[str] = Field(default=None, description="The model used for generating embeddings.") - usage: Optional[Usage] = Field(default=None, description="Token usage information, if applicable.") - - -# ====================================================== -# Streaming Models -# ====================================================== -class ChatDelta(BaseModel): - content: Optional[str] = None - - -class ChatStreamChoice(BaseModel): - index: int - delta: ChatDelta - finish_reason: Optional[str] = None - - -class ChatCompletionChunk(BaseModel): - id: str - object: Literal["chat.completion.chunk"] = "chat.completion.chunk" - created: int - model: Optional[str] = None - choices: List[ChatStreamChoice] diff --git a/apipod/common/settings.py b/apipod/common/settings.py index 8aecf42..dfa68c0 100644 --- a/apipod/common/settings.py +++ b/apipod/common/settings.py @@ -24,4 +24,4 @@ # from APIPOD_COMPUTE / APIPOD_PROVIDER. SOCAITY_DEPLOYMENT_CERT = environ.get("SOCAITY_DEPLOYMENT_CERT", "") _EXPECTED_CERT_HASH = "7b35ca9da2f0c280d48f66c780a0a0d5d3f8ad8a" -IS_MANAGED_DEPLOYMENT = SOCAITY_DEPLOYMENT_CERT == _EXPECTED_CERT_HASH +IS_MANAGED_DEPLOYMENT = SOCAITY_DEPLOYMENT_CERT == _EXPECTED_CERT_HASH \ No newline at end of file diff --git a/apipod/engine/backend/fastapi/file_handling_mixin.py b/apipod/engine/backend/fastapi/file_handling_mixin.py index 658d897..094a8b8 100644 --- a/apipod/engine/backend/fastapi/file_handling_mixin.py +++ b/apipod/engine/backend/fastapi/file_handling_mixin.py @@ -3,7 +3,7 @@ from typing import Any, Union, get_args, get_origin, Callable, List, Dict from apipod.engine.backend.fastapi.LimitedUploadFile import LimitedUploadFile from apipod.engine.signatures.upload import is_param_media_toolkit_file -from apipod.common.schemas.media_files import FileModel, ImageFileModel, AudioFileModel, VideoFileModel +from socaity_schemas import AudioFileModel, FileModel, ImageFileModel, VideoFileModel from apipod.engine.signatures.policies import FastAPISignaturePolicies from apipod.engine.files.base_file_mixin import _BaseFileHandlingMixin from apipod.engine.utils import replace_func_signature diff --git a/apipod/engine/backend/schema_resolve.py b/apipod/engine/backend/schema_resolve.py index b131d39..5bf86fd 100644 --- a/apipod/engine/backend/schema_resolve.py +++ b/apipod/engine/backend/schema_resolve.py @@ -30,7 +30,36 @@ from pydantic.json_schema import SkipJsonSchema from media_toolkit import MediaFile -from apipod.common.schemas import * +from socaity_schemas import ( + ChatCompletionChunk, + ChatCompletionChoice, + ChatCompletionRequest, + ChatCompletionResponse, + ChatDelta, + ChatStreamChoice, + CompletionRequest, + CompletionResponse, + CreateVoiceRequest, + EmbeddingRequest, + EmbeddingResponse, + Generation3DRequest, + Generation3DResponse, + ImageGenerationRequest, + ImageGenerationResponse, + MultimodalEmbeddingRequest, + MultimodalEmbeddingResponse, + SpeechRequest, + SpeechResponse, + TranscriptionRequest, + TranscriptionResponse, + VideoGenerationRequest, + VideoGenerationResponse, + VisionRequest, + VisionResponse, + VoiceConversionRequest, + VoiceConversionResponse, + VoiceResponse, +) from apipod.engine.files.base_file_mixin import parse_schema_media_fields from apipod.engine.signatures.analysis import is_injected_progress_param diff --git a/apipod/engine/files/base_file_mixin.py b/apipod/engine/files/base_file_mixin.py index 5378e17..c6f78d9 100644 --- a/apipod/engine/files/base_file_mixin.py +++ b/apipod/engine/files/base_file_mixin.py @@ -8,7 +8,7 @@ from media_toolkit import media_from_any, MediaFile, MediaList, MediaDict, ImageFile, AudioFile, VideoFile from apipod.engine.signatures.upload import is_param_media_toolkit_file -from apipod.common.schemas.media_files import FileModel, ImageFileModel, AudioFileModel, VideoFileModel +from socaity_schemas import AudioFileModel, FileModel, ImageFileModel, VideoFileModel from apipod.common.exceptions import FileUploadException diff --git a/apipod/engine/jobs/job_result.py b/apipod/engine/jobs/job_result.py index 972d511..1f6ccc5 100644 --- a/apipod/engine/jobs/job_result.py +++ b/apipod/engine/jobs/job_result.py @@ -11,7 +11,7 @@ from apipod.engine.signatures.upload import is_param_media_toolkit_file from media_toolkit import IMediaContainer from media_toolkit.utils.data_type_utils import is_file_model_dict -from apipod.common.schemas.media_files import FileModel +from socaity_schemas import FileModel logger = logging.getLogger(__name__) diff --git a/docs/TECHNICAL_README.md b/docs/TECHNICAL_README.md index ff6c3fb..ac815ee 100644 --- a/docs/TECHNICAL_README.md +++ b/docs/TECHNICAL_README.md @@ -23,8 +23,7 @@ apipod/ │ ├── settings.py # Env-driven config (APIPOD_SIMULATE / _DIRECT / _COMPUTE / _PROVIDER, cert, host, port) │ ├── constants.py # Enums: COMPUTE, PROVIDER, SERVER_HEALTH │ └── schemas/ -│ ├── schemas.py # Standardized request/response models (OpenAI-compatible shapes) -│ └── media_files.py # FileModel + typed variants: pydantic mirrors of media-toolkit files +│ └── __init__.py # Re-exports from socaity-schemas (OpenAI-compatible request/response + FileModel) ├── engine/ │ ├── base_backend.py # Shared backend base (title, version, health) │ ├── endpoint_config.py # EndpointExecutionPlan + configurator (how to register an endpoint) @@ -92,7 +91,7 @@ On the way out, `JobResultFactory._serialize_result` converts returned `MediaFil ### Standardized schemas -`common/schemas/schemas.py` defines request/response pairs for: chat completion, text completion, embeddings, image generation, video generation, transcription, speech (TTS), voice creation, voice conversion, 3D generation, vision, and multimodal embeddings. `model` is optional on every request, since an APIPod service typically serves exactly one model. The audio API is split per use case, mirroring OpenAI: `TranscriptionRequest` (STT), `SpeechRequest` (TTS, with `voice` as a named voice or a cloning reference file), `CreateVoiceRequest` (voice cloning → embedding) and `VoiceConversionRequest` (voice2voice). +`socaity-schemas` (re-exported at ``apipod.common.schemas``) defines request/response pairs for: chat completion, text completion, embeddings, image generation, video generation, transcription, speech (TTS), voice creation, voice conversion, 3D generation, vision, and multimodal embeddings. `model` is optional on every request, since an APIPod service typically serves exactly one model. The audio API is split per use case, mirroring OpenAI: `TranscriptionRequest` (STT), `SpeechRequest` (TTS, with `voice` as a named voice or a cloning reference file), `CreateVoiceRequest` (voice cloning → embedding) and `VoiceConversionRequest` (voice2voice). `SCHEMA_REGISTRY` in `engine/schema_extension/schema_mixin.py` is the single source of truth: it maps each request schema to a `SchemaEndpointSpec` (response model, tag). Everything else derives from it — `engine/signatures/policies.py` builds `SUPPORTED_REQUEST_SCHEMAS` from the registry keys (schema-annotated parameters are read from the JSON body while plain parameters stay form-encoded), and both routers detect schema endpoints with `get_schema_binding`, which finds the schema-typed parameter by annotation regardless of its name (subclasses of registered schemas are also detected, so services can extend a schema with custom fields). Schema endpoints may not declare additional user parameters; put extra inputs on the schema or a schema subclass. diff --git a/pyproject.toml b/pyproject.toml index f7c9f54..2abc96d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,7 @@ dependencies = [ "fastapi", 'python-multipart>=0.0.20', "media-toolkit>=0.02.22", + "socaity-schemas>=0.0.1", "jinja2", "toml" ] @@ -42,11 +43,8 @@ Homepage = "https://www.socaity.ai" [tool.pytest.ini_options] testpaths = ["test"] -# Make `import apipod` resolve to the in-repo source (not an installed copy) and -# let test modules import the shared `conftest` helpers and `services` package by -# name. The sibling fastsdk entry is used in local dev when the repo is checked -# out next to apipod; it is silently ignored in CI where fastsdk comes from pip. -pythonpath = [".", "test", "../fastsdk"] +# Resolve in-repo apipod and sibling packages in local dev (CI installs from pip). +pythonpath = [".", "test", "../fastsdk", "../socaity-schemas"] [tool.ruff] line-length = 120 From 0209eb734d711ef768d5202bb67143ce44b31b5e Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Mon, 29 Jun 2026 19:32:38 +0200 Subject: [PATCH 28/38] utm link --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e2406e4..2ac9733 100644 --- a/README.md +++ b/README.md @@ -231,6 +231,8 @@ client.text_to_speech("what a time to be alive") - MCP protocol support. --- +

    - Made with ❤️ by SocAIty -

    + Made with ❤️ by SocAIty +

    Remember: Existence is pain to a Meseex, but task completion brings them joy!

    +

    \ No newline at end of file From 39d466276a7b9b1d949426b4d7594a0835529255 Mon Sep 17 00:00:00 2001 From: w4hns1nn Date: Mon, 29 Jun 2026 19:33:11 +0200 Subject: [PATCH 29/38] footer --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 2ac9733..29342c6 100644 --- a/README.md +++ b/README.md @@ -234,5 +234,4 @@ client.text_to_speech("what a time to be alive")

    Made with ❤️ by SocAIty -

    Remember: Existence is pain to a Meseex, but task completion brings them joy!

    \ No newline at end of file From 037ad9a719ae023382b9be8fd7e84a86f17bd894 Mon Sep 17 00:00:00 2001 From: Carlos Reyes Date: Wed, 1 Jul 2026 09:16:07 +0200 Subject: [PATCH 30/38] feat(endpoint-config): honor gateway streaming metadata in execution plan Gateway-generated handlers are not async generators, so signature inspection alone cannot detect streaming endpoints. Expose GATEWAY_SUPPORTS_STREAMING_ATTR and let build_plan() treat handlers marked by registry metadata as streaming. Co-authored-by: Cursor --- apipod/engine/endpoint_config.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apipod/engine/endpoint_config.py b/apipod/engine/endpoint_config.py index 71fd96b..5282451 100644 --- a/apipod/engine/endpoint_config.py +++ b/apipod/engine/endpoint_config.py @@ -8,6 +8,9 @@ from apipod.engine.backend.schema_resolve import SchemaBinding, get_schema_binding from apipod.engine.signatures.analysis import is_streaming_endpoint +# Set on dynamically built gateway handlers when registry metadata marks streaming. +GATEWAY_SUPPORTS_STREAMING_ATTR = "__gateway_supports_streaming__" + @dataclass(frozen=True) class EndpointExecutionPlan: @@ -65,5 +68,8 @@ def build_plan( route_args=route_args, route_kwargs=route_kwargs if route_kwargs is not None else {}, schema_binding=schema_binding, - is_streaming=is_streaming_endpoint(func, schema_binding), + is_streaming=( + is_streaming_endpoint(func, schema_binding) + or bool(getattr(func, GATEWAY_SUPPORTS_STREAMING_ATTR, False)) + ), ) From 2edf791080fdf4bf75987ed07444453a130198ed Mon Sep 17 00:00:00 2001 From: Carlos Reyes Date: Wed, 1 Jul 2026 09:16:07 +0200 Subject: [PATCH 31/38] fix(schema-resolve): allow FastAPI dependency params on schema endpoints Skip Security, Query, Body, and other FastAPI-injected parameters when validating schema endpoint signatures so dynamically built gateway handlers can carry auth context alongside the request model. Co-authored-by: Cursor --- apipod/engine/backend/schema_resolve.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apipod/engine/backend/schema_resolve.py b/apipod/engine/backend/schema_resolve.py index 5bf86fd..9e5f9a8 100644 --- a/apipod/engine/backend/schema_resolve.py +++ b/apipod/engine/backend/schema_resolve.py @@ -62,6 +62,7 @@ ) from apipod.engine.files.base_file_mixin import parse_schema_media_fields from apipod.engine.signatures.analysis import is_injected_progress_param +from apipod.engine.signatures.policies import FastAPISignaturePolicies @dataclass(frozen=True) @@ -229,7 +230,9 @@ def _validate_schema_endpoint_signature(func: Callable, binding: SchemaBinding) extra = [ param.name for param in inspect.signature(func).parameters.values() - if param.name != binding.param_name and not _is_injected_param(param) + if param.name != binding.param_name + and not _is_injected_param(param) + and not FastAPISignaturePolicies.is_fastapi_dependency(param) ] if extra: raise TypeError( From d2b5b03405d776b64daba8acb49efb65112a20eb Mon Sep 17 00:00:00 2001 From: Carlos Reyes Date: Wed, 1 Jul 2026 09:16:07 +0200 Subject: [PATCH 32/38] fix(router): delegate job status to queue get_job_result override Remote job queues such as the gateway RedisJobQueue build JobResult from ServiceJob records without a job_function. Use the queue override when present and guard the default path when job_function is missing. Co-authored-by: Cursor --- apipod/engine/backend/fastapi/router.py | 31 ++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index 4e42f1a..4e4d76d 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -11,6 +11,7 @@ from apipod.common.settings import APIPOD_PORT, APIPOD_HOST from apipod.common.constants import SERVER_HEALTH from apipod.engine.jobs.job_result import JobResultFactory, JobResult +from apipod.engine.queue.job_queue_interface import JobQueueInterface from apipod.engine.endpoint_config import build_plan, EndpointExecutionPlan from apipod.engine.streaming.stream_serializer import build_stream_producer from apipod.engine.base_backend import _BaseBackend @@ -189,15 +190,29 @@ def get_job(self, job_id: str, return_format: str = 'json') -> JobResult: if self.job_queue is None: return JobResultFactory.job_not_found(job_id) - job = self.job_queue.get_job(job_id) - if job is None: - return JobResultFactory.job_not_found(job_id) + # Remote queues (e.g. gateway RedisJobQueue) override get_job_result to + # build JobResult from ServiceJob records that have no job_function. + queue_get_job_result = getattr(type(self.job_queue), "get_job_result", None) + if queue_get_job_result is not JobQueueInterface.get_job_result: + ret_job = self.job_queue.get_job_result(job_id) + else: + job = self.job_queue.get_job(job_id) + if job is None: + return JobResultFactory.job_not_found(job_id) + + job_function = getattr(job, "job_function", None) + ret_job = JobResultFactory.from_base_job( + job, + include_stream_link=( + self._include_stream_link_for(job_function) + if job_function is not None + else False + ), + link_prefix=self.prefix, + ) - ret_job = JobResultFactory.from_base_job( - job, - include_stream_link=self._include_stream_link_for(job.job_function), - link_prefix=self.prefix, - ) + if ret_job is None: + return JobResultFactory.job_not_found(job_id) if return_format != 'json': ret_job = JobResultFactory.gzip_job_result(ret_job) From 9250912cd39b648aab54c7e80cb70ceb58a45e2b Mon Sep 17 00:00:00 2001 From: Carlos Reyes Date: Wed, 1 Jul 2026 10:59:28 +0200 Subject: [PATCH 33/38] fix(schema-resolve): lazy-import FastAPISignaturePolicies to avoid circular import Move the policies import inside _validate_schema_endpoint_signature so schema_resolve and signatures.policies do not import each other at module load time. Co-authored-by: Cursor --- apipod/engine/backend/schema_resolve.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apipod/engine/backend/schema_resolve.py b/apipod/engine/backend/schema_resolve.py index 9e5f9a8..bb3a1e0 100644 --- a/apipod/engine/backend/schema_resolve.py +++ b/apipod/engine/backend/schema_resolve.py @@ -62,7 +62,6 @@ ) from apipod.engine.files.base_file_mixin import parse_schema_media_fields from apipod.engine.signatures.analysis import is_injected_progress_param -from apipod.engine.signatures.policies import FastAPISignaturePolicies @dataclass(frozen=True) @@ -227,6 +226,8 @@ def _is_injected_param(param: inspect.Parameter) -> bool: def _validate_schema_endpoint_signature(func: Callable, binding: SchemaBinding) -> None: """Reject schema endpoints that declare user parameters besides the request schema.""" + from apipod.engine.signatures.policies import FastAPISignaturePolicies + extra = [ param.name for param in inspect.signature(func).parameters.values() From 1d24f1c9e6729bc23a291737ad5f5305bbd2ef92 Mon Sep 17 00:00:00 2001 From: Carlos Reyes Date: Wed, 1 Jul 2026 12:08:15 +0200 Subject: [PATCH 34/38] fix(router): skip schema wrap for EnqueuePayload on queued endpoints Remote job queues invoke wrapped handlers at submit time and return submission metadata instead of inference output. Introduce a generic EnqueuePayload marker so integrators opt out of response-model coercion without coupling APIPod to platform-specific job param types. Co-authored-by: Cursor --- apipod/engine/backend/fastapi/router.py | 8 +++++++- apipod/engine/jobs/enqueue_payload.py | 18 ++++++++++++++++++ test/test_schemas.py | 24 ++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 apipod/engine/jobs/enqueue_payload.py diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index 4e4d76d..cb23557 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -21,6 +21,7 @@ from apipod.engine.utils import normalize_name, normalize_mount_prefix from apipod.engine.backend.fastapi.exception_handling import _FastAPIExceptionHandler from apipod.engine.backend.schema_resolve import wrap_schema_response +from apipod.engine.jobs.enqueue_payload import is_enqueue_payload class SocaityFastAPIRouter(APIRouter, _BaseBackend, _QueueMixin, _fast_api_file_handling_mixin, _FastAPIStreamingMixin, _FastAPIExceptionHandler): @@ -338,7 +339,9 @@ def _modify_result_decorator(self, func: Callable, plan: EndpointExecutionPlan, - direct (no queue): a :class:`StreamingResponse` is returned to the client. Non-streaming schema results are wrapped into the response model; all - results are then serialized (media files -> JSON). + results are then serialized (media files -> JSON). Handlers that return + :class:`~apipod.engine.jobs.enqueue_payload.EnqueuePayload` (job + submission metadata for remote queues) are passed through unchanged. """ @functools.wraps(func) def sync_wrapper(*args, **kwargs): @@ -348,6 +351,9 @@ def sync_wrapper(*args, **kwargs): if producer is not None: return producer if queued else self._streaming_response_from_producer(producer) + if is_enqueue_payload(result): + return result + binding = plan.schema_binding if binding is not None: result = wrap_schema_response(result, binding) diff --git a/apipod/engine/jobs/enqueue_payload.py b/apipod/engine/jobs/enqueue_payload.py new file mode 100644 index 0000000..40c1d20 --- /dev/null +++ b/apipod/engine/jobs/enqueue_payload.py @@ -0,0 +1,18 @@ +"""Marker for queue handlers that return submission metadata, not inference output. + +Some :class:`~apipod.engine.queue.job_queue_interface.JobQueueInterface` +implementations call the wrapped handler when a job is *submitted* (not when a +worker runs it) to collect metadata for the queue. Those return values must not +be coerced through schema response wrapping. +""" + + +class EnqueuePayload: + """Base class for handler results that represent job submission metadata.""" + + __apipod_enqueue_payload__ = True + + +def is_enqueue_payload(result: object) -> bool: + """Return True when *result* is job submission metadata, not model output.""" + return isinstance(result, EnqueuePayload) diff --git a/test/test_schemas.py b/test/test_schemas.py index c5366fd..706b565 100644 --- a/test/test_schemas.py +++ b/test/test_schemas.py @@ -79,6 +79,30 @@ def test_non_streaming_schema_accepts_stream_false_in_body(): assert resp.status_code == 200, resp.text +def test_serverless_schema_endpoint_enqueues_without_wrapping_enqueue_metadata(): + """Queued schema endpoints still wrap worker output, but not gateway job params.""" + with build_service(schema_service.register_all, simulate="serverless") as client: + resp = client.post( + "/chat", + json={"messages": [{"role": "user", "content": "hi"}]}, + ) + assert resp.status_code == 200, resp.text + body = resp.json() + assert "links" in body + assert "status" in body["links"] + + +def test_enqueue_payload_detection(): + from apipod.engine.jobs.enqueue_payload import EnqueuePayload, is_enqueue_payload + + class SampleEnqueue(EnqueuePayload): + pass + + assert is_enqueue_payload(SampleEnqueue()) + assert not is_enqueue_payload({}) + assert not is_enqueue_payload("done") + + def test_stream_request_field_on_streaming_schema_endpoint(): """A schema endpoint detected as streaming keeps ``stream`` in its OpenAPI body.""" with build_service(streaming_service.register, simulate="serverless") as client: From 3050fe8b51ff9220368fef75e6db5e3e49588a2c Mon Sep 17 00:00:00 2001 From: Carlos Reyes Date: Thu, 2 Jul 2026 10:04:22 +0200 Subject: [PATCH 35/38] refactor(jobs): scope status vocabulary to in-process queue Keep APIPod free of gateway/worker normalization and legacy aliases. Expose STREAM_WAIT_STATUSES for local /stream attach checks and clarify JobResult.status as a string that platform deployments may extend. Co-authored-by: Cursor --- .../engine/backend/fastapi/streaming_mixin.py | 11 +++++-- apipod/engine/jobs/base_job.py | 29 +++++++++++++++++-- apipod/engine/jobs/job_result.py | 5 ++-- test/test_job_status.py | 24 +++++++++++++++ test/test_streaming.py | 11 +++++++ 5 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 test/test_job_status.py diff --git a/apipod/engine/backend/fastapi/streaming_mixin.py b/apipod/engine/backend/fastapi/streaming_mixin.py index 20e3b79..2b41c3e 100644 --- a/apipod/engine/backend/fastapi/streaming_mixin.py +++ b/apipod/engine/backend/fastapi/streaming_mixin.py @@ -31,6 +31,7 @@ from fastapi.responses import StreamingResponse from apipod.engine.endpoint_config import EndpointExecutionPlan +from apipod.engine.jobs.base_job import JOB_STATUS, STREAM_WAIT_STATUSES from apipod.engine.streaming.stream_producer import StreamProducer @@ -135,9 +136,13 @@ async def stream_job_sse(self, job_id: str, request: Request): if job_data is None and not stream_open: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Job '{job_id}' not found.") - # Allow any not-yet-finished state; read_chunks waits for the producer. - st = ((job_data.get("status") if job_data else "") or "").lower() - if not stream_open and st not in {"queued", "processing", "streaming"}: + # Allow pre-stream lifecycle states; read_chunks waits for the producer. + raw_status = (job_data.get("status") if job_data else "") or "" + if isinstance(raw_status, JOB_STATUS): + st = raw_status.value + else: + st = str(raw_status).lower() + if not stream_open and st not in STREAM_WAIT_STATUSES: raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail=f"Job '{job_id}' is not streaming (status: {st or 'unknown'}).", diff --git a/apipod/engine/jobs/base_job.py b/apipod/engine/jobs/base_job.py index 411429a..9e77003 100644 --- a/apipod/engine/jobs/base_job.py +++ b/apipod/engine/jobs/base_job.py @@ -1,13 +1,18 @@ from datetime import datetime, timedelta, timezone -from typing import Any, Optional -from uuid import uuid4 from enum import Enum +from typing import Any, FrozenSet, Optional +from uuid import uuid4 from apipod.engine.jobs.job_progress import JobProgress class JOB_STATUS(Enum): - """Lifecycle states of a job. The value is the public API status string.""" + """Internal lifecycle states for APIPod's in-process job queue. + + Values are lowercase strings suitable for :class:`JobResult.status` when + APIPod runs standalone. + """ + QUEUED = "queued" PROCESSING = "processing" STREAMING = "streaming" @@ -15,6 +20,24 @@ class JOB_STATUS(Enum): FAILED = "failed" TIMEOUT = "timeout" + @property + def is_terminal(self) -> bool: + return self in { + JOB_STATUS.FINISHED, + JOB_STATUS.FAILED, + JOB_STATUS.TIMEOUT, + } + + +# Statuses where GET /stream may attach before the local stream store opens. +STREAM_WAIT_STATUSES: FrozenSet[str] = frozenset( + { + JOB_STATUS.QUEUED.value, + JOB_STATUS.PROCESSING.value, + JOB_STATUS.STREAMING.value, + } +) + class JobMetrics: """Storage for all job timing and performance data.""" diff --git a/apipod/engine/jobs/job_result.py b/apipod/engine/jobs/job_result.py index 1f6ccc5..7ded00a 100644 --- a/apipod/engine/jobs/job_result.py +++ b/apipod/engine/jobs/job_result.py @@ -44,9 +44,8 @@ class JobResult(BaseModel): """Public job snapshot returned by GET /status and job submissions. Unified response: same shape whether the client just submitted a job - (``status="queued"``) or is polling for completion. The ``status`` values - mirror :class:`~apipod.engine.jobs.base_job.JOB_STATUS` - (``queued``/``processing``/``streaming``/``finished``/``failed``/``timeout``). + or is polling for completion. ``status`` is a string, APIPod's local + queue uses :class:`~apipod.engine.jobs.base_job.JOB_STATUS` values. Null fields are excluded from the serialized response so the client only receives relevant information for the current job state. diff --git a/test/test_job_status.py b/test/test_job_status.py new file mode 100644 index 0000000..649aaad --- /dev/null +++ b/test/test_job_status.py @@ -0,0 +1,24 @@ +"""APIPod local JOB_STATUS helpers (in-process queue only).""" + +import pytest + +from apipod.engine.jobs.base_job import JOB_STATUS, STREAM_WAIT_STATUSES + + +def test_stream_wait_statuses_match_local_lifecycle() -> None: + assert STREAM_WAIT_STATUSES == frozenset( + { + JOB_STATUS.QUEUED.value, + JOB_STATUS.PROCESSING.value, + JOB_STATUS.STREAMING.value, + } + ) + + +def test_terminal_statuses() -> None: + assert JOB_STATUS.FINISHED.is_terminal + assert JOB_STATUS.FAILED.is_terminal + assert JOB_STATUS.TIMEOUT.is_terminal + assert not JOB_STATUS.QUEUED.is_terminal + assert not JOB_STATUS.PROCESSING.is_terminal + assert not JOB_STATUS.STREAMING.is_terminal diff --git a/test/test_streaming.py b/test/test_streaming.py index 83aa4ab..4d531c7 100644 --- a/test/test_streaming.py +++ b/test/test_streaming.py @@ -22,6 +22,7 @@ from conftest import build_service from services.streaming_service import CHAT_TOKENS, TEXT_TOKENS, VIDEO_FRAMES from services import streaming_service +from apipod.engine.jobs.base_job import JOB_STATUS, STREAM_WAIT_STATUSES # --------------------------------------------------------------------------- # @@ -49,6 +50,16 @@ def _sse_payloads(client, stream_url): return payloads +def test_stream_wait_statuses_match_local_lifecycle(): + assert STREAM_WAIT_STATUSES == frozenset( + { + JOB_STATUS.QUEUED.value, + JOB_STATUS.PROCESSING.value, + JOB_STATUS.STREAMING.value, + } + ) + + def test_stream_text_tokens(stream_client): url = _stream_url(stream_client, "/text") with stream_client.stream("GET", url) as resp: From 000c3d367920c21cb3d6316225628eaac9842d31 Mon Sep 17 00:00:00 2001 From: Carlos Reyes Date: Thu, 2 Jul 2026 19:19:27 +0200 Subject: [PATCH 36/38] refactor(endpoint-config): drop gateway streaming attribute from plan building Streaming is now detected purely from the function contract (generator, Iterator return annotation, or schema stream AST). Gateway handlers declare an Iterator return type instead of tagging a platform-specific attribute. is_streaming_endpoint resolves the schema binding itself when not provided. Co-authored-by: Cursor --- apipod/engine/endpoint_config.py | 8 +------- apipod/engine/signatures/analysis.py | 14 +++++++++++++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/apipod/engine/endpoint_config.py b/apipod/engine/endpoint_config.py index 5282451..71fd96b 100644 --- a/apipod/engine/endpoint_config.py +++ b/apipod/engine/endpoint_config.py @@ -8,9 +8,6 @@ from apipod.engine.backend.schema_resolve import SchemaBinding, get_schema_binding from apipod.engine.signatures.analysis import is_streaming_endpoint -# Set on dynamically built gateway handlers when registry metadata marks streaming. -GATEWAY_SUPPORTS_STREAMING_ATTR = "__gateway_supports_streaming__" - @dataclass(frozen=True) class EndpointExecutionPlan: @@ -68,8 +65,5 @@ def build_plan( route_args=route_args, route_kwargs=route_kwargs if route_kwargs is not None else {}, schema_binding=schema_binding, - is_streaming=( - is_streaming_endpoint(func, schema_binding) - or bool(getattr(func, GATEWAY_SUPPORTS_STREAMING_ATTR, False)) - ), + is_streaming=is_streaming_endpoint(func, schema_binding), ) diff --git a/apipod/engine/signatures/analysis.py b/apipod/engine/signatures/analysis.py index 8421556..dc344cc 100644 --- a/apipod/engine/signatures/analysis.py +++ b/apipod/engine/signatures/analysis.py @@ -21,7 +21,7 @@ def _return_type_includes_iterator(return_type) -> bool: return inspect.isclass(resolved) and issubclass(resolved, (Iterator, AsyncIterator)) -def is_streaming_endpoint(func: Callable, schema_binding: None) -> bool: +def is_streaming_endpoint(func: Callable, schema_binding=None) -> bool: """Backend-neutral: True when *func* can produce a streaming response. Detection order: @@ -29,6 +29,8 @@ def is_streaming_endpoint(func: Callable, schema_binding: None) -> bool: - return annotation contains ``Iterator`` / ``AsyncIterator`` (incl. inside a ``Union``); - schema endpoint whose request model has a ``stream`` field and the function body returns a generator (AST: ``yield``, generator expression, or under ``if request.stream``). + + ``schema_binding`` is resolved from *func* when not provided by the caller. """ target = inspect.unwrap(func) if inspect.isgeneratorfunction(target) or inspect.isasyncgenfunction(target): @@ -40,6 +42,16 @@ def is_streaming_endpoint(func: Callable, schema_binding: None) -> bool: if _return_type_includes_iterator(return_type): return True + if schema_binding is None: + # Local import: schema_resolve depends on backend modules that in turn + # use this analysis module. + from apipod.engine.backend.schema_resolve import get_schema_binding + + try: + schema_binding = get_schema_binding(func) + except Exception: + schema_binding = None + if schema_binding is not None and "stream" in schema_binding.request_model.model_fields: return ast_suggests_request_stream(target) return False From 0bf6a5b140e8f960e81ec2e749f8134391598c30 Mon Sep 17 00:00:00 2001 From: Carlos Reyes Date: Thu, 2 Jul 2026 19:19:39 +0200 Subject: [PATCH 37/38] refactor(router): delegate job lifecycle to the queue port Remove gateway-specific introspection from the FastAPI router: no get_job_result override sniffing, no cancel_gateway_job getattr, no private _add_job calls. JobQueueInterface.add_job/get_job_result accept supports_streaming and link_prefix so queues own JobResult construction, and BaseJob carries supports_streaming set at enqueue time. Co-authored-by: Cursor --- apipod/engine/backend/fastapi/router.py | 60 +++++----------------- apipod/engine/jobs/base_job.py | 3 ++ apipod/engine/queue/job_queue_interface.py | 42 ++++++++++++--- 3 files changed, 52 insertions(+), 53 deletions(-) diff --git a/apipod/engine/backend/fastapi/router.py b/apipod/engine/backend/fastapi/router.py index cb23557..e84b7b8 100644 --- a/apipod/engine/backend/fastapi/router.py +++ b/apipod/engine/backend/fastapi/router.py @@ -11,7 +11,6 @@ from apipod.common.settings import APIPOD_PORT, APIPOD_HOST from apipod.common.constants import SERVER_HEALTH from apipod.engine.jobs.job_result import JobResultFactory, JobResult -from apipod.engine.queue.job_queue_interface import JobQueueInterface from apipod.engine.endpoint_config import build_plan, EndpointExecutionPlan from apipod.engine.streaming.stream_serializer import build_stream_producer from apipod.engine.base_backend import _BaseBackend @@ -191,27 +190,7 @@ def get_job(self, job_id: str, return_format: str = 'json') -> JobResult: if self.job_queue is None: return JobResultFactory.job_not_found(job_id) - # Remote queues (e.g. gateway RedisJobQueue) override get_job_result to - # build JobResult from ServiceJob records that have no job_function. - queue_get_job_result = getattr(type(self.job_queue), "get_job_result", None) - if queue_get_job_result is not JobQueueInterface.get_job_result: - ret_job = self.job_queue.get_job_result(job_id) - else: - job = self.job_queue.get_job(job_id) - if job is None: - return JobResultFactory.job_not_found(job_id) - - job_function = getattr(job, "job_function", None) - ret_job = JobResultFactory.from_base_job( - job, - include_stream_link=( - self._include_stream_link_for(job_function) - if job_function is not None - else False - ), - link_prefix=self.prefix, - ) - + ret_job = self.job_queue.get_job_result(job_id, link_prefix=self.prefix) if ret_job is None: return JobResultFactory.job_not_found(job_id) @@ -220,47 +199,34 @@ def get_job(self, job_id: str, return_format: str = 'json') -> JobResult: return ret_job - def _include_stream_link_for(self, job_function: Callable) -> bool: - """True when the endpoint plan marks the job function as streaming.""" - if self.stream_store is None: - return False - plan = self._endpoint_plans.get(f"{job_function.__module__}.{job_function.__qualname__}") - return plan is not None and plan.is_streaming - def post_cancel_job(self, job_id: str) -> dict: - """Cancel a background job (gateway / orchestrator integration).""" + """Cancel a background job via the queue port.""" job_id = job_id.strip().strip('"').strip("'").strip("?").strip("#") if self.job_queue is None: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="Job queue not configured.") - cancel_fn = getattr(self.job_queue, "cancel_gateway_job", None) - if callable(cancel_fn): - return cancel_fn(job_id) - try: - self.job_queue.cancel_job(job_id) + summary = self.job_queue.cancel_job(job_id) except NotImplementedError: raise HTTPException( status_code=status.HTTP_501_NOT_IMPLEMENTED, detail="Cancellation is not supported for this job queue.", ) from None - return {"id": job_id, "status": "cancelled", "message": "Job cancelled."} + return summary or {"id": job_id, "status": "cancelled", "message": "Job cancelled."} def add_job(self, func: Callable, job_params: dict) -> JobResult: """Enqueue a task and return a :class:`JobResult` with endpoint-aware links.""" if self.job_queue is None: raise ValueError("Job Queue is not initialized. Cannot add job.") - job = self.job_queue._add_job(job_function=func, job_params=job_params) - - # check if the job result will include the stream option - include_stream_link = False - if self.stream_store is not None: - plan = self._endpoint_plans.get(f"{func.__module__}.{func.__qualname__}") - include_stream_link = plan is not None and plan.is_streaming - - return JobResultFactory.from_base_job( - job, - include_stream_link=include_stream_link, + + plan = self._endpoint_plans.get(f"{func.__module__}.{func.__qualname__}") + supports_streaming = ( + self.stream_store is not None and plan is not None and plan.is_streaming + ) + return self.job_queue.add_job( + job_function=func, + job_params=job_params, + supports_streaming=supports_streaming, link_prefix=self.prefix, ) diff --git a/apipod/engine/jobs/base_job.py b/apipod/engine/jobs/base_job.py index 9e77003..85fd4a8 100644 --- a/apipod/engine/jobs/base_job.py +++ b/apipod/engine/jobs/base_job.py @@ -70,6 +70,9 @@ def __init__(self, id: Optional[str] = None): self.error: Optional[str] = None self.job_progress = JobProgress() self.metrics = JobMetrics() + # True when the job's output may be consumed via GET /stream/{job_id}. + # Set at enqueue time by the queue; drives the ``links.stream`` hint. + self.supports_streaming: bool = False class LocalJob(BaseJob): diff --git a/apipod/engine/queue/job_queue_interface.py b/apipod/engine/queue/job_queue_interface.py index b45e070..c1dd2c6 100644 --- a/apipod/engine/queue/job_queue_interface.py +++ b/apipod/engine/queue/job_queue_interface.py @@ -13,22 +13,45 @@ class JobQueueInterface(Generic[T], ABC): Both :meth:`add_job` (submission) and :meth:`get_job_result` (status polling) return a :class:`JobResult`. The default implementations convert via ``JobResultFactory.from_base_job``; queue backends that store richer - job types (e.g. Redis ``ServiceJob``) override to add extra fields. + job types override to add extra fields. + + The transport layer (router) passes presentation context through this + port — ``supports_streaming`` (may the job's output be consumed via + ``GET /stream/{job_id}``) and ``link_prefix`` (mount prefix for hypermedia + links) — so it never needs to know which queue implementation it holds. """ - def add_job(self, job_function: Callable, job_params: Optional[dict] = None) -> JobResult: + def add_job( + self, + job_function: Callable, + job_params: Optional[dict] = None, + *, + supports_streaming: bool = False, + link_prefix: str = "", + ) -> JobResult: """Create a job, enqueue it, and return the public :class:`JobResult`. Subclasses **must** override :meth:`_add_job` (raw enqueue logic) and may override this method to customise the ``JobResult`` conversion. """ job = self._add_job(job_function, job_params) - return JobResultFactory.from_base_job(job) + job.supports_streaming = supports_streaming + return JobResultFactory.from_base_job( + job, + include_stream_link=supports_streaming, + link_prefix=link_prefix, + ) - def get_job_result(self, job_id: str) -> Optional[JobResult]: + def get_job_result(self, job_id: str, *, link_prefix: str = "") -> Optional[JobResult]: """Resolve job status for API responses.""" job = self.get_job(job_id) - return JobResultFactory.from_base_job(job) if job is not None else None + if job is None: + return None + return JobResultFactory.from_base_job( + job, + include_stream_link=bool(getattr(job, "supports_streaming", False)), + link_prefix=link_prefix, + ) @abstractmethod def _add_job(self, job_function: Callable, job_params: Optional[dict] = None) -> T: @@ -45,7 +68,14 @@ def get_job(self, job_id: str) -> Optional[T]: ... @abstractmethod - def cancel_job(self, job_id: str) -> None: + def cancel_job(self, job_id: str) -> Optional[dict]: + """Cancel a job. + + Returns an optional cancellation summary dict (``id`` / ``status`` / + ``message``) for the HTTP response; ``None`` means "cancelled, use the + default summary". Raise :class:`NotImplementedError` when the queue + does not support cancellation. + """ ... @abstractmethod From 2e440c26bb2e0b9fe9d6fd441735257e5127e222 Mon Sep 17 00:00:00 2001 From: Carlos Reyes Date: Thu, 2 Jul 2026 19:19:56 +0200 Subject: [PATCH 38/38] test(jobs): drop trivial local job status assertions The enum values and stream-wait set are exercised end to end by the streaming tests; the standalone constant checks added no coverage. Co-authored-by: Cursor --- test/test_job_status.py | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 test/test_job_status.py diff --git a/test/test_job_status.py b/test/test_job_status.py deleted file mode 100644 index 649aaad..0000000 --- a/test/test_job_status.py +++ /dev/null @@ -1,24 +0,0 @@ -"""APIPod local JOB_STATUS helpers (in-process queue only).""" - -import pytest - -from apipod.engine.jobs.base_job import JOB_STATUS, STREAM_WAIT_STATUSES - - -def test_stream_wait_statuses_match_local_lifecycle() -> None: - assert STREAM_WAIT_STATUSES == frozenset( - { - JOB_STATUS.QUEUED.value, - JOB_STATUS.PROCESSING.value, - JOB_STATUS.STREAMING.value, - } - ) - - -def test_terminal_statuses() -> None: - assert JOB_STATUS.FINISHED.is_terminal - assert JOB_STATUS.FAILED.is_terminal - assert JOB_STATUS.TIMEOUT.is_terminal - assert not JOB_STATUS.QUEUED.is_terminal - assert not JOB_STATUS.PROCESSING.is_terminal - assert not JOB_STATUS.STREAMING.is_terminal