From 674093a2c2bf746e8210d712b19afb988396c1a9 Mon Sep 17 00:00:00 2001 From: bing1100 Date: Mon, 9 Feb 2026 23:17:05 -0500 Subject: [PATCH 01/13] fix --- DEPLOY.md | 6 +- README.md | 23 ++++- backend/README.md | 39 +++++++- backend/api/citations/router.py | 77 ++++++--------- backend/api/core/cit_utils.py | 38 ++++--- backend/api/core/config.py | 80 +++++++++++++-- backend/api/extract/router.py | 9 +- backend/api/screen/router.py | 6 +- backend/api/services/cit_db_service.py | 32 +++--- backend/api/services/postgres_auth.py | 132 +++++++++++++++++++------ backend/api/services/sr_db_service.py | 53 +++++----- backend/api/sr/router.py | 64 +++--------- backend/docker-compose.yml | 1 - backend/main.py | 15 +-- 14 files changed, 351 insertions(+), 224 deletions(-) diff --git a/DEPLOY.md b/DEPLOY.md index 139c9f5b..0319e9c9 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -306,7 +306,11 @@ ACCESS_TOKEN_EXPIRE_MINUTES=10080 # Databases (configured in docker-compose.yml) MONGODB_URI=mongodb://sr-mongodb-service:27017/mongodb-sr -POSTGRES_URI=postgres://admin:password@cit-pgdb-service:5432/postgres-cits +POSTGRES_MODE=docker +DOCKER_POSTGRES_HOST=pgdb-service +DOCKER_POSTGRES_DATABASE=postgres +DOCKER_POSTGRES_USER=admin +DOCKER_POSTGRES_PASSWORD=password # Databricks (for database search) DATABRICKS_INSTANCE=your-databricks-instance diff --git a/README.md b/README.md index 11a6f505..0ae6b5a3 100644 --- a/README.md +++ b/README.md @@ -224,8 +224,27 @@ AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o AZURE_STORAGE_CONNECTION_STRING=your-connection-string # Databases -MONGODB_URI=mongodb://localhost:27017/mongodb-sr -POSTGRES_URI=postgres://admin:password@localhost:5432/postgres-cits +MONGODB_URI=mongodb://sr-mongodb-service:27017/mongodb-sr + +# Postgres configuration +POSTGRES_MODE=docker # docker | local | azure + +# Docker Postgres (docker-compose) +DOCKER_POSTGRES_HOST=pgdb-service +DOCKER_POSTGRES_DATABASE=postgres +DOCKER_POSTGRES_USER=admin +DOCKER_POSTGRES_PASSWORD=password + +# Local Postgres (developer machine) - also used as fallback if configured +# LOCAL_POSTGRES_HOST=localhost +# LOCAL_POSTGRES_DATABASE=grep +# LOCAL_POSTGRES_USER=postgres +# LOCAL_POSTGRES_PASSWORD=123 + +# Azure Database for PostgreSQL (Entra auth) +# AZURE_POSTGRES_HOST=...postgres.database.azure.com +# AZURE_POSTGRES_DATABASE=grep +# AZURE_POSTGRES_USER= # Databricks (for database search) DATABRICKS_INSTANCE=your-instance diff --git a/backend/README.md b/backend/README.md index 1af57f14..aa86d4f0 100644 --- a/backend/README.md +++ b/backend/README.md @@ -55,8 +55,30 @@ AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=... # Databases (Docker defaults - change for production) -MONGODB_URI=mongodb://sr-mongodb-service:27017/mongodb-sr -POSTGRES_URI=postgres://admin:password@cit-pgdb-service:5432/postgres-cits + + +# Postgres configuration +POSTGRES_MODE=docker # docker | local | azure + +# Docker Postgres (docker-compose) +DOCKER_POSTGRES_HOST=pgdb-service +DOCKER_POSTGRES_DATABASE=postgres +DOCKER_POSTGRES_USER=admin +DOCKER_POSTGRES_PASSWORD=password + +# Local Postgres (developer machine) - also used as fallback if configured +LOCAL_POSTGRES_HOST=localhost +LOCAL_POSTGRES_DATABASE=grep +LOCAL_POSTGRES_USER=postgres +LOCAL_POSTGRES_PASSWORD=123 + +# Azure Database for PostgreSQL (Entra auth) +AZURE_POSTGRES_HOST= +AZURE_POSTGRES_DATABASE= +AZURE_POSTGRES_USER= + +# Note: the backend will always try POSTGRES_MODE first and fall back to LOCAL +# if LOCAL_POSTGRES_* is fully configured. # GROBID Service GROBID_SERVICE_URL=http://grobid-service:8070 @@ -222,7 +244,18 @@ docker compose restart api | Variable | Description | Default | |----------|-------------|---------| | `MONGODB_URI` | MongoDB connection string | `mongodb://sr-mongodb-service:27017/mongodb-sr` | -| `POSTGRES_URI` | PostgreSQL connection string | `postgres://admin:password@cit-pgdb-service:5432/postgres-cits` | +| `POSTGRES_MODE` | Postgres connection mode: `docker` \| `local` \| `azure` | `docker` | +| `DOCKER_POSTGRES_HOST` | Docker Postgres host (compose service name) | `pgdb-service` | +| `DOCKER_POSTGRES_DATABASE` | Docker Postgres database | `postgres` | +| `DOCKER_POSTGRES_USER` | Docker Postgres user | `admin` | +| `DOCKER_POSTGRES_PASSWORD` | Docker Postgres password | `password` | +| `LOCAL_POSTGRES_HOST` | Local Postgres host | `localhost` | +| `LOCAL_POSTGRES_DATABASE` | Local Postgres database | `grep` | +| `LOCAL_POSTGRES_USER` | Local Postgres user | `postgres` | +| `LOCAL_POSTGRES_PASSWORD` | Local Postgres password | `123` | +| `AZURE_POSTGRES_HOST` | Azure Postgres host | `...postgres.database.azure.com` | +| `AZURE_POSTGRES_DATABASE` | Azure Postgres database | `grep` | +| `AZURE_POSTGRES_USER` | Azure Postgres user (Entra UPN or role) | `HAIL-DBAs` | | `GROBID_SERVICE_URL` | GROBID service URL | `http://grobid-service:8070` | | `DATABRICKS_INSTANCE` | Databricks workspace URL | - | | `DATABRICKS_TOKEN` | Databricks access token | - | diff --git a/backend/api/citations/router.py b/backend/api/citations/router.py index 247a2859..35c0c89b 100644 --- a/backend/api/citations/router.py +++ b/backend/api/citations/router.py @@ -6,7 +6,7 @@ - All endpoints require a Systematic Review (sr_id) that the user is a member of. - Uploading a CSV will: - Parse the CSV - - Create a new Postgres *table* in the shared database (POSTGRES_URI) + - Create a new Postgres *table* in the shared database - Insert citation rows from the CSV into that table - Save the table name + connection string into the Systematic Review record @@ -37,32 +37,25 @@ router = APIRouter() -def _get_db_conn_str() -> Optional[str]: +def _is_postgres_configured() -> bool: """ - Get database connection string for PostgreSQL. - - If POSTGRES_URI is set, returns it directly (local development). - If Entra ID env variables are configured (POSTGRES_HOST, POSTGRES_DATABASE, POSTGRES_USER), - returns None to signal that connect_postgres() should use Entra ID authentication. + Check if PostgreSQL is configured via the POSTGRES_MODE profile. """ - if settings.POSTGRES_URI: - return settings.POSTGRES_URI - - # If Entra ID config is available, return None to let connect_postgres use token auth - if settings.POSTGRES_HOST and settings.POSTGRES_DATABASE and settings.POSTGRES_USER: - return None - - # No configuration available - return None, let downstream handle the error - return None + try: + prof = settings.postgres_profile() + except Exception: + return False + if not (prof.get("database") and prof.get("user")): + return False -def _is_postgres_configured() -> bool: - """ - Check if PostgreSQL is configured via Entra ID env vars or connection string. - """ - has_entra_config = settings.POSTGRES_HOST and settings.POSTGRES_DATABASE and settings.POSTGRES_USER - has_uri_config = settings.POSTGRES_URI - return bool(has_entra_config or has_uri_config) + if prof.get("mode") in ("local", "docker") and not prof.get("password"): + return False + + if prof.get("mode") == "azure" and not prof.get("host"): + return False + + return True class UploadResult(BaseModel): @@ -84,8 +77,8 @@ def _parse_dsn(dsn: str) -> Dict[str, str]: return parse_dsn(dsn) except Exception: return {} -def _create_table_and_insert_sync(db_conn_str: str, table_name: str, columns: List[str], rows: List[Dict[str, Any]]) -> int: - return cits_dp_service.create_table_and_insert_sync(db_conn_str, table_name, columns, rows) +def _create_table_and_insert_sync(table_name: str, columns: List[str], rows: List[Dict[str, Any]]) -> int: + return cits_dp_service.create_table_and_insert_sync(table_name, columns, rows) @router.post("/{sr_id}/upload-csv", response_model=UploadResult) @@ -98,25 +91,23 @@ async def upload_screening_csv( Upload a CSV of citations for title/abstract screening and create a dedicated Postgres table. Requirements: - - POSTGRES_URI must be configured. + - Postgres must be configured via POSTGRES_MODE and POSTGRES_* env vars. - The SR must exist and the user must be a member of the SR (or owner). """ - db_conn_str = _get_db_conn_str() try: - sr, screening, _ = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service, require_screening=False) + sr, screening, _ = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Failed to load systematic review or screening: {e}") - # Check admin DSN (use centralized settings) - need either Entra ID config or POSTGRES_URI + # Check admin config (use centralized settings) if not _is_postgres_configured(): raise HTTPException( status_code=status.HTTP_503_SERVICE_UNAVAILABLE, - detail="Postgres not configured. Set POSTGRES_HOST/DATABASE/USER for Entra ID auth, or POSTGRES_URI for local dev.", + detail="Postgres not configured. Set POSTGRES_MODE and POSTGRES_* env vars.", ) - admin_dsn = _get_db_conn_str() # Read CSV content include_columns = None @@ -141,14 +132,14 @@ async def upload_screening_csv( try: old = (sr.get("screening_db") or {}).get("table_name") if old: - await run_in_threadpool(cits_dp_service.drop_table, admin_dsn, old) + await run_in_threadpool(cits_dp_service.drop_table, old) except Exception: # best-effort only pass # Create table and insert rows in threadpool try: - inserted = await run_in_threadpool(_create_table_and_insert_sync, admin_dsn, table_name, include_columns, normalized_rows) + inserted = await run_in_threadpool(_create_table_and_insert_sync, table_name, include_columns, normalized_rows) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -168,7 +159,6 @@ async def upload_screening_csv( # Update SR document with screening DB info using PostgreSQL await run_in_threadpool( srdb_service.update_screening_db_info, - _get_db_conn_str(), sr_id, screening_info["screening_db"] ) @@ -198,9 +188,8 @@ async def list_citation_ids( Returns a simple list of integers (the 'id' primary key from the citations table). """ - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -237,9 +226,8 @@ async def get_citation_by_id( Returns: a JSON object representing the citation row (keys are DB column names). """ - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -290,9 +278,8 @@ async def build_combined_citation( the format ": \\n" for each included column, in the order provided. """ - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -345,9 +332,8 @@ async def upload_citation_fulltext( to the storage path (container/blob). """ - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -441,9 +427,8 @@ async def hard_delete_screening_resources(sr_id: str, current_user: Dict[str, An - Caller must be the SR owner. """ - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -546,7 +531,6 @@ async def hard_delete_screening_resources(sr_id: str, current_user: Dict[str, An try: await run_in_threadpool( srdb_service.clear_screening_db_info, - _get_db_conn_str(), sr_id ) except Exception: @@ -582,10 +566,9 @@ async def export_citations_csv( Content-Disposition. """ - db_conn_str = _get_db_conn_str() try: sr, screening, db_conn = await load_sr_and_check( - sr_id, current_user, db_conn_str, srdb_service + sr_id, current_user, srdb_service ) except HTTPException: raise diff --git a/backend/api/core/cit_utils.py b/backend/api/core/cit_utils.py index 12442fa8..1e33ce13 100644 --- a/backend/api/core/cit_utils.py +++ b/backend/api/core/cit_utils.py @@ -16,19 +16,33 @@ from .config import settings -def _is_postgres_configured(db_conn_str: Optional[str] = None) -> bool: +def _is_postgres_configured() -> bool: """ - Check if PostgreSQL is configured via Entra ID env vars or connection string. + Check if PostgreSQL is configured via the POSTGRES_MODE profile. """ - has_entra_config = settings.POSTGRES_HOST and settings.POSTGRES_DATABASE and settings.POSTGRES_USER - has_uri_config = db_conn_str or settings.POSTGRES_URI - return bool(has_entra_config or has_uri_config) + try: + prof = settings.postgres_profile() + except Exception: + return False + + # minimal requirements + if not (prof.get("database") and prof.get("user")): + return False + + # password required for local/docker + if prof.get("mode") in ("local", "docker") and not prof.get("password"): + return False + + # azure requires host + if prof.get("mode") == "azure" and not prof.get("host"): + return False + + return True async def load_sr_and_check( sr_id: str, current_user: Dict[str, Any], - db_conn_str: Optional[str], srdb_service, require_screening: bool = True, require_visible: bool = True, @@ -39,20 +53,19 @@ async def load_sr_and_check( Args: sr_id: SR id string current_user: current user dict (must contain "id" and "email") - db_conn_str: PostgreSQL connection string (can be None if using Entra ID auth) srdb_service: SR DB service instance (must implement get_systematic_review and user_has_sr_permission) require_screening: if True, also ensure the SR has a configured screening_db and return its connection string require_visible: if True, require the SR 'visible' flag to be True; set False for endpoints like hard-delete Returns: - (sr_doc, screening_obj or None, db_conn_string or None) + (sr_doc, screening_obj or None) Raises HTTPException with appropriate status codes on failure so routers can just propagate. """ # fetch SR try: - sr = await run_in_threadpool(srdb_service.get_systematic_review, db_conn_str, sr_id, not require_visible) + sr = await run_in_threadpool(srdb_service.get_systematic_review, sr_id, not require_visible) except HTTPException: raise except Exception as e: @@ -67,7 +80,7 @@ async def load_sr_and_check( # permission check (user must be member or owner) user_id = current_user.get("email") try: - has_perm = await run_in_threadpool(srdb_service.user_has_sr_permission, db_conn_str, sr_id, user_id) + has_perm = await run_in_threadpool(srdb_service.user_has_sr_permission, sr_id, user_id) except HTTPException: raise except Exception as e: @@ -77,10 +90,9 @@ async def load_sr_and_check( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not authorized to view/modify this systematic review") screening = sr.get("screening_db") if isinstance(sr, dict) else None - db_conn = None if require_screening: if not screening: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="No screening database configured for this systematic review") - db_conn = None - return sr, screening, db_conn + + return sr, screening diff --git a/backend/api/core/config.py b/backend/api/core/config.py index 3fb7d32a..03d4526a 100644 --- a/backend/api/core/config.py +++ b/backend/api/core/config.py @@ -110,18 +110,78 @@ def convert_max_file_size(cls, v): ) DEBUG: bool = os.getenv("DEBUG", "false").lower() == "true" - # Database and external system environment variables - # Postgres settings for Entra ID authentication - POSTGRES_HOST: Optional[str] = os.getenv("POSTGRES_HOST") - POSTGRES_DATABASE: Optional[str] = os.getenv("POSTGRES_DATABASE") - POSTGRES_USER: Optional[str] = os.getenv("POSTGRES_USER") # Entra ID user (e.g., user@tenant.onmicrosoft.com) - POSTGRES_PORT: int = int(os.getenv("POSTGRES_PORT", "5432")) - POSTGRES_SSL_MODE: Optional[str] = os.getenv("POSTGRES_SSL_MODE") - POSTGRES_PASSWORD: Optional[str] = os.getenv("POSTGRES_PASSWORD") - AZURE_DB: bool = os.getenv("AZURE_DB", "false").lower() == "true" - # Legacy: Postgres DSN used for systematic reviews and screening databases (fallback) + # ------------------------------------------------------------------------- + # Postgres configuration + # ------------------------------------------------------------------------- + # A single selector, with three isolated profiles (AZURE_/DOCKER_/LOCAL_) + POSTGRES_MODE: str = os.getenv("POSTGRES_MODE", "docker").lower().strip() # docker|local|azure + + # Docker profile (typically for docker-compose) + DOCKER_POSTGRES_HOST: Optional[str] = os.getenv("DOCKER_POSTGRES_HOST") + DOCKER_POSTGRES_DATABASE: Optional[str] = os.getenv("DOCKER_POSTGRES_DATABASE") + DOCKER_POSTGRES_USER: Optional[str] = os.getenv("DOCKER_POSTGRES_USER") + DOCKER_POSTGRES_PASSWORD: Optional[str] = os.getenv("DOCKER_POSTGRES_PASSWORD") + DOCKER_POSTGRES_PORT: int = int(os.getenv("DOCKER_POSTGRES_PORT", "5432")) + + # Local profile (developer machine) + LOCAL_POSTGRES_HOST: str = os.getenv("LOCAL_POSTGRES_HOST", "localhost") + LOCAL_POSTGRES_DATABASE: Optional[str] = os.getenv("LOCAL_POSTGRES_DATABASE") + LOCAL_POSTGRES_USER: Optional[str] = os.getenv("LOCAL_POSTGRES_USER") + LOCAL_POSTGRES_PASSWORD: Optional[str] = os.getenv("LOCAL_POSTGRES_PASSWORD") + LOCAL_POSTGRES_PORT: int = int(os.getenv("LOCAL_POSTGRES_PORT", "5432")) + + # Azure profile (Azure Database for PostgreSQL) using Entra token auth + AZURE_POSTGRES_HOST: Optional[str] = os.getenv("AZURE_POSTGRES_HOST") + AZURE_POSTGRES_DATABASE: Optional[str] = os.getenv("AZURE_POSTGRES_DATABASE") + AZURE_POSTGRES_USER: Optional[str] = os.getenv("AZURE_POSTGRES_USER") + AZURE_POSTGRES_PORT: int = int(os.getenv("AZURE_POSTGRES_PORT", "5432")) + AZURE_POSTGRES_SSL_MODE: str = os.getenv("AZURE_POSTGRES_SSL_MODE", "require") + + # Deprecated (will be removed): legacy Postgres DSN POSTGRES_URI: Optional[str] = os.getenv("POSTGRES_URI") + def postgres_profile(self, mode: Optional[str] = None) -> dict: + """Return resolved Postgres connection settings for a specific mode.""" + m = (mode or self.POSTGRES_MODE or "").lower().strip() + if m not in {"docker", "local", "azure"}: + raise ValueError("POSTGRES_MODE must be one of: docker, local, azure") + + if m == "docker": + return { + "mode": "docker", + "host": self.DOCKER_POSTGRES_HOST or "pgdb-service", + "database": self.DOCKER_POSTGRES_DATABASE, + "user": self.DOCKER_POSTGRES_USER, + "password": self.DOCKER_POSTGRES_PASSWORD, + "port": self.DOCKER_POSTGRES_PORT, + "sslmode": None, + } + + if m == "local": + return { + "mode": "local", + "host": self.LOCAL_POSTGRES_HOST or "localhost", + "database": self.LOCAL_POSTGRES_DATABASE, + "user": self.LOCAL_POSTGRES_USER, + "password": self.LOCAL_POSTGRES_PASSWORD, + "port": self.LOCAL_POSTGRES_PORT, + "sslmode": None, + } + + # azure + return { + "mode": "azure", + "host": self.AZURE_POSTGRES_HOST, + "database": self.AZURE_POSTGRES_DATABASE, + "user": self.AZURE_POSTGRES_USER, + "password": None, + "port": self.AZURE_POSTGRES_PORT, + "sslmode": self.AZURE_POSTGRES_SSL_MODE or "require", + } + + def has_local_fallback(self) -> bool: + return bool(self.LOCAL_POSTGRES_DATABASE and self.LOCAL_POSTGRES_USER and self.LOCAL_POSTGRES_PASSWORD) + # Databricks settings DATABRICKS_INSTANCE: str = os.getenv("DATABRICKS_INSTANCE") DATABRICKS_TOKEN: str = os.getenv("DATABRICKS_TOKEN") diff --git a/backend/api/extract/router.py b/backend/api/extract/router.py index a2b1ff91..8c7240b0 100644 --- a/backend/api/extract/router.py +++ b/backend/api/extract/router.py @@ -83,9 +83,8 @@ async def extract_parameter_endpoint( derived from the parameter name (prefixed with 'llm_param_'). """ - db_conn_str = settings.POSTGRES_URI try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -256,9 +255,8 @@ async def human_extract_parameter( and does not call any LLM. """ - db_conn_str = settings.POSTGRES_URI try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -347,9 +345,8 @@ async def extract_fulltext_from_storage( under column "fulltext", and return the generated fulltext_str. """ - db_conn_str = settings.POSTGRES_URI try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: diff --git a/backend/api/screen/router.py b/backend/api/screen/router.py index 20fc9986..3f249a9e 100644 --- a/backend/api/screen/router.py +++ b/backend/api/screen/router.py @@ -79,9 +79,8 @@ async def classify_citation( The 'selected' field in the returned JSON is validated against the provided `options`. """ - db_conn_str = settings.POSTGRES_URI try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -223,9 +222,8 @@ async def human_classify_citation( The column name is prefixed with 'human_' to distinguish from automated classifications. """ - db_conn_str = settings.POSTGRES_URI try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: diff --git a/backend/api/services/cit_db_service.py b/backend/api/services/cit_db_service.py index b130b688..141e6e0e 100644 --- a/backend/api/services/cit_db_service.py +++ b/backend/api/services/cit_db_service.py @@ -138,7 +138,7 @@ def __init__(self): # ----------------------- # Generic column ops # ----------------------- - def create_column(self, db_conn_str: str, col: str, col_type: str, table_name: str = "citations") -> None: + def create_column(self, col: str, col_type: str, table_name: str = "citations") -> None: """ Create column on citations table if it doesn't already exist. col should be the exact column name to use (caller may pass snake_case(col)). @@ -165,7 +165,6 @@ def create_column(self, db_conn_str: str, col: str, col_type: str, table_name: s def update_jsonb_column( self, - db_conn_str: str, citation_id: int, col: str, data: Any, @@ -197,7 +196,6 @@ def update_jsonb_column( def update_text_column( self, - db_conn_str: str, citation_id: int, col: str, text_value: str, @@ -230,7 +228,7 @@ def update_text_column( # ----------------------- # Citation row helpers # ----------------------- - def dump_citations_csv(self, db_conn_str: str, table_name: str = "citations") -> bytes: + def dump_citations_csv(self, table_name: str = "citations") -> bytes: """Dump the entire `citations` table as CSV bytes. Intended to be called from async FastAPI routes via @@ -259,7 +257,7 @@ def dump_citations_csv(self, db_conn_str: str, table_name: str = "citations") -> if conn: pass - def get_citation_by_id(self, db_conn_str: str, citation_id: int, table_name: str = "citations") -> Optional[Dict[str, Any]]: + def get_citation_by_id(self, citation_id: int, table_name: str = "citations") -> Optional[Dict[str, Any]]: """ Return a dict mapping column -> value for the citation row, or None. """ @@ -286,7 +284,7 @@ def get_citation_by_id(self, db_conn_str: str, citation_id: int, table_name: str if conn: pass - def list_citation_ids(self, db_conn_str: str, filter_step=None, table_name: str = "citations") -> List[int]: + def list_citation_ids(self, filter_step=None, table_name: str = "citations") -> List[int]: """ Return list of integer primary keys (id) from citations table ordered by id. """ @@ -333,7 +331,7 @@ def list_citation_ids(self, db_conn_str: str, filter_step=None, table_name: str if conn: pass - def list_fulltext_urls(self, db_conn_str: str, table_name: str = "citations") -> List[str]: + def list_fulltext_urls(self, table_name: str = "citations") -> List[str]: """ Return list of fulltext_url values (non-null) from citations table. """ @@ -350,18 +348,17 @@ def list_fulltext_urls(self, db_conn_str: str, table_name: str = "citations") -> if conn: pass - def update_citation_fulltext(self, db_conn_str: str, citation_id: int, fulltext_path: str) -> int: + def update_citation_fulltext(self, citation_id: int, fulltext_path: str) -> int: """ Backwards-compatible helper used by some routers. Sets `fulltext_url`. """ - return self.update_text_column(db_conn_str, citation_id, "fulltext_url", fulltext_path) + return self.update_text_column(citation_id, "fulltext_url", fulltext_path) # ----------------------- # Upload fulltext and compute md5 # ----------------------- def attach_fulltext( self, - db_conn_str: str, citation_id: int, azure_path: str, file_bytes: bytes, @@ -373,7 +370,7 @@ def attach_fulltext( """ table_name = _validate_ident(table_name, kind="table_name") # create columns if missing - self.create_column(db_conn_str, "fulltext_url", "TEXT", table_name=table_name) + self.create_column("fulltext_url", "TEXT", table_name=table_name) # compute md5 md5 = hashlib.md5(file_bytes).hexdigest() if file_bytes is not None else "" @@ -383,15 +380,13 @@ def attach_fulltext( cur.execute(f'UPDATE "{table_name}" SET "fulltext_url" = %s WHERE id = %s', (azure_path, int(citation_id))) rows = cur.rowcount conn.commit() - - return rows # ----------------------- # Column get/set helpers # ----------------------- - def get_column_value(self, db_conn_str: str, citation_id: int, column: str, table_name: str = "citations") -> Any: + def get_column_value(self, citation_id: int, column: str, table_name: str = "citations") -> Any: """ Return the value stored in `column` for the citation row (or None). """ @@ -418,18 +413,18 @@ def get_column_value(self, db_conn_str: str, citation_id: int, column: str, tabl if conn: pass - def set_column_value(self, db_conn_str: str, citation_id: int, column: str, value: Any, table_name: str = "citations") -> int: + def set_column_value(self, citation_id: int, column: str, value: Any, table_name: str = "citations") -> int: """ Generic setter for a citation row column. Will create a TEXT column if it doesn't exist. """ # For simplicity, create a TEXT column. Callers that need JSONB should use update_jsonb_column. - self.create_column(db_conn_str, column, "TEXT", table_name=table_name) - return self.update_text_column(db_conn_str, citation_id, column, value if value is not None else None, table_name=table_name) + self.create_column(column, "TEXT", table_name=table_name) + return self.update_text_column(citation_id, column, value if value is not None else None, table_name=table_name) # ----------------------- # Per-upload table lifecycle helpers # ----------------------- - def drop_table(self, db_conn_str: str, table_name: str, cascade: bool = True) -> None: + def drop_table(self, table_name: str, cascade: bool = True) -> None: """Drop a screening table in the shared database.""" table_name = _validate_ident(table_name, kind="table_name") conn = None @@ -445,7 +440,6 @@ def drop_table(self, db_conn_str: str, table_name: str, cascade: bool = True) -> def create_table_and_insert_sync( self, - db_conn_str: str, table_name: str, columns: List[str], rows: List[Dict[str, Any]], diff --git a/backend/api/services/postgres_auth.py b/backend/api/services/postgres_auth.py index 9334c520..f6c0d2de 100644 --- a/backend/api/services/postgres_auth.py +++ b/backend/api/services/postgres_auth.py @@ -1,11 +1,24 @@ -""" -PostgreSQL authentication helper using Azure Entra ID (DefaultAzureCredential). +"""backend.api.services.postgres_auth + +PostgreSQL connection helper supporting three runtime modes. + +Configuration model: +* POSTGRES_MODE selects one profile: docker | local | azure +* Each profile has its own env var namespace to avoid accidental overrides: + - DOCKER_POSTGRES_* + - LOCAL_POSTGRES_* + - AZURE_POSTGRES_* -This module provides a centralized way to connect to Azure Database for PostgreSQL -using Entra ID authentication, with fallback to connection string for local development. +Behavior: +* Always try the configured POSTGRES_MODE first. +* If that fails, fall back to LOCAL (when fully configured). + +Notes: +* POSTGRES_URI is deprecated and intentionally not used. """ -from typing import Optional +import os +from typing import Optional, Dict, Any, List import psycopg2 from ..core.config import settings @@ -24,7 +37,7 @@ class PostgresServer: def __init__(self): self._verify_config() - self._credential = DefaultAzureCredential() if settings.AZURE_DB else None + self._credential = DefaultAzureCredential() if self._mode() == "azure" else None self._token: Optional[str] = None self._token_expiration: int = 0 self._conn = None @@ -33,14 +46,11 @@ def __init__(self): def conn(self): """Return an open connection, reconnecting only when necessary.""" if self._conn is None or self._conn.closed: - print("local database") self._conn = self._connect() - elif settings.AZURE_DB and self._is_token_expired(): + elif self._mode() == "azure" and self._is_token_expired(): logger.info("Azure token expired — reconnecting to PostgreSQL") - print("cloud database") self.close() self._conn = self._connect() - print(self._conn) return self._conn def close(self): @@ -55,11 +65,19 @@ def close(self): @staticmethod def _verify_config(): """Validate that all required PostgreSQL settings are present.""" - required = [settings.POSTGRES_HOST, settings.POSTGRES_DATABASE, settings.POSTGRES_USER] + mode = (settings.POSTGRES_MODE or "").lower().strip() + if mode not in {"local", "docker", "azure"}: + raise RuntimeError("POSTGRES_MODE must be one of: local, docker, azure") + + # Validate selected profile minimally; the rest is validated when building kwargs. + try: + prof = settings.postgres_profile(mode) + except Exception as e: + raise RuntimeError(str(e)) + + required = [prof.get("database"), prof.get("user")] if not all(required): - raise RuntimeError("POSTGRES_HOST, POSTGRES_DATABASE, and POSTGRES_USER are required") - if not settings.AZURE_DB and not settings.POSTGRES_PASSWORD: - raise RuntimeError("POSTGRES_PASSWORD is required when AZURE_DB is False") + raise RuntimeError(f"{mode} profile requires database and user") def _is_token_expired(self) -> bool: """Check whether the cached Azure token needs refreshing.""" @@ -70,36 +88,90 @@ def _refresh_azure_token(self) -> str: """Return a valid Azure token, fetching a new one only if expired.""" if self._is_token_expired(): logger.info("Fetching fresh Azure PostgreSQL token") + if not self._credential: + raise RuntimeError( + "Azure credential is not configured. Ensure POSTGRES_MODE=azure and that " + "DefaultAzureCredential can authenticate in this environment." + ) token = self._credential.get_token(self._AZURE_POSTGRES_SCOPE) self._token = token.token self._token_expiration = token.expires_on - self._TOKEN_REFRESH_BUFFER_SECONDS return self._token - def _build_connect_kwargs(self) -> dict: - """Assemble psycopg2.connect() keyword arguments from settings.""" - kwargs = { - "host": settings.POSTGRES_HOST, - "database": settings.POSTGRES_DATABASE, - "user": settings.POSTGRES_USER, - "port": settings.POSTGRES_PORT, + @staticmethod + def _mode() -> str: + return (settings.POSTGRES_MODE or "azure").lower().strip() + + @staticmethod + def _has_local_fallback() -> bool: + return bool(settings.has_local_fallback()) + + def _candidate_kwargs(self, mode: str) -> Dict[str, Any]: + """Build connect kwargs for a given mode based on namespaced env vars.""" + prof = settings.postgres_profile(mode) + + kwargs: Dict[str, Any] = { + "host": prof.get("host"), + "database": prof.get("database"), + "user": prof.get("user"), + "port": int(prof.get("port") or 5432), + # Fail fast so we can try fallbacks + "connect_timeout": int(os.getenv("POSTGRES_CONNECT_TIMEOUT", "3")), } - if settings.POSTGRES_SSL_MODE: - kwargs["sslmode"] = settings.POSTGRES_SSL_MODE - if settings.AZURE_DB: + + sslmode = prof.get("sslmode") + if sslmode: + kwargs["sslmode"] = sslmode + + if prof.get("mode") == "azure": kwargs["password"] = self._refresh_azure_token() - elif settings.POSTGRES_PASSWORD: - kwargs["password"] = settings.POSTGRES_PASSWORD + else: + if not prof.get("password"): + raise RuntimeError(f"{mode} profile requires password") + kwargs["password"] = prof.get("password") + + # Sanity checks + required = [kwargs.get("host"), kwargs.get("database"), kwargs.get("user"), kwargs.get("port")] + if not all(required): + raise RuntimeError(f"Incomplete Postgres config for mode={mode}") + return kwargs + def _connect_with_mode(self, mode: str): + kwargs = self._candidate_kwargs(mode) + safe_kwargs = {k: ("***" if k == "password" else v) for k, v in kwargs.items()} + logger.info("Connecting to Postgres (mode=%s) %s", mode, safe_kwargs) + return psycopg2.connect(**kwargs) + def _connect(self): - """Create a new psycopg2 connection.""" - return psycopg2.connect(**self._build_connect_kwargs()) + """Create a new psycopg2 connection, with fallback to local.""" + primary_mode = self._mode() + tried: List[str] = [] + + # Try primary + try: + tried.append(primary_mode) + return self._connect_with_mode(primary_mode) + except Exception as e: + logger.warning("Postgres connect failed (mode=%s): %s", primary_mode, e, exc_info=True) + + # Fallback to local (if not already local) + if primary_mode != "local" and self._has_local_fallback(): + try: + tried.append("local") + logger.info("Falling back to local Postgres connection") + return self._connect_with_mode("local") + except Exception as e: + logger.error("Postgres local fallback failed: %s", e, exc_info=True) + + raise psycopg2.OperationalError( + f"Could not connect to Postgres. Tried modes: {', '.join(tried)}" + ) def __repr__(self) -> str: status = "open" if self._conn and not self._conn.closed else "closed" return ( - f"" + f"" ) postgres_server = PostgresServer() \ No newline at end of file diff --git a/backend/api/services/sr_db_service.py b/backend/api/services/sr_db_service.py index 1dfaedce..4b4ccf14 100644 --- a/backend/api/services/sr_db_service.py +++ b/backend/api/services/sr_db_service.py @@ -27,7 +27,7 @@ def __init__(self): # Service is stateless; connection strings passed per-call pass - def ensure_table_exists(self, db_conn_str: str) -> None: + def ensure_table_exists(self) -> None: """ Ensure the systematic_reviews table exists in PostgreSQL. Creates the table if it doesn't exist. @@ -57,8 +57,6 @@ def ensure_table_exists(self, db_conn_str: str) -> None: """ cur.execute(create_table_sql) conn.commit() - - logger.info("Ensured systematic_reviews table exists") except Exception as e: @@ -157,7 +155,6 @@ def build_criteria_parsed(self, criteria_obj: Optional[Dict[str, Any]]) -> Dict[ def create_systematic_review( self, - db_conn_str: str, name: str, description: Optional[str], criteria_str: Optional[str], @@ -236,7 +233,7 @@ def create_systematic_review( if conn: pass - def add_user(self, db_conn_str: str, sr_id: str, target_user_id: str, requester_id: str) -> Dict[str, Any]: + def add_user(self, sr_id: str, target_user_id: str, requester_id: str) -> Dict[str, Any]: """ Add a user id to the SR's users list. Enforces that the SR exists and is visible; requester must be a member or owner. @@ -244,12 +241,12 @@ def add_user(self, db_conn_str: str, sr_id: str, target_user_id: str, requester_ """ - sr = self.get_systematic_review(db_conn_str, sr_id) + sr = self.get_systematic_review(sr_id) if not sr or not sr.get("visible", True): raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Systematic review not found") # Check permission - has_perm = self.user_has_sr_permission(db_conn_str, sr_id, requester_id) + has_perm = self.user_has_sr_permission(sr_id, requester_id) if not has_perm: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not authorized to modify this systematic review") @@ -294,19 +291,19 @@ def add_user(self, db_conn_str: str, sr_id: str, target_user_id: str, requester_ if conn: pass - def remove_user(self, db_conn_str: str, sr_id: str, target_user_id: str, requester_id: str) -> Dict[str, Any]: + def remove_user(self, sr_id: str, target_user_id: str, requester_id: str) -> Dict[str, Any]: """ Remove a user id from the SR's users list. Owner cannot be removed. Enforces requester permissions (must be a member or owner). """ - sr = self.get_systematic_review(db_conn_str, sr_id) + sr = self.get_systematic_review(sr_id) if not sr or not sr.get("visible", True): raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Systematic review not found") # Check permission - has_perm = self.user_has_sr_permission(db_conn_str, sr_id, requester_id) + has_perm = self.user_has_sr_permission(sr_id, requester_id) if not has_perm: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not authorized to modify this systematic review") @@ -354,7 +351,7 @@ def remove_user(self, db_conn_str: str, sr_id: str, target_user_id: str, request if conn: pass - def user_has_sr_permission(self, db_conn_str: str, sr_id: str, user_id: str) -> bool: + def user_has_sr_permission(self, sr_id: str, user_id: str) -> bool: """ Check whether the given user_id is a member (in 'users') or the owner of the SR. Returns True if the SR exists and the user is present in the SR's users list or is the owner. @@ -363,7 +360,7 @@ def user_has_sr_permission(self, db_conn_str: str, sr_id: str, user_id: str) -> """ - doc = self.get_systematic_review(db_conn_str, sr_id, ignore_visibility=True) + doc = self.get_systematic_review(sr_id, ignore_visibility=True) if not doc: return False @@ -372,7 +369,7 @@ def user_has_sr_permission(self, db_conn_str: str, sr_id: str, user_id: str) -> return True return False - def update_criteria(self, db_conn_str: str, sr_id: str, criteria_obj: Dict[str, Any], criteria_str: str, requester_id: str) -> Dict[str, Any]: + def update_criteria(self, sr_id: str, criteria_obj: Dict[str, Any], criteria_str: str, requester_id: str) -> Dict[str, Any]: """ Update the criteria fields (criteria, criteria_yaml, criteria_parsed, updated_at). The requester must be a member or owner. @@ -380,12 +377,12 @@ def update_criteria(self, db_conn_str: str, sr_id: str, criteria_obj: Dict[str, """ - sr = self.get_systematic_review(db_conn_str, sr_id) + sr = self.get_systematic_review(sr_id) if not sr or not sr.get("visible", True): raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Systematic review not found") # Check permission - has_perm = self.user_has_sr_permission(db_conn_str, sr_id, requester_id) + has_perm = self.user_has_sr_permission(sr_id, requester_id) if not has_perm: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not authorized to modify this systematic review") @@ -419,7 +416,7 @@ def update_criteria(self, db_conn_str: str, sr_id: str, criteria_obj: Dict[str, # Return fresh doc - doc = self.get_systematic_review(db_conn_str, sr_id) + doc = self.get_systematic_review(sr_id) return doc except HTTPException: @@ -431,7 +428,7 @@ def update_criteria(self, db_conn_str: str, sr_id: str, criteria_obj: Dict[str, if conn: pass - def list_systematic_reviews_for_user(self, db_conn_str: str, user_email: str) -> List[Dict[str, Any]]: + def list_systematic_reviews_for_user(self, user_email: str) -> List[Dict[str, Any]]: """ Return all SR documents where the user is a member (regardless of visible flag). """ @@ -484,7 +481,7 @@ def list_systematic_reviews_for_user(self, db_conn_str: str, user_email: str) -> if conn: pass - def get_systematic_review(self, db_conn_str: str, sr_id: str, ignore_visibility: bool = False) -> Optional[Dict[str, Any]]: + def get_systematic_review(self, sr_id: str, ignore_visibility: bool = False) -> Optional[Dict[str, Any]]: """ Return SR document by id. Returns None if not found. If ignore_visibility is False, only returns visible SRs. @@ -535,14 +532,14 @@ def get_systematic_review(self, db_conn_str: str, sr_id: str, ignore_visibility: if conn: pass - def set_visibility(self, db_conn_str: str, sr_id: str, visible: bool, requester_id: str) -> Dict[str, Any]: + def set_visibility(self, sr_id: str, visible: bool, requester_id: str) -> Dict[str, Any]: """ Set the visible flag on the SR. Only owner is allowed to change visibility. Returns update metadata. """ - sr = self.get_systematic_review(db_conn_str, sr_id, ignore_visibility=True) + sr = self.get_systematic_review(sr_id, ignore_visibility=True) if not sr: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Systematic review not found") @@ -573,26 +570,26 @@ def set_visibility(self, db_conn_str: str, sr_id: str, visible: bool, requester_ if conn: pass - def soft_delete_systematic_review(self, db_conn_str: str, sr_id: str, requester_id: str) -> Dict[str, Any]: + def soft_delete_systematic_review(self, sr_id: str, requester_id: str) -> Dict[str, Any]: """ Soft-delete (set visible=False). Only owner may delete. """ - return self.set_visibility(db_conn_str, sr_id, False, requester_id) + return self.set_visibility(sr_id, False, requester_id) - def undelete_systematic_review(self, db_conn_str: str, sr_id: str, requester_id: str) -> Dict[str, Any]: + def undelete_systematic_review(self, sr_id: str, requester_id: str) -> Dict[str, Any]: """ Undelete (set visible=True). Only owner may undelete. """ - return self.set_visibility(db_conn_str, sr_id, True, requester_id) + return self.set_visibility(sr_id, True, requester_id) - def hard_delete_systematic_review(self, db_conn_str: str, sr_id: str, requester_id: str) -> Dict[str, Any]: + def hard_delete_systematic_review(self, sr_id: str, requester_id: str) -> Dict[str, Any]: """ Permanently remove the SR document. Only owner may hard delete. Returns deletion metadata (deleted_count). """ - sr = self.get_systematic_review(db_conn_str, sr_id, ignore_visibility=True) + sr = self.get_systematic_review(sr_id, ignore_visibility=True) if not sr: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Systematic review not found") @@ -618,7 +615,7 @@ def hard_delete_systematic_review(self, db_conn_str: str, sr_id: str, requester_ pass - def update_screening_db_info(self, db_conn_str: str, sr_id: str, screening_db: Dict[str, Any]) -> None: + def update_screening_db_info(self, sr_id: str, screening_db: Dict[str, Any]) -> None: """ Update the screening_db field in the SR document with screening database metadata. """ @@ -645,7 +642,7 @@ def update_screening_db_info(self, db_conn_str: str, sr_id: str, screening_db: D if conn: pass - def clear_screening_db_info(self, db_conn_str: str, sr_id: str) -> None: + def clear_screening_db_info(self, sr_id: str) -> None: """ Remove the screening_db field from the SR document. """ diff --git a/backend/api/sr/router.py b/backend/api/sr/router.py index 1db2b27e..7fd9789d 100644 --- a/backend/api/sr/router.py +++ b/backend/api/sr/router.py @@ -28,28 +28,6 @@ router = APIRouter() -# Helper to get database connection string -def _get_db_conn_str() -> Optional[str]: - """ - Get database connection string for PostgreSQL. - - If POSTGRES_URI is set, returns it directly (local development). - If Entra ID env variables are configured (POSTGRES_HOST, POSTGRES_DATABASE, POSTGRES_USER), - returns None to signal that connect_postgres() should use Entra ID authentication. - """ - if settings.POSTGRES_URI: - return settings.POSTGRES_URI - - # If Entra ID config is available, return None to let connect_postgres use token auth - if settings.POSTGRES_HOST and settings.POSTGRES_DATABASE and settings.POSTGRES_USER: - return None - - # No configuration available - raise ValueError( - "PostgreSQL not configured. Set POSTGRES_URI for local development, " - "or POSTGRES_HOST, POSTGRES_DATABASE, and POSTGRES_USER for Entra ID authentication." - ) - class SystematicReviewCreate(BaseModel): name: str description: Optional[str] = None @@ -98,7 +76,6 @@ async def create_systematic_review( One of criteria_file or criteria_yaml may be provided. If both are provided, criteria_file takes precedence. The created SR is stored in PostgreSQL and the creating user is added as the first member. """ - db_conn_str = _get_db_conn_str() if not name or not name.strip(): raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="name is required") @@ -134,7 +111,6 @@ async def create_systematic_review( try: sr_doc = await run_in_threadpool( srdb_service.create_systematic_review, - db_conn_str, name, description, criteria_str, @@ -187,9 +163,8 @@ async def add_user_to_systematic_review( The endpoint checks that the requester is a member of the SR. """ - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service, require_screening=False) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -203,7 +178,7 @@ async def add_user_to_systematic_review( raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Missing data user_email") try: - res = await run_in_threadpool(srdb_service.add_user, db_conn_str, sr_id, target_user_id, current_user.get("id")) + res = await run_in_threadpool(srdb_service.add_user, sr_id, target_user_id, current_user.get("id")) except HTTPException: raise except Exception as e: @@ -225,10 +200,8 @@ async def remove_user_from_systematic_review( The endpoint checks that the requester is a member of the SR (or owner). The owner cannot be removed via this endpoint. """ - - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service, require_screening=False) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -246,7 +219,7 @@ async def remove_user_from_systematic_review( raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Cannot remove the owner from the systematic review") try: - res = await run_in_threadpool(srdb_service.remove_user, db_conn_str, sr_id, target_user_id, current_user.get("id")) + res = await run_in_threadpool(srdb_service.remove_user, sr_id, target_user_id, current_user.get("id")) except HTTPException: raise except Exception as e: @@ -263,12 +236,11 @@ async def list_systematic_reviews_for_user( List all systematic reviews the current user has access to (is a member of). Hidden/deleted SRs (visible == False) are excluded. """ - db_conn_str = _get_db_conn_str() user_id = current_user.get("email") results = [] try: - docs = await run_in_threadpool(srdb_service.list_systematic_reviews_for_user, db_conn_str, user_id) + docs = await run_in_threadpool(srdb_service.list_systematic_reviews_for_user, user_id) except HTTPException: raise except Exception as e: @@ -301,9 +273,8 @@ async def get_systematic_review(sr_id: str, current_user: Dict[str, Any] = Depen Get a single systematic review by id. User must be a member to view. """ - db_conn_str = _get_db_conn_str() try: - doc, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service, require_screening=False) + doc, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -336,9 +307,8 @@ async def get_systematic_review_criteria_parsed( Returns an empty dict if no parsed criteria are available. """ - db_conn_str = _get_db_conn_str() try: - doc, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service, require_screening=False) + doc, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -363,9 +333,8 @@ async def update_systematic_review_criteria( The parsed criteria (dict) and the raw YAML are both saved to the SR document. """ - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service, require_screening=False) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -402,7 +371,7 @@ async def update_systematic_review_criteria( # perform update try: - doc = await run_in_threadpool(srdb_service.update_criteria, db_conn_str, sr_id, criteria_obj, criteria_str, current_user.get("id")) + doc = await run_in_threadpool(srdb_service.update_criteria, sr_id, criteria_obj, criteria_str, current_user.get("id")) except HTTPException: raise except Exception as e: @@ -432,9 +401,8 @@ async def delete_systematic_review(sr_id: str, current_user: Dict[str, Any] = De Only the owner may delete a systematic review. """ - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service, require_screening=False) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -445,7 +413,7 @@ async def delete_systematic_review(sr_id: str, current_user: Dict[str, Any] = De raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Only the owner may delete this systematic review") try: - res = await run_in_threadpool(srdb_service.soft_delete_systematic_review, db_conn_str, sr_id, requester_id) + res = await run_in_threadpool(srdb_service.soft_delete_systematic_review, sr_id, requester_id) except HTTPException: raise except Exception as e: @@ -462,9 +430,8 @@ async def undelete_systematic_review(sr_id: str, current_user: Dict[str, Any] = Only the owner may undelete a systematic review. """ - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service, require_screening=False, require_visible=False) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False, require_visible=False) except HTTPException: raise except Exception as e: @@ -475,7 +442,7 @@ async def undelete_systematic_review(sr_id: str, current_user: Dict[str, Any] = raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Only the owner may undelete this systematic review") try: - res = await run_in_threadpool(srdb_service.undelete_systematic_review, db_conn_str, sr_id, requester_id) + res = await run_in_threadpool(srdb_service.undelete_systematic_review, sr_id, requester_id) except HTTPException: raise except Exception as e: @@ -495,9 +462,8 @@ async def hard_delete_systematic_review(sr_id: str, current_user: Dict[str, Any] Only the owner may perform a hard delete. """ - db_conn_str = _get_db_conn_str() try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, db_conn_str, srdb_service, require_screening=False, require_visible=False) + sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False, require_visible=False) except HTTPException: raise except Exception as e: @@ -526,7 +492,7 @@ async def hard_delete_systematic_review(sr_id: str, current_user: Dict[str, Any] cleanup_result = {"status": "cleanup_import_failed", "error": str(e)} try: - res = await run_in_threadpool(srdb_service.hard_delete_systematic_review, db_conn_str, sr_id, requester_id) + res = await run_in_threadpool(srdb_service.hard_delete_systematic_review, sr_id, requester_id) deleted_count = res.get("deleted_count") if not deleted_count: # If backend reported zero deletions, raise NotFound to match prior behavior diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index 76b9fb6a..06204188 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -11,7 +11,6 @@ services: - "8000:8000" environment: - GROBID_SERVICE_URL=http://grobid-service:8070 - - POSTGRES_URI=postgres://admin:password@pgdb-service:5432/postgres env_file: - .env depends_on: diff --git a/backend/main.py b/backend/main.py index e89158e2..cbcc8f97 100644 --- a/backend/main.py +++ b/backend/main.py @@ -31,17 +31,10 @@ async def startup_event(): print("📚 Initializing systematic review database...", flush=True) # Ensure systematic review table exists in PostgreSQL try: - # Check if Entra ID or POSTGRES_URI is configured - has_entra_config = settings.POSTGRES_HOST and settings.POSTGRES_DATABASE and settings.POSTGRES_USER - has_uri_config = settings.POSTGRES_URI - - if has_entra_config or has_uri_config: - # Pass connection string if available, otherwise None for Entra ID auth - db_conn_str = settings.POSTGRES_URI if has_uri_config else None - await run_in_threadpool(srdb_service.ensure_table_exists, db_conn_str) - print("✓ Systematic review table initialized", flush=True) - else: - print("⚠️ PostgreSQL not configured - skipping SR table initialization", flush=True) + # POSTGRES_URI is deprecated; the DB connection is handled by postgres_server + # using POSTGRES_MODE/POSTGRES_* settings. + await run_in_threadpool(srdb_service.ensure_table_exists) + print("✓ Systematic review table initialized", flush=True) except Exception as e: print(f"⚠️ Failed to ensure SR table exists: {e}", flush=True) print("🎯 CAN-SR Backend ready!", flush=True) From 03c035ead999186e5c930e83792f4cd86a996a62 Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 00:09:50 -0500 Subject: [PATCH 02/13] fixed storage - local / azure selection --- README.md | 15 + backend/README.md | 24 +- backend/api/citations/router.py | 7 +- backend/api/core/config.py | 39 +- backend/api/core/security.py | 4 +- backend/api/extract/router.py | 14 +- backend/api/files/router.py | 37 +- backend/api/services/postgres_auth.py | 6 +- backend/api/services/storage.py | 650 ++++++++++++------ backend/api/services/user_db.py | 227 ++---- backend/api/sr/router.py | 2 +- backend/deploy.sh | 1 + .../public/images/backgrounds/homepage.jpg | Bin 107667 -> 441785 bytes .../public/images/backgrounds/homepage_hc.jpg | Bin 0 -> 107667 bytes frontend/tsconfig.json | 2 +- 15 files changed, 605 insertions(+), 423 deletions(-) create mode 100644 frontend/public/images/backgrounds/homepage_hc.jpg diff --git a/README.md b/README.md index 0ae6b5a3..a58b316c 100644 --- a/README.md +++ b/README.md @@ -221,7 +221,22 @@ AZURE_OPENAI_ENDPOINT=your-endpoint AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o # Storage +# STORAGE_TYPE is strict: local | azure | entra +STORAGE_TYPE=local + +# local storage +LOCAL_STORAGE_BASE_PATH=uploads +LOCAL_STORAGE_CONTAINER_NAME=users + +# azure storage (connection string) +# STORAGE_TYPE=azure AZURE_STORAGE_CONNECTION_STRING=your-connection-string +AZURE_STORAGE_CONTAINER_NAME=your-container + +# entra storage (Managed Identity / DefaultAzureCredential) +# STORAGE_TYPE=entra +ENTRA_AZURE_STORAGE_ACCOUNT_NAME=youraccount +ENTRA_AZURE_STORAGE_CONTAINER_NAME=your-container # Databases MONGODB_URI=mongodb://sr-mongodb-service:27017/mongodb-sr diff --git a/backend/README.md b/backend/README.md index aa86d4f0..00b7f5cd 100644 --- a/backend/README.md +++ b/backend/README.md @@ -15,7 +15,7 @@ CAN-SR Backend provides a production-ready REST API for managing systematic revi - **PDF Processing** - Full-text extraction using GROBID - **Azure OpenAI Integration** - GPT-4o, GPT-4o-mini, GPT-3.5-turbo for AI features - **JWT Authentication** - Secure user authentication -- **Azure Blob Storage** - Scalable document storage +- **Storage** - Local filesystem or Azure Blob Storage (connection string or Entra) ## Architecture @@ -51,8 +51,23 @@ AZURE_OPENAI_API_KEY=your-azure-openai-api-key AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o -# Azure Storage (Required) +# Storage +# STORAGE_TYPE is strict: local | azure | entra +STORAGE_TYPE=local + +# local storage +LOCAL_STORAGE_BASE_PATH=uploads +LOCAL_STORAGE_CONTAINER_NAME=users + +# azure storage (connection string) +# STORAGE_TYPE=azure AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=... +AZURE_STORAGE_CONTAINER_NAME=your-container + +# entra storage (Managed Identity / DefaultAzureCredential) +# STORAGE_TYPE=entra +ENTRA_AZURE_STORAGE_ACCOUNT_NAME=youraccount +ENTRA_AZURE_STORAGE_CONTAINER_NAME=your-container # Databases (Docker defaults - change for production) @@ -237,7 +252,10 @@ docker compose restart api | `AZURE_OPENAI_API_KEY` | Azure OpenAI API key | `abc123...` | | `AZURE_OPENAI_ENDPOINT` | Azure OpenAI endpoint URL | `https://your-resource.openai.azure.com` | | `AZURE_OPENAI_DEPLOYMENT_NAME` | Model deployment name | `gpt-4o` | -| `AZURE_STORAGE_CONNECTION_STRING` | Azure Blob Storage connection | `DefaultEndpointsProtocol=https;...` | +| `STORAGE_TYPE` | Storage backend selector | `local` | +| `LOCAL_STORAGE_BASE_PATH` | Local storage base path (when local) | `uploads` | +| `AZURE_STORAGE_CONNECTION_STRING` | Azure Blob (when STORAGE_TYPE=azure) | `DefaultEndpointsProtocol=https;...` | +| `ENTRA_AZURE_STORAGE_ACCOUNT_NAME` | Azure account (when STORAGE_TYPE=entra) | `mystorageacct` | | `SECRET_KEY` | JWT token signing key | `your-secure-secret-key` | ### Optional Variables diff --git a/backend/api/citations/router.py b/backend/api/citations/router.py index 35c0c89b..053efb3a 100644 --- a/backend/api/citations/router.py +++ b/backend/api/citations/router.py @@ -504,12 +504,13 @@ async def hard_delete_screening_resources(sr_id: str, current_user: Dict[str, An parsed_ok = False if not parsed_ok: - # fallback: try direct deletion via blob client (best-effort) + # fallback: delete by storage path (works for both azure/local) if storage_service: try: - blob_client = storage_service.blob_service_client.get_blob_client(container=container, blob=blob) - blob_client.delete_blob() + await storage_service.delete_by_path(f"{container}/{blob}") deleted_files += 1 + except FileNotFoundError: + failed_files += 1 except Exception: failed_files += 1 else: diff --git a/backend/api/core/config.py b/backend/api/core/config.py index 03d4526a..177c6715 100644 --- a/backend/api/core/config.py +++ b/backend/api/core/config.py @@ -1,4 +1,5 @@ import os +from pathlib import Path from typing import List, Optional from pydantic import Field, field_validator from pydantic_settings import BaseSettings @@ -21,13 +22,14 @@ class Settings(BaseSettings): DESCRIPTION: str = os.getenv( "DESCRIPTION", "AI-powered systematic review platform for Government of Canada" ) - IS_DEPLOYED: bool = os.getenv("IS_DEPLOYED") + IS_DEPLOYED: bool = os.getenv("IS_DEPLOYED", "false").lower() == "true" # CORS CORS_ORIGINS: str = os.getenv("CORS_ORIGINS", "*") # Storage settings - STORAGE_TYPE: str = os.getenv("STORAGE_TYPE", "azure") + # Storage selection (strict): local | azure | entra + STORAGE_TYPE: str = os.getenv("STORAGE_TYPE", "azure").lower().strip() AZURE_STORAGE_ACCOUNT_NAME: Optional[str] = os.getenv( "AZURE_STORAGE_ACCOUNT_NAME" ) @@ -38,6 +40,18 @@ class Settings(BaseSettings): "AZURE_STORAGE_CONTAINER_NAME", "can-sr-storage" ) + # Entra storage settings (used when STORAGE_TYPE=entra) + ENTRA_AZURE_STORAGE_ACCOUNT_NAME: Optional[str] = os.getenv("ENTRA_AZURE_STORAGE_ACCOUNT_NAME") + ENTRA_AZURE_STORAGE_CONTAINER_NAME: str = os.getenv("ENTRA_AZURE_STORAGE_CONTAINER_NAME", "can-sr-storage") + + # Local storage settings (used when STORAGE_TYPE=local) + # In docker, default path is backed by the compose volume: ./uploads:/app/uploads + # Default to a relative directory so it works both locally and in docker: + # - locally: /backend/uploads + # - in docker: /app/uploads + LOCAL_STORAGE_BASE_PATH: str = os.getenv("LOCAL_STORAGE_BASE_PATH", "uploads") + LOCAL_STORAGE_CONTAINER_NAME: str = os.getenv("LOCAL_STORAGE_CONTAINER_NAME", "users") + # File upload settings MAX_FILE_SIZE: int = Field(default=52428800) # 50MB in bytes ALLOWED_FILE_TYPES: List[str] = [".pdf", ".txt", ".docx", ".doc"] @@ -183,24 +197,25 @@ def has_local_fallback(self) -> bool: return bool(self.LOCAL_POSTGRES_DATABASE and self.LOCAL_POSTGRES_USER and self.LOCAL_POSTGRES_PASSWORD) # Databricks settings - DATABRICKS_INSTANCE: str = os.getenv("DATABRICKS_INSTANCE") - DATABRICKS_TOKEN: str = os.getenv("DATABRICKS_TOKEN") - JOB_ID_EUROPEPMC: str = os.getenv("JOB_ID_EUROPEPMC") - JOB_ID_PUBMED: str = os.getenv("JOB_ID_PUBMED") - JOB_ID_SCOPUS: str = os.getenv("JOB_ID_SCOPUS") + DATABRICKS_INSTANCE: str = os.getenv("DATABRICKS_INSTANCE", "") + DATABRICKS_TOKEN: str = os.getenv("DATABRICKS_TOKEN", "") + JOB_ID_EUROPEPMC: str = os.getenv("JOB_ID_EUROPEPMC", "") + JOB_ID_PUBMED: str = os.getenv("JOB_ID_PUBMED", "") + JOB_ID_SCOPUS: str = os.getenv("JOB_ID_SCOPUS", "") # OAuth - OAUTH_CLIENT_ID: str = os.getenv("OAUTH_CLIENT_ID") - OAUTH_CLIENT_SECRET: str = os.getenv("OAUTH_CLIENT_SECRET") - REDIRECT_URI: str = os.getenv("REDIRECT_URI") - SSO_LOGIN_URL: str = os.getenv("SSO_LOGIN_URL") + OAUTH_CLIENT_ID: str = os.getenv("OAUTH_CLIENT_ID", "") + OAUTH_CLIENT_SECRET: str = os.getenv("OAUTH_CLIENT_SECRET", "") + REDIRECT_URI: str = os.getenv("REDIRECT_URI", "") + SSO_LOGIN_URL: str = os.getenv("SSO_LOGIN_URL", "") # Entra USE_ENTRA_AUTH: bool = os.getenv("USE_ENTRA_AUTH", "false").lower() == "true" class Config: case_sensitive = True - env_file = ".env" + # Resolve to backend/.env regardless of current working directory. + env_file = str(Path(__file__).resolve().parents[2] / ".env") extra = "ignore" # Allow extra environment variables diff --git a/backend/api/core/security.py b/backend/api/core/security.py index 6b584dc2..508cfcb0 100644 --- a/backend/api/core/security.py +++ b/backend/api/core/security.py @@ -60,7 +60,7 @@ async def create_user(user_data: UserCreate) -> Optional[UserRead]: if not user_db_service: raise HTTPException( status_code=status.HTTP_503_SERVICE_UNAVAILABLE, - detail="User registration is not available without Azure Storage configuration", + detail="User registration is not available without configured storage", ) return await user_db_service.create_user(user_data) @@ -71,7 +71,7 @@ async def update_user(user_id: str, user_in: UserUpdate) -> Optional[UserRead]: if not user_db_service: raise HTTPException( status_code=status.HTTP_503_SERVICE_UNAVAILABLE, - detail="User operations are not available without Azure Storage configuration", + detail="User operations are not available without configured storage", ) update_data = user_in.model_dump(exclude_unset=True) diff --git a/backend/api/extract/router.py b/backend/api/extract/router.py index 8c7240b0..93f2dc41 100644 --- a/backend/api/extract/router.py +++ b/backend/api/extract/router.py @@ -370,16 +370,14 @@ async def extract_fulltext_from_storage( if not storage_path: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="No fulltext storage path found on citation row") - if "/" not in storage_path: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Unrecognized storage path format") - - container, blob = storage_path.split("/", 1) - try: - blob_client = storage_service.blob_service_client.get_blob_client(container=container, blob=blob) - content = blob_client.download_blob().readall() + content, _filename = await storage_service.get_bytes_by_path(storage_path) + except FileNotFoundError: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Fulltext file not found in storage") + except ValueError: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Unrecognized storage path format") except Exception as e: - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Failed to download blob: {e}") + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Failed to download from storage: {e}") # If the citation row already contains an extracted full text in the "fulltext" column, # only use it if the stored md5 matches the pdf we just downloaded. diff --git a/backend/api/files/router.py b/backend/api/files/router.py index 107d565e..b3c769fe 100644 --- a/backend/api/files/router.py +++ b/backend/api/files/router.py @@ -5,7 +5,6 @@ import os import logging from datetime import datetime, timezone -from azure.core.exceptions import ResourceNotFoundError from fastapi import ( APIRouter, @@ -206,9 +205,10 @@ async def download_by_path( path: str, current_user: Dict[str, Any] = Depends(get_current_active_user), ): - """ - Stream a blob directly by storage path in the form 'container/blob_path' - Example storage_path: "container/users/123/docid_filename.pdf" + """Download directly by storage path in the form 'container/blob_path'. + + This works for both Azure and local storage backends. + Example: "users/users/123/documents/_.pdf" """ try: if not storage_service: @@ -217,29 +217,14 @@ async def download_by_path( detail="Storage service not available", ) - # Basic validation: expect "container/blob" - if not path or "/" not in path: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Invalid storage path" - ) - - container, blob = path.split("/", 1) - logger.info(f"Downloading blob: container={container}, blob={blob}") - try: - blob_client = storage_service.blob_service_client.get_blob_client( - container=container, blob=blob - ) - stream = blob_client.download_blob() - content = stream.readall() - except ResourceNotFoundError: - raise HTTPException( - status_code=status.HTTP_404_NOT_FOUND, - detail="Blob not found" - ) - - filename = os.path.basename(blob) or "download" + content, filename = await storage_service.get_bytes_by_path(path) + except FileNotFoundError: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="File not found") + except ValueError: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid storage path") + except Exception as e: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Failed to download: {e}") def gen(): yield content diff --git a/backend/api/services/postgres_auth.py b/backend/api/services/postgres_auth.py index f6c0d2de..918d0ee4 100644 --- a/backend/api/services/postgres_auth.py +++ b/backend/api/services/postgres_auth.py @@ -24,7 +24,11 @@ from ..core.config import settings import logging import datetime -from azure.identity import DefaultAzureCredential + +try: + from azure.identity import DefaultAzureCredential +except Exception: # pragma: no cover + DefaultAzureCredential = None # type: ignore logger = logging.getLogger(__name__) diff --git a/backend/api/services/storage.py b/backend/api/services/storage.py index b7595416..98ae2a6a 100644 --- a/backend/api/services/storage.py +++ b/backend/api/services/storage.py @@ -1,53 +1,96 @@ -"""Azure Blob Storage service for user data management""" +"""backend.api.services.storage + +Storage abstraction for CAN-SR. + +Supported backends (selected via STORAGE_TYPE): +* local - Local filesystem storage (backed by docker compose volume) +* azure - Azure Blob Storage via **connection string** (strict) +* entra - Azure Blob Storage via **DefaultAzureCredential** (Entra/Managed Identity) (strict) + +Routers should not access Azure SDK objects directly. +""" + +from __future__ import annotations import json import logging +import os import uuid from datetime import datetime, timezone -from typing import Dict, List, Optional, Any - -from azure.identity import DefaultAzureCredential -from azure.storage.blob import BlobServiceClient -from azure.core.exceptions import ResourceNotFoundError +from pathlib import Path +from typing import Any, Dict, List, Optional, Protocol, Tuple + +try: + from azure.core.exceptions import ResourceNotFoundError + from azure.identity import DefaultAzureCredential + from azure.storage.blob import BlobServiceClient +except Exception: # pragma: no cover + # Allow local-storage deployments/environments to import without azure packages. + ResourceNotFoundError = Exception # type: ignore + DefaultAzureCredential = None # type: ignore + BlobServiceClient = None # type: ignore from ..core.config import settings -from ..utils.file_hash import calculate_file_hash, create_file_metadata +from ..utils.file_hash import create_file_metadata logger = logging.getLogger(__name__) +class StorageService(Protocol): + """Common API that both Azure and local storage must implement.""" + + container_name: str + + async def create_user_directory(self, user_id: str) -> bool: ... + async def save_user_profile(self, user_id: str, profile_data: Dict[str, Any]) -> bool: ... + async def get_user_profile(self, user_id: str) -> Optional[Dict[str, Any]]: ... + async def upload_user_document(self, user_id: str, filename: str, file_content: bytes) -> Optional[str]: ... + async def get_user_document(self, user_id: str, doc_id: str, filename: str) -> Optional[bytes]: ... + async def list_user_documents(self, user_id: str) -> List[Dict[str, Any]]: ... + async def delete_user_document(self, user_id: str, doc_id: str, filename: str) -> bool: ... + async def put_bytes_by_path(self, path: str, content: bytes, content_type: str = "application/octet-stream") -> bool: ... + async def get_bytes_by_path(self, path: str) -> Tuple[bytes, str]: ... + async def delete_by_path(self, path: str) -> bool: ... + + +# ============================================================================= +# Azure Blob Storage +# ============================================================================= + + class AzureStorageService: - """Service for managing user data in Azure Blob Storage""" + """Service for managing user data in Azure Blob Storage.""" - def __init__(self): - if not settings.AZURE_STORAGE_ACCOUNT_NAME and not settings.AZURE_STORAGE_CONNECTION_STRING: - raise ValueError("AZURE_STORAGE_ACCOUNT_NAME or AZURE_STORAGE_CONNECTION_STRING must be configured") + def __init__(self, *, account_url: str | None = None, connection_string: str | None = None, container_name: str): + if not BlobServiceClient: + raise RuntimeError( + "Azure storage libraries are not installed. Install azure-identity and azure-storage-blob, or use STORAGE_TYPE=local." + ) - if settings.AZURE_STORAGE_ACCOUNT_NAME: - account_url = f"https://{settings.AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net" + if bool(account_url) == bool(connection_string): + raise ValueError("Exactly one of account_url or connection_string must be provided") + + if connection_string: + self.blob_service_client = BlobServiceClient.from_connection_string(connection_string) + else: + if not DefaultAzureCredential: + raise RuntimeError( + "azure-identity is not installed. Install azure-identity, or use STORAGE_TYPE=azure (connection string) or local." + ) credential = DefaultAzureCredential() - self.blob_service_client = BlobServiceClient( - account_url=account_url, credential=credential - ) - elif settings.AZURE_STORAGE_CONNECTION_STRING: - self.blob_service_client = BlobServiceClient.from_connection_string( - settings.AZURE_STORAGE_CONNECTION_STRING - ) - self.container_name = settings.AZURE_STORAGE_CONTAINER_NAME + self.blob_service_client = BlobServiceClient(account_url=account_url, credential=credential) + self.container_name = container_name self._ensure_container_exists() def _ensure_container_exists(self): - """Ensure the storage container exists""" try: self.blob_service_client.create_container(self.container_name) except Exception: pass async def create_user_directory(self, user_id: str) -> bool: - """Create directory structure for a new user""" try: - # Create user profile profile_data = { "user_id": user_id, "created_at": datetime.now(timezone.utc).isoformat(), @@ -59,70 +102,43 @@ async def create_user_directory(self, user_id: str) -> bool: await self.save_user_profile(user_id, profile_data) # Create placeholder file to establish directory structure - directories = [f"users/{user_id}/documents/"] - - for directory in directories: - blob_name = f"{directory}.placeholder" - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob_name - ) - blob_client.upload_blob("", overwrite=True) - + blob_name = f"users/{user_id}/documents/.placeholder" + blob_client = self.blob_service_client.get_blob_client(container=self.container_name, blob=blob_name) + blob_client.upload_blob(b"", overwrite=True) return True except Exception as e: - logger.error(f"Error creating user directory for {user_id}: {e}") + logger.error("Error creating user directory for %s: %s", user_id, e) return False - async def save_user_profile( - self, user_id: str, profile_data: Dict[str, Any] - ) -> bool: - """Save user profile data""" + async def save_user_profile(self, user_id: str, profile_data: Dict[str, Any]) -> bool: try: blob_name = f"users/{user_id}/profile.json" - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob_name - ) - - profile_json = json.dumps(profile_data, indent=2) - blob_client.upload_blob(profile_json, overwrite=True) + blob_client = self.blob_service_client.get_blob_client(container=self.container_name, blob=blob_name) + blob_client.upload_blob(json.dumps(profile_data, indent=2), overwrite=True) return True except Exception as e: - logger.error(f"Error saving user profile for {user_id}: {e}") + logger.error("Error saving user profile for %s: %s", user_id, e) return False async def get_user_profile(self, user_id: str) -> Optional[Dict[str, Any]]: - """Get user profile data""" try: blob_name = f"users/{user_id}/profile.json" - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob_name - ) - + blob_client = self.blob_service_client.get_blob_client(container=self.container_name, blob=blob_name) blob_data = blob_client.download_blob().readall() return json.loads(blob_data.decode("utf-8")) except ResourceNotFoundError: return None except Exception as e: - logger.error(f"Error getting user profile for {user_id}: {e}") + logger.error("Error getting user profile for %s: %s", user_id, e) return None - async def upload_user_document( - self, user_id: str, filename: str, file_content: bytes - ) -> Optional[str]: - """Upload a document for a user with hash metadata for duplicate detection""" + async def upload_user_document(self, user_id: str, filename: str, file_content: bytes) -> Optional[str]: try: - # Generate unique document ID doc_id = str(uuid.uuid4()) blob_name = f"users/{user_id}/documents/{doc_id}_{filename}" - - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob_name - ) - - # Upload the file + blob_client = self.blob_service_client.get_blob_client(container=self.container_name, blob=blob_name) blob_client.upload_blob(file_content, overwrite=True) - # Create and save file metadata with hash file_metadata = create_file_metadata( filename, file_content, @@ -132,235 +148,441 @@ async def upload_user_document( "upload_date": datetime.now(timezone.utc).isoformat(), }, ) - await self.save_file_hash_metadata(user_id, doc_id, file_metadata) - # Update user profile profile = await self.get_user_profile(user_id) if profile: - profile["document_count"] += 1 - profile["storage_used"] += len(file_content) + profile["document_count"] = int(profile.get("document_count", 0)) + 1 + profile["storage_used"] = int(profile.get("storage_used", 0)) + len(file_content) profile["last_updated"] = datetime.now(timezone.utc).isoformat() await self.save_user_profile(user_id, profile) return doc_id except Exception as e: - logger.error(f"Error uploading document {filename} for user {user_id}: {e}") + logger.error("Error uploading document %s for user %s: %s", filename, user_id, e) return None - async def get_user_document( - self, user_id: str, doc_id: str, filename: str - ) -> Optional[bytes]: - """Get a user's document""" + async def get_user_document(self, user_id: str, doc_id: str, filename: str) -> Optional[bytes]: try: blob_name = f"users/{user_id}/documents/{doc_id}_{filename}" - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob_name - ) - + blob_client = self.blob_service_client.get_blob_client(container=self.container_name, blob=blob_name) return blob_client.download_blob().readall() except ResourceNotFoundError: return None except Exception as e: - logger.error(f"Error getting document {doc_id} for user {user_id}: {e}") + logger.error("Error getting document %s for user %s: %s", doc_id, user_id, e) return None async def list_user_documents(self, user_id: str) -> List[Dict[str, Any]]: - """List all documents for a user - SIMPLIFIED""" try: prefix = f"users/{user_id}/documents/" - blobs = self.blob_service_client.get_container_client( - self.container_name - ).list_blobs(name_starts_with=prefix) + blobs = self.blob_service_client.get_container_client(self.container_name).list_blobs(name_starts_with=prefix) - documents = [] + documents: List[Dict[str, Any]] = [] for blob in blobs: - if not blob.name.endswith(".placeholder"): - # Extract doc_id and filename from blob name - blob_filename = blob.name.replace(prefix, "") - if "_" in blob_filename: - doc_id, filename = blob_filename.split("_", 1) - - # Get hash metadata if available - hash_metadata = await self.get_file_hash_metadata( - user_id, doc_id - ) - - document_info = { - "document_id": doc_id, - "filename": filename, - "file_size": blob.size, - "upload_date": blob.last_modified.isoformat(), - "last_modified": blob.last_modified.isoformat(), - } - - # Add hash information if available - if hash_metadata: - document_info["file_hash"] = hash_metadata.get("file_hash") - document_info["signature"] = hash_metadata.get("signature") - - documents.append(document_info) + if blob.name.endswith(".placeholder"): + continue + blob_filename = blob.name.replace(prefix, "") + if "_" not in blob_filename: + continue + doc_id, filename = blob_filename.split("_", 1) + + hash_metadata = await self.get_file_hash_metadata(user_id, doc_id) + document_info: Dict[str, Any] = { + "document_id": doc_id, + "filename": filename, + "file_size": blob.size, + "upload_date": blob.last_modified.isoformat(), + "last_modified": blob.last_modified.isoformat(), + } + if hash_metadata: + document_info["file_hash"] = hash_metadata.get("file_hash") + document_info["signature"] = hash_metadata.get("signature") + documents.append(document_info) return documents except Exception as e: - logger.error(f"Error listing user documents for {user_id}: {e}") + logger.error("Error listing user documents for %s: %s", user_id, e) return [] - async def delete_user_document( - self, user_id: str, doc_id: str, filename: str - ) -> bool: - """Delete a user's document""" + async def delete_user_document(self, user_id: str, doc_id: str, filename: str) -> bool: try: - # Get document size before deletion for profile update doc_blob_name = f"users/{user_id}/documents/{doc_id}_{filename}" - doc_blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=doc_blob_name - ) + doc_blob_client = self.blob_service_client.get_blob_client(container=self.container_name, blob=doc_blob_name) - # Get blob properties to determine size try: - blob_properties = doc_blob_client.get_blob_properties() - doc_size = blob_properties.size + doc_size = doc_blob_client.get_blob_properties().size except ResourceNotFoundError: doc_size = 0 - # Delete the document doc_blob_client.delete_blob() - - # Delete the associated hash metadata await self.delete_file_hash_metadata(user_id, doc_id) - # Update user profile profile = await self.get_user_profile(user_id) if profile: - profile["document_count"] = max(0, profile["document_count"] - 1) - profile["storage_used"] = max(0, profile["storage_used"] - doc_size) + profile["document_count"] = max(0, int(profile.get("document_count", 0)) - 1) + profile["storage_used"] = max(0, int(profile.get("storage_used", 0)) - int(doc_size)) profile["last_updated"] = datetime.now(timezone.utc).isoformat() await self.save_user_profile(user_id, profile) return True except Exception as e: - logger.error(f"Error deleting document {doc_id} for user {user_id}: {e}") + logger.error("Error deleting document %s for user %s: %s", doc_id, user_id, e) return False - async def calculate_user_storage_usage(self, user_id: str) -> int: - """Calculate actual storage usage for a user""" + async def save_file_hash_metadata(self, user_id: str, document_id: str, file_metadata: Dict[str, Any]) -> bool: try: - prefix = f"users/{user_id}/documents/" - blobs = self.blob_service_client.get_container_client( - self.container_name - ).list_blobs(name_starts_with=prefix) + blob_name = f"users/{user_id}/metadata/{document_id}_metadata.json" + blob_client = self.blob_service_client.get_blob_client(container=self.container_name, blob=blob_name) + blob_client.upload_blob(json.dumps(file_metadata, indent=2), overwrite=True) + return True + except Exception as e: + logger.error("Error saving file metadata for %s: %s", document_id, e) + return False - total_size = 0 - for blob in blobs: - if not blob.name.endswith(".placeholder"): - total_size += blob.size or 0 + async def get_file_hash_metadata(self, user_id: str, document_id: str) -> Optional[Dict[str, Any]]: + try: + blob_name = f"users/{user_id}/metadata/{document_id}_metadata.json" + blob_client = self.blob_service_client.get_blob_client(container=self.container_name, blob=blob_name) + metadata_json = blob_client.download_blob().readall().decode("utf-8") + return json.loads(metadata_json) + except ResourceNotFoundError: + return None + except Exception as e: + logger.error("Error getting file metadata for %s: %s", document_id, e) + return None - return total_size + async def delete_file_hash_metadata(self, user_id: str, document_id: str) -> bool: + try: + blob_name = f"users/{user_id}/metadata/{document_id}_metadata.json" + blob_client = self.blob_service_client.get_blob_client(container=self.container_name, blob=blob_name) + blob_client.delete_blob() + return True + except ResourceNotFoundError: + return True except Exception as e: - logger.error(f"Error calculating storage usage for user {user_id}: {e}") - return 0 + logger.error("Error deleting file metadata for %s: %s", document_id, e) + return False + + async def put_bytes_by_path(self, path: str, content: bytes, content_type: str = "application/octet-stream") -> bool: + """Write blob by storage path 'container/blob'.""" + if not path or "/" not in path: + raise ValueError("Invalid storage path") + container, blob = path.split("/", 1) + blob_client = self.blob_service_client.get_blob_client(container=container, blob=blob) + blob_client.upload_blob(content, overwrite=True, content_type=content_type) + return True + + async def get_bytes_by_path(self, path: str) -> Tuple[bytes, str]: + """Read blob by storage path 'container/blob'. Returns (bytes, filename).""" + if not path or "/" not in path: + raise ValueError("Invalid storage path") + container, blob = path.split("/", 1) + + blob_client = self.blob_service_client.get_blob_client(container=container, blob=blob) + content = blob_client.download_blob().readall() + filename = os.path.basename(blob) or "download" + return content, filename - async def sync_user_profile_stats(self, user_id: str) -> bool: - """Synchronize user profile statistics with actual storage""" + async def delete_by_path(self, path: str) -> bool: + """Delete blob by storage path 'container/blob'.""" + if not path or "/" not in path: + raise ValueError("Invalid storage path") + container, blob = path.split("/", 1) + blob_client = self.blob_service_client.get_blob_client(container=container, blob=blob) + blob_client.delete_blob() + return True + + +# ============================================================================= +# Local filesystem storage +# ============================================================================= + + +class LocalStorageService: + """Local filesystem storage implementation. + + Layout: + {LOCAL_STORAGE_BASE_PATH}/{LOCAL_STORAGE_CONTAINER_NAME}/users/{user_id}/... + """ + + def __init__(self): + self.base_path = Path(settings.LOCAL_STORAGE_BASE_PATH).resolve() + self.container_name = settings.LOCAL_STORAGE_CONTAINER_NAME + (self.base_path / self.container_name).mkdir(parents=True, exist_ok=True) + + def _container_root(self) -> Path: + return self.base_path / self.container_name + + def _user_root(self, user_id: str) -> Path: + return self._container_root() / "users" / str(user_id) + + def _profile_path(self, user_id: str) -> Path: + return self._user_root(user_id) / "profile.json" + + def _doc_path(self, user_id: str, doc_id: str, filename: str) -> Path: + return self._user_root(user_id) / "documents" / f"{doc_id}_{filename}" + + def _metadata_path(self, user_id: str, doc_id: str) -> Path: + return self._user_root(user_id) / "metadata" / f"{doc_id}_metadata.json" + + async def create_user_directory(self, user_id: str) -> bool: try: - documents = await self.list_user_documents(user_id) - actual_storage = await self.calculate_user_storage_usage(user_id) + (self._user_root(user_id) / "documents").mkdir(parents=True, exist_ok=True) + (self._user_root(user_id) / "metadata").mkdir(parents=True, exist_ok=True) - profile = await self.get_user_profile(user_id) - if profile: - profile["document_count"] = len(documents) - profile["storage_used"] = actual_storage - profile["last_updated"] = datetime.now(timezone.utc).isoformat() - await self.save_user_profile(user_id, profile) - return True - return False + if not self._profile_path(user_id).exists(): + profile_data = { + "user_id": user_id, + "created_at": datetime.now(timezone.utc).isoformat(), + "last_updated": datetime.now(timezone.utc).isoformat(), + "document_count": 0, + "storage_used": 0, + } + await self.save_user_profile(user_id, profile_data) + return True except Exception as e: - logger.error(f"Error syncing profile stats for user {user_id}: {e}") + logger.error("Error creating user directory for %s: %s", user_id, e) return False - async def save_file_hash_metadata( - self, user_id: str, document_id: str, file_metadata: Dict[str, Any] - ) -> bool: - """Save file hash metadata for duplicate detection""" + async def save_user_profile(self, user_id: str, profile_data: Dict[str, Any]) -> bool: try: - blob_name = f"users/{user_id}/metadata/{document_id}_metadata.json" - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob_name - ) - - metadata_json = json.dumps(file_metadata, indent=2) - blob_client.upload_blob(metadata_json, overwrite=True) + self._profile_path(user_id).parent.mkdir(parents=True, exist_ok=True) + self._profile_path(user_id).write_text(json.dumps(profile_data, indent=2), encoding="utf-8") return True except Exception as e: - logger.error(f"Error saving file metadata for {document_id}: {e}") + logger.error("Error saving user profile for %s: %s", user_id, e) return False - async def get_file_hash_metadata( - self, user_id: str, document_id: str - ) -> Optional[Dict[str, Any]]: - """Get file hash metadata for a specific document""" + async def get_user_profile(self, user_id: str) -> Optional[Dict[str, Any]]: try: - blob_name = f"users/{user_id}/metadata/{document_id}_metadata.json" - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob_name + p = self._profile_path(user_id) + if not p.exists(): + return None + return json.loads(p.read_text(encoding="utf-8")) + except Exception as e: + logger.error("Error getting user profile for %s: %s", user_id, e) + return None + + async def upload_user_document(self, user_id: str, filename: str, file_content: bytes) -> Optional[str]: + try: + await self.create_user_directory(user_id) + doc_id = str(uuid.uuid4()) + doc_path = self._doc_path(user_id, doc_id, filename) + doc_path.parent.mkdir(parents=True, exist_ok=True) + doc_path.write_bytes(file_content) + + file_metadata = create_file_metadata( + filename, + file_content, + { + "document_id": doc_id, + "user_id": user_id, + "upload_date": datetime.now(timezone.utc).isoformat(), + }, ) + await self.save_file_hash_metadata(user_id, doc_id, file_metadata) - metadata_json = blob_client.download_blob().readall().decode("utf-8") - return json.loads(metadata_json) - except ResourceNotFoundError: - return None + profile = await self.get_user_profile(user_id) + if profile: + profile["document_count"] = int(profile.get("document_count", 0)) + 1 + profile["storage_used"] = int(profile.get("storage_used", 0)) + len(file_content) + profile["last_updated"] = datetime.now(timezone.utc).isoformat() + await self.save_user_profile(user_id, profile) + + return doc_id except Exception as e: - logger.error(f"Error getting file metadata for {document_id}: {e}") + logger.error("Error uploading document %s for user %s: %s", filename, user_id, e) return None - async def get_all_user_file_hashes(self, user_id: str) -> List[Dict[str, Any]]: - """Get all file hash metadata for a user for duplicate detection""" + async def get_user_document(self, user_id: str, doc_id: str, filename: str) -> Optional[bytes]: try: - prefix = f"users/{user_id}/metadata/" - blobs = self.blob_service_client.get_container_client( - self.container_name - ).list_blobs(name_starts_with=prefix) + p = self._doc_path(user_id, doc_id, filename) + if not p.exists(): + return None + return p.read_bytes() + except Exception as e: + logger.error("Error getting document %s for user %s: %s", doc_id, user_id, e) + return None - all_metadata = [] - for blob in blobs: - if blob.name.endswith("_metadata.json"): - try: - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob.name - ) - metadata_json = ( - blob_client.download_blob().readall().decode("utf-8") - ) - metadata = json.loads(metadata_json) - all_metadata.append(metadata) - except Exception as e: - logger.warning(f"Error reading metadata from {blob.name}: {e}") - continue - - return all_metadata + async def list_user_documents(self, user_id: str) -> List[Dict[str, Any]]: + try: + docs_dir = self._user_root(user_id) / "documents" + if not docs_dir.exists(): + return [] + + documents: List[Dict[str, Any]] = [] + for p in docs_dir.iterdir(): + if not p.is_file(): + continue + name = p.name + if "_" not in name: + continue + doc_id, filename = name.split("_", 1) + stat = p.stat() + + hash_metadata = await self.get_file_hash_metadata(user_id, doc_id) + doc_info: Dict[str, Any] = { + "document_id": doc_id, + "filename": filename, + "file_size": stat.st_size, + "upload_date": datetime.fromtimestamp(stat.st_mtime, tz=timezone.utc).isoformat(), + "last_modified": datetime.fromtimestamp(stat.st_mtime, tz=timezone.utc).isoformat(), + } + if hash_metadata: + doc_info["file_hash"] = hash_metadata.get("file_hash") + doc_info["signature"] = hash_metadata.get("signature") + documents.append(doc_info) + + # stable ordering + documents.sort(key=lambda d: d.get("upload_date", ""), reverse=True) + return documents except Exception as e: - logger.error(f"Error getting all file hashes for user {user_id}: {e}") + logger.error("Error listing user documents for %s: %s", user_id, e) return [] - async def delete_file_hash_metadata(self, user_id: str, document_id: str) -> bool: - """Delete file hash metadata when document is deleted""" + async def delete_user_document(self, user_id: str, doc_id: str, filename: str) -> bool: try: - blob_name = f"users/{user_id}/metadata/{document_id}_metadata.json" - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob_name - ) - blob_client.delete_blob() + p = self._doc_path(user_id, doc_id, filename) + doc_size = p.stat().st_size if p.exists() else 0 + if p.exists(): + p.unlink() + await self.delete_file_hash_metadata(user_id, doc_id) + + profile = await self.get_user_profile(user_id) + if profile: + profile["document_count"] = max(0, int(profile.get("document_count", 0)) - 1) + profile["storage_used"] = max(0, int(profile.get("storage_used", 0)) - int(doc_size)) + profile["last_updated"] = datetime.now(timezone.utc).isoformat() + await self.save_user_profile(user_id, profile) return True - except ResourceNotFoundError: - # Metadata doesn't exist, which is fine + except Exception as e: + logger.error("Error deleting document %s for user %s: %s", doc_id, user_id, e) + return False + + async def save_file_hash_metadata(self, user_id: str, document_id: str, file_metadata: Dict[str, Any]) -> bool: + try: + p = self._metadata_path(user_id, document_id) + p.parent.mkdir(parents=True, exist_ok=True) + p.write_text(json.dumps(file_metadata, indent=2), encoding="utf-8") + return True + except Exception as e: + logger.error("Error saving file metadata for %s: %s", document_id, e) + return False + + async def get_file_hash_metadata(self, user_id: str, document_id: str) -> Optional[Dict[str, Any]]: + try: + p = self._metadata_path(user_id, document_id) + if not p.exists(): + return None + return json.loads(p.read_text(encoding="utf-8")) + except Exception as e: + logger.error("Error getting file metadata for %s: %s", document_id, e) + return None + + async def delete_file_hash_metadata(self, user_id: str, document_id: str) -> bool: + try: + p = self._metadata_path(user_id, document_id) + if p.exists(): + p.unlink() return True except Exception as e: - logger.error(f"Error deleting file metadata for {document_id}: {e}") + logger.error("Error deleting file metadata for %s: %s", document_id, e) return False + async def put_bytes_by_path(self, path: str, content: bytes, content_type: str = "application/octet-stream") -> bool: + """Write file by storage path 'container/blob'.""" + if not path or "/" not in path: + raise ValueError("Invalid storage path") + container, blob = path.split("/", 1) + + if container != self.container_name: + raise FileNotFoundError("Container not found") + + p = (self.base_path / container / blob).resolve() + # Prevent path traversal + if not str(p).startswith(str((self.base_path / container).resolve())): + raise FileNotFoundError("Invalid path") + p.parent.mkdir(parents=True, exist_ok=True) + p.write_bytes(content) + return True + + async def get_bytes_by_path(self, path: str) -> Tuple[bytes, str]: + """Read file by storage path 'container/blob'. Returns (bytes, filename).""" + if not path or "/" not in path: + raise ValueError("Invalid storage path") + container, blob = path.split("/", 1) + + # Only allow access to our configured local container. + if container != self.container_name: + raise FileNotFoundError("Container not found") + + p = (self.base_path / container / blob).resolve() + # Prevent path traversal + if not str(p).startswith(str((self.base_path / container).resolve())): + raise FileNotFoundError("Invalid path") + if not p.exists() or not p.is_file(): + raise FileNotFoundError("File not found") + + return p.read_bytes(), (p.name or "download") + + async def delete_by_path(self, path: str) -> bool: + """Delete file by storage path 'container/blob'.""" + if not path or "/" not in path: + raise ValueError("Invalid storage path") + container, blob = path.split("/", 1) + + if container != self.container_name: + raise FileNotFoundError("Container not found") + + p = (self.base_path / container / blob).resolve() + if not str(p).startswith(str((self.base_path / container).resolve())): + raise FileNotFoundError("Invalid path") + if not p.exists() or not p.is_file(): + raise FileNotFoundError("File not found") + p.unlink() + return True + + +# ============================================================================= +# Factory +# ============================================================================= + + +def _build_storage_service() -> Optional[StorageService]: + stype = (settings.STORAGE_TYPE or "azure").lower().strip() + if stype == "local": + try: + return LocalStorageService() + except Exception as e: + logger.exception("Failed to initialize LocalStorageService: %s", e) + return None + if stype == "azure": + try: + if not settings.AZURE_STORAGE_CONNECTION_STRING: + raise ValueError("STORAGE_TYPE=azure requires AZURE_STORAGE_CONNECTION_STRING") + return AzureStorageService( + connection_string=settings.AZURE_STORAGE_CONNECTION_STRING, + container_name=settings.AZURE_STORAGE_CONTAINER_NAME, + ) + except Exception as e: + logger.exception("Failed to initialize AzureStorageService (connection string): %s", e) + return None + if stype == "entra": + try: + if not settings.ENTRA_AZURE_STORAGE_ACCOUNT_NAME: + raise ValueError("STORAGE_TYPE=entra requires ENTRA_AZURE_STORAGE_ACCOUNT_NAME") + account_url = f"https://{settings.ENTRA_AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net" + return AzureStorageService( + account_url=account_url, + container_name=settings.ENTRA_AZURE_STORAGE_CONTAINER_NAME, + ) + except Exception as e: + logger.exception("Failed to initialize AzureStorageService (Entra): %s", e) + return None + + logger.warning("Unsupported STORAGE_TYPE=%s; storage disabled", stype) + return None + -# Global storage service instance -storage_service = ( - AzureStorageService() if settings.AZURE_STORAGE_ACCOUNT_NAME else None -) +storage_service: Optional[StorageService] = _build_storage_service() diff --git a/backend/api/services/user_db.py b/backend/api/services/user_db.py index 00300523..0624b084 100644 --- a/backend/api/services/user_db.py +++ b/backend/api/services/user_db.py @@ -1,102 +1,81 @@ -"""User database service using Azure Blob Storage""" +"""backend.api.services.user_db + +User database service. + +Historically this project stored users inside Azure Blob Storage directly. +To support multiple storage backends (local / azure / entra) we now build the +user DB on top of the common `storage_service` abstraction. + +Storage keys used: + system/user_registry.json + +This file intentionally avoids importing Azure SDK packages so that local +deployments can run without them. +""" + +from __future__ import annotations import json import uuid from datetime import datetime -from typing import Dict, List, Optional, Any +from typing import Any, Dict, List, Optional -from azure.identity import DefaultAzureCredential -from azure.storage.blob import BlobServiceClient -from azure.core.exceptions import ResourceNotFoundError from passlib.context import CryptContext -from ..core.config import settings from ..models.auth import UserCreate, UserRead +from .storage import storage_service class UserDatabaseService: - """Service for managing user data in Azure Blob Storage""" + """Service for managing user data in the configured storage backend.""" def __init__(self): - if not settings.AZURE_STORAGE_ACCOUNT_NAME and not settings.AZURE_STORAGE_CONNECTION_STRING: - raise ValueError("AZURE_STORAGE_ACCOUNT_NAME or AZURE_STORAGE_CONNECTION_STRING must be configured") - - if settings.AZURE_STORAGE_ACCOUNT_NAME: - account_url = f"https://{settings.AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net" - credential = DefaultAzureCredential() - self.blob_service_client = BlobServiceClient( - account_url=account_url, credential=credential - ) - elif settings.AZURE_STORAGE_CONNECTION_STRING: - self.blob_service_client = BlobServiceClient.from_connection_string( - settings.AZURE_STORAGE_CONNECTION_STRING + if not storage_service: + raise RuntimeError( + "Storage is not configured. User database is unavailable." ) - - self.container_name = settings.AZURE_STORAGE_CONTAINER_NAME + self.storage = storage_service self.pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") - self._ensure_container_exists() - - def _ensure_container_exists(self): - """Ensure the storage container exists""" - try: - self.blob_service_client.create_container(self.container_name) - except Exception: - pass - def _get_password_hash(self, password: str) -> str: - """Get password hash""" return self.pwd_context.hash(password) def _verify_password(self, plain_password: str, hashed_password: str) -> bool: - """Verify a password against a hash""" return self.pwd_context.verify(plain_password, hashed_password) + def _registry_path(self) -> str: + # Keep legacy layout: /system/user_registry.json + return f"{self.storage.container_name}/system/user_registry.json" + async def _load_user_registry(self) -> Dict[str, Any]: - """Load the user registry from blob storage""" + """Load the user registry from storage.""" try: - blob_name = "system/user_registry.json" - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob_name - ) - - blob_data = blob_client.download_blob().readall() - return json.loads(blob_data.decode("utf-8")) - except ResourceNotFoundError: - # Create empty registry if it doesn't exist - return {"users": {}, "email_index": {}} - except Exception as e: - print(f"Error loading user registry: {e}") + content, _filename = await self.storage.get_bytes_by_path(self._registry_path()) + return json.loads(content.decode("utf-8")) + except Exception: + # Create empty registry if it doesn't exist / cannot be read return {"users": {}, "email_index": {}} async def _save_user_registry(self, registry: Dict[str, Any]) -> bool: - """Save the user registry to blob storage""" + """Save the user registry to storage.""" try: - blob_name = "system/user_registry.json" - blob_client = self.blob_service_client.get_blob_client( - container=self.container_name, blob=blob_name + payload = json.dumps(registry, indent=2).encode("utf-8") + return await self.storage.put_bytes_by_path( + self._registry_path(), + payload, + content_type="application/json", ) - - registry_json = json.dumps(registry, indent=2) - blob_client.upload_blob(registry_json, overwrite=True) - return True - except Exception as e: - print(f"Error saving user registry: {e}") + except Exception: return False async def create_user(self, user_data: UserCreate) -> Optional[UserRead]: - """Create a new user""" try: registry = await self._load_user_registry() - # Check if user already exists if user_data.email in registry["email_index"]: - return None # User already exists + return None - # Generate unique user ID user_id = str(uuid.uuid4()) - - # Create user record user_record = { "id": user_id, "email": user_data.email, @@ -109,89 +88,59 @@ async def create_user(self, user_data: UserCreate) -> Optional[UserRead]: "last_login": None, } - # Add to registry registry["users"][user_id] = user_record registry["email_index"][user_data.email] = user_id - # Save registry - if await self._save_user_registry(registry): - # Create user directory structure in storage - from .storage import storage_service - # from .dual_milvus_manager import dual_milvus_manager - # from .base_knowledge_manager import base_knowledge_manager - - if storage_service: - await storage_service.create_user_directory(user_id) - - # User collections will be created on first login via auth router - - # Note: Base knowledge is initialized once at startup, not per user + if not await self._save_user_registry(registry): + return None - return UserRead( - id=user_id, - email=user_record["email"], - full_name=user_record["full_name"], - is_active=user_record["is_active"], - is_superuser=user_record["is_superuser"], - created_at=user_record["created_at"], - ) + await self.storage.create_user_directory(user_id) - return None - except Exception as e: - print(f"Error creating user: {e}") + return UserRead( + id=user_id, + email=user_record["email"], + full_name=user_record["full_name"], + is_active=user_record["is_active"], + is_superuser=user_record["is_superuser"], + created_at=user_record["created_at"], + ) + except Exception: return None async def get_user_by_email(self, email: str) -> Optional[Dict[str, Any]]: - """Get a user by email""" try: registry = await self._load_user_registry() - if email not in registry["email_index"]: return None - user_id = registry["email_index"][email] return registry["users"].get(user_id) - except Exception as e: - print(f"Error getting user by email: {e}") + except Exception: return None async def get_user_by_id(self, user_id: str) -> Optional[Dict[str, Any]]: - """Get a user by ID""" try: registry = await self._load_user_registry() return registry["users"].get(user_id) - except Exception as e: - print(f"Error getting user by ID: {e}") + except Exception: return None - async def authenticate_user( - self, email: str, password: str, sso: bool - ) -> Optional[Dict[str, Any]]: - """Authenticate a user""" + async def authenticate_user(self, email: str, password: str, sso: bool) -> Optional[Dict[str, Any]]: try: user = await self.get_user_by_email(email) if not user: return None - if not sso and not self._verify_password(password, user["hashed_password"]): return None - # Update last login user["last_login"] = datetime.utcnow().isoformat() await self.update_user(user["id"], {"last_login": user["last_login"]}) - return user - except Exception as e: - print(f"Error authenticating user: {e}") + except Exception: return None - async def update_user( - self, user_id: str, update_data: Dict[str, Any] - ) -> Optional[Dict[str, Any]]: - """Update user data""" + async def update_user(self, user_id: str, update_data: Dict[str, Any]) -> Optional[Dict[str, Any]]: try: registry = await self._load_user_registry() - if user_id not in registry["users"]: return None @@ -201,61 +150,35 @@ async def update_user( if await self._save_user_registry(registry): return user_record - return None - except Exception as e: - print(f"Error updating user: {e}") + except Exception: return None async def deactivate_user(self, user_id: str) -> bool: - """Deactivate a user""" - try: - result = await self.update_user(user_id, {"is_active": False}) - return result is not None - except Exception as e: - print(f"Error deactivating user: {e}") - return False + result = await self.update_user(user_id, {"is_active": False}) + return result is not None async def list_users(self, skip: int = 0, limit: int = 100) -> List[Dict[str, Any]]: - """List all users (for admin purposes)""" - try: - registry = await self._load_user_registry() - users = list(registry["users"].values()) - - users.sort(key=lambda x: x.get("created_at", ""), reverse=True) - - return users[skip : skip + limit] - except Exception as e: - print(f"Error listing users: {e}") - return [] + registry = await self._load_user_registry() + users = list(registry.get("users", {}).values()) + users.sort(key=lambda x: x.get("created_at", ""), reverse=True) + return users[skip : skip + limit] async def get_all_users(self) -> List[Dict[str, Any]]: - """Get all users (for admin purposes)""" - try: - registry = await self._load_user_registry() - users = list(registry["users"].values()) - - users.sort(key=lambda x: x.get("created_at", ""), reverse=True) - - return users - except Exception as e: - print(f"Error getting all users: {e}") - return [] + registry = await self._load_user_registry() + users = list(registry.get("users", {}).values()) + users.sort(key=lambda x: x.get("created_at", ""), reverse=True) + return users async def get_user_count(self) -> int: - """Get total number of users""" - try: - registry = await self._load_user_registry() - return len(registry["users"]) - except Exception as e: - print(f"Error getting user count: {e}") - return 0 + registry = await self._load_user_registry() + return len(registry.get("users", {})) -# Global user database service instance -user_db_service = ( - UserDatabaseService() if settings.AZURE_STORAGE_ACCOUNT_NAME else None -) +# Global instance +try: + user_db_service: Optional[UserDatabaseService] = UserDatabaseService() +except Exception: + user_db_service = None -# Alias for backward compatibility user_db = user_db_service diff --git a/backend/api/sr/router.py b/backend/api/sr/router.py index 7fd9789d..0527cf8a 100644 --- a/backend/api/sr/router.py +++ b/backend/api/sr/router.py @@ -22,7 +22,7 @@ from ..core.config import settings from ..core.security import get_current_active_user -from ..services.user_db import user_db as user_db_service +from ..services.user_db import user_db_service from ..services.sr_db_service import srdb_service from ..core.cit_utils import load_sr_and_check diff --git a/backend/deploy.sh b/backend/deploy.sh index 6de15442..1f769e6d 100755 --- a/backend/deploy.sh +++ b/backend/deploy.sh @@ -95,6 +95,7 @@ fi # Create necessary directories echo -e "${BLUE}📁 Creating volume directories...${NC}" mkdir -p volumes/{postgres-cits} +mkdir -p uploads/users echo -e "${GREEN}🚀 Starting services...${NC}" diff --git a/frontend/public/images/backgrounds/homepage.jpg b/frontend/public/images/backgrounds/homepage.jpg index 7f9b249f903d274ecfad7fc76f9bbe5beda23be2..3fa1aac236d5ba08b5ccdb099a5d6bce100440ac 100644 GIT binary patch literal 441785 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 z z9%^OY=-6$szK0EKjyO~_H7}@i`rKS}_gv2koR&#=8;3TDcMhtOR|sgM5JU(W?o}^Z zyuQAhE+lBl^-Dwfb!%=p~cpMuhR?5XSA`7x_=p3A}Y)p++M(;`dhx+>aBCymF?D$06n z#AOPO=~gM@EomMvV3Rd`&170$bUmPuzET+NT#UCRX^&J8^S5=HxR)|)A2m99!pC{2 zl`MT=1}2h0-E?4v$8V#XFV?srNb=T#(Wvp6otM6!6Ac;F5Fr6y{LG!^V_|4XQ95$Oy)|*IF_8@OT0@B+L^V~WO$gvnVr^J zHF538)c`hvVTj+M-`d$FA+#Ny+iiuuB}CfKW|c0kvR5?6NE;kO zVUAT@b-m^yV|!onDT`gEz2{uAns_|jx*c{1Tk1_Vem4W^qyDyOC9_7?k4=@WZN}G2 z2ZGjn%)Q<}#Zt*FzNGw2bVtxByB$$J+gE91#z~W7&9-iDM% z81DV@sw29YHmHHF^&2Wp`6j*zcI&I@i7knN$CqPt&2jx;l)>dOEhROWhcTGu_;x(&P*b_E{LsOm?jBIVD>3{{Tl_E^@a_Plhkza_n}VlcA#k z$iXy&e7J11aKOmGYZ@8{04aHV4{3|(?ue$hhPt8dnojvz%6bZDKdFU{K42-rG1)j7 zk5!$v9TTj!+Ih>WD+utJ`=`2~>u#o~jwjRG{{W-HHp_M;UPR)`cK~+6!1aVLcypWF zuS-gkO3rMmxiOQ}$ux!1JfZ}^9=2qJ65%^ZB zRu>Q6!mX^l*Hs_d%0qvJyDn+uc{)b1$3?Uj%N>*hD}_Yk&vc5eq;{VUjg5((gLRxP z_1vP;b|CMSn}?Qd6pO1Vl56IvWP8h+e$iOItNoWyR5TCX%G~txf8|(7&)GRuokP-f z*G{39XhT^8vGKU08%wfsE_gALJ=huHKSM`VTJXwPA0a+NWxA#5yEUbu*D8TgDBnsI z{ZS1RCM#7lA{=TX2;Y1~2jpta(NzwQ#kfczV@69yDnsv9Yea?%eL1L^n->wVKQ(XB z_4C~9wNg~bUhV$?HO*&thg~xoFayX_O};`d%?;P7ZWV(_lt9D#vHt*yqiNi|aO;iQ5ec)f%LiB^_VJ@_9Z%R!<4lo(GcXmfni4sAjqJ!rxUc zZk@1Oo380r#}UXbPjbEpaz`gIYT2NZ>AGRmHBZQ761(Kmy1D8um!Ji-w4zc!vC6Hh z>-bo4OKWHyiNIS$m`TgRIc;^8yhopPl=@+3XSUWyR}p>kBcfUg1IzQ zy&WYj#u|!An=CDMdEW~??FNcgUBrerX)WC2WONsb+BX9X?f`ZtWum6)sH$V|?v$;R ze-d$@Jc-4e!~zcq=tko!q)BM7U506%B9Qjub)LL*y+yw=F!+&qtKOKIN5UrM2W&vy zC~%nvL-sZs`ub7av@YEv8aH;smFJ&lmw{)yx@Ryr5rwGgj=z!YcZVR2zFA!PEy(D{ zTTYcDk92Lf{-APec_hv`CKg3lWwGzwr-c`o~eUkE} z(Y(I(^<`N)WzsyFvQ?Lgii4LppP5x@L4<|6#Tc2nwj1Po&&1+VS`Ja^1Coze94q~Z z9g0HLAl8*Ru;oC?>3( zqZr#MsHS1lI!8fS=&iJj@R}VXhVDD9e2i>Sy9aVO@>z=${2E|dMh42$-$g@+GBvtJ z`R<-fl!T$lQF)i)YZ@}(cfzD}#e}%+jg`f4@r#65+xLpdU24TU9N9ChY%sjJPjfpU zsRHkHWK1pB@ng+k?llgnkhPA^RDPhk7R#nLA5{w5Ig(9IJN8a7X>K0m-5O4wx4ubR z6FGN2i?{SdR_hpHsAEj78Oa$7pL9jF-WR;M4aV7BucW#}SJH}#zWF#S&ecv+dmwdV zN-E@PX)bZxsr))fvHEN`NLfPYMNx;H8K}P7{Dat1K8neDeEDej|JL+ z?z0q~Bc^GcRa-Qn=OnlQ@4aX(wz^wuPrERO5xa@WE7$ZqI-FaUWl(&toA~{XT=G(C zjDJwP32Oavyyw*0*U9tly$#g)@aqUTKNbq}&G_cNLF!lDVq7D@%iAe)`z#T^be%o> zryKxj#~~9=K=Z~HrX*HTAZjb|CJXVpr(j7;Es(^e+tydNM+^X2-8^db68)>HNz;Z2C+3KRiN zkMUin0vzW%rRgo)NT!0pLae#RJ2L^C<~rFkEEkJNB7F14`9 zAjYbo-aCf5a!c{^+>QQR$Au zd98+BIHaMg|uj{+EV7r*ZScX@72wR-#^cHFOs! zYFbZDHw=8QR`1o^E@lR4TrdxpeiR$`PE>xdYod&~uWqJ>jxoy6P|`z9 zQyieYY3w&z>N?6tw+(n{1ARja4Il8fs&jwLy|vX-HCf>(*OQ3PZ>)}22gLFQ=ixgA z(mk8fQkxv7!DFN^Es(vr$iTq)Ell!39X#{5!*+(3ID^gybd#RPv zY}p-*GaQlME6vxty!92bL4p|9Z@TYytCbz!rsS5gt~XY&md6tg2qgai56E)3^~? z0Das1Ed$Gq_}y~5b)~UmM#meg`(vY{)Fv9EK7E&ihtxll$nxWYljpN&CepGKFKvBA zLzx>RCB@o5hbK55h@`qzT`kb0=JY`&`(X6DLdoDe_TI{zf+97O$HrHu( zxglr`cNpW6H{D|^y5Fm89X$<(^-G!!EDVxJNO@y%fC<|h4$Gi*TbXFT*lrR!I;O<` z01@$Rk^vi!Pb27{`&sKcF0P=ZqPJ1VTNC_8OFKXy;}~uU+sv<_{&F+NFL~{ia=&wu za*a|m7HfqibvS;!O5yfO>J#-1J=dYdo+^0TIEk@1yBbEEd_Z~Zyxn|;^E+xeZGELNtoOa)JYs-cooE&hQ_j2rPpwr)` zos!Kt%wM_yQ>_)Rt8p)gwYl5Xc|P3ZE6LDgihUA2%(^04Gk~kvOBGadweg=3r-i9t z3~r}=oFr1gMB9XN!U+!heoLn;R~uah412pW)cqd%_$HQ(*mF11sOF=oqHCEhS%Zb# zY$Ad?lg&G{vEu|2-Bw?$^s-!PTUQew0dA(BUDaW7lwG@{f8~;@IaM4|M^CO75?#3{ zsdZIV`@F;l_FDTxt@OH?G-NOm2cn^@qJ;Gay;5hv&Tz1febSO@z8RF0jXN~(S?TF% z*cl_8E;4YY+Ab9~Y0Qv3#P{rT+N}Gm;_na5I&`1Ztz1DOpSr%@q%=pFsmrKa_c?* z8cKSJW2cqhYbO|1U1?~nvDZOOB%#fFa@T{(*FGnc6eSq-+xdT!3EEtl>bj5Hd%v0v zrDF!5?395@d|wh*67IyQ%!|a28!l-z3P{TAuOAeR1G&PosHbHQh2y=X$-oD6-4z3k zNOYfNrz*Fo>V(&9kNPkG3B@du+L>^ut7YwMR@#jazGt+a22K<@zLt(AweZ%tgz>t} zT%S_uA(EI9TfWOl1zkPnnl@L-?(@Vp$>n`!gIgHlP@fczm}QG}MHG|MJb0A`KsY&D zj*{r_*S3n9`Q&hWa@dE+EWIrms3ozuIgQvH^0nPNS8%smol44*$Xw%wx7XEt{#^Lh zNoUU%;_j>c4EDK7{4*g}PUu|t-UxFt2vn@2GSuQsv=g1zO{la(Go2&ad`xF0QNGeD zBz~5X?g4LQbm`O8TnT5YQt4f_+puX{yImNlgwK<_%!^ zh3Cc_lTFvbYYJ;~@(Z00flnhUTY-%3uDzIFA*GGhy2%cba}(Tl$CAn1F7*}HNvNuW z7}&lX_a#N}WQwE!?+uyR=Vj2bPYx}aJA9QGY^petFD9D}TOAKQzci+P1cXzZk&ysH)plCPmPUm`{ed>7PnXV3hJ+tJsJr@NyxwcZw zxQ~Rc8BiT8xnMfE8hOgybT?m3VwIG4`ZxGv?9HU-9-(pRG>iGD=iRoQvuI_zv%XH> z5uj%PZjltB#{+OS%7sO7j_F3p>0Ov!G83V~7|0vAuh3OKQAj$UNW|^0!i5CXV%5$FeuEvp)cgZI$X9 zw5@`UXSv(yJ1;I@Yb~8FNnA9hCZJRK?-8NgUieY^2=+NQ-5Hsk6o$BxaMP%{jqdi}nRg1LLof zQJpdj51?Fu?2yYFa0ha6%Ix05KySaW417S6en^e>OYG}aq{|+L4ZMP3qB=TvNihy{ zMs$S=<#lWtqNQ+ro!!_d7FcJkbmmgyua`MDX#zw_y86qr^t2Ync#Xf!S=wxjp$4M0 zz&QTupKoOq1jYzReE7*eNvS+anulu3+z!LAOR@gMYn61T;HGYf{W&QtqkNiVpZ0M9 zl23IiXH(D?x~0L=pR&bGbgZ7Zn8t8^%Nm^p_$^?qhYw{J4duwowTzRK=9#om3OXb2 zLO*d@>E=+(j0fmD%O$*I-RbQ;b0jg zsLr{?t>F~bE73#Pcav9NEaJCujrDJThsg{_usV_D!V zy<01;buJHc<#9Oxa6U+sub_;6M|zI^HC+pZ5H$4pz$0f6sw~!8y6_7aLl5t}V7B(2 zoMSER{bh{vqw1_`SRE4~ru~}%{nexv#d9UQbpjQqrztJXYvuxJyw3qz$uSFu>hqwMUr=w1wHKg2>}h4ar^A0x}R7|$O>srEbYChc1KDuGE%(8lBKcU6V1 zl1<4jch@TR=|khyiDfNhU~c2ecHC&>68o!lIfLz#qU)iu1U9C|(JfgKuzK#LNpg-j zd^$0t58fknRAio}q5dR}ehvUVm8H7JEnmg<8Qhdr^1-?xT4i+Anw;`Zv6AEJt*=(+ zSJW`awvqOVd{I$b-=;TsviI~(c<+>vjV&Uf8Kv8VSZ#71X{;=}eBv?UYvVe0DhYaQx7`$>H2z#^5CBaE&5@tY&O52NTcp zDLp$7bxfLu+7!rXG>=`<8oRE7;eW0J4i1*pdUrYee61xng+uGZo|1)+QMRN zz>GL&l|GiFQ&mMF;2a;4r0WXSzOn41a4mSth+bB^P@E~S$l-)QO|W? z*u&`Hc^SsaBjGJ>K|WEQ9oYC zJe4}tTLpc+u8F|Ag5KdpzP-XWHGqbUtfMI>vPVTEw<6c0W^lW?p!_ax3MaK&sS`y- z8yrhUvT&*FS8vs|ZK;$J(Xj)Sd+iF8*V0p7DF`sSJ=b;&a>qEzONMn~ZACV7`()pKM2?V`H)SF}3QZzsIjkO;UgR{;gtwz? zcq0e8BC7mbl-Q1UJd?9iGTG|sapSejJozm(HOAj>hzo2il5B40Dl4UZbyVg_+)t2b z*e%m`bnW1;aGE|tvFbTe8F`jCd?z#(4URTP4Re_6O3?3^P6?=_ka)3Sz3{2AP|Ooj z)=8o^JV<+EDOL8lsm4Q^N#JE!%U29gcy@@Rjl^#E4c2b58;r7-N?#-V!BV*!;SpwK zWKYP}Ke|)VUF%rU9K^`q;c!ODt6?Fo)sH6yGK#OlowCbL$CmH9rimw7t&X~!%SYif z{{YfEV4J(yt(1~@an{D^e6ka_8=Th`=xpwSJ~T6BM=hFXW%0jQ^U8#pcFJu~_v-RD zjm>cL1uizv7RARNMC2x|mTR3{-W42D{{VY{x)qPv?9L5+)^|AaS`)OpCX9Uy53YZP z*hG%>3qx)8cO_(kO0U^R{3Dgp?N%x)Y+;nJHK&bO-C8mnaG}rOW_Hcf7VA`P5J1x5 z`^0Wl<73AIWh6v=lG`3TDC~AH8M0V!qI9z=(_lVO0vp;HH+S_)rYE z{s`)AcB%;@{bw^IoyP%(%^+7xLj;B#2RL$jEJb|plI0YVJ@DdQAvV;J$V0b}ZGrk&)<^5g1OqpDbBwo;M&Bl1~jXylxR#>Y6G;2|WrDjcFY zeovZlj3nR<&kI38(=$Dx^Wr9QNmo>MnixZ+VG`))1vfOh6KNSLJ2g#9fn;P4RiLM^ zLlXn5WNSd&jHavloUj;Z;SscLsH!@;*=j~*kqjDCN>1;=BYs;hF)YOjF)#Om0eQ=u6ZO930D;KvsAb; zk|#({a24$jN7cxDTKQW8JhQr2K-wnzIA{EiRTvxZx7B8u(w92xobHYt5t$ryJLa}@ zHTJHYh0#+NO!Lk+$yIgzUsFC?PS(QH_ocha6k_a?L(-Hq3=&+b8sa$_Qs=!}ZOkpV z)3!$s-o`%_jjF1ea$O{kbG*q&hdK_e)^Fs|Li;t{VREQ(G}MHN~%tpF$SV zMs8^1wfJFhQ7NnHX=Tkk@<;M=)?fNg=S=cU1=!?(vGo+wQ^-WIxrfv$Gi>RdCv=*+ z+ced9nbDjOM=0G@V!3=Xz#)^*g;(tEKyCGryUQwqu$ENH0XsWogu9~RlQ$O21vFKH zs*0tr7$Z(rZ>Vi`t*??(1Iu09ZmHm{sHb*emF+%-Ur}{^Y%S9^nVH-;Aav}{;mtUE zOGxuiMs~qk-_}-Ztaz!X@MJuY6BQjQ9?>lgLtN9i4pP;Q>$5lF7|vQqK8rzLTQfR! zj&qB(4(hVH(^X1wEH1~G3T4Hl^sHRu4gEJnP)n04?~lvP8+JHJYFkED<^scu0domy zRW*_q6PFh&8n2P#`HXpAK#aEF>!6e9@H;SR_O5>lJOBpQ5^ z14%_dTTLTpI%bxqRucdRMVc2JdzxFv(8||}0DH`?T3NcFV z$eegZZgv0{KT&BLgHcr!F3A z46m9T7n4mT(lbtcC*hvEEN4?!G(zVR3%g}zZdXdDze65b3wRAYs%qPW(}2euG%TZv z-I}@ZH#5Z54s?$0t!)uQB}*Hu4b@FGCyg1E&e;_qdn+0l%bllXvq`EUaCR$YZ1A=* z3Cu0yE2PKmE~X0~y4&D$Dx5Uyb~Lbhd8|#6$2~=|k|@GL4B|`@BnK%c}3%If2tZNyt#xk;2x{*O^WHCX9uxTBJ z7K+zd6+~g>zz{yk?6UOiiW-S0B&9F(OTsYA7S;GHjExw<89+$awc1W_nURc@h0G&S z8#pMo_Q@QRvO*33Acgfm|#Q7yeJ_6ob$W7D| z-8l13!<=j~9r>vkk~brim-#0M+~B6%H$UKki34n;IBuR`7&`>p#yCR(mjsV9lM#jO`uE|$iheiJ(BafPbDFp{{YzQ9y&HRME92JaU-)%qp(kP95PgO zXH8&-0aE9mKp5}vQhkla4@1+kKpI|M=y^CP+v9u=tm&`_GCFBN^V8wDE+_Z1wHs)M z!V`of#6A&}ydZ%%L|T`G2tW;yfQuU^2t|#M0x*UW@PYtF5n(uj0BD4g6Qm@NfsK%W z33x??ASVe(@Q(-qI710oKm-6lB?n{Zh7xgs=71ZhXp|7}2tH{d2*?>@NgNV5PPiZf zmjy1zWFt$WrL)9zyd0bjkI^@DpcfYjDjZ9|z{bH?;U1O8o6|J8l}j3BERtSKd%9`n zqr`>4Z@!|hBJg=(AT1SHm<}y-Hj=k0gnva-3&O>USvk>HmDuu!d4 z-aTj)%`#JyoF2=49!X-8-mN|o`23RTeLhU3ioO^4G;+f46Fcm;6yQeSBWM6{Fsknn z+atWPTYE!s&dSD~XZYhoHL&tP;bE$a%{qcEDap}Ua=F#TThHvl#+3bC%5hH|l+le& z=N*_slO>kLSC90L|_h;*Q zJGaSSU1GSpHi=_YiD^8ler4gyQf?36G=&cK*)2IJwH&>+@z8k7`z;Bt>gJC4x6s6 zyHw3>s&LZLvxdNh-90QE(u=nIeo4h8E-1h}5M$Q4u66-leuj zZK!ye;m^)MR30$F(ZS#aJ2|$wM5*M#J|8CTx2;ctTSCtcT;;NHr{t=o>Z*#G=xT1x zby;S>JIm2$>8R(Oz{qqn@hVKV>0eh3JP|m{CIeb~oVVQ&C;Q6an2I@>Gdl1Qq7_!!V|eSDC=SZl14#|_3U21e>>2OzBlo1p3L9WyP? zqOZY`ppeg!9yH|l$DbmKoZTXt+j@9tbbyiOwU%CpW%?N|j;IZYjhZbj2QVvYFIZ8j5UcWN#ojNTji{;{=9B z=s&utDQB#!pW>0ubI;l%b*Z(%Q$bSEJM!0dSm&R%+mH4LOLOah?UYhb(MuGw68;)O z-1|PV%~<%RoR>uz<=f?DnN2*k`k%aAu)0S_+?hmKO7`K7;mdsvw;p`Z!KtmQmHYU! zqw1>gg7$*|wOb~xh_RqINN*eVR(%aYPd7@^Ni-wHm71PhHzcOI`o~j$r=^Ms0D-ax zJb8tvp@FotaY8l>XbbA_`fey{XOn8FBtw&=bDwGUXhaku3`Xb6qfy{wcU@a43(Yk3G|YUmG~-a^SN@&13df3HSCdGll_Sn@Ty7LG zyWQq{2PLDrX3y0#vh?{YH{a^;$m3E-;@b8^yf3amN)ml&=Q&!~(gD~U;7);*-Q z5grEvy3b1bkx&~>9gur2nr!tBkHnGy=<|SE-5V^B7MIGx$73J>sv78HT=H{EPbR|Y zSG&Qcncvs2hhf8#x_z#KF0-p+ZV@ss2yR=pN040V(@aH3Yjy!|Y!THm;Si-iwI|PP zE-ZSb4MK}o89q_hfpJGsw^GAzq-`A=bj29b6v!jhySPV10gjwHUF0Kl>`ie8R>6Jt zHMS`(5pD7_Q>p&|0|wqm%tAH-?c4%4P6V1*KB&%KH{oAkXD;wdQptcA1*BxJG4(B# zhUr+?s^fEnj?Vqps;}}EP)ry%Eh7PWQ>ZAXH)^*&C+{nc!5h2{M~f&Q)AfbeV?&3V zN|j4TQ%jN=BV0LFojBTt$yCP|fE)0VjysiBr!~c{BW=P}V%^|-_K{i)x{IBYx!(zz zQ6#R-LmFewTe7yGo_gZiXsLWxxc!z5*J9{zX0SyZRhNkJ{{XbudpF5z99~(Qm%)+f z{)emTH!@n7%{?P=@sWb>lIoM$XzUi2(%WOxE4I`*a?n1a3P?WFXC2WPDVZE9Y&!l4j zeM7P65ktR{lDdMXy0Rw%bc2%Ot>K0$FdGwfNO^HdnxVvokAavIFz~rN$ zb|LztJ7vy5#|0}(ry=h@x~r$VhcLE?U}pv7a*8%SQI~Fel9u$xwUO#>GgQ?&9wWvB z8l%BVDYeU1@e>KyXL6S%btMsz(6mcZHYc!Id!u&Pljdls$?p*@K(^OWr2hIf5JmmIT#}cb# zIrG61&tZ}5Y}Et?k-=9~&4P{2Z8TYM<;6>$U4Y7RB@AyPDeqDGU^f=| zm@_3yz9W>WDygUjshrn5aM8-7p8nd4Wb)87v8^S#k1C3aI*P~Y8s6e}Jg7?D$ZhdR zv%TLcD$a;MX2NlX@}$E>C0&(_8)WAv=AxKsC`k9WhfBy{O;p_GoOp2)6hFe$oUQOR z8byt|3w0#I7LhFd&tO$G=BlCBSt*JAkozqO{+^7wxW7(XIX$>fU1g)Dtddz=B$GQd zc2m=_{s{DRFO=oYIP*Lyl2k=T+(q%oJN61p6+ZW6bbtn*MO95nHDSa|F5i_`yRmdZ zxz$Tl#~CCp@*S1GMZn`rP)kVFu*g&3vC&ZhEyhq!W+`vD#MXFJQ3f*`94f2mix{P& zp|!;6s@jS@&U+km;xQ(fw=E-jizY3#ORYA>v0#@i~Jf-IQuti6^X&#CAqV$7O@w`{2?o za#zcBf`VTLnh<0M1;t!k-sc$0w*|St;breJmRx5bZL2?m)Lh&&LFJ)ZN<9j#k!t{T zjDxV%{M25Yi#1cQ@MHdI_dGt+D^7NDX2($4dyY#%8V<^3B}F7I-9t3B0kN>@YqxRO zDxR!yhUoSe53&9r$<>bl1OuiIxnO(uu6MT&-AFsT{Q&8uMRrY&JVX~AwR-4z54YwKO&Klno0 z#QbRX_jWXJ7;UX&Z5wLB>%%sqNXH~?j$EnfA)<&}=VJt8f>u_$ ztu2%R(OPNzX$IP{f%mLk?y{n)rN*Xb%IyB}*;SpJjBd49ljWH<*9Gm%sjk-|MAP_D zpWKgc#clncxzDgv2NFog$y~~s8D3gTNy_S;&uQlURZz#o<`)x;j3+py(0DRc9~AG@ za5WUr%ipFT=VyQhR^}d&fs(pv>G0Cxbmd5ruFq+1DPd%i0nQSX&_>Ly2Tok80B~T6 zKR1oazNYE>b*+MHq`o8n0Ee=LThvvxGcZQ+6nclk)jz5MeJm0aoq;6$mM(3YsJrBD zud6Ak8e+B6HMsraFsN&9HFboUWpM|vI005oyoUqP8)JLBAGtMNO*XFqOEcVmnkEAG zal)HRZm5~yGAA7OS1q*B(Z{akRLFqbw?UE{b zmf372wz^YL{{Z85!Ds9GqU&5;`(aMQ!($lyQL)IMbKvMTQd@17Gf8u(j5LkLdD&oU zy1K<~%Wan9Asjfg0DkqGt1?XTWP6_T`_6VsrK(^V^IFFmMl!z51;g46(cp?m;in#h zD?eG)_u1S->z>i%+y!4C##9+`mC*>J2@Y0u1>YzBP^jPgSXI(>J>m`9T`>c*j!>y+ z-_2B2Gc6}8RFMY$ZlbRL04HFq%Uwp^7e$~E+pt(_bmr?i;(5J ztTJ%TF~u})tyI=#K37|(4DkjulZ8Qc>58*7lEMUxan9SU(Q#?Z2?TcveI4@QLPv*C z;y;A$v2M*Nu837M6%_8ou|1@Dg%?R3xLZ1It%{(wJC!3O1mL&@XIpBq)P`bTca_6} ziwpTM5t2Lo7J~6KvGmnEut?@TxZS4;Wlu>;*6XB|lSk-Ncbk1fI#{vsI60Zy2wjR# zjtYBUSJuMN%COpq`1pqE?xOi@y4zg~hl1>IS3GB`a22D9BFVBft(1nGfOa7On`hZi zFn$V&7_J}Dh&-w=-!*?)GfY(`6-AVgj3dEH0V`!zIvdhahNYp|D;humVGl%TVFLgt z^RgI2=A;4$Ac*pq1`!lp&So$7(A2Qj_* z!jVBKYe9ZA^Oa52HBxAE+p`A1ETrv%;O5tyMJt-^kC&37Yk}2~%D1}A*`*@`zDli$ zp`@O0x*)hAjrh-o7d4||R-f5*ll-CTsyauzNOSl6&)}$^2DppJz|P8NOWo$M-f8P8 z32czOJ0rdpTA0pQCmei9r(d`yPTB8EFG^deEi7bEuolO&$OQcInztVwGQxh(!l8RV z_Jv{UO9+xG_!~5B{j4%LHO%@IZ3T5bMMyN`F_VDoU@waG2x7&L43`pWq`7YVxBX6> za+IyG-9?!2ct=M=8yri3&Q$A@gCS>zKyfKH@E+fba=7K7kMnDrfA%S4dr6l4AiQLZ z9f2xa+Q21qK-62htGGm7$2KB$<6=7@X^v>=YDGhwU+ddt_TG=EZc@{@(vP2;eSbrX zKNS8`Mz0Qu>_5h9yS;W z!U)Pq8xA&BX2|ja_{iJME{WNQhk=lB{`84Yg)2!LXN4kIjXaGznB)P?cVZG6V@~@{ z)7>_C@=H4%xG5ll)5A5V`=uh`$xd|d{O!ldtA&25Jr1z5Ul1Ax9B`#awl`5> z-Mgu5U55(fb2;T6HsKa9jWi5C22dG8*U1}3QxFE{ghO(d-;`Jx*#k$XeU(R#XS5od zgP@Rpr9tXQUOLmIUJ$qCg2D0ui8q5rkMy zBEkkI2=I>x&;oFb1b9IJ77}olf&grU07@Yk2mv@oj~k=L$N?Bb33x?>0GuI&v{*n0 z!WwdyglGYx)Z5`}kHpYaj3K2+71b7+8m5-iQbQm->R`{_s#(!ic(r?^GE)a`TN}?DDeIg+vm-J-@T(^1o24^Irx46>$bLUH)W}I8 zaAfq2Hb;AD{sBp+X9upZ-RWi`Y8hO4$QcUC*?5|XnkA$ydqy%s>@H~4oD8V7Hu`#y zd}t$o_nHdxvVRXpymPPI+a7(KnO>gg3r}3yX1Lv4_~diUY!F~*z~tl~HNox{>G~(H zC5iP;mW8uAFAyBHz#Ia-MMp>|V0=_$!pHrf&9buB?u(|n%Nyz(*%-$McyEvG0CGl0 z8C`PFOWIheJ}I)}nKyD~Vth$w_u$tynnsr~?r8zvBi&>=f3J%wC!n}O*3z7YzZ))_ z*4D13zSz!@L_FnC%T`Sq7Fx>4`mnv$=h zWTzQ7CT+TY&mC7$K}_P&5O$-VAb4F1uWgp7X&{=MM#}aP;g)i^rPbB8xZ|pQLz|P6 zBM%Cdop4=S;m20`hc_8Jm9~|&rkr6N(tdslUr*9>9;my;Q||HI$(E-WVZy75>h`$8 z?6#ZuLD^F_@jd2n=3C~TP%zvvLAp})JQ0^Z)htn-97aIPmt)3z#i2Gg^W z8=Nk@I!B5(2C4Ud@J95TjE<{mvY1}U=VL~Zun9K_TODDNLIXh9Dk}~0;ZFe-lNrOf z+l1ZE#jc!9th90)mFH)SUmO~9w#{o=8s0VvCDNeMP|s70_-rl# zOwQY;YhrBFvPSR-b4bGb`7foUU~t}*n00qwii^M!VTH|%4~3u+fV*96E`2Y92@$u9 zj=^U-L!_zf^0ueKYiBvjhmkyfO8cl?D7933xFz~dFueUP8R@Y~Svi+2gjEn{n$H0c zKf!b28n@h!Rm^&ys;*U03fmxLbkR$oO`MW5jfc%x(pqcg>FbYy6OCNi0nY3bqoD=A zq=ax!EYjmyVdFfN=jF?(&x>>+Twfjj3g@F9F82$r8*{0Wa1KCr07gYOD9jDr#hVT<4P3gRg_yAqnN2PCWX72cZ22o9YO&u1G9_qs5owrU( zehdY~q4u41mU*<&Ll`G!l1`OlWcH0bZ*wl#Af2AU$I*RUeOpeNhT}Cjw?|K$HYRI! z?nM-kBtTWGvdU8%fiQgsDrWQ4Rzb|HG6p5aANZFG@TMuchhCtz%zMK-D9+S5-G1 zhl7GKxmCAnnJQy*HxYLux{C`7ni&{4@>40cH57qVOX;SSt~$3+Eq3EOgq0a=Lvl}b zbr6o07Yd9y$8gY_jL%qH#y1V@(6eo#(I{5K99|8*fvw=b3N1CFTDs9Zxe<-ak9A>3 zM-8?Ob#4xSIzo@1xqQZ7#|~!9R9&L*2z&J#$4|* zqeE|u%-X7hp{?L~q+G62fFq@EhQfDua*}n(Rq%-t%MB!fjv`6V1Ibt1Wqh%?Jmtsi zv?lxqnuf@B7~RD`;>J#5aC^JEvYqx?jS%SQyee?&k^v_=Q;(^0%cEz&%yHbMPDpn7 zB_Wc-OPOW(-gszG(kjYZWuBsWWiP`cCwCQL9F%ktm}wX!oPDVXP0d+7RPAPT#!uL4 zdJ9y(JEecZ%y&YBr08x*a>UAIsV5}4$Auz}($5F_W)832Qt8BO8lu5GWiKu+Jh-hM z*muhzT>k(FL~LYlWK``Duz3Y0Mh!%{zyaKGH;^E~0C?hV>l_2fKkJhldleSlasPs`e8he6k(@?eteO+NG$af%3RAFfvKy zEPJgb1g@oMbJ{-HPBM&F9g`@zK0>n7!EfpJHs>H?-b=K6&k5T_<+I#lrlgEV2*^HX zWssI>>uPlTQoQUjy3};-sn+=gU2}wBcJ8KhyX?4%ucMZ0)Vdm6(p1B3WfeK7t#%kV zXzrN3U&MKB0|QHs^@JtYI%>Y0gC)g z;(IL}y2j~P!B*iDe6zVquCI#KFS<}f(C^-P8?986;S<^ zEp}<8!=xG`^K!7d-0il8VT=<_1^^wE9n$SpaI(uNkih-m>%*=0XncC2DQ;ef3~B6nD>sm(jV@VLMXsVi zPD$00v@+Y9DH2ZL#sS?TTB>RX_*Btl{mBX~^twrad&y~LboN;&@8R%iDN!ZQregtt zz9*BGcd4qLDT_hao&vdwEf&}aRFTEyAJg1x#gNSM&8?`%ZU1d8@)A5RImt}7X!Hp zx|*lMsg1{s;HE7t&{qxhJ(Kcvb?)ylA+Ca**mnZEcqSqbYaH1Ooh}CI-ch* z@JaCkq)<-U+f(QyKeS-g89$Obso}d&2+MRnxzqi3eLRL*2vck>MJQjSqv3kER^BIZms&$sVc8mS5z3wA>piW;b;BsH;hXNA0_l! zcsOHGk?LZG$fQ`;-5YRkhH4!f4%!C6GaZtl>@w4|y@R;fJ!yThl52Z4Ja8StE6r`z zsim~CG8hL9k7cjyYkwq3MPwfilY!fmx;v!wg~LDu_r?mVZ1-w^w)eTe+8GMMic0IN z+XQr?N1p8n0f}f~x=vmDXG(jW(ki-6b{6;!@m%g2-PcL6bX9AZ&wG1dZzZkeZtd1O zN+vW#7%m^a?a4{bx+amw`e)hQeM5wm(mDvggdNK1_Fk8uwnot$LGB;C?beC0f!Qla z94K;ZYK9pQ0}TKVAf9VC;X2l(hJ=z3+gOwt=9Uo?k5x$sEMX@JUD4@HAQ7bzXii}k z6;OuolpDfuF&Jt9NND;aElR>9=mcrqAKZaSByyM%DL<^hDiz(1FVoIcs#1JGj_S^8 z7_^D1-Wb3*TH-6NaS*<`7yC9N(#ir#~yB%RGO>5ZR?*|pSyfz#3kxDNhnKXACz z&G5!>-$m2zN%g^o+a}Xntrm}pOiJ&t61E0BArFJ<=+M>n_ z0sD1NWG(NLx|G_BHN1QS-X$IJkg@HWuC4m&sw9&;;Ja_RKjDBoD0~`4H`%VUULRX< z@Ptf`JZu8T^<-o9+}h5gwmlW!NwkZz2bfhoXA6f=NE*^yS~wY6Vl$dbMs95^3Ok%J zvcIC~n}x)J*oO4#upz!l8z3Qy4SxkQ#qjb zcMGuEBD8oix{3x75Y9;Da^9@=iE{VJ>22aVc-Z2=>|~rL7b!jrKx(tT>9^NxmIseT|4vJQ3LJ@jptD%$5Xv`T~LGa&UrgJeNCgH z+T0tCqCA|cr?d2Az_GUw)8p8XEZC$7dfB#9X>6 zz7~@J61U78tQ3_s6wW3Yq+$Ncu&gcJXL_J;(^BahGTPTfAnY2-YEvaPvve33+Ep_#MCZM*Ab@lo&oQGy&7Bmw4|qZfo@TzF1E{z-H4Q3_GeGkF(256qQm32a$%i z3h~c}QFMgu_E|Q*YG>+m@&Lw_o9Zs1j%S$OP6p%-K1tfiT-eDTUy8`x z8K~;ql6O-WCixR|Mw+BaJDfHIskD)`?HMBqxrP9i0I(K|6{8n=MP#r7S%?+pZ5qqvuc2&uuqGomDcp<0I_(1==Q{oq$N~LrBXk6Ir-s7rws6#=Kv2WRTVKpz+}e$d@d~vy_`=bS*vT0 zz)PNmQ`bT(83T{T;kYL_R}=pL&EzAUD=5ll&tLBmG!75VX&UnDbICo5`#<3=OtZpj zPU-N@Ek_LHon+^D565N1ZeJB!+&Cnz+18|pB*&WKRlCn1@^N3MN2BMZ+ai&irrzDW z)2CpOl74-akjRp>V|6x~Q!TaBvW-GBsxn6H^B*M^cI&yZ1^Pl|f(`O9vc;k+MGN{QZx>x&4+ z-t9gQ)r*1s&-$H+) z{ZvX0q_f;K`<=>?Z15W>&)ldzv7i3{H`ia2Kidn;0|NvM73XTTuLRU;&#ClZ;rM!< z31oBH)2^)ci)3rYTHrzQDM5JhiuH7$Iik4L!~Mxz2i&xF{{U&dRY!sP$H!>xG-1m) z`lKJ+j;!Conwb8a)Bfo73JZZy`)RvHfm?2+oOg2^SWo7(G(Otxk^n2MwQ#$+jm>!e zOQJgbGV*y@zlQxs7x^#tX`OH&u#`U3x>~OpuXGObnlj(Vg|D<+=&tmlrrlE=Lc6$D+tg6bflQUDeNL6 zbO6v`Mp&G}JRk_Nz}bEoV{D8+!~qJftEO!gCo+eRk4 z+3l`;m}IDd$H<2dxT?xuXKkXH(zWr_lg7VnURCI^iTFb(#Kl?sC$}2at7+krps-qcB!ao-2VXL@W4NK zP%8Rb-BE%YBxG@=*&lISpZX@NPb+*+n=9#yT0YU_eh6D`?w;}}ri?HHv;5bOlS`>m zY7lGp;OXK?CSTa?&!?w!lHj;+h0%SU%M{kPNWt-HApI6dvM3-XXO^=YyDL%b&Gc@x zywJN`W#{7a-Fu(I(3_s@kghmpvsD^K#O=960ddJn`JwY)Tyu%<=#evZw@x-F&RpPo z1a3JSAYvHCv4yN?`X*#^TN#W1axsM@Y~7Out!C$U6uKGBeWX`OLuYU@2;^&lZmu1_ z3zA;0wReY7#TkvTwZOYc`%AC;Ylb;`W#Rf7@<0xEo>!eISyyhWafd{N@rN!<`fPKW z%Ho`tOuP6r6H&~|#BU+afunJqvaaK-4TD#o!BMXK{-4x2i5&HI$f?Whv0HaD_xQ<61E3`NG)8nTE63m9KMKsK(R6izWIX`lrO#vF>h`fOpSjanpNJOFs$o z{SEJG+d(x} zB$SX2<<3?{Xz0OZFb;orC=_=YD`k6H-4P9gLYWLP#x+jhJereZBSj3AleoN-o?KF& zEe*BJj1Lx4dv-~ytb4&^L&J~LlA*;$WRy!M!4r4M?xnG>$ou9q)Hs}x`>paxd~9oj zra3*D6E&5rh1zLZyN)#!ma=EaP6^w06`ZBuxW~wwgzu6v4$bV)l}AtEQ#I2N#*e)l zi(+Ue4|m|0l)iU?yNTd=B)+bO-3zIlOxLy%qyhGiB}As9nsKGACw@x0p|*&Ix}N_4 zx|LBkg*qFH`9dnD9Ux@h0F2LJ^1OFUDY=^mOMEPaFdEaotZm*vZ~s%jm>uFf4eZgv8*=NRq*@lx+U-uB*492jw}^M|g+nD=^=uB6 z<<2VR#cr0W$KkwaV~%p~nz6S*ZljY#BgdF>?m#M2u0i}6`fC)m4Do8;?(mKB?TT{a z)ReZmR?^#=CVNITyMg{Hr>X8$HCIysc`>x$F}x=&T`ya9k%z-9kGVT5QD1b4Z@}M8 z*Vf#6hBws8=kvC9A4RNxPET;UzGBkY^SLU*-Dk9P#9~^R8tL)%RaefhsG0r^3q%nU zjbFT}@yM0Q(k`k$RrK{Zl3*m5aM8KS&e!!_Wq-jJ>>)jy&)%a~2h>tRNOPX-Wb#Uz zYU#&H(E5X+i#M4r%Z@)RsBo5}4Qoq@D@AR#%<2cjIMW&2tC%P$V2t8}U)Pv(w? z47s#%`(Ng?f=N0eUGhk|H%(*yiQB-$kvQ;JmvN)0skl9{#&n!~M_`MpG*i;T9^t4A zDTI=C$1YMxZaRhwY$GFM#&}eHMNr8oWNx8c1Z zNx||fJAH~uIfxs#mbffAlQu~uwUyU8Np00HiQ|HFyUcm3ifgQQIsr{q{WT091c&#( z-l2ZEg1(uw_Ygcr?Ab>@Ri3=lR#FXgt??LmE1^So49UugwUf_BK7K7tJ2)!{MNQ5h z5@?$cAHH_a(PCh^-I+FJW~L4UhE=cY*`{cYrH|9bnD|;eZn!h|Jd9i!H@!M0%pTnG z5y2Hy8Pg-T9%{js8oK&(G-JVt4CYOhB-E9$$Xg9YtZlQhpB*9d+b$?+A6ESjg^q7? z!e;$vwNkW`P#Zb@#_xqq?^jA)O%8DdDuy|0q%HS%x#aGD-jf0ux5WPd`MmA<6NFEp ztb~t#yHqiedA3}@-`n;ll^ANWiFbSv(R={w&<#6mj+z7JLh$;q3IV~qG)Y6Zh3haRm4ZjFtJMn zqbzaHky<+)ma4e4#RQH7^Na<)v2+c--0>uh@nrKn1+k~5jwS}j7-;eX3LO3e_c1gb z7-of{;9HO33r}jXQCnICEDdHm<8^KugrF4i!p6e@8*-0H%6CdI)Y1^nlzLO4h|6}t zPJ+gZaj`=_Ny6W%Eh(fXCzLd!(}a7KLI4QJ`;im3svzyoPyol81p-bIH7Wr?-f2bL zri+jSVE{RlUDA7OjBGdI00J|@Co^r)oskzGB_Jv%_%09r6-#`%&s8>;yU-5G+E1|M znW&?yt*#8CiSKYdxC^sMR@u*=lx}S_#y+0XM4>IV$GgHd7rV@M+Lu8^Of@(6oU@g8 zJB4vAl6SR-_gk=6JxKr;X%FuZ6<~?j*}L$u+>yG4t06~6k_(B#ebg<;Cu}Q2MXKsb z>HZi5bj<$9$y2xFH^1_iHd|9IQi__|mNnzHQm$94V`>bLQ;LbdiyJI;MDLN>=aug~ zoRpJSxWO1rCtM3{yODiae5{aRu52vwYNx2F@g0{r&UcyJMW~U_+?|wo*yl;`ns|d#xL7E59|}dM*hgj;q9JXmB7GZIzF?bTu2Ul{I%ulOu)i zF471aE{rl!e4M!xY~xi#lA`Hxcftwz1=!}N=v!yn2Cd_`%aecQPfXH(&1~Vr`+zQ$ zl^D1)k_cxfXk^d#N{3rZF$eZCXZxjgC-v0<1Vv_y50h1GPhU_pI7??{JpfnkrY~+t z;dcle(seb>`Gr{{al-F@`(eIN%ToJzYg@<-!pu}yx?<=*qRwgLCm1^+$SIuv0HjG5 z+J927x~v$khXnAgE&UBqM|Xyznx;9S2RR3_S6JEVU05V+PAv`OEHbpsG4N%nYpQAA zm}h%2*cGCp>Z-V#rl2x*e`qYjqI7N{?I8N4wZIH;x#fNhsXon%Zk9Wd(_2a4xb3KL zn46?%tF=jNsbL;j;bp;YHdode9NTSUnn-Z&IpI`WCQ7+QZEs6lDBekkxr2h;)T;wz zr}w7F*EE)nMipJZt8P?MxvrPSU_WL1tpzt$&{d5Ubp8|EFkAxBre|g;&c#H(-YP&K zw<+7q6!6tK^p9+jxaVZtW8fQLtt^3xq5CHisgEUI)Q{OaDv`tDC`H6bMma_TJSSxY z64G&kjB=2}&d4AJ=*YrD6T&`t2)9EeF#zQj5{^hf1B3urMu_DS1RfA(b)*x78b+~{ z=nkV*RwJd37CT9C+@|9r-b<=qsiTJyqh6qFG)$S##ty`)S67;dnT+c7@?7dRgx@2# zisw3@mTeH&Dv2fW9(5FV3Z|EMP2ESxXahTtsxjb;vShy-00-=a7&tMcsWeP8$k@-= z?}XjPHnw*)qv2{7bPRsn80Qz0jCw0xn4)F-sA%Y3@Yv^=Mm)DGI~%c zEDuOl)qj&Ta@EXgBp`0>h}*v0ttGx_<<9>A=`W6sxA_?V04CCMpKZTBe}BQ!@osyU zf=m%=$UG(`q4A{92E^p#DU^{(B<4Z1U4oq~Wxo?S3NU&mJzfPYkZDEt<*&!!Qp>f` zPjZdc`Uxb9PNp=teGypYnqHdmC;qX)#Hp1ul2#BVIg2~9%^g$>q_s&Le`E#qK8L4< z8A>?d;}+Ff%bmAPvzK+D2A$w@mBlMCDy07R3$*pFTTJJ2L0n$A>Xt|P?!M+HfiB3; z<8L(7g9nZi?q-k)?h+o|Uo~Wr6Gmjrn*fh1;g)A=NynX3RGZ-Stp+0qyr>w z>~fiQ$Ausq$U)n>YG4D22ath@$->j!B#dCB0v(KH zBReI#U=wHNkOORQ!f!ZA`G4k#DhmdCqZ|-Y3Bf5y7zxjPl6g2rf8ZhqN!bi6OO62w zw(XyGcN{As2P(eof1y9-qFok@Ex}Cb&+8@nD0Tairu5j$<~~?lF#S|_Wc>zfAQ%H7 zN@n3ki?Wi_vh6q!v^1bFj2w_K6BxL_)xQW~7JT_esA7iy03wSRcXXk+2sCBDax=O? z9?x9ZPOhG_v>by^9{&L5g-O(|{{ZueW@!D|IgUThV!r8?0cf+ar{EB<50(O>>H^6< zq)@YL$3r0>SsJ)Jou;NQvNOtavP66Y;s^;E2q0k;+tY<1{2)dX+b913yW5}npY4U_ z73tq>+j~8^dYJzJ+Y8K#!SzqnU$Odk@LK->+E4fY0E8z9VHyj{KE{GUDG@+Wk{6|Y zhciz>!hec+58@Y_3iRKxW@+|+Me8Jo{blTWSKQBz{xai9AO8Sl{>JDfAcFSK%z%Oj zAOM0HP0KSP$B6c{5*iDRGD*N6dH`_@BF<5S01=>q03;EjCjkHvM3C89@s>C^d4h(d zilJz7k(4r-BG5_7JfH;vjU^b_01P5Z1rbsLd!q=7P(TKP2qXanXdr+B2ow+kQ6G^@ zLkIyFK!mhdKncfWk`mDnfDxr6wKGY2`kS+}alHP4Lv4|{*Q;uGz-Rz@({ z+((fBsrK1xGBsJ!%_DatY16y6D>%#TTuuSd#Up;LKg~*x{{RtTGQlW!rU+2t(Q71G zhxYMrn&s0z3?~G=r$1H1?fn-tZDfqAb6z_VS7PfI+^+WmUeak9ym7OSne|!5!7MU- zakvj6+%J*!UsToO%eNF-iuqldMp4|3RdD@dLto)Axy|EooRuz;E3H%##|%ZUBlGy^I3`u;p`R{vn)F*$!*T(>T$@D=DR?n0w{2Ru-My8<4#f z($L$fJ)cEZVAoMJV;LM0xkdWnHB>W0I1Ok#fV%$xNy09E&8Xp|$$o$uJy)Re%U`CH zr4_v=OTPv%mhMrLm^Hwh08|;^z{%V$m2Bvu>KPwc*L%SkYeC^<4ZYs}X(nL~)ufCs zmCdBjrP}f;+(XA@HHx;X$t2R#hfPT!-XeAf%|`dJIWjUc;umKFvfe?`rS;B*h0)Un z1D6g@qHe0qYP3rn)0ewD7KOe{S)6Y#ON4H*@yjyJFTKPm2x}i0)Y9RMrzl{cik4b> z(qOD>j+qY&ZPVExz@ zq*BW)MeW1%IDmd@TocE&Mff?f&F|#v5p_>V^u@un*7FOhX4+X=Hfi-KuD7?@?$x&Y zg+)sk1Gji1b-*X3ms^0#x8x-@qH-A=(n#$eWI4wHeFyVyP}@q0_nP6O*Y?*%PeBW5 zzBcI?dGbz06XbiG{NVR1n)@Q^>bspIsqRoX_(x1~HHS-vJl9K^@=D;=j04y&dj?gL z8gV)k+_w$OD`{!p;O_i#si`QcYo26~xHR(TEek2x3k&K<^lFPWTk0DmQ8z;X*beIX zMJ7ZwH1^1hbc4i@^6tt71F9=4-6M;f2XnwuscpJr53F{U^QXB_zIL`PH0|)&_>~Rc z2+=AMWv7OH4|sgM=^d0-)Js(Nwddguz-ZwVRAtphWALyI$wvB!pp-{W+!vkPR5x7} zNR-N0np-771dbXMTh&yOz*!K`(lLR_LYzq~?*k{)s|Ha=7!R20camxs%L}d%28!P# zl<{ghS_b)6lwuZY@SBp}TtY#4#*lD31s-aaQc{pkUCxl7xTC}aXPFMqP~uMcQ6{X0 z5*+W^NH_z4t6fP> zAks2BlC56acGAWtaMUsIrsSMUNidDN14h{AgeOaZkfQfnY?|Cev;P1H?4n$5Gu9jz zXkkBPr}I&1X{4TS*|p9j^VodU`5>gCZmOv@JZ>WhQYl@S@`bm2K0u>YCeQz-zTXxklIImd0wXRTXV5Cqp|i zoGD!^M>NyBF}q35>h_YwNo|A1xX8c;~d9neThE-*tRxO+~JnCbxFroUErk zy%eE+l+Kb$gW^v2J?`#zPt)1tsd#Z|YX|QYWjqmEXx%fL;yiE@)D@CeTHN=vG>2mY zvWDE3!J^}#*x3cPkHjOyb2bTf>Zxn|N4)6`;iH8bcKFm!kJU@D!QhEO?xDpb=%iXk z-4VakDAc$jO!sP+8y;Hs7Ld$xqEg5rlsTX{0CrHMlH_e)MNNu^rPb0(Vsjz^!!Fx9 zsDZEjW2wKpE`Jp&Yu!Y*2S!L_LB+aSFq0!gCwT{*))_U6A4ZVCNPm&a5-sEYVNeRT5l2=8rqhOIi6}$ zoRylT7_tXY)3nmIs*vh#J|H_4Lu%?@adY6D7t=pyH_Ox}=eyKU&izfyZsn(NRW(%9 z74-msVAOsrE|_EaGL)L(8hVK%n3-+z30Qa1-a@LXzSKfI8R9ZGj5u-iQ(&H!-%J~7 zY;Tprc^u_MTT@AwFHRO4PYhN{e z#l`HYW4xNvx7@0#BDqq#GSliFtwsEfi8oH6mgqD&@>IC-WuFAOz2zu7{XQXJNY3<+W1|KT7dP+ejBA#JWgxlz&w_W6lU2} zV=~h`h{pLR36`3+oi7b|^-h3QJutaUd^ly)PVVG=>D!H_DiG3Z8R8$^&J)nwB#ILj zjSW59%7$%G);zyc!8_&WDLW1XN8>XFIdx-<6jQc(*9O!A@#<5Qy*F^0r^BLSex+Go%!^S7Am9pQhO;_*zTP4QkL?eVo+PNXOMU#TPj4y0rzOl8K;G zz}DlwH&!fWJ1O4$3xhpn>05QNgTjHXaQ)-D&@vFwhJXTa3?~_b%AWfbjj@T%K8bh; zDo9oqkcN;ElY)j*p#uRJM2mF5J%LGaJ(2cA9fasYGEtyhFpEA(fOtd#1fi4w2s`B@ zj3s2{0)QLc05>UE-4CJwNeM1)`5Pw+NkC8=lw~CXc0dXVB;cf%4&@d`IY0~9#|}7Y z5)-m zwU3Sd@i6S&)*7bqU0m|&sow8Ea1$ZN8S~*|?fGV^PN>$_b%c&3lrT01b|hr|%0$(3 zSM;=!OycJdaUfOyvXB>a;DpDHMMUAkh@QtwhHt0g_@pdW2T43dybuCBI|pl zUA_n-qkn?Q2IZr0nr-k)V{ft3(l^Ap)<+XY<)Gm}pQ$Yt@>y@BbnhR$;eq(9l(N2g zHP0*FOM8I|vm!}y6R#j=Mq4@FgR zYm3f1_8Y2Eq41GWfyOdZ5}%8OX-RFXs&VjXa z7A85aA;Y-ax`tQmSXK0mbO5>{*_b=9sXaMGGimE%mNx$)ZFX_DVi z*_q{#O4Ue%D@(sSs|GjW8zeS{YDr5fBQ17uxKbE9CPVCpR?;GNI8-EjMQSRUm|lGr zVdD=!G}mU32`K~+Xbyg8z(9S-4ZcYLpf^DNXlmIOLO>D1F6fB}i?&oDSw=_+qU4g~ z_Jz>nos^uW^&-@r6JpDfHExKMlI2Mf+Y>zq|?f3M`$HxU{o`%Y1~|QJgn4d@;3M-(c#jx9rMc4 z*{j9A?M0ZxjC`#ceD_rLS}z`?1NH#isa27RTm1`QcBisNoM+WU{LxY9_br}gTr9K= zr;Nu7S`J;wI8&l`y3M4LTb^*KI!*Pmbln$&4qc#ZeoFQj-02$G+FJA2ugN`5S!b%< z7Ta%!$hT&<2YPusE116dG%d`uihJN zd$XPKw_>>sK-B#AUuTT)q%=>$8`(7dzr{Ru0W~1_vDsOf4r8I(xfxTUCK_)A;5rFD zIG#Hd2BSKQeASf;kLuYYcn*)89$0+B0dhoOFV&HPKNT8R2R|K@mh9IKeN=1@5RHmM z90N!h-8AunPbtT8lJSwcLqmAq9g4tc^F_0OoZHz%+} z4iT^iNY;+z4U%1#9?xUhBOc>xBmSv}Z|=mYI)05-+B+5Z6Yfou9<)2|d zK?D#K0m}6cvF791^|#kq{{UF8FLz$1_DC`8_R;FcAN7j%eJ8me75r-d0QRt7{$KEG z#|Y3tduQf=QLF19p{Fy|$k?H20nc&3ZcYYIVUjmea;o~G+}pQL+-Mv!Dk`Iel1 zDLxkln9`Jzmqm`CKqGK?!r^|~y2?RzrnK88E%!MaJkMeO0Hg;kA5Kt z_ZHSuv=+qK$<+z|$@26+g2mNN`nsuSoyGG?;`g}sB;>CjQR)g&sBq7^^pD|*V$Skv zDaXg=&s=nc>OP_A+AEYq12aB0kKK6L!|(hR+Vjt`uD7J=-+Q-SW^_~%{?<7(mj*wA zFg(ZPx5Gc_I}HQ)3n*JL)^xn3&Qw1r3bc)v|sbu z3OVuo8kkS!v^M_$ZI;9-E&NuBhpBAUz#2=f6uIo#o1eLP4`jF+4Mae9a9w!4N^+8nk>l!rgYZT! zSmxL7O!kvbQo@f*wLC-n1M*S=_F{g0DD9O7f*p`4k|(-85D3Bm0Ui;cqyj-2B7g!U z5J&)m2+#o_jS>I|v6Ow#!T?SYV{cTVh@b?agm^@d2`D8XfE&UXO2P;j*$E^k5fFeG zb3!20=?Ju-225a`!Y4q-3>JbtLVUFX6u8Di=!R{SZzayBi&5plpcNXX#Z4?_vFeLG z#{U4Cw`fO&&6h=|%lE-Q=vv7&%4aya`#CeQ{takxcWD`q#4X1_QZ~bAj*6|#YopjW zZVH}8=!-@aVf5@cTb4CeIOUXGnrNz`lwv6w?~zsV+vuaKb!?Hf(&J@JSUJLGRyeeV zz3m6d#4R#uVUZ;zbZZ?=cr?_YRX9D(1F#-S9r}XbQxJ*qHS&XpVUQ(DJ>TNG_*#@QHL>gnwjmO6_2V4#W9 zvBiRT+zWnXX}W^4_g@3!rxC#1U*+%w5$5y-(5aU2px30)x9K+|M0+=a9E(Bm|aos&2Kkq7& zjCk#fnSKVI#)yL>8h%`)Ry~yQH^gvjK<-ovjp7b&GH69VFeB{U*7uh}26GC3n7&1>JsR6OEk(V97;3QVaO&(Y@{FF!FrpS$SR21%v z0VIyxsC1IcJ!m;N0PHvk#?iiGss8{22Ia*cy}?S;?m#)+-c_`^MB4-D$*6aV;N3^M zja^o0Tq1-3d$~r8%TsoV&vT!?RGXDFOsFzdN*LS>G;*ft@-{_?Ni+T(PjOceih3G3 z4ST>Y+%deBTU}oIK@~j|L5*<9e|1|UC#Z2B6XZWqi*oOT6-A{D;8aT_RIvzQ4d=O4 zG?W#W8i%$hp6`tOL@hr|SQ$yGrr{%42>UtgtZp4eNkND$u{5}xYQ_Q*QRT5YH^N1A zFH6wdq7@gJnUTJda1&Qvu5CLE7Kob00gYsSK~r^flhswg>0alOGmPw$No91=wn>kM z&^IM(?j&cizQ^inYHk*P5_h^u3FQ3LdK+A_fJ=0bG8L;QrJ|sCr^LEE_)goWeN7{z zegV$|vcgh)vuLEaAzWDvrjN!0#CSN}OX_I9`$*wl}URppNYNFFzDPXFQus=@VXVFWNt164Q zawB_-PLsY$nMGCM%1)45jg~^seW>y zSwlEuw!l!trWtVVGNIH@?(>3A2O&9dsE$~K%sB*pE6dHEQ~rlmJZeAGfpv$#xEVnB zB=~|wRZojg;zWOF&4^7&afYfBO;GUHkFe#Dx!fx4ladCegU@0VB=R#PFH` z_EbAm581=Z)l&5bi@etPgWz`HwD7anYqbqlWiAm&d2gzjVs#8rHh0y!T>k*kH0}2; zs9@Tynad|U71s;*j{&B+2NySq2P&rBPYl&somSx(J8y&ctIOBA)lTURI~dTpaRkvclz6`wo&4+H*Y_Ec4Qi zmcEO`Z;Z(!Zg;><@+zR}B&u;HT4u@p(4jxw-0zMD#^tGX`jQ%d3e?EjNZrzMRSTJL zs*&!F4-|4sTd+m^g%d5+7V3I@xBhe3xkavh%C=BpsRzldQ5*wF6H~Yz_*WLYr4pmhAp+Q0O+QB^S}ou?p+ea(9+7l`n*IAhlgR}6Dxp~3 zamqg1Aa_Z|5kMJ5oFH9}QVArc0*jFscI=35j{z_fl9Ep7-NJ031p<#LpmL8ppa*qs zk5XqiL|&DE@p4az=9$&m7k$&P9@d7m!9J+95IIV~biWBD`*N8w4bnl?$@(Q=J+FO= zEnaD`K;Z_$(^-qn`xsf#EOHKh+JrjpsYO~IjL)4MD+~;Tnjay-DwMIr!6m z?uN%l;>t$ODweycD{4oF2oN*-JgoQ1UurESQ4YJ)t=&0lI zM{M_4*_>p{<#Btw+;W(B8556jRNA`}?BhQiuEb+gzl3hBt=%(pt|Lu3V^4SOvfQ?!#cB9xsf4l)`2K1< z-Ahw9!x(HW@@U-;EAWP(Yx{QYg9Ys+QVR-^s&&H>KV>juKH@CS#F@o zA$cJ3xzDtAIzFnY$l1UY@!a3kMpd_gb-vLnBQ6wFP(t4`y3bbiz4m;cdho&Q#(=7- zx!-jHQ-Oi9?Z*^y%$qk+U8Tu=eMbKP+QO}9gn6AYQ05uR=%XRi)fakm zmexq`M{cD<*R?uyS5n10d!FkzR4{SMgCII`p_FZ3cxig$p>MS)R3shMacA5-8WM+E-|o3;M1M5nXT#DjUIeR96;^@7G}OHq#?~MAomCn zFR3csEy2;e1CHamtOE*1QoBXSp5!QTKT}qbd>P4dDyScKc=TCmKH2%LMN5Ez`SMw3 z{{UF;ntn^h51KsTHck;2c20}2(sA7+y9upcsEd)bRy(f*N!hY254lH}QP zBgd0$)xyWRW8ZZ#&^Prl1>w~AcKsiSa4S9aAr<|PYymZoq%a> zUCWa&;{X%g9P$hd90A=$4Ayl1B7heGzFqWGtgHV3)`(?)#MVgNy#YrR+9;SB!r}vP zLZ=hDYSS^;lbw`%cAb@H(T`{M8hVbGpq4G#=$nEEqAIznDl4R(H#R214v=>T9&5~A z%YCj*WTb-CUgHc0;cVQ2^YZzw`D>B2RE?;nsV|BD01*M%%J~eKGs6b??;ZH~)Q2$d`@jJrFxf0~vHT};;xg~VaQ z&($>!fl$UuaU6$1K1Dttd_FBC?Zk{Y2eBQLg$x!tAal4XBR(k(RF*l-1&8E${Pd{)9Wb9G_o%864z>Msdft|QXcEqGHvfjZZ!_PiR-gd%m-bewL zjD(Y%VLI$ICfsqtKmaxvO5i5J^h@MqBru$F>X3Fn$r;%v%q2l!@8+s6$Mzl7sdiO8 z@Sgw!!kKh5`7w3>0Boy{m>;uwAI1EYHEGMrz3FD=o##0C{{WKV#=pfq48Njj*bWDp zbOLY!YA{+Fp8y_LX~G7y_DgR(q_iC6DV~Nqj4wq;4LkkylmD2lL(BZsx=8^SzTYE6agy2Rz zAk&X9u=UtJ*XoaPZHqpi8~*^odC~is-2T&K&Jm=wDNz7M5hWx7N=uT;OOOXU_U3WW z6+W`YKh|DqUXb?k?L7$L=TR8^*PGYRdZ+5I*!@rVF@Nk|{{XZ90AvIZL3xMQ0R#|1 zK<*c+J(LW4KC}M--JkY~^2c@Rzh#3S&+NbVC;g(mpGp4!H}pOq_}l*g<3soV0E0~~ ztp`RmV{Gx2&TSsnY|_=qMS6}~U2IP=NF*BL4hIL~9=>68hj6^f?XJ|@Z(UT$7y>HT z+fo4YJ3H|N{a1doH1NZG50Ug81`klpEE%mftu^>MFSLJYQCcRoexRwRtZ|dYo5Of> zT^|}r9(nv1MCrTDA5hup?l$*_Lnz&+mOHy$>KBfP8QE;ToAs>yA9gNqeAe0asDK^M zlbija{^h}k)SI99oipk6{{X^phLwLW%;WyQ_bU4C-TJSruN0bewUsU{AK7=r-@t`J zdCJy%PQFleA6Hadt&NmHENlnFZjxLZjy{28&cuc1XRmTwdb8_2J!Jk`9_p!5zutk2 zuHX7Q+OZYR=Ha>10}ei?`7R_oFHw6brKhv|IHI0u860wlRLLWb00jB`fL*?rmiH&% z@jr_)xM;n&_a>3EL2%x!_O|zR4J3A5LfcIVny;r4bbg+!_Mz?fLL=!Z%RP}9hsi%r&wBVTB90Bs#KZUWtlTxO6 z1FNzARbDa2zDxeuRUOs0RsR6@Pj>V7xqsU#r@Hwp-+aGw_dOrzWBr%=2|)xFXFwB_ zKpMC+{A2S?r|si4)WiPKzna?*-yhuO)c%yeW_uzXqi6R*d8w%W%YH#R7u6qz&+cNv z2b2N@Q6NSFB&3)MK@s5$BmpFoj#0T)U#^t)i)B@PY=M;2@tGdu#~bHzhLa}jB6Os=snnDV zfjzpGcN0A{GLy-B0Z{6Ce&0M!XMy3h!~TqxtCSWq)8ona#XsmZCb}|*q-o=3m}is$ z{9rr$6eslUL=v^}NW-M$c3We*ZS7umUqsR5cebD7gGlC@@+#kWni_aweKv_U4td-s zDx#9At5J4YkF->GHvny&(YcuzUD4BRRGF&O{Gr29Pe==40!cf$Gfm@F%t^`ok_;nO zar9GZs~rHqiZVSmDnFNI%T*Rjp`a0IV}^6OvvXS*!$1nUE4v!($qUE#NGcW1?D<;e zz}GYp_Kzwh8LlX}m!Jf z3w1w@MP>LkE5)ty);>yy21ZW9xl-FBV3Wdyfvp|;rr;A#Rtt%DHVbILUO6arvvNdI_o?;zo$`_KHN6^i(c%RE+UvX~UjJ1qw-Uf}8BJj*25R zb5uE@fw=gSRduk@#OF{(*T2m0s4HqFsc>|TBxixbvVxiNz#E+a_bWH>QcJP7RL@ic zsw5}Ly^}J{GiWHdYlGZ9P^w-BNUOoaR)t0_Qjk54~v=lp8aj+>t(- z5-22R{BW)z`<1Hn+rO@EKH*AhJT++zAvt=JB zS5PuXStWdp(mhpgNY?lim4Sh-cQ`*KSwV81H3d%u5@y2*+!G| zSY*^FEvVKwoVheH+@-IMcxHIP9|#-;8kQCS=-fx`1`4ax>wU+3=>+{k7ka;TaGp12 zCvUf6y!q#xpA71b7||Yz87&t~=Vm)^P_)(cZSaKgoVCL{c3DYpboUr^mj+cZV+Z$@ zOS*~lTBDu6vOI&rB?)BgX{hpSzgkCK7l!8s%+a=cs%PIHZk6niYlQOBu@!wmMP>f*Xjwws-IO#f2^mLCw!EOS?F8wvQy%A4&fEej{Ff_TmZzh@-TWU8zpU)o>xs&A0&h9 zwcIGRCgWK+@C;Ic!&ov@d6`iW(OE(><~c=Ju8WK9_O|54$4JU{LN*NpB~unx#?b1T zAB6YQg)YZmMQ@ez%S2r#?w4>8UT+smysZ&T#xQKy*gGOBxI=E$jM2$O9ZMfsO6>!d ztJ;pGcZJ|uygGP@#~YQJFx|cu8gVf{!WOTlI!fnPBW9_mWjj2ND3n)hN?g%LEO#9S zS2tTu`6HD+%W1e=r;AH+ri>Q?TUr-7rzJ|XhP%K8du;%IDaYe4J*oxx@@+tJPe zp7kJWNA9s}Xf0H?Be~^GYj;kys(E6&2u3m4IMxJh8B1tQAy`dr$zXY+{LzOh zNLCnX1O!_Al1r1I6gEYaoa}~E5DG~+MvF>7B$PQyz(BDu5P=CrxJ85o2qy_8`8y@N zWi(r*78DKq(8hbAvOJE-HUVh?B=fQ|c1X%V8@*FbIP8JYWd8u>h?0oz6GWW( zpeT1FltlK*L$zaWQxnw1PTbEc7(Gg8L#_uX!phz{-qmkwhl(EY*cHyYgWAjT=2Emb z)Et#+4fKg}OS7|8R?||nx}s(`9f?^x-?STL3tS<1k;9A~mjJwVoyOwwOpd|xD?L$F zJwvlJu6NaRM@rw^X7eS{)q028rA)fpO#LAL01oQ`b?S?Sdx><88S^<*21d8$n{>WQ zt{5X91`^8Ol1t{6Swp3JoO7MZ^>;?$y_m2v`G6r{C(^uKNB3;}%n&nUnAuOkl$}zv*pxLC6*ScrRBi`cdWydNckHFgs zZIUS_xYL-}cG+~!qqNO&Y#tUHqzsetRgm=Mwv21I zR5iqMJ0VR(g~~AvifM)-W1aE}(ubxi>e>sL;kV7pQ6=itK;1NS;ly{sdfRxGyvQ5_ z8;yfhJdeR!UuA74OWWwiy84hv?UgO}YgNDDqNfjd?}eAVJ>K;p)Z#S}%7)1aBReHc z^367*LtWI>l7b_6iM~x#@2HY@YLZ7e-laz^FWe~*(#rGjw3G5rgfzYe$;*9FL8SXttB?aG9j@3YzoPwbC^BF|rVTrBo%ilPrnN@L|WZ%aibCk~o3qDNXiy zM;`Up7LP!muDMp!5@xBC`U8*2Q%)T6bv%+kh?Tr@vnPbKJt5N({kr{M=LHI{r}{~U z9{2Y-R=t>Z>ZZMb6T;|@MrQD$eOF6#hRt6vn)VJzDY!qH06lZ`qv_1!0Rq;{iD=d>PMy42mNC3j3h9>)g&HX%^b zb#=~_!KPmkqqBxp*z3kk4~1Ju$2Wt3vzH}C(=f6|T2Cn(gSy{GRnu2Jo;(MiG}PTA zPgC*Rs@U*%(pEHUxfqRPeAVYk)kxdC4e=ZrP6*0fZ%W*0v-=|OKZQrMQ%^~Dr!vIm z;r+sqw`JE=^%Zrp?jviO_;H;s3M4&OLp#B%q-$J1d8#k8c7IQXL7Wh>1mRLdQLetW z-(JyCPd*MfCxxH!>FN2DA3&?-E^IC!kZ`J8;(03L3m5KQRo!EA3mDw`s#m)tru8B& zTE-MD$qOgV7E(1LS46psE(s)}Lnxvgn+8!Jf?@&)AbhoSi~LD zt$y1%tDnIs0|2g-b%fURjLbZ=WPKMd9}9?BV&ybxle-ryi?fu|b}B@z{fIjz7Rbz% z3EPxzYhN3;#``8ABT3Xz7mXw|l&A$urIEF*JNHYXjJ{_16NMa{;Yp*Ewnh%X0h%opR#bo|5 zVb+vAI_aX7`sZoDU_IAIsFclQrhA4Q<~7897l!VasqVKJjYNh=%P=I9l6(IEg7+Ou zblNFeJ4Qbx`UaEJVWQCBaqdn30HqunobM#seI#;Dy~AzQI=OSO7bc9KjBrN_s(VQ% z+#RQa{nsj$ry!52_2JRt%uA2$8Mkq|cC2Eh?LD|m$aKAq@*!FE1Z{28Q#NFgwd3j* zgd(CinKb?cyEZ}ayUEIQ(!N?a+fvL_L=0j70K^Al>Z{(?xEyTYatKpqmD4~A$L$6+ z6#B)nwgCjlAkk&aI23L0?d%{K2u^T0VwyE#5-0FloL zah=Y|I7@FlAOyQ??3!@hJnreD2N~a#hBocFRTt0dIN4k{WU5=~{g&KtqFoIxQH-tr zu&ozL?N0CSo&M#Vtov(6(!(^vKgL%UE^?lZZZRWDz!RWt>+?;p9PXSRi?HDj(JMZQ zE<5ax9;u>OuuhzQNZ3mVE#!Ae1AKyvjk1^|I2sEa?L#B?Pjvme4X&gv2m01$?+QD3 zQ>`rzyHJN8gwGy-(g;OE?mdxdjxP!q#txT82rCUfKlHb84j&Mqg9p=8i+w@+I%rx> z+C~-yj%=RRFAf+bw3O}0`Mr6t?Va!KHSI^r0V!FS5JVBA07!CLLy#kxdwq5~9iz^v zpOId3UWff4osNxwdDXN1moGdop7l@FU$OeX@N)kE{D1X-@B|P+d56}41Q0+5&O-Hv zvqtIYODO*UupgOTP;c4`);`XLIvUIW0J}7=Ytnj=@ZZMo{0x7){{UkCqCXZVvs0O< z5vhj+dXH7+e`?(~db3`QRnDq=g&fBa)ycU7_#N0Ez^_gycT0UO(t>I__*p$Ptq)z;&zx=K^_sT&bk1`6_4wynY9a9uBbNlyHJB!&=1S`D)WS$ zl}1iIGdbagO5T&9F5M}aBs3GhWRjhyFB8UMZl{L=1~a*}Lhcs~%-xl2(e zKJD4#&Z_?a?w;-c0KH58(N#|5t4^jmx{B!UI;lU}DzV&^@|k}3`=7Sy7x)nUm-`7s zjS|S&fN~U@U;fgi$Ng)6H5hUf%Q(%}jCst@_JZFB>PPoE^?#!;+5Z5s>`3+lK1slm z)UnF?v+%ig#e`^rJZzYNIZ6pBK}!J8K=6yQ07KUk{V1+-(exBlu{e)>t88z_c7R=v zyan4HxL@g0K_vYTMO45`X{%eW9fO+TpT8e^3Xf>X{)+uQO;uBKz0}6n$xd4gI)-$( z?oZskC#3V0=l=lFI=(ks@7CgRGbE0n4>pimPv4Kdb^icp)7~rQvJND!3s-vqaX>Pqa1On;1DubLE;^9%j7G9He zpQ-7e4AfGQPUko{Iwx;{N0HCo7aE7#cU@T=*zb1QX>qYNG|!30>Iff#>;A{Rq)XTF z*ZB74QM!;bE@Xwl<=N~;+Wx}W0C$ak4 zc`EB2S!$K~Tdn43B**UWyG}kudM}`Qx{Iv3Zl3LL_yh9EVR6f%kaE-b5PO0W2O8wm z0*@<|dqMWI4?^`bEw^i3MAXwl+2N>x<0KM61RQP%J^YtLvE3oN+9<9xgqnJ&Su}a) zOMoCBR0^8pvdT3}UDTF}3xjBDu2gi@ZeV+2npUySX(R$O@+#6PSuAaQZfls~kmj6% z5Fx^gDFxsmtpF_~=du8!Jftv!G!YaCN*F-|01@{@P(Z`N7(*x$fMFm|M1cm9Qj&6l zz!9K=Km-seB?N?t8AN~rLz2o#Km>wCK#|Zt!PDYn;nl`{QigCd&vX<7l%xXW76Nz)r_;29fsc}qK-368@};Ev8k1cyoJ!byIONmn0LrJRwaEFJ<0v^hlghoq zBEVb;10#dvvv^?q8Z7f(MkkV*2%7N>lSEqzmI;nX^cHL&0uLf_~#y@%6E6ANeYmdXF%+q&0l!w!`?b7Vy=A#>YLuP_7vzD4q zw`QwVABq~Kte&dBM6SbhpM|_AFL!0BPC~@8KAm3<2yK?p;$dy zrxa4a+qP(^u2W4}EOW@`7i0{dRJwYR;=UP(0oiHFr>T%KX4OP?JEm@RZIVBDg#18! zKrb^S?DUFohg-W5aqIoq&tS!&yz z!rC4LW@=}4#zMHk%dl-Ojf8jVd!;anSsNW&1{&kGrAJkFmXN+0$cv%#8-JGElj`ZfdH63P`1C zl1Za(MnK3~TFc8TWALdaWGoy94b({}Zl(_xz=l|Vh>T@8$)Px=S$?#IlwuonkpM;s zlX6u%pKv;hX=9z7mo-CtkB&x}t@#6;2P$m0#=a3xO&jT(j9@iQQ0%Olb~*W}qmie+ zm2FLZqNb+|p@_#WH*~3iYprw!aZof3{{U#AHPeS~$YjAztXD+F)7RHXWr(s+PEW&t zqSVCpJ510wP&?@=RZY&WNLvqr=o$ty8jVe6mZ8~-qJI_Lj!J$7WcmxVbaeh4G~N`S z$Bd@gO|S5Hco)#=y{|F@a9z#br&p&r3wmBZv|^k-D^N zF^!Y$XQEJIR1Jt=DPUuSpwzH9RFH%LzUjudeo)8B2WPT$0)XKjeG)+^#_5P6?a>!{ zrDG^)*#IXf@Jc-?V*n-s0P{eE<^dT)8z3lXBS($+NOnQ=O2UPNXJm%EKQu+y zNhb&wcSs}@SOLyWyK(50QVVm!n*iE2NF#nxhhwrcx?nc!`J@t4m&fxZG!`W+E3AAUiLS4J0~fJ)Nk;G*9|mLgtIbzO>Ip{%+j6v4U{*zpze23 z-6NgJNdUWmO6X8X#m@R2blYGi-1i0IVk|bZG@_aw|QegacbrCV2hORH-_Gj*Xga^sN}+ zm5g-Gd%h$1qI;Zif_74&eX`m#6&*)iQV22@4<@ST)IILh_qopVB}aj-ci9A$E*ou3 z&jFD<{DOQTq(ys+x8-QMS=yzMxIbYXKTK4}(c9O75z-R5-Lt;j=t5 zWK@N@wZWy1!)>B&Yid|X?UicJ)$}&=Q%@6I&^Fm~Q&%LpFLRuH$yFN?qZNZLkY+Hq;m)Z>zkL|538168co2vS9?%frT zn9m!IKC4w4MoxC@TC)99-BDrg!y6?~RnqikkL{1=Wh*;iHcJ0xzp z3drOb&N8wYBN!@OEp<&k(MBH#+-15=tN~QmGO`nr*zBNhwKul z+C<|cDLzowW#ueh@2Tx13~;C`Kj$w#XDa93U6ZyL8-+_#yrhonJZqAqA&)ISYUYZ0 z8q9+1eAP57b_`Odpc)Cq&2N z^;NBhhfK!p>fpWidKzhA1DzOOO{-O<(#P=s0N~@v_fPgm9QKm!HozOpq+H5hhqhNl z_MCAP4JZDPlaEEt!~XzmOSfSh`6UjIE<+NGfIA*N6ZKO%SRfJ~jwa{_%yvm|`19L1 zLZcfGK&*ljjs~N_I6jKa&CRW^#!FqZzmZTw1Ee7A$84Ttk7N&rCr<~}1EMh_atFeH z1lb!OL-(f%8aB>+lWpAYfE9pSp6KIdqo=v^M~$||d#2GPC;Cr|EJ138ZtV zti@;BTCSRJ^caZqKbqph`mFENev&k79DYe&eUokAd4Qc8aIFXx$0|IAM>dBMh~9LpIMj>wEm@$uFG^nFnI(6{wt-#&>)2W0Awy}(~l4KiPb>z9S#qsh37-b z-6U=rj|hS_L#15x92#)qFb|UDa(f%0si~Htw(D0k(zw0u z(9x1kNnBdpGtU&G+4TPa!+x!g)3QnClTmA>&p#)hywKz?MZ@fGrL@Phr+|?Kbo=jS1lb! zLt5pbiIHYK5{8Y;jW{{{{;OMs?di0T#I1IIdF!9V8jVg#VUN=k>b$?)4HyU>3LJ8Y z+!fa&=4098&ZGYT?t^RrSBz{ohOa5dD|? z2}F#dSsO6NAxyDr0I46`<<@?L{{UzH z$FRpI=9UtBl%T$>{4Mqb$y1LsXBVT(Oa}NQ5I^) z*mo^=(BQ2Lf^F@}pgcimtiF3A_J&YhSJh1`Uo4UQO^K~J`(9-EcFJq?NgvU= zg#Q3;5&qJf)4!wTB_*!B-fEj!UnM))PRR1sGD6d(#QGd7f6?osFTEaba9^m6KaOH_ zP7iC^>}m&aeL^U9lxY*h4N~AU}8ul z<5NM|z>H_)2=y<4E@MdVKH2T?Tz!~z1aq_z6+e!`Ms&S|5J%!ZrE)*fGT|_}-)+Q` z1L0)gc{#4r`8)7Z{jK|EvtD{as?pP4@if)V5z8avED^Iijrk{qVfrm}y-f`T#`jkf zqitAhFlrbjpyZ#)A@v?ff2B2q*7S`H<|bxabowMC{;o~G2L}HDq^*HusiiKtFqeK$hsx=Uq!DU;A&8ikaHsH7%ozjlg3L9Dmv?)=qUTj>=1%*l4Jr z=d)PB{sDQv^jxsMzo_m#LsHV_(=f4)J>-8shF4+s;ViKGE9w_QNInZ%Nb)i?AHb%? zCCZ7%E*{gm->&+SN*;w|l+ZMt4Tue8qxYWUuun7EH?&`8w;Fi*-ik`f8IC_})`H>R zM2*`%hbtrOYpO5(EN-o%tP>quLL(m^!DU>+F|~n5v_y zkTvkhuTYLwkVCLQBe*_!& zmWMaqpY!)=Kidg@NZa*M=qlc;vd~*8ZWXsWYHCWRHdthp`Zcw~Ab@w^t4a#`YmF2& zbW_JYG_BPfvAa`TJi%UG=|5%H-)OcvE6wWiDWDKCo{f%-y!cU#BW#QfzPqnN^j(r( zpXjO!HB_vcN=Qs4?9LoAaCh`5Vw6(yXp69bc+V@xzRmrm^*yfq>VF#JdoslMY3QVx z&u@x;$-(SB75(?xAGKbVsgAP$074+7k=Sb{q#hAJ!>Dhcu2JI0?X%Q?f`)w7C)saZ zQ+3x*8t9_;dbnTVRMY1nj^q$~w2nSRc2c_At}Oi-?k>K`G*MN#?T$#})&XuZ4mbVa zkreKYZc!4mF6%y@WuA`dJ=&5A8pdmaN#Eh?8OFie_EuJl&A#zX?-sh+YRCb>d=iI% ze2zFkQ!O%vQ(?%#$Uuh)*(WHnizpqAB$9|6@PY=#Wf4W4kje%GNYZTNWFFm$Ve|}kakfS_I8)pb{&rOPdbWNeD%MZ3jZhLh>cD67V4#4uNFEmv$N0(DbBpt(Y58Sr^C1?k7 z0_2ya;%?&FI-}}YR}Cg{S??~ObE)c>OAgq^;Z#=FRWy6W0WOcp%e~Z5!BX8d5i(Z) z01Mh2KH{ma9V2C}X>7C%Zhz{W=>Gr)kQPtU>D*bgeN8?jk3T;8@lst^Z*e|t;Yl~P z)@hBed?1_#XhK}$`*N^l; z&)~Dy8&mDWHD<1r{{X_~xxbph;mH+JM(ZRe%vn0^e5$)?h2A7A&%+xV{M1>k_0*K& zX(o$F{m0`fsydlsm9M9*1;hA)Io(xpou;NnN=feQ0HH#QawS1y9ILjRQCgkNwIuZK{fjlsa0s35dvKXCYCxpt3;d=5WUa!5eH_sM0pwEHvg{)&?ex z^vbK5TPr2YCW2fZR3{3nwC#!I)04Ia{{Vv5*}a?1SjPB}x)6DOcSR(*3vKXI&sQzL zHY%3w#v1GeK98guP(P!#W<2qNaJnsr+1;+&rSof=QT#_`u!52(8>SeV*7_;mT>@Vx zF|vC;ov#nCs(Y9>&=%^3%SlGYh+%F=auw5KB>kKx8wn*#ZI7ZPaVZRoIKfhxPv({& z!P_`R2x+l!oDupd5yP^0M5!SWTEm24oA9OhNN7a}jib>RU@A|B5E0;~Lm3fzAQ(IH zo*<*pn27p9Ej#R_=m?y_%0M%uZ#`^?%N&sZXl8eH~$`mu99ZVKj`>21eFf2}c*b=Q2db{FyiicEnu*vk&g+ZyFSSW#FJ&{x z9fNoLS3A4)O~Sh;Sp)G~Ljl~j!nsb_`{n&^%gMe=0wN%S3U_O`UUT!#+le5%}>?oR$_ z<#bTEWx>bDBpDj>mW&0`qL)a?w%;Q%)do0*G!y1jXUz9x%?Vp+=w^2yvl%3FR zYo2fcB|geI2^xkKg)Cr3(||sS-8*f{%2~W4XyRT-G14%7tdgH>A*105@XQU;gK#-n zIksq`mqRU#fzIhoXdI^o=wp>OP>cbvLBJ4|z}Y7ri2##~uR{AAdtcE}xA;l?%Jb0~ zK8wEl3uKi&Jm_L+bF~lv`KH|n(~+CKHU|;~bJftj^>KJ(Id5fQPty;lm{ixy$lBAW z45uzVLurCf*|gM3(Tsuo)^m3LlH%!^%3Bp=#iT@c?p3=wZILuOuAz~G$jX6L)zx!2 zww;WMKTcL=^;bPaq4P~6_Zt^&_aZQp?T%A*Xz7sK=q;3jGq~L#jD-SctCkhlfuKA^AKfDebj&FK>ec zj|aFLEqFmgCHOwRX|b0(I9l6(M%KvCYBWO6?H$6ij?H4VJ5_a1no;|?{!2F^ts@;v zOEiRNYn*(7=~j9fW$DpOV=QqP_`XV>r>iaWY}0R~X(NK+g-cu2*BX#RBoQ~snf+1<0%46)G{pJ^ovX22p>fwsCI_Mbr*w~D z%N*vPFmSpTLe)z>nykqq-sY2nPI0op)YHom{j6?p%q^$0fDH|E50U(qaz!ExeP3Hi zJDDhCtOpo!vZm`BT#p8>g{_mjnieMT!rJNa{AE=*oUE$N4yP;~Ie8{VP9u@Sxx%fh z=yyq%P}H(P*kyC@_cwO9gXpJHUMp#_;M7Pl+dC=Rz_hLD+l?Xk;Bf=HMpbj7d``rS zEk2=iAM%ExpQjDWfnRTGLPnuN$i&;JnX=9 zGB-SBq$1HTgMSRqWd!YKE^achv<(u~x(A$xEzJ~K8h2#~Ce2QKJ zowD01p8@+44DaNtXN}QFK^RvZPbZ089IV~CKm}LUPA6+HJ|H(MTyD~TBs4^7v7s$5 zXPLlN+kx{=Lgz;2xOuCRv?N*9z$1R9jq-)EGU?9QPS2`H1J9Cv#@`Y04YTA&bxU%2~~_zCDB4Pw>cZ&orPzsEf;0`0 z$-bYsr92Y-hi+0x!QELS13JqOBZTX*qb=n|4=tUpKVY06@m4i)7GcC>IAT~1 zyls?{Gq~jpV@?<;vySQMHai5*B>w<4ECGT3LeKR9_(z)16Oo;=s5*n}G>?+beGVUTG1WiTt$$853w#@Ha(@!B^*`1vk4`uK zPk`sQ^DB=B>NC*P{+cgiA5`cA0XGobSNRxK^!*jo66_4&mu$bIZ#&i3l@?5*5aVKAO zWSHVuTc7?IT~XkBn*)2aaq?Whqg$t|daUFV?~EV(rms66le;0i93w4{@q-#BobkzEcUiAS#!tinT zg-KcLLXpGz9o9yF-bbIvt_gZxRnte(;{Gr6`TfnW-5et*eHUG<_9b>;CYIq#H;_4L zR5hN;I;NPC+BQtzIOJ(qOF^1HgpNIa;>m21GXjwF7IhffaBL%M+2k29PC1F|T z-q*ojYqil@nJjktc2mbI{6{h|hU(yuJ8%^AFoIy)leQ$JyX=(WZTmF*l91u|BgYqa zYPwdq@0p%|)+!n9q+AYb>W`eS{{U#H=eqekpL0KW(|(M9W&Xh=kd%n5*|0;EWz!=) zL2t+Xdq3I=xN@wzTmJyMOJ;cYnEwFU3td0zNB223zo9?b{{XS;{^cpDBRM(qO96dZ z_*?8yMu{3?2_IxZ8URuVxJTJ004N{|B9I9oAhacvNC6rKQiDP?G6yICoZR+QT}{%K zPNsxMd$!Zn=@@I?-;JZu!*H)lfhfl41Do6Zjr3I&P@X$Zw>0E7NnGar#dHdKckGBY!$}oI1ysg%0V_j+cJ3Na z_K9AnDFgz6#!fvL4`Tf zx!B#g8y}&;`YU`6$jfpN-HQ3M$ezqPf^TGk{*L`F%Erp-yMy5eJ`r<0a z{5q;?RzoW?4jj>gxL0*sLi5-({zznbJc0T+#K}FaQ#tJiL^HX$>~tO1qW!K>MP2OU zs9>F;?G%rdx$NeAK>gu)o?L2jY)a6W~4SJ;660P{=JhyKP-{;Ssm_U6z%xjQ@)Mt{^|7~f9w<5J!e=`)!Q#lWA3zU5{a4v zd}y^|0=(E(9 zON}kA-#u-7?1GjS>yk&D28GEge@H%;inY-)mgh7ef)e#ET7qAeH%qdcaqfmq^#9eYvUk?l6DRw00E8)69~aov$XVo zS6TYD-|v<>#?(gK2^dC~#7}28k@+6V{n7@ElDv@Xg$J{LY*5s6#l|YGpPaGI5X>ZL zf%`p#gUd)b&igd4LVH{U`!niH6PD4rz=PZnK_7AjDAQDIyg|Y-Aj9_XC>5r*@@`%W# z9!bGV>4fMq4&eO4Se?z~fc%Q*mV+#OS+sT7rRIj4N|YcV@Skl%JBK&uon(=_hqr%K zl(0@cqiE)Yx@2(@Scyu|4`hBG$|$=dhG7|Md&5IdngEVQ>1s!YJEAdFNOC+Aii1k1X=?L_t?3-~p*#Hr0K?AZf;+r{0131p; zi3o{F*#Iv)Y>QCtqs>zk4JKI{(eqi`zgXL-bptC&9;jCO9U6^bWkss4rl)RZnXLoW zajvEIuNyV8nD6Lw_%3UC>${!6xCgnQ`Jd#qju}YJlXqNE($?G`hrU@e+dC_(XG+#oVe)|!Jls~k%p>MU~gB?so?}OUMVi ziluEe&g~``+2?b%zy}LoM{ViLIBV`zZJI&*gK(!y?H-QZABSVMv7~Gs{gZRAu?uhi z046}N`y;$uS|qG|ba8S^_bSTe(mgBFFcWaD6*T~TjOTxlS$n@;Uha8p)z6MI`;h!0 zWvXgjGl_97Cz4K9b&^l&f7o{w(k`odstPx`mU&S-Yie#_uMonTQ@kgr87dR&n1U6qmBSU%Y#sM52;k&S2JcN$RwRCbzvig(*PS28aPm)Ct%`-4NZd8qi%Z5*ub*_XQW9ElFlFM=sEyr@R zvWCVykUNc%oDzOYgb^M|2Xp9_PDiRp=Wv<<1aQ3v`Z`<&$7QL(Rf9p^8!&*u50a#FU z{bfV`7$3i;7LIPBx7*}&G&BM3Y166ODvHjpx_FwQ@ZxWfZcyadsJ6HCWbx^it?Y@7 zIo(}euNEln!jiUTO4bY(gO$(g`i|{zXNOTa(cCm+DvozK?RIxmlO@LcG#3u6veA;; zeXux=3!Adf)_Xv%_=PPr5RaBtaXHG#@w!R_+y<(B5~|5>>Z?sz{+(@R{I~$6+3tNgPU%fI?0iAEC3ATca^;h= zO{m;f^xeMYERxbz$CsSrDvrOQtD^4_3k$UcezhDQCSk@E|wUoX?pz7X~@M!Px4P(NK+s|K3dAjcj{LR*Kl zuXpV_EDs>DP33iXBeGRn9Y;?-hPWJMXDT`#W|HbUh~{T(6q6F*$wuR-V5%y?ikUO! zwbhn-+9&?n7h{Z#)?(!uZBz0vw8Z%o)uI*Wp8FmEKZV9=uZGJl2Y7W#Dumy zrvpGq3B@gzl0sb2lcWTrx>H-7u!{;4z(hz-m?Q%wgby^!n~vL|G{oePSqaFae69_R zt|X}xFtS&S{mS}|c&Tbw;~3cPG0Mj-ZM-FHhmeN{OWbCI#_;sF8Qni=>E}yS8CKF6 zo$zqBKd&7%F>DSEZv<(=>U13&ANer_WkYmK_(X(b7|71+!Pa`lO*DVS<8!1<&RrbF zr=e~1%#L{E8)4WdDcXn75vE93AC261-CuP@y|fgC&7Ukd81wloTo6lFE*ZW6R6(o0 z_#5+;h76L_Lwx4iL`qF?KV)zc%aNajV5?r(?v*&cXxE=C4tVQ*avh`ZY zMh2{f^pH27NM`!@pG^mb?2vy274#BAK-!mqrTixAOMDgvjkC(Vt!BQLiboIwa4or%o_VaoKZ8_%(_!x3WXYDg`WF@hcm?bA@4gZmNwVm9_Rc(u}^Iq)Dd=LnSF{(n2epnHF4a{dTS^03GxFg` zwp-(Z-yJMYERBurz*V&|2Fy#O%SQk&n1)$ul&6vR(b$`Wlu|7EeZSITad*X@6#k?* zjo;l+`g6l|OK@^VaHRDyz&=pdPDaY8@&*}>`xn>a7DXJ)>gq;3Hqtb<0TA2qD@ zjNt3Y4L=KG&*HLi5*l%W9KNO>Y4g+UOFygu$82s=Y5{A=7{{VpjvbsPrEudvB|;*@ zfb!Sw3YH{uVrv{u2Of$Z?Ry=|Nmf1|z%jlC$I$>poM8MoDY+Olu(yNCdF>b^{Zmid zPWyI1!*C5FjA1h->GB5I;|Yfki*uItK!#nuNl7FD`6pgJJZI{gk-Kbiriajgejs~! zBJN1oAUE5;bZ6}E-(;93HvTs$oP3j#^XQNij>Md2bYp^l1bRkzM0Xkc&@nP@)0D!I zCkM$gc*m*$X!pvX>I1U}eoD~bW1Ot-P@RE4C6xLq3+hHfr~1OSojd@y!TsOnu~i?| z6}GSs=uixP=vpP>FXRI4Qz0oMATBmXnc!Hckv>cAQoL$jT$~O3pY%&iFzl zgMf^0w+Ic+=*P)1i)jA<&1pTJ#$@YDJ6O<1ybP@4R=e40b9(a5V;}V2$f3R&SpMXC z(d}y^z!<;*a}JNe>b|QZgIquQOkGNI`!kWi%H_Qh0qPE?cXM%Y{{ZE&d6>FqenWH- zqG-Sf@T|-TAe4X-f;=NY2*NBS6c7S%h7z!g2mr8%gsdQd5JE7}I2cESXdQ%tG({l+ z3?PC4NgJSAl!5?8Fj1o@&;n6mEfGKoOwIjU{zX1QYIc`K@HrrWlPVlZ9x$potDN>P zar{$f3w>Ser>bFdoXSQ`lb_kj)A^N2ThTp5N0U)#s{nTqmk+^w)=f54+uDB7rS)wb z@uadZ?q-nNx|cl#Tn7_U%){j75Th12Wa)O??ZU!Xq`OC<9QfzVT4E0>%cej3qqcwV zG5-Lx6>c}-S@gI60Ccv`{pLURg1tKb02V*Fj<^2+pPE=nX!xD;O96dJ z_+#ue5|B(nLI@=w0E^^}1OSqnmO#dm;s66Alz}C}( z)&ZAe^7^1@Uj@DY0NWQwS!-WQQFAiP!-ooZ%z>xoHdZ|^?KhSif7Hho5 zYmL2u(aP_&Bs^|=mYfXv5#)!rUYY8;<5PI)>#w_8prCVV=|t{liqWXM;rl1yJ znr9cZ-#YW!FI7nus_RrLoEwbsUvF6;JOs7~poe{4o5+NC)9O_ThUU+2wuK=hAc)T|rOo*GGp5 z;_%FRNO1$o?F*J@253V^2u~4$nEpqC1ke)-Tb}O>K@# z#o_ezZ)hesq7Dr7CnG7*qKZo7&hOK`O=s#Vb1jzTOkA>iN z4#C^Z6bezUQPA*+gruB=hzKEsVCTV z?heKr2q1twzZF^S$JzD6uPxT7ZFMxzNk=5FaGxVqpwKaZe}t~4c}0MM?ssNK*`12B zr+N<4Xt;(7szyDJ(Ctk*k;D*wL@o*K&!?{P`&xa@8)amc@F~BfG8YznEpB%M8)15+ zgjnBXb~wtNk?LEP$UO4AoBA{D?M9`&jU2=MX0Ke3v)1m8uv;#zxZABXl$DJRXp#na zdl7;N8x&ARRGK+Q=}%#vyQVFddUlt#-!qvo1BOYAJLC&M{{T29J(To!LiN8wP)j|k z2iBySlGY1o3e75msd#)9P~ zZ$n>SNFAI-ERK!r9zpHoe85V%Dl)ZKL)}5_kJ;TV$Wc3}WVKh8hqf8&V>=VJ&I8NM zbbo3Pn0=M?3{G~ZGT!EwV;R5$E1q;Gu`1ebqk{F;b?mH`7YPJHM@nUQI~O^_fwtT5 zx{tKlT8iIi-9t}F43pGNM=Z7y@k8~`~$o8@wG-_bfYnl7bwJ}(lSXVVfT{*~0s z{a4e~8b+}^(dzGl)*OBcU+BASuC_C&sqQqD6q9SFA(O^fafv$=ztX**`mJO*+*Z7Q zss7}e;IIDxu-y9}nbUhP>F1J3_f0=Wxy}Adg?mD!rLHA7{Tua)l@mv1@NGe*Ymk8j7qK0R@@YaDDC+-P8f**T5 zFVmJgWrhi$vr$Dw46+$t99a!6z!||iYzH1n@v0>wn)U}V&3hfVb521Xg-Z&Izi|B# zq6pFfI6)ahlmL z77^hD2dV%85gAI#0Rj`JD2o9bgtRz7#+t((bU3#@MJ_p~X+N|sAKDp4f{9~MduN5iX&d#~I@~y9ZamdX zm=keCA|%I_War`8bIa4$`B}7e@BGNS1AWjS1yZ3Nbr)M$XkE&Z|g~#oI^Vwl7K3Mk?c<0A1q&OT2!UQJVTJ73?;*Gfj zoUB@|8LD<49HMa;QR=HAfuzdzv=1_~7jCw-&;yy8UF4VSIyDX|Ek#^VH!?k~Tz{xN ztOgf00@nF1b9wfIajw+Z-s~Ra;4LGDOouq5&=-ERwoqp>hd6czD+7P_vkNsgn1ELk ztFEoBIhJQ&{^&&ozF7`jFgudASR)^}&E;>SS$g)3ajqmss5i`+wF>_vd=iw;2PgI6+M(Tx(qt9pgrUF zTB&BPt*QHRIj!<)W5FDfN%cv#`(aDLrhigX(zLSMNYH2@SSA`AQLhcTSGUSW@Iw2x~`@ zUtx{V;TZWT0EeQcxNT5X);Co5A&LJ0lG_K|MEWUb{GQB0y#V*YaxaO6r zPjwd9GfdSlP73q#ea!2RL1ZM8vU33Zl5v8hp#*nCN0L_viU39tB@>S%hY+as(~JYsp=XE8RLS2m^)L$OUU)Y zKCrBs7D3_2<_C?#P8Ke;-W6OufRVqN)^&?~T53YxbpHS)ITDIPg8GbAT~pmIjG0c{;CBOQrZb0I&y zl+*G~+o{{~H57|ltL<%5@g&Y`e4Db<^jwBURRxx1w&EwVXvCk0A8Qcy&WfvZ8t#Cdc9D8i)8HN{MawIm3D$ z?^7nP07g9ARK|Nblwj1=MIV^Tthsg7?xpTN@YsRjtZp!~b$6SEOUahDcW2Gy1-w%+ zcFo(m8r2R(O~JqEVL+S*R+3}u(QnfG-`XCe96j(CmAbLX5h`0XH9gQ+qH88 zzrGRNY!>>fJ1K3oaU5(nT+Y0VA2PG@)>K0w@TQTTp~Njyz6fz>+t&1Dd|>!(5`S># zDu%MhT}_`Bovq2*t z@v*}kt9xA5{_s`JpQkF`*9RCMo;X;@)k?;?$$-I3 z@Uj@e&Uall<3nz{QpU(@V+Fir!BExoZA(U~c^M$|DgiSj*Ou-N*D75l&Z?Y^6Fd)^ zkyB%?r*ZKhc0B@sV0#G?G=e<#K}O2SbDp-EZyyqt4&y7FbwrJp;`asy9FTCgT_OJf z-wh|WRv)SvrsE*SJ|%ejA@))tN)5?RG6L@Fp|ps!HMm8BrnUxP>N}`1WITYBUGynV zhgi~2%}uAG@c<>j0-`cdV+|nWBV_V4;1h*1QhgBed>6mu_?8_}N;Mxm&8ppy~; zeL|T{T|7W&aZXQPEmj*a)$?5Nd0{SHp*glyy1su1F~DQb3Ne_TLb9n0Z~(Lf!>Jpj z5En#c72<{1#5FI8;myWW)?Bu(pzx7e^zS1cZ@+j=_1@7e?%YLG)7T?o-AR%3i8ucEOhO3Zo|3GI4cfoOP!L{Wd-QP4v@|MY39wTz~bjv0_0ii@9z9;w1hn&Q*2NNL!G zXblyW4&KF6yFiAl+u5d~3-E#|3-WPWSerusyY6~c44jIc%KK0Kf$)rww)B{D) z>~Egmdi3w;{n9lS+aoR&QDO68z@A2UUUq`lQGDwtsi`9`d!7j%L3?)5RVBBlX=$XT z(IAPVOL2}Dnd-BYaO{VZTwF@cMGRE&QxftAp6eZcmIqXycYa%*$7GtTgYFD;Qjr@6 zE%W)N>bhyKg|i8yZ^SgT9EUHOxlbHap|wZ*v#%XOTdwTX^t5p~vAvE3z#a;BslLPh zN*77dz6z0&bhW2tFRB~_ZzX<#=~eB*z7H$ZUAE2z?FHGo>rK}f zlIZq;01XH6S*W*Z+i|k`Saf{+yAt9sU7fg17|YmPJ9FlqjhSnQAofXshQ3JT2M-0H zj>S-hshN=Y=NJXsJ0E2Fr^{rFmOGaHk`we2Lm^?P9}YYzy+4KDP7)?*jFvcu0B{^P z1p@L$ncuT<9l~X!IKcX+YC&rY+1rtn)JGw>+@N+S{2-5QE3x5*|n#1eeM&h-%mjo;|BByW|P zzc}Q#k42pR)>c2c8A<;DtXr!d)Re@309aZ70IXZvBXdar9QbYgmmUwfo!XzaCA*|_ zuP%FwoO_gg{XG&}g28}69G^6xJNI3u3kPI3D0-B9paKbO-13PZZ!fB%M;nbf8?DE& z_LuuXv^BWSw{!i{u*_S(W1#;4=?2tCAiU&%bfo%!vo*y2qvT1ON~~pnw7hAb*y24Hn;-6*5Hb{M~qZM21)1|7j zn{R|qc;s+Y?Dj!rr>=soil(v|A(65*t|86HIma1YH%b^;`%rG^>yN5x;~l=_tM>_^ zEfx}j)ZhsOWfA}gAc6oiUD1RA-2f%rE(7{m&`UQ<+3Q#dikhj+lha#vKkEJ~zql$s zs<6@ZC5p1sa$$8XQ#81aT6qp0pny;`>DkM_Mk|ChUe4W186GtqQ^bwV_;%p_e{$&E zX6T1U-@W4kFL0bYJY&Nv%<}Z_UHcyD32UtJzN&@!VU{?|kj%{N9?`o`+(%-Y>d$Ju zVb+$H*(0?wnmUX&Uv-K4q#wh%I0&Z8*>2FE(SXW5rJoNv4J@Jf;~RfGFHQSE+o5`h z`CI4z0O^&^{{Tm?XLVgIM^SdXN8wy5*cixSC9Vy0)OV!>u5&7c`x)>{{Zg(w14=E&-%??wS;^j9uQBlWGXJPo%G!^ zcbYG^9URVS^$aTbs{5@YE2wH|W&W@B_RtB*Q<% z){+;qnl@e}=z7QW7qyC0bIeVmtaUX>#|$L3$L={^*osEEq0De|95UAfkVlw7rcTQ4 zsOjo1rmaNt1%5PKYjm-c(?!r#!hdaAocbz9=8i^7r#utvlX?2K+V z`_{Vqc&4%0t1flL&84M`%OPmV!1DD}Jss^Eruw?5(^)H>HBe!Y#Q2=o298NM$A2^u zu8WSY>M9PGvQKooOW{*R zKG`~Fsw*O*Y_m{TN_4UswuXnh$T$)+=y1AYU6$wYUNiRmdUd^T4M#}LM(E_HYwA77 zj}5Yi9mX~X8cxgAoe^6#e@9trs$O3_)NwuUJC{31$v&wSD5R|yaMeRLuL@Q_Ni8~D z4hZBQROYa}U(}a++aI?(m2JK=Jn&uK_CQ=fkn8&=9&2IM{W_lEtZI~<&D z4?7jxuNNv?O|qiCzGlNqPQxUUJAeWSacR*olmT24xAcs)GOk8ZSnFz_X~2}q7)bNe zgZZsrMSErGZl)?<)P0oOy6SkVO-tx*aWlj5n9XgGqc{#5ag(@RIE0-j1lo3Uzhm7A zSI~C5g%xFNHG-mXEN_fBU&b)B8eaf@_`7?I6(j<1b9SH z07*tsAOb{`i6Vf42p|A~K?DGjla11|l#+k|;S-Vf*(JyVy6teLwb0a7*G$TKT6P&E zk^D4&$7RH>KcqDbRjy?PhN7aCrvh0jL{4z?(i-f2>R0JYcbb={?N+#)TFTkoEV%9? z0|Vuk=jau;vVUhbI!=qX)ZDFfmDTmoHl|rBViIW&8EaY&!vK$5{wAIrJxA09w+FiOm$Ytzxb&A-+d7A!EwxUJJH>ny%yfbm zw2X`loel?&?{;2;x73QN8hVh&M%klmp^q4IbpUXEMsS#q6XMSZ88yoSviq9^XuyU7W%z)Fu}AHk>dIX+JGf3*> zyGM-Oat#`3p+7PcGS5{$b;w#gg7uZlqf3szW0K_g7=M`xuY{ZMTTtdorRD&&8zv zOE+KayQ%3iW2AF~rN*{Ea5=c#%F`N{`$sN;0-KC-HHh3-r zTQEWSgy$BcXi7@YNV}xkaZz@u5U?FuK~LPevc*an8yM=jBN!MNA9|+hD#>a?jL&oS zM=$Z-n8*#t62W~yuBb4e!|9I12k-11dR zB(G#~mlKkASWk&rcv`1sOr6iFHbD0rHKhF(q13iJcg0sy*&I6pn0Hj$>D{J=hfoI^ zh{B!C^j_k!j?YZ5)G{QgRoiq%;=hl5Qc zy>WoHwkri}R1?Ke*2W|`_>ZEV`UyS`5ma#VoMA$F8kbwD=qp7l%dQtd4{!(y1lF#R zq&&J}Jc%oHBxTvm%Rve}{BecSX1H|SIK(!>@0zTt>RViGJ{_Hy^#NR3WV`q|eabg! zBs8qeOk}*|VRh=RueR|eqAYpln2+3Ul4k`PBA zg{-Qw^tEe`hcSW2%{yf23JObrK*HU`Y%+XO$M$ZJwrFx9pBpuU+0Ey5Fas zjhY}X_RrCyB|ynI z9;zfwA^672qI9G-xh(Q~*UB7C&FeLMsfo3@#>ywxWV$DB9dlKu8KDj z7!x%1lILWFVfx0DY))KX}y4jgBdP1o-6>fy-%5z3tyb7x@eN~`vT8P!Nf1e~m(xkqHW zG7k2IWSh!7Tu5JsIRnpyF6EtPjI8dT{K_-$2p^coGUx6%vHPHsTlbl ze$fLsQJoC2#3N*2lic=RE?lk6^TE@O3C7uT(sf3nq2bNbhLQqvseUF&o)f(>OW|sJ zzSf)+$5Xg9uO4gfeKjqx+whMQU)wkbS-<{Tm<}+|v-kk|6@AuY7n#qI1L=iG&@|xi zd#|C7M};oLMexXT-7_n2T<=``lbTBdyn;iV90(&~6#$4yZ9`;e_#Sk;DHD)nE!%%I zi!pxZLw3DyRD^p%B=?3KUvEfxNYG!30K>!316hxo^f(Rf2K^i0g5hFx^0yIbz01*^uAOMC@1ZV&w z1ri7V6o(9@6fl4qb2Fb*%yf{)A$uW-uKp&l1NW(9A%p0~u=$oQQLqn1GSmYg3fgRor&F@TK#Qf|j~ z8QdmhZbEq>!66(U+uyRO`ieu;9Xk+p(ToD7m~3YNZ07#}XbrL7ZtI!!Pqsd#=&EMg zE;Nm*bZRIqQ7*Vj{I|Yw9-|)?XB^Rf9VbX02CIas+r|) zX&%__-ED6DRZl|OeH4TlBaP+nmmC6cHqUG>t@<_eMMqEC>aSNwT@_t(Ln32_3uEUe z=5hBfiDveB(w2F|_WKFTAB z&7|X2klX|5@hblSWFE3c6qbuF@r!B6h-zKlsLJVN4Kt-uqL1a6#_8k5fxg7wI0^Wr9Y=>;78jG=N8o=Dl|t zaQ6JdLdoFq{{XQl+ez)(mI$_ulhs5Apk#r1r>pD~Jx^e$wOx#&j%*nWQfNO3&pufT z%KpkukJ1Vc{raeXt0L{6q@}{H-|WUyMI+-i6>-5Um~eCu;zoT-LJ;T7l?mwUFSE{t zHPKUEZL+?h!&kmf6pxP|x(|}#pQJ1LVf|A>Q_@pWIr2f8u|(6LU>F%GN zVMiT7rKg4|3q-C51@0rB3G@rmKFiLpXMHv6Z-jrS7n=Qq0Zr|;7;8qE!K!8*$arJ_ z03C{LlNHNm#@o`~(EXM{`s$kD4c^xW?JI5UneGNL_KqAjz|X|p$2?_ZKSwD=N43#5 zG2%f`@DFT->oUej(#Nzpj~ZOl!3U66lzoCg%1>=l(?#|oZB%Xf06_ebV~n>ZdV8w6 zhJ&T-RToRNz8x$8X9F&AJT;@aD~un~I*;C6;q>KO=|TRp-Uh6EwBzwzXRms8$JDkX zP1MgZ+u?YezsK-{2m}I2+qvaqx?1b(-=nP(TJ5*%Yv6Q_d(85(S2&);fw)bR8m>`y z&_2{Ud#xt-YjpBKUxM#-sc2)|2PL>9JLq%hx2-t~#eGL`wL$Hh-}*XMGJ&!!ryA&2WCAdW1OX?yQRM^xl8A(55&$GSqeOrK-4WY_ zXtIHcJfMek5Fj9e9gs0N^g|g+M34a`DJ1{|5K2KpLI-352ZVr0Ny1-rl7I;%+$Rzo z5C@-sO6oZsMbp)xxr#X^g~!OaFps}WzU9_Eo>fO%(EUGA6N8xg2pf^+)&{tJ2q7cd zPfN$u-6>mYdz#6gi7DiF43)oRpF_Aljw^(FI`)lO?A`S}Gu4**r&B>Ii(0}wN^*Gs z9h}q8Ba%jPr>0$Qj~)rrds*x5n|puCYXdwi=?|!-lAOEb;kV$sO_!<}ThOre9aJ6+ zZliT%kv00XfYRat$D;H90Jd*ww4G^gq_$Y;YMDa>zV$q_vzzK zSm?SrZvMk*sOiRLskF-kW6i`ppnd31k;y7fj!n|NJ=A{JZdW_S#`Pr}Fg!J`AIjq9koBdjWoWEC1)M^xt*5MA~#p>&h!kMz+KKF>H4oga>*x>i%=?K)4k9=ERO zYhAj!hL)bGv(y-5WZH(>Nf;pPcJ*5N3$KsUbk|qMj}ncQZjFaL#vVY=&kL1)l&sH0 zTiyIOCXfDHi+|Fi$M$t(Z~bMWoPF>$KO|QPjr2EO+PcnyvaZt|TNy}0Wo+?);7BKJ zB`m| z_Vd&oKaCXi%#hQxa5$Ntb2S9h2NlWaO<5d?4 zLG%5iu(Y1py7uW~xZ65+rDANCyMP2ZuspCi+FBY8+KC6A0QE(SYq~nnav8{64u`Hf zuZ9>*EUX&J{0t#y}ELDKy-Q+b{j)YH@GE^JO2aC6$+ zjO>2UD6u%SX#v?9=MMI@({R&SA2gLsp6u4XDt5#i_}X4r3-E9TLGDj{EtSIgY`0ZG zO%;%pi_E= zQRgTDc}5a4hEM{KNzalnfDHnP0GJCwCp(~!3PA*(a+x3~h(?H@1fA1v8BUS1K?nh- z1lbAl5(rE~1*rwOI`Uy5D$nPi9m>pY@u5lIx+nA*E$4 zJ}GvMW2wm>C!g#6ll2`wechCmgZ{>F)Av70&0IQC{cg#tv{y#a`~C}@-}HvxiuECH znlX`r4(kbMVEQ+Xx@)v~1h9fZ1QGZmAmw`2y5B``{{WxSQq_OoLf4{?mR+8lP|*FogknQ0U^HWxb>N zmweR6m0fF)F^|uhc50!%`>tuhxwEDZ=|qR|pETCID37b`GE{d?_jgqsPsluxMCZx| zcTwFtM!=}0#PU*Bs~Sd6H^BSq3E?*B9DAnFR-%!cn_=Z_eU!=J^^GYf83cYy9o=gE zm}&n2Ep5U~_+{93Je1`7SV8?r^v!f~RJb-KInF(r6nHu!S3w%Fx$!L>Ah1 z$7-W%qyS~_7#U94@3r@So~W9o&1|5N@NI>~ZYs{nO5G4+=zCopZFS1LYaE80CnKMx ztxm-yFOMMo?K%8beyOF-FMFI%spUc)@S~U8D{4lzZnCNjB8Dj8Z*7$gUGCvp@+vAG z;CnRSC{1Y~rx_LxnfuiwfuJ@p?Dr?RM&=mW;0An^g*_DW3_}atPmor$-6?RW9~(q% zJ;_qq8FhI&`a+!d(iR!)ByqW2NKjL<%^e+V%)>?w3alTf=s&86N=K$tIZ#8R2~TRP zsmFr@ou2qtlsz9`COl9W51P80sv94}OAA@_PT6kN6}KqFvJ%tSY?rxgrwLV&$4lF2 z8?NP4(dbHSUHWd^OKD&eNIaXBSM4G_H>l1|9MzZ9$c{$p`6WjAX2!Ry>U=QT3V7ih z4245ie!10$c-4{sdoPqUQ-?DOrm2}>!qvXPaFAt`uiwll&*?k7n>Lv4w23m3 zInBUsRqsc*I@Mbl>`&yaE4m8q_LJa%Phy3Kr!F?gs##G1__x_^xiFJP3b5&s+n!Wr z&m?3yk1alhTwJX+jG5%q$$(E~Q!PA2T6a^g?8u~h$NUN)&V~H6!3b!3SSG$3OJ=2zUiF!rj90CHx&D}$6NgV>w zX|_Qt-$`839x;R2QC>O@qN1Wn=_g~u&T)`dVmY3}@IAxorc+)k;3Gvt!28gfLUAHi z^sUyHCD0NFaH*;zmY@3A+|oM`x)rmi>m-^ur8>io4pbj#wGem>XM)iqxF9Q1zR8qY zFb}Bl0BB|xN$9gxM`L`}o7B|gk*X%iv2h>6{{S2=TGy7Hl*$R_ic(^c@#@&=ILb8` zT;Wl4VHT6+8>@F#TxsuR*Epi7h-Hpo8gc3mny%|Rq*qG8JW+UCV1jZ=i%C5rDaoiG zwcjqu&!!brgv|0=$7Rot8r{OAzp+wnsw*ZLdQ%||Zwcw+&~t@lWVTh@s^O=CEhbk6 zwayqDuE#o!nWXNDmqnm~zErqm!#nJ@caLYav=K6CXKajjC9NX|$w-r+Pq_G$^B25h zY-B$^O9|>R^KY)p*(CWhHi`>{*FUSMWuH!RTGCX=?7c=RecCEXn<@Rw5V{w$n}u&f z%_}Qyvc5Ti1K}aVe%^d79scEeb!%^QwrL@S%>?+3JGUI4Eah-LOy?)ZRbG=OE{*w2!(xqLJH%8S)7_`N>YJAE!`Si$)=eHe+O0^8!3d}QMuiJEOK zU_JLu%uD4lgYX29NH`n?x?C98Q9Cbt-N{UM%2xpSlv;T6S|BubftaFykz4zG>=tT= z5)J|Uu({oWp zE5Y_!(@j|{ZaWujy^ri}`8CI-U;-Ds#L&_QrpwCpR~?$CzX)vE|RCd&lOXNY^>S1JdaSmdmdOkk&V|s z2UE1UM*je#t}M8khsHr>#BbR()o$6vHSGG_EwIfNtw&2z`j$f*%Z3RDh5AO7ML6y1 zm-`+jvR0YE`nAFLs)O4gehQi~sE`$}QJmi@eO=q+s~`hgo9MmB^mx+jXq~j+>MA_o zhGY%LWcfIG&t%@xHb4&HF(J6xJZgH4If>s3!0fDQS|XcE93*DgK8cGn80pM&5F(W6 z)!B~hQ?;37?gVLY*}(#6gHk>tp2w7i<)CbznT>lKM|8}2)YhIj1fZ`1k02Doun8Wj zL&wHIOh_~HKn=X`K;1O#Zk{{m9HyOsH$V)$dF+zp>xm=N%{SYXBN&r|+$KtRpSd*Q zKnq;2$E_D$wp5`Y~b9rhVqx^Cok>bi+OG4oCY znD!fNoNs?3y3xl$VEJVXVIQhLO_LJ~8F%<4V`M|uDDkpl3=B6TE1~-ic8+o!#w({!X&Hu{<= zs$6R-AF4M10P!8?^}p{ zx?QMcCxF@8pUqjvBP1D(>~KHA;8%c2eR-{ zZoHdI)xASYj{^5_Za4;F;rA7BN9{waDS!s%Cdd7BEkBS7UItRkk4aYzh zeI(ic0IQj&`KhPyJ)6S!UX^l2q1t0Bxs5N2q1z0B8e#>02)$4Fn|<-2!a3vWfB=d04W4P z5&%*OC?EwQ2_&P+09H~;8AX(+0E-CF#!~XhDl?JW_03sqnbB zuy7d#LhFBF{Znv)lDW5Ye7wB4RT<{e8qtjbh2Q6X3)6%oX+;}L)Anpi5Rw&7*XPxQ&zf|2V&7!w-r0<_bS_bS1S37#Y3MfzhvO@H0cCmZ6|*<*gCVOt=&^&p3``Q$xSXC z3r-xz4jj|ikMRqPLF@|SY^`~+^?g+(Gtb4MH%9V2j+bDkT-f6;rml`*?Ou-8YWBZ1 z9f}BGqNkFXqBwrbTo}zm=c_sOUeN;*zvfq*I+OH%u5H4er>5>y^0ka>rT6E!K1o3( z&e#wE+q(30CC_Mk+o8??mh*$;l0utJA;J+Qa)^W(iSB|lNB|_1q>_LM5;B4SNko)U zVE`orXdnVajRXKlWe!kCVPvA+AI%y7N>VQ9&;n6#QijNKfD(wMB&1LC7U`xjHOt-jjet8)e!AbDH9J;(WwZWvc z={dn2zG=*EfNj3cA=aMC?-ZR)FH(CuuM}0Y66tA+^aA7dw3G0blfIX2{GfDavks`Z z^{gF7?FOZiI+g8_kr`VfrE`A3_ zE*ub{$84g8wbiiD(nnZxnufyBA6K@~t?-ToW1kDHj{-}6^!vvl>Q%QZ~4n{_o4>U8+t12hNe&N2qw&u;3w z+6P9^^|g(*%apT28zyY*k{oJlfFro$4nKk`iXP><&Q9-D}BzHlD2luPWYQ3b3p)r3wt>J>eKa&$PYkih zFy@v^8+ZCN6`8no2es?lV6pzEp5Ia)-x9hA9SL?jx=iQ;xzmjP3!-~bqMD!B)#jS2 zq4jk!P{i41e=@zVW~Y5fB_X%UMjP0dv#S-~qv@}Aif7cB5H_LJ<&v!pEl0Od^`^0ubw1k8P0ulQZ9&cTtc2R~?mznblRE!8Zo_IX3p zS0@Iy+)YJGnme!^WDlE82dc03;?EP=XHpT`INkpM&y8a20$QKZmUh9C_R!R49!;6# z{{X5AVfQ6vRUfpUXxG+N-nxFrPbHF_?j9F~tdKV&I)j`*#&rG5u6sS}3SP45xb9S} z@MI1#R6(4Wq#TU*2Oxv$xX-f5{iH$B^iy=K7MklzA0UniiyHPgJeLAVY2@dVu?tD; zF3Z%GPNnK7@79?u)YZ)uEz;lEi388V!U-Ha?VR9xB&>2uje~uubmJ>8bk(&JQAuZ! z(Nr1O0DFVWF&>gjvPT#P8>^0%>nk5q(oa)nua0&>{cs?$(T_I=V1cpUg~fVDrtQ5$ z?dz-Iy;Cx(nwnafn+wU(=NW@RIOhS!@Kv`?jHQp;jJ+vqo}%4oxUr^a;E?3S;fb9X zCp&6p+0HiS2(~S#^rgD#MRJ78Z>*-Ph#e*HO4%9@mO(0Jq1>-Gw#4sc-q?D23q4&- zmaC~`PGrsmmbv;I*I)o}bhsQ2%cJ{Z>w3PEw9vz6jj~a6* zem8kaBUH90T=RE}^^9QgrOqj=0m(#VjuHDqkyD(&sRi7P#z5@y4~azIfO_I)a#!(&+ z0tiVVEbfa5fPxZ8P85^~K?wvWNJ(%&2*Nxi0EQ3)ctZ(%BJ6+=LKsRspgj`-I7CW5 z5?oLK$?T(6(?MGij;;u5BR{(|VdL&8^jxBcXFZqM-%4LPj;@Zf%?w~g8-wYd=!n&< zX8`Hto=eU5E}ZviF&##tTtE(HF~6Qyu&oToT{}O$Ng4U!@BaW2yuZ}!Fkb3o-{6{N zW92KtQO2cqTgfD1b7s0)U|Htr8sEU2tDxdXnoK9dsg2-} zL&3;9@|wXL2cA?wsp#9iI|HO_8}J09{{SUXQEINICtWPK^JvsQ@Vx`q7NJ8$KZfAw zgPz8RasU92&2ooI@h~lM1oZBSCbrq(#c|?kPmmOk~91=uph)>N0X;2@tS#Q>Iah_ zfAo%?#nF^BhK8d6Y^PGlMiERkuXW__m9K1#}WF^+K{kA!7r zDSCG2RzZ%IP!D$uE|*`_mhk+?4~p@@Ayrg$T}y!wv5X#pYrP{F##B^LbQM8pHIlY0 z`77&xMq1i&B)%~mjO9_(-sm$ENv@ng><`E?Ntw^ zf{(M)a6o$?h0&;b*V zWz!im2|*edy7kWg0G-jXsJc} zh|@NrL*Yj8kX1waPSsPNb*^A1jFls)99_~Br^p4)Up$OI3*0f}R&pu{)!EbN`hE0v ziRq)2vgbI#SUT$k!WTF?oy2F5GNV&pZWO~2)W`?TS<`im#yohAY=iqjLoHe}^3qKS zA@Mz=d4$`T;f#W}R6R`%bweYoq>Sr0$Qy+tsGnh?m5i&1$E<8XNpdFZvlVYRtAPIi zXeYg+GcJX|auxkGHHM}}zLv402Otunb=3fZ^4%A5qp*+MVLj#~}=G++)!93tjB5rfBasNt<-5bufl4Y-0!xl;;=(`7Grf>uft= zdwFC?eV^Xy;EJjmVCFb$Yf0R<bU_DL0eo(Y9iu+O2cYnU6P9A|FoqMxa3oi5`< z+Otq0!$BlC;~R~KWc1$J;h_PxsyQVCW2@m9UQF|4{%6_AiMXZTy@tk%|alxO+l|YB-w9 zc@xGopNnJaJydFsX%+Q$$f#zv#OT_=6P)QcbYSpCIl#tNJVk-H3Dz(TmbyJU(nZD( zvhrhDIgzUC4yU$VsA;3O+SyA{5o?;^0~#X7ksFnjxmQhdjf|>nL5=Lj<0s6au;@Q5@Qtwdee8{*V3dWF1^fs_Pf47Fr>UY)M0Va_;O>bAI2;0)orEFWgk z=)l#(;MM9J>dN(h=+)IUALR3`v$!&@ClmePSD7lQ^DrbXmFzAZT~gMG3w|Em_gp@q zg=EI3bmHxP=&WkxO!ZY|Jw0`BsE~%V3}d+p70MADE__>KfTo7Epk%E709Mr1K}7!m za$$SV0~ud89KX!uP~)?%QQEjIy`NUTuBztQ9g`M@m&n=Zof*!7{eym^pgJoWOzERBS#79Fvi}dbWaXxc1ZF*O0BqS-TA54 zf>{}y5kUZ&?glFodT$sqJu{7r*2L=d5@wMfVO8f z_$8;2-_-$RN{oo`-VflD9{4;EoO}1jVt7Owi9v4dJo+FI%$puIB_ZRwdO$RgIZU_^ zf`+m&pTRcq@ol*7oX+QC^i7^g+x$==2Z90FA=t({6z6P$Q*YpnvZQ2pj>FA16OQ{Q zvTWe`sR1N;r8I0tGEp7I5rS|w*#I{4u^}?!jE>3qw)uRM4#?P~0XX~{g_6I2TIH>i z0iJ6me*U?@Eb??|kM2fg-`5YC=(Id;x!L~!oR9AX(kS=I*e+c+`Hrn$`ALlKofu6q zJKc30p>3395k@%OP=jef41MW9eaVs=cN?yy`aUx~UsB=AXZS2BheMk4ySl09|>MK>T=TP4tM>j0~~`Z_g=!dy}st>w;MG6OUK<> z)@Fgx^5|S#GvCB|UvCg7uxN+K22l&Y^?dhF4#(tT^o8|YMotAjaBhZ2mN#n zIs1TD6u#PT@!(WYTc;iH*RY?&u3wKtJ8q@IFTm8AJ54vX;eqd#CjxuLI6s(Hbl%#m zPshAlu27#q#}D?G1n=i80vqiP zPiIORe;h9<^Ummq2OA~q#D42NiBEE&ss8|**HX$qu`5sWQozpOf;|fHcZAU3ak`gH zaIK^u(pObLf9&RSe#mil$Ax~O1onIMAN8=Usjk-QtQuQ|B*5|E%-4T3sgBV-5lIIlAc8#*Ir2zikVwfx zB>*U-p{W*70ictVV4wveKp!MX0MQ|o5CP=^Q6PX1J0i+1$g+SHlroZwC;@pzl$@cI z0C`FW)i;!2pao?Nq~#V+0`iR`C}jXEC}(7h?u->6Ehi{t7El4@5k!V}Kn93}XcT}T z5F4WiAOa&~SV}060!ZB!l%kCQAUAYjDFgrt2q1tEQ6&_V05Q5EjRXLm$Rj9cY3zCSVL{Lx=C~k$lS$dfLa9cfx!$R&UfFVA0k#S+5Z5sn>F8|=x$d!iq_m~qVd@z5&+miKMos>&M;2>@wX~( znnsE$t&DUQWBn#?k?-+KSV;B3E795WURw4`4Sg5s2>MIJ=Az=qRmC*N{*ldz{{R=) z0IiR=uBg3q=UH^?EjK!vN@|EljTCSAABj%n9kYXsr5DE~N;c^o(Hf!a%biV=q_0;R z2FB`|C?7OpKubw(`;E3#KF0dOx2<|kORdHVXet?2`fW7f!K5{ec6TR#jH)xIR&Nt? zNZ8o-J)5i9_q0Jz)jDik99&685-_hE!Ndt1=MeGU@jEF&&ZBIHDRRwz*tNqTrR5e-15~t>^pSXUkVOP!muZQC zgC~=L-Ddjdp{(6$4J>!2RDVTt-3y?TL1}g~*n{>*A!>=?4(JOgI>y2}kEO0wV^C?u zWI{h1M!i1}ImSkK^HqHX(qH7yM#W*QnmXv2;<1h!kDy@;V4!YRjuGtZ;r$}|)OK`r1b_Kx%08n0kNQqnAIFJEKDmlk zuHb24_m3aIi^l^;~DvIuuv)1(mE%K&?kGoQUA*j~i=7F3H1A;d^j_FYM zE3=aOc7MC|=d=2s;HmtjjQ;>N8}y8)scrY8s$i)1U)#PmR30ICd}KWQx%w`f*Ifri z)%6ytimIxbdF`?pA#^|%l1op-2;c0E;XUmWq-lD~r)IWQKf#kwmY#4k;Yc%sj^N~i zJ$(?+<0Po%onz3x)9*H;YpuOn?-YVTD2xWjAaim7)MIJR=f8Dj?UJ6do7h#hn&!kN`04Bw*C@rNH@Et0CX5{|I}+iE9gc8!&ns>1qRmr3 zvZ-y>=xXbxfYY_O4whGj5DShnNyg-&ioQ{uy!4fxZ($Kj6~2{~P}<|IWkX^DPZLOc ziFYSCaNo>%1#Qq4nm(=eA8Dh#M(T)L9GC&+q&hhyYYsu|Fsz#ko$M{_m5yuM)6NcS zh6pXEBLsQmCVxk_`2NeS(UG$ynlt|Zd&Zm{AoGnofV&6)Rvg*^FtExu-0Qat5 zo@c?-_US?2!I{77MgH~YA8GXEoo{<faLnd7Y>*aF9QS7cRsKlCr>fo#T*X%;tPjVZ6O)%waM8S z{EWbj7TX9zi?Dnaa18CTcB|p33Q->%WVn;iDP)t&Q@{S6gv& zqL1Jsl9J2)zTcMHX#n*D0Y<9on%RfIL_^VYPFsy*87F9)Nz!3}I;v)~%wPoqye@<%h&Z~VR39aV;l@C zj-MVUPt4QUm4mKt?GAu;L+uM3Q@bY1cdM!Xx_JosrgdlHamh?T&`2DWJ}OC{vmLuQYyN($6r5F)XPsy=dr+G z_R5IPm$}FRbZw9O#U0by71pE?10#Stza?dBdWP>ivn6!6@@c}~V||$JX>e;F(zCPr z+L#&hDjfC-W`ZQSL7$jdYP!0q5A7$F`Ti#otEMF2l26TT9B9vcpOa}>VWZBU)==Zm zD!P7-ZCi9x++mRV6@|Dx+DOmIO6W?-S$zx-ackN}30ub+?8;J?$!S&4Hwep{9FfV6 zz^ZEAlDfb~Y1~JcR((ZuuB5z9AgGa`9foogN`AS!Q@Cb9ARBHGB!sNg-l-=403)Gf zj3Mo4$Xv>%2ju0YZC&jJ^TH#mreoXWggrxJs>^C9^kC~BOz=$YhZV6K&vlm13v2E<@}Y{=<0~% zW8jgJ072O0Bd_c=m6TNGo+9@%83W{;9X>^o@xjWN;?s~wDpVD94seW0?I&y!j-u6F zPmv`wqx{s(GhE7s>uCp9aJF>J(V&9H9?@QqVNLN<#(fdJ&2HHN zW5KeDT@jl@5IHT$@09CfXxIc#uBVNsRELlIUWagw3RNd+gC`&ny8%^BRi^bNM7S*&rQKa zT}@PLCU=a$G&fjo-h1+(TO)#djYLwsnA#44JDjTecSg+W#rY<*s&i+dWt=*v&ZHI+i5#B8qlH3#OW^!W~g zX1HWyg&OwIDh>eel>Y!uKTG5XxLHG^tr)6_+bzmrjWNb>cI*`;!N#gm_H7$BXbOGb z;;yf7%UC2KN2iQ3jF)!{Xz|I;%BBpGbHY#rWfVjYktz9OEMO;sLfMGXblZe=3?z-P zR?=BB3vxC90u~O&Gg95w>ZU*FF`d398+fP1I~`&GvHk*GG{18h64#944k_sGK~v3PahY&Ih_~Vp`mh*)a}SC1m1TY^Ouq zb-?q(U*+;Bqz_}=9YE6~4wny9#1V+_nZg2OQL**d6H%Wi-V}gB9KFAY{ zJ-$hK#DsQDOk7yPah9j!{ith)+Q;628h@f@P807Ok;-At895suV?=F`nge{NKF`-| zB)n`;15NMQCP9!pCpO(S{{SF>BfJyBYq9K}c*kVX*eC%fbDqe+^(i3sDQr4M3PVG3 z>^I#qTAi09B;XT_q%pY%z~QpTUe0EE*-5hw7Bcj6GyZEly%&q`C>gz5KfFIR(dim- zk1dxvrx~t@e{H{-=+xcMs^-&qI(1#dmdp+k_a_OqrTSxa)N+PCXu$G7BMOlrfxgK@ z1pqcm0Wb&dmDfK!07+$=^x3W-y&dN0 zM0WY!sagQH7J>1>t3G*im#%Mfh^>_++<0#Mmyvpfq(N(O*gBcG$JhK< zE|%?`8lSYM@<8sAjIQH^G5I6hwI@7b8;0v*vF5%$OAhi~yf01n{ti0y=6W6>qtpabWW2^mBWngHi? z1%p=T7jB5}x(?iIf!F~aNFBxkFGL)3#|lEiIL7>Nk)ed=0Hqz#_S-l>i4?WU$q^fk)U=9B+*A8h>gaKsjB|n7NEmbX z0IjLLv~?7C_li4Y!@t1xlm4>i2km2&9mX=JVtxwV&dW>f!a;#mVPW$zRO9e1R z?HK<6ym62Hpcj?9?1+4@r`kjJ4`9+>t#x1;Tcr%zxY0XKe-&WUsAaAW`5dnnxC6)@ zyCY51s)}kTym|9MfN0Dw0ett`# z)zimO1dz=eC5A?pJ~xcD%_9U6Z(tC*>m>Fo5J+eS#sEw~_$Z>5em`FXwT2jACp{DWEQ~vAz#Lbl0?M3*D-+18JsilMIF4F(wTTcNoceF2;5RS^IeCYTmBt+F5N8wp*3HM?H~e z23Xt%pgnTdkUo9X?Q~YJYOc!qT1Y6|+3RX4WR6!w8*`&1;m&YqZo?-(GPZxC1aiUAHyUZ;k|~*T zdy6D#X#m9^WAZ5S4OCh?Be-5@_SzXAw;r5*P|Z1QA$CUEM9v5KuT0}*!#_!`mYTZH zL)0`(bEdYF9Y&G3iN_(|Cc8iBCi*8IXJ~AZx~fPrd}cMTaME~ja2xP`$=m!wuBz#~ zEnVI#rA4xl_b8m#va7=aP+RtXA->Ba?DyJ*kErZ0OL4kU&|M>7ZB#W=HY~gi-ooMm zY3FV;gX@Z__LX(Ldt+M&JPD=4mZ+_T4l&1;NWxDFw$ zBYm>cMpo9&IBy z^;kMzZv8%bd6yd6YPf1&Q0N5|PHeJat!XdM!UKLR4DLuiszWjlPnye;zm+?=ZGN)@dYw91b#0{{SGBz6nuE+dAh#_06BHX(gJ^ zEP?QlCa0O9vPYf?0FXh!+!C}kwbaxw8LKKFridIFCXg|?`ICjfIs%3+m;EBH_M3R{ zsAY;>F$1t;nAuw2ro-sAUevvuT{`cntuy|xf;%NBYbK}E;V$pYk8i?TsJ8%T$S24& ztm%|>^tI9WlvOZP#m2ZKY>m&%6(p7BPiXcC{gPkocV3gPs)h4C;!0Vi4%F7^=Ky7{ z1cC_d&zEiXmDP>u9*(TL#>UAwEsCBu@aY}KeET7jW(6z3TD4zDT z@JIxJRy)}@UB9m_6?Kx(wu$u92uoWou4+?+Duk=bp`f?_b!>9HyL!t z6C`A3BgA7{hhTHK!5&RfPv2*? zntJ-#sorCm^vrICxN^`-fh2HNucA8I&DK~N3;=WHgB6nP zkBqIdbVNHMKVp)8&d5!Th~tD@tW5*XT8=Zg&zeDZ!i}7vA&lMdZSw)>e-No{1UBnN zG zISIxJm3EA};V59w#n~M_s;W{nMDz4gnZF4QwSlehXXsBJci1uTDfE-zDGFvoT0+S z8|B%ylDfq}KV=w|-ikZ=yABPdrehoCRw7rI@17CUIO|VoNhjISde*+O9-3uEB(90> z10}1DR@PNiIo|V8ET=!b;zI0QO2*C60QoU-nb|yrNkM64Ded&sM{7C5hCywEZXw6j_PBMNB7h1+y zc#wB33m-PlImume$!FQ<8_cwk)SDhz8Q%iIP zXr9noM&VR-bPpGKiD}&Dg_&MRRJY58FZFdV$EjBIy=`)jXSh6f%F34S{wM%)ibFTh z^@}QoDyd_3dD$-E6|S<}YRx!|;~<5FhqtQKGcW0fjGTZ}t_0TxTCVLhZgU|xVB;#X zdyPZS#Vfv9PsGUIuf@)LD$14u@*~L^PN~+3su(TZ!vv0hW^ZoU6Tged0K+oK_)=z6U2hc-ryHrT(c90B=khR$L!lkLn z2z|D{22#MAw9jzXQo~`rH01&-7l^Yb}=m zC~ps%DGm!Idx!)4S4inkY%HXO@?9rnvXV$~b_dBy)MK^1Qwb?oTpLUGvx{5p&#&qk zjl#W*B-B(pX8!FU~K$vY0poq+dFH{m%dWr{3Tbz88^h1`NsSVp>%&A=fY zbG|2P8wAy%!Ie6@tTCO&YpSW^qL!#^?NX9fa;jo!+Z#SbXgc}r6;EqUNh>j_z6)GN z_+2qvS<3qvVQ4MSWhz;GK^sW!p<^u$^-|>c16&ofD=n;Kiq`pTx-ny4Zf+hmY2kBg zId{CV!via4Br^&Y$s6!iGVIzt6}2A|UK~Clm1WQo&mT}xNf9C1#|oHA@?2a!3fy}u zr*&^s(nS*soDOgY9oH_k)}DW}3ce3X!Q)9y7{M+r8CSN7V#a>dd}S3ZO{I)JW^f15 zPol)q2LM_f#(bCNzMrPc9IAFE1z{q z#1c1?q>xwb8U)m7o({8ZFVwQrnb)LC^d_orxe70U*>WJGN4VMMPnnpW+EPswy zqq?T2O_Jj9;iN+HPJIgVW&T!64Y9GEL9~(JpEA%$T>5SsH_gmSTnwP&_od?;gddGQ zi?HKpY#j2B82O__;kp1(Ys+SV$xgapZ_+)eigcfD}1I?B@t}KqOFS zbdXT&jAx7>kn_IjB`X*Ry*nlV&m|3t01=&$V;S8dfO+3=hi*{s${msbv8RN6iY(yg z2+n&T06UG5_C=o9Lw_^?58P5t5|Vy-KmdLSe9;ZEhWq&-05Q5CbFoLA_Td&jfdc{r zZRmz^8j+E|WMpoDu_S?jLLvd=3?-Zsx=HfvkkGi?=$s60a~;lF za8->jP+n;9?zel4IN&m+;C^bb>=BG}&QhW7W~!UoFIH1y!@bow4$=m{{h(F7C$;{o ziJ(a>6#oGCwBR50NL={(1T(ow#SKZFW|!M-(T)CHSPiaQqyuX#J=3g-!svm`Uw45;q@QVR?r; zY=LnhPqc^bGuD*dU(;1i4TApwY;%tdH4SM$Lau4&hNXe@v&B0Fq)sIS1}Z)O?qZX>YfBM}J1T+#$yrDqh@vD&m*g4^~qj*scNzR09{Ve{?3(gPwl?&#*ccm+oe8n zm$UOFFK$ELj`kderN$`zxWeQ8Ho+rDa}7v$;95U5Z%^&3r(cg6hU*WnhQ|-V%63V3 z9^`cl`lAJ5X}ziReBrseIud(JPayo7Lbj#rKANlkqW=JGK98I*{m#Nv$7YliN-Zs2 zJzGPmDyipb?-Y%H<$|8aQQ9&gSGyrFW0xWQVCyXEiAtf3G00NRxq9_0)_dxQ3 zKoST5f&d7L2p|F|kSLG=qbWH?fB`_XAX1V60D2;GM#;pIfEzLG-7Gh`{863|B?Svn z>Y$Ez-xSPjkv*laV}?V4*n$rsKa_`Vfmy?Pr`QdqzOqV-6~bF+dC8}IUMy`t**OFc zLzSuaW$d!s(DJ^pO#1t*jnHZyz}Cjo$YXcLdy;ta-E@H5gf#p~QY(C#qn3Mg=xW}s zv{6*qw7TbSdz{Fe;NKOF#y}@+K(rB`Uqy=QI?rkyU(yxUdj6YbG;D}TQ&HhLvQ+3H z+F0D2xx@qTjr{`jF=!`*UKj_B(9#7u;N||t=_+Zxls1aGmZFxXpWb4UDdQ|~$#b|q zj|(&UE4YgnP{ct6l~B7MHaLGJ-ZZ9}OAJnt(L);_AsXD)09}qV=gIrgLvpmv2QV>y zm403%BmV&OzucMj&}wg<)w+A8YU}5uv{Xk9Lmi|SJ?;hGMcW2~S8Jc8ER%H34 zKW*O6tQ`|&wM%L>zWY;9=DXge4<(ImNdPnsNc-0F^oL}XUdm`HBi(|oo>ybY#_^xL zg&ybZ9xB^biF%Hifaci3cU7b#AvzCp?!32ZA%Dw#`dT#5}RUJ!7 zb)u=K255X4Wr(q}2Ka+hbI&91M>c|~Fy-o>X59_dw^z}!vDaCPqpNi@9Wz66sp@$f2_h{H;jaUgi5q-D&Huja(6#ZEQu*p26 z!B`^k3tOqq$nT}$z~p%Z=SE-P>Mznm^|dT>M@v@}f)5qCT=uq@v^yTUGMACnCVEAP z9uYHeltQxr4mLzWP~jy28Q~YIBxeW!6i6Z{0FshQ2oMkmc0+`~2(XNzKm<@gp@aaE z5gt;zB$NP1k0{W>07*oYQcnmF4?c)@LkK1?VG#(?;Q%8DidjiJpa@lNEUvVWas4_m zx2s+k5B(rv5qm(bAY)Wi&L93rH~#<%?iW9Y++_X=$WQv%{%eeWkgdm9>&Eg?)4%@! zs6Udpb`t31sj@vQ4v4gypGr_ZX+&{&LwxqavlV?k z(?#Ue_>#DMSUDwPx;Cm=IwFOU%KrciMA3};DqFY$P+iAzyja5I(d#>LR%!W9LZGb_=9@8ttyVZ;yRGAjD2CZ_2T|QCE|lK!TPbOk zpn&WSeHU2j;hRMyz4VR#i-yqW^@TnM{Ud)cySGwP%~8|TVi?@_X&V5u%@n90{-Xop zYH80X*z&EY`d;Tb+6@4nURBLMNBDR(l}wCx0Y>C(%!VJy!ZxwaIBQAzE`vwY_D9HA zCh^|Ek}{dAyjiVsIw&bMy{89d4nUuSAx&tks&En0yo210mWG3)D&K=En;7}-nyBk( zfFha*;~lc9ChCioTaIc7Zy0XLQ)9MtxoN1QvkEHd*jfe->ooJzbT0jzEtTWbD;R2J zd$S|lWE-&nkqQh2Lynkv#6`8s$&LF#up5Rg`SiGHr+0ZB4#)o zVZ-xM;!;cCxb~MU+G$6Kbe!jP&g5@#%IUt);?-}YlNmmrCC(;moN(6X=&mG1a6xw4 zsFKKXdwMDI(^Ma`3(v`_DYn;0cBYs86{Qyg`{Cfxigx@eroolS80g{>I3XGG}= zspaXJ%cXIVnZYM3D&DNRQoN58JOjgm(ex96vsT1U3juMD_VSM>6rVzh<(jH~zL}(W z)UmtN4b->weX6tmc}6mOu5?fYsBuF`=q3F#Tl>BdDCOx(bkO*))rPe0GFApB9N=YZ ztK41EEg;~Ajubuz(6@Ap#_&|e@#s{~)pZosd0>!lgU5A%r?}O^a~$#m{pDj1Q`}<# zu9UsLsG+-|`xRX!vDFdWAv)dmU8gwoRdeY2KMxEYY-l&Ie5&%)v}SMN>_~SI1hK;q|`vb%(UdFMi&QgS43Koo8WpW=VP-JuW24dE^4~ky)jKRj~#=G zT`e=(M1*C%)RqX{C@mNvM5Pq&fDv0G(9MLBOI;7W;wDZ`%mYR0CykPhFE)5^6ZkmPt#*Y)LXD*80 z8I_E4unERg*(_~w0fg_$g*5Gr`cC94n;prsI70oLIN5snWtA<_F?47yb2Ww8DkZK* zKBRI1Ru?)kq?ZCas_GdV1iu*@d6lFNqczpAxZkAKax{WI<(`?_=x+gB^<7z(@aH#; zASx{7#QCnsE-dGlY*7BJeAJwWMULSy8N&!Y(~##wy-FC1%OiYgqHA_J3!*v@EW~Nt zG^`&?u=tve+YVPvWF99^Ipl$X{`HKzH;+aIr(0zlZnl2NZjxF$o;l->UPgjE!C6+p z_P`r&mA>{fMIC=th@FBM%||~xE+0~9X=i^0L0pnO7jM2k;t23GV{TTi%OG$e&C>D0 zqNJsQiRVaY1zuBBLcq|`l6KjAH>0V4HypFbsy-j&>dwBJMEj$((8@=a7dGmr>12eS zSXV^304=Ze$L6_*SG>8iG-qZN`u2;M+4I`BO&prF&zDJYCmdxk{o34iIZnI~{{V}8 zbL5$E-FoQrn;ocgUgGBL2vHu)f(K!hDd0LRHyQ4uJm`3E;BpWMO&}73{7u{iDz9d> z{fOm8fCjz5aDOEtQ>mH`N16o4Zg1^dtGZDepF}5iV-5ZG?UbnUSkiVl!UlvKdZuO> z$mKof*)t&^@9Y-hKc0AOGOK8d#gPX{UI0Cy=57~u9m z5uK7xnqoqp1367dH_DNT8B{#%P&TlzVfou{{XgW{{Zg-=v2RDbNeXG>Yx7cbShDXE`2vl z>D7J9_9ZZ5l(vDCmXnW?Slflva|;ItvOEl=kGU9462ly$c5%N54T3&Z2?#uZJ1&*% zR-u&Fdx4Thv9G590_xs~I2uax_3f-_qGVXoDIx9O!){kny!$nZ+iI<;qrBbP$m4Td z$I2WrgWF}zYiMSsV{}|0oUjJsXfc2`17fkj-@&$2tFogR1I+^6w!$|Wmb>DLl0oR_ zH~A+9xBme5p8jo^5%}SBZu}T+BZgy?G>oLwK3L8hK~Q}|n17m&4O8CyOG8^2?nHU~ zlis|G+kOcpp&D$@O_Cim*gv-$oBWXqnr9LlR{VQlt65ijmiUr2?@r?@vliyZkS6Tf6#l#asP0yfGq z5isZk5mhz>1;m{EDvx?1pzrhMB0O_JP%OgAw1WTs)?D zm;Ins%_p`Ft$_a4dODGgC8cQp0A~xH9rBACa;IweD|<&+ruN%5cdkFo zm1|Ay#s>f@x_(BVII6?H0?@dSIOlX*gV`sJA?`EKw7%K;ZcGY_YorIy!efWv?EVVc zo7#s*&IkOe_=)W;JcA!l(ifQt=X67mHcQ(>_ZjOdZnEi`kUTD+wr{|FLs)+2VO!Ex zQq~O7)zj1u`zc!g0LZT!U<5YoFnrSXza#fgY8E}bw1k|MBodqQO@UOGBxuA(^Lx6oKIV#X5C?yGlSTq6IcwakxZYLI8B6 z=dwnz@aBqKlvlmSV~Fi-*KbTWwqfIOj; zM5N^aFDQxK5hxS@tf8NXB15_c89@<20u+ewfGChK9yUZk&glCg-2xIo$|BLFETcfi zOkj=?hIuD(x1s}t46C@=t=BTca<@@dnEuDS)3RMZEkNNi{+_i-bf>vG-AXIz+8Gr? zV-0&60RfizBiF)dUO&e%L@EzbGI8Q66_gIoSe$ z5>W1eMMJW#rF8g`b{WZiutv!M|NzH zJMNLCa$nLJo+ZZ3K9CHS^S8=l{{Y%m54dmbIMC;Wc>H^!Cw@`4=Cm_AXG6G6?Bd@L z8?;qNpYw_SYmxOMPwOduYpr`UCH)CbGCmr*hH>V`pXRwwRE%7nwwKyxAGoF`Y;uq| zN+V>IgEa_ljCll*l+*X}nJiv1*AMKU$z=}CTGnphJk=v@q{wwU11pW-~4yFESZ zweG0sYCL7f!yl5BTVuFaKl(i^hu0ViSFn1DI!=VAbg_7nv=O-SCksm6uc?y#Pe&XK zjtL1IZoFqIn@IKf*qs?jIs)M%1FEEo5#&zlY+WB_rU2Y4+TuGj;W^fIRU+i(8RQX> zogm;W!F!H=BcD=*IX@w=*uegmwHCe#Um8Kd!kIr@z3lMmX_~+|E-L~Yae@<(oQ;yN zk*K3jCsbUj3C#LI?7@XwQCT$a{j9P)pEoE_#^-UlPsbU~2su*HG>SES65;Q!2a?5~ z>S3bqI0KWMEeA$K_S{39*J&;13BI7|>dNc9l0z8Ke|YSs!>KbG&>TDb&|uS$)w8GR z4Gh&+RLIA06qZ|heu=-em`dTu%4$Mw82Dpz@Bk#M2rV^}k>OLweQ|}jvbxnYa=wn8 zq{cJ2Sv%KURl_up(nSEYfaM>RKxmZYX&<9VRMS! zth`je5>_}5CTy#ut(tceG_pTG#Nt+-%koFK&dYPT^y^>|RMf{Whuf8xs_Lr+JF!Ve zt=@WYx!HNa)5=R4UCK^0H5)cny=>q53K-fu5~!;B>byAkP{QA$sF9~m<7HP^F`cpK zt_)IyQYPFzpVzJuK+n#|JbK zgqHQ4SlUSAc=;)Cb(AHgv(mJ*@-ecT8?%}`7CR0EA5`vvfI{fstU7wM;#xq*eaSLe zY?Y01rGAn;lWxV=XFiUD-X)L3kVhMc4tJ3AQ@VoFLvNyM>1Qu_+XcYoHPkf1l6OH2 zx|zo+oKed5mjGM`bdr;5PE?nJo>gyx->2$mn8r4-qX(0PyQhV;u8w;}Q)1T5M^6~? zT${ozKN8g2DQcvkYvFUuLwzH%<<@D_`nOg80Aaz`6ncB0x=zDeV|~W?9W_;4!y(lT z1V-F&0o&@hr&M%(6~n1+uCRPGaZRC(Z=N?J(>ce#7Iz5&^M&ZGEy+;Yi$xBb`T+8T!zxI2fm^99|{mfKi7CK3sZg3vQvoVQ*g9L9E1}X(oQ+@QR-6E z#&MPx$C2Uo>8TmZ{d|BtwYlE_DqB<&)zs>gkki>~>uDHu7qoA>s__IQkTH%hy*NvQ zO1@c#>iF9g;mu&c3?EfV*;!xe9aVIeM|_9LR~?sZKGbu|u~D7MkqfkfG0Kk9hW%8g zwV~|CbTJxko&-%8&Nkq3x@0ju)&K-S`@Wq6jRfO9i=0?an#gg+S5c$P^k)Z4Lol&s zu`u$M$1IJ{nJa7T9(bSDRRli;tN~)~&|*moLEMq}E3aY}`l_zEd~~gGA-bK9Ewz_v{loy)l^lGKJDSkMmuCJV|*vMo)~W3z*rYsW}>McGjT6JMXa+(`4}0H zG0ON)M%2eko#`BJbM3BecsHLa%R9#Q_W`y@T+galf23oP8QZx21xYLBz( zIQ3GW@V9-!hfwpRIipq(GF1yac=R_OBXZ_?j_vuR%36HEJ7dVF8xe((PXn^Y{9ySM zbqs5OnZLcr@+c;VGq(=M7*0d|P|7KOCj4CC2muh5l5>opVq7prF@+vZGNd?-UGkcc z?tc`l5g42`AcKvQ#0@`G(e?B0nL4*3N@ z!~vcT>0@KRDJ=oc-{JB`L$i=Rs1VGD<2}MoHu6q55{Ne;A(83{@C#NR?e^b}%W+q< zF7v{}T}B+`j&6-HeaM4i8NEUM;(rCusmH*%{{T*m-yr$B@++ZJkAY#P`&quL?_aSX z4ibmYDJvj~;4-zy?u~mV|ijj197Zgg_csaQz?SKdSFCXaxAN zf%FGu#9T9l-aki%Io5lz?c=lkm4>7A*|rX5X!`TS9VK>fX>PdPpG>bfS4QX6PS&5Y z;y3QSP3;Y*{E@i^x0qk~FFE-1@_3QS8w{I%(2NmqafkObXfu4X*pcr zYG0#|Afic<7fVMl{EpSbvxLs44juO-X>lB)Amfsi4#$}^v7MZA^GTV;Q>sQa#QC%o z-jjrq*X`Xp6^hXic1<)V1H552V5cw7f*MEgl0PDs@n@`8Fo1J&-5X!X)R(}su*s#X z1N$Mb{G5}EXz@)vf;k;fH=irp-hx z8FQy#{@gDg$s5pYWUTpwdEG-bRNwv=2*>d|Pv)M9&6ge(L=tDPcu#T-jBt(7cJxd4 zdV(?;sCkXj9USc+6mB0xS{BwHWS_iwB$DyVNE{+BIN=s5W1W(FZW0W>VEUkB$_6N$ z?l?vAL>@7OT7mDn0fu=f#|0(M#|Ly8?Y&bFqBGeCw+94nHbXh`LpccmpPDY|U9g5Q zfD_K>VIDTeCSv6AOM{X*{Y=WgVmIu)nBU}{{VbM-|d2}>3y#CY$NuybhRV? z)|G?(kk!w#+>}JA+P(+5qpebVZo4xAuG4Llcks*OC+{v+wBFol$sYM(k%POTst)`M zN9MSAJMY{fzWGbri2cTT8jssIP0Z|1O?0O|Zi$Wq?tXs-aY^kvq$lR_;GZdAk-v_d zFEHf{;DLmmHQ;L}$?JMWDsTro8DTg_Y;op++ldwkp zl39T4fr2>gg+ABhe&Ovh91h@wMZ|VqKBm9kX#fW3nt?2!-bi~d5v^Pi}oM6D$ z54<@oui!T?lcr~Md04tHX?-JAj9wcFJ*I|6pTAB&6?sq8)*6BZJ@VHfJONi8e(a@8 zt1eL{;F>ytnt5ZCdB*VX$v8vX_L@QYBmtw!PET-9)_@cdq7FxtfIJ|5c}KAvp`DNc z1U%5n89)IJ=w&A;0Njiul8fqq7Ks*6&d31K6S^#+lmIwMDDsGu06`viMVC0TMEa01ui7B$NO$i601%07QofvT}e7 zpSc8*flLF);ZU&QKhn3htoDvQ{{9*vtOy{{WKZ{{W;2 z)g6J&2T!`r-TcInpXR!sP)201+}aKarI&v%fUall_Au)oOiBkaR5YKPVsdeRQXlzQ z!dw7yTQW`nwjjP2x{gpfg6nVpl_Q3s{pZcU|jq6X)b?0Y5B zXQ(}g$RE-!XgoOnYW6m@ol!*N&ayuRll>XslE0?rj64RlzU7amv~3?@tnmm+RJI>IesRg+WU}Jwve^Pj|>It;eh^E}Xfv=63;r>?&z` z@yu})R1rqr#Fa@u0G}NZ+0%9J155-1-0ZDrdOmjzRT8o`{!2Ms)>lfMyl)J7G%cq} zR7+pda>+c7e1ks``l3onSe%4KX0y=0RYhoXhis>vak0`L*umnvvBJYh;w5(d(wQl9 zcPVVK*|L|a+}w&vb~EOyYPyQyK65^gMye*b_TS``bL4W3sH8bPRMO`d`nvLgB z0S5wmZQVIbODvM&INa}$$|{OX+H^401!H^Rb8eykWVSfc--^wf=cS_=$jQQN4?c+Bc0RnH>Itl zHYi&6dFjg0=3WSSp zze2Q*HxeZ&GS0Wztwh5nrZ)VrsH%OI)fapB}sC-SFy)MT*Lh3 z(HXR5C^l-{(ls>wK4~J-=K+n6s>asz#l|g-JCDdJn!d2TQoIQ3q{pgyo7zR{J*0GU zk5PqgJGmh@5ktS?uKToq1& zs)3-5@&d+jqe#ua2QsE%W5FXBS}v-~t<>(%1b#~I-a1~R?GFf_J%Vz+lFxCbY*AJ; z0gPnuvMtEwGGt?Y(g`^3w^MX`WNvBdV|Ud-o1-h54uIG9*(N(iNv^@paI_sZ;`t^A zoe8?D4P;w72Ml=yBd6)*rLBL8#|D-WxJYlKD|TzYSWl>vhxgrE!+xZW+G&kB*T~sM zyF;6WK`lRPAyUf`Y0fYd$`Q%Lyd08kJ_%4!zO!4Sz-T?yrLN^I1a71_AROUS)6~fT zJ{$DskfKX7oiB)7ONmZco=c3n7VW&FMMqmT9PfKt(;JSX<`1G5TmJyP5MTDkY^?jM z++)y5KB=mB-#nNcl$M$|zGzBrsTyl-+4Xe{ilLy!e1hC{7fxE{wl-Qa#=8RtJGpa8 zLTIG~<0HDZeafPCHLY@%?QM`bG8;7xyJ)5YHRiZ zpkJ#1r^dH84$81LD!P0~_JY*LlGl(&3SL;t?RE_f!|=Fsm9FU;sLgD2(&t2u!NSba z(>|g?8{5fRTWM-3E>z^Yt*#I02 zDN#Eir@DxFDNJ!`*;7I_{XZd+rY_oj7gw@76yT6>N8ifgojq1tUe>+90=p%SR+@H( zkaj0;y=5gvk!DWsE1h2>I0Gun**8?j(*DvZrkLWMU}2Z!afA2aS9J%$c9@U`bNH;g zM2ZZoz_( z=X?!zHc6eNd?4pLuTb;oHUT6!^V6(BYf!K|ZKFAK;?RW0*oF5Bw z_ar=qjR53jJ*NyA7(S>F+?X!ggXWl*k)4!~+`9@ar0O~BdlUfE^49r!rq4LXK1ta) z^Gsmt9H3}70k|6|?`homDJ~xlN@e`<%8(+sZRk^Hfs>pk-aZ`u36~GJ@Q?&Ct7J84 zaR<6M@v8+B+ljY4c_3&*#{P&6hJNI~gh; zjv_vISX;N-a>F-9n119%>7kp{Und{+O6XMM;2B*10Hw$mrWbLg{{WF)0uz=1R$6bg z=+%A1h6L+DO*1$cPYmELlyZlJtvSLW-y0A1C=db`rP1idE4ywj~%?qDX`fTXa{l>$uCoJg8v5*%tz<3{W^5sN? zNiO^3uTpi}480w5WS9fOaVyHzqfKPZ@_8E-8eg@QsqjQ6F5hxe9(#GGNKMGh@OSlH zM>PlsAZ&pd@M$l5SiKhhuK_9e>320;>LNxt75fBGtv^%5>K?xdm zPPiU%l%GE&0D&4$hmF&_9uc3G3RFlcRWRj(6*d&JRl?;qS!Pw;x)<)`1fsK*r7)1q<3!Xb84|wIdQVT#puxBYy z$id{D#ypV;4?0w>0|`DD^h$!r+WYR5CLmxugy~@40XN};*%UhxW+k{UKO&oVhU{yK z7k_#%f0BE_2+Tw1l>%b{umQa-KHf|N@4z4qL)62n4n-fvLZd zE-xbjrmdsP#n0vnHW^!xD<;$ZsMzo15jrhCX*wJR#T!Sxj=AsqB4}Oe>VNQZY`$#c zO&f=q*5C0+B0xOR67T>aEr?EI+MGG1i08W}{{RpXu(X4&lAwQa%s=>)e7ngEli4k= z@)H?MCfK{$&JJ4y^VJ1o{OeyUv#wCX~eG5*G&Xb>OMe_H&v4RIOu!4 z4iwh=kEnp=kQL|@(p8bo)HIbulhTr?%i2kJteM=12j?it`4aKEyx>W zbGS+C4wbp|on$oEn|#qrD>bmiBytA~yT@TxJWf44iAP(8(AQ(fq)42Xw zKsuPbFjNrZzw z8AD&108s-7u#>GQJQ2zU4*Q{vkpco4*#HjP1O|2`9&!jkk+$3*1ddUh<774{Y&-6d z1UrNGqTwEP;SSkAf;{#>fDw;Wc-wRUNjb_<9HQrx3@+$~-O`A`-(r*7WB^2GWF5xa zWg0E{NCXdFa+SA!5uzvoJ+~X7*rUMgh>lJ;Km>R=-45I%?YKj>3I}3OCn%32$sc47 z0RSMKksZhKN_gBL_7;E$-x)xd-wxlh0|z-jM0ni{Y=6Z75Zegzx-4XFh=Zvh26@k# z0Pl}PH_7rzE#Hn%0L}+Icgih8bOU=7Z5!aG0k?77BhL9n-+z)l@{rIo+Xyg&vL8f1 z;P1KwD{e51jkifZYtb3wbND1$=r#@VHa?2ZhW&V;08rho6yuCVQuh8uRs({6BthHy zB9N|)Z6CBgt)sw>`&j<~`{E`40BjX+N$q#5A;6NNj;H?mnV|mwtEF??lr;qoDVJ>P zG@jb;E&l+XTJ6&T-aT=X_qpGawx#yt0U%a%{ETmRMOGd777xvE@NnNep`3xg2{WAIb$$Ty?VddHd? zvbc>mw*m~s=fniqAduy>j{&8)&#r?p?kM@FFW$-=7>lqnCJK=NMKWkkh zJ~h@=Qxn>1S8e`|rE5#=1Ep$?Bfn9%{`XX0?Er?F>}lDoB^Gv7bhq10Spt&nZm1`; zRZMyNfmR?$=4)$Q=AH-}Bm%OFDWf495K(LHfF8;KrnUN`4?qrO08%v|4(I`7p_GK6 zfDgI|V4#2jK@1_;00a<003`&Z5CRG!mFkNLfRc!##^@9Plo6nS0x(e^5CP}O7)j+A zKn+}3;@hg@Kfepx_q47{?Wx9Img&cyGa%c@)3pBpCD^p;VF!W^R~`1qanfBj%|B&~ z-_JDfANWwd@Us!%{#v5JN#82wASMBDL=+mkL@LW#v`#v^GiDq zI1bqxKGw+q_#Y5i%c#?Fs2|%aM$@=Hs*3gix=rdq`~t^O(l^s{CXVy^H9gI;*O=bs zks$;F=(gQXOPbf zZ3L5@k;Rj!EkzeXT_tzziy~?BD(aV^Af_3ruLI8*P0lE3obm0_y05c#>ghU`yUhM& zM{iH`?J)*4(8i zNB6c`AJ=Up_%!je<`jC1wMqLg)1ToAH^|jO#8PynL${u0N9oG4lc#OeZELHlNgi3k zse-O)U72Nh!3P;volMPi)UQ4J{SBm2dUk-3JP%I`8VjP)0U-{{m#XO>k~ zhB6XJN&$|9XK<%+YZCHJsp<=(;tp(rFncsA_f*u>w^XyrN&eD9-rYC{WXHS)?VXX! z9@wGn1NVt1%&1ijYaVo|hCuvjB&hGFsG3pX!6WnJ)lgiDO;M%kkBg@38}r$4OPLL- zn05~%@m`4OTV+IciioC+#`!aVdn_GyvdW1nrIK34wXbn^9AvJ%QcJUneeiN&mmRrJ zvF>3R;dJMFFs6l}&$xhl?xM@lwn%a(y0;@^@ddWz$lXQ>&TH9`u~c_Yh!xW6Ed4hQ zL#|+f-%_cow)C`_4Z07#It}RKS3m0%2W{lL4E+ghxWehEtApA(^i(tZJdRBJwZbxd zoI=?&k(*@)Ks-08X>*^8A!&V}GsC;*KWVwjI}b$ME!TQ!{7Bx$J0yax`rD`LtEwZG z2(VRV(r66=bwk5t1Z@?fNW@tT-#`B0mJL zA62vH+nrp(cD`pj4am;x3!t>{Lf7;G#aw{zskp+152BLe)|WagY^GJL>PJ!cn()D<8NiOQq-t<+OS7H;Od(_Owe;0$+lO>$s!NNafXQM!5LJ>YMZ zcp}ygrur{GEB5j>H_D?W;JxJII84b4+sf6?NYFkOTieYi1(r+jH7%$`YieB~ zX>++w&|Bn{&1>?0Yf~i%a0f>DQ)HoSH6tIV4kyWX#zxG^-r|m)pF}`v19BE#M`t)c zHK6Jz2<9Lh=X@T^H#2~42X(YMGM8g7Z!YYJ3^-@Hb;l6~xxaU7=BG2I|xpEtm*e6;6E(5Xz>uZN3h3K4UVXpBQ&^xHr%sLwO9G09E z_B1)5auAbuIj8K&_!J15BqEuPXZ16HUOb)V5=%jkOSX7T(wDZBK<*lI#|18+j|4dV zt~Nl*xt;O2{Zyf!0l7Kfl+3_1jYk>oo`C+%z~=}6os!@}k2t_ORE&=o1mGrQ16E1M zC>aswWPy(TlaI*GLO{nObO<4mPIyesyLLOL#>ajW6JUZuk&H=#(h6h(*I=Bf4Q`-7 z=aj$!&cW<}3-^-cVQaVKghO|X_D)O*XdvYPM1BLY-4FmZDns#Q2M~7(K#5#40plwN zbo+1gTiW0GxjmK!>-OBR&C#w8xM!vts_@T1gvX z?KjnZ!^{U{;N>By!M5ZslbXc=?I>sIZ*&1&b={+ZFI`^{IhS#)$|#GQwSgP$V2v048BI+Xta zXzsmB?KA<=cLTNq27d6ow^9eZ%vy3aoFA%YI0_S5eJl zWdXl!k)8YQi_5YE3}=7lhvttc3?0G&1&<`3l3(PD9H0d9ctCQMjgbM|AOb#HA|okS zJd_U@NCe;x+oR`{JyC(W07x78qQ>Pb=z%~4KtPUB=Z?uIaDsw7e35Vxl1S`;3p;JX z9;rYM=p1ko0Fr;>gk*Uj>~{qq6We47+tD8*(F4L@Ab@gJz2x;GR zc*+1}0b&D4BV=W#eUkIOF@lRY8)W>@17r-ME$@WkA3{=i1Rw_V~V{0L(66 z&{tFa9GjlLocU3|^JrMg({wDA7`lv7c~1dr1hssOaR9=m55RWz6WhNf|Yocjqe%$CXBTI0Hgxp9S7`^Ua#qhZqVJ? zOk{iGF+Kw97MyY&{FVOzwx4PASBqop9XlzW8C*T)qyid1Inv)fz{%lme@CzX0CzAC zDw%&Y*6eufUrgmknYxC_EtdOTY@Sw0EiBH7&t`PEgUHI%**%o?E$YWhb+$!MH8n#^ zm^^UTY)ITY9m0?8G-KKyQ0M;u!yo*YqkW75J(*bZ{{UA10RE$v*(T!!Bx49ENv3iy z(aJd~y87iyJ44+o@-&sC6`$jusajY8&jK`wS%e zUg`tbvZVh2^MdLg)4JY^q2i{fG-9shR19%5I(`Q3Np=nfNZZwACe}qu!KzE!IWj#d`A*hUL zsHBvM81_4CjE%=*w#$R{{{Tv}q`jomP|}0$6U`MxHcoV~zXiGUAdi+7kehPa)iXDZ zDw2F1)7z{uzuAr4zBV|62?Vqpe$|Ve`ycAAinjEh>h7d8an<|F+#59!cr74c3pPBSB!CxshNkni;+YTRO#m?b$kN15}D z{pzniu3`Mzlx8|~`2PUuLLK=Ky#dwU!YHMpbx%pw$|eoe+IokFvQI|5V+ZG-qTn?Y zE~lPIXN}Rz6N?_l3>LT?5J#9QqT@b^mgsge*Glt-zL1aYMCSfZE2h}JkKgZ>3QMgV zmUl%{ABfhvqEe7gHGU;>;C{_PS@Hd|v^$ZhDYP8qX#{mtH#@0JYBO_q#_*K_-nC_L0{u!R%^@{Jm zqT_RAzPrw%G5)Fl02JqOS79Bpl{9c0t+n>L$ti2#uB51s8l#$)MwaAl+sLRd6z%^2 z@7P*@wo7sMu9NNM?*9PNh1f8hwXpI30CL5FjrB+2W90b)sy5Y=B^2t2akZ~Fj;5XG z95z;;=9ljCfwOb+IZn)8ei@^VOm=$#QRZblj>)2@X&=KFY5W3zP@0G|O44&1htU>Z zIcY{?gof#b>~QYMp5MR}<66#qYSy3o{Ezjri;${6BO&Ar5K-#`zRRZjBIs&i7OlNg50W+yiSn?2+CujJVFt+qwiR^WBOq_) zQN0Gqd=KgyWfps-MG=z*H^(RU9uMS{`f7%pn4R;&HzqBtMskuyUAac)y`y%Jen}a3 za8+2SS@psmWjCuFf{#{C=mA*B7(*StnMJ9%^*|B6=n!X(!OBP+pibczazX?H_O?Xe za+FFUcR<9E$w|phZN5?u+>iz3$}Da3N^aWZ-a!gOY&(-O^5U;UAxHix?YW01!Ak zeh3ZGf#t$aC;Sj0dB*ubpSdKTJ%T?XctLgo$T5hiDI#Zf^?ajF0d&}HD;&84Y_Mg@e00rUF z0oq6+c7FEdW3k7gPB-#PY98ivnqO?aNeBXHEtMXxg~0y+s^Ar^H@51=tpaL?6t7xlN`*G^9@$izSufiQUtEJ)93!SoDu%3 ziu0y7DDjXELSEVp?DYjNw2qRfAV+(Nr2hcc#Vlj*Eyv=nDSDp8R6v6JYI~0j6>)?2 z6P4s}HrteXeA4#Ey!Lc53ECY4n=3zxGpHY^OFEmJw2zoxFpbZQgB#q#=F^33OVs!3 zHU?8(?r|`1)>S+K^vYh_9`t(TJ1F&q<(hA3-CaqvcgmLm+E%h(_JLN^-q<>-5&LIQ z)gL*jz(491q~OQ79+1`wEkO5N5}Vs?*niHg7TE{=lcZt%OO>rRw)#?krC29#tW`nZ zfoS~F+Q+#an;{KetC&;!Wa-HZd|G>?8RVE+;6CSP@K-ec(>g|QG~PsHjwGj*xcceB zDWJ4%N#P8Fv-G`R)3sPI->rM`uBD7WbBI>d^>9>xX{sTd9t=`7{{WFlWRij>7dMtT ze8NbOAO&|uk{pjaAOVChj3Yn?A^mk4ZkF^tj`ErHXqWewx zt~c#^Fa1`v0ymDL5J2F3Qn&e}yG3|s265kn>qiN<4bD9HN(bTjauKZ0}E`3CWGXYo)x{m+dn+N*!1HQa-b$!q>nf6Q}^$ITD} zzR7sOBMCXl-DX`4yX|ELXDA%xf`byF5*eM9CG-#0EX54lp`zvs=#<$+7la2~s^;dARbnCA*gc-p{mzbk-#jgDx)R|jr1G~@4G zPWW1DrO+@kyo|A1k6Ila4(&VTvPDuHTIUR$EJXDZNbI@pKQgwppnsAuk^Cd`Sb+oN zf5OKfkX)@K+0lvpA^3o_>``hb3S?HQshTuE^Ym5}y**ta0L7$vos+avXsKgMxd$oI z(~M(qv@PlA;u)%|ji=D0nrlTl{iRWP9f3))DWZ;%xhFg=M^rKHv(tDibKEho9*Pq# zmP%9mI1AnKN}sGooiy~#z~d=Ur6$^cBb)MJe!qIKeVFKMI8fLJ8IcuszA}C zcM1TAG#&R^#tX?U8k(&0v?{hd^xdO1H2R^6fErOqC^s*0u-yo0e(+@gx@n%H{Y;fzQa z@y6j^(cf8DX_l&LNSs@ojCn3-(Z2aw%L9X~H7xSZ-$e{0l0&TOD?Ld5k#EtHxdB;O zu01~$Pl-l)Xcxl}XzKalTDRU7`Qk|`eE z97oky(bvw&qth#fNba8YiP#(+Iag?#GZv6lyW?wE2*z-jzt_&m;cMPYPnv{kp8R}7 zkDB1r#!{V=(Kifv!NNDk7#YCItCC{UOG-A>K1TOg`%mP__Ddia=dwV1d|)=z3S3Ms zXw*mr5sk6GBa~X`(kp_}o?z305qPYcV}}Ogbr8%5Jc6h$Z;`HZn(_}DD93|)_#vYD z=~NosAdKNrc&>5CCn_XzxzYS?E^$`Ys$k|5Amw!|YYcfM@G-0MvtUZ;w2*dP zP*gTpgibq@kxJO=GDt1%tD|GV8Ov0docBlpaVw5drrKld-m%feD_Y_WR(sWVLJt1BZQR= z17?M)x>}%$gu7ms4e&TBil*HwDVtD0Ycc}pjFFp6MaC9IPZ?(A!zETUYAV8|#js%H z;WZN)B56FHRW1;REst)Z=VK#5+iZ07GCLc%XDdBZ1K^p>cp!qBcfd2J`#8A@exsz6IJK{E3)vPs zkb;gEy@kYqj4uUrl~=pgLj73M@ONI-={lEOEc7xrcDqmVUKgn8Ba>Hxb<;J2bpHTj zY1D3UFaS2vPFE`H5B;B53xUgkU00~2(I*bY?5G_(T2 z+jR=3B2L69U}}d@$ zfEN+MrgXrJ=qc{E0{{Uz$>|bCk^xt8&tM49Y zIoovL&j~E~C3js2<`g;35{Bd=90a9Ekn_4&NC|D&g+dJOM!|Xq*dQO|e7{{WC) ze;na@3)m|(^o*qUsd)$J7e1@>&W%6ZUi(&XXGC0c-JpIUd3sEEuf}nby+Q3{7j#W< z#&TFc*9*(?47uMm8c(&AsqGCM0AwB(K))7XstQq2b_(hO5kmnDa_&Y!r`dqTTBQPe&vxkS*tk&@Sk0l@>D0%Sk2JKYGK>?bg643*on1pHq#Zb65s{y{P_4Jv;5T%`LH? zuUSdE_v^iR9ZSB;H27SL)anDwOiA<%rl?$`=*^HAz~S)q}Pc#Y5ai`qs*K|BJw<j_vt4Q_>MheoBxJKO>|L*vMF8Gb@H*U z@LNRYy!HgWm>+>wpQJfq>u!-~`(q{FFAB!yay19iRce*=N`*1C;sRE z0IJ1Z`Z)gp`?+WS_b>8R9^Bm5`z*a^a5(UIKlZFu-=m&?^m7@K zF`mllBcI#9Q_Ua+)bmzI&q8I>`8cP4Nt>lXxLR!udz(w(nwPL0p5o%spOz2avo1A{UMp(drjAREO+4=Y7CJ-meFz8Wy0^A2g`ce`t@ZXvA$@HyA+2-3Y|%RhXK|25 zM{UZ{x|(mQBkqex zii}W-r#0??Nv{sl0Xe|rf_Uz`m$RQ^^tAL9Z|h1ZDkquE@S<$4{gXgB_?kxNKZ4?( z(5bC7y=8Q#>E;$&VVA>=y358u0oWvyjX}#uIJv#1Q&Le@XMc3;y=&}9AN?0t^ZYXZ z0QFwHlt>LL*IvdOr`e5!f7v|!@;IfR?H&%;+?_M*_UR+fx!C5B#FuzdG#vNNlCQd7 zrfj`A6+o@(&hx0O6MN)$bZ%=y?%?%{{WHi%>Ejf{{Y!P z;Ip1KqjqTt?sQ=NtI*AM_StZ^QvheGmYx=8fL#=0?p>Ct{V(i?rXYLi$$X9x>y3fa z)IS*{la0Q(3!dJc93Q0Y5==m2r+{zfY1+~Fkh+(&%jZqmDX1USmZ4uyE8fVQX_+vM z*aZEfwnvweQg7))Nh@U~ES)Fqj>A{s(>@x=Fw-OBYiEFvbhr>sT5xvG4i^WrbX8@4 zv<7soL2OkmsB}|E218oVTwFZz(UJ2DwOD6LLH62EmMqDJ!Z8*pyA7|H; zpV4do0BH3O{mdVm)??aDMNKcaJCmuZCV;x8m9FrlEYv(W_BcC*O*c10t|F}M{@8j# zyRABImfvieni-<2Z9#QGaA{~`+l_(WE(a7)(6m?yUnj%jxGebn7a)V)DjX0|?BL2;;SWqgc{uOe4xPNFmPSWEqq>tU~T9o~{^ zN{}<6PUFlT2=xaGxOFeKORb-+YbfbyD2IS})Q@+XY`j z)7%R|o{p)8IRM{7^3py;=|4cUQj%#iDMl?ek1aLxHQ8&N3Y5y~y#cRrb3pyz5BzeL zS%bJ!toF$+_j(&`F#WAu?1iVCYBAGW@fxAf0jPaPe$o*Ejc+ff5zW`Nx6=8R+anoc_c7j^cl)N%A5 zOIc!}8bGV3g^{%2_z@8250MQGKi*V7q@A6&4wScE>41~mrVVq!+rpO{{{W;J_pWHa zs^62UT~a*I;{hW;sEm!i8ks-E8%uT~rm?>_wd4I}m8w{MRA$9hDmE0B#`-r9gh8gT1mxlWgYLEJkf@`I;&hi zzfQtG)d3J-ISr_zCmg;9xAJ-XmuBkEV-VPSCbIE8&O=#A9;qSl!DG(7I~?Q!4t*8} zq52Nv)^+cvwXuwfARRSCq=rTh0N`#;HUSH3Ru6J?Wm!)nTk)-DsIrBtm@|a53Xs&f7Lr=v=R0o@MJMwaDLhKUgs@MmeJI~|_+RyCQt7-2M z+RdhCR!JX>7|9s%qd3%D9fpjKWiwCw+d=;TvwNBO z6n#L{K17i5kXlh{++{992_puno_L+dKj~!$%F@u*)Ks)*_nRBX`zW{Y6(5nJ{(Vr? zGtTMO>B-GwNXPHf59HvG?4BJ*$96rx%%Ms7LfE`8wG48U50W6)IAg6oADe%g zatdjrcmkEf`;*3hHw3r-2kpO+y!j!VcS|sw=`{7({{XrU{{Uo^%%V8K*Ces}J_!f@ z6nlt0xp*8dz)2^4lUm`&{O%8{!2Hv(w8{s9_@vM9ycE>a=vyV_1I-^PPNt}6{;A(` zX~IUFIgZM9CYlxKhy;>dzrs;#IN7BZBsq@hIL0!Fza0Ju7xB7a#U8|D5Qusr@dwcj zK%gub-*i~YJpM^dKO_`3d!5l|KUAz9JD_&wl|=Rt;OFi|frPDq2`&d1QVax)@4`0hc0@)( z907y?V2q>BD4WjTL`QSF2XrW$ap$@Kq-5m`pqmy*^#}vL{G<<>P$(%1&mi_koOAdj za(sleXvt0yDrxrw47mNkoy^4DNtr+B?nCh!1nQS3$S^9Yfps6?H||-Bm_G zhWl3U`{E@Z>w>cR!WqYW1gQdabP7*vT~h`Gvr*Nb`&w{6*wU@(y|mqj{OZ$gkYoOh z&td#amnj<&gk=3a6558Oc8YIpk>q>Lh4}N1tRKL$`KwBQZ8jHy<4|1UK8<6?`$2Fr zP{#c3mc%{Bq$$0u^qjcyE2n^-(o;YG00=79ldt+(rydpZjA#C|nEwFU0eNU=xcMUk zgtiSx_7w&8(^Zdky4&VHQPi>DkzDuN1Vr?3m;s3E7&G#yBl)jC=?9Q9yLJBn6MF!m zmAF0}a1-D0N~@(Y^Fx*VAJe2Hsb~%oc85CgUncw}u;$ZCBKGYHB9YfazM%i~y<~)iiJu?vxomXJwM8 z$BOKXVI`+6IOSvCCd(Q{{a;z!TrmW3#6DSC9*erwT&Sx3=3P=ZgN4o{-OF$6-P=|J z<@}bEsLp94KXsOGdXPx>6R7S_s)?-W1QH6HdIi< zVJ()vnxr|FZxzGWDtjLES9CFOy0gfI3))o-@4hkdM)&2Ud?PDU4dT;pI;iQ1K6p)4 zbzznHWgBzm4A-8MjFBB1UH)e)o=WeCfD%B@ zD`mkOY}`MoI({%rcF=xcDw^)Ev_v!dsfRx$nsY!LDod|_PRf*n+eWkezq7#dMZCu2 zvC=Tt*&T-vrxkhd@&Zi{(BUV5X_-;IBWc5c#+FuxZ zD>MgiO60N}J-;xzUr;+8J4YjYhYBQtCw+^5M8tpQ^^v>krdzsVrk0jy!`SUyV5}Lh zorB<&!{kU##eTR$_9|q@saTq{+M-=YNnK)d$$+___Ej}Ds>*jC7MbH6@UCh4!sieJ z#x4rl(bY8-)zLvbak;NJJ1AkwFoqYj;mvUQgylHXG-My%3u)C?npDz2)P;2-nJSDyf875u!RLWS3r3Hg1_xoM3evLh$FmJ? zHp0%<&f}8R-=~E9@I>112Ex(yJ1tG2u{suq5w|5`sU~@sOR}_ddYavi#c8U8s%(YH zs;Qtd)8aBTpCz2Hx4H-UtGi^=HY4IV>Ft$YUpbbe9lNe95u6`A6E>FxJ84V#1wRZS zn_*3!H#RLyKR}^2O)WaPT`t+0n-NhMCt?xNutzf<;gHe^9%IQN`i|i4RQq!yaUyr= z1miwIG@DdC=Dzc8Ggb&EIzVP}v-ft2I9*Q1XN~;Ulc}{bz0ijfhULy#il~h4l3B?S zFc1pviMulO6(02=W3YG9j^^fanl~rsm_cxY}fLg)*AV95&(Uy`nDY<0G zU;X3)`Qg%`SQ> zlBMp|kV8k72@4#uipdM^_%05j&8Jd4d)r!0!Y}4mE$XlzLiUr)fplJ~n0~X7nHdoe z=DEjF;LvM3ks|tCGOTFu^$+|;VJB%1k-PJ<5)Dil$RRDmRD_;E**5oJpFYd69HKLZ z02FyknsoNcec2x{lRGnqf%b8f!iV5!*p5eZikCiVLyj_+0BIyQw&Z#y<=-Q^1c-G{ zY?WWL*@tb^+-Q$ZbLycrjS!M@CD-^VWaXH^8z7`G;l4s)`3~$sPq^gZ5Sf<*Z5CSC5HcaDVl=IF{%{2ZF5Hv=Ua5hNpoRD`VH@BqABz=O~_!a`5lGBa@JUm3M=RcLC(ES1;dNyT;KUA{Gwk z_MEx%^lPX4$vqe|TTpzX{{X}m@*s4Bot77(hxDqG+ruC21-yrL4X~q6_8Mw`QIEHe zRH5WiH-zIx7eX)q30=5F!d^S30S%IyzA%UkqX9BOkBepKzhPrfM>O-9s{{V95)qa`Lru&KB*IWljRpYy(-^=4_^9+P*cKz3i^ zJEQIqdF+Y+5x4lExd{6pfCn3(GJy5n5264pZ;YZNjBoQtk&uhJ00(j9gh*~i=agX~ z*pLzJk0O8@=lLPV;Ov1Qh}jWCoRCqJ3@mPkWIG}|@r^+ElJ*#q0K$^aZ91-QZzMrp|zzf`X!?>VlqWK;*JA?0vyF$ow~$+%&v$(lAmgyp7{@ zZE4Q?4>az83C}CiUdQ?h%?C<=1KAk&|Nj`F3U?y$KU6ut*Rp~Y;W-6Y4RA{ z{PL!Aj5{tE+`2s1D8M*Ol3GSKUZ}f!5b0{j9NIHmMK(ScvTa}=Q0(XL3xj(^=sTxH z+*uWFnW<&ZfmImzWXEDZb;HZ<%9!PhxI>mHN0TQdOoB4qZVfvS4&QRMv|n!4=md7_ zoqZ%^>MVkx@wA^j1B|Lkw;L5AlR7cZ7L<(KnI?JWo~Bvnl1XQk#qvn^YIB@UNhI=0 z*mR$?ZldXWX46~igXr7#Y3fRpClF3Zr~+TiK#nz!0& zY?4aKNc=w3|-qQMNJ6BXb3TubLUks9XS&(cW6a9DFoyZ`L ze7L~lFF#c*1IAWw8fh1l}PmG zweMzC-EDWGueaCJ#owC zml2#2eAIg~YOJq%H__F9Mcj+8Q3Ki-N8;s^_ORg>w%e25;MR%hNhI<6IMy=5)z`}f zZCv(ijFgj9pW8X1r(OvoAc8q3?@;cys_XUcdxhSAc&wZOB!!{6u+Y)40B{1Ojqb8u zRaAPj+n-O|`jeyLq_Wd{%}jNX%wrD?C84he86bY}S+CKunp!(&QBzdL=;|P^5lF{! z*EP5!@5;bfJ+yT_riLm>g%x~pG&QnR#^WXj0J*Li`H`Ph3#7fQT)K9$^F2Mjigw)V z9a$q^sAzME$Q$wV%Fo-9j?(?eH)eOP&;GY{CqMf}r~d$`<>+5-KeYBkJN;>${=0w0 zd4~IQebVi4uX_Yetf-Qp#tuVE++B?NWpxg?_PIsWy#YOmma3X+hqe&eOs#tXW7lBROQx!H9;(bCEK%dO_Q$kJi9LR{1T0BZcSf2*wh0_37!*=M+2zu1>v zbdO1Nqp7ZSlf!YSozqTz+3y}r0JI&jGxH@@OWVOXyX5M9chI(8xTvKUYRa}rNY^!t zrkSnAtP)5qJM2E?VRY$;s=5k(ni9!0e&z0wOEwF#*5Qsg01^mk`Y#?|u1BbE_ZzI> zi7M(JE(!Y}otyL+A4S(cM?S5hwaa+4-YyVQ!2J~z@2QwEx`)E?mmFk`8+sLtvAD+U z);SY&EA(QIPf_1Q&C^jGGgw;fi+(?dec&u_wx`QCwEOqGmpHNPV*x*9o*Qrnruq7< zJzr5<`WxF#RnFTqHMX0N?Phf(&6Id@<5=4xQ)Fp&GsfN5L+X1cv);IpEA?IOo+8!( zB(T-8Eo~eL8sU&f9gl9o8@9`H@(wp0tH6upT(>XL-PJWtbLNuQ7Pq+MxPsBB{PC3U zu^ViZ-pQkq*65?SR{O-Ql0lY=*pQsJ` zu3ino`F7mdy^V7Uys^Ge0AZ)+h9#{{Y(EJ^ui4H~URme`NmvwDuKT&-*IY z{o&u@ib^Sk+?q3gqo+zyPfuOc*C?ZV;FrLr@dv{m8XW02@9_W+Y!#%idtbBlM^ZY& zS!?j^^-gq9&rtC8OR>Ov2*X3Mw&#$W_5}Fue#|a*$etTe*`|rW@;pWjF8OXp`K53> zPfyof`hp7;JYqY9vY1OH$ne}Vt5yLZ3>@v*RVhi?HsX~XqS?~+3m3L2Eb~y%*4eK# zhH6Gn8)Xp6(n(+^IN7iJ+B+_J?T@8mvin1tirGrYpsi$5(!&_Q8vY$4{Pw$VRSN52 zyZbcit5o&vr!_G>m2vnIY7c8)xH|$ff)}B>x2EChZmQ^u?KUN(r|B-l?3s+ebq5zex0*1E^^vZPubz!XM+jf*Rbt`bi_4amJ;>-vdeD;dW2b zI`{g+t(k9)2;a47)Yp)E5!oA`P=9^L9;!x=k4{2VJ7ODIS)j1U zOAjFLm4DE-QPh29XtqyH42-CqqCjJ5{h0Wkc>WMoEMNk=U+B+e6Q9co-JF`daquI|-$I$h+8$E{KNmoSn&P_A|GU)S%1E(7Rb$^r`7Gd;s)+ohdp|an*nOUR z9)|bR?Y?y-d#%(n4N$R~LyI%B+~;i2dkk;NsrI4lrcRNhis^5v{b6R2!KPdQ_=)>E zuy9&?ICt9|WvaSNPU`69CX!u12%;zZ6)pZ?CqGurk&0TU6Sxd9zdv)=L$>=MyxqE9 z-+H#qO*?B`*0P^dgpJF~a!xUUf=SN-4zBh&)Lk=ZlIJXx)pXE}QyN(uT@dpj%^4n} zIQb^4Iw;&XS=;%ktH+s`+-s3VvWQ)qeHX9*yjFWURf;nTgAncc6h2P zYTgNJA{jXDN$fpN%J--`Kdd@pl+SgetEZ=N8JVvVFdo3Uq=EHK+Tz5Le9?w$gR`P| z5B~raqxq$>DWq@_fhYG!Ka!su^`=I#rL#DkHLs1Y&U}FdIa>u)9D$cBMLbVG7MZBq z8;{@$6^f$Dw=z&psNbKGEl%zVn#nDr`s-Y6lYQfR*gZA{2TgBt!JUHrpq2 zbuiLQ2R`B#|M8@TjPbJ{{SLyhowKtF>ZJ2jF4w#R8Aw~@czkg zKWlCkBdyhE;*N^oS^Q0eJP)f$Nlh?#*&jc0Fg8MHWP@p&Q4#+Dw5O53$u%6%>cOdq zAMG7Knr>(oIeZS|bdr+!8V=J!{{ZgD5A#Y5lRwos=Y5k>LX=toX~;N5jCV)zfx8|) zi8_EgwByw~CW9Q|D2>4!B5Rw;JCtOD!3hlscRxg4Slub#Yh%hA`X(lV9;sUm$C^)m z61!ysNG)Dr7&~O}l6M|u05;on0IY&W`=Otj8P3Fg!5JH6APaDeW48$>IVnSw0Dhg2 z?2EQh@wV7N18iju$R1EA0LJ6wa*uxLAbQ~|(6Mnh@H>} zzhnThzsYvkzodSSH8~&Ev;CQZ;vnpN*Je&S{qiz$BZ^Q5kq$0VKL(L!7r2a8 zP6s;O`KZmv3Qfy;$xoY!QCbz5GiB_mK+d%&Hu0Bj*%xq) z{O*7_!Tb;emMX5H12p7$5UpBr&{bXd{>}sBPx4u2`x&;K{{V=MKd~B*2d^nd@ioA& zPh3Ofm-cOYzC$a@p2($aeSK>#`z6F5U5fS9)2Jk+4P`7015YJ*nc;J@+rv6d8A&Yl zvdl|ha0j^E`ubtRzhCl9wq-{jiT`l82M;QZ7PF4b+`r(nf z-dfwMq-6(?4pgv z5GJC%qtD_2R@TUQqE&Rs{{WU))Aoy28`@1YpXChtTH}xo!F1Ysj-0g4CHKae0LDv{ zJFixB+oUoG#P8!cTjNeAEakcIaN|o*c!op%X-fABtnCbk{L;FGPg~nVPrKVe`LrrZ z&bO0)0){4!P`9?s_cI(Vm9KBZOE3B*RNO3ACujN`qUUbI zn-Haq%p*AU2m(p zZldnk-3yzks~0y%T%#up4*4dZ1ldb!IGvid8CrMN!5cuxDxBGCsg7iYz$WTrac*}6 zY*!w9YI0Ug-EK59W`p@60_jyG`z*wiqYnSeJ(H4lc&Jc5+tBwuG>pN0q3 zk(X?TCb_->$h6dvfyW!=UfbbeVb9GRR>C9Okfc*nJ~orj)pF&`rn@dGh1AF+k4Sbh zs$VN(bB@I-wi#xS{6sg5C^E+*HqvqDg?OTp?8_o{N36QNgtTlGRQDp|w#7Mfh0P}; z3ZeTu)q0q*!K)!fGS(}bgFxLo?{Z0k96-vW4kYZQz~hy2!xhQ~sO~ptA2^lo1U`2- zeMC)jv5i`TLEDv?mXu9fQC9b2BJ2;B3M!4;C|wz3;wBt} zv%Nx(R={azlgR1QkD{@t4Ruagww#}kP)tpd=IB8_6Pg{5GN}lO)KpBUv$4=K@O zVDqbduU~$RwbDz`F;hC3?PN}H69Mp@$;Z!i<=Hgok5I`2pC#&#(c=3}Rnd`KLo`iG zBb$&meon0X_gLhNT;Sh_{{R5`G(A|+`p$Ab)`sWqT;r)8;csJdH<5H+r*Jn~vOjgL zAL@n8x}S-JV=>gc)uuPsEosj z;E^R|=V*_~U~XsPb{6{ZNTzmIKe_(-^<4S>(``EX$^8;DJx}*r`K{zx(gw>7(Cy3W zo&C}It<-;Iyrrl65qgi*W9%3SZ5wQo-V^lln4gf=yKG^@Ag#;<0(Qz!87U(f;VaEB z3=Vcj_aYu?Lxjl&M1DxmD2{xPAh*cC*%yCApn>HB5<4R~029I^u|RTBLJV#Z6X)C`?1+z`K|y+? zo-u^1fCxz*sQ>`N9==GzNp=o9ph5Q`7or^CqB-(F1MxulAbHs&l90o|&#Ek7Y=PU) zD1A@>$t5I%l&;($erW{>J&+p>&_0NFK|yvv^VtLI!W$$j2%^F_BFR9)JPdM^jE%;9 zQi(bKXm>lH0yrmr5>M3``$K(@Cm%EbhT+Eqi(VR3VK>vn2csd{>qw? zAWo6Caj*mCn1J-BwL1f(@LN#Uodms_C#QEK2a)%XeODd*AOxTKMR}K2k93Q}&lvc# zkFHg}=-Did>RYsIC&7IvbBAp~+kRzpdtc%2Pm`rh@7ds@wcBl-0qr_!4zXl)Hnzm$ z9FkM`t&xr&1B-BX$ROZsN0Rh~idqS*RC3xH#@k;AbODSk0fb~>xXAe~A^J_n8*f$_ z8UUHp^EJeBS{&SdWp(dogC5W9ANzz~>;*Yq=&7=xskozndtIaG*kHBG(UQ_SN4`N) z+Ih?Nz|)XP$92sy<%Hw6apRPbd0m*}wN;#1C33U8{*5+Bg%#5GBLSK63TWJUXaE;| z^cp zL+zp`!|giv;(`Q*DH)#a@R&a^e&x=-tj^AvJ-C$+dRMRS{W*1prMDWox=`WcQ&dXn z8zXz;R&acXU7y-dQuKFJ^ex7bx4V1lJQF=LT_6tT^c`Oy;|4< z!>xhX&xhlj{rYgD`yuv&ZRnUQVXL&%)lXF;NSd6tR**JslaBd3_gDANXkB}G>K9Ma zv{zbNXTl+Y)B)w&440DA$yw^h~%apD?yT_%j@8OO-4Saq#2yL&LY3$;62JFTvoNdExp_FX_noF9|YS(}S*!A}a@k;Njh-6pPmvJbHl5~1eA|qL8sTlM zx6C5AQdH7S*^|WR$sZyD^v_%SMzr)lP)$V*s!FQrfZB?u#_-L^4Q@%vCrd`$V+%ua zqqX}+=r+5<)dh4OEj#3I#{`(z`Ve+F^&BJLYMWdO*o(BECyi<&CmA0!*p0*vS4#Fb z({|pX>esgYBrT+*i^X&jNE_n6I1T4;HzyvRYqIr^T6A|s*1>70v$A(SAt7ZYEJciI zBn;$^a8*k!I!eio8&=&OPZ6JpkHIP?<)wOit-1@Q`m3X#ed+2*XzJZf?{xChv%+kk z4O(8ow)|(1e&xmem~>RVXMQxEBcY;&qFR}nH*0$|e`xml`64+}Rwsq0NW{X=+VQ_D zy!$HlWz)S`(NNqjjH?xno><)^GnV87w%d*ty5;P{+1&*+bk_kL6w(YbS*{Lbjy_;H z*gtj_v)SKF{{WI*KI>CzJ?17)B#}#u7ctw6<81cZ=Ca9}r+C=YH5)ew^vL?yl;0+iih@M?LaMB$?9_1GjO<%nzAeX}-WH{3eNd zilfFOmeaI1K7&?&6|}NOJ+l>#Qso|daNC?FO6k7&NjE}b7q@4|TN?V5vKI~Z8# z$=GXd_yp~cPX0@sN-)!%)y7In(GrV`rdG2)BZ%P}U5b{J2F}~f6NV%Nd7+Yt(|v^= zGtN`z1|-C7!6gi0B;TGE!K4%bVEhCeq)PoU=L0AbN6Unw(B@$7 ziVF^z!%vrVXLo0^Ok9zTk?9*_Y#>Iz*;UrjXzJ+X>N+}VyIjn45{cmwi1UIT8bRQJ zp75^R=dw1CT=(OQ;Ez)8 zLcH}uT~lqXin4;DT56b%Su9R1b5G1Dqk-eAFWyr zH29*PEq{KTehVFKz1Ca0f}ZglzAbz+d%%)xzf<#^ySdMO)o37P2Oi^u_NCGm_WNd| zu6p9>){{|7cZ!j(q-&VZcVn55;t9@Ne7zO_07rXLsOi3vp1>_|)WIi<`%^JvhOvXT z2-$Ooah~Y1af8ZR6;SuI?A7}`>stPcyqdZuiJ+7QR8u(Nvb1r(Vlr@jPhwYSi`zd& zvC>>yW~+|s_F=?RMdCZq$*Xby02p3t1cRKVYf4y@xn)Nyj|P*ix}vYFI+}Z>Tw$7k zju=>V2%~Or-1p>?e98GQNc$YSI!|Sm`m2s(ii$a7GCN>mjGP~kXvg`h&3@0X(Dc_> zTW<9+%Pcg{aeE@hq6-||vOxXsHPii~duO4&bj4Mw!9`gE>e=B-El6W@#(vOfYmP}9 zZ;gtKkZz)paFSOh&O3g%OLx21T&K^AS3Bo+PI0J{kEU_-RY#Qcj?b!S^0i38u_O`7 zNgwfquaQF@iGbDsImal8+kAxS8x)*xx!oajAdnh!$D%$C!3+#zl&5ZfXaokFaDMgb zUt=)Q^oO!$-Y*i0cxqhg>EtaZOB_R4umqihNXPLnDok+EjPANeRr^@0>JEvIrv;{( zhMk@hOW~QscyZ$m(npwS=d#ZvTcnL~$t!1V=$pT@DtpsUO4QOrajYKh8qqThnIMMg ze%Z(iBh)s?>|dmvlDXhEmgwO#PB!rjZitVbttb5T!KiEHx7X3v(wt9CGbfCW&TE5* z;uli(mF*6L+5xda)7I;p7wT%jX`JxQ^=+gO?CR7b#@&{C8hjcoiLOQdlC-nO*L1VU z*O(@uV2$0f*E>-BLHey1ck7j@L!hEg8U?55zzG6KjUVpD1tGODXIg%zA^V-3XSb8C}0FWKoATx$Fyx z{5+L^M0;Y2vOAp*v^U2!9PGqqI$VMdL!)zAHy9%aosQ~Puu95X*F^OXM%2sURLCYQ z^D)T4!bh2FhEMl`h0xx_>LsqYf0nE?^l`IH4yLGXUhMAt?}mU6+5qpy$m5#@;)(vk zEOZnWuB7U!dTDM>rJ86c0F0Sm9BtK>HyI9orj9eVJC&rf*G=s{&vvqPXHHaFDkEr; znn`1L(oR5oOPVm|oM+4*nt|*#;T!r>s_gwYJ55z3T=LL5d>v7}xP{K+JF|b7O!UuG z`&YbH)YA(!uAS7wFMYe%CrR!ycJy7-*>rEZ{*RqUZ=%bp+G?5Mv}MjZ8sG=aY_ywnXB4c~`zmKe zS6;3cZii{7cZ4bGsk}EZZtYBXYq-vr4Yu?h_~%6XKRs{PeL&ioolR_`tCZAAz%>$N zb{O333Bft+0>1qhTRG~x%fNTLiYB$kwyzPoe*o{rZ9S7Vg|=^Kk=2Ko#n!M?2=X7{ zX*^?m?EGVOA8TdSZ)l*e+K800y3pO!!h%%30!I z;Ff?1#&*fTT?3~FiTWkti6j%v8v$s} zlJA7`z{vpcqUy@pogAmE`d_KKMy@z-VrYb!F-plb$0j+!2c7shJFN3-Yr{Y_4lU1h z=^t)1Q`7q&w8L_#Wo>OOL=nkS4t2aS?QzN6=gjiB7fPBo^);m2OGOB+gw9{~M0(q+ zKA6hVGPPt%G{@aw>NnfJSWDAWOGaC-$91(%ya{RMrVfL%IdFnirSD+B5V=Pqc-Cv7BS$mh**n722yw=l4}-7`rWnCfI{`fiP_wdX8#(T6-4+VDR1 z73toU>MM7(N}JWD>C>@`Y%M05sIZb+U8E38Mu+1L7(RYWCG4N1I)3HR9Y#8WmIpeD zx>i20v-Xk3#xS^p$l=H8gw=E(SINXDf{=_yaGYRr=p%3^%U~7EJqvb|qowMI%sdeA&$1jlkh=}S_9Q+I{j*i(FFbjn4y9NyfZ(BXX0bQas0Lu~uEHV5OooQ%y92IM^K{ z9OB{t91+P@{cF)Ry)AhCSyd&zrlc@E;+nL48Q?p_YjAPCJc#pK-(}qa9c9Aj)REuj zv)Jv`GDS^X$F-730miLP8d@+$B>jqNXY2tmmRC2JgS4{BfaKp4`PR%;-bB)?O zlYDs+sdzZFj%0Y(CX?j&-rRlR8)l6E0Mf(1{i8?oTRT5X^MS!lPxQ!UDjIn&d+ zRbByrpVRCxAdnhIF z?iPpAyp33Rk{5yI20|^3#wBLi?mY@nAa`BQtok>jI(q*A(QmAddK)dm2~BP)=W|IB zw6y)AN5tX6<-J);WrL}1FxcyAWVN5&cnTmtES(c;Ca z#D43ZKNZV*Qcnk|EmCI%wQ(Qy!t0*V7#(V;7(dp$eoIJnO>%JO{j7IQyKTP&?6?vQ zlTTR`#6Qg!%^QZplvvmxOntv+I92!H4J0SHamulb{6B`u73^k+A19CIqc_;iaDJjC zdol<7wzcRx_=oZ<)faQSa(QU{mz6!8Kf~)gNhcYcG<|kn(RWWnJv38RRJD!L4#jxc zpC_}4(I2D8HX5PZC-W;ASqU;fNZTcJ2rH}>T1g=_O)YlhXLX&Z>kgTud%fPB(!b0% zWr~Y#(Q0ZpW_AiWp6xA-#GgeumTK3Lrk&*cle2q9g`|o*aBq<~Q#xa;Yi{?rDdvtQ zMD6w)s`lm{>LgNhox)ZEV`~B5B&m_~Tl1QVhBM@+bv12OJz$O*oW^5-sH3ZzNBnch zeq~_iM$wFD1 zeafbrryEsGCW#9{C1h$hfrGdsZ>rOETz)S@yF7@=3v5pNIrBwDsyRh(P~4|364lFt z!M%?+7CQD~H zs$nFYsyg;$A0^f#_H%MM)jVS=va{KxZVsxLht+EqX4%UuPVoAIjPd(G7Tem0Z;wj$ z_h|{%dpNG9xI;LaHwHXA84AO$EH!r@0Kx;Dz;lAGT!}tTNiIS4O&4cnr>W@su-&xo zAwZX=?s4-<{Q3o(D$z-(g0x*1DQ)4SI~J8%`!#fDX|qh)RiUx`(Q6knuTi^;Q(U zZC*dE!@X8W=gAy<929Lpbk}tci)w8|@q*V4!p&V>9MQH&@HKfPhimD;Jb@pItc*z{ zZ5xoeGsfC~1W$o&pfiBuy3yOH;ewaqZXMZ0wrJ4Sxb78^G2}6%xRZ^S4r$4%z6^JA zHqM`#vHmPTmJUc9D@sn94$~MP8QFCk6Xg$u}wfhaQI58r)%Op*8bg7MSFY=xK0@nIC;<6RUL0hL2P^< ztK1x1NGuM{-fPgosFQ0H*VII@{{WeERKq->ryGvwNnGZ?1aIV`(@6bTcEg-0CMe5+ zc?(w*pD0U_nu8>-)ZMbCQ?;&)GDd*o-8bVgn*cNFpNZ{}q~meIH@Nr)lQX?XMCe#u zkA(MFxktoswmnC1GD2f{-yQtcG0xq4T07avn@JB-v;&@0mI0jbptQIQfSrz0!CexI zW=);SYPg~-gk+aze??nEMJ;7)l=`&B!LJ|5N2=8mA1ltChzL^EO-)bY7h-u&-~xt? zhNPoluda($p&r>DYMM#4hM3p{kdn|tn=Y>_Ift6!dPUgNw0g}?8I1t9qIm4dTK z4I2Q)L0t~WORcWR$;W?^#rA59{cLVzIB~(r3%h=cvC8_&^RG)IYh32}k_cQH@h%!# zbEpuy-{{pPOS-}~#Uq497kGdjh#&cdz6>ual24_7*qQLTJ8x9AzpSeZbCZoNkT~Rs(VIV=I~Uc_s*lAmp!e2iX(E&G)k{opJMx(?onEb_0-=tL%^6 z2XKxc2$LBu(sAm#Oaha7IP>;_OvTIFAnca+~)yB@o^(vjE)KhPnQCl z1Oh?l%{3Es4~v7@NbvsCGy6FkmXrA=TH+1>-2k~ER{sE6H1ZSg1&&yY?$@3=@U+?MbV0uQd~qsdPl_8t7wN1O#9Hb&`*airx) zkYMfIGcGZXGu;Ctjn3&9!}v?a4oN9E&Is84Xat8E4+z|F!-Tj7a!+KL#v?f3q)`on zQ;9!BQh*K-#xU&mM>g-s2qdY!oWSMJ?q9sOm%R86#>)e8<;#~*(Y~MWE&3RIHD}eI z&2A$f2-}s3=u!JRqmSNb{0iJgJ`u7s{{UhhqxBg327Ho+{-q_HC4rHZ(2PJmQH*ec zJZ^$RXi6E+WRR5JQvlnu`1%FuZ)6Q0 zMRRK3(fv-HGWv?&ZBBDKK!)&UU_P6#H;xyhy|l7vI$Sm;2Q*2o`|txvUT<#WZs^ke zg4DmL2k}Wb^XJVe!-SGBcMGWI5_@G1eqM+XlsF+E65+Sa5K3|(#!vxnQGN(+hku%4 z26y%JLzH;JEjSx@K*HD~`;hF9_j{m0eK3e_0m=yW!T?LQL+Fo@=8{PRZc+fr;St>c zGtVd!^gzbk&x=-3_Sq}3IT-TuN&VCSX)f3yowo>QZ<;^=cKIUP0T$%spQ0n_kbn=* zAr5)v4#yl6Lp{(i9Ay#Yqdz^-V{MWP4Dx~@_#k`XA=pQdh@H=pGxJF#XBhgRLAxMh z13x4{1M=kzq1Ye;AZK!s+hnI5`AI)C01rDP<9^9oq~!e4C?^i+eKLn_$0)x1AdzkR z*5lb1S~sJ*jJ~f?w$-#nQKV$E2WNrb8~q7bUf+Tz9BxWdijt;WB;xHJw(9q&f%{;XBBR^61sXZCeHh*W<%Be+GOU9|{st9HpI37SRCR*!);QwrlN*nmS8_QQfIy8d>8!vR016UJggh6Y9D0W0vjk?C8akE;}Ya)858< zlCJFwFEsJdP&MGp{{R`UE^c=X4JUKzyHB+H#WzlL1)vOQw=nLS?8f zad8_Hq+s7@|CIyYCTsw%yh*H2u~+PQ5ne60fjJi78y`(k zU73BY_gN==W?6aihZ9VR(;-moM6qOHi$n!0XZJ&~$_8Zjp>n~Vd?e+B$Llwcm!8@D-3)<&l zx#Mu{kET0?x9iVjRGnAUlHUISTggafYdltXLE!0VZd!6NupVk>FRrBN7Zvo}O@+E! zWmiE5*cqbM>NkpJ=`HvJNE;pg_09hPMc8Bi04J|AfIMeaGB+RWh5|nq71L~#lnm(@ z=qyt*dMIFhEK)JS!Ns|0+;VabeOCni9=fUv751Xjagak#aSaT6&I2ZHz#lAvN6ZB& zTx5{jsVg(y)@tRi_K$pZQ7-VO@EFtktY`oM`TbXV_77h*ce8pSQ0G0=(n(I&IOOPQ z_(#wXK8lChSF$;Jm#ANMv)0qn%TNcrM>}1D-~iOpJpkLxXFIL`07BR)x?`s)?DVq< z-Aqr7CcwH!d`BaV;8Ir=2~R;2ccS=MzCSsiv3mj()9MInwnX&Kb!k%OyO+Epoibhr|a({Gca_2neA z{>g5%)w285L>9u?B_sOBwSzAE##fMP!3;QFz3O@?s6CF?(A7W1sHd|SrG9g%&5H!* zzTtTetndQ8KTOY2+A4r1V}rsXKWgl3mcV>R5E4NBtA=)49ORbd!T=d}kVuO9+(hYS&pLQwlWZV&h)81C#Hl!opGl=?;#)b!AMD*yx=|tL^>vVL9~3dl!h5)Ca4pU^ z8-4yL{W>8=4OM=H&WEK zuAW+IxuK|y(M=PJ9>)w8xEv6DK~6GK2`3R$HwvqLY;|-s62Vs+wKizpTK1nXM(a;_ z_M6q0du*2a>&(xlkZ6&tjggm+CpoPIk1?IrIJA#1k{Sr?6LC+nRGR3x>5ihf^wrus zm7b*2)UXzvve&fo*8{N!{rrW!zWZ_NTa}(_D4?LDl4fXp^zDAI4#!Shbo}=|OO*!T zZW0dp9sH7UPqC>q9vn}mI9oqv9?+_~3h^_d+bhn~OlF!%WX89+xZq%9oSl*$etV=pW)hrZM9x-r-iyB4 zoBBRqt#ubFDC^ITSxqF(Y>wTo7-=~<-E57k{{Tte$1FDfpSs0MH5(vhOm1<;V~nt| z;k%9S;kNrPD!1%7_sW+`Gus%__XCU_Cm9|}Ts{j~DRO#W+NGj9XRvxo8cLQ`#cz@b zpFC$RE^EsiNBP8s=er~{bvKF_Zj!zl2`6JGmNEmQVQ>y`$UF>{Tqcl2S{&fR+k6xO z!l=fT66b96{ieg#eHYcXtA9_`RbBc-9&WEZkDm_WSR$)OMxJI z1zl_Eo6WbV{{UXoS4;ZPxVh8Fb(u5Ba6E!Le}Gx+k*4%|Z`totb#?o!uN3$DU+Vi! z8y?t)fac}?APxB4_P!9~w%h!cU!j|)p?#`CKXR(LfAWv`EF7NPy1~_O&92_o#?lNe zr#c=_cYImM?YIh>)$K0rZK3KqSgEKT9rj6NsVZ+qyGTO z^ZGtg4yJ7Gv^H0Ykx#2of4nXnt3|%!)K=TYwbJyZ-l|%LQwZ8kKDTkC9BIa#f!MSVm+d32`d!@= zI$NPA-3=7-iD!GGEdvBQ15wmmNN!2&G4h&rJ<5zPvxn&Rh0{lj+^NUkBSPwa)w;&< zW%kQ#j+U~fDmr0L{T-4K9IbP*{Y~KKBxlerNzhquUUbX5ezd0l0P3}RJFTrf5q0az zN&1%N%YD|}98!qpnUP0R9-`*txNnCC0s#jfMN)k7OjE82QBuW4`a(-2O$~K-Pnjgg z?>V!zx%-$F3)oA1A8Z{>2O49kZ{1M9pB~X|HD2Cn?hUA5v@(?1+f?I*9FqNcKfAAN z`EIv8C(;(KoA!rsyvKNsYKy>?&{ALm*16&DAcA!afrEj{mg!UYH1DG|&{t;k{{XU{ ztpMUc9lyA`2p$KYWi3qyxHV&)etxubeCf! zkk>KXWbV~(?Ecps>!AAb&or%tv)*c95<7;xh{Fm005~;6{{ScD_H*nMCgL)`mkbyEZV`wLT#1mW{N4*PMB)8_Tl~v3dLWkTXBtiZAe1_Msg| zwI69VQt-*{6jaWSK0*x+KSLu^Trd3j4%tC%vU@!1n-@@B?3RbYQAq>a;GDuEaATaw z8pb;qcm5tZ&I79YKF>q!kEZ&HiWwPjtdK`LjD^j2!u*gA8?&<9dkN{Q#hTsLY`f4@ zQMOnc0|e2QYjayBOLNHhhU0D3RqhFHKchcS%L@#i=~P`Nk)16POw9f6Z{Cid^(VE- zo$9Y=6qHsDi>k6ds(SnTBMypZG_XDFV}_gnK+BIg*=VkQ!)RMUQA=v-2N6-pmxf=>q?4h z&Z@lBPzN@WYPn>LJ%xk<;y@tr&kBtGD`Pf*`l{DIQ>tEj?ou5rl0RIq(@J>w;c3s{ zlt0nD^#6qy&GgpE%=$k~8-uwLb-^ zKaw|tKu$xeSbT)Q{$Q?y(DpjYi$%${o8+{@N?>GUl+2UF)vcwu*o}uis{-iv&KFSj zFiYUOFoHu`z~4@D`GpdSNO6;F<+Ws%z;mD2v;B}il3|KfQ-5Jff9!|gNd8JN` z1nWEeE2Si#!z&&4I41q9;ic3y-`)rBYSJAN`#k>u zH}!=!e;-vMq!A;$vZK54S+asV0FqA$UA&PV22ut;AJ`-AP_FyXyZgf*ikTPK-wG|v zX5TJ5VE!s{eT=*=rik4mFNM_B$N5gr&3g)>X(hEpT;f}xcV02F%i&$9-gs=xKZst% zr!T3pQ;3-7lF!{4UM_Xf?cscxE4&;(9I6SLbuHahj^kAjY*exn>J&!wJ<;dljjZ{V zq-3JGCVx{gjcE@HQP6oEQAdt9{z}@L+5J;?#bnXp>zT$_`z!;y#z@np2q`WciggKk{;gqrs$W{Js^H zbnZK6bj#f5k-5lJ+`d6#iMVCjY1sXHZg8lnwQ7OR zJBNUq_O=h|%1H;9{FB7@I%avGqtTYF_KSRyL*e*Qk03IuW$P>4xz$!idD7k$1jBGs zP33kpV3Bnt{_5~`R?2;Hs%|%1k;(VTi2m{c+ip}!_huu5y3d<5+Nh$qUoLFOZEV^8 z@~{5@Demy&`fP{$$0-*OOP!xS6&+4<=(b48Nl~R|T;8I_Dg(Y@ZMsjYD{hv_rkSiV zMsdR9XL7nXvm>g4x;*~?#uYO%WZux;$qOf;iP}yxgr<8zpd=YB;2%J_{n@3plm7sG zs^a5~)>K_1sLj>33geoZQV+>Sap`Kmvxv!D&zz+~;vcaoP;_*bDp4SaEjYtDLrZnsUh=KB`h|XF@$aEOysG*;wt4H|0=84Dh(Z zTe#U#vg=(L8fs+u6O}o)Ii(E^-d`}V&5g8Yk(M#g*Gn;MWHq2?Dd?cCrK@Ct+VqQTS4v+>mSxD>KQBd(xNOpH5 zt2y1ImYwnzV(<)-5fe*Dmr}U5cXn3LPaN)JBak_# zoF2&Lh_%?p>(2LNxMOB%(MZ|bsO%NhJL#Oz%}oy@9H|n~vUUOXT(ei&chN}KYd=D^ zi&@%@(;?dAtLl4vt*I|-vchtx9Y|U-cURSSF)JF^;GQy|mo@FrW$WRT;RK{%Idj2U z(i^rEs!Dds@Gz9f8t3oAv7~Dv+ib0JWTn9ko7=qXtd=@fu(wNtiR?nFs&ncqGBO(w z`zu3uw)nIzuBRcciKW|j$7PqZPHH23?jI2x1+zxtn&(Lj@sEYake-T0M{Ah5xG{}@ zP+ulq?+oTy4hGyKxfvs;j+6tcQHK<$Td0RgOnu%-@CSRE{A=TK3dWS36Sj+)qUM3P8AnYiZ1Mj94+rE?uohG}4UPyx2DCT_a!TC55)CBj+0i>cMAn8f;?a-U zN;1>xoz#C>xJWS@{vW+Zri{9xT3P=9t&IExpb7Gl$ek0m0OTmF)$txrs*y9yxH4?^ zjV?@)h~JJ!2pS_wb0bE1DROj`~P}!-aymAGEjE z;rkLt9o7cr%a8?H_?#W^gdET?z=Mo!Q&OAClU~z*VRF5Nba5 zKHd_*Noev3#^jIy-ELqPmI^VP^U5EZ93Wr`Kq7AmP31C0NA||suTc9c1aw8O{^;}l z;=I8h+i#lnFS8MjhqQT^L0r1ev-+J{Pq~@jZZB}@R)FBpX8ZOl&XJ4-=&x?TH>G3W zV=x4Nn&szq5#fQ{cU7hRGBrPVf_Fsc5^_#^BX@ohFmr{{a{%$OB)y2i*&rYSJZzFV zO3vtSgoYsOf&T!4fdw8m;|Yi?Y>%+VD7$flV~Vef2!{FLAO|G*qCaGwJrSVew#O+HCwy{| zowrLIBEa)Nf+HhvivR>;<&--F06=fH$d35Va*t!(6SIi)3QSh9x#z1^GX~h<>xs-328Y&=Pm>kf#=;B-v_!VR!Cvg z5}b6V<8}r+C6|3rI{@FgK>Fbj!A5`^c{mAx=XmEFCuH>DFx>crpb+e?C4>XIIGi*M z(jT09gm9cUe#%C|k;F&{Id^hH)jL@`*V%bpx7TIh|Xj6^-7HMo=^j= zIL_PlN+)f`=>+ZShI@nn+^^FpQXO4T+G7X2Odm(Uj^=$$#r4A z+-$do-0jtGg19)J5uk6LK^VaY%NSh}Pi|dO>QfV8wK766;|L$9df>kq`eV^@P(b8; z=~+av#$BN-l8;R32iosZ&0(I?T^+u%3E_MaOEhosT-SmLBs>i73x;R2`oXpCkwMgpN2t#|}9_kgzh{vAPWhP660(jlX1hB4+0V zCMJfD+vPc*ffI+t<>Zg|apZ;x2moi|r;X`xA}QbH^U2!<+-K zNY6gK(p`c!*n|y$@3(Ybo8y#zh_kjhKn2FZ7nubO&>p?}AVFu3FpuPmx&)9$aDWdT zfe9mRf-~|-CqG1n4&G>YMV+_Yd7=Z4EFb_$`XSFF=!SPgAP-c4CueLTJe(d;orXJn z(K|hW-2etOYTIm;>8^ySZ$|q9mi0*!O=IJdr!E-|k_5R#qs)E~6`*fEGt3B*9_CbKP&daz25aENr z9%;YQjkvn>_pB3twAFEUBt(-*oX6RY0uC%@hgw?#mDtOQClupE)U`FV+4YJqY97%pHFu`ROHSZxDq^K2f$k&?Ey*Ngl1b-d=8xFlK*QEITDM(d zs1}GJBgKi@36znf1C937Pt(m>bl0;BJ@?v;`p*qjQLY6)N7+^W_gmAJxMruj(`#XTQp^sfZ0#lFwZtDz-b)42KFq0Wy`|o| zR`XX<)=k)yJp_jXv22;gpLNo@5`Sk_{{UzVwDiTku1m->L~9=BxsB4& zU%TDk1Y|erlhdP5={wZ}&fL@g0L!LXsXk39GMb0jJ)pj#p1S`4IIk{yp@t(Fb0XA3 z9OjXi5-?6MGqU9u4urYVb@}NyLnp3up^-=dYhJ?LTF;Qvx#t)>;cX3M(SDJhIg#EW zynDW^{^33zpO%w_q4uj!eLmf6?CB|61>S3WL~@q2wWBhJx!Qpk4F|D4O4OQk*)A!r zypUx5A14s#i>WD{U!zxo>T(L(t$S0B9e&C=P_@37QTxz|R@*jp5T7PmVZboqh^ zBj?$A7SYg?(0fIo>K?7@IvKBydvQ%1ZHdzz8UtJL4YB0i{;Ew?1XKQ!)UrweFxotJ zWPbO=%>Bfqrq|>iH2OKM2eHnnuvgkIGcuBR>FVH?cq!#Bk~W95l12bH?}AmY=|sZ* zsIs-7xz3|-0B@7x6kS*C0{d_F%_AbOsAam6x;j%tABdkGKz3WfCnV>Qx01W|>u?rd zXW(U-EDQE!Og{{Vyn0pBDMvD_lvs~*&oNacswXIh#OR62gA!Xs9lZ1FMu z&04eRjI32%JhbvYDcJa>jF!GPw6)D}Mu#OHeFtjlp2R|e;&cmL_@xNr84##c~0)|37pEQxN^FWX}KqeU^k>rdK^GMF< z&PQ#+0>c{}k%NuWH|~sY+vtE4Tt>kHaz^PK6j|I8vGqXgv+4VgwO_557e-_hl`&Kp z!NGQi2V*_6g{1bU)-ZLiQO9(qqLz`Zrep>=9vn$)oO6-e;vaIwV!0x<=%AWhCShe33z56Gz(@Tb&43Smpa6tM%O=3fV5$ypz(|aJawJ;^-DU5_ZOSP za6RKgMnGn-uHKk^CUhT6ix8rr;kH&U4rAe zB=OyH{{UxR)b4!~K|Q)UNGqtFA(4!g<)$|ta7K1G&N0u`bNU+ksu^7+6-`Am$iZ|n z77{teK}_n-`TqbFJ6A<+IxkxLQn__auG>#hO&v9D4OhLgt{Dz>4B!TlwlX`O7S@Z~ zZJF>#bGUTVU)0e<;kKqGvrD$e+dmUQ-)tUnmB9%BZblGs7#o!KC%|rKn{%$3<8Z32 zs&=}HnO!uF^K*$O@hTYXlabq;AW0wZOjavB(RU;wCv0~>dF28Ie2N(IKyUR!<`4oN zx-YR;pMScrI~j?G{cL|V&X4?MbPrSY@)5bx;)IT-tj-Tpi?OiiQ8AjJh z;f?-_#PMw-ckUOf?XNR*^(II^vLBN2XHT=)iaHle^+flInPYqmjiH*d6-CbFR%@nj zjNsP000j%#qmS!Z*m&^A^H1Ieo0Q;h@ou@Ys%E$qw_!t7B%tb%-+Fbf#`~YDk53kP z;Hl9@(Za;&6&~X_-3Me0a-NNc8EagAK|AiU$%4pUeql*gh_vIjRmV>4Q&Qe`{z^M- zwLPN2^(w;0Z<-3JUo)5ko7oXuigHdgXD-=oRG&2sfycJXOZ1 zn)POi7#`Nh+-_DHUa`A5xNMDY$*M8x3$0E=s-*b^P=k*qb8cWB&ZJ?>0bz7v%swFx8(qg809UsK^ADLI~GJT@e-5+j``rDIn=t7B8(>6c|bh2W8LX(!kH>bASt<-fxZ6|D_C9Iky+Biiq_ z;qoh?xVlb>ibCQ@U^&X$@?%`lOE0syTuFxE8TzZvk?Be7=6uvd_Q(ftu##3z%!W$w z{&7fc;=PA0s*q#*SyJT3?V2mkL)<2-nn;6O*SNTE=BO$kzgPD2=%#gq-(@U1f_tQQ?Z7|Tf9;40gM6m%^f>n1?R&VL1lrMW_oQD|7% z=WAow5!<@a+HFuxJaN>5)*RrDGuu9kD`ly3Cx%%Xd^3$$8Nl;ijOf8&{ao3|gHzfG zaT#6|q4g-q(lvx_HgK-6ppMTlnk<-z_<-HNMbGZHh~GO*EWkTBcEa?BwNq!SwoGaC zk{DZnHYIsxv5jo6X#LVc^)$F(yxE+aCALs%n;;wZ!mxbq1QOl3R4`R|brJZS4T{{- z8+}zgMCk{<{H-+$Wj2W`t+%-7rY?Ut#_D}fSVfGrxp3nu1^U+uqB2vBKpl?@BJdjW z3XFPeIsT?5+Thg9)bq~b=<+<&O3S>J&C@3;rk(mDcEjRG1h+2FD|qR##r-JG>|EMG z*(xSHvn^3I<=d%r^#!8K4O}alX0@z<4&h67X%f!%SYj`47{ckFqW&c7QQu>P-~6= z8!b$%ZmF7`^hDF*%LKXou=pe%or+t3X(0sQ;HFr7I*6tl8{qTJg5*<}d1B~pXxMXB-5HW{s%4OdX zI8Q%)zmjdO9Ckp)+BrNV5QOT*%eUBLC?_~I}GEL-A2vF1IZ$Y@$b4!p*X?MnnV89 z3JEAL&i#SNP@d`Xz7%4YyULU*V!PKX^nWaCbYUJA{$XJT8-*9B-79&t#$o z5fPDu07sOQz7h7wK<*L&Cm1<9B0J-BqwBg!!eS2{j_83qZL&P~;SE{g00Dqe4T(Sj z$~bDzN>AaFNH zBa!Bn>Aq4=ss_OCvWRXojgg-~fCP-5$Pkcszz93AK#jIQ`5uu4D| z(GeKk7yxd883Z5zNf{0pC=JK*Mo!zGy%(P-7?N|H_(|C9grrUNdQ>*vPv#KNlham5$%MA1f1*=o#s*j2ZB&gPVA3S&Jp16=#X|EVFcK`0DS&w zsSf;ZmYaV#;Ub2QJSAr>8*+<$?T;j*@d3C%kfwp(Zt2Y9DF6eEqs9&}fr|%>r1$kl zgj<~LvH(NL%8m|RLXh#kPI8(9;@lu8GqX-OJan)BU^yn zc1eGqJD|;^c02Nv;gWpRf)>+&5q)u#8>>LsAAgbnM{%-O&*X@Yh9UnIcFz?Udj<4DXbaxyP7FXu-+G5HVfR;A~JI zT%bYQ$e<7o=WL83;9%~DS7dJSBM^*hGA|2?Yc( z-?>D19%vloU}XX~JNlx4ERaGox!ih$T5{xPZO}9pta25nPW1)Lr>-rovsOz-Q>RY0 zV22MP4#av8s-3vp@RObLHuXxZE}76PJ*)MFO~RU~*Miw#)#0^}Mi>bgB)3ip!6PR) z?S)AvR^BA)ukw-gWw)Jee~!im$>J!e77okNF=0d+TV8$0l~$ma7q3j z#bS$&jfq1ep6M)cT%dVm_+y~1v+T>-{ZC6!M{B!NNndP?{>jm}31A<>GqaoI2^jOn z!;uZJm8lYnmke=}T%*xlP3`W3^=y&!-33{$dq`}xZEG13KfQqCsE;j&5>&gA5J=e7?yByJIsr`t(UUgK`hMbY)AvfiKSPuCWB zXOh0L?(wE%Qii}CyPO*T05jR3{Q|7D_18>C?ZV^KU#zrR>g~cIGoX-SKqGFF-8tc$ z;~uMn5_#Pga!yZVy`(>Nof6@Dw@dA=8?-e{Hp6&|quvf$-w#_!an9glKXU0EL)RTY z2e$ha-W!!IO|;vMB-IeSJ+V2?lNrYxw?07SdC0p5ztIgu9_V<}63EX`-Fh~|7qn=4 z=DVq>+f4c6k|+sj*Cvq0hP*p*oE|vz-BWu)>Pl{#_Tkg_x5~%c-$L4XXPSRay?M7{IR^B2=w<>`!J!s^@M#~%ft}c9%HPk7|UE30WM>~ z#vB?qJZ^X4O7@QWT7PTa&u6dF*h!tBzku_A&-I+u<)Lt>6kh5oC--u7ctS&=eMM}MG_{VM`invBpPC~Eor9Wblnwpi$|`(&$y9QH^U z8{ro_X9)9;PUyEd#xjt=;xXSISVlI@B=NEWf&17;l0d;lsAT00j@|r_3rWuYw+e!S9C252{ zQ78hN*T842eL@tOBPsw=99oMhDn^er+gtz!IxvlVQ9D7!7)8Qh%uefz|d5#E_&BS1NwGuKF{)5x>`9f zF&mGr7M9r*hR-Z6X%8*H1rhAeGvORwVWww~QiefqAQhsYrLJbGOhVAo;z1=pPtjFx z!IoHPMV0~v{)=|rjc6E>wS(lIi=ybndf!w?9rBIIgJ~S`@#;A^ z1v601u(~9cI}9Hb)m(GBhdAk2jvX^xe1Saa;ZVzWevj_!swnCN={BH@t;&sbpHTP*2|)nxH-qRRJ6<9j&qC?w{;?v z;%0edE$vrF+TwnbUe>$GG5$!>mk$QMCwXM3X^l-4J#QcMI%zh}f0D$@fI(ensJeD) z+6beDSls4g_q`TIr=spUeipR-QYAAaNFgdM-WBAXD{^2tfS;0%+Z}vw_^IBD0)I_B z3aJ@^ohpX+5%>9kBn+$TMHN*&Yn=F=0d6v@dV)8$vPTw>3Gz`QWzfyG{{SrvPKoUg zVHn?)B0jRX(>(i}&yFMex|V);bpk<2rE5f(kY{a_JQ$tHqb>5Pv#fhQsQ&;d1wgx0 zIFJsOIN%f8`K&))+aa}IA00Uw95rlm0@Cy?)`|%O9t?60cG#tL^$k73F)c0$KNj1N zxZvZ5FT!Q1Uk5bs_3quuy|<9aG`pNAR5Wjm*ngUu?||fTHeFd{rSzgDA;;aMf+Gu? zsk`B4<#xH8^W5c2s&RAikCK5YEh|ho;~rO#Qg5vxRNmj>nDg;eCRwSGpR-$q28{ZyJ~G#t32_fp+rL8Z+kVMb<4@OTSXQbDknQ7AuW z7)YjJk^B-89fvqIrdYOcufQp zhm&rtrIIoXgL0jYqgB>fWpE@%x%!|85CdIvnpytLLjWk%&1}(1JBJJvA~{46RymvG zoFAHjESh7DqxZ;hO(CJGv7(|OoDC}KgkVDFZZN6p{3q12pNC+s?Z;d(?Xz8lGDeXq z`hnyPoyJuRuc8SXgaPGM^9UJMs<5ke(7S|GXGM~sT zdwVRGME?Nnul_5)lGZb_(+}8*&G)iHQql(rZ67tVF=2$R+oJ90j0D61@=gq7Bo03$ zrt*M5A8#B5>duadtm$h@JA0&j{{VC^DYs|-3)Vd_8t$64>EqpE{{UnzO=sGUy*F&a z`+ENX*fc?;>G2)MA7yYB9k9FSw|ACVXxKo~;`8+Ye~REt2OBLkzov|}KX_z!y*%xf>lw^4#$OmGOfsOaw4m0G2 zN*Tfi0CG7f!R&^fc0@1%+mwI=Z^{Q_oS~iYgRp-z#3uwD(RWA4^hLIKNCNJQeOn-R zJEHC8P$U`U5gFwf--HP6frLUVZRnPG2O%Jg`k-MR$eoX(R&sYqKm)evE#ReO0m3Zp zx^d8|;g402?GwTam^R4`O*s!OBiPETE8V zJ8qkC$;L9A-#ZL?rpV4tPy%o;l1CUyImpl6iQD?5P~%Ppag=20B!oi)k(6x4Tyxz3 z7#m=u_D*2oH;;>M5CUDdqK-i>*r^WXHI2bQ!gx5xC$>?IhX~#_+kWXR-#I{ne&+=f z_HWS?yAX4_H}4;1Be3EFLVdiZVgN>+1Rz3*C4=0|x;R`#fxi!;p9K9;gA{$wM0? zjxY)`5CMMg8vvVowoVa&vE?%2eRe=0hTu8LImsggCA0d&-4O(noc$6I<2Ps>klhr2 zXMFuqxcLMP33u8B4#=IIus23OG=jq993wn)gY!TgvAP={P?!nQICec!fWSmRAmJF~ zWdg7`kat4?#RI>d5suyb&^8zt-^nQN^gx0J{{S=x8B7ujZ08%H-^c`gib>#MAYq*C zje_Y?pfzRA23-2VWAS>uF(&wbD!&e*~}K-=*}j1)J6@I~fCW-5W8f5F6}`zigmG`<(aBZzNd(CqEZ`f)3+s zdZ1#nowJVUeSYMVoaZ=2o)QZWzX->f8I_};v_M0Pj{^3ep4n2^)pfrx7y!rd{o%gY&WdS5_=C(f4 zS_f2KwC+9PCuipf{{RJ!13M?5v`ui%7yv8Ejvz?!>b-C55~7xm zplM%O7l?G7@#=B-FB>x8_VK!8%IGGLd=a?h_6VtLwVFZj9&_loG+jYUQC}Pp(lxAq z2MR^@u1YCLfB-SZ7c`#KZx<;#MiIR^be;GVu5YP0RuJ@k$>0YF*fI`D%AX%lRk`@o z0Q3ptbgFRAjO8j!rx`xYEVNJkT@*Un9MOWQe^oWI7fCCAiZ8!R=KNAS?@T^-yyqoE zlWxk2aaCozXsH|arO(Md1T;FsKrSU_{6{s|C0bhEOwnV{3VE{Jc)JsIt*4=!$L{&S z&Q)u=hBp0*cKuN5^P;aj4*1P_csB&GZ9kZr>{j#Ajli1}n_|NULfr8QKNy9Mq)H!X!T z9PXKue~TZREE97wpQO-S89Papt3f|yOrvf-6 zDk-%YHeo+Sx-)N)ss0hVgHytrAbYuEzF1M^V~bDh-ha(Nn=`iof^o9W*B1auC2Fn| z(>b|pPd>Uz&D?3`ZqAA0=(LJ6Y^QU!!nNqv56K1!sm|(fEu#uK|tdr`eW3t&~A15u>w0d$RrI2TKtQ7H_D1DV4hoie!H|*6- zxAv5{I*R7Qfmb2=s%<`-BV$Q+IZ(!qgVJ~U%9-SB(rX}OWkS34m1Q-2kr9I zA8WC0IclowRt8@s0Angr29=kv^|^5ZT6X-vP&$U`4aOko;?i@v%(11xYLFV%8W zyx=qgw>zw}Nn?YQx(6FZHSoVdds<6Ej>l?t2;FsA`WmW|vDEKtjBR!`4e}KY`=aV8 ze``v|4EDxyrygC)uFRAgD(qEI#Lo^^;n>*ut5-=Y;d7b1eUwXQO)zEp`-TmB|`LREj>Oi{0-v zY+>70!^>q(!M^I&xH?IlBl2A1xhauM95Ss$iT3 zOfmG&Rmy&!=(&2DAO8T2m->IYBQM<_-~J7yVIJn)((-9IY*~MUGn?VSac9T9}?8f1tIte@=@vB$ZE9~ zoV)ChQ{?XD8lM87HU9wSrA1k7rKUGE`#5gX<`g+TC-{SXw@zwsb|0KLZRnFZ5yTof zDGd?jaF$lM>;iG;;67=94~hZdKKwLb@`8x6yI?_0JM9g<6OS2i#&$__Mgjl~8xrHb z6MVY^gyGm>H;vFV6M({EQlEa{4pS10oHvyqM>!5VeZVxUFPemQSM&ZEP6f8ii&@e;G`>!8?eOB?ZU>Sj{{XvE*{UawbOo@GSq$H6M?@8Bhe_G{Sg(pfJZ31gb6^P1Z)oH?nHUU zHcI)V=P8IjdCDNrN-#Id2{E8>eGtwLHp(JSagC9Uxj+E?l1515(H?&e$g%-IFxqz< z6k8HUC^%%J{6YXM9tJQ`W1dPdMtxBrLQ6?HhXDsPv8iolOL~*Bo z%?-{WNAE(PyoUqj2+4w>Exp0IoSFjK-)YbIoTe- zBRJc1h7mgiJ8p>J_Q6HJeh?-Q#&C=cj_3>%#|RIe>3~@5iy3Y=MnVMa3Xz4z5ajW) z7$|}D-2*^&$c_;>1GZ6;NI(R4&zc){AfR~&kD35HYI022Vl+!TCrLI7-0 zJ3J`?Tb6T#GqyJ<+xAG@pa&S|C;@CB1f!5Vk{g_Dw&{HBgaDqyf|__4`KK@%-MC42 z89>HajBm;(XCt?&3>a}c6b=sQ3dIcL17u?u-0p}Bk0XQ!sX)Z{0FsrDp2)GdIM1F^ zyJvg^#3T*M0C0Fmvqw44bVPBJ_ap%w@P>BsK1e&9oxngQ0iC%=zc@hc*%;fO!6Aq1 z-_;-QAV-%zXpVEvQxgY0(85T6?KI%=$x3#6a)I^??2^%eoSsqR;_t@@oI3(Ckc032 zq*?m?5tL3lZg$E57|$FcGL^=B z(tNf9=7Guiq{>VV*aS{E17tIt@(~mOM~(PJ-xx=Y@!1z40t*9Hak@?pf09@3{uxLo zbbtqgvGqXnoFSZd`Xc0TfNW6QWb%s#03GwmN*Tt(>XJamo;x4|CnpGFjBYn~k4#=7j?~#wHEbK_#051aoB6h(H{691a+jIqta8Ui@-3(;^0D>RA zznTU(fFmD*Fo%9nCMP@N2+-v1owrFGWdI*JL*`K)M;syhqX-ya=di*&5R> z9uVcKS!g!#>XjbcBs1{i=9L)0z#Akn-2VWM$c_gHen@@!O$mx_`x%0oclY>OudyN%L^JCueb54~!AnVmgzYQfyO z?cddoS#B1S+2geJwVT$Zt^4vnno{U%vR|~;k=0j%MmMH*KloVwOB0W$Wxe*K%{^0c z{?t_N{{Uz#COpv|kfgq*5FZd-o7vIV(R9F#+dQq$D?I{`5@n~(Mdr?_Rn=8-)JT& z`8nSS**VETjI`|ys*nx7Bl)jd`yKG)_G3k`Bu9h(kzP%!7_6K7#d^2&cch-TqUoA; zhXfDwit=Z}qu7UrUfP}+dZYt_{4JMMma=p0o+eI_8C1Z2*O81VRjE25;xy0icQB2p| zMJqlr;2$p|EO?8Q3aHj-jEXIBh8>pPJ98UoQmMtjK-^rga2wG&thd~|h502vqpu8*tkbsq_lt@#C@=<2$f z`>TaS?r;O_o)v9qmnT+6i=`rnVtU3jj>O?O-kY{Fd25^gkXYYoFP@vJWR5vxY-NDq zt~gmn%_!zapQ%?IcC3dcb`wL>&hrMeFzJgz$5+LByJAumV= z1bzwZNGZO~kx_c-INnZ{l27ocZ|Yu|Va#-`KPE1HP{#3qN{AyQ?h(+vv~)T8p2Tye zfD!%0TT|8+Xj*Y?X#>8HvC=e#Dalk^!d9-y5 z(#Fes0btHBHw&B9(+M?ig>~%3-Uaq{6U!Gwc`=j{Mdil7r(>ynGh5gk(}S{u`s1Xc zloL+YJ-d&G3pLfw(bQE~;JIV2ZYHJ2DU#xLYR;kQYm{tk?gvQND)&dy6OdaYLG>$; zF~`k06UcVOM23|eeh!)G>w{eCNi&XcpvltK9ZnI|hPZ4&JLN|9TJs^Sk2~qk3dQwA zvPFBVYhLD!XM&=v72jt=wAd)9t3>csu%0H8eFkd`(g3 z0dp^GHLtjqxsCt>y5`G`wPvd#X~i6F{GjV@T|Dj?})9m2Ge_ILnp5TmCI*aMX8 zt^KA5%F1(6kq@#v+#EMZ4gh0>^wD6ATq2gA;0_!qO%p(66Q*czJ01c~^wSKqj2^>; z?Y5=V(zjmh2ZgJttF=!-wv#838>y6>d*v4uW!=-osG)RmMqK0Ec3GyuGbzMUXT#6X zE%g)2C|(%N@JV-;0?mjGR3b3#`{R}0852f&w1FF9VASEZLVk)<6Q7gIM<T0s2 zm^OZPW7Q43nCjY3INK`5nm{L%90EpCkS@(M?qi!Klag{m?ti0GOL`xw9^ryXAL==9 zdLN1V?hf1fh3Jo9v3NZL)G}>{JdduQ_pe7r6rFoKQ~w{w4-<1Yy0{F(gh*~N%{6i@ zcalrd_=?<#-0zndW^SdqUsH*ZYp&I1{G@jvnrYM?A~dkS&O&kKY?loy32oI3-HzsJCNn zJ9yI`=jy6A;kD-8NsgCsTHIwjTahIG$!_m?(n?JCV&8>3VP&Xq$S^)0O)B$I})4lT$1zS&vrX{uA{_}9s#kxQ}*@r^17Oe)VS1->|e9qp2eds+w?xM zo(Q$BPY8I<*&y;ibh;)Gl{^oHQIl?t!-9u$YD^8tpmZh?jJ9u2{q&tbYAWxtKr;@& z&$#pm9H`SQIvwSAB1WTIDDa7dq{1heQOK`HK^P8mrBL0=TKrC4O%k&X!m>WmS!}d2 zZ{!`DQpfH2-ZMTSStplz!YF*7xKE2-E`fJybKa_80ILF`_vVj}N=`9vS0IUIbORTT z&Vpp6n_ga*oiff{v4~y0ndk_jn7u3dy8=S*>`0eC!KzSAWvxUZJ+)gZf_8}MV?Wp9 z&oz0+H{um62C6)E7)e6@Xx^Qc7p|zc8uy1M>?Sgd8jh%K&mcP>2)eY0MFkE?Y-py1BmrNlhaDPT^8p zZvt*^B_f#z=NAtPeYAp{L;;-NF1UuUJpH$u2New#s_SZjq;^sU`!K3WDhOg6R6Tx8 zl?1CgB@e<_Oei0bPjlEQ$$~6u?=O^?U1Ou-NWnsx8?{%{s@D6l0G&@tFP8`j@M>if z<Bqnn0Who_jgzrt(AQSPyx z2Ggu-z`dMQ6m%y_tv~x-EJB-w(Xc=OnDUI)(6CYJGXfR4zkGn?QYA^Gp($M;(mhfW zabgei`MZ!wxvn#z>{JdpN1X;#dP)bKT)cJa8tyzNg?`de`+6dDc$W2~0qUom?qi0a zR+0okLGR26Ao%I{fyWWvn7P>8aZ##zKV8qG5PFKUalQ>p1EV<*YLe~J1ZH~q!yb15 zr>_3$4S+`*mj+jVwlsPHc8S%<6SBpw%{9dj50mU-q*Ck~*9jQA5DQA(U5K8Hr5#se zj)>^@m5ac+W}sQ&+A5Ye)UIy~6DSk%9o@s)D3UJqDBaU zJ+AuJ39f=|6pwQ#5~8#o!ALTg zlb84g?7xs7JQU_XCkl{AGt2R~sE&ScO}$F_=jXiJ>2Y>r=z!})_~D!)&WRrG-%0<} zJ7|tM&Msnq5s(Kps$nSS0OjeKky5DZr*y2-8j*8)4oPMZlqS$saB(V*1Ms{?z7V!e zVlM~b6pNwi>r>EVq3t3OzMXgVsZND6A{QYG2U_zH}l82{3Ox>aPgVWa%c0V{iiSY~$rd3O{6y$zu{)u%{zoF)2t;hM;r( zw1RN?Pw8hwDK6}6CATI{pV4;WkUPB`I6gG()VK+11#=iUyzc6j_&I7g?_ylOV*db9>PI&#^R zrE9WD-woq+?pvY$){mf1w8oXV>6dwhzZOY8)FCj+~Olj%z6`(-7~Q zo+9ye`q#}k|3}xn@RLD0?vhap7NT3P{EXt2+@TH5dR$H1ov zJNT{fwWo_h&R)&Evv;oPoolOJEx~05*lZ>{^X__?xO4TfDw;Pvc^^5qV{@KE4_E#8 zEu=8?-B@1153gAS|98O~kABaUa)I}pO$%y9TZ$PTC2P$vplV-~+lZ_ftvSt#zkdAU z8j}-a`Gj3Yi;SQTl#d7PKWG2k?aHoW^^i_zLZE~CxiGKfdgqOft@ZldhnJ@nedz+7 zShF)k^rrsfANkxSle>VN{oX)U6xPmyvtM1wq4P}hSCJ?8-cio|8G3%-{_%o_l<%FW zBkSa-9*+Ph0?13rKcB)rM}ZnT8>_6!*KgB0-{HJ1OP4Ws5RJVoZ?cyo`E7We9OIR9L$FT_WHV|9YRfjAPscfX?X=sL zkNOs|O7S;7vf_W*a4jg^OQ{}r`{seg2CGVsq3QeU^s0km-GNqb5V2~iO%E+sS*mNS zo|hD3lS*}tznV*g4!Lpng!C8=h3Q4AoF#t zF=8q&72Lnwd?)BpJo#%~%9k6Kf9pgt4U2u6`m$P-%f1$*@xu?b_tqySgSJ=2eiK%N zUVJP+=v;EWS+vPe@qS_%-gvOZS~w2>@4;RnaMqg8%|8G0^0@ZX zU6WC(3fHg?Z}0IXDH1YL^FFQt7`G3clWQ?d&iJhHm%$GiG8+)o-?RQA;@iyac&8Vd zm~TC{ED#CQPEW0&g0um0Uv)<%jiBs7YU)-axZte<|s@5xWep_xf((kdyTzkb8_}6N&}9su$DagV(s$+167+@{+Q$9cN7Y_^sLYQ^*7dl zR~OQxeVh3S+1#OX78o6MlV^Q5r&ghNWBq5a?E{*a-!T&JR|IdRf#eFdvXmAoUWI$z zQ8zHQkk@5$pI<08k1ue(**UNKJ<5AmE}03n$`{~#FZiq@f$(qMrBu1B z#bUmzl~Lt0e{>neg74BowH-~x7aAXfpfk+*i|rrm#VX;djxX;#a2+W0IBi zT48k`zkAryK=WQ$@ju|j#iHYB*zW9uA9>L}c=D(M2>E57zi`IJ;4v*yGQc4%tp)I0e4fwB=ZevSy4n@X)yO4o~HZ=Z6_@qBrc#nU|^snhwiUI^}! zUhbS)G@-u4vCqolxlvSmF>t(i=N}Lwn8tncPW?RI71s>H2Yfpz#Z94h)#$_MX;9IW z1Sl$bKc#$>JAzZGH0LOKH+dy1lpjkgx0WS@iU>Uu8Uoee_|0Ci*dSqrnnCwsk4qQ$ zsXBcfH0gXNlV#fmbp&Nuvb@>~-9x?8S#0Z8*vXe@Y8_5e@@^-5QiWK%mvRyio!>_J z6IUBPEAv_z^p5H)Tum_CNIS|Xv?uf^51m>$hc%vc57gjiu1%ov=WD^tk(QkrKFO+6 zSxNY-<-M`8dD%v~JjWs&aFCLp9uL3S15kPax&rv){*Ig0Um)<{HH1bvC012BSL$!v3Dnti8JwH(|hcqo~c1a}R$n+zG`z0g$` ziCQ)SkU;zvdM$ptO-zc_RZxVAhGkL!P{PL&eUXlkMS!`1KY_QNa;2oamLq5u40yX0 zoS=dy*I};|{{b`%N`dSV^Jq8$GG>4EjE`-OY4;EgD5v`I>F|XpVU*muX{m?~xpyt( zXSQ@jl$-O_0|oc`Rl?a89=dz~gZwsMvAwY#YxH2heOj({xTf(fKmoTFW?3wi{Ia z$^&$wUodK4l^|zn)_#*>os=S-ol2M%CS9kX5mu;CJ+!HbgU!HI=c9p_N5F=Own}+F zXz*&#*6V21b&u}nKRj_>Ge3*@*f|Xpl~XBSaPzk=jAaFQ!?PXfr-x*P8zML85n5W4 zp`xPteto7{YQ+N&{3ty7bo+lAboRl#!ImrxiS)&pw@#yxhL4MXQStZSPX-2Xm&P7e&2|sb=shyfLsy7@5L* zku-^)afhTH-k=rXqR?RUH6mslmVn8&Y-L*v$iabzZgE;{lHwl9T~$-^sACiI5HtpY z8#ENBjVRO_5e3hnl3W%RrPP3c4A{43gr=0Y%0ii^vEL;iA~GHwT}gYM%EX7Pp#8=d z!oaCif(rH5+VH#_o^&|JLVD8DHpPalMRBQtRf?A4*H|%PYV&mvNaR{>fEu`uNKw1N zm6|DUMXlr0*Iw(;M6|uuqzKNYvD@LE5IYwo_K5iNpE#;zlm4DC&9ulc8nB=gU70W& zG`;dni0%^gU7g(%L8ZA{mqaMISblq|aklxMrOXg&ojIxjO9bpt%jXlWV5Y}GN(R$` zP8#5WbTjkhE_Zb4MzYW4q&R?VHslG*yaZY{zp;K%PMkYt?XcU2pGA8LyB<##1{8`Z z&MUifb{wtWG!=R$(o!iEf{{w68@X1XMmP_Gg^oH@9`ET2MbpRS(w>&^b+KkSRQjt8 zpq+k1rijpZ%Ho8SU_Rp@$S#3xopdbB_mxw3o+Myt;}OkMHO(Iq$&7^ML!vq*+$gvZ z*OLIjsgq~`2RanCXRe~+((a%TPTF!w$dc6h3PE{AQK~PStsN{1L~wthq-}IKfEpAH zoTE*7x2Lz+$&f!uX-)PtSthsAwT$E zK}*H?5n3!`;E*mpBLIp@&5-=L$+Dugq3>k>53m%)QK3bg4Q>c3PAQjd>*%bsPCOm_ zX@qlKr91Cbqo9lorVebwCM`#T3etG)BzUSs#CU@`^!QyQL!woF{VfZ+?kV@sFYw#u zLDnt465kXD!`~ZU{{atq+OCBqP-=bME%k%+9}nv>I^tk|zV`*E_uX&Udje@0{rz-q zsgi^y9*}2Tn5I%naN%sZsQf?R(P}Y29$Efz;-2`S76Yi}w*N%q46KFmMEZfQa&8?@ z>>yF(>&{}p$mW(i$uj z{+n3G$Y`4oG#ZW`O1)`vnHA#yC3hiSupjhd+!+@fxw!q`j`)oMz6%;CYAg-d>pZlt%V zv05)p3+jbW+Xqyrx=!IL4|<63#28~Eb5+I3aSR~$T3bhO%jVUp%9UKvNRlmlk>q$! z87r2b`Xhia=fjwEL9X8;g$;GCgxC#iWT0|d0r8Y6!Wes)Rs2zR1Es`wv8q^_vd(7 z#cGfP>r&N_ljk+FgADryix(2uVG~`rW6>YbQ*R3ugOo4LYsNaCqs-86(t>!=D<`Ek zL_pVy=o@p$ZLKceLb;n)*dJrsIQ{`Oi)S3D2b?GIQL*|N4?IzV2)`ri?A(MljucN! z$lanw-`mF@g@1Z<7Qd>sBOUFe2_+`9gz5ga)RFTJA+f9kH6jibWtZ6*?~rx#u8seV zmE8&xCOl^m!JrNkHf-s&q1L6?=_Pjx?rLx${{O(Fz| z*Y8aa7G1|0@7)he8&#$Jm;JvzNY!NU$zsi3y%v6b`I%t|XxCEI_2E??eUYgq&016a zfj_EDuc8neHNn;6JzRe@y+?V!WQ^qEi+&eU$S&+^L`AcmVT-$)$y~rb!)VEk7~X@} z!vFYL6s^eAid=dgD{hzHEI&?l{h05B?i@u$R@_p4!rQbt+f$=E?kZXVD=$R1(;+bx z6-^cib3WUvC>9!uRoOAt-RORg;K{q>agW-13kqJ85=mr%oM=Hh6$Tk%Tk5Qw*B>4d z^`@kn>ls*Uvz?uyG$ka1>Zsfl_T;-FPu}r)`Tmz%D~DBBL_W5$VzklOw~{PdX<8Pz z!rp1gn&pVj*r}Prq@~cnbq>^KdP7{>mAk8 z3x96xv{1OCb;{&%^x-qUvOzk1TW6N+XU&JcVs^#6@6FDGO12-g3rQUp`hA%TQyd+nR;^NFS<^iNb?IV zbkCG#$*1$_^zM3>(qyeX{N;#>+xy^>y7{>3{*Swy-hDYp&p6d#o-#U~$7yJ-L0VV$*QP_40+0YJ- zYGB0KB>xvypm;i}+1TvFf3L3+F7rr<^!P`RlA^D`TT{hv^C6M;#E?^wCz(TXxQ#bH z1_e0BM^r99JCR8PwbiBm*Va03%O#WEWv|;2UW#>F97Nw)Ljs2a;Y>f*jPvvJimFLR3&^z1rpWp z;D3b^r9caxiDUIEgHy3$B_>E*K9gtd|{q12$$>-Ha`q{srz}4%u zXV3dbeEn8}6wakTSH2EIiK}yo@Z6Bh<==U6>wMCD?WHZ}#ZUXRI+X!0OeUDH!i;oJ zzgqsyXiC_pTW3DqVeJDQw+SAjVp9^;_9ueHq~4sO#(Bf7dgX7Eh4ZThMb7bn>%%R- z&`e=A{Rffzqr|z|&z{f2y8WC3o#+k@G>G{sUglO;fAzNw21dm;}&?2TF5H4pIaNgZ%Jt8aw!*meFoEEo6P1Lc)MD zW7hFBEbYeyIG8ukKO5%&Xj03LQ(@$%nY(79ZJ66G1M+mMu@KzBNx|utVk-W#p`hS| zhaz~%c>!r7K+~VbI|V%tcEaDIZ`YkfY^2XEC8mQpiK5VC2-z1K4nDa6d-`|s%V~3| zMYPXQDn`3`I-Ganrg}4r6g#K)mpAk%kfp&_5@ec=Z#n1SB_#t1HS7yM9Z;Nv1{S0P z)=-KfLRog4lN`!+%#_Zg%jFJXA-U6RDd-YktAQ|5#!wWrh*K!qX-ns+p(1apw}SrO z#;YzWnl&SkJ7gUT5O{Z2GejD1{0!!vmL%j5u2J16#!Dn2)|meRmkoH^rvZ5Ksl5=$cnRzBs~hNqpqG}*uoLdpDj!LR4CLi+zfd}zA=+=YMF$`zLk6e~;es1MMM{`hZ~1u=08s;wfkh`yV7I(dBLL*n zs>km?B8tKZxdXfX;45I*mi)csSz(ykMmWXwD!56c55AoDyC0UH4?WcNpU{Kx`QM8m zj?h$9QB?D@WLIH-iWUjPPCL1|8t!~k2pRpsDHpkx7}11bqvqW3G}#J$r>Y4=PT3{X z2|$qZ!;1QzNVXu#-5wlsYoLGG)vYX=@=k{>jX0Z%-VMhsxMHHe!lLkKMo{Awae{p2;UyGnYOfJMz$l)kE zd9|n+o)Z{Kk|c_7Ix}fR!aNP>0Un|+%JqDis_v_RM2hq-mNtFqPN|%3 zTI&4SbfeKuisM|IV5&0rAb4%C!MMa`I<0Ic0EAOk9WX_>58l*-H^C#gCLIx?0FympDM1k`drd9#rkMb%j8nx)qb&Sfm!Rb zWe+J$DnKk$`udA7mIUe9%Wbud9!t804(@86N-8t6=^Ga4dd{q7Zr1E;YF$(S9v5jb zH=`UmDXz22nVu2ak&#ELCAG(&{Zt2g@%ooKIXRyQgn>@qC-2jpEy<|H9anaoNLi5X z`8KplTw|MxBEDE$eJHVC+q<5`n{}4cL^5T}(bLfAfFC=0+=-nrHg}5U7P!CsiwjA*o7^(SX?RfYKddRe4 zq5n?&M!|9M=0*@2YGc5)ZOuuuUa>cS^H(F9hF) zXjXFieo|EspBT%d`>#RQ`Cb0y8guQrh?Lrz+w#d-%s+-|BhE|uXp*-Td|LPRk|pgs z##xji6(r({^T(4>)no1@Cf|q6)9{>j&tJ_u{t(2}1#{qk`u2_LNEwReKaYCylkL%+ zz>Ks9YDB42w1T+&Ms-!~ALM`kfN6%)iRKr+yR4}mOAWt1whNe{9E6>;lzluBPnwPX z0h%;v>q4EsbEkftkQwtD;+UL#Gf&Ds3%*lfp1K%zfzn@=7+GC>y!q^qPIay{nl+oK zH#{kpqU^AUCaTJg0}PE@8vrt&PLY(%R;$}UpzQCSpk=QTfeg|Ld{sMa5jS7ujjg96_d z#AfRGhd&{8e$)SzrQ`34o;ejaT!(T={FH$ZRE2w1`#Ucmb3f62A2lKTTar;>uha8X ztBGBOv;T*Ll-hxYTIz62kbXXD>&rmZGDp*Ka%>8Z}igq$C_QV=>srFwDN1?wfbWJu9}rOkffND*=I98K<(F%;KA zc?ex-DYk>DdgZGXT^>Vo<>r9RyZgSgF3uf7+mE$)Ei4xfre59=iIqgYy(##qzU7a} z!CxdV<7{_7IO{@)dUn<93GkIe5h5ELIr@46evIYO-; z|Gg!C(pPv+RpQ1u^K`a4E76_rg@S&@ekoa3-!SuYQ}wp%d&$qOha&N`!0e^|#FdPD z#y)-@n;nIjW&ilRa_`ieJm`ktCjzaQo*BmOd5*STX}2{Ty<6XD0dSc=hyVuFw?^LGxot- zgF4O0F_)FadXr(Zp@utB+`1l}>$`d1UnIY8d9)g6{3F=aQ4`H_69z>DgeAmixz-+7 z^zsP$MsXYDsb}|{nai8jbzt7=fV_%xl zOPWWmw%i_8R(=|pVh)u~#W^VodmrvS(EP=Ky3Bf5#L54hTS|&yIhWM*6yNWx`q4$n zxo2vY4sc89*|xd!(Lk&>!u}Jx!-bZPdJ}?XM zxjZy~X>92j91bdGee=X#8)qb6VP$QU@ohDrtJ^O-2{R7=6rA5H{;IPg_e1YJwwp(m zKSInuu*oor-_tl05-8rPv2!d=9l7Nkgj@PN>F6w4asP_h?`xgj^yX})@#ArJNPl~s zBCjon_izWC)C~r%zZFZP`ib0^L_H*L-x=hH3Pdez~a#NLqhj_3dkchS+a%!9(C z@VZ{2ug0hvb>7o|fj5r(ox%K+1o=Ib6EyD1=EP6SpG8FDz2{Tl!H zMTi0tW19Z{`x({225pdcs(kx=lh^C5gGIr7#|k~Jh?5;K>DhfVXwq;IGaWS7l)Yhj zY^ywt_owzP%kH+nS9{7Yu7zBc|FCqAyxM^Djk{Onrf%4F&J!l=!+#_9TUh?^W>r!f zwlO7RIHlOfVJ#RMAdC)h$EfW6?Sk3a&A)gjP{pjYxqx=Z4&zNRmJ{|}g8{Iw05tKD8=*zqu^H@}#mL_W<)v+j59mvf>aB*rM~3)6c2 zVFX=$Qd6AJMM3yEMKpY+TVVWmV%e$Zt$%=M*{}6z*LHsMA7k|5MXY0JSs#I60)(T! z0t~@VeKU}!=$#L_^psrF@Br6raoU-+um>(OvGwd7z#I7&u+h-iWeO*vLO+7%iT~mv8Iayvqk%A+?6wytS&$idzNdwW8 zVUV3M=!zZh2LsH9b8N68vZpr$8c{C>JUR~P>i70am*?v9j-TBy0_b|L`cW$U04@ZW zI08hsyH8GA@@G)GyJ0+eaqH};xS z$PnY@nODs_v8Uus?K~CFC@rmvXWU?SMfI-4`Z<18IipJrYFmZ^fV|qq6b+EY8grFO zZ?54IAb$*_CJw^AaW`iMg_7B+XmX92PlfHUTE`l6%Mk!_Tl5z(7=S=3;h zG|jn*zjZePp<^LNBaJ>TNcw`2BAlYY+tuT2TwEtbPzUs728w2SN5>PbNx=L-}<%UeGE~VXET%x4- z($aY?7(+UynNz^beGGsEio9e*_Nvl)xqok_X9Tzw2A8fo*79ir$f9sTx{6x@IbViS zdNy=D;V4f%Ksr~?U~LY-WX*+H5xTy7KzD@()H$^hCq1n7|XC( ztacuK@BtZU`Z{1}*FVY}4Rk#2 z*gtAhFq(^vxvM6m-Dx&pb5AeM9t9j1&qgfZ76RZojfy8QR}cQHp^che-4=?xgH%5mt6JVh@=Po@rg)#?uJ3LLha-g^Z*YBZ40V^*=m) zm8$C>;Qg32G=$wNnR2SUX2P)nyL#l*i#<(Oc1Bv-(>Z?Lfkm#qF|`4lYdrc`1XvV# z$}*;datf7-XFf!%WorLUypkPEPkLR9LVPwE*Fs^XGtEB0Ag`D70Z<2NLgxDZY?@2#MVWbUNo)NAmbVW^lK{KlE=yHFvATK=>7Y}!$1M?RSlwq0%X zW*RQPT9gH>WDh#brwuUyecW%~zVo~oj_4EO50<1jle=_?q!$+zM@{@iPg?cgQK$?U zNe$5sSU`E)grX;*I;QTx@?2SSj!@yub9@C28hPIGrrFSJIO=q;OLfFb1JAD&H=)-1 zIhhwnz4#AkiEJvX{cmYV>9eF|=r7X3n$SQLK?!S!ESc{TJeKHY_bL||CyHe;VRXcn zW|?3Nj|=#rA_J9gP7n`D{{gmq^1g1WuWTkRXa!VCd{qaV*P-lCfQkW8HrI z-@B0edwZW&5|Jf7Q8sH853e?vsN3FsoL#3J-EZD^HYf8tspc#H7hN&m;I#LSU%@8I z^p4tho`+s8Re%RnM%?^VYDHTSTN@SzE{H4PTrWYzU;HvRz9mYTwZgxh*7x1imWyCh=OfEkxG-ifg6dp;QrTn$ z`V2chdN#j`r0S2j3%*!w>1C|R#b3LlUTwl}D2by*@+FCX7&NnX{G7csB&S6i+Fh3Q zejT#<9oBx)ZJ_q4Q}L~+%l(2*`rr$aRcLnEJGVYuD?Lb^BwQBb9e5C)BW-j+C2cwy z$`g^0lrJ*&aj^7nv+E&}EjA;2VUo&6C-CYP88myl=;ueqmg1kzU!AS%-xxa{q}u2* zM?{T^?aoGL!}6RCLp3-<%lm738vhIXZ>A!HzZRJ`Q+D9;dvHX7yE$6A>)^;8ISXGH zbril)>-1=Cby=HmMEr5t{lLd+zD3jStnGK5%CKaH-{gH$<8G7}jAPfP?r}+zs*kl` zZ~%BCODp1{_lCa02Q+`y=`h`RDR;0-18L99eU&loZA!@7O=EcTXqV5X3Hh{Z`pT?w zV;g*R)A9am+!Xf=wzT{}n~@LtH_;$1mvps(EF&9iZ@zeweMzrD!@Q*9!iEf zH;Uu^Zg&*%^}J8qx}LI(3&T&8Cao6sWAO)1{6030{QPc;oQ_>^sF18|9vyn@V()lA zi5Y2E&`Pg6eKoVqDZ|%%tIy@Bpn}6j>Ar$yuXnB@k13D776X}eRXn#)dFM%sOknJS z-{CveAsydd)AMZe=R&{#7|*Otd~xi2)@c*n{ij3PyFth*{rhZv==Qwv)LQlK6G<<X6Q06?Fu^r%^?r+k@*3@$jUrPnXL?_93Djw@Ti) zfX_trL#_sHbdnogCK=!4*hR(Uw$$stntUfsG!k*3rKgPBdw%X6xvKF4`ve<^(zEOUwzv73HmT;am^qm!~)<2oB9zj={% z$oFd`$3;xY0+zI;@b$SG2plyDhADpBs8V1l`dB@f)veJnbs}MY%hG&i<6;w98PD4j zL7*;6xo){hX!GM4k{zl2bLXfCjWWg8oImBg{X+Qahx$u>?iPiu6^P3F&aehb(u5$9 zf`j|?(U~cz2PM*V>*qfJ)o+V=@2tNnwleQdMKH?9+o_4}8@a4uKmJHV)>>l3n`#R! z6|i{kLv)9p&D^O=R4!7K>z>@7CxNd)XUq(`Xqn_>p*sIX$x`sLC_FekEvMBf+I+%V zLsR{{(%(#wxBsAC!~u8r2UEG!m!?wZMrKa>iSc#^{GmU6M65MW{+YISxubF4yWH(+ zggN^3DIpYu9mwSFjaaB{meYD(Jd-#gI-8r40IiHHG|NQxmZCNhPOn+#n z+U(Cuia>KlKXMQ;-gGYm&pB9c`aS@lWZ%8Y^H`Qe1s)x=Dvy(E1uVt195P1@rTblK z8Y>f1mZh|zlqL&x4-hj8cM2I!AXzxA1X(tg^w^n}p@gz(r@$v{ekUeP^LHi6e<{0p#d{6ydv95#u+* zQ!xx`JG|$nQwjzFi$J1E#y?;qw~vk@HTzzDarC%Kb;PajT6&X0=*OA`rxTk;lveYW z1$lNJzq{Y^ZDVM!|4xvH$XQ`}YBfqKcvJ!H*15tr`SmTufuzck$)83Fz_e_v*T68ZW<}Nsy7;QP`r=2vgQ4GYNlPqT_z-pM?&0USf zPMR$vP%$3MW#*nRmxIPo2`GBMpczU~rrh zmW|FnJ+ug%s4gUu0tZXy9I1um$$|UEr#TgsJTU{dhxb}N(Yts9g+5b&L{Ligrno<# zf{LWcWegZV<+V^N>}m9ae8H+F5k?@b1=xU^7MNcybIs6~nPy9u3`T`%It{1W!Jbll z!^dm!XO`1^Is!28S~!B>H_mljK)eL7DQ;lbQoCibUQ6htZi;Q<<;Gnjnh3m%j8dcq zWHNfPNJUmhgirS@z%zp4!v^P5q=0z#>c29aId~h;w+^KF24Im?ufdt=Er8GuMWY)R-0f&JXmMW<=S7G1PwT zYV%x|xW>8ZP{NIylsb@A)19WEoeIW50a(o%fVGzuwb2J^fK!(}Rg)2khei!Dxf&UH zTtqnad^L6Ar{y!bsV)E^K;MSWpRe?Gb%@p1)R~CtOoILPwG@S#1PxfUmf-?N6bEiS zID5KH5Jw1F1YjxgZgmiUg0jDX;%g8R&f7RMcXd{XeGG3Zu{hPD$e~KHBjrgHriiPwhplo?-eO!7OrjgQY)YxEU1)E zvk-~smY^Kter0SFJqQM);qB-kVntkkD;O+y-sEv-xTF!3N^}n%q{Z#Fn$ETKg*pqj zmcR-);U{o(PV=#dFZ*k|F5kmlr2zlPsxm^HiQ_bDmKq_VM8UisB z9V=;3tFz9+>TUp)?>Z^w&(x#YPVMI1UW$-H3Hip^F*%CzNjDj8;O153SgUHH!Sf4f zCR`!nj19~e`h?=6K`q6>^L0Aa;PdGQG^k)9#YqPRLQp;uOoiLZp!`ay=i}HtO`C#; z*?HF6X5%-H%b-&}OF9sRvI=eo#}#^gh0Y0aDlQ7dgtKy< z6ch&!r6A$!Q?vQmz(yj*PrDtV4x&0fXMahdL}_aG`vO>n{%k{~d3sHE2ooq0Gw`5` zg24{iNvjL;n7-Afs*I5n_3D&ubI7R*Dmp2an%viJRn#SM(QRu_2HOLiealW@syd=5 z@o7YUbrbL4CN>Snx)jdj&*R9a!Vwv(+QAQE&|}|}yHAD|DYX?(T@mZ=Pp*=&L5qr4dw z{_KUmz94r>iji%-d1gq%%wp4m0bQiOd0JJ91`3-t)AU$IM{`#Bsv~`v!|BT@nn9j` z^uM%#68y5+3%2ugZBmcp8iN?^) zE>7Fe>a(^)BN|k4+Z}^Zzp>ObVlD*bdLX7^rS~+p$Mbo8Vb-wYhrsLR4%}r9$=@}9 zSz2H#zIxtdxr`0zMyyzWh`L$w^7#D&$aSaRXX*Pw$*g(UMqVL*RhRS>3S{Dr!5T5l zNM%pA0$gJ|-1d2y7{|PatF-p+lBDsU^W)2{Gt_^I&Gw5BpmU7*w8De_Xz4hgfR3^G*It}{*UaT#i$$&G zO6UATR`}<2yFcrUWqs~xR~M?<=&8PN& z2%{4(4N|$YWh=QyTiV7O!PGQu~<_QZKBp-W-)MW%bAwX(+G| zdPC?H&6Qt&*KFX-jKPmayKDi$xV7(A`#U7m` zB3`mbQ;1ifkSJfBgm>&bYRy))Bp!{EV_Lg-JjZZ}PeD2`7M=7O3VnJ?w zVhQQJmc{Fx!0HImym;qR>PeNpDWv3N*F@I+cDR4~K&c~_7ZE`0kNN6qmQiiaUEx~G z8hvsi*|_GNP`CJV#H6v0@A3m@Rol4P#ugJ*&7CJvx952O!yjHL{L)%7>*7HXv^MN( z2v@w&ghSnublaX?eT5p8{aSpJ$KNKQA~5p^Tcwz~c~EnBD|KMmKF6c=0WRCOSKH); zX1!kN5FLWf!S3>O@^`f2@_{sb0tyCeAeC{ z@5D1qezo`6h8jCWELFHc;)cz-M^QAhY29{j7|shTE4VEcp0kvN39}q=&iF_3Pf*jc zm&3PiR9sJY_vfn+CR$fkJrMWzn+*^EyOfHa{|?b`%cicty|l-)W!5A19;SWc)jVtn z$#SR&O1^a8VPl@3J|8yHbqP>BdS#>zliQ-sGU+@v%shc%J$s>w>6Kw*KFf zas#oFV+k%V5aWxVhTq{cH#1pG!xa_-F-otJe)tj?o7eJyCSYp4&rI(_OH|K|UyVtz znKDq7>ydzkrtw4RpF?y4H<*7ocumV3va+p7EvzY`bO>xRYG3~gO01H4D`KkOY%eg2 zV-Hy5n0~$84(4XSMbZoP3ipvjkcDNZbYYEOl_Gw{Ej5!b0&eqr+S)&>8SK&Q9opBu^VmRPy~1^xtbk$v6dM{?b@)z$23 ztZ(DTnT4t(?s#bBmnTmZ@gZw(Tnn-nZ7=ak=5hPSN+D()^5ovP)D@1{3iCco`V3iH zs-Bw-x$8V(UG0}6_KNTDOJko8&R~%U|EP#p0xK;t3F(5+Ff}qB=1*X+pFI`?+{@LW zjucQGio}Ep4_8_QuKG<0)C+;VrxW;_{7s~2a1;ff+J=e2H*A2}b!JPg5Jfd6{wLWo z+S!iI{*P#u^1-aSK~};hN4i~c~?QGTRPMAi1%ro zJT5d*(NZA%PoCVVd;ozEebwHNm8}b6)l94LpT2yRv!erCPmqcN&)@`-T6qVg!WWr5 zFvkA_0YU!0jNoMfoSgm%2qF<2>q^NVawEo2F*-mzA%mULfEyHFi9iWBCv>DlZ{K7F z_z4I$jPZi6tX(C0zf;LkXtvK+3~%t>=3@ca&Nn`)ji6<9-(+6VEgd6btD(8YSm|Y` z@tWuu*Ea>N7~R8tlx38ZZYtTXD8^E$Ix+*<*H*M|VXglFM1P7;{*OAa>^gqC{Sp2v zwmaKzO*j7ly>6uT0v4SA0Is+1ywgKsH)`wR1_-2L1IU|r@wZPzlw6-s2{Y!nPZAG@#E2*8kWt528;pR0FpQ6(A zExwDa{j610PZ4zkrkcCLkbS1=_(2~s2_B29`%~-V(J@g|P|>oYvZOi94X# zL%!>uE@>%jg5=*86yv^q9ICt6Z&5=FpG#M4sdyRi^}U4p0$Y!~h0QNks@pw$lvhew zDQe^UQOGcH<~tGUHeHvdJ+@ZKcZv?9qoi#Vt_?F&2QN03FQAYobCZMBz5#!_3Urm3ov z?8OsHiS_gzt8ovp-m!ck=7yRxjOcYsbq~95#dS+0WA`(XIOQ&p%-vw2qPmS)pk$O+Lme_pTAL5hKcE}vO^$g$PQ~54iC&M zvu4{C;`uhihjhNB!NaV*4{*A5l}AjnYFMjbbc}S4bG$sWIl%)xypp>A0HLlO5mQAC z#-f^YRL4DroVx=_0E3V`!qQZJy>GUAxA`lh^{>5Dcwzc{wXQTa_54aW3}zPfuY>Wf_qYNw)(NZj^D z*26Pi_c`tjXanX#wf_Lnr&bygrE?x5H0QMUvLfRPx5iM>;?Rk?V{r zl%kckLWG;7j2@pLJke<*IRSLK-(&q%OLV8AG0{oy0p1-$B|Z@?87(BYAm9_Y!NJ{S zy1S(=T_<#9zVION|lR(1%@yL?C4fjra8NFXDbT>Hbs43&Cj7rGm57ZiX&IUIa zKUK~yloMO4s;KIk8&OXy;dtyE*A|?8LiU@hC~XxMi$KI~sSbvgG36UFN6-c5PtpR! zZJluH$eX4MoI+rGc#Zg8KiPNr%a;ykDN{Of;ZcpFl<7K<&~dlkx<^iXD7|$LO~rb) z)mvXrBOd0&=^iB1(m`n&F`SP-C5^CJr@h_iE!27iMP#jsh2Lel(L79CAjS;~;KudvLKH(RvoUqO0PD zvPM+XPS-jLh`|B)VwXOg+Cm(AZ_FZ1d>=Cb^ zWS6_lkybop#Z4G2jQM2!ufZv1j8(P~!zn%wKe?yNVvBr{!rl8z_I+^Zil}^PTUT$W z$cCw`)0Y9e9NqAH^SJpCFoYar=PO9bNm?Rtadg7tx+9UC1ZRFWL{3QqAutGM18iXK zgO2={C@qVHW-S8%QX(lV}h${GpN z76XrROU^lNJe4=->wc$?sP9y_Dv|H^HpeV-O6}%*OUuT4xa-b63g%LpQg?K8xIwh5 zvck96ZGw1eDQx{iQf|<PRH!zA0oQ1vtMWZO=0$#Ez;>9hd~#PWvX<|BA_@NU;~}W4mkslH6NuasXB-B zkFB`d-q~p)Y>s4&Icu~+*h`0)B%B`O2vcg+-vHqkTvsL2eS!4sdp`4Y!2Z-j{{RZ& zKGS-3m!-PKy4686)6&8tG07{MTtlO4jz|DSKSvg{o;xuQD z$8dq~w<%bhSF&SaZ(iUAqO{{R#; zW4_~py)SW~_FvPt`W~37v9@Z;j}4wPm}CtvIBuy6vI#z1XR^;-`V*&mbK3Qq+f_&^ zELVt})sJFqv)_%lkjZtwdCOrVI>U*Kgo5@wdiU~ceV>{mV%T= zY_FD{Na6&LBQDb*$vOSkpQ^X(zJ;^bdsMP?wSta2d@rZ*>m-P{kleVQN#9FA9bC?;h#+RNoG&L{g%9(QLN6h-4Ki+{6`i~u`~^0IRDWt!3L`rB#u3VE#+)bFWfB+L><+{Y%^ zIpNWgJhFwG@Hd70oC`?Od!QN#80@;QS=uf19^E3h)6mmLZ#N1cXAM}KikjU?SxOx^q=m5!Eqso7z!=q~xX;Nyb#PC%`8XkueYr$h zbnY-$spskrhqiTGJp?*_oWfknXUJe-j7ab_wC8en0K1%(#J#I@i+WeAD`+Vi?{afn zQBSDkh~1xu*916y0#VCuhb(lgsrGr&^7VIA(b^($jgk`ir2{@3P2I=m*m{t?6I%ze z-jS$^!EvRuvZc*vcf3=0?-}69A!*Z|cO%bWu-~H9G;Zn(pVYc>sL?1L&ovIZ;ul#^~33aQ1&q(v_6A3ob>Xw3dj=wFqPb zI0W+2GDpa+Rw6FWGw|+kJ1sTetFO0GS7O^4zk|)8qhpXldKlbwJ*+Ql z2B%@U0DAf_N%gIk-)HvW(RI{R(ZcJ4q-^Yspf&CQjYN5n{r*YcY+YGn>53cWiW(=r z>3gJm=awxXFu9%^3y*!9!1?z_yxme7#Fg7A{jAV*&q;NsMpwSeMHR31?y7C zK+ARx#;)s-`$f3gFMVHGThnx&?QDBv@SzYkAkrAn?}fV!#(t~6`$v8{&)IDG-PJB> zK6->h`KdO>_+O-5+yRdk%GZ4G=*RL=8B$O2{{SYEh46V?QBLY-RJI9CFgP-X9RU9T zdxX>!^3=@8p^frN^M)~vE_08N1C{F@kL!vX&stsjEtZI&prmZkM&j*4Z4c7$=3^V= zo=*ontgo^wEeB0py887jB1YL~o|X*m=0_fAB$g?u zDkG9V>lpZ)3pUQ+jg%J+BPR>iKFxaJ{d;BVH&xKn(%dQG5xB#gJ|{K$0nYgZKkxNk zQIKF90m8URyG)6}C1`AS*%mq6qXTiuB0X}bgb^7;Pns|`^Fv~I`k-NK4*5&RZIUsA zx=}xRLloR+d?N!Sc1atLRH2c&2AGrII7(<5QDYg|7~>;k0uLW@KEVJoH^%5=eb6w6 zJMxD=;E(EyvH&5mIY5!yC=fD#BnKSsf`D_4^OP8O^6Y{7px-qhc8K0*{T^ydxq_jD zfB9yAisSb&i-lkP_6P z*GId<>Pu_8`0XExrab5FR-HQS7rGY?MDhOsv=zs)8sO>uYBOi69PEEJ#~+~4$3|Ff64FLf)rkaex9ng zoA}R_sM?sLo9k-u-Qz2W;HG-r1?81NKGwYOzN5C&(q2IEL8H! z+2v`K=ME$7EswMC4^8@MSo@1K*3XRnvarg!F9lmdHA;W!ANQuD58vZ|-if+_*(~Qu z!P(Qn96i`0TfX$$^%8R9_oqL5CkRMJ2^=VBq|sYaG=sU@$x~GxPJXKHsDjd{>VO#m zX#_;tMMZmySU}-tDu~I-&{rI=;4I}^z9I-+5k@j$cxFp9&IIkKER{sA6vSuoTKZ#~ zO!ymR+|A8EyinpqQJJ<3GZpPWfo->NT;=Yq-ySlNPDW zmz~bVtC~vZ`vq_-tbr4U4bhAE zyVg1o)2IRblGR31#?&1!hvfD@Nm=MD_W0@GY;BAT=>rKjn}Z^%WDyqpSwBVQ8@IGe z?GuDdt#kWlgO4S1XzI%P*y-wBB!Xf$aRlSde6+nABKqYsp=4bnxcj>uGu}upcO`O9 zY)~+3APkY&X)Qfa=d`+ajPM2)Bid!{NYphZVMn>67N#i@J zdtDdmn~cnlE(dYu7S6|UsFG0E0%O&J&fqVc#MU;pFpocXX8>g+I8Igii*=WUjAsd_>gAk`Zh(oXpqUW3==gWTiSkvO;H z<2@+jBWhaKkBE{7q3)Qq$YHFS7Pm40L$>2}I@2R9okt{2#+OEL)NFHR>RN|s4RfQ% z%!T*I9T}^sk+*FuCsV)#{S!4*lF>4b4Ma9iiP%=s(>Qelgr&M#(I7sAsQ1~MB~X=z zEQ}C+2vQ=x`9~0|rSOQ*@&*UuqxBR`7l;`iJ{Dw@^qQR&2CS2>P(MW$@=I%GmD%G% zJE{UUu_dZZkBRasDyI0g4|9KUfm=w^8<`Ui*=c$Cs%YgnpCfW~q=rO<68R>Rx56@` z%tgI!c7`(rzL zuWLx%Jw0S-?MgUau9NMD?*9PT=hXeI#dRSfl0}4e`z_Z~oKi@!ECXzeg1uODc@iVk zUrA~ZWcrtel!AYwC7Po|e{{Y$P0Z|LGEAsH{4~ePhvRSLKQRF3(f)3sON?wr0 zWE|&o#>718z&ObBP0rv53>zZ{6zYI+En11uLdWGidyF0X>Y0~Y35VI$@KSgN}3a;J>ji-@?X%EX~ z+a8W4$ph+_zA%tC34MaGhrY>UWRdeq{JfPAFY`(R9!Vo~rr?Yq4HvVPc%5@)9Dhg$ z@GI3Zx8c;ht?bwn*LGk(>xusWRm;_J{{YSNzYEUS{mAdqeXR2zwYM2MrnKW2em@0^ zglJ)T?6tnsB-Pb5F3Plarm1AE`t+-|j|v*;x!2 z$wibAcT`9S+~s++C*+6?jsj4?90Wsz07KMllc?wX6M*fW5^=u>0I|3@ z!UTYJ$`~hZ5GNdjF$7L~AWq{0ZV{e#*diwg0D<^;C;@;;`_OM5K?CFl_(K{7bL5MC zd+rjuak@@-NMI)<4#gJu&e=*i+soA?oCA~yFmgUf5Jq`LpDg*Haxu>c7!Lb=$PZLS z*dH`)c5(^?D07SqCu7*|nj3MH?0o0ynggbL5$S<{>Ti6iW~v)@Byb~V$bQKBV4t8` zAJP}89W7-yPSZaS#02$NJh=UapO-&Sx4y?M46<|u9FjCPYNndGPxrY009Ommy-9U_ z>!@y57r38#sC13V{oLWB=l~0fALC|i^%JsR;bKe6E`6KcD=d9qLsM_1lD0>a3#pA_J?CFaNHgT2kN=k=-)vEw+qF4+8sPB zWKohgXmKRt=cFO}Kws{Z_sUCMHB9u>UhXC$Czkk*E^yqAK-0&njMqHMG2yQ!nCcj= zT%)A)pGnemHI}GaVX3%O$??A~V3JZeXvqx&bKkn))N)q!N45HQU8$c>S2cS~wC@-( zHGq64K22!(^0&XE-TLKQQF6A{&n-nXF}7IUD~pU|oM02!`FbY(uymbYP9r@VYFz+#y9!4MvB1lQoc({AUcy-SDRc`h&ufX5 z_MOq^qxzB5alO(|%+DH{NAssREk2t$&8-&)|~@?$W$kG9$5pW0p3vK)vT6igmX@Y?Ks z?mv3l{*9N2%_Y{%_W>x7RmKnR0s~$5VZVB;{UADKrVHabhME^XilQdRQ09#IayMXI zny;uXuv@LsnP-{7zX-@+ z?&o;{=Di2keIL?x4u!f_I?Y5UhLo~7G~vclG_d4%E+KE1DuYS+FvW^eO`Px8=U8;t zNKxD*yZG(6&md@gaO(mf1^^?C%d_$dZP(hTRb6_DZ}Lh9O>GYX2%AP^bbxnu#EhKz zU@K2xT^nnxv&nqAQpHzLW-&n7TdA>zfs=!_NzVR>&aL**C9daNZLwM5ce+UU1kOZ+aE%+KcjKaN!-Vk zaX*|ldM(UXNobyYw%}}BbG{Ld!~L5(k`rd z)YSg~^xRXQr3n6))920#k@&`&v3x(IjYt0TKjQF#`+JyfA`n{k1NfwLP z$3R}J{Yv|__LR}G7@Zt3x$SeF=WU;aoq*5Y6%XkqG1hkD*xSed08#5jx8C|pUgwMI zIR>0;y0_@{W)=Nv`-9p{R@e)H#@-|H*8UpL(Q>woo!6&5fZ7G8p&f9j!z8bj)0Z8w z8-5n&(`P&U<+h?*VE+InSR->YUe~TSnEj^NDy??gl}$C6GD2Xck?nJw?8pHF8?ZEe z>rMJV*@e%cn{kD?n%ygA2OIcq_*_0)wa5Fass7#VSw0n-x$Vxx$ibDj>09jwv_6ol zk+koMo_`jOcwXS*+>Q734hQPF9_VdtRUK)@c9ZPq{{W+1=T#lr$t#Aap4zxan_M)! z4?shI(op&br41Lid&>(kO>7cW!?wUmJ^}uWj{g8fV*Q=gP0{|;DQW9mS)!%Z>Yl)d z9U1v*((jO7nVO!8*;{hHNrpZ2%xv%e#9G`B`tJLJtgmF9c|<`eMPGx8^_$}AuW$C7 zOy37ygOAWW{mZv|WwLcm&6e8kjjpb5hSxHBdP>6%uy9)O z@c?nS^V}mOcFHU8I7@V7%@;>lZm{%h)^4$?hT`|@hs11-kiHiTVa{*_o!m3!g@gSY zV0A2gO-mump{kBIA2QuzKZ1j1=uW9UJymq-&au7PJOJqoVzKg;#?g}J5d3GIf|2?% zJtB&be95h!4MI9?9b79dN z^yw@I2Ow{e-E?2lUJ&k#w@Ml{HsIFh$QY#0;sW8_e(fDy)I+$qR3H9pmwf#qnjP%= zH-8OmNBvii=CqPZP@)rVGO@n5{lDn-3%uwk9saaMVZTQ4j=8TN{;q%j09G~9I(Cje zvi2WEZl{^7e6$Uw4?BiS768wtrVpZl?1$O)XGdLXt8X8<@m|LBUX3rSCnPOf5CPiX+F<7Yoai020w$~L{b?}S0@ z7|HseC{8%v7)Rd#1RUm*u|!_apUfi3ptO+gcETg(m8=dC7mREV+?9n0BP0{ZM~(jg zGLImgf%}rT+u(QHm~9f)`F2*8IvFlkN-798lCE}BwD}h}H~FgY*9;F0o;g zgW3g>YoyUq(nB$o^G@K#G_{T`$vX|e3S}xyml)ef>VKq-Qz)&SH({g#I%vbC&^rb+ zF@x@NzU1HN*Jh)rlJ9w_g_6}%$jW#No1Y93sl~phAZOFnW&OY2sV^O6M=hqV3i@d1 zSj}|O2^t;ZNJz-TUw}z3> zI=7DQBv172U{!ZJONDDfH4OgG>39XIL>+BVcJhySnu{9YIQY!&glTC zs-SGu42_YH&2kXp1NIp)wC&$MYW{@#EVEuD>WXW z!fD*MB~&Joi;ebjcQk{C0uPZ2`=Pph-BZ;z`!ggF3aJQun9i0prOqIE;in#}pnj2( zHsjQmi-ikcH7!NCz7(1W55wMe$ln3L{X)X@CEBN^I;z=uZ8N5AG=x4j0!!HDmbebt z(&LX%7W>?xYqJfTWlZdKkb61ydDK*P*zEOJ8{=OYYu@7V8{9^c?L;&k!T4HmqkfX} zOGkd`YRXq>sDZM{8@!y?#^8SSKK}sLp3Ukm5%nYO^_92yTGvGxrk#gde$K3o8ys)H z8)pGyJ+$?uudLl@eWEJ%%Sa_`f_hgp5d9dz8U7RZu6QT8Gon?sqqe@)2UB$iM)hSd z0xEiWWx?dOSjL?Ei9dShT@!hVdQ-XmgsaSsf%lIDU*2W;bx09=O6bgs4Dsjjqj3~g;ZzB3;1ek0!_xI2UBN^!*b zOeK+U&h^!P&}>#7va6sy6Aew;8iwL<$iwA(u;x4+1=%?SA2k++{{UTm_UY3y-7Ga$ zN#moQF%?7gI!5S_hYg0=$WBA;i=`@?1KO zAol&x(-Vz!@i9Qk2%4y&n(kK3xGH-i`VjXozmT2$Qx^@pl%~E&*B{F4h{zc1QF_`LQa!KZi=>< z*Sgo*P5Q&u&#+MR+%-~4<_bwm-I>FH+yFZqgTB}+lKXDB-)nlBmAy@FrJ${jk)g5E zOe6(`?jVzsgPiQP7VmGhwD#7=aJA9Z*0H$p+fZX`&zWFh!TBG#a!#nc&D7Vbo2|yO zFMFJffv7YAuxm!0fCCEg!Kcb2B-30oY5F|hqO^7MX{ufs4ayTt98Lg}AvS5j*jWdagde*q$8PhH7ccOJ3kX91wJ_ zw_*0{)E4`DDXXdIE)QdLwxUw@y#D}u0|)1ToRd#KP=CF%xR!h0c@=U=#5M zk_U1=c~ao%c_~d>@O2Ms0nGN1?9xN_z4AsA{&ZjBxo7DfH2X-XKgCB0{0LQ7?`api zolTlb`l@%&XqB_m%kJY=um{@Te2_Ehv;A4r^_^98{b6~TlGXTai&H7XMv(5nOt6;9GZn$dVm9aU~ zj9_O@0V6oZHwc^^HaN{)eooKqi`n%34lfYgtEp-#?hS8-$O- zk_2afbB`oqHx01Q^g;$QakD@kO$aK`MUHmbN+&VQzM)m~-^JUoLqqfSiU3c9 z;?wYubHYd%aB1(`P)~a;4nDO63dM%{H9^g`N2VMJn`zJ z(tI<U%qMy))f5-j$=Nx5F!|uuDe-Cz;UnGlyub zd$G<6$kQ~w*$bHW46t`s{?4B-zg0%}IJCDTC2+v+nvz#!kMcIh8_1TZ>l}jgW2E|Z zuFLAT{`$^!Mq|6wfOii5N{hrK=TXYiH!mh_QPgb~>m{C~%>`J=^K!DkRN5}oUIg`w zYkAqgE;r&5ah=g?__^U;!aSRqEIm5Fbypws)PK~SGEe;TKm0|As&=N5M+u5qFzf@r zqMfhguiWVt{+8+b_qni4UR%x{oR_D1YLUgV&!mpU_)xu?2D-YW9(09O)pYuAH9+n& zkfKeY#yg!N?e@-+)HP1i>#aH|dP*Um6`20=<<)aJvSGeyspKwzoRw-e4m5V_cT#lS zwwJ+zt~STUGOH%M^rW*n=At6va!ywi!90{O2RK@LDVc6-qq7U&ONU@Nhu0ZL`u_l? zLxV^dC!H&e>cexgae%mNNGW?s4|6>T`U_9$<5t)jVknP8}O)$Z74R zSIgA>Dgi#`G5yue>&{=Yucrp1)G{#8 zxsOPn{b8a!e0W;_0BX?bnw{gjN==HX(A=GEZEJ~++|RfsYW<}x|U>>VM(>JKDboDQNENyc(8wJWi+%3PevK%WIb_JnJLlIThazRxj zZKRJ3aRB8eF20^ON_poC}f4AvEg%mpzFzW z$qQp($9-8VgwtJXg?x;rtDTX`_ma^4y!cf2ZlJiuR@!kf!5?Ui!17x^NzIw9(&PIM zQfY8>6HaP+ju$&R+ZTzE-zY~ob^5M+97i57Jo~4qs(sG?062fdA&j&UG2v|Nf^#o+dfV!rDbG>sNCvmLo*kK27MA>qinWW$r*FWcdELeVUp!pOdpubMlrQ1QyJ^a32$Et) zhGT~koswNd2J9Hs8aEcZag2_EFq* zJ7f$p;hf`?jPJiFcR(GI3j?u?o>E*#)f!9qz(}DEK1rtxCmn&2=9`z1f^a<0!3hMH z0C-DoKse<#4hm2_l915o)aNt~=&CSXr&e*YQx0*2%f<;j`J@&$b~_HqiMD3x^YIMf zFKsebZGZEAT8Q+DM{{Zi%{{VO`E&bZ1aSJrf>e>C_`L8=s+25u6TRK(0>@;@5 zw2Pgxt1bI5cUF;omD>Y{vG8_E1ORf7)W4e4LdTLYerYWy2}lsO;DMB(=8?eRD<=pG zH6F}PI_}VR{;}WeIeM9nBA9L2d0W|=gL>-F=eRYdM+~3tIeLrUpkx3U8aCjS=IeQq zJM_P6JiF~F+PbFYk^cZrNBW^=7aNALl>RLk|HoRNpryc`2PUX2sQ0+&xs%UVHPSC#@&zuY$S)q z;y{)!tbsQAh+E9?5B?zk02EpsG40RI5lnmCH+qOa{HRKfcqBMv@SXcSCAk8N9prkX z_5~&LLc@bm06vlenH9AAj~+aaQjN>x99bdUA_<1pKuI1b{{Thb;Fa$X@#5$I0EY9A z!5fgavBENTMtIwl&y5%(;(q>6zx)xtR*$kJBg{bm0PsfS8(8Szq_iCF5Cx@~CSm^o zz<>B5@By)(C;q|T;El+8Sa{#d4d}S^og# zzy8!^vUi3&{{Zg?{{XO!!L%7JMT{NMmb(M?QU3t_LH_{kB$mAA5kvs1SCK{>2^<~M`eFe7)Sr}1{{R%*fG7ILW6_NMVJl%s zL2&;7f{#$=WF86FO7Z?=fBlrE9RvE=Px-O`0QOOADGAm*!kui4Raa9$4)Vy@{_~IK zq8SJzwnyaowln_#g)2}a?LR(a1NkF!LrGceUaXatu7kRG4hbceUx>ieIazQNQ$%y= z87;xt;CIGON0D9b?`Y|7XmkJr0JMuc zgZpgx`0{`DlF5P2Ta%_%Jn9kKE>Y_$NV-eewWd+;5YjdO029oTYnoy>+mrGG3y55O zq*c^=NQbGQg~A9wVI4b;<_+=>_Kr#PIPzTnISVpd;)CDzum1oP46e?>`}Xl2{wYIG zwYM%?3F;H29uey(FP$aVc7abc)OArwhdP#|hRDYb_&b6;$KI0bhe&h{u2$1Jj**As z@F~u@Wj(gt$L4lkO_9Pu@y6GD_egG*@eF_Hg`e`CFM_|CUDqa?ulk~^t2%~jjPSlD zW5R+gXTywV1Lu-S`K-22@H>A*ay5?5Y2e?^Fn^L~!i*gIv>u ztlX{{?N{1Ey27E9ltbO@@H<;t_q0A|ajDzv2VwR3bKOq^14thvrqoW|fp6TV8f6E% z?Ug-4lBB5XUdBD7+WK;edrkIu;G=Y=SZV{q!wCZ|a0fWsAc5Sib=Rr=l~Pu|^550f zmonoh@MF~Hznt%egPrnlyzQ=R=UK`&PdgkO*XJI4r7bd)w_OBv6t>l#g6bb@T`hU& z+l36ZGC^BeMEHzhg~5_Jgkx854|SFHH|+|^(tST&OLg~yG_^h`@EF&PIvP31-(tBd zq?zQB^xkCtBln~EbfV(CgVej+Uv;I@8`oCdE))UAnx=P1!10G*`Hj}=*$1>6XGPho zscy8@(@8x*m8P0DxB;XL9Jp_?u|ze!nFPh_uWz0`qSFwv#5GPuFD0wwiza5Z4$g?pta3+7|-smebBu`&Y9}E z8@#bTrYe18#K7ifQykt%{?g6(e>6NY4}ZN>aVV!1(-gBd_cNe-QR|qx=Azv!G%um| zMo8bzCdFdPu{h?Gg0jqq55Ici*z-XSefHCIb>tZY&+$JugDwce1Yh=m}wpN zU4z;G0JdM$mWVBVK}R)JJv%%&r+|+TG;r57!~=o0ayIOFSmegkQi`-|k1CX#lcLk4 zy6dVsr>^Zrrh-p$r4r2QIySMO{>{w}d!HuwE*-$%jI8(R3so&&Ra?zP6-^u4L^8*| zCmb0cgYdkM#cL<_-_v&bX@5}IszmSK4~{q(PxgyRKZ4?2O?wBDH-B?GEqJaMnd@WdzYxIj?hS zd`AYjWM#T>jDx?(ERc_G0s=6cv8gI#$0LihU3D)|OVn4|i@j`AuvO2byi+~wX(6Cw z0@8D^?zLCHY&}PJvsGJaW4AU6n4Ju-jjs+ZBL@ezN22Gt2A#&}iv~DJ;ZDB=tkOaF zu#t@DT-ozoN z$RpZ~-3PfUt0diT6<2G7wbwZ%s;ie8<#`!)00Xy>0b5!6_o=M3jit3-D=F!kFxZJ? zjcD=#?KmERP-*i-S_&RC_+h?XrayVS+;3Hes_R)(Sx`niNsC-S@*fTW^cyPE;vNA1 z070Mql`ynn7M-|FMJ^DxKO`JIr#J`DwZGtr&33Hm0ZlCh5NI17Q=x7l5bo^!Nd9Ov zxP6up{(Ha0PAo|b0Te4C<>c+Ge57~yrH9HnbMfl;ALgX!1rcZ@CA52(z6 zT_hNmHx@^Lag77XIwN)l%^31%3QT}}JaQ4^%Lt)a95KU(K7gju01OG~!z?HU`KMx6LgE<3AS(1&xup1t(6)-uc@Ih`>M% z5RzM*r;o`Y!w4DEy^j+6Cs9J}z>JK4d5#~+a{9xc1fKA){tKyl6d~02=#Oz0-!SmG zbx6Z0v;P24-{zrtDfl9Rlfsc0(n0Pqx?~I=l6i*%9*Ll6?N=6;(Ek8>A-BLH9;tGUy))sS!LpgnqLj8N z9MZwKY4Texfr>$LoVq747LG*8D0uG#`29=M)2OlM3dc;EQLXbD=yx6sUo{YCj zHAZi&sVW_Is4>GK1o9e6p#4!?#(0LFQV)|(%Xv3j2b_vVpQ>%WYW@uqG4om{T@y|A zj2WP;2PT?f{$WXF6;y|4CCB#)=+wPq9JNtHEgL|P>B#J~*BN4?wwk8E(}AlPT5sUV zrkxyCrrT2Jc7{TKxKv6@ZD)!}rkni&xZ96gZRh3(53r%Ce9_==NxK({+qPd(> zRDYmXNq4jpA1qyUSW|D<9t>e1Eh;@=ba%t(QPN5y2uetIj|L?MBSlIY1SF(ILS=-c zfTYw&>2AOC`@Zj=?VMeE-*dM2oO30||3&es(PUv!}+SBBT6kmDD5U_ZL#B zyNy6*q6++z6@RNA?r~6gAq$Q5D$kPDyhlYCON^ccJxO(+g+z!8B%87wc)pzz>ylkZ zKR?m@lriY;j%m|G4q0Z8OpbhcTX5w+eMX$X8#4H@vM}!z^(syhZ2i4vq}MCWZu=Hx zzmnu}&8gS~v{3X|N8$8GexsA&l6ZZvPh9z5rwxs)pSFx|-bn8qt#6&jB+F42^E+#7 z1{Iwj%r3r1$2MH2HuEQt$(92do!pc~rcr+3*b~ocIl-A9%HOjUXV@|QI*ay`!EOFu zPYbtd(lUOte)3U4n0pLtq(7c}BQvSdS()T!j4S9=f;mqc^>lH~edNSbnl<$uoK(d* zu>k33qj)>@I1gk>FwdPQ&;3UCa$vRCY3&xNQE8mhPM21Z(AMT{kr5Y}Fyz4lRmMx~ z_>qwk%U|MK_^IPmOza*bAY+;f>wo@Z$Mawo6&PgOC0$E|9V(A`Y~bxk?3ul^;kTm7 z>VL#TW~_F}Xfc*kbL@H+U>;PJk%}(>TK>`PuoV(5p?>HzPgZcB>u=qv_dAbn_Ey>3 zu}6Ky9m-eVU*KP!^ZZ^Q@oUgCD=d9$GHdb^r}vq>fQ|RA`=qJFFYqOg8T>`Yru!BT z_hQl?mLsw8r0UZ5PcOt`9+O4pU%R&|n|qas?!S&yoc0}96XWMcxv`A_&2KGRSLHMG zNkOcuru{QsTQIhFGl6;e)EHu;=LF(*6SFUAX1)t(PjgrD%MTZv+qXUO?gIBu&~>h+ zuLnjJzIa?J7X{gF(|OmRaX|c8kWs?qs_-9(1m6EODJR<=@8jm*>e*G^h&;7i#BKr) z!L{TUVR3269Lr&)Q*2Ybew?VVP|`d{L22{%F0$C>?B&p+bfc#pm(q`jL)v8G!?=JMmCGQBN(DiIfHVf}rq2ai8~kp|~)-z{Z}K0DvRLn<@`&VO3HPOJMil;`;t z{|U*O<~C3G|!3IhS76Cbw8G=py8h4Q1sQ5 z{|R@!F@{*AcV$Kk;z6HNT1~seUSn+komKMoVSsn<>_BXUR;^$)zxUqTk^4ogHt%2~ zoYt=f7xgE+=(lW}i0++}ROHES3v}N+%?*)?_?oH~%8pIfcPCBys_{p-yIviV?ne2v z76~TgE-cxjX#M8tyI?xm*i*d+rhQkdcktW5QAVnaJNe5 zIUFV3nfck51oH$_@k~#W`8&?{^PXUPDi$GEHT!=;{&&dh0p~%}MKF3+i*8^{g=>N~a&j zuy#9Yq>2Pl6AR}$8+7hjsfjkEPjB`Fd7@OB-g`gcG1UeCG< zMMT6f`pAIFi)}%^-0FM;J`B@~L!em147N1Hpx(O>mc#mpHSadXZ-jG%uJ|yG1e9Y> z*m2&i3C{ao=s`_wUG-Po&}wH9r7C&26-`v+O9d7@ANgw~+hjW3>$D1;g=UZb z8QCqqth#|7Pj`NWi>+^mVgqTP*KUdLZ_lOM{Zg{o1 z6v?u=%^0xi%`fvYmyPi_pKGTmN7W@bC(FQg+pHaL-_I_!`#hz8sD}}K!XK1%nCwop zJJ|vIbqD@FmCd4X;X#eZuejsv^!Kf`&L8@y+rcmM>#xl@z3|Nznyf<0_GR2V3yvjB zN6neOj8IYOHLE1KezT1Y;Jx0eASGy3yo(t132HpOr!Uo=zH$4aQk~i|`E9Y6j; zdt_5=s3NAriw~)gn^C2if@{^FD>j?~YU%+_UI9v_T~p9yw5>x`Heq~Gxig+yRYHDY z82$_wEUog}hk>?tl}@bbdq2^X8}zoUdz$t}??5f9>p9dM$V#AIsT1+t33&+ZV9mTN zlaI3f5S)M@(>OPU# zsqv-(5-;9@Uf8$yshyu-ysfBd2G9gtk~36zUUYgC2^{gk5!7>&R6Mrqf=Z0kggY+l zUmibVK)4i8VH& z%#cfEAh?m4A18SNl~5x3^HJ=O;0r;0Mv)oLW5B`UiV4r!Rg>5Dw%;z8)8+~3cUx~V zE=0ajF)kg1qRmR?K}7iF?bf|G6`6pNlr|=bH9>842ymnRbdCdzAgC8zMqzte3OjNX z$`4LdBQkIWvQ!}~@)eRgw*3@@#EQ$T&3A%1Qpd^=TH8RqUO%ngzEDTKtO!CG=CYsX zS~M8WTHSs@N?bvTurN9@QHbDtBZdhi(z@XRRK65Y(-jHL&S3US!PTb|k_jp2a0l+=k>qL=JN=5DZralY;G+*eDGec{F3V3yd z){c}J%dcH2l03td++(4v{-?@y>UgW3=m0p{i_wCWq79#d0J`*s#|E%1s~xy!Et`f& zlel7%T%(eq5R?vOI8cIi^tf*jO3q&vGZQ4d1VQBE4(sW`QI9A_GWwFb0r!mOtdzKN z;_7~$2E$%G8qh!m4tnAeiaEN%Ucp!#a4m6;ZIs9z5CzbZRL(1cPC+N6HU+5Wq;-MzkJJcZ&R5Hi^TSl z_yIHIlD(TymN!Lrg2mtww;^iIuj;Yzl`zGeGvy{heS3N;(r<0bWN=T=5jtRj8Ung= zs70aB%t_>eb{p~z$J;UD3V@#iXn!-oGbZP-d5lE<4Ke77W!RUq57v(#nc7?lqPt|0 z03fXhS(h}S@CD{bxBN;F<83lMGd2t)Ul3*MN)bGI$qLl?ST{I^$aKg7gBR`? zn$cKqL)&Z!jmk&=E*y#(uG`ww^?ES{FwCxrk<$E3(-42)K54Yasp2217Q=xNEE2E|p`qfFcP&E2S=97KT*;D+PsXO@4& zxI{V}cdN%h=4CUFIR7{ww>eLD9;zlss*3x&2ow8?)<## zeYRokf5rRTEc{MSTWA_7*0A|rPPKYGs0(bI^7Qt}xR@VZ(Kgqbt=aMddsJ~+RaXNz zfx~Buu9|t%JkOIgE=_0iW1g=!GSK{q+{8;P(#P0Lt$J!!=WSbLgDw22x%rr}Vg5|7 zZc#d`N@;?s+R)519k1kP<3&YoO!NvPC+T(_bOHTCz%x$6OxXE{QNxQ0r@2;3+@c}@ z{ywU2`%j-*-VgHi(jmC)k1qW9f$U_qboY#4y`Dky#*%wha>`hHD>SXu{9_5aB*E5d zKBS=1Ep()E+f`(^fAzK1&i;%vWx7c6Kq$-m353rtwI*woW6s-B zVHwUIi2(lhLR;c84PT2tsO)9s)pMGIq!)@QDY=K8Spw)Ey8PM=HV!n-$RUUx7r>P5 z=qA=1h;Gvba~J!F#RwA{`NL4LQCaO4w0~dDd;c~WonL^yd9W(fK1vT1?Z1SS&suc# z)*GzAW80RfI#d;rtp;QMs%=R)JY|S6D%WDWssPe1nN|<`6Ss|$JuWeoK|@|KDv8Hd z{chXb*;&?;x*{>AISlE4Z>w^GMaf1!MyxF$6t2u;qcBd)e;j9}9U(Y73jtRnT5~!Q z7Sr(-si_#WHPJGvs8TK`)EFYDrk$LSLysd?Y&pj>NeXHu=VZ`+=h8E?Zgid+yow*F}hc8Rw$B|nZ<_MN=xBc91w_T^^6uv00W zqz_+2Hx}2gdu-0K%R(ZE6dHaXe<&ODAwvk<;q2R8zVrcG>JhWO3(X}x!T2~$hg|*H zR!}&17ul}<%ePqGR#}&1EodY<_~1*pOf*pvLEm6nN-hTo=lHqK*asK;+Ham)Ho440 zeIu0>Wu=tUrAhWEN+vUjJ#j-`pCf~lQ*A3|=PG`t;B+x_;z!%`ax*DIBQxxOL5df>4q9j!a9!WOxFHY6uc{A)r)M=<2cUNhVeO_eTbk9Ce) znNZ!&bb5aA`1f81RtRn^ECa$SR6j>1RyM+~4Ft1kdA4ck%4M8$%1qAMgo+O)ZjD^B z3q)OsqI#%*i+o)@RM0O!b362jepi(5@3!9IH)Vfk98uqT1Oswg_N z`utbm_LD@B8GQ2o?_bb>xufI!L&4NkvE8;<|6F2byWW zGeyJXh(H>vayPs-7%DxDeEjv3n^4CA^Q^%Dp#0IkX zV!S~+lFGD{YS#e;X5NuqigSRI@KOL5uX2avPL`h(x8f0D&#ozSC&zWyDaxGOu6sSSzE zY8&0&HtUW_6#nAUeKB7_I4AG)yOQ2Aq>3Yz=eRjU^=Z4Sad04l{%&1dk4B;J*((Ye zCS3VH<#;jF$DBC%hblOG>E$s??2jG{`_4gH=+6|GkW^714-BMtA%aP$74cPu$r@uP z)I<@Xw`ch9UJ`{{+cSw75IG3eB!6OoR~YZiM6Jvj>R^K#MnK?=bDgq#s^A_*DTPQJ zU_a77KNH5x&F# z{0EIXo((x3UVY3GJrf@OB@-f(%W{l7j8XxHtOU6lq%h&Fl5ob25Zc-Ks;JEsQ0D-4 zY}tDI+bB9#T(Ew4R4|~fPfz*))XG@iOCga*K73tF7`xS@v4={%JCU~m*D*2b`eyS8icv}Ffrwyly1+aZ|tZhArmkBjQ0X*Qsqi~e_aUzeDImrbgZ&?Hr3VX@8h-s*))#8JhkB_x+P@?krMr248QwB6B zZqC&}x5l7nQ}3XX`oi|p zAR?(zDtqw}Qi$AIwM}ZYR}aJa8hCDuQP?XD0H_ocMAiK%4Gtq zDeDzjiH~ArZ0%On`T*Cn9~$bf>HdL4#dT!Bc?8~xPgrjNb^h-y_FsKf42SIBoXNvB zg^Lj`)mbaF+!cg(kQ^jayn+%RTm}6{DBTD8MyaB=d57d*7DhfjJTD~s<`*!Eb` zXx3Kf{r$C)`WAG4+;WC;lLq=3t$h0~U1{iEX`vtrX=*VDBj5d6Atr!y9h1;?8 z9qJ0l4|k>6kbj_7YBwxZM&CLr`g<_?oM1OkA!g>e5H2k(X5)g%<0c~W@ssB-K|k!; zB%$0I@b1959|3E_*JF?KWlQ#ic4Vuesy-?$W7e(6TyX40G(Vv9WywVA>_c*Q4Agc8 zf3>R7>m9+t(?BEGPW#6^cNgaTKb7$So1;{92US@Nr4j{*HG#!QCgVbpG~u#&+u0;A zv@W#B{i3p(_aA5#;NmP9yxY+{Kz{fNt+_2>fThvPD`!j1!*fw{Ofbr6nuW7-Q3SDVv3uzPT-1G|{I%##MZTZj3CePr z-jT>#8dztCp#acvD?jpTfoTy~s9t1;XzV`_NEyUc|{j7 z%E0yybU`Fg?s4~8BdV#S^(Gp|?6Vcmkn}FyH~ys@gQCA}J~>lH&hAKom3?RPLj#gK z+H9cb=9uU-)|lj(%eDHii`C0dJg3T{3$IOY#7@Dt&L4aCb_^`2RIJ164gI?JB4htV ziUZcKW4wPC#CI*ZT!$~>?`NNi2>E2~wn|<9Mr?_EEG`cL$F8(4J|(u?*aK&(-2LJ_ zGmv$D;IGr-oV=tqhf*CLQlhu*=gVOwB{G-o6n(3Vy5^|=uKCkQ9sc>*!s1KY*CwjY zT}Z(6iTz`-k7K)iSxDA|#+~X|7B)z*_rPPusVcqk#jPfTKJ)9`i2HB9U$X@uRelja zD7JlBTd%h9e6yBp?#L?Gn4^e$+U;s`T%_CE&C64Up5ISyprVl!H$du+r43h*E%O8eUlw%PKdnvfwE5ZIQxB%I$6ar7!pr93hTZK(PM zEMMv^Yk&LH=Uqd7g38xw<;S@bE_f83ga%-9o0_T+OPS)_JsV%rrP{ndr)jnt26PxUJb*v7wDqMiSPC&5Jr!H{N$R8Z zbuGU-akgIV&T&?F0|CUpnr}ifj!s`rCNVd<_MK?BnOMPZcsH;WPUeUCVvjX2!5@oZ z+JEZ5G}BbF2B(#`ecfImtdP0ljbTWlnpIfA)!|g%k$dP<(W`5306#g{-)K@`7TrLYSNz%SNWNFb+q{RC{z<% z_f^SOcK4h&C%=D;8nF}@TF^p#Hyye8@ZLzpUKqneJW_GOtB#zfBtxC|(T16Qeez<#1%yX%RM14$WrZKY!3O8mOFT*Rqk~k3^&FObm1X}=Ub9b(z5rMI z=B>6}#b#ES*TP42sS%zu2`Os2nzqd!x(x*Z(s1-R_s_C#2-@I$xdAJMrUdwh+UX&#^+wuAgRWYg=OYfp;&HMkmKS(3;k*| z-y2%E6Yn4wt87h39>ntbr`@Mw8BVrTY~vC%P}Si%>y}g$7%E&+qZw}`P~v&_q42e3 zaqGpsz`%$>Q#LSTKSP;r_Hjr(#e0wArhOC`q0T z$ll}#Z^i(;R|OPB)@G zm1`6>>ylf`BZt)?eV2Jy9^pfHj(@q#WI?MYa%%cz`mwXs1~!e;g7CI%CC8bv`Mg`N z(?rydbI#Ld|Dv>hYf)R`4zbN$(&~Nt#HbqIK`n#cBPp~Z!+cS9T(?DP_T_tOnhkzx zgQ`cDJXH<0%WsZk_t$0=N<*HwREgU=MZ{BE->#6sBkVN{W;wbwEMA4Ox?iXTU+TNn z$(-`RdY7xgu%?IqKt_;P^`ld&xh^m(0zQtHd96Rs%~X_kq?W)~;nXF&N24@b36na5 z#Za=+fu@x3iPJjC1P7*cc_%cRm)Hx*BAC~FWq*;-Y}tFZJo(UYO>2YYy6GgLkCH?W zwZw#TqrU*9Y_a65>g34zjkF(jNx~A&HZ4y;qe3d1eb>rfZNLThZUlV(w&Atldh1-? z_C1A}S^voae3yWcohhA(-eS)Ffl@OK&ya@id_LSuq}i))`@Fx|$nY|e7n@Vn9wQ|aD4+v%T*W@u z8$5!RpA*9JMOz_Lppi*{)Dewot}KMCI!4CfZJ05_iE2Eq_iBP4ug!Jc$?>znV^wBM_9T3oZcY2+dlz)=H;~nI8YRf&$&{N&KPumc0-GS$h0)O2g z47oKRSV@yIQhs<@wA)MwlbWHv!L^P~jCn9NA(wWf^y@$)(W*sCdnfcIH9aeV#u=r; z_SPGKE^LhaJo(27Y<_>`eV+ybn(ygz-kX_c@YeJmK#S#K$9nO!((bP#;$ueefvuC3pkSLXu?ygS{f+!SZo_${@*u@JNDM&U2`!V64mAdp3KK8Y7Tw zQV6Sanxwjot#{Ce#L+pz5BGWm(DDd0o^>g6AB%|gbT_EoWgMSK{7Yl^H&F4BI3cm% zqLEM&IbD<-jw;dj{XB8R2xr$uKTZz_WJ6}P**p@=7JRAA$=}CBdNCjmc!9Z6MEO%I z6Aao#aZuAm1=)IA+XbgMasoUhRz$sAZH(mgm@1*<3`MU5l(k+?-!|z_9CBc98nc?JJC$jIeO z#C?wtbT|w1z6yOKD{g;)em=19K9hv%hhN~<;pv?i0>X>($`Wu-NjdWT#eX3xL(H+j z>9cr%^3blqe5c{6sQvMHC!F!^kvw`^L!_|V`)XV^)J8MDAh6!Tv381VAHVsSnFGz! z^lT=W1}&jl9N^rfcP;#vz*gKCwQr;ZKdj(AGn}lU7Qe7P_0dN5rOWTgE6-(iM~}zj z@h3v-0kf7_pEmfu5fnRKEHd4xFS9!}OAFt(gI`bv*c`!~bi02F)$8Mhk&2&K0#LiL z*R9VikZ6eQ-6?9vPbUCUF~2Wj&mA@XfqE(Sm9e1{cchZ$!%8}mmW_GendiQ56Y8Ej z0*l{klyw_72j6l7M(#MfT~wSe!C%=E@kz~vj6K2zeo{p2JTIHYZ;u8*+Z*-RyL-%e zm@Aun$KN#Y4oRBpY>NG^(C;W|hrPJO;ki$mKX&qqP0z}?S?^Ab^82Fs;jb(i7=>OD zKz|qt-TW!pX8A%;J0g%$J3#BvcB&mZa;3xTP^X`RBT^# zsQ%T0p4%+32WxGiJU-54XQEF%?Gwpc7n7}i(12aOsy9M~W6O~^J8ak^SvfIe7WiS( z&f)qjm+p~)?PgwSvWs==KTxjD`kl3aG4?VoHE%oQGMH=zkqJBVnjA+(U?ib)8RDU? zL`Iukdhb1X#`vMXtLwCb#vYVqoN0{+#8W?%k@b+d9!-u6qKW&zbAt1fuqJN$=g}s@efE zdm@0NoH;4WC7(0|Jf?wn>cLZ$Hto|i+%o&lK1JS#)_+ZLn`_qMINvV5(*b_WP@A+o zuSfpAkv3AIIzj_7znEP7%5*e@bELth5dP=h;yZ5b5Vl_)A@TP<{#E~W8SNkOjOy*? z&NKhcj}3D)x3lV)BZI=ClBm#LbT)iXW$I259z`xl@F+oai&5E5b?-l3G)7+itpW++ zXE8c>Y?*>EEVYf$L^TSO;2K}=1&LE2Nd{^J%u%2z@*XcpZ5TzAiH;31laZ(rh(j=j zT!(zj&3=xJP|eJ!D~KVxgvJ zrR-_wa9RXuVYe8ZoJhr7I~hv`h85DS=d1`;%i&D7nLGMB!ua zrYcGNN}gV=Vpn(Jr!dRZwwB(}lI~IF)Y2E}^#~qCN1!}DnBMclH!&fjq*$bX@SUvF z0u@_ZPZ=)XOmlgoH@5ns68T%BwBCE4_~Xds-^V5jD4T&;wH3A*zR!_O-dR`jL+0#E z<@|oho=)vW&L>G@`UYo`m#wgw>jt0s16<^6s=~)IR%b;eXWB9qcJIc7_T^7-K1Fp@ z37_f3>*0Cg=r^_sG5~PnD`Ur8b|hI;?!CZpub_|S*>8g5%zLzlzna>kl{Z|T#kPCJ z@_X-uR}`ZvMPT3UDceyidJDd<>D@jL*M5U(HdfNV9$Ea9*ZqQHzW>O%@``rOP#|V7&g)A!QFeP#mAB_3qp2I^Ciik_-!_x| ziAB0T{&7!3#!-vIpx2SPu@Xa86Pb`<>>_VVNN4dDK2*O7waeoa`e|!c#-q^jH#POR zpM~q^6qXn(Ps6_jMO7M;A+oIBMO`HC1{yvumUFLU{TdVDopW#L;HhIW{}U;_XbL@3 zj);+Fo${HnEwMAIc10s_42E{`ml&=krzcgt-C{i|?V&VA-{?Pf>?NE3IOklrd@2;4sKHXn>-o_CbzJ|*{QF?@qs-60Z4f4&?wB7SGvzIzYKmh%c1jV)+02R4YW zTmcFFQMx2e-;-gBT7G&; zqU>~)#2E>W@130?1GU*VKW;FtRt z)%chX{sRR=yG3JKxOo&}Q2N(8boP^m1Ky9p8|fY%eqYEJ4u*ywTGRqQ_0DGRX~qGx z-9IXCbk~$#GQaB+!bj`auNpcBJFp75rGs(I%7K2JnH}F%SpEZ*hu=Dy>E6EX6#KjM zUrXNKe;^LVl3V!1x}4ShoQ1Q2pB+CiIF47}cFD4Tk|YIv(qVx0=g;>>>U12uE!ab% zEuyZ{B4iHARZPC+dAke`IMOQMo#}mx%c2-zev&>z;uX+)smvZjzao;Pscfc3Z}?d076X@Fn^|y?0Wsn4I7ZxkFf>6 zKu08xX*&9X64Q4D8V>c50cP{(DSs*}fm-3` z)w`o(uiL-pa=cKW5^Gzm7ZQ$Qd-<4p2WTKwBRqPhcR+MPv4LuatGEo4)9)mBRw<1x z%CcM)gi#5dAaYZ{o!Jtkn+iT;*6&YA0{(#x-EM6BG)7JWB$hwM27yr$ALEbDtO3B* z)OX;wV__C*N#>J;;Z^7KiC{=9+U*I+m#LT>6b%Mxm`)ZgecG{7y9#aOreXM9!ibW8 zz5PO_#CL#2ViCNV5E-ok$QR(<>WBGpKEgWVDm-?@?;{xtkFtYi7*d<==z&=;VHh;^ zP8fuE17_y}-day!vrP-rwZoxzMae63;xug*;ESIs(@~=E!f(dz_A6gdoXkLjVG#Pn zCIv#7A}E^wnjBRRlJ!$fjD?HVkj^uWii~jLNXjL54F{Dlpa92W%x3sKl#2g=dP-R) zSqG0f**-A~M#=k}!!A@+j$SAAmC*1B37hQT%itmky~)n&+7=+?X;z^(B_?T7Bgk%u zFZ<+1oiya>H;|!xlU90?ssANdoG0VXdk>l&i{|N@Fh9^sgYak%M{j4|zJF+a83q>y zVz7;m&>z`qKxx?lbI01T8Jxa5xP&=h2IuTF3tjVVH|M{NU`Gai$nQ&Mhuh`q?U^f# z?CT(t5gm!hcO)t7B>M*lz(@QBWgH|wQpEGE0dRo-B7(6Dc61+)qGx7DZ3VF_;GHO+EVcL(zz4|Fa8`WqY_C7t13hx>FEp+0 zbkQAI!SsRf7kXrW1%5&I#=|dLDk!e08o}4*jopj$ujwu$+J?!Qbvxk6XEq0(o44`a z2iHF5_Q*pR^nxlQh+!+^wu0Xi8TcPY|&O>5kT(t?ySP8`0fAS`+#oCgsgbv1I%QJj~=g*^}) z_4-(E2T*;iolKDe;ec$Bh5`;Hgb8=xzX)GLQxU{QDN2sRq84En6&F>k3gVzE?6IP- z0l^^T=}`~`NbhECP7kXIq(?_w$A*G%ItqB{BHxS0`NABvPTs?de-Ib7F2!lXoCstp z0Oc|2I}8%1v&MTJdiFn;8fy(MCZRFuy_cBbF@1ge$HiN_uk&k zaf`a6a8$sHCo}Z34TutQ5JL`RI#K=#Bu0sPlD?8Rzte9& zi0B$vhV9BC_T!Kdr%!ZLWex|92^#S?x8K(guoECF5l6 zhTpHZ`m@Pqvi^bI4xF|l*E~J0KWgpFuMe5Xyotp=^7}*=pT+7{;(GUu`nK0(j}k%X zdM#g3*Gqu1UgVzXtU0+(4aly;&3}lj>lpgFlJwGY_4EU>gzW- zV#N1+L{xZc#Xdfe32L0Ji8D-nrjuIw8bb`!`=nf}()J^MGAEPRv@r2fJ+AyiqMQ?| zq0?zBv`7pfDcqZHEZQl2YNz@|qmx@AG-mX_c6+>z6GdI|tWKmaVfz+askfa*MPg(& ztIZzx+S}Ft7NIW5+7!$p*-jkT1^K56M zhXWf-u&3j%Lr1Q7YDvUcv(+z@HT!FOQqZc+DVWlx`$YHk2T$7IR%+ARe`l873@?K7X3o(YM%4W*Dl_LMhpdgs9kom64TA@9Xq|_@+#9v0ygQe zd*%ew{`EjPTV~mPRiDe(64rlNvoR(TJHxUFhpgGNuZ~qQy~p}$@rg9?c3pCom2M6; zEGOJFo4II%3G#=+`kM)-n+kPN77rx={bkxzeenv8E1rSi$=dG$1G)* zVh;3wfIq-EBn?P(!XqZx^?qTCG`swdb{dVey79Jau>q>+`vcX_!_umYVg&Kk6r|bh{~=`lu5r`cu?WuExNko-QCGN za#7S_C>~qRhguiUCD=34teFqHFcZE5RaM+%7`rZ=9g) zv-kv)ib*CvY9+&0r2d#6l}Ypd5Pdh@AbELD;ng1h!H04$f>~dj6YYzHgH=)(bERsp znubQ0P{vaJQw{b{{?5vhBs2=clUJfKgS)f@g1EH(aJKotsC;DA{)oh%)(g2r#WPMve@aJ=g6|(p<@2Z5a zf>oOQL;#KaQa&0oLRdjaLU40D}cD+2}Ns|cN_`OkoSo?A2b?s~y?F0=`5S=ueXInn$BwHQ<1Lc`7n>!hwJR`)%3 z{3KpXn%vxGEnEuxf3|ZQo9d>6du~RG`M$dOfW$WU%nT4Eu&Uki=gPG%NU8m<^}%tn zz;35nRMfo}m27;o{)eYXVC~a;*@yw!ezIWJWf#m$E%PCSSa70nq?+KT-NB!g?*&HrO#+`eJoRSTFJ+anjZ`YZV+4T>U z{+uIob(8;NsOa=|sH+#jx>3`$m$v!nTkKEe;lw|g4AV;Z_c0893^z!f*&BB7$KOThY15{oy7Wj*&@XpXE=*~Ex z3bRY2%#D0EcqCSaIq-zsz7d4ZKF>k6YZBbC9?QKQTV4G!3Ek@fm@j`#RWzUfe0d42 zLoKZxUO#R?{pI(29Q>K=hU@H_e(NyN$C%>=Ykia5rsJ!q+mVV59fn8di_ARMCTp7A zlJ{CYB2t!1J9!`QA$L(4xE{km^0p~shbMZJECR0W-V+G z%NKIkXLA;4L(`bZb*(6n2_-9Z$0$As)yCnYeNwlp)rC(0A}gffWKsCmugpdX0Uhb} zD^h~);gKtVIbYJUg2>h0fbhr_adA`<@j#}^ZK5g#I5V^mCL1b>f^a?cI7F1gLr4$n z7na^W98UDX8$CirT0#gbx#EAL^l*TAaM-x;Ksiil5g;}4-hKxrJex<9$;==QNNr}6 z3d;{A_ZZ6L9$q6D9dlG+428{q`zbbp526G!;vwW|LiNvpX!a3#@8+00fRqJ5l5uQ^ zofFbbj}-9qxKvp4vq7+WR#y!UFo(@{^0-^UsCv>fjeL?F-_*$B4T65jtnH{|Ah3Lc z_ePNi!h~0-rO|UwktvbVM$r~Ro`?tGW$7_s3A+!eO^YGN6^x-AvjI+xtsso9hZ<<* z`L8^$!XX$B!C__T-SP*(z66#YEAk$YBE&}Ee~b5mnNcPRgv^g9M|(hSkc0Fn!LSEW zCR)t6;tG%+YE8N*(Eoq=znI+C?u+aH9p)e$h@)Y>{VD(ukn?|2Dp70pQ2!UP12cn? zfx%k9CNK!t{qJpTnb-!b{1kjfb}1lyZDQm0)S?@Bjz%xWXO>o;m84yY=645R=0ug` ztE%rNd4WtSYt8@bif2ffwEJ*hm@LWIO){Ok`?FGe#WOo(fdw7*012v;KFz90xZ;7o z;=fJ*(Yc`4Q6Neb7k6s@50pG`SM+F)l#-To3vsAHvnb0;;;b7?s^G{fxZSuxpzEaeB5ZL#!kMII5zO>Q`dQjJ;MT-CIa6!t|wbz+q-C((PtQUj-6XNIjls(F8 zqxQnpt#ER7RoL5ndKndl>ekFGS@Do(P^Wn&Iu%Ls?!@I?ak2upu?>3#y%OMmC0Yji zRc=4@n(Zvev!A#8&0@q`X`t4ipM$UatPVO0+ge8)+NBEJoP|s;2Z#Hc6t6J1P zClo8U!%%S=xF-3gpGqacIrG6cGd0}C)S~^A#Lf9oRnb3L9Zr~*KC+sJrsD573fEy3 zj$y+ZJ#(kQ=%5J~)~#RZSz9{!tp+~#SSLm6#S%IA=U&$Rb{krh(zNKN^t%n zM!$>tI9!yjYr@dGy;muPmo>T+s(H^vbk=KG2Ff<1y*vL^JAK~StIu?{^oHZUrAJAg zg4uMQZh`4lC2ax2HNow`N{evnGyDAHal-2f!rseei+)vu732$m?Wh`3S+D$=Uo*>0 zy}}(F`qzFu@vzD#QO3sLuCRvpPww=w@hwb4*637EF1qBKOGdKJrSKqIbByQP!_t8F z*wxEQj9vO@jU0(bM!m5p=yywg2Xo%=YhhW9RT^XM-m&36ZWWa_S^lJu>_-hE&(y|_ zwd|G6nW?jv7Q5NQMW0RG{r+G}klcM)<3H6d`*6F{#3{G@}=0F%1MDY=tp3enD?Sz%o&=Ipd(WeXzk;gdWPMh>2WwGP8xCMFJ1I zY-02ap$j&dLa}lk+WIdP+gm1(8-`K`Fp-4!bB`SelEmoRE%Yar6jOus344MfS;f9PRXmuHr}rjMbcMph9eKVg5QKY-qnCn}P1~o}@}I zDvFrgx-z*f`iRWhZcv?_$+dj%YW&vj{_!5{{qk$PH;}7}OlyYvvV~oH6SjSV{Ok`+ zQ|&)e;T_EU#*-s)I<~f<)GMIfe$zq0h|*QbR1zC5$^{Bn0lu08GeJzUQe#C{x5D{x z(?g#VVVQ(iLJgM96i-Dg5qTUe&> zvX{7!`R&+_4g1`;+V;M;RI`@9(*=6}fIHED&ts9AxeM_Nmo?9?c+`*sv*@t~N1f0T z@AlXqtg#d6yDQh7Ky!U+y#DV~sZJwV+He0r)J7C8<*997whiB|=G^-qs@^gxs)h|0 z9!k2qhi*i=2c$u|kr3%_kZzD18tLwmkOm1Qr9nyQ8X9RB{I<_~)>-HKu@|uRu!jZ1 zo~!QbmPcLYn1w1Na}QXnq%bkskS%d~gnZa3XZBtsmm!-BwyTT}D?2NtGB1;fw^k(= zOXvD#hqb;bh2|N7_!E>R`UP=IQpv`=EgNW(0T;Qf<@LrC^{b6GySnDMQDQ&aQsD0i z4yeS%^pT;P#43)5GSS62OAlLSo+`iUkgOD8*23Ei$rj6v*zPLb7I%Xs@vOQ|Odco< zqe|N0^n-Dm(tnIV7fOCBZU2~8#EkcsegJ9Th@YL?}imwIxk#F6E z&F>i>kWk&98^^E#+0c#;R$<&bmnO#YJZH1u+X2xG+Ao1#nH_tI(!vHBp{+`~R~A?p z-%H2_t~B>G&MBE_#Cv0~sLFOuI!h5EEaGpJBvLx0FkCF1H}QttmMCM;C`8vkv-_&l zf5CE{UdK+PJtSV_ZWm;K^4RFQG%mOb^hgjm>{u~YICqEX|N8Xcymxc*ktTS7V`Bcf z;YRE{Fyv6PqN0*A{yhn_--uX$jzy4y!1tBVrJh5!nTG)MwZ9=~p*nB>lf_D8u7=c%A>q%im=$7P z6M@Z-62(VqIn^obw%>2^`Ixw5-bQz~*bKUz;v$I?;AYzjUs?g~lj3ArwB(_jca`h* zt0tbHPUuc2X|v>)vZKkoz@LfPMjE4QNX5zh-|!G76-vU+Rr>Av7aNS8W1=Oe>XF7a z&YpAdtxifw4IYhp3_DYH9ZQSbNVFyovhOJ_6;a;@(e)DcPQc5|{8DSHoPHt5jv10O zAXE9_5ac-QsN}nTbA}sWN@3?R?H8E z>kRqa)Z=u5IHBTE18hhpe#Hy?Ggepn%YR&948|PdHO8sCK@KFvy9o>^JAAH+x-cCc zKfQQ!w7X=ty7aD{2LK|!!pc%Q7{=uYx25QC0xg0=h^=buv&u091eE=kBOfWDTW zP9TTb?t!3>Z7*rm#pi^x%2H(D6$CvTGt`EfKl7-)^UE_>8N&$GP6+IIAp=a4bI=F^ zZ_3+st39VlQrxQD)e=@o>H@hZy3!9;1thj`O@}|1ewbJ8e?h0pJE*|37Ch&W8et{} zC2~)_F`>-+?i_R@^h9dvf;l_WHAuU7_ZMXPHc)~6DI$uXv5CGDN~MO+LI8~Rd<0%q z=s?jb7`YIN))KPi*0ER)l4fH;#|Vj`K#xR;z%N#0WyCN1q+uX~u9$>iVTr$qj|KuX zX#;5lX>&#>WA6bG+W+7vI)Lr}4@3oUI18FN8zKOS(E#C@g+}pnMi@v9-<*p8q=q-3 zhxZTE1CsB*hc!0+1IhAu14haqPI~15^nVNhK)xEl!~RVLF`1L#A-Z+)+kOtA$h9T~ z<`Ehs{GF}y%RRm(#$6`+(VM~6E;&N|z2A{8v*4~5rNJld^y5yMgB?U@%`c@ZS~ZSS zMBb7ccHO)`o^rLxb$Yhz{W_Y$@JH_W`(1}_v-mgMy}YA~jBiq>ZD!^)Vw^0Z05Yt}VYw@ExF3bj|iaj82oKgZSNL-CK&O1q)Y?MyF zBv@c(GubiX2pTV!!rK%~lgm<5n>Bx1-v8R%x78GIV!zq^nSK*XP$s3=P%dO9bd35Q^#tu2po;Ne!L=;`L_~Df#_Ue*{s*fC`A{4_^X4ap)I7RM?Anx|gB^5r)aSZdE zI|(D2Wp<#lQ^f{r#+3rimBLJBytCp+7QMHo6IDZy&Ss$udnWC6TCDpzou$;F+C{!9 zuBM*80m|K^s`@+y#bIh5p71pr+@P`6ZYr8hmJAsKizPelg)~k(+%lIR$k$_!3Nn_& z7jw~w0v4D^ZpimFH9vw_r1!<5sA`5&RJ$0M`70|sfchnANB%yigr83EVAq6G4+;>( zZ$d|C14Sxrr>1puIk~LrsHSD#jz1v9t}}aA;Eg1c%*USynC!e%6dV>P>VhJD1zR-ldfR*-G%;@#Nk zGT`P-fjiB{GyB8%72(tj$Y6PwEB{Twnu!9iFRTjoLfF@MC?&QC%FXi?*&=c-Fil%k zooGltiE2w>!6N4qHAV2e7;#p@xwSC)rlwxJ65BQV<@W*%x7AG@eJ8R0ZH}A)(W9gH zT=-w+dcI*rZHnj&Wf?2G|AaU`;k>r5r6u3g-edjrvMym(puGN7{H||i*DE_4V z>ePAAow!0%x;UTp?Pn0mTeY+0W-({tHtnv5ujf}ra$44ekIB*~3<_SpobNF?Ktqq! z@(|FogN#9+BR;L{Ru{UP>||q2N`7Mg8qJUvnR;e*Xkbj5cc-2d|K@~bq$*61BC#lM zX*okuLfQF=oGT@=e(jXg4HEN~FP&`4KAk&&Wcx9B1VOjB@htzNCH~}#C8PY_Rs_e; zTBrus1=X=1Cv}POS*)q7Q=c{+sk>IEa!mdUqq9*fd#RF6zJ6My=7JulLs~H|FK7JR zgf_#RUCJCxdx`<6Rk%)JQB0MIiPmt!r~cehsTqMzRaq(mqHSTg{Qhtw5^`n6Ew89B z*~yPYa-C35n@@i?35UvMWV8)d3(Li}AL67j&hs(!Li{pvfTE}Zqz>q8N2hAPtqP-}7x@gx8q8QrG zOY-ptf{^lS*VmJTdLa2qS93UphurQKQ9uQNYoRqwDCoJ5Ei$lPlC= zHpz*jMEJ)s`&f%~@q~FZ;_;>YV9P{2mfX{ix#lF|cZ$dzD+Gj=H>Vl<7GXJmBxZpX zw5ad%9eik%O1k=44l;0s$yq_adACq4!;@3eE7Wk^lO|+SUPVL!gI&J5*N;P|j~pzP z&OF3kBhM4Rid_@3?lf{5oI;)7v%bF|Ocz;LBby~Qya?fmU~;ftl`F&MS1(PUaj z>Wv&@$JDLzzVF5IEK^u1yvaEMH}z8aEEm3Z8gm zI8`0uXfy<717|UdDB$$f9fNm~Y{PqXT=~lnI2$*OZH-84efj8Ql1~;FMoOZDrR$_o zr&&!I07}vXCY1-SeLkxtcYkL%NgB1T6>C*~Z$cAj!9sR#PAfwx8rgIx<5@wt;=oqD z3Hgd#_u&a6VSyATne$oS9$CRb27+Lt6(a&i7p<)pCLq#J>{`$f1q6%1kPEq&F z(A{RWxvRzVoU0-jK6cJ+_#mY7;rEzRVeY4$3`ob)vqM!|B!SL>Eq|_a`WgzD1uf-s z3=cYT;0#y_&{(km>GVI&0gw-=kT5iM5I79&{~Yuo=r|+)aSjbc<1C+n4F$HX>|}lw z$zXr^VymtO(Xd3ia$#=5q5hreKhQzUnZKZ7nda$C&AdoJdcRr*?kXqAoq<(eQh!0$ z5fyN&^YMW#X;rEx? z(?0;pOu}1^PGwTV_^KSjkn$p5EZ%4L)m5;@$n1q>#|NjOCboPPX>#NczJVJgdBjK+ z6;6GXNSW0^tgV+o6&j{ADkSWN&o4;4d3~V(z3`cJ{*eC&g-u`eDIoZDX1SkfblHQ| zPZ)@18=p^2o|2rO>u$9lX}qyim}&=?r;`=)s}i~lmIe1z_I3B&HN|n(tFE{J$U$g?EK_NH z_~<{0`Javq$lo7hR<3_R&b6b5RRJ57z$ixH z`ni7GnXLMW4IzA8r+}9r^v;`d6XB?H_1iChe(#s5Snx{qz1q$@>uiayzS@t%Og*v^ z77P~{e;SOi$%aKUE*{^k+lcxsvwc!GSOZ% zaV@i2N__W$DRI??s$Qd0zme54zxR;JzW}@bNqJB+Xr-h?Rh_=M?d|DAz{b!VRl-K3 zIYi6Yd@{>uLwsOLQ&VS9hw3JPUDv{WA3uFtbyV?Y8%-Zo>hLk`%g+W14RKYGB@1q9 zFMXxA{E}ys*~9pgBn73PAlisxU)+BeTE8TIcWya$7&B^|T^($zCA?*Xe(Ja6i`rA)y*vNQq9 zW&t5_BkW|}>{4<;YvTZR`+RO-+DrzcC{OVLSAVq1WW3Y z|6?lhiyZlKzw}4kvOZnF7OYfGNOnL3!<4;m>9%Cn8SSlF7TR2JA-W_EPI@@zBDxIA zs(QRI>l0W@^ED-WRwTRs!s0@c(_SKzDmAs#vOYt36oE7J+XK5Hr`HCxPQ%owGYf2v z&?khTru-;mu7_J8n`C&0V)XpInRPw#UKX&7y0)SDS5&UHVvw|R#nDI`a}F&}H9Nd$ zfDcZ{(A!T5eu_Gd>z}l*Z6j^p%20(9&wQC5opqn>WkL7Mi*2dAiK7g~E&)A-l{Or8 zW@Ycmsr}sVbg&dp`S~Uvi_Z_|kk8cuo2F{9CrfASMMpMnlHT04z>n~<4Wxs-L;ndU zxfR*j_LlHQHNH5{FoS(!$Kuqbal1d;^VmH)v64y6jUD;jSl&ze*AqXRIDRy?+Ptuc zjLj~$5#CccgO|NYRQuveEqd@4<;`Y)7gD+@^C4>@CfSp3kw~4S>-aG@Iy8=zu{9a5OU~@`$g-G; z(Nq^XH(E2HdI$@-FLTCSdYtp>^Pd|4Y*Kd7xsFDX#&VlPLCxx~`?y+_E06m4lf))E zTcQ;^@m7*sjI%jSRy`f{=C2RW=LE7L@7S5X`)f|**fti;49h3<_XIh_Pk5v#je%BtW`Hgv@>!|f+a%VVjUSP+m9p3a^xP)2nZ|Y@^dpPBv9~fitDO7!(kV!17 zZEj-d=!b+Ar3tYp9z;rkt(Fz3=S{f1w5fCB34v+d)90|C|A2MUowX2lzd5Z=%4Z4G z2X1)Rk5cMFO8AkJn}}tEyPnV$5CdDv92KUg-O=maQcSqJH2sO&X*LJY26ZUR{qf*s zyHaPBtBBY>tj@*ocK>Xwno(ewW8Q>Dwu@j7rn!euV#PGsccsa^o=<42$T|dK34*;{ zuf+=8DIVHPa{H`B{kgwSB1v#4*P}o-1KxUruEvGEk$TVA@+4!4Nb=|6opZJbswc3? zw%xI`bUZXEau#7oXCM+1i>If>R9i_aG(u3NI-J~Q3t+ zm+hiKn#T2R5xFRyk^dyEHD5dxK_=qE8Yzvf&mueCyWEmsnvc;_mM&LIAn%5E&fjB? zTAwe4fch5h%mtReAnp3-Bs)u5So#D!oDW!BU5_KuUo-rWV1ij=b>7Lo8=CUYL+bvx zdqM#Q&!Sv{=8%rGPAOJ;`O-pg%sTbu?K*)#as-ql9|i)XzYz5QDcVUOS!EnHa;Y2y5ySkRBMvh; zgVGL@(&ryM{7)W`kzl?hLocS&xQf~@J}SAzqDJ1N!ncxAe)*))5~bI5!Edjz7Op3` zA_x}2sGBi)Av=yNEN*XT$p_nzJ=-ie1uL9coxnQh{Cj0p zGqUb1ErTZ+slRrL!N;>at->m*9x}pa6mes;!RFqA4*ms&W4FWV%WRx__F`7Ouc)~= z-wPtFQ>DVxj+7*-BVx{FM@lT+UezXq2-Mm3fxHpK5t-weLOwgTgbk>Kxd9Q@F`C-L zm0%r%YA5{<$Sre1=dUyT!`%-|KJ5%4Hx@Kq94M^1i@hv7 zbsmoiN|OMO4=Xf1s*(w`mSiRgdE!9u9;j$DbO%h)Y#}pRCEstn#0`H_{DSjN>pQw& zP8AeW%l8(*FoGXCKjuo-`P{vfZi`U={Lz*OpBM#HEUyd>ML-Ng_3UHBlMMy_D02Vv z1LV?pE0LuC@ioR=W_$Mc@VEii3(<8n=_|vkE38 zq!-p8Zb=H#{;l(h9~`|n8R5JMwU}3>X0C9dN z3z`MLoWG#Jr23Nw23ojk5AI(OEiIgnzQF&2G zxcoy&Wc=JwlAw0@|@;p@cXc_&#G0{yNfwDL<@U_QFq!IIk@WuAeIvHUCCg<1WQ7!bqFQ>Xh@uDp<%2lE@`sB5;~1y^OPzcM^m;sme-b@o z1pWrYf1sZWAML-)wG=W4=;Za01M(D+0KiSA5qZM&JpoZ)`G4P346q1gbX)L?>Hi3Y^1tjhq9PFI{&$*TKpePc>KGYd z9WbEHeg>$Ju&ma8tMbo9WzHG0|lQ6%;LN)>BY^jX<9SLD4dW5S&jLI_?EJn2d)1ox8(WRWT|v#aLC z_xV0($=BZY8T!!uOfVA}eYxNGMhU_K=97N`vfo zLtV}vwX>!k@hIxL93|c|tCCgFpepOF;y1y*_7(kc->0xL&TJO2gWl>5<7z~#;hJqG zQ#Fe16$_pi30I}k3b@VPR{t_)NVHQ~JQJ{&Z69MFBln{}9c*Us8L6DRD*OEku-3Tm ziDw>~_H~`hEa$)Zg*DY4Wdpr8wXrOLy5&Dkva%fY$%elxu|8NCU16i>3Op-}W5wG< z$s6+!w**Z~GpZ;QWMCwtwqOPoZE1B>{16a(AMh!$GhqTIGKqsj;{R>-Om{JFAyC4= zOGkb+|I|Kq-!sp0!!DddKT=GMWL;_9t^~Tp zS<))Sv7z-WiE!(t&4xAm^A`F3@X`{3VMIcj5mApF`2L_Tv$*}(nN%Z{39Tnlq*4na zDd>L%Y0e23vTW@3tCKYm(cyHHf=hBxAPg7BcMpfZ(N@;`A>c6n5u>=!GJjp5rRuPH zCRZM#y6Uhigar@&{ax`eWf-it=aI9c?M5kGBlgJ zYI$ZWH@6l;(bxYeXsdKyMS0kiq?#5qb!g9a%6peAQS0H$fFK1^VbX3O?5X|cEHX)4 zrr*L^0-31_SO0{OvH6QwAct&t%8JWXz+2WS(eYIIfM&Sv^W6I0?Pu!qHqg^gny53T zH??*vOb(*V^@H>D7^D9b6RV9n7N2`YC_+?`oqfJ zcx+I9d00_OzwkVveo!j$Tuh#bLwCA*93RyzqYp#poJn~w>>z&_PelPm%dS3tH=(?P zZ{kp-YTsf>11AMTUF&L1_k(592vW|HOl|uD@VdwP#vHl#rR%Okrwm`*{d6qL?=@^V z8Vj%9g-F1;?R7ss@2f&0nab)#Ay)`L<@}%I3x3+{mTeuCi25-F4c!*2=`I&JEA_gc zzQvx-IH>PlXFY3K;vFpO_C(c-#e2}AS@k3nHAE4**J~uk6@3KiSW327wDaX36E3T3 z@kb@b_EtCZ#oB1aIhHFZg}$y7k!N@l42WQm%4=<{2pB`L9r7=g#BYuC75AH2G{m`! z8?anGwr6J!o5B{m9m*NKkKdV4|D?MtEKS3}@hbz2%G%>B}3i0>1$(VG#_>hU|k`XfbTh8uE zrwt{q-;CAgMh<773Jg!5lF-D|XT)k9Zzgadn67d+0Qbuk%%D+5!b^-M=8v^<`>7p| zsqAC^jTTP)o8dT2e8Lu6p>-l)tRim@RVr*`8wPfv*cXG8cu=sP_LWUS-Qj6b(8k?| zC#o;Rk3)c+|Km9U;PA{ZPv?@1AoMMnfP|5MXZjoETIC_Qaj-I=0iYt|Un{y35eDjf zLHYN3q;IlE`4-O$M?k}YT`yH>#5?fZH}i>neNcb+RZug3L;U1@I!3PfdSmvNTS__` zw+Msh$Km0Kz2xw(XoSZqpCT-9$;Hw#3Dkm#-uRp#9EW{>6U6<3kcCAeOoR$E@gPb? zCnU)q7><D2{yj0jYk?7lEViqQY0xek(D0OBv7tj*X!wSw(OLan`l2k9M{% zE+t#0j6A{iO{`5tTP=j~4Fp zdav(&aS@#lhDE;nV@vBF*7t}JBx-Gq{};6G41u+9hc0}Q5CeYjLTEAp7NWQxpkd9v2e3(SS+Q_B0+~%V8rc8AuJBhOS2-C|pXR z44@I2gRmS!0C^Gw#%BVD#-Ol~;2(z|QYRfpvw_6GQJTJ+APO{47zl0pzXUK60sw8n zfP@XW74rX=bRZOlq5ng_02G!gL>4YhbJoc-^MzJCSnqp%dgA{qDh)dhV1T(+anR+v zz*$AtesSys3P`iviW1hBC@uZ*r9FjytH+JTqw*-twV|GmtFvswc!(W~&YTcWOg1=&Ty|^ ziqJ-pTo+jhO<>cRlgScfScL+_30=c^9^bfb!Bc<>C#;-h5d6m>6!niDIZ zcV~>yxdLT=>cyy;sWXrTIr=a6P~nWBpk%K(*VI-O7FSf{H$F4TCIbdZ*TnEwCY5Y? z8N!|P6H7-skKFAL&`wIV*6JNgk=07^q<(%+;d3(46|vTgX96V$)qs%$JKtt1JR@P` znlT{#rQA<{qnjMcBQ}@fIs5syX9&g2DI!?dh#{$8x>ap7=UNQw*GS9?oRJ1i(N9RSCG6_#%OLNHI8kiC#5Pw^!uvdEO^2b>`G z18h~QY4q}tk=b<;0;Hw<6GrOixF5gQ0y9myepb1(2p!dJMPb9<)qfggRE6}SEkY%t z@QFTAr&dZ-Us=Uz+n=?}jzJC%J;a)K&v$UE^mrP>vuO%FQ!h`45 zNI_nw9krFNKRg?;J(MnOxA$C0Sv&k)VA<1$qGm-71uEkhbJjyYjQw?;`7u6Zi`9_Ym$14f3e1t zt=_4T+pI<7CSiWgC;IZn=H<=W$*Uezrzi{(1p!!H*>vM$D>L?&cAxck61XXURKvK7 zZ|Z(tWjsdC7W=Zec{VF=y~VQdA!!S316jC}gkNQ6_y$(%4Ga536X6L`{RO=UQG-l! zzongdSy4(Xl=C!`jQ6f2@|)w9qQ}MM?0OGBH8sJ~F{H@$AO|@kQx8Jsxj@+6^ZP40 zC=hX5ay2knVP<}!=W2U5u&|rgmeIRHyZv0It0k{(mC7UiNJCJE+TS7ZV#a3~U5YC^ zR)cS;zqAETh48@gUJuIX|LUgE?*Mi{Uzu-z^op)YYi!H2ZIU-=^an<@<}LQpIw)ZwMfZ`ttyQ1Yzk9ZCHaJ2|1IRCmxMNc*=4HHH zrq!Rm(pS|naVGPR?nee~&MAJdy*gEY*RuOz{R#^Eb&YDOE{z!F7qrKEfu@m%8bxPkro2$%1CW09%6cRHEFM@pV4Qu4z8FbiMQ14 zda&mwfThj}t@f~RLle$vB_eKrCWqg~vs5pH#qOPZI)CHats!$`Wj6iJ@=>~?E}jxB z@QtFszxaAWqmuVEfDl?dKaxM-ES-jS2|aX?AL;CzFqnx}mo+%~8oGZkcCHDLJv5%O z^>Pb8A9YD(n8GzzfpawQe}UUcJC^}1BQE8fxh?xDzmE^^L!mtiaAGxy@{x5>bcL4`8_7?sofo%pOj*s#`H|oDoTUts8CfYe*i++Xz z@k<~o2}T@1o0dY3`lo9V@HGJ^{$(nKr78IT%~ojrv(3aAfLUr``2@f=1L~JP{4?OB z{$shh^#6wse*k|Xz~sg;z);C#&}Hf33z0WT#8b}WD1lF~m@F&}q)-z7 zd1h4qP7uuCcY@^c@iKvFYpixheWsha3(p?>;l=jt-HWa#eG}Iucc@bWQc27+W*qMC zy@I`J>SC)o@jdT=tY`Y9OyN0A;Y z9QJAl`(qY+g-aJzl3yFi6qAoxiue@UUgo8qltVcLZ4n7@HvmVxDRl`<#Fy~ATYh5; zr`G7h*<*>!oZ4s&8a`ao{^hCBoxsa0{aii8+s^M0=I<`oTxYb-a>R;6wWZP+U!N=? zJ`viv?Yc6mEjg7&Cotm>UM(7t)dqa&qnsT1pMuO&LIzkda6OHV~6M(E2Q zFO02bkB(BpbeI32s=}3A+G;KT3(8X^lSoc;BB>b$+IOwx?0aqur?G$R|E%`sQBUY; zmp5g_K1xr8Xq!vSIe*qvb^+zr;IoWFuUYm^y84jYB&k!6wwB2Own(KdYC8w1?zALx z0LIVU`?~iBV|OBhR<0X>Jik4*qQTGj`Vd#%XXX{&Z@+?PBFQU(52V? zW`X7?9|mGEk{BW&Bjs9h4m0%|N=!DUbQBkDqf!+o-kPok0o$pIe>P53r#^mH5OawP zcb-VoC1t2|xVY(8YpZhbe3y}~(5E>1z~Dg<5rm$eXJ|&4m^4tmca(kZ6BB*(y!+x{ zR!tXqX(3;)F|~wE+OQ(Ep?aC;opq3XZ$*Ox4el{{o2#CmH=>XR(+Zew^0mR1k^Xg$ z8_qXX^vZ|C*5V1E(;4lMn!g}ku9+uf;@zYWt(Cz=W%^T-Xd&s2LN zc5pF2pOl_Td1Kp>Unn_MA{Nqg4Zdu_F3-A}axmDQ6x5)0s7ZP!`}C9|H6|jsSo)>w zxB)V{yrekJBcb!j&om$bSp7qs-n!aaPW@Q7{#tSUaxYiMabWOvhkcnli_?QrB)>vmB#iU$QO3bU$IF+F@K>Ps2=H-BqQB^8aiaLWG60i}wdcoJdSlog{=;*8t* zj&KcOoogZ6Z5Cr=uBw;J7+S5B6QaC>H;P76Hm8!eTEnh;yLz3s%4c72H`Cb{=F|97 zNn0gE$b`{imDVD1>?>RAJIFa;&QZJvPdpSsIYCUCzZO(gX8EV3RAf*4MUIu5Jn|sQ za!QyU3|YP61AJ24dBQMn^OQLu@V&4zNd>!=)5Y&?B~?|-TTYZdntq#lHTqwQlq}cL zZUq81>IzH)w0`N|@B$bPKsvL0JRkhN2(pB&%e~w|(RnrVYu0v4F#ITym{wDD%fx7I z#G#9AVZmLpKD(&&gD+O!SuhV*g5+(U%= z1_mnur3K3(gEaYeF|?V}jbCj#Z85siumuK~3nFWgABc%;c}Q`$hjeP1q18OWGGA-HPj{Y!Xa#{}(E=DdTMJB28zA-WQ)&jW92lyJ~>^`ZC8 zu`!llscjm?Xx8ahGUQ5rl$JK0>TIFw5+4t#Npk~CZ<*aj zmuej5XQA^eAn9zuCu8Sx63Ai_WJin_!KHgFn5p6Gi{8bN5m7U7RpFfgb6?+JfG9@L zP8)xFMX8XaB0JTDUyH4QFT6n*|CD?gCWAqGl+ZA{LB$u1g@2{8i#H&6o`ejI0N#&T zlQ;1x3z1L|L(nUC9d?ovCJkIQkcyDTWEdTqD5U%Q2TTt@$hNV-9L7E?UR+p|H(*?$ zg-KEH8_I}*k)#Ru|L2ZK0~Xlnf9z2j;FZ9eJq0iTTKHcgiV=iQWXFW~9%GxfjB9OP za%!t6VbLp4#o+9;Z42@dvpIbaI(t+3IHj&-xxs6wc%KnjO3KJLsW4yV{Ye70s{}&M zvT^{?RAA6gKZ-@D{}Lpj9;_)M`wJ51GGC;*ZqC@3L|R5h@s?L5_nC0@cYt7gd!SnKZT(#2WKWB~ zxa72G5Qe>dhPM8!qE+anjr2&rL*v!@j1K!fQ^_}?&%NcKK_l_F;3I){M9e#^4gMYc7+)8u)Im{wnWSrq<208 zSHe_vEQ|~ES_Jype?cmy*^!AY*VN*wjtkpo|eu$QJie|u2 z?W+_Xc71}UADDA0G{+wY&~mQ0S?;-LNl+^&2$IkqIYXTK2oNY~^rzGs%A9a@)($Pm zEQ#HRrUSx9Fb~X+yOB=7wl|^kPOf6cfK>|P(BAu1ecE6rVJ=dRFjiz#&OI z@70fp`_rEAhnG~3TrOpv>#3wr#*w6!yrJ=5fWk4}eB85r=gfzD&7gx@QfxfQ-xno@)!X(LEZY`AJ)B#ldi(lBYoyaEn9IO8~2Zi$CZ@NQ~G?}Wj4}t%`a{^y}U%-dSkB% z{=?lH6EWcA6?d6SFagq?goY$kp)De_`&DUs$TY8#FbIsZ;@%BCxm`}zeLmDRZ_??c zs2NS4AJg9o@=UjV13h$aes$vzGKZOV z-&AET727C#jtYCZ(J;LkY>!VuokxI5jwe5YZd@n7^s1P7TO=fg4t{r`5s!AG9q+ih zZ?KTY(m7Ya!f#@=u(e=#H)u4|2XZAiaL!anfhhitZn}DRIJ8t!@V(0N`H%P?QH9C9 zi~zOCr8_8ywV-(W%3r6#DH>R}((|s8_NgK` zEI6f`X2RZ+`IB~?)`)Z&I1B?(8K5n!vB1oXGN7N)fy2-jHU2j=h6vngfXE-K8Zavl zjERSYk;$NaE(Ay6Z<1(4V<$PEpv%&~TOv_?5he~se17vcE z5u3=RawO~o3CKL3P$CFo89|CbewYAl1`LX!Km*3r{(S)s!30XA{t+mt2rH7;AV#zi z8CEM04L)8RD=8Qu0!`5~w1nFg=|?Urv3{2mhe}05xwZHX8e;#T)wo3C@RnyFQ2Vnm zg*jY~6};7Q-8(Jnonv9PEjC8Bx;x(aSexTVJg<}1Ao!5cb^}FeSfRq&zSX*AAa(So z>JvafIbSY1!3j_zUZJK_+vJwyCby)S6d*T;F&flCMLXTD?2 z;qcapa&YSleRWuvnM)32u%KVh=)pTND?a^%9GL`aCSIfR9Qe~r4|mjaW2C%xm{|yQ zbhLDBe}>;jUFE!E^|GW(WW|z~Qv`RgfIoj!ofb4kcM~v60a|Bhe+#j={17yKLh%{F zWBB(#V@Z1HjT;@bzP29qITyDZuRPd+o7P>z7PKS6Cw$jLB+c?Y%gr4zu4f zcueX|m9A2Lh+C);VGkh5oE<;}~PS(xb^Jy&N`E!Ywy0YYPrHR9r5&Tj6Aze#n zZ>=txh1SV9rTL$BN(8T`#m99|uumrsS_V0t>`u~$8N4&{59!|!Li=rtttWf$>I7UE zC3%(K2jv%Mez3y6Cmt)VN{2EfdIVMLN-Wnw`|_o)<-hMJKT%`Dxn~C`S*M)l$wj^8 z5s^YUB(NV^g!y$KG&O|=mR@qGF?91MBHFDG6d|UaZ+chPvh`p*zBPT-8GYQA*QO zrWMGlJ<5sC8lu46h$td`AGDMFVt=~nadncH|J5m@Wp#FbY*>NMj{)UOUEhZ4@q$;Y z-a5nry11F!SvxjPbN>3$*Q6OM#MKE8HLmh_8Rerg8lH{yE>ql_U!VuR0p%IzLlabb%ibJW7*R|caL{>2u(;5ZC{g8H)Tq7oG;_u4Kmls5#Q zmY~^C<>1oSfjT&)gAUSH+E!ZFx1CG4*QF>9GrFg#)dzvF*B0Dh_&DpYeMc)p&)>j; zATVvK7+dOwox9&DhP_DDHoYU_%o^&_Vg6pmL_F1Ha|>fOD-=~x*3#eD^)~P*&aW3L zw{7P-k>|u(8CsVpzr)_ad6|f*i)n99;m#D~?;P5x*L?hA`;X2p$w{#V`FAa=w43bY zL21-cJypj_J4lnrm3r&F0ePO(175QZ+{uJRb6kFpr-eG!PA;M>+1p^krJ8Es8nHMk z@DC>3TYt`r=*QwW3>DF$l7|t*y5xJ7)$DV~oMtZv=a1wFF>$;mQeo&vpkVM)ud3&* z8cybGBiv%PmwMS5)T-pym`+t?qhYCWPW6-i9G(e(uHQtztD7GhWxZ=b{6wbZ{J_nZ8f*a7 zBF}UdK(KLOfzERI2E)0~mee}L{e+QNOQoQkui5LeOzBn1HfKFkUml&Dv+)!4XZV6l zQ-MMyP-olv!E}=Qox3#>%O3ICF|gw;b*D-qR51y#IoN zA84F|Cf}OCJqrYA8RQR_<2#jj-QBZjYG%Z1c9c+QNd`xGZY_b;<4bvqt|ck*qgaB0 zjXMQF-m0&EQMZd%xP^(OAs#y$zqn`KLYNfKMRph6(eY2?eHot8Ju_6SisHpC(oJwSYJm>AsIm-&WCd#%uqsbjb}jLVC<<}&GZNc? zM|eJ=GjL^ZHDRpKcw{t{Rb$~kMQ4vT^k3VwXu_vS!hL7GS`<4@kADWLx?SEpQHQnq z>Iy+&H0oXi2c*_CU&C?_i?XAi!t6I6M^6C)-%WUZy&$Kt0Ac3!?eF zUj#jt5A8;_&FNEE^T-Zo#c>ZqCqgdNL^cOYtsza~0rijwSP=xuAbPh>*3~64ngL8> zUbNHn2#V>ULtBt9GU(%$r7FGPA##e;A2y=q*eC}F)0q^W%|xPj`aUZ9fpA&jHKZ|c z2yQ2G39tq4g=T396!%$~K*C5gu+V3?_o@SrrcO#E@z6c*}jae1K4a_wl?PWwt|!-*F+gA{45r)W%b_bisQtVlYaQ# zS?0!qoS8T2aj8@FibflCYdi8x-O@(##{Qk z*K`YKp%yCqnC-S>d0TL|J#83bd6WpRs;~D0t5~9Xw_`cny1I#wKV03IO-`4Uzd53X zfw$ig*_AdnH6V(JeaoK!Pv0zGoa8pkibE)Fxu|*jBK`)3?KNwtzQXBfmN=!Mm*{w8 zvDpY0KTg4oZ7N2K-vsaghA`c(Sj!pFCD`1T=tSLl@BMB#r8^iC){N_<6@@?CI_jXi zWcECZS;Pg@1jEN?juDZmq;(vYv*IXApK}I0_PfqUT^ZlnQlQ$_3 z33gBU1kv1}82FpDff{(y++C<9ufgDkcH&p*-0Pl%F3!`BimP zmw4}yhNi?-;cvb8-O_%{^Y((TE3i)9X}h)<8ZUJ6L9$si8B-k^?P?GW4JUi$h9SmB z!i~v%W&QA`lAaOYo@r$Nq=|}3mOs8aqv*xl=vUZLH@KtfKabkCb$kRZ&I%BjzakkA z^(FAPR;F&ZU^W&{7k7inN@o^2a)y(~Yulr0kFxnNOS4B0)!(%?FR;QSXVWVeOzi!J z%YEvHyLXDGzPxL7e!d7Dw7x#}R>a6SJz{G%^p=l~$wtR42N_8WIV*)5?}ohg@aZ3j zu~=YTQD%Rd9$CL*Kv0f8AJwSPIZt@?N${g#obfef;Hz_82B^sPrzETA zb5-P86m!wmgsPPLwZ&p3_pI+f03GxCxdDD%13v%8^AjL7oqRv`c^Gbr)NeAxKz>$P zbrVj%y3~zq~YcRhfUCScu3o1TrIijX-bz5?Y9;5LPC7gfNo_ zu}F)+!`E)p@tejFza>9JqFDyt=6}*|dPIdtIRUaRQ+XyJ6YJG$R=_ttZHS(hE*Y~* zV`hO3>9#SQAsLc1hJdiU>xfL;{$j3SQ{WX$0A2Ue=Ja2g)RRpPFT?`h~k5sO-KJT6`U8^n8CWM$-f3I29mCeS7W@ zS0|04Bn%7~ErWKgRp1dC8`yzR8eddFnduYp$BX!Iv@|I#L|A$%{RnWAu*0{7wQC5k zPKm!dot=hr^L}O+QGwaoaiyz)>%&`)Uz&gG8al1?t2M5(#E~zH*n2wAgJHaH0-;U% zk-2q`dMZx%bvK#Jqy5wAz|TpP>Gv0uU*f1(N6_68tcxm3k(M`uK}X}~P4#0+;!MhP zzvB{7hKFiul24qR3*7BGv2ICA;vyoddqWg4ryMBc&+hvu(@L>esE zx?^Ir>Sjt^KqxEWvRHVz9Y*98=I;tx7R{J70g|z!4;6_Z7wS!XaQ8bUUDbN6Xfd@( zhIyRg(EN&3vG-VNmE*)K`5T5~tS(UU?ZgW7$DbNur`sqAamK70$pi16iV{nEcHw<0dK)G2jn`vznWR91bFgU?5=v{fxi zz20!9LRQS+dlZmq38s2+xAys&d3kfhl7{#IL)ZA_fvRRh8809qj<;uNAfMpF)LFIV zWrUaWv~WD;v4JWpm-qRbjh#<4`S0_I82z{Wq`=NX8=CC;Ur7I)$gxgNn@-Qd(43M1 zb5WxcK67Qa^A4a@h+l@ z!v)C{;Nb=~hEqjoj5^I7_vT35b>nZGdfPH8Yv}B|_fb1PiD)vGt)|(ii*5uB%5V~g zq!JI>jsB=GznRkZn`Ju_fEh~Y>o?l8ZQE;l9|cEoro(tpw1hC6=`|aq@wGH5Y>S$) zyjv=4p$un%sCY-++jD-YX_3e5HD@G~;%WxxNxKlN@a(ck@B>v^xxS8`z6Bc%9(FRq zM{*@%%Dl#IF$-0uuKi?CPrJqD1=JeIc;2jN6m+_-Ac=O=mD~Hi+UN<%sQQ3%mGC^~ zVO=}#5}6%y9_Pf8oU)CL?|`m+MI>r)`yt+Q_Qn|t*nAj2VQm>UQ5C?O+9q&tP;~ow zqm8!zeAFyANSP`O=Y(!PpF6;u>JYw`HWVsD(|<#p4M)7WO*fnx%wDIInoS1r3aIbJ zMR&%`tw2T9$Eyy9RG+8&XOk(#t7)0e_$TT%+52pvrjp$BrMPfE}Fdlvo!h?p5!f0zPXI%-)Fk|iAK@f z%6GSko2fh~tE79R9z;K#8l16x&ER+%{B!-=2zWX{;Ni;#($b<~%R1a)4R7YJleoXZ zRl@*Ih?NuzKzZEsQMQ&Z3L_N>f*qP=Ks=+pxh=6vk0rx)SY_91bGmv|Tb|!MA&>q; zio`jPGgN~myOSsmEuK^pSJ&r)!i&oQ(=;~`@+MWHJb=w;AVSE)bnrD6n)9SG#0rvM?@c^Y?IFULbND!h#- z%i=$98d#GKlAe{mN(dtkN$}&SL~{(jvV|X9@4|6bXY-pnYQ7hIE73m}Ue-XN0PF;P zRk@tH()!663=~d*Wr{58#O>tU;8#r(3`O+Og%;bKhN}Xp^O;g5%8R59C=QD3Gm4BM>dKa7xt2g9yNO=IpqCORb40$cW1Wag_VQ$TttT? zc~~U^4cjyI*fDYY$k0a%BmtJ$fJ{JS9qO_n2+BC%HHHnXZZY!Uu)k7*9S*tTIwdE) zEUgX$Il{eyNv`w}PH#Q<`tl>9RDrc$qGTQLTIrKGoDmVVkl+iDL1{;iMMn2bL!B%A zi0Xuj0JZeivIt!({eR4(o(vNzVHz?9BCbsXtx(va;rbIy?BaN|*<=;^0lm4dJ6H*E zhZ_{N`5DKNHfOVsiXK8u=um(8dN^-3CKEupb8#MioF4j~@lFgSN6%oG;X7IK>&{r3 zdNvveybQ|O23!mVxO5+Lu4-Yed;SQ+IjGHWe`axP<%wpguuY^5?0b?muCvg-wmec= zgEOluz#J-98D=ooew+-g`P|jd&3w=Qpiw?V2quIzunG{!&|9l|DH#N>e6C@uC@fVP zLe=0?xuZsF!~utYRME`GzmBWPsSds>YZpp6Wj4*z7dP{#EGQ?sMA|=Uv08pE89TJTthh&6 z+nzuyy9f#gA#tYOA2{#OVbI-xXr9p*M?9_K8W65dljRc+7DY<~FKHTxWzSaDHEAJv zO)&_AoH3pmV`)mrMWz>XR4WRP+Z?XmVhj_{4$(yV2VlWn-uCuT(wIgX2B|JQma2r3 zFG&oGrEbnNSVnC#P9Wb!eAlmCcGN_~9+J?VkZhq0TkYTCid5ff&+bqkBwiGitu;nC z(IBC|7Kv|cJ)Z^_;}>@MqCdDGjH?^_|1yjIMbob~F86g1hBuPb=cWO%!iuH>W#1YX z*fO*tjZW?|0`eE}0^=6yyY6SH%oyosPZfin>k`w$SttHY(tQp_$f!jULrIF^TJev<(0wgx`Uzdgh}F6_#I)>j^`7|%@`ye!mXp%3)s}o z2(gtq$8|z?#BHVJ(0bj~AP*#=h03`+SK_N|DBf%~zONdF7Yb z6Z-1d#+YGIe+(%_zTCf`eolZU-KtwHs$7W?g>GPRpnx6Hx3&B<9*KFfMubZAW>Is* zwUvlEMT$vKUda;Y^AbF!k7lTzRBvcT(s6FSQ80X_p4hdxJge#T3agobDx;R!p@k^m ztP02tlhcl(lWt!v{c1_!??-c#evw>+h@7Lg{Q9gNZcJw$%+!P|6N#a23|I9nK>s`;3Mj;I!!S!nYQKA09C zj@xdy&vSCx6;sDI`hf0t@;yl}$B)fR+1d%8W~b60J6?cq=jA5>!LP|9*6E3wx6YfblY>tp`_0-mW^X=lQ6mc(vSvi}UtT9mne{A=ACE{=}Ukg&ZYw_$?= zM9;N-rsi%GCe?O58k93RhB@@!?|6)X}75kH+G`vs7VZDeFoiOB!Q{{HI&|NlQ} zng88H|K3QP#VE3*I->xA_`!wFR@{lTa+BKvaib+wULv|SgkuBo;bzoddL{z<3s zmEtQfVgU(_vYwd@i>0sfV{Fgm=+~mUI^M?5$yfgOj6;tmTJafSl(6gQn~!;4ZTjwl zDQF{F=sk9@>Y#sX5vgHi6{(LuCtqx+apg1)b`M+B(8alxEf<6rQ7S9a_Zt}9Hv*X) zUCxYyhr(C(jiZ)f*{Q8IRB6wZ0gD<7E&6K_F4v)7 zO<(8|U(~ba^gG30l?br;r6;p_+jHuQDg2(R2$VW;P3eYdX>X!m8NwbFyH(Trl<{ld z0AGM#e4O&}rIXm$cAPfLci$|CJdu&nHXO0#EB{p`mp)!u2$wZb^=h5(fLn$c42@j2 zZH&uuWoEQsDT?FC2I{PGv3^Bvlop-PvpPhURcwcmhL)~;Qa-PaJc#kM`t z_L^Pe^+~g?OfLPzQ`i^BaoOx3ls1uTy@J<_)O+ta^{X9 z-h^fz8T9WG%xBEZ3mpcGD)%Z>9($E9Q1;daiCbhW9GlrR{I#O=7^Ah|8sfU=+l&_W z+lP*=S@frR7^!cWJ8P_^*h4WMAel zw{03KZXEPqdU$#!k=0jFJ@fqbaiMH^%sUltjk6 z29!}%r^2QAVabEEMBvSw8L-~f}1aB^_iEAFqp}#ndBETa01iqwPWh( zR|l&C*1oPPJi-*$H}4C?w;BnbCAb~U)#-t4vH0M1;V)eJ0BYS@BV69gc z3*_k?npK0?D+JLv1H9-U?46OsN-;cPE2tSUSsA_*SvQ#D@qh`BV6SQ{EriG{Xwlyr zs9Dtr-uz1WGF$VW9ccqohytU#7qeHN8s?s>H$Xzg{apHvooiMwjR2+D;Qx70a@1KaheibVPQj zVMo`WEJYdVQz2hlEu9!rZz=t}d6(5whzkk}4r^n-H0s}{pOt%(bhy_&?-A4lla?D@ z?^2iJC-FqQD& zH#j65>KwU7P3oaGlx0k2OgY`>7ZZeG2Ot^t^hHr+UQx8Qp|fwX$5Eg>C`bxYiylON zmk>-1{qpk_A~2V76lxvb30%bYY0>{k)1@Do7M#&;TWw<9y6ijv@=L?dGw6OD;5vMR z$_<*;S)=jNQh7ibt!?{R37zF{x!}Foa%pe>4BOS#qFg89`C@MYYsRmPn8u zvFELn`TKdz#n}&scZjO`5z1u;B#SZw+l&Bzz+Abx*&wQ@&_pT)_qm@b) zvgXssAq==O z5E%Vi;v7xBB<(b`eNYQ|7NknK*ZYh8iV=$Wqf!yjVX%@n!PhwSEA1?1K74SZ$bq2c zW$i^#a&BV0TP9HTR-G>4xIJ-6G&J_*6<+1fwY9Q3$FA~Lrq9+T3K z-`6)WjLLJB6VPuI+Jg#QrJ|WpUS4KcQbx&4=wPCXdYqxzOEamq@5 z%yv}veNC1rHm2yW&No?6;|oULcnh(Dc2a>seKG@1B_E&L%ZGi%nE`4p@@X062d{Npu-8eH8?hI)&N}VWMV*fP#lXud)G>n97B=PIk z=sS%F(>IBht=_q_bZ-0M#(8uL$~Dqc4l_l^so?y+G-AqdBz@bhV3o_EynK7ME*Mw@ zQ$9jao*0WSKyjS{10bB1vYJef=MC1v+xJD5q&jW_1<0Dkc!B9suh$xllbb_yBp}%_ zcZ4;PIW5}qrniH(0gsAKZyCC;Tv0b4dl~o3zw&uJDL-o~N!xf&!U$(fzhSE9LQqo( zdD3Mt&Of#DwgUk4{z{*y=&e0402#VnptScCTYo z7SV5)j}2Q6S-O2|DQLzwsIT*deD*e2!d*;8@9hLUQ|-bWSrq-^xWd(I=pNa#BZwV~ zs`n4N#y!4NeJzcyPcjj#z( z_AW{GN=fm!#O#^HGx;ER>`XInlrFMP(kO2L{!S-D67A=PY&ko_Pk%f-(=be zxa@DqiMGC`OC|q!DRs<~y)%XuU&P&S+3F|h)9$fs2%K+f2qm=mgl$R`lD(gLCQg1V zUe^QjaA+*Rm*<=vJ6k;JNvi+83f9`Ko4B70S1WJ690`SRCmcex(hrlU1OaGb{-GX& zmlCJ@bh%bq&&*szt6kNL23;Tm<00w`aVqgGT*d=4#!a-5EjKsGx<(znwXr#~ zh5~kj+e@Gm$$s4&i8xxGTjxMf-=e>Imh2A#L#0Ff44Y)o>#0oeSk|ugj5(BUUKjz4aI%||Mi<9TIdR`QrEL zf4s7)c_s;N&JHiEK5Va98eIv}m^=3BO9$-;|B4p5G3t5;m%QHHgQ?Xj8r%j9s}~Tv z5-JuQH>R0iPLR51Tsyexqjx|n9Pnh5GVmU6ppCu9VIlM9zCVdy_bwfs8G@U!C=tXd z$gwpFjJ8zHFM2FKywiA|*@=bi7ilZ>{*3{`;p@ZZxLDqB58&}C((=AXL2i`9c=3DDewIf{IK=*Xa|t}|Y05pjWF z$X8E+?2uS^EAOo2@?-RpZ-COHe1lc>X|q*9+fQSS^II_$Y@{o6BOylmr^VK5TZfZN zPN&4`R_%IKRytH9cKfsz%XFY{6`%(5ls_JjR zoUW0d0_k7uqU`AzJu)$+n3j*1TNxYF!JKtu2aB`mn+xlwS?Jveh-goWzIoJ zs6n5W(B)>ge^h;~9(s1uMGPesUcnA&qYk^%3r*qSD{S^zg;X1Vx^`MbhkpENvZ+4L z-owPT(X)W7SGhM()EjZw8w}+#RoLc-w~kKPkiNE2l&q@aZ1&01EZtBz`%_hAi~k$V zu#)JrV#>6Qyd7$w8UrFIw4~DphXrGq3BZKIL@z26-4CosNPQ565x{>Nx=0Zx5Z1pk zoML2*$2WSB|NixV2a^H<9kMXs$^zI>qjw6N2u^hgA#-}_lkbzTX_52UVx>h|HdP48f&|h-b?Q-4g5yA$t)#`}*$%Pt zO5<}vq(p}IjA)G8OHyVj?Qna2RUO52N!25Qsi%g17`s`}Z*omWZ;pR@LYC(KVDns9&h#HXzQ|!Jy*lE2BTjwkYQsbNZx%N-8%Plm?D2 zwwxlky5r)pnuEf}^)j^-73e_MXm@f-U&b z{fh4bh*A&&N)XPHyRISyW({BoCDTh^B>Z&Q7^d4PP8%*OP0|MUBgjHhagH2fOM-Y6 zAA2@h?e_SNYcgJM+v!lS%;q0srQ-rWkNIC4eJu~%PgS_)A#I5cch(`1!a0!~)fkld zC4OmK(s7VP@ zm3s@hxDmhLHfl^~_aF`B(;1xUtulZYj?y++P+HJ2>$B_e%4#Yy?LmN(i4jS4@l|&a zFNK{}kf+G5&s^7RNNVHzJMKPh{T><5LGQdZQMNpl_Jh6eHRdDi?WeP+);O1P%{7Bc zXj0JTQ~4SbN**Pjb}xm7v~@Jdp)xdzh1|&4>r-somEnxXh|VITtIB#uxHH8vSHhO` zX2zuNt5`fV{uYS*MKyJ1^Cq4itrTaWh?)#24|~nohVfqR?3r@&CBG6uDPU|IbUwJ} zSiTZv%zm{YhPI{UDsZ8~8z0%}I@P4yk>uuWp-YO5{BP;nBfw&wu$9 zGL#is{9LHL_<4^Si5H=!k)lJtxJ}gr__=pY^cTcLMqZgE@w;pu;8)}B zd+d)n(iaxmE*$3iWhvvhbakB!5G+P_WzA5Zrlo_doOO1%o1r*l$j;_w%=qND+O0*S8n zj3Ccqv+iT9+q=cv+m}7<5l5GGrZO6z0FtLc$u zoQAIq@4_3ZtAkt_)zwO?y9`yqhbphsGhHhv45^IGxXy89>$qs!bZQZyI~O)_AlwaW zXbpRL_S9VtILNSZkNl6{2p83|`&7#7E=nnGeLb#>%`L_?%qjz%NTr~#5yDTz1~?eXLi=9gfwQcBFRdoGB(QKgqO5;ZB)?=;AM3B z23sRdL3` z?B~+6bN4lXa39`tC(${PC)xm`dzuyp{bbvYxC7D(VYgnP**iN=i>0Tv8QbwCfR=jek0h&Oi&H4_C3XE*HtaYEQ3Z8u0!kDv=rTumwCBnrDb# zhsA68Q^@b>UZ&}oaFZ{yFh))KZa2Flja+GT;0_80_(sLJhd@Ivn5hFsTj_26RKs4X zJIL2H;MB&<>^;`IHZx^!!$ar8dY>z#D<-geIy;xbVUij}#p5X=gMj`5Qqe8BSWkoD zN9(Vuw3hfNEo}0?$^|yh`i*?RYQ<#vg|GK9=})3lI%vI<$iLqKrGI&*ipmbnvdRR% zTmBXjOgRST-Q0hE|J4J8`?XPUfMK5Y-IAA~)Oc>;M_B4V05bFo_OY5m#9;V?qQN0>>lOlOA!6lavB|JP0W@AGdsD{{Yp z!fCQ+B(i$LwVHxHAg}w8>CJJp4C?Dr833c~YZ*Xs3ZXSw*mSXu3W`GH|CK*b0tt|c z6Uk+;WSLMS^)OlKUm+;#|14$Jz*z9y9s#0h)mChO`A*xfoYF%;^Dd2Nv^pHq{3XEa zz`K>s-~~hmF{NSAT63=5+EL~?x1%js2|w?$kW+O8R|qAp1nRwWEQqj%UeLoV|70aN zJDco>O*k0tw$wa-oBBiPGxv6|uR*U}|D{3g)*YNGYkc~OR;MDOMg4^luYDE~%+`I& zmx*-M%c1)I7Rj$;p08mAU3b#pBrzJ(k|VVw~075X<9~m zRI5Vvt4=Ip5K6VP3Q@uJHoQABp|(NpG!N`DAQ!{Yd`Zi1$i;byuGWl|-+c zmK4Sc?_IRM;QaheBfpe*oW4ciEC)mywWV}{g2wQQHxdy(7*vo+apu3IO1L;H@DLay z?Y*5%u?wwEZ{m|YwHZYGj8`h-n*31SO5@$rfH&?rmcFtmNUFN|SRL4hu82-krEVv) zn-zAIB-5dR>y?A!qaLz~rktF-h%B&gHN=u2*>t4FjbQ$0J)dy2Z}rPA{{YI_bIX0$ zPTU+se0JyW0n&oTx{Jm&eg|#>xE@{c7S{91>N9#G4F|A!j_Ns`@)+_pow=xoqeK@~yGeNd^}-$ENHRSW^iB0yH&B&G zzO0(RSp(}!McJk8o=or8l!h`cMmG_V_z*Mz=k)7%Hr~dL0cwcvRTA{)Op- zQjjX9A@T`B;1kd9&a#rv6dCdRw5o}0W?L~7rk^78=6Q27(H+C)T7y>@4cK;5@g(~z zT8+teTJGr4`+uxurq1}gzZSdG2zWcF_Yc5aXN2flZBYbYz}Wpk@By6ezMPSleZ~V(9b8mnRSa=7ta8Wg6ajUOu2PE{&~bKq})KL@{_IaIxv$ zZ@7Bc*{q?db%KtEGEXedYEE_=e*L7oFX}W@tY@hf5%zG6aaar}U>e%XdX-M2f&=-M zA;~C@iNe0v4>-%5JMLvI$z67CXia66C0Z@eST@O4QN8cQ;7y_XpivsDcs`L5EnDTA z{JiTryrQ(8-j<(|F5kc;$zigcrga!aKHs233aZcj0R~`o&BeU?aSV*JE6kyM>$^;| zhCg2+ZLrQaERnC@Ol~%o#SigGhyX$^l5&;Z6n&jv_PmeU6}0f}4#lE?NYCpT3PDw- z9sZV%ubI~kPn(dIn0h)T`kOizmCZdW<0UrTeTErb*#S}vdxfa?K$KSX_a2^e5Ci!T z&p)EHPD(r%JB0bdlMwl!Wzzx#HggKVYCqaoww-^6rA@iar7p}XS?75zInUMCgEX;p z^}s?lyn)WxBTU97k)_|qzF$MBI6e?I&wqzyzl1vZO%L-pTNu%~gj$HXVNcH#xdSgB zSsh{PEFXD!(W4Z@&5gOS=l=xq#T)y6%`orwNlMo1w8+^nJ8Q+~9MGZMFd77GP`dnu z^OjMk)i(s<-`b!l%H=e~79~)8e3c4;+|%sBoTsP@a*#X3yR$$3DRmGRWe*elkt{eq zVL;Y`c%P)Sn2}ico}Z2|b8b!_q2&+nd9~LGKZckotawYzH*(E;M2vXd*HKkl8$B;_o zotskoC7FW0Q@S`(x^Ap2&0BcVzj)oD(cETx%2%nb>Xy0V{7PD06PMqDZHL@*o2_Dm zKMN|l9;zg|=aG^0rG^d-Yjq7CTxx2U&4T_x)U)VuF2IGbYazl&s{-$+{JOYuo1ip1|2h-pxl zt6XYRa~!n$E7Ry%;|qAS==J)JGkO#1SntG|S=lv?E?m~K*6f9sl%J|~#j9bd&?L&x zs(ywit)nebU>npn+Xrmc*%y|~hBA5>+H22(GIu9?PxJC>{)8SQ)O}w4jx}#dh|z?V z&YGc9H3)r&CXtswnfs5brd2k!0UAbi8H?Y|5BmJwY!*_A#_Fbw6PF^pT*D#eVs>|{ z8o+zrrXOK?ZaJgDM~Susf~^ip16jXpKIf$28O2nT)54z$u8B?D#FS;;Ia^oPMwc2j zBKz*c=EP1kb@@M!VZQcx6SK(XjFfo-)K-X=389iJdhNP-iQ% z;3;XC!lFBgIri~Jqo7J%@YR=z2;wM{770sYR-ywQ?3?&p^}Q(Imyi(kL2TerdhXcy*ce{ zz96eVVO}uyrJEax9JV)a64P+eze#}eW7FenqUK0Q=4PK{w>DD^kt=g&eShi26k)T_ z2C~oWZ0UQoFN(rT{4a=hLBuE&G(yxvuHl?vMw&}}xRO4$Wni6ON2rd&ne#^&rJ(4q zu3*Zu4!i9dl}3XfXK^P33B%QQ%ang{0RCM4Ds~)sRNJ#-n3QAjygRu^WX&q2Hans3 zfa~T3L^T$tNC3y33}%+<&noy!1Ku^b1l$VU+4&zHmHmtryUdgGypf9-v1^vJxpc^7 zTY2lm{mtJ$P95At$lG*}9}h^kp6%4YTOATtYfqDtWv8-@3MKdq(al9mb5{aK@4Uh` z<_neFb0?VwRZjZd_T7hfM1i0YaY8iDFtw9V+OT&h?zHyG^B0Hez9l~nMf(OvvX75< z?A4qv<7YorN)22PeB2k$WE7=rJ(d$jO5Wwgk=U%lv!o4FO~Y*lmifTesE^YINA{_o zz(EYOQah%r?s@>b9n{slv}`SHME0#}W-QTpNmNyYKv;_kFvz{!hNzbDOw}W2CoB16 znSfjZsAIYcWD;E7jytULZVzd@g%bk06W#ultASuyP?8?B1r12?~ z)$>$nsmAMKJy*|a0E^kwkHQ{%Ia4wq5DZ!RalQ!bQD^JB zt~iTp`^n45@*3C5{MqP7 zqxX0i|JSJTA4DVmNdLOn8bSOa{t1C7I1%0~7L4;0RDg+0#hYDvWSS|A$NzQk$s=M3 zFt<1=e#d;{wuLi~eY&ex;(=KdNU%Y-Y zvb`E%TFXC9BC>5$qOSemz5v%xf*d)eX6zz*pyJ*dnr=@(ddTQ*G!U^ANHQE@WcA)! z6@>u?vr=Ru+N#FGAh6z-mi#Ksdsz7GDuv zdNkU;5iLCP{fDDNM(R%o?sel}-v(up;U5$&eN<>t=LR9)YZW>99c_Iww6ngT4&OGF zwTWQI>8_s&`d&)4?^@DNIPx7WV{Ku0&pvH;ucqVrU{uoA}#CAOMSnh{;?I65x=Y5 zbEuWJ(IcPN#mEoDT#Bno0$;?&Wqp2By!3tk$iDN-lmA460fUni>O z)SNcGTUgt3QI?{mco}}>@XO#_ZAI<<)MTTDetl^2=kF;gzc$kvd@?SbN=PzkGEbd5yRKJc`@bIBsj79It^fjAcTkF7u!%>onLKptb?7!BHAa z{Pmg)5gZpOvsQcLZ}5vD@mG2St$DJIeV!pxy$U;C5dlr&X$$%nr=#j+E(zDW!4`D; z$sEqjg?U?*kNZCrMoJ6$4&QwP+JQz%AoXf$cY@pW!dp`6qWW`!-WK^E{`C1Y134D_ zxR{#C$FwXEgn$=p!PG2nkpY%lO5&RL!%f8l9jjElwt6cB7~A~j7$>H`y6#BK`Td1+ z>It>C)OFh#aaOaWAK}m$mk7?pQ}tZ|^H39+(FbUNg*g>Ds>fRELoIv9C$RJXL^I}?Rx0a1yLZeG5uf}R5_sV(!N`Qyzxo(=DD-J=! zlB4gZv0W^IppPGhMvM$Qrz`}X3L-P2c1C0?ArGOo$l!2d@mDAWj?ZlPXxmW{uz?L z>!)ps8dYYVTyVnzEJz7_HNa$yQ>a$tiBs^^HwdK#(pDZqUy>=7|6a2pj-9QTYr;&6 zki%lxshc`wR)=(3RM(9JX}VWAmtCCmk}oj-^k#RSpi&gVrcS#tRO(5?1`E z;NU+k^@z7X;@sSiEn0;Up->NC->zF>Se{y;D1{WX8D0%)_uuF9t}_t}4c645sZdkj zHYh#%YmBJjRjT#w{R1F)`7jZ0W)zripmG~6bpO2v(Ew`PYR*o9=~|Zt<{zcj$*?CD zB1chxjl>i6xMc(+v44OJucF#~aq4BX{^};cS<@oEfq6dhF#0V%DX!kyHfCvk)ZEoS zd0wzGU+E3+QAo!Yt65n^bz=F>gTL7zhGV7>YmBGsrEWhHghM9C5X6YJ7dVM+}Y_=zaDvNT(Q!mF=u!Y zS>%;`%WN~mRET>n@Y2|C21!eJ?$3HsWeM~g$aK7*&6wGaH%^i%+UOBtVKx&wRaytF zD6RI>C_eI0gEChdDwHQScmagwkEVW@CNvb}?wF^m3!8fLE#Oea@O<3z{8 zd57Y{jDM+S+!pB2<;HdO%DZZH>!hc*}0p2D^)DDLY1fq#VdP|Tt6W?N!OXbI*?)S@JN4_tt@q!M->W&a(%7+dnq%E*O?jGOeel9bp4&7- z{zg0%Q!qKr?1UzT#?o4lT=9!yfYS0xEy1d;6u_2RmS40yIF)CQYfG)Z#(ULYD_2RH zoRR%T;6k*AKwSzLGa-KQk6l_(ZYY4r=+~RK5~8S7r?GBG<7Rj_P&xG7~+7P+AseX>-pI z41bf9GvF~BvLo2NDy|boGnMf5TprLRip1 z(m#XDYLnb(7a$N-h>z8{n@e7_VH7y4j+OzJW!!PknO}I4%~EZhN6A=7RH#j81Qk+x zI5n;2&E)Yr&##*$!jMsW-X|EE(=?>MCZ)(sRbT-mMfi!k+`dbr2`y^;HMme)apb4T ze)HEB>N_K%oS$DU5N7NZlhd?4Z=$?Fbj2w<(hAN~@-H1X8lsl_QwpJ2{hs*nz|}}& ztG1oE+4sOOr|9SDxU~7J**ZD{lEZ`Om22tAD61PFIRO?HsF&45 z7sPlfm6Qx!CBYw@0Nu{R3phe?+`#C+DfsECr^4m^U#S4QoK3X^QcklCI> z!ZjW|)KLEbh!f_fMNKo?@UW1J^>ss?pAP|AA(AOhCW+bGBP#y@tsCM}Q^?)M0;qqx*#X(Ltd&X1oidYz203alg+>Es~ zETzQYtGhIE)6^H7@r4Grs3D2uM$SBxQPi*BOkg30CH!>2RY@cN0C_(8sMs`}z*TlT zgR5Nf{qn5e8v)(D)@>GrK~UEpg{l7l5!ucZCrBf98qc{Oz004lK1iahl=%yrfw4>m zlZ|iNzUbQhU}_jbMuNnsRutk0h#~p;BZ78z94MwHhi4q4bD0xzb_s17lO)Mr<`0At zQ8u=v*wc}fT>AEdvk6k^>dcKF4n9FT3oN0msnp$a5(1FQve$=d+$zSuJaST9muT$@iNV>2h^xxWERBf<9w34;A;kbLaVKe8##^VE`)+NJwqSjjx*eHk+&Q9Cm2SJ&=+D} z0XZl%jU?@qat*ggXFF~Z7?&NlRQE|dEW17TMs_LXhbx+Qxu4je{D3eTpn8I#6Wn~U|2Q#a@u>T|I3QyG;C4&J+|jo5b! z(npv&&Jx?V(ILKNC?7RKLYv740Vs31NZ@0Xte|3tD2Ut97(jiY=1Oa^rh22ISU<^I zC~4x7Ex*kQMdFpx^#!h2<7>Pk^72mu7|-IObUO@PEojsZMKpixg=1Y;3>UgaO(R(8 z*y!WbajDxJ4_pKHFD6#9I{coLe#Bfb>=MAv=?vjG)q^!bpopVLVW5H{aF7Oq0R#*P zAc6o0Ac6o0Ac6o0Ac6!0NYFq8j|dbH07ZmoAOb-Gi@xXp&_JT!34o+XA}Ii1BSqN& zfDHsi44?x+1P}m5i5dn35W)xmAc6@1q!LF7NB|&$2pBjBAc6o0Ac8;yXpx`*Q6NfA zQvpaMzPC{`~hBx>0fv`|>)P|nGs^fjV_#|cH0(Q!l_zQ-xhta~W(m~@R`%iJ0~ z$xNGtCjz1(f3o0zB%d9PTj-idMX6O)Ua0BE$0Lq^g`}vg>Ka*Q5yTy+{{R-sT;RK9 ztaE)L_g?6W)g5ixT4&(4EhKDmPxvaTuA!*QTF1u1P6n3e^U8;x8uDCp`6b}jm-?jZ z^;!C6)YMVQC0$&MILN`%`C(x$bIVrwp%Td8(~VA%$0~oBhlEnnN%qdCJ#91qnd%~p ze{JEvnyr6SSz94sxWOaGA|v7-^>Vos*2tMq)(2^8hII{zO|Z>LT-fP|WJ8xYC;Y|q zhy1Etv#iwhb+QsbGst}+BmJx)Nz~ERzY$ZtjOSd0e=M$XBz`=N(NV3(8CH}<^w1WA zmVmOBqHl%4qSHYdJC9V)9Y=>rPT5DE3ZtK^ZqiSol0^e^f&&3Rj#Wh0s-ruif(C-! z^5cb3J-)J6y0W66#@8H>*KDC?$o!VD<6a9}=Tu!IaAT_{ZhNuXeWOM3 za63LiNjnmWCd$f4VKzPZ*ZMk+rsGGlL_G(+5%iJm| zgXRwj+V)K$ z4w6&xch2gU2vpm05A?XPI30mheeZT^1GcIvS$)IGpfGv+1gt>4ih82aG4!dIgiT)S9Y?w!dB)HUqM@ zrJeCKn90)9!9tY=+eGWHPqvmO)I|4aJCIKbos&i--OeN(w%DyKy+K7K3^C5)*KkLw ztE#zEim1$RGeZtX!^%ocjm08Vlq{NPT>VUI`5<7a5XBX$snR{NR8#&St6DpyB(y?$ zkj94gAyrk0?#z|;%9!JX9N@Q{CNJ2gyD(MMm%|&Q)x$|kw>8kyNXnT(kQ|1m;I~%( z&GWyLrLG)(%2mqMM{0=GR?8%k9m{dD9rz1gOx@19O1HPggy@fq4T^K6<%*KNYTCHY zhPUBw{Ct$3*KMnT&{0ygk>l+a?orav%T-A$%#98i!#ws;C~jLpvJKMz042s5q!hu8 z)Jsk`!lkUZzPg>TNYXR0a0=EMIU%8tPD^At8VE>jvGGzg;JME`Do~|Bq-7_DSY*UA zkio)eTdTZgN-7!zhmBke6zq~MC!O-C zLDh-RnkXRZ8j4qt*Ex#j&(v9{bxhEST+#c>NP2$NXtmEJ&XmnjgQ8C_lFQrernT>N zzLm^tw$gk35aQ63tQGxH6=d#`S9pKf8!5KFqB4-ka!1KTxzRyR)(edzV{<=vB(l1m z9RdclG;A;es-Uw~6-Z!g-w%oo;3}Of(dV)70h=Ue+{jXpb$HipNFX1Qw1}tEwo?Jfu0TdGlP{T^ma)bg=2qDs1)g)V;cX!@K7gSMC$DlUYrr-Nt(r z66V)x(lL|H6>UXx>8V;Eb6nx|PhIZO3L0tY+T&11#y+3ordd*HG3;n=YEbHPi~>B> zTsG-vl=L#>VFmOrqtmG`$s&Zo`~A( z3GokrMq84tX(^jgNr;>p;yD|td08Y?f*QwojnBeLT>^H=*6WmPl)d0%gvE6^xm7jJ zoyH(?7!JW!R?xndXH?U;x*qKER^2gI42^WMkj8l)T2PzlZ6eRzqH7zVW=4+aq+ynw z#m>~b{CCcP4-`1GDL}v3%^q z86eD@WGObNDOz6kN%4+yvn{STBgIO6?paxn8Q+FDS?is?ZFA1&W#r>b9tu=_D?U z0uOMJEOeC>PZJ+NcvG<Q>d90QOm==&>V$*Xo4z=_CY7XPT{y6kCL#cpzvg5 zWx>%ugqoXtfH*^j=^GsKr){#gQlvoY2xOtG_j(v#GhOy{jFOtP^tJjnR9vU0F-L-Q zzwIBVWp!cdsI9KWbRp6WfydyL)&9`uskhBfZl}|!q!%6eR;du}vohPwE|<1>8?0@B zv$tEL06h4KQ+iJXP|4NZMEd~f2EnmF-~lQyqDr zosBf}#&vq4+U#j3(;`g+W8|EW93(V)DiBi~ zomc}slseJ-2Yi&-GDpcps|3@$`X-5IE9%zis%bb2Jtp~DUa}w3nYYbmo(>PqO#3Nx zHZhatkU1nJGwl>GH&6mc+a(7KZt=smd`^OS(=9?UZCnZVynt_!eqC?=XfamieJ z*(^_z#Zjf$0%9@r3$1jwi3D;C_gor;xwF^PH?>iwlAreNb~~uuQxn}z!q(>;q)T4- z@N>E+UBryjGjbOkRD2uB%I%n%ns=8Ipy5O@ka47pdM<@eJqz}ctq0_c+h}HfrUvC~ zjGT^o<{hwx9gX;15>B0lVY6BlRZmLF*B=OEdL{{@92(%@u554c>e-(BDKd2RTTj_1 z=!6#8>E~nI!+?B}Y_1ur>T+FbX#|1*+!cs*eN-nA&i3QgZ0|4etpgkEu(b?xTy+8m z$xo3kiyAJYxI%ZEQ1uGZpR8)4crwNu-uNpb)}JJA1OlppjraL)1HcZ2+xjNtzgy~l z+e1n7*lH(zCmX3(YpqosK=5CXMt4;e9a~l#g3x|TDuQ%c$(F9l zn#)Z~GSJRd4A#1)xx>SE+^=f-vT*E{1zR^(%F;=M9H+Jc?qn!xY}HN#h{~p@v(&y& z9T@|@%Kopb=OpQj0I6%bnx*9F02H>t3FMm|udx$N9=Cu!O0PEB2te_k*LkXojq0vr zg7Pw{r>T|a;&DGz_a)JtH`_NHSPcQH13dPZZ_HmUCrWpnccR+;)a7s5hvTXK`M8JYkzN3#M)5&c!zK@Z_mNI6Le?G3Fg z=;Iq6M7s1JL6sM++9J2nGA0oWj&7nn@v?l=3Fs=C){!LcbgXZYt- zBR+_uGP9}cAL7tN{{ZT6-^b7HOwn8;g5y;7xQNEzMAfvLoyDTC<&m&A9)Uw;Gpa82 z(8Ykja6NEVZHkFCZjK9-kv9dE15%S_sE%4n$lSqz{N$+JNk;fBbk%Gacpz8s!#7fzq`5J>fmTXg-T zfB3V1n#1+B&^P9{M{7N?r?oQ{53YZ!ZEspL{Gzk_$es}c6BC!JEek2C}R%!BmzMAvQpW*Ny$h#Cjh1J-ML6~2LeVi zh!8s<{{XYCfuEs;1&eaU|rDt-5>qkE-)=ezECi{R3G}NdO&`$j1+#`Uj1NxbPZF zLC@a2j^^v~dTZ=8%oy1y@{-Nc#^qqmPIk3lxG*poXA|9g0CGPzbez3dN-+wV++HC@fx3 z%4oQv)#{219?BU^XVo_)R51SlTRd$3^MFMKlC=z>sZ-5+Fd+h!?vN7&M!BZgl=SPbMiMX+^VZZ+6Gcg{VtAdoC0}K?!@)h$0X;K8n)uf0OrK~FuRn! z=KK%XkCUTT^`voOwA62z?)xKN59F&Wdbar+*bNOl0pG+6w)x~NZKmoe>e*1%i5cs@ z67StXC2YmP!Hol85$;H96iZs3wY$$dppC*Z4l^4;C04VjE|OKd-l{7c)@Lm79Nhf^ zs-(FZSF&Qz=blxRJ}qRj)IFo(9C|5olk!wzljxNl#r2f_ERngSJ7Vq1)v?qP+S@fu z#utz>0U)2bbLegby5IvPry)(Fxk+DJ94?DU8+t6%RktHaNzzEtNLgGD>cU+U2gKsy ze>GHUVUDasC;hLIdWNEVeDc!#Bg8tk;{`&mq^EV)Tu=Cma8HuQVzXWDjXfp8k+j9P zACDv9J=SLDTKOsqt*0h8WCt85l=UrTbD?>2gGR*mR!U zj1DZ$+Psyus(C42E3Oq@CXtZPpi@sfB*|`1lTslMZNy7iO(2QqXE<6m3arc27F;fw%?2N|WZ zM@?TWv`vb+xFe1DNvGKDbUPJ>&}bUg(y`ST*~D-6sMOs(4NXg-oH7?MZLDMz)9W8W zR}_*+1Z3^HpLyySE-^L;qdLI*Z9D!7(_}P}0(%WL41~T&vU80*Du*=A*_hqKd*we> zUc(b(m`V$HE>$MrWpkMfWvo1qF_h_xazx5@vF~d>)0^BWwQ~ms z!Li45SgNS2Yg}^TcOg0!;zWg_cWG$B9fCNekTLBXc`KSbbITbdxC|R^cPOf+hMls+ zVFM=`y%O41;()-)lE%PsE_cpTm2~q`Qn}L{yd9LdB&Vg7k_Kl7D(>-JNq3`bu*kz( zg3*DLRRxtcY8s2Ru2;t^bb+%8*+{V1u2M%UDUO$e@eN9mq|%ogY|a3EpbEIM-k(Uv zKgEBGC)!SlvRy@0RS6MDa^`RV?w!0_?(@SOwWc2iL4X+Sk@H0xTXA`Lc+@u~!-Z>O zmN56SuA$OG*6`Iga8fcxOLMP){${*kt%OKxmWo=|eAT+m~f|CWXC_;k1frz!e6%3D>!Q8g%$rMSW01qBL2`MlH)v^Z=bzhn+oQ*D)ZNnFR0*yA~VP6$JM(h^=v7;iDv z%*NJfd|>g|rmn7@g1g=*-5hl8A7#4*TXm&^CWh0zw8!7gM3L21afe4Eq-#b9=Lp<1 zhi=bp$_L3VU$*ML&1s59c(UX$a1Pli`Y0qVds;^QoUcVKT_h3BHlGU^%Xm|5vYiw+ zIU8XV*CH}F@K&Zl)OaCj_Zhwo|SR$OL?>w`$rc_W0tuA`sdAPsgk z9^h_{dMeNeg~YL2^u;AJ0TQ{b1Gy_fMGXyQ%iWCOuw#~veGuIU$Y(u1H9b6~>}fi3Rb%NYqS52Dx--~z`l?kWXi2dYG|@7x)t6xz zrUT&s{%WHA1w4=Os2!<=*$oX>m9$P{8@n3Ue(xYEx|pS>EHFl1b#0}&%E`lQw^>Ng zSc7A=iDapJYP0=bMlteBuEUFE4$IrQ1xA7z+QtS;O!(vjI<(-Yp9M^9%#Le^8Olph z8E}G?kzFgDIRuc$9yn3&&yE&1-CA2GcIRTWbkfn)!%o_YcCpd-Z*rquE#^rcWv6pt zKVjf3F>7xl$B|PZwPhu;H$elQ!PuHXrh0F)A3^}g1Wd{C#Q;67slg* z>9X9}ZqyXC%%z3xaF@T&b$X3U!yVOQmmHKVsC1HL(L7^dPT5yB{{R5ewSW;jw?2xm ztSbKiR?kkr+_poUj>(HnRIKqTUg4t{ZcgAWR$a+7QeRD)mu3nX0RWITz*UykRhgY6 zu5gU@JRt?mkvXSUp#Is)a`jaqq7qXU=gY}&3S8Ni)=l?@M>c@XMdKWPC1#l~HnnPX%OhAV0Hp+ujZK|qdvqu+(#{HKT@`rr~9hI{~OJS|2anmyZ$pO4< ztLko1)mOSx@WbTp>4#EOO;YF2oN@6d9b<;7l0w-W*SC;-lHBTsqt5`ZtEUh>)Z`Kd zc3IP2>0x__aCqP=dK*j>!TFKIp2vJB)nSxn(r9T3pmr+BP-_{99Ok{DN^Ra+a$&=q zLBKi6J4IX#rjlbA5)a+R$#gR^rlr!B28Ruk>|F_~xyLmVqj@^cHdE~NGI$Zk6P=fA zH%4fvS>jCQ2g!~O;YX&Y@m>2oz|eEIWSpte9bYWb&wH-2N2W@gySDiSNwWJ%t!+t) zajB!YSq`Ubr!g4|vcb=%s?SkK_t%ik@Nt3NJL8dad>#7P)-g)*=|I8kRrFm$Zjph{ za~tQCz#TNuVZr6URBpV=)|lNUK^VqTNj6sYk3=@%Lpwo&Rvh;U(EyhkWE=Xf6=uG8 zY{s%jJn*!%9Z2v&Z0;EIDz>i-e&zDf)D5>F<=I#(=q;^y^a{$3`E#gq8AcflYIwuTMn|gY(^9rxK}r2E#(ty(qh zoCC7PxNdyZ&#;T(4UT?i2%HFUMmatHXuJ891qmkyWTz5)BoXn1w+*)Jfg`DVB5S0z z)?wsgVfh8u>^}=0HDs~u>dCB``Ofg?`eCE0pXkg?JkU6Op)pQ%=wJ$);vCQ7Rr zIZ?w#LcFM;%L|x6^iUg4=L4m?t|b{Gsmd&Z@G_i^T^u-ql=@jiw`sy=Xq-DMjhVV; zhSO6tk+^E%M5w;h(a!de90E;-M+qF$Iaqx%qf}YwCddzB=S-Bw{IKBm!Z%gVt3EV< z`Z%RSqhU8pK;nEiHAI)CU4w&_Lj}^ZCww!!{K~P0`&$)6d3bYNa6v$+q(`ag>7swY z(o|XO)mX`lt<3dK6pfrT6O5|%-j(e;5 z>*(d((S+Pgx5#qW2DvWFZk178ej1+Avh{IpeOA)8nkn`Y0;wx)FTpX8LYEhIf-^}` zjI590^Hh_99COK9`rBm82QA8_tF}*qbP#??ZDZVwtxIt3>biFBO48KZr*?m4a-hv- zs1cK=gtoG68CsTSg%Qoj<8`Dqw>_T`10HEVt6+#`M+1ayVYwB(I$s@AoYBZl-EFee zRXzCSUB_2%qCW`-%}1{43TBK(234fIk;{A|JZw%F$Rw30T49NU!~h>uDzAoIXbFn? ziDsf~xyC{_A?;(2_gEW^v*@BavKF6&Y^mjtmt>rz2NAM24{2#7dvWl9ru6+*YmTlo zk`{LayFJwFOol3;?nVeeQ2dp0%YT)D?$SFeM~Qs*3puY%@y|PDU&iqB_K*lmnaHRXV7gyUh= z*eb{v_U`8?(9NdLV3P8&M8FVVLobRYy<2-*&n{&@vq0zww#b4 z*69b=bdH;a=CZlO>1$*l{pwjJKG_SPt&%xG66-khQhI`#qSIduNR7>gL8Z>ebLOq5 zY!G#C#qon4qmMlQ0OYy{Siwhm=&GM`jjx};I}b227E$hnC*@ zKdoQ`&?=|S4ZlzJxK`ad?A>9{m|Z$=)I`bfdd^e-04Cf0DcSif2V5V4o%dV1yoxFz zEu00ziA?1Tng zgOr9P$B?u4_LG7KJ7Hfu>B?eSI)~BJ*3$+!(tz?FGq;+{E2L=-SPUg~74s*-umWRcl%#ucYe59rN3vb_91tas`^K-ECd8r?ohQ$fJpMW-iE zqLj`DlJwE$_#SRYJR@)5lbX*=N%5;g;#xoxJv1I}S}9Ded61@(U^L z7|Jh}5e)By`@kj4#&M7i0neK9qs~Lof2MReh5!LO*)vbTPp)YjE`kWqK_Y;HQV9%5 z*(oH9ro-M}jXNh+E1~2O6ln|zDM=_05F`#zQL7`8Ll}&JH_B;S6X6Sd(U4oH5>dp` z8V{mo3THLN(iWE;vI3L_1{FG7AuD{a(IY`gK_G%6P#_YEBPffKNlt}g^RgL8$}LII zSfYkf3$lh$KrI4OWyp*0odD)hWi(|TVE|m#?87J2WAjcn zimBYOt^V`B!6zuMC2W_#jbkKvA+1Pdx?}d=8-7_o;GAW&e*C2Th7`P!AGabOh=#Rb z+k60Tt=~6)f?FvdZ~YiQGEe5G-9uQJRAk2`8%v&W#<|}im1Q+WH7F#8G>;$xi&1=| zgbd2kJMO3m}hP4i-l3 z)m0aYmd7-XjuL*z*eQC6H%S^TI`YnuQC~|8Z+WYL=;Q}wQnRb*3yVmXQ1TqCRXwTF z*5W4v8-R1Q9g-`X4JBC*csfU)bhqSvvqg^@@M`M%!Y_Amrg8CefYbcd9ew`iQw!e8 zx55VkJOx7Mc(Ud&aptWVOv6NEbHD?!{%P-%@+Anb1!Y~vzF6@kWkil}&J2eMxS@OL zT_n$QUU@mrN}g%8d|E+0iiq2%2a|zfctK*)X&ZvexC%AARm0v|X z(aP66XM)vtdb|pXD58;o5!s~_E{aOYCK?`hZzSVn+bZChuGO&~N=NGgX-zkUv-Z|` zQ>ZPpQBsMT;p68ex#0>nJ;r6!_c>c6%yUFtfp+O)FpWhj0G9A&GDo$Mt#QL3UCm2sHNYJ5^dyPU(0IB1sNKMw(yrCahIX=v z`i3{p_^PU_(RDPD$r;oJNdvNIn-Mj98Dn4>k=&EM>G}^B-r8M|=W&%92E{XJ=8dJL z!;(2tnKP-|Bc)~~Y4}M)K^BV|$Q`J@QMxa1YiSJ6c;9dm1#_K5*(W=B1jv!~jKCxT zz)+E-p9D&(R`{%xmb`fse$Y;@Q)*r*)wr7JT=W3-<&DUWU|vSrJ%HVDxy;*SJzTW6*P?@vLCcZ2@_8N zhr`qz-{zs+VW%|BjDpwWbIPx$jJBE01i9JxPjpp8%+9f%yOPj;3a4y=cFaGh*zrzPc~&Oc|mI7ITwi-l7K1aa>7gWM}Fnz_=zKc+w( zmh4M%os!)X;PL0c2bQE!$8LEoAeMoTEGC%PJrg`C=vcS`$%#Kv~d^%|x35=Zm zl!}O@bm7u%5F0fX6iT;L8vMFh%uH_hOjp%J_r5nfTN}aiRkJbS$KcY^cJe4xN@9{W zHXUAW2(dNEDrw@Cjbtp_vGP#kra5pj0#9tGCIH8nW5b+4`6+j3nQWqhvX#N|0r9ki zFhizhSt*0w86l8k0B#arZ*=xKt~90CWANeFasDbTEnIgxSNQOL-P<*GO9w}aPi8ex zRgVsOh}|g%_emRmK}P=ok!1R5qmVFH%ShRa9Liz0h&V?>E1D#PyE=~B?uqvqY3RMs zNFNq{$X8Z+n?#h;n#17E2fzXJT6P@~?Xyj74>5dAe$L9WbKO?P8Jr%$j5En*YpYyX zV}-bkK#Yp19VYaRAd>nWm!v9i>- zOi0MbWRq7(A;j^AMmXPu?J-pkiYTjD;#0`*;l>@Zk3#8T4~I^m_h4f@tGfktExtxe zBUL!D(n}ctX}~E}H&`iJ84H+8u;&1Bl_A@rrr}R19vqQ?5AR_J=ncK4%xQW@~`une2)~Lr|6%xrb+Ykfh!2v%c8M67PY(yhkdo zrs*|Je~!j8Nd44uSH7*pPYYPw_83C^10~w#sfv`(BZ1Sf1p_SAwGlnd4|7}&j>qPh ziK8w3pfP_4R8OKSJB*Syk)BekY9lUahA#!t@qiOv z{^mEvcn&Y$WnmMb5t@@2bDi}~0}~bMo*4fCrZD92>;&vLApDYZ0rbWdO;cd2na!B! zj0}xDl^Ti`_=YGR?2)#3DBWEOi8s+zOgoe3>bh@GUZ9?tt)|jq10=3mXzel5)yZ&ihO2VNWoGMo zoVJOy^fH%Y;UtyOpH1$~WWI-!6sPtw-r-vneZpb<8v*LG)7|QAQpHjw$?*UUC+M1) z?xm+~O#41hF6Bh4vwO`GXR4UCK<#ZAg@?o`Y1M#}5da$GJ{@>Kr-R2lY9noa8d z1+k58SRC!K@%JnTj=ZHohmXpaU zWhJtnPzykIcU;EPa(zP$J9Z&ytd~*vbd>Uzfak{E3eBFPuWegfoUzAeIPHabL)9VDHadv41Gd8|(@ctJT|+6V%rw&F zle_GkdL}9>>Y%4}1dP-p_(X%t{8gmYR7I?*k{2@v;dyQo^S+XzjL6Un$mAk|$~dU$ z=A-c%;$_D9Qe>)_+I`i{00E5S2MMYMK>5o;x?-DDJ0;}FIKZW+PZT2W9`zu~Dk1F%Yxo}bNh(7v z0w=up?YH2%EoC&cRN@Cl((v4ZH(C0cm_!=g5Nv?p?Ya`7S(~OF6s9>C9OoPYQ<6}; zRrq9p9m2GzY*RirK;6#!45mZhEqhrcWv&?mBMNKDN?r;|n5E0%m^6ZRC;6({n`yUI z2^auyKNb!_TPDy*`jFWhsi1;zIaQrf;2cbC#s?Tl*c25Y*6*ydZpx{a`I$4ENppK; zT-f3@lZfUzS{0?)jG>Q2WsV+taGLo7n#S68&i?>;$T;Cxy5S5`IqYaH@*z`-=0i5U z8vO7S`@Jyt80ui%vUbM*07RSQXm*pUt~6DDuxV^$?Xu|=vO1y~T8Ch|SX%Rg<`*A{ z?v69#w3g#C2;~=J=jR#Y6vCjBU?~VTD9!&Ud!VnlwXjbWI?bOwe za}0C6%nj}|`L2B7x%^jG>gzRCcS%ikWo#~nnoK^G(tKlZH39c7Qsce~QtV5lFh0^Z z3}qP`oOVfif`mI7vJ;2w`liX>eC0WTgSrHcqwF-iw(iD_z+vC&y6u?G+1w@=1nq^# zJ%?N(qO7|Kjx|KWK7_8HXzGe8+rgua`F|_T)XVE=_Oy`y00}c$G>>a=9B`vh)kzp} zJK&WnVes&njy9NI=2tvy(sW5>+A`s-ne$RbWxj8;04p@%rNk!WI2j7j4KD`1jv6C2 zxa19Y%|^UiQ}}F6r3iW*Z&f8>}|>4O3vfrD?<7iC~15qf=8O6 z(BUZsrPK&q>#kLH5w3_+*UU0O*;LnDstX)7 zU|~4bB_&NUpg$Bcd^fDw%Fo z5;*E{OM;cMbxkZWkn%xzO-D0YRaH$yjv3T*>X>ZOIQ&I5$f}JaWMRe~f|cSDFdv_) zpo&fTJgKoszCl%1D<|oDw$+5w>1QP6+a<#$rtQy~eTC2M7`c;#s9*NE-)7aB=hpV=J^KP63T zG1B!Rhendn;_P?H*;I|M1*C}$tzJ;cG1(4!q$g1j0Zko1qgkd+Qdh@0O5^5kHuD2O!i7C zz|O3Kte|&=6m1{h1LmQ@5p~7W$_N3#A$A<}S6r!EPfrjZY@C&C)6r?W(=-o>&SpNP zFweS+BHTp6HnETgeRl>1-vG~4JTIRCV?@cI}^8(CiCcnhL;jM zq6D0gvI+7Y{{U2j$kdcveLzSju-PJj`K1rC z5?l(Bz(~SC+~B0R@wq{SoTMui^E@NQM`YgF;V(F90>YDSQH~M`B;y!H-S|ObUIvnT zs>_{o;kQ*l*Oszi0RVlh9x| z@~Cb*zv{2LdwOPt!G(W{&qq=EDAQB7AQGlC)F`kFGRJfboKVQ;y9SRmJ&7xE#+!snW%Z3k!xNFboFBx~|YARL51 z0GNd8B<;FWLFL#=L`XmefJw?Mr9-i3CiNtjr$Vv9fhnDSsGRUOCuH`D$2>;r)2M33 zaF0+_QdLq@TunsPurzpj2z-DZa+{y3tr2H6vA-X|mwrJv8WL@q65tX`)=c%Kz2u5^ z&oS~14gAW5Q`V1cp^@9%Pxht8e&AB!6}C^oxGzaASiyX_&mV~20s)=~Ez`$IE{+Z~4)&K27j z$l4mlwXGe1!iAkaklq^Ylwp&*?871d05v$uYNzuFX#UfJyTS@yRzGSbP`A(B@sGTx z8E?S& z@(3g_Ac&9#Nl_|m;ivm=Z{DTJN3p24(J?bEL~-CfzeOY;$3KNg+~bl)%PTQ)jy*fL@=q!g zC|qj{j~h7hme(%XX(iGv>o0W|20XdM1IPhZPfqsJ2ftQN89S+NrjDLa_K|_)sydsg z>E?V;N1bfj4d>*kMMr_THb}SIp>xZsU6OmH{;!~Ht|jf#4n|6=Wo)mJf@YR5j#IU- zqijuVdYtTxkaDVsFDYF2GDg!3Fb}j<1hViQD2cOcaNupX%}RH- zS4&4v?~N15>&mcXw(5zT!tz@gz&Yg|6J>ov<8=9maCXmhP#NW~0fE|DGJRE~mYR34 zOB}8n@sWi~EYm|?Sp$G>G?Sj*o~Yz@T0W#y%mZ3ZlY&6TQly@mYN1OW8tp$2&jnV( z*y5`WY}oS&9t|(+AyEXceEG=$@{UG3H9v(==$`N!*r%zY_k8$Y7$+$=8iva&fo_+9 zw%H`@_jgW4TFN3~IDS8PAVkWGSdxv^F3<;Xp@?ZCrgNlt4bnh4#uZEqsjjCCWmKBp z{W?j?m(&(1Xg$skeDPf%-MHaZab(!#1(t=73b)QkCpt;U`X{dy(KJ9P+n0@xY=r>Z zOi&oy{I@-n`6%hxM%Ovx#M6Kd>2!zLOH)xXk1((q9C3_rq)}7I=!u=6k~hx@*Fzlz z1L^~TB;!suNS1T%EseW4jFOW>Ot<&QrnbXO>@Y+|G7j)jAcFFQtwNT?EoO%x?$HOoFnC2RFfwS7M`@Nerh` z*!Gc}Y9AIF62;DB5*|9WkEhlnD$=K*kMMMpz8beN9ld`ZbFMCYD z1~lN~m33vWwZT&JEFsagyyGZ9%*FZgGP*WrENI+$D;R3*&9}ZePO02E-0qimhL*Ux zs+<-v#~2Exp3x0WTy*j8BhCRSi4^ryxYRl$C+u^!5-M{}(eAN0hYiYd=S1o|(V=iJ zorH1ZcUIM~O&u1e>0xd@9!e^Q*;yUA^HGUpKN;9Gl=Zc&qK=`JG3uTF0ASLg#NMNp$+{>KPvrCT&ZfILkQQ*`)&2)jz#|{BZiL=!>MH3w7 zJNH9!QmM^r-xWWGU#Y>Nt=y7MFue>Sp|RQ^k@V5UrLAew(VVQZO~x&xMCPH{!l^nd zsHB_#IYb333mD260qhNfOVY>A^vdmzhXlqX|PFGmP z`=jcqWdO~B=-zn;kh$?@$tP`ab1htFJ+b8AbQN+sGQ%4HvOrD0NbY=<<%g%Hzn4VD z6Bc)KwrKwV5|L-HRM%fAE!6DN=}+ws@HBE)PrL{$5y5Y^v@k-^sE&TAYc($vevZxa zXIPc87ftkSro%i^RgpbVIbe4U`31JTmtCwi)bwO)@QYeKaJh9&)@iGn_q^w@&kLY* z9YL2^JBJJv&7#YbEv%1|&043EB3=(UJ`dU$pYS{!Z|06`V1@?GJneIb4FzufsMu-k z9Yt3ww1{RRcDLqt{72%kH4uKVbbqVjd)PS*1g};u(d);RWxW-yk}Gkpe5ObJrn3sR z8trCRONOz>01&RJpsbFCw9lq|ad$5mRP)n8HHVU|g5++dRym-x<=cJ9+kKu{ zm|j71PWT&;qd3J)sgT9u5&PKXUUbFWLir+_NDmx&B$&vvlMNA#!z~G~D9f0>7j1^N->5MIfj6N1|tZ-EbmD6-_+##rKT#|=0d=3uA3aEV*L^H@F zneHtoeD+%_JXEyy-Q^mwld`C`Ki)mz_-Vt48SWGO5#*&2R+$=R4`fdJB;;jVvfl%T zgDkHzk&rT{Q;6$i46L8QY+JPKsP4BP4(tqW*Q9CGIKoV%O^)2iA$*$NNZU$oj!iMS z(l-(3a#N92N+U8v1Do7ClvP(arKfa800a3ta*GZGvZk4jc9&%K17&ef4P-QJmO=|% zxQL99swm>5GPU}?&gX?Hw&@|11~~Xl9|%Q`i)v>+mVer`v5y=bl~wZNs#jA|hLG)x z$$OxXAMD z4Pe`Bto!c{ihp_z)vuO=_EnYI;`3*0G1G@sO}LO9!Wsy)A}j2awQ}Mh{{Ru&VG6pb zrk#(dbHsQjNjzm%TUzMj8rmHudn<__ODv5wTE5Qh-9uJBxf5pU#@Q(=4jg=)w9octF61p@k~x~cnAJ4wRY}?q`5}gi5y{zl04JBP198N{*J7rp>|0H!RO6z zWyyvu#rDog$`;b?obTF2d=l3YLoT>T>{LFQv5`b7s$^?foQ?NYl(Z&xoZyggxXDuL zt}@%aIzJ8WF2*)pnB%r7c6CKpWREQXwLZEY%ccN>RJyHt{~Jk7J%)6Oa`fL)6`1#>KZVoTHfhmsAR9hkJ%`ytc{{>sH6^!-N47-pN1%5 zfu-f7gPe`iKvvSpQ$b&s9(h+0*GeSRWXlQ4VeW#mV9;8?8_8AGvNkg4U~zFB@~JXS zRaIjpjxyI}!Apj59Xl#oMzP3oOK^^Lnr z@EeVQQ5kZQmN$(29kNz>f(P5_n0@3+o=1|ECEA(v<~ds3V{EE&B}Eq$w{}N~gK|#) z05x+DQo2S5F@X9k^lL95B7lWpp7OyRM`WP0m2;E)Df|dt03^-;>U>x9;&t7 zQB5^TJ7n{+rlNuw^*PgNar03fO3A7m$le_0c_ik>v7>cM)HJQPNY4xxXKk{X_m>!% zG)%^K@>t&-Q$r*e__MLXIt#?!D;W3ch#U}&>^37=S#y!@GE_S_7~f@0RA81JOx?~u zLY$83$(<_;m5Ij76uiids-vLGC4wwm=V$xi98C1Po+Bsa`1^)mWxd7!;Q`{we zYvGbpqdy7dU0dwpwsPSsL1@k#mtc{dbsK5o)fO860L4X;H%|Z$4%Lq9RV}mjQ&hFt zbPgfS=VAWj{IOBZLdSSzug5vvFry`Hr-{+NBMx2(-w6^?RYv~+>fPXjlF&9+wD6c} zngH2a*E%;s(G!7r8?_;rs@Pj4GyE}(c`e

*>2$Jcs~U8oFs33=Yc-hit8Vo+AZ< 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 diff --git a/frontend/public/images/backgrounds/homepage_hc.jpg b/frontend/public/images/backgrounds/homepage_hc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f9b249f903d274ecfad7fc76f9bbe5beda23be2 GIT binary patch literal 107667 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

+ Evidence tables: +
+ {aiPanels[paramName].evidence_tables.map((t: any, k: number) => { + const label = `Table T${String(t)}` + return ( + + ) + })} +
+
+) : null} + +{Array.isArray(aiPanels[paramName]?.evidence_figures) && aiPanels[paramName].evidence_figures.length > 0 ? ( +
+ Evidence figures: +
+ {aiPanels[paramName].evidence_figures.map((f: any, k: number) => { + const label = `Figure F${String(f)}` + return ( + + ) + })} +
+
+) : null} ) : null} diff --git a/frontend/app/can-sr/l2-screen/view/page.tsx b/frontend/app/can-sr/l2-screen/view/page.tsx index 9209b136..f6615dad 100644 --- a/frontend/app/can-sr/l2-screen/view/page.tsx +++ b/frontend/app/can-sr/l2-screen/view/page.tsx @@ -508,6 +508,44 @@ export default function CanSrL2ScreenViewPage() { return { panels: mappedPanels, open: mappedOpen } }, [criteriaData, aiPanels, panelOpen]) + // Helpers for table/figure evidence -> viewer highlight + const parsedTables = useMemo(() => { + if (!citation) return [] as any[] + let v: any = (citation as any).fulltext_tables + if (!v) return [] + try { + if (typeof v === 'string') v = JSON.parse(v) + } catch { + // ignore + } + return Array.isArray(v) ? v : [] + }, [citation]) + + const parsedFigures = useMemo(() => { + if (!citation) return [] as any[] + let v: any = (citation as any).fulltext_figures + if (!v) return [] + try { + if (typeof v === 'string') v = JSON.parse(v) + } catch { + // ignore + } + return Array.isArray(v) ? v : [] + }, [citation]) + + const scrollToArtifact = (kind: 'table' | 'figure', idx: number) => { + const list = kind === 'table' ? parsedTables : parsedFigures + const item = list.find((x: any) => Number(x?.index) === Number(idx)) + console.log('[artifact-click]', { kind, idx, hasViewer: !!viewerRef.current, item }) + if (!item || !viewerRef.current) return + const bbox = item?.bounding_box + // We store normalized boxes as an array of {page,x,y,width,height} + const first = Array.isArray(bbox) ? bbox[0] : null + console.log('[artifact-bbox]', { kind, idx, bbox, first }) + if (!first) return + viewerRef.current.scrollToCoord(first) + } + const workspace = useMemo(() => { if (loadingCitation) return
Loading citation...
@@ -707,6 +745,50 @@ export default function CanSrL2ScreenViewPage() { ) : null} + + {Array.isArray(aiData?.evidence_tables) && aiData.evidence_tables.length > 0 ? ( +
+ Evidence tables: +
+ {aiData.evidence_tables.map((t: any, k: number) => { + const label = `Table T${String(t)}` + return ( + + ) + })} +
+
+ ) : null} + + {Array.isArray(aiData?.evidence_figures) && aiData.evidence_figures.length > 0 ? ( +
+ Evidence figures: +
+ {aiData.evidence_figures.map((f: any, k: number) => { + const label = `Figure F${String(f)}` + return ( + + ) + })} +
+
+ ) : null} ) : null} diff --git a/frontend/components/can-sr/PDFBoundingBoxViewer.tsx b/frontend/components/can-sr/PDFBoundingBoxViewer.tsx index beb6c206..94d52856 100644 --- a/frontend/components/can-sr/PDFBoundingBoxViewer.tsx +++ b/frontend/components/can-sr/PDFBoundingBoxViewer.tsx @@ -123,6 +123,9 @@ const wrapperRefs = useRef>({}) const renderTasksRef = useRef>({}) const renderTokenRef = useRef(0) const [hoverInfo, setHoverInfo] = useState<{ page: number; left: number; top: number; content: string } | null>(null) + // Explicitly selected box (e.g., when user clicks an evidence chip). This is drawn + // regardless of whether the LLM evidence panels contain that coordinate. + const [selectedCoord, setSelectedCoord] = useState(null) const sentenceTexts = extractSentenceArray(fulltext) @@ -138,6 +141,7 @@ useImperativeHandle(ref, () => ({ }, scrollToCoord: (coord: any) => { try { + setSelectedCoord(coord) const pageNum = Number(coord?.page ?? coord?.page_number ?? coord?.pageNum ?? 1) const vp = pageViewports[pageNum] const dims = pages?.[pageNum - 1] @@ -166,6 +170,7 @@ useImperativeHandle(ref, () => ({ const firstCoord = Array.isArray(coords) ? coords.find((c: any) => String(c?.text || '').trim() === trimmed) : null if (!firstCoord) return + setSelectedCoord(firstCoord) const pageNum = Number(firstCoord?.page ?? firstCoord?.page_number ?? firstCoord?.pageNum ?? 1) const vp = pageViewports[pageNum] const dims = pages?.[pageNum - 1] @@ -595,6 +600,18 @@ useImperativeHandle(ref, () => ({ }) : [] + // Add an explicitly selected coordinate (e.g., table/figure chip click) + if (selectedCoord) { + try { + const p = Number(selectedCoord?.page ?? selectedCoord?.page_number ?? selectedCoord?.pageNum ?? 0) + if (p === pageNum) { + filtered.unshift({ ...selectedCoord, __selected: true }) + } + } catch { + // ignore + } + } + const elements = filtered.map((c: any, idx: number) => { const x = parseFloat(c?.x ?? '0') @@ -651,10 +668,25 @@ useImperativeHandle(ref, () => ({ (isOpen ? (paramsOpenHere[0] || coordsParamsOpen[0]) : undefined) ?? (isClosed ? (paramsClosedHere[0] || coordsParamsClosed[0]) : undefined) - const alpha = isOpen ? 0.2 : 0.05 - const fill = chosenParam ? colorForParam(chosenParam, alpha) : `rgba(255, 229, 100, ${alpha})` - const borderColor = chosenParam ? solidForParam(chosenParam) : 'rgba(255, 196, 0, 0.95)' - const border = isOpen ? `2px solid ${borderColor}` : `1px dashed ${borderColor}` + const isSelected = !!c?.__selected + const isArtifact = c?.type === 'table' || c?.type === 'figure' + // Keep tables/figures highlights more transparent so users can still read/see + // the underlying content. + const alpha = isArtifact + ? (isSelected ? 0.5 : (isOpen ? 0.5 : 0.5)) + : (isSelected ? 0.0 : (isOpen ? 0.0 : 0.0)) + const border_alpha = isArtifact + ? 0.95 + : 0.0 + const fill = isSelected + ? `rgba(59, 130, 246, ${alpha})` + : (chosenParam ? colorForParam(chosenParam, alpha) : `rgba(255, 229, 100, ${alpha})`) + const borderColor = isSelected + ? `rgba(37, 99, 235, ${border_alpha})` + : (chosenParam ? solidForParam(chosenParam) : `rgba(255, 196, 0, ${border_alpha})`) + const border = isSelected + ? `3px solid ${borderColor}` + : (isOpen ? `2px solid ${borderColor}` : `1px dashed ${borderColor}`) const title = chosenParam ? `${chosenParam}${t ? `: ${t.slice(0, 160)}` : ''}` : t ? t.slice(0, 160) : 'Sentence'

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 literal 0 HcmV?d00001 diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index e7ff3a26..74f65609 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -15,7 +15,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "react-jsx", + "jsx": "preserve", "incremental": true, "plugins": [ { From 4ce58866c471c532be68e07a310f578a86ad5085 Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 01:51:22 -0500 Subject: [PATCH 03/13] fixed remaining db connection issues --- backend/Dockerfile | 9 +++-- backend/api/citations/router.py | 35 +++++++++----------- backend/api/extract/router.py | 24 +++++++------- backend/api/screen/router.py | 22 ++++++------ backend/api/sr/router.py | 16 ++++----- frontend/components/can-sr/stacking-card.tsx | 8 ++--- 6 files changed, 54 insertions(+), 60 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 6a01e65f..f0c35855 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -9,7 +9,7 @@ WORKDIR /app RUN apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ apt-get update && \ - apt-get install -y --no-install-recommends \ + apt-get install -y \ gcc \ g++ \ git \ @@ -17,6 +17,8 @@ RUN apt-get clean && \ curl \ make \ libc6-dev \ + dialog \ + openssh-server \ && apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* @@ -41,10 +43,7 @@ RUN useradd -m -u 1001 appuser && chown -R appuser:appuser /app COPY sshd_config /etc/ssh/ COPY entrypoint.sh /entrypoint.sh -RUN apt-get update \ - && apt-get install -y --no-install-recommends dialog \ - && apt-get install -y --no-install-recommends openssh-server \ - && echo "root:Docker!" | chpasswd \ +RUN echo "root:Docker!" | chpasswd \ && chmod u+x /entrypoint.sh USER root diff --git a/backend/api/citations/router.py b/backend/api/citations/router.py index 053efb3a..9c1e0ff9 100644 --- a/backend/api/citations/router.py +++ b/backend/api/citations/router.py @@ -96,7 +96,7 @@ async def upload_screening_csv( """ try: - sr, screening, _ = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -149,7 +149,6 @@ async def upload_screening_csv( try: screening_info = { "screening_db": { - "connection_string": admin_dsn, "table_name": table_name, "created_at": datetime.utcnow().isoformat(), "rows": inserted, @@ -189,7 +188,7 @@ async def list_citation_ids( Returns a simple list of integers (the 'id' primary key from the citations table). """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -201,7 +200,7 @@ async def list_citation_ids( table_name = (screening or {}).get("table_name") or "citations" try: - ids = await run_in_threadpool(cits_dp_service.list_citation_ids, db_conn, filter_step, table_name) + ids = await run_in_threadpool(cits_dp_service.list_citation_ids, filter_step, table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -227,7 +226,7 @@ async def get_citation_by_id( """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -236,7 +235,7 @@ async def get_citation_by_id( table_name = (screening or {}).get("table_name") or "citations" try: - row = await run_in_threadpool(cits_dp_service.get_citation_by_id, db_conn, int(citation_id), table_name) + row = await run_in_threadpool(cits_dp_service.get_citation_by_id, int(citation_id), table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -279,7 +278,7 @@ async def build_combined_citation( """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -291,7 +290,7 @@ async def build_combined_citation( table_name = (screening or {}).get("table_name") or "citations" try: - row = await run_in_threadpool(cits_dp_service.get_citation_by_id, db_conn, int(citation_id), table_name) + row = await run_in_threadpool(cits_dp_service.get_citation_by_id, int(citation_id), table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -333,7 +332,7 @@ async def upload_citation_fulltext( """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -354,7 +353,7 @@ async def upload_citation_fulltext( table_name = (screening or {}).get("table_name") or "citations" try: - existing_row = await run_in_threadpool(cits_dp_service.get_citation_by_id, db_conn, int(citation_id), table_name) + existing_row = await run_in_threadpool(cits_dp_service.get_citation_by_id, int(citation_id), table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -389,7 +388,7 @@ async def upload_citation_fulltext( # Update citation row in Postgres try: - updated = await run_in_threadpool(cits_dp_service.attach_fulltext, db_conn, citation_id, storage_path, content, table_name) + updated = await run_in_threadpool(cits_dp_service.attach_fulltext, citation_id, storage_path, content, table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -428,7 +427,7 @@ async def hard_delete_screening_resources(sr_id: str, current_user: Dict[str, An """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -441,15 +440,13 @@ async def hard_delete_screening_resources(sr_id: str, current_user: Dict[str, An if not screening: return {"status": "no_screening_db", "message": "No screening table configured for this SR", "deleted_table": False, "deleted_files": 0} - db_conn = None - table_name = screening.get("table_name") if not table_name: return {"status": "no_screening_db", "message": "Incomplete screening DB metadata", "deleted_table": False, "deleted_files": 0} # 1) collect fulltext URLs from the screening DB try: - urls = await run_in_threadpool(cits_dp_service.list_fulltext_urls, db_conn, table_name) + urls = await run_in_threadpool(cits_dp_service.list_fulltext_urls, table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -521,7 +518,7 @@ async def hard_delete_screening_resources(sr_id: str, current_user: Dict[str, An # 3) drop the screening table try: - await run_in_threadpool(cits_dp_service.drop_table, db_conn, table_name) + await run_in_threadpool(cits_dp_service.drop_table, table_name) table_dropped = True except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) @@ -568,7 +565,7 @@ async def export_citations_csv( """ try: - sr, screening, db_conn = await load_sr_and_check( + sr, screening = await load_sr_and_check( sr_id, current_user, srdb_service ) except HTTPException: @@ -579,7 +576,7 @@ async def export_citations_csv( detail=f"Failed to load systematic review: {e}", ) - if not screening or not db_conn: + if not screening: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="No screening database configured for this systematic review", @@ -588,7 +585,7 @@ async def export_citations_csv( table_name = (screening or {}).get("table_name") or "citations" try: - csv_bytes = await run_in_threadpool(cits_dp_service.dump_citations_csv, db_conn, table_name) + csv_bytes = await run_in_threadpool(cits_dp_service.dump_citations_csv, table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: diff --git a/backend/api/extract/router.py b/backend/api/extract/router.py index 93f2dc41..7b5ea93a 100644 --- a/backend/api/extract/router.py +++ b/backend/api/extract/router.py @@ -84,7 +84,7 @@ async def extract_parameter_endpoint( """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -97,7 +97,7 @@ async def extract_parameter_endpoint( row = None if not fulltext: try: - row = await run_in_threadpool(cits_dp_service.get_citation_by_id, db_conn, int(citation_id), table_name) + row = await run_in_threadpool(cits_dp_service.get_citation_by_id, int(citation_id), table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -228,7 +228,7 @@ def _extract_json_object(text: str) -> Optional[str]: col_name = snake_case_param(payload.parameter_name) try: - updated = await run_in_threadpool(cits_dp_service.update_jsonb_column, db_conn, citation_id, col_name, stored, table_name) + updated = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, col_name, stored, table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -256,7 +256,7 @@ async def human_extract_parameter( """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -266,7 +266,7 @@ async def human_extract_parameter( # Ensure citation exists (we won't require full_text for human input but check row presence) try: - row = await run_in_threadpool(cits_dp_service.get_citation_by_id, db_conn, int(citation_id), table_name) + row = await run_in_threadpool(cits_dp_service.get_citation_by_id, int(citation_id), table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -321,7 +321,7 @@ async def human_extract_parameter( col_name = f"human_param_{core}" if core else "human_param_param" try: - updated = await run_in_threadpool(cits_dp_service.update_jsonb_column, db_conn, citation_id, col_name, stored, table_name) + updated = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, col_name, stored, table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -346,7 +346,7 @@ async def extract_fulltext_from_storage( """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -356,7 +356,7 @@ async def extract_fulltext_from_storage( # fetch citation row try: - row = await run_in_threadpool(cits_dp_service.get_citation_by_id, db_conn, int(citation_id), table_name) + row = await run_in_threadpool(cits_dp_service.get_citation_by_id, int(citation_id), table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -425,10 +425,10 @@ async def extract_fulltext_from_storage( # persist full_text_str and coordinates/pages into citation row try: - updated1 = await run_in_threadpool(cits_dp_service.update_text_column, db_conn, citation_id, "fulltext", full_text_str, table_name) - updated2 = await run_in_threadpool(cits_dp_service.update_text_column, db_conn, citation_id, "fulltext_md5", current_md5, table_name) - updated3 = await run_in_threadpool(cits_dp_service.update_jsonb_column, db_conn, citation_id, "fulltext_coords", annotations, table_name) - updated4 = await run_in_threadpool(cits_dp_service.update_jsonb_column, db_conn, citation_id, "fulltext_pages", pages, table_name) + updated1 = await run_in_threadpool(cits_dp_service.update_text_column, citation_id, "fulltext", full_text_str, table_name) + updated2 = await run_in_threadpool(cits_dp_service.update_text_column, citation_id, "fulltext_md5", current_md5, table_name) + updated3 = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, "fulltext_coords", annotations, table_name) + updated4 = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, "fulltext_pages", pages, table_name) updated = updated1 or updated2 or updated3 or updated4 except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) diff --git a/backend/api/screen/router.py b/backend/api/screen/router.py index 3f249a9e..76291f7e 100644 --- a/backend/api/screen/router.py +++ b/backend/api/screen/router.py @@ -80,7 +80,7 @@ async def classify_citation( """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -90,7 +90,7 @@ async def classify_citation( # Load citation row (needed for l2 fulltext and for building citation_text) try: - row = await run_in_threadpool(cits_dp_service.get_citation_by_id, db_conn, int(citation_id), table_name) + row = await run_in_threadpool(cits_dp_service.get_citation_by_id, int(citation_id), table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -195,7 +195,7 @@ async def classify_citation( col_name = snake_case_column(payload.question) try: - updated = await run_in_threadpool(cits_dp_service.update_jsonb_column, db_conn, citation_id, col_name, classification_json, table_name) + updated = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, col_name, classification_json, table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -204,7 +204,7 @@ async def classify_citation( if not updated: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Citation not found to update") - await update_inclusion_decision(sr, citation_id, payload.screening_step, "llm", db_conn) + await update_inclusion_decision(sr, citation_id, payload.screening_step, "llm") return {"status": "success", "sr_id": sr_id, "citation_id": citation_id, "column": col_name, "classification": classification_json} @@ -223,7 +223,7 @@ async def human_classify_citation( """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service) except HTTPException: raise except Exception as e: @@ -233,7 +233,7 @@ async def human_classify_citation( # Ensure citation exists and optionally build combined citation text try: - row = await run_in_threadpool(cits_dp_service.get_citation_by_id, db_conn, int(citation_id), table_name) + row = await run_in_threadpool(cits_dp_service.get_citation_by_id, int(citation_id), table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -261,7 +261,7 @@ async def human_classify_citation( col_name = f"human_{col_core}" if col_core else f"human_col" try: - updated = await run_in_threadpool(cits_dp_service.update_jsonb_column, db_conn, citation_id, col_name, classification_json, table_name) + updated = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, col_name, classification_json, table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -270,7 +270,7 @@ async def human_classify_citation( if not updated: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Citation not found to update") - await update_inclusion_decision(sr, citation_id, payload.screening_step, "human", db_conn) + await update_inclusion_decision(sr, citation_id, payload.screening_step, "human") return {"status": "success", "sr_id": sr_id, "citation_id": citation_id, "column": col_name, "classification": classification_json} @@ -279,13 +279,11 @@ async def update_inclusion_decision( citation_id: int, screening_step: str, decision_maker: str, - db_conn: str, - ): table_name = (sr.get("screening_db") or {}).get("table_name") or "citations" try: - row = await run_in_threadpool(cits_dp_service.get_citation_by_id, db_conn, int(citation_id), table_name) + row = await run_in_threadpool(cits_dp_service.get_citation_by_id, int(citation_id), table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -310,7 +308,7 @@ async def update_inclusion_decision( col_name = f"{decision_maker}_{screening_step}_decision" try: - updated = await run_in_threadpool(cits_dp_service.update_text_column, db_conn, citation_id, col_name, decision, table_name) + updated = await run_in_threadpool(cits_dp_service.update_text_column, citation_id, col_name, decision, table_name) except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: diff --git a/backend/api/sr/router.py b/backend/api/sr/router.py index 0527cf8a..e36b095d 100644 --- a/backend/api/sr/router.py +++ b/backend/api/sr/router.py @@ -164,7 +164,7 @@ async def add_user_to_systematic_review( """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -201,7 +201,7 @@ async def remove_user_from_systematic_review( The owner cannot be removed via this endpoint. """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -274,7 +274,7 @@ async def get_systematic_review(sr_id: str, current_user: Dict[str, Any] = Depen """ try: - doc, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) + doc, screening = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -308,7 +308,7 @@ async def get_systematic_review_criteria_parsed( """ try: - doc, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) + doc, screening = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -334,7 +334,7 @@ async def update_systematic_review_criteria( """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -402,7 +402,7 @@ async def delete_systematic_review(sr_id: str, current_user: Dict[str, Any] = De """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False) except HTTPException: raise except Exception as e: @@ -431,7 +431,7 @@ async def undelete_systematic_review(sr_id: str, current_user: Dict[str, Any] = """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False, require_visible=False) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False, require_visible=False) except HTTPException: raise except Exception as e: @@ -463,7 +463,7 @@ async def hard_delete_systematic_review(sr_id: str, current_user: Dict[str, Any] """ try: - sr, screening, db_conn = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False, require_visible=False) + sr, screening = await load_sr_and_check(sr_id, current_user, srdb_service, require_screening=False, require_visible=False) except HTTPException: raise except Exception as e: diff --git a/frontend/components/can-sr/stacking-card.tsx b/frontend/components/can-sr/stacking-card.tsx index 3cf78543..1a73eac6 100644 --- a/frontend/components/can-sr/stacking-card.tsx +++ b/frontend/components/can-sr/stacking-card.tsx @@ -36,10 +36,10 @@ export default function StackingCard({ title, description, href, className }: St {open ? 'Minimize' : 'Expand'} */} - - + + Open - + @@ -58,5 +58,5 @@ export default function StackingCard({ title, description, href, className }: St - ) + ); } From 694dbf95e74e2436cf46927d5dfc944ca2114b45 Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 02:17:39 -0500 Subject: [PATCH 04/13] model switching for key and entra id development --- backend/Dockerfile | 2 +- backend/api/core/config.py | 46 +--- backend/api/services/azure_openai_client.py | 267 +++++++++++++++----- 3 files changed, 215 insertions(+), 100 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index f0c35855..8dd10676 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -28,7 +28,7 @@ ENV PIP_DEFAULT_TIMEOUT=300 # Install Python dependencies COPY requirements.txt . -RUN pip install -r requirements.txt +RUN pip install -r requirements.txt --no-cache-dir # Copy application code COPY . . diff --git a/backend/api/core/config.py b/backend/api/core/config.py index 177c6715..e3991c27 100644 --- a/backend/api/core/config.py +++ b/backend/api/core/config.py @@ -74,41 +74,17 @@ def convert_max_file_size(cls, v): # Azure OpenAI settings (Primary - GPT-4o) AZURE_OPENAI_API_KEY: Optional[str] = os.getenv("AZURE_OPENAI_API_KEY") AZURE_OPENAI_ENDPOINT: Optional[str] = os.getenv("AZURE_OPENAI_ENDPOINT") - AZURE_OPENAI_API_VERSION: str = os.getenv( - "AZURE_OPENAI_API_VERSION", "2025-01-01-preview" - ) - AZURE_OPENAI_DEPLOYMENT_NAME: str = os.getenv( - "AZURE_OPENAI_DEPLOYMENT_NAME", "gpt-4o" - ) - - # GPT-4.1-mini configuration - AZURE_OPENAI_GPT41_MINI_API_KEY: Optional[str] = os.getenv( - "AZURE_OPENAI_GPT41_MINI_API_KEY" - ) - AZURE_OPENAI_GPT41_MINI_ENDPOINT: Optional[str] = os.getenv( - "AZURE_OPENAI_GPT41_MINI_ENDPOINT" - ) - AZURE_OPENAI_GPT41_MINI_DEPLOYMENT: str = os.getenv( - "AZURE_OPENAI_GPT41_MINI_DEPLOYMENT", "gpt-4.1-mini" - ) - AZURE_OPENAI_GPT41_MINI_API_VERSION: str = os.getenv( - "AZURE_OPENAI_GPT41_MINI_API_VERSION", "2025-01-01-preview" - ) - - # GPT-5-mini configuration - AZURE_OPENAI_GPT5_MINI_API_KEY: Optional[str] = os.getenv( - "AZURE_OPENAI_GPT5_MINI_API_KEY" - ) - AZURE_OPENAI_GPT5_MINI_ENDPOINT: Optional[str] = os.getenv( - "AZURE_OPENAI_GPT5_MINI_ENDPOINT" - ) - AZURE_OPENAI_GPT5_MINI_DEPLOYMENT: str = os.getenv( - "AZURE_OPENAI_GPT5_MINI_DEPLOYMENT", "gpt-5-mini" - ) - AZURE_OPENAI_GPT5_MINI_API_VERSION: str = os.getenv( - "AZURE_OPENAI_GPT5_MINI_API_VERSION", "2025-08-07" - ) - + # Azure OpenAI auth selection + # key -> uses AZURE_OPENAI_ENDPOINT + AZURE_OPENAI_API_KEY + # entra -> uses ENTRA_AZURE_OPENAI_ENDPOINT + DefaultAzureCredential + # Backwards/alternate env var: OPENAI_TYPE + AZURE_OPENAI_TYPE: str = os.getenv("AZURE_OPENAI_TYPE", "key").lower().strip() + ENTRA_AZURE_OPENAI_ENDPOINT: Optional[str] = os.getenv("ENTRA_AZURE_OPENAI_ENDPOINT") + + # Model catalog (UI/display key -> {deployment, api_version}) + # Stored as a raw string in env; parsed in azure_openai_client.py. + MODELS_AVAILABLE: Optional[str] = os.getenv("MODELS_AVAILABLE") + # Default model to use DEFAULT_CHAT_MODEL: str = os.getenv("DEFAULT_CHAT_MODEL", "gpt-5-mini") diff --git a/backend/api/services/azure_openai_client.py b/backend/api/services/azure_openai_client.py index dd89e685..ae7cf623 100644 --- a/backend/api/services/azure_openai_client.py +++ b/backend/api/services/azure_openai_client.py @@ -1,12 +1,37 @@ -"""Azure OpenAI client service for chat completions""" +"""backend.api.services.azure_openai_client +Azure OpenAI client service for chat completions. + +Supports: +* API key auth (AZURE_OPENAI_TYPE=key) +* Entra/managed identity auth (AZURE_OPENAI_TYPE=entra) + +Model catalog: +MODELS_AVAILABLE is a JSON dict (as a string) mapping UI/display keys to +deployment + api_version, e.g.: + +MODELS_AVAILABLE='{ + "GPT-5-Mini": {"deployment": "gpt-5-mini", "api_version": "2025-04-01-preview"}, + "GPT-4.1-Mini": {"deployment": "gpt-4.1-mini", "api_version": "2025-01-01-preview"} +}' + +DEFAULT_CHAT_MODEL must be one of those keys. +""" + +from __future__ import annotations + +import json +import logging import time -from typing import Dict, List, Any, Optional +from typing import Any, Dict, List, Optional, Tuple + from azure.identity import DefaultAzureCredential, get_bearer_token_provider from openai import AzureOpenAI from ..core.config import settings +logger = logging.getLogger(__name__) + # Token cache TTL in seconds (9 minutes) TOKEN_CACHE_TTL = 9 * 60 @@ -32,66 +57,151 @@ class AzureOpenAIClient: """Client for Azure OpenAI chat completions""" def __init__(self): + # NOTE: Historically this project used USE_ENTRA_AUTH (global) and + # per-model env vars. We now prefer AZURE_OPENAI_TYPE + MODELS_AVAILABLE, + # but keep legacy fallbacks. + + self._config_error: Optional[str] = None self.default_model = settings.DEFAULT_CHAT_MODEL - # Create token provider for Azure OpenAI using DefaultAzureCredential - # Wrapped with caching to avoid fetching a new token on every request - if not settings.AZURE_OPENAI_API_KEY and not settings.USE_ENTRA_AUTH: - raise ValueError("Azure OpenAI API key or Entra auth must be configured") + self._auth_type = self._resolve_auth_type() + self._endpoint = self._resolve_endpoint(self._auth_type) + self._api_key = settings.AZURE_OPENAI_API_KEY - if settings.USE_ENTRA_AUTH: - self._credential = DefaultAzureCredential() - self._token_provider = CachedTokenProvider( - get_bearer_token_provider( - self._credential, "https://cognitiveservices.azure.com/.default" + self._token_provider: Optional[CachedTokenProvider] = None + if self._auth_type == "entra": + if not DefaultAzureCredential or not get_bearer_token_provider: + self._config_error = ( + "AZURE_OPENAI_TYPE=entra requires azure-identity to be installed" ) - ) + else: + # Create token provider for Azure OpenAI using DefaultAzureCredential + # Wrapped with caching to avoid fetching a new token on every request + credential = DefaultAzureCredential() + self._token_provider = CachedTokenProvider( + get_bearer_token_provider( + credential, "https://cognitiveservices.azure.com/.default" + ) + ) + + self.model_configs = self._load_model_configs() + self.default_model = self._resolve_default_model(self.default_model) + + # Cache official clients by (endpoint, api_version, auth_type) + self._official_clients: Dict[Tuple[str, str, str], AzureOpenAI] = {} + + + # --------------------------------------------------------------------- + # Configuration + # --------------------------------------------------------------------- + - self.model_configs = { - "gpt-4.1-mini": { - "endpoint": settings.AZURE_OPENAI_GPT41_MINI_ENDPOINT - or settings.AZURE_OPENAI_ENDPOINT, - "deployment": settings.AZURE_OPENAI_GPT41_MINI_DEPLOYMENT, - "api_version": settings.AZURE_OPENAI_GPT41_MINI_API_VERSION, - }, - "gpt-5-mini": { - "endpoint": settings.AZURE_OPENAI_GPT5_MINI_ENDPOINT - or settings.AZURE_OPENAI_ENDPOINT, - "deployment": settings.AZURE_OPENAI_GPT5_MINI_DEPLOYMENT, - "api_version": settings.AZURE_OPENAI_GPT5_MINI_API_VERSION, - }, - } - - self._official_clients: Dict[str, AzureOpenAI] = {} + @staticmethod + def _resolve_auth_type() -> str: + """Return key|entra. + + New config: AZURE_OPENAI_TYPE + Legacy config: USE_ENTRA_AUTH + """ + t = (getattr(settings, "AZURE_OPENAI_TYPE", None) or "").lower().strip() + if t in {"key", "entra"}: + return t + # Legacy fallback + if getattr(settings, "USE_ENTRA_AUTH", False): + return "entra" + return "key" + + @staticmethod + def _resolve_endpoint(auth_type: str) -> Optional[str]: + if auth_type == "entra": + # Entra auth must use the Entra-targeted endpoint. + return getattr(settings, "ENTRA_AZURE_OPENAI_ENDPOINT", None) + return settings.AZURE_OPENAI_ENDPOINT + + def _strip_outer_quotes(self, s: str) -> str: + s = s.strip() + if len(s) >= 2 and ((s[0] == s[-1] == '"') or (s[0] == s[-1] == "'")): + return s[1:-1] + return s + + def _load_models_available(self) -> Optional[Dict[str, Any]]: + raw = getattr(settings, "MODELS_AVAILABLE", None) + if not raw: + return None + try: + raw = self._strip_outer_quotes(str(raw)) + return json.loads(raw) + except Exception as e: + logger.warning("Failed to parse MODELS_AVAILABLE; falling back to legacy model config: %s", e) + return None + + def _load_model_configs(self) -> Dict[str, Dict[str, str]]: + """Build model configs keyed by UI/display name.""" + models = self._load_models_available() + if models: + cfg: Dict[str, Dict[str, str]] = {} + for display_name, meta in models.items(): + if not isinstance(meta, dict): + continue + deployment = meta.get("deployment") + api_version = meta.get("api_version") + if not deployment or not api_version: + continue + cfg[str(display_name)] = { + "endpoint": self._endpoint or "", + "deployment": str(deployment), + "api_version": str(api_version), + } + if cfg: + return cfg + + return {} + + def _resolve_default_model(self, desired: str) -> str: + if desired in self.model_configs: + return desired + # If configured default doesn't exist, fall back to first configured model + for k in self.model_configs.keys(): + return k + return desired def _get_model_config(self, model: str) -> Dict[str, str]: """Get configuration for a specific model""" if model in self.model_configs: return self.model_configs[model] - return self.model_configs["gpt-5-mini"] + # fallback to first configured model + for _, cfg in self.model_configs.items(): + return cfg + raise ValueError("No Azure OpenAI models are configured") def _get_official_client(self, model: str) -> AzureOpenAI: """Get official Azure OpenAI client instance""" - if model not in self._official_clients: - config = self._get_model_config(model) - if not config.get("endpoint"): - raise ValueError( - f"Azure OpenAI endpoint not configured for model {model}" - ) - - azure_openai_kwargs = { - "azure_endpoint": config["endpoint"], - "api_version": config["api_version"], + config = self._get_model_config(model) + endpoint = config.get("endpoint") + api_version = config.get("api_version") + if not endpoint or not api_version: + raise ValueError(f"Azure OpenAI endpoint/api_version not configured for model {model}") + + cache_key = (endpoint, api_version, self._auth_type) + if cache_key not in self._official_clients: + azure_openai_kwargs: Dict[str, Any] = { + "azure_endpoint": endpoint, + "api_version": api_version, } - if settings.USE_ENTRA_AUTH: - azure_openai_kwargs["azure_ad_token_provider"] = self._token_provider - - if settings.AZURE_OPENAI_API_KEY: - azure_openai_kwargs["api_key"] = settings.AZURE_OPENAI_API_KEY - self._official_clients[model] = AzureOpenAI(**azure_openai_kwargs) + if self._auth_type == "entra": + if not self._token_provider: + raise ValueError(self._config_error or "Azure AD token provider not configured") + azure_openai_kwargs["entra_token_provider"] = self._token_provider + else: + # key auth + if not self._api_key: + raise ValueError("AZURE_OPENAI_TYPE=key requires AZURE_OPENAI_API_KEY") + azure_openai_kwargs["api_key"] = self._api_key + + self._official_clients[cache_key] = AzureOpenAI(**azure_openai_kwargs) - return self._official_clients[model] + return self._official_clients[cache_key] def _build_messages( self, user_message: str, system_prompt: Optional[str] = None @@ -145,7 +255,9 @@ async def chat_completion( "stream": stream, } - if model != "gpt-5-mini": + # gpt-5 deployments may reject temperature/max_tokens in some previews. + # We gate this by the *deployment* name because the UI key can differ. + if deployment != "gpt-5-mini": request_kwargs["max_tokens"] = max_tokens request_kwargs["temperature"] = temperature @@ -219,16 +331,19 @@ async def streaming_chat( deployment = self._get_model_config(model)["deployment"] client = self._get_official_client(model) - response = client.chat.completions.create( - stream=True, - messages=messages, - max_tokens=max_tokens, - temperature=temperature, - top_p=top_p, - frequency_penalty=0.0, - presence_penalty=0.0, - model=deployment, - ) + request_kwargs: Dict[str, Any] = { + "stream": True, + "messages": messages, + "top_p": top_p, + "frequency_penalty": 0.0, + "presence_penalty": 0.0, + "model": deployment, + } + if deployment != "gpt-5-mini": + request_kwargs["max_tokens"] = max_tokens + request_kwargs["temperature"] = temperature + + response = client.chat.completions.create(**request_kwargs) for update in response: if update.choices: @@ -334,16 +449,40 @@ async def chat_with_context( def get_available_models(self) -> List[str]: """Get list of available models that are properly configured""" - return [ - model - for model, config in self.model_configs.items() - if config.get("endpoint") - ] + out: List[str] = [] + for model, config in self.model_configs.items(): + if not config.get("endpoint") or not config.get("deployment") or not config.get("api_version"): + continue + out.append(model) + return out def is_configured(self) -> bool: """Check if Azure OpenAI is properly configured""" - return len(self.get_available_models()) > 0 + if self._config_error: + return False + if not self.get_available_models(): + return False + + if self._auth_type == "key": + return bool(self._endpoint and self._api_key) + if self._auth_type == "entra": + return bool(self._endpoint and self._token_provider) + return False # Global Azure OpenAI client instance -azure_openai_client = AzureOpenAIClient() +# NOTE: This is used by routers. We intentionally avoid raising during import +# so the API can start up and report configuration issues as 503s. +try: + azure_openai_client = AzureOpenAIClient() +except Exception as e: # pragma: no cover + logger.exception("Failed to initialize AzureOpenAIClient: %s", e) + # Provide a stub that reports not-configured. + class _DisabledAzureOpenAIClient: # type: ignore + def is_configured(self) -> bool: + return False + + def get_available_models(self) -> List[str]: + return [] + + azure_openai_client = _DisabledAzureOpenAIClient() # type: ignore From 657bb624cea6f1b1b1da1b4f3a8044ff6a1774e7 Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 03:46:40 -0500 Subject: [PATCH 05/13] fix docker stuff --- .gitignore | 1 + backend/docker-compose.yml | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index df559c58..c5b3239e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ yarn-debug.log* yarn-error.log* lerna-debug.log* .pnpm-debug.log* +/planning # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index 06204188..1aa6b0cc 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -14,7 +14,7 @@ services: env_file: - .env depends_on: - - grobid-service + - grobid-service : {condition: service_healthy} - pgdb-service volumes: - ./api:/app/api @@ -29,7 +29,7 @@ services: # GROBID SERVICE - PDF Parsing for Full-Text Extraction # ============================================================================= grobid-service: - image: grobid/grobid:0.8.2-crf + image: grobid/grobid:0.8.2 container_name: grobid-service ports: - "8070:8070" @@ -37,10 +37,10 @@ services: restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8070/api/isalive"] - interval: 30s + interval: 10s timeout: 10s retries: 5 - start_period: 30s + start_period: 120s # ============================================================================= # POSTGRESQL - Database (Citations & Systematic Reviews) From feb1df0b1382485501937ee2235d89c6d4a27e41 Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 03:58:35 -0500 Subject: [PATCH 06/13] revert compose --- backend/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index 1aa6b0cc..2d05a90b 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -14,7 +14,7 @@ services: env_file: - .env depends_on: - - grobid-service : {condition: service_healthy} + - grobid-service - pgdb-service volumes: - ./api:/app/api @@ -29,7 +29,7 @@ services: # GROBID SERVICE - PDF Parsing for Full-Text Extraction # ============================================================================= grobid-service: - image: grobid/grobid:0.8.2 + image: grobid/grobid:0.8.2-crf container_name: grobid-service ports: - "8070:8070" From bbc3da657c1f859580bd5a3cab18a7dc8ea36e99 Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 13:03:23 -0500 Subject: [PATCH 07/13] simplify postgres setup to singled set of variables --- backend/api/core/config.py | 90 +++++++++++---------------- backend/api/services/postgres_auth.py | 59 ++++++++---------- 2 files changed, 62 insertions(+), 87 deletions(-) diff --git a/backend/api/core/config.py b/backend/api/core/config.py index e3991c27..eea691ee 100644 --- a/backend/api/core/config.py +++ b/backend/api/core/config.py @@ -103,74 +103,56 @@ def convert_max_file_size(cls, v): # ------------------------------------------------------------------------- # Postgres configuration # ------------------------------------------------------------------------- - # A single selector, with three isolated profiles (AZURE_/DOCKER_/LOCAL_) + # Select primary Postgres mode. + # docker/local use password auth; azure uses Entra token auth. POSTGRES_MODE: str = os.getenv("POSTGRES_MODE", "docker").lower().strip() # docker|local|azure - # Docker profile (typically for docker-compose) - DOCKER_POSTGRES_HOST: Optional[str] = os.getenv("DOCKER_POSTGRES_HOST") - DOCKER_POSTGRES_DATABASE: Optional[str] = os.getenv("DOCKER_POSTGRES_DATABASE") - DOCKER_POSTGRES_USER: Optional[str] = os.getenv("DOCKER_POSTGRES_USER") - DOCKER_POSTGRES_PASSWORD: Optional[str] = os.getenv("DOCKER_POSTGRES_PASSWORD") - DOCKER_POSTGRES_PORT: int = int(os.getenv("DOCKER_POSTGRES_PORT", "5432")) - - # Local profile (developer machine) - LOCAL_POSTGRES_HOST: str = os.getenv("LOCAL_POSTGRES_HOST", "localhost") - LOCAL_POSTGRES_DATABASE: Optional[str] = os.getenv("LOCAL_POSTGRES_DATABASE") - LOCAL_POSTGRES_USER: Optional[str] = os.getenv("LOCAL_POSTGRES_USER") - LOCAL_POSTGRES_PASSWORD: Optional[str] = os.getenv("LOCAL_POSTGRES_PASSWORD") - LOCAL_POSTGRES_PORT: int = int(os.getenv("LOCAL_POSTGRES_PORT", "5432")) - - # Azure profile (Azure Database for PostgreSQL) using Entra token auth - AZURE_POSTGRES_HOST: Optional[str] = os.getenv("AZURE_POSTGRES_HOST") - AZURE_POSTGRES_DATABASE: Optional[str] = os.getenv("AZURE_POSTGRES_DATABASE") - AZURE_POSTGRES_USER: Optional[str] = os.getenv("AZURE_POSTGRES_USER") - AZURE_POSTGRES_PORT: int = int(os.getenv("AZURE_POSTGRES_PORT", "5432")) - AZURE_POSTGRES_SSL_MODE: str = os.getenv("AZURE_POSTGRES_SSL_MODE", "require") + # Canonical Postgres connection settings (single profile; values vary by environment) + POSTGRES_HOST: Optional[str] = os.getenv("POSTGRES_HOST") + POSTGRES_DATABASE: Optional[str] = os.getenv("POSTGRES_DATABASE") + POSTGRES_USER: Optional[str] = os.getenv("POSTGRES_USER") + POSTGRES_PASSWORD: Optional[str] = os.getenv("POSTGRES_PASSWORD") + + # Optional overrides + POSTGRES_PORT: int = int(os.getenv("POSTGRES_PORT", "5432")) + POSTGRES_SSL_MODE: str = os.getenv("POSTGRES_SSL_MODE", "require") # Deprecated (will be removed): legacy Postgres DSN POSTGRES_URI: Optional[str] = os.getenv("POSTGRES_URI") def postgres_profile(self, mode: Optional[str] = None) -> dict: - """Return resolved Postgres connection settings for a specific mode.""" + """Return resolved Postgres connection settings for a specific mode. + + The application uses a single set of environment variables: + POSTGRES_HOST, POSTGRES_DATABASE, POSTGRES_USER, POSTGRES_PASSWORD. + + POSTGRES_MODE controls *how* authentication is performed: + - docker/local: password auth (POSTGRES_PASSWORD required) + - azure: Entra token auth (password ignored) + sslmode=require + """ m = (mode or self.POSTGRES_MODE or "").lower().strip() if m not in {"docker", "local", "azure"}: raise ValueError("POSTGRES_MODE must be one of: docker, local, azure") - if m == "docker": - return { - "mode": "docker", - "host": self.DOCKER_POSTGRES_HOST or "pgdb-service", - "database": self.DOCKER_POSTGRES_DATABASE, - "user": self.DOCKER_POSTGRES_USER, - "password": self.DOCKER_POSTGRES_PASSWORD, - "port": self.DOCKER_POSTGRES_PORT, - "sslmode": None, - } - - if m == "local": - return { - "mode": "local", - "host": self.LOCAL_POSTGRES_HOST or "localhost", - "database": self.LOCAL_POSTGRES_DATABASE, - "user": self.LOCAL_POSTGRES_USER, - "password": self.LOCAL_POSTGRES_PASSWORD, - "port": self.LOCAL_POSTGRES_PORT, - "sslmode": None, - } - - # azure - return { - "mode": "azure", - "host": self.AZURE_POSTGRES_HOST, - "database": self.AZURE_POSTGRES_DATABASE, - "user": self.AZURE_POSTGRES_USER, - "password": None, - "port": self.AZURE_POSTGRES_PORT, - "sslmode": self.AZURE_POSTGRES_SSL_MODE or "require", + # Provide sensible defaults for host depending on mode. + default_host = "pgdb-service" if m == "docker" else "localhost" if m == "local" else None + + prof = { + "mode": m, + "host": self.POSTGRES_HOST or default_host, + "database": self.POSTGRES_DATABASE, + "user": self.POSTGRES_USER, + # For azure we intentionally ignore password (token auth) + "password": None if m == "azure" else self.POSTGRES_PASSWORD, + "port": self.POSTGRES_PORT, + "sslmode": (self.POSTGRES_SSL_MODE or "require") if m == "azure" else None, } + return prof + def has_local_fallback(self) -> bool: - return bool(self.LOCAL_POSTGRES_DATABASE and self.LOCAL_POSTGRES_USER and self.LOCAL_POSTGRES_PASSWORD) + # Deprecated: legacy behavior. Kept for compatibility with older code paths. + return False # Databricks settings DATABRICKS_INSTANCE: str = os.getenv("DATABRICKS_INSTANCE", "") diff --git a/backend/api/services/postgres_auth.py b/backend/api/services/postgres_auth.py index 918d0ee4..dc676cbd 100644 --- a/backend/api/services/postgres_auth.py +++ b/backend/api/services/postgres_auth.py @@ -3,22 +3,26 @@ PostgreSQL connection helper supporting three runtime modes. Configuration model: -* POSTGRES_MODE selects one profile: docker | local | azure -* Each profile has its own env var namespace to avoid accidental overrides: - - DOCKER_POSTGRES_* - - LOCAL_POSTGRES_* - - AZURE_POSTGRES_* +* POSTGRES_MODE selects behavior: docker | local | azure +* Connection settings are provided via a single set of env vars: + - POSTGRES_HOST + - POSTGRES_DATABASE + - POSTGRES_USER + - POSTGRES_PASSWORD + +Auth behavior: +* docker/local: password auth (POSTGRES_PASSWORD required) +* azure: Entra token auth via DefaultAzureCredential (password ignored) Behavior: -* Always try the configured POSTGRES_MODE first. -* If that fails, fall back to LOCAL (when fully configured). +* Only try the configured POSTGRES_MODE (no fallback). Notes: * POSTGRES_URI is deprecated and intentionally not used. """ import os -from typing import Optional, Dict, Any, List +from typing import Optional, Dict, Any import psycopg2 from ..core.config import settings @@ -79,9 +83,12 @@ def _verify_config(): except Exception as e: raise RuntimeError(str(e)) - required = [prof.get("database"), prof.get("user")] + required = [prof.get("host"), prof.get("database"), prof.get("user")] if not all(required): - raise RuntimeError(f"{mode} profile requires database and user") + raise RuntimeError(f"{mode} profile requires host, database and user") + + if mode in {"docker", "local"} and not prof.get("password"): + raise RuntimeError(f"{mode} mode requires POSTGRES_PASSWORD") def _is_token_expired(self) -> bool: """Check whether the cached Azure token needs refreshing.""" @@ -104,14 +111,14 @@ def _refresh_azure_token(self) -> str: @staticmethod def _mode() -> str: - return (settings.POSTGRES_MODE or "azure").lower().strip() + return (settings.POSTGRES_MODE or "docker").lower().strip() @staticmethod def _has_local_fallback() -> bool: - return bool(settings.has_local_fallback()) + return False def _candidate_kwargs(self, mode: str) -> Dict[str, Any]: - """Build connect kwargs for a given mode based on namespaced env vars.""" + """Build connect kwargs for a given mode based on POSTGRES_* env vars.""" prof = settings.postgres_profile(mode) kwargs: Dict[str, Any] = { @@ -119,7 +126,7 @@ def _candidate_kwargs(self, mode: str) -> Dict[str, Any]: "database": prof.get("database"), "user": prof.get("user"), "port": int(prof.get("port") or 5432), - # Fail fast so we can try fallbacks + # Fail fast so connection errors surface quickly "connect_timeout": int(os.getenv("POSTGRES_CONNECT_TIMEOUT", "3")), } @@ -148,29 +155,15 @@ def _connect_with_mode(self, mode: str): return psycopg2.connect(**kwargs) def _connect(self): - """Create a new psycopg2 connection, with fallback to local.""" + """Create a new psycopg2 connection.""" primary_mode = self._mode() - tried: List[str] = [] - - # Try primary try: - tried.append(primary_mode) return self._connect_with_mode(primary_mode) except Exception as e: - logger.warning("Postgres connect failed (mode=%s): %s", primary_mode, e, exc_info=True) - - # Fallback to local (if not already local) - if primary_mode != "local" and self._has_local_fallback(): - try: - tried.append("local") - logger.info("Falling back to local Postgres connection") - return self._connect_with_mode("local") - except Exception as e: - logger.error("Postgres local fallback failed: %s", e, exc_info=True) - - raise psycopg2.OperationalError( - f"Could not connect to Postgres. Tried modes: {', '.join(tried)}" - ) + logger.error("Postgres connect failed (mode=%s): %s", primary_mode, e, exc_info=True) + raise psycopg2.OperationalError( + f"Could not connect to Postgres for mode={primary_mode}" + ) def __repr__(self) -> str: status = "open" if self._conn and not self._conn.closed else "closed" From 41144a9307956aeb5b14f7d2cbbc268e9646fac6 Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 13:05:52 -0500 Subject: [PATCH 08/13] update postgres in readme --- README.md | 33 +++++++++++++++++------------- backend/README.md | 51 +++++++++++++++++++++-------------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index a58b316c..53235bbd 100644 --- a/README.md +++ b/README.md @@ -244,22 +244,27 @@ MONGODB_URI=mongodb://sr-mongodb-service:27017/mongodb-sr # Postgres configuration POSTGRES_MODE=docker # docker | local | azure -# Docker Postgres (docker-compose) -DOCKER_POSTGRES_HOST=pgdb-service -DOCKER_POSTGRES_DATABASE=postgres -DOCKER_POSTGRES_USER=admin -DOCKER_POSTGRES_PASSWORD=password - -# Local Postgres (developer machine) - also used as fallback if configured -# LOCAL_POSTGRES_HOST=localhost -# LOCAL_POSTGRES_DATABASE=grep -# LOCAL_POSTGRES_USER=postgres -# LOCAL_POSTGRES_PASSWORD=123 +# Canonical Postgres connection settings (single set) +# - docker/local: POSTGRES_PASSWORD is required +# - azure: POSTGRES_PASSWORD is ignored (Entra token auth via DefaultAzureCredential) +POSTGRES_HOST=pgdb-service +POSTGRES_DATABASE=postgres +POSTGRES_USER=admin +POSTGRES_PASSWORD=password + +# Local Postgres (developer machine) +# POSTGRES_MODE=local +# POSTGRES_HOST=localhost +# POSTGRES_DATABASE=grep +# POSTGRES_USER=postgres +# POSTGRES_PASSWORD=123 # Azure Database for PostgreSQL (Entra auth) -# AZURE_POSTGRES_HOST=...postgres.database.azure.com -# AZURE_POSTGRES_DATABASE=grep -# AZURE_POSTGRES_USER= +# POSTGRES_MODE=azure +# POSTGRES_HOST=...postgres.database.azure.com +# POSTGRES_DATABASE=grep +# POSTGRES_USER= +# POSTGRES_PASSWORD= # not used in azure mode # Databricks (for database search) DATABRICKS_INSTANCE=your-instance diff --git a/backend/README.md b/backend/README.md index 00b7f5cd..87465e25 100644 --- a/backend/README.md +++ b/backend/README.md @@ -75,25 +75,27 @@ ENTRA_AZURE_STORAGE_CONTAINER_NAME=your-container # Postgres configuration POSTGRES_MODE=docker # docker | local | azure -# Docker Postgres (docker-compose) -DOCKER_POSTGRES_HOST=pgdb-service -DOCKER_POSTGRES_DATABASE=postgres -DOCKER_POSTGRES_USER=admin -DOCKER_POSTGRES_PASSWORD=password - -# Local Postgres (developer machine) - also used as fallback if configured -LOCAL_POSTGRES_HOST=localhost -LOCAL_POSTGRES_DATABASE=grep -LOCAL_POSTGRES_USER=postgres -LOCAL_POSTGRES_PASSWORD=123 +# Canonical Postgres connection settings (single set) +# - docker/local: POSTGRES_PASSWORD is required +# - azure: POSTGRES_PASSWORD is ignored (Entra token auth via DefaultAzureCredential) +POSTGRES_HOST=pgdb-service +POSTGRES_DATABASE=postgres +POSTGRES_USER=admin +POSTGRES_PASSWORD=password + +# Local Postgres (developer machine) +# POSTGRES_MODE=local +# POSTGRES_HOST=localhost +# POSTGRES_DATABASE=grep +# POSTGRES_USER=postgres +# POSTGRES_PASSWORD=123 # Azure Database for PostgreSQL (Entra auth) -AZURE_POSTGRES_HOST= -AZURE_POSTGRES_DATABASE= -AZURE_POSTGRES_USER= - -# Note: the backend will always try POSTGRES_MODE first and fall back to LOCAL -# if LOCAL_POSTGRES_* is fully configured. +# POSTGRES_MODE=azure +# POSTGRES_HOST= +# POSTGRES_DATABASE= +# POSTGRES_USER= +# POSTGRES_PASSWORD= # not used in azure mode # GROBID Service GROBID_SERVICE_URL=http://grobid-service:8070 @@ -263,17 +265,10 @@ docker compose restart api |----------|-------------|---------| | `MONGODB_URI` | MongoDB connection string | `mongodb://sr-mongodb-service:27017/mongodb-sr` | | `POSTGRES_MODE` | Postgres connection mode: `docker` \| `local` \| `azure` | `docker` | -| `DOCKER_POSTGRES_HOST` | Docker Postgres host (compose service name) | `pgdb-service` | -| `DOCKER_POSTGRES_DATABASE` | Docker Postgres database | `postgres` | -| `DOCKER_POSTGRES_USER` | Docker Postgres user | `admin` | -| `DOCKER_POSTGRES_PASSWORD` | Docker Postgres password | `password` | -| `LOCAL_POSTGRES_HOST` | Local Postgres host | `localhost` | -| `LOCAL_POSTGRES_DATABASE` | Local Postgres database | `grep` | -| `LOCAL_POSTGRES_USER` | Local Postgres user | `postgres` | -| `LOCAL_POSTGRES_PASSWORD` | Local Postgres password | `123` | -| `AZURE_POSTGRES_HOST` | Azure Postgres host | `...postgres.database.azure.com` | -| `AZURE_POSTGRES_DATABASE` | Azure Postgres database | `grep` | -| `AZURE_POSTGRES_USER` | Azure Postgres user (Entra UPN or role) | `HAIL-DBAs` | +| `POSTGRES_HOST` | Postgres host (docker: service name; local: localhost; azure: FQDN) | `pgdb-service` | +| `POSTGRES_DATABASE` | Postgres database name | `postgres` | +| `POSTGRES_USER` | Postgres user (azure: Entra UPN or role) | `admin` | +| `POSTGRES_PASSWORD` | Postgres password (ignored when POSTGRES_MODE=azure) | `password` | | `GROBID_SERVICE_URL` | GROBID service URL | `http://grobid-service:8070` | | `DATABRICKS_INSTANCE` | Databricks workspace URL | - | | `DATABRICKS_TOKEN` | Databricks access token | - | From ed5e872d3e137b3aed2df96905f897f6509b063a Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 13:11:34 -0500 Subject: [PATCH 09/13] Unify openai azure endpoint url --- backend/api/core/config.py | 3 +-- backend/api/services/azure_openai_client.py | 7 ++----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/backend/api/core/config.py b/backend/api/core/config.py index eea691ee..d1d592e6 100644 --- a/backend/api/core/config.py +++ b/backend/api/core/config.py @@ -76,10 +76,9 @@ def convert_max_file_size(cls, v): AZURE_OPENAI_ENDPOINT: Optional[str] = os.getenv("AZURE_OPENAI_ENDPOINT") # Azure OpenAI auth selection # key -> uses AZURE_OPENAI_ENDPOINT + AZURE_OPENAI_API_KEY - # entra -> uses ENTRA_AZURE_OPENAI_ENDPOINT + DefaultAzureCredential + # entra -> uses AZURE_OPENAI_ENDPOINT + DefaultAzureCredential # Backwards/alternate env var: OPENAI_TYPE AZURE_OPENAI_TYPE: str = os.getenv("AZURE_OPENAI_TYPE", "key").lower().strip() - ENTRA_AZURE_OPENAI_ENDPOINT: Optional[str] = os.getenv("ENTRA_AZURE_OPENAI_ENDPOINT") # Model catalog (UI/display key -> {deployment, api_version}) # Stored as a raw string in env; parsed in azure_openai_client.py. diff --git a/backend/api/services/azure_openai_client.py b/backend/api/services/azure_openai_client.py index ae7cf623..fc7060c0 100644 --- a/backend/api/services/azure_openai_client.py +++ b/backend/api/services/azure_openai_client.py @@ -65,7 +65,7 @@ def __init__(self): self.default_model = settings.DEFAULT_CHAT_MODEL self._auth_type = self._resolve_auth_type() - self._endpoint = self._resolve_endpoint(self._auth_type) + self._endpoint = self._resolve_endpoint() self._api_key = settings.AZURE_OPENAI_API_KEY self._token_provider: Optional[CachedTokenProvider] = None @@ -112,10 +112,7 @@ def _resolve_auth_type() -> str: return "key" @staticmethod - def _resolve_endpoint(auth_type: str) -> Optional[str]: - if auth_type == "entra": - # Entra auth must use the Entra-targeted endpoint. - return getattr(settings, "ENTRA_AZURE_OPENAI_ENDPOINT", None) + def _resolve_endpoint() -> Optional[str]: return settings.AZURE_OPENAI_ENDPOINT def _strip_outer_quotes(self, s: str) -> str: From 16510a64ed8cd84584995a7de7d7bad2bbc7eb7f Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 13:28:12 -0500 Subject: [PATCH 10/13] unified storage env variables --- DEPLOY.md | 10 +++++----- README.md | 15 +++++++++------ backend/README.md | 15 +++++++++------ backend/api/core/config.py | 23 +++++++++-------------- backend/api/services/storage.py | 28 +++++++++++++++++----------- 5 files changed, 49 insertions(+), 42 deletions(-) diff --git a/DEPLOY.md b/DEPLOY.md index 0319e9c9..c74ca383 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -298,7 +298,7 @@ AZURE_OPENAI_GPT4O_MINI_ENDPOINT=your-gpt4o-mini-endpoint # Storage AZURE_STORAGE_CONNECTION_STRING=your-connection-string -AZURE_STORAGE_CONTAINER_NAME=can-sr-storage +STORAGE_CONTAINER_NAME=can-sr-storage # Authentication SECRET_KEY=your-secret-key-change-in-production @@ -307,10 +307,10 @@ ACCESS_TOKEN_EXPIRE_MINUTES=10080 # Databases (configured in docker-compose.yml) MONGODB_URI=mongodb://sr-mongodb-service:27017/mongodb-sr POSTGRES_MODE=docker -DOCKER_POSTGRES_HOST=pgdb-service -DOCKER_POSTGRES_DATABASE=postgres -DOCKER_POSTGRES_USER=admin -DOCKER_POSTGRES_PASSWORD=password +POSTGRES_HOST=pgdb-service +POSTGRES_DATABASE=postgres +POSTGRES_USER=admin +POSTGRES_PASSWORD=password # Databricks (for database search) DATABRICKS_INSTANCE=your-databricks-instance diff --git a/README.md b/README.md index 53235bbd..83c10b00 100644 --- a/README.md +++ b/README.md @@ -224,19 +224,22 @@ AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o # STORAGE_TYPE is strict: local | azure | entra STORAGE_TYPE=local +# Storage container name +# - local: folder name under LOCAL_STORAGE_BASE_PATH +# - azure/entra: blob container name +STORAGE_CONTAINER_NAME=can-sr-storage + # local storage LOCAL_STORAGE_BASE_PATH=uploads -LOCAL_STORAGE_CONTAINER_NAME=users -# azure storage (connection string) +# azure storage (account name + key) # STORAGE_TYPE=azure -AZURE_STORAGE_CONNECTION_STRING=your-connection-string -AZURE_STORAGE_CONTAINER_NAME=your-container +AZURE_STORAGE_ACCOUNT_NAME=youraccount +AZURE_STORAGE_ACCOUNT_KEY=your-key # entra storage (Managed Identity / DefaultAzureCredential) # STORAGE_TYPE=entra -ENTRA_AZURE_STORAGE_ACCOUNT_NAME=youraccount -ENTRA_AZURE_STORAGE_CONTAINER_NAME=your-container +AZURE_STORAGE_ACCOUNT_NAME=youraccount # Databases MONGODB_URI=mongodb://sr-mongodb-service:27017/mongodb-sr diff --git a/backend/README.md b/backend/README.md index 87465e25..7f16aee8 100644 --- a/backend/README.md +++ b/backend/README.md @@ -55,19 +55,22 @@ AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o # STORAGE_TYPE is strict: local | azure | entra STORAGE_TYPE=local +# Storage container name +# - local: folder name under LOCAL_STORAGE_BASE_PATH +# - azure/entra: blob container name +STORAGE_CONTAINER_NAME=can-sr-storage + # local storage LOCAL_STORAGE_BASE_PATH=uploads -LOCAL_STORAGE_CONTAINER_NAME=users -# azure storage (connection string) +# azure storage (account name + key) # STORAGE_TYPE=azure -AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=... -AZURE_STORAGE_CONTAINER_NAME=your-container +AZURE_STORAGE_ACCOUNT_NAME=youraccount +AZURE_STORAGE_ACCOUNT_KEY=your-key # entra storage (Managed Identity / DefaultAzureCredential) # STORAGE_TYPE=entra -ENTRA_AZURE_STORAGE_ACCOUNT_NAME=youraccount -ENTRA_AZURE_STORAGE_CONTAINER_NAME=your-container +AZURE_STORAGE_ACCOUNT_NAME=youraccount # Databases (Docker defaults - change for production) diff --git a/backend/api/core/config.py b/backend/api/core/config.py index d1d592e6..8f0c28bf 100644 --- a/backend/api/core/config.py +++ b/backend/api/core/config.py @@ -30,19 +30,15 @@ class Settings(BaseSettings): # Storage settings # Storage selection (strict): local | azure | entra STORAGE_TYPE: str = os.getenv("STORAGE_TYPE", "azure").lower().strip() - AZURE_STORAGE_ACCOUNT_NAME: Optional[str] = os.getenv( - "AZURE_STORAGE_ACCOUNT_NAME" - ) - AZURE_STORAGE_CONNECTION_STRING: Optional[str] = os.getenv( - "AZURE_STORAGE_CONNECTION_STRING" - ) - AZURE_STORAGE_CONTAINER_NAME: str = os.getenv( - "AZURE_STORAGE_CONTAINER_NAME", "can-sr-storage" - ) - - # Entra storage settings (used when STORAGE_TYPE=entra) - ENTRA_AZURE_STORAGE_ACCOUNT_NAME: Optional[str] = os.getenv("ENTRA_AZURE_STORAGE_ACCOUNT_NAME") - ENTRA_AZURE_STORAGE_CONTAINER_NAME: str = os.getenv("ENTRA_AZURE_STORAGE_CONTAINER_NAME", "can-sr-storage") + # Canonical storage container name used across all storage types. + # - local: folder name under LOCAL_STORAGE_BASE_PATH + # - azure/entra: blob container name + STORAGE_CONTAINER_NAME: str = os.getenv("STORAGE_CONTAINER_NAME", "can-sr-storage") + # Azure Storage + # - STORAGE_TYPE=azure requires account name + account key + # - STORAGE_TYPE=entra requires only account name (uses DefaultAzureCredential) + AZURE_STORAGE_ACCOUNT_NAME: Optional[str] = os.getenv("AZURE_STORAGE_ACCOUNT_NAME") + AZURE_STORAGE_ACCOUNT_KEY: Optional[str] = os.getenv("AZURE_STORAGE_ACCOUNT_KEY") # Local storage settings (used when STORAGE_TYPE=local) # In docker, default path is backed by the compose volume: ./uploads:/app/uploads @@ -50,7 +46,6 @@ class Settings(BaseSettings): # - locally: /backend/uploads # - in docker: /app/uploads LOCAL_STORAGE_BASE_PATH: str = os.getenv("LOCAL_STORAGE_BASE_PATH", "uploads") - LOCAL_STORAGE_CONTAINER_NAME: str = os.getenv("LOCAL_STORAGE_CONTAINER_NAME", "users") # File upload settings MAX_FILE_SIZE: int = Field(default=52428800) # 50MB in bytes diff --git a/backend/api/services/storage.py b/backend/api/services/storage.py index 98ae2a6a..12eb7c37 100644 --- a/backend/api/services/storage.py +++ b/backend/api/services/storage.py @@ -4,7 +4,7 @@ Supported backends (selected via STORAGE_TYPE): * local - Local filesystem storage (backed by docker compose volume) -* azure - Azure Blob Storage via **connection string** (strict) +* azure - Azure Blob Storage via **account name + key** (strict) * entra - Azure Blob Storage via **DefaultAzureCredential** (Entra/Managed Identity) (strict) Routers should not access Azure SDK objects directly. @@ -303,12 +303,12 @@ class LocalStorageService: """Local filesystem storage implementation. Layout: - {LOCAL_STORAGE_BASE_PATH}/{LOCAL_STORAGE_CONTAINER_NAME}/users/{user_id}/... + {LOCAL_STORAGE_BASE_PATH}/{STORAGE_CONTAINER_NAME}/users/{user_id}/... """ def __init__(self): self.base_path = Path(settings.LOCAL_STORAGE_BASE_PATH).resolve() - self.container_name = settings.LOCAL_STORAGE_CONTAINER_NAME + self.container_name = settings.STORAGE_CONTAINER_NAME (self.base_path / self.container_name).mkdir(parents=True, exist_ok=True) def _container_root(self) -> Path: @@ -559,23 +559,29 @@ def _build_storage_service() -> Optional[StorageService]: return None if stype == "azure": try: - if not settings.AZURE_STORAGE_CONNECTION_STRING: - raise ValueError("STORAGE_TYPE=azure requires AZURE_STORAGE_CONNECTION_STRING") + if not settings.AZURE_STORAGE_ACCOUNT_NAME or not settings.AZURE_STORAGE_ACCOUNT_KEY: + raise ValueError("STORAGE_TYPE=azure requires AZURE_STORAGE_ACCOUNT_NAME and AZURE_STORAGE_ACCOUNT_KEY") + connection_string = ( + "DefaultEndpointsProtocol=https;" + f"AccountName={settings.AZURE_STORAGE_ACCOUNT_NAME};" + f"AccountKey={settings.AZURE_STORAGE_ACCOUNT_KEY};" + "EndpointSuffix=core.windows.net" + ) return AzureStorageService( - connection_string=settings.AZURE_STORAGE_CONNECTION_STRING, - container_name=settings.AZURE_STORAGE_CONTAINER_NAME, + connection_string=connection_string, + container_name=settings.STORAGE_CONTAINER_NAME, ) except Exception as e: logger.exception("Failed to initialize AzureStorageService (connection string): %s", e) return None if stype == "entra": try: - if not settings.ENTRA_AZURE_STORAGE_ACCOUNT_NAME: - raise ValueError("STORAGE_TYPE=entra requires ENTRA_AZURE_STORAGE_ACCOUNT_NAME") - account_url = f"https://{settings.ENTRA_AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net" + if not settings.AZURE_STORAGE_ACCOUNT_NAME: + raise ValueError("STORAGE_TYPE=entra requires AZURE_STORAGE_ACCOUNT_NAME") + account_url = f"https://{settings.AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net" return AzureStorageService( account_url=account_url, - container_name=settings.ENTRA_AZURE_STORAGE_CONTAINER_NAME, + container_name=settings.STORAGE_CONTAINER_NAME, ) except Exception as e: logger.exception("Failed to initialize AzureStorageService (Entra): %s", e) From a9de262f5ace0a8a706498dec1f04738a992193e Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 14:55:23 -0500 Subject: [PATCH 11/13] unified naming to mode for simplicity --- README.md | 8 ++++---- backend/README.md | 14 +++++++------- backend/api/core/config.py | 10 +++++----- backend/api/services/azure_openai_client.py | 14 +++++++------- backend/api/services/storage.py | 14 +++++++------- backend/main.py | 5 +++-- 6 files changed, 33 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 83c10b00..7273c941 100644 --- a/README.md +++ b/README.md @@ -221,8 +221,8 @@ AZURE_OPENAI_ENDPOINT=your-endpoint AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o # Storage -# STORAGE_TYPE is strict: local | azure | entra -STORAGE_TYPE=local +# STORAGE_MODE is strict: local | azure | entra +STORAGE_MODE=local # Storage container name # - local: folder name under LOCAL_STORAGE_BASE_PATH @@ -233,12 +233,12 @@ STORAGE_CONTAINER_NAME=can-sr-storage LOCAL_STORAGE_BASE_PATH=uploads # azure storage (account name + key) -# STORAGE_TYPE=azure +# STORAGE_MODE=azure AZURE_STORAGE_ACCOUNT_NAME=youraccount AZURE_STORAGE_ACCOUNT_KEY=your-key # entra storage (Managed Identity / DefaultAzureCredential) -# STORAGE_TYPE=entra +# STORAGE_MODE=entra AZURE_STORAGE_ACCOUNT_NAME=youraccount # Databases diff --git a/backend/README.md b/backend/README.md index 7f16aee8..7a88eca9 100644 --- a/backend/README.md +++ b/backend/README.md @@ -52,8 +52,8 @@ AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o # Storage -# STORAGE_TYPE is strict: local | azure | entra -STORAGE_TYPE=local +# STORAGE_MODE is strict: local | azure | entra +STORAGE_MODE=local # Storage container name # - local: folder name under LOCAL_STORAGE_BASE_PATH @@ -64,12 +64,12 @@ STORAGE_CONTAINER_NAME=can-sr-storage LOCAL_STORAGE_BASE_PATH=uploads # azure storage (account name + key) -# STORAGE_TYPE=azure +# STORAGE_MODE=azure AZURE_STORAGE_ACCOUNT_NAME=youraccount AZURE_STORAGE_ACCOUNT_KEY=your-key # entra storage (Managed Identity / DefaultAzureCredential) -# STORAGE_TYPE=entra +# STORAGE_MODE=entra AZURE_STORAGE_ACCOUNT_NAME=youraccount # Databases (Docker defaults - change for production) @@ -257,10 +257,10 @@ docker compose restart api | `AZURE_OPENAI_API_KEY` | Azure OpenAI API key | `abc123...` | | `AZURE_OPENAI_ENDPOINT` | Azure OpenAI endpoint URL | `https://your-resource.openai.azure.com` | | `AZURE_OPENAI_DEPLOYMENT_NAME` | Model deployment name | `gpt-4o` | -| `STORAGE_TYPE` | Storage backend selector | `local` | +| `STORAGE_MODE` | Storage backend selector | `local` | | `LOCAL_STORAGE_BASE_PATH` | Local storage base path (when local) | `uploads` | -| `AZURE_STORAGE_CONNECTION_STRING` | Azure Blob (when STORAGE_TYPE=azure) | `DefaultEndpointsProtocol=https;...` | -| `ENTRA_AZURE_STORAGE_ACCOUNT_NAME` | Azure account (when STORAGE_TYPE=entra) | `mystorageacct` | +| `AZURE_STORAGE_CONNECTION_STRING` | Azure Blob (when STORAGE_MODE=azure) | `DefaultEndpointsProtocol=https;...` | +| `ENTRA_AZURE_STORAGE_ACCOUNT_NAME` | Azure account (when STORAGE_MODE=entra) | `mystorageacct` | | `SECRET_KEY` | JWT token signing key | `your-secure-secret-key` | ### Optional Variables diff --git a/backend/api/core/config.py b/backend/api/core/config.py index 8f0c28bf..b00384d0 100644 --- a/backend/api/core/config.py +++ b/backend/api/core/config.py @@ -29,18 +29,18 @@ class Settings(BaseSettings): # Storage settings # Storage selection (strict): local | azure | entra - STORAGE_TYPE: str = os.getenv("STORAGE_TYPE", "azure").lower().strip() + STORAGE_MODE: str = os.getenv("STORAGE_MODE", "azure").lower().strip() # Canonical storage container name used across all storage types. # - local: folder name under LOCAL_STORAGE_BASE_PATH # - azure/entra: blob container name STORAGE_CONTAINER_NAME: str = os.getenv("STORAGE_CONTAINER_NAME", "can-sr-storage") # Azure Storage - # - STORAGE_TYPE=azure requires account name + account key - # - STORAGE_TYPE=entra requires only account name (uses DefaultAzureCredential) + # - STORAGE_MODE=azure requires account name + account key + # - STORAGE_MODE=entra requires only account name (uses DefaultAzureCredential) AZURE_STORAGE_ACCOUNT_NAME: Optional[str] = os.getenv("AZURE_STORAGE_ACCOUNT_NAME") AZURE_STORAGE_ACCOUNT_KEY: Optional[str] = os.getenv("AZURE_STORAGE_ACCOUNT_KEY") - # Local storage settings (used when STORAGE_TYPE=local) + # Local storage settings (used when STORAGE_MODE=local) # In docker, default path is backed by the compose volume: ./uploads:/app/uploads # Default to a relative directory so it works both locally and in docker: # - locally: /backend/uploads @@ -73,7 +73,7 @@ def convert_max_file_size(cls, v): # key -> uses AZURE_OPENAI_ENDPOINT + AZURE_OPENAI_API_KEY # entra -> uses AZURE_OPENAI_ENDPOINT + DefaultAzureCredential # Backwards/alternate env var: OPENAI_TYPE - AZURE_OPENAI_TYPE: str = os.getenv("AZURE_OPENAI_TYPE", "key").lower().strip() + AZURE_OPENAI_MODE: str = os.getenv("AZURE_OPENAI_MODE", "key").lower().strip() # Model catalog (UI/display key -> {deployment, api_version}) # Stored as a raw string in env; parsed in azure_openai_client.py. diff --git a/backend/api/services/azure_openai_client.py b/backend/api/services/azure_openai_client.py index fc7060c0..c7456dd2 100644 --- a/backend/api/services/azure_openai_client.py +++ b/backend/api/services/azure_openai_client.py @@ -3,8 +3,8 @@ Azure OpenAI client service for chat completions. Supports: -* API key auth (AZURE_OPENAI_TYPE=key) -* Entra/managed identity auth (AZURE_OPENAI_TYPE=entra) +* API key auth (AZURE_OPENAI_MODE=key) +* Entra/managed identity auth (AZURE_OPENAI_MODE=entra) Model catalog: MODELS_AVAILABLE is a JSON dict (as a string) mapping UI/display keys to @@ -58,7 +58,7 @@ class AzureOpenAIClient: def __init__(self): # NOTE: Historically this project used USE_ENTRA_AUTH (global) and - # per-model env vars. We now prefer AZURE_OPENAI_TYPE + MODELS_AVAILABLE, + # per-model env vars. We now prefer AZURE_OPENAI_MODE + MODELS_AVAILABLE, # but keep legacy fallbacks. self._config_error: Optional[str] = None @@ -72,7 +72,7 @@ def __init__(self): if self._auth_type == "entra": if not DefaultAzureCredential or not get_bearer_token_provider: self._config_error = ( - "AZURE_OPENAI_TYPE=entra requires azure-identity to be installed" + "AZURE_OPENAI_MODE=entra requires azure-identity to be installed" ) else: # Create token provider for Azure OpenAI using DefaultAzureCredential @@ -100,10 +100,10 @@ def __init__(self): def _resolve_auth_type() -> str: """Return key|entra. - New config: AZURE_OPENAI_TYPE + New config: AZURE_OPENAI_MODE Legacy config: USE_ENTRA_AUTH """ - t = (getattr(settings, "AZURE_OPENAI_TYPE", None) or "").lower().strip() + t = (getattr(settings, "AZURE_OPENAI_MODE", None) or "").lower().strip() if t in {"key", "entra"}: return t # Legacy fallback @@ -193,7 +193,7 @@ def _get_official_client(self, model: str) -> AzureOpenAI: else: # key auth if not self._api_key: - raise ValueError("AZURE_OPENAI_TYPE=key requires AZURE_OPENAI_API_KEY") + raise ValueError("AZURE_OPENAI_MODE=key requires AZURE_OPENAI_API_KEY") azure_openai_kwargs["api_key"] = self._api_key self._official_clients[cache_key] = AzureOpenAI(**azure_openai_kwargs) diff --git a/backend/api/services/storage.py b/backend/api/services/storage.py index 12eb7c37..b5d4f2b5 100644 --- a/backend/api/services/storage.py +++ b/backend/api/services/storage.py @@ -2,7 +2,7 @@ Storage abstraction for CAN-SR. -Supported backends (selected via STORAGE_TYPE): +Supported backends (selected via STORAGE_MODE): * local - Local filesystem storage (backed by docker compose volume) * azure - Azure Blob Storage via **account name + key** (strict) * entra - Azure Blob Storage via **DefaultAzureCredential** (Entra/Managed Identity) (strict) @@ -64,7 +64,7 @@ class AzureStorageService: def __init__(self, *, account_url: str | None = None, connection_string: str | None = None, container_name: str): if not BlobServiceClient: raise RuntimeError( - "Azure storage libraries are not installed. Install azure-identity and azure-storage-blob, or use STORAGE_TYPE=local." + "Azure storage libraries are not installed. Install azure-identity and azure-storage-blob, or use STORAGE_MODE=local." ) if bool(account_url) == bool(connection_string): @@ -75,7 +75,7 @@ def __init__(self, *, account_url: str | None = None, connection_string: str | N else: if not DefaultAzureCredential: raise RuntimeError( - "azure-identity is not installed. Install azure-identity, or use STORAGE_TYPE=azure (connection string) or local." + "azure-identity is not installed. Install azure-identity, or use STORAGE_MODE=azure (connection string) or local." ) credential = DefaultAzureCredential() self.blob_service_client = BlobServiceClient(account_url=account_url, credential=credential) @@ -550,7 +550,7 @@ async def delete_by_path(self, path: str) -> bool: def _build_storage_service() -> Optional[StorageService]: - stype = (settings.STORAGE_TYPE or "azure").lower().strip() + stype = (settings.STORAGE_MODE or "azure").lower().strip() if stype == "local": try: return LocalStorageService() @@ -560,7 +560,7 @@ def _build_storage_service() -> Optional[StorageService]: if stype == "azure": try: if not settings.AZURE_STORAGE_ACCOUNT_NAME or not settings.AZURE_STORAGE_ACCOUNT_KEY: - raise ValueError("STORAGE_TYPE=azure requires AZURE_STORAGE_ACCOUNT_NAME and AZURE_STORAGE_ACCOUNT_KEY") + raise ValueError("STORAGE_MODE=azure requires AZURE_STORAGE_ACCOUNT_NAME and AZURE_STORAGE_ACCOUNT_KEY") connection_string = ( "DefaultEndpointsProtocol=https;" f"AccountName={settings.AZURE_STORAGE_ACCOUNT_NAME};" @@ -577,7 +577,7 @@ def _build_storage_service() -> Optional[StorageService]: if stype == "entra": try: if not settings.AZURE_STORAGE_ACCOUNT_NAME: - raise ValueError("STORAGE_TYPE=entra requires AZURE_STORAGE_ACCOUNT_NAME") + raise ValueError("STORAGE_MODE=entra requires AZURE_STORAGE_ACCOUNT_NAME") account_url = f"https://{settings.AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net" return AzureStorageService( account_url=account_url, @@ -587,7 +587,7 @@ def _build_storage_service() -> Optional[StorageService]: logger.exception("Failed to initialize AzureStorageService (Entra): %s", e) return None - logger.warning("Unsupported STORAGE_TYPE=%s; storage disabled", stype) + logger.warning("Unsupported STORAGE_MODE=%s; storage disabled", stype) return None diff --git a/backend/main.py b/backend/main.py index cbcc8f97..4173c9f1 100644 --- a/backend/main.py +++ b/backend/main.py @@ -81,8 +81,9 @@ async def health_check(): "status": "ok", "service": settings.PROJECT_NAME, "version": settings.VERSION, - "storage_type": settings.STORAGE_TYPE, - "azure_storage_configured": bool(settings.AZURE_STORAGE_CONNECTION_STRING), + "azure_openai_mode": settings.AZURE_OPENAI_MODE, + "postgres_mode": settings.POSTGRES_MODE, + "storage_mode": settings.STORAGE_MODE, "azure_openai_configured": azure_openai_client.is_configured(), "default_chat_model": settings.DEFAULT_CHAT_MODEL, "available_models": azure_openai_client.get_available_models(), From 7b377a376d6ec175b69030ad0c6b7df06b072940 Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 14:58:28 -0500 Subject: [PATCH 12/13] Adding models yaml for hotloading configs --- backend/api/core/config.py | 4 -- backend/api/services/azure_openai_client.py | 79 ++++++++++++--------- backend/configs/models.yaml | 7 ++ backend/docker-compose.yml | 1 + backend/requirements.txt | 1 + 5 files changed, 53 insertions(+), 39 deletions(-) create mode 100644 backend/configs/models.yaml diff --git a/backend/api/core/config.py b/backend/api/core/config.py index b00384d0..37796fb1 100644 --- a/backend/api/core/config.py +++ b/backend/api/core/config.py @@ -75,10 +75,6 @@ def convert_max_file_size(cls, v): # Backwards/alternate env var: OPENAI_TYPE AZURE_OPENAI_MODE: str = os.getenv("AZURE_OPENAI_MODE", "key").lower().strip() - # Model catalog (UI/display key -> {deployment, api_version}) - # Stored as a raw string in env; parsed in azure_openai_client.py. - MODELS_AVAILABLE: Optional[str] = os.getenv("MODELS_AVAILABLE") - # Default model to use DEFAULT_CHAT_MODEL: str = os.getenv("DEFAULT_CHAT_MODEL", "gpt-5-mini") diff --git a/backend/api/services/azure_openai_client.py b/backend/api/services/azure_openai_client.py index c7456dd2..fe97f937 100644 --- a/backend/api/services/azure_openai_client.py +++ b/backend/api/services/azure_openai_client.py @@ -7,13 +7,14 @@ * Entra/managed identity auth (AZURE_OPENAI_MODE=entra) Model catalog: -MODELS_AVAILABLE is a JSON dict (as a string) mapping UI/display keys to -deployment + api_version, e.g.: +Loaded from YAML at runtime: + /app/configs/models.yaml -MODELS_AVAILABLE='{ - "GPT-5-Mini": {"deployment": "gpt-5-mini", "api_version": "2025-04-01-preview"}, - "GPT-4.1-Mini": {"deployment": "gpt-4.1-mini", "api_version": "2025-01-01-preview"} -}' +The YAML is a mapping of UI/display keys to {deployment, api_version}, e.g.: + +GPT-5-Mini: + deployment: gpt-5-mini + api_version: 2025-04-01-preview DEFAULT_CHAT_MODEL must be one of those keys. """ @@ -23,8 +24,11 @@ import json import logging import time +from pathlib import Path from typing import Any, Dict, List, Optional, Tuple +import yaml + from azure.identity import DefaultAzureCredential, get_bearer_token_provider from openai import AzureOpenAI @@ -57,10 +61,6 @@ class AzureOpenAIClient: """Client for Azure OpenAI chat completions""" def __init__(self): - # NOTE: Historically this project used USE_ENTRA_AUTH (global) and - # per-model env vars. We now prefer AZURE_OPENAI_MODE + MODELS_AVAILABLE, - # but keep legacy fallbacks. - self._config_error: Optional[str] = None self.default_model = settings.DEFAULT_CHAT_MODEL @@ -121,36 +121,45 @@ def _strip_outer_quotes(self, s: str) -> str: return s[1:-1] return s - def _load_models_available(self) -> Optional[Dict[str, Any]]: - raw = getattr(settings, "MODELS_AVAILABLE", None) - if not raw: - return None + def _load_models_yaml(self) -> Dict[str, Any]: + """Load model catalog from /app/configs/models.yaml. + + This file is expected to be mounted in docker-compose so changes can be + applied without rebuilding the image. + """ + path = Path("/app/configs/models.yaml") + if not path.exists(): + logger.warning("Azure OpenAI model catalog not found at %s", path) + return {} try: - raw = self._strip_outer_quotes(str(raw)) - return json.loads(raw) + data = yaml.safe_load(path.read_text(encoding="utf-8")) + if not isinstance(data, dict): + logger.warning("Invalid models.yaml format (expected mapping): %s", type(data)) + return {} + return data except Exception as e: - logger.warning("Failed to parse MODELS_AVAILABLE; falling back to legacy model config: %s", e) - return None + logger.exception("Failed to load Azure OpenAI model catalog from %s: %s", path, e) + return {} def _load_model_configs(self) -> Dict[str, Dict[str, str]]: """Build model configs keyed by UI/display name.""" - models = self._load_models_available() - if models: - cfg: Dict[str, Dict[str, str]] = {} - for display_name, meta in models.items(): - if not isinstance(meta, dict): - continue - deployment = meta.get("deployment") - api_version = meta.get("api_version") - if not deployment or not api_version: - continue - cfg[str(display_name)] = { - "endpoint": self._endpoint or "", - "deployment": str(deployment), - "api_version": str(api_version), - } - if cfg: - return cfg + models = self._load_models_yaml() + cfg: Dict[str, Dict[str, str]] = {} + for display_name, meta in models.items(): + if not isinstance(meta, dict): + continue + deployment = meta.get("deployment") + api_version = meta.get("api_version") + if not deployment or not api_version: + continue + cfg[str(display_name)] = { + "endpoint": self._endpoint or "", + "deployment": str(deployment), + "api_version": str(api_version), + } + + if cfg: + return cfg return {} diff --git a/backend/configs/models.yaml b/backend/configs/models.yaml new file mode 100644 index 00000000..75953bc9 --- /dev/null +++ b/backend/configs/models.yaml @@ -0,0 +1,7 @@ +GPT-4.1-Mini: + deployment: gpt-4.1-mini + api_version: 2025-01-01-preview + +GPT-5-Mini: + deployment: gpt-5-mini + api_version: 2025-04-01-preview diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index 2d05a90b..3cca1cbd 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -18,6 +18,7 @@ services: - pgdb-service volumes: - ./api:/app/api + - ./configs:/app/configs - ./uploads:/app/uploads healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] diff --git a/backend/requirements.txt b/backend/requirements.txt index 517a0efa..8b8daf90 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -3,6 +3,7 @@ fastapi>=0.104.1 uvicorn>=0.23.2 pydantic>=2.7.0 pydantic-settings>=2.3.0 +PyYAML==6.0.2 email-validator>=2.0.0 python-multipart==0.0.22 python-dotenv>=1.0.1 From 971b60ec1d2f6398a8e2c4f60ab75c445f8149a4 Mon Sep 17 00:00:00 2001 From: bing1100 Date: Tue, 10 Feb 2026 19:03:47 -0500 Subject: [PATCH 13/13] Feat(DI):implementing for screening and parameter extraction --- backend/api/core/bounding_box_matcher.py | 435 +++++++++ backend/api/core/docint_coords.py | 126 +++ backend/api/extract/prompts.py | 12 +- backend/api/extract/router.py | 284 +++++- backend/api/screen/prompts.py | 14 +- backend/api/screen/router.py | 138 ++- backend/api/services/azure_docint_client.py | 822 ++++++++++++++++++ backend/api/services/azure_openai_client.py | 50 +- backend/api/services/document_service.py | 287 +----- backend/api/services/grobid_service.py | 54 +- backend/requirements.txt | 2 + frontend/app/can-sr/extract/view/page.tsx | 74 +- frontend/app/can-sr/l2-screen/view/page.tsx | 82 ++ .../can-sr/PDFBoundingBoxViewer.tsx | 40 +- 14 files changed, 2103 insertions(+), 317 deletions(-) create mode 100644 backend/api/core/bounding_box_matcher.py create mode 100644 backend/api/core/docint_coords.py create mode 100644 backend/api/services/azure_docint_client.py diff --git a/backend/api/core/bounding_box_matcher.py b/backend/api/core/bounding_box_matcher.py new file mode 100644 index 00000000..a0fe5e4d --- /dev/null +++ b/backend/api/core/bounding_box_matcher.py @@ -0,0 +1,435 @@ +import re +from typing import Dict, Any, List, Optional, Tuple + + +def normalize_text(text: str) -> str: + """Normalize text for comparison (remove extra whitespace, newlines, etc.)""" + # Replace multiple whitespace/newlines with single space + text = re.sub(r"\s+", " ", text) + # Remove special characters that might differ + text = text.strip() + return text + + +def find_text_in_paragraphs( + search_text: str, paragraphs: List[Dict[str, Any]], threshold: float = 0.6 +) -> List[Dict[str, Any]]: + """ + Find matching paragraphs for the search text. + + Args: + search_text: Text to search for + paragraphs: List of paragraph dictionaries from raw_analysis.json + threshold: Minimum similarity threshold (0-1) + + Returns: + List of matching paragraphs with bounding box information + """ + normalized_search = normalize_text(search_text) + matches = [] + + for para in paragraphs: + para_content = para.get("content", "") + normalized_para = normalize_text(para_content) + + # Check for substring match (search text in paragraph or paragraph in search) + if normalized_search in normalized_para or normalized_para in normalized_search: + # Calculate similarity using character overlap + search_chars = set(normalized_search.lower()) + para_chars = set(normalized_para.lower()) + overlap = len(search_chars & para_chars) + similarity = overlap / max(len(search_chars), len(para_chars), 1) + + if similarity >= threshold: + match_info = { + "paragraph_content": para_content, + "similarity": similarity, + "bounding_regions": para.get("boundingRegions", []), + "role": para.get("role"), + "spans": para.get("spans", []), + } + matches.append(match_info) + # Also check for partial matches (if search text is long, check if significant portion matches) + elif len(normalized_search) > 20: + # Try to find if a significant portion of the search text appears in the paragraph + search_words = set(normalized_search.lower().split()) + para_words = set(normalized_para.lower().split()) + if len(search_words) > 0: + word_overlap = len(search_words & para_words) + word_similarity = word_overlap / len(search_words) + if word_similarity >= 0.5: # At least 50% of words match + match_info = { + "paragraph_content": para_content, + "similarity": word_similarity, + "bounding_regions": para.get("boundingRegions", []), + "role": para.get("role"), + "spans": para.get("spans", []), + } + matches.append(match_info) + + return matches + + +def find_text_in_lines( + search_text: str, pages: List[Dict[str, Any]], threshold: float = 0.5 +) -> List[Dict[str, Any]]: + """ + Find matching lines for the search text. + + Args: + search_text: Text to search for + pages: List of page dictionaries from raw_analysis.json + threshold: Minimum similarity threshold + + Returns: + List of matching lines with bounding box information + """ + normalized_search = normalize_text(search_text) + matches = [] + + for page in pages: + page_number = page.get("pageNumber", 0) + lines = page.get("lines", []) + + for line in lines: + line_content = line.get("content", "") + normalized_line = normalize_text(line_content) + + # Check for substring match + if ( + normalized_search in normalized_line + or normalized_line in normalized_search + ): + search_chars = set(normalized_search.lower()) + line_chars = set(normalized_line.lower()) + overlap = len(search_chars & line_chars) + similarity = overlap / max(len(search_chars), len(line_chars), 1) + + if similarity >= threshold: + match_info = { + "line_content": line_content, + "page_number": page_number, + "similarity": similarity, + "polygon": line.get("polygon", []), + "spans": line.get("spans", []), + } + matches.append(match_info) + # Also check word-level matching for longer texts + elif len(normalized_search) > 15: + search_words = set(normalized_search.lower().split()) + line_words = set(normalized_line.lower().split()) + if len(search_words) > 0: + word_overlap = len(search_words & line_words) + word_similarity = word_overlap / len(search_words) + if word_similarity >= 0.4: + match_info = { + "line_content": line_content, + "page_number": page_number, + "similarity": word_similarity, + "polygon": line.get("polygon", []), + "spans": line.get("spans", []), + } + matches.append(match_info) + + return matches + + +def match_reference_to_bounding_box( + reference_text: str, + raw_analysis: Dict[str, Any], + para_threshold: float = 0.6, + line_threshold: float = 0.5, +) -> Dict[str, Any]: + """ + Match a single reference text to bounding boxes in the raw analysis. + + Args: + reference_text: The text excerpt to match + raw_analysis: The complete raw analysis dictionary from Azure Document Intelligence + para_threshold: Minimum similarity threshold for paragraph matching + line_threshold: Minimum similarity threshold for line matching + + Returns: + Dictionary with matching information including bounding boxes + """ + paragraphs = raw_analysis.get("paragraphs", []) + pages = raw_analysis.get("pages", []) + + # Try to find in paragraphs first (more accurate) + para_matches = find_text_in_paragraphs(reference_text, paragraphs, para_threshold) + + # Also try to find in lines (for more granular matching) + line_matches = find_text_in_lines(reference_text, pages, line_threshold) + + result = { + "text": reference_text, + "paragraph_matches": para_matches, + "line_matches": line_matches, + "best_match": None, + } + + # Determine best match (prefer paragraph matches with highest similarity) + if para_matches: + best_para = max(para_matches, key=lambda x: x["similarity"]) + bounding_regions = best_para["bounding_regions"] + # Format bounding box info + bbox_info = [] + page_number = None + for region in bounding_regions: + page_num = region.get("pageNumber", region.get("page_number")) + if page_num and not page_number: + page_number = page_num + bbox_info.append( + {"page_number": page_num, "polygon": region.get("polygon", [])} + ) + + result["best_match"] = { + "type": "paragraph", + "content": best_para["paragraph_content"], + "similarity": best_para["similarity"], + "page_number": page_number, # Add page_number at top level for easy access + "bounding_regions": bbox_info, + "role": best_para.get("role"), + } + elif line_matches: + best_line = max(line_matches, key=lambda x: x["similarity"]) + result["best_match"] = { + "type": "line", + "content": best_line["line_content"], + "similarity": best_line["similarity"], + "page_number": best_line["page_number"], + "polygon": best_line["polygon"], + } + + return result + + +def match_references_to_bounding_boxes( + references: List[Dict[str, Any]], + raw_analysis: Dict[str, Any], + para_threshold: float = 0.6, + line_threshold: float = 0.5, +) -> List[Dict[str, Any]]: + """ + Match multiple reference texts to bounding boxes in the raw analysis. + + Args: + references: List of reference dictionaries, each with at least a 'text' field + raw_analysis: The complete raw analysis dictionary from Azure Document Intelligence + para_threshold: Minimum similarity threshold for paragraph matching + line_threshold: Minimum similarity threshold for line matching + + Returns: + List of dictionaries with matching information for each reference + """ + results = [] + + for ref_idx, ref in enumerate(references): + ref_text = ref.get("text", "") + if not ref_text: + continue + + match_result = match_reference_to_bounding_box( + ref_text, raw_analysis, para_threshold, line_threshold + ) + + # Add reference index and preserve any additional fields from the original reference + match_result["reference_index"] = ref_idx + if "context" in ref: + match_result["context"] = ref["context"] + + results.append(match_result) + + return results + + +def extract_figure_references(text: str) -> List[Tuple[str, str]]: + """ + Extract figure references from text using regex patterns. + + Args: + text: Text to search for figure references + + Returns: + List of tuples (figure_reference, figure_id) like [("Figure 1.1", "1.1"), ("Fig. 2.3", "2.3")] + """ + # Patterns to match figure references + patterns = [ + r"\bFigure\s+(\d+(?:\.\d+)*)", # "Figure 1.1", "Figure 2" + r"\bFig\.?\s+(\d+(?:\.\d+)*)", # "Fig 1.1", "Fig. 2.3" + r"\bFIGURE\s+(\d+(?:\.\d+)*)", # "FIGURE 1.1" + r"\bFIG\.?\s+(\d+(?:\.\d+)*)", # "FIG 1.1" + ] + + figure_refs = [] + for pattern in patterns: + matches = re.findall(pattern, text, re.IGNORECASE) + for match in matches: + # Create the full reference text and the figure ID + if "Figure" in pattern.upper(): + full_ref = f"Figure {match}" + elif "Fig." in pattern: + full_ref = f"Fig. {match}" + elif "FIG." in pattern: + full_ref = f"FIG. {match}" + else: + full_ref = f"Fig {match}" + figure_refs.append((full_ref, match)) + + return figure_refs + + +def find_figure_by_id( + figure_id: str, figures: List[Dict[str, Any]] +) -> Optional[Dict[str, Any]]: + """ + Find a figure by its ID in the figures list. + Includes fallback logic for mismatched figure numbering between document text and Azure Doc Intelligence. + + Args: + figure_id: Figure ID to search for (e.g., "1.1", "2.3", or just "1", "2") + figures: List of figure dictionaries + + Returns: + Figure dictionary if found, None otherwise + """ + # First try exact match + for figure in figures: + if figure.get("id") == figure_id: + return figure + + # If no exact match, try fallback strategies + # Strategy 1: If figure_id is just a number (like "1"), try to find figures that start with that number + if figure_id.isdigit(): + target_num = int(figure_id) + for figure in figures: + fig_id = figure.get("id", "") + # Try patterns like "1.1", "1.2", "2.1", etc. + if fig_id.startswith(f"{target_num}.") or fig_id == str(target_num): + print(f"[FIGURE_MATCHING] Fallback match: '{figure_id}' -> '{fig_id}'") + return figure + + # Strategy 2: Sequential mapping - Azure often assigns IDs like "1.1", "2.1", "3.1" sequentially + # If document says "Fig. 1" and "Fig. 2", map them to the first N figures in order + if figure_id.isdigit(): + target_num = int(figure_id) + # Sort figures by their ID to get sequential order + sorted_figures = sorted(figures, key=lambda f: f.get("id", "")) + + # If we have fewer figures than the target number, try direct indexing + if target_num <= len(sorted_figures): + selected_figure = sorted_figures[target_num - 1] # 1-indexed to 0-indexed + print( + f"[FIGURE_MATCHING] Sequential mapping: '{figure_id}' -> figure at index {target_num - 1} (ID: {selected_figure.get('id')})" + ) + return selected_figure + + # Strategy 3: Try to match by page proximity and caption similarity + # For documents where figure numbering doesn't match, try to find figures on the same page + # This is a more advanced strategy that could be implemented later + + print( + f"[FIGURE_MATCHING] No figure found for ID: '{figure_id}' (checked {len(figures)} figures)" + ) + return None + + +def match_figure_references_to_bounding_boxes( + references: List[Dict[str, Any]], + raw_analysis: Dict[str, Any], + figures: List[Dict[str, Any]], +) -> List[Dict[str, Any]]: + """ + Match figure references to figure bounding boxes in addition to text references. + Enhanced to ensure all references get bounding boxes. + + Args: + references: List of reference dictionaries from LLM responses + raw_analysis: Raw analysis from Azure Document Intelligence + figures: List of figure metadata dictionaries + + Returns: + Updated references list with both text and figure bounding box matches + """ + print( + f"[FIGURE_MATCHING] Starting enhanced figure reference matching with {len(figures)} figures" + ) + figure_ids = [f.get("id", "unknown") for f in figures] + print(f"[FIGURE_MATCHING] Available figure IDs: {figure_ids}") + + # First, run text matching on ALL references to ensure they all get bounding boxes + text_matched_refs = match_references_to_bounding_boxes(references, raw_analysis) + print( + f"[FIGURE_MATCHING] Text matching completed for {len(text_matched_refs)} references" + ) + + # Now enhance references that contain figure references with figure information + enhanced_references = [] + + for ref in text_matched_refs: + ref_text = ref.get("text", "") + figure_refs = extract_figure_references(ref_text) + + print(f"[FIGURE_MATCHING] Processing reference: '{ref_text[:100]}...'") + print(f"[FIGURE_MATCHING] Extracted figure refs: {figure_refs}") + + if figure_refs: + # This reference contains figure references + # Enhance the existing text-matched reference with figure information + enhanced_ref = dict(ref) # Copy the text-matched reference + + # Add figure information to the best_match + if ref.get("best_match"): + enhanced_best_match = dict(ref["best_match"]) + # Add figure metadata to the existing best_match + for full_ref, figure_id in figure_refs: + print(f"[FIGURE_MATCHING] Looking for figure ID: '{figure_id}'") + figure = find_figure_by_id(figure_id, figures) + if figure: + print( + f"[FIGURE_MATCHING] ✅ Found matching figure: {figure.get('id')} on page {figure.get('page')}" + ) + # Add figure information to the best_match + enhanced_best_match["figure_id"] = figure_id + enhanced_best_match["figure_reference"] = full_ref + enhanced_best_match["figure_caption"] = figure.get("caption") + # Keep the text bounding box but add figure type information + enhanced_best_match["has_figure_reference"] = True + break # Only handle the first figure reference found + + enhanced_ref["best_match"] = enhanced_best_match + else: + # No text match found, but figure reference exists - create figure-only reference + for full_ref, figure_id in figure_refs: + figure = find_figure_by_id(figure_id, figures) + if figure: + print( + f"[FIGURE_MATCHING] Creating figure-only reference for: '{figure_id}'" + ) + enhanced_ref["best_match"] = { + "type": "figure", + "similarity": 1.0, + "page_number": figure.get("page"), + "bounding_regions": figure.get("bounding_regions", []), + "polygon": ( + figure.get("bounding_regions", [{}])[0].get( + "polygon", [] + ) + if figure.get("bounding_regions") + else [] + ), + "caption": figure.get("caption"), + "figure_id": figure_id, + "figure_reference": full_ref, + } + break + + enhanced_references.append(enhanced_ref) + else: + # No figure references, keep the text-matched reference as-is + enhanced_references.append(ref) + + print( + f"[FIGURE_MATCHING] Enhanced {len(enhanced_references)} references with figure information" + ) + return enhanced_references \ No newline at end of file diff --git a/backend/api/core/docint_coords.py b/backend/api/core/docint_coords.py new file mode 100644 index 00000000..564be3de --- /dev/null +++ b/backend/api/core/docint_coords.py @@ -0,0 +1,126 @@ +"""Helpers to normalize Azure Document Intelligence polygons into CAN-SR/Grobid-style boxes. + +Frontend (PDFBoundingBoxViewer) expects per-page boxes with fields: + { page, x, y, width, height } + +Grobid coords are in TEI pixel space from the original PDF rendering. +Azure DI returns polygons in page units (typically "inch" or "pixel"). + +We normalize by: + 1) Converting Azure units to pixel space when possible (inch->72dpi pixels). + 2) Converting polygon -> axis-aligned bounding rect. + +This is best-effort and is intended for highlighting tables/figures similar +to sentence highlighting. +""" + +from __future__ import annotations + +from typing import Any, Dict, List, Optional, Tuple + + +def _page_meta_by_number(pages_meta: Any) -> Dict[int, Dict[str, Any]]: + out: Dict[int, Dict[str, Any]] = {} + if not isinstance(pages_meta, list): + return out + for p in pages_meta: + if not isinstance(p, dict): + continue + num = p.get("pageNumber") or p.get("page_number") + try: + num_i = int(num) + except Exception: + continue + out[num_i] = p + return out + + +def _unit_to_scale(unit: Optional[str]) -> float: + """Return multiplier to convert unit coordinates into ~PDF pixels. + + Azure DI commonly reports: + - unit == 'inch' + - unit == 'pixel' + - unit == None + + We assume PDF coordinate space is 72 dpi points. + """ + + if not unit: + return 1.0 + u = str(unit).strip().lower() + if u in ("pixel", "pixels", "px"): + return 1.0 + if u in ("inch", "in"): + return 72.0 + # Unknown units: do not scale. + return 1.0 + + +def polygon_to_bbox(polygon: Any) -> Optional[Tuple[float, float, float, float]]: + """Convert Azure polygon [x1,y1,x2,y2,...] to (minx, miny, maxx, maxy).""" + if not isinstance(polygon, list) or len(polygon) < 8: + return None + try: + xs = [float(polygon[i]) for i in range(0, len(polygon), 2)] + ys = [float(polygon[i]) for i in range(1, len(polygon), 2)] + except Exception: + return None + return (min(xs), min(ys), max(xs), max(ys)) + + +def normalize_bounding_regions_to_boxes( + bounding_regions: Any, + pages_meta: Any, +) -> List[Dict[str, Any]]: + """Normalize Azure boundingRegions -> list of {page,x,y,width,height}. + + bounding_regions supports either: + - [{'pageNumber'|'page_number': 1, 'polygon': [...]}, ...] + - [{'page_number': 1, 'polygon': [...]}, ...] + """ + out: List[Dict[str, Any]] = [] + if not isinstance(bounding_regions, list): + return out + + pm = _page_meta_by_number(pages_meta) + + for region in bounding_regions: + if not isinstance(region, dict): + continue + + page = region.get("pageNumber") + if page is None: + page = region.get("page_number") + try: + page_i = int(page) + except Exception: + continue + + poly = region.get("polygon") + bbox = polygon_to_bbox(poly) + if not bbox: + continue + + unit = None + if page_i in pm: + unit = pm[page_i].get("unit") + + s = _unit_to_scale(unit) + minx, miny, maxx, maxy = bbox + minx *= s + miny *= s + maxx *= s + maxy *= s + + out.append( + { + "page": page_i, + "x": minx, + "y": miny, + "width": max(0.0, maxx - minx), + "height": max(0.0, maxy - miny), + } + ) + + return out diff --git a/backend/api/extract/prompts.py b/backend/api/extract/prompts.py index e71821ab..447aca76 100644 --- a/backend/api/extract/prompts.py +++ b/backend/api/extract/prompts.py @@ -2,6 +2,7 @@ You are an expert information extractor for scientific full-text articles. You will be given: - A short description of a parameter to extract (what the parameter is and how it is defined). - The full text of a paper with each sentence numbered like: [0] First sentence. [1] Second sentence. etc. +- Optionally, numbered tables (as markdown) and numbered figure captions (with the corresponding figure images provided alongside this message). Task (STRICT): Return a single valid JSON object and nothing else. The JSON MUST contain the following keys: @@ -9,6 +10,8 @@ - "value": the extracted value as a string (or null if not found). - "explanation": a concise explanation (1-4 sentences) describing why this value was chosen or how it was derived. - "evidence_sentences": an array of integers indicating the sentence indices you used as evidence (e.g. [2, 5]). If there are no supporting sentences, return an empty array. +- "evidence_tables": an array of integers indicating table numbers used (e.g. [1, 2]) or []. +- "evidence_figures": an array of integers indicating figure numbers used (e.g. [3]) or []. Requirements: - If the parameter is explicitly present, return the value exactly as found (preserve units/format) and list the sentence indices. @@ -21,9 +24,16 @@ - {parameter_name} (a short name for the parameter) - {parameter_description} (detailed description of what to look for) - {fulltext} (the numbered sentences string; e.g. "[0] First sentence\n[1] Next sentence\n...") +- {tables} (numbered markdown tables) +- {figures} (numbered figure captions) Example valid output: -{{"found": true, "value": "5 mg/kg", "explanation": "The Methods section explicitly lists a dose of 5 mg/kg in sentence [12].", "evidence_sentences": [12]}} +{{"found": true, "value": "5 mg/kg", "explanation": "The Methods section explicitly lists a dose of 5 mg/kg in sentence [12].", "evidence_sentences": [12], "evidence_tables": [], "evidence_figures": []}} Do not output anything besides the JSON object. +\n\nParameter name: {parameter_name} +\nParameter description: {parameter_description} +\n\nFull text (numbered sentences):\n{fulltext} +\n\nTables (numbered):\n{tables} +\n\nFigures (numbered; captions correspond to images provided alongside this message):\n{figures} """ diff --git a/backend/api/extract/router.py b/backend/api/extract/router.py index 7b5ea93a..3237a46b 100644 --- a/backend/api/extract/router.py +++ b/backend/api/extract/router.py @@ -1,10 +1,12 @@ -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, Tuple import json import re import os from tempfile import NamedTemporaryFile import hashlib from datetime import datetime +from pathlib import Path +import asyncio from fastapi import APIRouter, Depends, HTTPException, status from fastapi.concurrency import run_in_threadpool @@ -25,6 +27,9 @@ from ..services.grobid_service import grobid_service from ..core.cit_utils import load_sr_and_check +from ..services.azure_docint_client import azure_docint_client +from ..core.docint_coords import normalize_bounding_regions_to_boxes + # Import consolidated Postgres helpers if available (optional) from ..services.cit_db_service import cits_dp_service, snake_case_param @@ -44,6 +49,11 @@ class ParameterExtractRequest(BaseModel): temperature: Optional[float] = Field(0.0, ge=0.0, le=1.0) max_tokens: Optional[int] = Field(512, ge=1, le=4000) + # Optional artifacts context (if omitted, server will read from citation row when available) + tables: Optional[str] = Field(None, description="Optional numbered tables text (markdown).") + figures: Optional[str] = Field(None, description="Optional numbered figure captions text.") + attach_figures: Optional[bool] = Field(True, description="If true, attach figure images to the LLM request when available") + @@ -110,24 +120,108 @@ async def extract_parameter_endpoint( if not fulltext: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Full text not provided and not available for this citation") + # Build tables/figures context: prefer payload fields, else fetch from DB row (if loaded) + tables_text = payload.tables + figures_text = payload.figures + images: List[Tuple[bytes, str]] = [] + + if (tables_text is None or figures_text is None) and row is None: + try: + row = await run_in_threadpool(cits_dp_service.get_citation_by_id, int(citation_id), table_name) + except Exception: + row = None + + if row and (tables_text is None or figures_text is None): + # tables: embed markdown + if tables_text is None: + tables_md_lines: List[str] = [] + ft_tables = row.get("fulltext_tables") + if isinstance(ft_tables, str): + try: + ft_tables = json.loads(ft_tables) + except Exception: + ft_tables = None + if isinstance(ft_tables, list): + for item in ft_tables: + if not isinstance(item, dict): + continue + idx = item.get("index") + blob_addr = item.get("blob_address") + caption = item.get("caption") + if not idx or not blob_addr: + continue + try: + md_bytes, _ = await storage_service.get_bytes_by_path(blob_addr) + md_txt = md_bytes.decode("utf-8", errors="replace") + header = f"Table [T{idx}]" + (f" caption: {caption}" if caption else "") + tables_md_lines.extend([header, md_txt, ""]) + except Exception: + continue + tables_text = "\n".join(tables_md_lines) if tables_md_lines else "(none)" + + # figures: captions + optionally images + if figures_text is None: + figures_lines: List[str] = [] + ft_figs = row.get("fulltext_figures") + if isinstance(ft_figs, str): + try: + ft_figs = json.loads(ft_figs) + except Exception: + ft_figs = None + if isinstance(ft_figs, list): + for item in ft_figs: + if not isinstance(item, dict): + continue + idx = item.get("index") + blob_addr = item.get("blob_address") + caption = item.get("caption") + if not idx or not blob_addr: + continue + figures_lines.append( + f"Figure [F{idx}] caption: {caption or '(no caption)'} (see attached image F{idx})" + ) + if payload.attach_figures: + try: + img_bytes, _ = await storage_service.get_bytes_by_path(blob_addr) + if img_bytes: + images.append((img_bytes, "image/png")) + except Exception: + continue + figures_text = "\n".join(figures_lines) if figures_lines else "(none)" + + tables_text = tables_text if tables_text is not None else "(none)" + figures_text = figures_text if figures_text is not None else "(none)" + # Build prompt prompt = PARAMETER_PROMPT_JSON.format( parameter_name=payload.parameter_name, parameter_description=payload.parameter_description, - fulltext=fulltext + fulltext=fulltext, + tables=tables_text, + figures=figures_text, ) if not azure_openai_client.is_configured(): raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="Azure OpenAI client is not configured on the server") try: - llm_response = await azure_openai_client.simple_chat( - user_message=prompt, - system_prompt=None, - model=payload.model, - max_tokens=payload.max_tokens or 512, - temperature=payload.temperature or 0.0, - ) + if images: + llm_response = await azure_openai_client.multimodal_chat( + user_text=prompt, + images=images, + system_prompt=None, + model=payload.model, + max_tokens=payload.max_tokens or 512, + temperature=payload.temperature or 0.0, + ) + else: + llm_response = await azure_openai_client.simple_chat( + user_message=prompt, + system_prompt=None, + model=payload.model, + max_tokens=payload.max_tokens or 512, + temperature=payload.temperature or 0.0, + ) except Exception as e: raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"LLM call failed: {e}") @@ -215,12 +309,41 @@ def _extract_json_object(text: str) -> Optional[str]: else: raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail="'evidence_sentences' must be a list") + # Normalize evidence tables/figures + def _norm_int_list(v: Any) -> List[int]: + if v is None: + return [] + if not isinstance(v, list): + return [] + out: List[int] = [] + for item in v: + if isinstance(item, int): + out.append(item) + elif isinstance(item, str): + try: + out.append(int(item.strip())) + except Exception: + continue + # stable unique + seen = set() + uniq: List[int] = [] + for x in out: + if x not in seen: + seen.add(x) + uniq.append(x) + return uniq + + evidence_tables = _norm_int_list(parsed.get("evidence_tables")) + evidence_figures = _norm_int_list(parsed.get("evidence_figures")) + # Build the stored JSON stored = { "found": found_val, "value": val, "explanation": explanation, "evidence_sentences": evidence, + "evidence_tables": evidence_tables, + "evidence_figures": evidence_figures, "llm_raw": llm_response[:4000] } @@ -399,24 +522,142 @@ async def extract_fulltext_from_storage( "cached": True, } - # write to temp file and call grobid + # write to temp file and call grobid (+ Azure DI in parallel) tmp = NamedTemporaryFile(delete=False, suffix=".pdf") try: tmp.write(content) tmp.flush() tmp.close() - # process with grobid + # process with grobid (sentence coords) and Azure DI (tables/figures) in parallel + async def _run_grobid(): + return await grobid_service.process_structure(tmp.name) + + async def _run_docint(): + if not azure_docint_client or not azure_docint_client.is_available(): + return {"success": False, "error": "Azure DI not configured", "figures": [], "tables": []} + return await azure_docint_client.extract_citation_artifacts(tmp.name, source_type="file") + try: - coords, pages = await grobid_service.process_structure(tmp.name) + (coords, pages), docint_res = await asyncio.gather( + _run_grobid(), + _run_docint(), + ) except Exception as e: - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Grobid processing failed: {e}") + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Fulltext processing failed: {e}") # filter sentence annotations annotations = [a for a in coords if a.get("type") == "s" and a.get("text")] full_text_arr = _list_set([a["text"] for a in annotations]) full_text_str = "\n\n".join([f"[{i}] {x}" for i, x in enumerate(full_text_arr)]) + # ------------------------- + # Upload Azure DI artifacts + # ------------------------- + fulltext_figures: List[Dict[str, Any]] = [] + fulltext_tables: List[Dict[str, Any]] = [] + artifact_coords: List[Dict[str, Any]] = [] + + try: + if docint_res and isinstance(docint_res, dict) and docint_res.get("success"): + pages_meta = docint_res.get("pages") or [] + # Determine artifact base path from the fulltext_url directory + # storage_path is "container/blob". + container, blob = storage_path.split("/", 1) + blob_dir = str(Path(blob).parent).replace("\\", "/") + artifacts_prefix = f"{container}/{blob_dir}/{citation_id}_artifacts" + artifacts_prefix = artifacts_prefix.replace("//", "/").rstrip("/") + + # Figures: write png + for fig in (docint_res.get("figures") or []): + try: + idx = int(fig.get("index")) + except Exception: + continue + artifact_id = f"figure_{idx}.png" + blob_address = f"{artifacts_prefix}/{artifact_id}" + png_bytes = fig.get("png_bytes") or b"" + caption = fig.get("caption") + bbox = fig.get("bounding_box") + boxes = normalize_bounding_regions_to_boxes(bbox, pages_meta) + + # Upload only if we actually got image bytes + if png_bytes: + await storage_service.put_bytes_by_path( + blob_address, + png_bytes, + content_type="image/png", + ) + + fulltext_figures.append( + { + "blob_address": blob_address, + "caption": caption, + "bounding_box": boxes, + "description": None, + "index": idx, + } + ) + + # Also add to overlay coords so the existing PDF viewer logic can + # highlight tables/figures using the same shape as Grobid coords. + for b in boxes or []: + if not isinstance(b, dict): + continue + artifact_coords.append( + { + **b, + "type": "figure", + "artifact_index": idx, + "text": f"Figure F{idx}", + } + ) + + # Tables: write markdown (.md) + for tbl in (docint_res.get("tables") or []): + try: + idx = int(tbl.get("index")) + except Exception: + continue + artifact_id = f"table_{idx}.md" + blob_address = f"{artifacts_prefix}/{artifact_id}" + md = (tbl.get("table_markdown") or "").encode("utf-8") + caption = tbl.get("caption") + bbox = tbl.get("bounding_box") + boxes = normalize_bounding_regions_to_boxes(bbox, pages_meta) + if md: + await storage_service.put_bytes_by_path( + blob_address, + md, + content_type="text/markdown", + ) + fulltext_tables.append( + { + "blob_address": blob_address, + "caption": caption, + "bounding_box": boxes, + "description": None, + "index": idx, + } + ) + + for b in boxes or []: + if not isinstance(b, dict): + continue + artifact_coords.append( + { + **b, + "type": "table", + "artifact_index": idx, + "text": f"Table T{idx}", + } + ) + except Exception: + # Best-effort; DI artifacts should not block fulltext extraction. + fulltext_figures = [] + fulltext_tables = [] + artifact_coords = [] + finally: try: os.unlink(tmp.name) @@ -425,11 +666,14 @@ async def extract_fulltext_from_storage( # persist full_text_str and coordinates/pages into citation row try: + coords_for_overlay = list(annotations) + list(artifact_coords) updated1 = await run_in_threadpool(cits_dp_service.update_text_column, citation_id, "fulltext", full_text_str, table_name) updated2 = await run_in_threadpool(cits_dp_service.update_text_column, citation_id, "fulltext_md5", current_md5, table_name) - updated3 = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, "fulltext_coords", annotations, table_name) + updated3 = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, "fulltext_coords", coords_for_overlay, table_name) updated4 = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, "fulltext_pages", pages, table_name) - updated = updated1 or updated2 or updated3 or updated4 + updated5 = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, "fulltext_figures", fulltext_figures, table_name) + updated6 = await run_in_threadpool(cits_dp_service.update_jsonb_column, citation_id, "fulltext_tables", fulltext_tables, table_name) + updated = updated1 or updated2 or updated3 or updated4 or updated5 or updated6 except RuntimeError as rexc: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=str(rexc)) except Exception as e: @@ -438,4 +682,12 @@ async def extract_fulltext_from_storage( if not updated: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Citation not found to update") - return {"status": "success", "sr_id": sr_id, "citation_id": citation_id, "fulltext": full_text_str, "n_pages": len(pages)} + return { + "status": "success", + "sr_id": sr_id, + "citation_id": citation_id, + "fulltext": full_text_str, + "n_pages": len(pages), + "fulltext_figures": fulltext_figures, + "fulltext_tables": fulltext_tables, + } diff --git a/backend/api/screen/prompts.py b/backend/api/screen/prompts.py index 1d10e20e..b402f3e0 100644 --- a/backend/api/screen/prompts.py +++ b/backend/api/screen/prompts.py @@ -41,22 +41,34 @@ - Full text (numbered sentences): {fulltext} +- Tables (numbered): +{tables} + +- Figures (numbered; captions correspond to images provided alongside this message): +{figures} + Respond with a JSON object containing these keys: - "selected": the exact option string you selected (must match one of the options above; if none fits, pick the closest option and report a low confidence score) - "explanation": a concise explanation (1-4 sentences) of why you selected that option - "confidence": a floating number between 0 and 1 (inclusive) representing your estimated confidence for the selected option - "evidence_sentences": an array of integers indicating the sentence indices you used as evidence (e.g. [2, 5]). If there is low confidence, return an empty array []. +- "evidence_tables": an array of integers indicating the table numbers you used (e.g. [1, 3]) or [] if none. +- "evidence_figures": an array of integers indicating the figure numbers you used (e.g. [2]) or [] if none. JSON object format: {{ "selected": "", "explanation": "<1-4 sentences explaining the choice>", "confidence": , - "evidence_sentences": [] + "evidence_sentences": [], + "evidence_tables": [], + "evidence_figures": [
] }} Notes: - Keep the response strictly as a JSON object that matches the schema above. - Do not wrap the response in Markdown code fences or add language tags (e.g., ```json). Return only raw JSON. - Use sentence indices from the numbered full text for "evidence_sentences" +- Use table numbers from the Tables section for "evidence_tables" +- Use figure numbers from the Figures section for "evidence_figures" """ \ No newline at end of file diff --git a/backend/api/screen/router.py b/backend/api/screen/router.py index 76291f7e..a36c7c86 100644 --- a/backend/api/screen/router.py +++ b/backend/api/screen/router.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, Tuple import json import re from datetime import datetime @@ -11,6 +11,7 @@ from ..core.config import settings from ..core.security import get_current_active_user from ..services.azure_openai_client import azure_openai_client +from ..services.storage import storage_service # Import helpers from citations router to fetch citation rows and build combined citations from ..citations import router as citations_router @@ -25,6 +26,32 @@ router = APIRouter() +def _normalize_int_list(v: Any) -> List[int]: + if v is None: + return [] + if not isinstance(v, list): + return [] + out: List[int] = [] + for item in v: + if isinstance(item, int): + out.append(item) + elif isinstance(item, str): + try: + out.append(int(item.strip())) + except Exception: + continue + else: + continue + # stable unique + seen = set() + uniq: List[int] = [] + for x in out: + if x not in seen: + seen.add(x) + uniq.append(x) + return uniq + + class ClassifyRequest(BaseModel): citation_text: Optional[str] = Field( None, description="Optional combined citation text. If omitted the server will build it from the screening DB row." @@ -102,30 +129,106 @@ async def classify_citation( # Build or use provided citation text (fall back to combined title/abstract when not provided) citation_text = payload.citation_text or citations_router._build_combined_citation_from_row(row, payload.include_columns) + # Ensure LLM client is available + if not azure_openai_client.is_configured(): + raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="Azure OpenAI client is not configured on the server") + # Prepare prompt (use full-text template for l2, otherwise TA/L1 template) options_listed = "\n".join([f"{i}. {opt}" for i, opt in enumerate(payload.options)]) + llm_response: str + if (payload.screening_step or "").lower() == "l2": fulltext = row.get("fulltext") or "" + + # Tables/Figures context from citation row (populated by extract-fulltext) + tables_md_lines: List[str] = [] + figures_lines: List[str] = [] + images: List[Tuple[bytes, str]] = [] + + # Tables: fetch markdown blobs and embed + ft_tables = row.get("fulltext_tables") + if isinstance(ft_tables, str): + try: + ft_tables = json.loads(ft_tables) + except Exception: + ft_tables = None + if isinstance(ft_tables, list): + for item in ft_tables: + if not isinstance(item, dict): + continue + idx = item.get("index") + blob_addr = item.get("blob_address") + caption = item.get("caption") + if not idx or not blob_addr: + continue + try: + md_bytes, _ = await storage_service.get_bytes_by_path(blob_addr) + except Exception: + continue + md_txt = md_bytes.decode("utf-8", errors="replace") + header = f"Table [T{idx}]" + (f" caption: {caption}" if caption else "") + tables_md_lines.extend([header, md_txt, ""]) + + # Figures: fetch png blobs and attach as images + ft_figs = row.get("fulltext_figures") + if isinstance(ft_figs, str): + try: + ft_figs = json.loads(ft_figs) + except Exception: + ft_figs = None + if isinstance(ft_figs, list): + for item in ft_figs: + if not isinstance(item, dict): + continue + idx = item.get("index") + blob_addr = item.get("blob_address") + caption = item.get("caption") + if not idx or not blob_addr: + continue + figures_lines.append( + f"Figure [F{idx}] caption: {caption or '(no caption)'} (see attached image F{idx})" + ) + try: + img_bytes, _ = await storage_service.get_bytes_by_path(blob_addr) + if img_bytes: + images.append((img_bytes, "image/png")) + except Exception: + continue + prompt = PROMPT_JSON_TEMPLATE_FULLTEXT.format( question=payload.question, options=options_listed, xtra=payload.xtra or "", fulltext=fulltext or citation_text, + tables="\n".join(tables_md_lines) if tables_md_lines else "(none)", + figures="\n".join(figures_lines) if figures_lines else "(none)", ) + + # Prefer multimodal when figures are present + if images: + llm_response = await azure_openai_client.multimodal_chat( + user_text=prompt, + images=images, + system_prompt=None, + model=payload.model, + max_tokens=payload.max_tokens or 2000, + temperature=payload.temperature or 0.0, + ) + else: + llm_response = await azure_openai_client.simple_chat( + user_message=prompt, + system_prompt=None, + model=payload.model, + max_tokens=payload.max_tokens or 2000, + temperature=payload.temperature or 0.0, + ) else: prompt = PROMPT_JSON_TEMPLATE.format( question=payload.question, cit=citation_text, options=options_listed, - xtra=payload.xtra or "" + xtra=payload.xtra or "", ) - - # Ensure LLM client is available - if not azure_openai_client.is_configured(): - raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="Azure OpenAI client is not configured on the server") - - # Call the LLM (simple non-streaming chat) - try: llm_response = await azure_openai_client.simple_chat( user_message=prompt, system_prompt=None, @@ -133,8 +236,6 @@ async def classify_citation( max_tokens=payload.max_tokens or 2000, temperature=payload.temperature or 0.0, ) - except Exception as e: - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"LLM call failed: {e}") # Parse JSON (assume valid JSON) - try/except only logger.info(llm_response) @@ -172,22 +273,17 @@ async def classify_citation( except Exception: confidence = 0.0 - # Normalize evidence sentences from model (optional) - evidence_raw = parsed.get("evidence_sentences", []) - evidence: List[int] = [] - if isinstance(evidence_raw, list): - for i in evidence_raw: - try: - idx = int(i) - evidence.append(idx) - except Exception: - continue + evidence = _normalize_int_list(parsed.get("evidence_sentences")) + evidence_tables = _normalize_int_list(parsed.get("evidence_tables")) + evidence_figures = _normalize_int_list(parsed.get("evidence_figures")) classification_json = { "selected": resolved_selected, "explanation": explanation, "confidence": confidence, "evidence_sentences": evidence, + "evidence_tables": evidence_tables, + "evidence_figures": evidence_figures, "llm_raw": llm_response, # raw response for audit } diff --git a/backend/api/services/azure_docint_client.py b/backend/api/services/azure_docint_client.py new file mode 100644 index 00000000..4c047a4a --- /dev/null +++ b/backend/api/services/azure_docint_client.py @@ -0,0 +1,822 @@ +""" +Azure Document Intelligence Service for PDF processing + +This service uses Azure's Document Intelligence to extract +structured content from PDF documents. It provides an alternative to Docling for +document processing with potentially better handling of complex layouts, tables, +and structured documents. + +Key Features: +- Superior table extraction +- Form field recognition +- Multi-language support +- Layout analysis with reading order +- Handwriting recognition +- Key-value pair extraction +- Figure/chart detection and extraction with captions +- Downloadable cropped figure images +""" + +import base64 +import os +import uuid +import json +import asyncio +from datetime import datetime +from pathlib import Path +from typing import Dict, Any, Optional, List, Tuple + +from bs4 import BeautifulSoup +from typing import TYPE_CHECKING + +try: + from azure.ai.documentintelligence import DocumentIntelligenceClient + from azure.ai.documentintelligence.models import AnalyzeDocumentRequest + from azure.core.credentials import AzureKeyCredential + + AZURE_DOC_INTELLIGENCE_AVAILABLE = True +except ImportError: + AZURE_DOC_INTELLIGENCE_AVAILABLE = False + # Keep type names defined so type annotations don't crash at runtime when SDK isn't installed. + from typing import Any as DocumentIntelligenceClient # type: ignore + from typing import Any as AnalyzeDocumentRequest # type: ignore + from typing import Any as AzureKeyCredential # type: ignore + print( + "Azure Document Intelligence SDK not installed. Install with: pip install azure-ai-documentintelligence azure-core" + ) + + +class AzureDocIntelligenceService: + """Service for processing documents using Azure Document Intelligence""" + + def __init__(self): + self.base_path = Path(__file__).parent.parent.parent.parent.parent + # Unified directory structure: output/azure_doc_intelligence/{conversion_id}/ + self.output_base_dir = self.base_path / "output" / "azure_doc_intelligence" + self.output_base_dir.mkdir(parents=True, exist_ok=True) + + # Initialize Azure client + self.client = self._init_client() + + def _init_client(self) -> Optional["DocumentIntelligenceClient"]: + """Initialize Azure Document Intelligence client""" + if not AZURE_DOC_INTELLIGENCE_AVAILABLE: + return None + + endpoint = os.getenv("AZURE_DOC_INTELLIGENCE_ENDPOINT") + key = os.getenv("AZURE_DOC_INTELLIGENCE_KEY") + + if not endpoint or not key: + print( + "Azure Document Intelligence credentials not found. Set AZURE_DOC_INTELLIGENCE_ENDPOINT and AZURE_DOC_INTELLIGENCE_KEY" + ) + return None + + try: + return DocumentIntelligenceClient( + endpoint=endpoint, credential=AzureKeyCredential(key) + ) + except Exception as e: + print(f"Failed to initialize Azure Document Intelligence client: {e}") + return None + + def _analyze_document_sync( + self, source: str, source_type: str, output_param: Optional[List[str]] + ): + """Synchronous wrapper for document analysis to run in thread pool""" + if source_type == "file": + with open(source, "rb") as f: + file_content = f.read() + # Use the correct API format + poller = self.client.begin_analyze_document( + model_id="prebuilt-layout", + body=file_content, + content_type="application/octet-stream", + output_content_format="markdown", + output=output_param, + ) + else: # URL + # For URL, use AnalyzeDocumentRequest + analyze_request = AnalyzeDocumentRequest(url_source=source) + poller = self.client.begin_analyze_document( + model_id="prebuilt-layout", + analyze_request=analyze_request, + output_content_format="markdown", + output=output_param, + ) + + # Wait for completion (this is the blocking part) + result = poller.result() + + # Extract result_id from the poller + result_id = None + try: + # Extract result_id from operation-location header in initial response + if hasattr(poller, "_polling_method") and hasattr( + poller._polling_method, "_initial_response" + ): + initial_resp = poller._polling_method._initial_response + if hasattr(initial_resp, "http_response") and hasattr( + initial_resp.http_response, "headers" + ): + headers = initial_resp.http_response.headers + # Try different header names (Azure API uses 'operation-location') + for header_name in [ + "operation-location", + "Operation-Location", + ]: + if header_name in headers: + operation_location = headers[header_name] + # Extract result_id from URL: .../analyzeResults/{result_id}?api-version=... + if "analyzeResults" in operation_location: + result_id = operation_location.split("/")[-1].split( + "?" + )[0] + break + except Exception as e: + print(f"Warning: Could not extract result_id: {str(e)}") + + return result, result_id + + async def convert_document_to_markdown( + self, + source: str, + source_type: str = "file", + extract_figures: bool = True, + output_dir: Optional[Path] = None, + ) -> Dict[str, Any]: + """ + Convert document to markdown using Azure Document Intelligence (Non-blocking) + + Args: + source: File path or URL to the document + source_type: Type of source ("file" or "url") + extract_figures: Whether to extract figures + output_dir: Optional output directory. If provided, saves directly here. + If None, uses legacy UUID-based path in output/azure_doc_intelligence/ + """ + return await asyncio.to_thread( + self._convert_document_sync, + source, + source_type, + extract_figures, + output_dir, + ) + + def _convert_document_sync( + self, + source: str, + source_type: str = "file", + extract_figures: bool = True, + output_dir: Optional[Path] = None, + ) -> Dict[str, Any]: + """ + Synchronous implementation of document conversion + + Args: + output_dir: If provided, save output directly to this directory. + If None, uses legacy UUID-based path. + """ + if not self.client: + return { + "success": False, + "error": "Azure Document Intelligence client not available", + "conversion_id": str(uuid.uuid4()), + } + + conversion_id = str(uuid.uuid4()) + start_time = datetime.now() + + try: + # Use provided output_dir or fall back to legacy UUID-based path + if output_dir: + conversion_dir = output_dir + conversion_dir.mkdir(parents=True, exist_ok=True) + else: + # Legacy: output/azure_doc_intelligence/{conversion_id}/ + conversion_dir = self.output_base_dir / conversion_id + conversion_dir.mkdir(parents=True, exist_ok=True) + + # Define all file paths within the conversion directory + log_path = conversion_dir / "conversion.log" + raw_json_path = conversion_dir / "raw_analysis.json" + markdown_path = conversion_dir / "document.md" + metadata_path = conversion_dir / "metadata.json" + figures_dir = conversion_dir / "figures" + + self._log_sync( + log_path, f"Starting Azure Document Intelligence conversion: {source}" + ) + + # Analyze document - Updated API format + # Include 'figures' in output if extract_figures is True + output_param = ["figures"] if extract_figures else None + + self._log_sync( + log_path, "Document analysis started (in background thread)..." + ) + + # Run the blocking analysis directly since we are already in a thread + result, result_id = self._analyze_document_sync( + source, + source_type, + output_param, + ) + + self._log_sync(log_path, "Document analysis completed") + + # Convert full result to dictionary for JSON serialization (with ALL bounding boxes) + result_dict = result.as_dict() + + # Add processor field for format detection + result_dict["processor"] = "azure_doc_intelligence" + + # Save the FULL raw JSON response + with open(raw_json_path, "w", encoding="utf-8") as f: + json.dump(result_dict, f, indent=2, ensure_ascii=False) + self._log_sync( + log_path, + f"Saved full raw JSON with bounding boxes to raw_analysis.json", + ) + + # Extract markdown content + markdown_content = result.content if result.content else "" + + # Save markdown + with open(markdown_path, "w", encoding="utf-8") as f: + f.write(markdown_content) + + # Extract and save tables as separate HTML files + self._extract_and_save_tables_sync( + result=result, + conversion_dir=conversion_dir, + markdown_content=markdown_content, + log_path=log_path, + ) + + # Process figures if requested + figures_metadata = [] + + if extract_figures and result.figures: + figures_dir.mkdir(parents=True, exist_ok=True) + self._log_sync( + log_path, f"Found {len(result.figures)} figures to process" + ) + + if result_id: + self._log_sync( + log_path, + f"Extracted result_id: {result_id}", + ) + else: + self._log_sync( + log_path, + "⚠️ Could not extract result_id - figure images will not be downloaded", + ) + + for idx, figure in enumerate(result.figures): + figure_id = ( + figure.id + if hasattr(figure, "id") and figure.id + else f"unknown_{idx}" + ) + + # Extract figure metadata + figure_info = { + "id": figure_id, + "page": ( + figure.bounding_regions[0].page_number + if figure.bounding_regions + else None + ), + "caption": ( + figure.caption.content + if hasattr(figure, "caption") and figure.caption + else None + ), + "spans": ( + [ + {"offset": span.offset, "length": span.length} + for span in figure.spans + ] + if figure.spans + else [] + ), + "bounding_regions": ( + [ + { + "page_number": region.page_number, + "polygon": region.polygon, + } + for region in figure.bounding_regions + ] + if figure.bounding_regions + else [] + ), + } + + # Download the figure image if we have a result_id + if result_id: + image_path = self._download_figure_sync( + result_id=result_id, + figure_id=figure_id, + figures_dir=figures_dir, + log_path=log_path, + ) + if image_path: + figure_info["image_path"] = image_path + else: + self._log_sync( + log_path, + f"Skipping image download for figure {figure_id} (no result_id)", + ) + + figures_metadata.append(figure_info) + + self._log_sync(log_path, f"Processed {len(figures_metadata)} figures") + + # Create metadata + end_time = datetime.now() + conversion_time = (end_time - start_time).total_seconds() + + metadata = { + "conversion_id": conversion_id, + "source": source, + "source_type": source_type, + "processor": "azure_doc_intelligence", + "model_id": "prebuilt-layout", + "status": "success", + "conversion_dir": str(conversion_dir), + "markdown_path": str(markdown_path), + "raw_json_path": str(raw_json_path), + "log_path": str(log_path), + "start_time": start_time.isoformat(), + "end_time": end_time.isoformat(), + "conversion_time": conversion_time, + "content_length": len(markdown_content), + "page_count": len(result.pages) if result.pages else 0, + "tables_found": len(result.tables) if result.tables else 0, + "key_value_pairs_found": ( + len(result.key_value_pairs) if result.key_value_pairs else 0 + ), + "figures_found": len(figures_metadata), + "figures": figures_metadata, + } + + # Save metadata + with open(metadata_path, "w", encoding="utf-8") as f: + json.dump(metadata, f, indent=2) + + self._log_sync( + log_path, f"Conversion completed successfully in {conversion_time:.2f}s" + ) + self._log_sync(log_path, f"Pages processed: {metadata['page_count']}") + self._log_sync(log_path, f"Tables found: {metadata['tables_found']}") + self._log_sync( + log_path, f"Key-value pairs found: {metadata['key_value_pairs_found']}" + ) + self._log_sync(log_path, f"Figures found: {metadata['figures_found']}") + + return { + "success": True, + "conversion_id": conversion_id, + "markdown_path": str(markdown_path), + "metadata": { + "content_length": len(markdown_content), + "conversion_time": conversion_time, + "page_count": metadata["page_count"], + "tables_found": metadata["tables_found"], + "key_value_pairs_found": metadata["key_value_pairs_found"], + "figures_found": metadata["figures_found"], + "figures": figures_metadata, + }, + } + + except Exception as e: + error_msg = f"Azure Document Intelligence conversion failed: {str(e)}" + + # Try to log error if log_path was created + try: + self._log_sync(log_path, f"ERROR: {error_msg}") + except: + pass + + # Save error metadata + metadata = { + "conversion_id": conversion_id, + "source": source, + "source_type": source_type, + "processor": "azure_doc_intelligence", + "status": "error", + "error": error_msg, + "conversion_dir": ( + str(conversion_dir) if "conversion_dir" in locals() else None + ), + "log_path": str(log_path) if "log_path" in locals() else None, + "start_time": start_time.isoformat(), + "end_time": datetime.now().isoformat(), + } + + # Save metadata to conversion directory if it exists + try: + if "metadata_path" in locals(): + with open(metadata_path, "w", encoding="utf-8") as f: + json.dump(metadata, f, indent=2) + except: + pass + + return { + "success": False, + "error": error_msg, + "conversion_id": conversion_id, + } + + async def _log(self, log_path: Path, message: str): + """Write log message (Async wrapper)""" + await asyncio.to_thread(self._log_sync, log_path, message) + + def _log_sync(self, log_path: Path, message: str): + """Write log message (Synchronous)""" + timestamp = datetime.now().isoformat() + log_entry = f"[{timestamp}] {message}\n" + + with open(log_path, "a", encoding="utf-8") as f: + f.write(log_entry) + + def _extract_and_save_tables_sync( + self, + result: Any, + conversion_dir: Path, + markdown_content: str, + log_path: Path, + ) -> None: + """ + Extract tables from Azure result and save as separate HTML files + + Args: + result: Azure Document Intelligence result + conversion_dir: Conversion directory + markdown_content: The markdown content containing HTML tables + log_path: Log file path + """ + import re + + if not result.tables or len(result.tables) == 0: + self._log_sync(log_path, "No tables found in document") + return + + # Create tables directory + tables_dir = conversion_dir / "tables" + tables_dir.mkdir(parents=True, exist_ok=True) + + self._log_sync(log_path, f"Found {len(result.tables)} tables to extract") + + # Extract HTML tables from markdown content using regex + # Match
...
blocks + table_pattern = r".*?
" + html_tables = re.findall(table_pattern, markdown_content, re.DOTALL) + + # Save each table as a separate HTML file + for idx, html_table in enumerate(html_tables, start=1): + try: + table_html_path = tables_dir / f"table-{idx}.html" + with open(table_html_path, "w", encoding="utf-8") as f: + f.write(html_table) + self._log_sync(log_path, f"Saved table {idx} to {table_html_path.name}") + except Exception as e: + self._log_sync(log_path, f"Failed to save table {idx}: {str(e)}") + + self._log_sync( + log_path, f"Extracted {len(html_tables)} tables to tables/ directory" + ) + + def _download_figure_sync( + self, result_id: str, figure_id: str, figures_dir: Path, log_path: Path + ) -> Optional[str]: + """ + Download a single figure image from Azure Document Intelligence + + Args: + result_id: The analysis result ID + figure_id: The figure ID (e.g., "1.1" for page 1, figure 1) + figures_dir: Directory to save the figure + log_path: Log file path + + Returns: + Relative path to the saved figure or None if failed + """ + try: + # Get the figure using the SDK's get_analyze_result_figure method + figure_stream = self.client.get_analyze_result_figure( + model_id="prebuilt-layout", result_id=result_id, figure_id=figure_id + ) + + # Save the figure + figure_filename = f"{figure_id}.png" + figure_path = figures_dir / figure_filename + + with open(figure_path, "wb") as f: + for chunk in figure_stream: + f.write(chunk) + + self._log_sync( + log_path, f"Downloaded figure {figure_id} to {figure_filename}" + ) + return f"figures/{figure_filename}" + + except Exception as e: + self._log_sync(log_path, f"Failed to download figure {figure_id}: {str(e)}") + return None + + async def get_conversion_by_id( + self, conversion_id: str + ) -> Optional[Dict[str, Any]]: + """Get conversion metadata by ID""" + metadata_path = self.output_base_dir / conversion_id / "metadata.json" + + if not metadata_path.exists(): + return None + + try: + with open(metadata_path, "r", encoding="utf-8") as f: + return json.load(f) + except Exception: + return None + + async def get_markdown_content(self, conversion_id: str) -> Optional[str]: + """ + Get markdown content by conversion ID for LLM entity extraction + + Returns the markdown content from document.md + """ + conversion_dir = self.output_base_dir / conversion_id + + markdown_path = conversion_dir / "document.md" + if not markdown_path.exists(): + return None + + try: + with open(markdown_path, "r", encoding="utf-8") as f: + return f.read() + except Exception: + return None + + def is_available(self) -> bool: + """Check if Azure Document Intelligence is available and configured""" + return AZURE_DOC_INTELLIGENCE_AVAILABLE and self.client is not None + + async def get_figures_for_conversion( + self, conversion_id: str + ) -> Optional[List[Dict[str, Any]]]: + """ + Get all figures metadata for a specific conversion + + Args: + conversion_id: The conversion ID + + Returns: + List of figure metadata dictionaries or None if not found + """ + metadata = await self.get_conversion_by_id(conversion_id) + if metadata and "figures" in metadata: + return metadata["figures"] + return None + + async def get_raw_analysis_result( + self, conversion_id: str + ) -> Optional[Dict[str, Any]]: + """ + Get the complete raw JSON analysis result with ALL bounding boxes + + This includes: + - All pages with words, lines, spans, selection marks + - All paragraphs with bounding regions and roles + - All tables with cells and bounding boxes + - All figures with bounding regions + - All sections and structural information + + Args: + conversion_id: The conversion ID + + Returns: + Complete analysis result dictionary or None if not found + """ + raw_json_path = self.output_base_dir / conversion_id / "raw_analysis.json" + + if not raw_json_path.exists(): + return None + + try: + with open(raw_json_path, "r", encoding="utf-8") as f: + return json.load(f) + except Exception: + return None + + # ------------------------------------------------------------------ + # CAN-SR helpers (artifacts for citations) + # ------------------------------------------------------------------ + + @staticmethod + def _html_table_to_markdown(html_table: str) -> str: + """Convert a single ...
block into GitHub-flavored markdown. + + Best-effort conversion for prompt inclusion. + """ + soup = BeautifulSoup(html_table, "html.parser") + table = soup.find("table") + if not table: + return html_table + + rows: List[List[str]] = [] + for tr in table.find_all("tr"): + cells = tr.find_all(["th", "td"]) + row = [" ".join(c.get_text(" ", strip=True).split()) for c in cells] + if row: + rows.append(row) + + if not rows: + return "" + + # Normalize row widths + width = max(len(r) for r in rows) + rows = [r + [""] * (width - len(r)) for r in rows] + + header = rows[0] + body = rows[1:] if len(rows) > 1 else [] + + def esc(v: str) -> str: + return (v or "").replace("|", "\\|") + + md_lines = [ + "| " + " | ".join(esc(x) for x in header) + " |", + "| " + " | ".join(["---"] * width) + " |", + ] + for r in body: + md_lines.append("| " + " | ".join(esc(x) for x in r) + " |") + return "\n".join(md_lines) + + @staticmethod + def _extract_html_tables_from_markdown(markdown: str) -> List[str]: + """Extract blocks from Azure markdown content.""" + import re + + if not markdown: + return [] + table_pattern = r"
.*?
" + return re.findall(table_pattern, markdown, re.DOTALL) + + def _download_figure_bytes_sync(self, result_id: str, figure_id: str) -> Optional[bytes]: + """Download a single figure image from Azure DI as bytes (sync).""" + try: + stream = self.client.get_analyze_result_figure( + model_id="prebuilt-layout", result_id=result_id, figure_id=figure_id + ) + chunks: List[bytes] = [] + for chunk in stream: + chunks.append(chunk) + return b"".join(chunks) + except Exception: + return None + + async def extract_citation_artifacts( + self, + source_pdf: str, + source_type: str = "file", + ) -> Dict[str, Any]: + """Run Azure DI and return citation-ready figure/table artifacts. + + Returns: + { + "success": bool, + "error": str|None, + "raw_analysis": dict|None, + "figures": [ + {"index": 1, "azure_id": "1.1", "caption": str|None, "bounding_box": {...}, "png_bytes": bytes} + ], + "tables": [ + {"index": 1, "caption": None, "bounding_box": {...}, "table_markdown": "|...|"} + ] + } + + Notes: + - `description` is intentionally not generated here. + - Bounding boxes are stored as Azure DI polygon regions. + """ + + if not self.client: + return {"success": False, "error": "Azure Document Intelligence client not available"} + + # We need figures in output. + output_param = ["figures"] + + try: + result, result_id = await asyncio.to_thread( + self._analyze_document_sync, source_pdf, source_type, output_param + ) + except Exception as e: + return {"success": False, "error": f"Azure DI analyze failed: {e}"} + + raw_analysis = result.as_dict() if hasattr(result, "as_dict") else {} + raw_analysis["processor"] = "azure_doc_intelligence" + + # Preserve page-level metadata so callers can normalize polygons into + # the same coordinate system as Grobid TEI coords. + # Typical shape: {pageNumber,width,height,unit} + pages_meta = raw_analysis.get("pages") or [] + + markdown_content = getattr(result, "content", None) or "" + + # ----------------- + # Tables + # ----------------- + html_tables = self._extract_html_tables_from_markdown(markdown_content) + md_tables: List[str] = [self._html_table_to_markdown(t) for t in html_tables] + + # Azure gives table bounding regions under raw_analysis['tables'][*]['boundingRegions'] + raw_tables = raw_analysis.get("tables", []) or [] + + tables_out: List[Dict[str, Any]] = [] + for i, md in enumerate(md_tables, start=1): + bbox = None + if i - 1 < len(raw_tables): + bbox = raw_tables[i - 1].get("boundingRegions") or raw_tables[i - 1].get("bounding_regions") + tables_out.append( + { + "index": i, + "caption": None, + "bounding_box": bbox, + "table_markdown": md, + } + ) + + # ----------------- + # Figures + # ----------------- + figures_out: List[Dict[str, Any]] = [] + raw_figures = raw_analysis.get("figures", []) or [] + + # Prefer SDK figures list for caption/bbox, but fall back to raw dict. + sdk_figures = getattr(result, "figures", None) or [] + for idx, fig in enumerate(sdk_figures, start=1): + azure_id = getattr(fig, "id", None) or f"unknown_{idx}" + caption = None + try: + cap = getattr(fig, "caption", None) + caption = getattr(cap, "content", None) if cap else None + except Exception: + caption = None + + bounding_regions = [] + try: + for region in (getattr(fig, "bounding_regions", None) or []): + bounding_regions.append( + {"page_number": region.page_number, "polygon": region.polygon} + ) + except Exception: + bounding_regions = [] + + png_bytes = None + if result_id: + png_bytes = await asyncio.to_thread(self._download_figure_bytes_sync, result_id, azure_id) + + if not png_bytes: + # If we couldn't download, skip storing bytes (still return metadata) + png_bytes = b"" + + figures_out.append( + { + "index": idx, + "azure_id": azure_id, + "caption": caption, + "bounding_box": bounding_regions, + "png_bytes": png_bytes, + } + ) + + # If SDK did not return figures but raw JSON did, include raw ones. + if not figures_out and raw_figures: + for idx, fig in enumerate(raw_figures, start=1): + figures_out.append( + { + "index": idx, + "azure_id": fig.get("id") or f"raw_{idx}", + "caption": (fig.get("caption", {}) or {}).get("content") if isinstance(fig.get("caption"), dict) else None, + "bounding_box": fig.get("boundingRegions") or fig.get("bounding_regions"), + "png_bytes": b"", + } + ) + + return { + "success": True, + "raw_analysis": raw_analysis, + "pages": pages_meta, + "figures": figures_out, + "tables": tables_out, + } + + +# Global instance for routers/services +try: + azure_docint_client = AzureDocIntelligenceService() +except Exception: + azure_docint_client = None # type: ignore \ No newline at end of file diff --git a/backend/api/services/azure_openai_client.py b/backend/api/services/azure_openai_client.py index fe97f937..6481f2f3 100644 --- a/backend/api/services/azure_openai_client.py +++ b/backend/api/services/azure_openai_client.py @@ -25,6 +25,7 @@ import logging import time from pathlib import Path +import base64 from typing import Any, Dict, List, Optional, Tuple import yaml @@ -211,7 +212,7 @@ def _get_official_client(self, model: str) -> AzureOpenAI: def _build_messages( self, user_message: str, system_prompt: Optional[str] = None - ) -> List[Dict[str, str]]: + ) -> List[Dict[str, Any]]: """Build message list for chat completion""" messages = [] if system_prompt: @@ -221,7 +222,7 @@ def _build_messages( async def chat_completion( self, - messages: List[Dict[str, str]], + messages: List[Dict[str, Any]], model: Optional[str] = None, max_tokens: int = 1000, temperature: float = 0.7, @@ -321,6 +322,51 @@ async def simple_chat( print(f"Error in simple chat: {e}") return f"I apologize, but I encountered an error while processing your request. Please try again later. (Error: {str(e)})" + async def multimodal_chat( + self, + user_text: str, + images: List[Tuple[bytes, str]], + system_prompt: Optional[str] = None, + model: Optional[str] = None, + max_tokens: int = 1000, + temperature: float = 0.0, + ) -> str: + """Send a single user message with multiple attached images. + + `images` items are (bytes, mime_type) where mime_type is e.g. "image/png". + """ + try: + parts: List[Dict[str, Any]] = [{"type": "text", "text": user_text}] + for b, mime in images or []: + if not b: + continue + b64 = base64.b64encode(b).decode("utf-8") + parts.append( + { + "type": "image_url", + "image_url": {"url": f"data:{mime};base64,{b64}"}, + } + ) + + messages: List[Dict[str, Any]] = [] + if system_prompt: + messages.append({"role": "system", "content": system_prompt}) + messages.append({"role": "user", "content": parts}) + + response = await self.chat_completion( + messages=messages, + model=model, + max_tokens=max_tokens, + temperature=temperature, + ) + return response["choices"][0]["message"]["content"] + except Exception as e: + print(f"Error in multimodal_chat: {e}") + return ( + "I apologize, but I encountered an error while processing your request. " + f"Please try again later. (Error: {str(e)})" + ) + async def streaming_chat( self, user_message: str, diff --git a/backend/api/services/document_service.py b/backend/api/services/document_service.py index da32dbb5..571ed429 100644 --- a/backend/api/services/document_service.py +++ b/backend/api/services/document_service.py @@ -1,275 +1,42 @@ -""" -Main Document Processing Service - -This service orchestrates different document processors (Docling, Azure Document Intelligence, etc.) -and provides a unified interface for document conversion. It can automatically choose the best -processor for a given document or allow explicit processor selection. -""" +"""backend.api.services.document_service -import asyncio -from typing import Dict, Any, Optional, List +NOTE: CAN-SR previously carried a multi-processor document service (Docling + Azure). +We are **removing Docling** and keeping only Azure Document Intelligence. -from schemas.enums import ProcessorType -from .processors.docling import DoclingService -from .processors.azure_doc_intelligence.azure_doc_intelligence_service import ( - AzureDocIntelligenceService, -) +This module remains as a small compatibility wrapper for any older code paths, +but new code should prefer importing `azure_docint_client` directly. +""" +from __future__ import annotations -class DocumentService: - """Main service for document processing with multiple processor support""" +from typing import Any, Dict, Optional - def __init__(self): - self.docling_service = DoclingService() - self.azure_doc_intelligence_service = AzureDocIntelligenceService() +from .azure_docint_client import azure_docint_client - self.available_processors = self._check_processor_availability() - def _check_processor_availability(self) -> Dict[str, bool]: - """Check which processors are available""" - return { - ProcessorType.DOCLING.value: True, - ProcessorType.AZURE_DOC_INTELLIGENCE.value: self.azure_doc_intelligence_service.is_available(), - } +class DocumentService: + """Compatibility wrapper around Azure Document Intelligence only.""" async def convert_document_to_markdown( self, source: str, source_type: str = "file", - processor: ProcessorType = ProcessorType.AUTO, - **kwargs + **kwargs: Any, ) -> Dict[str, Any]: - """ - Convert document to markdown using specified or auto-selected processor - - Args: - source: File path or URL - source_type: "file" or "url" - processor: Which processor to use (auto, docling, azure_doc_intelligence) - **kwargs: Additional processor-specific arguments - - Returns: - Dict with conversion results including processor used - """ - - if processor == ProcessorType.AUTO: - processor = self._auto_select_processor(source, source_type) - - if processor == ProcessorType.AZURE_DOC_INTELLIGENCE: - if not self.available_processors[ - ProcessorType.AZURE_DOC_INTELLIGENCE.value - ]: - processor = ProcessorType.DOCLING - result = await self.docling_service.convert_document_to_markdown( - source, source_type, **kwargs - ) - result["processor_used"] = ProcessorType.DOCLING.value - result["processor_fallback"] = True - result["fallback_reason"] = "Azure Document Intelligence not available" - else: - result = await self.azure_doc_intelligence_service.convert_document_to_markdown( - source, source_type, **kwargs - ) - result["processor_used"] = ProcessorType.AZURE_DOC_INTELLIGENCE.value - - else: - result = await self.docling_service.convert_document_to_markdown( - source, source_type, **kwargs - ) - result["processor_used"] = ProcessorType.DOCLING.value - - return result - - def _auto_select_processor(self, source: str, source_type: str) -> ProcessorType: - """ - Automatically select the best processor for the document - - Logic: - - Default to Azure Document Intelligence for all documents - - For specific document types that work better with Docling, use Docling - - If Azure is not available, fall back to Docling - """ - - if not self.available_processors[ProcessorType.AZURE_DOC_INTELLIGENCE.value]: - return ProcessorType.DOCLING - - if source_type == "file": - source_lower = source.lower() - - return ProcessorType.AZURE_DOC_INTELLIGENCE - - async def get_processor_capabilities(self) -> Dict[str, Any]: - """Get information about available processors and their capabilities""" - return { - "available_processors": self.available_processors, - "processors": { - ProcessorType.AZURE_DOC_INTELLIGENCE.value: { - "name": "Azure Document Intelligence", - "description": "Primary processor with superior accuracy for all document types, especially forms, tables, and structured documents", - "strengths": [ - "Table extraction", - "Form fields", - "Key-value pairs", - "Handwriting", - "Figure/chart detection", - "General documents", - "Complex layouts", - ], - "features": [ - "Markdown output", - "Table extraction", - "Figure extraction with captions", - "Downloadable figure images", - "Bounding regions", - "Key-value pairs", - ], - "available": self.available_processors[ - ProcessorType.AZURE_DOC_INTELLIGENCE.value - ], - }, - ProcessorType.DOCLING.value: { - "name": "Docling", - "description": "Fast and reliable fallback processor for general documents when Azure is unavailable", - "strengths": [ - "Academic papers", - "Mixed content", - "Fast processing", - "Always available", - ], - "available": self.available_processors[ProcessorType.DOCLING.value], - }, - }, - "auto_selection": { - "description": "Automatically chooses the best processor based on document characteristics", - "default_processor": ProcessorType.AZURE_DOC_INTELLIGENCE.value, - "fallback_processor": ProcessorType.DOCLING.value, - }, - } - - async def get_conversion_by_id( - self, conversion_id: str - ) -> Optional[Dict[str, Any]]: - """Get conversion info by ID from any processor""" - - result = await self.docling_service.get_conversion_by_id(conversion_id) - if result: - return result - - result = await self.azure_doc_intelligence_service.get_conversion_by_id( - conversion_id - ) - if result: - return result - - return None - - async def get_markdown_content( - self, conversion_id: str, processor_used: Optional[str] = None - ) -> Optional[str]: - """ - Get markdown content by conversion ID from the specific processor that was used - - Args: - conversion_id: The conversion ID to retrieve content for - processor_used: The processor that was used (if known) - improves efficiency - """ - - # If we know which processor was used, check that one first - if processor_used: - if processor_used == ProcessorType.AZURE_DOC_INTELLIGENCE.value: - content = ( - await self.azure_doc_intelligence_service.get_markdown_content( - conversion_id - ) - ) - if content: - return content - elif processor_used == ProcessorType.DOCLING.value: - content = await self.docling_service.get_markdown_content(conversion_id) - if content: - return content - - # Fallback: Try both processors (for backward compatibility or if processor_used is unknown) - # Check Azure first since it's our default - content = await self.azure_doc_intelligence_service.get_markdown_content( - conversion_id + if not azure_docint_client or not azure_docint_client.is_available(): + return { + "success": False, + "error": "Azure Document Intelligence is not configured", + "processor_used": "azure_doc_intelligence", + } + + result = await azure_docint_client.convert_document_to_markdown( + source, source_type=source_type, **kwargs ) - if content: - return content - - content = await self.docling_service.get_markdown_content(conversion_id) - if content: - return content - - return None - - async def get_figures_for_conversion( - self, conversion_id: str - ) -> Optional[List[Dict[str, Any]]]: - """ - Get all figures metadata for a specific conversion - - This method works for conversions processed with either Docling or Azure Document Intelligence - - Args: - conversion_id: The conversion ID - - Returns: - List of figure metadata dictionaries or None if not found - """ - # Try Docling first - figures = await self.docling_service.get_figures_for_conversion(conversion_id) - if figures is not None: - return figures - - # Try Azure Document Intelligence - figures = await self.azure_doc_intelligence_service.get_figures_for_conversion( - conversion_id - ) - if figures is not None: - return figures - - return None - - async def get_raw_analysis_result( - self, conversion_id: str - ) -> Optional[Dict[str, Any]]: - """ - Get the complete raw analysis result with ALL bounding boxes - - This is available for documents processed with either Azure Document Intelligence or Docling. - The raw analysis includes all detected elements with their bounding box coordinates: - - Azure DI provides: - - Pages with words, lines, selection marks - - Paragraphs with roles and bounding regions - - Tables with cells and bounding boxes - - Figures with bounding regions and captions - - Sections and structural information - - Docling provides: - - Pages with dimensions - - Text items (paragraphs) with bounding regions and roles - - Tables with cells and bounding boxes - - Pictures/figures with bounding regions - - Document structure (body, furniture, groups) - - Args: - conversion_id: The conversion ID - - Returns: - Complete analysis result dictionary or None if not found - """ - # Try Azure Document Intelligence first - result = await self.azure_doc_intelligence_service.get_raw_analysis_result( - conversion_id - ) - if result: - return result - - # Try Docling - result = await self.docling_service.get_raw_analysis_result(conversion_id) - if result: - return result + result["processor_used"] = "azure_doc_intelligence" + return result - return None + async def get_raw_analysis_result(self, conversion_id: str) -> Optional[Dict[str, Any]]: + if not azure_docint_client: + return None + return await azure_docint_client.get_raw_analysis_result(conversion_id) diff --git a/backend/api/services/grobid_service.py b/backend/api/services/grobid_service.py index 9e2b767d..6bed76ff 100644 --- a/backend/api/services/grobid_service.py +++ b/backend/api/services/grobid_service.py @@ -39,18 +39,45 @@ def __init__(self): "GROBID_SERVICE_URL", "http://grobid-service:8000" ) - grobid_client = GrobidClient( - grobid_server=self.base_service_url, - batch_size=1000, - coordinates=["p", "s", "persName", "biblStruct", "figure", "formula", "head", "note", "title", "ref", - "affiliation"], - sleep_time=5, - timeout=240, - check_server=True - ) - self.grobid_client = grobid_client + # IMPORTANT: + # Do not check server availability at import time. This repo is often imported + # in environments where the grobid container is not running (dev/test), and + # failing hard on import breaks unrelated endpoints. + try: + grobid_client = GrobidClient( + grobid_server=self.base_service_url, + batch_size=1000, + coordinates=[ + "p", + "s", + "persName", + "biblStruct", + "figure", + "formula", + "head", + "note", + "title", + "ref", + "affiliation", + ], + sleep_time=5, + timeout=240, + check_server=False, + ) + self.grobid_client = grobid_client + except Exception as e: + logger.error( + "Failed to initialize GrobidClient (service may be down): %s", + e, + ) + self.grobid_client = None + + def is_available(self) -> bool: + return self.grobid_client is not None async def process_structure(self, input_path) -> (dict, list): + if not self.grobid_client: + raise RuntimeError("GROBID client is not available (service not configured or down)") pdf_file, status, text = self.grobid_client.process_pdf("processFulltextDocument", input_path, consolidate_header=True, @@ -119,4 +146,9 @@ async def get_pages(self, text): return pages # Global instance -grobid_service = GrobidService() +try: + grobid_service = GrobidService() +except Exception as e: # pragma: no cover + logger.error("Failed to initialize GrobidService: %s", e) + grobid_service = GrobidService.__new__(GrobidService) # type: ignore + grobid_service.grobid_client = None # type: ignore diff --git a/backend/requirements.txt b/backend/requirements.txt index 8b8daf90..39a7ab02 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -17,6 +17,8 @@ bcrypt==4.0.1 # Azure Services azure-storage-blob==12.25.1 azure-identity==1.23.0 +azure-ai-documentintelligence==1.0.2 +azure-core==1.32.0 openai==2.15.0 # Databases diff --git a/frontend/app/can-sr/extract/view/page.tsx b/frontend/app/can-sr/extract/view/page.tsx index 88fd7a69..2beb1563 100644 --- a/frontend/app/can-sr/extract/view/page.tsx +++ b/frontend/app/can-sr/extract/view/page.tsx @@ -66,6 +66,22 @@ export default function CanSrL2ScreenPage() { const [fulltextStr, setFulltextStr] = useState(null) const viewerRef = useRef(null) + // Table/Figure artifacts (for evidence chips -> click to highlight) + const [fulltextTables, setFulltextTables] = useState(null) + const [fulltextFigures, setFulltextFigures] = useState(null) + + const scrollToArtifact = (kind: 'table' | 'figure', idx: number) => { + const list = kind === 'table' ? (fulltextTables || []) : (fulltextFigures || []) + const item = list.find((x: any) => Number(x?.index) === Number(idx)) + console.log('[artifact-click]', { kind, idx, hasViewer: !!viewerRef.current, item }) + if (!item || !viewerRef.current) return + const bbox = item?.bounding_box + const first = Array.isArray(bbox) ? bbox[0] : null + console.log('[artifact-bbox]', { kind, idx, bbox, first }) + if (!first) return + viewerRef.current.scrollToCoord(first) + } + const [runningAllAI, setRunningAllAI] = useState(false) const [runAllProgress, setRunAllProgress] = useState<{ done: number; total: number } | null>(null) @@ -297,10 +313,16 @@ export default function CanSrL2ScreenPage() { setAiPanels(prev => ({ ...prev, ...nextAIPanels })) } - // extract coords/pages/fulltext for PDF overlay + // extract coords/pages/fulltext and artifacts for PDF overlay const ft = typeof (row as any).fulltext === 'string' ? (row as any).fulltext : null if (ft) setFulltextStr(ft) + const tablesAny = parseJson((row as any).fulltext_tables) ?? (row as any).fulltext_tables + if (tablesAny && Array.isArray(tablesAny)) setFulltextTables(tablesAny) + + const figsAny = parseJson((row as any).fulltext_figures) ?? (row as any).fulltext_figures + if (figsAny && Array.isArray(figsAny)) setFulltextFigures(figsAny) + const coordsAny = parseJson((row as any).fulltext_coords) ?? (row as any).fulltext_coords if (coordsAny && Array.isArray(coordsAny)) setFulltextCoords(coordsAny) @@ -339,6 +361,12 @@ export default function CanSrL2ScreenPage() { const ft = typeof (row as any).fulltext === 'string' ? (row as any).fulltext : null if (ft) setFulltextStr(ft) + const tablesAny = parseJson((row as any).fulltext_tables) ?? (row as any).fulltext_tables + if (tablesAny && Array.isArray(tablesAny)) setFulltextTables(tablesAny) + + const figsAny = parseJson((row as any).fulltext_figures) ?? (row as any).fulltext_figures + if (figsAny && Array.isArray(figsAny)) setFulltextFigures(figsAny) + const coordsAny = parseJson((row as any).fulltext_coords) ?? (row as any).fulltext_coords if (coordsAny && Array.isArray(coordsAny)) setFulltextCoords(coordsAny) @@ -658,6 +686,50 @@ export default function CanSrL2ScreenPage() { ) : null} + +{Array.isArray(aiPanels[paramName]?.evidence_tables) && aiPanels[paramName].evidence_tables.length > 0 ? ( +