diff --git a/.claude/skills/epc-to-elmhurst-rdsap-inputs/SKILL.md b/.claude/skills/epc-to-elmhurst-rdsap-inputs/SKILL.md index 65fa75267..85050e6ed 100644 --- a/.claude/skills/epc-to-elmhurst-rdsap-inputs/SKILL.md +++ b/.claude/skills/epc-to-elmhurst-rdsap-inputs/SKILL.md @@ -115,6 +115,16 @@ one-line reason. Absent ≠ zero everywhere — note which. - **Water heating** 903 = Electric immersion off-peak → Elmhurst "Water Heater" category, not "Boiler Circulator" (901 = from main system). - **Windows** are synthesised from `glazed_area` band × TFA — not real geometry. +- **Room height — give the RAW surveyed room height, NOT the engine's storey + height.** Elmhurst adds the RdSAP +0.25 m upper-storey (joist-void) allowance + itself. Our mapper already applies that +0.25 to upper floors + (`_UPPER_FLOOR_HEIGHT_ADD_M`), so `sap_floor_dimensions[*].room_height_m` for + a first floor is *already* `raw + 0.25`. Reading that value onto the sheet + makes Elmhurst add a SECOND 0.25 → storey height too tall → ~4-5 m² extra wall + + volume → **~1 SAP too low** (it under-scored 6 Barry Road 60→59 until the + first-floor height was corrected from 2.76 back to the raw 2.51). Pull heights + from the survey/raw `building_measurements`, not the transformed + `sap_floor_dimensions`; the ground/lowest floor takes the raw value either way. - **Age band — pick by construction YEAR, not the engine's band letter.** The live RdSAP-10 tool bands differently from `mapping.md`'s older table: it offers `…K 2007-2011`, **`L 2012-2022`**, **`M 2023 onwards`**. A 2020 build diff --git a/.devcontainer/backend/Dockerfile b/.devcontainer/backend/Dockerfile index f9fa2902d..e36da6855 100644 --- a/.devcontainer/backend/Dockerfile +++ b/.devcontainer/backend/Dockerfile @@ -106,6 +106,12 @@ RUN git clone https://github.com/LazyVim/starter /home/${USER}/.config/nvim \ RUN curl -fsSL https://claude.ai/install.sh | bash ENV PATH="/home/vscode/.local/bin:${PATH}" +# Install herdr (terminal workspace manager for AI coding agents). Same pattern +# as Claude Code above: the installer drops a self-contained static binary into +# ~/.local/bin, which is now on PATH. Lets you run herdr from inside the +# container. `herdr update` self-updates from herdr.dev thereafter. +RUN curl -fsSL https://herdr.dev/install.sh | sh + # Playwright chromium browser for the hyde Elmhurst automation. Run as the # vscode user so the download lands in /home/vscode/.cache/ms-playwright (the # OS deps were installed as root above). Headed chromium is required — the diff --git a/.github/workflows/_deploy_lambda.yml b/.github/workflows/_deploy_lambda.yml index 6a3d9c328..d9442a661 100644 --- a/.github/workflows/_deploy_lambda.yml +++ b/.github/workflows/_deploy_lambda.yml @@ -107,8 +107,6 @@ on: required: false TF_VAR_abri_relay_password: required: false - TF_VAR_abri_relay_default_resource: - required: false TF_VAR_test_abri_project_code_override: required: false jobs: @@ -189,7 +187,6 @@ jobs: TF_VAR_abri_relay_url: ${{ secrets.TF_VAR_abri_relay_url }} TF_VAR_abri_relay_username: ${{ secrets.TF_VAR_abri_relay_username }} TF_VAR_abri_relay_password: ${{ secrets.TF_VAR_abri_relay_password }} - TF_VAR_abri_relay_default_resource: ${{ secrets.TF_VAR_abri_relay_default_resource }} TF_VAR_test_abri_project_code_override: ${{ secrets.TF_VAR_test_abri_project_code_override }} run: | ECR_REPO_URL_VAR="" @@ -247,7 +244,6 @@ jobs: TF_VAR_abri_relay_url: ${{ secrets.TF_VAR_abri_relay_url }} TF_VAR_abri_relay_username: ${{ secrets.TF_VAR_abri_relay_username }} TF_VAR_abri_relay_password: ${{ secrets.TF_VAR_abri_relay_password }} - TF_VAR_abri_relay_default_resource: ${{ secrets.TF_VAR_abri_relay_default_resource }} run: | EXTRA_VARS="" if [[ -n "${{ inputs.ecr_repo }}" ]]; then diff --git a/.github/workflows/deploy_terraform.yml b/.github/workflows/deploy_terraform.yml index 38e452512..87bb264a3 100644 --- a/.github/workflows/deploy_terraform.yml +++ b/.github/workflows/deploy_terraform.yml @@ -740,7 +740,6 @@ jobs: TF_VAR_abri_relay_url: ${{ secrets.ABRI_RELAY_URL }} TF_VAR_abri_relay_username: ${{ secrets.ABRI_RELAY_USERNAME }} TF_VAR_abri_relay_password: ${{ secrets.ABRI_RELAY_PASSWORD }} - TF_VAR_abri_relay_default_resource: ${{ secrets.ABRI_RELAY_DEFAULT_RESOURCE }} # ============================================================ # Build Audit Generator image diff --git a/CONTEXT.md b/CONTEXT.md index 047087e97..259096bfd 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -28,8 +28,8 @@ The date an EPC was lodged with the government register; used to identify the mo _Avoid_: assessment date, submission date **EPC Band**: -A single letter A–G representing a property's current or potential energy efficiency rating. -_Avoid_: energy rating, EPC grade, EPC score +A single letter A–G representing a property's current or potential energy efficiency rating. A dwelling is in a band by its **published rating** — the continuous SAP rounded **half up** to the integer printed on the certificate (SAP 10.2 §13; Python's built-in `round` is half-to-*even* and must not be used for this). Anything holding a continuous score therefore judges band membership via `Epc.from_sap_continuous`, and any "has it reached band X?" test compares against `Epc.sap_lower_bound_continuous()` — the integer floor **less half a point** (C → 68.5), which is where the published rating enters the band. Comparing a continuous score against the raw integer floor makes a dwelling that already publishes in the band read as a fraction short (ADR-0064). +_Avoid_: energy rating, EPC grade, EPC score; comparing a continuous SAP against `sap_lower_bound()` **Schema Type**: The versioned RdSAP or SAP schema that describes the structure of an EPC's raw data (e.g. `RdSAP-Schema-21.0.1`). @@ -156,7 +156,7 @@ The SAP / EPC Band / carbon emissions / Primary Energy Intensity recorded on the _Avoid_: original performance, raw EPC values, recorded baseline **Effective Performance**: -The SAP / EPC Band / carbon emissions / Primary Energy Intensity the modelling pipeline actually scored against — equal to Lodged Performance when no Rebaselining trigger fires, replaced by **SAP10 Calculation** output (the deterministic `Sap10Calculator`, which superseded the old ML-API rebaseliner; an ML residual head over the calculator is future — ADR-0009/0013) when triggered. The half of Baseline Performance that says "what we modelled". +The SAP / EPC Band / carbon emissions / Primary Energy Intensity the modelling pipeline actually scored against — equal to Lodged Performance when no Rebaselining trigger fires, replaced by **SAP10 Calculation** output (the deterministic `Sap10Calculator`, which superseded the old ML-API rebaseliner; an ML residual head over the calculator is future — ADR-0009/0013) when triggered. The half of Baseline Performance that says "what we modelled". **Modelling does not read it**: it re-scores the Effective EPC itself (it needs a continuous score and a `SapResult` to bill from, and ADR-0011 forbids an in-memory hand-off between stages), then **asserts** its re-score agrees with this persisted figure and logs an error when it does not. The two are deliberately *not* reconciled — a divergence means the stages scored different pictures, and anchoring the Plan's SAP to this integer would leave it disagreeing with its own carbon, energy and bill figures (ADR-0066). Because a Plan's `post_*` are read against this figure, an unchecked divergence surfaces to the user as a gain nobody modelled. _Avoid_: modelled performance, rebaselined performance (only correct when rebaselining ran), scored values **Calculated SAP10 Performance**: @@ -309,7 +309,7 @@ A "selecting A requires B" edge between **Recommendations**, for couplings that _Avoid_: best-practice measure (legacy term), forced measure **Optimised Package**: -The subset of a Property's Recommendations selected by the Optimiser Service for installation. For an **Increasing EPC** goal the objective is **least-cost-to-target**: the cheapest package that reaches the goal band — so it **stops at the target and does not overshoot** into a higher band, leaving surplus budget unspent. When the target is **unreachable within budget**, it falls back to the **maximum improvement the budget buys** (best effort, below target). With **no budget** it is simply the cheapest package that reaches the target. Reaching the target is judged on the **true whole-package re-score** (ADR-0016), not on summed per-measure scores. (Other goals — Energy Savings, Reducing CO₂ — don't yet set a target and currently maximise improvement within budget; future work.) +The subset of a Property's Recommendations selected by the Optimiser Service for installation. For an **Increasing EPC** goal the objective is **least-cost-to-target**: the cheapest package that reaches the goal band — so it **stops at the target and does not overshoot** into a higher band, leaving surplus budget unspent. When the target is **unreachable within budget**, it falls back to the **maximum improvement the budget buys** (best effort, below target). With **no budget** it is simply the cheapest package that reaches the target. Reaching the target is judged on the **true whole-package re-score** (ADR-0016), not on summed per-measure scores — and on the **published** band (see **EPC Band**): the target is the goal band's floor on the continuous scale, so a dwelling whose published baseline already meets the goal is **already at target** and gets an empty, £0 package rather than a marginal top-up (ADR-0064). (Other goals — Energy Savings, Reducing CO₂ — don't yet set a target and currently maximise improvement within budget; future work.) _Avoid_: selected measures, default measures, optimal solution, recommended bundle **Measure Type**: diff --git a/applications/abri/abri_trigger_request.py b/applications/abri/abri_trigger_request.py index 92ec5b8c0..003fe47bb 100644 --- a/applications/abri/abri_trigger_request.py +++ b/applications/abri/abri_trigger_request.py @@ -9,7 +9,7 @@ visibility surface. from datetime import date from typing import Dict, List, Literal, Optional, Tuple -from pydantic import BaseModel, ConfigDict, Field, model_validator +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator AbriFlow = Literal["amend_job", "log_job", "sync_tenant_data", "abandon_job"] @@ -19,8 +19,13 @@ AbriFlow = Literal["amend_job", "log_job", "sync_tenant_data", "abandon_job"] # alone would reject valid messages; the orchestrator fails the flow if a deal # carries neither. Its outcome is optional too, only feeding the reason seam. _FIELDS_BY_FLOW: Dict[AbriFlow, Tuple[str, ...]] = { - "amend_job": ("confirmed_survey_date",), - "log_job": ("place_ref", "deal_name", "confirmed_survey_date"), + "amend_job": ("confirmed_survey_date", "third_party_surveyor_identifier"), + "log_job": ( + "place_ref", + "deal_name", + "confirmed_survey_date", + "third_party_surveyor_identifier", + ), "sync_tenant_data": ("place_ref",), "abandon_job": (), } @@ -37,6 +42,18 @@ class AbriTriggerRequest(BaseModel): confirmed_survey_time: Optional[str] = None last_submission_date: Optional[date] = None outcome: Optional[str] = None + # OpenHousing's bookable resource for the survey; required by the log and + # amend flows. Empty string is also rejected by Abri, so not allowed here + third_party_surveyor_identifier: Optional[str] = None + + @field_validator("third_party_surveyor_identifier") + @classmethod + def _blank_surveyor_identifier_is_missing( + cls, value: Optional[str] + ) -> Optional[str]: + if value is not None and not value.strip(): + return None + return value @model_validator(mode="after") def _each_fired_flow_has_its_fields(self) -> "AbriTriggerRequest": diff --git a/applications/abri/dispatch.py b/applications/abri/dispatch.py index 6187c6ea3..7d03f1120 100644 --- a/applications/abri/dispatch.py +++ b/applications/abri/dispatch.py @@ -81,13 +81,19 @@ def dispatch_abri_flows( def _run_amend(request: AbriTriggerRequest, flows: AbriFlows) -> str: - if request.confirmed_survey_date is None: - raise ValueError("amend_job fired without a confirmed_survey_date") + if ( + request.confirmed_survey_date is None + or request.third_party_surveyor_identifier is None + ): + raise ValueError( + "amend_job fired without a confirmed_survey_date/surveyor identifier" + ) outcome = flows.amend_job( AppointmentChange( deal_id=request.hubspot_deal_id, confirmed_survey_date=request.confirmed_survey_date, confirmed_survey_time=request.confirmed_survey_time, + third_party_surveyor_identifier=request.third_party_surveyor_identifier, ) ) if isinstance(outcome, AbriRequestRejected): @@ -111,8 +117,12 @@ def _run_log( request.place_ref is None or request.deal_name is None or request.confirmed_survey_date is None + or request.third_party_surveyor_identifier is None ): - raise ValueError("log_job fired without place_ref/deal_name/survey date") + raise ValueError( + "log_job fired without place_ref/deal_name/survey date/" + "surveyor identifier" + ) try: outcome = flows.log_job( ConfirmedSurveyBooking( @@ -121,6 +131,9 @@ def _run_log( deal_name=request.deal_name, confirmed_survey_date=request.confirmed_survey_date, confirmed_survey_time=request.confirmed_survey_time, + third_party_surveyor_identifier=( + request.third_party_surveyor_identifier + ), ) ) except LogJobWriteBackError as error: diff --git a/backend/app/db/models/hubspot_deal_data.py b/backend/app/db/models/hubspot_deal_data.py index 2445045e4..d2c8c8fe9 100644 --- a/backend/app/db/models/hubspot_deal_data.py +++ b/backend/app/db/models/hubspot_deal_data.py @@ -67,6 +67,7 @@ class HubspotDealData(SQLModel, table=True): lodgement_date: Optional[datetime] = Field(default=None) expected_commencement_date: Optional[datetime] = Field(default=None) surveyor: Optional[str] = Field(default=None) + third_party_surveyor_identifier: Optional[str] = Field(default=None) confirmed_survey_date: Optional[datetime] = Field(default=None) confirmed_survey_time: Optional[str] = Field(default=None) surveyed_date: Optional[datetime] = Field(default=None) diff --git a/backend/documents_parser/extractor.py b/backend/documents_parser/extractor.py index fde4530e9..c9f26e254 100644 --- a/backend/documents_parser/extractor.py +++ b/backend/documents_parser/extractor.py @@ -481,7 +481,9 @@ class PasHubRdSapSiteNotesExtractor: def extract_room_count_elements(self) -> RoomCountElements: rce_section = self._section("Room Count Elements", "Customer Response") - heated_rooms_raw = self._get_in(rce_section, "Number of heated rooms?") + heated_rooms_raw = self._get_in( + rce_section, "Please enter the number of HEATED rooms:" + ) return RoomCountElements( number_of_habitable_rooms=int( self._get_in(rce_section, "Number of habitable rooms?") or 0 @@ -518,6 +520,15 @@ class PasHubRdSapSiteNotesExtractor: number_of_fixed_cfl_bulbs=int( self._get_in(rce_section, "Number of fixed CFL bulbs:") or 0 ), + number_of_fixed_low_energy_lights=( + int(low_energy_raw) + if ( + low_energy_raw := self._get_in( + rce_section, "Number of fixed low energy lights?" + ) + ) + else None + ), waste_water_heat_recovery=self._get_in( rce_section, "Are there any waste water heat recovery systems?" ) @@ -615,7 +626,11 @@ class PasHubRdSapSiteNotesExtractor: condensing=self._bool_in(data, "Condensing"), year=self._get_in(data, "Year") or "", mount=self._get_in(data, "Mount") or "", - open_flue=self._get_in(data, "Open Flue") or "", + # PCDF-Search "Open Flue" column wins; a Manual-Entry boiler instead + # lodges the flue under "Is there an open flue?" (Yes/No) (#1649 A). + open_flue=self._get_in(data, "Open Flue") + or self._get_in(data, "Is there an open flue?") + or "", fan_assist=self._bool_in(data, "Fan Assist"), status=self._get_in(data, "Status") or "", central_heating_pump_age=self._get_in(data, "Central heating pump age:") @@ -627,6 +642,12 @@ class PasHubRdSapSiteNotesExtractor: weather_compensator=self._bool_in(data, "Is there a weather compensator?"), emitter=self._get_in(data, "Emitter:") or "", emitter_temperature=self._get_in(data, "Emitter Temperature:") or "", + # Manual-Entry boiler descriptor (blank on a PCDF-Search boiler): + # "Type of boiler:" and "Heating System (Boiler):" (the latter + # carries the pre/post-1998 age band) → the mapper's Table 4b + # efficiency lookup (#1649 A). + boiler_type=self._get_in(data, "Type of boiler:") or "", + boiler_age_band=self._get_in(data, "Heating System (Boiler):") or "", ) def _parse_secondary_heating(self, data: List[str]) -> SecondaryHeating: @@ -856,4 +877,9 @@ class PasHubRdSapSiteNotesExtractor: or "", wall_thickness_mm=self._wall_thickness_in(data), dry_lined=self._optional_bool_in(data, "Wall Dry-Lined?"), + # Surveyed alt-wall insulation thickness ("50 mm") → the mapper's + # §5.4 thickness input; dropped, the cascade assumes 100 mm (#1649 D). + insulation_thickness_mm=self._parse_insulation_thickness( + self._get_in(data, "Wall insulation thickness:") + )[0], ) diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy/507639151845.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy/507639151845.pdf index 2c6a8a218..b72df83c9 100644 Binary files a/backend/documents_parser/tests/fixtures/pashub_accuracy/507639151845.pdf and b/backend/documents_parser/tests/fixtures/pashub_accuracy/507639151845.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy/manifest.json b/backend/documents_parser/tests/fixtures/pashub_accuracy/manifest.json index 7db88f559..59b7c6c86 100644 --- a/backend/documents_parser/tests/fixtures/pashub_accuracy/manifest.json +++ b/backend/documents_parser/tests/fixtures/pashub_accuracy/manifest.json @@ -1091,8 +1091,8 @@ { "deal_id": "507639151845", "uprn": null, - "pre_sap_raw": "C80", - "pre_sap_score": 80, + "pre_sap_raw": "C76", + "pre_sap_score": 76, "pdf": "507639151845.pdf" }, { diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/460624817352.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/460624817352.pdf new file mode 100644 index 000000000..d958c7db1 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/460624817352.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/460624817354.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/460624817354.pdf new file mode 100644 index 000000000..f3bf02340 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/460624817354.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461004430523.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461004430523.pdf new file mode 100644 index 000000000..ead5ae3d6 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461004430523.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461004430524.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461004430524.pdf new file mode 100644 index 000000000..fc70b7a4c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461004430524.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461029305555.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461029305555.pdf new file mode 100644 index 000000000..5f0c46d74 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461029305555.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461029305556.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461029305556.pdf new file mode 100644 index 000000000..944e22474 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461029305556.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461029305557.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461029305557.pdf new file mode 100644 index 000000000..1a59139f5 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461029305557.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461178278096.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461178278096.pdf new file mode 100644 index 000000000..d6bc25969 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461178278096.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461217879266.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461217879266.pdf new file mode 100644 index 000000000..7f7bb0705 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461217879266.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461286915318.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461286915318.pdf new file mode 100644 index 000000000..8128f2a7b Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461286915318.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461288704205.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461288704205.pdf new file mode 100644 index 000000000..7dfa6af30 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461288704205.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461288704206.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461288704206.pdf new file mode 100644 index 000000000..cc2b3af16 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461288704206.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840844.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840844.pdf new file mode 100644 index 000000000..0493b85a5 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840844.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840845.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840845.pdf new file mode 100644 index 000000000..2187d48b0 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840845.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840846.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840846.pdf new file mode 100644 index 000000000..839539283 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840846.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840847.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840847.pdf new file mode 100644 index 000000000..1231d94f7 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461337840847.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461383047390.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461383047390.pdf new file mode 100644 index 000000000..66a5fbb4d Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461383047390.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461383047391.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461383047391.pdf new file mode 100644 index 000000000..9b8f27c5f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461383047391.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461386632387.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461386632387.pdf new file mode 100644 index 000000000..daf753491 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461386632387.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461386632388.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461386632388.pdf new file mode 100644 index 000000000..4edddd161 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461386632388.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461386632390.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461386632390.pdf new file mode 100644 index 000000000..047649f81 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461386632390.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461388438725.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461388438725.pdf new file mode 100644 index 000000000..eba1d9f04 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461388438725.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461388438726.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461388438726.pdf new file mode 100644 index 000000000..b15380cc7 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461388438726.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461462566131.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461462566131.pdf new file mode 100644 index 000000000..8c4e4a603 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461462566131.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461579561166.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461579561166.pdf new file mode 100644 index 000000000..f428fec2a Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461579561166.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461579561167.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461579561167.pdf new file mode 100644 index 000000000..cf9733a4f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461579561167.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461605300410.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461605300410.pdf new file mode 100644 index 000000000..049d4bf5e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461605300410.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461753041085.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461753041085.pdf new file mode 100644 index 000000000..c8bad9ea2 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461753041085.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461900138689.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461900138689.pdf new file mode 100644 index 000000000..4904f9074 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461900138689.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461977125103.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461977125103.pdf new file mode 100644 index 000000000..911154bc4 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461977125103.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461989738731.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461989738731.pdf new file mode 100644 index 000000000..861a8c2c9 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461989738731.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461989738732.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461989738732.pdf new file mode 100644 index 000000000..be1e38c97 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461989738732.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461989738733.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461989738733.pdf new file mode 100644 index 000000000..546c3cf99 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461989738733.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461996268736.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461996268736.pdf new file mode 100644 index 000000000..3d9b34ad3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461996268736.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461998049475.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461998049475.pdf new file mode 100644 index 000000000..ecca4545d Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/461998049475.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462019645662.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462019645662.pdf new file mode 100644 index 000000000..71541842c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462019645662.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462019682526.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462019682526.pdf new file mode 100644 index 000000000..baea90372 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462019682526.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462019682527.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462019682527.pdf new file mode 100644 index 000000000..8ed76b894 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462019682527.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462024626384.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462024626384.pdf new file mode 100644 index 000000000..f1522176b Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462024626384.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462028222693.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462028222693.pdf new file mode 100644 index 000000000..646c17885 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462028222693.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462030021826.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462030021826.pdf new file mode 100644 index 000000000..5c495b9aa Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462030021826.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462030021827.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462030021827.pdf new file mode 100644 index 000000000..72bec534f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462030021827.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462033604837.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462033604837.pdf new file mode 100644 index 000000000..b73526a93 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462033604837.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462033604838.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462033604838.pdf new file mode 100644 index 000000000..3840ba237 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462033604838.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462033604839.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462033604839.pdf new file mode 100644 index 000000000..47c7e58f0 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462033604839.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462048022734.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462048022734.pdf new file mode 100644 index 000000000..e45758e2a Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462048022734.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462051619031.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462051619031.pdf new file mode 100644 index 000000000..db49d9f19 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462051619031.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462053415135.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462053415135.pdf new file mode 100644 index 000000000..99778adef Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462053415135.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462055212240.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462055212240.pdf new file mode 100644 index 000000000..74dba319e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462055212240.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462055212241.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462055212241.pdf new file mode 100644 index 000000000..9b92af890 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462055212241.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462057039040.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462057039040.pdf new file mode 100644 index 000000000..65f40a922 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462057039040.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462057039041.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462057039041.pdf new file mode 100644 index 000000000..bc47492d8 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462057039041.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462067937493.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462067937493.pdf new file mode 100644 index 000000000..91c53bfc2 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462067937493.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462071529680.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462071529680.pdf new file mode 100644 index 000000000..e93bdc964 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462071529680.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462075146479.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462075146479.pdf new file mode 100644 index 000000000..d47c21e88 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462075146479.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462078769375.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462078769375.pdf new file mode 100644 index 000000000..b1122d767 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462078769375.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462078769376.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462078769376.pdf new file mode 100644 index 000000000..3f4e6159c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462078769376.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462080566489.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462080566489.pdf new file mode 100644 index 000000000..dc5f9c567 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462080566489.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462080566490.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462080566490.pdf new file mode 100644 index 000000000..96bd8ee62 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/462080566490.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497602074839.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497602074839.pdf new file mode 100644 index 000000000..82ac37f69 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497602074839.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497650046199.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497650046199.pdf new file mode 100644 index 000000000..239a44151 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497650046199.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497650046200.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497650046200.pdf new file mode 100644 index 000000000..a6d250d2e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497650046200.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497655371974.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497655371974.pdf new file mode 100644 index 000000000..20dfbc3f0 --- /dev/null +++ b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497655371974.pdf @@ -0,0 +1,5663 @@ +%PDF-1.4 +%µ¶ +% Written by MuPDF 1.29.0 + +1 0 obj +<> +endobj + +2 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1078 0 R/StructParents 0/Parent 17 0 R>> +endobj + +3 0 obj +<> +endobj + +4 0 obj +<> +endobj + +5 0 obj +<> +endobj + +6 0 obj +<> +endobj + +7 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1079 0 R/StructParents 1/Parent 17 0 R>> +endobj + +8 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1080 0 R/StructParents 2/Parent 17 0 R>> +endobj + +9 0 obj +<> +endobj + +10 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1081 0 R/StructParents 3/Parent 17 0 R>> +endobj + +11 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1082 0 R/StructParents 4/Parent 17 0 R>> +endobj + +12 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1083 0 R/StructParents 5/Parent 17 0 R>> +endobj + +13 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1084 0 R/StructParents 6/Parent 17 0 R>> +endobj + +14 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1085 0 R/StructParents 7/Parent 17 0 R>> +endobj + +15 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1086 0 R/StructParents 8/Parent 18 0 R>> +endobj + +16 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1087 0 R/StructParents 9/Parent 18 0 R>> +endobj + +17 0 obj +<> +endobj + +18 0 obj +<> +endobj + +19 0 obj +<> +endobj + +20 0 obj +<> +endobj + +21 0 obj +<> +endobj + +22 0 obj +<> +endobj + +23 0 obj +<><>]/ID(node00000010)>> +endobj + +24 0 obj +<> +endobj + +25 0 obj +<>]/ID(node00000014)>> +endobj + +26 0 obj +<> +endobj + +27 0 obj +<>]/ID(node00000015)>> +endobj + +28 0 obj +<> +endobj + +29 0 obj +<>]/ID(node00000018)>> +endobj + +30 0 obj +<> +endobj + +31 0 obj +<>]/ID(node00000020)>> +endobj + +32 0 obj +<> +endobj + +33 0 obj +<>]/ID(node00000023)>> +endobj + +34 0 obj +<> +endobj + +35 0 obj +<>]/ID(node00000025)>> +endobj + +36 0 obj +<> +endobj + +37 0 obj +<>]/ID(node00000028)>> +endobj + +38 0 obj +<> +endobj + +39 0 obj +<>]/ID(node00000030)>> +endobj + +40 0 obj +<> +endobj + +41 0 obj +<>]/ID(node00000033)>> +endobj + +42 0 obj +<> +endobj + +43 0 obj +<>]/ID(node00000035)>> +endobj + +44 0 obj +<> +endobj + +45 0 obj +<>]/ID(node00000038)>> +endobj + +46 0 obj +<> +endobj + +47 0 obj +<>]/ID(node00000040)>> +endobj + +48 0 obj +<>]/ID(node00000042)>> +endobj + +49 0 obj +<>]/ID(node00000044)>> +endobj + +50 0 obj +<>]/ID(node00000046)>> +endobj + +51 0 obj +<>]/ID(node00000048)>> +endobj + +52 0 obj +<> +endobj + +53 0 obj +<>]/ID(node00000054)>> +endobj + +54 0 obj +<> +endobj + +55 0 obj +<>]/ID(node00000057)>> +endobj + +56 0 obj +<> +endobj + +57 0 obj +<><>]/ID(node00000060)>> +endobj + +58 0 obj +<> +endobj + +59 0 obj +<>]/ID(node00000062)>> +endobj + +60 0 obj +<> +endobj + +61 0 obj +<><>]/ID(node00000065)>> +endobj + +62 0 obj +<> +endobj + +63 0 obj +<>]/ID(node00000067)>> +endobj + +64 0 obj +<> +endobj + +65 0 obj +<><>]/ID(node00000070)>> +endobj + +66 0 obj +<> +endobj + +67 0 obj +<><><>]/ID(node00000072)>> +endobj + +68 0 obj +<> +endobj + +69 0 obj +<>]/ID(node00000075)>> +endobj + +70 0 obj +<> +endobj + +71 0 obj +<>]/ID(node00000077)>> +endobj + +72 0 obj +<> +endobj + +73 0 obj +<>]/ID(node00000080)>> +endobj + +74 0 obj +<> +endobj + +75 0 obj +<>]/ID(node00000082)>> +endobj + +76 0 obj +<> +endobj + +77 0 obj +<>]/ID(node00000085)>> +endobj + +78 0 obj +<> +endobj + +79 0 obj +<>]/ID(node00000087)>> +endobj + +80 0 obj +<> +endobj + +81 0 obj +<>]/ID(node00000090)>> +endobj + +82 0 obj +<> +endobj + +83 0 obj +<>]/ID(node00000092)>> +endobj + +84 0 obj +<> +endobj + +85 0 obj +<>]/ID(node00000095)>> +endobj + +86 0 obj +<> +endobj + +87 0 obj +<>]/ID(node00000097)>> +endobj + +88 0 obj +<> +endobj + +89 0 obj +<>]/ID(node00000100)>> +endobj + +90 0 obj +<> +endobj + +91 0 obj +<>]/ID(node00000102)>> +endobj + +92 0 obj +<> +endobj + +93 0 obj +<>]/ID(node00000105)>> +endobj + +94 0 obj +<> +endobj + +95 0 obj +<>]/ID(node00000107)>> +endobj + +96 0 obj +<> +endobj + +97 0 obj +<>]/ID(node00000110)>> +endobj + +98 0 obj +<> +endobj + +99 0 obj +<>]/ID(node00000112)>> +endobj + +100 0 obj +<> +endobj + +101 0 obj +<>]/ID(node00000115)>> +endobj + +102 0 obj +<> +endobj + +103 0 obj +<>]/ID(node00000117)>> +endobj + +104 0 obj +<> +endobj + +105 0 obj +<>]/ID(node00000120)>> +endobj + +106 0 obj +<> +endobj + +107 0 obj +<>]/ID(node00000122)>> +endobj + +108 0 obj +<> +endobj + +109 0 obj +<>]/ID(node00000126)>> +endobj + +110 0 obj +<> +endobj + +111 0 obj +<>]/ID(node00000128)>> +endobj + +112 0 obj +<> +endobj + +113 0 obj +<>]/ID(node00000131)>> +endobj + +114 0 obj +<> +endobj + +115 0 obj +<>]/ID(node00000133)>> +endobj + +116 0 obj +<> +endobj + +117 0 obj +<>]/ID(node00000136)>> +endobj + +118 0 obj +<> +endobj + +119 0 obj +<>]/ID(node00000138)>> +endobj + +120 0 obj +<> +endobj + +121 0 obj +<>]/ID(node00000142)>> +endobj + +122 0 obj +<> +endobj + +123 0 obj +<>]/ID(node00000145)>> +endobj + +124 0 obj +<> +endobj + +125 0 obj +<>]/ID(node00000148)>> +endobj + +126 0 obj +<> +endobj + +127 0 obj +<>]/ID(node00000150)>> +endobj + +128 0 obj +<> +endobj + +129 0 obj +<>]/ID(node00000153)>> +endobj + +130 0 obj +<> +endobj + +131 0 obj +<>]/ID(node00000155)>> +endobj + +132 0 obj +<> +endobj + +133 0 obj +<>]/ID(node00000158)>> +endobj + +134 0 obj +<> +endobj + +135 0 obj +<>]/ID(node00000160)>> +endobj + +136 0 obj +<> +endobj + +137 0 obj +<>]/ID(node00000163)>> +endobj + +138 0 obj +<> +endobj + +139 0 obj +<>]/ID(node00000165)>> +endobj + +140 0 obj +<> +endobj + +141 0 obj +<>]/ID(node00000169)>> +endobj + +142 0 obj +<> +endobj + +143 0 obj +<>]/ID(node00000171)>> +endobj + +144 0 obj +<> +endobj + +145 0 obj +<>]/ID(node00000174)>> +endobj + +146 0 obj +<> +endobj + +147 0 obj +<>]/ID(node00000176)>> +endobj + +148 0 obj +<> +endobj + +149 0 obj +<>]/ID(node00000180)>> +endobj + +150 0 obj +<> +endobj + +151 0 obj +<>]/ID(node00000182)>> +endobj + +152 0 obj +<> +endobj + +153 0 obj +<>]/ID(node00000185)>> +endobj + +154 0 obj +<> +endobj + +155 0 obj +<>]/ID(node00000187)>> +endobj + +156 0 obj +<> +endobj + +157 0 obj +<>]/ID(node00000190)>> +endobj + +158 0 obj +<> +endobj + +159 0 obj +<>]/ID(node00000192)>> +endobj + +160 0 obj +<> +endobj + +161 0 obj +<>]/ID(node00000196)>> +endobj + +162 0 obj +<> +endobj + +163 0 obj +<>]/ID(node00000198)>> +endobj + +164 0 obj +<> +endobj + +165 0 obj +<>]/ID(node00000201)>> +endobj + +166 0 obj +<> +endobj + +167 0 obj +<>]/ID(node00000203)>> +endobj + +168 0 obj +<> +endobj + +169 0 obj +<>]/ID(node00000206)>> +endobj + +170 0 obj +<> +endobj + +171 0 obj +<>]/ID(node00000208)>> +endobj + +172 0 obj +<> +endobj + +173 0 obj +<>]/ID(node00000211)>> +endobj + +174 0 obj +<> +endobj + +175 0 obj +<>]/ID(node00000213)>> +endobj + +176 0 obj +<> +endobj + +177 0 obj +<>]/ID(node00000216)>> +endobj + +178 0 obj +<> +endobj + +179 0 obj +<>]/ID(node00000219)>> +endobj + +180 0 obj +<> +endobj + +181 0 obj +<>]/ID(node00000221)>> +endobj + +182 0 obj +<> +endobj + +183 0 obj +<>]/ID(node00000224)>> +endobj + +184 0 obj +<> +endobj + +185 0 obj +<>]/ID(node00000226)>> +endobj + +186 0 obj +<> +endobj + +187 0 obj +<>]/ID(node00000229)>> +endobj + +188 0 obj +<> +endobj + +189 0 obj +<>]/ID(node00000231)>> +endobj + +190 0 obj +<> +endobj + +191 0 obj +<>]/ID(node00000234)>> +endobj + +192 0 obj +<> +endobj + +193 0 obj +<>]/ID(node00000236)>> +endobj + +194 0 obj +<> +endobj + +195 0 obj +<>]/ID(node00000240)>> +endobj + +196 0 obj +<> +endobj + +197 0 obj +<>]/ID(node00000242)>> +endobj + +198 0 obj +<> +endobj + +199 0 obj +<>]/ID(node00000245)>> +endobj + +200 0 obj +<> +endobj + +201 0 obj +<>]/ID(node00000247)>> +endobj + +202 0 obj +<> +endobj + +203 0 obj +<>]/ID(node00000251)>> +endobj + +204 0 obj +<> +endobj + +205 0 obj +<>]/ID(node00000253)>> +endobj + +206 0 obj +<> +endobj + +207 0 obj +<>]/ID(node00000256)>> +endobj + +208 0 obj +<> +endobj + +209 0 obj +<>]/ID(node00000258)>> +endobj + +210 0 obj +<> +endobj + +211 0 obj +<>]/ID(node00000261)>> +endobj + +212 0 obj +<> +endobj + +213 0 obj +<>]/ID(node00000263)>> +endobj + +214 0 obj +<> +endobj + +215 0 obj +<>]/ID(node00000267)>> +endobj + +216 0 obj +<> +endobj + +217 0 obj +<>]/ID(node00000269)>> +endobj + +218 0 obj +<> +endobj + +219 0 obj +<>]/ID(node00000272)>> +endobj + +220 0 obj +<> +endobj + +221 0 obj +<>]/ID(node00000274)>> +endobj + +222 0 obj +<> +endobj + +223 0 obj +<>]/ID(node00000277)>> +endobj + +224 0 obj +<> +endobj + +225 0 obj +<>]/ID(node00000279)>> +endobj + +226 0 obj +<> +endobj + +227 0 obj +<>]/ID(node00000282)>> +endobj + +228 0 obj +<> +endobj + +229 0 obj +<>]/ID(node00000284)>> +endobj + +230 0 obj +<> +endobj + +231 0 obj +<>]/ID(node00000288)>> +endobj + +232 0 obj +<> +endobj + +233 0 obj +<> +endobj + +234 0 obj +<> +endobj + +235 0 obj +<><><>]/ID(node00000293)>> +endobj + +236 0 obj +<>]/ID(node00000294)>> +endobj + +237 0 obj +<><><>]/ID(node00000295)>> +endobj + +238 0 obj +<>]/ID(node00000296)>> +endobj + +239 0 obj +<><><>]/ID(node00000297)>> +endobj + +240 0 obj +<>]/ID(node00000298)>> +endobj + +241 0 obj +<><><>]/ID(node00000299)>> +endobj + +242 0 obj +<>]/ID(node00000300)>> +endobj + +243 0 obj +<> +endobj + +244 0 obj +<><><>]/ID(node00000303)>> +endobj + +245 0 obj +<>]/ID(node00000304)>> +endobj + +246 0 obj +<> +endobj + +247 0 obj +<><><>]/ID(node00000306)>> +endobj + +248 0 obj +<>]/ID(node00000307)>> +endobj + +249 0 obj +<><><>]/ID(node00000308)>> +endobj + +250 0 obj +<>]/ID(node00000309)>> +endobj + +251 0 obj +<><><>]/ID(node00000310)>> +endobj + +252 0 obj +<>]/ID(node00000311)>> +endobj + +253 0 obj +<><><>]/ID(node00000312)>> +endobj + +254 0 obj +<>]/ID(node00000313)>> +endobj + +255 0 obj +<><><>]/ID(node00000314)>> +endobj + +256 0 obj +<>]/ID(node00000315)>> +endobj + +257 0 obj +<> +endobj + +258 0 obj +<><><>]/ID(node00000317)>> +endobj + +259 0 obj +<>]/ID(node00000318)>> +endobj + +260 0 obj +<><><>]/ID(node00000319)>> +endobj + +261 0 obj +<>]/ID(node00000320)>> +endobj + +262 0 obj +<><><>]/ID(node00000321)>> +endobj + +263 0 obj +<>]/ID(node00000322)>> +endobj + +264 0 obj +<><><>]/ID(node00000323)>> +endobj + +265 0 obj +<>]/ID(node00000324)>> +endobj + +266 0 obj +<><><>]/ID(node00000325)>> +endobj + +267 0 obj +<>]/ID(node00000326)>> +endobj + +268 0 obj +<> +endobj + +269 0 obj +<><><>]/ID(node00000328)>> +endobj + +270 0 obj +<>]/ID(node00000329)>> +endobj + +271 0 obj +<> +endobj + +272 0 obj +<><><>]/ID(node00000331)>> +endobj + +273 0 obj +<>]/ID(node00000332)>> +endobj + +274 0 obj +<><><>]/ID(node00000333)>> +endobj + +275 0 obj +<>]/ID(node00000334)>> +endobj + +276 0 obj +<><><>]/ID(node00000335)>> +endobj + +277 0 obj +<>]/ID(node00000336)>> +endobj + +278 0 obj +<><><>]/ID(node00000337)>> +endobj + +279 0 obj +<>]/ID(node00000338)>> +endobj + +280 0 obj +<><><>]/ID(node00000339)>> +endobj + +281 0 obj +<>]/ID(node00000340)>> +endobj + +282 0 obj +<> +endobj + +283 0 obj +<>]/ID(node00000344)>> +endobj + +284 0 obj +<> +endobj + +285 0 obj +<>]/ID(node00000347)>> +endobj + +286 0 obj +<> +endobj + +287 0 obj +<>]/ID(node00000350)>> +endobj + +288 0 obj +<> +endobj + +289 0 obj +<>]/ID(node00000352)>> +endobj + +290 0 obj +<> +endobj + +291 0 obj +<>]/ID(node00000355)>> +endobj + +292 0 obj +<> +endobj + +293 0 obj +<>]/ID(node00000357)>> +endobj + +294 0 obj +<> +endobj + +295 0 obj +<>]/ID(node00000360)>> +endobj + +296 0 obj +<> +endobj + +297 0 obj +<>]/ID(node00000362)>> +endobj + +298 0 obj +<> +endobj + +299 0 obj +<>]/ID(node00000365)>> +endobj + +300 0 obj +<> +endobj + +301 0 obj +<>]/ID(node00000367)>> +endobj + +302 0 obj +<> +endobj + +303 0 obj +<><>]/ID(node00000371)>> +endobj + +304 0 obj +<> +endobj + +305 0 obj +<>]/ID(node00000373)>> +endobj + +306 0 obj +<> +endobj + +307 0 obj +<>]/ID(node00000377)>> +endobj + +308 0 obj +<> +endobj + +309 0 obj +<>]/ID(node00000379)>> +endobj + +310 0 obj +<> +endobj + +311 0 obj +<>]/ID(node00000382)>> +endobj + +312 0 obj +<> +endobj + +313 0 obj +<>]/ID(node00000385)>> +endobj + +314 0 obj +<> +endobj + +315 0 obj +<>]/ID(node00000387)>> +endobj + +316 0 obj +<> +endobj + +317 0 obj +<>]/ID(node00000390)>> +endobj + +318 0 obj +<> +endobj + +319 0 obj +<>]/ID(node00000392)>> +endobj + +320 0 obj +<> +endobj + +321 0 obj +<>]/ID(node00000395)>> +endobj + +322 0 obj +<> +endobj + +323 0 obj +<>]/ID(node00000397)>> +endobj + +324 0 obj +<> +endobj + +325 0 obj +<><>]/ID(node00000401)>> +endobj + +326 0 obj +<> +endobj + +327 0 obj +<>]/ID(node00000403)>> +endobj + +328 0 obj +<> +endobj + +329 0 obj +<>]/ID(node00000407)>> +endobj + +330 0 obj +<> +endobj + +331 0 obj +<>]/ID(node00000409)>> +endobj + +332 0 obj +<> +endobj + +333 0 obj +<>]/ID(node00000413)>> +endobj + +334 0 obj +<> +endobj + +335 0 obj +<>]/ID(node00000416)>> +endobj + +336 0 obj +<> +endobj + +337 0 obj +<>]/ID(node00000419)>> +endobj + +338 0 obj +<> +endobj + +339 0 obj +<>]/ID(node00000421)>> +endobj + +340 0 obj +<> +endobj + +341 0 obj +<>]/ID(node00000424)>> +endobj + +342 0 obj +<> +endobj + +343 0 obj +<>]/ID(node00000426)>> +endobj + +344 0 obj +<> +endobj + +345 0 obj +<>]/ID(node00000429)>> +endobj + +346 0 obj +<> +endobj + +347 0 obj +<>]/ID(node00000431)>> +endobj + +348 0 obj +<> +endobj + +349 0 obj +<>]/ID(node00000434)>> +endobj + +350 0 obj +<> +endobj + +351 0 obj +<>]/ID(node00000436)>> +endobj + +352 0 obj +<> +endobj + +353 0 obj +<>]/ID(node00000439)>> +endobj + +354 0 obj +<> +endobj + +355 0 obj +<>]/ID(node00000441)>> +endobj + +356 0 obj +<> +endobj + +357 0 obj +<>]/ID(node00000444)>> +endobj + +358 0 obj +<> +endobj + +359 0 obj +<>]/ID(node00000446)>> +endobj + +360 0 obj +<> +endobj + +361 0 obj +<>]/ID(node00000449)>> +endobj + +362 0 obj +<> +endobj + +363 0 obj +<>]/ID(node00000451)>> +endobj + +364 0 obj +<> +endobj + +365 0 obj +<>]/ID(node00000454)>> +endobj + +366 0 obj +<> +endobj + +367 0 obj +<>]/ID(node00000456)>> +endobj + +368 0 obj +<> +endobj + +369 0 obj +<>]/ID(node00000459)>> +endobj + +370 0 obj +<> +endobj + +371 0 obj +<>]/ID(node00000461)>> +endobj + +372 0 obj +<> +endobj + +373 0 obj +<>]/ID(node00000464)>> +endobj + +374 0 obj +<> +endobj + +375 0 obj +<>]/ID(node00000466)>> +endobj + +376 0 obj +<> +endobj + +377 0 obj +<>]/ID(node00000469)>> +endobj + +378 0 obj +<> +endobj + +379 0 obj +<>]/ID(node00000471)>> +endobj + +380 0 obj +<> +endobj + +381 0 obj +<>]/ID(node00000475)>> +endobj + +382 0 obj +<> +endobj + +383 0 obj +<>]/ID(node00000478)>> +endobj + +384 0 obj +<> +endobj + +385 0 obj +<>]/ID(node00000480)>> +endobj + +386 0 obj +<> +endobj + +387 0 obj +<>]/ID(node00000483)>> +endobj + +388 0 obj +<> +endobj + +389 0 obj +<>]/ID(node00000485)>> +endobj + +390 0 obj +<> +endobj + +391 0 obj +<>]/ID(node00000488)>> +endobj + +392 0 obj +<> +endobj + +393 0 obj +<>]/ID(node00000490)>> +endobj + +394 0 obj +<> +endobj + +395 0 obj +<>]/ID(node00000493)>> +endobj + +396 0 obj +<> +endobj + +397 0 obj +<>]/ID(node00000495)>> +endobj + +398 0 obj +<> +endobj + +399 0 obj +<>]/ID(node00000498)>> +endobj + +400 0 obj +<> +endobj + +401 0 obj +<>]/ID(node00000500)>> +endobj + +402 0 obj +<> +endobj + +403 0 obj +<>]/ID(node00000503)>> +endobj + +404 0 obj +<> +endobj + +405 0 obj +<>]/ID(node00000505)>> +endobj + +406 0 obj +<> +endobj + +407 0 obj +<>]/ID(node00000508)>> +endobj + +408 0 obj +<> +endobj + +409 0 obj +<>]/ID(node00000510)>> +endobj + +410 0 obj +<> +endobj + +411 0 obj +<>]/ID(node00000513)>> +endobj + +412 0 obj +<> +endobj + +413 0 obj +<>]/ID(node00000515)>> +endobj + +414 0 obj +<> +endobj + +415 0 obj +<>]/ID(node00000518)>> +endobj + +416 0 obj +<> +endobj + +417 0 obj +<>]/ID(node00000520)>> +endobj + +418 0 obj +<> +endobj + +419 0 obj +<>]/ID(node00000523)>> +endobj + +420 0 obj +<> +endobj + +421 0 obj +<>]/ID(node00000525)>> +endobj + +422 0 obj +<> +endobj + +423 0 obj +<>]/ID(node00000528)>> +endobj + +424 0 obj +<> +endobj + +425 0 obj +<>]/ID(node00000530)>> +endobj + +426 0 obj +<> +endobj + +427 0 obj +<>]/ID(node00000534)>> +endobj + +428 0 obj +<> +endobj + +429 0 obj +<>]/ID(node00000537)>> +endobj + +430 0 obj +<> +endobj + +431 0 obj +<>]/ID(node00000539)>> +endobj + +432 0 obj +<> +endobj + +433 0 obj +<>]/ID(node00000542)>> +endobj + +434 0 obj +<> +endobj + +435 0 obj +<>]/ID(node00000544)>> +endobj + +436 0 obj +<> +endobj + +437 0 obj +<>]/ID(node00000547)>> +endobj + +438 0 obj +<> +endobj + +439 0 obj +<>]/ID(node00000549)>> +endobj + +440 0 obj +<> +endobj + +441 0 obj +<>]/ID(node00000552)>> +endobj + +442 0 obj +<> +endobj + +443 0 obj +<>]/ID(node00000554)>> +endobj + +444 0 obj +<> +endobj + +445 0 obj +<>]/ID(node00000557)>> +endobj + +446 0 obj +<> +endobj + +447 0 obj +<>]/ID(node00000559)>> +endobj + +448 0 obj +<> +endobj + +449 0 obj +<>]/ID(node00000562)>> +endobj + +450 0 obj +<> +endobj + +451 0 obj +<>]/ID(node00000564)>> +endobj + +452 0 obj +<> +endobj + +453 0 obj +<>]/ID(node00000567)>> +endobj + +454 0 obj +<> +endobj + +455 0 obj +<>]/ID(node00000569)>> +endobj + +456 0 obj +<> +endobj + +457 0 obj +<>]/ID(node00000572)>> +endobj + +458 0 obj +<> +endobj + +459 0 obj +<>]/ID(node00000574)>> +endobj + +460 0 obj +<> +endobj + +461 0 obj +<>]/ID(node00000577)>> +endobj + +462 0 obj +<> +endobj + +463 0 obj +<>]/ID(node00000579)>> +endobj + +464 0 obj +<> +endobj + +465 0 obj +<>]/ID(node00000582)>> +endobj + +466 0 obj +<> +endobj + +467 0 obj +<>]/ID(node00000584)>> +endobj + +468 0 obj +<> +endobj + +469 0 obj +<>]/ID(node00000587)>> +endobj + +470 0 obj +<> +endobj + +471 0 obj +<>]/ID(node00000589)>> +endobj + +472 0 obj +<> +endobj + +473 0 obj +<>]/ID(node00000593)>> +endobj + +474 0 obj +<> +endobj + +475 0 obj +<>]/ID(node00000596)>> +endobj + +476 0 obj +<> +endobj + +477 0 obj +<>]/ID(node00000598)>> +endobj + +478 0 obj +<> +endobj + +479 0 obj +<>]/ID(node00000601)>> +endobj + +480 0 obj +<> +endobj + +481 0 obj +<>]/ID(node00000603)>> +endobj + +482 0 obj +<> +endobj + +483 0 obj +<>]/ID(node00000606)>> +endobj + +484 0 obj +<> +endobj + +485 0 obj +<>]/ID(node00000608)>> +endobj + +486 0 obj +<> +endobj + +487 0 obj +<>]/ID(node00000611)>> +endobj + +488 0 obj +<> +endobj + +489 0 obj +<>]/ID(node00000613)>> +endobj + +490 0 obj +<> +endobj + +491 0 obj +<>]/ID(node00000616)>> +endobj + +492 0 obj +<> +endobj + +493 0 obj +<>]/ID(node00000618)>> +endobj + +494 0 obj +<> +endobj + +495 0 obj +<>]/ID(node00000621)>> +endobj + +496 0 obj +<> +endobj + +497 0 obj +<>]/ID(node00000623)>> +endobj + +498 0 obj +<> +endobj + +499 0 obj +<>]/ID(node00000626)>> +endobj + +500 0 obj +<> +endobj + +501 0 obj +<>]/ID(node00000628)>> +endobj + +502 0 obj +<> +endobj + +503 0 obj +<>]/ID(node00000631)>> +endobj + +504 0 obj +<> +endobj + +505 0 obj +<>]/ID(node00000633)>> +endobj + +506 0 obj +<> +endobj + +507 0 obj +<>]/ID(node00000636)>> +endobj + +508 0 obj +<> +endobj + +509 0 obj +<>]/ID(node00000638)>> +endobj + +510 0 obj +<> +endobj + +511 0 obj +<>]/ID(node00000641)>> +endobj + +512 0 obj +<> +endobj + +513 0 obj +<>]/ID(node00000643)>> +endobj + +514 0 obj +<> +endobj + +515 0 obj +<>]/ID(node00000646)>> +endobj + +516 0 obj +<> +endobj + +517 0 obj +<>]/ID(node00000648)>> +endobj + +518 0 obj +<> +endobj + +519 0 obj +<>]/ID(node00000652)>> +endobj + +520 0 obj +<> +endobj + +521 0 obj +<>]/ID(node00000655)>> +endobj + +522 0 obj +<> +endobj + +523 0 obj +<>]/ID(node00000657)>> +endobj + +524 0 obj +<> +endobj + +525 0 obj +<>]/ID(node00000660)>> +endobj + +526 0 obj +<> +endobj + +527 0 obj +<>]/ID(node00000662)>> +endobj + +528 0 obj +<> +endobj + +529 0 obj +<>]/ID(node00000665)>> +endobj + +530 0 obj +<> +endobj + +531 0 obj +<>]/ID(node00000667)>> +endobj + +532 0 obj +<> +endobj + +533 0 obj +<>]/ID(node00000670)>> +endobj + +534 0 obj +<> +endobj + +535 0 obj +<>]/ID(node00000672)>> +endobj + +536 0 obj +<> +endobj + +537 0 obj +<>]/ID(node00000675)>> +endobj + +538 0 obj +<> +endobj + +539 0 obj +<>]/ID(node00000677)>> +endobj + +540 0 obj +<> +endobj + +541 0 obj +<>]/ID(node00000680)>> +endobj + +542 0 obj +<> +endobj + +543 0 obj +<>]/ID(node00000682)>> +endobj + +544 0 obj +<> +endobj + +545 0 obj +<>]/ID(node00000685)>> +endobj + +546 0 obj +<> +endobj + +547 0 obj +<>]/ID(node00000687)>> +endobj + +548 0 obj +<> +endobj + +549 0 obj +<>]/ID(node00000690)>> +endobj + +550 0 obj +<> +endobj + +551 0 obj +<>]/ID(node00000692)>> +endobj + +552 0 obj +<> +endobj + +553 0 obj +<>]/ID(node00000695)>> +endobj + +554 0 obj +<> +endobj + +555 0 obj +<>]/ID(node00000697)>> +endobj + +556 0 obj +<> +endobj + +557 0 obj +<>]/ID(node00000700)>> +endobj + +558 0 obj +<> +endobj + +559 0 obj +<>]/ID(node00000702)>> +endobj + +560 0 obj +<> +endobj + +561 0 obj +<>]/ID(node00000705)>> +endobj + +562 0 obj +<> +endobj + +563 0 obj +<>]/ID(node00000707)>> +endobj + +564 0 obj +<> +endobj + +565 0 obj +<>]/ID(node00000711)>> +endobj + +566 0 obj +<> +endobj + +567 0 obj +<>]/ID(node00000714)>> +endobj + +568 0 obj +<> +endobj + +569 0 obj +<>]/ID(node00000716)>> +endobj + +570 0 obj +<> +endobj + +571 0 obj +<>]/ID(node00000719)>> +endobj + +572 0 obj +<> +endobj + +573 0 obj +<>]/ID(node00000721)>> +endobj + +574 0 obj +<> +endobj + +575 0 obj +<>]/ID(node00000724)>> +endobj + +576 0 obj +<> +endobj + +577 0 obj +<>]/ID(node00000726)>> +endobj + +578 0 obj +<> +endobj + +579 0 obj +<>]/ID(node00000729)>> +endobj + +580 0 obj +<> +endobj + +581 0 obj +<>]/ID(node00000731)>> +endobj + +582 0 obj +<> +endobj + +583 0 obj +<>]/ID(node00000734)>> +endobj + +584 0 obj +<> +endobj + +585 0 obj +<>]/ID(node00000736)>> +endobj + +586 0 obj +<> +endobj + +587 0 obj +<>]/ID(node00000739)>> +endobj + +588 0 obj +<> +endobj + +589 0 obj +<>]/ID(node00000741)>> +endobj + +590 0 obj +<> +endobj + +591 0 obj +<>]/ID(node00000744)>> +endobj + +592 0 obj +<> +endobj + +593 0 obj +<>]/ID(node00000746)>> +endobj + +594 0 obj +<> +endobj + +595 0 obj +<>]/ID(node00000749)>> +endobj + +596 0 obj +<> +endobj + +597 0 obj +<>]/ID(node00000751)>> +endobj + +598 0 obj +<> +endobj + +599 0 obj +<>]/ID(node00000754)>> +endobj + +600 0 obj +<> +endobj + +601 0 obj +<>]/ID(node00000756)>> +endobj + +602 0 obj +<> +endobj + +603 0 obj +<>]/ID(node00000759)>> +endobj + +604 0 obj +<> +endobj + +605 0 obj +<>]/ID(node00000761)>> +endobj + +606 0 obj +<> +endobj + +607 0 obj +<>]/ID(node00000764)>> +endobj + +608 0 obj +<> +endobj + +609 0 obj +<>]/ID(node00000766)>> +endobj + +610 0 obj +<> +endobj + +611 0 obj +<>]/ID(node00000770)>> +endobj + +612 0 obj +<> +endobj + +613 0 obj +<>]/ID(node00000773)>> +endobj + +614 0 obj +<> +endobj + +615 0 obj +<>]/ID(node00000775)>> +endobj + +616 0 obj +<> +endobj + +617 0 obj +<>]/ID(node00000778)>> +endobj + +618 0 obj +<> +endobj + +619 0 obj +<>]/ID(node00000780)>> +endobj + +620 0 obj +<> +endobj + +621 0 obj +<>]/ID(node00000783)>> +endobj + +622 0 obj +<> +endobj + +623 0 obj +<>]/ID(node00000785)>> +endobj + +624 0 obj +<> +endobj + +625 0 obj +<>]/ID(node00000788)>> +endobj + +626 0 obj +<> +endobj + +627 0 obj +<>]/ID(node00000790)>> +endobj + +628 0 obj +<> +endobj + +629 0 obj +<>]/ID(node00000793)>> +endobj + +630 0 obj +<> +endobj + +631 0 obj +<>]/ID(node00000795)>> +endobj + +632 0 obj +<> +endobj + +633 0 obj +<>]/ID(node00000798)>> +endobj + +634 0 obj +<> +endobj + +635 0 obj +<>]/ID(node00000800)>> +endobj + +636 0 obj +<> +endobj + +637 0 obj +<>]/ID(node00000803)>> +endobj + +638 0 obj +<> +endobj + +639 0 obj +<>]/ID(node00000805)>> +endobj + +640 0 obj +<> +endobj + +641 0 obj +<>]/ID(node00000808)>> +endobj + +642 0 obj +<> +endobj + +643 0 obj +<>]/ID(node00000810)>> +endobj + +644 0 obj +<> +endobj + +645 0 obj +<>]/ID(node00000813)>> +endobj + +646 0 obj +<> +endobj + +647 0 obj +<>]/ID(node00000815)>> +endobj + +648 0 obj +<> +endobj + +649 0 obj +<>]/ID(node00000818)>> +endobj + +650 0 obj +<> +endobj + +651 0 obj +<>]/ID(node00000820)>> +endobj + +652 0 obj +<> +endobj + +653 0 obj +<>]/ID(node00000823)>> +endobj + +654 0 obj +<> +endobj + +655 0 obj +<>]/ID(node00000825)>> +endobj + +656 0 obj +<> +endobj + +657 0 obj +<>]/ID(node00000829)>> +endobj + +658 0 obj +<> +endobj + +659 0 obj +<>]/ID(node00000832)>> +endobj + +660 0 obj +<> +endobj + +661 0 obj +<>]/ID(node00000834)>> +endobj + +662 0 obj +<> +endobj + +663 0 obj +<>]/ID(node00000837)>> +endobj + +664 0 obj +<> +endobj + +665 0 obj +<>]/ID(node00000839)>> +endobj + +666 0 obj +<> +endobj + +667 0 obj +<>]/ID(node00000842)>> +endobj + +668 0 obj +<> +endobj + +669 0 obj +<>]/ID(node00000844)>> +endobj + +670 0 obj +<> +endobj + +671 0 obj +<>]/ID(node00000847)>> +endobj + +672 0 obj +<> +endobj + +673 0 obj +<>]/ID(node00000849)>> +endobj + +674 0 obj +<> +endobj + +675 0 obj +<>]/ID(node00000852)>> +endobj + +676 0 obj +<> +endobj + +677 0 obj +<>]/ID(node00000854)>> +endobj + +678 0 obj +<> +endobj + +679 0 obj +<>]/ID(node00000857)>> +endobj + +680 0 obj +<> +endobj + +681 0 obj +<>]/ID(node00000859)>> +endobj + +682 0 obj +<> +endobj + +683 0 obj +<>]/ID(node00000862)>> +endobj + +684 0 obj +<> +endobj + +685 0 obj +<>]/ID(node00000864)>> +endobj + +686 0 obj +<> +endobj + +687 0 obj +<>]/ID(node00000867)>> +endobj + +688 0 obj +<> +endobj + +689 0 obj +<>]/ID(node00000869)>> +endobj + +690 0 obj +<> +endobj + +691 0 obj +<>]/ID(node00000872)>> +endobj + +692 0 obj +<> +endobj + +693 0 obj +<>]/ID(node00000874)>> +endobj + +694 0 obj +<> +endobj + +695 0 obj +<>]/ID(node00000877)>> +endobj + +696 0 obj +<> +endobj + +697 0 obj +<>]/ID(node00000879)>> +endobj + +698 0 obj +<> +endobj + +699 0 obj +<>]/ID(node00000882)>> +endobj + +700 0 obj +<> +endobj + +701 0 obj +<>]/ID(node00000884)>> +endobj + +702 0 obj +<> +endobj + +703 0 obj +<>]/ID(node00000888)>> +endobj + +704 0 obj +<> +endobj + +705 0 obj +<>]/ID(node00000891)>> +endobj + +706 0 obj +<> +endobj + +707 0 obj +<>]/ID(node00000893)>> +endobj + +708 0 obj +<> +endobj + +709 0 obj +<>]/ID(node00000896)>> +endobj + +710 0 obj +<> +endobj + +711 0 obj +<>]/ID(node00000898)>> +endobj + +712 0 obj +<> +endobj + +713 0 obj +<>]/ID(node00000901)>> +endobj + +714 0 obj +<> +endobj + +715 0 obj +<>]/ID(node00000903)>> +endobj + +716 0 obj +<> +endobj + +717 0 obj +<>]/ID(node00000906)>> +endobj + +718 0 obj +<> +endobj + +719 0 obj +<>]/ID(node00000908)>> +endobj + +720 0 obj +<> +endobj + +721 0 obj +<>]/ID(node00000911)>> +endobj + +722 0 obj +<> +endobj + +723 0 obj +<>]/ID(node00000913)>> +endobj + +724 0 obj +<> +endobj + +725 0 obj +<>]/ID(node00000916)>> +endobj + +726 0 obj +<> +endobj + +727 0 obj +<>]/ID(node00000918)>> +endobj + +728 0 obj +<> +endobj + +729 0 obj +<>]/ID(node00000921)>> +endobj + +730 0 obj +<> +endobj + +731 0 obj +<>]/ID(node00000923)>> +endobj + +732 0 obj +<> +endobj + +733 0 obj +<>]/ID(node00000926)>> +endobj + +734 0 obj +<> +endobj + +735 0 obj +<>]/ID(node00000928)>> +endobj + +736 0 obj +<> +endobj + +737 0 obj +<>]/ID(node00000931)>> +endobj + +738 0 obj +<> +endobj + +739 0 obj +<>]/ID(node00000933)>> +endobj + +740 0 obj +<> +endobj + +741 0 obj +<>]/ID(node00000936)>> +endobj + +742 0 obj +<> +endobj + +743 0 obj +<>]/ID(node00000938)>> +endobj + +744 0 obj +<> +endobj + +745 0 obj +<>]/ID(node00000941)>> +endobj + +746 0 obj +<> +endobj + +747 0 obj +<>]/ID(node00000943)>> +endobj + +748 0 obj +<> +endobj + +749 0 obj +<>]/ID(node00000947)>> +endobj + +750 0 obj +<> +endobj + +751 0 obj +<>]/ID(node00000950)>> +endobj + +752 0 obj +<> +endobj + +753 0 obj +<>]/ID(node00000952)>> +endobj + +754 0 obj +<> +endobj + +755 0 obj +<>]/ID(node00000955)>> +endobj + +756 0 obj +<> +endobj + +757 0 obj +<>]/ID(node00000957)>> +endobj + +758 0 obj +<> +endobj + +759 0 obj +<>]/ID(node00000960)>> +endobj + +760 0 obj +<> +endobj + +761 0 obj +<>]/ID(node00000962)>> +endobj + +762 0 obj +<> +endobj + +763 0 obj +<>]/ID(node00000965)>> +endobj + +764 0 obj +<> +endobj + +765 0 obj +<>]/ID(node00000967)>> +endobj + +766 0 obj +<> +endobj + +767 0 obj +<>]/ID(node00000970)>> +endobj + +768 0 obj +<> +endobj + +769 0 obj +<>]/ID(node00000972)>> +endobj + +770 0 obj +<> +endobj + +771 0 obj +<>]/ID(node00000975)>> +endobj + +772 0 obj +<> +endobj + +773 0 obj +<>]/ID(node00000977)>> +endobj + +774 0 obj +<> +endobj + +775 0 obj +<>]/ID(node00000980)>> +endobj + +776 0 obj +<> +endobj + +777 0 obj +<>]/ID(node00000982)>> +endobj + +778 0 obj +<> +endobj + +779 0 obj +<>]/ID(node00000985)>> +endobj + +780 0 obj +<> +endobj + +781 0 obj +<>]/ID(node00000987)>> +endobj + +782 0 obj +<> +endobj + +783 0 obj +<>]/ID(node00000990)>> +endobj + +784 0 obj +<> +endobj + +785 0 obj +<>]/ID(node00000992)>> +endobj + +786 0 obj +<> +endobj + +787 0 obj +<>]/ID(node00000995)>> +endobj + +788 0 obj +<> +endobj + +789 0 obj +<>]/ID(node00000997)>> +endobj + +790 0 obj +<> +endobj + +791 0 obj +<>]/ID(node00001000)>> +endobj + +792 0 obj +<> +endobj + +793 0 obj +<>]/ID(node00001002)>> +endobj + +794 0 obj +<> +endobj + +795 0 obj +<>]/ID(node00001007)>> +endobj + +796 0 obj +<> +endobj + +797 0 obj +<>]/ID(node00001011)>> +endobj + +798 0 obj +<> +endobj + +799 0 obj +<>]/ID(node00001014)>> +endobj + +800 0 obj +<> +endobj + +801 0 obj +<><>]/ID(node00001017)>> +endobj + +802 0 obj +<> +endobj + +803 0 obj +<>]/ID(node00001019)>> +endobj + +804 0 obj +<> +endobj + +805 0 obj +<>]/ID(node00001022)>> +endobj + +806 0 obj +<> +endobj + +807 0 obj +<>]/ID(node00001024)>> +endobj + +808 0 obj +<> +endobj + +809 0 obj +<>]/ID(node00001027)>> +endobj + +810 0 obj +<> +endobj + +811 0 obj +<>]/ID(node00001029)>> +endobj + +812 0 obj +<> +endobj + +813 0 obj +<>]/ID(node00001032)>> +endobj + +814 0 obj +<> +endobj + +815 0 obj +<>]/ID(node00001034)>> +endobj + +816 0 obj +<> +endobj + +817 0 obj +<>]/ID(node00001037)>> +endobj + +818 0 obj +<> +endobj + +819 0 obj +<>]/ID(node00001039)>> +endobj + +820 0 obj +<> +endobj + +821 0 obj +<>]/ID(node00001044)>> +endobj + +822 0 obj +<> +endobj + +823 0 obj +<>]/ID(node00001047)>> +endobj + +824 0 obj +<> +endobj + +825 0 obj +<>]/ID(node00001049)>> +endobj + +826 0 obj +<> +endobj + +827 0 obj +<>]/ID(node00001052)>> +endobj + +828 0 obj +<> +endobj + +829 0 obj +<>]/ID(node00001054)>> +endobj + +830 0 obj +<> +endobj + +831 0 obj +<>]/ID(node00001057)>> +endobj + +832 0 obj +<> +endobj + +833 0 obj +<>]/ID(node00001059)>> +endobj + +834 0 obj +<> +endobj + +835 0 obj +<>]/ID(node00001062)>> +endobj + +836 0 obj +<> +endobj + +837 0 obj +<>]/ID(node00001064)>> +endobj + +838 0 obj +<> +endobj + +839 0 obj +<>]/ID(node00001067)>> +endobj + +840 0 obj +<> +endobj + +841 0 obj +<>]/ID(node00001069)>> +endobj + +842 0 obj +<> +endobj + +843 0 obj +<>]/ID(node00001075)>> +endobj + +844 0 obj +<> +endobj + +845 0 obj +<>]/ID(node00001078)>> +endobj + +846 0 obj +<> +endobj + +847 0 obj +<>]/ID(node00001080)>> +endobj + +848 0 obj +<> +endobj + +849 0 obj +<>]/ID(node00001084)>> +endobj + +850 0 obj +<> +endobj + +851 0 obj +<>]/ID(node00001087)>> +endobj + +852 0 obj +<> +endobj + +853 0 obj +<>]/ID(node00001089)>> +endobj + +854 0 obj +<> +endobj + +855 0 obj +<>]/ID(node00001092)>> +endobj + +856 0 obj +<> +endobj + +857 0 obj +<>]/ID(node00001094)>> +endobj + +858 0 obj +<> +endobj + +859 0 obj +<>]/ID(node00001097)>> +endobj + +860 0 obj +<> +endobj + +861 0 obj +<>]/ID(node00001099)>> +endobj + +862 0 obj +<> +endobj + +863 0 obj +<>]/ID(node00001102)>> +endobj + +864 0 obj +<> +endobj + +865 0 obj +<>]/ID(node00001104)>> +endobj + +866 0 obj +<> +endobj + +867 0 obj +<>]/ID(node00001107)>> +endobj + +868 0 obj +<> +endobj + +869 0 obj +<>]/ID(node00001109)>> +endobj + +870 0 obj +<> +endobj + +871 0 obj +<>]/ID(node00001112)>> +endobj + +872 0 obj +<> +endobj + +873 0 obj +<>]/ID(node00001114)>> +endobj + +874 0 obj +<> +endobj + +875 0 obj +<>]/ID(node00001117)>> +endobj + +876 0 obj +<> +endobj + +877 0 obj +<>]/ID(node00001119)>> +endobj + +878 0 obj +<> +endobj + +879 0 obj +<>]/ID(node00001122)>> +endobj + +880 0 obj +<> +endobj + +881 0 obj +<>]/ID(node00001124)>> +endobj + +882 0 obj +<> +endobj + +883 0 obj +<>]/ID(node00001128)>> +endobj + +884 0 obj +<> +endobj + +885 0 obj +<>]/ID(node00001131)>> +endobj + +886 0 obj +<> +endobj + +887 0 obj +<>]/ID(node00001133)>> +endobj + +888 0 obj +<> +endobj + +889 0 obj +<>]/ID(node00001136)>> +endobj + +890 0 obj +<> +endobj + +891 0 obj +<>]/ID(node00001138)>> +endobj + +892 0 obj +<> +endobj + +893 0 obj +<>]/ID(node00001141)>> +endobj + +894 0 obj +<> +endobj + +895 0 obj +<>]/ID(node00001143)>> +endobj + +896 0 obj +<> +endobj + +897 0 obj +<>]/ID(node00001146)>> +endobj + +898 0 obj +<> +endobj + +899 0 obj +<>]/ID(node00001148)>> +endobj + +900 0 obj +<> +endobj + +901 0 obj +<>]/ID(node00001151)>> +endobj + +902 0 obj +<> +endobj + +903 0 obj +<>]/ID(node00001153)>> +endobj + +904 0 obj +<> +endobj + +905 0 obj +<>]/ID(node00001156)>> +endobj + +906 0 obj +<> +endobj + +907 0 obj +<>]/ID(node00001158)>> +endobj + +908 0 obj +<> +endobj + +909 0 obj +<>]/ID(node00001161)>> +endobj + +910 0 obj +<> +endobj + +911 0 obj +<>]/ID(node00001163)>> +endobj + +912 0 obj +<> +endobj + +913 0 obj +<>]/ID(node00001166)>> +endobj + +914 0 obj +<> +endobj + +915 0 obj +<>]/ID(node00001168)>> +endobj + +916 0 obj +<> +endobj + +917 0 obj +<>]/ID(node00001171)>> +endobj + +918 0 obj +<> +endobj + +919 0 obj +<>]/ID(node00001173)>> +endobj + +920 0 obj +<> +endobj + +921 0 obj +<>]/ID(node00001176)>> +endobj + +922 0 obj +<> +endobj + +923 0 obj +<>]/ID(node00001178)>> +endobj + +924 0 obj +<> +endobj + +925 0 obj +<>]/ID(node00001181)>> +endobj + +926 0 obj +<> +endobj + +927 0 obj +<>]/ID(node00001183)>> +endobj + +928 0 obj +<> +endobj + +929 0 obj +<>]/ID(node00001187)>> +endobj + +930 0 obj +<> +endobj + +931 0 obj +<>]/ID(node00001190)>> +endobj + +932 0 obj +<> +endobj + +933 0 obj +<>]/ID(node00001192)>> +endobj + +934 0 obj +<> +endobj + +935 0 obj +<>]/ID(node00001196)>> +endobj + +936 0 obj +<> +endobj + +937 0 obj +<>]/ID(node00001200)>> +endobj + +938 0 obj +<> +endobj + +939 0 obj +<>]/ID(node00001203)>> +endobj + +940 0 obj +<> +endobj + +941 0 obj +<>]/ID(node00001205)>> +endobj + +942 0 obj +<> +endobj + +943 0 obj +<>]/ID(node00001209)>> +endobj + +944 0 obj +<> +endobj + +945 0 obj +<>]/ID(node00001212)>> +endobj + +946 0 obj +<> +endobj + +947 0 obj +<>]/ID(node00001214)>> +endobj + +948 0 obj +<> +endobj + +949 0 obj +<>]/ID(node00001218)>> +endobj + +950 0 obj +<> +endobj + +951 0 obj +<>]/ID(node00001221)>> +endobj + +952 0 obj +<> +endobj + +953 0 obj +<>]/ID(node00001223)>> +endobj + +954 0 obj +<> +endobj + +955 0 obj +<>]/ID(node00001226)>> +endobj + +956 0 obj +<> +endobj + +957 0 obj +<>]/ID(node00001228)>> +endobj + +958 0 obj +<> +endobj + +959 0 obj +<>]/ID(node00001232)>> +endobj + +960 0 obj +<> +endobj + +961 0 obj +<>]/ID(node00001235)>> +endobj + +962 0 obj +<> +endobj + +963 0 obj +<>]/ID(node00001237)>> +endobj + +964 0 obj +<> +endobj + +965 0 obj +<>]/ID(node00001241)>> +endobj + +966 0 obj +<> +endobj + +967 0 obj +<>]/ID(node00001244)>> +endobj + +968 0 obj +<> +endobj + +969 0 obj +<>]/ID(node00001246)>> +endobj + +970 0 obj +<> +endobj + +971 0 obj +<>]/ID(node00001249)>> +endobj + +972 0 obj +<> +endobj + +973 0 obj +<>]/ID(node00001251)>> +endobj + +974 0 obj +<> +endobj + +975 0 obj +<>]/ID(node00001254)>> +endobj + +976 0 obj +<> +endobj + +977 0 obj +<>]/ID(node00001256)>> +endobj + +978 0 obj +<> +endobj + +979 0 obj +<>]/ID(node00001259)>> +endobj + +980 0 obj +<> +endobj + +981 0 obj +<>]/ID(node00001261)>> +endobj + +982 0 obj +<> +endobj + +983 0 obj +<>]/ID(node00001264)>> +endobj + +984 0 obj +<> +endobj + +985 0 obj +<>]/ID(node00001266)>> +endobj + +986 0 obj +<> +endobj + +987 0 obj +<>]/ID(node00001269)>> +endobj + +988 0 obj +<> +endobj + +989 0 obj +<>]/ID(node00001271)>> +endobj + +990 0 obj +<> +endobj + +991 0 obj +<>]/ID(node00001274)>> +endobj + +992 0 obj +<> +endobj + +993 0 obj +<>]/ID(node00001276)>> +endobj + +994 0 obj +<> +endobj + +995 0 obj +<>]/ID(node00001280)>> +endobj + +996 0 obj +<> +endobj + +997 0 obj +<>]/ID(node00001282)>> +endobj + +998 0 obj +<> +endobj + +999 0 obj +<>]/ID(node00001285)>> +endobj + +1000 0 obj +<> +endobj + +1001 0 obj +<>]/ID(node00001287)>> +endobj + +1002 0 obj +<> +endobj + +1003 0 obj +<>]/ID(node00001290)>> +endobj + +1004 0 obj +<> +endobj + +1005 0 obj +<>]/ID(node00001292)>> +endobj + +1006 0 obj +<> +endobj + +1007 0 obj +<>]/ID(node00001296)>> +endobj + +1008 0 obj +<> +endobj + +1009 0 obj +<>]/ID(node00001298)>> +endobj + +1010 0 obj +<> +endobj + +1011 0 obj +<>]/ID(node00001301)>> +endobj + +1012 0 obj +<> +endobj + +1013 0 obj +<>]/ID(node00001303)>> +endobj + +1014 0 obj +<> +endobj + +1015 0 obj +<><>]/ID(node00001306)>> +endobj + +1016 0 obj +<> +endobj + +1017 0 obj +<>]/ID(node00001308)>> +endobj + +1018 0 obj +<> +endobj + +1019 0 obj +<>]/ID(node00001312)>> +endobj + +1020 0 obj +<> +endobj + +1021 0 obj +<>]/ID(node00001315)>> +endobj + +1022 0 obj +<> +endobj + +1023 0 obj +<>]/ID(node00001318)>> +endobj + +1024 0 obj +<> +endobj + +1025 0 obj +<>]/ID(node00001320)>> +endobj + +1026 0 obj +<> +endobj + +1027 0 obj +<>]/ID(node00001325)>> +endobj + +1028 0 obj +<> +endobj + +1029 0 obj +<>]/ID(node00001328)>> +endobj + +1030 0 obj +<> +endobj + +1031 0 obj +<>]/ID(node00001330)>> +endobj + +1032 0 obj +<> +endobj + +1033 0 obj +<>]/ID(node00001334)>> +endobj + +1034 0 obj +<> +endobj + +1035 0 obj +<>]/ID(node00001337)>> +endobj + +1036 0 obj +<> +endobj + +1037 0 obj +<>]/ID(node00001339)>> +endobj + +1038 0 obj +<> +endobj + +1039 0 obj +<>]/ID(node00001342)>> +endobj + +1040 0 obj +<> +endobj + +1041 0 obj +<>]/ID(node00001344)>> +endobj + +1042 0 obj +<> +endobj + +1043 0 obj +<><>]/ID(node00001347)>> +endobj + +1044 0 obj +<> +endobj + +1045 0 obj +<>]/ID(node00001349)>> +endobj + +1046 0 obj +<> +endobj + +1047 0 obj +<><>]/ID(node00001352)>> +endobj + +1048 0 obj +<> +endobj + +1049 0 obj +<>]/ID(node00001354)>> +endobj + +1050 0 obj +<> +endobj + +1051 0 obj +<><>]/ID(node00001357)>> +endobj + +1052 0 obj +<> +endobj + +1053 0 obj +<>]/ID(node00001359)>> +endobj + +1054 0 obj +<> +endobj + +1055 0 obj +<>]/ID(node00001363)>> +endobj + +1056 0 obj +[23 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 45 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R] +endobj + +1057 0 obj +[53 0 R 55 0 R 57 0 R 57 0 R 59 0 R 61 0 R 61 0 R 63 0 R 65 0 R 65 0 R 67 0 R 67 0 R 67 0 R 69 0 R 71 0 R 73 0 R 75 0 R 77 0 R 79 0 R 81 0 R 83 0 R 85 0 R 87 0 R 89 0 R 91 0 R 93 0 R 95 0 R 97 0 R 99 0 R 101 0 R 103 0 R 105 0 R 107 0 R 109 0 R 111 0 R 113 0 R 115 0 R 117 0 R 119 0 R 121 0 R 123 0 R 125 0 R 127 0 R 129 0 R 131 0 R 133 0 R 135 0 R 137 0 R 139 0 R 141 0 R 143 0 R 145 0 R 147 0 R 149 0 R 151 0 R 153 0 R 155 0 R 157 0 R 159 0 R 161 0 R 163 0 R 165 0 R 167 0 R 169 0 R 171 0 R 173 0 R 175 0 R 177 0 R 179 0 R 181 0 R] +endobj + +1058 0 obj +[183 0 R 185 0 R 187 0 R 189 0 R 191 0 R 193 0 R 195 0 R 197 0 R 199 0 R 201 0 R 203 0 R 205 0 R 207 0 R 209 0 R 211 0 R 213 0 R 215 0 R 217 0 R 219 0 R 221 0 R 223 0 R 225 0 R 227 0 R 229 0 R 231 0 R 236 0 R 238 0 R 240 0 R 242 0 R 245 0 R 248 0 R 250 0 R 252 0 R 254 0 R 256 0 R 259 0 R 261 0 R 263 0 R 265 0 R 267 0 R 270 0 R 273 0 R 275 0 R 277 0 R 279 0 R 281 0 R 283 0 R 285 0 R 287 0 R 289 0 R 291 0 R 293 0 R 295 0 R 297 0 R 299 0 R 301 0 R 303 0 R 303 0 R 305 0 R 307 0 R 309 0 R 311 0 R 313 0 R 315 0 R 317 0 R 319 0 R 321 0 R 323 0 R 325 0 R 325 0 R 327 0 R 329 0 R 331 0 R] +endobj + +1059 0 obj +[333 0 R 335 0 R 337 0 R 339 0 R 341 0 R 343 0 R 345 0 R 347 0 R 349 0 R 351 0 R 353 0 R 355 0 R 357 0 R 359 0 R 361 0 R 363 0 R 365 0 R 367 0 R 369 0 R 371 0 R 373 0 R 375 0 R 377 0 R 379 0 R 381 0 R 383 0 R 385 0 R 387 0 R 389 0 R 391 0 R 393 0 R 395 0 R 397 0 R 399 0 R 401 0 R 403 0 R 405 0 R 407 0 R 409 0 R 411 0 R 413 0 R 415 0 R 417 0 R 419 0 R 421 0 R 423 0 R 425 0 R 427 0 R 429 0 R 431 0 R 433 0 R 435 0 R 437 0 R 439 0 R 441 0 R 443 0 R 445 0 R 447 0 R 449 0 R 451 0 R 453 0 R 455 0 R 457 0 R 459 0 R 461 0 R 463 0 R 465 0 R 467 0 R 469 0 R 471 0 R] +endobj + +1060 0 obj +[473 0 R 475 0 R 477 0 R 479 0 R 481 0 R 483 0 R 485 0 R 487 0 R 489 0 R 491 0 R 493 0 R 495 0 R 497 0 R 499 0 R 501 0 R 503 0 R 505 0 R 507 0 R 509 0 R 511 0 R 513 0 R 515 0 R 517 0 R 519 0 R 521 0 R 523 0 R 525 0 R 527 0 R 529 0 R 531 0 R 533 0 R 535 0 R 537 0 R 539 0 R 541 0 R 543 0 R 545 0 R 547 0 R 549 0 R 551 0 R 553 0 R 555 0 R 557 0 R 559 0 R 561 0 R 563 0 R 565 0 R 567 0 R 569 0 R 571 0 R 573 0 R 575 0 R 577 0 R 579 0 R 581 0 R 583 0 R 585 0 R 587 0 R 589 0 R 591 0 R 593 0 R 595 0 R 597 0 R 599 0 R 601 0 R 603 0 R 605 0 R 607 0 R 609 0 R] +endobj + +1061 0 obj +[611 0 R 613 0 R 615 0 R 617 0 R 619 0 R 621 0 R 623 0 R 625 0 R 627 0 R 629 0 R 631 0 R 633 0 R 635 0 R 637 0 R 639 0 R 641 0 R 643 0 R 645 0 R 647 0 R 649 0 R 651 0 R 653 0 R 655 0 R 657 0 R 659 0 R 661 0 R 663 0 R 665 0 R 667 0 R 669 0 R 671 0 R 673 0 R 675 0 R 677 0 R 679 0 R 681 0 R 683 0 R 685 0 R 687 0 R 689 0 R 691 0 R 693 0 R 695 0 R 697 0 R 699 0 R 701 0 R 703 0 R 705 0 R 707 0 R 709 0 R 711 0 R 713 0 R 715 0 R 717 0 R 719 0 R 721 0 R 723 0 R 725 0 R 727 0 R 729 0 R 731 0 R 733 0 R 735 0 R 737 0 R 739 0 R 741 0 R 743 0 R 745 0 R 747 0 R] +endobj + +1062 0 obj +[749 0 R 751 0 R 753 0 R 755 0 R 757 0 R 759 0 R 761 0 R 763 0 R 765 0 R 767 0 R 769 0 R 771 0 R 773 0 R 775 0 R 777 0 R 779 0 R 781 0 R 783 0 R 785 0 R 787 0 R 789 0 R 791 0 R 793 0 R] +endobj + +1063 0 obj +[795 0 R 797 0 R 799 0 R 801 0 R 801 0 R 803 0 R 805 0 R 807 0 R 809 0 R 811 0 R 813 0 R 815 0 R 817 0 R 819 0 R 821 0 R 823 0 R 825 0 R 827 0 R 829 0 R 831 0 R 833 0 R 835 0 R 837 0 R 839 0 R 841 0 R 843 0 R 845 0 R 847 0 R 849 0 R 851 0 R 853 0 R 855 0 R 857 0 R 859 0 R 861 0 R 863 0 R 865 0 R 867 0 R 869 0 R 871 0 R 873 0 R 875 0 R 877 0 R 879 0 R 881 0 R 883 0 R 885 0 R 887 0 R 889 0 R 891 0 R 893 0 R 895 0 R 897 0 R 899 0 R 901 0 R 903 0 R 905 0 R 907 0 R 909 0 R 911 0 R 913 0 R 915 0 R 917 0 R 919 0 R 921 0 R 923 0 R] +endobj + +1064 0 obj +[925 0 R 927 0 R 929 0 R 931 0 R 933 0 R 935 0 R 937 0 R 939 0 R 941 0 R 943 0 R 945 0 R 947 0 R 949 0 R 951 0 R 953 0 R 955 0 R 957 0 R 959 0 R 961 0 R 963 0 R 965 0 R 967 0 R 969 0 R 971 0 R 973 0 R 975 0 R 977 0 R 979 0 R 981 0 R 983 0 R 985 0 R 987 0 R 989 0 R 991 0 R 993 0 R 995 0 R 997 0 R 999 0 R 1001 0 R 1003 0 R 1005 0 R 1007 0 R 1009 0 R 1011 0 R 1013 0 R 1015 0 R 1015 0 R 1017 0 R 1019 0 R 1021 0 R 1023 0 R 1025 0 R 1027 0 R 1029 0 R 1031 0 R 1033 0 R 1035 0 R 1037 0 R] +endobj + +1065 0 obj +[1039 0 R 1041 0 R 1043 0 R 1043 0 R 1045 0 R 1047 0 R 1047 0 R 1049 0 R 1051 0 R 1051 0 R 1053 0 R 1055 0 R] +endobj + +1066 0 obj +<> +endobj + +1067 0 obj +<> +endobj + +1068 0 obj +<> +endobj + +1069 0 obj +<>/StructTreeRoot 20 0 R/ViewerPreferences<>/Lang(en-US)>> +endobj + +1070 0 obj +<> +stream +x tG?|zf{}4FH3ZmYk$,˒blk;v8^b'1IX^d18!lHl !zF pwrGS]uWn{fd`X<ɮ: \0ҳ/,O._mۼ~㶧z86 +v䠵|Ǻ+/d_ްf%?ݰvb^hްa9(Z no3 `/%v']+7ۊ(Ʀk|=h|Wm%7vN7_v#̋h0!@vAdհ  ̿A 醠dv~^9t'{VJq>7a)ĝb +ˏ2z$Xx?tD`;0-%>R d82ZS]!2l ,@yRA0PU0 ``'!P i%0z3eb"Z?W8`]s|n7V]>/ p5lp5B\:hy_Ά \wʙ> WfW%6V0 `@7L&6%&r0`l5Pg"ZWZXYX W[aM|m=} PO1?&bu" Ca``°a4=GRG܆XF6 aY6daD, |Y7Ȓnٶ*uo}K&"׮XbMt"ck"#k"U5+`W *M*׳&2ЃzJDpjnZ-:"UðPնaT jnK#xԍ0ma,YXMMm7a#t {tCCŻCc {Fz ]c4i*No5/:^E?k[N{@Ǖp-yI/~oK:`/O{f9@u{Rrr;Ydja 셯&O`) `5k^Mk&Q].DCɼwK߭ǬG_ 6\/w+w{>Ͼ sP)r$q|AE:qK&~UerJVPsvmwfzN;&ow^/8k!;#3ۢ8=5ЇB +Z +>x9nn> +q +~ +n + +I +i +) +Az@_y{"7A8 Y|P; `x99`v{`ܐ;`A  <w#\qZ螿jЇЂ0>}8xy}ޏRI/xFW`E/CoGG| 9:th /Xpy}=]ssgjkminTV$Xī)x;ڬ#2x-0\XU4&bUmw'7ݙ/ݙF;qx'nF ƍzcFq<D-)6q">"]E[ښhqh|&=VīhΑ}Ιy|UR~uaSLoݿ -+>88ȏn4(Ewh?f]1*hZgXMG׎^ŪOYo{fr68*ZF_ђw٤\>j7FQo+V|=;K$iCDǢ%z e"wNYrzR=ݔ*wm9 W`'X+.Z,&i-I%ڋ^h|m|,(Fi(f./h,=S)u&|VKG}t癟g>){t/OK c" qcX}U񾉸!}'8߿wՆY5C%;iu*,D v<8inp 7[&xn&?[a?1n!?#>#?ɏfzn#?i(|C| >LN9wG)8S 9w) n|<;<w$!k~ !|L{sp// _y(L (F< PyZ,BY\a"a1C|Q9K ɣ-!0ZFe"R<b A]J>F9X8I]>XM t#.Fɿjt+ A$#Ӱ}|֣;'a .AR.COr6C lBO+c}[qQ}|BϐV\N6<\Nv3r@?'N? +עW`7y An=h{1&:l#7û1OX"=En7byr=܄cp3 ~\M[pYއ[ȻV<r-܆.#;x!‹5aד2r%܁7p_E6'6r܉wMpC6zr9|#~r|J. ovwup/ZKggjx?D.G|d%NV#[dG.p,V yd,l6-_c! M,psn(t4kاpXXY+ϐyjw) LQvgyj}5 r8px(@s˂`l0CN";Eѩ\ *!)7o#r:EX + (((C$Y,9VæP9Bׄi,,3dbk(JNDpdE|,Ny ib8x(Y2p8vnE)+Cvj*tʊD贋"ku(]Et: HegP6g<,Su%,\SrH"/JMܒ$IC,TUUsNc`XUrNE4IV $Az3V r p7XuH3dbTUeƉtTYudQdKMp:dI$L,`!ϐ \ȚI.٧Upɪv.(Hf,˥ +Bn \,dURp6*:DBފiA,:Ȝ92mh1k.n+XE)=@SU٣(*Xx<bq'3dH[TGPjAwOrQKvDnw*oNYr)>Uߊy<^/D ,h]3T Xh.WP<ϯMXh5ri6l?@:bs͐[15_py?|1r骮nkBHu]T$EU?X$.(tnwe}%ynph>= yq.[qnnW@wފT$gN➡ɀAףE Bs^gD=nxQ8@])d$h2sZ#FLFD"P4P(_ R`0rk_o#2X >ݣUCq3dVdHCk+* drQ/!ӡp8zB`l?@x"M(d*傈S2 _Se"^TTʡd*DĨA\T8ÐňRoDQgDpxQ*UY ZC4G +tbKEgȴTE:J"\M]RxU墌x(bsbxǢz+FT]]SscPCd녔C3d6Ԧ*2 Z=הTejE%+c`eJSYP4J6'+boۈYK/YU20,8 "el2'2'||:}>DUԳ3j?1HC2H"Ь+eL#i.-dt֦D,j;EB4Ѕ,]Zv]cfv<^c4/2/3oFRB79hΈ@dsRm˴|zxaKPO}GQaKOXj # +eu4@84Nn/拂h`/TȌ&sSIgS׏]z)pM{ӽ@!8 KTUs{$~&w&}&Po-bwScn>Fv]QB{56 um4-lZÊaN|գ>:6Oɫx;9ߙ6G޾˧&{-0EDf2 s2=H@:€ dP&Sf[>Pޏ>|y1pB!q5NWλs:';'/ȧӓ belcDc W_}CkE7λ+=`ͣ}KܸK6wbÍqE},ͷtbX rYa;Y ,bEI+Ew +C`s:;;ն̉BӅBLt%}qtDU3 ѫZcP 5FԬa8[ ^a:ddɂ|-41+2lTV4R[:&jJHm=$ 8x 5 dRAvAsFTmD-*jnj +?>Ͱ$_[P q&e[HVSc֖#.Qjd2^C6_"~xI -L6{bu\4j"d ̴-uΐ7lrW.UMrqvtج`]ys:D۵&طsT~Fޭ:BM.#sgGLk8\ vcʳG:cPA:l QƶsZ3y*;Ur /d'نz$"6RJ'h\SϹ/E$=jwlwx+|0au>dNQfF(&Go bzu(nn1JmLTNgOO'TG"*C?3h?AkV惷zf8%mՆ‘> Kc$`?*d;_WU^ 5DV60\-c[mZ+T6iֆLy2MGQ +gjimX2Erl0sB;+"[=BjYqէa ΍ouc--FJ͵lV.5EfHIU4@|GViˊ0!9ɒW Jú5G3&/9A͉\m"jhO}qAo65<~'"`(4\gnDz"HnkPc|WgFD-k=Z吗?%l/^n6n:m֒)CGbJDMF: +s +m^9U9#\E[="X'q:i3bO.lf٪i\7wG뇼vG+g#D@(&ܒ;VMk3HC[vu"+e#ٕYRV`Y[pZi_ݥmnijlncS2ʓ9סT![&B zNbv00kss%} h[8&љ hF8#mK{k:pG5!@R|!lHuy=A +r0 *JsJw%9hj:7M XX颓NH>Φ哓j[[&3^' .S\y"M4 +9V7Tu\~ޥcï=HMOնƎ`0SpT6g֦b6MkkjM/`gFSLޕ*W@>/31i,2(oFf<:?p`!^J`1`2~lְ{݋WaR5Z\Tjku4  @ܩ–lD!͜*l9Mϐ|P8U8?a*SӅd"e;G:<>;?M,|Ʃ:4Us~*4Uӝ g/T9ӃW/wHC؞XXk[uE޵tŝWuEf/9:AQD:FVqf;:ϯ;0{iivnn][U^Eo[DC(Ԑφ!:>.7;fZBD "Ąa D`]b\eZ|Zډ$gĉδ'#9ENVcqNs~G#8*\}hDIQ37^hPIFɴXa +[2ѣѣ\{|ߛ2Ky :S[-xȰ:B93 |*=7~ ݗӪ#19**%6/o^gImK*U,DGORv4҈{,۫E^C,36$~x O'N6[c)ezlsQEl,ji2ʆ+jR[}|VY'nw-l-k޸ ,:(m@4'}̎,prX\g'%KtjlYi9N⹖;?uB6l܌/qyrٍЙOJ6do`FX̱,s~l֡e O=e}wHzOWn;)!=i$ޑp:(,0-m'LiהSW~T(Ч6NxI`y|O$Wk 9;. G1_X݊o[M+AQ Nùm=v Xt +2AJ9PUJNWzAdÇ,DS?ćP~Qw䡋Cߎ{`\8-e$O^A‡@\>,4vBT 8kPs7lO,J}6b1ԕjeTԽCvel>G}2w&xN$8N;DEQs` +G |ԊV$Y#V V"EEܒq)HVX8fǶ֤b#ֶ=6uPi,BJ5S3#|r_ڲ[fP]ͤ̎@-9_mjz|1/x/=WqC`@ n`ĕl' I=j8xЙvJ5^驦.T'W wHJ>Nc- Y%gNZj[ gғ٬\26Ì< AB185˺\FWv՚tQLר.HA]>imG\eTa 﨔߮׮deYS/S|tMOƇ{{xsݽ6KrFtPvl[3xœg|М=i_ +H\ݯlq0mK|)-ҁ<1]&dq}lR%z?W?s7`P^c~ +<59`[84EqF_B2\=MYB8'pݔ̚>C4r|LMiYS(TMW{;j!WR`ncpԌ.?uWf{ϔdMS. 4|}G6hm{l[5(Z2( n]ef朂V(Iʾv@m_LbNH0krF~>a9ݷ.ZmmPi@U5.;" Cau.صTc_v2AVk 3NRyL,p?3G:M;3/oWMx~wq flSJJQ:}}>ض{U`:P JdyprhC)eio+ ;\vzhjzvR[>558gJs W.ݭ%dٍ4wܲ /Rܚޥ|G +y&X6@H`+hVAV' Nps +?KYSߴa7WK++XaQjsZNse2='~wսk-]~rԇ$ :2%%ķJ0%+PH_5UB  (oIhLD % e~W@-/ %B*idԕ*C_QjUȪ.FPG{ŗcF"n.\B %N4g:(oܑz\a˱)і㖳I?M_NO>s [/m-- +<8Ec3/oz07-{Q_V~ӦLn='W}Kh݃ݞkشi]eF.ϱ `8`@dYXª~ L\5'ϗeNvgY Y0S6;Mssl̪ g;/QhPvWP*FEvvXnwkt8y AXoK2tgNErwƨ2ЮMP,&1`X +5Uõ֬jr'Lh!;>m('9?ѹ]!=϶w{>IJ=!ɠ u6+sCFc *\T]n[*zx=nhw֥Vu+E;k }Ua8 u7"M@0@]b漶AΨ#nE(7 "P5Rno+-e}RO(Ĵ9' nk#fp>;,۹?ew _KeN +_Aٮyxc;iO#FIC+#n`wpV&ϵ] +7jsLɾ5hDFY 3#m[FK] ;9`-`%bw mР;υܻ#1#Trjj EUbO"9OVZubX jms%Hz2Iv6Y+̯p/{ABJ2:?S]Ph(!nWTKcvU҈7:,VW茡y`.~N%%(5׺Q$RC1[[^M=h]Z yF8צvUEF'γ +-̄* g+hD!.hOc%7I+-ϻ35)ᦵ|{Vy@@\2فQg,%[i߿jK8ANڜ#48YbtxCiRZA޹M1P W]СڀQ!15 xD(0˃ך#b?PhU2S+VZKA[R%z B8&00~rcs~ bvH5kpe*vVR A8tNd[ik唜ٿJ[>KZFOﳔ\SrbB1#&3S㟪*ݛVՏ9}65m'/+dPTsłe +.Sl/CR\{t't7x1 j1wg6=Ѭ7끮9.>is[9:{iJc% (s +?hߩSK$)d0{ZQWbE(95ٟg0H9"X}h %TD?~F}VebjVUcIGB=M]IP1r2ƀƀa\-_lfOK  Ӣ(l3{o1P!wۦ>sK2wPHtCKrkh"1ZXskJflXJ8^K2 +TqK @'%?ߢ6}4dP֧aM{:f61$ qi٫*$o~|wI$ =' Ym˖rd'S-B=%[BI]iK{ƕuݨյ'8q8}^ë;ܙڴW}dQ֛?vab5+Ɔ5/N\V/@?Xš9o8*K`Q쯽hg*64hL?輮&TVgh<-/ϫR-wh樈^Ψn1]t].2ace^d,1hh 3 ch"pXUS@c>rn!bGgIxTԘNv!?>;7$WPltY?^VJojN%5m̌Z&ںRk @n +endstream +endobj + +1071 0 obj +<> +endobj + +1072 0 obj +<>/W[0[500 0 0 240]9[705 0 356 356]15[246 340 246 437]29[246]34[455 974 721 672 648 737 606 574 702 734 316 529 684 563 897 756 790 644 0 667 582 614 707 722 948 0 661]68[553 604 500 604 584 422 594 589 289 289 579 316 862 589 607 604 604 422 485 444 589 550 784 554 547 500]262[708 0 736]]/DW 568>> +endobj + +1073 0 obj +<> +stream +x]ϊ0y ISRкj2mx/ +{H7oˌ(Kl+ [Lqx u,QXDQ]iWXq.c _p5@kQB.rh(6m6ע~eLBNȍ ˤ2YYe;RZ}of9ϤT2G:iw){$) 3zK3Q%u.oHɅg *$;QnHOy5<#p3g,+UB +endstream +endobj + +1074 0 obj +<> +stream +xX}\Ufaf_@qIo*Vd`Ⴜob +dR)-kfZQjnBl[^&s[.gһog;Ϝy9{g0!XB P=9½۟/~ +痱W ྂoK[&-^2j@yeB @]he13os%Es蒒|m3+Yۿ XȪE-H\`ܬQ ?q3~ `e>l V˖ݤ3Va(<@Ha ~bazf%^O'Ҝޒm? +5Lg^@l@̶yi,px@nG~i8G5Y:zB<5<y86pN$Ʃ[ƟPq؇%j^j:%c5! *%^u``_B2b%H|,C9a)HSq? +0L",w}'?*B_(B!#:SX~Gɿxo:&OS#>FYeP@3̬ +.o@)vӸ#ē$KSu5(OAM(5PhJ9*T +95S9O;xSa.1cFA; פ iԫP +RyTqIT^ jP/QöHߠ&a(W^OA=f/}uM0}-[_\U0.ˍ.u{3AOO.3ut~D~~&uz:+菂>ras~/轍{6޹:nӿ6~#]A+AuN#No锠[Vz3Z!uA :.藂^c +zH-U."YKGrKG5]Hx]tX utH/5 gܳ.\!=hϺDlȟ顃~*耠oo0禽t!y7N:#h.=-hwFBڹC;#iBOғ3'hƉ|{=-?>c=T(&o=J[5xM.xG]EMfA*86̴>\y'4GUi5V x*cAVÅTe.zHJA +=--ZCKzLP-rBA |L/d3bAE ++(= +WlA9ف<鞰H~f ;N, d +AwiƴP>CPf)~.(cZ(4m§TOUhnu4& UJPQAArbLJM4& 4NPc|l1fG+Db 42GdI:>\$%iPVHCP 1<\ +! +8AbB4{n3p{! d5sNt)("y0H2 +d2s č餬B +dЇq =S>* %AZ3i +If +y,$%q$1KI +ma?dbQ' h1ȣ@sՒP:|Pr2z)cQ !P%KB8b= ^}isb'%*Buw,F2*ɨH nƨҦ]wڵ +ӉWL3ExGvR(JTrd-C}_\/a0EߌdN,fjg)ѩ⇱~hB>dΉY'z#w{rKO\`Gݺï\7Fj~o=UNH0` d!rFkuL&@+g22 ~a[}n}nSZ`SZRC:4C19mx6F;؝; X1{=D!:c%ktFHLSWpWo^vuɅ6ʃ*6ȫ5{ ɋp+ $+]eEQտV-Z->Zj_:-NsX̸!,j4>ȫ':ės(}|~g3❍ⱐq?GCBM_\Ǔ8d{B50T xa W!ֺ٥Y#VrFG^w1{>sX~%im~!rYbוY uptIٳ~=L7}Cn:,9qU\d,jNO=ޗq+=/55U:%x"Q"2ӹk4ZVZ #P+~P;>8flǔ-1 i| +GMhhs괰XR+zΪּ/9yO>y-rٲJHX%WKgL6:U! {!,ګԆmviVg11V?aw | k|}F1ӧ&ecm + f1H,gfYagg<2Т?+L9Lj/-r)9.i}, ,ڥ'2IESw"`l׭5) i`U'^WOt=A!hˏ,?pˌ׼r(cXMlٱcN^aL]oWXuc>ՃP%' < A`<i 6:_67N]@P4'+w:|nw)osƘd[=9:ّLyhd2љLgfLfBY:[:Q\5p)>u`<{^t#Yf/.s9DqqF\_71T5|F83¤W?znmS-&#YE%)bnL874|xcBB%}]jfD Ugoѳ-ffkE + C2L_ZݟC&l^ۻK6>ieBOԎK ,E)+J-Q%,Y~c fȕVE4V^{H҂s ]( 66K wKsfzbԨ&,[ŇO~~&1K-W 1LUa-!ۜpL [|$iL&!~Ϋ`!:UҒ ]3;X.pEθ3 OM ohx|{C=͘zWzPZt3gN8ssqN|j8_[0c*[K +endstream +endobj + +1075 0 obj +<> +endobj + +1076 0 obj +<>/W[0[600.09768 0 0 317.8711]19 28 636.23049 51[603.02737]68[612.79299 0 0 0 615.2344 0 634.7656]]/DW 0>> +endobj + +1077 0 obj +<> +stream +x]n <w@׶cqcR0$oMz|3@j~8#:0*-.fuaIi3J-Zn[<έ )KZpf#NSzív8HUđo@c٩Vw_E"40 t1VA4MS_HU(y%c削Ds'%Q9vcy) k|xs}u*Ɔp~xf +endstream +endobj + +1078 0 obj +<> +stream +xZMo7 +:,`;5z0Ц :q)пߧ֫YwMC 2,J|||?+XNI=~ŷK:'9*r!3??~PgE &`2ZCiRI} +3*Rƞ~zNw.?S?߫Y1_0pQeܔqʚC.&/VGGR/ΰs7@ePF{s,,Vg_m9ÄضH8,; /@9ߝ^Pw͍@bw\a #bǶG]@jwnp.nջ]G[Mou*iOK) ݾRߡ+!ʹ5&Vʯ`a ݄_PY{P=gRzD/Dvol^q\_ic#G)!?"G6 27i\$AtB]/(`ۿEVE|oAAUd!_ʚ~hguk;Mل9NIo\{$LzuCYt:fz~$ 8^# +!(s2vm|) wڀHe +n\%0.] +f'WK2#W<7,+Pi41HWgf@ rjI +cEdžWlVfc;P~dm/x3!D".9pdN88A]KcY1[{}5 +(G{D7SPED"p ;-/"a(ҘHė/?L0 H.$.59|y>"%Ñ%6nV`?enSˇ"B[Xy"Ko,Rd)f(M}Y/[nv'˓+eU}#~>l}6.ChD F\hD7ޱ'G&oZ"ZQ۳v1g.(燵PQc~H;rgԛUg-y n(,]: M +=^arj>U:7[+˙[{͹` +0JBF6TTQBT矅dRNIA +4Ǟ 8kTgcǢwq||/y>wi;~V (0=YkQ8k,Bl*ܣ6B^/:?-m +endstream +endobj + +1079 0 obj +<> +stream +x]mܸ +G/@\~-p7MдW?^c&eL2;-K"RIK*{?OYV*(tMVε.FcwKIO?ʈgx +<˦uު_f.;&4Rx%R3K$.9'8Q -GzW^󗷍xo/.;?k{gH=627huOR8}j^ zau 6]7>_uu7aBEhUEqPAp=M+A+apZmPpoXnBnXhn@t=1S.oYyW,n}!2j~A*LǦ +giRQ~Xt n1}ٖB7Z,ȭFC_S Il'1&GF4NUKFWЏ˃c:H'Fq?'# +؏Lcth-/$gKCFQzm|@B6v_ZEV'c k}|Nkaw!vjZb)>Ah" W-wX(^R%uB@$AkVkA8ќf+nA<%<'bu_y_3Y6գ}r5Kp>o`qoY&#W( bl+Uj/ TO" ꩼXV?bMa`N#6dgs)>Ta@[M 6f1$q[[aSO'uqU~*2FlEDy[4eܱ.ȿWm? JA3,#\jS $6.t7„MI +P;s I $,= [VHKB(-^mdΣf +-( >(U)Ш rY +5j | S0(#<|,8[Qm1X`7,d3j`XiBRFIi=iҬuuZ HYChk/kLrhf~D`|aKRtL;{kgf`visN($h_=Q(+_i (~^¦J-{T)-e^}qJ_'5A0TMRF`iaN;1($%Hэ\hzH|IwQV]+]iҢGl"lK[ߏ&'ncKGV1WO$iHCY 4nN~//cN.{|e HQRJgh8%-QqZU'v*M3amrش;l5 )x&R`0T狘D΂Zw窔 \nF&ra[t`ˣM'+@h"agMvAαZ$ +$ב(_~cv! EPVlPoܓ +2{*xN D6Jx.n&c.V_]1=ZPYMDumչ(ssQ4Ѵϰǣ/rCk'~{e> #1icz>~ő4iQ6q+=GkϋSO,WY7˾Orwuy]NT?r"c{!՗8v!r~Ojf6W3gS1rC̕ ڪ0)ˆHQ>_g/mv(_~w0R4/и1DXZuO{`C"[Xf6ߌfe*2q}wWPd"]X(2bTIYdqCJHTlg}?FlJ3VC$[P^t)[HL;@ƵҔk7u[v}I x!%Q&ݥAKe~Vyva!*&NRIId$ ?-{$׉Sfž.q!XgtYR{>  7`s|*~V utv[.ͷĈ0"/cN/V%Gv%F6e@84.y;MDve#ZI<^$hƝ&F9 +4"iND8_]g*ș"7t;"u?.%$.,Y̎š"[q-IFyl#=2OW'/H$H9)54"(%C z pLKM# +b4Y1yO4yP:OJ%֟I-,%lz}+_QS_Mߓ_p(OJ^[~p) {9MOjIZlKF5AR'a0\X szs +endstream +endobj + +1080 0 obj +<> +stream +x]Y+|L00 d퍑I<>{fE؈ jvKl,5ҘHUUխML#EjCh?gZlLЭ67Z9׺u?4_z8|zᬈ6zٴ.@ +:o7Ӷ>6Ja>5fdQ>_J]woL]zO*ʥ/sPjISJSiSx7UA4u<5wըiGkӂ7 R5E eQCÊߑqݬzs_F͜)Ax -\-\E "[!HZyưMehV΀J(R_["KE7ÒAnnX:(jE^4(U DUG䠩k4ahÞ2,Mi-Д%[h* LV^!#0|F@oc|DTNPS{> dDmǕMO-BΝYp$ݟ_{OoՏo^7?,jQ@M(\rھ{[/y!7 K/,4 r ja! @'_BB U5xL/tk\W=YY& /Y]1xAO>0[Ԁ!e蠀@ tG{d JBUcU6qCT0' ?{tOd cc#Ck-Zd9.i99i5Մh2:7EaOQ=@~^yMtH: /k,WDNlA`)2)MAjm`k5)2^B+Kh\fJ8kc @{̄ wm(sJC8mt8zX6 Ԧ&ͣ ",V_Xd#tZP^ͫ%hB$_ة0nD +GT?&S׎`)[]%1h3W6 0v s4#>Dstԧ#diI{\I!]@9K>33;̏\IxY\JHK#Zs=QA +@'I JaޏcW+*0% SfߢǾ;;w ??}3lƣH䩤~%N]h+#M;l}:&(jB$ cPm)O)Z!}vxӒ9U{Mӷ)XZI+$qJ +uB70N[^ӧ<ɡVZOJ0 "Ag?+Lv Y0}TJb:m$pPKT&462 `&$1@7_.(ǎ*"rS%Ycn M],*oz)*Ãx0s#SfБRŋKbv̫@~Ci1A%='  z,!7}#)3l%pi+ٰ벐+H`n5iymNX-Zyr兘"NDM m ѸE9"̲$0LLTLP<^r)}Qѳ$ef]|"Kb.E[RvU .zY{v21N]RX0ʓdET5{&p%baLYKR qu5jdE Y% %D D5f4?+W7SRtK/:G]-2UhK0r 6p_Mcf.#e% yEHgyFɍTSJc:B{'b$`㬵IA(I0 u0ߚ0" T$Bqi5-w:=30{!Fre~zs[ʲVF0!';ނ-'0mΥ?*jzY//W-Ȳfl"04"Ov5X3=IN,X/6*aΗ3c"Ztɘ$وd!IVӓ="洍"0s֤R90Rb,% Y3ǽ;3u|ˋT(,gsd?5X" 6^ CJ\L"&SIx!C,DoJrfy1ui[ĆuvsBf! 8rl__vSQ.[xyD(-0B$BG̖T"L +^}օa7-Z2'1}˼m+ [4>= | gštbAow#!v +=YvrȾ6.`Nq'˵ߏ9b6f{U[Fxx#n[1X.[xZiJ;zɟދ5bX"YhB47\ˍtiڼ\6MwP^ W42fϦ*Z\o\v'6tX +өL/5Im?w6?|V8}TL-&MS0u~eFWt 3pfSQÁ~-PZ[wV{;& +endstream +endobj + +1081 0 obj +<> +stream +x]K6+<BrhC6]d(iJ^{ZXb(K"gypƿErvHI~kc..G6! ꟿԟO7]$B·6|ˑo_H*Ƭ.<65y7%ow~}/_{Ko˛g8e$ k ^ @=un \Hİ܈UĩnA/?u{(o޽Ronigڡi(Z[mUc󈣜Q.l' 19@!L5>SNS"(iЙݞ~mOԥ٦O䴏 7lnD?;[w*NOM pA}T +qƒY8=8kR`iov`>+5Ҩ-Wg~FU, =k\Bs&s62s.SdӌQP3DðIg:~q;}o8.]`Rϴ;\(RD;xyq^5T +'$VK,l,ah\-ȏ(S_߽|f9Đ4Y8[vIz4F_r-7-)TPt%TArr~`]E'a BJ&PnOsL`և ǙjpOykT($00̩zLΫ4`!YMy>JS<4FqM4j !o*Y?9~am;E+&3̅` 1DV [W}KR\@|fv 4}Ί}fuK)lt[E*#QΈj6MJUׄ^IQz̽ | zd'-Bu:5 m9[]3IUeW̌So֭9}6T+.8hZ$137h39pm42>'1+n. څxvAvI\~'Yf%nѡ?>c3+E)+2p.([F&4ZStiӢ+Y2+^8Dy@I'k3 '[Ai8C8$ΞWy{C'S>BN0*Pb7)E­)ZSϩpQ695T촶D3﹄i©~p)Q}@i6pj_y4aAJn';U̵Rb'w{'wl`v*8,bqEGb/v)7NU||.;1qt*U?lk] ©~ +i!ֲ\QXfI>-4v(Nc/G !1j' }4; +{2a2\XhDnB@t;34ճxt\Fc/VW;vtQ؋ve'瘥2EyѡڢC1<}\4ڰSYճWEyѕT嘥EW;ba.zswSt3L17kRsen"Ly?/ +<MGyFlvKcGMDJRy͛rncc;;x<.;1sn|t$W]/ )w;mRcI’Ǝ B%7G +9>zzw+ ty矟? Kfo񣲲ckۂJBZH??:r?V*opݺn 3&lqv'+s{;QV%:c[e8}Yq3n G +Ϭ-:X=pck$,fDi'a+0+^N';}W;^MCP_F+fOEt2?o`Ocb)B8BB!x0(:>ToDĝs5H;i&x +endstream +endobj + +1082 0 obj +<> +stream +x]Ko6+<9ѠmjgiH%zwvgc9LȕHpƿϧ퐒6 Ƃ>! !gKL}SߕSp8Ð"gQCH~9P;&{cVVv>"pnQi/.޿/_zz.MީWxe4j\Nzzy2fp1s.ߔ +]*C&L + q*G)s{;uƦuҡ*׮hm]*K5d(ٜQ(-bruj'i 1yB-*)(ꀢS^W|(Ǿ|g .0".bGnOԥئ&lbUC!WU/Z.`gN gv.pA5N |iR',N-&߬5AzS#j'MYzwMdhIɠ\b'*>1㲆\į=cjrFDz)&7ڵ4Z|Fie-M$Bc kQ#\dƴb@:G-eFE`GkA~$F)^$#ܝxf55S!4k[< +wv~#~FG`XfB?oYG)(*pWL<8YW]]t|5 Zg] :LQ~wOBT ئ&cFDž⟌ +pJtc >&C6pp"f@3q8d+r/4*FfqM`5lJO.MW6iJR8e{,^Y#d"+o[ Rlanb[%R>7&0`Ie[$N[ {˪PѮ0M.ڥ6C$[8,ĞJf&nѡB`湙泔f607;-&E!I{q&9EWBsf*]I29DbV /_hnfa I /`[zUzqAN_/!c *됛U@[V_|p{ $dq0|l_Ab'=>qLl_#s0Z(tc]%v{w{K9pՓS0IdxR$◲"w,\~YOk^D/=k,][U<|Aѕlk@8GHcڴzD= Mf'6:]}|LOأm>ciS؋ ᔹx=#4 ="1Nc4`ig={A!2w48c +´gTzR4]Yr3vע_,>ߛL330)333nnE{ѡIf&n!eͤ|8ܸ8L%ݾ{)?33^~M,1u:r‹swY|gQvn /=[tvX~J' oon KGen5bғ3:nn?-n@ + b1&aZ90oqveLN.{p9^0 #* 7bQBffKV*%fis3Ux"# +Ab|quu,D1Zl2?oéƟ,O;RpŰ+Bq1榮C2n֋!x,wqM2Rw+>` +endstream +endobj + +1083 0 obj +<> +stream +x]M6+<rG9'&@H{PҮǞ[KE$rpTuJArvHI|cc..G6! ?g`Mys!?1h>~)vob唏lƩ^z7J|Mm:N)cWe^eYz뜺^h ^^ @=Mn\Hİ\\ U7(0S;YkadDq/_{#:c۾GnsgvujRxڦW䴏?D| -غQqlc唡̗=LT<=xЃ& <z(BВ8$P(b8$ya/AF 0%_]^jd0^NB!8!,0sqTk`809a{2GVO ^d=p N#4Y|f 7O7đ>p:H'[mM%_6>?5kuDw?|\;13,l#knNeCSdM3Hy)J>;JHCOkh"鎠蜗P%YcuJpA鄵sDem܅%썫 x +p[{)xL%ZaP?6i~#~ #bLO*W + +]e4v*U!=$'i%YwƬT01Cͩ?IQ5sB`ч ƆY߂FD='SHF7I8$X903aj>d'VpIyYw |2fp9*/ܤhsFKa㫫 ֶi2!2=(yH8CdUX܂G⭔[c7fvT 4s $aj#*(;Y4UEȈ`5uEU&*ׄ,x wب=jl @r`!TGS]ͦ.ZIXX0̢k.[ [ӪPM.53_ 13o60TF36a`.̊kTgdYI;">f%n@?4xqNP3|W?Nzq,Q.m.mv=$ۺ !`_rm"EiK\`_!7ⲋ/AunD[U+֯Vq++B |u B3Kѯq#GWˢ#>f >]>?FC.`YIwu{W2P()scRܼs&f`.$QWө 9qdMkY9Y+,+;fY9gn/ޕ'8x%MYҗT瘥([,P)If m!G`f0RcR]~Z8G1kR'TUziinqۿX_s݅ٯ2z +,VcnH'SМ NU;(:Y)!Haܥ+O@Ϲ9Y{ޮҠY{vډ]]Bz5.^Ty rWw.I>ƥl@XeW_=>>z1k[/}%>GA=f +ɣָ٢+eї?< @@FT[;U<|+П}2T[a@U%0' +лwBd(-lp=eeeeר8(]Yq20w Ve *Uf5*W(d}($nf%na86HqY຾(/Y|WTSJId3qxxǟ,G=RLpi&`6FRajO-c}mbv>m7's-SݽX +endstream +endobj + +1084 0 obj +<> +stream +xZKo#7 +:Ȅ6!@ sm(KYX 9" FփǏѳ9࿳P(LǯCt +NH5; )MVt~VX? Mc[MS(~ /R\]ϓ;kVA[?|q&烻{r㝇 +$>T +Www9| +3npT ^oy4L=뇟߇@qu"(};@T|0}sSʬ5jD^ +=1t5NvfY [Wlw?mc!- ڃrסn +A6̫Rlڄ;* + &>%E#z;(V7_`r"H2G + *⤝EH^QNpRRD4 =3t07 WQ,uL(0) &a>u ,(ì&U" 8O`5 6 gUI->e1m||qmξZە~ԞC?hQHY qUᬘm VrVYY76݆؆b"(EtI_= p7✒kxx!NE%t/56ţ[(Q7ݘE=W5Yg_&4q[J6 M~Mk|ފ{Gu5)"\J$ҝ@!2 W,&YS 't^5m[ڲ66nQ`݌W1k)Kkm"@S~o~qEX%ƪY'إxǝfFzSyP~[mc}mκ_lڧu)Cu.E)^} [0|qυZ}cR$d 80iXW,͇ DD+O(TjȞ 5;IM5%[n$pCWjI&9o= Nˌt2F`YՁRqKDZ[jr#@lC[fa,Ӈsd0RHٌH% -u$2XMyhТVqȂo-5d60rs҆  +9@[qEȹMHp喕dZ^ 5{ƺݽcBR|> +stream +x]mܸ +_ @/[>gih~gL6nvg=%|4_UgU!{n?g;c>1vI*N}+ks&z_wVT=wKadK+C.%f.eˤ__/~wowӵ߫ﯯ앱N~2sEGyr.?TWZ]}SrL'"z#tf]?7\cf LohWoT~kn~>S-1`Wa@1: n7 +c:a`5(_܎~S@`.%]]נ | QQ3Hi^D0g2N/1!;r\c!HfA~;5g䕚SjS@d~{gS>̇wNwޚ\0̛< 8#2X"vR _pFJòR8x|>7GvD*2kwrVSPb49Eu!$6~ +4qL#9lŰHЕ9:9IYoβ,`˼cLG.+]B~k"?(H5ҡ V`*.Qz'd\vg䄗ʎ@L+n/ЧXE4,6tTaZAP62nZ3}4wDbU +smpp> :j  ]@TQ4_èyF+ khJ< K=a_;bWJf)g {[YҐ ̜P:KaǶQqم lL/k4\38/D_4E5eݶNcs{LfXxK x~NCA%>yŃXy]bL%}M +͵KBRBAs4vמt hSؽгZK"jY={FʋVZʤ`x0^%% QRCM0IdjykƐr ͱıl +x(kU5 t\v6T:Hv)Uzy$hGet7f݅Gt.#-gߋHTRAoqjH ]/@ b~9u311g)b#{%S1o2ك)*ExYOFJFr4lWXd%  ٥:Y4þw"dMmtVkOڌ2!iZѪ+Y5jb~¤x(u OT[$H_θQa!'}'FG5QR:bH9l6ĄKYk,tf&zO[I38'swe#qc {lpư"ojU[0^vͥIK-,3򝃽haT}E#ɪb{S@Eh1RsV|SM`.bchQsB1_=<q(t3~?$ TxCӡ-{O٧u'tQ3F\!;}Kyq]w[aR'8̼Ùc4icMo+[QCo+= +1xs[{}e4)l*\3 *GcC$v,pRE$Ag]$e?8?O!_*7 ..< 32s3<"'fixY2H&q;-:@e,q={>Pɓ;o'{7/""Gf39=KlF:p `iAk(Ҋ)IQ-ŬYqCLMe.=3Ȋ2Xط}ARfq^x??~|~؏{,}(hɝw +uL煅aj; [4śHل@ .Ѹq78A/~^DtӵnQu!$c-ϋvy|e +bT 70G9;Tw"2/tD1{(溴0M#pvݮWg1'v(BaE`8]@c[wBSW;5W׽znMxI%$ =Bŧ8\\5c3,|g ڈ|xg"0$fOxb侌WL BAH8v?C*5>8mn/yjlT +&fZjQ%)[+,aHgfYKMwZ'R_ ZZu,x?/oX[ 7}^6XWK_B˳A[iк AflmPs45tnj,j3Z Mсı/> .f iW&l(+ʨ<+Tː۞煥kjSfFgkJB(C[eGf fhU:Z MUБqBųo5O&>a%|e с->OPdx_jx7W͋`A>I9 f4и8Ì |U@(0ϻ@6Ph+㧡}Xg-Mg-ìg`:]FmBZ1y?Q0{ فzsF +endstream +endobj + +1086 0 obj +<> +stream +x]m5+g{*U ѫ@P?qv7d33kN@p3ό;F'݇hMcs?jc#`Shx]7S- ncpl6oMXŸ7|Bjm/r/cEޤ/n(J+?:kqOl BE) 6H wf *W>lǧO^e={E;h\a-$q#Dh?4O2Ϯǭ (cbD5//\RP+Y2EUoU>*\< +}ٵ_X\LgT dmesjT +ՃĬortZ^&r]9Q{jɡ +P|aYX^tM5RY=M^h^]%Ldݺ$u=#FT:+ؙ>)س22swx0;Ɔ8M Z eϩ[ p#Ͻ*7L ===X +n-*M*ax0km 'oI%ߓW,2hj,bG +`IN3 o +if +N!r<(q __DˣVc4 Q,b=93Ood VYV+/YntVQ'9&#`'ʷdَKIet u!_n42Ԭ< ֥X"Z+QpZ9הZyPpyu2 3[ 0.dMnR;Ap9Xb%v*&9ꅶ˺&V BfxfR8 7|?7\Ww}-Ӵ.TlmʗauFb8sZb/FVF59S or )o:7K3,w|g*wv=L^bܬwdɎa!Ye7J vH-z,X^*Q6΋ވL0óFAi_^)/ +?`C@Z:HmB $S+wI""4LflRAݰ3;0MΉS)#RAg[PcoIZtDa )db$* $ ! +Zc*(<4˗*nqK߻TCCsMKʹF,A=.jNvSp]q@/շ}E` +endstream +endobj + +1087 0 obj +<> +stream +xYMo8+s.f8Ф[k`MvS@ =ВXTRˤ8_|e=#p\pY);O9%A],%W l3*CͨŬk? m CĐR=¢wiVz{5NK. nT3VotxջkWzs'ܫmtyM0| O\BFp㜇qĬ㹙DE !"Ɣ:!sF=.0[OxE"!5;$CCe6!`I!Y9P>NHqpIňgׇm*4zκ)/{i4$"bw=osso6ݨ<xG:&} 8Txf].K(;Cs:c'4Dj4 +Td֝ߕC uR2t[S.kcwfb5mYK2%)pTmɇIɴyEqk$͟a w_ 1; c[' ˻mK<^@8oQVۃ&` 91a.8+trV‘V#֊bjA" +t +);Op*Xy/M:PINuO,ðkc7tEIjߎ9BO3>CMS y%~KW>{Nrx/k=XIM\>Ԯt2Ĩv/YnK=UQX揽hIpobO=]luku=/bE Vku!a`g`vjL 0ñWXzM.G_fqQ!%ʺ +Lĉ;QAQsBSpjbki7 +endstream +endobj + +xref +0 1088 +0000000000 65535 f +0000000042 00000 n +0000000311 00000 n +0000000491 00000 n +0000000527 00000 n +0000000665 00000 n +0000000734 00000 n +0000000871 00000 n +0000001051 00000 n +0000001241 00000 n +0000001310 00000 n +0000001491 00000 n +0000001672 00000 n +0000001853 00000 n +0000002034 00000 n +0000002215 00000 n +0000002396 00000 n +0000002577 00000 n +0000002691 00000 n +0000002766 00000 n +0000002828 00000 n +0000002936 00000 n +0000006945 00000 n +0000007025 00000 n +0000007163 00000 n +0000007243 00000 n +0000007352 00000 n +0000007432 00000 n +0000007541 00000 n +0000007621 00000 n +0000007730 00000 n +0000007810 00000 n +0000007919 00000 n +0000007999 00000 n +0000008108 00000 n +0000008188 00000 n +0000008297 00000 n +0000008377 00000 n +0000008486 00000 n +0000008566 00000 n +0000008675 00000 n +0000008755 00000 n +0000008865 00000 n +0000008945 00000 n +0000009055 00000 n +0000009135 00000 n +0000009245 00000 n +0000009353 00000 n +0000009463 00000 n +0000009573 00000 n +0000009683 00000 n +0000009793 00000 n +0000009903 00000 n +0000009983 00000 n +0000010092 00000 n +0000010172 00000 n +0000010281 00000 n +0000010361 00000 n +0000010499 00000 n +0000010579 00000 n +0000010688 00000 n +0000010768 00000 n +0000010906 00000 n +0000010986 00000 n +0000011095 00000 n +0000011175 00000 n +0000011313 00000 n +0000011393 00000 n +0000011563 00000 n +0000011643 00000 n +0000011753 00000 n +0000011833 00000 n +0000011943 00000 n +0000012023 00000 n +0000012133 00000 n +0000012213 00000 n +0000012323 00000 n +0000012403 00000 n +0000012513 00000 n +0000012593 00000 n +0000012703 00000 n +0000012783 00000 n +0000012893 00000 n +0000012973 00000 n +0000013083 00000 n +0000013163 00000 n +0000013273 00000 n +0000013353 00000 n +0000013463 00000 n +0000013543 00000 n +0000013653 00000 n +0000013733 00000 n +0000013843 00000 n +0000013923 00000 n +0000014033 00000 n +0000014113 00000 n +0000014223 00000 n +0000014303 00000 n +0000014413 00000 n +0000014493 00000 n +0000014603 00000 n +0000014685 00000 n +0000014797 00000 n +0000014879 00000 n +0000014991 00000 n +0000015073 00000 n +0000015185 00000 n +0000015267 00000 n +0000015379 00000 n +0000015461 00000 n +0000015573 00000 n +0000015655 00000 n +0000015767 00000 n +0000015849 00000 n +0000015961 00000 n +0000016043 00000 n +0000016155 00000 n +0000016237 00000 n +0000016349 00000 n +0000016431 00000 n +0000016543 00000 n +0000016625 00000 n +0000016737 00000 n +0000016819 00000 n +0000016931 00000 n +0000017013 00000 n +0000017125 00000 n +0000017207 00000 n +0000017319 00000 n +0000017401 00000 n +0000017513 00000 n +0000017595 00000 n +0000017707 00000 n +0000017789 00000 n +0000017901 00000 n +0000017983 00000 n +0000018095 00000 n +0000018177 00000 n +0000018289 00000 n +0000018371 00000 n +0000018483 00000 n +0000018565 00000 n +0000018677 00000 n +0000018759 00000 n +0000018871 00000 n +0000018953 00000 n +0000019065 00000 n +0000019147 00000 n +0000019259 00000 n +0000019341 00000 n +0000019453 00000 n +0000019535 00000 n +0000019647 00000 n +0000019729 00000 n +0000019841 00000 n +0000019923 00000 n +0000020035 00000 n +0000020117 00000 n +0000020229 00000 n +0000020311 00000 n +0000020423 00000 n +0000020505 00000 n +0000020617 00000 n +0000020699 00000 n +0000020811 00000 n +0000020893 00000 n +0000021005 00000 n +0000021087 00000 n +0000021199 00000 n +0000021281 00000 n +0000021393 00000 n +0000021475 00000 n +0000021587 00000 n +0000021669 00000 n +0000021781 00000 n +0000021863 00000 n +0000021975 00000 n +0000022057 00000 n +0000022169 00000 n +0000022251 00000 n +0000022363 00000 n +0000022445 00000 n +0000022557 00000 n +0000022639 00000 n +0000022750 00000 n +0000022832 00000 n +0000022943 00000 n +0000023025 00000 n +0000023136 00000 n +0000023218 00000 n +0000023329 00000 n +0000023411 00000 n +0000023522 00000 n +0000023604 00000 n +0000023715 00000 n +0000023797 00000 n +0000023908 00000 n +0000023990 00000 n +0000024101 00000 n +0000024183 00000 n +0000024294 00000 n +0000024376 00000 n +0000024487 00000 n +0000024569 00000 n +0000024681 00000 n +0000024763 00000 n +0000024875 00000 n +0000024957 00000 n +0000025069 00000 n +0000025151 00000 n +0000025263 00000 n +0000025345 00000 n +0000025457 00000 n +0000025539 00000 n +0000025651 00000 n +0000025733 00000 n +0000025845 00000 n +0000025927 00000 n +0000026039 00000 n +0000026121 00000 n +0000026233 00000 n +0000026315 00000 n +0000026427 00000 n +0000026509 00000 n +0000026621 00000 n +0000026703 00000 n +0000026815 00000 n +0000026897 00000 n +0000027009 00000 n +0000027091 00000 n +0000027203 00000 n +0000027285 00000 n +0000027397 00000 n +0000027521 00000 n +0000027610 00000 n +0000027716 00000 n +0000027871 00000 n +0000027983 00000 n +0000028138 00000 n +0000028250 00000 n +0000028405 00000 n +0000028517 00000 n +0000028672 00000 n +0000028784 00000 n +0000028866 00000 n +0000029032 00000 n +0000029144 00000 n +0000029258 00000 n +0000029424 00000 n +0000029536 00000 n +0000029702 00000 n +0000029814 00000 n +0000029980 00000 n +0000030092 00000 n +0000030258 00000 n +0000030370 00000 n +0000030536 00000 n +0000030648 00000 n +0000030762 00000 n +0000030928 00000 n +0000031040 00000 n +0000031206 00000 n +0000031318 00000 n +0000031484 00000 n +0000031596 00000 n +0000031762 00000 n +0000031874 00000 n +0000032040 00000 n +0000032152 00000 n +0000032234 00000 n +0000032400 00000 n +0000032512 00000 n +0000032626 00000 n +0000032792 00000 n +0000032904 00000 n +0000033070 00000 n +0000033182 00000 n +0000033348 00000 n +0000033460 00000 n +0000033626 00000 n +0000033738 00000 n +0000033904 00000 n +0000034016 00000 n +0000034098 00000 n +0000034210 00000 n +0000034292 00000 n +0000034404 00000 n +0000034486 00000 n +0000034598 00000 n +0000034680 00000 n +0000034792 00000 n +0000034874 00000 n +0000034986 00000 n +0000035068 00000 n +0000035180 00000 n +0000035262 00000 n +0000035374 00000 n +0000035456 00000 n +0000035568 00000 n +0000035650 00000 n +0000035762 00000 n +0000035844 00000 n +0000035956 00000 n +0000036038 00000 n +0000036180 00000 n +0000036262 00000 n +0000036374 00000 n +0000036456 00000 n +0000036568 00000 n +0000036650 00000 n +0000036762 00000 n +0000036844 00000 n +0000036956 00000 n +0000037038 00000 n +0000037150 00000 n +0000037232 00000 n +0000037344 00000 n +0000037426 00000 n +0000037538 00000 n +0000037620 00000 n +0000037732 00000 n +0000037814 00000 n +0000037926 00000 n +0000038008 00000 n +0000038120 00000 n +0000038202 00000 n +0000038344 00000 n +0000038426 00000 n +0000038538 00000 n +0000038620 00000 n +0000038732 00000 n +0000038814 00000 n +0000038926 00000 n +0000039008 00000 n +0000039120 00000 n +0000039202 00000 n +0000039314 00000 n +0000039396 00000 n +0000039508 00000 n +0000039590 00000 n +0000039702 00000 n +0000039784 00000 n +0000039896 00000 n +0000039978 00000 n +0000040090 00000 n +0000040172 00000 n +0000040284 00000 n +0000040366 00000 n +0000040478 00000 n +0000040560 00000 n +0000040672 00000 n +0000040754 00000 n +0000040866 00000 n +0000040948 00000 n +0000041061 00000 n +0000041143 00000 n +0000041256 00000 n +0000041338 00000 n +0000041451 00000 n +0000041533 00000 n +0000041646 00000 n +0000041728 00000 n +0000041841 00000 n +0000041923 00000 n +0000042036 00000 n +0000042118 00000 n +0000042231 00000 n +0000042313 00000 n +0000042426 00000 n +0000042508 00000 n +0000042621 00000 n +0000042703 00000 n +0000042816 00000 n +0000042898 00000 n +0000043011 00000 n +0000043093 00000 n +0000043206 00000 n +0000043288 00000 n +0000043401 00000 n +0000043483 00000 n +0000043596 00000 n +0000043678 00000 n +0000043791 00000 n +0000043873 00000 n +0000043986 00000 n +0000044068 00000 n +0000044181 00000 n +0000044263 00000 n +0000044376 00000 n +0000044458 00000 n +0000044571 00000 n +0000044653 00000 n +0000044766 00000 n +0000044848 00000 n +0000044961 00000 n +0000045043 00000 n +0000045156 00000 n +0000045238 00000 n +0000045351 00000 n +0000045433 00000 n +0000045546 00000 n +0000045628 00000 n +0000045741 00000 n +0000045823 00000 n +0000045936 00000 n +0000046018 00000 n +0000046131 00000 n +0000046213 00000 n +0000046326 00000 n +0000046408 00000 n +0000046521 00000 n +0000046603 00000 n +0000046716 00000 n +0000046798 00000 n +0000046911 00000 n +0000046993 00000 n +0000047106 00000 n +0000047188 00000 n +0000047301 00000 n +0000047383 00000 n +0000047496 00000 n +0000047578 00000 n +0000047691 00000 n +0000047773 00000 n +0000047886 00000 n +0000047968 00000 n +0000048081 00000 n +0000048163 00000 n +0000048276 00000 n +0000048358 00000 n +0000048471 00000 n +0000048553 00000 n +0000048666 00000 n +0000048748 00000 n +0000048861 00000 n +0000048943 00000 n +0000049056 00000 n +0000049138 00000 n +0000049251 00000 n +0000049333 00000 n +0000049446 00000 n +0000049528 00000 n +0000049641 00000 n +0000049723 00000 n +0000049836 00000 n +0000049918 00000 n +0000050031 00000 n +0000050113 00000 n +0000050226 00000 n +0000050308 00000 n +0000050421 00000 n +0000050503 00000 n +0000050616 00000 n +0000050698 00000 n +0000050811 00000 n +0000050893 00000 n +0000051006 00000 n +0000051088 00000 n +0000051201 00000 n +0000051283 00000 n +0000051396 00000 n +0000051478 00000 n +0000051591 00000 n +0000051673 00000 n +0000051786 00000 n +0000051868 00000 n +0000051981 00000 n +0000052063 00000 n +0000052176 00000 n +0000052258 00000 n +0000052371 00000 n +0000052453 00000 n +0000052566 00000 n +0000052648 00000 n +0000052760 00000 n +0000052842 00000 n +0000052954 00000 n +0000053036 00000 n +0000053148 00000 n +0000053230 00000 n +0000053342 00000 n +0000053424 00000 n +0000053536 00000 n +0000053618 00000 n +0000053730 00000 n +0000053812 00000 n +0000053924 00000 n +0000054006 00000 n +0000054118 00000 n +0000054200 00000 n +0000054312 00000 n +0000054394 00000 n +0000054506 00000 n +0000054588 00000 n +0000054701 00000 n +0000054783 00000 n +0000054896 00000 n +0000054978 00000 n +0000055091 00000 n +0000055173 00000 n +0000055286 00000 n +0000055368 00000 n +0000055481 00000 n +0000055563 00000 n +0000055676 00000 n +0000055758 00000 n +0000055871 00000 n +0000055953 00000 n +0000056066 00000 n +0000056148 00000 n +0000056261 00000 n +0000056343 00000 n +0000056456 00000 n +0000056538 00000 n +0000056651 00000 n +0000056733 00000 n +0000056846 00000 n +0000056928 00000 n +0000057041 00000 n +0000057123 00000 n +0000057236 00000 n +0000057318 00000 n +0000057431 00000 n +0000057513 00000 n +0000057626 00000 n +0000057708 00000 n +0000057821 00000 n +0000057903 00000 n +0000058016 00000 n +0000058098 00000 n +0000058211 00000 n +0000058293 00000 n +0000058406 00000 n +0000058488 00000 n +0000058601 00000 n +0000058683 00000 n +0000058796 00000 n +0000058878 00000 n +0000058991 00000 n +0000059073 00000 n +0000059186 00000 n +0000059268 00000 n +0000059381 00000 n +0000059463 00000 n +0000059576 00000 n +0000059658 00000 n +0000059771 00000 n +0000059853 00000 n +0000059966 00000 n +0000060048 00000 n +0000060161 00000 n +0000060243 00000 n +0000060356 00000 n +0000060438 00000 n +0000060551 00000 n +0000060633 00000 n +0000060746 00000 n +0000060828 00000 n +0000060941 00000 n +0000061023 00000 n +0000061136 00000 n +0000061218 00000 n +0000061331 00000 n +0000061413 00000 n +0000061526 00000 n +0000061608 00000 n +0000061721 00000 n +0000061803 00000 n +0000061916 00000 n +0000061998 00000 n +0000062111 00000 n +0000062193 00000 n +0000062306 00000 n +0000062388 00000 n +0000062501 00000 n +0000062583 00000 n +0000062696 00000 n +0000062778 00000 n +0000062891 00000 n +0000062973 00000 n +0000063086 00000 n +0000063168 00000 n +0000063281 00000 n +0000063363 00000 n +0000063476 00000 n +0000063558 00000 n +0000063671 00000 n +0000063753 00000 n +0000063866 00000 n +0000063948 00000 n +0000064061 00000 n +0000064143 00000 n +0000064256 00000 n +0000064338 00000 n +0000064451 00000 n +0000064533 00000 n +0000064646 00000 n +0000064728 00000 n +0000064841 00000 n +0000064923 00000 n +0000065036 00000 n +0000065118 00000 n +0000065231 00000 n +0000065313 00000 n +0000065426 00000 n +0000065508 00000 n +0000065621 00000 n +0000065703 00000 n +0000065816 00000 n +0000065898 00000 n +0000066011 00000 n +0000066093 00000 n +0000066205 00000 n +0000066287 00000 n +0000066399 00000 n +0000066481 00000 n +0000066593 00000 n +0000066675 00000 n +0000066787 00000 n +0000066869 00000 n +0000066981 00000 n +0000067063 00000 n +0000067175 00000 n +0000067257 00000 n +0000067369 00000 n +0000067451 00000 n +0000067563 00000 n +0000067645 00000 n +0000067757 00000 n +0000067839 00000 n +0000067951 00000 n +0000068033 00000 n +0000068146 00000 n +0000068228 00000 n +0000068341 00000 n +0000068423 00000 n +0000068536 00000 n +0000068618 00000 n +0000068731 00000 n +0000068813 00000 n +0000068926 00000 n +0000069008 00000 n +0000069121 00000 n +0000069203 00000 n +0000069316 00000 n +0000069398 00000 n +0000069511 00000 n +0000069593 00000 n +0000069706 00000 n +0000069788 00000 n +0000069901 00000 n +0000069983 00000 n +0000070096 00000 n +0000070178 00000 n +0000070291 00000 n +0000070373 00000 n +0000070486 00000 n +0000070568 00000 n +0000070681 00000 n +0000070763 00000 n +0000070876 00000 n +0000070958 00000 n +0000071071 00000 n +0000071153 00000 n +0000071266 00000 n +0000071348 00000 n +0000071461 00000 n +0000071543 00000 n +0000071656 00000 n +0000071738 00000 n +0000071851 00000 n +0000071933 00000 n +0000072046 00000 n +0000072128 00000 n +0000072241 00000 n +0000072323 00000 n +0000072436 00000 n +0000072518 00000 n +0000072631 00000 n +0000072713 00000 n +0000072826 00000 n +0000072908 00000 n +0000073021 00000 n +0000073103 00000 n +0000073216 00000 n +0000073298 00000 n +0000073411 00000 n +0000073493 00000 n +0000073606 00000 n +0000073688 00000 n +0000073801 00000 n +0000073883 00000 n +0000073996 00000 n +0000074078 00000 n +0000074191 00000 n +0000074273 00000 n +0000074386 00000 n +0000074468 00000 n +0000074581 00000 n +0000074663 00000 n +0000074776 00000 n +0000074858 00000 n +0000074971 00000 n +0000075053 00000 n +0000075166 00000 n +0000075248 00000 n +0000075361 00000 n +0000075443 00000 n +0000075556 00000 n +0000075638 00000 n +0000075751 00000 n +0000075833 00000 n +0000075946 00000 n +0000076028 00000 n +0000076141 00000 n +0000076223 00000 n +0000076336 00000 n +0000076418 00000 n +0000076531 00000 n +0000076613 00000 n +0000076726 00000 n +0000076808 00000 n +0000076921 00000 n +0000077003 00000 n +0000077116 00000 n +0000077198 00000 n +0000077311 00000 n +0000077393 00000 n +0000077506 00000 n +0000077588 00000 n +0000077701 00000 n +0000077783 00000 n +0000077896 00000 n +0000077978 00000 n +0000078091 00000 n +0000078173 00000 n +0000078286 00000 n +0000078368 00000 n +0000078481 00000 n +0000078563 00000 n +0000078676 00000 n +0000078758 00000 n +0000078871 00000 n +0000078953 00000 n +0000079066 00000 n +0000079148 00000 n +0000079261 00000 n +0000079343 00000 n +0000079456 00000 n +0000079538 00000 n +0000079650 00000 n +0000079732 00000 n +0000079844 00000 n +0000079926 00000 n +0000080038 00000 n +0000080120 00000 n +0000080232 00000 n +0000080314 00000 n +0000080426 00000 n +0000080508 00000 n +0000080620 00000 n +0000080702 00000 n +0000080814 00000 n +0000080896 00000 n +0000081008 00000 n +0000081090 00000 n +0000081202 00000 n +0000081284 00000 n +0000081396 00000 n +0000081478 00000 n +0000081591 00000 n +0000081673 00000 n +0000081786 00000 n +0000081868 00000 n +0000081981 00000 n +0000082063 00000 n +0000082176 00000 n +0000082258 00000 n +0000082371 00000 n +0000082453 00000 n +0000082566 00000 n +0000082648 00000 n +0000082761 00000 n +0000082843 00000 n +0000082956 00000 n +0000083038 00000 n +0000083151 00000 n +0000083233 00000 n +0000083346 00000 n +0000083428 00000 n +0000083541 00000 n +0000083623 00000 n +0000083736 00000 n +0000083818 00000 n +0000083931 00000 n +0000084013 00000 n +0000084125 00000 n +0000084207 00000 n +0000084319 00000 n +0000084401 00000 n +0000084513 00000 n +0000084595 00000 n +0000084737 00000 n +0000084819 00000 n +0000084931 00000 n +0000085013 00000 n +0000085125 00000 n +0000085207 00000 n +0000085319 00000 n +0000085401 00000 n +0000085513 00000 n +0000085595 00000 n +0000085707 00000 n +0000085789 00000 n +0000085902 00000 n +0000085984 00000 n +0000086097 00000 n +0000086179 00000 n +0000086292 00000 n +0000086374 00000 n +0000086487 00000 n +0000086569 00000 n +0000086682 00000 n +0000086764 00000 n +0000086877 00000 n +0000086959 00000 n +0000087072 00000 n +0000087154 00000 n +0000087267 00000 n +0000087349 00000 n +0000087462 00000 n +0000087544 00000 n +0000087657 00000 n +0000087739 00000 n +0000087852 00000 n +0000087934 00000 n +0000088047 00000 n +0000088129 00000 n +0000088242 00000 n +0000088324 00000 n +0000088437 00000 n +0000088519 00000 n +0000088632 00000 n +0000088714 00000 n +0000088827 00000 n +0000088909 00000 n +0000089022 00000 n +0000089104 00000 n +0000089217 00000 n +0000089299 00000 n +0000089412 00000 n +0000089494 00000 n +0000089607 00000 n +0000089689 00000 n +0000089802 00000 n +0000089884 00000 n +0000089997 00000 n +0000090079 00000 n +0000090192 00000 n +0000090274 00000 n +0000090387 00000 n +0000090469 00000 n +0000090582 00000 n +0000090664 00000 n +0000090777 00000 n +0000090859 00000 n +0000090972 00000 n +0000091054 00000 n +0000091167 00000 n +0000091249 00000 n +0000091362 00000 n +0000091444 00000 n +0000091557 00000 n +0000091639 00000 n +0000091752 00000 n +0000091834 00000 n +0000091947 00000 n +0000092029 00000 n +0000092142 00000 n +0000092224 00000 n +0000092337 00000 n +0000092419 00000 n +0000092532 00000 n +0000092614 00000 n +0000092727 00000 n +0000092809 00000 n +0000092922 00000 n +0000093004 00000 n +0000093117 00000 n +0000093199 00000 n +0000093312 00000 n +0000093394 00000 n +0000093507 00000 n +0000093589 00000 n +0000093702 00000 n +0000093784 00000 n +0000093897 00000 n +0000093979 00000 n +0000094092 00000 n +0000094174 00000 n +0000094287 00000 n +0000094369 00000 n +0000094482 00000 n +0000094564 00000 n +0000094677 00000 n +0000094759 00000 n +0000094872 00000 n +0000094954 00000 n +0000095067 00000 n +0000095149 00000 n +0000095262 00000 n +0000095344 00000 n +0000095457 00000 n +0000095539 00000 n +0000095652 00000 n +0000095734 00000 n +0000095847 00000 n +0000095929 00000 n +0000096042 00000 n +0000096124 00000 n +0000096237 00000 n +0000096319 00000 n +0000096432 00000 n +0000096514 00000 n +0000096627 00000 n +0000096709 00000 n +0000096821 00000 n +0000096903 00000 n +0000097015 00000 n +0000097097 00000 n +0000097209 00000 n +0000097291 00000 n +0000097403 00000 n +0000097485 00000 n +0000097597 00000 n +0000097679 00000 n +0000097791 00000 n +0000097873 00000 n +0000097985 00000 n +0000098067 00000 n +0000098179 00000 n +0000098261 00000 n +0000098373 00000 n +0000098455 00000 n +0000098567 00000 n +0000098649 00000 n +0000098762 00000 n +0000098844 00000 n +0000098957 00000 n +0000099039 00000 n +0000099152 00000 n +0000099234 00000 n +0000099347 00000 n +0000099429 00000 n +0000099542 00000 n +0000099624 00000 n +0000099737 00000 n +0000099819 00000 n +0000099932 00000 n +0000100014 00000 n +0000100127 00000 n +0000100209 00000 n +0000100322 00000 n +0000100404 00000 n +0000100517 00000 n +0000100599 00000 n +0000100712 00000 n +0000100794 00000 n +0000100907 00000 n +0000100989 00000 n +0000101102 00000 n +0000101184 00000 n +0000101297 00000 n +0000101379 00000 n +0000101492 00000 n +0000101574 00000 n +0000101687 00000 n +0000101769 00000 n +0000101882 00000 n +0000101964 00000 n +0000102077 00000 n +0000102159 00000 n +0000102272 00000 n +0000102354 00000 n +0000102467 00000 n +0000102549 00000 n +0000102662 00000 n +0000102744 00000 n +0000102857 00000 n +0000102939 00000 n +0000103052 00000 n +0000103134 00000 n +0000103247 00000 n +0000103329 00000 n +0000103442 00000 n +0000103524 00000 n +0000103637 00000 n +0000103719 00000 n +0000103832 00000 n +0000103914 00000 n +0000104027 00000 n +0000104111 00000 n +0000104226 00000 n +0000104310 00000 n +0000104425 00000 n +0000104509 00000 n +0000104624 00000 n +0000104708 00000 n +0000104823 00000 n +0000104907 00000 n +0000105022 00000 n +0000105106 00000 n +0000105221 00000 n +0000105305 00000 n +0000105420 00000 n +0000105504 00000 n +0000105650 00000 n +0000105734 00000 n +0000105849 00000 n +0000105933 00000 n +0000106048 00000 n +0000106132 00000 n +0000106247 00000 n +0000106331 00000 n +0000106446 00000 n +0000106530 00000 n +0000106645 00000 n +0000106729 00000 n +0000106844 00000 n +0000106928 00000 n +0000107043 00000 n +0000107127 00000 n +0000107242 00000 n +0000107326 00000 n +0000107441 00000 n +0000107525 00000 n +0000107640 00000 n +0000107724 00000 n +0000107839 00000 n +0000107923 00000 n +0000108037 00000 n +0000108121 00000 n +0000108235 00000 n +0000108319 00000 n +0000108463 00000 n +0000108547 00000 n +0000108661 00000 n +0000108745 00000 n +0000108889 00000 n +0000108973 00000 n +0000109087 00000 n +0000109171 00000 n +0000109315 00000 n +0000109399 00000 n +0000109514 00000 n +0000109598 00000 n +0000109713 00000 n +0000109860 00000 n +0000110412 00000 n +0000111017 00000 n +0000111598 00000 n +0000112171 00000 n +0000112744 00000 n +0000112949 00000 n +0000113498 00000 n +0000114003 00000 n +0000114132 00000 n +0000114288 00000 n +0000136069 00000 n +0000136108 00000 n +0000136297 00000 n +0000152190 00000 n +0000152380 00000 n +0000152869 00000 n +0000153241 00000 n +0000157914 00000 n +0000158149 00000 n +0000158444 00000 n +0000158785 00000 n +0000160349 00000 n +0000164076 00000 n +0000167518 00000 n +0000170063 00000 n +0000172567 00000 n +0000175069 00000 n +0000176626 00000 n +0000179728 00000 n +0000182472 00000 n + +trailer +<<06F039787415B73971FC6874B09DE72A>]>> +startxref +183507 +%%EOF diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497655371975.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497655371975.pdf new file mode 100644 index 000000000..3d6d6e93a Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497655371975.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497655371976.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497655371976.pdf new file mode 100644 index 000000000..5b845b89e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497655371976.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497667941569.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497667941569.pdf new file mode 100644 index 000000000..565c684a3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497667941569.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497667941570.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497667941570.pdf new file mode 100644 index 000000000..a100cf3bc Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497667941570.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497671579889.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497671579889.pdf new file mode 100644 index 000000000..19e5beb5e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497671579889.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497678693624.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497678693624.pdf new file mode 100644 index 000000000..205ea7801 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497678693624.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497678693625.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497678693625.pdf new file mode 100644 index 000000000..73a407e4b Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497678693625.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497678694586.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497678694586.pdf new file mode 100644 index 000000000..ed671c16f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497678694586.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497680829648.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497680829648.pdf new file mode 100644 index 000000000..e7f0d53b7 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497680829648.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497680829649.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497680829649.pdf new file mode 100644 index 000000000..da6812a29 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497680829649.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711893730.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711893730.pdf new file mode 100644 index 000000000..679dee552 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711893730.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711926504.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711926504.pdf new file mode 100644 index 000000000..e9d571d44 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711926504.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711926505.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711926505.pdf new file mode 100644 index 000000000..959062124 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711926505.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711943916.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711943916.pdf new file mode 100644 index 000000000..ea16d81f6 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497711943916.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712208071.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712208071.pdf new file mode 100644 index 000000000..9c13aa755 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712208071.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712234733.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712234733.pdf new file mode 100644 index 000000000..03d8f0109 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712234733.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712234735.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712234735.pdf new file mode 100644 index 000000000..37efcb307 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712234735.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712284891.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712284891.pdf new file mode 100644 index 000000000..5bc94e85f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712284891.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712315613.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712315613.pdf new file mode 100644 index 000000000..34c6b7cfe Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712315613.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712344312.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712344312.pdf new file mode 100644 index 000000000..ba7eda6dc Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712344312.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712377052.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712377052.pdf new file mode 100644 index 000000000..a9bd75890 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712377052.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712377054.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712377054.pdf new file mode 100644 index 000000000..7efd2aac8 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712377054.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712398571.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712398571.pdf new file mode 100644 index 000000000..bfc104a85 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712398571.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712433357.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712433357.pdf new file mode 100644 index 000000000..07a013bb3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712433357.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712466131.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712466131.pdf new file mode 100644 index 000000000..299ec082a Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712466131.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712549072.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712549072.pdf new file mode 100644 index 000000000..34de6a97e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712549072.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712549073.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712549073.pdf new file mode 100644 index 000000000..bb46ebeb0 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712549073.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712663755.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712663755.pdf new file mode 100644 index 000000000..d41d18cb8 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712663755.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712727249.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712727249.pdf new file mode 100644 index 000000000..c9ecd4644 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712727249.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712786639.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712786639.pdf new file mode 100644 index 000000000..1e243ff52 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712786639.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712786640.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712786640.pdf new file mode 100644 index 000000000..0f238f457 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712786640.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712825570.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712825570.pdf new file mode 100644 index 000000000..fa2e95756 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712825570.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712825571.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712825571.pdf new file mode 100644 index 000000000..10ed8d8c5 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712825571.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712825572.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712825572.pdf new file mode 100644 index 000000000..3e5053309 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497712825572.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714726082.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714726082.pdf new file mode 100644 index 000000000..9a07e297d Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714726082.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714783466.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714783466.pdf new file mode 100644 index 000000000..7fe69182b Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714783466.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714783467.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714783467.pdf new file mode 100644 index 000000000..0e9996093 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714783467.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714818263.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714818263.pdf new file mode 100644 index 000000000..84a7fd20a Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/497714818263.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/503869989055.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/503869989055.pdf new file mode 100644 index 000000000..3abe83513 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/503869989055.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/505088001233.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/505088001233.pdf new file mode 100644 index 000000000..b79f35540 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/505088001233.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/505091686590.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/505091686590.pdf new file mode 100644 index 000000000..2d38c744f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/505091686590.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/manifest.json b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/manifest.json new file mode 100644 index 000000000..d424eb44a --- /dev/null +++ b/backend/documents_parser/tests/fixtures/pashub_accuracy_lrha_wave3/manifest.json @@ -0,0 +1,735 @@ +{ + "project_code": "LRHA WAVE 3", + "source": "hubspot_deal_data + uploaded_files (rd_sap_site_note) + S3", + "note": "pre_sap is pashub's own RdSAP rating; PDFs are image-stripped (text layer preserved). Rebuild with scripts/build_pashub_accuracy_fixtures.py", + "fixtures": [ + { + "deal_id": "460624817352", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "460624817352.pdf" + }, + { + "deal_id": "460624817354", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "460624817354.pdf" + }, + { + "deal_id": "461004430523", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "461004430523.pdf" + }, + { + "deal_id": "461004430524", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "461004430524.pdf" + }, + { + "deal_id": "461029305555", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "461029305555.pdf" + }, + { + "deal_id": "461029305556", + "uprn": null, + "pre_sap_raw": "E52", + "pre_sap_score": 52, + "pdf": "461029305556.pdf" + }, + { + "deal_id": "461029305557", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "461029305557.pdf" + }, + { + "deal_id": "461178278096", + "uprn": null, + "pre_sap_raw": "F28", + "pre_sap_score": 28, + "pdf": "461178278096.pdf" + }, + { + "deal_id": "461217879266", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "461217879266.pdf" + }, + { + "deal_id": "461286915318", + "uprn": null, + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "461286915318.pdf" + }, + { + "deal_id": "461288704205", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "461288704205.pdf" + }, + { + "deal_id": "461288704206", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "461288704206.pdf" + }, + { + "deal_id": "461337840844", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "461337840844.pdf" + }, + { + "deal_id": "461337840845", + "uprn": null, + "pre_sap_raw": "D68", + "pre_sap_score": 68, + "pdf": "461337840845.pdf" + }, + { + "deal_id": "461337840846", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "461337840846.pdf" + }, + { + "deal_id": "461337840847", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "461337840847.pdf" + }, + { + "deal_id": "461383047390", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "461383047390.pdf" + }, + { + "deal_id": "461383047391", + "uprn": null, + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "461383047391.pdf" + }, + { + "deal_id": "461386632387", + "uprn": null, + "pre_sap_raw": "E43", + "pre_sap_score": 43, + "pdf": "461386632387.pdf" + }, + { + "deal_id": "461386632388", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "461386632388.pdf" + }, + { + "deal_id": "461386632390", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "461386632390.pdf" + }, + { + "deal_id": "461388438725", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "461388438725.pdf" + }, + { + "deal_id": "461388438726", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "461388438726.pdf" + }, + { + "deal_id": "461462566131", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "461462566131.pdf" + }, + { + "deal_id": "461579561166", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "461579561166.pdf" + }, + { + "deal_id": "461579561167", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "461579561167.pdf" + }, + { + "deal_id": "461605300410", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "461605300410.pdf" + }, + { + "deal_id": "461753041085", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "461753041085.pdf" + }, + { + "deal_id": "461900138689", + "uprn": null, + "pre_sap_raw": "D55", + "pre_sap_score": 55, + "pdf": "461900138689.pdf" + }, + { + "deal_id": "461977125103", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "461977125103.pdf" + }, + { + "deal_id": "461989738731", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "461989738731.pdf" + }, + { + "deal_id": "461989738732", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "461989738732.pdf" + }, + { + "deal_id": "461989738733", + "uprn": null, + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "461989738733.pdf" + }, + { + "deal_id": "461996268736", + "uprn": null, + "pre_sap_raw": "D57", + "pre_sap_score": 57, + "pdf": "461996268736.pdf" + }, + { + "deal_id": "461998049475", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "461998049475.pdf" + }, + { + "deal_id": "462019645662", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "462019645662.pdf" + }, + { + "deal_id": "462019682526", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "462019682526.pdf" + }, + { + "deal_id": "462019682527", + "uprn": null, + "pre_sap_raw": "E54", + "pre_sap_score": 54, + "pdf": "462019682527.pdf" + }, + { + "deal_id": "462024626384", + "uprn": null, + "pre_sap_raw": "E46", + "pre_sap_score": 46, + "pdf": "462024626384.pdf" + }, + { + "deal_id": "462028222693", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "462028222693.pdf" + }, + { + "deal_id": "462030021826", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "462030021826.pdf" + }, + { + "deal_id": "462030021827", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "462030021827.pdf" + }, + { + "deal_id": "462033604837", + "uprn": null, + "pre_sap_raw": "D55", + "pre_sap_score": 55, + "pdf": "462033604837.pdf" + }, + { + "deal_id": "462033604838", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "462033604838.pdf" + }, + { + "deal_id": "462033604839", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "462033604839.pdf" + }, + { + "deal_id": "462048022734", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "462048022734.pdf" + }, + { + "deal_id": "462051619031", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "462051619031.pdf" + }, + { + "deal_id": "462053415135", + "uprn": null, + "pre_sap_raw": "D56", + "pre_sap_score": 56, + "pdf": "462053415135.pdf" + }, + { + "deal_id": "462055212240", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "462055212240.pdf" + }, + { + "deal_id": "462055212241", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "462055212241.pdf" + }, + { + "deal_id": "462057039040", + "uprn": null, + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "462057039040.pdf" + }, + { + "deal_id": "462057039041", + "uprn": null, + "pre_sap_raw": "E50", + "pre_sap_score": 50, + "pdf": "462057039041.pdf" + }, + { + "deal_id": "462067937493", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "462067937493.pdf" + }, + { + "deal_id": "462071529680", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "462071529680.pdf" + }, + { + "deal_id": "462075146479", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "462075146479.pdf" + }, + { + "deal_id": "462078769375", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "462078769375.pdf" + }, + { + "deal_id": "462078769376", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "462078769376.pdf" + }, + { + "deal_id": "462080566489", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "462080566489.pdf" + }, + { + "deal_id": "462080566490", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "462080566490.pdf" + }, + { + "deal_id": "497602074839", + "uprn": null, + "pre_sap_raw": "D57", + "pre_sap_score": 57, + "pdf": "497602074839.pdf" + }, + { + "deal_id": "497650046199", + "uprn": null, + "pre_sap_raw": "E53", + "pre_sap_score": 53, + "pdf": "497650046199.pdf" + }, + { + "deal_id": "497650046200", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "497650046200.pdf" + }, + { + "deal_id": "497655371974", + "uprn": null, + "pre_sap_raw": "E43", + "pre_sap_score": 43, + "pdf": "497655371974.pdf" + }, + { + "deal_id": "497655371975", + "uprn": null, + "pre_sap_raw": "D57", + "pre_sap_score": 57, + "pdf": "497655371975.pdf" + }, + { + "deal_id": "497655371976", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "497655371976.pdf" + }, + { + "deal_id": "497667941569", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "497667941569.pdf" + }, + { + "deal_id": "497667941570", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "497667941570.pdf" + }, + { + "deal_id": "497671579889", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "497671579889.pdf" + }, + { + "deal_id": "497678693624", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "497678693624.pdf" + }, + { + "deal_id": "497678693625", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "497678693625.pdf" + }, + { + "deal_id": "497678694586", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "497678694586.pdf" + }, + { + "deal_id": "497680829648", + "uprn": null, + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "497680829648.pdf" + }, + { + "deal_id": "497680829649", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "497680829649.pdf" + }, + { + "deal_id": "497711893730", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "497711893730.pdf" + }, + { + "deal_id": "497711926504", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "497711926504.pdf" + }, + { + "deal_id": "497711926505", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "497711926505.pdf" + }, + { + "deal_id": "497711943916", + "uprn": null, + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "497711943916.pdf" + }, + { + "deal_id": "497712208071", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "497712208071.pdf" + }, + { + "deal_id": "497712234733", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "497712234733.pdf" + }, + { + "deal_id": "497712234735", + "uprn": null, + "pre_sap_raw": "E49", + "pre_sap_score": 49, + "pdf": "497712234735.pdf" + }, + { + "deal_id": "497712284891", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "497712284891.pdf" + }, + { + "deal_id": "497712315613", + "uprn": null, + "pre_sap_raw": "D55", + "pre_sap_score": 55, + "pdf": "497712315613.pdf" + }, + { + "deal_id": "497712344312", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "497712344312.pdf" + }, + { + "deal_id": "497712377052", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "497712377052.pdf" + }, + { + "deal_id": "497712377054", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "497712377054.pdf" + }, + { + "deal_id": "497712398571", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "497712398571.pdf" + }, + { + "deal_id": "497712433357", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "497712433357.pdf" + }, + { + "deal_id": "497712466131", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "497712466131.pdf" + }, + { + "deal_id": "497712549072", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "497712549072.pdf" + }, + { + "deal_id": "497712549073", + "uprn": null, + "pre_sap_raw": "E50", + "pre_sap_score": 50, + "pdf": "497712549073.pdf" + }, + { + "deal_id": "497712663755", + "uprn": null, + "pre_sap_raw": "D55", + "pre_sap_score": 55, + "pdf": "497712663755.pdf" + }, + { + "deal_id": "497712727249", + "uprn": null, + "pre_sap_raw": "D55", + "pre_sap_score": 55, + "pdf": "497712727249.pdf" + }, + { + "deal_id": "497712786639", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "497712786639.pdf" + }, + { + "deal_id": "497712786640", + "uprn": null, + "pre_sap_raw": "D56", + "pre_sap_score": 56, + "pdf": "497712786640.pdf" + }, + { + "deal_id": "497712825570", + "uprn": null, + "pre_sap_raw": "F30", + "pre_sap_score": 30, + "pdf": "497712825570.pdf" + }, + { + "deal_id": "497712825571", + "uprn": null, + "pre_sap_raw": "E53", + "pre_sap_score": 53, + "pdf": "497712825571.pdf" + }, + { + "deal_id": "497712825572", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "497712825572.pdf" + }, + { + "deal_id": "497714726082", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "497714726082.pdf" + }, + { + "deal_id": "497714783466", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "497714783466.pdf" + }, + { + "deal_id": "497714783467", + "uprn": null, + "pre_sap_raw": "D56", + "pre_sap_score": 56, + "pdf": "497714783467.pdf" + }, + { + "deal_id": "497714818263", + "uprn": null, + "pre_sap_raw": "E54", + "pre_sap_score": 54, + "pdf": "497714818263.pdf" + }, + { + "deal_id": "503869989055", + "uprn": null, + "pre_sap_raw": "D57", + "pre_sap_score": 57, + "pdf": "503869989055.pdf" + }, + { + "deal_id": "505088001233", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "505088001233.pdf" + }, + { + "deal_id": "505091686590", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "505091686590.pdf" + } + ] +} diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707334.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707334.pdf new file mode 100644 index 000000000..b613b0b5f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707334.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707335.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707335.pdf new file mode 100644 index 000000000..c7ff2931a Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707335.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707336.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707336.pdf new file mode 100644 index 000000000..638113bad Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707336.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707337.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707337.pdf new file mode 100644 index 000000000..17251d114 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500671707337.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500677104834.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500677104834.pdf new file mode 100644 index 000000000..7af702b35 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500677104834.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664451.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664451.pdf new file mode 100644 index 000000000..aad54ae79 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664451.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664452.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664452.pdf new file mode 100644 index 000000000..baeba6654 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664452.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664453.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664453.pdf new file mode 100644 index 000000000..701acd2fc Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664453.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664454.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664454.pdf new file mode 100644 index 000000000..082818046 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664454.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664455.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664455.pdf new file mode 100644 index 000000000..29ad65c26 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500717664455.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659230.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659230.pdf new file mode 100644 index 000000000..0e89acb9f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659230.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659233.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659233.pdf new file mode 100644 index 000000000..79d1638e5 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659233.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659234.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659234.pdf new file mode 100644 index 000000000..4d61b5951 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659234.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659235.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659235.pdf new file mode 100644 index 000000000..eaf722483 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500719659235.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500721469635.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500721469635.pdf new file mode 100644 index 000000000..ab35a5c94 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500721469635.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500721469636.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500721469636.pdf new file mode 100644 index 000000000..f351d7ac5 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500721469636.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500738218187.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500738218187.pdf new file mode 100644 index 000000000..d71c785c0 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500738218187.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500738218188.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500738218188.pdf new file mode 100644 index 000000000..bec8e8f6c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500738218188.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500738218190.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500738218190.pdf new file mode 100644 index 000000000..f5a2c5e59 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500738218190.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190667.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190667.pdf new file mode 100644 index 000000000..5d280c269 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190667.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190668.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190668.pdf new file mode 100644 index 000000000..d5f72b9ae Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190668.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190669.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190669.pdf new file mode 100644 index 000000000..189224199 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190669.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190670.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190670.pdf new file mode 100644 index 000000000..049df575c --- /dev/null +++ b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190670.pdf @@ -0,0 +1,6614 @@ +%PDF-1.4 +%µ¶ +% Written by MuPDF 1.29.0 + +1 0 obj +<> +endobj + +2 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1264 0 R/StructParents 0/Parent 18 0 R>> +endobj + +3 0 obj +<> +endobj + +4 0 obj +<> +endobj + +5 0 obj +<> +endobj + +6 0 obj +<> +endobj + +7 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1265 0 R/StructParents 1/Parent 18 0 R>> +endobj + +8 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1266 0 R/StructParents 2/Parent 18 0 R>> +endobj + +9 0 obj +<> +endobj + +10 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1267 0 R/StructParents 3/Parent 18 0 R>> +endobj + +11 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1268 0 R/StructParents 4/Parent 18 0 R>> +endobj + +12 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1269 0 R/StructParents 5/Parent 18 0 R>> +endobj + +13 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1270 0 R/StructParents 6/Parent 18 0 R>> +endobj + +14 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1271 0 R/StructParents 7/Parent 18 0 R>> +endobj + +15 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1272 0 R/StructParents 8/Parent 19 0 R>> +endobj + +16 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1273 0 R/StructParents 9/Parent 19 0 R>> +endobj + +17 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1274 0 R/StructParents 10/Parent 19 0 R>> +endobj + +18 0 obj +<> +endobj + +19 0 obj +<> +endobj + +20 0 obj +<> +endobj + +21 0 obj +<> +endobj + +22 0 obj +<> +endobj + +23 0 obj +<> +endobj + +24 0 obj +<><>]/ID(node00000003)>> +endobj + +25 0 obj +<> +endobj + +26 0 obj +<>]/ID(node00000025)>> +endobj + +27 0 obj +<> +endobj + +28 0 obj +<>]/ID(node00000026)>> +endobj + +29 0 obj +<> +endobj + +30 0 obj +<>]/ID(node00000029)>> +endobj + +31 0 obj +<> +endobj + +32 0 obj +<>]/ID(node00000031)>> +endobj + +33 0 obj +<> +endobj + +34 0 obj +<>]/ID(node00000034)>> +endobj + +35 0 obj +<> +endobj + +36 0 obj +<>]/ID(node00000036)>> +endobj + +37 0 obj +<> +endobj + +38 0 obj +<>]/ID(node00000038)>> +endobj + +39 0 obj +<> +endobj + +40 0 obj +<>]/ID(node00000040)>> +endobj + +41 0 obj +<> +endobj + +42 0 obj +<>]/ID(node00000042)>> +endobj + +43 0 obj +<> +endobj + +44 0 obj +<>]/ID(node00000044)>> +endobj + +45 0 obj +<> +endobj + +46 0 obj +<>]/ID(node00000046)>> +endobj + +47 0 obj +<> +endobj + +48 0 obj +<>]/ID(node00000048)>> +endobj + +49 0 obj +<>]/ID(node00000007)>> +endobj + +50 0 obj +<>]/ID(node00000008)>> +endobj + +51 0 obj +<>]/ID(node00000009)>> +endobj + +52 0 obj +<>]/ID(node00000010)>> +endobj + +53 0 obj +<> +endobj + +54 0 obj +<>]/ID(node00000012)>> +endobj + +55 0 obj +<> +endobj + +56 0 obj +<>]/ID(node00000013)>> +endobj + +57 0 obj +<> +endobj + +58 0 obj +<><>]/ID(node00000061)>> +endobj + +59 0 obj +<> +endobj + +60 0 obj +<>]/ID(node00000063)>> +endobj + +61 0 obj +<> +endobj + +62 0 obj +<><>]/ID(node00000065)>> +endobj + +63 0 obj +<> +endobj + +64 0 obj +<>]/ID(node00000067)>> +endobj + +65 0 obj +<> +endobj + +66 0 obj +<>]/ID(node00000070)>> +endobj + +67 0 obj +<> +endobj + +68 0 obj +<>]/ID(node00000072)>> +endobj + +69 0 obj +<> +endobj + +70 0 obj +<>]/ID(node00000075)>> +endobj + +71 0 obj +<> +endobj + +72 0 obj +<>]/ID(node00000077)>> +endobj + +73 0 obj +<> +endobj + +74 0 obj +<>]/ID(node00000080)>> +endobj + +75 0 obj +<> +endobj + +76 0 obj +<>]/ID(node00000082)>> +endobj + +77 0 obj +<> +endobj + +78 0 obj +<>]/ID(node00000085)>> +endobj + +79 0 obj +<> +endobj + +80 0 obj +<>]/ID(node00000087)>> +endobj + +81 0 obj +<> +endobj + +82 0 obj +<>]/ID(node00000090)>> +endobj + +83 0 obj +<> +endobj + +84 0 obj +<>]/ID(node00000092)>> +endobj + +85 0 obj +<> +endobj + +86 0 obj +<>]/ID(node00000095)>> +endobj + +87 0 obj +<> +endobj + +88 0 obj +<>]/ID(node00000097)>> +endobj + +89 0 obj +<> +endobj + +90 0 obj +<>]/ID(node00000100)>> +endobj + +91 0 obj +<> +endobj + +92 0 obj +<>]/ID(node00000102)>> +endobj + +93 0 obj +<> +endobj + +94 0 obj +<>]/ID(node00000105)>> +endobj + +95 0 obj +<> +endobj + +96 0 obj +<>]/ID(node00000107)>> +endobj + +97 0 obj +<> +endobj + +98 0 obj +<>]/ID(node00000110)>> +endobj + +99 0 obj +<> +endobj + +100 0 obj +<>]/ID(node00000112)>> +endobj + +101 0 obj +<> +endobj + +102 0 obj +<>]/ID(node00000115)>> +endobj + +103 0 obj +<> +endobj + +104 0 obj +<>]/ID(node00000117)>> +endobj + +105 0 obj +<> +endobj + +106 0 obj +<>]/ID(node00000121)>> +endobj + +107 0 obj +<> +endobj + +108 0 obj +<>]/ID(node00000123)>> +endobj + +109 0 obj +<> +endobj + +110 0 obj +<>]/ID(node00000126)>> +endobj + +111 0 obj +<> +endobj + +112 0 obj +<>]/ID(node00000128)>> +endobj + +113 0 obj +<> +endobj + +114 0 obj +<>]/ID(node00000131)>> +endobj + +115 0 obj +<> +endobj + +116 0 obj +<>]/ID(node00000133)>> +endobj + +117 0 obj +<> +endobj + +118 0 obj +<>]/ID(node00000136)>> +endobj + +119 0 obj +<> +endobj + +120 0 obj +<>]/ID(node00000138)>> +endobj + +121 0 obj +<> +endobj + +122 0 obj +<>]/ID(node00000142)>> +endobj + +123 0 obj +<> +endobj + +124 0 obj +<>]/ID(node00000144)>> +endobj + +125 0 obj +<> +endobj + +126 0 obj +<>]/ID(node00000148)>> +endobj + +127 0 obj +<> +endobj + +128 0 obj +<>]/ID(node00000151)>> +endobj + +129 0 obj +<> +endobj + +130 0 obj +<>]/ID(node00000154)>> +endobj + +131 0 obj +<> +endobj + +132 0 obj +<>]/ID(node00000156)>> +endobj + +133 0 obj +<> +endobj + +134 0 obj +<>]/ID(node00000159)>> +endobj + +135 0 obj +<> +endobj + +136 0 obj +<>]/ID(node00000161)>> +endobj + +137 0 obj +<> +endobj + +138 0 obj +<>]/ID(node00000164)>> +endobj + +139 0 obj +<> +endobj + +140 0 obj +<>]/ID(node00000166)>> +endobj + +141 0 obj +<> +endobj + +142 0 obj +<>]/ID(node00000169)>> +endobj + +143 0 obj +<> +endobj + +144 0 obj +<>]/ID(node00000171)>> +endobj + +145 0 obj +<> +endobj + +146 0 obj +<>]/ID(node00000175)>> +endobj + +147 0 obj +<> +endobj + +148 0 obj +<>]/ID(node00000177)>> +endobj + +149 0 obj +<> +endobj + +150 0 obj +<>]/ID(node00000180)>> +endobj + +151 0 obj +<> +endobj + +152 0 obj +<>]/ID(node00000182)>> +endobj + +153 0 obj +<> +endobj + +154 0 obj +<>]/ID(node00000186)>> +endobj + +155 0 obj +<> +endobj + +156 0 obj +<>]/ID(node00000188)>> +endobj + +157 0 obj +<> +endobj + +158 0 obj +<>]/ID(node00000191)>> +endobj + +159 0 obj +<> +endobj + +160 0 obj +<>]/ID(node00000193)>> +endobj + +161 0 obj +<> +endobj + +162 0 obj +<>]/ID(node00000196)>> +endobj + +163 0 obj +<> +endobj + +164 0 obj +<>]/ID(node00000198)>> +endobj + +165 0 obj +<> +endobj + +166 0 obj +<>]/ID(node00000202)>> +endobj + +167 0 obj +<> +endobj + +168 0 obj +<>]/ID(node00000204)>> +endobj + +169 0 obj +<> +endobj + +170 0 obj +<>]/ID(node00000207)>> +endobj + +171 0 obj +<> +endobj + +172 0 obj +<>]/ID(node00000209)>> +endobj + +173 0 obj +<> +endobj + +174 0 obj +<>]/ID(node00000212)>> +endobj + +175 0 obj +<> +endobj + +176 0 obj +<>]/ID(node00000214)>> +endobj + +177 0 obj +<> +endobj + +178 0 obj +<>]/ID(node00000217)>> +endobj + +179 0 obj +<> +endobj + +180 0 obj +<>]/ID(node00000219)>> +endobj + +181 0 obj +<> +endobj + +182 0 obj +<>]/ID(node00000222)>> +endobj + +183 0 obj +<> +endobj + +184 0 obj +<>]/ID(node00000224)>> +endobj + +185 0 obj +<> +endobj + +186 0 obj +<>]/ID(node00000228)>> +endobj + +187 0 obj +<> +endobj + +188 0 obj +<> +endobj + +189 0 obj +<> +endobj + +190 0 obj +<><><>]/ID(node00000233)>> +endobj + +191 0 obj +<>]/ID(node00000234)>> +endobj + +192 0 obj +<><><>]/ID(node00000235)>> +endobj + +193 0 obj +<>]/ID(node00000236)>> +endobj + +194 0 obj +<><><>]/ID(node00000237)>> +endobj + +195 0 obj +<>]/ID(node00000238)>> +endobj + +196 0 obj +<><><>]/ID(node00000239)>> +endobj + +197 0 obj +<>]/ID(node00000240)>> +endobj + +198 0 obj +<> +endobj + +199 0 obj +<><><>]/ID(node00000243)>> +endobj + +200 0 obj +<>]/ID(node00000244)>> +endobj + +201 0 obj +<> +endobj + +202 0 obj +<><><>]/ID(node00000246)>> +endobj + +203 0 obj +<>]/ID(node00000247)>> +endobj + +204 0 obj +<><><>]/ID(node00000248)>> +endobj + +205 0 obj +<>]/ID(node00000249)>> +endobj + +206 0 obj +<><><>]/ID(node00000250)>> +endobj + +207 0 obj +<>]/ID(node00000251)>> +endobj + +208 0 obj +<><><>]/ID(node00000252)>> +endobj + +209 0 obj +<>]/ID(node00000253)>> +endobj + +210 0 obj +<><><>]/ID(node00000254)>> +endobj + +211 0 obj +<>]/ID(node00000255)>> +endobj + +212 0 obj +<> +endobj + +213 0 obj +<><><>]/ID(node00000257)>> +endobj + +214 0 obj +<>]/ID(node00000258)>> +endobj + +215 0 obj +<><><>]/ID(node00000259)>> +endobj + +216 0 obj +<>]/ID(node00000260)>> +endobj + +217 0 obj +<><><>]/ID(node00000261)>> +endobj + +218 0 obj +<>]/ID(node00000262)>> +endobj + +219 0 obj +<><><>]/ID(node00000263)>> +endobj + +220 0 obj +<>]/ID(node00000264)>> +endobj + +221 0 obj +<><><>]/ID(node00000265)>> +endobj + +222 0 obj +<>]/ID(node00000266)>> +endobj + +223 0 obj +<> +endobj + +224 0 obj +<>]/ID(node00000270)>> +endobj + +225 0 obj +<> +endobj + +226 0 obj +<>]/ID(node00000273)>> +endobj + +227 0 obj +<> +endobj + +228 0 obj +<>]/ID(node00000276)>> +endobj + +229 0 obj +<> +endobj + +230 0 obj +<>]/ID(node00000278)>> +endobj + +231 0 obj +<> +endobj + +232 0 obj +<>]/ID(node00000281)>> +endobj + +233 0 obj +<> +endobj + +234 0 obj +<>]/ID(node00000283)>> +endobj + +235 0 obj +<> +endobj + +236 0 obj +<>]/ID(node00000286)>> +endobj + +237 0 obj +<> +endobj + +238 0 obj +<>]/ID(node00000288)>> +endobj + +239 0 obj +<> +endobj + +240 0 obj +<>]/ID(node00000291)>> +endobj + +241 0 obj +<> +endobj + +242 0 obj +<>]/ID(node00000293)>> +endobj + +243 0 obj +<> +endobj + +244 0 obj +<><>]/ID(node00000297)>> +endobj + +245 0 obj +<> +endobj + +246 0 obj +<>]/ID(node00000299)>> +endobj + +247 0 obj +<> +endobj + +248 0 obj +<>]/ID(node00000303)>> +endobj + +249 0 obj +<> +endobj + +250 0 obj +<>]/ID(node00000305)>> +endobj + +251 0 obj +<> +endobj + +252 0 obj +<>]/ID(node00000309)>> +endobj + +253 0 obj +<> +endobj + +254 0 obj +<>]/ID(node00000312)>> +endobj + +255 0 obj +<> +endobj + +256 0 obj +<>]/ID(node00000315)>> +endobj + +257 0 obj +<> +endobj + +258 0 obj +<>]/ID(node00000317)>> +endobj + +259 0 obj +<> +endobj + +260 0 obj +<>]/ID(node00000320)>> +endobj + +261 0 obj +<> +endobj + +262 0 obj +<>]/ID(node00000322)>> +endobj + +263 0 obj +<> +endobj + +264 0 obj +<>]/ID(node00000325)>> +endobj + +265 0 obj +<> +endobj + +266 0 obj +<>]/ID(node00000327)>> +endobj + +267 0 obj +<> +endobj + +268 0 obj +<>]/ID(node00000330)>> +endobj + +269 0 obj +<> +endobj + +270 0 obj +<>]/ID(node00000332)>> +endobj + +271 0 obj +<> +endobj + +272 0 obj +<>]/ID(node00000335)>> +endobj + +273 0 obj +<> +endobj + +274 0 obj +<>]/ID(node00000337)>> +endobj + +275 0 obj +<> +endobj + +276 0 obj +<>]/ID(node00000340)>> +endobj + +277 0 obj +<> +endobj + +278 0 obj +<>]/ID(node00000342)>> +endobj + +279 0 obj +<> +endobj + +280 0 obj +<>]/ID(node00000345)>> +endobj + +281 0 obj +<> +endobj + +282 0 obj +<>]/ID(node00000347)>> +endobj + +283 0 obj +<> +endobj + +284 0 obj +<>]/ID(node00000350)>> +endobj + +285 0 obj +<> +endobj + +286 0 obj +<>]/ID(node00000352)>> +endobj + +287 0 obj +<> +endobj + +288 0 obj +<>]/ID(node00000355)>> +endobj + +289 0 obj +<> +endobj + +290 0 obj +<>]/ID(node00000357)>> +endobj + +291 0 obj +<> +endobj + +292 0 obj +<>]/ID(node00000360)>> +endobj + +293 0 obj +<> +endobj + +294 0 obj +<>]/ID(node00000362)>> +endobj + +295 0 obj +<> +endobj + +296 0 obj +<>]/ID(node00000365)>> +endobj + +297 0 obj +<> +endobj + +298 0 obj +<>]/ID(node00000367)>> +endobj + +299 0 obj +<> +endobj + +300 0 obj +<>]/ID(node00000371)>> +endobj + +301 0 obj +<> +endobj + +302 0 obj +<>]/ID(node00000374)>> +endobj + +303 0 obj +<> +endobj + +304 0 obj +<>]/ID(node00000376)>> +endobj + +305 0 obj +<> +endobj + +306 0 obj +<>]/ID(node00000379)>> +endobj + +307 0 obj +<> +endobj + +308 0 obj +<>]/ID(node00000381)>> +endobj + +309 0 obj +<> +endobj + +310 0 obj +<>]/ID(node00000384)>> +endobj + +311 0 obj +<> +endobj + +312 0 obj +<>]/ID(node00000386)>> +endobj + +313 0 obj +<> +endobj + +314 0 obj +<>]/ID(node00000389)>> +endobj + +315 0 obj +<> +endobj + +316 0 obj +<>]/ID(node00000391)>> +endobj + +317 0 obj +<> +endobj + +318 0 obj +<>]/ID(node00000394)>> +endobj + +319 0 obj +<> +endobj + +320 0 obj +<>]/ID(node00000396)>> +endobj + +321 0 obj +<> +endobj + +322 0 obj +<>]/ID(node00000399)>> +endobj + +323 0 obj +<> +endobj + +324 0 obj +<>]/ID(node00000401)>> +endobj + +325 0 obj +<> +endobj + +326 0 obj +<>]/ID(node00000404)>> +endobj + +327 0 obj +<> +endobj + +328 0 obj +<>]/ID(node00000406)>> +endobj + +329 0 obj +<> +endobj + +330 0 obj +<>]/ID(node00000409)>> +endobj + +331 0 obj +<> +endobj + +332 0 obj +<>]/ID(node00000411)>> +endobj + +333 0 obj +<> +endobj + +334 0 obj +<>]/ID(node00000414)>> +endobj + +335 0 obj +<> +endobj + +336 0 obj +<>]/ID(node00000416)>> +endobj + +337 0 obj +<> +endobj + +338 0 obj +<>]/ID(node00000419)>> +endobj + +339 0 obj +<> +endobj + +340 0 obj +<>]/ID(node00000421)>> +endobj + +341 0 obj +<> +endobj + +342 0 obj +<>]/ID(node00000424)>> +endobj + +343 0 obj +<> +endobj + +344 0 obj +<>]/ID(node00000426)>> +endobj + +345 0 obj +<> +endobj + +346 0 obj +<>]/ID(node00000430)>> +endobj + +347 0 obj +<> +endobj + +348 0 obj +<>]/ID(node00000433)>> +endobj + +349 0 obj +<> +endobj + +350 0 obj +<>]/ID(node00000435)>> +endobj + +351 0 obj +<> +endobj + +352 0 obj +<>]/ID(node00000438)>> +endobj + +353 0 obj +<> +endobj + +354 0 obj +<>]/ID(node00000440)>> +endobj + +355 0 obj +<> +endobj + +356 0 obj +<>]/ID(node00000443)>> +endobj + +357 0 obj +<> +endobj + +358 0 obj +<>]/ID(node00000445)>> +endobj + +359 0 obj +<> +endobj + +360 0 obj +<>]/ID(node00000448)>> +endobj + +361 0 obj +<> +endobj + +362 0 obj +<>]/ID(node00000450)>> +endobj + +363 0 obj +<> +endobj + +364 0 obj +<>]/ID(node00000453)>> +endobj + +365 0 obj +<> +endobj + +366 0 obj +<>]/ID(node00000455)>> +endobj + +367 0 obj +<> +endobj + +368 0 obj +<>]/ID(node00000458)>> +endobj + +369 0 obj +<> +endobj + +370 0 obj +<>]/ID(node00000460)>> +endobj + +371 0 obj +<> +endobj + +372 0 obj +<>]/ID(node00000463)>> +endobj + +373 0 obj +<> +endobj + +374 0 obj +<>]/ID(node00000465)>> +endobj + +375 0 obj +<> +endobj + +376 0 obj +<>]/ID(node00000468)>> +endobj + +377 0 obj +<> +endobj + +378 0 obj +<>]/ID(node00000470)>> +endobj + +379 0 obj +<> +endobj + +380 0 obj +<>]/ID(node00000473)>> +endobj + +381 0 obj +<> +endobj + +382 0 obj +<>]/ID(node00000475)>> +endobj + +383 0 obj +<> +endobj + +384 0 obj +<>]/ID(node00000478)>> +endobj + +385 0 obj +<> +endobj + +386 0 obj +<>]/ID(node00000480)>> +endobj + +387 0 obj +<> +endobj + +388 0 obj +<>]/ID(node00000483)>> +endobj + +389 0 obj +<> +endobj + +390 0 obj +<>]/ID(node00000485)>> +endobj + +391 0 obj +<> +endobj + +392 0 obj +<>]/ID(node00000489)>> +endobj + +393 0 obj +<> +endobj + +394 0 obj +<>]/ID(node00000492)>> +endobj + +395 0 obj +<> +endobj + +396 0 obj +<>]/ID(node00000494)>> +endobj + +397 0 obj +<> +endobj + +398 0 obj +<>]/ID(node00000497)>> +endobj + +399 0 obj +<> +endobj + +400 0 obj +<>]/ID(node00000499)>> +endobj + +401 0 obj +<> +endobj + +402 0 obj +<>]/ID(node00000502)>> +endobj + +403 0 obj +<> +endobj + +404 0 obj +<>]/ID(node00000504)>> +endobj + +405 0 obj +<> +endobj + +406 0 obj +<>]/ID(node00000507)>> +endobj + +407 0 obj +<> +endobj + +408 0 obj +<>]/ID(node00000509)>> +endobj + +409 0 obj +<> +endobj + +410 0 obj +<>]/ID(node00000512)>> +endobj + +411 0 obj +<> +endobj + +412 0 obj +<>]/ID(node00000514)>> +endobj + +413 0 obj +<> +endobj + +414 0 obj +<>]/ID(node00000517)>> +endobj + +415 0 obj +<> +endobj + +416 0 obj +<>]/ID(node00000519)>> +endobj + +417 0 obj +<> +endobj + +418 0 obj +<>]/ID(node00000522)>> +endobj + +419 0 obj +<> +endobj + +420 0 obj +<>]/ID(node00000524)>> +endobj + +421 0 obj +<> +endobj + +422 0 obj +<>]/ID(node00000527)>> +endobj + +423 0 obj +<> +endobj + +424 0 obj +<>]/ID(node00000529)>> +endobj + +425 0 obj +<> +endobj + +426 0 obj +<>]/ID(node00000532)>> +endobj + +427 0 obj +<> +endobj + +428 0 obj +<>]/ID(node00000534)>> +endobj + +429 0 obj +<> +endobj + +430 0 obj +<>]/ID(node00000537)>> +endobj + +431 0 obj +<> +endobj + +432 0 obj +<>]/ID(node00000539)>> +endobj + +433 0 obj +<> +endobj + +434 0 obj +<>]/ID(node00000542)>> +endobj + +435 0 obj +<> +endobj + +436 0 obj +<>]/ID(node00000544)>> +endobj + +437 0 obj +<> +endobj + +438 0 obj +<>]/ID(node00000548)>> +endobj + +439 0 obj +<> +endobj + +440 0 obj +<>]/ID(node00000551)>> +endobj + +441 0 obj +<> +endobj + +442 0 obj +<>]/ID(node00000553)>> +endobj + +443 0 obj +<> +endobj + +444 0 obj +<>]/ID(node00000556)>> +endobj + +445 0 obj +<> +endobj + +446 0 obj +<>]/ID(node00000558)>> +endobj + +447 0 obj +<> +endobj + +448 0 obj +<>]/ID(node00000561)>> +endobj + +449 0 obj +<> +endobj + +450 0 obj +<>]/ID(node00000563)>> +endobj + +451 0 obj +<> +endobj + +452 0 obj +<>]/ID(node00000566)>> +endobj + +453 0 obj +<> +endobj + +454 0 obj +<>]/ID(node00000568)>> +endobj + +455 0 obj +<> +endobj + +456 0 obj +<>]/ID(node00000571)>> +endobj + +457 0 obj +<> +endobj + +458 0 obj +<>]/ID(node00000573)>> +endobj + +459 0 obj +<> +endobj + +460 0 obj +<>]/ID(node00000576)>> +endobj + +461 0 obj +<> +endobj + +462 0 obj +<>]/ID(node00000578)>> +endobj + +463 0 obj +<> +endobj + +464 0 obj +<>]/ID(node00000581)>> +endobj + +465 0 obj +<> +endobj + +466 0 obj +<>]/ID(node00000583)>> +endobj + +467 0 obj +<> +endobj + +468 0 obj +<>]/ID(node00000586)>> +endobj + +469 0 obj +<> +endobj + +470 0 obj +<>]/ID(node00000588)>> +endobj + +471 0 obj +<> +endobj + +472 0 obj +<>]/ID(node00000591)>> +endobj + +473 0 obj +<> +endobj + +474 0 obj +<>]/ID(node00000593)>> +endobj + +475 0 obj +<> +endobj + +476 0 obj +<>]/ID(node00000596)>> +endobj + +477 0 obj +<> +endobj + +478 0 obj +<>]/ID(node00000598)>> +endobj + +479 0 obj +<> +endobj + +480 0 obj +<>]/ID(node00000601)>> +endobj + +481 0 obj +<> +endobj + +482 0 obj +<>]/ID(node00000603)>> +endobj + +483 0 obj +<> +endobj + +484 0 obj +<>]/ID(node00000607)>> +endobj + +485 0 obj +<> +endobj + +486 0 obj +<>]/ID(node00000610)>> +endobj + +487 0 obj +<> +endobj + +488 0 obj +<>]/ID(node00000612)>> +endobj + +489 0 obj +<> +endobj + +490 0 obj +<>]/ID(node00000615)>> +endobj + +491 0 obj +<> +endobj + +492 0 obj +<>]/ID(node00000617)>> +endobj + +493 0 obj +<> +endobj + +494 0 obj +<>]/ID(node00000620)>> +endobj + +495 0 obj +<> +endobj + +496 0 obj +<>]/ID(node00000622)>> +endobj + +497 0 obj +<> +endobj + +498 0 obj +<>]/ID(node00000625)>> +endobj + +499 0 obj +<> +endobj + +500 0 obj +<>]/ID(node00000627)>> +endobj + +501 0 obj +<> +endobj + +502 0 obj +<>]/ID(node00000630)>> +endobj + +503 0 obj +<> +endobj + +504 0 obj +<>]/ID(node00000632)>> +endobj + +505 0 obj +<> +endobj + +506 0 obj +<>]/ID(node00000635)>> +endobj + +507 0 obj +<> +endobj + +508 0 obj +<>]/ID(node00000637)>> +endobj + +509 0 obj +<> +endobj + +510 0 obj +<>]/ID(node00000640)>> +endobj + +511 0 obj +<> +endobj + +512 0 obj +<>]/ID(node00000642)>> +endobj + +513 0 obj +<> +endobj + +514 0 obj +<>]/ID(node00000645)>> +endobj + +515 0 obj +<> +endobj + +516 0 obj +<>]/ID(node00000647)>> +endobj + +517 0 obj +<> +endobj + +518 0 obj +<>]/ID(node00000650)>> +endobj + +519 0 obj +<> +endobj + +520 0 obj +<>]/ID(node00000652)>> +endobj + +521 0 obj +<> +endobj + +522 0 obj +<>]/ID(node00000655)>> +endobj + +523 0 obj +<> +endobj + +524 0 obj +<>]/ID(node00000657)>> +endobj + +525 0 obj +<> +endobj + +526 0 obj +<>]/ID(node00000660)>> +endobj + +527 0 obj +<> +endobj + +528 0 obj +<>]/ID(node00000662)>> +endobj + +529 0 obj +<> +endobj + +530 0 obj +<>]/ID(node00000666)>> +endobj + +531 0 obj +<> +endobj + +532 0 obj +<>]/ID(node00000669)>> +endobj + +533 0 obj +<> +endobj + +534 0 obj +<>]/ID(node00000671)>> +endobj + +535 0 obj +<> +endobj + +536 0 obj +<>]/ID(node00000674)>> +endobj + +537 0 obj +<> +endobj + +538 0 obj +<>]/ID(node00000676)>> +endobj + +539 0 obj +<> +endobj + +540 0 obj +<>]/ID(node00000679)>> +endobj + +541 0 obj +<> +endobj + +542 0 obj +<>]/ID(node00000681)>> +endobj + +543 0 obj +<> +endobj + +544 0 obj +<>]/ID(node00000684)>> +endobj + +545 0 obj +<> +endobj + +546 0 obj +<>]/ID(node00000686)>> +endobj + +547 0 obj +<> +endobj + +548 0 obj +<>]/ID(node00000689)>> +endobj + +549 0 obj +<> +endobj + +550 0 obj +<>]/ID(node00000691)>> +endobj + +551 0 obj +<> +endobj + +552 0 obj +<>]/ID(node00000694)>> +endobj + +553 0 obj +<> +endobj + +554 0 obj +<>]/ID(node00000696)>> +endobj + +555 0 obj +<> +endobj + +556 0 obj +<>]/ID(node00000699)>> +endobj + +557 0 obj +<> +endobj + +558 0 obj +<>]/ID(node00000701)>> +endobj + +559 0 obj +<> +endobj + +560 0 obj +<>]/ID(node00000704)>> +endobj + +561 0 obj +<> +endobj + +562 0 obj +<>]/ID(node00000706)>> +endobj + +563 0 obj +<> +endobj + +564 0 obj +<>]/ID(node00000709)>> +endobj + +565 0 obj +<> +endobj + +566 0 obj +<>]/ID(node00000711)>> +endobj + +567 0 obj +<> +endobj + +568 0 obj +<>]/ID(node00000714)>> +endobj + +569 0 obj +<> +endobj + +570 0 obj +<>]/ID(node00000716)>> +endobj + +571 0 obj +<> +endobj + +572 0 obj +<>]/ID(node00000719)>> +endobj + +573 0 obj +<> +endobj + +574 0 obj +<>]/ID(node00000721)>> +endobj + +575 0 obj +<> +endobj + +576 0 obj +<>]/ID(node00000725)>> +endobj + +577 0 obj +<> +endobj + +578 0 obj +<>]/ID(node00000728)>> +endobj + +579 0 obj +<> +endobj + +580 0 obj +<>]/ID(node00000730)>> +endobj + +581 0 obj +<> +endobj + +582 0 obj +<>]/ID(node00000733)>> +endobj + +583 0 obj +<> +endobj + +584 0 obj +<>]/ID(node00000735)>> +endobj + +585 0 obj +<> +endobj + +586 0 obj +<>]/ID(node00000738)>> +endobj + +587 0 obj +<> +endobj + +588 0 obj +<>]/ID(node00000740)>> +endobj + +589 0 obj +<> +endobj + +590 0 obj +<>]/ID(node00000743)>> +endobj + +591 0 obj +<> +endobj + +592 0 obj +<>]/ID(node00000745)>> +endobj + +593 0 obj +<> +endobj + +594 0 obj +<>]/ID(node00000748)>> +endobj + +595 0 obj +<> +endobj + +596 0 obj +<>]/ID(node00000750)>> +endobj + +597 0 obj +<> +endobj + +598 0 obj +<>]/ID(node00000753)>> +endobj + +599 0 obj +<> +endobj + +600 0 obj +<>]/ID(node00000755)>> +endobj + +601 0 obj +<> +endobj + +602 0 obj +<>]/ID(node00000758)>> +endobj + +603 0 obj +<> +endobj + +604 0 obj +<>]/ID(node00000760)>> +endobj + +605 0 obj +<> +endobj + +606 0 obj +<>]/ID(node00000763)>> +endobj + +607 0 obj +<> +endobj + +608 0 obj +<>]/ID(node00000765)>> +endobj + +609 0 obj +<> +endobj + +610 0 obj +<>]/ID(node00000768)>> +endobj + +611 0 obj +<> +endobj + +612 0 obj +<>]/ID(node00000770)>> +endobj + +613 0 obj +<> +endobj + +614 0 obj +<>]/ID(node00000773)>> +endobj + +615 0 obj +<> +endobj + +616 0 obj +<>]/ID(node00000775)>> +endobj + +617 0 obj +<> +endobj + +618 0 obj +<>]/ID(node00000778)>> +endobj + +619 0 obj +<> +endobj + +620 0 obj +<>]/ID(node00000780)>> +endobj + +621 0 obj +<> +endobj + +622 0 obj +<>]/ID(node00000784)>> +endobj + +623 0 obj +<> +endobj + +624 0 obj +<>]/ID(node00000787)>> +endobj + +625 0 obj +<> +endobj + +626 0 obj +<>]/ID(node00000789)>> +endobj + +627 0 obj +<> +endobj + +628 0 obj +<>]/ID(node00000792)>> +endobj + +629 0 obj +<> +endobj + +630 0 obj +<>]/ID(node00000794)>> +endobj + +631 0 obj +<> +endobj + +632 0 obj +<>]/ID(node00000797)>> +endobj + +633 0 obj +<> +endobj + +634 0 obj +<>]/ID(node00000799)>> +endobj + +635 0 obj +<> +endobj + +636 0 obj +<>]/ID(node00000802)>> +endobj + +637 0 obj +<> +endobj + +638 0 obj +<>]/ID(node00000804)>> +endobj + +639 0 obj +<> +endobj + +640 0 obj +<>]/ID(node00000807)>> +endobj + +641 0 obj +<> +endobj + +642 0 obj +<>]/ID(node00000809)>> +endobj + +643 0 obj +<> +endobj + +644 0 obj +<>]/ID(node00000812)>> +endobj + +645 0 obj +<> +endobj + +646 0 obj +<>]/ID(node00000814)>> +endobj + +647 0 obj +<> +endobj + +648 0 obj +<>]/ID(node00000817)>> +endobj + +649 0 obj +<> +endobj + +650 0 obj +<>]/ID(node00000819)>> +endobj + +651 0 obj +<> +endobj + +652 0 obj +<>]/ID(node00000822)>> +endobj + +653 0 obj +<> +endobj + +654 0 obj +<>]/ID(node00000824)>> +endobj + +655 0 obj +<> +endobj + +656 0 obj +<>]/ID(node00000827)>> +endobj + +657 0 obj +<> +endobj + +658 0 obj +<>]/ID(node00000829)>> +endobj + +659 0 obj +<> +endobj + +660 0 obj +<>]/ID(node00000832)>> +endobj + +661 0 obj +<> +endobj + +662 0 obj +<>]/ID(node00000834)>> +endobj + +663 0 obj +<> +endobj + +664 0 obj +<>]/ID(node00000837)>> +endobj + +665 0 obj +<> +endobj + +666 0 obj +<>]/ID(node00000839)>> +endobj + +667 0 obj +<> +endobj + +668 0 obj +<>]/ID(node00000843)>> +endobj + +669 0 obj +<> +endobj + +670 0 obj +<>]/ID(node00000846)>> +endobj + +671 0 obj +<> +endobj + +672 0 obj +<>]/ID(node00000848)>> +endobj + +673 0 obj +<> +endobj + +674 0 obj +<>]/ID(node00000851)>> +endobj + +675 0 obj +<> +endobj + +676 0 obj +<>]/ID(node00000853)>> +endobj + +677 0 obj +<> +endobj + +678 0 obj +<>]/ID(node00000856)>> +endobj + +679 0 obj +<> +endobj + +680 0 obj +<>]/ID(node00000858)>> +endobj + +681 0 obj +<> +endobj + +682 0 obj +<>]/ID(node00000861)>> +endobj + +683 0 obj +<> +endobj + +684 0 obj +<>]/ID(node00000863)>> +endobj + +685 0 obj +<> +endobj + +686 0 obj +<>]/ID(node00000866)>> +endobj + +687 0 obj +<> +endobj + +688 0 obj +<>]/ID(node00000868)>> +endobj + +689 0 obj +<> +endobj + +690 0 obj +<>]/ID(node00000871)>> +endobj + +691 0 obj +<> +endobj + +692 0 obj +<>]/ID(node00000873)>> +endobj + +693 0 obj +<> +endobj + +694 0 obj +<>]/ID(node00000876)>> +endobj + +695 0 obj +<> +endobj + +696 0 obj +<>]/ID(node00000878)>> +endobj + +697 0 obj +<> +endobj + +698 0 obj +<>]/ID(node00000881)>> +endobj + +699 0 obj +<> +endobj + +700 0 obj +<>]/ID(node00000883)>> +endobj + +701 0 obj +<> +endobj + +702 0 obj +<>]/ID(node00000886)>> +endobj + +703 0 obj +<> +endobj + +704 0 obj +<>]/ID(node00000888)>> +endobj + +705 0 obj +<> +endobj + +706 0 obj +<>]/ID(node00000891)>> +endobj + +707 0 obj +<> +endobj + +708 0 obj +<>]/ID(node00000893)>> +endobj + +709 0 obj +<> +endobj + +710 0 obj +<>]/ID(node00000896)>> +endobj + +711 0 obj +<> +endobj + +712 0 obj +<>]/ID(node00000898)>> +endobj + +713 0 obj +<> +endobj + +714 0 obj +<>]/ID(node00000902)>> +endobj + +715 0 obj +<> +endobj + +716 0 obj +<>]/ID(node00000905)>> +endobj + +717 0 obj +<> +endobj + +718 0 obj +<>]/ID(node00000907)>> +endobj + +719 0 obj +<> +endobj + +720 0 obj +<>]/ID(node00000910)>> +endobj + +721 0 obj +<> +endobj + +722 0 obj +<>]/ID(node00000912)>> +endobj + +723 0 obj +<> +endobj + +724 0 obj +<>]/ID(node00000915)>> +endobj + +725 0 obj +<> +endobj + +726 0 obj +<>]/ID(node00000917)>> +endobj + +727 0 obj +<> +endobj + +728 0 obj +<>]/ID(node00000920)>> +endobj + +729 0 obj +<> +endobj + +730 0 obj +<>]/ID(node00000922)>> +endobj + +731 0 obj +<> +endobj + +732 0 obj +<>]/ID(node00000925)>> +endobj + +733 0 obj +<> +endobj + +734 0 obj +<>]/ID(node00000927)>> +endobj + +735 0 obj +<> +endobj + +736 0 obj +<>]/ID(node00000930)>> +endobj + +737 0 obj +<> +endobj + +738 0 obj +<>]/ID(node00000932)>> +endobj + +739 0 obj +<> +endobj + +740 0 obj +<>]/ID(node00000935)>> +endobj + +741 0 obj +<> +endobj + +742 0 obj +<>]/ID(node00000937)>> +endobj + +743 0 obj +<> +endobj + +744 0 obj +<>]/ID(node00000940)>> +endobj + +745 0 obj +<> +endobj + +746 0 obj +<>]/ID(node00000942)>> +endobj + +747 0 obj +<> +endobj + +748 0 obj +<>]/ID(node00000945)>> +endobj + +749 0 obj +<> +endobj + +750 0 obj +<>]/ID(node00000947)>> +endobj + +751 0 obj +<> +endobj + +752 0 obj +<>]/ID(node00000950)>> +endobj + +753 0 obj +<> +endobj + +754 0 obj +<>]/ID(node00000952)>> +endobj + +755 0 obj +<> +endobj + +756 0 obj +<>]/ID(node00000955)>> +endobj + +757 0 obj +<> +endobj + +758 0 obj +<>]/ID(node00000957)>> +endobj + +759 0 obj +<> +endobj + +760 0 obj +<>]/ID(node00000961)>> +endobj + +761 0 obj +<> +endobj + +762 0 obj +<>]/ID(node00000964)>> +endobj + +763 0 obj +<> +endobj + +764 0 obj +<>]/ID(node00000966)>> +endobj + +765 0 obj +<> +endobj + +766 0 obj +<>]/ID(node00000969)>> +endobj + +767 0 obj +<> +endobj + +768 0 obj +<>]/ID(node00000971)>> +endobj + +769 0 obj +<> +endobj + +770 0 obj +<>]/ID(node00000974)>> +endobj + +771 0 obj +<> +endobj + +772 0 obj +<>]/ID(node00000976)>> +endobj + +773 0 obj +<> +endobj + +774 0 obj +<>]/ID(node00000979)>> +endobj + +775 0 obj +<> +endobj + +776 0 obj +<>]/ID(node00000981)>> +endobj + +777 0 obj +<> +endobj + +778 0 obj +<>]/ID(node00000984)>> +endobj + +779 0 obj +<> +endobj + +780 0 obj +<>]/ID(node00000986)>> +endobj + +781 0 obj +<> +endobj + +782 0 obj +<>]/ID(node00000989)>> +endobj + +783 0 obj +<> +endobj + +784 0 obj +<>]/ID(node00000991)>> +endobj + +785 0 obj +<> +endobj + +786 0 obj +<>]/ID(node00000994)>> +endobj + +787 0 obj +<> +endobj + +788 0 obj +<>]/ID(node00000996)>> +endobj + +789 0 obj +<> +endobj + +790 0 obj +<>]/ID(node00000999)>> +endobj + +791 0 obj +<> +endobj + +792 0 obj +<>]/ID(node00001001)>> +endobj + +793 0 obj +<> +endobj + +794 0 obj +<>]/ID(node00001004)>> +endobj + +795 0 obj +<> +endobj + +796 0 obj +<>]/ID(node00001006)>> +endobj + +797 0 obj +<> +endobj + +798 0 obj +<>]/ID(node00001009)>> +endobj + +799 0 obj +<> +endobj + +800 0 obj +<>]/ID(node00001011)>> +endobj + +801 0 obj +<> +endobj + +802 0 obj +<>]/ID(node00001014)>> +endobj + +803 0 obj +<> +endobj + +804 0 obj +<>]/ID(node00001016)>> +endobj + +805 0 obj +<> +endobj + +806 0 obj +<>]/ID(node00001020)>> +endobj + +807 0 obj +<> +endobj + +808 0 obj +<>]/ID(node00001023)>> +endobj + +809 0 obj +<> +endobj + +810 0 obj +<>]/ID(node00001025)>> +endobj + +811 0 obj +<> +endobj + +812 0 obj +<>]/ID(node00001028)>> +endobj + +813 0 obj +<> +endobj + +814 0 obj +<>]/ID(node00001030)>> +endobj + +815 0 obj +<> +endobj + +816 0 obj +<>]/ID(node00001033)>> +endobj + +817 0 obj +<> +endobj + +818 0 obj +<>]/ID(node00001035)>> +endobj + +819 0 obj +<> +endobj + +820 0 obj +<>]/ID(node00001038)>> +endobj + +821 0 obj +<> +endobj + +822 0 obj +<>]/ID(node00001040)>> +endobj + +823 0 obj +<> +endobj + +824 0 obj +<>]/ID(node00001043)>> +endobj + +825 0 obj +<> +endobj + +826 0 obj +<>]/ID(node00001045)>> +endobj + +827 0 obj +<> +endobj + +828 0 obj +<>]/ID(node00001048)>> +endobj + +829 0 obj +<> +endobj + +830 0 obj +<>]/ID(node00001050)>> +endobj + +831 0 obj +<> +endobj + +832 0 obj +<>]/ID(node00001053)>> +endobj + +833 0 obj +<> +endobj + +834 0 obj +<>]/ID(node00001055)>> +endobj + +835 0 obj +<> +endobj + +836 0 obj +<>]/ID(node00001058)>> +endobj + +837 0 obj +<> +endobj + +838 0 obj +<>]/ID(node00001060)>> +endobj + +839 0 obj +<> +endobj + +840 0 obj +<>]/ID(node00001063)>> +endobj + +841 0 obj +<> +endobj + +842 0 obj +<>]/ID(node00001065)>> +endobj + +843 0 obj +<> +endobj + +844 0 obj +<>]/ID(node00001068)>> +endobj + +845 0 obj +<> +endobj + +846 0 obj +<>]/ID(node00001070)>> +endobj + +847 0 obj +<> +endobj + +848 0 obj +<>]/ID(node00001073)>> +endobj + +849 0 obj +<> +endobj + +850 0 obj +<>]/ID(node00001075)>> +endobj + +851 0 obj +<> +endobj + +852 0 obj +<>]/ID(node00001079)>> +endobj + +853 0 obj +<> +endobj + +854 0 obj +<>]/ID(node00001082)>> +endobj + +855 0 obj +<> +endobj + +856 0 obj +<>]/ID(node00001084)>> +endobj + +857 0 obj +<> +endobj + +858 0 obj +<>]/ID(node00001087)>> +endobj + +859 0 obj +<> +endobj + +860 0 obj +<>]/ID(node00001089)>> +endobj + +861 0 obj +<> +endobj + +862 0 obj +<>]/ID(node00001092)>> +endobj + +863 0 obj +<> +endobj + +864 0 obj +<>]/ID(node00001094)>> +endobj + +865 0 obj +<> +endobj + +866 0 obj +<>]/ID(node00001097)>> +endobj + +867 0 obj +<> +endobj + +868 0 obj +<>]/ID(node00001099)>> +endobj + +869 0 obj +<> +endobj + +870 0 obj +<>]/ID(node00001102)>> +endobj + +871 0 obj +<> +endobj + +872 0 obj +<>]/ID(node00001104)>> +endobj + +873 0 obj +<> +endobj + +874 0 obj +<>]/ID(node00001107)>> +endobj + +875 0 obj +<> +endobj + +876 0 obj +<>]/ID(node00001109)>> +endobj + +877 0 obj +<> +endobj + +878 0 obj +<>]/ID(node00001112)>> +endobj + +879 0 obj +<> +endobj + +880 0 obj +<>]/ID(node00001114)>> +endobj + +881 0 obj +<> +endobj + +882 0 obj +<>]/ID(node00001117)>> +endobj + +883 0 obj +<> +endobj + +884 0 obj +<>]/ID(node00001119)>> +endobj + +885 0 obj +<> +endobj + +886 0 obj +<>]/ID(node00001122)>> +endobj + +887 0 obj +<> +endobj + +888 0 obj +<>]/ID(node00001124)>> +endobj + +889 0 obj +<> +endobj + +890 0 obj +<>]/ID(node00001127)>> +endobj + +891 0 obj +<> +endobj + +892 0 obj +<>]/ID(node00001129)>> +endobj + +893 0 obj +<> +endobj + +894 0 obj +<>]/ID(node00001132)>> +endobj + +895 0 obj +<> +endobj + +896 0 obj +<>]/ID(node00001134)>> +endobj + +897 0 obj +<> +endobj + +898 0 obj +<>]/ID(node00001138)>> +endobj + +899 0 obj +<> +endobj + +900 0 obj +<>]/ID(node00001141)>> +endobj + +901 0 obj +<> +endobj + +902 0 obj +<>]/ID(node00001143)>> +endobj + +903 0 obj +<> +endobj + +904 0 obj +<>]/ID(node00001146)>> +endobj + +905 0 obj +<> +endobj + +906 0 obj +<>]/ID(node00001148)>> +endobj + +907 0 obj +<> +endobj + +908 0 obj +<>]/ID(node00001151)>> +endobj + +909 0 obj +<> +endobj + +910 0 obj +<>]/ID(node00001153)>> +endobj + +911 0 obj +<> +endobj + +912 0 obj +<>]/ID(node00001156)>> +endobj + +913 0 obj +<> +endobj + +914 0 obj +<>]/ID(node00001158)>> +endobj + +915 0 obj +<> +endobj + +916 0 obj +<>]/ID(node00001161)>> +endobj + +917 0 obj +<> +endobj + +918 0 obj +<>]/ID(node00001163)>> +endobj + +919 0 obj +<> +endobj + +920 0 obj +<>]/ID(node00001166)>> +endobj + +921 0 obj +<> +endobj + +922 0 obj +<>]/ID(node00001168)>> +endobj + +923 0 obj +<> +endobj + +924 0 obj +<>]/ID(node00001171)>> +endobj + +925 0 obj +<> +endobj + +926 0 obj +<>]/ID(node00001173)>> +endobj + +927 0 obj +<> +endobj + +928 0 obj +<>]/ID(node00001176)>> +endobj + +929 0 obj +<> +endobj + +930 0 obj +<>]/ID(node00001178)>> +endobj + +931 0 obj +<> +endobj + +932 0 obj +<>]/ID(node00001181)>> +endobj + +933 0 obj +<> +endobj + +934 0 obj +<>]/ID(node00001183)>> +endobj + +935 0 obj +<> +endobj + +936 0 obj +<>]/ID(node00001186)>> +endobj + +937 0 obj +<> +endobj + +938 0 obj +<>]/ID(node00001188)>> +endobj + +939 0 obj +<> +endobj + +940 0 obj +<>]/ID(node00001191)>> +endobj + +941 0 obj +<> +endobj + +942 0 obj +<>]/ID(node00001193)>> +endobj + +943 0 obj +<> +endobj + +944 0 obj +<>]/ID(node00001198)>> +endobj + +945 0 obj +<> +endobj + +946 0 obj +<>]/ID(node00001202)>> +endobj + +947 0 obj +<> +endobj + +948 0 obj +<>]/ID(node00001205)>> +endobj + +949 0 obj +<> +endobj + +950 0 obj +<>]/ID(node00001208)>> +endobj + +951 0 obj +<> +endobj + +952 0 obj +<>]/ID(node00001210)>> +endobj + +953 0 obj +<> +endobj + +954 0 obj +<>]/ID(node00001213)>> +endobj + +955 0 obj +<> +endobj + +956 0 obj +<>]/ID(node00001215)>> +endobj + +957 0 obj +<> +endobj + +958 0 obj +<>]/ID(node00001218)>> +endobj + +959 0 obj +<> +endobj + +960 0 obj +<>]/ID(node00001220)>> +endobj + +961 0 obj +<> +endobj + +962 0 obj +<>]/ID(node00001223)>> +endobj + +963 0 obj +<> +endobj + +964 0 obj +<>]/ID(node00001225)>> +endobj + +965 0 obj +<> +endobj + +966 0 obj +<>]/ID(node00001228)>> +endobj + +967 0 obj +<> +endobj + +968 0 obj +<>]/ID(node00001230)>> +endobj + +969 0 obj +<> +endobj + +970 0 obj +<>]/ID(node00001233)>> +endobj + +971 0 obj +<> +endobj + +972 0 obj +<>]/ID(node00001235)>> +endobj + +973 0 obj +<> +endobj + +974 0 obj +<>]/ID(node00001238)>> +endobj + +975 0 obj +<> +endobj + +976 0 obj +<>]/ID(node00001240)>> +endobj + +977 0 obj +<> +endobj + +978 0 obj +<>]/ID(node00001243)>> +endobj + +979 0 obj +<> +endobj + +980 0 obj +<>]/ID(node00001245)>> +endobj + +981 0 obj +<> +endobj + +982 0 obj +<>]/ID(node00001248)>> +endobj + +983 0 obj +<> +endobj + +984 0 obj +<>]/ID(node00001250)>> +endobj + +985 0 obj +<> +endobj + +986 0 obj +<>]/ID(node00001253)>> +endobj + +987 0 obj +<> +endobj + +988 0 obj +<>]/ID(node00001255)>> +endobj + +989 0 obj +<> +endobj + +990 0 obj +<>]/ID(node00001258)>> +endobj + +991 0 obj +<> +endobj + +992 0 obj +<>]/ID(node00001260)>> +endobj + +993 0 obj +<> +endobj + +994 0 obj +<>]/ID(node00001263)>> +endobj + +995 0 obj +<> +endobj + +996 0 obj +<>]/ID(node00001265)>> +endobj + +997 0 obj +<> +endobj + +998 0 obj +<>]/ID(node00001268)>> +endobj + +999 0 obj +<> +endobj + +1000 0 obj +<>]/ID(node00001270)>> +endobj + +1001 0 obj +<> +endobj + +1002 0 obj +<>]/ID(node00001273)>> +endobj + +1003 0 obj +<> +endobj + +1004 0 obj +<>]/ID(node00001275)>> +endobj + +1005 0 obj +<> +endobj + +1006 0 obj +<>]/ID(node00001278)>> +endobj + +1007 0 obj +<> +endobj + +1008 0 obj +<>]/ID(node00001280)>> +endobj + +1009 0 obj +<> +endobj + +1010 0 obj +<>]/ID(node00001283)>> +endobj + +1011 0 obj +<> +endobj + +1012 0 obj +<>]/ID(node00001285)>> +endobj + +1013 0 obj +<> +endobj + +1014 0 obj +<>]/ID(node00001288)>> +endobj + +1015 0 obj +<> +endobj + +1016 0 obj +<>]/ID(node00001290)>> +endobj + +1017 0 obj +<> +endobj + +1018 0 obj +<><>]/ID(node00001293)>> +endobj + +1019 0 obj +<> +endobj + +1020 0 obj +<>]/ID(node00001295)>> +endobj + +1021 0 obj +<> +endobj + +1022 0 obj +<>]/ID(node00001298)>> +endobj + +1023 0 obj +<> +endobj + +1024 0 obj +<>]/ID(node00001300)>> +endobj + +1025 0 obj +<> +endobj + +1026 0 obj +<>]/ID(node00001303)>> +endobj + +1027 0 obj +<> +endobj + +1028 0 obj +<>]/ID(node00001305)>> +endobj + +1029 0 obj +<> +endobj + +1030 0 obj +<>]/ID(node00001308)>> +endobj + +1031 0 obj +<> +endobj + +1032 0 obj +<>]/ID(node00001310)>> +endobj + +1033 0 obj +<> +endobj + +1034 0 obj +<>]/ID(node00001316)>> +endobj + +1035 0 obj +<> +endobj + +1036 0 obj +<>]/ID(node00001319)>> +endobj + +1037 0 obj +<> +endobj + +1038 0 obj +<>]/ID(node00001321)>> +endobj + +1039 0 obj +<> +endobj + +1040 0 obj +<>]/ID(node00001325)>> +endobj + +1041 0 obj +<> +endobj + +1042 0 obj +<>]/ID(node00001328)>> +endobj + +1043 0 obj +<> +endobj + +1044 0 obj +<>]/ID(node00001330)>> +endobj + +1045 0 obj +<> +endobj + +1046 0 obj +<>]/ID(node00001333)>> +endobj + +1047 0 obj +<> +endobj + +1048 0 obj +<>]/ID(node00001335)>> +endobj + +1049 0 obj +<> +endobj + +1050 0 obj +<>]/ID(node00001338)>> +endobj + +1051 0 obj +<> +endobj + +1052 0 obj +<>]/ID(node00001340)>> +endobj + +1053 0 obj +<> +endobj + +1054 0 obj +<>]/ID(node00001344)>> +endobj + +1055 0 obj +<> +endobj + +1056 0 obj +<>]/ID(node00001347)>> +endobj + +1057 0 obj +<> +endobj + +1058 0 obj +<>]/ID(node00001349)>> +endobj + +1059 0 obj +<> +endobj + +1060 0 obj +<>]/ID(node00001353)>> +endobj + +1061 0 obj +<> +endobj + +1062 0 obj +<>]/ID(node00001355)>> +endobj + +1063 0 obj +<> +endobj + +1064 0 obj +<>]/ID(node00001358)>> +endobj + +1065 0 obj +<> +endobj + +1066 0 obj +<>]/ID(node00001360)>> +endobj + +1067 0 obj +<> +endobj + +1068 0 obj +<>]/ID(node00001363)>> +endobj + +1069 0 obj +<> +endobj + +1070 0 obj +<>]/ID(node00001365)>> +endobj + +1071 0 obj +<> +endobj + +1072 0 obj +<>]/ID(node00001368)>> +endobj + +1073 0 obj +<> +endobj + +1074 0 obj +<>]/ID(node00001370)>> +endobj + +1075 0 obj +<> +endobj + +1076 0 obj +<>]/ID(node00001373)>> +endobj + +1077 0 obj +<> +endobj + +1078 0 obj +<>]/ID(node00001375)>> +endobj + +1079 0 obj +<> +endobj + +1080 0 obj +<>]/ID(node00001379)>> +endobj + +1081 0 obj +<> +endobj + +1082 0 obj +<>]/ID(node00001381)>> +endobj + +1083 0 obj +<> +endobj + +1084 0 obj +<>]/ID(node00001384)>> +endobj + +1085 0 obj +<> +endobj + +1086 0 obj +<>]/ID(node00001386)>> +endobj + +1087 0 obj +<> +endobj + +1088 0 obj +<>]/ID(node00001390)>> +endobj + +1089 0 obj +<> +endobj + +1090 0 obj +<>]/ID(node00001392)>> +endobj + +1091 0 obj +<> +endobj + +1092 0 obj +<>]/ID(node00001395)>> +endobj + +1093 0 obj +<> +endobj + +1094 0 obj +<>]/ID(node00001397)>> +endobj + +1095 0 obj +<> +endobj + +1096 0 obj +<>]/ID(node00001400)>> +endobj + +1097 0 obj +<> +endobj + +1098 0 obj +<>]/ID(node00001402)>> +endobj + +1099 0 obj +<> +endobj + +1100 0 obj +<>]/ID(node00001405)>> +endobj + +1101 0 obj +<> +endobj + +1102 0 obj +<>]/ID(node00001407)>> +endobj + +1103 0 obj +<> +endobj + +1104 0 obj +<>]/ID(node00001411)>> +endobj + +1105 0 obj +<> +endobj + +1106 0 obj +<>]/ID(node00001414)>> +endobj + +1107 0 obj +<> +endobj + +1108 0 obj +<>]/ID(node00001416)>> +endobj + +1109 0 obj +<> +endobj + +1110 0 obj +<>]/ID(node00001420)>> +endobj + +1111 0 obj +<> +endobj + +1112 0 obj +<>]/ID(node00001424)>> +endobj + +1113 0 obj +<> +endobj + +1114 0 obj +<>]/ID(node00001427)>> +endobj + +1115 0 obj +<> +endobj + +1116 0 obj +<>]/ID(node00001429)>> +endobj + +1117 0 obj +<> +endobj + +1118 0 obj +<>]/ID(node00001433)>> +endobj + +1119 0 obj +<> +endobj + +1120 0 obj +<>]/ID(node00001436)>> +endobj + +1121 0 obj +<> +endobj + +1122 0 obj +<>]/ID(node00001438)>> +endobj + +1123 0 obj +<> +endobj + +1124 0 obj +<>]/ID(node00001442)>> +endobj + +1125 0 obj +<> +endobj + +1126 0 obj +<>]/ID(node00001445)>> +endobj + +1127 0 obj +<> +endobj + +1128 0 obj +<>]/ID(node00001447)>> +endobj + +1129 0 obj +<> +endobj + +1130 0 obj +<>]/ID(node00001450)>> +endobj + +1131 0 obj +<> +endobj + +1132 0 obj +<>]/ID(node00001452)>> +endobj + +1133 0 obj +<> +endobj + +1134 0 obj +<>]/ID(node00001456)>> +endobj + +1135 0 obj +<> +endobj + +1136 0 obj +<>]/ID(node00001459)>> +endobj + +1137 0 obj +<> +endobj + +1138 0 obj +<>]/ID(node00001461)>> +endobj + +1139 0 obj +<> +endobj + +1140 0 obj +<>]/ID(node00001465)>> +endobj + +1141 0 obj +<> +endobj + +1142 0 obj +<>]/ID(node00001468)>> +endobj + +1143 0 obj +<> +endobj + +1144 0 obj +<>]/ID(node00001470)>> +endobj + +1145 0 obj +<> +endobj + +1146 0 obj +<>]/ID(node00001473)>> +endobj + +1147 0 obj +<> +endobj + +1148 0 obj +<>]/ID(node00001475)>> +endobj + +1149 0 obj +<> +endobj + +1150 0 obj +<>]/ID(node00001478)>> +endobj + +1151 0 obj +<> +endobj + +1152 0 obj +<>]/ID(node00001480)>> +endobj + +1153 0 obj +<> +endobj + +1154 0 obj +<>]/ID(node00001483)>> +endobj + +1155 0 obj +<> +endobj + +1156 0 obj +<>]/ID(node00001485)>> +endobj + +1157 0 obj +<> +endobj + +1158 0 obj +<>]/ID(node00001488)>> +endobj + +1159 0 obj +<> +endobj + +1160 0 obj +<>]/ID(node00001490)>> +endobj + +1161 0 obj +<> +endobj + +1162 0 obj +<>]/ID(node00001493)>> +endobj + +1163 0 obj +<> +endobj + +1164 0 obj +<>]/ID(node00001495)>> +endobj + +1165 0 obj +<> +endobj + +1166 0 obj +<>]/ID(node00001498)>> +endobj + +1167 0 obj +<> +endobj + +1168 0 obj +<>]/ID(node00001500)>> +endobj + +1169 0 obj +<> +endobj + +1170 0 obj +<>]/ID(node00001503)>> +endobj + +1171 0 obj +<> +endobj + +1172 0 obj +<>]/ID(node00001505)>> +endobj + +1173 0 obj +<> +endobj + +1174 0 obj +<>]/ID(node00001508)>> +endobj + +1175 0 obj +<> +endobj + +1176 0 obj +<>]/ID(node00001510)>> +endobj + +1177 0 obj +<> +endobj + +1178 0 obj +<>]/ID(node00001513)>> +endobj + +1179 0 obj +<> +endobj + +1180 0 obj +<>]/ID(node00001515)>> +endobj + +1181 0 obj +<> +endobj + +1182 0 obj +<>]/ID(node00001519)>> +endobj + +1183 0 obj +<> +endobj + +1184 0 obj +<>]/ID(node00001521)>> +endobj + +1185 0 obj +<> +endobj + +1186 0 obj +<>]/ID(node00001524)>> +endobj + +1187 0 obj +<> +endobj + +1188 0 obj +<>]/ID(node00001526)>> +endobj + +1189 0 obj +<> +endobj + +1190 0 obj +<>]/ID(node00001529)>> +endobj + +1191 0 obj +<> +endobj + +1192 0 obj +<>]/ID(node00001531)>> +endobj + +1193 0 obj +<> +endobj + +1194 0 obj +<><>]/ID(node00001534)>> +endobj + +1195 0 obj +<> +endobj + +1196 0 obj +<>]/ID(node00001536)>> +endobj + +1197 0 obj +<> +endobj + +1198 0 obj +<>]/ID(node00001540)>> +endobj + +1199 0 obj +<> +endobj + +1200 0 obj +<>]/ID(node00001543)>> +endobj + +1201 0 obj +<> +endobj + +1202 0 obj +<>]/ID(node00001546)>> +endobj + +1203 0 obj +<> +endobj + +1204 0 obj +<>]/ID(node00001548)>> +endobj + +1205 0 obj +<> +endobj + +1206 0 obj +<>]/ID(node00001552)>> +endobj + +1207 0 obj +<> +endobj + +1208 0 obj +<>]/ID(node00001555)>> +endobj + +1209 0 obj +<> +endobj + +1210 0 obj +<>]/ID(node00001557)>> +endobj + +1211 0 obj +<> +endobj + +1212 0 obj +<>]/ID(node00001562)>> +endobj + +1213 0 obj +<> +endobj + +1214 0 obj +<>]/ID(node00001565)>> +endobj + +1215 0 obj +<> +endobj + +1216 0 obj +<>]/ID(node00001567)>> +endobj + +1217 0 obj +<> +endobj + +1218 0 obj +<>]/ID(node00001571)>> +endobj + +1219 0 obj +<> +endobj + +1220 0 obj +<>]/ID(node00001574)>> +endobj + +1221 0 obj +<> +endobj + +1222 0 obj +<>]/ID(node00001576)>> +endobj + +1223 0 obj +<> +endobj + +1224 0 obj +<>]/ID(node00001579)>> +endobj + +1225 0 obj +<> +endobj + +1226 0 obj +<>]/ID(node00001581)>> +endobj + +1227 0 obj +<> +endobj + +1228 0 obj +<><>]/ID(node00001584)>> +endobj + +1229 0 obj +<> +endobj + +1230 0 obj +<>]/ID(node00001586)>> +endobj + +1231 0 obj +<> +endobj + +1232 0 obj +<><>]/ID(node00001589)>> +endobj + +1233 0 obj +<> +endobj + +1234 0 obj +<>]/ID(node00001591)>> +endobj + +1235 0 obj +<> +endobj + +1236 0 obj +<><>]/ID(node00001594)>> +endobj + +1237 0 obj +<> +endobj + +1238 0 obj +<>]/ID(node00001596)>> +endobj + +1239 0 obj +<> +endobj + +1240 0 obj +<>]/ID(node00001600)>> +endobj + +1241 0 obj +[24 0 R 24 0 R 26 0 R 28 0 R 30 0 R 32 0 R 34 0 R 36 0 R 38 0 R 40 0 R 42 0 R 44 0 R 46 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R] +endobj + +1242 0 obj +[54 0 R 56 0 R 58 0 R 58 0 R 60 0 R 62 0 R 62 0 R 64 0 R 66 0 R 68 0 R 70 0 R 72 0 R 74 0 R 76 0 R 78 0 R 80 0 R 82 0 R 84 0 R 86 0 R 88 0 R 90 0 R 92 0 R 94 0 R 96 0 R 98 0 R 100 0 R 102 0 R 104 0 R 106 0 R 108 0 R 110 0 R 112 0 R 114 0 R 116 0 R 118 0 R 120 0 R 122 0 R 124 0 R 126 0 R 128 0 R 130 0 R 132 0 R 134 0 R 136 0 R 138 0 R 140 0 R 142 0 R 144 0 R 146 0 R 148 0 R 150 0 R 152 0 R 154 0 R 156 0 R 158 0 R 160 0 R 162 0 R 164 0 R 166 0 R 168 0 R 170 0 R 172 0 R 174 0 R 176 0 R 178 0 R 180 0 R 182 0 R 184 0 R] +endobj + +1243 0 obj +[186 0 R 191 0 R 193 0 R 195 0 R 197 0 R 200 0 R 203 0 R 205 0 R 207 0 R 209 0 R 211 0 R 214 0 R 216 0 R 218 0 R 220 0 R 222 0 R 224 0 R 226 0 R 228 0 R 230 0 R 232 0 R 234 0 R 236 0 R 238 0 R 240 0 R 242 0 R 244 0 R 244 0 R 246 0 R 248 0 R 250 0 R 252 0 R 254 0 R 256 0 R 258 0 R 260 0 R 262 0 R 264 0 R 266 0 R 268 0 R 270 0 R 272 0 R 274 0 R 276 0 R 278 0 R 280 0 R 282 0 R 284 0 R 286 0 R 288 0 R 290 0 R 292 0 R 294 0 R 296 0 R 298 0 R 300 0 R 302 0 R 304 0 R 306 0 R 308 0 R 310 0 R 312 0 R 314 0 R 316 0 R 318 0 R 320 0 R 322 0 R 324 0 R 326 0 R 328 0 R 330 0 R 332 0 R 334 0 R 336 0 R] +endobj + +1244 0 obj +[338 0 R 340 0 R 342 0 R 344 0 R 346 0 R 348 0 R 350 0 R 352 0 R 354 0 R 356 0 R 358 0 R 360 0 R 362 0 R 364 0 R 366 0 R 368 0 R 370 0 R 372 0 R 374 0 R 376 0 R 378 0 R 380 0 R 382 0 R 384 0 R 386 0 R 388 0 R 390 0 R 392 0 R 394 0 R 396 0 R 398 0 R 400 0 R 402 0 R 404 0 R 406 0 R 408 0 R 410 0 R 412 0 R 414 0 R 416 0 R 418 0 R 420 0 R 422 0 R 424 0 R 426 0 R 428 0 R 430 0 R 432 0 R 434 0 R 436 0 R 438 0 R 440 0 R 442 0 R 444 0 R 446 0 R 448 0 R 450 0 R 452 0 R 454 0 R 456 0 R 458 0 R 460 0 R 462 0 R 464 0 R 466 0 R 468 0 R 470 0 R 472 0 R 474 0 R] +endobj + +1245 0 obj +[476 0 R 478 0 R 480 0 R 482 0 R 484 0 R 486 0 R 488 0 R 490 0 R 492 0 R 494 0 R 496 0 R 498 0 R 500 0 R 502 0 R 504 0 R 506 0 R 508 0 R 510 0 R 512 0 R 514 0 R 516 0 R 518 0 R 520 0 R 522 0 R 524 0 R 526 0 R 528 0 R 530 0 R 532 0 R 534 0 R 536 0 R 538 0 R 540 0 R 542 0 R 544 0 R 546 0 R 548 0 R 550 0 R 552 0 R 554 0 R 556 0 R 558 0 R 560 0 R 562 0 R 564 0 R 566 0 R 568 0 R 570 0 R 572 0 R 574 0 R 576 0 R 578 0 R 580 0 R 582 0 R 584 0 R 586 0 R 588 0 R 590 0 R 592 0 R 594 0 R 596 0 R 598 0 R 600 0 R 602 0 R 604 0 R 606 0 R 608 0 R 610 0 R 612 0 R] +endobj + +1246 0 obj +[614 0 R 616 0 R 618 0 R 620 0 R 622 0 R 624 0 R 626 0 R 628 0 R 630 0 R 632 0 R 634 0 R 636 0 R 638 0 R 640 0 R 642 0 R 644 0 R 646 0 R 648 0 R 650 0 R 652 0 R 654 0 R 656 0 R 658 0 R 660 0 R 662 0 R 664 0 R 666 0 R 668 0 R 670 0 R 672 0 R 674 0 R 676 0 R 678 0 R 680 0 R 682 0 R 684 0 R 686 0 R 688 0 R 690 0 R 692 0 R 694 0 R 696 0 R 698 0 R 700 0 R 702 0 R 704 0 R 706 0 R 708 0 R 710 0 R 712 0 R 714 0 R 716 0 R 718 0 R 720 0 R 722 0 R 724 0 R 726 0 R 728 0 R 730 0 R 732 0 R 734 0 R 736 0 R 738 0 R 740 0 R 742 0 R 744 0 R 746 0 R 748 0 R 750 0 R] +endobj + +1247 0 obj +[752 0 R 754 0 R 756 0 R 758 0 R 760 0 R 762 0 R 764 0 R 766 0 R 768 0 R 770 0 R 772 0 R 774 0 R 776 0 R 778 0 R 780 0 R 782 0 R 784 0 R 786 0 R 788 0 R 790 0 R 792 0 R 794 0 R 796 0 R 798 0 R 800 0 R 802 0 R 804 0 R 806 0 R 808 0 R 810 0 R 812 0 R 814 0 R 816 0 R 818 0 R 820 0 R 822 0 R 824 0 R 826 0 R 828 0 R 830 0 R 832 0 R 834 0 R 836 0 R 838 0 R 840 0 R 842 0 R 844 0 R 846 0 R 848 0 R 850 0 R 852 0 R 854 0 R 856 0 R 858 0 R 860 0 R 862 0 R 864 0 R 866 0 R 868 0 R 870 0 R 872 0 R 874 0 R 876 0 R 878 0 R 880 0 R 882 0 R 884 0 R 886 0 R 888 0 R] +endobj + +1248 0 obj +[890 0 R 892 0 R 894 0 R 896 0 R 898 0 R 900 0 R 902 0 R 904 0 R 906 0 R 908 0 R 910 0 R 912 0 R 914 0 R 916 0 R 918 0 R 920 0 R 922 0 R 924 0 R 926 0 R 928 0 R 930 0 R 932 0 R 934 0 R 936 0 R 938 0 R 940 0 R 942 0 R] +endobj + +1249 0 obj +[944 0 R 946 0 R 948 0 R 950 0 R 952 0 R 954 0 R 956 0 R 958 0 R 960 0 R 962 0 R 964 0 R 966 0 R 968 0 R 970 0 R 972 0 R 974 0 R 976 0 R 978 0 R 980 0 R 982 0 R 984 0 R 986 0 R 988 0 R 990 0 R 992 0 R 994 0 R 996 0 R 998 0 R 1000 0 R 1002 0 R 1004 0 R 1006 0 R 1008 0 R 1010 0 R 1012 0 R 1014 0 R 1016 0 R 1018 0 R 1018 0 R 1020 0 R 1022 0 R 1024 0 R 1026 0 R 1028 0 R 1030 0 R 1032 0 R 1034 0 R 1036 0 R 1038 0 R 1040 0 R 1042 0 R 1044 0 R 1046 0 R 1048 0 R 1050 0 R 1052 0 R 1054 0 R 1056 0 R 1058 0 R 1060 0 R 1062 0 R 1064 0 R 1066 0 R 1068 0 R 1070 0 R 1072 0 R 1074 0 R] +endobj + +1250 0 obj +[1076 0 R 1078 0 R 1080 0 R 1082 0 R 1084 0 R 1086 0 R 1088 0 R 1090 0 R 1092 0 R 1094 0 R 1096 0 R 1098 0 R 1100 0 R 1102 0 R 1104 0 R 1106 0 R 1108 0 R 1110 0 R 1112 0 R 1114 0 R 1116 0 R 1118 0 R 1120 0 R 1122 0 R 1124 0 R 1126 0 R 1128 0 R 1130 0 R 1132 0 R 1134 0 R 1136 0 R 1138 0 R 1140 0 R 1142 0 R 1144 0 R 1146 0 R 1148 0 R 1150 0 R 1152 0 R 1154 0 R 1156 0 R 1158 0 R 1160 0 R 1162 0 R 1164 0 R 1166 0 R 1168 0 R 1170 0 R 1172 0 R 1174 0 R 1176 0 R 1178 0 R 1180 0 R 1182 0 R 1184 0 R 1186 0 R 1188 0 R 1190 0 R 1192 0 R 1194 0 R 1194 0 R 1196 0 R] +endobj + +1251 0 obj +[1198 0 R 1200 0 R 1202 0 R 1204 0 R 1206 0 R 1208 0 R 1210 0 R 1212 0 R 1214 0 R 1216 0 R 1218 0 R 1220 0 R 1222 0 R 1224 0 R 1226 0 R 1228 0 R 1228 0 R 1230 0 R 1232 0 R 1232 0 R 1234 0 R 1236 0 R 1236 0 R 1238 0 R 1240 0 R] +endobj + +1252 0 obj +<> +endobj + +1253 0 obj +<> +endobj + +1254 0 obj +<> +endobj + +1255 0 obj +<>/StructTreeRoot 21 0 R/ViewerPreferences<>/Lang(en-US)>> +endobj + +1256 0 obj +<> +stream +x E?~zf{_=G{wgwgvffwll6K2I(|]PQh@ШI_UquQAP߭MsNuOUwo:uΩY@ # ґl~Sc(]wϞyܧm܆?c'W`mM[v>wy 4y6P)~w + jOo^eײg=߼ar~hݼyäi%h$6oٱwXjjݤl=Lf{{ :ev5;ȭ umWok` a0`5l+ `$r3`>Nz!O@XG(2f˰VA4Z(0 0` &2Myo +j ݰ &` 0K,\Bf9lc`u:h[ 8pWmGR+a=ڡpAsE0zfU 2a4A pI X;`=4}[0]j0`l `ܽμ !8gGN!0" L!֎B"^:w"F DvEVY` $dB ߁oܧEvn&Ed֞@Ȧ #zk#&GD=homddx}a4,髍,\쭍 @gGg3Q Hu0*lmeq#+:\|%etk99B%eۭed1q;=xá#e=솞L2303_5;hގk3ՀEKG@d8SsHߤo=:`?6xyw vUs!4v_0 +5 ywP r8 Mk +P].F{Ci2u>ɼWK_Gf^UN\?ww{Ѿ!P#\/<) <~_MzވÀqm#ˆ^|ђŋ._9wNG{[kK&LcȒSkZ?>(֖-`4ʩ2֖I偝kG |owPBoWhrM|è '8'}lIO/  3zͺʶ2ke\Fyۍ|Q.]q\5^f&'2(+rm\yoC}r}5/^6T&qe(__3Yͱ%嗁&TF3Pf{6ھhr"\P-|6gLZZrlD%gJfo_Ү_[۹[P_̿dْe&uqrx__b_.NVp.\[Fk/0 me-S`A಑qme kU*g(_F}i]Ǡ@~px0A({Lv1e490A{).kReIꙋi$g3A{lIeK2YfrVH{G\z,2E w0VuX +Ty&yue9*U cJUu>1Ţ5)bFْ8;hf^e2F84NF6wH|%foWd*eճ2]>^f0F=T㋩7Spn|pmpq]P9||COYn]ɷ|6SFn@?V"JV YiGNai>HNýp79 s8L‡cp!|%?}L?#?OSfG~g?A$x>Ie>< g||eyx;ϒqx/)x>ONfEЃUENC +2#7 ,@aED1$,D),B Xpj%Gb4h 9F,Cȣ0.&r|F +0@25!Gam"%rXO*<%| +V䓰|֢aBKA/A>ѻ`zlD$M،>J^=@+ЃCp%,9 [r*%؆B$y?\Iנ`.9עS佰CgȻa)G?'wn䝰7;`/yJn}h1&Fl#[1OMX"mEn `yr܊cpN #7샷<m-pK;q=d n\Ku^M6ÿfM6^>?F6'd=| +CR4~LgZx?NCKd5WI '*,&Yo(#q<1'd<FFq+_ "YO?eEg2_d1 Y +_fXr1|EUF"K8"%$ kL י8|3NMMM(Ra^L,` c͒Yb8l6elg9Xr<ݞjf5Y>ju%e9gS,8begqv +v;pUXJ/g- x XȂ 8x .9<,D;o8Mdb3X8L,gĂSApa;x@Sa*;ϳr*Xs c Dr@ +ix,Up+NYaSST $SV< T%:D]Yp(]Et: ;He bNƋdEUITT)@EE\)9$%D-I$8BUU5 ;gPX9,L[I* +BU9"z\ $o QrJ  |=@r\@X<2˳iL,~j8Q|*.WjU,ʲ*2&8KlA&AERfg,q\.UWdM$*dU; ETdRBQAX\X /prBzh YTš((WQU!:z H4'gA@Ω̒iC!]sUEwe] x.UJQ%UU=@SU٣(,Xx<OHPu7= 8Q%Dxܺץ=VC^Kx"WR]%\vp*oNYr)>U_7y<^o2Tap985K, x +:_h.QX!i3X(|xRG9]f/ZG}xUtUD]&t]EE]T#wEPNNϒY$>oͧG!/^?jUv+ntgveUuz ( S(+Y` }A;th~= +XY,tV9L>|ǭo +#\c ~A4,%z ǂ~#&y#x" @(@Z/ \R: ]n-Kc Dm>ݣUCqdVdHCR5DCx2 F`!9 +n' }'m]dRrAĩ,&FR5r(f␈ĪU1 "JΈFψd1tkNoF(ՂCLtI,6=Neڌ+R-7&!f Yʈ1_,@Uq_6FxQ]]}}oTYz!-{Pj̒LSm*ۤS 4kMP_*YIksҵ55h8lMbr|~ `s0Q, "elOeB3r%Gw槟/Uٝt-N?O@:VE geT^#cYoK =9ڎE D1 Kփ=Fτ-٢=6ϰX -,.X!WN G`kx {7&0=UR;$z4P*ɧNḾQi{t@ud^>oʭ.45[,s>գ>>wK}xz+:9aY6GѾ)OM4[<2ED6d , s=H@€ fQ6[fW>ޔQacN)*F^n|\1$8ybM5qBT~KTSUY…mnustakoxw*Lzxޓ Snz _xhU/<<u67| Ka 0`8MncQf1%1" ( qa@wwڑ}T:AELT:?S:A娋i+(qED@ͽPxQ'dbu)P1_F#kC1O<qƧxO6SV~A*Lt^*'K )9"FhŴPUSGoùΐ7| H;3|2ME Wΰ6nm ?>{;iR{}M;é1k1rH5YoJ[훠j/?]{M?u"ϔrX#zoc)Z"A53o+c@g{3/zj"szܵKEpi71'ؘnk]&vk$=]+sUߵwP˂ڋ4ؼ(i  3.pLZyVFg + J0HgA#j"6pV tOJ%s|)D\JED[6ԝ݋{Yw% vuO}[꯺v:@V#vXW(Y[aQ& +CGɱ!ZX0m )l[LR;S23SSSyKM$Ż EP /^L-WyMmoYG׿r^ܲ+8l{ 0$ɋXǏ +Y-$kuEw6IM5M 9rj6$-†)9SW:NX6-ZSiSD(ǦJi #:1w!"5a_#j篜]ٵ]|l#V݈8"\@7jmGsfy_=em(2@Jhd?"?nVlI!N䈼Ff8V =6SԜ(t1mі.2T[_|{迌 uiߕ>(U4yD P1{W'uE@+Fz2\{R$bm౦7X BTSTJV{eƸxfY+ ifu4g*(ux`\F;G獵 +o*МM`1nx܆g;ؗGsC|mL,j[{or'z; >$z]Ӛ i'9(îK|$&pʺ`lxj Q+mf8mwe0[Z[[TLddN(Š'@ֆ r^P篚 ̙],c@aItgR['y{c(WCoc 2: $R˱@@FTЃCņf䎸1qX#s M-;b.䓙|F>5vtdK~)ԥP(An 9:jFK_^(\?&;ކ ˞Tcƨ5wٚE>{!= !ol^ry9>3ר("@b]\ZdDd&Q؊"u|aqbX@EcXka5ţ X:nMUu#uֺFhMCMӥ3S|>{ =CRt)S!.)OQaIRiyQ4id1sWU0N7y(uEW}o~dn4Z,͝2R[ _hucM}Cر{pU\ƚ;t򾺈jE5ZY҅YwumZX?4wyi[ͩ嚫^]n_Rs͢'BNFFpA^܍05"Q&& H$KhB.u2N$9#Npfw;ɉ,,rsj[ѰQ".0EC&b'NB\݅ե,d$Nx+Y}{-?.?|ϖ'R֔6tTDljaƃD-42Cށ=VOဖXJ-Il'?8O|qJ}_"'MjaQ>> : +mr} )ZϲN4s4H ;"Ζ:cK%y:3L~)g4^W T<]=l,j>/wuSUC C={xV ^dإ5v։?l|+ZlEm`\Ӛ.Y[>ɋx>qh-E &%{>!*cE)|&[dwFΩxNz'n]% mMzvIkpf'>@)TT[eygn3 mfPH? 8)#Av}EjYw6^Z+ ĿBڵۯVI޻n[kuܾlC2^ +c<[@\|.&%a; '.u0"EAc>H>{w:%ϼ3_GR|[Te#`błY?obFX̱,sAl>CȮ.чr|yPз /#7韘}k}W15}dw%$b'N% +#pDjG+lF  +-`ΟoXyKZWlZڑ< +#Qn/cTDbA`erpns2v[a`ւ,d0GA75LЧ3g5آJ\)(Qӯ>l(5|d'¯.Vu c+Su +fftyx/@G6 pAA~@hʵF-5Ң8c]WC5U,y~ +0e3Y/۟ҲjoYھfo?=es cBad;8q偉W 4#zc{Rq26pshۊ>_]QAz\Bի.2nQez?冽W?s7cPcq? }Wܦ,P\wnT~F M^o9y@& ׬)L:S(pnN}ȕ.:\ҬK.O^u•~¥@\j{o)d~&XQ,=})ږT!6;"EזEYXXkw*3;甔R WLQ%jWFf(7sB]D.3ŋc}D &5oqQGXYy˱#.j ='bb+YnP82|XHu;0}Jěp gÃ6>w)G%$[>roflEtJJQw}K}>vyU`:P*duprhC)(UYxy+ v,8R]azhzuܤ<}tzxƅ5>Y\tDCV7 77r˂Dqk{-+,g`aX; XTYAY=8)XL}ΟYЯVɣPU"âpd>@,"qFA"HA1O k(F_pӍk܌FnĿ|>^рjut\^uԧt$ZؘL*(@B '"AUT}BB%D$) 2 /PHBV߉Fj |@t/UIS%QRzxHJTjDFp9">+5qsE]/q9Au~[]*. gK۽ϖ +m9n?כL.͗9m>-m~naSxqdg?_xalY$D5f|E[]}pY/ڏݷWi֍5G|'m~8$Yba5 Z>D-0qל<_:q9e-gL4 +ω&+} Gե9J\iDBwoOck۾{{3 q2Mؑd+ST-0\ѐk(60 ОMb( սB}hf4kSt_=c('9?ѹ]!w{>I=!ɠ #Fk(j;R.gbj< 5M+Rk{rŔbFeV0@^Y x B;#ǰ0 {vGxDfs+BoeBJrVvLx[i{D!+9q~`nGvi_1';afi+'ӯ +*K Et +!=Ś./c9M{1"H=a]scxUTrfVs`jH/ D#z>3ޒ@__AldžxXֻb^-șECy .-nN"af>VqF ˏƌ9fQoʩ ).UW=DYi;5O br45w 84:#MCH_`$;mgM-]4r/xEABJ +F?S]Ph$!nOT>FiQ1o:+t X.C1 +T\(=%WWĢt\ZDъtx* IVBlCf`en[1~кXԧ9jڃ .돢H fಁm7;#VIƕJ0骮N~@(!HdD2VxyT ;ʀbMU\J' %@9F3!*Es+pHG]p +w.魸n.>~6"zuTvcN9#ƞ>VDV<3PS% tit~*ᭊ\ZaF*U_wB}.tbF9hM5[݁{ x*^Qnw ;KґY]b-kGpevG `hkcCۀ*TPj|Bmj@euG d^?[x#`'kF_i`@@!NJnmay[X:Чw< 2J:$$-Żjlv ^l1j|> e4Ӑ!I&fo%,pQ}V" 5?4+ؑ]y6ۭ/6:}v Ppxi6 t_c ^!1:+ΈW~֧Ň[6ty;t y ʼ EszM+pHQ v6! +{g'rFEivygC6ȟý޳_ 2!4>zP- 4p`n߰RRKi̥am EQkSA)LizեJf W7]UPHWhSA \P1Ω ZQQcVn i9t=Ύcp%([tD1nM"S+~{'HhvJ5 :tUUq\b\ED1 ϘBcVJ33M~l*Dߚsk;j+ 6umZXSpSW]Kv5 ;[ #܅~ƌyHY~L +o6^RV&txWxΊH쬈OdwgpbzFmr^nCPv={11"#V۩sͩ(a%bjڶ1tؑ3#mXXCu'{f>P YT]СڀS쎙!17ͳxDQ`ʗݤF4fK#9A`eEce)i"zn/yHUe +qH0Rˆ 9kMÚ?V3\YS//5gXؓ[H'ڻ]x*OJGEU::/ddA_bJPj3'f\uր;?*aN|kc ֵq?/5`S#ަbRK ]!{Ԁ [SV(Nɮkыߣ{'A9Ew!pÃ=ln}) @Y=sT6s_VfC<{ ʹwX<XheEuUan[,{Dg8?9I,'㥕{jƆE]ud hMI$$I::oԐMCڀ5 o%[:$I?b}gMI: 16oI?0HI᫳~N}WKv|i;}'G~M섊97"tۡ5d\ytJNs{vg2_5.yߒ}%+WM$#V^2[2#'! xP2򈈳#Cq .2vʨX()y"եHE"V82g^[-[ &`Ê R!`CI7o'؀-0g5< +*$B^ hXP 1Ra֏8%< T^Y%ݪVs{љ/% JflkhfedmՠBe3c.ft1m4> +endobj + +1258 0 obj +<>/W[0[500 0 0 240]9[705 0 356 356]15[246 340 246 437]29[246]34[455 974 721 672 648 737 606 574 702 734 316 529 684 563 897 756 790 644 0 667 582 614 707 722 948 0 661]68[553 604 500 604 584 422 594 589 289 0 579 316 862 589 607 604 604 422 485 444 589 550 784 554 547 500]262[708 0 736 1127]]/DW 568>> +endobj + +1259 0 obj +<> +stream +x]ϊ0yCIVZ+x?dtk 1=3Ų{H7c&5?zcYsmTxjhEu)PndYƹL|sc [&޽ol72Qߝl91Q6 ,Ul0a݊5;1rDnԨarX&9ʲ,sV{Ow1;y&e,sQHBL$:J`C}v4ҍ)R8FJ]RљlF$i-2Le:rul㘗 /p[ a +endstream +endobj + +1260 0 obj +<> +stream +xX}\Ufaf_@qIo*Vd`Ⴜob +dR)-kfZQjnBl[^&s[.gһog;Ϝy9{g0!XB P=9½۟/~ +痱W ྂoK[&-^2j@yeB @]he13os%Es蒒|m3+Yۿ XȪE-H\`ܬQ ?q3~ `e>l V˖ݤ3Va(<@Ha ~bazf%^O'Ҝޒm? +5Lg^@l@̶yi,px@nG~i8G5Y:zB<5<y86pN$Ʃ[ƟPq؇%j^j:%c5! *%^u``_B2b%H|,C9a)HSq? +0L",w}'?*B_(B!#:SX~Gɿxo:&OS#>FYeP@3̬ +.o@)vӸ#ē$KSu5(OAM(5PhJ9*T +95S9O;xSa.1cFA; פ iԫP +RyTqIT^ jP/QöHߠ&a(W^OA=f/}uM0}-[_\U0.ˍ.u{3AOO.3ut~D~~&uz:+菂>ras~/轍{6޹:nӿ6~#]A+AuN#No锠[Vz3Z!uA :.藂^c +zH-U."YKGrKG5]Hx]tX utH/5 gܳ.\!=hϺDlȟ顃~*耠oo0禽t!y7N:#h.=-hwFBڹC;#iBOғ3'hƉ|{=-?>c=T(&o=J[5xM.xG]EMfA*86̴>\y'4GUi5V x*cAVÅTe.zHJA +=--ZCKzLP-rBA |L/d3bAE ++(= +WlA9ف<鞰H~f ;N, d +AwiƴP>CPf)~.(cZ(4m§TOUhnu4& UJPQAArbLJM4& 4NPc|l1fG+Db 42GdI:>\$%iPVHCP 1<\ +! +8AbB4{n3p{! d5sNt)("y0H2 +d2s č餬B +dЇq =S>* %AZ3i +If +y,$%q$1KI +ma?dbQ' h1ȣ@sՒP:|Pr2z)cQ !P%KB8b= ^}isb'%*Buw,F2*ɨH nƨҦ]wڵ +ӉWL3ExGvR(JTrd-C}_\/a0EߌdN,fjg)ѩ⇱~hB>dΉY'z#w{rKO\`Gݺï\7Fj~o=UNH0` d!rFkuL&@+g22 ~a[}n}nSZ`SZRC:4C19mx6F;؝; X1{=D!:c%ktFHLSWpWo^vuɅ6ʃ*6ȫ5{ ɋp+ $+]eEQտV-Z->Zj_:-NsX̸!,j4>ȫ':ės(}|~g3❍ⱐq?GCBM_\Ǔ8d{B50T xa W!ֺ٥Y#VrFG^w1{>sX~%im~!rYbוY uptIٳ~=L7}Cn:,9qU\d,jNO=ޗq+=/55U:%x"Q"2ӹk4ZVZ #P+~P;>8flǔ-1 i| +GMhhs괰XR+zΪּ/9yO>y-rٲJHX%WKgL6:U! {!,ګԆmviVg11V?aw | k|}F1ӧ&ecm + f1H,gfYagg<2Т?+L9Lj/-r)9.i}, ,ڥ'2IESw"`l׭5) i`U'^WOt=A!hˏ,?pˌ׼r(cXMlٱcN^aL]oWXuc>ՃP%' < A`<i 6:_67N]@P4'+w:|nw)osƘd[=9:ّLyhd2љLgfLfBY:[:Q\5p)>u`<{^t#Yf/.s9DqqF\_71T5|F83¤W?znmS-&#YE%)bnL874|xcBB%}]jfD Ugoѳ-ffkE + C2L_ZݟC&l^ۻK6>ieBOԎK ,E)+J-Q%,Y~c fȕVE4V^{H҂s ]( 66K wKsfzbԨ&,[ŇO~~&1K-W 1LUa-!ۜpL [|$iL&!~Ϋ`!:UҒ ]3;X.pEθ3 OM ohx|{C=͘zWzPZt3gN8ssqN|j8_[0c*[K +endstream +endobj + +1261 0 obj +<> +endobj + +1262 0 obj +<>/W[0[600.09768 0 0 317.8711]19 28 636.23049 51[603.02737]68[612.79299 0 0 0 615.2344 0 634.7656]]/DW 0>> +endobj + +1263 0 obj +<> +stream +x]n <w@׶cqcR0$oMz|3@j~8#:0*-.fuaIi3J-Zn[<έ )KZpf#NSzív8HUđo@c٩Vw_E"40 t1VA4MS_HU(y%c削Ds'%Q9vcy) k|xs}u*Ɔp~xf +endstream +endobj + +1264 0 obj +<> +stream +xZM7 +:V/ ! zЦ dH>5;5nNMah,R$)8|b9C4 Y l̟o??WCw@ %aooޒvL +x07??~O{W/ߚ7?a6XXlm/s^nB3u֩ZN||xymTqTlXŋ/=;jkBR(x5L44ŕЍH)_CEaa7@@j;8w+H0#!Y7.:|CD<6k(Z`aͻWͭpG4rG_B +%gT4 +/ *IƤͭE\䫍@ P?lgZT+Tt:|]a\_iG(>"G>xdJyӀYRx% +xЃC/ V |oo-D .umgx#҃DkKե5NI̽W*Nz,pt9Ez28I /i,%(BUV0vOБj)j" I,%)Bz킘W&q1nKw?@ssZy9ˡm"esb$q>b%#m$?) $ɐ3R;h4RZ*v֝SB`A)A!cKC隧eA35{_Wl.$Bgʺĩd3=5U֯}YxxBSYM'Ef¡jVm4l/!EqOZ-׀i-lodjgtrr+^=>$h7h#dK;2ͱ%6Jbe)Ph޳.h7*-IM #"-Uh=% +%^HmjTy7= =_1]2W =8}mS$pDlWH ^`ĩ@᚛m3J)%Ttbn,1_[5|tށiZDh=7ZqI٭n3n4QEӘ1h\}z4.ffHӭx{n6_^I sH OV|fZr:!Ԝwn6%2PP];Hj  K#[b{6*UؗIa/|=%~mRlUG=VHͲ60w-wMH6\\r +endstream +endobj + +1265 0 obj +<> +stream +x]mܶ+/aS |)ڟߡ=Qi}v%yÇ3]L'ϋ!Շ*RN{mrw1Ovϝ~B+#z)T/xz[^ۛ]0>vJfK~$/9)9?^yo:wo^onof:ۇNf9HhQHDw{)n|u/t|ڥ뮏~o2;=6p= ++WZ}PpoؾnBnXhn@t=I) fLEgqs΢Le PH{H0}R+L}hEC14bj ,D٬ȽFX @ <6GuL"tz?mZza']2Q#"='h_ߓ<p'/؊'·p_n!${gKCFQFmGk006_po{D𓹎b}Z@!_ Mf3!fҖ>ߠj}AFh,8ΚA-uoiY6IgP{76Lyt od|7cOE$9.">8“9ǗA39+<V/qՊaS\=1Z_f · ׁN 3V 2qA0>*]d(\c#*N%DLJA(LhF[ +gesA!\ xwbJM86YMj\;i*;Iq:fNVM|_ґ2f0oLϒ9/?̍r(pklupNpߔ;(W- lmCVB#-h43'cJ|eeF7&ya_M{ZCKֈ-4>4fNS)wVt)ceف-.0^dG+؋X‹¶7qit x,7!VȍD +pw~v{g%܀#Kļ [;E$)H" HN{$ZY|h"j`_a0DWMXHp_3-Bv_ 2 +:n&ҡ 6 +gE1q3KN<";a u:.HaDrpͱN q ; İò' +VǏdBm*4Eg +O?vHNUX"'c^%-JwqCУ:!]7.H XBsY *SV}BMcN]7| K!nL![DCdݔ2V +jVmZSbƼ艼X!z$?ZD9Bd1~|^FD1\\]*d Sn u}kk-"״,MV` ]@UrNj< ȨpÆQ_NƂ&m:+.D  ]bo(ĆeXfLˆIكtȎ`[rx_vy=!gOx:![F>ͳ ntxVG9ƪ"1aI̱ΥP/_$ىOR\kC v,[;&UEjǯk% )e8LNcs|-4?R 9{ ҆]!s}okXXbEa]QZ cGD]”V E {1%Y'l;U^r(.x3)(P4o%`Hnm- :'n#lũG!@Sg9i^ 7 I9 EZ{PV_"k_8"LKDu:P+@8"ykP~H6ln# +u+к[AhJ ՗l$oQE1$<̖&:N%l?UI`GqU4/$<gP8&irp_ ?owLWwqY, >ف;3s1[-ARl{$ u9߻; m:)0զ +endstream +endobj + +1266 0 obj +<> +stream +x]YH+zcϚ}04̳>`}ؿJ*)S4tRw|ik3mJ7lRoK.ƚڐmSGwJçK/kMޚׅ{6_ۤƨl3|(|it4LIStcb}ؿֶU7_Ӻ }om`P[?<6w'MmꛚN»IiuQ)CӦa\Ӗ ^ŸRØ0EOTFTjh<1Ҽ5\~Ԟ3uؑ3䰕WݰiW#Wa+aXgDt" 2RVvEi2*B/%BuPr{Pr {PaBѭW; +qe](bjx;<ƞ6LO׫W/߿F~7CQeï^:@ڬBRZ[J)_?I +NмPܧ<ܶ/EFЋX{=yM >t5$ZAն5 QqX({V\t0sآs~r* +niA@4-*r}t$~^: ^wb6t㔐ovqt2EmN' g閿O_eIJgC,*-f5m1<\eEuX]U-izWٮWHd/Hz #Mڞe5iͣ>ie5i zp^ԉB.-Ι<9hn[ɴGC!HȽ)_ dml`8XL߂Mw`_&殱*osbmm!}.tS's&9k&i  +ڡR!<()%PE9I7-ҵ֩Ve0|՟.ZT~?aea*tSDVRZgt@YI8/27 zQVJ1.h5GF8J,A"L4@G-" 4e Sf_c1JL P_xzѡzC!yƋ-Ϡ6TO#'t2zTi+25lEf-Q ?TTH%RO9pR?'Ƥc6k5`{'5*mP8 t**Tp鷊  +T%ѥJUqPF6f))Q|X@]?#;#[I,cws%>0H+RdtiG[ڔna!rH0m ePY'IniONҜz~Ue5YQ(\:-?ɔϯ/6̐Ӯ3C֋͐Ӿ3Cֲ)q#3dՆ*HjD䐫3VZ?>.Д4_4P:•FM(b1P!mbW8FLw(8K$v98\CVu$?ޭ;4(8f{Y,Žyt/t0yf8> +u/a&ۅ7EvM,vn7'ĕ'd ؙ;IFQ]NGIHӎr,^LWq~ueIUAmd]l^Im6ljXS3.N A0!/ |m86ZX~}kSF{wC'}9##AzKeGc'E d{vu4_H `p7 xEd]="t?7Qs8dI =cE]aDCc$'7n=2rA~y&f:;"J|ڰAN-* f7vMfNߧ'p8د0QLX11V&12P&-s$Տ>}Yu8ŗͨ4&2Fr g.2{* ,wHLP<-|Ww^ c"I0v^--Qz/Bn&C :Y&Fڤ^sqkH$־SQ J+" CQ.HzWx+RIJvm9N.x"s F6)r];S%clDy[xNncWI\t] Ϝҫ 'WCfmj*ݽVTJ0AQ;.S% F;TW~Tp/C:{QeȝJ #T +ʐm_{~<Rw/C!oPike)Cj-Tz!`\!ː7ѽ |VY d *CZ=qM'."ϴAG*C+]+.C&\ɪ7|o@*DJ[$FE,=h-~ZY`2~,Q%ߙ%]-z79' l$E8H ˃%, T~Yݭ]ʽ +endstream +endobj + +1267 0 obj +<> +stream +x]n8 = u>>K>iS`RSk&Ctǭ c[") JC;n?gc GlC٩?wOU; +3*xh^})੟4SQ oAŘ6wCoJ˺i9%;+p0v^L-i(#V@U\4q:}ߞ=zWJ?KPƪ;he\wzy~2fp1S_p[B&7@4Pv~ovZ]_hu@'vJ{AV']%4٤OxxlCiz}vqr!,pYqszkR]hF{!>Ɍ٣C} ~>\{Cʆ6 視( Q}~2ط3phƙh06LXFCX2L簳 lFN8Jq)Mi6qL&%g}K\zk`4XcbՂߠnR\705U'YBPA !bRjJy +Q9o8*/P#3+TGဒDuJMQtsWxGROH^Z'fB;[e=(Cs XEUZ>'N Nձ|Avμ|})ho cǜզ=~22SLYNdFy Vn`MS9Yh''&@''jn] FF!~j!Ohȸi דk9\9~!bӭ 3yfg Z9‚ϬZualફJ=qhu"?쫜W1[V +5^:uKq +:Qd_;ؙrXSv#5}uEƴLaRPM[bs'Vuq%E"dnJCCE+a_A[WNHDeB.\/QZ5"gSр֊JU4LAq[`ւHbyqpz9cJBTAeV +H*Y3)[U< X=l +,y P%rLm*yۜp"12mFZZ< s9]!t ]jA/l>I~l$tY& y-jg2? sss~{,kZ*kLJ[gEyLU,K +G*ٮR6,j"'csm磸[[Q bרS.L>09hJmc fkW&濾ti٤j $sGa׵)\mn5d5ص]L]Lq 50ïn2|4[.B_ V'þ@mrH22|FzPϛ|lյɢKҝno>]mrzlp69m1KaLء 0W剀Ԗ*i̪:.iu;&ߤӫ d37U䳩3V<䞹.-W] )^फϦN/◈yÜ|W'p3"VNN^׮N&P8䜛,y/lm62.m&/WNZU?yBzW'KoG^8>]=gS'@XT$u2׺OnL>-~(u]!t P'?_b!A9K~1f_/xC+˧C*v Hk$/ϘE%&wd; ^g;osxj +endstream +endobj + +1268 0 obj +<> +stream +x]n7 ŭ^b` %2)vi3mƇYX?ϧ!%u4 sTΆ0L}Uߔ)w8Ð"mQCHx~ǻwN}G%-hcVVܖ&~Sv~i9%;y&y 2KgvJGtĪWU.t8Z].~^x7J|kU:ʛBkw/ebɩZ])M961,qx|uAm:Nkt}y:PkW *٥gvzkHgBDfŅ[rB3 ol&3f@#6PP&!bb[b K}nog}t$b0&W3Ԏ*㕫d- OD<~ SzdNc_[C8Fa3٠ԥz>LhxWy 㬄bbuP͈v68m@8EtB¨Wl5&l9qx$(IPgό}I5@#@F%9P`"##&v5Xe=e桹Jfcuh9h$V)C|dM<!ګ}-1hGϡ̺"d &3y|Z5ʼnqrbz<a2(Gz89}ľrD5Z߻4ӽO w.&d߈t0'ɖ3fǙw@{W`HG?&|A >V>3sκW’Zi&}@A=f;P_+wUPrPyIw=Nw(L9y;ї4֊U=FkC?̣5IK{KŠLXfƒTqyJd\y!< 7A'"K^8ȗh\5M9#>d +>:W(ί%hNj[;%`ag)Tcz&t.gYEiqCk^)BY]+Ve^?QL͒.RIe?oQӵEI2X 2+O~h5HeMY҃((2kE*ٮlYrq 9 Fۭ-ޫ(m?.BHku**@taɄxQXw-u!l9{ࣰtiɤ!l za6 C]Dt"s bĮMezdŏMڴ2|D2߅ᣉ[8*Z"rWgMYT֊^5&_[um(tg[Dw>]<Mм!tc@c='&l LƘ68J &nK0iB?6y +3&)DG*uelDĘa0X3r OY~TKyg. V, ɠwRw!/l:QUפC +endstream +endobj + +1269 0 obj +<> +stream +x]K8+>#]~JE{@H{i%=r!Ng0'NlWS<~$gm`W%0AIL}U'zn?>B6yO.ށJTYY]sSE9面!;)7< i{cbrwiNAi/ ?{#W9Vӏmŋ}˗޼V./~qXuy/?Ⱥ Ϋ/poe1Vow].B&7B4^r4SqZ]?h|uN:TJyV +dS&~4@]%ې`dB I6qqaH&fqC}zоC] >5@ ط3kƙࡃppf 0}Hr @jlh#Kv69hGS0L/2N:feDUCQUP:'F' B'<'nw35)f,D Z#>ոf(xEy =3ΈR|5'11A@9P@0*}[ +[ ⥩kdz~rjJ4P.#s%٨{N<2*9" xiz;Lj̘U/|7^Ur3ޓ6ɀS*ayZC <2^iByzr;5QdK3L;},#o&|l >s"<ƈ-f|gu[ ICZ [@֠ upR"jc=$;`v(2xݮL9y;އz!ш{m4ܷ<)HJz_.6%yJdؼj 8LsV'g8A|ʒ>.:e^ai1LcU59G~`&EAIQp7 +D&E!#󓰭นTՅ#z c2׋PvzNFMhhҌIzMZv4/9'ltAT5*h*j9AI#"o&u6Qk({ƨ<X,K4X:\:3&"#5Gs0źB2źb]&qUúc/bG2Oڢ(P~&ЀqYTd^0˒Ob+!ʙ\QeKIE˨ Fz.5{65i_кv7h'/Y.FCGE@t4!Vs3λV:Cr + +}8ćPzPeE8DQw>]<#[Ny{4N0)dַ7t&ldR$:rJ&B1B-wp? r2ue$[Ng%YrIl˖WQ-oɖBDd)5HIC1̬($dźB2źg,[ΦYוTg[umQ\l(D?\l(-)@kg';&}ӢIUaeYd9 FUZl9hp9VBvv^zޮ +']|*2@cXUzR :.[~$wuyk#vr-/k-(~2&RSҍ)w[0z9]Y +lu~`LBJwX0/Z],9;>|ly,?BkހU5l\t]|*R$)i([&B+jIl˖׆)ȖG/QׁI]/^0`êƵ&tr-.[><'-@1,(r(IkgZE!O%[+.]{7:HR_BD_Wh ?޲2.qI8. Y0'fYHpHv8 hTDU`ީ| + +endstream +endobj + +1270 0 obj +<> +stream +x]ێ8?#"!, !4qt%UNa,&T|rN[!GQ}:vJ;m4)|JFI|x&;~=WEۙmAG};#>+jBZC>ڃCAjwK=Sz :xaFׅhPsg䎸-V).tWxqo|՛oV(-3IzI⅔hs).0Q*ʏNp٢Awq++G(}q\|o߿oɎ4: ..1\f\hV1.T|e`<_.!]aCYw:&5 F'Z(qxHoU6Lr(ހE,ch5OϮa0^J ?ɨe5ɒ9T Uo0*;żsEt+GnzmtČnGn`.˄jˀh +FA:`@0 %S]m5mEU[i5 J cF6W!e| w3ȰgEBHܺ9=ie9y꡹rf ah s4ᔰ~=c·RDfWTsDEh"[b40чzw\?=B`Kxƒ? CH`p/'װנ\ZXlGO3yW`* >4SsX}bwUWcD~W)WGCz\1a%ԓ m +=DS2 +M^{SijN|7Nw J^XG6qpE ч!>}L +}^tH{Bp< G0tЛ<x!>N eiH3%aEgϳNx)> +ˤ4XIum!̝Dy +mIz_sQudZǴ("ܭu%[O+) J +cE F]1+ 6$wZ +cwR]XL.\OQfZ5neTx]]xíh4nv[PAFG"Ջ9}?0 +BSj.'( dd5ɨmÛ !}FQV@bLL`A꒬NuIqiD>3$y7 Ȝz&{ ]":y[Gp뎅ZWҥ7[tmQ}D?|,q#uղ&o&M)M|Z[HW~L:xGU+pz> T\LYU].VEx2Gx9DS,LL̓IL¶IRILM8iiwՀj7'h{E‰MDD#ZTgd~vL[._1V$rW(ZZ5Woذfﳚh}>蛣(;O-׈ws!R/onhKQM6D9H"O!u B-CdHƤh$D9xԵ%RSI?1؟DI-7B2j9h9bhlNLd3,LvB_K˄.-#ןA|+yڢh9~"9ןA }K Oȕ[WT',e#'TYrxjYiGi;Ղ䗷h/8M|*rQV!kx 2mm僔uNhT堪?:MsAiDˏ+GۺX:hy^hAYDAm)Д->俭qu2'0W'Z)Wh *l}V-s x§+DA Д)PMXW-_jO%ZC;$^B#V|Z2WO$_MDK~ +>xԵ'RSGt)CsHjhQ-wD}6`cS6X%Z:πg$HJ޻Lɻ-T;F  @GĨ.3 5><ߠ春]<;v`gL!mw{ `G 3[NT 5M w +endstream +endobj + +1271 0 obj +<> +stream +x[Ko6 +:# rd!@fvRc;3-im(r#ےH~: 笿]_C XC^!8׹QYI3Wg4<7s 8~? +#o@uU1yB9~efi "ub0,^^/wu/J_^~Rv?2v^0jǂ{Dvԅx{;PiN7>\ƻ54߰q6_gC?nHkKǎt.טƓ /[BЈ w˲4J}&$+LhVL;bnBחq:߳-+7ù5tsH>`u$x:C!X4Ў46 L¶ԬUȞ'mm0s:n=q6UƱ㓩\,pˡa]O5LgL|ۄ&CMV-mxv~K>pN"0"m6 'Upjz>}obc!1u۞} R;9z&מC:Ec"EϲL ΊCqphߗ>/YkS:F Fů- +z=@R}uC6TcE)&-yX6n?W?{! lO$ZuvH$ " RYPTjcCeg`[笋mU٫\eD.*7l@2n9˫Z,::)!zN4J$vG|2ޗS}k^G3xhК4s{0ɺ-N֕L-pG=OOL)UN6DarP.o5X{ +[z^O+.c"(eZOO*e㟧dL>nYF]=Dž\ `Ѱvt`t` Dzrұ)ټnx# +endstream +endobj + +1272 0 obj +<> +stream +x][ܶ+zlX +;5`Ms6>Aبp]QiҮ H"\93д6 +=~Dk;mbkЂM}Soi7M~3m .?toMx߿{ ob&J>YN*)oNCƺѳݛxը/}rumMs\ѪJӋx]\)?Ml7Ts*ۘCp 6_@W6w/LTvGGwxↇn\㓜NBo2Ņ-z|A,ۙ&Z\Pd|Wu, (Y&2¹|7/ TKz OU[c=nħ?ݤB2A]7V㾛k4x8X ΐaȰ_2-6M֡Ioev 5QN!~FYzL{c7Mʏ ثUB,̀{ 259?'Vjm{<`NF HlS͈B$7gJ=CBLS"@ϕ} cЫ# :I@\6yG/cq{f#'1e? jlZ GRT6r +R2$G@>ZktL|V2ߏa<A=ZdZImJqdT`moNZLv>e%JeF+i9 Eem~CdLu9%S5sFɘ3Qu̢2h)<_ `J, S+PIshqWmXAWUK@a:<~{d~_ڱdD]fCʕG'$bY2rb֐YP;NNhq(A)O8$PeI9gmv>VɄjOS#uΈSAazx% +JsACKDHmbRG8[#o2 N!H!9߳t!I0Jq +@sx}ZA3z6z^0d^TA \@6+r3B&%,lŃ7ђbLܜd!PW鰣`zL3x6A+*fB EHO9b 2˘"hL)31cLaG^ e +ˌ ˼Q!'00r^)C#sTo!2R3KF`U+ҩXCYG +Wr'#ӊ3؅ +P3 8y¾&!!]b@QF79¬@3:+ |']]Bף6SX32PxřG[eԉLH0"@z"3)N3iSN {&vPԇA }k"K"tG"tGl6&{<$jh90{:׮N] D%,ў!r@؎b},̢t9͸EE-fqD/˥c_\ș2S=M|%B兩q$ve걳rA.%%8om.P+?:EQu +&[3/-УY.iO_] +K8IY|eC@52*%y:o3)ۥ$I;D-5^cZ!]ΝϔȀ+K>LIzig{*KRĜDpW6s + Izxi"L +J'`<2x@΅QKLC}L,&VWVsoBΟ 1M틅Ev{ISO,3O\j=+]%k].UrI+qK+ּrsYE:m2{n.lPN_K,QEKlO!%K7nM[iVdLڇȿmꦾQL:^!LYhPk)?cب rg9pV0xRg=^vȬ&yV\>J| uxkw:fט( qr? ˆUz^/\RK3:lv:&9Gə;[lulW;&rpMd^VC A;A) Eh1ÙPNgo%[HgKТ"UsQq#љU^/-I2a*ZLY|r+s(LP]τJ9AҒ [! -)8g0K?U]!1Oj?)})$NmޞGdn(xdU^So66v j_!.R>UymF>4'&*d#L%ɺBxiGQRȗ³y +⯆z^;g= HlVOڸ܇lɹ/IIS6ߣQj~9}To6; + ~E 'R5>gƂ/9W߇i6Sٽ"ukrþox {g 38C6uQFbf?;r~\s4Z_ۯO/0e +endstream +endobj + +1273 0 obj +<> +stream +x]m5+x^-E"Y˒E @;ϧ<3IOuWyz*B̺R:/ə.%u~6qv娬 9[ew)5?0fj#.$3)?(* 2Py%CQiQ|\*vuTU{cNږXZmBrǪ&5Q}[/lPC36`þyq.uǟw޾x~Nk勷U 4H,=K;SÏFe+5W_@}aF}՝3rQHt %[@DF Y}M$mm%a h -h 4!8&В0>Z0tc50P (A`^ [q\b4큘j[W[DAmsW"F<ED_I%*& *_} g U#Dy,o&1D&a](D?,-Z?ψ1bt9#D׋ d!3mX6X(gH^_O*[ޯRQ%v׼> N>9ޣ2!mac,7 )Ս`QPa$5jUFpT"G A̪ԉ4ɇF-&!V^p#0DTJL(hRڍ1TICH+h|Zfׁ'\$%VrV9jrߥ.XpppMMGIU]ݑy;3G Unio昉eoa0O8jk0h4xh)L.& a9BDuoW9!bJ|5ESڷ6Th7xEdar‰ H>,ͳN-6p*x_wQ٧qJd3NPZWR$3RW^T.9+KQWh$Ǩ<+H27S)K)F3̰SKn[zitRŔbPWl*TV\8J3d=ٌp `A@c̪5#Xܿl Ppvij| ZkHhl&6dMWA{rr59R,VԚ%AF ZkD,COxG)t +զHBEv+9;0ivh4ޕs DI*#x6"-YۼY}#ǀ$m7YP1-Zi4ʣ5nXys\ۅZK1.r$8^4@:uwpCrZH^ZǾx+ #y[ ̳87(&!@4nXu~>plND&[P1<[nA\ THҤ jU nyWz|jbJz! ѳzlf[f/7"~߶wyn66S^oL=sVTzgH+ous!CN%p*q\*vThfu{ApXq) `~Pvr!6 RBGd5@Ky5 "igT (9n FTB$K,oP^TEke8+.;i +$4W\xKK!$>*롗^%,evbM]1xkB +Yn1+p%N#'ݣ!P.閎? J'wPW8msFY̠̚{.->A;%MFy3=Di&m&iW0O1\?%~G$qnpnu{ +@-l'? (/2#x+7ks]2%>.h,&c`~#پT:_'?J|ꟳ!>?ha-b"!wKa4:Z0z> +G i]PpX2҄rFc\3qZ~LBN&0\͵ or>n@qqT fT$S#)c9.Jb[auYivSgQZ9ŀ=9b) +(B-^>ц?wW&q82> +stream +x[n6 D&! >N =n@ +=;]ڑݍ[; ,!g=r$=Pi{/Bz:NY^Y (F~A,Wg.vֻdz: +l@|=o/n +h$ +t1šڜsߑ`gm)]|yyqwӍWWo{tlxo.~De@mA3lQ{s6_ե֖6(b@0wZmnRާc Ԛ4RGPS, fCT\p<j4E{?wædoW}s}6'j v QCWǑal0 U +NFPVc3{yX< +#? i<-抏v>j&+g;܁4C{Mvpo@_1'{JYhhY;Z0ŠɎG kfjZ}j20#K*p5rN,P;健XlOVY{M=hd{cIzvcN:-ucߟI#O? f梴TPߢ}?xHg=3=B*VXTbH<Y*vVN2{s W٭2=}7 /Q_o;Ծv!^r{3g:!Ckƶ&O]>> +startxref +209973 +%%EOF diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190671.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190671.pdf new file mode 100644 index 000000000..167dcaaad Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190671.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190672.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190672.pdf new file mode 100644 index 000000000..bd7fdf81d Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500752190672.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500759637226.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500759637226.pdf new file mode 100644 index 000000000..7797c9a0d Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500759637226.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500761275639.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500761275639.pdf new file mode 100644 index 000000000..96ecd2888 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500761275639.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500761275640.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500761275640.pdf new file mode 100644 index 000000000..04cbd51e5 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500761275640.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500762478811.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500762478811.pdf new file mode 100644 index 000000000..5d7210659 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500762478811.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500762478813.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500762478813.pdf new file mode 100644 index 000000000..f3291edf4 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500762478813.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850382.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850382.pdf new file mode 100644 index 000000000..b3d330923 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850382.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850384.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850384.pdf new file mode 100644 index 000000000..5bd22bb1c --- /dev/null +++ b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850384.pdf @@ -0,0 +1,5639 @@ +%PDF-1.4 +%µ¶ +% Written by MuPDF 1.29.0 + +1 0 obj +<> +endobj + +2 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1073 0 R/StructParents 0/Parent 16 0 R>> +endobj + +3 0 obj +<> +endobj + +4 0 obj +<> +endobj + +5 0 obj +<> +endobj + +6 0 obj +<> +endobj + +7 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1074 0 R/StructParents 1/Parent 16 0 R>> +endobj + +8 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1075 0 R/StructParents 2/Parent 16 0 R>> +endobj + +9 0 obj +<> +endobj + +10 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1076 0 R/StructParents 3/Parent 16 0 R>> +endobj + +11 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1077 0 R/StructParents 4/Parent 16 0 R>> +endobj + +12 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1078 0 R/StructParents 5/Parent 16 0 R>> +endobj + +13 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1079 0 R/StructParents 6/Parent 16 0 R>> +endobj + +14 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1080 0 R/StructParents 7/Parent 16 0 R>> +endobj + +15 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1081 0 R/StructParents 8/Parent 17 0 R>> +endobj + +16 0 obj +<> +endobj + +17 0 obj +<> +endobj + +18 0 obj +<> +endobj + +19 0 obj +<> +endobj + +20 0 obj +<> +endobj + +21 0 obj +<><>]/ID(node00000004)>> +endobj + +22 0 obj +<> +endobj + +23 0 obj +<>]/ID(node00000025)>> +endobj + +24 0 obj +<> +endobj + +25 0 obj +<>]/ID(node00000026)>> +endobj + +26 0 obj +<> +endobj + +27 0 obj +<>]/ID(node00000029)>> +endobj + +28 0 obj +<> +endobj + +29 0 obj +<>]/ID(node00000031)>> +endobj + +30 0 obj +<> +endobj + +31 0 obj +<>]/ID(node00000034)>> +endobj + +32 0 obj +<> +endobj + +33 0 obj +<>]/ID(node00000036)>> +endobj + +34 0 obj +<> +endobj + +35 0 obj +<>]/ID(node00000038)>> +endobj + +36 0 obj +<> +endobj + +37 0 obj +<>]/ID(node00000040)>> +endobj + +38 0 obj +<> +endobj + +39 0 obj +<>]/ID(node00000042)>> +endobj + +40 0 obj +<> +endobj + +41 0 obj +<>]/ID(node00000044)>> +endobj + +42 0 obj +<> +endobj + +43 0 obj +<>]/ID(node00000046)>> +endobj + +44 0 obj +<> +endobj + +45 0 obj +<>]/ID(node00000048)>> +endobj + +46 0 obj +<>]/ID(node00000008)>> +endobj + +47 0 obj +<>]/ID(node00000009)>> +endobj + +48 0 obj +<>]/ID(node00000010)>> +endobj + +49 0 obj +<>]/ID(node00000011)>> +endobj + +50 0 obj +<> +endobj + +51 0 obj +<>]/ID(node00000013)>> +endobj + +52 0 obj +<> +endobj + +53 0 obj +<>]/ID(node00000014)>> +endobj + +54 0 obj +<> +endobj + +55 0 obj +<><>]/ID(node00000061)>> +endobj + +56 0 obj +<> +endobj + +57 0 obj +<>]/ID(node00000063)>> +endobj + +58 0 obj +<> +endobj + +59 0 obj +<><>]/ID(node00000065)>> +endobj + +60 0 obj +<> +endobj + +61 0 obj +<>]/ID(node00000067)>> +endobj + +62 0 obj +<> +endobj + +63 0 obj +<><>]/ID(node00000070)>> +endobj + +64 0 obj +<> +endobj + +65 0 obj +<><><>]/ID(node00000072)>> +endobj + +66 0 obj +<> +endobj + +67 0 obj +<>]/ID(node00000075)>> +endobj + +68 0 obj +<> +endobj + +69 0 obj +<>]/ID(node00000077)>> +endobj + +70 0 obj +<> +endobj + +71 0 obj +<>]/ID(node00000080)>> +endobj + +72 0 obj +<> +endobj + +73 0 obj +<>]/ID(node00000082)>> +endobj + +74 0 obj +<> +endobj + +75 0 obj +<>]/ID(node00000085)>> +endobj + +76 0 obj +<> +endobj + +77 0 obj +<>]/ID(node00000087)>> +endobj + +78 0 obj +<> +endobj + +79 0 obj +<>]/ID(node00000090)>> +endobj + +80 0 obj +<> +endobj + +81 0 obj +<>]/ID(node00000092)>> +endobj + +82 0 obj +<> +endobj + +83 0 obj +<>]/ID(node00000095)>> +endobj + +84 0 obj +<> +endobj + +85 0 obj +<>]/ID(node00000097)>> +endobj + +86 0 obj +<> +endobj + +87 0 obj +<>]/ID(node00000100)>> +endobj + +88 0 obj +<> +endobj + +89 0 obj +<>]/ID(node00000102)>> +endobj + +90 0 obj +<> +endobj + +91 0 obj +<>]/ID(node00000105)>> +endobj + +92 0 obj +<> +endobj + +93 0 obj +<>]/ID(node00000107)>> +endobj + +94 0 obj +<> +endobj + +95 0 obj +<>]/ID(node00000110)>> +endobj + +96 0 obj +<> +endobj + +97 0 obj +<>]/ID(node00000112)>> +endobj + +98 0 obj +<> +endobj + +99 0 obj +<>]/ID(node00000115)>> +endobj + +100 0 obj +<> +endobj + +101 0 obj +<>]/ID(node00000117)>> +endobj + +102 0 obj +<> +endobj + +103 0 obj +<>]/ID(node00000120)>> +endobj + +104 0 obj +<> +endobj + +105 0 obj +<>]/ID(node00000122)>> +endobj + +106 0 obj +<> +endobj + +107 0 obj +<>]/ID(node00000126)>> +endobj + +108 0 obj +<> +endobj + +109 0 obj +<>]/ID(node00000128)>> +endobj + +110 0 obj +<> +endobj + +111 0 obj +<>]/ID(node00000131)>> +endobj + +112 0 obj +<> +endobj + +113 0 obj +<>]/ID(node00000133)>> +endobj + +114 0 obj +<> +endobj + +115 0 obj +<>]/ID(node00000136)>> +endobj + +116 0 obj +<> +endobj + +117 0 obj +<>]/ID(node00000138)>> +endobj + +118 0 obj +<> +endobj + +119 0 obj +<>]/ID(node00000141)>> +endobj + +120 0 obj +<> +endobj + +121 0 obj +<>]/ID(node00000143)>> +endobj + +122 0 obj +<> +endobj + +123 0 obj +<>]/ID(node00000147)>> +endobj + +124 0 obj +<> +endobj + +125 0 obj +<>]/ID(node00000149)>> +endobj + +126 0 obj +<> +endobj + +127 0 obj +<>]/ID(node00000153)>> +endobj + +128 0 obj +<> +endobj + +129 0 obj +<>]/ID(node00000156)>> +endobj + +130 0 obj +<> +endobj + +131 0 obj +<>]/ID(node00000159)>> +endobj + +132 0 obj +<> +endobj + +133 0 obj +<>]/ID(node00000161)>> +endobj + +134 0 obj +<> +endobj + +135 0 obj +<>]/ID(node00000164)>> +endobj + +136 0 obj +<> +endobj + +137 0 obj +<>]/ID(node00000166)>> +endobj + +138 0 obj +<> +endobj + +139 0 obj +<>]/ID(node00000169)>> +endobj + +140 0 obj +<> +endobj + +141 0 obj +<>]/ID(node00000171)>> +endobj + +142 0 obj +<> +endobj + +143 0 obj +<>]/ID(node00000174)>> +endobj + +144 0 obj +<> +endobj + +145 0 obj +<>]/ID(node00000176)>> +endobj + +146 0 obj +<> +endobj + +147 0 obj +<>]/ID(node00000180)>> +endobj + +148 0 obj +<> +endobj + +149 0 obj +<>]/ID(node00000182)>> +endobj + +150 0 obj +<> +endobj + +151 0 obj +<>]/ID(node00000185)>> +endobj + +152 0 obj +<> +endobj + +153 0 obj +<>]/ID(node00000187)>> +endobj + +154 0 obj +<> +endobj + +155 0 obj +<>]/ID(node00000191)>> +endobj + +156 0 obj +<> +endobj + +157 0 obj +<>]/ID(node00000193)>> +endobj + +158 0 obj +<> +endobj + +159 0 obj +<>]/ID(node00000196)>> +endobj + +160 0 obj +<> +endobj + +161 0 obj +<>]/ID(node00000198)>> +endobj + +162 0 obj +<> +endobj + +163 0 obj +<>]/ID(node00000201)>> +endobj + +164 0 obj +<> +endobj + +165 0 obj +<>]/ID(node00000203)>> +endobj + +166 0 obj +<> +endobj + +167 0 obj +<>]/ID(node00000207)>> +endobj + +168 0 obj +<> +endobj + +169 0 obj +<>]/ID(node00000209)>> +endobj + +170 0 obj +<> +endobj + +171 0 obj +<>]/ID(node00000212)>> +endobj + +172 0 obj +<> +endobj + +173 0 obj +<>]/ID(node00000214)>> +endobj + +174 0 obj +<> +endobj + +175 0 obj +<>]/ID(node00000217)>> +endobj + +176 0 obj +<> +endobj + +177 0 obj +<>]/ID(node00000219)>> +endobj + +178 0 obj +<> +endobj + +179 0 obj +<>]/ID(node00000222)>> +endobj + +180 0 obj +<> +endobj + +181 0 obj +<>]/ID(node00000224)>> +endobj + +182 0 obj +<> +endobj + +183 0 obj +<>]/ID(node00000227)>> +endobj + +184 0 obj +<> +endobj + +185 0 obj +<>]/ID(node00000229)>> +endobj + +186 0 obj +<> +endobj + +187 0 obj +<>]/ID(node00000233)>> +endobj + +188 0 obj +<> +endobj + +189 0 obj +<> +endobj + +190 0 obj +<> +endobj + +191 0 obj +<><><>]/ID(node00000238)>> +endobj + +192 0 obj +<>]/ID(node00000239)>> +endobj + +193 0 obj +<><><>]/ID(node00000240)>> +endobj + +194 0 obj +<>]/ID(node00000241)>> +endobj + +195 0 obj +<><><>]/ID(node00000242)>> +endobj + +196 0 obj +<>]/ID(node00000243)>> +endobj + +197 0 obj +<><><>]/ID(node00000244)>> +endobj + +198 0 obj +<>]/ID(node00000245)>> +endobj + +199 0 obj +<> +endobj + +200 0 obj +<><><>]/ID(node00000248)>> +endobj + +201 0 obj +<>]/ID(node00000249)>> +endobj + +202 0 obj +<> +endobj + +203 0 obj +<><><>]/ID(node00000251)>> +endobj + +204 0 obj +<>]/ID(node00000252)>> +endobj + +205 0 obj +<><><>]/ID(node00000253)>> +endobj + +206 0 obj +<>]/ID(node00000254)>> +endobj + +207 0 obj +<><><>]/ID(node00000255)>> +endobj + +208 0 obj +<>]/ID(node00000256)>> +endobj + +209 0 obj +<><><>]/ID(node00000257)>> +endobj + +210 0 obj +<>]/ID(node00000258)>> +endobj + +211 0 obj +<><><>]/ID(node00000259)>> +endobj + +212 0 obj +<>]/ID(node00000260)>> +endobj + +213 0 obj +<> +endobj + +214 0 obj +<><><>]/ID(node00000262)>> +endobj + +215 0 obj +<>]/ID(node00000263)>> +endobj + +216 0 obj +<><><>]/ID(node00000264)>> +endobj + +217 0 obj +<>]/ID(node00000265)>> +endobj + +218 0 obj +<><><>]/ID(node00000266)>> +endobj + +219 0 obj +<>]/ID(node00000267)>> +endobj + +220 0 obj +<><><>]/ID(node00000268)>> +endobj + +221 0 obj +<>]/ID(node00000269)>> +endobj + +222 0 obj +<><><>]/ID(node00000270)>> +endobj + +223 0 obj +<>]/ID(node00000271)>> +endobj + +224 0 obj +<> +endobj + +225 0 obj +<>]/ID(node00000275)>> +endobj + +226 0 obj +<> +endobj + +227 0 obj +<>]/ID(node00000278)>> +endobj + +228 0 obj +<> +endobj + +229 0 obj +<>]/ID(node00000281)>> +endobj + +230 0 obj +<> +endobj + +231 0 obj +<>]/ID(node00000283)>> +endobj + +232 0 obj +<> +endobj + +233 0 obj +<>]/ID(node00000286)>> +endobj + +234 0 obj +<> +endobj + +235 0 obj +<>]/ID(node00000288)>> +endobj + +236 0 obj +<> +endobj + +237 0 obj +<>]/ID(node00000291)>> +endobj + +238 0 obj +<> +endobj + +239 0 obj +<>]/ID(node00000293)>> +endobj + +240 0 obj +<> +endobj + +241 0 obj +<>]/ID(node00000296)>> +endobj + +242 0 obj +<> +endobj + +243 0 obj +<>]/ID(node00000298)>> +endobj + +244 0 obj +<> +endobj + +245 0 obj +<><>]/ID(node00000302)>> +endobj + +246 0 obj +<> +endobj + +247 0 obj +<>]/ID(node00000304)>> +endobj + +248 0 obj +<> +endobj + +249 0 obj +<>]/ID(node00000309)>> +endobj + +250 0 obj +<> +endobj + +251 0 obj +<>]/ID(node00000311)>> +endobj + +252 0 obj +<> +endobj + +253 0 obj +<>]/ID(node00000315)>> +endobj + +254 0 obj +<> +endobj + +255 0 obj +<>]/ID(node00000318)>> +endobj + +256 0 obj +<> +endobj + +257 0 obj +<>]/ID(node00000321)>> +endobj + +258 0 obj +<> +endobj + +259 0 obj +<>]/ID(node00000323)>> +endobj + +260 0 obj +<> +endobj + +261 0 obj +<>]/ID(node00000326)>> +endobj + +262 0 obj +<> +endobj + +263 0 obj +<>]/ID(node00000328)>> +endobj + +264 0 obj +<> +endobj + +265 0 obj +<>]/ID(node00000331)>> +endobj + +266 0 obj +<> +endobj + +267 0 obj +<>]/ID(node00000333)>> +endobj + +268 0 obj +<> +endobj + +269 0 obj +<>]/ID(node00000336)>> +endobj + +270 0 obj +<> +endobj + +271 0 obj +<>]/ID(node00000338)>> +endobj + +272 0 obj +<> +endobj + +273 0 obj +<>]/ID(node00000341)>> +endobj + +274 0 obj +<> +endobj + +275 0 obj +<>]/ID(node00000343)>> +endobj + +276 0 obj +<> +endobj + +277 0 obj +<>]/ID(node00000346)>> +endobj + +278 0 obj +<> +endobj + +279 0 obj +<>]/ID(node00000348)>> +endobj + +280 0 obj +<> +endobj + +281 0 obj +<>]/ID(node00000351)>> +endobj + +282 0 obj +<> +endobj + +283 0 obj +<>]/ID(node00000353)>> +endobj + +284 0 obj +<> +endobj + +285 0 obj +<>]/ID(node00000356)>> +endobj + +286 0 obj +<> +endobj + +287 0 obj +<>]/ID(node00000358)>> +endobj + +288 0 obj +<> +endobj + +289 0 obj +<>]/ID(node00000361)>> +endobj + +290 0 obj +<> +endobj + +291 0 obj +<>]/ID(node00000363)>> +endobj + +292 0 obj +<> +endobj + +293 0 obj +<>]/ID(node00000366)>> +endobj + +294 0 obj +<> +endobj + +295 0 obj +<>]/ID(node00000368)>> +endobj + +296 0 obj +<> +endobj + +297 0 obj +<>]/ID(node00000371)>> +endobj + +298 0 obj +<> +endobj + +299 0 obj +<>]/ID(node00000373)>> +endobj + +300 0 obj +<> +endobj + +301 0 obj +<>]/ID(node00000377)>> +endobj + +302 0 obj +<> +endobj + +303 0 obj +<>]/ID(node00000380)>> +endobj + +304 0 obj +<> +endobj + +305 0 obj +<>]/ID(node00000382)>> +endobj + +306 0 obj +<> +endobj + +307 0 obj +<>]/ID(node00000385)>> +endobj + +308 0 obj +<> +endobj + +309 0 obj +<>]/ID(node00000387)>> +endobj + +310 0 obj +<> +endobj + +311 0 obj +<>]/ID(node00000390)>> +endobj + +312 0 obj +<> +endobj + +313 0 obj +<>]/ID(node00000392)>> +endobj + +314 0 obj +<> +endobj + +315 0 obj +<>]/ID(node00000395)>> +endobj + +316 0 obj +<> +endobj + +317 0 obj +<>]/ID(node00000397)>> +endobj + +318 0 obj +<> +endobj + +319 0 obj +<>]/ID(node00000400)>> +endobj + +320 0 obj +<> +endobj + +321 0 obj +<>]/ID(node00000402)>> +endobj + +322 0 obj +<> +endobj + +323 0 obj +<>]/ID(node00000405)>> +endobj + +324 0 obj +<> +endobj + +325 0 obj +<>]/ID(node00000407)>> +endobj + +326 0 obj +<> +endobj + +327 0 obj +<>]/ID(node00000410)>> +endobj + +328 0 obj +<> +endobj + +329 0 obj +<>]/ID(node00000412)>> +endobj + +330 0 obj +<> +endobj + +331 0 obj +<>]/ID(node00000415)>> +endobj + +332 0 obj +<> +endobj + +333 0 obj +<>]/ID(node00000417)>> +endobj + +334 0 obj +<> +endobj + +335 0 obj +<>]/ID(node00000420)>> +endobj + +336 0 obj +<> +endobj + +337 0 obj +<>]/ID(node00000422)>> +endobj + +338 0 obj +<> +endobj + +339 0 obj +<>]/ID(node00000425)>> +endobj + +340 0 obj +<> +endobj + +341 0 obj +<>]/ID(node00000427)>> +endobj + +342 0 obj +<> +endobj + +343 0 obj +<>]/ID(node00000430)>> +endobj + +344 0 obj +<> +endobj + +345 0 obj +<>]/ID(node00000432)>> +endobj + +346 0 obj +<> +endobj + +347 0 obj +<>]/ID(node00000436)>> +endobj + +348 0 obj +<> +endobj + +349 0 obj +<>]/ID(node00000439)>> +endobj + +350 0 obj +<> +endobj + +351 0 obj +<>]/ID(node00000441)>> +endobj + +352 0 obj +<> +endobj + +353 0 obj +<>]/ID(node00000444)>> +endobj + +354 0 obj +<> +endobj + +355 0 obj +<>]/ID(node00000446)>> +endobj + +356 0 obj +<> +endobj + +357 0 obj +<>]/ID(node00000449)>> +endobj + +358 0 obj +<> +endobj + +359 0 obj +<>]/ID(node00000451)>> +endobj + +360 0 obj +<> +endobj + +361 0 obj +<>]/ID(node00000454)>> +endobj + +362 0 obj +<> +endobj + +363 0 obj +<>]/ID(node00000456)>> +endobj + +364 0 obj +<> +endobj + +365 0 obj +<>]/ID(node00000459)>> +endobj + +366 0 obj +<> +endobj + +367 0 obj +<>]/ID(node00000461)>> +endobj + +368 0 obj +<> +endobj + +369 0 obj +<>]/ID(node00000464)>> +endobj + +370 0 obj +<> +endobj + +371 0 obj +<>]/ID(node00000466)>> +endobj + +372 0 obj +<> +endobj + +373 0 obj +<>]/ID(node00000469)>> +endobj + +374 0 obj +<> +endobj + +375 0 obj +<>]/ID(node00000471)>> +endobj + +376 0 obj +<> +endobj + +377 0 obj +<>]/ID(node00000474)>> +endobj + +378 0 obj +<> +endobj + +379 0 obj +<>]/ID(node00000476)>> +endobj + +380 0 obj +<> +endobj + +381 0 obj +<>]/ID(node00000479)>> +endobj + +382 0 obj +<> +endobj + +383 0 obj +<>]/ID(node00000481)>> +endobj + +384 0 obj +<> +endobj + +385 0 obj +<>]/ID(node00000484)>> +endobj + +386 0 obj +<> +endobj + +387 0 obj +<>]/ID(node00000486)>> +endobj + +388 0 obj +<> +endobj + +389 0 obj +<>]/ID(node00000489)>> +endobj + +390 0 obj +<> +endobj + +391 0 obj +<>]/ID(node00000491)>> +endobj + +392 0 obj +<> +endobj + +393 0 obj +<>]/ID(node00000495)>> +endobj + +394 0 obj +<> +endobj + +395 0 obj +<>]/ID(node00000498)>> +endobj + +396 0 obj +<> +endobj + +397 0 obj +<>]/ID(node00000500)>> +endobj + +398 0 obj +<> +endobj + +399 0 obj +<>]/ID(node00000503)>> +endobj + +400 0 obj +<> +endobj + +401 0 obj +<>]/ID(node00000505)>> +endobj + +402 0 obj +<> +endobj + +403 0 obj +<>]/ID(node00000508)>> +endobj + +404 0 obj +<> +endobj + +405 0 obj +<>]/ID(node00000510)>> +endobj + +406 0 obj +<> +endobj + +407 0 obj +<>]/ID(node00000513)>> +endobj + +408 0 obj +<> +endobj + +409 0 obj +<>]/ID(node00000515)>> +endobj + +410 0 obj +<> +endobj + +411 0 obj +<>]/ID(node00000518)>> +endobj + +412 0 obj +<> +endobj + +413 0 obj +<>]/ID(node00000520)>> +endobj + +414 0 obj +<> +endobj + +415 0 obj +<>]/ID(node00000523)>> +endobj + +416 0 obj +<> +endobj + +417 0 obj +<>]/ID(node00000525)>> +endobj + +418 0 obj +<> +endobj + +419 0 obj +<>]/ID(node00000528)>> +endobj + +420 0 obj +<> +endobj + +421 0 obj +<>]/ID(node00000530)>> +endobj + +422 0 obj +<> +endobj + +423 0 obj +<>]/ID(node00000533)>> +endobj + +424 0 obj +<> +endobj + +425 0 obj +<>]/ID(node00000535)>> +endobj + +426 0 obj +<> +endobj + +427 0 obj +<>]/ID(node00000538)>> +endobj + +428 0 obj +<> +endobj + +429 0 obj +<>]/ID(node00000540)>> +endobj + +430 0 obj +<> +endobj + +431 0 obj +<>]/ID(node00000543)>> +endobj + +432 0 obj +<> +endobj + +433 0 obj +<>]/ID(node00000545)>> +endobj + +434 0 obj +<> +endobj + +435 0 obj +<>]/ID(node00000548)>> +endobj + +436 0 obj +<> +endobj + +437 0 obj +<>]/ID(node00000550)>> +endobj + +438 0 obj +<> +endobj + +439 0 obj +<>]/ID(node00000554)>> +endobj + +440 0 obj +<> +endobj + +441 0 obj +<>]/ID(node00000557)>> +endobj + +442 0 obj +<> +endobj + +443 0 obj +<>]/ID(node00000559)>> +endobj + +444 0 obj +<> +endobj + +445 0 obj +<>]/ID(node00000562)>> +endobj + +446 0 obj +<> +endobj + +447 0 obj +<>]/ID(node00000564)>> +endobj + +448 0 obj +<> +endobj + +449 0 obj +<>]/ID(node00000567)>> +endobj + +450 0 obj +<> +endobj + +451 0 obj +<>]/ID(node00000569)>> +endobj + +452 0 obj +<> +endobj + +453 0 obj +<>]/ID(node00000572)>> +endobj + +454 0 obj +<> +endobj + +455 0 obj +<>]/ID(node00000574)>> +endobj + +456 0 obj +<> +endobj + +457 0 obj +<>]/ID(node00000577)>> +endobj + +458 0 obj +<> +endobj + +459 0 obj +<>]/ID(node00000579)>> +endobj + +460 0 obj +<> +endobj + +461 0 obj +<>]/ID(node00000582)>> +endobj + +462 0 obj +<> +endobj + +463 0 obj +<>]/ID(node00000584)>> +endobj + +464 0 obj +<> +endobj + +465 0 obj +<>]/ID(node00000587)>> +endobj + +466 0 obj +<> +endobj + +467 0 obj +<>]/ID(node00000589)>> +endobj + +468 0 obj +<> +endobj + +469 0 obj +<>]/ID(node00000592)>> +endobj + +470 0 obj +<> +endobj + +471 0 obj +<>]/ID(node00000594)>> +endobj + +472 0 obj +<> +endobj + +473 0 obj +<>]/ID(node00000597)>> +endobj + +474 0 obj +<> +endobj + +475 0 obj +<>]/ID(node00000599)>> +endobj + +476 0 obj +<> +endobj + +477 0 obj +<>]/ID(node00000602)>> +endobj + +478 0 obj +<> +endobj + +479 0 obj +<>]/ID(node00000604)>> +endobj + +480 0 obj +<> +endobj + +481 0 obj +<>]/ID(node00000607)>> +endobj + +482 0 obj +<> +endobj + +483 0 obj +<>]/ID(node00000609)>> +endobj + +484 0 obj +<> +endobj + +485 0 obj +<>]/ID(node00000613)>> +endobj + +486 0 obj +<> +endobj + +487 0 obj +<>]/ID(node00000616)>> +endobj + +488 0 obj +<> +endobj + +489 0 obj +<>]/ID(node00000618)>> +endobj + +490 0 obj +<> +endobj + +491 0 obj +<>]/ID(node00000621)>> +endobj + +492 0 obj +<> +endobj + +493 0 obj +<>]/ID(node00000623)>> +endobj + +494 0 obj +<> +endobj + +495 0 obj +<>]/ID(node00000626)>> +endobj + +496 0 obj +<> +endobj + +497 0 obj +<>]/ID(node00000628)>> +endobj + +498 0 obj +<> +endobj + +499 0 obj +<>]/ID(node00000631)>> +endobj + +500 0 obj +<> +endobj + +501 0 obj +<>]/ID(node00000633)>> +endobj + +502 0 obj +<> +endobj + +503 0 obj +<>]/ID(node00000636)>> +endobj + +504 0 obj +<> +endobj + +505 0 obj +<>]/ID(node00000638)>> +endobj + +506 0 obj +<> +endobj + +507 0 obj +<>]/ID(node00000641)>> +endobj + +508 0 obj +<> +endobj + +509 0 obj +<>]/ID(node00000643)>> +endobj + +510 0 obj +<> +endobj + +511 0 obj +<>]/ID(node00000646)>> +endobj + +512 0 obj +<> +endobj + +513 0 obj +<>]/ID(node00000648)>> +endobj + +514 0 obj +<> +endobj + +515 0 obj +<>]/ID(node00000651)>> +endobj + +516 0 obj +<> +endobj + +517 0 obj +<>]/ID(node00000653)>> +endobj + +518 0 obj +<> +endobj + +519 0 obj +<>]/ID(node00000656)>> +endobj + +520 0 obj +<> +endobj + +521 0 obj +<>]/ID(node00000658)>> +endobj + +522 0 obj +<> +endobj + +523 0 obj +<>]/ID(node00000661)>> +endobj + +524 0 obj +<> +endobj + +525 0 obj +<>]/ID(node00000663)>> +endobj + +526 0 obj +<> +endobj + +527 0 obj +<>]/ID(node00000666)>> +endobj + +528 0 obj +<> +endobj + +529 0 obj +<>]/ID(node00000668)>> +endobj + +530 0 obj +<> +endobj + +531 0 obj +<>]/ID(node00000672)>> +endobj + +532 0 obj +<> +endobj + +533 0 obj +<>]/ID(node00000675)>> +endobj + +534 0 obj +<> +endobj + +535 0 obj +<>]/ID(node00000677)>> +endobj + +536 0 obj +<> +endobj + +537 0 obj +<>]/ID(node00000680)>> +endobj + +538 0 obj +<> +endobj + +539 0 obj +<>]/ID(node00000682)>> +endobj + +540 0 obj +<> +endobj + +541 0 obj +<>]/ID(node00000685)>> +endobj + +542 0 obj +<> +endobj + +543 0 obj +<>]/ID(node00000687)>> +endobj + +544 0 obj +<> +endobj + +545 0 obj +<>]/ID(node00000690)>> +endobj + +546 0 obj +<> +endobj + +547 0 obj +<>]/ID(node00000692)>> +endobj + +548 0 obj +<> +endobj + +549 0 obj +<>]/ID(node00000695)>> +endobj + +550 0 obj +<> +endobj + +551 0 obj +<>]/ID(node00000697)>> +endobj + +552 0 obj +<> +endobj + +553 0 obj +<>]/ID(node00000700)>> +endobj + +554 0 obj +<> +endobj + +555 0 obj +<>]/ID(node00000702)>> +endobj + +556 0 obj +<> +endobj + +557 0 obj +<>]/ID(node00000705)>> +endobj + +558 0 obj +<> +endobj + +559 0 obj +<>]/ID(node00000707)>> +endobj + +560 0 obj +<> +endobj + +561 0 obj +<>]/ID(node00000710)>> +endobj + +562 0 obj +<> +endobj + +563 0 obj +<>]/ID(node00000712)>> +endobj + +564 0 obj +<> +endobj + +565 0 obj +<>]/ID(node00000715)>> +endobj + +566 0 obj +<> +endobj + +567 0 obj +<>]/ID(node00000717)>> +endobj + +568 0 obj +<> +endobj + +569 0 obj +<>]/ID(node00000720)>> +endobj + +570 0 obj +<> +endobj + +571 0 obj +<>]/ID(node00000722)>> +endobj + +572 0 obj +<> +endobj + +573 0 obj +<>]/ID(node00000725)>> +endobj + +574 0 obj +<> +endobj + +575 0 obj +<>]/ID(node00000727)>> +endobj + +576 0 obj +<> +endobj + +577 0 obj +<>]/ID(node00000731)>> +endobj + +578 0 obj +<> +endobj + +579 0 obj +<>]/ID(node00000734)>> +endobj + +580 0 obj +<> +endobj + +581 0 obj +<>]/ID(node00000736)>> +endobj + +582 0 obj +<> +endobj + +583 0 obj +<>]/ID(node00000739)>> +endobj + +584 0 obj +<> +endobj + +585 0 obj +<>]/ID(node00000741)>> +endobj + +586 0 obj +<> +endobj + +587 0 obj +<>]/ID(node00000744)>> +endobj + +588 0 obj +<> +endobj + +589 0 obj +<>]/ID(node00000746)>> +endobj + +590 0 obj +<> +endobj + +591 0 obj +<>]/ID(node00000749)>> +endobj + +592 0 obj +<> +endobj + +593 0 obj +<>]/ID(node00000751)>> +endobj + +594 0 obj +<> +endobj + +595 0 obj +<>]/ID(node00000754)>> +endobj + +596 0 obj +<> +endobj + +597 0 obj +<>]/ID(node00000756)>> +endobj + +598 0 obj +<> +endobj + +599 0 obj +<>]/ID(node00000759)>> +endobj + +600 0 obj +<> +endobj + +601 0 obj +<>]/ID(node00000761)>> +endobj + +602 0 obj +<> +endobj + +603 0 obj +<>]/ID(node00000764)>> +endobj + +604 0 obj +<> +endobj + +605 0 obj +<>]/ID(node00000766)>> +endobj + +606 0 obj +<> +endobj + +607 0 obj +<>]/ID(node00000769)>> +endobj + +608 0 obj +<> +endobj + +609 0 obj +<>]/ID(node00000771)>> +endobj + +610 0 obj +<> +endobj + +611 0 obj +<>]/ID(node00000774)>> +endobj + +612 0 obj +<> +endobj + +613 0 obj +<>]/ID(node00000776)>> +endobj + +614 0 obj +<> +endobj + +615 0 obj +<>]/ID(node00000779)>> +endobj + +616 0 obj +<> +endobj + +617 0 obj +<>]/ID(node00000781)>> +endobj + +618 0 obj +<> +endobj + +619 0 obj +<>]/ID(node00000784)>> +endobj + +620 0 obj +<> +endobj + +621 0 obj +<>]/ID(node00000786)>> +endobj + +622 0 obj +<> +endobj + +623 0 obj +<>]/ID(node00000790)>> +endobj + +624 0 obj +<> +endobj + +625 0 obj +<>]/ID(node00000793)>> +endobj + +626 0 obj +<> +endobj + +627 0 obj +<>]/ID(node00000795)>> +endobj + +628 0 obj +<> +endobj + +629 0 obj +<>]/ID(node00000798)>> +endobj + +630 0 obj +<> +endobj + +631 0 obj +<>]/ID(node00000800)>> +endobj + +632 0 obj +<> +endobj + +633 0 obj +<>]/ID(node00000803)>> +endobj + +634 0 obj +<> +endobj + +635 0 obj +<>]/ID(node00000805)>> +endobj + +636 0 obj +<> +endobj + +637 0 obj +<>]/ID(node00000808)>> +endobj + +638 0 obj +<> +endobj + +639 0 obj +<>]/ID(node00000810)>> +endobj + +640 0 obj +<> +endobj + +641 0 obj +<>]/ID(node00000813)>> +endobj + +642 0 obj +<> +endobj + +643 0 obj +<>]/ID(node00000815)>> +endobj + +644 0 obj +<> +endobj + +645 0 obj +<>]/ID(node00000818)>> +endobj + +646 0 obj +<> +endobj + +647 0 obj +<>]/ID(node00000820)>> +endobj + +648 0 obj +<> +endobj + +649 0 obj +<>]/ID(node00000823)>> +endobj + +650 0 obj +<> +endobj + +651 0 obj +<>]/ID(node00000825)>> +endobj + +652 0 obj +<> +endobj + +653 0 obj +<>]/ID(node00000828)>> +endobj + +654 0 obj +<> +endobj + +655 0 obj +<>]/ID(node00000830)>> +endobj + +656 0 obj +<> +endobj + +657 0 obj +<>]/ID(node00000833)>> +endobj + +658 0 obj +<> +endobj + +659 0 obj +<>]/ID(node00000835)>> +endobj + +660 0 obj +<> +endobj + +661 0 obj +<>]/ID(node00000838)>> +endobj + +662 0 obj +<> +endobj + +663 0 obj +<>]/ID(node00000840)>> +endobj + +664 0 obj +<> +endobj + +665 0 obj +<>]/ID(node00000843)>> +endobj + +666 0 obj +<> +endobj + +667 0 obj +<>]/ID(node00000845)>> +endobj + +668 0 obj +<> +endobj + +669 0 obj +<>]/ID(node00000849)>> +endobj + +670 0 obj +<> +endobj + +671 0 obj +<>]/ID(node00000852)>> +endobj + +672 0 obj +<> +endobj + +673 0 obj +<>]/ID(node00000854)>> +endobj + +674 0 obj +<> +endobj + +675 0 obj +<>]/ID(node00000857)>> +endobj + +676 0 obj +<> +endobj + +677 0 obj +<>]/ID(node00000859)>> +endobj + +678 0 obj +<> +endobj + +679 0 obj +<>]/ID(node00000862)>> +endobj + +680 0 obj +<> +endobj + +681 0 obj +<>]/ID(node00000864)>> +endobj + +682 0 obj +<> +endobj + +683 0 obj +<>]/ID(node00000867)>> +endobj + +684 0 obj +<> +endobj + +685 0 obj +<>]/ID(node00000869)>> +endobj + +686 0 obj +<> +endobj + +687 0 obj +<>]/ID(node00000872)>> +endobj + +688 0 obj +<> +endobj + +689 0 obj +<>]/ID(node00000874)>> +endobj + +690 0 obj +<> +endobj + +691 0 obj +<>]/ID(node00000877)>> +endobj + +692 0 obj +<> +endobj + +693 0 obj +<>]/ID(node00000879)>> +endobj + +694 0 obj +<> +endobj + +695 0 obj +<>]/ID(node00000882)>> +endobj + +696 0 obj +<> +endobj + +697 0 obj +<>]/ID(node00000884)>> +endobj + +698 0 obj +<> +endobj + +699 0 obj +<>]/ID(node00000887)>> +endobj + +700 0 obj +<> +endobj + +701 0 obj +<>]/ID(node00000889)>> +endobj + +702 0 obj +<> +endobj + +703 0 obj +<>]/ID(node00000892)>> +endobj + +704 0 obj +<> +endobj + +705 0 obj +<>]/ID(node00000894)>> +endobj + +706 0 obj +<> +endobj + +707 0 obj +<>]/ID(node00000897)>> +endobj + +708 0 obj +<> +endobj + +709 0 obj +<>]/ID(node00000899)>> +endobj + +710 0 obj +<> +endobj + +711 0 obj +<>]/ID(node00000902)>> +endobj + +712 0 obj +<> +endobj + +713 0 obj +<>]/ID(node00000904)>> +endobj + +714 0 obj +<> +endobj + +715 0 obj +<>]/ID(node00000908)>> +endobj + +716 0 obj +<> +endobj + +717 0 obj +<>]/ID(node00000911)>> +endobj + +718 0 obj +<> +endobj + +719 0 obj +<>]/ID(node00000913)>> +endobj + +720 0 obj +<> +endobj + +721 0 obj +<>]/ID(node00000916)>> +endobj + +722 0 obj +<> +endobj + +723 0 obj +<>]/ID(node00000918)>> +endobj + +724 0 obj +<> +endobj + +725 0 obj +<>]/ID(node00000921)>> +endobj + +726 0 obj +<> +endobj + +727 0 obj +<>]/ID(node00000923)>> +endobj + +728 0 obj +<> +endobj + +729 0 obj +<>]/ID(node00000926)>> +endobj + +730 0 obj +<> +endobj + +731 0 obj +<>]/ID(node00000928)>> +endobj + +732 0 obj +<> +endobj + +733 0 obj +<>]/ID(node00000931)>> +endobj + +734 0 obj +<> +endobj + +735 0 obj +<>]/ID(node00000933)>> +endobj + +736 0 obj +<> +endobj + +737 0 obj +<>]/ID(node00000936)>> +endobj + +738 0 obj +<> +endobj + +739 0 obj +<>]/ID(node00000938)>> +endobj + +740 0 obj +<> +endobj + +741 0 obj +<>]/ID(node00000941)>> +endobj + +742 0 obj +<> +endobj + +743 0 obj +<>]/ID(node00000943)>> +endobj + +744 0 obj +<> +endobj + +745 0 obj +<>]/ID(node00000946)>> +endobj + +746 0 obj +<> +endobj + +747 0 obj +<>]/ID(node00000948)>> +endobj + +748 0 obj +<> +endobj + +749 0 obj +<>]/ID(node00000951)>> +endobj + +750 0 obj +<> +endobj + +751 0 obj +<>]/ID(node00000953)>> +endobj + +752 0 obj +<> +endobj + +753 0 obj +<>]/ID(node00000956)>> +endobj + +754 0 obj +<> +endobj + +755 0 obj +<>]/ID(node00000958)>> +endobj + +756 0 obj +<> +endobj + +757 0 obj +<>]/ID(node00000961)>> +endobj + +758 0 obj +<> +endobj + +759 0 obj +<>]/ID(node00000963)>> +endobj + +760 0 obj +<> +endobj + +761 0 obj +<>]/ID(node00000968)>> +endobj + +762 0 obj +<> +endobj + +763 0 obj +<>]/ID(node00000972)>> +endobj + +764 0 obj +<> +endobj + +765 0 obj +<>]/ID(node00000975)>> +endobj + +766 0 obj +<> +endobj + +767 0 obj +<>]/ID(node00000978)>> +endobj + +768 0 obj +<> +endobj + +769 0 obj +<>]/ID(node00000980)>> +endobj + +770 0 obj +<> +endobj + +771 0 obj +<>]/ID(node00000983)>> +endobj + +772 0 obj +<> +endobj + +773 0 obj +<>]/ID(node00000985)>> +endobj + +774 0 obj +<> +endobj + +775 0 obj +<>]/ID(node00000988)>> +endobj + +776 0 obj +<> +endobj + +777 0 obj +<>]/ID(node00000990)>> +endobj + +778 0 obj +<> +endobj + +779 0 obj +<>]/ID(node00000993)>> +endobj + +780 0 obj +<> +endobj + +781 0 obj +<>]/ID(node00000995)>> +endobj + +782 0 obj +<> +endobj + +783 0 obj +<>]/ID(node00000998)>> +endobj + +784 0 obj +<> +endobj + +785 0 obj +<>]/ID(node00001000)>> +endobj + +786 0 obj +<> +endobj + +787 0 obj +<>]/ID(node00001003)>> +endobj + +788 0 obj +<> +endobj + +789 0 obj +<>]/ID(node00001005)>> +endobj + +790 0 obj +<> +endobj + +791 0 obj +<>]/ID(node00001008)>> +endobj + +792 0 obj +<> +endobj + +793 0 obj +<>]/ID(node00001010)>> +endobj + +794 0 obj +<> +endobj + +795 0 obj +<>]/ID(node00001013)>> +endobj + +796 0 obj +<> +endobj + +797 0 obj +<>]/ID(node00001015)>> +endobj + +798 0 obj +<> +endobj + +799 0 obj +<>]/ID(node00001018)>> +endobj + +800 0 obj +<> +endobj + +801 0 obj +<>]/ID(node00001020)>> +endobj + +802 0 obj +<> +endobj + +803 0 obj +<>]/ID(node00001023)>> +endobj + +804 0 obj +<> +endobj + +805 0 obj +<>]/ID(node00001025)>> +endobj + +806 0 obj +<> +endobj + +807 0 obj +<>]/ID(node00001028)>> +endobj + +808 0 obj +<> +endobj + +809 0 obj +<>]/ID(node00001030)>> +endobj + +810 0 obj +<> +endobj + +811 0 obj +<>]/ID(node00001033)>> +endobj + +812 0 obj +<> +endobj + +813 0 obj +<>]/ID(node00001035)>> +endobj + +814 0 obj +<> +endobj + +815 0 obj +<>]/ID(node00001038)>> +endobj + +816 0 obj +<> +endobj + +817 0 obj +<>]/ID(node00001040)>> +endobj + +818 0 obj +<> +endobj + +819 0 obj +<>]/ID(node00001043)>> +endobj + +820 0 obj +<> +endobj + +821 0 obj +<>]/ID(node00001045)>> +endobj + +822 0 obj +<> +endobj + +823 0 obj +<>]/ID(node00001048)>> +endobj + +824 0 obj +<> +endobj + +825 0 obj +<>]/ID(node00001050)>> +endobj + +826 0 obj +<> +endobj + +827 0 obj +<>]/ID(node00001053)>> +endobj + +828 0 obj +<> +endobj + +829 0 obj +<>]/ID(node00001055)>> +endobj + +830 0 obj +<> +endobj + +831 0 obj +<>]/ID(node00001058)>> +endobj + +832 0 obj +<> +endobj + +833 0 obj +<>]/ID(node00001060)>> +endobj + +834 0 obj +<> +endobj + +835 0 obj +<><>]/ID(node00001063)>> +endobj + +836 0 obj +<> +endobj + +837 0 obj +<>]/ID(node00001065)>> +endobj + +838 0 obj +<> +endobj + +839 0 obj +<>]/ID(node00001068)>> +endobj + +840 0 obj +<> +endobj + +841 0 obj +<>]/ID(node00001070)>> +endobj + +842 0 obj +<> +endobj + +843 0 obj +<>]/ID(node00001073)>> +endobj + +844 0 obj +<> +endobj + +845 0 obj +<>]/ID(node00001075)>> +endobj + +846 0 obj +<> +endobj + +847 0 obj +<>]/ID(node00001078)>> +endobj + +848 0 obj +<> +endobj + +849 0 obj +<>]/ID(node00001080)>> +endobj + +850 0 obj +<> +endobj + +851 0 obj +<>]/ID(node00001086)>> +endobj + +852 0 obj +<> +endobj + +853 0 obj +<>]/ID(node00001089)>> +endobj + +854 0 obj +<> +endobj + +855 0 obj +<>]/ID(node00001091)>> +endobj + +856 0 obj +<> +endobj + +857 0 obj +<>]/ID(node00001094)>> +endobj + +858 0 obj +<> +endobj + +859 0 obj +<>]/ID(node00001096)>> +endobj + +860 0 obj +<> +endobj + +861 0 obj +<>]/ID(node00001100)>> +endobj + +862 0 obj +<> +endobj + +863 0 obj +<>]/ID(node00001103)>> +endobj + +864 0 obj +<> +endobj + +865 0 obj +<>]/ID(node00001105)>> +endobj + +866 0 obj +<> +endobj + +867 0 obj +<>]/ID(node00001108)>> +endobj + +868 0 obj +<> +endobj + +869 0 obj +<>]/ID(node00001110)>> +endobj + +870 0 obj +<> +endobj + +871 0 obj +<>]/ID(node00001113)>> +endobj + +872 0 obj +<> +endobj + +873 0 obj +<>]/ID(node00001115)>> +endobj + +874 0 obj +<> +endobj + +875 0 obj +<>]/ID(node00001119)>> +endobj + +876 0 obj +<> +endobj + +877 0 obj +<>]/ID(node00001122)>> +endobj + +878 0 obj +<> +endobj + +879 0 obj +<>]/ID(node00001124)>> +endobj + +880 0 obj +<> +endobj + +881 0 obj +<>]/ID(node00001128)>> +endobj + +882 0 obj +<> +endobj + +883 0 obj +<>]/ID(node00001130)>> +endobj + +884 0 obj +<> +endobj + +885 0 obj +<>]/ID(node00001133)>> +endobj + +886 0 obj +<> +endobj + +887 0 obj +<>]/ID(node00001135)>> +endobj + +888 0 obj +<> +endobj + +889 0 obj +<>]/ID(node00001138)>> +endobj + +890 0 obj +<> +endobj + +891 0 obj +<>]/ID(node00001140)>> +endobj + +892 0 obj +<> +endobj + +893 0 obj +<>]/ID(node00001143)>> +endobj + +894 0 obj +<> +endobj + +895 0 obj +<>]/ID(node00001145)>> +endobj + +896 0 obj +<> +endobj + +897 0 obj +<>]/ID(node00001148)>> +endobj + +898 0 obj +<> +endobj + +899 0 obj +<>]/ID(node00001150)>> +endobj + +900 0 obj +<> +endobj + +901 0 obj +<>]/ID(node00001154)>> +endobj + +902 0 obj +<> +endobj + +903 0 obj +<>]/ID(node00001156)>> +endobj + +904 0 obj +<> +endobj + +905 0 obj +<>]/ID(node00001159)>> +endobj + +906 0 obj +<> +endobj + +907 0 obj +<>]/ID(node00001161)>> +endobj + +908 0 obj +<> +endobj + +909 0 obj +<>]/ID(node00001164)>> +endobj + +910 0 obj +<> +endobj + +911 0 obj +<>]/ID(node00001166)>> +endobj + +912 0 obj +<> +endobj + +913 0 obj +<>]/ID(node00001169)>> +endobj + +914 0 obj +<> +endobj + +915 0 obj +<>]/ID(node00001171)>> +endobj + +916 0 obj +<> +endobj + +917 0 obj +<>]/ID(node00001174)>> +endobj + +918 0 obj +<> +endobj + +919 0 obj +<>]/ID(node00001176)>> +endobj + +920 0 obj +<> +endobj + +921 0 obj +<>]/ID(node00001179)>> +endobj + +922 0 obj +<> +endobj + +923 0 obj +<>]/ID(node00001181)>> +endobj + +924 0 obj +<> +endobj + +925 0 obj +<>]/ID(node00001185)>> +endobj + +926 0 obj +<> +endobj + +927 0 obj +<>]/ID(node00001188)>> +endobj + +928 0 obj +<> +endobj + +929 0 obj +<>]/ID(node00001190)>> +endobj + +930 0 obj +<> +endobj + +931 0 obj +<>]/ID(node00001194)>> +endobj + +932 0 obj +<> +endobj + +933 0 obj +<>]/ID(node00001198)>> +endobj + +934 0 obj +<> +endobj + +935 0 obj +<>]/ID(node00001201)>> +endobj + +936 0 obj +<> +endobj + +937 0 obj +<>]/ID(node00001203)>> +endobj + +938 0 obj +<> +endobj + +939 0 obj +<>]/ID(node00001207)>> +endobj + +940 0 obj +<> +endobj + +941 0 obj +<>]/ID(node00001210)>> +endobj + +942 0 obj +<> +endobj + +943 0 obj +<>]/ID(node00001212)>> +endobj + +944 0 obj +<> +endobj + +945 0 obj +<>]/ID(node00001216)>> +endobj + +946 0 obj +<> +endobj + +947 0 obj +<>]/ID(node00001219)>> +endobj + +948 0 obj +<> +endobj + +949 0 obj +<>]/ID(node00001221)>> +endobj + +950 0 obj +<> +endobj + +951 0 obj +<>]/ID(node00001224)>> +endobj + +952 0 obj +<> +endobj + +953 0 obj +<>]/ID(node00001226)>> +endobj + +954 0 obj +<> +endobj + +955 0 obj +<>]/ID(node00001230)>> +endobj + +956 0 obj +<> +endobj + +957 0 obj +<>]/ID(node00001233)>> +endobj + +958 0 obj +<> +endobj + +959 0 obj +<>]/ID(node00001235)>> +endobj + +960 0 obj +<> +endobj + +961 0 obj +<>]/ID(node00001239)>> +endobj + +962 0 obj +<> +endobj + +963 0 obj +<>]/ID(node00001242)>> +endobj + +964 0 obj +<> +endobj + +965 0 obj +<>]/ID(node00001244)>> +endobj + +966 0 obj +<> +endobj + +967 0 obj +<>]/ID(node00001247)>> +endobj + +968 0 obj +<> +endobj + +969 0 obj +<>]/ID(node00001249)>> +endobj + +970 0 obj +<> +endobj + +971 0 obj +<>]/ID(node00001252)>> +endobj + +972 0 obj +<> +endobj + +973 0 obj +<>]/ID(node00001254)>> +endobj + +974 0 obj +<> +endobj + +975 0 obj +<>]/ID(node00001257)>> +endobj + +976 0 obj +<> +endobj + +977 0 obj +<>]/ID(node00001259)>> +endobj + +978 0 obj +<> +endobj + +979 0 obj +<>]/ID(node00001262)>> +endobj + +980 0 obj +<> +endobj + +981 0 obj +<>]/ID(node00001264)>> +endobj + +982 0 obj +<> +endobj + +983 0 obj +<>]/ID(node00001267)>> +endobj + +984 0 obj +<> +endobj + +985 0 obj +<>]/ID(node00001269)>> +endobj + +986 0 obj +<> +endobj + +987 0 obj +<>]/ID(node00001272)>> +endobj + +988 0 obj +<> +endobj + +989 0 obj +<>]/ID(node00001274)>> +endobj + +990 0 obj +<> +endobj + +991 0 obj +<>]/ID(node00001278)>> +endobj + +992 0 obj +<> +endobj + +993 0 obj +<>]/ID(node00001280)>> +endobj + +994 0 obj +<> +endobj + +995 0 obj +<>]/ID(node00001283)>> +endobj + +996 0 obj +<> +endobj + +997 0 obj +<>]/ID(node00001285)>> +endobj + +998 0 obj +<> +endobj + +999 0 obj +<>]/ID(node00001288)>> +endobj + +1000 0 obj +<> +endobj + +1001 0 obj +<>]/ID(node00001290)>> +endobj + +1002 0 obj +<> +endobj + +1003 0 obj +<>]/ID(node00001294)>> +endobj + +1004 0 obj +<> +endobj + +1005 0 obj +<>]/ID(node00001296)>> +endobj + +1006 0 obj +<> +endobj + +1007 0 obj +<>]/ID(node00001299)>> +endobj + +1008 0 obj +<> +endobj + +1009 0 obj +<>]/ID(node00001301)>> +endobj + +1010 0 obj +<> +endobj + +1011 0 obj +<><>]/ID(node00001304)>> +endobj + +1012 0 obj +<> +endobj + +1013 0 obj +<>]/ID(node00001306)>> +endobj + +1014 0 obj +<> +endobj + +1015 0 obj +<>]/ID(node00001310)>> +endobj + +1016 0 obj +<> +endobj + +1017 0 obj +<>]/ID(node00001313)>> +endobj + +1018 0 obj +<> +endobj + +1019 0 obj +<>]/ID(node00001316)>> +endobj + +1020 0 obj +<> +endobj + +1021 0 obj +<>]/ID(node00001318)>> +endobj + +1022 0 obj +<> +endobj + +1023 0 obj +<>]/ID(node00001323)>> +endobj + +1024 0 obj +<> +endobj + +1025 0 obj +<>]/ID(node00001326)>> +endobj + +1026 0 obj +<> +endobj + +1027 0 obj +<>]/ID(node00001328)>> +endobj + +1028 0 obj +<> +endobj + +1029 0 obj +<>]/ID(node00001332)>> +endobj + +1030 0 obj +<> +endobj + +1031 0 obj +<>]/ID(node00001335)>> +endobj + +1032 0 obj +<> +endobj + +1033 0 obj +<>]/ID(node00001337)>> +endobj + +1034 0 obj +<> +endobj + +1035 0 obj +<>]/ID(node00001340)>> +endobj + +1036 0 obj +<> +endobj + +1037 0 obj +<>]/ID(node00001342)>> +endobj + +1038 0 obj +<> +endobj + +1039 0 obj +<><>]/ID(node00001345)>> +endobj + +1040 0 obj +<> +endobj + +1041 0 obj +<>]/ID(node00001347)>> +endobj + +1042 0 obj +<> +endobj + +1043 0 obj +<><>]/ID(node00001350)>> +endobj + +1044 0 obj +<> +endobj + +1045 0 obj +<>]/ID(node00001352)>> +endobj + +1046 0 obj +<> +endobj + +1047 0 obj +<><>]/ID(node00001355)>> +endobj + +1048 0 obj +<> +endobj + +1049 0 obj +<>]/ID(node00001357)>> +endobj + +1050 0 obj +<> +endobj + +1051 0 obj +<>]/ID(node00001361)>> +endobj + +1052 0 obj +[21 0 R 21 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R] +endobj + +1053 0 obj +[51 0 R 53 0 R 55 0 R 55 0 R 57 0 R 59 0 R 59 0 R 61 0 R 63 0 R 63 0 R 65 0 R 65 0 R 65 0 R 67 0 R 69 0 R 71 0 R 73 0 R 75 0 R 77 0 R 79 0 R 81 0 R 83 0 R 85 0 R 87 0 R 89 0 R 91 0 R 93 0 R 95 0 R 97 0 R 99 0 R 101 0 R 103 0 R 105 0 R 107 0 R 109 0 R 111 0 R 113 0 R 115 0 R 117 0 R 119 0 R 121 0 R 123 0 R 125 0 R 127 0 R 129 0 R 131 0 R 133 0 R 135 0 R 137 0 R 139 0 R 141 0 R 143 0 R 145 0 R 147 0 R 149 0 R 151 0 R 153 0 R 155 0 R 157 0 R 159 0 R 161 0 R 163 0 R 165 0 R 167 0 R 169 0 R 171 0 R 173 0 R 175 0 R 177 0 R 179 0 R 181 0 R] +endobj + +1054 0 obj +[183 0 R 185 0 R 187 0 R 192 0 R 194 0 R 196 0 R 198 0 R 201 0 R 204 0 R 206 0 R 208 0 R 210 0 R 212 0 R 215 0 R 217 0 R 219 0 R 221 0 R 223 0 R 225 0 R 227 0 R 229 0 R 231 0 R 233 0 R 235 0 R 237 0 R 239 0 R 241 0 R 243 0 R 245 0 R 245 0 R 247 0 R 249 0 R 251 0 R 253 0 R 255 0 R 257 0 R 259 0 R 261 0 R 263 0 R 265 0 R 267 0 R 269 0 R 271 0 R 273 0 R 275 0 R 277 0 R 279 0 R 281 0 R 283 0 R 285 0 R 287 0 R 289 0 R 291 0 R 293 0 R 295 0 R 297 0 R 299 0 R 301 0 R 303 0 R 305 0 R 307 0 R 309 0 R 311 0 R 313 0 R 315 0 R 317 0 R 319 0 R 321 0 R 323 0 R 325 0 R 327 0 R 329 0 R] +endobj + +1055 0 obj +[331 0 R 333 0 R 335 0 R 337 0 R 339 0 R 341 0 R 343 0 R 345 0 R 347 0 R 349 0 R 351 0 R 353 0 R 355 0 R 357 0 R 359 0 R 361 0 R 363 0 R 365 0 R 367 0 R 369 0 R 371 0 R 373 0 R 375 0 R 377 0 R 379 0 R 381 0 R 383 0 R 385 0 R 387 0 R 389 0 R 391 0 R 393 0 R 395 0 R 397 0 R 399 0 R 401 0 R 403 0 R 405 0 R 407 0 R 409 0 R 411 0 R 413 0 R 415 0 R 417 0 R 419 0 R 421 0 R 423 0 R 425 0 R 427 0 R 429 0 R 431 0 R 433 0 R 435 0 R 437 0 R 439 0 R 441 0 R 443 0 R 445 0 R 447 0 R 449 0 R 451 0 R 453 0 R 455 0 R 457 0 R 459 0 R 461 0 R 463 0 R 465 0 R 467 0 R] +endobj + +1056 0 obj +[469 0 R 471 0 R 473 0 R 475 0 R 477 0 R 479 0 R 481 0 R 483 0 R 485 0 R 487 0 R 489 0 R 491 0 R 493 0 R 495 0 R 497 0 R 499 0 R 501 0 R 503 0 R 505 0 R 507 0 R 509 0 R 511 0 R 513 0 R 515 0 R 517 0 R 519 0 R 521 0 R 523 0 R 525 0 R 527 0 R 529 0 R 531 0 R 533 0 R 535 0 R 537 0 R 539 0 R 541 0 R 543 0 R 545 0 R 547 0 R 549 0 R 551 0 R 553 0 R 555 0 R 557 0 R 559 0 R 561 0 R 563 0 R 565 0 R 567 0 R 569 0 R 571 0 R 573 0 R 575 0 R 577 0 R 579 0 R 581 0 R 583 0 R 585 0 R 587 0 R 589 0 R 591 0 R 593 0 R 595 0 R 597 0 R 599 0 R 601 0 R 603 0 R 605 0 R] +endobj + +1057 0 obj +[607 0 R 609 0 R 611 0 R 613 0 R 615 0 R 617 0 R 619 0 R 621 0 R 623 0 R 625 0 R 627 0 R 629 0 R 631 0 R 633 0 R 635 0 R 637 0 R 639 0 R 641 0 R 643 0 R 645 0 R 647 0 R 649 0 R 651 0 R 653 0 R 655 0 R 657 0 R 659 0 R 661 0 R 663 0 R 665 0 R 667 0 R 669 0 R 671 0 R 673 0 R 675 0 R 677 0 R 679 0 R 681 0 R 683 0 R 685 0 R 687 0 R 689 0 R 691 0 R 693 0 R 695 0 R 697 0 R 699 0 R 701 0 R 703 0 R 705 0 R 707 0 R 709 0 R 711 0 R 713 0 R 715 0 R 717 0 R 719 0 R 721 0 R 723 0 R 725 0 R 727 0 R 729 0 R 731 0 R 733 0 R 735 0 R 737 0 R 739 0 R 741 0 R 743 0 R] +endobj + +1058 0 obj +[745 0 R 747 0 R 749 0 R 751 0 R 753 0 R 755 0 R 757 0 R 759 0 R 761 0 R 763 0 R 765 0 R 767 0 R 769 0 R 771 0 R 773 0 R 775 0 R 777 0 R 779 0 R 781 0 R 783 0 R 785 0 R 787 0 R 789 0 R 791 0 R 793 0 R 795 0 R 797 0 R 799 0 R 801 0 R 803 0 R 805 0 R 807 0 R 809 0 R 811 0 R 813 0 R 815 0 R 817 0 R 819 0 R 821 0 R 823 0 R 825 0 R 827 0 R 829 0 R 831 0 R 833 0 R 835 0 R 835 0 R 837 0 R 839 0 R 841 0 R 843 0 R 845 0 R 847 0 R 849 0 R 851 0 R 853 0 R 855 0 R 857 0 R 859 0 R 861 0 R 863 0 R 865 0 R 867 0 R 869 0 R 871 0 R 873 0 R] +endobj + +1059 0 obj +[875 0 R 877 0 R 879 0 R 881 0 R 883 0 R 885 0 R 887 0 R 889 0 R 891 0 R 893 0 R 895 0 R 897 0 R 899 0 R 901 0 R 903 0 R 905 0 R 907 0 R 909 0 R 911 0 R 913 0 R 915 0 R 917 0 R 919 0 R 921 0 R 923 0 R 925 0 R 927 0 R 929 0 R 931 0 R 933 0 R 935 0 R 937 0 R 939 0 R 941 0 R 943 0 R 945 0 R 947 0 R 949 0 R 951 0 R 953 0 R 955 0 R 957 0 R 959 0 R 961 0 R 963 0 R 965 0 R 967 0 R 969 0 R 971 0 R 973 0 R 975 0 R 977 0 R 979 0 R 981 0 R 983 0 R 985 0 R 987 0 R 989 0 R 991 0 R 993 0 R 995 0 R 997 0 R] +endobj + +1060 0 obj +[999 0 R 1001 0 R 1003 0 R 1005 0 R 1007 0 R 1009 0 R 1011 0 R 1011 0 R 1013 0 R 1015 0 R 1017 0 R 1019 0 R 1021 0 R 1023 0 R 1025 0 R 1027 0 R 1029 0 R 1031 0 R 1033 0 R 1035 0 R 1037 0 R 1039 0 R 1039 0 R 1041 0 R 1043 0 R 1043 0 R 1045 0 R 1047 0 R 1047 0 R 1049 0 R 1051 0 R] +endobj + +1061 0 obj +<> +endobj + +1062 0 obj +<> +endobj + +1063 0 obj +<> +endobj + +1064 0 obj +<>/StructTreeRoot 18 0 R/ViewerPreferences<>/Lang(en-US)>> +endobj + +1065 0 obj +<> +stream +x |\U?>3s^35qI2I&ɳMi^MФiڄvچJ"B(⣂RAV^PUZq% l3E}5}Μ}>k}k P `H611X?xN2  `ڝ;LOدm|8#qm.ڽp3ܰiݖ]K@M'i?x@M'O.@+ iˎ]7N)gĮmGP̭[;ЪmW_ +P'vmG0/D@ 0(qi !22z=r Bӏh_-w_#>1}&2p: W.eMq!xgy.x q`|Lpd3'L!,K2ll* LC.Ͱ* t ׿^ p5}NP>\ٷ"};p;0plpC\ W:hhE_Ά> \7ڙ^X W6 f`Fh&0&`+\ [a3 +LX;`4X}:µցi5`|V{;.zu^4@#G Ÿ[5F00a؆0`rϵv <m룃qp'ba9N(ÝЍX@ # .o.|~=skMt69Zئ'jׯשּXzMGEG{k#W`tQ_Mt`oMto]t=sը<7:7;\ܨpmTQVekFZnţKG!1tc,Y ([KZ/+9n-e+A. /,GJ /,+Ag2UעLfu\Zq]Ʒ +t|)(H gYQG0#Qxn?Pο\RڮvVe;9zFa;ѐ +a ,!́ `ɿxM$ +Kѥhz=^>ϸ3l}ˑwNp/gqa3Z->!>L:?vI,]zҠܦ6/h-ݧ}۝u_>:.#`\f<yoU_}gZ/=f] Ah u^:J~!aCCۡ +C +CCC{o<9}G[wo«`w+gauVA!!FĿ!9x7`+̣[u//We^ PWB=zt%0bf U0@z>OHa.*\ No-zl'`zmBґ%C/d -tw=%P_W]J&Q*Kxum FPןXc֔lUz91a&.8dN)k̋,L ;P>0s&RN謯3fɾy ]6<0KKIkkVe}p%c:m3Kh_عP:(&z u &z:(U'=g=sۖTĺX_0AV[b͔g|wS5ĺc%fb)$J5{/%KD_}%37@%{JI^Z|## +]* L%41%bۏXX ?lfК5(90]3sDvUMҁKlDYb\vN?+tT3K4fkJhf +X)V=6YT.+%XrU)G2+3HJ =yG 㔏wT[]\W2l0ǂRa&ci/%RO1J㕫lם=}2Mq2㴷J9P=%6叴G{:1J5?A.jǖ*1AZK{XwA[J~}&k)C5f Q{JkOLܸdOq;YNZh/ c&TQ]8X8|٘-Yzѧr}L]e{2>>ϳ>||]jX8r4%+v2~k S1M#.?Hph[Mh;%F:{Ki-\S_GG +֑S[=Q8~ߦBju7Z3NU<%**DpΒXS=x7=]>DO yP=(dgkN)Igv׵E5[Ho89E΁*] s L΁ +3(?jɟ :?A! +Gȳ101|%?O}Oc>J~Xq#$|>eGix;|$OPO#!|>M~ϐ£0!ɿD c9oU~ %r/U~H1 /gkVux<߀'pBVy +7k-,["Le޲DoY,ћl\DoY,[1[c[Fh[5>]֘([cLƕj"3nkx0,XZtgi׀AKB΅- XǴt%fDҀIwSV_VY=z Z 댅lcTKBђ N@My.4ÿA &OA+;y +,y_~N?lx|:%-oBFNA7r +0 A"":!| |P| + 8y*8,@5qXɗ`ʑ/%K,r 9 0z` - |%s0G``9ZM1t9,p|V-Ӱm'A$Uh$Fo#vL[p9:D ֢;'`z/8G  C䣰K> +}=@+C^}|B#G` :JV%!}|a;:Ekw]p-z|v%:tv,y/B?#wn r'AE {opz ?wkv؏pcrnr ܄erށ{p wA%78N*r#µF7N#] >x7"7ދ>\#z8\wU:_NvFr-|_I{V k60I{^\ɕ1|\ w ^ M6 8Yu))d>Hgjx)#Y !+d<@(>M d B1S ?'%k_$KqYO?%g2_Sd3 Y _cXr)|% F&& $# $L ·|+OOOOwQ +gKE*br`cȱ,p,˱:X/?cauvX[D,qN4Olv!4(؝<,6NJ<rr9%X%(J.\rS("'vEq{r$c!Q,\v%;EIfEITe.(X8s:tcNpX87誛b`jIƃrɒxU M)f. 9I!Fz=ϭy>z`4vKn7n!Hͥnկʛ*'KRy,N9''gI^zaU- 1u} M)m ?ϐ[)q0t@th nq܆faa0 I 75oo,,Runš.xŘ!FM߈>{|@|rS WxM󸃆J) +cI/U H 9 G,, ^U}>'x]ISݚψz=YX6XD@K!]~_8}i3/ WC0Pn7~wϕ~Uw1xS%|D y/Q Y5FC3.D2`8@8Tn`A9 Bn'cL34G)AȰSuyB3dVަTLE‰ꫪM#ThP  a%D"7ood+H{톨K| Ku2QVU+T&dԬC`]+1ly (-Dϵ%\; B O)諺[* [4x>ȅ+zVunwk#GGz$a&">XUw>-{V39mohp'G3dfmMT=GY=Gd:hh9@0@Ռ .Hܲ1gXFaV|6N唓UE񲖴m^ M+Wn\2;O}_];z"V`cEY;\[**3wq7W"BBhE=;n]c~+ceA#F'H9{3b~:WGCxDz/8qUg?@6$ +(gg{#TÎdg, 2=@8:€ fQ6[VO9McE)*N^|\BXZ !!' uE{x#I:VɦFTa s'6Ӆ뮻9ѳ㺛 +NXZhŰ0i&(vXJVK w@`p:u:lݭud,OR=[,OR=bjB;ll:Y)g4U=ǜoJ`;> 0TւHh:sQܛH'pBqU&4MUvaIOTN,*i 9 ƌXU3i:F;r3v*r`6b];g#HΠHF}bmxki.z즚P~> ߡ? +K +ס:).GW3w#wa43ƴ:bgSe5x87`jV:2@20<v7-:ScL̏(ٱ9B ffuJDs]0wq{ќy5sgǨN8 ܰqs.lDgPA IƱs +N۠;}&7SV))MrMHBlޭOiCȇ߻`{ _VH~W7Ԛ=ܳY"CQBUUFex+8A~/xʠ===.q=oJN*TNgNgO=.&O45(]-f$$T:qgЦ@%dC׿{omnsK:%\QǗK65.錳ӱW4C % T1&)ڴZֻ)>liij8ref'OP8VwL[檴"cˤE<9 ?5sW +gk?p~|~i@kSBc0ZmGszi_ݽ6m"5Q#pW2X_ Z ~aB*pSd%V%}=ka,=$u']L[%fH {/1%y{>ش ~*^5|bsa; +<PDʽս 9'{/#u&0>=X,*2Ps<=eWĴ363Xv ;|J(gjbsUMS`sl + 1 !aƿV=jrzA[,k;azA7Q\{dpLGgLa>nh3dNEss W 5z7V\S>?'kmkinmi`)nȚPA1oΉૉf#]9;5}M+pʁ&x$AݬZ'>1X×`C 2;M$'fR˱@@kAgIHC +aOC`SF--26Zښ6t?RNerёͮ*''ݖ-E@a%Y~kyA-U o' H[ g;0[v*o]P:8jSէ㊷>OuuuTYOA,3VkQCZ!l8: ,NTE[Q¡x& +搹[n,]=G˵hqګkSKj Ф4l\ugsgs'\LqYA񚦞z{A ,|`WKoxօ?m#e[c\Xs}6N|ȑ|ZH.3Fgٝ.1 bdNMR-w*g;4Hs󓏴z$Wo&[L#5Zk2]YvR5TeigHg%>ݤZI~?NCs!pQ]Eq <~ C˦o)]͠wc0 bXnU)q}}Wnkmv=#sӖm[X\`݅@,PB6r,bY3GԹS4ͫ1c52~7zr/ aV}pE2e1Dzlغ֑]U7yq nM Ҧ^GozMS?eB"f:J) xv'].5 #r $n`ֆl60GA"u,Ч275"ԄWc#G^;r9s Qԏѩ?T/4\,Gw>e4N[}y51tm^)wQP!_}e-Ǘ͞b޹W&UM~VVͣx;&]n6{#_֛yvtQx*S\I ."I%Uݚ @"ݾHuUuAܣ*R]6thUuQԛuS,^=w::1'|BSmJ& X,rBͲȧ>SV3icP[ފʩƔS*N5|A'ӏB5*Q%tA!T'֊)H Չj~TND,`= 95oMZZG$gsg'LrJٌ04d% 6+l>YAuA2:S sMt>ؾyXC}iwnPŊ6~q/=P> +2 'Qv*SϱK ll'r>hud2J*x)#cY_nl} +l344B€NYw(5f jyA/Ќvτve/~AB-پLg~?VOhE~lӜ$mfhhXqp|ʆ<'yXޠD ڠZֶlWU8E4`pdP7`JȄ{Hӑ5-j4H'ܰ_fU>' qXWtESWUhyJH"9lt sjgJ8asr"-0,MS4A-*e暵I'^| +hvkK4AgآKW_7E ;qU|g\EZ@V' 򞫍ƻ ƈ!{_*serQ¢(oˢ,,h=9EX}D䕠v-/Ěә eBx_k<ٳjX}x^IeC-[okXQ#EW\/J>f{/i G7jĕq7A@Vh > +, Ll9 sǻ-?sϞjjP-x|pVn%/tjFv귙~9v4b:P] dep+zhCͫIE; u;J~zxjU2}ljxΆ>YX %STV=I(Hw], C1,v ک@v/'"Np*V?˾yWa.v+G˛䑯XaQfhpzAwg{Cokhxۡ;{3f8*65&Gv=}Gv51_bxzՄ>˿-$ v^Zv8(Kk *w u[Stu8xRAsl$8\hxlEz؁6Λ}K `e# '=y9ߗg:P;{s66G4Q'Ռhڶi@Q?im'UӮz1MC⋢ vIHlgc^34S]CpQ v0ގmvɧ%HP?nPmRU(0 q@.)4܂NH9XG9{bvB^/bEr\KuvO]c݁:LWJ1ִ]`ܛqkSȎ av{ky8[0SW[YGn=?mWJ=Q>:[-},44Z|Ȗu|܋t>Iis;fKёYYN B #i+{z1atu9@;@A1 !ڲa9)éo}XԿ!`'kF_)`@@% ccGYĺ/&лwکܹMsjg ~|ԒL7fkjii;|B2>etב#YyIyc䏅>.IB3`ЬߎvD^w0>G1vY'$e8w8XU8lbQE*]ezkXjmLK;5GÍT3#T歭Y4L]ȬeVY1# zwoκjx +bz ycqF! {)޽fyIJ5"+Y^bNa5bYڶ1vȅsϯ6S}O~P!Uܠҡ9Y!1ܳgxDQ`ݤFpzK3;!hg$?cg.izn/ yHSf9$sh]iE=b=./쭓t;,F5F]?o"WV2 +A[9([15Oe(Y+3:]&35DGgƱ@ 0jE}M|ݕE_5tՂ+nZLvR\2%jrK|nYsѽ`)r:^v _RD@Q{܌ʞ=U̗ wdE^fß|,FqPw eynf/CR٪n" {t7`YYT4eRv$جh;9V,0}/ a 4xpA@с>=1q-a&Ҹ鲦gh!100&Ne&dq+ݜ_WǒɱS_Wq` XaWmt 4[P)$)(p:6nԑCGu  +5 :(2eɦ0Ӿk`B ! A F۷W2V=YUܞ+3sm?}lTYDBZm}amx.tnO>7EXT^lEmdrd|e]F~ѼD/SPFF^ q<8dcFQ%`h'(cىR"?: y,ܺ4T"aΠ3dN1؀t b: +0H;EA "6X=`"*:!!ih:V# g³ÌF .PNPMPVptQ8z EyӉ`y擩o해l|kZNbh&y7}|"GCAngmSk9vIw7dtfݕ痱K`o +|NCm͢~Hcך>  Y̓4O3nhahc0̣NdP|d[Lě~d9L< +YX Wa `XDA)Eو 6(hr_.2wy:iv2Wd.L45"}|4dYI/ekoR +HTr~KwOu缽(gi, + +=IQPHXP%5^bM݈V:kT1JgJ:]V,ʉ|9hks慧.1f->>- ++}!q9~{*OZL9yB-u}L\%Q8Wkqt%\Q͟drs3;~]jk%=ee 'qױ C?Xi٭ȫ J!Hy`EV-$9q0 ђR~VSR͟dʁxaf&@kJW;֖@fC_8ݷVڷy鶠q`?@'3HdjRMN|# uBZP*e4)-̎c¬QKbBMboPI.N`֚Hj#,G +endstream +endobj + +1066 0 obj +<> +endobj + +1067 0 obj +<>/W[0[500 0 0 240]9[705 0 356 356]15[246 340 246 437]29[246]34[455 974 721 672 648 737 606 574 702 734 316 529 684 563 897 756 790 644 0 667 582 614 707 722 948 0 661 610]68[553 604 500 604 584 422 594 589 289 0 579 316 862 589 607 604 604 422 485 444 589 550 784 554 547 500]262[708 0 736 1127]]/DW 568>> +endobj + +1068 0 obj +<> +stream +x]n0E +/Ed&BJHX|j8 b&M.l\jlQ֧ښŻUwjx +zcYsmTjhe}j)PndyιL|uLy ؞ef: %+ +c|ik;5`¼9#svcܨQZ=\J) WUU wR֥S_๔,DB̐$[3G ++<#E'(1RB~ +$%:$R=-ҖDjRdvy%wpGO^]q˜gp[ˠW +endstream +endobj + +1069 0 obj +<> +stream +xX\Uy 303 0D4Gқ&X ?D@1UiߋfRkԶ6Vۮn7VS-ep;Hq?9Ϝ9)+;rukRNMNʚ"|39izh wp׌Gqc9nftB/m0#ƺ٘\5\)ǬF +H+@vɸ˾:e-x48#G`ݿ~|eF c?=7z-檙+x+\ +tC*fSQE(B.~T!X*,DnB!}7q|T XR480@&b9P",AQQp` +c1[YUQ)@)J0 +c=5EX%X GoD_90`J\AK&F |}T%Jd%iYB# 7ѰD6] + a +xAqb4bzm6͘mzih&E3y!%aLH2 +d2fr ̍ +d[A)\oA +IG5'/?0Y*4tWiq +6S&!.VMeYՀm^UŶyμy=y%1a3VghGT->CCE_0TzF\u{-nuۡj?j #m Ffjk ~][o W>\ 4)#yt%"GSF3Yv&$Y{l,}Mޱ_->wrQΩ%O6=dמO9tLcrŴm?hw}ݏvXYYUpUr#y 2dB^haPlVKHNV!LwUvwNMOk~Zutc!Vb3V6 l$e;wrY{=D뙡:4c%gtFHLWqWEK;(50(.Dc'N5*CZWdXgتmGX0hJ/lQli+mphN46ŌܢzE^&%x)Z76, >:HCÑH(KA<<jZ5^I7mucuH{1Q.wtu>s;YAr;ohR+`:+bq sJݸq^ԬSgn:tyť eYOM/{ѧ$'/w/>P|¶Ul>k_r9Ş!(DF˙܋uĉ VQ̈́?ˏ 8(ehS?o7>cʓ >/h(wZXsW/aj]G__q ÛړSG,0e'[3*Uk(##zcF1inZd>flXe{SDS}cݣ˗;ٹ7lTݹCk_xrľQG[+Z^S|yM $(o0$1qژHVHop&kWalp;bcm@t+Q'l'_hML Ķ)<"} $6 ²g5d:6?+L/b) ̔{/ CfUVإ#I>yB13RKΤI2xa6lV>|bӟ X&[~`ffuS-Hfc;ŶݻD&OG7>z{.\= dp'12&$Bg"4FGmK8qk4Ġ + VF f}ONƤ:R='8=lG3;6;2q} [7 n(: +ʘJGs}mZZ3}gKWݗ>fl;*uO|m| VV=g]]\VʾOl591OfD mgoճCZM>V[E +!K2M)}[WCpd ѕ跣/Eɘ&K-x6%(E\ +V!UX*tKY8Ew% T47jEh5}/.:9D8Ɇ]`ZԴqwk4oc> +endobj + +1071 0 obj +<>/W[0[600.09768 0 0 317.8711]20 28 636.23049 51[603.02737]68[612.79299 0 0 0 615.2344 0 634.7656]]/DW 0>> +endobj + +1072 0 obj +<> +stream +x]n <w@׶cqcR0$oMz|3@j~8#:0*-.fuaIi3J-Zn[<έ )KZpf#NSzív8HUđo@c٩Vw_E"40 t1VA4MS_HU(y%c削Ds'%Q9vc$x) k|xs}u*Ɔp~h +endstream +endobj + +1073 0 obj +<> +stream +xZM7 +:V/ ! zЦ dH>5z5NN E#WcϳP8RjvVs)=!q驭Q~uK8ǀn {sbQn!igIbC<@NӀ4 /;k6Zy$j4 35VC}2ml/kJ?l]q|O{\pOL|{~'C^R|M2WInT 8}ꎩulNgb1|8?CCvrk'/ `R +-K^Q]'k{vVMeRM +=TЫX1#׮j_7 Q@ m$y/ 0H p 5`8qб7y17in>Z:8n݃Dh4Zq Iuh +2HQ Z;iU:qQ>AzJsGNS˃^I sH 049jλ4u]M Yg.?5ђj#`n%?=eX͇4רn0Ahzao|#~om/lUG=VHͲ60w-wMH6\\r{٭47 +endstream +endobj + +1074 0 obj +<> +stream +x]m۸+/@\~-p7E4ДVf(k l"9[*{?/YV*(tMVε.Fsw[IO?ʈgx +<˦uު_f.&4Rx%0K$.9g߼yݟ7߿;H/?M#UsȼkuiR8}iۻ7Wp}n|ڥ뮍~o2: zW郼W=l۠ް~݄<0#܀^zZ=c /\-=5?(.YݞBny!U6ŒMI&ⱘfb ,n[.$汉yT4a-BӔ;~VW-zZ])C./J3k:H'AqoσOV_/`[_!I!$ :VG'0]m쾀ŵ­O46Nh +aO!vlZb)Ai$ W-OOX(^R%MB$AV9kAy[yapE75u$N1ßJvq6iTsnu70:̵Glj|]0962 n3I d[m ړ]$ K*ZYS2R= +dtnfXQ'mBV">[hq1% 7,O. Ϧ GAz^+V+MQh`R_ZCF7kY;"(zՁM m*UE@=hdZē@=f[Y#N:4"hP>͒ |69W"*f8*d(bk`7LfV?n {EqRw*QvϭaQ-Ezܱ)ȿVe?] JA,#\kS $o6aD^XЦ$(ѝ9e2 FO¬B +iIEū ytl\@;HkBh +rWh`03L  N18Q5:2"xѵ0o0d3*`4ӄR" jKzҤ]LU1dHYChض &|5&)43_,$c+_uI@)pm cQq L.m E``+᱓`Op Ww?raq Iu>K8}k%/Ó՚@\Uצq)#21($%Hѭ\hzH|IZZ)Z=$uN&<*e{I=`{5m?71q[ q,IX,r_ 'QCr02P$̳xi2J=|=tב¤ ky.TT0$I \_41k0w)r_r@&2[t*5ߓ$&g+KzJ ^I d sbjỎ9 Bh0gL/?o྘[J(XlHe) 7fЦ* +| уY02nuԛ48nqCi=İ/̳ cFx@_R{ƵRktY]/;gY3w`zBt1w4HҢ2 zDB}[`Y[8 RפA +T:fY=A) +\EF<=Nr"=Ky ӑ\RDO+ qX=2ߕMybfPaGIP_$EҖ߈[O]L y9ǮUUq+? xVb}u`W^[b`/ d% Ժ +Ty8ۯc`WN[byr3_n˾ \?W"geLϲa5efP? |S1P N䷜Ä~v% ]yV]=gї7^n3D"~jC +t QSC$=:!rx摒+pDvK̟CrP;I'%^œt7H8{  4y2sā)3zP}YdpĜ'P +ǽ|Ew.ALnCp~Q-mv+!kubvu-5^:ڝ?/~#zn#FPGnfmGxmstԄw3^dn%K 9bl`:1ez(Mu#L#01|*Cu*R_2gL8Fx9l +SϡjMLH0:^ȩDӷgg`ڂ%-:ͅR+ I= +(؍*yX\Lv'VS\>˭p4w^\4ݒ$@u-oZLפ#bXL%j :x}"~a +> +stream +x]KF+:!vb`  gxsKnQ-Q"IaAXצ5QUiSjoZm|c\u96քІmOͯ54_}Sz8zʭFݴ!AI>?mUcn*|nti rm%t^2k>タ?P|K?y:mPSO75ɝ6wCSItQ)CӦcRӖZu S?1FqCxYFTIw\7V!dUMۇ;HsY>l:,B9lZ}ư=zjgTJ=@QevPa٠(c::=@QX첮C#T#oQ<ʎyYNaʦ br Iɮ)*ҹ)UG>Ç?kԛ7߿{|5txnZU(.Q<~i^+e5fR.jߕsyaۘ /)/")Y/|y[rzxly^6CMEj] I~Nhk o |jP>@C|N( >W:xYpvjadD}yR:sSV;uX *C@*zPjpjE4D0]@qf=f\L,ۼ Nc?.>V)jZ "D:fJ 1V!$2PErI#8s.ݢm5\00q q#6s,yG2D#,t̤^Hck:f&N]DV3d 9mfY0dԣv7uĊkKzymjGF-e"MJ+N=\FrCk"C-2kqʎ\v1SљU;Amu#Xɤ5ʭ !SSƈ,n&j\5,}iw Lҋ=sOc*ԥr𮪤du}V91El`wUe4]8Ͻ{~F}*6ۉ =x)PtƽZ#{Ww*%$2R{}W[B|h*=y dWoLfL#/ ȡR$WD<t[Tۃwt]}2QYh +`4%[X/=@̷>itfM ~=F +endstream +endobj + +1076 0 obj +<> +stream +x][5+~FJw($x]Vy$ {=;SUeX¤/թr?>o AYnp>'lC٩?~Q?}~W_)%~)Mob)Xj2j"뙋N$dRV֔j>KQ~;4d `X>g\ ;cfoiхҐPb_ʫ*"/ sU;˫ӏǶϛ7?o~^>a(ಎ8<>7Z[7C V^iu\\!}\{(Ӡ5a]Qlj[ʍ08 ڹ"UMVq6 D]ubզu^ÊET5ia;73mš74VmQ%Z*1ǔU]\;Md`V9=xk dA'7G/&+MIHtIt`}= .E 2C4,WMtx #x"SHmB_ &3~ƭŇ*fqeuL>׸n Vm6glo||rm'Wd?y{EWݘy^auޡWP/৚$H.>`obB1AnݍoG&]:PDA5 +8&鏳Y6M`.yby1U&Q8MwRN.>~i(aJ/J~i"Dž!Sp<vzۧI)IyՑT_; HIϬ-*qXx'$21RjPM6L92oMF|B! ǥefmUZsK' $*O,,X;%k+qbfݬ?/TLy~/ZF')q9w^ϛ~ȵ'ejS=~n2^2Y]ݼ+UDn]47k]#Ɉшuĸ.^p~t"9}~r?w0ӓUU/" <5PM` /:*ON 3} +hᓖ2ZRfx.k5Ul3" hl ̆YKyUP!JݼY^pއ&BG#q iڛ@6XYlTB@W (&ZDotJd@=6yZ,Nʥ#$E}\^5M9dbՄHtcg+SdcoX:U,w).%\,3s <΍gGI5L33O}`9mfNd@F9d-RXFT h촪3P9U$ldAKՍ LHen8 t3r 3s鮟 3S ti2j$>3ȋKui\,NySLM1@lPvwipd<3x3I6o+6♩hx)1OnS8; :K.-7^;6of +endstream +endobj + +1077 0 obj +<> +stream +x]Ɏ7 [EK d 癱@pr裡QS3blp¥^=j^i|38 zt)*gCBJNQL}Q_ܓqڇ#kQC@z`1гSUӠbLʚ\}. +>Ez[0 3!7UDꍝ2ӿscv +rC 7ĪWUʯ4NUΏ?mŋ}˗޼V~Xu}Ol.@cMJz/V8z\=uӠsyF  وRm7|gQ;WvzUUMn| ܪJU\r ^/ +h+i+T0>vpASJK#:F1EE׬o߿VoٔlCY Tt& :Z6iu,UBx)?DgyDgi䦾l< .0]O4,Wٱx._t3'3|Lb8[Uƕ;Lth8fCy_bG,^7rCd#X!kQ^k48d r w?Cl~1& 'Z,qV ?8kDDتNngӌ6q게#㳩#},hY#y[n*.JoQcTNms ,Uocb(Ӻ#[}u2Eƃl64K* +@<,#y~ )1kIUHh>٪qAfi]Z~\sJ' U.L=YX9~/<3YTS-Uwuq:W\47K9] #шHe;P**Ru'ҎB w_ V'Պ?]H4_NqbzEsEN 百wP -r[΢ 27AKٮחwe[ |)V~[tf[!CPQil?̆YJzP\!}#D׾VɫY`pG&B=&kS?i$M|W&HӸՀea̡O@e Q7OHDf +jOԾrH>gm]jbɤHƞgW^T;}lLҨfKv)YbI٥jTo\ gzkgpg!L̜0 +?2i.B jGN~I0 QUDm,t;U]\8L˄dL^x)J_ +,MJ,3 iڴ5 eYT̢6ӣ?fuV0Rue%_]^}Jg[ 0]&xG -lfyufj8!Ct^Ћs\Uv?:BH=u dMGYsջq"']_}2}u1}tҘ1LF﻾͔+(>:B4nqrѮ1 eR$@}uDhMG ңOgVy< |zS~OC aE{xFW_8OFlD]b}5);S<3 OF/ݬΤмwtgq{$\Ww}uWﯯl @7 yRVLҭ$MfK_+.3;[Nַfja(B[:u نb!u2,jL!v!iQR)0[s3[!5P Wȩn>\MrSz]H*xJ@t!Ԑ5C拏(Dk}߅JҽlX O%VF☞9.>Fix&K#v!uRkRWP|!5dk#-*xgˁOZSwqWy'luyBj066Q30~{Z}_lBMBj0焁)PuRw!7]^zRȅD] R!5l݂BJf$B.>4?zeB2eg/;RH;c%dld,zܓ/#̾^>b>! j8@C8ۙ 3:sE]^Z d{ñkk +endstream +endobj + +1078 0 obj +<> +stream +x]ˮ8.-!<iWF;iݕTB,4N?qr8GrfHI}& `2.5! !gyz>/)Oz I~m(hސS2ol]Yߥ3#tĨSoT.eus7Z]?oO>yחJ?{ /NQ74sYyuI=ڸg74owV7/Kလva.wA}Hm˅bD|6Փbk~Q!4M6q>ٱBLnc_iu)8u~nZ6`U_=HMT tk$u;$lyAc&3DO#V@Q54cJ7/ԫ6%XG2p> Z=8)d`wɃF'"<t%#:$hcy* 6leڻr-,WXNݎz p\ x \4 ܯƅn V}q3.n&N'5Ha +{E;@1'jؠWPhS]F$g`MX7a6!X!opEL6aLx¡gDTB588 +ȨD,馓ۙ6O/{db|6U'&(4t=Ѵ)=c +h{| +wu1 tɠإznڌD|Dµ5Q̀#wL)DTJY7|X'#z=BT[(ZWo{ K}QT.ߎvtnlϾHcPp"i,m+Jqbn{ìv{:8s1:^4NRN#xYi<KYШoGveǃh^GߍtYyY, vڇ&VRFvوq4brhzXyb^HF8p?:v>m?DF4ӽ]i*TkQO'Y@|k[W84$hf` >nq{}qJHK鵚O* Y:v1f6`)UAkAko+]G]9)$c@S\?5"irD]kObwJͧeRqr֦k{m +wJ4~4ϓd'qTt^.l @; |g|%;fE1ԏ.Bŝ{Śuk7G&p=3i[| +?̢6σyna,ay^1h]}Y8g[Ar`%,,cc p򹸽  +3 +endstream +endobj + +1079 0 obj +<> +stream +x]mܶ+0 4v􃁶9 . Amw⮨]4CiΎhWy!c)G{6uFЁ)Aw~>vpN~W:h{.?tMx37.vU!|ɚ8\R%w~)/K}ߜb4o>߁9-t7yr!w)?WHokoSo|m_lMw/8CuKZ)c;^]\nqBVY?^1_RQ9TO +׃ +~}yWqL0܁@T6_pj]]WVf _Pi餉e';u9(|6q˪#SrZţ󈪩m-$ 1. ^0FT8L&*Mf35a@&Nh ЁNǹ4U +M(ڇ%YẶJyU?nXVM[Fr uP[kW߷7 W\w.6j4՘ ak9\ΌVB˵8MYV l?=nO Il>0c/BIb+`gz>& jQ "P"F3݌1m8Jf㣨iVB4?5.JPeGCBu?$T1[)QiԪ4LĜ;i/'WГD'XAa>rĀ=bYa@XRA|Z? *$]9f(G/@^[*h/ Cx؜(MER]ENel@Fc뱏@"5=LfÐ謙+}(c^Ѐ$繡!g'gH-%MQ+bŠ5Pq3Wk6ǡY`,RrVM2u3ZfT(NqeTbk_Lrf² !t% +9Q3[z.MQP'WQCVʡ3u^s$ٕ2ɵllAMJc=0q.o 巁ĘZrߜc}3}Z6.K9[];KQDeoֲ:^*d Kz *^ml1Q;Is+1zERzeIf#?VMx$K'M%j;zHI%[3؅I`8vAOI.1T"&7m¬d P (=P~dK8 i2q!YLN|t$vp q0WLߑ _1b3 ,01Ǝ^}!vPThh@94z vC) m lc:mۦ6v@zs +Oj8EE!2!l'\b,O<{2Xub&c:ؼ\ber!wQ1Z{\|7)y4QO{[)%ۃ?JJplb\W~RE}Լ9; + l;z1М(M`D:9(}$w)PsIly~x͞. 6e$ Q4Θ6XR}f.n.AZg% uq#?Zs^fo>Xt3 rXILj%Ɋ'} ӮbwZqQ4AڎkDu;iPijb ZgR yV^Y W~/f]1 ^q Z\x4r<2h0o?p֚יY &Ƕabk3:=[ Z45o+̠]kc41-n#u6$%«`*fvHk­zd'ktsIۃ-,5E9'v;aAH~d8r"w>p%R1,-}&j+gnߕmE73W"yfRd[ LX Yiq~\ԞKơPtC&+? > 9?wV/y?k:?@QRV##rߏƈup_a%\J>LaRDwשׂ}-:3',t*bqQ^Z ez5Nur8\6CynGIfGLVNfJ +endstream +endobj + +1080 0 obj +<> +stream +x][o6+|.w @Abώ7.hͶEұx" 5C8NJx?j^il7ma06( 礜q9;w{n뙵kQC|`!?\k~CJZRVVrnʥRK0]2w /e>xNKXwϟ_y+_&ҘWxeQfT\;#9o.AkCVϴ|U{(^"7nD\7]nIFNV@}`ZE3~R}} 7vf1 ώ=?$;toAхPcʫ7*Wd4Lqi lQhuل?pڕyhm]=h چ7u7YUL8F8 8o #R9 9@q]:UviG[%,(Ŕ+کk4J(V7 Pnx^;éjկSBWhiU=kkvͻȻ4CVŞNgx"zʔÂc to'Sc"DP?Wc]_/X5:Ƹj/+äC"$ t1:C7Q\=TvHو#Emc1| 7@?ZAH7@kIyptyDwqÊ19azz‘{*:<K1p[6P$HK <9{Ng]sBיl[L`0rĀԤAW|M9pő6HH9 쟵0ʈL݁8d| h2لS +ģz9sW}sWj[GL@H#T"fjAs QW)RpkgAįl4LzƯ z9Lr)ϘV`*SaVjKB3]gyֳ@xaC +TUfLd/$+z 1HD*)4)js&V?V"@3#ܗ+TJ!?V~@c~(?=`^%b8y2O/gqVSvD+MLy(pbn7)#-xss'n=bZ!L@\b@:Dn8dg(Hg(}T59utOwwB'*'8tHꑃ) M8,PS"I,4bM*|jNʶ^"N`KM)h%4ҡn`RPMIҼ|&{|!М Tp!xZD5lYi':R+z/$#EVv +vdkIBh7cG2Qx82NxlK/CM&ʼn a!r +p|WX$XsL}N}m 8=-pxIb7U%05lmuj"fL֢v77ʴxdp"MJS!>2YRgo؋"G 2Eוcf%Ⅼl+l {0rHmhq>|lwHRgA-ɦf*pyc{f|S[ f\={,rMAUGYȞUqxW46o˫wA)?yJebEleG`H^! lx0뎕n-<=ZS[:cMr64hВ7PxA +It,=|- +vtrJ%8RD˘5E\evNÞ_ro)v`Pdm'EiWN:I8@:ԙ4;u ^<'\{-7)#Z +-'U&&ħo﭂Qn{P.˒as=) 4)F^N}fJ:vT\g8•ػ5T\mZ-{./RES {7D8!ΙQ<0%ϙC<֘R>U`>>/  vQR>p&|zy;=?`2 +endstream +endobj + +1081 0 obj +<> +stream +x\o6 W #/ &]z,)6,ŲuQg;O]69䡮t(Gݽj,*MGCDĨX,FhSP`o|JQ?>{#5M .CiFO~ӻw>N[BRynMmHGMޛMYIhIКm".k? +ՅJy@nkjNN/ξ?Wz:juK7HړF#DP;u5o*5:X:ju]>jEF.>)Lfgh]D3 }'),>RZ#{U @p/!WZy9V^6q>}r:JY#6淤Fv(qif6X ?㵱Z*eY0Kb@ͻ_yˤlv1Ws5Y\`Yҙ + 2X2[lsxH\df\lT;(Rm +k&xs{c +ζAhi0 In䉷ԇw쉧ex ICb1յ^I&K7CD **Ddl6(,GgG4UTvqH:d!oZGKtι7{Dc)WAW<gk1{;D2b,֍s٧m)r\(Ű~24|IBR Z|P0n)RLZ +L=YTKRyg@%J-6o\,{?iTkLc],nm$D[$ .1qIO*=ś~iRto|q9K{cl-+>R$ +aC:+ +~a)K~LzO^[tIc@CӛHBm2ˊB@u)փ~܃~U(CJv`<7C@7uGsbWw-!(//=AWlm +(~P~X' sejv^bS-re%e5ź; +0W(|euWex=K \_1{+{nLlǥX PGz49qdnWt&gyӑ0#ĹEC:FE^[ $)\wЪ !*` +endstream +endobj + +xref +0 1082 +0000000000 65535 f +0000000042 00000 n +0000000311 00000 n +0000000491 00000 n +0000000527 00000 n +0000000665 00000 n +0000000734 00000 n +0000000871 00000 n +0000001051 00000 n +0000001241 00000 n +0000001310 00000 n +0000001491 00000 n +0000001672 00000 n +0000001853 00000 n +0000002034 00000 n +0000002215 00000 n +0000002396 00000 n +0000002510 00000 n +0000002571 00000 n +0000002678 00000 n +0000006732 00000 n +0000006812 00000 n +0000006950 00000 n +0000007030 00000 n +0000007139 00000 n +0000007219 00000 n +0000007328 00000 n +0000007408 00000 n +0000007517 00000 n +0000007597 00000 n +0000007706 00000 n +0000007786 00000 n +0000007895 00000 n +0000007975 00000 n +0000008084 00000 n +0000008164 00000 n +0000008273 00000 n +0000008353 00000 n +0000008462 00000 n +0000008542 00000 n +0000008652 00000 n +0000008732 00000 n +0000008842 00000 n +0000008922 00000 n +0000009032 00000 n +0000009140 00000 n +0000009250 00000 n +0000009360 00000 n +0000009470 00000 n +0000009580 00000 n +0000009690 00000 n +0000009770 00000 n +0000009879 00000 n +0000009959 00000 n +0000010068 00000 n +0000010148 00000 n +0000010286 00000 n +0000010366 00000 n +0000010475 00000 n +0000010555 00000 n +0000010693 00000 n +0000010773 00000 n +0000010882 00000 n +0000010962 00000 n +0000011100 00000 n +0000011180 00000 n +0000011350 00000 n +0000011430 00000 n +0000011540 00000 n +0000011620 00000 n +0000011730 00000 n +0000011810 00000 n +0000011920 00000 n +0000012000 00000 n +0000012110 00000 n +0000012190 00000 n +0000012300 00000 n +0000012380 00000 n +0000012490 00000 n +0000012570 00000 n +0000012680 00000 n +0000012760 00000 n +0000012870 00000 n +0000012950 00000 n +0000013060 00000 n +0000013140 00000 n +0000013250 00000 n +0000013330 00000 n +0000013440 00000 n +0000013520 00000 n +0000013630 00000 n +0000013710 00000 n +0000013820 00000 n +0000013900 00000 n +0000014010 00000 n +0000014090 00000 n +0000014200 00000 n +0000014280 00000 n +0000014390 00000 n +0000014470 00000 n +0000014580 00000 n +0000014662 00000 n +0000014774 00000 n +0000014856 00000 n +0000014968 00000 n +0000015050 00000 n +0000015162 00000 n +0000015244 00000 n +0000015356 00000 n +0000015438 00000 n +0000015550 00000 n +0000015632 00000 n +0000015744 00000 n +0000015826 00000 n +0000015938 00000 n +0000016020 00000 n +0000016132 00000 n +0000016214 00000 n +0000016326 00000 n +0000016408 00000 n +0000016520 00000 n +0000016602 00000 n +0000016714 00000 n +0000016796 00000 n +0000016908 00000 n +0000016990 00000 n +0000017102 00000 n +0000017184 00000 n +0000017296 00000 n +0000017378 00000 n +0000017490 00000 n +0000017572 00000 n +0000017684 00000 n +0000017766 00000 n +0000017878 00000 n +0000017960 00000 n +0000018072 00000 n +0000018154 00000 n +0000018266 00000 n +0000018348 00000 n +0000018460 00000 n +0000018542 00000 n +0000018654 00000 n +0000018736 00000 n +0000018848 00000 n +0000018930 00000 n +0000019042 00000 n +0000019124 00000 n +0000019236 00000 n +0000019318 00000 n +0000019430 00000 n +0000019512 00000 n +0000019624 00000 n +0000019706 00000 n +0000019818 00000 n +0000019900 00000 n +0000020012 00000 n +0000020094 00000 n +0000020206 00000 n +0000020288 00000 n +0000020400 00000 n +0000020482 00000 n +0000020594 00000 n +0000020676 00000 n +0000020788 00000 n +0000020870 00000 n +0000020982 00000 n +0000021064 00000 n +0000021176 00000 n +0000021258 00000 n +0000021370 00000 n +0000021452 00000 n +0000021564 00000 n +0000021646 00000 n +0000021758 00000 n +0000021840 00000 n +0000021952 00000 n +0000022034 00000 n +0000022146 00000 n +0000022228 00000 n +0000022340 00000 n +0000022422 00000 n +0000022534 00000 n +0000022616 00000 n +0000022727 00000 n +0000022809 00000 n +0000022920 00000 n +0000023002 00000 n +0000023113 00000 n +0000023221 00000 n +0000023310 00000 n +0000023416 00000 n +0000023571 00000 n +0000023682 00000 n +0000023837 00000 n +0000023948 00000 n +0000024103 00000 n +0000024214 00000 n +0000024369 00000 n +0000024480 00000 n +0000024562 00000 n +0000024728 00000 n +0000024839 00000 n +0000024953 00000 n +0000025119 00000 n +0000025230 00000 n +0000025396 00000 n +0000025507 00000 n +0000025673 00000 n +0000025785 00000 n +0000025951 00000 n +0000026063 00000 n +0000026229 00000 n +0000026341 00000 n +0000026455 00000 n +0000026621 00000 n +0000026733 00000 n +0000026899 00000 n +0000027011 00000 n +0000027177 00000 n +0000027289 00000 n +0000027455 00000 n +0000027567 00000 n +0000027733 00000 n +0000027845 00000 n +0000027927 00000 n +0000028039 00000 n +0000028121 00000 n +0000028233 00000 n +0000028315 00000 n +0000028427 00000 n +0000028509 00000 n +0000028621 00000 n +0000028703 00000 n +0000028815 00000 n +0000028897 00000 n +0000029009 00000 n +0000029091 00000 n +0000029203 00000 n +0000029285 00000 n +0000029397 00000 n +0000029479 00000 n +0000029591 00000 n +0000029673 00000 n +0000029785 00000 n +0000029867 00000 n +0000030009 00000 n +0000030091 00000 n +0000030203 00000 n +0000030285 00000 n +0000030397 00000 n +0000030479 00000 n +0000030591 00000 n +0000030673 00000 n +0000030785 00000 n +0000030867 00000 n +0000030979 00000 n +0000031061 00000 n +0000031173 00000 n +0000031255 00000 n +0000031367 00000 n +0000031449 00000 n +0000031561 00000 n +0000031643 00000 n +0000031755 00000 n +0000031837 00000 n +0000031949 00000 n +0000032031 00000 n +0000032143 00000 n +0000032225 00000 n +0000032337 00000 n +0000032419 00000 n +0000032531 00000 n +0000032613 00000 n +0000032725 00000 n +0000032807 00000 n +0000032919 00000 n +0000033001 00000 n +0000033113 00000 n +0000033195 00000 n +0000033307 00000 n +0000033389 00000 n +0000033501 00000 n +0000033583 00000 n +0000033695 00000 n +0000033777 00000 n +0000033889 00000 n +0000033971 00000 n +0000034083 00000 n +0000034165 00000 n +0000034277 00000 n +0000034359 00000 n +0000034471 00000 n +0000034553 00000 n +0000034665 00000 n +0000034747 00000 n +0000034859 00000 n +0000034941 00000 n +0000035053 00000 n +0000035135 00000 n +0000035247 00000 n +0000035329 00000 n +0000035441 00000 n +0000035523 00000 n +0000035635 00000 n +0000035717 00000 n +0000035829 00000 n +0000035911 00000 n +0000036023 00000 n +0000036105 00000 n +0000036217 00000 n +0000036299 00000 n +0000036411 00000 n +0000036493 00000 n +0000036605 00000 n +0000036687 00000 n +0000036799 00000 n +0000036881 00000 n +0000036993 00000 n +0000037075 00000 n +0000037187 00000 n +0000037269 00000 n +0000037381 00000 n +0000037463 00000 n +0000037575 00000 n +0000037657 00000 n +0000037769 00000 n +0000037851 00000 n +0000037963 00000 n +0000038045 00000 n +0000038157 00000 n +0000038239 00000 n +0000038351 00000 n +0000038433 00000 n +0000038545 00000 n +0000038627 00000 n +0000038739 00000 n +0000038821 00000 n +0000038933 00000 n +0000039015 00000 n +0000039127 00000 n +0000039209 00000 n +0000039321 00000 n +0000039403 00000 n +0000039515 00000 n +0000039597 00000 n +0000039709 00000 n +0000039791 00000 n +0000039903 00000 n +0000039985 00000 n +0000040097 00000 n +0000040179 00000 n +0000040292 00000 n +0000040374 00000 n +0000040487 00000 n +0000040569 00000 n +0000040682 00000 n +0000040764 00000 n +0000040877 00000 n +0000040959 00000 n +0000041072 00000 n +0000041154 00000 n +0000041267 00000 n +0000041349 00000 n +0000041462 00000 n +0000041544 00000 n +0000041657 00000 n +0000041739 00000 n +0000041852 00000 n +0000041934 00000 n +0000042047 00000 n +0000042129 00000 n +0000042242 00000 n +0000042324 00000 n +0000042437 00000 n +0000042519 00000 n +0000042632 00000 n +0000042714 00000 n +0000042827 00000 n +0000042909 00000 n +0000043022 00000 n +0000043104 00000 n +0000043217 00000 n +0000043299 00000 n +0000043412 00000 n +0000043494 00000 n +0000043607 00000 n +0000043689 00000 n +0000043802 00000 n +0000043884 00000 n +0000043997 00000 n +0000044079 00000 n +0000044192 00000 n +0000044274 00000 n +0000044387 00000 n +0000044469 00000 n +0000044582 00000 n +0000044664 00000 n +0000044777 00000 n +0000044859 00000 n +0000044972 00000 n +0000045054 00000 n +0000045167 00000 n +0000045249 00000 n +0000045362 00000 n +0000045444 00000 n +0000045557 00000 n +0000045639 00000 n +0000045752 00000 n +0000045834 00000 n +0000045947 00000 n +0000046029 00000 n +0000046142 00000 n +0000046224 00000 n +0000046337 00000 n +0000046419 00000 n +0000046532 00000 n +0000046614 00000 n +0000046727 00000 n +0000046809 00000 n +0000046922 00000 n +0000047004 00000 n +0000047117 00000 n +0000047199 00000 n +0000047312 00000 n +0000047394 00000 n +0000047507 00000 n +0000047589 00000 n +0000047702 00000 n +0000047784 00000 n +0000047897 00000 n +0000047979 00000 n +0000048092 00000 n +0000048174 00000 n +0000048287 00000 n +0000048369 00000 n +0000048482 00000 n +0000048564 00000 n +0000048677 00000 n +0000048759 00000 n +0000048872 00000 n +0000048954 00000 n +0000049067 00000 n +0000049149 00000 n +0000049262 00000 n +0000049344 00000 n +0000049457 00000 n +0000049539 00000 n +0000049652 00000 n +0000049734 00000 n +0000049847 00000 n +0000049929 00000 n +0000050042 00000 n +0000050124 00000 n +0000050237 00000 n +0000050319 00000 n +0000050432 00000 n +0000050514 00000 n +0000050627 00000 n +0000050709 00000 n +0000050822 00000 n +0000050904 00000 n +0000051017 00000 n +0000051099 00000 n +0000051212 00000 n +0000051294 00000 n +0000051407 00000 n +0000051489 00000 n +0000051602 00000 n +0000051684 00000 n +0000051796 00000 n +0000051878 00000 n +0000051990 00000 n +0000052072 00000 n +0000052184 00000 n +0000052266 00000 n +0000052378 00000 n +0000052460 00000 n +0000052572 00000 n +0000052654 00000 n +0000052766 00000 n +0000052848 00000 n +0000052960 00000 n +0000053042 00000 n +0000053154 00000 n +0000053236 00000 n +0000053348 00000 n +0000053430 00000 n +0000053542 00000 n +0000053624 00000 n +0000053737 00000 n +0000053819 00000 n +0000053932 00000 n +0000054014 00000 n +0000054127 00000 n +0000054209 00000 n +0000054322 00000 n +0000054404 00000 n +0000054517 00000 n +0000054599 00000 n +0000054712 00000 n +0000054794 00000 n +0000054907 00000 n +0000054989 00000 n +0000055102 00000 n +0000055184 00000 n +0000055297 00000 n +0000055379 00000 n +0000055492 00000 n +0000055574 00000 n +0000055687 00000 n +0000055769 00000 n +0000055882 00000 n +0000055964 00000 n +0000056077 00000 n +0000056159 00000 n +0000056272 00000 n +0000056354 00000 n +0000056467 00000 n +0000056549 00000 n +0000056662 00000 n +0000056744 00000 n +0000056857 00000 n +0000056939 00000 n +0000057052 00000 n +0000057134 00000 n +0000057247 00000 n +0000057329 00000 n +0000057442 00000 n +0000057524 00000 n +0000057637 00000 n +0000057719 00000 n +0000057832 00000 n +0000057914 00000 n +0000058027 00000 n +0000058109 00000 n +0000058222 00000 n +0000058304 00000 n +0000058417 00000 n +0000058499 00000 n +0000058612 00000 n +0000058694 00000 n +0000058807 00000 n +0000058889 00000 n +0000059002 00000 n +0000059084 00000 n +0000059197 00000 n +0000059279 00000 n +0000059392 00000 n +0000059474 00000 n +0000059587 00000 n +0000059669 00000 n +0000059782 00000 n +0000059864 00000 n +0000059977 00000 n +0000060059 00000 n +0000060172 00000 n +0000060254 00000 n +0000060367 00000 n +0000060449 00000 n +0000060562 00000 n +0000060644 00000 n +0000060757 00000 n +0000060839 00000 n +0000060952 00000 n +0000061034 00000 n +0000061147 00000 n +0000061229 00000 n +0000061342 00000 n +0000061424 00000 n +0000061537 00000 n +0000061619 00000 n +0000061732 00000 n +0000061814 00000 n +0000061927 00000 n +0000062009 00000 n +0000062122 00000 n +0000062204 00000 n +0000062317 00000 n +0000062399 00000 n +0000062512 00000 n +0000062594 00000 n +0000062707 00000 n +0000062789 00000 n +0000062902 00000 n +0000062984 00000 n +0000063097 00000 n +0000063179 00000 n +0000063292 00000 n +0000063374 00000 n +0000063487 00000 n +0000063569 00000 n +0000063682 00000 n +0000063764 00000 n +0000063877 00000 n +0000063959 00000 n +0000064072 00000 n +0000064154 00000 n +0000064267 00000 n +0000064349 00000 n +0000064462 00000 n +0000064544 00000 n +0000064657 00000 n +0000064739 00000 n +0000064852 00000 n +0000064934 00000 n +0000065047 00000 n +0000065129 00000 n +0000065241 00000 n +0000065323 00000 n +0000065435 00000 n +0000065517 00000 n +0000065629 00000 n +0000065711 00000 n +0000065823 00000 n +0000065905 00000 n +0000066017 00000 n +0000066099 00000 n +0000066211 00000 n +0000066293 00000 n +0000066405 00000 n +0000066487 00000 n +0000066599 00000 n +0000066681 00000 n +0000066793 00000 n +0000066875 00000 n +0000066987 00000 n +0000067069 00000 n +0000067182 00000 n +0000067264 00000 n +0000067377 00000 n +0000067459 00000 n +0000067572 00000 n +0000067654 00000 n +0000067767 00000 n +0000067849 00000 n +0000067962 00000 n +0000068044 00000 n +0000068157 00000 n +0000068239 00000 n +0000068352 00000 n +0000068434 00000 n +0000068547 00000 n +0000068629 00000 n +0000068742 00000 n +0000068824 00000 n +0000068937 00000 n +0000069019 00000 n +0000069132 00000 n +0000069214 00000 n +0000069327 00000 n +0000069409 00000 n +0000069522 00000 n +0000069604 00000 n +0000069717 00000 n +0000069799 00000 n +0000069912 00000 n +0000069994 00000 n +0000070107 00000 n +0000070189 00000 n +0000070302 00000 n +0000070384 00000 n +0000070497 00000 n +0000070579 00000 n +0000070692 00000 n +0000070774 00000 n +0000070887 00000 n +0000070969 00000 n +0000071082 00000 n +0000071164 00000 n +0000071277 00000 n +0000071359 00000 n +0000071472 00000 n +0000071554 00000 n +0000071667 00000 n +0000071749 00000 n +0000071862 00000 n +0000071944 00000 n +0000072057 00000 n +0000072139 00000 n +0000072252 00000 n +0000072334 00000 n +0000072447 00000 n +0000072529 00000 n +0000072642 00000 n +0000072724 00000 n +0000072837 00000 n +0000072919 00000 n +0000073032 00000 n +0000073114 00000 n +0000073227 00000 n +0000073309 00000 n +0000073422 00000 n +0000073504 00000 n +0000073617 00000 n +0000073699 00000 n +0000073812 00000 n +0000073894 00000 n +0000074007 00000 n +0000074089 00000 n +0000074202 00000 n +0000074284 00000 n +0000074397 00000 n +0000074479 00000 n +0000074592 00000 n +0000074674 00000 n +0000074787 00000 n +0000074869 00000 n +0000074982 00000 n +0000075064 00000 n +0000075177 00000 n +0000075259 00000 n +0000075372 00000 n +0000075454 00000 n +0000075567 00000 n +0000075649 00000 n +0000075762 00000 n +0000075844 00000 n +0000075957 00000 n +0000076039 00000 n +0000076152 00000 n +0000076234 00000 n +0000076347 00000 n +0000076429 00000 n +0000076542 00000 n +0000076624 00000 n +0000076737 00000 n +0000076819 00000 n +0000076932 00000 n +0000077014 00000 n +0000077127 00000 n +0000077209 00000 n +0000077322 00000 n +0000077404 00000 n +0000077517 00000 n +0000077599 00000 n +0000077712 00000 n +0000077794 00000 n +0000077907 00000 n +0000077989 00000 n +0000078102 00000 n +0000078184 00000 n +0000078297 00000 n +0000078379 00000 n +0000078492 00000 n +0000078574 00000 n +0000078686 00000 n +0000078768 00000 n +0000078880 00000 n +0000078962 00000 n +0000079074 00000 n +0000079156 00000 n +0000079268 00000 n +0000079350 00000 n +0000079462 00000 n +0000079544 00000 n +0000079656 00000 n +0000079738 00000 n +0000079850 00000 n +0000079932 00000 n +0000080044 00000 n +0000080126 00000 n +0000080238 00000 n +0000080320 00000 n +0000080432 00000 n +0000080514 00000 n +0000080627 00000 n +0000080709 00000 n +0000080822 00000 n +0000080904 00000 n +0000081017 00000 n +0000081099 00000 n +0000081212 00000 n +0000081294 00000 n +0000081407 00000 n +0000081489 00000 n +0000081602 00000 n +0000081684 00000 n +0000081797 00000 n +0000081879 00000 n +0000081992 00000 n +0000082074 00000 n +0000082187 00000 n +0000082269 00000 n +0000082382 00000 n +0000082464 00000 n +0000082577 00000 n +0000082659 00000 n +0000082772 00000 n +0000082854 00000 n +0000082967 00000 n +0000083049 00000 n +0000083162 00000 n +0000083244 00000 n +0000083357 00000 n +0000083439 00000 n +0000083552 00000 n +0000083634 00000 n +0000083747 00000 n +0000083829 00000 n +0000083942 00000 n +0000084024 00000 n +0000084137 00000 n +0000084219 00000 n +0000084332 00000 n +0000084414 00000 n +0000084527 00000 n +0000084609 00000 n +0000084722 00000 n +0000084804 00000 n +0000084917 00000 n +0000084999 00000 n +0000085112 00000 n +0000085194 00000 n +0000085307 00000 n +0000085389 00000 n +0000085502 00000 n +0000085584 00000 n +0000085697 00000 n +0000085779 00000 n +0000085892 00000 n +0000085974 00000 n +0000086087 00000 n +0000086169 00000 n +0000086282 00000 n +0000086364 00000 n +0000086477 00000 n +0000086559 00000 n +0000086672 00000 n +0000086754 00000 n +0000086867 00000 n +0000086949 00000 n +0000087062 00000 n +0000087144 00000 n +0000087257 00000 n +0000087339 00000 n +0000087483 00000 n +0000087565 00000 n +0000087678 00000 n +0000087760 00000 n +0000087873 00000 n +0000087955 00000 n +0000088068 00000 n +0000088150 00000 n +0000088263 00000 n +0000088345 00000 n +0000088458 00000 n +0000088540 00000 n +0000088653 00000 n +0000088735 00000 n +0000088848 00000 n +0000088930 00000 n +0000089043 00000 n +0000089125 00000 n +0000089238 00000 n +0000089320 00000 n +0000089433 00000 n +0000089515 00000 n +0000089628 00000 n +0000089710 00000 n +0000089823 00000 n +0000089905 00000 n +0000090018 00000 n +0000090100 00000 n +0000090213 00000 n +0000090295 00000 n +0000090408 00000 n +0000090490 00000 n +0000090603 00000 n +0000090685 00000 n +0000090798 00000 n +0000090880 00000 n +0000090993 00000 n +0000091075 00000 n +0000091188 00000 n +0000091270 00000 n +0000091382 00000 n +0000091464 00000 n +0000091576 00000 n +0000091658 00000 n +0000091770 00000 n +0000091852 00000 n +0000091964 00000 n +0000092046 00000 n +0000092158 00000 n +0000092240 00000 n +0000092352 00000 n +0000092434 00000 n +0000092546 00000 n +0000092628 00000 n +0000092740 00000 n +0000092822 00000 n +0000092934 00000 n +0000093016 00000 n +0000093128 00000 n +0000093210 00000 n +0000093323 00000 n +0000093405 00000 n +0000093518 00000 n +0000093600 00000 n +0000093713 00000 n +0000093795 00000 n +0000093908 00000 n +0000093990 00000 n +0000094103 00000 n +0000094185 00000 n +0000094298 00000 n +0000094380 00000 n +0000094493 00000 n +0000094575 00000 n +0000094688 00000 n +0000094770 00000 n +0000094883 00000 n +0000094965 00000 n +0000095078 00000 n +0000095160 00000 n +0000095273 00000 n +0000095355 00000 n +0000095468 00000 n +0000095550 00000 n +0000095663 00000 n +0000095745 00000 n +0000095858 00000 n +0000095940 00000 n +0000096053 00000 n +0000096135 00000 n +0000096248 00000 n +0000096330 00000 n +0000096443 00000 n +0000096525 00000 n +0000096638 00000 n +0000096720 00000 n +0000096833 00000 n +0000096915 00000 n +0000097028 00000 n +0000097110 00000 n +0000097223 00000 n +0000097305 00000 n +0000097418 00000 n +0000097500 00000 n +0000097613 00000 n +0000097695 00000 n +0000097808 00000 n +0000097890 00000 n +0000098003 00000 n +0000098085 00000 n +0000098198 00000 n +0000098280 00000 n +0000098393 00000 n +0000098475 00000 n +0000098588 00000 n +0000098670 00000 n +0000098783 00000 n +0000098865 00000 n +0000098978 00000 n +0000099060 00000 n +0000099173 00000 n +0000099255 00000 n +0000099368 00000 n +0000099450 00000 n +0000099563 00000 n +0000099645 00000 n +0000099758 00000 n +0000099840 00000 n +0000099953 00000 n +0000100035 00000 n +0000100148 00000 n +0000100230 00000 n +0000100343 00000 n +0000100425 00000 n +0000100538 00000 n +0000100620 00000 n +0000100733 00000 n +0000100815 00000 n +0000100928 00000 n +0000101010 00000 n +0000101123 00000 n +0000101205 00000 n +0000101318 00000 n +0000101400 00000 n +0000101513 00000 n +0000101595 00000 n +0000101708 00000 n +0000101790 00000 n +0000101903 00000 n +0000101985 00000 n +0000102098 00000 n +0000102180 00000 n +0000102293 00000 n +0000102375 00000 n +0000102488 00000 n +0000102570 00000 n +0000102683 00000 n +0000102765 00000 n +0000102878 00000 n +0000102960 00000 n +0000103073 00000 n +0000103155 00000 n +0000103268 00000 n +0000103350 00000 n +0000103462 00000 n +0000103546 00000 n +0000103660 00000 n +0000103744 00000 n +0000103858 00000 n +0000103942 00000 n +0000104056 00000 n +0000104140 00000 n +0000104254 00000 n +0000104338 00000 n +0000104452 00000 n +0000104536 00000 n +0000104680 00000 n +0000104764 00000 n +0000104878 00000 n +0000104962 00000 n +0000105076 00000 n +0000105160 00000 n +0000105275 00000 n +0000105359 00000 n +0000105474 00000 n +0000105558 00000 n +0000105673 00000 n +0000105757 00000 n +0000105872 00000 n +0000105956 00000 n +0000106071 00000 n +0000106155 00000 n +0000106270 00000 n +0000106354 00000 n +0000106469 00000 n +0000106553 00000 n +0000106668 00000 n +0000106752 00000 n +0000106867 00000 n +0000106951 00000 n +0000107066 00000 n +0000107150 00000 n +0000107265 00000 n +0000107349 00000 n +0000107495 00000 n +0000107579 00000 n +0000107694 00000 n +0000107778 00000 n +0000107924 00000 n +0000108008 00000 n +0000108123 00000 n +0000108207 00000 n +0000108353 00000 n +0000108437 00000 n +0000108552 00000 n +0000108636 00000 n +0000108751 00000 n +0000108898 00000 n +0000109457 00000 n +0000110054 00000 n +0000110627 00000 n +0000111200 00000 n +0000111773 00000 n +0000112322 00000 n +0000112839 00000 n +0000113138 00000 n +0000113283 00000 n +0000135016 00000 n +0000135055 00000 n +0000135244 00000 n +0000151276 00000 n +0000151466 00000 n +0000151962 00000 n +0000152349 00000 n +0000156917 00000 n +0000157152 00000 n +0000157447 00000 n +0000157788 00000 n +0000159433 00000 n +0000163286 00000 n +0000166605 00000 n +0000169121 00000 n +0000171630 00000 n +0000174150 00000 n +0000177352 00000 n +0000180125 00000 n + +trailer +<<15492F1BE1541BFEA5A6D9A73AD102AB>]>> +startxref +182006 +%%EOF diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850386.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850386.pdf new file mode 100644 index 000000000..920c4ea7c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850386.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850389.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850389.pdf new file mode 100644 index 000000000..0d8db28c5 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500764850389.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759115.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759115.pdf new file mode 100644 index 000000000..ad184f6b0 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759115.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759116.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759116.pdf new file mode 100644 index 000000000..c43348764 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759116.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759117.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759117.pdf new file mode 100644 index 000000000..eeb66d038 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759117.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759119.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759119.pdf new file mode 100644 index 000000000..304f7cc92 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759119.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759121.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759121.pdf new file mode 100644 index 000000000..6429ece08 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500766759121.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954150.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954150.pdf new file mode 100644 index 000000000..3cce0564a Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954150.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954151.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954151.pdf new file mode 100644 index 000000000..d47ffb5be Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954151.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954152.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954152.pdf new file mode 100644 index 000000000..4d307b6ad Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954152.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954153.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954153.pdf new file mode 100644 index 000000000..46b7b7197 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954153.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954154.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954154.pdf new file mode 100644 index 000000000..47228041e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954154.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954156.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954156.pdf new file mode 100644 index 000000000..22054c12c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500767954156.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500770361585.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500770361585.pdf new file mode 100644 index 000000000..3e138b021 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500770361585.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500770361586.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500770361586.pdf new file mode 100644 index 000000000..1a519c85e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500770361586.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500770361587.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500770361587.pdf new file mode 100644 index 000000000..8a5b530aa Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500770361587.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973359.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973359.pdf new file mode 100644 index 000000000..25a037ab3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973359.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973360.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973360.pdf new file mode 100644 index 000000000..c5fe980e7 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973360.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973361.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973361.pdf new file mode 100644 index 000000000..d0b1e64f3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973361.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973362.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973362.pdf new file mode 100644 index 000000000..029091ccb Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973362.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973363.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973363.pdf new file mode 100644 index 000000000..5ebfc887f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973363.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973364.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973364.pdf new file mode 100644 index 000000000..35c23df5c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973364.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973365.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973365.pdf new file mode 100644 index 000000000..c198c8fef Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973365.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973366.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973366.pdf new file mode 100644 index 000000000..90d124f4a Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973366.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973367.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973367.pdf new file mode 100644 index 000000000..36a94df69 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500771973367.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500774016249.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500774016249.pdf new file mode 100644 index 000000000..346ba0655 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500774016249.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796290249.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796290249.pdf new file mode 100644 index 000000000..1793038f6 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796290249.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796290250.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796290250.pdf new file mode 100644 index 000000000..d3828c575 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796290250.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377309.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377309.pdf new file mode 100644 index 000000000..4f267edc3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377309.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377310.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377310.pdf new file mode 100644 index 000000000..5af9f9e66 --- /dev/null +++ b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377310.pdf @@ -0,0 +1,5332 @@ +%PDF-1.4 +%µ¶ +% Written by MuPDF 1.29.0 + +1 0 obj +<> +endobj + +2 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1015 0 R/StructParents 0/Parent 16 0 R>> +endobj + +3 0 obj +<> +endobj + +4 0 obj +<> +endobj + +5 0 obj +<> +endobj + +6 0 obj +<> +endobj + +7 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1016 0 R/StructParents 1/Parent 16 0 R>> +endobj + +8 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1017 0 R/StructParents 2/Parent 16 0 R>> +endobj + +9 0 obj +<> +endobj + +10 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1018 0 R/StructParents 3/Parent 16 0 R>> +endobj + +11 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1019 0 R/StructParents 4/Parent 16 0 R>> +endobj + +12 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1020 0 R/StructParents 5/Parent 16 0 R>> +endobj + +13 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1021 0 R/StructParents 6/Parent 16 0 R>> +endobj + +14 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1022 0 R/StructParents 7/Parent 16 0 R>> +endobj + +15 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1023 0 R/StructParents 8/Parent 17 0 R>> +endobj + +16 0 obj +<> +endobj + +17 0 obj +<> +endobj + +18 0 obj +<> +endobj + +19 0 obj +<> +endobj + +20 0 obj +<> +endobj + +21 0 obj +<><>]/ID(node00000003)>> +endobj + +22 0 obj +<> +endobj + +23 0 obj +<>]/ID(node00000025)>> +endobj + +24 0 obj +<> +endobj + +25 0 obj +<>]/ID(node00000026)>> +endobj + +26 0 obj +<> +endobj + +27 0 obj +<>]/ID(node00000029)>> +endobj + +28 0 obj +<> +endobj + +29 0 obj +<>]/ID(node00000031)>> +endobj + +30 0 obj +<> +endobj + +31 0 obj +<>]/ID(node00000034)>> +endobj + +32 0 obj +<> +endobj + +33 0 obj +<>]/ID(node00000036)>> +endobj + +34 0 obj +<> +endobj + +35 0 obj +<>]/ID(node00000038)>> +endobj + +36 0 obj +<> +endobj + +37 0 obj +<>]/ID(node00000040)>> +endobj + +38 0 obj +<> +endobj + +39 0 obj +<>]/ID(node00000042)>> +endobj + +40 0 obj +<> +endobj + +41 0 obj +<>]/ID(node00000044)>> +endobj + +42 0 obj +<> +endobj + +43 0 obj +<>]/ID(node00000046)>> +endobj + +44 0 obj +<> +endobj + +45 0 obj +<>]/ID(node00000048)>> +endobj + +46 0 obj +<>]/ID(node00000007)>> +endobj + +47 0 obj +<>]/ID(node00000008)>> +endobj + +48 0 obj +<>]/ID(node00000009)>> +endobj + +49 0 obj +<>]/ID(node00000010)>> +endobj + +50 0 obj +<> +endobj + +51 0 obj +<>]/ID(node00000012)>> +endobj + +52 0 obj +<> +endobj + +53 0 obj +<>]/ID(node00000013)>> +endobj + +54 0 obj +<> +endobj + +55 0 obj +<><>]/ID(node00000061)>> +endobj + +56 0 obj +<> +endobj + +57 0 obj +<>]/ID(node00000063)>> +endobj + +58 0 obj +<> +endobj + +59 0 obj +<><>]/ID(node00000065)>> +endobj + +60 0 obj +<> +endobj + +61 0 obj +<>]/ID(node00000067)>> +endobj + +62 0 obj +<> +endobj + +63 0 obj +<>]/ID(node00000070)>> +endobj + +64 0 obj +<> +endobj + +65 0 obj +<>]/ID(node00000072)>> +endobj + +66 0 obj +<> +endobj + +67 0 obj +<>]/ID(node00000075)>> +endobj + +68 0 obj +<> +endobj + +69 0 obj +<>]/ID(node00000077)>> +endobj + +70 0 obj +<> +endobj + +71 0 obj +<>]/ID(node00000080)>> +endobj + +72 0 obj +<> +endobj + +73 0 obj +<>]/ID(node00000082)>> +endobj + +74 0 obj +<> +endobj + +75 0 obj +<>]/ID(node00000085)>> +endobj + +76 0 obj +<> +endobj + +77 0 obj +<>]/ID(node00000087)>> +endobj + +78 0 obj +<> +endobj + +79 0 obj +<>]/ID(node00000090)>> +endobj + +80 0 obj +<> +endobj + +81 0 obj +<>]/ID(node00000092)>> +endobj + +82 0 obj +<> +endobj + +83 0 obj +<>]/ID(node00000095)>> +endobj + +84 0 obj +<> +endobj + +85 0 obj +<>]/ID(node00000097)>> +endobj + +86 0 obj +<> +endobj + +87 0 obj +<>]/ID(node00000100)>> +endobj + +88 0 obj +<> +endobj + +89 0 obj +<>]/ID(node00000102)>> +endobj + +90 0 obj +<> +endobj + +91 0 obj +<>]/ID(node00000105)>> +endobj + +92 0 obj +<> +endobj + +93 0 obj +<>]/ID(node00000107)>> +endobj + +94 0 obj +<> +endobj + +95 0 obj +<>]/ID(node00000110)>> +endobj + +96 0 obj +<> +endobj + +97 0 obj +<>]/ID(node00000112)>> +endobj + +98 0 obj +<> +endobj + +99 0 obj +<>]/ID(node00000115)>> +endobj + +100 0 obj +<> +endobj + +101 0 obj +<>]/ID(node00000117)>> +endobj + +102 0 obj +<> +endobj + +103 0 obj +<>]/ID(node00000121)>> +endobj + +104 0 obj +<> +endobj + +105 0 obj +<>]/ID(node00000123)>> +endobj + +106 0 obj +<> +endobj + +107 0 obj +<>]/ID(node00000126)>> +endobj + +108 0 obj +<> +endobj + +109 0 obj +<>]/ID(node00000128)>> +endobj + +110 0 obj +<> +endobj + +111 0 obj +<>]/ID(node00000131)>> +endobj + +112 0 obj +<> +endobj + +113 0 obj +<>]/ID(node00000133)>> +endobj + +114 0 obj +<> +endobj + +115 0 obj +<>]/ID(node00000136)>> +endobj + +116 0 obj +<> +endobj + +117 0 obj +<>]/ID(node00000138)>> +endobj + +118 0 obj +<> +endobj + +119 0 obj +<>]/ID(node00000142)>> +endobj + +120 0 obj +<> +endobj + +121 0 obj +<>]/ID(node00000144)>> +endobj + +122 0 obj +<> +endobj + +123 0 obj +<>]/ID(node00000148)>> +endobj + +124 0 obj +<> +endobj + +125 0 obj +<>]/ID(node00000151)>> +endobj + +126 0 obj +<> +endobj + +127 0 obj +<>]/ID(node00000154)>> +endobj + +128 0 obj +<> +endobj + +129 0 obj +<>]/ID(node00000156)>> +endobj + +130 0 obj +<> +endobj + +131 0 obj +<>]/ID(node00000159)>> +endobj + +132 0 obj +<> +endobj + +133 0 obj +<>]/ID(node00000161)>> +endobj + +134 0 obj +<> +endobj + +135 0 obj +<>]/ID(node00000164)>> +endobj + +136 0 obj +<> +endobj + +137 0 obj +<>]/ID(node00000166)>> +endobj + +138 0 obj +<> +endobj + +139 0 obj +<>]/ID(node00000169)>> +endobj + +140 0 obj +<> +endobj + +141 0 obj +<>]/ID(node00000171)>> +endobj + +142 0 obj +<> +endobj + +143 0 obj +<>]/ID(node00000175)>> +endobj + +144 0 obj +<> +endobj + +145 0 obj +<>]/ID(node00000177)>> +endobj + +146 0 obj +<> +endobj + +147 0 obj +<>]/ID(node00000180)>> +endobj + +148 0 obj +<> +endobj + +149 0 obj +<>]/ID(node00000182)>> +endobj + +150 0 obj +<> +endobj + +151 0 obj +<>]/ID(node00000186)>> +endobj + +152 0 obj +<> +endobj + +153 0 obj +<>]/ID(node00000188)>> +endobj + +154 0 obj +<> +endobj + +155 0 obj +<>]/ID(node00000191)>> +endobj + +156 0 obj +<> +endobj + +157 0 obj +<>]/ID(node00000193)>> +endobj + +158 0 obj +<> +endobj + +159 0 obj +<>]/ID(node00000196)>> +endobj + +160 0 obj +<> +endobj + +161 0 obj +<>]/ID(node00000198)>> +endobj + +162 0 obj +<> +endobj + +163 0 obj +<>]/ID(node00000202)>> +endobj + +164 0 obj +<> +endobj + +165 0 obj +<>]/ID(node00000204)>> +endobj + +166 0 obj +<> +endobj + +167 0 obj +<>]/ID(node00000207)>> +endobj + +168 0 obj +<> +endobj + +169 0 obj +<>]/ID(node00000209)>> +endobj + +170 0 obj +<> +endobj + +171 0 obj +<>]/ID(node00000212)>> +endobj + +172 0 obj +<> +endobj + +173 0 obj +<>]/ID(node00000214)>> +endobj + +174 0 obj +<> +endobj + +175 0 obj +<>]/ID(node00000217)>> +endobj + +176 0 obj +<> +endobj + +177 0 obj +<>]/ID(node00000219)>> +endobj + +178 0 obj +<> +endobj + +179 0 obj +<>]/ID(node00000222)>> +endobj + +180 0 obj +<> +endobj + +181 0 obj +<>]/ID(node00000224)>> +endobj + +182 0 obj +<> +endobj + +183 0 obj +<>]/ID(node00000228)>> +endobj + +184 0 obj +<> +endobj + +185 0 obj +<> +endobj + +186 0 obj +<> +endobj + +187 0 obj +<><><>]/ID(node00000233)>> +endobj + +188 0 obj +<>]/ID(node00000234)>> +endobj + +189 0 obj +<><><>]/ID(node00000235)>> +endobj + +190 0 obj +<>]/ID(node00000236)>> +endobj + +191 0 obj +<><><>]/ID(node00000237)>> +endobj + +192 0 obj +<>]/ID(node00000238)>> +endobj + +193 0 obj +<><><>]/ID(node00000239)>> +endobj + +194 0 obj +<>]/ID(node00000240)>> +endobj + +195 0 obj +<> +endobj + +196 0 obj +<><><>]/ID(node00000243)>> +endobj + +197 0 obj +<>]/ID(node00000244)>> +endobj + +198 0 obj +<> +endobj + +199 0 obj +<><><>]/ID(node00000246)>> +endobj + +200 0 obj +<>]/ID(node00000247)>> +endobj + +201 0 obj +<><><>]/ID(node00000248)>> +endobj + +202 0 obj +<>]/ID(node00000249)>> +endobj + +203 0 obj +<><><>]/ID(node00000250)>> +endobj + +204 0 obj +<>]/ID(node00000251)>> +endobj + +205 0 obj +<><><>]/ID(node00000252)>> +endobj + +206 0 obj +<>]/ID(node00000253)>> +endobj + +207 0 obj +<><><>]/ID(node00000254)>> +endobj + +208 0 obj +<>]/ID(node00000255)>> +endobj + +209 0 obj +<> +endobj + +210 0 obj +<><><>]/ID(node00000257)>> +endobj + +211 0 obj +<>]/ID(node00000258)>> +endobj + +212 0 obj +<><><>]/ID(node00000259)>> +endobj + +213 0 obj +<>]/ID(node00000260)>> +endobj + +214 0 obj +<><><>]/ID(node00000261)>> +endobj + +215 0 obj +<>]/ID(node00000262)>> +endobj + +216 0 obj +<><><>]/ID(node00000263)>> +endobj + +217 0 obj +<>]/ID(node00000264)>> +endobj + +218 0 obj +<><><>]/ID(node00000265)>> +endobj + +219 0 obj +<>]/ID(node00000266)>> +endobj + +220 0 obj +<> +endobj + +221 0 obj +<>]/ID(node00000270)>> +endobj + +222 0 obj +<> +endobj + +223 0 obj +<>]/ID(node00000273)>> +endobj + +224 0 obj +<> +endobj + +225 0 obj +<>]/ID(node00000276)>> +endobj + +226 0 obj +<> +endobj + +227 0 obj +<>]/ID(node00000278)>> +endobj + +228 0 obj +<> +endobj + +229 0 obj +<>]/ID(node00000281)>> +endobj + +230 0 obj +<> +endobj + +231 0 obj +<>]/ID(node00000283)>> +endobj + +232 0 obj +<> +endobj + +233 0 obj +<>]/ID(node00000286)>> +endobj + +234 0 obj +<> +endobj + +235 0 obj +<>]/ID(node00000288)>> +endobj + +236 0 obj +<> +endobj + +237 0 obj +<>]/ID(node00000291)>> +endobj + +238 0 obj +<> +endobj + +239 0 obj +<>]/ID(node00000293)>> +endobj + +240 0 obj +<> +endobj + +241 0 obj +<><>]/ID(node00000297)>> +endobj + +242 0 obj +<> +endobj + +243 0 obj +<>]/ID(node00000299)>> +endobj + +244 0 obj +<> +endobj + +245 0 obj +<>]/ID(node00000304)>> +endobj + +246 0 obj +<> +endobj + +247 0 obj +<>]/ID(node00000306)>> +endobj + +248 0 obj +<> +endobj + +249 0 obj +<>]/ID(node00000310)>> +endobj + +250 0 obj +<> +endobj + +251 0 obj +<>]/ID(node00000313)>> +endobj + +252 0 obj +<> +endobj + +253 0 obj +<>]/ID(node00000316)>> +endobj + +254 0 obj +<> +endobj + +255 0 obj +<>]/ID(node00000318)>> +endobj + +256 0 obj +<> +endobj + +257 0 obj +<>]/ID(node00000321)>> +endobj + +258 0 obj +<> +endobj + +259 0 obj +<>]/ID(node00000323)>> +endobj + +260 0 obj +<> +endobj + +261 0 obj +<>]/ID(node00000326)>> +endobj + +262 0 obj +<> +endobj + +263 0 obj +<>]/ID(node00000328)>> +endobj + +264 0 obj +<> +endobj + +265 0 obj +<>]/ID(node00000331)>> +endobj + +266 0 obj +<> +endobj + +267 0 obj +<>]/ID(node00000333)>> +endobj + +268 0 obj +<> +endobj + +269 0 obj +<>]/ID(node00000336)>> +endobj + +270 0 obj +<> +endobj + +271 0 obj +<>]/ID(node00000338)>> +endobj + +272 0 obj +<> +endobj + +273 0 obj +<>]/ID(node00000341)>> +endobj + +274 0 obj +<> +endobj + +275 0 obj +<>]/ID(node00000343)>> +endobj + +276 0 obj +<> +endobj + +277 0 obj +<>]/ID(node00000346)>> +endobj + +278 0 obj +<> +endobj + +279 0 obj +<>]/ID(node00000348)>> +endobj + +280 0 obj +<> +endobj + +281 0 obj +<>]/ID(node00000351)>> +endobj + +282 0 obj +<> +endobj + +283 0 obj +<>]/ID(node00000353)>> +endobj + +284 0 obj +<> +endobj + +285 0 obj +<>]/ID(node00000356)>> +endobj + +286 0 obj +<> +endobj + +287 0 obj +<>]/ID(node00000358)>> +endobj + +288 0 obj +<> +endobj + +289 0 obj +<>]/ID(node00000361)>> +endobj + +290 0 obj +<> +endobj + +291 0 obj +<>]/ID(node00000363)>> +endobj + +292 0 obj +<> +endobj + +293 0 obj +<>]/ID(node00000366)>> +endobj + +294 0 obj +<> +endobj + +295 0 obj +<>]/ID(node00000368)>> +endobj + +296 0 obj +<> +endobj + +297 0 obj +<>]/ID(node00000372)>> +endobj + +298 0 obj +<> +endobj + +299 0 obj +<>]/ID(node00000375)>> +endobj + +300 0 obj +<> +endobj + +301 0 obj +<>]/ID(node00000377)>> +endobj + +302 0 obj +<> +endobj + +303 0 obj +<>]/ID(node00000380)>> +endobj + +304 0 obj +<> +endobj + +305 0 obj +<>]/ID(node00000382)>> +endobj + +306 0 obj +<> +endobj + +307 0 obj +<>]/ID(node00000385)>> +endobj + +308 0 obj +<> +endobj + +309 0 obj +<>]/ID(node00000387)>> +endobj + +310 0 obj +<> +endobj + +311 0 obj +<>]/ID(node00000390)>> +endobj + +312 0 obj +<> +endobj + +313 0 obj +<>]/ID(node00000392)>> +endobj + +314 0 obj +<> +endobj + +315 0 obj +<>]/ID(node00000395)>> +endobj + +316 0 obj +<> +endobj + +317 0 obj +<>]/ID(node00000397)>> +endobj + +318 0 obj +<> +endobj + +319 0 obj +<>]/ID(node00000400)>> +endobj + +320 0 obj +<> +endobj + +321 0 obj +<>]/ID(node00000402)>> +endobj + +322 0 obj +<> +endobj + +323 0 obj +<>]/ID(node00000405)>> +endobj + +324 0 obj +<> +endobj + +325 0 obj +<>]/ID(node00000407)>> +endobj + +326 0 obj +<> +endobj + +327 0 obj +<>]/ID(node00000410)>> +endobj + +328 0 obj +<> +endobj + +329 0 obj +<>]/ID(node00000412)>> +endobj + +330 0 obj +<> +endobj + +331 0 obj +<>]/ID(node00000415)>> +endobj + +332 0 obj +<> +endobj + +333 0 obj +<>]/ID(node00000417)>> +endobj + +334 0 obj +<> +endobj + +335 0 obj +<>]/ID(node00000420)>> +endobj + +336 0 obj +<> +endobj + +337 0 obj +<>]/ID(node00000422)>> +endobj + +338 0 obj +<> +endobj + +339 0 obj +<>]/ID(node00000425)>> +endobj + +340 0 obj +<> +endobj + +341 0 obj +<>]/ID(node00000427)>> +endobj + +342 0 obj +<> +endobj + +343 0 obj +<>]/ID(node00000431)>> +endobj + +344 0 obj +<> +endobj + +345 0 obj +<>]/ID(node00000434)>> +endobj + +346 0 obj +<> +endobj + +347 0 obj +<>]/ID(node00000436)>> +endobj + +348 0 obj +<> +endobj + +349 0 obj +<>]/ID(node00000439)>> +endobj + +350 0 obj +<> +endobj + +351 0 obj +<>]/ID(node00000441)>> +endobj + +352 0 obj +<> +endobj + +353 0 obj +<>]/ID(node00000444)>> +endobj + +354 0 obj +<> +endobj + +355 0 obj +<>]/ID(node00000446)>> +endobj + +356 0 obj +<> +endobj + +357 0 obj +<>]/ID(node00000449)>> +endobj + +358 0 obj +<> +endobj + +359 0 obj +<>]/ID(node00000451)>> +endobj + +360 0 obj +<> +endobj + +361 0 obj +<>]/ID(node00000454)>> +endobj + +362 0 obj +<> +endobj + +363 0 obj +<>]/ID(node00000456)>> +endobj + +364 0 obj +<> +endobj + +365 0 obj +<>]/ID(node00000459)>> +endobj + +366 0 obj +<> +endobj + +367 0 obj +<>]/ID(node00000461)>> +endobj + +368 0 obj +<> +endobj + +369 0 obj +<>]/ID(node00000464)>> +endobj + +370 0 obj +<> +endobj + +371 0 obj +<>]/ID(node00000466)>> +endobj + +372 0 obj +<> +endobj + +373 0 obj +<>]/ID(node00000469)>> +endobj + +374 0 obj +<> +endobj + +375 0 obj +<>]/ID(node00000471)>> +endobj + +376 0 obj +<> +endobj + +377 0 obj +<>]/ID(node00000474)>> +endobj + +378 0 obj +<> +endobj + +379 0 obj +<>]/ID(node00000476)>> +endobj + +380 0 obj +<> +endobj + +381 0 obj +<>]/ID(node00000479)>> +endobj + +382 0 obj +<> +endobj + +383 0 obj +<>]/ID(node00000481)>> +endobj + +384 0 obj +<> +endobj + +385 0 obj +<>]/ID(node00000484)>> +endobj + +386 0 obj +<> +endobj + +387 0 obj +<>]/ID(node00000486)>> +endobj + +388 0 obj +<> +endobj + +389 0 obj +<>]/ID(node00000490)>> +endobj + +390 0 obj +<> +endobj + +391 0 obj +<>]/ID(node00000493)>> +endobj + +392 0 obj +<> +endobj + +393 0 obj +<>]/ID(node00000495)>> +endobj + +394 0 obj +<> +endobj + +395 0 obj +<>]/ID(node00000498)>> +endobj + +396 0 obj +<> +endobj + +397 0 obj +<>]/ID(node00000500)>> +endobj + +398 0 obj +<> +endobj + +399 0 obj +<>]/ID(node00000503)>> +endobj + +400 0 obj +<> +endobj + +401 0 obj +<>]/ID(node00000505)>> +endobj + +402 0 obj +<> +endobj + +403 0 obj +<>]/ID(node00000508)>> +endobj + +404 0 obj +<> +endobj + +405 0 obj +<>]/ID(node00000510)>> +endobj + +406 0 obj +<> +endobj + +407 0 obj +<>]/ID(node00000513)>> +endobj + +408 0 obj +<> +endobj + +409 0 obj +<>]/ID(node00000515)>> +endobj + +410 0 obj +<> +endobj + +411 0 obj +<>]/ID(node00000518)>> +endobj + +412 0 obj +<> +endobj + +413 0 obj +<>]/ID(node00000520)>> +endobj + +414 0 obj +<> +endobj + +415 0 obj +<>]/ID(node00000523)>> +endobj + +416 0 obj +<> +endobj + +417 0 obj +<>]/ID(node00000525)>> +endobj + +418 0 obj +<> +endobj + +419 0 obj +<>]/ID(node00000528)>> +endobj + +420 0 obj +<> +endobj + +421 0 obj +<>]/ID(node00000530)>> +endobj + +422 0 obj +<> +endobj + +423 0 obj +<>]/ID(node00000533)>> +endobj + +424 0 obj +<> +endobj + +425 0 obj +<>]/ID(node00000535)>> +endobj + +426 0 obj +<> +endobj + +427 0 obj +<>]/ID(node00000538)>> +endobj + +428 0 obj +<> +endobj + +429 0 obj +<>]/ID(node00000540)>> +endobj + +430 0 obj +<> +endobj + +431 0 obj +<>]/ID(node00000543)>> +endobj + +432 0 obj +<> +endobj + +433 0 obj +<>]/ID(node00000545)>> +endobj + +434 0 obj +<> +endobj + +435 0 obj +<>]/ID(node00000549)>> +endobj + +436 0 obj +<> +endobj + +437 0 obj +<>]/ID(node00000552)>> +endobj + +438 0 obj +<> +endobj + +439 0 obj +<>]/ID(node00000554)>> +endobj + +440 0 obj +<> +endobj + +441 0 obj +<>]/ID(node00000557)>> +endobj + +442 0 obj +<> +endobj + +443 0 obj +<>]/ID(node00000559)>> +endobj + +444 0 obj +<> +endobj + +445 0 obj +<>]/ID(node00000562)>> +endobj + +446 0 obj +<> +endobj + +447 0 obj +<>]/ID(node00000564)>> +endobj + +448 0 obj +<> +endobj + +449 0 obj +<>]/ID(node00000567)>> +endobj + +450 0 obj +<> +endobj + +451 0 obj +<>]/ID(node00000569)>> +endobj + +452 0 obj +<> +endobj + +453 0 obj +<>]/ID(node00000572)>> +endobj + +454 0 obj +<> +endobj + +455 0 obj +<>]/ID(node00000574)>> +endobj + +456 0 obj +<> +endobj + +457 0 obj +<>]/ID(node00000577)>> +endobj + +458 0 obj +<> +endobj + +459 0 obj +<>]/ID(node00000579)>> +endobj + +460 0 obj +<> +endobj + +461 0 obj +<>]/ID(node00000582)>> +endobj + +462 0 obj +<> +endobj + +463 0 obj +<>]/ID(node00000584)>> +endobj + +464 0 obj +<> +endobj + +465 0 obj +<>]/ID(node00000587)>> +endobj + +466 0 obj +<> +endobj + +467 0 obj +<>]/ID(node00000589)>> +endobj + +468 0 obj +<> +endobj + +469 0 obj +<>]/ID(node00000592)>> +endobj + +470 0 obj +<> +endobj + +471 0 obj +<>]/ID(node00000594)>> +endobj + +472 0 obj +<> +endobj + +473 0 obj +<>]/ID(node00000597)>> +endobj + +474 0 obj +<> +endobj + +475 0 obj +<>]/ID(node00000599)>> +endobj + +476 0 obj +<> +endobj + +477 0 obj +<>]/ID(node00000602)>> +endobj + +478 0 obj +<> +endobj + +479 0 obj +<>]/ID(node00000604)>> +endobj + +480 0 obj +<> +endobj + +481 0 obj +<>]/ID(node00000608)>> +endobj + +482 0 obj +<> +endobj + +483 0 obj +<>]/ID(node00000611)>> +endobj + +484 0 obj +<> +endobj + +485 0 obj +<>]/ID(node00000613)>> +endobj + +486 0 obj +<> +endobj + +487 0 obj +<>]/ID(node00000616)>> +endobj + +488 0 obj +<> +endobj + +489 0 obj +<>]/ID(node00000618)>> +endobj + +490 0 obj +<> +endobj + +491 0 obj +<>]/ID(node00000621)>> +endobj + +492 0 obj +<> +endobj + +493 0 obj +<>]/ID(node00000623)>> +endobj + +494 0 obj +<> +endobj + +495 0 obj +<>]/ID(node00000626)>> +endobj + +496 0 obj +<> +endobj + +497 0 obj +<>]/ID(node00000628)>> +endobj + +498 0 obj +<> +endobj + +499 0 obj +<>]/ID(node00000631)>> +endobj + +500 0 obj +<> +endobj + +501 0 obj +<>]/ID(node00000633)>> +endobj + +502 0 obj +<> +endobj + +503 0 obj +<>]/ID(node00000636)>> +endobj + +504 0 obj +<> +endobj + +505 0 obj +<>]/ID(node00000638)>> +endobj + +506 0 obj +<> +endobj + +507 0 obj +<>]/ID(node00000641)>> +endobj + +508 0 obj +<> +endobj + +509 0 obj +<>]/ID(node00000643)>> +endobj + +510 0 obj +<> +endobj + +511 0 obj +<>]/ID(node00000646)>> +endobj + +512 0 obj +<> +endobj + +513 0 obj +<>]/ID(node00000648)>> +endobj + +514 0 obj +<> +endobj + +515 0 obj +<>]/ID(node00000651)>> +endobj + +516 0 obj +<> +endobj + +517 0 obj +<>]/ID(node00000653)>> +endobj + +518 0 obj +<> +endobj + +519 0 obj +<>]/ID(node00000656)>> +endobj + +520 0 obj +<> +endobj + +521 0 obj +<>]/ID(node00000658)>> +endobj + +522 0 obj +<> +endobj + +523 0 obj +<>]/ID(node00000661)>> +endobj + +524 0 obj +<> +endobj + +525 0 obj +<>]/ID(node00000663)>> +endobj + +526 0 obj +<> +endobj + +527 0 obj +<>]/ID(node00000667)>> +endobj + +528 0 obj +<> +endobj + +529 0 obj +<>]/ID(node00000670)>> +endobj + +530 0 obj +<> +endobj + +531 0 obj +<>]/ID(node00000672)>> +endobj + +532 0 obj +<> +endobj + +533 0 obj +<>]/ID(node00000675)>> +endobj + +534 0 obj +<> +endobj + +535 0 obj +<>]/ID(node00000677)>> +endobj + +536 0 obj +<> +endobj + +537 0 obj +<>]/ID(node00000680)>> +endobj + +538 0 obj +<> +endobj + +539 0 obj +<>]/ID(node00000682)>> +endobj + +540 0 obj +<> +endobj + +541 0 obj +<>]/ID(node00000685)>> +endobj + +542 0 obj +<> +endobj + +543 0 obj +<>]/ID(node00000687)>> +endobj + +544 0 obj +<> +endobj + +545 0 obj +<>]/ID(node00000690)>> +endobj + +546 0 obj +<> +endobj + +547 0 obj +<>]/ID(node00000692)>> +endobj + +548 0 obj +<> +endobj + +549 0 obj +<>]/ID(node00000695)>> +endobj + +550 0 obj +<> +endobj + +551 0 obj +<>]/ID(node00000697)>> +endobj + +552 0 obj +<> +endobj + +553 0 obj +<>]/ID(node00000700)>> +endobj + +554 0 obj +<> +endobj + +555 0 obj +<>]/ID(node00000702)>> +endobj + +556 0 obj +<> +endobj + +557 0 obj +<>]/ID(node00000705)>> +endobj + +558 0 obj +<> +endobj + +559 0 obj +<>]/ID(node00000707)>> +endobj + +560 0 obj +<> +endobj + +561 0 obj +<>]/ID(node00000710)>> +endobj + +562 0 obj +<> +endobj + +563 0 obj +<>]/ID(node00000712)>> +endobj + +564 0 obj +<> +endobj + +565 0 obj +<>]/ID(node00000715)>> +endobj + +566 0 obj +<> +endobj + +567 0 obj +<>]/ID(node00000717)>> +endobj + +568 0 obj +<> +endobj + +569 0 obj +<>]/ID(node00000720)>> +endobj + +570 0 obj +<> +endobj + +571 0 obj +<>]/ID(node00000722)>> +endobj + +572 0 obj +<> +endobj + +573 0 obj +<>]/ID(node00000726)>> +endobj + +574 0 obj +<> +endobj + +575 0 obj +<>]/ID(node00000729)>> +endobj + +576 0 obj +<> +endobj + +577 0 obj +<>]/ID(node00000731)>> +endobj + +578 0 obj +<> +endobj + +579 0 obj +<>]/ID(node00000734)>> +endobj + +580 0 obj +<> +endobj + +581 0 obj +<>]/ID(node00000736)>> +endobj + +582 0 obj +<> +endobj + +583 0 obj +<>]/ID(node00000739)>> +endobj + +584 0 obj +<> +endobj + +585 0 obj +<>]/ID(node00000741)>> +endobj + +586 0 obj +<> +endobj + +587 0 obj +<>]/ID(node00000744)>> +endobj + +588 0 obj +<> +endobj + +589 0 obj +<>]/ID(node00000746)>> +endobj + +590 0 obj +<> +endobj + +591 0 obj +<>]/ID(node00000749)>> +endobj + +592 0 obj +<> +endobj + +593 0 obj +<>]/ID(node00000751)>> +endobj + +594 0 obj +<> +endobj + +595 0 obj +<>]/ID(node00000754)>> +endobj + +596 0 obj +<> +endobj + +597 0 obj +<>]/ID(node00000756)>> +endobj + +598 0 obj +<> +endobj + +599 0 obj +<>]/ID(node00000759)>> +endobj + +600 0 obj +<> +endobj + +601 0 obj +<>]/ID(node00000761)>> +endobj + +602 0 obj +<> +endobj + +603 0 obj +<>]/ID(node00000764)>> +endobj + +604 0 obj +<> +endobj + +605 0 obj +<>]/ID(node00000766)>> +endobj + +606 0 obj +<> +endobj + +607 0 obj +<>]/ID(node00000769)>> +endobj + +608 0 obj +<> +endobj + +609 0 obj +<>]/ID(node00000771)>> +endobj + +610 0 obj +<> +endobj + +611 0 obj +<>]/ID(node00000774)>> +endobj + +612 0 obj +<> +endobj + +613 0 obj +<>]/ID(node00000776)>> +endobj + +614 0 obj +<> +endobj + +615 0 obj +<>]/ID(node00000779)>> +endobj + +616 0 obj +<> +endobj + +617 0 obj +<>]/ID(node00000781)>> +endobj + +618 0 obj +<> +endobj + +619 0 obj +<>]/ID(node00000785)>> +endobj + +620 0 obj +<> +endobj + +621 0 obj +<>]/ID(node00000788)>> +endobj + +622 0 obj +<> +endobj + +623 0 obj +<>]/ID(node00000790)>> +endobj + +624 0 obj +<> +endobj + +625 0 obj +<>]/ID(node00000793)>> +endobj + +626 0 obj +<> +endobj + +627 0 obj +<>]/ID(node00000795)>> +endobj + +628 0 obj +<> +endobj + +629 0 obj +<>]/ID(node00000798)>> +endobj + +630 0 obj +<> +endobj + +631 0 obj +<>]/ID(node00000800)>> +endobj + +632 0 obj +<> +endobj + +633 0 obj +<>]/ID(node00000803)>> +endobj + +634 0 obj +<> +endobj + +635 0 obj +<>]/ID(node00000805)>> +endobj + +636 0 obj +<> +endobj + +637 0 obj +<>]/ID(node00000808)>> +endobj + +638 0 obj +<> +endobj + +639 0 obj +<>]/ID(node00000810)>> +endobj + +640 0 obj +<> +endobj + +641 0 obj +<>]/ID(node00000813)>> +endobj + +642 0 obj +<> +endobj + +643 0 obj +<>]/ID(node00000815)>> +endobj + +644 0 obj +<> +endobj + +645 0 obj +<>]/ID(node00000818)>> +endobj + +646 0 obj +<> +endobj + +647 0 obj +<>]/ID(node00000820)>> +endobj + +648 0 obj +<> +endobj + +649 0 obj +<>]/ID(node00000823)>> +endobj + +650 0 obj +<> +endobj + +651 0 obj +<>]/ID(node00000825)>> +endobj + +652 0 obj +<> +endobj + +653 0 obj +<>]/ID(node00000828)>> +endobj + +654 0 obj +<> +endobj + +655 0 obj +<>]/ID(node00000830)>> +endobj + +656 0 obj +<> +endobj + +657 0 obj +<>]/ID(node00000833)>> +endobj + +658 0 obj +<> +endobj + +659 0 obj +<>]/ID(node00000835)>> +endobj + +660 0 obj +<> +endobj + +661 0 obj +<>]/ID(node00000838)>> +endobj + +662 0 obj +<> +endobj + +663 0 obj +<>]/ID(node00000840)>> +endobj + +664 0 obj +<> +endobj + +665 0 obj +<>]/ID(node00000844)>> +endobj + +666 0 obj +<> +endobj + +667 0 obj +<>]/ID(node00000847)>> +endobj + +668 0 obj +<> +endobj + +669 0 obj +<>]/ID(node00000849)>> +endobj + +670 0 obj +<> +endobj + +671 0 obj +<>]/ID(node00000852)>> +endobj + +672 0 obj +<> +endobj + +673 0 obj +<>]/ID(node00000854)>> +endobj + +674 0 obj +<> +endobj + +675 0 obj +<>]/ID(node00000857)>> +endobj + +676 0 obj +<> +endobj + +677 0 obj +<>]/ID(node00000859)>> +endobj + +678 0 obj +<> +endobj + +679 0 obj +<>]/ID(node00000862)>> +endobj + +680 0 obj +<> +endobj + +681 0 obj +<>]/ID(node00000864)>> +endobj + +682 0 obj +<> +endobj + +683 0 obj +<>]/ID(node00000867)>> +endobj + +684 0 obj +<> +endobj + +685 0 obj +<>]/ID(node00000869)>> +endobj + +686 0 obj +<> +endobj + +687 0 obj +<>]/ID(node00000872)>> +endobj + +688 0 obj +<> +endobj + +689 0 obj +<>]/ID(node00000874)>> +endobj + +690 0 obj +<> +endobj + +691 0 obj +<>]/ID(node00000877)>> +endobj + +692 0 obj +<> +endobj + +693 0 obj +<>]/ID(node00000879)>> +endobj + +694 0 obj +<> +endobj + +695 0 obj +<>]/ID(node00000882)>> +endobj + +696 0 obj +<> +endobj + +697 0 obj +<>]/ID(node00000884)>> +endobj + +698 0 obj +<> +endobj + +699 0 obj +<>]/ID(node00000887)>> +endobj + +700 0 obj +<> +endobj + +701 0 obj +<>]/ID(node00000889)>> +endobj + +702 0 obj +<> +endobj + +703 0 obj +<>]/ID(node00000892)>> +endobj + +704 0 obj +<> +endobj + +705 0 obj +<>]/ID(node00000894)>> +endobj + +706 0 obj +<> +endobj + +707 0 obj +<>]/ID(node00000897)>> +endobj + +708 0 obj +<> +endobj + +709 0 obj +<>]/ID(node00000899)>> +endobj + +710 0 obj +<> +endobj + +711 0 obj +<>]/ID(node00000904)>> +endobj + +712 0 obj +<> +endobj + +713 0 obj +<>]/ID(node00000908)>> +endobj + +714 0 obj +<> +endobj + +715 0 obj +<>]/ID(node00000911)>> +endobj + +716 0 obj +<> +endobj + +717 0 obj +<>]/ID(node00000914)>> +endobj + +718 0 obj +<> +endobj + +719 0 obj +<>]/ID(node00000916)>> +endobj + +720 0 obj +<> +endobj + +721 0 obj +<>]/ID(node00000919)>> +endobj + +722 0 obj +<> +endobj + +723 0 obj +<>]/ID(node00000921)>> +endobj + +724 0 obj +<> +endobj + +725 0 obj +<>]/ID(node00000924)>> +endobj + +726 0 obj +<> +endobj + +727 0 obj +<>]/ID(node00000926)>> +endobj + +728 0 obj +<> +endobj + +729 0 obj +<>]/ID(node00000929)>> +endobj + +730 0 obj +<> +endobj + +731 0 obj +<>]/ID(node00000931)>> +endobj + +732 0 obj +<> +endobj + +733 0 obj +<>]/ID(node00000934)>> +endobj + +734 0 obj +<> +endobj + +735 0 obj +<>]/ID(node00000936)>> +endobj + +736 0 obj +<> +endobj + +737 0 obj +<>]/ID(node00000939)>> +endobj + +738 0 obj +<> +endobj + +739 0 obj +<>]/ID(node00000941)>> +endobj + +740 0 obj +<> +endobj + +741 0 obj +<>]/ID(node00000944)>> +endobj + +742 0 obj +<> +endobj + +743 0 obj +<>]/ID(node00000946)>> +endobj + +744 0 obj +<> +endobj + +745 0 obj +<>]/ID(node00000949)>> +endobj + +746 0 obj +<> +endobj + +747 0 obj +<>]/ID(node00000951)>> +endobj + +748 0 obj +<> +endobj + +749 0 obj +<>]/ID(node00000954)>> +endobj + +750 0 obj +<> +endobj + +751 0 obj +<>]/ID(node00000956)>> +endobj + +752 0 obj +<> +endobj + +753 0 obj +<>]/ID(node00000959)>> +endobj + +754 0 obj +<> +endobj + +755 0 obj +<>]/ID(node00000961)>> +endobj + +756 0 obj +<> +endobj + +757 0 obj +<>]/ID(node00000964)>> +endobj + +758 0 obj +<> +endobj + +759 0 obj +<>]/ID(node00000966)>> +endobj + +760 0 obj +<> +endobj + +761 0 obj +<>]/ID(node00000969)>> +endobj + +762 0 obj +<> +endobj + +763 0 obj +<>]/ID(node00000971)>> +endobj + +764 0 obj +<> +endobj + +765 0 obj +<>]/ID(node00000974)>> +endobj + +766 0 obj +<> +endobj + +767 0 obj +<>]/ID(node00000976)>> +endobj + +768 0 obj +<> +endobj + +769 0 obj +<>]/ID(node00000979)>> +endobj + +770 0 obj +<> +endobj + +771 0 obj +<>]/ID(node00000981)>> +endobj + +772 0 obj +<> +endobj + +773 0 obj +<>]/ID(node00000984)>> +endobj + +774 0 obj +<> +endobj + +775 0 obj +<>]/ID(node00000986)>> +endobj + +776 0 obj +<> +endobj + +777 0 obj +<>]/ID(node00000989)>> +endobj + +778 0 obj +<> +endobj + +779 0 obj +<>]/ID(node00000991)>> +endobj + +780 0 obj +<> +endobj + +781 0 obj +<>]/ID(node00000994)>> +endobj + +782 0 obj +<> +endobj + +783 0 obj +<>]/ID(node00000996)>> +endobj + +784 0 obj +<> +endobj + +785 0 obj +<><>]/ID(node00000999)>> +endobj + +786 0 obj +<> +endobj + +787 0 obj +<>]/ID(node00001001)>> +endobj + +788 0 obj +<> +endobj + +789 0 obj +<>]/ID(node00001004)>> +endobj + +790 0 obj +<> +endobj + +791 0 obj +<>]/ID(node00001006)>> +endobj + +792 0 obj +<> +endobj + +793 0 obj +<>]/ID(node00001009)>> +endobj + +794 0 obj +<> +endobj + +795 0 obj +<>]/ID(node00001011)>> +endobj + +796 0 obj +<> +endobj + +797 0 obj +<>]/ID(node00001014)>> +endobj + +798 0 obj +<> +endobj + +799 0 obj +<>]/ID(node00001016)>> +endobj + +800 0 obj +<> +endobj + +801 0 obj +<>]/ID(node00001022)>> +endobj + +802 0 obj +<> +endobj + +803 0 obj +<>]/ID(node00001025)>> +endobj + +804 0 obj +<> +endobj + +805 0 obj +<>]/ID(node00001027)>> +endobj + +806 0 obj +<> +endobj + +807 0 obj +<>]/ID(node00001031)>> +endobj + +808 0 obj +<> +endobj + +809 0 obj +<>]/ID(node00001034)>> +endobj + +810 0 obj +<> +endobj + +811 0 obj +<>]/ID(node00001036)>> +endobj + +812 0 obj +<> +endobj + +813 0 obj +<>]/ID(node00001039)>> +endobj + +814 0 obj +<> +endobj + +815 0 obj +<>]/ID(node00001041)>> +endobj + +816 0 obj +<> +endobj + +817 0 obj +<>]/ID(node00001044)>> +endobj + +818 0 obj +<> +endobj + +819 0 obj +<>]/ID(node00001046)>> +endobj + +820 0 obj +<> +endobj + +821 0 obj +<>]/ID(node00001050)>> +endobj + +822 0 obj +<> +endobj + +823 0 obj +<>]/ID(node00001053)>> +endobj + +824 0 obj +<> +endobj + +825 0 obj +<>]/ID(node00001055)>> +endobj + +826 0 obj +<> +endobj + +827 0 obj +<>]/ID(node00001059)>> +endobj + +828 0 obj +<> +endobj + +829 0 obj +<>]/ID(node00001061)>> +endobj + +830 0 obj +<> +endobj + +831 0 obj +<>]/ID(node00001064)>> +endobj + +832 0 obj +<> +endobj + +833 0 obj +<>]/ID(node00001066)>> +endobj + +834 0 obj +<> +endobj + +835 0 obj +<>]/ID(node00001069)>> +endobj + +836 0 obj +<> +endobj + +837 0 obj +<>]/ID(node00001071)>> +endobj + +838 0 obj +<> +endobj + +839 0 obj +<>]/ID(node00001074)>> +endobj + +840 0 obj +<> +endobj + +841 0 obj +<>]/ID(node00001076)>> +endobj + +842 0 obj +<> +endobj + +843 0 obj +<>]/ID(node00001079)>> +endobj + +844 0 obj +<> +endobj + +845 0 obj +<>]/ID(node00001081)>> +endobj + +846 0 obj +<> +endobj + +847 0 obj +<>]/ID(node00001085)>> +endobj + +848 0 obj +<> +endobj + +849 0 obj +<>]/ID(node00001087)>> +endobj + +850 0 obj +<> +endobj + +851 0 obj +<>]/ID(node00001090)>> +endobj + +852 0 obj +<> +endobj + +853 0 obj +<>]/ID(node00001092)>> +endobj + +854 0 obj +<> +endobj + +855 0 obj +<>]/ID(node00001096)>> +endobj + +856 0 obj +<> +endobj + +857 0 obj +<>]/ID(node00001098)>> +endobj + +858 0 obj +<> +endobj + +859 0 obj +<>]/ID(node00001101)>> +endobj + +860 0 obj +<> +endobj + +861 0 obj +<>]/ID(node00001103)>> +endobj + +862 0 obj +<> +endobj + +863 0 obj +<>]/ID(node00001106)>> +endobj + +864 0 obj +<> +endobj + +865 0 obj +<>]/ID(node00001108)>> +endobj + +866 0 obj +<> +endobj + +867 0 obj +<>]/ID(node00001111)>> +endobj + +868 0 obj +<> +endobj + +869 0 obj +<>]/ID(node00001113)>> +endobj + +870 0 obj +<> +endobj + +871 0 obj +<>]/ID(node00001117)>> +endobj + +872 0 obj +<> +endobj + +873 0 obj +<>]/ID(node00001120)>> +endobj + +874 0 obj +<> +endobj + +875 0 obj +<>]/ID(node00001122)>> +endobj + +876 0 obj +<> +endobj + +877 0 obj +<>]/ID(node00001126)>> +endobj + +878 0 obj +<> +endobj + +879 0 obj +<>]/ID(node00001130)>> +endobj + +880 0 obj +<> +endobj + +881 0 obj +<>]/ID(node00001133)>> +endobj + +882 0 obj +<> +endobj + +883 0 obj +<>]/ID(node00001135)>> +endobj + +884 0 obj +<> +endobj + +885 0 obj +<>]/ID(node00001139)>> +endobj + +886 0 obj +<> +endobj + +887 0 obj +<>]/ID(node00001142)>> +endobj + +888 0 obj +<> +endobj + +889 0 obj +<>]/ID(node00001144)>> +endobj + +890 0 obj +<> +endobj + +891 0 obj +<>]/ID(node00001148)>> +endobj + +892 0 obj +<> +endobj + +893 0 obj +<>]/ID(node00001151)>> +endobj + +894 0 obj +<> +endobj + +895 0 obj +<>]/ID(node00001153)>> +endobj + +896 0 obj +<> +endobj + +897 0 obj +<>]/ID(node00001156)>> +endobj + +898 0 obj +<> +endobj + +899 0 obj +<>]/ID(node00001158)>> +endobj + +900 0 obj +<> +endobj + +901 0 obj +<>]/ID(node00001162)>> +endobj + +902 0 obj +<> +endobj + +903 0 obj +<>]/ID(node00001165)>> +endobj + +904 0 obj +<> +endobj + +905 0 obj +<>]/ID(node00001167)>> +endobj + +906 0 obj +<> +endobj + +907 0 obj +<>]/ID(node00001171)>> +endobj + +908 0 obj +<> +endobj + +909 0 obj +<>]/ID(node00001174)>> +endobj + +910 0 obj +<> +endobj + +911 0 obj +<>]/ID(node00001176)>> +endobj + +912 0 obj +<> +endobj + +913 0 obj +<>]/ID(node00001179)>> +endobj + +914 0 obj +<> +endobj + +915 0 obj +<>]/ID(node00001181)>> +endobj + +916 0 obj +<> +endobj + +917 0 obj +<>]/ID(node00001184)>> +endobj + +918 0 obj +<> +endobj + +919 0 obj +<>]/ID(node00001186)>> +endobj + +920 0 obj +<> +endobj + +921 0 obj +<>]/ID(node00001189)>> +endobj + +922 0 obj +<> +endobj + +923 0 obj +<>]/ID(node00001191)>> +endobj + +924 0 obj +<> +endobj + +925 0 obj +<>]/ID(node00001194)>> +endobj + +926 0 obj +<> +endobj + +927 0 obj +<>]/ID(node00001196)>> +endobj + +928 0 obj +<> +endobj + +929 0 obj +<>]/ID(node00001199)>> +endobj + +930 0 obj +<> +endobj + +931 0 obj +<>]/ID(node00001201)>> +endobj + +932 0 obj +<> +endobj + +933 0 obj +<>]/ID(node00001204)>> +endobj + +934 0 obj +<> +endobj + +935 0 obj +<>]/ID(node00001206)>> +endobj + +936 0 obj +<> +endobj + +937 0 obj +<>]/ID(node00001209)>> +endobj + +938 0 obj +<> +endobj + +939 0 obj +<>]/ID(node00001211)>> +endobj + +940 0 obj +<> +endobj + +941 0 obj +<>]/ID(node00001214)>> +endobj + +942 0 obj +<> +endobj + +943 0 obj +<>]/ID(node00001216)>> +endobj + +944 0 obj +<> +endobj + +945 0 obj +<>]/ID(node00001219)>> +endobj + +946 0 obj +<> +endobj + +947 0 obj +<>]/ID(node00001221)>> +endobj + +948 0 obj +<> +endobj + +949 0 obj +<>]/ID(node00001225)>> +endobj + +950 0 obj +<> +endobj + +951 0 obj +<>]/ID(node00001227)>> +endobj + +952 0 obj +<> +endobj + +953 0 obj +<>]/ID(node00001230)>> +endobj + +954 0 obj +<> +endobj + +955 0 obj +<>]/ID(node00001232)>> +endobj + +956 0 obj +<> +endobj + +957 0 obj +<>]/ID(node00001235)>> +endobj + +958 0 obj +<> +endobj + +959 0 obj +<>]/ID(node00001237)>> +endobj + +960 0 obj +<> +endobj + +961 0 obj +<><>]/ID(node00001240)>> +endobj + +962 0 obj +<> +endobj + +963 0 obj +<>]/ID(node00001242)>> +endobj + +964 0 obj +<> +endobj + +965 0 obj +<>]/ID(node00001246)>> +endobj + +966 0 obj +<> +endobj + +967 0 obj +<>]/ID(node00001249)>> +endobj + +968 0 obj +<> +endobj + +969 0 obj +<>]/ID(node00001251)>> +endobj + +970 0 obj +<> +endobj + +971 0 obj +<>]/ID(node00001255)>> +endobj + +972 0 obj +<> +endobj + +973 0 obj +<>]/ID(node00001258)>> +endobj + +974 0 obj +<> +endobj + +975 0 obj +<>]/ID(node00001260)>> +endobj + +976 0 obj +<> +endobj + +977 0 obj +<>]/ID(node00001263)>> +endobj + +978 0 obj +<> +endobj + +979 0 obj +<>]/ID(node00001265)>> +endobj + +980 0 obj +<> +endobj + +981 0 obj +<><>]/ID(node00001268)>> +endobj + +982 0 obj +<> +endobj + +983 0 obj +<>]/ID(node00001270)>> +endobj + +984 0 obj +<> +endobj + +985 0 obj +<><>]/ID(node00001273)>> +endobj + +986 0 obj +<> +endobj + +987 0 obj +<>]/ID(node00001275)>> +endobj + +988 0 obj +<> +endobj + +989 0 obj +<><>]/ID(node00001278)>> +endobj + +990 0 obj +<> +endobj + +991 0 obj +<>]/ID(node00001280)>> +endobj + +992 0 obj +<> +endobj + +993 0 obj +<>]/ID(node00001284)>> +endobj + +994 0 obj +[21 0 R 21 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R] +endobj + +995 0 obj +[51 0 R 53 0 R 55 0 R 55 0 R 57 0 R 59 0 R 59 0 R 61 0 R 63 0 R 65 0 R 67 0 R 69 0 R 71 0 R 73 0 R 75 0 R 77 0 R 79 0 R 81 0 R 83 0 R 85 0 R 87 0 R 89 0 R 91 0 R 93 0 R 95 0 R 97 0 R 99 0 R 101 0 R 103 0 R 105 0 R 107 0 R 109 0 R 111 0 R 113 0 R 115 0 R 117 0 R 119 0 R 121 0 R 123 0 R 125 0 R 127 0 R 129 0 R 131 0 R 133 0 R 135 0 R 137 0 R 139 0 R 141 0 R 143 0 R 145 0 R 147 0 R 149 0 R 151 0 R 153 0 R 155 0 R 157 0 R 159 0 R 161 0 R 163 0 R 165 0 R 167 0 R 169 0 R 171 0 R 173 0 R 175 0 R 177 0 R 179 0 R 181 0 R] +endobj + +996 0 obj +[183 0 R 188 0 R 190 0 R 192 0 R 194 0 R 197 0 R 200 0 R 202 0 R 204 0 R 206 0 R 208 0 R 211 0 R 213 0 R 215 0 R 217 0 R 219 0 R 221 0 R 223 0 R 225 0 R 227 0 R 229 0 R 231 0 R 233 0 R 235 0 R 237 0 R 239 0 R 241 0 R 241 0 R 243 0 R 245 0 R 247 0 R 249 0 R 251 0 R 253 0 R 255 0 R 257 0 R 259 0 R 261 0 R 263 0 R 265 0 R 267 0 R 269 0 R 271 0 R 273 0 R 275 0 R 277 0 R 279 0 R 281 0 R 283 0 R 285 0 R 287 0 R 289 0 R 291 0 R 293 0 R 295 0 R 297 0 R 299 0 R 301 0 R 303 0 R 305 0 R 307 0 R 309 0 R 311 0 R 313 0 R 315 0 R 317 0 R 319 0 R 321 0 R 323 0 R 325 0 R 327 0 R 329 0 R 331 0 R 333 0 R] +endobj + +997 0 obj +[335 0 R 337 0 R 339 0 R 341 0 R 343 0 R 345 0 R 347 0 R 349 0 R 351 0 R 353 0 R 355 0 R 357 0 R 359 0 R 361 0 R 363 0 R 365 0 R 367 0 R 369 0 R 371 0 R 373 0 R 375 0 R 377 0 R 379 0 R 381 0 R 383 0 R 385 0 R 387 0 R 389 0 R 391 0 R 393 0 R 395 0 R 397 0 R 399 0 R 401 0 R 403 0 R 405 0 R 407 0 R 409 0 R 411 0 R 413 0 R 415 0 R 417 0 R 419 0 R 421 0 R 423 0 R 425 0 R 427 0 R 429 0 R 431 0 R 433 0 R 435 0 R 437 0 R 439 0 R 441 0 R 443 0 R 445 0 R 447 0 R 449 0 R 451 0 R 453 0 R 455 0 R 457 0 R 459 0 R 461 0 R 463 0 R 465 0 R 467 0 R 469 0 R 471 0 R] +endobj + +998 0 obj +[473 0 R 475 0 R 477 0 R 479 0 R 481 0 R 483 0 R 485 0 R 487 0 R 489 0 R 491 0 R 493 0 R 495 0 R 497 0 R 499 0 R 501 0 R 503 0 R 505 0 R 507 0 R 509 0 R 511 0 R 513 0 R 515 0 R 517 0 R 519 0 R 521 0 R 523 0 R 525 0 R 527 0 R 529 0 R 531 0 R 533 0 R 535 0 R 537 0 R 539 0 R 541 0 R 543 0 R 545 0 R 547 0 R 549 0 R 551 0 R 553 0 R 555 0 R 557 0 R 559 0 R 561 0 R 563 0 R 565 0 R 567 0 R 569 0 R 571 0 R 573 0 R 575 0 R 577 0 R 579 0 R 581 0 R 583 0 R 585 0 R 587 0 R 589 0 R 591 0 R 593 0 R 595 0 R 597 0 R 599 0 R 601 0 R 603 0 R 605 0 R 607 0 R 609 0 R] +endobj + +999 0 obj +[611 0 R 613 0 R 615 0 R 617 0 R 619 0 R 621 0 R 623 0 R 625 0 R 627 0 R 629 0 R 631 0 R 633 0 R 635 0 R 637 0 R 639 0 R 641 0 R 643 0 R 645 0 R 647 0 R 649 0 R 651 0 R 653 0 R 655 0 R 657 0 R 659 0 R 661 0 R 663 0 R 665 0 R 667 0 R 669 0 R 671 0 R 673 0 R 675 0 R 677 0 R 679 0 R 681 0 R 683 0 R 685 0 R 687 0 R 689 0 R 691 0 R 693 0 R 695 0 R 697 0 R 699 0 R 701 0 R 703 0 R 705 0 R 707 0 R 709 0 R] +endobj + +1000 0 obj +[711 0 R 713 0 R 715 0 R 717 0 R 719 0 R 721 0 R 723 0 R 725 0 R 727 0 R 729 0 R 731 0 R 733 0 R 735 0 R 737 0 R 739 0 R 741 0 R 743 0 R 745 0 R 747 0 R 749 0 R 751 0 R 753 0 R 755 0 R 757 0 R 759 0 R 761 0 R 763 0 R 765 0 R 767 0 R 769 0 R 771 0 R 773 0 R 775 0 R 777 0 R 779 0 R 781 0 R 783 0 R 785 0 R 785 0 R 787 0 R 789 0 R 791 0 R 793 0 R 795 0 R 797 0 R 799 0 R 801 0 R 803 0 R 805 0 R 807 0 R 809 0 R 811 0 R 813 0 R 815 0 R 817 0 R 819 0 R 821 0 R 823 0 R 825 0 R 827 0 R 829 0 R 831 0 R 833 0 R 835 0 R 837 0 R 839 0 R 841 0 R] +endobj + +1001 0 obj +[843 0 R 845 0 R 847 0 R 849 0 R 851 0 R 853 0 R 855 0 R 857 0 R 859 0 R 861 0 R 863 0 R 865 0 R 867 0 R 869 0 R 871 0 R 873 0 R 875 0 R 877 0 R 879 0 R 881 0 R 883 0 R 885 0 R 887 0 R 889 0 R 891 0 R 893 0 R 895 0 R 897 0 R 899 0 R 901 0 R 903 0 R 905 0 R 907 0 R 909 0 R 911 0 R 913 0 R 915 0 R 917 0 R 919 0 R 921 0 R 923 0 R 925 0 R 927 0 R 929 0 R 931 0 R 933 0 R 935 0 R 937 0 R 939 0 R 941 0 R 943 0 R 945 0 R 947 0 R 949 0 R 951 0 R 953 0 R 955 0 R 957 0 R 959 0 R 961 0 R 961 0 R 963 0 R] +endobj + +1002 0 obj +[965 0 R 967 0 R 969 0 R 971 0 R 973 0 R 975 0 R 977 0 R 979 0 R 981 0 R 981 0 R 983 0 R 985 0 R 985 0 R 987 0 R 989 0 R 989 0 R 991 0 R 993 0 R] +endobj + +1003 0 obj +<> +endobj + +1004 0 obj +<> +endobj + +1005 0 obj +<> +endobj + +1006 0 obj +<>/StructTreeRoot 18 0 R/ViewerPreferences<>/Lang(en-US)>> +endobj + +1007 0 obj +<> +stream +x E?~zf{_=G{wgwgvffwll6K2I(|]PQh@ШI_UquQAP߭MsNuOUwo:uΩY@ # ґl~Sc(]wϞyܧm܆?c'W`mM[v>wy 4y6P)~w + jOo^eײg=߼ar~hݼyäi%h$6oٱwXjjݤl=Lf{{ :ev5;ȭ umWok` a0`5l+ `$r3`>Nz!O@XG(2f˰VA4Z(0 0` &2Myo +j ݰ &` 0K,\Bf9lc`u:h[ 8pWmGR+a=ڡpAsE0zfU 2a4A pI X;`=4}[0]j0`l `ܽμ !8gGN!0" L!֎B"^:w"F DvEVY` $dB ߁oܧEvn&Ed֞@Ȧ #zk#&GD=homddx}a4,髍,\쭍 @gGg3Q Hu0*lmeq#+:\|%etk99B%eۭed1q;=xá#e=솞L2303_5;hގk3ՀEKG@d8SsHߤo=:`?6xyw vUs!4v_0 +5 ywP r8 Mk +P].F{Ci2u>ɼWK_Gf^UN\?ww{Ѿ!P#\/<) <~_MzވÀqm#ˆ^|ђŋ._9wNG{[kK&LcȒSkZ?>(֖-`4ʩ2֖I偝kG |owPBoWhrM|è '8'}lIO/  3zͺʶ2ke\Fyۍ|Q.]q\5^f&'2(+rm\yoC}r}5/^6T&qe(__3Yͱ%嗁&TF3Pf{6ھhr"\P-|6gLZZrlD%gJfo_Ү_[۹[P_̿dْe&uqrx__b_.NVp.\[Fk/0 me-S`A಑qme kU*g(_F}i]Ǡ@~px0A({Lv1e490A{).kReIꙋi$g3A{lIeK2YfrVH{G\z,2E w0VuX +Ty&yue9*U cJUu>1Ţ5)bFْ8;hf^e2F84NF6wH|%foWd*eճ2]>^f0F=T㋩7Spn|pmpq]P9||COYn]ɷ|6SFn@?V"JV YiGNai>HNýp79 s8L‡cp!|%?}L?#?OSfG~g?A$x>Ie>< g||eyx;ϒqx/)x>ONfEЃUENC +2#7 ,@aED1$,D),B Xpj%Gb4h 9F,Cȣ0.&r|F +0@25!Gam"%rXO*<%| +V䓰|֢aBKA/A>ѻ`zlD$M،>J^=@+ЃCp%,9 [r*%؆B$y?\Iנ`.9עS佰CgȻa)G?'wn䝰7;`/yJn}h1&Fl#[1OMX"mEn `yr܊cpN #7샷<m-pK;q=d n\Ku^M6ÿfM6^>?F6'd=| +CR4~LgZx?NCKd5WI '*,&Yo(#q<1'd<FFq+_ "YO?eEg2_d1 Y +_fXr1|EUF"K8"%$ kL י8|3NMMM(Ra^L,` c͒Yb8l6elg9Xr<ݞjf5Y>ju%e9gS,8begqv +v;pUXJ/g- x XȂ 8x .9<,D;o8Mdb3X8L,gĂSApa;x@Sa*;ϳr*Xs c Dr@ +ix,Up+NYaSST $SV< T%:D]Yp(]Et: ;He bNƋdEUITT)@EE\)9$%D-I$8BUU5 ;gPX9,L[I* +BU9"z\ $o QrJ  |=@r\@X<2˳iL,~j8Q|*.WjU,ʲ*2&8KlA&AERfg,q\.UWdM$*dU; ETdRBQAX\X /prBzh YTš((WQU!:z H4'gA@Ω̒iC!]sUEwe] x.UJQ%UU=@SU٣(,Xx<OHPu7= 8Q%Dxܺץ=VC^Kx"WR]%\vp*oNYr)>U_7y<^o2Tap985K, x +:_h.QX!i3X(|xRG9]f/ZG}xUtUD]&t]EE]T#wEPNNϒY$>oͧG!/^?jUv+ntgveUuz ( S(+Y` }A;th~= +XY,tV9L>|ǭo +#\c ~A4,%z ǂ~#&y#x" @(@Z/ \R: ]n-Kc Dm>ݣUCqdVdHCR5DCx2 F`!9 +n' }'m]dRrAĩ,&FR5r(f␈ĪU1 "JΈFψd1tkNoF(ՂCLtI,6=Neڌ+R-7&!f Yʈ1_,@Uq_6FxQ]]}}oTYz!-{Pj̒LSm*ۤS 4kMP_*YIksҵ55h8lMbr|~ `s0Q, "elOeB3r%Gw槟/Uٝt-N?O@:VE geT^#cYoK =9ڎE D1 Kփ=Fτ-٢=6ϰX -,.X!WN G`kx {7&0=UR;$z4P*ɧNḾQi{t@ud^>oʭ.45[,s>գ>>wK}xz+:9aY6GѾ)OM4[<2ED6d , s=H@€ fQ6[fW>ޔQacN)*F^n|\1$8ybM5qBT~KTSUY…mnustakoxw*Lzxޓ Snz _xhU/<<u67| Ka 0`8MncQf1%1" ( qa@wwڑ}T:AELT:?S:A娋i+(qED@ͽPxQ'dbu)P1_F#kC1O<qƧxO6SV~A*Lt^*'K )9"FhŴPUSGoùΐ7| H;3|2ME Wΰ6nm ?>{;iR{}M;é1k1rH5YoJ[훠j/?]{M?u"ϔrX#zoc)Z"A53o+c@g{3/zj"szܵKEpi71'ؘnk]&vk$=]+sUߵwP˂ڋ4ؼ(i  3.pLZyVFg + J0HgA#j"6pV tOJ%s|)D\JED[6ԝ݋{Yw% vuO}[꯺v:@V#vXW(Y[aQ& +CGɱ!ZX0m )l[LR;S23SSSyKM$Ż EP /^L-WyMmoYG׿r^ܲ+8l{ 0$ɋXǏ +Y-$kuEw6IM5M 9rj6$-†)9SW:NX6-ZSiSD(ǦJi #:1w!"5a_#j篜]ٵ]|l#V݈8"\@7jmGsfy_=em(2@Jhd?"?nVlI!N䈼Ff8V =6SԜ(t1mі.2T[_|{迌 uiߕ>(U4yD P1{W'uE@+Fz2\{R$bm౦7X BTSTJV{eƸxfY+ ifu4g*(ux`\F;G獵 +o*МM`1nx܆g;ؗGsC|mL,j[{or'z; >$z]Ӛ i'9(îK|$&pʺ`lxj Q+mf8mwe0[Z[[TLddN(Š'@ֆ r^P篚 ̙],c@aItgR['y{c(WCoc 2: $R˱@@FTЃCņf䎸1qX#s M-;b.䓙|F>5vtdK~)ԥP(An 9:jFK_^(\?&;ކ ˞Tcƨ5wٚE>{!= !ol^ry9>3ר("@b]\ZdDd&Q؊"u|aqbX@EcXka5ţ X:nMUu#uֺFhMCMӥ3S|>{ =CRt)S!.)OQaIRiyQ4id1sWU0N7y(uEW}o~dn4Z,͝2R[ _hucM}Cر{pU\ƚ;t򾺈jE5ZY҅YwumZX?4wyi[ͩ嚫^]n_Rs͢'BNFFpA^܍05"Q&& H$KhB.u2N$9#Npfw;ɉ,,rsj[ѰQ".0EC&b'NB\݅ե,d$Nx+Y}{-?.?|ϖ'R֔6tTDljaƃD-42Cށ=VOဖXJ-Il'?8O|qJ}_"'MjaQ>> : +mr} )ZϲN4s4H ;"Ζ:cK%y:3L~)g4^W T<]=l,j>/wuSUC C={xV ^dإ5v։?l|+ZlEm`\Ӛ.Y[>ɋx>qh-E &%{>!*cE)|&[dwFΩxNz'n]% mMzvIkpf'>@)TT[eygn3 mfPH? 8)#Av}EjYw6^Z+ ĿBڵۯVI޻n[kuܾlC2^ +c<[@\|.&%a; '.u0"EAc>H>{w:%ϼ3_GR|[Te#`błY?obFX̱,sAl>CȮ.чr|yPз /#7韘}k}W15}dw%$b'N% +#pDjG+lF  +-`ΟoXyKZWlZڑ< +#Qn/cTDbA`erpns2v[a`ւ,d0GA75LЧ3g5آJ\)(Qӯ>l(5|d'¯.Vu c+Su +fftyx/@G6 pAA~@hʵF-5Ң8c]WC5U,y~ +0e3Y/۟ҲjoYھfo?=es cBad;8q偉W 4#zc{Rq26pshۊ>_]QAz\Bի.2nQez?冽W?s7cPcq? }Wܦ,P\wnT~F M^o9y@& ׬)L:S(pnN}ȕ.:\ҬK.O^u•~¥@\j{o)d~&XQ,=})ږT!6;"EזEYXXkw*3;甔R WLQ%jWFf(7sB]D.3ŋc}D &5oqQGXYy˱#.j ='bb+YnP82|XHu;0}Jěp gÃ6>w)G%$[>roflEtJJQw}K}>vyU`:P*duprhC)(UYxy+ v,8R]azhzuܤ<}tzxƅ5>Y\tDCV7 77r˂Dqk{-+,g`aX; XTYAY=8)XL}ΟYЯVɣPU"âpd>@,"qFA"HA1O k(F_pӍk܌FnĿ|>^рjut\^uԧt$ZؘL*(@B '"AUT}BB%D$) 2 /PHBV߉Fj |@t/UIS%QRzxHJTjDFp9">+5qsE]/q9Au~[]*. gK۽ϖ +m9n?כL.͗9m>-m~naSxqdg?_xalY$D5f|E[]}pY/ڏݷWi֍5G|'m~8$Yba5 Z>D-0qל<_:q9e-gL4 +ω&+} Gե9J\iDBwoOck۾{{3 q2Mؑd+ST-0\ѐk(60 ОMb( սB}hf4kSt_=c('9?ѹ]!w{>I=!ɠ #Fk(j;R.gbj< 5M+Rk{rŔbFeV0@^Y x B;#ǰ0 {vGxDfs+BoeBJrVvLx[i{D!+9q~`nGvi_1';afi+'ӯ +*K Et +!=Ś./c9M{1"H=a]scxUTrfVs`jH/ D#z>3ޒ@__AldžxXֻb^-șECy .-nN"af>VqF ˏƌ9fQoʩ ).UW=DYi;5O br45w 84:#MCH_`$;mgM-]4r/xEABJ +F?S]Ph$!nOT>FiQ1o:+t X.C1 +T\(=%WWĢt\ZDъtx* IVBlCf`en[1~кXԧ9jڃ .돢H fಁm7;#VIƕJ0骮N~@(!HdD2VxyT ;ʀbMU\J' %@9F3!*Es+pHG]p +w.魸n.>~6"zuTvcN9#ƞ>VDV<3PS% tit~*ᭊ\ZaF*U_wB}.tbF9hM5[݁{ x*^Qnw ;KґY]b-kGpevG `hkcCۀ*TPj|Bmj@euG d^?[x#`'kF_i`@@!NJnmay[X:Чw< 2J:$$-Żjlv ^l1j|> e4Ӑ!I&fo%,pQ}V" 5?4+ؑ]y6ۭ/6:}v Ppxi6 t_c ^!1:+ΈW~֧Ň[6ty;t y ʼ EszM+pHQ v6! +{g'rFEivygC6ȟý޳_ 2!4>zP- 4p`n߰RRKi̥am EQkSA)LizեJf W7]UPHWhSA \P1Ω ZQQcVn i9t=Ύcp%([tD1nM"S+~{'HhvJ5 :tUUq\b\ED1 ϘBcVJ33M~l*Dߚsk;j+ 6umZXSpSW]Kv5 ;[ #܅~ƌyHY~L +o6^RV&txWxΊH쬈OdwgpbzFmr^nCPv={11"#V۩sͩ(a%bjڶ1tؑ3#mXXCu'{f>P YT]СڀS쎙!17ͳxDQ`ʗݤF4fK#9A`eEce)i"zn/yHUe +qH0Rˆ 9kMÚ?V3\YS//5gXؓ[H'ڻ]x*OJGEU::/ddA_bJPj3'f\uր;?*aN|kc ֵq?/5`S#ަbRK ]!{Ԁ [SV(Nɮkыߣ{'A9Ew!pÃ=ln}) @Y=sT6s_VfC<{ ʹwX<XheEuUan[,{Dg8?9I,'㥕{jƆE]ud hMI$$I::oԐMCڀ5 o%[:$I?b}gMI: 16oI?0HI᫳~N}WKv|i;}'G~M섊97"tۡ5d\ytJNs{vg2_5.yߒ}%+WM$#V^2[2#'! xP2򈈳#Cq .2vʨX()y"եHE"V82g^[-[ &`Ê R!`CI7o'؀-0g5< +*$B^ hXP 1Ra֏8%< T^Y%ݪVs{љ/% JflkhfedmՠBe3c.ft1m4> +endobj + +1009 0 obj +<>/W[0[500 0 0 240]9[705 0 356 356]15[246 340 246 437]29[246]34[455 974 721 672 648 737 606 574 702 734 316 529 684 563 897 756 790 644 0 667 582 614 707 722 948 0 661]68[553 604 500 604 584 422 594 589 289 0 579 316 862 589 607 604 604 422 485 444 589 550 784 554 547 500]262[708 0 736 1127]]/DW 568>> +endobj + +1010 0 obj +<> +stream +x]ϊ0yCIVZ+x?dtk 1=3Ų{H7c&5?zcYsmTxjhEu)PndYƹL|sc [&޽ol72Qߝl91Q6 ,Ul0a݊5;1rDnԨarX&9ʲ,sV{Ow1;y&e,sQHBL$:J`C}v4ҍ)R8FJ]RљlF$i-2Le:rul㘗 /p[ a +endstream +endobj + +1011 0 obj +<> +stream +xX\Uy 303 0D4Gқ&X ?D@1UiߋfRkԶ6Vۮn7VS-ep;Hq?9Ϝ9)+;rukRNMNʚ"|39izh wp׌Gqc9nftB/m0#ƺ٘\5\)ǬF +H+@vɸ˾:e-x48#G`ݿ~|eF c?=7z-檙+x+\ +tC*fSQE(B.~T!X*,DnB!}7q|T XR480@&b9P",AQQp` +c1[YUQ)@)J0 +c=5EX%X GoD_90`J\AK&F |}T%Jd%iYB# 7ѰD6] + a +xAqb4bzm6͘mzih&E3y!%aLH2 +d2fr ̍ +d[A)\oA +IG5'/?0Y*4tWiq +6S&!.VMeYՀm^UŶyμy=y%1a3VghGT->CCE_0TzF\u{-nuۡj?j #m Ffjk ~][o W>\ 4)#yt%"GSF3Yv&$Y{l,}Mޱ_->wrQΩ%O6=dמO9tLcrŴm?hw}ݏvXYYUpUr#y 2dB^haPlVKHNV!LwUvwNMOk~Zutc!Vb3V6 l$e;wrY{=D뙡:4c%gtFHLWqWEK;(50(.Dc'N5*CZWdXgتmGX0hJ/lQli+mphN46ŌܢzE^&%x)Z76, >:HCÑH(KA<<jZ5^I7mucuH{1Q.wtu>s;YAr;ohR+`:+bq sJݸq^ԬSgn:tyť eYOM/{ѧ$'/w/>P|¶Ul>k_r9Ş!(DF˙܋uĉ VQ̈́?ˏ 8(ehS?o7>cʓ >/h(wZXsW/aj]G__q ÛړSG,0e'[3*Uk(##zcF1inZd>flXe{SDS}cݣ˗;ٹ7lTݹCk_xrľQG[+Z^S|yM $(o0$1qژHVHop&kWalp;bcm@t+Q'l'_hML Ķ)<"} $6 ²g5d:6?+L/b) ̔{/ CfUVإ#I>yB13RKΤI2xa6lV>|bӟ X&[~`ffuS-Hfc;ŶݻD&OG7>z{.\= dp'12&$Bg"4FGmK8qk4Ġ + VF f}ONƤ:R='8=lG3;6;2q} [7 n(: +ʘJGs}mZZ3}gKWݗ>fl;*uO|m| VV=g]]\VʾOl591OfD mgoճCZM>V[E +!K2M)}[WCpd ѕ跣/Eɘ&K-x6%(E\ +V!UX*tKY8Ew% T47jEh5}/.:9D8Ɇ]`ZԴqwk4oc> +endobj + +1013 0 obj +<>/W[0[600.09768 0 0 317.8711]20 28 636.23049 51[603.02737]68[612.79299 0 0 0 615.2344 0 634.7656]]/DW 0>> +endobj + +1014 0 obj +<> +stream +x]n <w@׶cqcR0$oMz|3@j~8#:0*-.fuaIi3J-Zn[<έ )KZpf#NSzív8HUđo@c٩Vw_E"40 t1VA4MS_HU(y%c削Ds'%Q9vc$x) k|xs}u*Ɔp~h +endstream +endobj + +1015 0 obj +<> +stream +xZM7 +:V" 9At7i6@пߧxSE"E`,?@XOP(l9lRV6}1`44 " 2{cShK%a׍ŏo޳7vr&sNtܛ_槷ƽz?ߛ׷7?b $o+h<~3/C&k0/}Ն+ + o3q"vERb/"[#{gc +IT jՙxh`+ԍH/CEaa7@@*8UʡV/0#!Y7.:|CD yl9V*ZŒPۋwޘw.e0y)ܗ^?Q(3 o-D .umgx#I"dX" y׻GSgGq,CTN="Z)t\_e% %` 9NQIH +RRQa'PX]P`ʄ;羃krf&;99Fkh y1;m"es +.I ?Ul+ +|܆ORp+ y:A '5R0E) v2DP.]k-~T +)b#p!:S%N%~uV8ǀCjϟԾw85 Y˰ LbEqOZ-׀i-lod*L:9rE&I7M%ڈ+ْNLslGq0l8FbAB[khYu y䅩.h7*-IM #ŗ]Zg>ScL9Fq> c3ZumiT>r;+`RDiH4_gӾ̕8R$>l0LR*Uϻ,mPxzF8 χαc8si +՘ ԪR +JK S}U}wS\>dR/TЫXb{]@վN)8Jk9[@{I N2Mkn8nWO):Vϥ[We6q;17>C(ݪ&B+n4>Vޣ1bv2cUS:=|HΔF`|dZq@y=Rߓ`nf|R6N,ј<tr9J8 ?{ף(zm.&~j|!=`n J=G^y_-P犄Ega/{8[&~mÒg{JOX#+XdWzlىDVxÿ̃;`¦\$I!7ړ +endstream +endobj + +1016 0 obj +<> +stream +x]mܶ+/aS |)ڟߡ=Qi}w%Ùgf]L'ϋ!Շ*RN{mrw1Ovϝ~B+#z.pW/{K^h[.tRy;%c&?6&'_9#g˗7^M'^롗"u mL'Uw, uiR8~^ +_;{au hڍ %8tR|U 4ևH  +"GH(:kԽGDP!$An|O3"sԂyJ )}#Q M3XCSOSl]J2vYq3ը3 vR1F̵O~+=w]086o][01n$pQ!=@; Rd }T'Q+Cc#=4+x[XzW@olL 7N}36Ċ:hK\D@"#Ī^>WXP/za0 +טYY2elf0;ga4<Ae1AV6cd@\ͅvU+zȊNWHSI8 aErcW ,)zy{ȯ#DDLh0#q1p\f?רNLh!xWEJԤYIK +))# ifXٞ凹\n1n.n M#)C᤽jp9;4`liHi8l3ƣi41J|eeF7&ya_M<-IxВ5ăG-QGoHq 'W[m*w!Z vWl0N]\A¤ ȪK`˒N8H >!s><ҵf=gzCrQr,f .7E]N +HQ"%̤;uu1&]KF j *+" ƃ8܀UiyI1i ~? mR>j0>VL\!):xe-XerHNAdItԌv= J4x"E c!SkL$dLwb1TP6a74HgK1K5@l";8<"6'Fr*[7Gl%s$౔RNHqP"+ 1o|jcA2N<2~CS.~꫎Za%}ڋ=';0-1:Y:/Ӿ!M }EAHYu{ݶb M ʀ%΋@;'6`fC}E}`W[b|=L$&o%t|0a坐Wk/#/_}~% tD Kϓ0;v4t"]?U!OUPyJO@8H1v/ lIw1_ r~gQWjj6;ᛠfnNBқY~.}e(Ya|^|A`_`q8UxYz9]X+ulf{?S`Nʏo!8GܻQ6bO}NOvLCCϢZXbg2SPkxvlX}#.< lY@.T `G8b`+NG4e?˹Nx1BGAr7n!asSA%&7ڳee.D H!ǩJ:O> +stream +x]YF+|`0;1n2@X}j6)EYEQc9(yQ?$g)5O_Im|c\rl r_?~jl5N"x62 +us F?뗙{6_פƨl3|(|nt4,IStcbm_k}Ӫ/i]&p~760U([qNCjIW&Ӯ6t5ɞt :t64>e?ɠ:Ƅ)z12R}GčȸJ2@s Y;iΐV^Ӧ\\%|iN$H٭>c^ngɨH 4Jk +E| +EvӲBv"@GB˺NQ82ȁw8y=혂=zW^󯷍zoZʚ5??Z@ڬBRZkJ)_?IyOyIy7׆2&XG#yMLXku- ~*  w`J8n`xQ4C20lZo9cf߯B@ǺR dv_޿i~y@B͋ΰmw2o3ImCB6ui_gH:P4K @ !**-9ΞI}2Sώ6s!ē*U22٬9$Yd"Qk= eMgؾN@KVƶf,п-(AA| 57twUï~Q ؽ hsdՍꒀiϑP%&(pLIЇpv@ݴ`JF[XT#6QVpG,L%0*|bjHP^9PNaų ^D3f Z͑K y t9OY&&X8C ~jmwd'8 #g"ޢxwtr($hXl#yJ4pBl,c$JU<tKdP ]dG.PQK?7cnMIxmQ6KG5+mYP8 **Tp  +T%ѥJUqPfv2Ȕ(U@ +L,J `RI,|S%>0H+MRuJt5mJaLQ09Mul6| }$7>'A'iC=?ê2 ]nڠLn%ɔ:ѯ +fiך!fiߚ!kٔ[ĸj Hԭ$3UH b^rU+lQZ]`hFnڊH1Ea1(6}ȫJ@#&T5;s}.]Nk{](ϝOvM7{)Y^c>>e깽u)<өqXAh(D5kAR2&d+BL1u ٥31lڻxHߵMwY1҆*`^W\~}lbA2WtnQmVibPձ\Z'{ wA~牋/vF{ +̯ooa{xDv`cd}7Hoyy8.֕ ~?H,]g{w05G*X39F4K26 G91ݲmwlSO/"hRL \p\X6|Ez~jqcX~hq@:9bÕ+e-L+CLp T( %qVDSG9\"cbܹ:0G&?:ioCL&kzM&29n}I`2[̯:K&IWWlUotuBh#i2{mDZ!vĩkg&[6D[f%t<*~^|-őj[F.<&bZ/x+^|M^#?62!AH.SlCW齇ȃqa=^|M^1Fٳ[mrk d60586jt^È<<XA6Pty(.Gՙg3?!ҫy>ч"D ,0ȷ_>u}(U钀.ނj=[6"EfvTq?Q| +endstream +endobj + +1018 0 obj +<> +stream +x]Ɏ6 XR/ r0ec;@pr(i,LT[11X6X|z|Vt)Oxl`W䨜 a9;xMyt'>B§6#GG%|cVV|,Eâ S13)3[*sPP*KEWzryi~occuu:Rg??^+ׯ˛g?2V|l:`8㝺kn_\ :9Tܕna9M9'-}ՇL->Pdogm_^028ӑ%tv;fdwL/ +Sdl͑i ϟ[T0` +xjÅӭ.l繰SbIC`D,N^0Jcw(}FD;i6|؎EpB¨m l1&qω3p@I":A{%ըnzxGJrN^'f@;[lewsחVU23pɢMls2԰JtXmŃ4'FҔ̛5t3D{;E_e{6uc.)#e1`Mf8fr4e|56ʈq2b4b|i#is>l5wi3. v׃k<\~Uq9N41"\f>hm`ך9„Ϭ\uf0⬫JHIQku ?n/l#d P+UCg:%>@8:Qd𺟻;8rXC~#5ш{m{lyIAQC&#U"&Vd20ԧzS"ͫ +YBnQKt 6!KNNFKtz9Sk:䐯 )_*{yWҭ +k5Ojc'0v2ťhy,ϦHژi1Lʩi~GcĢoIQogR+B:1 IQmhH$+p; Lȅ1ܜ&]4s2К@ I"(c LZ4ON9gtAIT9*h*i9CI#Tو{U< KV߻c`d2,i՘"զB͡'(B,#Iil 9#2)Bɀ.2Süc/R Te'=j(I.6@.6<&YTdϊb+!ʙ\QeoJ"KA0N`ˋcsn8[^%@CQ]|6arкq\R̞׮L> '21-8I@I 8Bk$]\Xk6y^6@e90¯."|4{9B[ V㶺BmrH22|FzPϻlյ"Kҕn!|6y,?EMhkv{ C&_8kϦM..%Lyqk&G[ZH|6k&/Q/69oƍvmr&oM><&GDӴ17/ÈY |f +_iue2u;> ՙ_mrͺd.`Q׵GmrLrṴɗ@oV'/UKwmyQ +|`rE6ٯR669kØj8ߪiv,r^\! TD&M̵u9!{ N6lܾXo! s]Uig.Dص] ]L2䜛W,]}y۵6Kלwe"i1WkizPd(vSӵc d("8kzkEٵ&.%<r+&CxGΡk6yme2:.MӼm*6.h\06k7Q&nih Lxhp6k]Ja&iB+mh]!t bs|\Rg?btܥ>3[>"D}ߟ.%|ϱ*Tf_|3},*97'f>HpH7p8 hTDUyͱpv +endstream +endobj + +1019 0 obj +<> +stream +x]n7 ŭ^b` -2)vij3-ƇYX?ϧ!%u4 sTΆ0L}Sߕ)w8Ð"mQCHx~ǻwN}G%-hcVVܔ&nSv~i9%;y&y 2KgvJGtĪWU.t8Z].~^x7J|kU7:ʛWBk_ʘŠSϵ|Sr >$mbX)8wuڍ:Fuҡj׮8hm]*٥gvj̧kHgBD Ӄ&څf]Lf̀F ͵74T6ԵIR'ľaߢ[fO8X &x76Li=VnѪ:vD,sjF1^\%øar\~f0+'Z%/]PTamQ_ bkk( b`q6436qO؇ ko)2LX0K?p,&J_՜hGI#@}D P(P##1n|kE3[N]-J3#x_:D9QiN;!!a{ GYj6}oy=iPh$V)5>ps:o|tttflj}-1gMm=z4e=fX 'c0.N.+Xݔ}h#h]''&NO&) +] FF>jOhxi yzr;Tk27/6vea&1PZ_jv Cք/hagUjŌ.(yV~_C kPON!*cA$;`ViI^kwwԼKI}U݃Fk}ϣ5Ii LXfƒTqyJd\y!< 7A'Wyx%/AFK4E}Z.ҚDV.Nx)= +l,ZV,!%Nfy )3Q|<)v҂ +-YzH*Xǜce?0 ΤĄf"АNWϩ㣫GFƬ\/Qn8(23h S?ek.h^9'tAT5I۵ZN@RdDdRg#x^JHQ{̝]Gp , ֨.fY?c3lQ*$FZК+`weV@RRIL͒.RIe?oQӵEQ2X 2+X ,kʚ,!wYiQRme֊*_0]=XYɅݶǪ +/.qvwh^qpn~!YlTdQKO&M>ȃcn al&ߡ%^ܻऋO&N5g lRG +襻+'vurW'/kW'(~urԦ#n]>Ŝ+!UDN 6 +ݡW uW],>'U" NۏQ'GhA1K1bsGvu%,"/!u䘠S_=#N^3P'(=tDS'qYM6uurW'QW'ө>`a8s4Snzf-~.ur +SSúc-.B+3)mQ׵Eur +C1?7kSj=ӢKwv.piezɝ yg!YQ u;<6SU}'CMg +endstream +endobj + +1020 0 obj +<> +stream +x\Ɏ6XCa,<@prR[TqZ{pzX,=S$ggmSgW%ЅAQS}Q0 6FΦ~8뇫>6cVV~ʡPrJv[apv.& ^}ժS7*&~MM[_z۟)wo՛۫2V>a;-u^~VZ?1ĠWZݾ+'C9 Iޔx»Gz7Nv]Cu\C9^|vrv}6i鹙r[HwYB3B9kR]h\\ ͘=1'ap +$T e~h4-طpjƙᡃpp 0}H˱Fz72 HĒa:Mfd&GW4bh>KNǖ9́GO<0b0Hc,cb Rxo2&ֈ:N2B[n}uC@nP@0*'}[ZjdF~XsjL4PN}\)~;GdԒz!xi&v5&8j,ss̱*+}NN N!k7r>}n2љy +ڻ}-9hG ]VSVe@p1&3=X"`}:+;::1NLXOLRv!#2}wOC)=~j#i'4ydtBF|}ƃ5冨M73X^f>-e`Ð՚a-L\Abx5f|u_ ks5 _¾ %4Csu꘠. wKC4$Z}a!;(G%(j ֶ䐈 >%ځ'2P|^ OJyY,Q+y2"_)qs4]cZd +#>LYaG`,ZfĐr'<O :e^|+-.ka0K=}%XfRTLALaU 2)j IZ±:N t]80ʄ0fz2rՄK;DD='&f4DiF,z{nq}=D"͛9c?(- +"bVHV#{&4b5! *1Gϻ9,#P)r`vꜗ̘L5;"6K|J,5]k +Ϭ@>n5-5YfI/ϊ+!ʙW鉠tvh3 +qBVkp9 Ay%B+y,2b,Mm 90_zͩ&Z> /0qϦZ&f `looʼn·!VNd˛ly\^72◑-G죕qq2XcwyWo5Oe16+c*aVC=B}-ˢ/J_e}d˻Ȗn~% f 46&7d%,"!u  +Y|M.lMdB\LVve/$[NퟌKO9f7Eɖ7ms>r1lpl974R̬($ɖweV@G|ȦYוTlרZlP~fr0'̧5}dEVTjw>zF.U+D˿/sCA]x)L~9g/ +endstream +endobj + +1021 0 obj +<> +stream +x][ܶ+zlX +;5`Ms6>Aبp]QiҮ H"\93д6 +=~Dk;mbkЂM}Soi7M~3\- i}Ƿ&z_߽7&&@CzpW)ig7/Q/^|~1*OFtU Iy\7I5JibU)?Wy<Z . @]Q^p$pAALq!uj8wv{#Uh*Dt +*|p._Ca~ *St#>-&QȬvݸCZ]n(#s` +/8Ca"}EFж؈6Ylb4oY3>t LV?z\V=͛&GT*V` f*YMqŜ]+6=Gbn0'Xr$̎fG3!!̊)oJӾ텊 +1\$BJ.8 F3h5Wr6GY`SkM*9YM)MRLuI |P5:R>t b#"SGވ=OʝoS#k{sҢf),鶤t[&m2Bx: anp[Z7DTaZבS?U3n<2c9 UEOmS2diD͘X!oRv,LEDj2RLFZrԩt#+moܿ׿<׎%&U<% +0#R2ȑGgDߩ 0=^iY`9DR`#6Ĉ%e8[ ȸS2{H+&EC,]HRb g򌞍LsoJ,Q`sh;AlV.Tx̀vYh7 0f%-nT(`=cbBw%y=j3e.0#+˸!YIN|%8_fnPO=Tt #7+2#MA*.n0>jʠlb E}X(@,7 0F,"$;"X`Fn-?\:8v1pȳD{a;%0ӱ$7,>Rl^,k,ӎ~q!gLbʕEJx>ϺD\7ޞnR=vANZ2=%P$ͼ|G;jBյYd T`:4.iP] +K8IY|eC@52*%y:o3)ۥ$I;D-5^cZ!]ΝϔȀKRgII:lOA$}LabNO" +9O_0H&s&%O} P}@zj¨%m}L,&VW|S۹sGtؾX\dh'uP'Oϕupz.NI.WJb J/40oPZ23gmAj{vI6hM)sm5^P6*.aA^19ö-C7Km/xVH&,4XN5ű1VslLRVc?kv]ZT7C3sa1;$6% @|*+$I>76Ӣ>o37ĩm> jƆ."WGT;vOU^a[/uQM&ɷ +SaI (y]W +RxV~=4OAPk'Ybq~E$Փ66!)[rKRҔ+hCFN`YJz^G @"eJ3cAy+ +X_Cn~D)=rþox {g 38CJuQFbf?;r~\s4ZvV' +endstream +endobj + +1022 0 obj +<> +stream +x]n7>p;@b'A nYZA$XOqgꮢY-esxX|TqJWə!%u l+QYrԯꣲ)5zeL6B>Ù}}U?cVJ;w c>sZEY?8d9%3߳( 83f=*-;*(ePFW9^RUVfNGpׯ޿o|+;l`;جNu6_k-IAGCT~W}*q!ir]AKv}GЮ.ףvxliCF3eaMT_nvp8CA؀Iշy񷻟>Ӂ޵* 4/Y{ v*m|V@ʵ;G!&$ odM>5Y5Ҿ󖀆V*e``9@Wȁ 2w 4@ 4O;\[~rCJSs9VwE_2RWf7iH8Znp6xc8L'W>6rO7MqItW:QWGӉL͸zCB2"L{&A;%FLHKZQig7 p3 4}3p=|T1gO8hsZ|2<&35/y2lX.ŗZ\}l$^q}{{S^tqgE0"z_\@ +endstream +endobj + +1023 0 obj +<> +stream +xZKo7+<0=Çةу6s +C~D=F"m%E/y~͐:6 ")/rED8GC.r&'Olh"ap}#b#.ywwd>mI1ESYbru WKWW7?~w{ zμ[\Y<^A!鉒b\^a sfq[}xn֗6)5뱮CJuW&fu(~@e$SAJ4hp ǂW-zc/29Id%! +,`mc9asor A.p&haVxbIRKDkp?i +kԉr"}@;"0!t&[۩^+C\SKJ&r/lO]͆&HX6a') Y +;PBU(aҝw&g[mJ$.V `#L5~, U$)1>ԘTA:Ҍ +G,5Ms/pgdt bA}'Oxƞ>D؜Xajȣj5*npq)lIuW4k +T)#SǺ#L@TG?a +D.TccXQS70W[i;NIyAq+I%͓XyC@Ďx¿{)Tw;owFN8YKV]R 36A7vr'gLj5If +/]98lF__ڿd_y4#ع4 c}%!n FxeDs;R09u?餛= CGmZQ+WGP+#(rujs:sz>|\F. ݆wBKYn~ Kk6 lC&n aqB=x|ADaZǿ6beӎ +/|8(šH"?}(/ |b: =@ׯ'F'lFEmNW.CRF.>Na +endstream +endobj + +xref +0 1024 +0000000000 65535 f +0000000042 00000 n +0000000311 00000 n +0000000491 00000 n +0000000527 00000 n +0000000665 00000 n +0000000734 00000 n +0000000871 00000 n +0000001051 00000 n +0000001241 00000 n +0000001310 00000 n +0000001491 00000 n +0000001672 00000 n +0000001853 00000 n +0000002034 00000 n +0000002215 00000 n +0000002396 00000 n +0000002510 00000 n +0000002571 00000 n +0000002678 00000 n +0000006474 00000 n +0000006554 00000 n +0000006692 00000 n +0000006772 00000 n +0000006881 00000 n +0000006961 00000 n +0000007070 00000 n +0000007150 00000 n +0000007259 00000 n +0000007339 00000 n +0000007448 00000 n +0000007528 00000 n +0000007637 00000 n +0000007717 00000 n +0000007826 00000 n +0000007906 00000 n +0000008015 00000 n +0000008095 00000 n +0000008204 00000 n +0000008284 00000 n +0000008394 00000 n +0000008474 00000 n +0000008584 00000 n +0000008664 00000 n +0000008774 00000 n +0000008882 00000 n +0000008992 00000 n +0000009102 00000 n +0000009212 00000 n +0000009322 00000 n +0000009432 00000 n +0000009512 00000 n +0000009621 00000 n +0000009701 00000 n +0000009810 00000 n +0000009890 00000 n +0000010028 00000 n +0000010108 00000 n +0000010217 00000 n +0000010297 00000 n +0000010435 00000 n +0000010515 00000 n +0000010624 00000 n +0000010704 00000 n +0000010813 00000 n +0000010893 00000 n +0000011002 00000 n +0000011082 00000 n +0000011192 00000 n +0000011272 00000 n +0000011382 00000 n +0000011462 00000 n +0000011572 00000 n +0000011652 00000 n +0000011762 00000 n +0000011842 00000 n +0000011952 00000 n +0000012032 00000 n +0000012142 00000 n +0000012222 00000 n +0000012332 00000 n +0000012412 00000 n +0000012522 00000 n +0000012602 00000 n +0000012712 00000 n +0000012792 00000 n +0000012902 00000 n +0000012982 00000 n +0000013092 00000 n +0000013172 00000 n +0000013282 00000 n +0000013362 00000 n +0000013472 00000 n +0000013552 00000 n +0000013662 00000 n +0000013742 00000 n +0000013852 00000 n +0000013932 00000 n +0000014042 00000 n +0000014122 00000 n +0000014232 00000 n +0000014314 00000 n +0000014426 00000 n +0000014508 00000 n +0000014620 00000 n +0000014702 00000 n +0000014814 00000 n +0000014896 00000 n +0000015008 00000 n +0000015090 00000 n +0000015202 00000 n +0000015284 00000 n +0000015396 00000 n +0000015478 00000 n +0000015590 00000 n +0000015672 00000 n +0000015784 00000 n +0000015866 00000 n +0000015978 00000 n +0000016060 00000 n +0000016172 00000 n +0000016254 00000 n +0000016366 00000 n +0000016448 00000 n +0000016560 00000 n +0000016642 00000 n +0000016754 00000 n +0000016836 00000 n +0000016948 00000 n +0000017030 00000 n +0000017142 00000 n +0000017224 00000 n +0000017336 00000 n +0000017418 00000 n +0000017530 00000 n +0000017612 00000 n +0000017724 00000 n +0000017806 00000 n +0000017918 00000 n +0000018000 00000 n +0000018112 00000 n +0000018194 00000 n +0000018306 00000 n +0000018388 00000 n +0000018500 00000 n +0000018582 00000 n +0000018694 00000 n +0000018776 00000 n +0000018888 00000 n +0000018970 00000 n +0000019082 00000 n +0000019164 00000 n +0000019276 00000 n +0000019358 00000 n +0000019470 00000 n +0000019552 00000 n +0000019664 00000 n +0000019746 00000 n +0000019858 00000 n +0000019940 00000 n +0000020052 00000 n +0000020134 00000 n +0000020246 00000 n +0000020328 00000 n +0000020440 00000 n +0000020522 00000 n +0000020634 00000 n +0000020716 00000 n +0000020828 00000 n +0000020910 00000 n +0000021022 00000 n +0000021104 00000 n +0000021216 00000 n +0000021298 00000 n +0000021410 00000 n +0000021492 00000 n +0000021604 00000 n +0000021686 00000 n +0000021798 00000 n +0000021880 00000 n +0000021992 00000 n +0000022074 00000 n +0000022186 00000 n +0000022268 00000 n +0000022379 00000 n +0000022487 00000 n +0000022576 00000 n +0000022682 00000 n +0000022837 00000 n +0000022948 00000 n +0000023103 00000 n +0000023214 00000 n +0000023369 00000 n +0000023480 00000 n +0000023635 00000 n +0000023746 00000 n +0000023828 00000 n +0000023994 00000 n +0000024105 00000 n +0000024219 00000 n +0000024385 00000 n +0000024496 00000 n +0000024662 00000 n +0000024773 00000 n +0000024939 00000 n +0000025050 00000 n +0000025216 00000 n +0000025327 00000 n +0000025493 00000 n +0000025605 00000 n +0000025719 00000 n +0000025885 00000 n +0000025997 00000 n +0000026163 00000 n +0000026275 00000 n +0000026441 00000 n +0000026553 00000 n +0000026719 00000 n +0000026831 00000 n +0000026997 00000 n +0000027109 00000 n +0000027191 00000 n +0000027303 00000 n +0000027385 00000 n +0000027497 00000 n +0000027579 00000 n +0000027691 00000 n +0000027773 00000 n +0000027885 00000 n +0000027967 00000 n +0000028079 00000 n +0000028161 00000 n +0000028273 00000 n +0000028355 00000 n +0000028467 00000 n +0000028549 00000 n +0000028661 00000 n +0000028743 00000 n +0000028855 00000 n +0000028937 00000 n +0000029049 00000 n +0000029131 00000 n +0000029273 00000 n +0000029355 00000 n +0000029467 00000 n +0000029549 00000 n +0000029661 00000 n +0000029743 00000 n +0000029855 00000 n +0000029937 00000 n +0000030049 00000 n +0000030131 00000 n +0000030243 00000 n +0000030325 00000 n +0000030437 00000 n +0000030519 00000 n +0000030631 00000 n +0000030713 00000 n +0000030825 00000 n +0000030907 00000 n +0000031019 00000 n +0000031101 00000 n +0000031213 00000 n +0000031295 00000 n +0000031407 00000 n +0000031489 00000 n +0000031601 00000 n +0000031683 00000 n +0000031795 00000 n +0000031877 00000 n +0000031989 00000 n +0000032071 00000 n +0000032183 00000 n +0000032265 00000 n +0000032377 00000 n +0000032459 00000 n +0000032571 00000 n +0000032653 00000 n +0000032765 00000 n +0000032847 00000 n +0000032959 00000 n +0000033041 00000 n +0000033153 00000 n +0000033235 00000 n +0000033347 00000 n +0000033429 00000 n +0000033541 00000 n +0000033623 00000 n +0000033735 00000 n +0000033817 00000 n +0000033929 00000 n +0000034011 00000 n +0000034123 00000 n +0000034205 00000 n +0000034317 00000 n +0000034399 00000 n +0000034511 00000 n +0000034593 00000 n +0000034705 00000 n +0000034787 00000 n +0000034899 00000 n +0000034981 00000 n +0000035093 00000 n +0000035175 00000 n +0000035287 00000 n +0000035369 00000 n +0000035481 00000 n +0000035563 00000 n +0000035675 00000 n +0000035757 00000 n +0000035869 00000 n +0000035951 00000 n +0000036063 00000 n +0000036145 00000 n +0000036257 00000 n +0000036339 00000 n +0000036451 00000 n +0000036533 00000 n +0000036645 00000 n +0000036727 00000 n +0000036839 00000 n +0000036921 00000 n +0000037033 00000 n +0000037115 00000 n +0000037227 00000 n +0000037309 00000 n +0000037421 00000 n +0000037503 00000 n +0000037615 00000 n +0000037697 00000 n +0000037809 00000 n +0000037891 00000 n +0000038003 00000 n +0000038085 00000 n +0000038197 00000 n +0000038279 00000 n +0000038391 00000 n +0000038473 00000 n +0000038585 00000 n +0000038667 00000 n +0000038779 00000 n +0000038861 00000 n +0000038973 00000 n +0000039055 00000 n +0000039167 00000 n +0000039249 00000 n +0000039361 00000 n +0000039443 00000 n +0000039555 00000 n +0000039637 00000 n +0000039749 00000 n +0000039831 00000 n +0000039943 00000 n +0000040025 00000 n +0000040137 00000 n +0000040219 00000 n +0000040332 00000 n +0000040414 00000 n +0000040527 00000 n +0000040609 00000 n +0000040722 00000 n +0000040804 00000 n +0000040917 00000 n +0000040999 00000 n +0000041112 00000 n +0000041194 00000 n +0000041307 00000 n +0000041389 00000 n +0000041502 00000 n +0000041584 00000 n +0000041697 00000 n +0000041779 00000 n +0000041892 00000 n +0000041974 00000 n +0000042087 00000 n +0000042169 00000 n +0000042282 00000 n +0000042364 00000 n +0000042477 00000 n +0000042559 00000 n +0000042672 00000 n +0000042754 00000 n +0000042867 00000 n +0000042949 00000 n +0000043062 00000 n +0000043144 00000 n +0000043257 00000 n +0000043339 00000 n +0000043452 00000 n +0000043534 00000 n +0000043647 00000 n +0000043729 00000 n +0000043842 00000 n +0000043924 00000 n +0000044037 00000 n +0000044119 00000 n +0000044232 00000 n +0000044314 00000 n +0000044427 00000 n +0000044509 00000 n +0000044622 00000 n +0000044704 00000 n +0000044817 00000 n +0000044899 00000 n +0000045012 00000 n +0000045094 00000 n +0000045207 00000 n +0000045289 00000 n +0000045402 00000 n +0000045484 00000 n +0000045597 00000 n +0000045679 00000 n +0000045792 00000 n +0000045874 00000 n +0000045987 00000 n +0000046069 00000 n +0000046182 00000 n +0000046264 00000 n +0000046377 00000 n +0000046459 00000 n +0000046572 00000 n +0000046654 00000 n +0000046767 00000 n +0000046849 00000 n +0000046962 00000 n +0000047044 00000 n +0000047157 00000 n +0000047239 00000 n +0000047352 00000 n +0000047434 00000 n +0000047547 00000 n +0000047629 00000 n +0000047742 00000 n +0000047824 00000 n +0000047937 00000 n +0000048019 00000 n +0000048132 00000 n +0000048214 00000 n +0000048327 00000 n +0000048409 00000 n +0000048522 00000 n +0000048604 00000 n +0000048717 00000 n +0000048799 00000 n +0000048912 00000 n +0000048994 00000 n +0000049107 00000 n +0000049189 00000 n +0000049302 00000 n +0000049384 00000 n +0000049497 00000 n +0000049579 00000 n +0000049692 00000 n +0000049774 00000 n +0000049887 00000 n +0000049969 00000 n +0000050082 00000 n +0000050164 00000 n +0000050277 00000 n +0000050359 00000 n +0000050472 00000 n +0000050554 00000 n +0000050667 00000 n +0000050749 00000 n +0000050862 00000 n +0000050944 00000 n +0000051057 00000 n +0000051139 00000 n +0000051252 00000 n +0000051334 00000 n +0000051447 00000 n +0000051529 00000 n +0000051642 00000 n +0000051724 00000 n +0000051836 00000 n +0000051918 00000 n +0000052030 00000 n +0000052112 00000 n +0000052224 00000 n +0000052306 00000 n +0000052418 00000 n +0000052500 00000 n +0000052612 00000 n +0000052694 00000 n +0000052806 00000 n +0000052888 00000 n +0000053000 00000 n +0000053082 00000 n +0000053194 00000 n +0000053276 00000 n +0000053388 00000 n +0000053470 00000 n +0000053582 00000 n +0000053664 00000 n +0000053777 00000 n +0000053859 00000 n +0000053972 00000 n +0000054054 00000 n +0000054167 00000 n +0000054249 00000 n +0000054362 00000 n +0000054444 00000 n +0000054557 00000 n +0000054639 00000 n +0000054752 00000 n +0000054834 00000 n +0000054947 00000 n +0000055029 00000 n +0000055142 00000 n +0000055224 00000 n +0000055337 00000 n +0000055419 00000 n +0000055532 00000 n +0000055614 00000 n +0000055727 00000 n +0000055809 00000 n +0000055922 00000 n +0000056004 00000 n +0000056117 00000 n +0000056199 00000 n +0000056312 00000 n +0000056394 00000 n +0000056507 00000 n +0000056589 00000 n +0000056702 00000 n +0000056784 00000 n +0000056897 00000 n +0000056979 00000 n +0000057092 00000 n +0000057174 00000 n +0000057287 00000 n +0000057369 00000 n +0000057482 00000 n +0000057564 00000 n +0000057677 00000 n +0000057759 00000 n +0000057872 00000 n +0000057954 00000 n +0000058067 00000 n +0000058149 00000 n +0000058262 00000 n +0000058344 00000 n +0000058457 00000 n +0000058539 00000 n +0000058652 00000 n +0000058734 00000 n +0000058847 00000 n +0000058929 00000 n +0000059042 00000 n +0000059124 00000 n +0000059237 00000 n +0000059319 00000 n +0000059432 00000 n +0000059514 00000 n +0000059627 00000 n +0000059709 00000 n +0000059822 00000 n +0000059904 00000 n +0000060017 00000 n +0000060099 00000 n +0000060212 00000 n +0000060294 00000 n +0000060407 00000 n +0000060489 00000 n +0000060602 00000 n +0000060684 00000 n +0000060797 00000 n +0000060879 00000 n +0000060992 00000 n +0000061074 00000 n +0000061187 00000 n +0000061269 00000 n +0000061382 00000 n +0000061464 00000 n +0000061577 00000 n +0000061659 00000 n +0000061772 00000 n +0000061854 00000 n +0000061967 00000 n +0000062049 00000 n +0000062162 00000 n +0000062244 00000 n +0000062357 00000 n +0000062439 00000 n +0000062552 00000 n +0000062634 00000 n +0000062747 00000 n +0000062829 00000 n +0000062942 00000 n +0000063024 00000 n +0000063137 00000 n +0000063219 00000 n +0000063332 00000 n +0000063414 00000 n +0000063527 00000 n +0000063609 00000 n +0000063722 00000 n +0000063804 00000 n +0000063917 00000 n +0000063999 00000 n +0000064112 00000 n +0000064194 00000 n +0000064307 00000 n +0000064389 00000 n +0000064502 00000 n +0000064584 00000 n +0000064697 00000 n +0000064779 00000 n +0000064892 00000 n +0000064974 00000 n +0000065087 00000 n +0000065169 00000 n +0000065281 00000 n +0000065363 00000 n +0000065475 00000 n +0000065557 00000 n +0000065669 00000 n +0000065751 00000 n +0000065863 00000 n +0000065945 00000 n +0000066057 00000 n +0000066139 00000 n +0000066251 00000 n +0000066333 00000 n +0000066445 00000 n +0000066527 00000 n +0000066639 00000 n +0000066721 00000 n +0000066833 00000 n +0000066915 00000 n +0000067027 00000 n +0000067109 00000 n +0000067222 00000 n +0000067304 00000 n +0000067417 00000 n +0000067499 00000 n +0000067612 00000 n +0000067694 00000 n +0000067807 00000 n +0000067889 00000 n +0000068002 00000 n +0000068084 00000 n +0000068197 00000 n +0000068279 00000 n +0000068392 00000 n +0000068474 00000 n +0000068587 00000 n +0000068669 00000 n +0000068782 00000 n +0000068864 00000 n +0000068977 00000 n +0000069059 00000 n +0000069172 00000 n +0000069254 00000 n +0000069367 00000 n +0000069449 00000 n +0000069562 00000 n +0000069644 00000 n +0000069757 00000 n +0000069839 00000 n +0000069952 00000 n +0000070034 00000 n +0000070147 00000 n +0000070229 00000 n +0000070342 00000 n +0000070424 00000 n +0000070537 00000 n +0000070619 00000 n +0000070732 00000 n +0000070814 00000 n +0000070927 00000 n +0000071009 00000 n +0000071122 00000 n +0000071204 00000 n +0000071317 00000 n +0000071399 00000 n +0000071512 00000 n +0000071594 00000 n +0000071707 00000 n +0000071789 00000 n +0000071902 00000 n +0000071984 00000 n +0000072097 00000 n +0000072179 00000 n +0000072292 00000 n +0000072374 00000 n +0000072487 00000 n +0000072569 00000 n +0000072682 00000 n +0000072764 00000 n +0000072877 00000 n +0000072959 00000 n +0000073072 00000 n +0000073154 00000 n +0000073267 00000 n +0000073349 00000 n +0000073462 00000 n +0000073544 00000 n +0000073657 00000 n +0000073739 00000 n +0000073852 00000 n +0000073934 00000 n +0000074047 00000 n +0000074129 00000 n +0000074242 00000 n +0000074324 00000 n +0000074437 00000 n +0000074519 00000 n +0000074632 00000 n +0000074714 00000 n +0000074827 00000 n +0000074909 00000 n +0000075021 00000 n +0000075103 00000 n +0000075215 00000 n +0000075297 00000 n +0000075409 00000 n +0000075491 00000 n +0000075603 00000 n +0000075685 00000 n +0000075797 00000 n +0000075879 00000 n +0000075991 00000 n +0000076073 00000 n +0000076185 00000 n +0000076267 00000 n +0000076379 00000 n +0000076461 00000 n +0000076573 00000 n +0000076655 00000 n +0000076767 00000 n +0000076849 00000 n +0000076962 00000 n +0000077044 00000 n +0000077157 00000 n +0000077239 00000 n +0000077352 00000 n +0000077434 00000 n +0000077547 00000 n +0000077629 00000 n +0000077742 00000 n +0000077824 00000 n +0000077937 00000 n +0000078019 00000 n +0000078132 00000 n +0000078214 00000 n +0000078327 00000 n +0000078409 00000 n +0000078522 00000 n +0000078604 00000 n +0000078717 00000 n +0000078799 00000 n +0000078912 00000 n +0000078994 00000 n +0000079107 00000 n +0000079189 00000 n +0000079302 00000 n +0000079384 00000 n +0000079497 00000 n +0000079579 00000 n +0000079692 00000 n +0000079774 00000 n +0000079887 00000 n +0000079969 00000 n +0000080082 00000 n +0000080164 00000 n +0000080277 00000 n +0000080359 00000 n +0000080472 00000 n +0000080554 00000 n +0000080667 00000 n +0000080749 00000 n +0000080862 00000 n +0000080944 00000 n +0000081057 00000 n +0000081139 00000 n +0000081252 00000 n +0000081334 00000 n +0000081447 00000 n +0000081529 00000 n +0000081642 00000 n +0000081724 00000 n +0000081837 00000 n +0000081919 00000 n +0000082032 00000 n +0000082114 00000 n +0000082258 00000 n +0000082340 00000 n +0000082453 00000 n +0000082535 00000 n +0000082648 00000 n +0000082730 00000 n +0000082843 00000 n +0000082925 00000 n +0000083038 00000 n +0000083120 00000 n +0000083233 00000 n +0000083315 00000 n +0000083428 00000 n +0000083510 00000 n +0000083623 00000 n +0000083705 00000 n +0000083818 00000 n +0000083900 00000 n +0000084013 00000 n +0000084095 00000 n +0000084208 00000 n +0000084290 00000 n +0000084403 00000 n +0000084485 00000 n +0000084598 00000 n +0000084680 00000 n +0000084793 00000 n +0000084875 00000 n +0000084988 00000 n +0000085070 00000 n +0000085183 00000 n +0000085265 00000 n +0000085378 00000 n +0000085460 00000 n +0000085573 00000 n +0000085655 00000 n +0000085768 00000 n +0000085850 00000 n +0000085963 00000 n +0000086045 00000 n +0000086158 00000 n +0000086240 00000 n +0000086353 00000 n +0000086435 00000 n +0000086548 00000 n +0000086630 00000 n +0000086743 00000 n +0000086825 00000 n +0000086938 00000 n +0000087020 00000 n +0000087133 00000 n +0000087215 00000 n +0000087328 00000 n +0000087410 00000 n +0000087523 00000 n +0000087605 00000 n +0000087718 00000 n +0000087800 00000 n +0000087912 00000 n +0000087994 00000 n +0000088106 00000 n +0000088188 00000 n +0000088300 00000 n +0000088382 00000 n +0000088494 00000 n +0000088576 00000 n +0000088688 00000 n +0000088770 00000 n +0000088882 00000 n +0000088964 00000 n +0000089076 00000 n +0000089158 00000 n +0000089270 00000 n +0000089352 00000 n +0000089464 00000 n +0000089546 00000 n +0000089658 00000 n +0000089740 00000 n +0000089853 00000 n +0000089935 00000 n +0000090048 00000 n +0000090130 00000 n +0000090243 00000 n +0000090325 00000 n +0000090438 00000 n +0000090520 00000 n +0000090633 00000 n +0000090715 00000 n +0000090828 00000 n +0000090910 00000 n +0000091023 00000 n +0000091105 00000 n +0000091218 00000 n +0000091300 00000 n +0000091413 00000 n +0000091495 00000 n +0000091608 00000 n +0000091690 00000 n +0000091803 00000 n +0000091885 00000 n +0000091998 00000 n +0000092080 00000 n +0000092193 00000 n +0000092275 00000 n +0000092388 00000 n +0000092470 00000 n +0000092583 00000 n +0000092665 00000 n +0000092778 00000 n +0000092860 00000 n +0000092973 00000 n +0000093055 00000 n +0000093168 00000 n +0000093250 00000 n +0000093363 00000 n +0000093445 00000 n +0000093558 00000 n +0000093640 00000 n +0000093753 00000 n +0000093835 00000 n +0000093948 00000 n +0000094030 00000 n +0000094143 00000 n +0000094225 00000 n +0000094338 00000 n +0000094420 00000 n +0000094533 00000 n +0000094615 00000 n +0000094728 00000 n +0000094810 00000 n +0000094923 00000 n +0000095005 00000 n +0000095118 00000 n +0000095200 00000 n +0000095313 00000 n +0000095395 00000 n +0000095508 00000 n +0000095590 00000 n +0000095703 00000 n +0000095785 00000 n +0000095898 00000 n +0000095980 00000 n +0000096093 00000 n +0000096175 00000 n +0000096288 00000 n +0000096370 00000 n +0000096483 00000 n +0000096565 00000 n +0000096678 00000 n +0000096760 00000 n +0000096873 00000 n +0000096955 00000 n +0000097068 00000 n +0000097150 00000 n +0000097263 00000 n +0000097345 00000 n +0000097458 00000 n +0000097540 00000 n +0000097653 00000 n +0000097735 00000 n +0000097848 00000 n +0000097930 00000 n +0000098043 00000 n +0000098125 00000 n +0000098238 00000 n +0000098320 00000 n +0000098433 00000 n +0000098515 00000 n +0000098628 00000 n +0000098710 00000 n +0000098823 00000 n +0000098905 00000 n +0000099018 00000 n +0000099100 00000 n +0000099213 00000 n +0000099295 00000 n +0000099439 00000 n +0000099521 00000 n +0000099634 00000 n +0000099716 00000 n +0000099828 00000 n +0000099910 00000 n +0000100022 00000 n +0000100104 00000 n +0000100216 00000 n +0000100298 00000 n +0000100410 00000 n +0000100492 00000 n +0000100604 00000 n +0000100686 00000 n +0000100798 00000 n +0000100880 00000 n +0000100992 00000 n +0000101074 00000 n +0000101186 00000 n +0000101268 00000 n +0000101410 00000 n +0000101492 00000 n +0000101605 00000 n +0000101687 00000 n +0000101831 00000 n +0000101913 00000 n +0000102026 00000 n +0000102108 00000 n +0000102252 00000 n +0000102334 00000 n +0000102447 00000 n +0000102529 00000 n +0000102642 00000 n +0000102788 00000 n +0000103325 00000 n +0000103937 00000 n +0000104509 00000 n +0000105081 00000 n +0000105501 00000 n +0000106058 00000 n +0000106575 00000 n +0000106740 00000 n +0000106879 00000 n +0000127342 00000 n +0000127381 00000 n +0000127570 00000 n +0000143499 00000 n +0000143689 00000 n +0000144181 00000 n +0000144564 00000 n +0000149132 00000 n +0000149367 00000 n +0000149662 00000 n +0000150003 00000 n +0000151664 00000 n +0000155108 00000 n +0000158468 00000 n +0000160940 00000 n +0000163398 00000 n +0000165490 00000 n +0000168773 00000 n +0000171503 00000 n + +trailer +<<4DBE4E3B48A028AA76E385A5F6E9B63F>]>> +startxref +172790 +%%EOF diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377311.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377311.pdf new file mode 100644 index 000000000..72f2d870f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377311.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377312.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377312.pdf new file mode 100644 index 000000000..1898e864e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377312.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377314.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377314.pdf new file mode 100644 index 000000000..a73e04fc8 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377314.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377316.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377316.pdf new file mode 100644 index 000000000..6c4d6266b Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377316.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377317.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377317.pdf new file mode 100644 index 000000000..18acd38ed Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377317.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377318.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377318.pdf new file mode 100644 index 000000000..ae5342d0c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377318.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377319.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377319.pdf new file mode 100644 index 000000000..43626929e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377319.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377320.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377320.pdf new file mode 100644 index 000000000..3210aaf90 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796377320.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796481781.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796481781.pdf new file mode 100644 index 000000000..1e09030ca Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796481781.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796646641.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796646641.pdf new file mode 100644 index 000000000..1074ee9ca Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796646641.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796646642.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796646642.pdf new file mode 100644 index 000000000..d65f0fbe8 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796646642.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796646644.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796646644.pdf new file mode 100644 index 000000000..583f4358f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796646644.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796700866.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796700866.pdf new file mode 100644 index 000000000..64b38262d Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796700866.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796700867.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796700867.pdf new file mode 100644 index 000000000..4053b6fa8 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796700867.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796700868.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796700868.pdf new file mode 100644 index 000000000..0a099cab0 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500796700868.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797048053.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797048053.pdf new file mode 100644 index 000000000..a98888d00 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797048053.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797048054.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797048054.pdf new file mode 100644 index 000000000..3f1a35e7e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797048054.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797200599.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797200599.pdf new file mode 100644 index 000000000..a1fc2874a Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797200599.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797200604.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797200604.pdf new file mode 100644 index 000000000..e93a1e76e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797200604.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797200605.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797200605.pdf new file mode 100644 index 000000000..317400818 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797200605.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797312247.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797312247.pdf new file mode 100644 index 000000000..9506e604d Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797312247.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797312248.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797312248.pdf new file mode 100644 index 000000000..964e3b091 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797312248.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797312249.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797312249.pdf new file mode 100644 index 000000000..82ba7938f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797312249.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797313211.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797313211.pdf new file mode 100644 index 000000000..ed8a9fa66 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797313211.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797383868.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797383868.pdf new file mode 100644 index 000000000..7ad475395 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797383868.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797383869.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797383869.pdf new file mode 100644 index 000000000..fc5cb90b1 --- /dev/null +++ b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797383869.pdf @@ -0,0 +1,5381 @@ +%PDF-1.4 +%µ¶ +% Written by MuPDF 1.29.0 + +1 0 obj +<> +endobj + +2 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1023 0 R/StructParents 0/Parent 16 0 R>> +endobj + +3 0 obj +<> +endobj + +4 0 obj +<> +endobj + +5 0 obj +<> +endobj + +6 0 obj +<> +endobj + +7 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1024 0 R/StructParents 1/Parent 16 0 R>> +endobj + +8 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1025 0 R/StructParents 2/Parent 16 0 R>> +endobj + +9 0 obj +<> +endobj + +10 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1026 0 R/StructParents 3/Parent 16 0 R>> +endobj + +11 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1027 0 R/StructParents 4/Parent 16 0 R>> +endobj + +12 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1028 0 R/StructParents 5/Parent 16 0 R>> +endobj + +13 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1029 0 R/StructParents 6/Parent 16 0 R>> +endobj + +14 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1030 0 R/StructParents 7/Parent 16 0 R>> +endobj + +15 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1031 0 R/StructParents 8/Parent 17 0 R>> +endobj + +16 0 obj +<> +endobj + +17 0 obj +<> +endobj + +18 0 obj +<> +endobj + +19 0 obj +<> +endobj + +20 0 obj +<> +endobj + +21 0 obj +<><>]/ID(node00000004)>> +endobj + +22 0 obj +<> +endobj + +23 0 obj +<>]/ID(node00000025)>> +endobj + +24 0 obj +<> +endobj + +25 0 obj +<>]/ID(node00000026)>> +endobj + +26 0 obj +<> +endobj + +27 0 obj +<>]/ID(node00000029)>> +endobj + +28 0 obj +<> +endobj + +29 0 obj +<>]/ID(node00000031)>> +endobj + +30 0 obj +<> +endobj + +31 0 obj +<>]/ID(node00000034)>> +endobj + +32 0 obj +<> +endobj + +33 0 obj +<>]/ID(node00000036)>> +endobj + +34 0 obj +<> +endobj + +35 0 obj +<>]/ID(node00000038)>> +endobj + +36 0 obj +<> +endobj + +37 0 obj +<>]/ID(node00000040)>> +endobj + +38 0 obj +<> +endobj + +39 0 obj +<>]/ID(node00000042)>> +endobj + +40 0 obj +<> +endobj + +41 0 obj +<>]/ID(node00000044)>> +endobj + +42 0 obj +<> +endobj + +43 0 obj +<>]/ID(node00000046)>> +endobj + +44 0 obj +<> +endobj + +45 0 obj +<>]/ID(node00000048)>> +endobj + +46 0 obj +<>]/ID(node00000008)>> +endobj + +47 0 obj +<>]/ID(node00000009)>> +endobj + +48 0 obj +<>]/ID(node00000010)>> +endobj + +49 0 obj +<>]/ID(node00000011)>> +endobj + +50 0 obj +<> +endobj + +51 0 obj +<>]/ID(node00000013)>> +endobj + +52 0 obj +<> +endobj + +53 0 obj +<>]/ID(node00000014)>> +endobj + +54 0 obj +<> +endobj + +55 0 obj +<><>]/ID(node00000061)>> +endobj + +56 0 obj +<> +endobj + +57 0 obj +<>]/ID(node00000063)>> +endobj + +58 0 obj +<> +endobj + +59 0 obj +<><>]/ID(node00000065)>> +endobj + +60 0 obj +<> +endobj + +61 0 obj +<>]/ID(node00000067)>> +endobj + +62 0 obj +<> +endobj + +63 0 obj +<>]/ID(node00000070)>> +endobj + +64 0 obj +<> +endobj + +65 0 obj +<>]/ID(node00000072)>> +endobj + +66 0 obj +<> +endobj + +67 0 obj +<>]/ID(node00000075)>> +endobj + +68 0 obj +<> +endobj + +69 0 obj +<>]/ID(node00000077)>> +endobj + +70 0 obj +<> +endobj + +71 0 obj +<>]/ID(node00000080)>> +endobj + +72 0 obj +<> +endobj + +73 0 obj +<>]/ID(node00000082)>> +endobj + +74 0 obj +<> +endobj + +75 0 obj +<>]/ID(node00000085)>> +endobj + +76 0 obj +<> +endobj + +77 0 obj +<>]/ID(node00000087)>> +endobj + +78 0 obj +<> +endobj + +79 0 obj +<>]/ID(node00000090)>> +endobj + +80 0 obj +<> +endobj + +81 0 obj +<>]/ID(node00000092)>> +endobj + +82 0 obj +<> +endobj + +83 0 obj +<>]/ID(node00000095)>> +endobj + +84 0 obj +<> +endobj + +85 0 obj +<>]/ID(node00000097)>> +endobj + +86 0 obj +<> +endobj + +87 0 obj +<>]/ID(node00000100)>> +endobj + +88 0 obj +<> +endobj + +89 0 obj +<>]/ID(node00000102)>> +endobj + +90 0 obj +<> +endobj + +91 0 obj +<>]/ID(node00000105)>> +endobj + +92 0 obj +<> +endobj + +93 0 obj +<>]/ID(node00000107)>> +endobj + +94 0 obj +<> +endobj + +95 0 obj +<>]/ID(node00000110)>> +endobj + +96 0 obj +<> +endobj + +97 0 obj +<>]/ID(node00000112)>> +endobj + +98 0 obj +<> +endobj + +99 0 obj +<>]/ID(node00000115)>> +endobj + +100 0 obj +<> +endobj + +101 0 obj +<>]/ID(node00000117)>> +endobj + +102 0 obj +<> +endobj + +103 0 obj +<>]/ID(node00000121)>> +endobj + +104 0 obj +<> +endobj + +105 0 obj +<>]/ID(node00000123)>> +endobj + +106 0 obj +<> +endobj + +107 0 obj +<>]/ID(node00000126)>> +endobj + +108 0 obj +<> +endobj + +109 0 obj +<>]/ID(node00000128)>> +endobj + +110 0 obj +<> +endobj + +111 0 obj +<>]/ID(node00000131)>> +endobj + +112 0 obj +<> +endobj + +113 0 obj +<>]/ID(node00000133)>> +endobj + +114 0 obj +<> +endobj + +115 0 obj +<>]/ID(node00000136)>> +endobj + +116 0 obj +<> +endobj + +117 0 obj +<>]/ID(node00000138)>> +endobj + +118 0 obj +<> +endobj + +119 0 obj +<>]/ID(node00000142)>> +endobj + +120 0 obj +<> +endobj + +121 0 obj +<>]/ID(node00000144)>> +endobj + +122 0 obj +<> +endobj + +123 0 obj +<>]/ID(node00000148)>> +endobj + +124 0 obj +<> +endobj + +125 0 obj +<>]/ID(node00000151)>> +endobj + +126 0 obj +<> +endobj + +127 0 obj +<>]/ID(node00000154)>> +endobj + +128 0 obj +<> +endobj + +129 0 obj +<>]/ID(node00000156)>> +endobj + +130 0 obj +<> +endobj + +131 0 obj +<>]/ID(node00000159)>> +endobj + +132 0 obj +<> +endobj + +133 0 obj +<>]/ID(node00000161)>> +endobj + +134 0 obj +<> +endobj + +135 0 obj +<>]/ID(node00000164)>> +endobj + +136 0 obj +<> +endobj + +137 0 obj +<>]/ID(node00000166)>> +endobj + +138 0 obj +<> +endobj + +139 0 obj +<>]/ID(node00000169)>> +endobj + +140 0 obj +<> +endobj + +141 0 obj +<>]/ID(node00000171)>> +endobj + +142 0 obj +<> +endobj + +143 0 obj +<>]/ID(node00000175)>> +endobj + +144 0 obj +<> +endobj + +145 0 obj +<>]/ID(node00000177)>> +endobj + +146 0 obj +<> +endobj + +147 0 obj +<>]/ID(node00000180)>> +endobj + +148 0 obj +<> +endobj + +149 0 obj +<>]/ID(node00000182)>> +endobj + +150 0 obj +<> +endobj + +151 0 obj +<>]/ID(node00000186)>> +endobj + +152 0 obj +<> +endobj + +153 0 obj +<>]/ID(node00000188)>> +endobj + +154 0 obj +<> +endobj + +155 0 obj +<>]/ID(node00000191)>> +endobj + +156 0 obj +<> +endobj + +157 0 obj +<>]/ID(node00000193)>> +endobj + +158 0 obj +<> +endobj + +159 0 obj +<>]/ID(node00000196)>> +endobj + +160 0 obj +<> +endobj + +161 0 obj +<>]/ID(node00000198)>> +endobj + +162 0 obj +<> +endobj + +163 0 obj +<>]/ID(node00000202)>> +endobj + +164 0 obj +<> +endobj + +165 0 obj +<>]/ID(node00000204)>> +endobj + +166 0 obj +<> +endobj + +167 0 obj +<>]/ID(node00000207)>> +endobj + +168 0 obj +<> +endobj + +169 0 obj +<>]/ID(node00000209)>> +endobj + +170 0 obj +<> +endobj + +171 0 obj +<>]/ID(node00000212)>> +endobj + +172 0 obj +<> +endobj + +173 0 obj +<>]/ID(node00000214)>> +endobj + +174 0 obj +<> +endobj + +175 0 obj +<>]/ID(node00000217)>> +endobj + +176 0 obj +<> +endobj + +177 0 obj +<>]/ID(node00000219)>> +endobj + +178 0 obj +<> +endobj + +179 0 obj +<>]/ID(node00000222)>> +endobj + +180 0 obj +<> +endobj + +181 0 obj +<>]/ID(node00000224)>> +endobj + +182 0 obj +<> +endobj + +183 0 obj +<>]/ID(node00000228)>> +endobj + +184 0 obj +<> +endobj + +185 0 obj +<> +endobj + +186 0 obj +<> +endobj + +187 0 obj +<><><>]/ID(node00000233)>> +endobj + +188 0 obj +<>]/ID(node00000234)>> +endobj + +189 0 obj +<><><>]/ID(node00000235)>> +endobj + +190 0 obj +<>]/ID(node00000236)>> +endobj + +191 0 obj +<><><>]/ID(node00000237)>> +endobj + +192 0 obj +<>]/ID(node00000238)>> +endobj + +193 0 obj +<><><>]/ID(node00000239)>> +endobj + +194 0 obj +<>]/ID(node00000240)>> +endobj + +195 0 obj +<> +endobj + +196 0 obj +<><><>]/ID(node00000243)>> +endobj + +197 0 obj +<>]/ID(node00000244)>> +endobj + +198 0 obj +<> +endobj + +199 0 obj +<><><>]/ID(node00000246)>> +endobj + +200 0 obj +<>]/ID(node00000247)>> +endobj + +201 0 obj +<><><>]/ID(node00000248)>> +endobj + +202 0 obj +<>]/ID(node00000249)>> +endobj + +203 0 obj +<><><>]/ID(node00000250)>> +endobj + +204 0 obj +<>]/ID(node00000251)>> +endobj + +205 0 obj +<><><>]/ID(node00000252)>> +endobj + +206 0 obj +<>]/ID(node00000253)>> +endobj + +207 0 obj +<><><>]/ID(node00000254)>> +endobj + +208 0 obj +<>]/ID(node00000255)>> +endobj + +209 0 obj +<> +endobj + +210 0 obj +<><><>]/ID(node00000257)>> +endobj + +211 0 obj +<>]/ID(node00000258)>> +endobj + +212 0 obj +<><><>]/ID(node00000259)>> +endobj + +213 0 obj +<>]/ID(node00000260)>> +endobj + +214 0 obj +<><><>]/ID(node00000261)>> +endobj + +215 0 obj +<>]/ID(node00000262)>> +endobj + +216 0 obj +<><><>]/ID(node00000263)>> +endobj + +217 0 obj +<>]/ID(node00000264)>> +endobj + +218 0 obj +<><><>]/ID(node00000265)>> +endobj + +219 0 obj +<>]/ID(node00000266)>> +endobj + +220 0 obj +<> +endobj + +221 0 obj +<>]/ID(node00000270)>> +endobj + +222 0 obj +<> +endobj + +223 0 obj +<>]/ID(node00000273)>> +endobj + +224 0 obj +<> +endobj + +225 0 obj +<>]/ID(node00000276)>> +endobj + +226 0 obj +<> +endobj + +227 0 obj +<>]/ID(node00000278)>> +endobj + +228 0 obj +<> +endobj + +229 0 obj +<>]/ID(node00000281)>> +endobj + +230 0 obj +<> +endobj + +231 0 obj +<>]/ID(node00000283)>> +endobj + +232 0 obj +<> +endobj + +233 0 obj +<>]/ID(node00000286)>> +endobj + +234 0 obj +<> +endobj + +235 0 obj +<>]/ID(node00000288)>> +endobj + +236 0 obj +<> +endobj + +237 0 obj +<>]/ID(node00000291)>> +endobj + +238 0 obj +<> +endobj + +239 0 obj +<>]/ID(node00000293)>> +endobj + +240 0 obj +<> +endobj + +241 0 obj +<><>]/ID(node00000297)>> +endobj + +242 0 obj +<> +endobj + +243 0 obj +<>]/ID(node00000299)>> +endobj + +244 0 obj +<> +endobj + +245 0 obj +<>]/ID(node00000303)>> +endobj + +246 0 obj +<> +endobj + +247 0 obj +<>]/ID(node00000305)>> +endobj + +248 0 obj +<> +endobj + +249 0 obj +<>]/ID(node00000309)>> +endobj + +250 0 obj +<> +endobj + +251 0 obj +<>]/ID(node00000312)>> +endobj + +252 0 obj +<> +endobj + +253 0 obj +<>]/ID(node00000315)>> +endobj + +254 0 obj +<> +endobj + +255 0 obj +<>]/ID(node00000317)>> +endobj + +256 0 obj +<> +endobj + +257 0 obj +<>]/ID(node00000320)>> +endobj + +258 0 obj +<> +endobj + +259 0 obj +<>]/ID(node00000322)>> +endobj + +260 0 obj +<> +endobj + +261 0 obj +<>]/ID(node00000325)>> +endobj + +262 0 obj +<> +endobj + +263 0 obj +<>]/ID(node00000327)>> +endobj + +264 0 obj +<> +endobj + +265 0 obj +<>]/ID(node00000330)>> +endobj + +266 0 obj +<> +endobj + +267 0 obj +<>]/ID(node00000332)>> +endobj + +268 0 obj +<> +endobj + +269 0 obj +<>]/ID(node00000335)>> +endobj + +270 0 obj +<> +endobj + +271 0 obj +<>]/ID(node00000337)>> +endobj + +272 0 obj +<> +endobj + +273 0 obj +<>]/ID(node00000340)>> +endobj + +274 0 obj +<> +endobj + +275 0 obj +<>]/ID(node00000342)>> +endobj + +276 0 obj +<> +endobj + +277 0 obj +<>]/ID(node00000345)>> +endobj + +278 0 obj +<> +endobj + +279 0 obj +<>]/ID(node00000347)>> +endobj + +280 0 obj +<> +endobj + +281 0 obj +<>]/ID(node00000350)>> +endobj + +282 0 obj +<> +endobj + +283 0 obj +<>]/ID(node00000352)>> +endobj + +284 0 obj +<> +endobj + +285 0 obj +<>]/ID(node00000355)>> +endobj + +286 0 obj +<> +endobj + +287 0 obj +<>]/ID(node00000357)>> +endobj + +288 0 obj +<> +endobj + +289 0 obj +<>]/ID(node00000360)>> +endobj + +290 0 obj +<> +endobj + +291 0 obj +<>]/ID(node00000362)>> +endobj + +292 0 obj +<> +endobj + +293 0 obj +<>]/ID(node00000365)>> +endobj + +294 0 obj +<> +endobj + +295 0 obj +<>]/ID(node00000367)>> +endobj + +296 0 obj +<> +endobj + +297 0 obj +<>]/ID(node00000371)>> +endobj + +298 0 obj +<> +endobj + +299 0 obj +<>]/ID(node00000374)>> +endobj + +300 0 obj +<> +endobj + +301 0 obj +<>]/ID(node00000376)>> +endobj + +302 0 obj +<> +endobj + +303 0 obj +<>]/ID(node00000379)>> +endobj + +304 0 obj +<> +endobj + +305 0 obj +<>]/ID(node00000381)>> +endobj + +306 0 obj +<> +endobj + +307 0 obj +<>]/ID(node00000384)>> +endobj + +308 0 obj +<> +endobj + +309 0 obj +<>]/ID(node00000386)>> +endobj + +310 0 obj +<> +endobj + +311 0 obj +<>]/ID(node00000389)>> +endobj + +312 0 obj +<> +endobj + +313 0 obj +<>]/ID(node00000391)>> +endobj + +314 0 obj +<> +endobj + +315 0 obj +<>]/ID(node00000394)>> +endobj + +316 0 obj +<> +endobj + +317 0 obj +<>]/ID(node00000396)>> +endobj + +318 0 obj +<> +endobj + +319 0 obj +<>]/ID(node00000399)>> +endobj + +320 0 obj +<> +endobj + +321 0 obj +<>]/ID(node00000401)>> +endobj + +322 0 obj +<> +endobj + +323 0 obj +<>]/ID(node00000404)>> +endobj + +324 0 obj +<> +endobj + +325 0 obj +<>]/ID(node00000406)>> +endobj + +326 0 obj +<> +endobj + +327 0 obj +<>]/ID(node00000409)>> +endobj + +328 0 obj +<> +endobj + +329 0 obj +<>]/ID(node00000411)>> +endobj + +330 0 obj +<> +endobj + +331 0 obj +<>]/ID(node00000414)>> +endobj + +332 0 obj +<> +endobj + +333 0 obj +<>]/ID(node00000416)>> +endobj + +334 0 obj +<> +endobj + +335 0 obj +<>]/ID(node00000419)>> +endobj + +336 0 obj +<> +endobj + +337 0 obj +<>]/ID(node00000421)>> +endobj + +338 0 obj +<> +endobj + +339 0 obj +<>]/ID(node00000424)>> +endobj + +340 0 obj +<> +endobj + +341 0 obj +<>]/ID(node00000426)>> +endobj + +342 0 obj +<> +endobj + +343 0 obj +<>]/ID(node00000430)>> +endobj + +344 0 obj +<> +endobj + +345 0 obj +<>]/ID(node00000433)>> +endobj + +346 0 obj +<> +endobj + +347 0 obj +<>]/ID(node00000435)>> +endobj + +348 0 obj +<> +endobj + +349 0 obj +<>]/ID(node00000438)>> +endobj + +350 0 obj +<> +endobj + +351 0 obj +<>]/ID(node00000440)>> +endobj + +352 0 obj +<> +endobj + +353 0 obj +<>]/ID(node00000443)>> +endobj + +354 0 obj +<> +endobj + +355 0 obj +<>]/ID(node00000445)>> +endobj + +356 0 obj +<> +endobj + +357 0 obj +<>]/ID(node00000448)>> +endobj + +358 0 obj +<> +endobj + +359 0 obj +<>]/ID(node00000450)>> +endobj + +360 0 obj +<> +endobj + +361 0 obj +<>]/ID(node00000453)>> +endobj + +362 0 obj +<> +endobj + +363 0 obj +<>]/ID(node00000455)>> +endobj + +364 0 obj +<> +endobj + +365 0 obj +<>]/ID(node00000458)>> +endobj + +366 0 obj +<> +endobj + +367 0 obj +<>]/ID(node00000460)>> +endobj + +368 0 obj +<> +endobj + +369 0 obj +<>]/ID(node00000463)>> +endobj + +370 0 obj +<> +endobj + +371 0 obj +<>]/ID(node00000465)>> +endobj + +372 0 obj +<> +endobj + +373 0 obj +<>]/ID(node00000468)>> +endobj + +374 0 obj +<> +endobj + +375 0 obj +<>]/ID(node00000470)>> +endobj + +376 0 obj +<> +endobj + +377 0 obj +<>]/ID(node00000473)>> +endobj + +378 0 obj +<> +endobj + +379 0 obj +<>]/ID(node00000475)>> +endobj + +380 0 obj +<> +endobj + +381 0 obj +<>]/ID(node00000478)>> +endobj + +382 0 obj +<> +endobj + +383 0 obj +<>]/ID(node00000480)>> +endobj + +384 0 obj +<> +endobj + +385 0 obj +<>]/ID(node00000483)>> +endobj + +386 0 obj +<> +endobj + +387 0 obj +<>]/ID(node00000485)>> +endobj + +388 0 obj +<> +endobj + +389 0 obj +<>]/ID(node00000489)>> +endobj + +390 0 obj +<> +endobj + +391 0 obj +<>]/ID(node00000492)>> +endobj + +392 0 obj +<> +endobj + +393 0 obj +<>]/ID(node00000494)>> +endobj + +394 0 obj +<> +endobj + +395 0 obj +<>]/ID(node00000497)>> +endobj + +396 0 obj +<> +endobj + +397 0 obj +<>]/ID(node00000499)>> +endobj + +398 0 obj +<> +endobj + +399 0 obj +<>]/ID(node00000502)>> +endobj + +400 0 obj +<> +endobj + +401 0 obj +<>]/ID(node00000504)>> +endobj + +402 0 obj +<> +endobj + +403 0 obj +<>]/ID(node00000507)>> +endobj + +404 0 obj +<> +endobj + +405 0 obj +<>]/ID(node00000509)>> +endobj + +406 0 obj +<> +endobj + +407 0 obj +<>]/ID(node00000512)>> +endobj + +408 0 obj +<> +endobj + +409 0 obj +<>]/ID(node00000514)>> +endobj + +410 0 obj +<> +endobj + +411 0 obj +<>]/ID(node00000517)>> +endobj + +412 0 obj +<> +endobj + +413 0 obj +<>]/ID(node00000519)>> +endobj + +414 0 obj +<> +endobj + +415 0 obj +<>]/ID(node00000522)>> +endobj + +416 0 obj +<> +endobj + +417 0 obj +<>]/ID(node00000524)>> +endobj + +418 0 obj +<> +endobj + +419 0 obj +<>]/ID(node00000527)>> +endobj + +420 0 obj +<> +endobj + +421 0 obj +<>]/ID(node00000529)>> +endobj + +422 0 obj +<> +endobj + +423 0 obj +<>]/ID(node00000532)>> +endobj + +424 0 obj +<> +endobj + +425 0 obj +<>]/ID(node00000534)>> +endobj + +426 0 obj +<> +endobj + +427 0 obj +<>]/ID(node00000537)>> +endobj + +428 0 obj +<> +endobj + +429 0 obj +<>]/ID(node00000539)>> +endobj + +430 0 obj +<> +endobj + +431 0 obj +<>]/ID(node00000542)>> +endobj + +432 0 obj +<> +endobj + +433 0 obj +<>]/ID(node00000544)>> +endobj + +434 0 obj +<> +endobj + +435 0 obj +<>]/ID(node00000548)>> +endobj + +436 0 obj +<> +endobj + +437 0 obj +<>]/ID(node00000551)>> +endobj + +438 0 obj +<> +endobj + +439 0 obj +<>]/ID(node00000553)>> +endobj + +440 0 obj +<> +endobj + +441 0 obj +<>]/ID(node00000556)>> +endobj + +442 0 obj +<> +endobj + +443 0 obj +<>]/ID(node00000558)>> +endobj + +444 0 obj +<> +endobj + +445 0 obj +<>]/ID(node00000561)>> +endobj + +446 0 obj +<> +endobj + +447 0 obj +<>]/ID(node00000563)>> +endobj + +448 0 obj +<> +endobj + +449 0 obj +<>]/ID(node00000566)>> +endobj + +450 0 obj +<> +endobj + +451 0 obj +<>]/ID(node00000568)>> +endobj + +452 0 obj +<> +endobj + +453 0 obj +<>]/ID(node00000571)>> +endobj + +454 0 obj +<> +endobj + +455 0 obj +<>]/ID(node00000573)>> +endobj + +456 0 obj +<> +endobj + +457 0 obj +<>]/ID(node00000576)>> +endobj + +458 0 obj +<> +endobj + +459 0 obj +<>]/ID(node00000578)>> +endobj + +460 0 obj +<> +endobj + +461 0 obj +<>]/ID(node00000581)>> +endobj + +462 0 obj +<> +endobj + +463 0 obj +<>]/ID(node00000583)>> +endobj + +464 0 obj +<> +endobj + +465 0 obj +<>]/ID(node00000586)>> +endobj + +466 0 obj +<> +endobj + +467 0 obj +<>]/ID(node00000588)>> +endobj + +468 0 obj +<> +endobj + +469 0 obj +<>]/ID(node00000591)>> +endobj + +470 0 obj +<> +endobj + +471 0 obj +<>]/ID(node00000593)>> +endobj + +472 0 obj +<> +endobj + +473 0 obj +<>]/ID(node00000596)>> +endobj + +474 0 obj +<> +endobj + +475 0 obj +<>]/ID(node00000598)>> +endobj + +476 0 obj +<> +endobj + +477 0 obj +<>]/ID(node00000601)>> +endobj + +478 0 obj +<> +endobj + +479 0 obj +<>]/ID(node00000603)>> +endobj + +480 0 obj +<> +endobj + +481 0 obj +<>]/ID(node00000607)>> +endobj + +482 0 obj +<> +endobj + +483 0 obj +<>]/ID(node00000610)>> +endobj + +484 0 obj +<> +endobj + +485 0 obj +<>]/ID(node00000612)>> +endobj + +486 0 obj +<> +endobj + +487 0 obj +<>]/ID(node00000615)>> +endobj + +488 0 obj +<> +endobj + +489 0 obj +<>]/ID(node00000617)>> +endobj + +490 0 obj +<> +endobj + +491 0 obj +<>]/ID(node00000620)>> +endobj + +492 0 obj +<> +endobj + +493 0 obj +<>]/ID(node00000622)>> +endobj + +494 0 obj +<> +endobj + +495 0 obj +<>]/ID(node00000625)>> +endobj + +496 0 obj +<> +endobj + +497 0 obj +<>]/ID(node00000627)>> +endobj + +498 0 obj +<> +endobj + +499 0 obj +<>]/ID(node00000630)>> +endobj + +500 0 obj +<> +endobj + +501 0 obj +<>]/ID(node00000632)>> +endobj + +502 0 obj +<> +endobj + +503 0 obj +<>]/ID(node00000635)>> +endobj + +504 0 obj +<> +endobj + +505 0 obj +<>]/ID(node00000637)>> +endobj + +506 0 obj +<> +endobj + +507 0 obj +<>]/ID(node00000640)>> +endobj + +508 0 obj +<> +endobj + +509 0 obj +<>]/ID(node00000642)>> +endobj + +510 0 obj +<> +endobj + +511 0 obj +<>]/ID(node00000645)>> +endobj + +512 0 obj +<> +endobj + +513 0 obj +<>]/ID(node00000647)>> +endobj + +514 0 obj +<> +endobj + +515 0 obj +<>]/ID(node00000650)>> +endobj + +516 0 obj +<> +endobj + +517 0 obj +<>]/ID(node00000652)>> +endobj + +518 0 obj +<> +endobj + +519 0 obj +<>]/ID(node00000655)>> +endobj + +520 0 obj +<> +endobj + +521 0 obj +<>]/ID(node00000657)>> +endobj + +522 0 obj +<> +endobj + +523 0 obj +<>]/ID(node00000660)>> +endobj + +524 0 obj +<> +endobj + +525 0 obj +<>]/ID(node00000662)>> +endobj + +526 0 obj +<> +endobj + +527 0 obj +<>]/ID(node00000666)>> +endobj + +528 0 obj +<> +endobj + +529 0 obj +<>]/ID(node00000669)>> +endobj + +530 0 obj +<> +endobj + +531 0 obj +<>]/ID(node00000671)>> +endobj + +532 0 obj +<> +endobj + +533 0 obj +<>]/ID(node00000674)>> +endobj + +534 0 obj +<> +endobj + +535 0 obj +<>]/ID(node00000676)>> +endobj + +536 0 obj +<> +endobj + +537 0 obj +<>]/ID(node00000679)>> +endobj + +538 0 obj +<> +endobj + +539 0 obj +<>]/ID(node00000681)>> +endobj + +540 0 obj +<> +endobj + +541 0 obj +<>]/ID(node00000684)>> +endobj + +542 0 obj +<> +endobj + +543 0 obj +<>]/ID(node00000686)>> +endobj + +544 0 obj +<> +endobj + +545 0 obj +<>]/ID(node00000689)>> +endobj + +546 0 obj +<> +endobj + +547 0 obj +<>]/ID(node00000691)>> +endobj + +548 0 obj +<> +endobj + +549 0 obj +<>]/ID(node00000694)>> +endobj + +550 0 obj +<> +endobj + +551 0 obj +<>]/ID(node00000696)>> +endobj + +552 0 obj +<> +endobj + +553 0 obj +<>]/ID(node00000699)>> +endobj + +554 0 obj +<> +endobj + +555 0 obj +<>]/ID(node00000701)>> +endobj + +556 0 obj +<> +endobj + +557 0 obj +<>]/ID(node00000704)>> +endobj + +558 0 obj +<> +endobj + +559 0 obj +<>]/ID(node00000706)>> +endobj + +560 0 obj +<> +endobj + +561 0 obj +<>]/ID(node00000709)>> +endobj + +562 0 obj +<> +endobj + +563 0 obj +<>]/ID(node00000711)>> +endobj + +564 0 obj +<> +endobj + +565 0 obj +<>]/ID(node00000714)>> +endobj + +566 0 obj +<> +endobj + +567 0 obj +<>]/ID(node00000716)>> +endobj + +568 0 obj +<> +endobj + +569 0 obj +<>]/ID(node00000719)>> +endobj + +570 0 obj +<> +endobj + +571 0 obj +<>]/ID(node00000721)>> +endobj + +572 0 obj +<> +endobj + +573 0 obj +<>]/ID(node00000725)>> +endobj + +574 0 obj +<> +endobj + +575 0 obj +<>]/ID(node00000728)>> +endobj + +576 0 obj +<> +endobj + +577 0 obj +<>]/ID(node00000730)>> +endobj + +578 0 obj +<> +endobj + +579 0 obj +<>]/ID(node00000733)>> +endobj + +580 0 obj +<> +endobj + +581 0 obj +<>]/ID(node00000735)>> +endobj + +582 0 obj +<> +endobj + +583 0 obj +<>]/ID(node00000738)>> +endobj + +584 0 obj +<> +endobj + +585 0 obj +<>]/ID(node00000740)>> +endobj + +586 0 obj +<> +endobj + +587 0 obj +<>]/ID(node00000743)>> +endobj + +588 0 obj +<> +endobj + +589 0 obj +<>]/ID(node00000745)>> +endobj + +590 0 obj +<> +endobj + +591 0 obj +<>]/ID(node00000748)>> +endobj + +592 0 obj +<> +endobj + +593 0 obj +<>]/ID(node00000750)>> +endobj + +594 0 obj +<> +endobj + +595 0 obj +<>]/ID(node00000753)>> +endobj + +596 0 obj +<> +endobj + +597 0 obj +<>]/ID(node00000755)>> +endobj + +598 0 obj +<> +endobj + +599 0 obj +<>]/ID(node00000758)>> +endobj + +600 0 obj +<> +endobj + +601 0 obj +<>]/ID(node00000760)>> +endobj + +602 0 obj +<> +endobj + +603 0 obj +<>]/ID(node00000763)>> +endobj + +604 0 obj +<> +endobj + +605 0 obj +<>]/ID(node00000765)>> +endobj + +606 0 obj +<> +endobj + +607 0 obj +<>]/ID(node00000768)>> +endobj + +608 0 obj +<> +endobj + +609 0 obj +<>]/ID(node00000770)>> +endobj + +610 0 obj +<> +endobj + +611 0 obj +<>]/ID(node00000773)>> +endobj + +612 0 obj +<> +endobj + +613 0 obj +<>]/ID(node00000775)>> +endobj + +614 0 obj +<> +endobj + +615 0 obj +<>]/ID(node00000778)>> +endobj + +616 0 obj +<> +endobj + +617 0 obj +<>]/ID(node00000780)>> +endobj + +618 0 obj +<> +endobj + +619 0 obj +<>]/ID(node00000784)>> +endobj + +620 0 obj +<> +endobj + +621 0 obj +<>]/ID(node00000787)>> +endobj + +622 0 obj +<> +endobj + +623 0 obj +<>]/ID(node00000789)>> +endobj + +624 0 obj +<> +endobj + +625 0 obj +<>]/ID(node00000792)>> +endobj + +626 0 obj +<> +endobj + +627 0 obj +<>]/ID(node00000794)>> +endobj + +628 0 obj +<> +endobj + +629 0 obj +<>]/ID(node00000797)>> +endobj + +630 0 obj +<> +endobj + +631 0 obj +<>]/ID(node00000799)>> +endobj + +632 0 obj +<> +endobj + +633 0 obj +<>]/ID(node00000802)>> +endobj + +634 0 obj +<> +endobj + +635 0 obj +<>]/ID(node00000804)>> +endobj + +636 0 obj +<> +endobj + +637 0 obj +<>]/ID(node00000807)>> +endobj + +638 0 obj +<> +endobj + +639 0 obj +<>]/ID(node00000809)>> +endobj + +640 0 obj +<> +endobj + +641 0 obj +<>]/ID(node00000812)>> +endobj + +642 0 obj +<> +endobj + +643 0 obj +<>]/ID(node00000814)>> +endobj + +644 0 obj +<> +endobj + +645 0 obj +<>]/ID(node00000817)>> +endobj + +646 0 obj +<> +endobj + +647 0 obj +<>]/ID(node00000819)>> +endobj + +648 0 obj +<> +endobj + +649 0 obj +<>]/ID(node00000822)>> +endobj + +650 0 obj +<> +endobj + +651 0 obj +<>]/ID(node00000824)>> +endobj + +652 0 obj +<> +endobj + +653 0 obj +<>]/ID(node00000827)>> +endobj + +654 0 obj +<> +endobj + +655 0 obj +<>]/ID(node00000829)>> +endobj + +656 0 obj +<> +endobj + +657 0 obj +<>]/ID(node00000832)>> +endobj + +658 0 obj +<> +endobj + +659 0 obj +<>]/ID(node00000834)>> +endobj + +660 0 obj +<> +endobj + +661 0 obj +<>]/ID(node00000837)>> +endobj + +662 0 obj +<> +endobj + +663 0 obj +<>]/ID(node00000839)>> +endobj + +664 0 obj +<> +endobj + +665 0 obj +<>]/ID(node00000843)>> +endobj + +666 0 obj +<> +endobj + +667 0 obj +<>]/ID(node00000846)>> +endobj + +668 0 obj +<> +endobj + +669 0 obj +<>]/ID(node00000848)>> +endobj + +670 0 obj +<> +endobj + +671 0 obj +<>]/ID(node00000851)>> +endobj + +672 0 obj +<> +endobj + +673 0 obj +<>]/ID(node00000853)>> +endobj + +674 0 obj +<> +endobj + +675 0 obj +<>]/ID(node00000856)>> +endobj + +676 0 obj +<> +endobj + +677 0 obj +<>]/ID(node00000858)>> +endobj + +678 0 obj +<> +endobj + +679 0 obj +<>]/ID(node00000861)>> +endobj + +680 0 obj +<> +endobj + +681 0 obj +<>]/ID(node00000863)>> +endobj + +682 0 obj +<> +endobj + +683 0 obj +<>]/ID(node00000866)>> +endobj + +684 0 obj +<> +endobj + +685 0 obj +<>]/ID(node00000868)>> +endobj + +686 0 obj +<> +endobj + +687 0 obj +<>]/ID(node00000871)>> +endobj + +688 0 obj +<> +endobj + +689 0 obj +<>]/ID(node00000873)>> +endobj + +690 0 obj +<> +endobj + +691 0 obj +<>]/ID(node00000876)>> +endobj + +692 0 obj +<> +endobj + +693 0 obj +<>]/ID(node00000878)>> +endobj + +694 0 obj +<> +endobj + +695 0 obj +<>]/ID(node00000881)>> +endobj + +696 0 obj +<> +endobj + +697 0 obj +<>]/ID(node00000883)>> +endobj + +698 0 obj +<> +endobj + +699 0 obj +<>]/ID(node00000886)>> +endobj + +700 0 obj +<> +endobj + +701 0 obj +<>]/ID(node00000888)>> +endobj + +702 0 obj +<> +endobj + +703 0 obj +<>]/ID(node00000891)>> +endobj + +704 0 obj +<> +endobj + +705 0 obj +<>]/ID(node00000893)>> +endobj + +706 0 obj +<> +endobj + +707 0 obj +<>]/ID(node00000896)>> +endobj + +708 0 obj +<> +endobj + +709 0 obj +<>]/ID(node00000898)>> +endobj + +710 0 obj +<> +endobj + +711 0 obj +<>]/ID(node00000903)>> +endobj + +712 0 obj +<> +endobj + +713 0 obj +<>]/ID(node00000907)>> +endobj + +714 0 obj +<> +endobj + +715 0 obj +<>]/ID(node00000910)>> +endobj + +716 0 obj +<> +endobj + +717 0 obj +<>]/ID(node00000913)>> +endobj + +718 0 obj +<> +endobj + +719 0 obj +<>]/ID(node00000915)>> +endobj + +720 0 obj +<> +endobj + +721 0 obj +<>]/ID(node00000918)>> +endobj + +722 0 obj +<> +endobj + +723 0 obj +<>]/ID(node00000920)>> +endobj + +724 0 obj +<> +endobj + +725 0 obj +<>]/ID(node00000923)>> +endobj + +726 0 obj +<> +endobj + +727 0 obj +<>]/ID(node00000925)>> +endobj + +728 0 obj +<> +endobj + +729 0 obj +<>]/ID(node00000928)>> +endobj + +730 0 obj +<> +endobj + +731 0 obj +<>]/ID(node00000930)>> +endobj + +732 0 obj +<> +endobj + +733 0 obj +<>]/ID(node00000933)>> +endobj + +734 0 obj +<> +endobj + +735 0 obj +<>]/ID(node00000935)>> +endobj + +736 0 obj +<> +endobj + +737 0 obj +<>]/ID(node00000938)>> +endobj + +738 0 obj +<> +endobj + +739 0 obj +<>]/ID(node00000940)>> +endobj + +740 0 obj +<> +endobj + +741 0 obj +<>]/ID(node00000943)>> +endobj + +742 0 obj +<> +endobj + +743 0 obj +<>]/ID(node00000945)>> +endobj + +744 0 obj +<> +endobj + +745 0 obj +<>]/ID(node00000948)>> +endobj + +746 0 obj +<> +endobj + +747 0 obj +<>]/ID(node00000950)>> +endobj + +748 0 obj +<> +endobj + +749 0 obj +<>]/ID(node00000953)>> +endobj + +750 0 obj +<> +endobj + +751 0 obj +<>]/ID(node00000955)>> +endobj + +752 0 obj +<> +endobj + +753 0 obj +<>]/ID(node00000958)>> +endobj + +754 0 obj +<> +endobj + +755 0 obj +<>]/ID(node00000960)>> +endobj + +756 0 obj +<> +endobj + +757 0 obj +<>]/ID(node00000963)>> +endobj + +758 0 obj +<> +endobj + +759 0 obj +<>]/ID(node00000965)>> +endobj + +760 0 obj +<> +endobj + +761 0 obj +<>]/ID(node00000968)>> +endobj + +762 0 obj +<> +endobj + +763 0 obj +<>]/ID(node00000970)>> +endobj + +764 0 obj +<> +endobj + +765 0 obj +<>]/ID(node00000973)>> +endobj + +766 0 obj +<> +endobj + +767 0 obj +<>]/ID(node00000975)>> +endobj + +768 0 obj +<> +endobj + +769 0 obj +<>]/ID(node00000978)>> +endobj + +770 0 obj +<> +endobj + +771 0 obj +<>]/ID(node00000980)>> +endobj + +772 0 obj +<> +endobj + +773 0 obj +<>]/ID(node00000983)>> +endobj + +774 0 obj +<> +endobj + +775 0 obj +<>]/ID(node00000985)>> +endobj + +776 0 obj +<> +endobj + +777 0 obj +<>]/ID(node00000988)>> +endobj + +778 0 obj +<> +endobj + +779 0 obj +<>]/ID(node00000990)>> +endobj + +780 0 obj +<> +endobj + +781 0 obj +<>]/ID(node00000993)>> +endobj + +782 0 obj +<> +endobj + +783 0 obj +<>]/ID(node00000995)>> +endobj + +784 0 obj +<> +endobj + +785 0 obj +<><>]/ID(node00000998)>> +endobj + +786 0 obj +<> +endobj + +787 0 obj +<>]/ID(node00001000)>> +endobj + +788 0 obj +<> +endobj + +789 0 obj +<>]/ID(node00001003)>> +endobj + +790 0 obj +<> +endobj + +791 0 obj +<>]/ID(node00001005)>> +endobj + +792 0 obj +<> +endobj + +793 0 obj +<>]/ID(node00001008)>> +endobj + +794 0 obj +<> +endobj + +795 0 obj +<>]/ID(node00001010)>> +endobj + +796 0 obj +<> +endobj + +797 0 obj +<>]/ID(node00001013)>> +endobj + +798 0 obj +<> +endobj + +799 0 obj +<>]/ID(node00001015)>> +endobj + +800 0 obj +<> +endobj + +801 0 obj +<>]/ID(node00001021)>> +endobj + +802 0 obj +<> +endobj + +803 0 obj +<>]/ID(node00001024)>> +endobj + +804 0 obj +<> +endobj + +805 0 obj +<>]/ID(node00001026)>> +endobj + +806 0 obj +<> +endobj + +807 0 obj +<>]/ID(node00001030)>> +endobj + +808 0 obj +<> +endobj + +809 0 obj +<>]/ID(node00001033)>> +endobj + +810 0 obj +<> +endobj + +811 0 obj +<>]/ID(node00001035)>> +endobj + +812 0 obj +<> +endobj + +813 0 obj +<>]/ID(node00001038)>> +endobj + +814 0 obj +<> +endobj + +815 0 obj +<>]/ID(node00001040)>> +endobj + +816 0 obj +<> +endobj + +817 0 obj +<>]/ID(node00001043)>> +endobj + +818 0 obj +<> +endobj + +819 0 obj +<>]/ID(node00001045)>> +endobj + +820 0 obj +<> +endobj + +821 0 obj +<>]/ID(node00001049)>> +endobj + +822 0 obj +<> +endobj + +823 0 obj +<>]/ID(node00001052)>> +endobj + +824 0 obj +<> +endobj + +825 0 obj +<>]/ID(node00001054)>> +endobj + +826 0 obj +<> +endobj + +827 0 obj +<>]/ID(node00001058)>> +endobj + +828 0 obj +<> +endobj + +829 0 obj +<>]/ID(node00001060)>> +endobj + +830 0 obj +<> +endobj + +831 0 obj +<>]/ID(node00001063)>> +endobj + +832 0 obj +<> +endobj + +833 0 obj +<>]/ID(node00001065)>> +endobj + +834 0 obj +<> +endobj + +835 0 obj +<>]/ID(node00001068)>> +endobj + +836 0 obj +<> +endobj + +837 0 obj +<>]/ID(node00001070)>> +endobj + +838 0 obj +<> +endobj + +839 0 obj +<>]/ID(node00001073)>> +endobj + +840 0 obj +<> +endobj + +841 0 obj +<>]/ID(node00001075)>> +endobj + +842 0 obj +<> +endobj + +843 0 obj +<>]/ID(node00001078)>> +endobj + +844 0 obj +<> +endobj + +845 0 obj +<>]/ID(node00001080)>> +endobj + +846 0 obj +<> +endobj + +847 0 obj +<>]/ID(node00001084)>> +endobj + +848 0 obj +<> +endobj + +849 0 obj +<>]/ID(node00001086)>> +endobj + +850 0 obj +<> +endobj + +851 0 obj +<>]/ID(node00001089)>> +endobj + +852 0 obj +<> +endobj + +853 0 obj +<>]/ID(node00001091)>> +endobj + +854 0 obj +<> +endobj + +855 0 obj +<>]/ID(node00001095)>> +endobj + +856 0 obj +<> +endobj + +857 0 obj +<>]/ID(node00001097)>> +endobj + +858 0 obj +<> +endobj + +859 0 obj +<>]/ID(node00001100)>> +endobj + +860 0 obj +<> +endobj + +861 0 obj +<>]/ID(node00001102)>> +endobj + +862 0 obj +<> +endobj + +863 0 obj +<>]/ID(node00001105)>> +endobj + +864 0 obj +<> +endobj + +865 0 obj +<>]/ID(node00001107)>> +endobj + +866 0 obj +<> +endobj + +867 0 obj +<>]/ID(node00001110)>> +endobj + +868 0 obj +<> +endobj + +869 0 obj +<>]/ID(node00001112)>> +endobj + +870 0 obj +<> +endobj + +871 0 obj +<>]/ID(node00001116)>> +endobj + +872 0 obj +<> +endobj + +873 0 obj +<>]/ID(node00001119)>> +endobj + +874 0 obj +<> +endobj + +875 0 obj +<>]/ID(node00001121)>> +endobj + +876 0 obj +<> +endobj + +877 0 obj +<>]/ID(node00001125)>> +endobj + +878 0 obj +<> +endobj + +879 0 obj +<>]/ID(node00001129)>> +endobj + +880 0 obj +<> +endobj + +881 0 obj +<>]/ID(node00001132)>> +endobj + +882 0 obj +<> +endobj + +883 0 obj +<>]/ID(node00001134)>> +endobj + +884 0 obj +<> +endobj + +885 0 obj +<>]/ID(node00001138)>> +endobj + +886 0 obj +<> +endobj + +887 0 obj +<>]/ID(node00001141)>> +endobj + +888 0 obj +<> +endobj + +889 0 obj +<>]/ID(node00001143)>> +endobj + +890 0 obj +<> +endobj + +891 0 obj +<>]/ID(node00001147)>> +endobj + +892 0 obj +<> +endobj + +893 0 obj +<>]/ID(node00001150)>> +endobj + +894 0 obj +<> +endobj + +895 0 obj +<>]/ID(node00001152)>> +endobj + +896 0 obj +<> +endobj + +897 0 obj +<>]/ID(node00001155)>> +endobj + +898 0 obj +<> +endobj + +899 0 obj +<>]/ID(node00001157)>> +endobj + +900 0 obj +<> +endobj + +901 0 obj +<>]/ID(node00001161)>> +endobj + +902 0 obj +<> +endobj + +903 0 obj +<>]/ID(node00001164)>> +endobj + +904 0 obj +<> +endobj + +905 0 obj +<>]/ID(node00001166)>> +endobj + +906 0 obj +<> +endobj + +907 0 obj +<>]/ID(node00001170)>> +endobj + +908 0 obj +<> +endobj + +909 0 obj +<>]/ID(node00001173)>> +endobj + +910 0 obj +<> +endobj + +911 0 obj +<>]/ID(node00001175)>> +endobj + +912 0 obj +<> +endobj + +913 0 obj +<>]/ID(node00001178)>> +endobj + +914 0 obj +<> +endobj + +915 0 obj +<>]/ID(node00001180)>> +endobj + +916 0 obj +<> +endobj + +917 0 obj +<>]/ID(node00001183)>> +endobj + +918 0 obj +<> +endobj + +919 0 obj +<>]/ID(node00001185)>> +endobj + +920 0 obj +<> +endobj + +921 0 obj +<>]/ID(node00001188)>> +endobj + +922 0 obj +<> +endobj + +923 0 obj +<>]/ID(node00001190)>> +endobj + +924 0 obj +<> +endobj + +925 0 obj +<>]/ID(node00001193)>> +endobj + +926 0 obj +<> +endobj + +927 0 obj +<>]/ID(node00001195)>> +endobj + +928 0 obj +<> +endobj + +929 0 obj +<>]/ID(node00001198)>> +endobj + +930 0 obj +<> +endobj + +931 0 obj +<>]/ID(node00001200)>> +endobj + +932 0 obj +<> +endobj + +933 0 obj +<>]/ID(node00001203)>> +endobj + +934 0 obj +<> +endobj + +935 0 obj +<>]/ID(node00001205)>> +endobj + +936 0 obj +<> +endobj + +937 0 obj +<>]/ID(node00001208)>> +endobj + +938 0 obj +<> +endobj + +939 0 obj +<>]/ID(node00001210)>> +endobj + +940 0 obj +<> +endobj + +941 0 obj +<>]/ID(node00001213)>> +endobj + +942 0 obj +<> +endobj + +943 0 obj +<>]/ID(node00001215)>> +endobj + +944 0 obj +<> +endobj + +945 0 obj +<>]/ID(node00001218)>> +endobj + +946 0 obj +<> +endobj + +947 0 obj +<>]/ID(node00001220)>> +endobj + +948 0 obj +<> +endobj + +949 0 obj +<>]/ID(node00001224)>> +endobj + +950 0 obj +<> +endobj + +951 0 obj +<>]/ID(node00001226)>> +endobj + +952 0 obj +<> +endobj + +953 0 obj +<>]/ID(node00001229)>> +endobj + +954 0 obj +<> +endobj + +955 0 obj +<>]/ID(node00001231)>> +endobj + +956 0 obj +<> +endobj + +957 0 obj +<>]/ID(node00001234)>> +endobj + +958 0 obj +<> +endobj + +959 0 obj +<>]/ID(node00001236)>> +endobj + +960 0 obj +<> +endobj + +961 0 obj +<><>]/ID(node00001239)>> +endobj + +962 0 obj +<> +endobj + +963 0 obj +<>]/ID(node00001241)>> +endobj + +964 0 obj +<> +endobj + +965 0 obj +<>]/ID(node00001245)>> +endobj + +966 0 obj +<> +endobj + +967 0 obj +<>]/ID(node00001248)>> +endobj + +968 0 obj +<> +endobj + +969 0 obj +<>]/ID(node00001251)>> +endobj + +970 0 obj +<> +endobj + +971 0 obj +<>]/ID(node00001253)>> +endobj + +972 0 obj +<> +endobj + +973 0 obj +<>]/ID(node00001258)>> +endobj + +974 0 obj +<> +endobj + +975 0 obj +<>]/ID(node00001261)>> +endobj + +976 0 obj +<> +endobj + +977 0 obj +<>]/ID(node00001263)>> +endobj + +978 0 obj +<> +endobj + +979 0 obj +<>]/ID(node00001267)>> +endobj + +980 0 obj +<> +endobj + +981 0 obj +<>]/ID(node00001270)>> +endobj + +982 0 obj +<> +endobj + +983 0 obj +<>]/ID(node00001272)>> +endobj + +984 0 obj +<> +endobj + +985 0 obj +<>]/ID(node00001275)>> +endobj + +986 0 obj +<> +endobj + +987 0 obj +<>]/ID(node00001277)>> +endobj + +988 0 obj +<> +endobj + +989 0 obj +<><>]/ID(node00001280)>> +endobj + +990 0 obj +<> +endobj + +991 0 obj +<>]/ID(node00001282)>> +endobj + +992 0 obj +<> +endobj + +993 0 obj +<><>]/ID(node00001285)>> +endobj + +994 0 obj +<> +endobj + +995 0 obj +<>]/ID(node00001287)>> +endobj + +996 0 obj +<> +endobj + +997 0 obj +<><>]/ID(node00001290)>> +endobj + +998 0 obj +<> +endobj + +999 0 obj +<>]/ID(node00001292)>> +endobj + +1000 0 obj +<> +endobj + +1001 0 obj +<>]/ID(node00001296)>> +endobj + +1002 0 obj +[21 0 R 21 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R] +endobj + +1003 0 obj +[51 0 R 53 0 R 55 0 R 55 0 R 57 0 R 59 0 R 59 0 R 61 0 R 63 0 R 65 0 R 67 0 R 69 0 R 71 0 R 73 0 R 75 0 R 77 0 R 79 0 R 81 0 R 83 0 R 85 0 R 87 0 R 89 0 R 91 0 R 93 0 R 95 0 R 97 0 R 99 0 R 101 0 R 103 0 R 105 0 R 107 0 R 109 0 R 111 0 R 113 0 R 115 0 R 117 0 R 119 0 R 121 0 R 123 0 R 125 0 R 127 0 R 129 0 R 131 0 R 133 0 R 135 0 R 137 0 R 139 0 R 141 0 R 143 0 R 145 0 R 147 0 R 149 0 R 151 0 R 153 0 R 155 0 R 157 0 R 159 0 R 161 0 R 163 0 R 165 0 R 167 0 R 169 0 R 171 0 R 173 0 R 175 0 R 177 0 R 179 0 R 181 0 R] +endobj + +1004 0 obj +[183 0 R 188 0 R 190 0 R 192 0 R 194 0 R 197 0 R 200 0 R 202 0 R 204 0 R 206 0 R 208 0 R 211 0 R 213 0 R 215 0 R 217 0 R 219 0 R 221 0 R 223 0 R 225 0 R 227 0 R 229 0 R 231 0 R 233 0 R 235 0 R 237 0 R 239 0 R 241 0 R 241 0 R 243 0 R 245 0 R 247 0 R 249 0 R 251 0 R 253 0 R 255 0 R 257 0 R 259 0 R 261 0 R 263 0 R 265 0 R 267 0 R 269 0 R 271 0 R 273 0 R 275 0 R 277 0 R 279 0 R 281 0 R 283 0 R 285 0 R 287 0 R 289 0 R 291 0 R 293 0 R 295 0 R 297 0 R 299 0 R 301 0 R 303 0 R 305 0 R 307 0 R 309 0 R 311 0 R 313 0 R 315 0 R 317 0 R 319 0 R 321 0 R 323 0 R 325 0 R 327 0 R 329 0 R 331 0 R 333 0 R] +endobj + +1005 0 obj +[335 0 R 337 0 R 339 0 R 341 0 R 343 0 R 345 0 R 347 0 R 349 0 R 351 0 R 353 0 R 355 0 R 357 0 R 359 0 R 361 0 R 363 0 R 365 0 R 367 0 R 369 0 R 371 0 R 373 0 R 375 0 R 377 0 R 379 0 R 381 0 R 383 0 R 385 0 R 387 0 R 389 0 R 391 0 R 393 0 R 395 0 R 397 0 R 399 0 R 401 0 R 403 0 R 405 0 R 407 0 R 409 0 R 411 0 R 413 0 R 415 0 R 417 0 R 419 0 R 421 0 R 423 0 R 425 0 R 427 0 R 429 0 R 431 0 R 433 0 R 435 0 R 437 0 R 439 0 R 441 0 R 443 0 R 445 0 R 447 0 R 449 0 R 451 0 R 453 0 R 455 0 R 457 0 R 459 0 R 461 0 R 463 0 R 465 0 R 467 0 R 469 0 R 471 0 R] +endobj + +1006 0 obj +[473 0 R 475 0 R 477 0 R 479 0 R 481 0 R 483 0 R 485 0 R 487 0 R 489 0 R 491 0 R 493 0 R 495 0 R 497 0 R 499 0 R 501 0 R 503 0 R 505 0 R 507 0 R 509 0 R 511 0 R 513 0 R 515 0 R 517 0 R 519 0 R 521 0 R 523 0 R 525 0 R 527 0 R 529 0 R 531 0 R 533 0 R 535 0 R 537 0 R 539 0 R 541 0 R 543 0 R 545 0 R 547 0 R 549 0 R 551 0 R 553 0 R 555 0 R 557 0 R 559 0 R 561 0 R 563 0 R 565 0 R 567 0 R 569 0 R 571 0 R 573 0 R 575 0 R 577 0 R 579 0 R 581 0 R 583 0 R 585 0 R 587 0 R 589 0 R 591 0 R 593 0 R 595 0 R 597 0 R 599 0 R 601 0 R 603 0 R 605 0 R 607 0 R 609 0 R] +endobj + +1007 0 obj +[611 0 R 613 0 R 615 0 R 617 0 R 619 0 R 621 0 R 623 0 R 625 0 R 627 0 R 629 0 R 631 0 R 633 0 R 635 0 R 637 0 R 639 0 R 641 0 R 643 0 R 645 0 R 647 0 R 649 0 R 651 0 R 653 0 R 655 0 R 657 0 R 659 0 R 661 0 R 663 0 R 665 0 R 667 0 R 669 0 R 671 0 R 673 0 R 675 0 R 677 0 R 679 0 R 681 0 R 683 0 R 685 0 R 687 0 R 689 0 R 691 0 R 693 0 R 695 0 R 697 0 R 699 0 R 701 0 R 703 0 R 705 0 R 707 0 R 709 0 R] +endobj + +1008 0 obj +[711 0 R 713 0 R 715 0 R 717 0 R 719 0 R 721 0 R 723 0 R 725 0 R 727 0 R 729 0 R 731 0 R 733 0 R 735 0 R 737 0 R 739 0 R 741 0 R 743 0 R 745 0 R 747 0 R 749 0 R 751 0 R 753 0 R 755 0 R 757 0 R 759 0 R 761 0 R 763 0 R 765 0 R 767 0 R 769 0 R 771 0 R 773 0 R 775 0 R 777 0 R 779 0 R 781 0 R 783 0 R 785 0 R 785 0 R 787 0 R 789 0 R 791 0 R 793 0 R 795 0 R 797 0 R 799 0 R 801 0 R 803 0 R 805 0 R 807 0 R 809 0 R 811 0 R 813 0 R 815 0 R 817 0 R 819 0 R 821 0 R 823 0 R 825 0 R 827 0 R 829 0 R 831 0 R 833 0 R 835 0 R 837 0 R 839 0 R 841 0 R] +endobj + +1009 0 obj +[843 0 R 845 0 R 847 0 R 849 0 R 851 0 R 853 0 R 855 0 R 857 0 R 859 0 R 861 0 R 863 0 R 865 0 R 867 0 R 869 0 R 871 0 R 873 0 R 875 0 R 877 0 R 879 0 R 881 0 R 883 0 R 885 0 R 887 0 R 889 0 R 891 0 R 893 0 R 895 0 R 897 0 R 899 0 R 901 0 R 903 0 R 905 0 R 907 0 R 909 0 R 911 0 R 913 0 R 915 0 R 917 0 R 919 0 R 921 0 R 923 0 R 925 0 R 927 0 R 929 0 R 931 0 R 933 0 R 935 0 R 937 0 R 939 0 R 941 0 R 943 0 R 945 0 R 947 0 R 949 0 R 951 0 R 953 0 R 955 0 R 957 0 R 959 0 R 961 0 R 961 0 R 963 0 R] +endobj + +1010 0 obj +[965 0 R 967 0 R 969 0 R 971 0 R 973 0 R 975 0 R 977 0 R 979 0 R 981 0 R 983 0 R 985 0 R 987 0 R 989 0 R 989 0 R 991 0 R 993 0 R 993 0 R 995 0 R 997 0 R 997 0 R 999 0 R 1001 0 R] +endobj + +1011 0 obj +<> +endobj + +1012 0 obj +<> +endobj + +1013 0 obj +<> +endobj + +1014 0 obj +<>/StructTreeRoot 18 0 R/ViewerPreferences<>/Lang(en-US)>> +endobj + +1015 0 obj +<> +stream +x E?~zf{_=G{wgwgvffwll6K2I(|]PQh@ШI_UquQAP߭MsNuOUwo:uΩY@ # ґl~Sc(]wϞyܧm܆?c'W`mM[v>wy 4y6P)~w + jOo^eײg=߼ar~hݼyäi%h$6oٱwXjjݤl=Lf{{ :ev5;ȭ umWok` a0`5l+ `$r3`>Nz!O@XG(2f˰VA4Z(0 0` &2Myo +j ݰ &` 0K,\Bf9lc`u:h[ 8pWmGR+a=ڡpAsE0zfU 2a4A pI X;`=4}[0]j0`l `ܽμ !8gGN!0" L!֎B"^:w"F DvEVY` $dB ߁oܧEvn&Ed֞@Ȧ #zk#&GD=homddx}a4,髍,\쭍 @gGg3Q Hu0*lmeq#+:\|%etk99B%eۭed1q;=xá#e=솞L2303_5;hގk3ՀEKG@d8SsHߤo=:`?6xyw vUs!4v_0 +5 ywP r8 Mk +P].F{Ci2u>ɼWK_Gf^UN\?ww{Ѿ!P#\/<) <~_MzވÀqm#ˆ^|ђŋ._9wNG{[kK&LcȒSkZ?>(֖-`4ʩ2֖I偝kG |owPBoWhrM|è '8'}lIO/  3zͺʶ2ke\Fyۍ|Q.]q\5^f&'2(+rm\yoC}r}5/^6T&qe(__3Yͱ%嗁&TF3Pf{6ھhr"\P-|6gLZZrlD%gJfo_Ү_[۹[P_̿dْe&uqrx__b_.NVp.\[Fk/0 me-S`A಑qme kU*g(_F}i]Ǡ@~px0A({Lv1e490A{).kReIꙋi$g3A{lIeK2YfrVH{G\z,2E w0VuX +Ty&yue9*U cJUu>1Ţ5)bFْ8;hf^e2F84NF6wH|%foWd*eճ2]>^f0F=T㋩7Spn|pmpq]P9||COYn]ɷ|6SFn@?V"JV YiGNai>HNýp79 s8L‡cp!|%?}L?#?OSfG~g?A$x>Ie>< g||eyx;ϒqx/)x>ONfEЃUENC +2#7 ,@aED1$,D),B Xpj%Gb4h 9F,Cȣ0.&r|F +0@25!Gam"%rXO*<%| +V䓰|֢aBKA/A>ѻ`zlD$M،>J^=@+ЃCp%,9 [r*%؆B$y?\Iנ`.9עS佰CgȻa)G?'wn䝰7;`/yJn}h1&Fl#[1OMX"mEn `yr܊cpN #7샷<m-pK;q=d n\Ku^M6ÿfM6^>?F6'd=| +CR4~LgZx?NCKd5WI '*,&Yo(#q<1'd<FFq+_ "YO?eEg2_d1 Y +_fXr1|EUF"K8"%$ kL י8|3NMMM(Ra^L,` c͒Yb8l6elg9Xr<ݞjf5Y>ju%e9gS,8begqv +v;pUXJ/g- x XȂ 8x .9<,D;o8Mdb3X8L,gĂSApa;x@Sa*;ϳr*Xs c Dr@ +ix,Up+NYaSST $SV< T%:D]Yp(]Et: ;He bNƋdEUITT)@EE\)9$%D-I$8BUU5 ;gPX9,L[I* +BU9"z\ $o QrJ  |=@r\@X<2˳iL,~j8Q|*.WjU,ʲ*2&8KlA&AERfg,q\.UWdM$*dU; ETdRBQAX\X /prBzh YTš((WQU!:z H4'gA@Ω̒iC!]sUEwe] x.UJQ%UU=@SU٣(,Xx<OHPu7= 8Q%Dxܺץ=VC^Kx"WR]%\vp*oNYr)>U_7y<^o2Tap985K, x +:_h.QX!i3X(|xRG9]f/ZG}xUtUD]&t]EE]T#wEPNNϒY$>oͧG!/^?jUv+ntgveUuz ( S(+Y` }A;th~= +XY,tV9L>|ǭo +#\c ~A4,%z ǂ~#&y#x" @(@Z/ \R: ]n-Kc Dm>ݣUCqdVdHCR5DCx2 F`!9 +n' }'m]dRrAĩ,&FR5r(f␈ĪU1 "JΈFψd1tkNoF(ՂCLtI,6=Neڌ+R-7&!f Yʈ1_,@Uq_6FxQ]]}}oTYz!-{Pj̒LSm*ۤS 4kMP_*YIksҵ55h8lMbr|~ `s0Q, "elOeB3r%Gw槟/Uٝt-N?O@:VE geT^#cYoK =9ڎE D1 Kփ=Fτ-٢=6ϰX -,.X!WN G`kx {7&0=UR;$z4P*ɧNḾQi{t@ud^>oʭ.45[,s>գ>>wK}xz+:9aY6GѾ)OM4[<2ED6d , s=H@€ fQ6[fW>ޔQacN)*F^n|\1$8ybM5qBT~KTSUY…mnustakoxw*Lzxޓ Snz _xhU/<<u67| Ka 0`8MncQf1%1" ( qa@wwڑ}T:AELT:?S:A娋i+(qED@ͽPxQ'dbu)P1_F#kC1O<qƧxO6SV~A*Lt^*'K )9"FhŴPUSGoùΐ7| H;3|2ME Wΰ6nm ?>{;iR{}M;é1k1rH5YoJ[훠j/?]{M?u"ϔrX#zoc)Z"A53o+c@g{3/zj"szܵKEpi71'ؘnk]&vk$=]+sUߵwP˂ڋ4ؼ(i  3.pLZyVFg + J0HgA#j"6pV tOJ%s|)D\JED[6ԝ݋{Yw% vuO}[꯺v:@V#vXW(Y[aQ& +CGɱ!ZX0m )l[LR;S23SSSyKM$Ż EP /^L-WyMmoYG׿r^ܲ+8l{ 0$ɋXǏ +Y-$kuEw6IM5M 9rj6$-†)9SW:NX6-ZSiSD(ǦJi #:1w!"5a_#j篜]ٵ]|l#V݈8"\@7jmGsfy_=em(2@Jhd?"?nVlI!N䈼Ff8V =6SԜ(t1mі.2T[_|{迌 uiߕ>(U4yD P1{W'uE@+Fz2\{R$bm౦7X BTSTJV{eƸxfY+ ifu4g*(ux`\F;G獵 +o*МM`1nx܆g;ؗGsC|mL,j[{or'z; >$z]Ӛ i'9(îK|$&pʺ`lxj Q+mf8mwe0[Z[[TLddN(Š'@ֆ r^P篚 ̙],c@aItgR['y{c(WCoc 2: $R˱@@FTЃCņf䎸1qX#s M-;b.䓙|F>5vtdK~)ԥP(An 9:jFK_^(\?&;ކ ˞Tcƨ5wٚE>{!= !ol^ry9>3ר("@b]\ZdDd&Q؊"u|aqbX@EcXka5ţ X:nMUu#uֺFhMCMӥ3S|>{ =CRt)S!.)OQaIRiyQ4id1sWU0N7y(uEW}o~dn4Z,͝2R[ _hucM}Cر{pU\ƚ;t򾺈jE5ZY҅YwumZX?4wyi[ͩ嚫^]n_Rs͢'BNFFpA^܍05"Q&& H$KhB.u2N$9#Npfw;ɉ,,rsj[ѰQ".0EC&b'NB\݅ե,d$Nx+Y}{-?.?|ϖ'R֔6tTDljaƃD-42Cށ=VOဖXJ-Il'?8O|qJ}_"'MjaQ>> : +mr} )ZϲN4s4H ;"Ζ:cK%y:3L~)g4^W T<]=l,j>/wuSUC C={xV ^dإ5v։?l|+ZlEm`\Ӛ.Y[>ɋx>qh-E &%{>!*cE)|&[dwFΩxNz'n]% mMzvIkpf'>@)TT[eygn3 mfPH? 8)#Av}EjYw6^Z+ ĿBڵۯVI޻n[kuܾlC2^ +c<[@\|.&%a; '.u0"EAc>H>{w:%ϼ3_GR|[Te#`błY?obFX̱,sAl>CȮ.чr|yPз /#7韘}k}W15}dw%$b'N% +#pDjG+lF  +-`ΟoXyKZWlZڑ< +#Qn/cTDbA`erpns2v[a`ւ,d0GA75LЧ3g5آJ\)(Qӯ>l(5|d'¯.Vu c+Su +fftyx/@G6 pAA~@hʵF-5Ң8c]WC5U,y~ +0e3Y/۟ҲjoYھfo?=es cBad;8q偉W 4#zc{Rq26pshۊ>_]QAz\Bի.2nQez?冽W?s7cPcq? }Wܦ,P\wnT~F M^o9y@& ׬)L:S(pnN}ȕ.:\ҬK.O^u•~¥@\j{o)d~&XQ,=})ږT!6;"EזEYXXkw*3;甔R WLQ%jWFf(7sB]D.3ŋc}D &5oqQGXYy˱#.j ='bb+YnP82|XHu;0}Jěp gÃ6>w)G%$[>roflEtJJQw}K}>vyU`:P*duprhC)(UYxy+ v,8R]azhzuܤ<}tzxƅ5>Y\tDCV7 77r˂Dqk{-+,g`aX; XTYAY=8)XL}ΟYЯVɣPU"âpd>@,"qFA"HA1O k(F_pӍk܌FnĿ|>^рjut\^uԧt$ZؘL*(@B '"AUT}BB%D$) 2 /PHBV߉Fj |@t/UIS%QRzxHJTjDFp9">+5qsE]/q9Au~[]*. gK۽ϖ +m9n?כL.͗9m>-m~naSxqdg?_xalY$D5f|E[]}pY/ڏݷWi֍5G|'m~8$Yba5 Z>D-0qל<_:q9e-gL4 +ω&+} Gե9J\iDBwoOck۾{{3 q2Mؑd+ST-0\ѐk(60 ОMb( սB}hf4kSt_=c('9?ѹ]!w{>I=!ɠ #Fk(j;R.gbj< 5M+Rk{rŔbFeV0@^Y x B;#ǰ0 {vGxDfs+BoeBJrVvLx[i{D!+9q~`nGvi_1';afi+'ӯ +*K Et +!=Ś./c9M{1"H=a]scxUTrfVs`jH/ D#z>3ޒ@__AldžxXֻb^-șECy .-nN"af>VqF ˏƌ9fQoʩ ).UW=DYi;5O br45w 84:#MCH_`$;mgM-]4r/xEABJ +F?S]Ph$!nOT>FiQ1o:+t X.C1 +T\(=%WWĢt\ZDъtx* IVBlCf`en[1~кXԧ9jڃ .돢H fಁm7;#VIƕJ0骮N~@(!HdD2VxyT ;ʀbMU\J' %@9F3!*Es+pHG]p +w.魸n.>~6"zuTvcN9#ƞ>VDV<3PS% tit~*ᭊ\ZaF*U_wB}.tbF9hM5[݁{ x*^Qnw ;KґY]b-kGpevG `hkcCۀ*TPj|Bmj@euG d^?[x#`'kF_i`@@!NJnmay[X:Чw< 2J:$$-Żjlv ^l1j|> e4Ӑ!I&fo%,pQ}V" 5?4+ؑ]y6ۭ/6:}v Ppxi6 t_c ^!1:+ΈW~֧Ň[6ty;t y ʼ EszM+pHQ v6! +{g'rFEivygC6ȟý޳_ 2!4>zP- 4p`n߰RRKi̥am EQkSA)LizեJf W7]UPHWhSA \P1Ω ZQQcVn i9t=Ύcp%([tD1nM"S+~{'HhvJ5 :tUUq\b\ED1 ϘBcVJ33M~l*Dߚsk;j+ 6umZXSpSW]Kv5 ;[ #܅~ƌyHY~L +o6^RV&txWxΊH쬈OdwgpbzFmr^nCPv={11"#V۩sͩ(a%bjڶ1tؑ3#mXXCu'{f>P YT]СڀS쎙!17ͳxDQ`ʗݤF4fK#9A`eEce)i"zn/yHUe +qH0Rˆ 9kMÚ?V3\YS//5gXؓ[H'ڻ]x*OJGEU::/ddA_bJPj3'f\uր;?*aN|kc ֵq?/5`S#ަbRK ]!{Ԁ [SV(Nɮkыߣ{'A9Ew!pÃ=ln}) @Y=sT6s_VfC<{ ʹwX<XheEuUan[,{Dg8?9I,'㥕{jƆE]ud hMI$$I::oԐMCڀ5 o%[:$I?b}gMI: 16oI?0HI᫳~N}WKv|i;}'G~M섊97"tۡ5d\ytJNs{vg2_5.yߒ}%+WM$#V^2[2#'! xP2򈈳#Cq .2vʨX()y"եHE"V82g^[-[ &`Ê R!`CI7o'؀-0g5< +*$B^ hXP 1Ra֏8%< T^Y%ݪVs{љ/% JflkhfedmՠBe3c.ft1m4> +endobj + +1017 0 obj +<>/W[0[500 0 0 240]9[705 0 356 356]15[246 340 246 437]29[246]34[455 974 721 672 648 737 606 574 702 734 316 529 684 563 897 756 790 644 0 667 582 614 707 722 948 0 661]68[553 604 500 604 584 422 594 589 289 0 579 316 862 589 607 604 604 422 485 444 589 550 784 554 547 500]262[708 0 736 1127]]/DW 568>> +endobj + +1018 0 obj +<> +stream +x]ϊ0yCIVZ+x?dtk 1=3Ų{H7c&5?zcYsmTxjhEu)PndYƹL|sc [&޽ol72Qߝl91Q6 ,Ul0a݊5;1rDnԨarX&9ʲ,sV{Ow1;y&e,sQHBL$:J`C}v4ҍ)R8FJ]RљlF$i-2Le:rul㘗 /p[ a +endstream +endobj + +1019 0 obj +<> +stream +xX\Uy 303 0D4Gқ&X ?D@1UiߋfRkԶ6Vۮn7VS-ep;Hq?9Ϝ9)+;rukRNMNʚ"|39izh wp׌Gqc9nftB/m0#ƺ٘\5\)ǬF +H+@vɸ˾:e-x48#G`ݿ~|eF c?=7z-檙+x+\ +tC*fSQE(B.~T!X*,DnB!}7q|T XR480@&b9P",AQQp` +c1[YUQ)@)J0 +c=5EX%X GoD_90`J\AK&F |}T%Jd%iYB# 7ѰD6] + a +xAqb4bzm6͘mzih&E3y!%aLH2 +d2fr ̍ +d[A)\oA +IG5'/?0Y*4tWiq +6S&!.VMeYՀm^UŶyμy=y%1a3VghGT->CCE_0TzF\u{-nuۡj?j #m Ffjk ~][o W>\ 4)#yt%"GSF3Yv&$Y{l,}Mޱ_->wrQΩ%O6=dמO9tLcrŴm?hw}ݏvXYYUpUr#y 2dB^haPlVKHNV!LwUvwNMOk~Zutc!Vb3V6 l$e;wrY{=D뙡:4c%gtFHLWqWEK;(50(.Dc'N5*CZWdXgتmGX0hJ/lQli+mphN46ŌܢzE^&%x)Z76, >:HCÑH(KA<<jZ5^I7mucuH{1Q.wtu>s;YAr;ohR+`:+bq sJݸq^ԬSgn:tyť eYOM/{ѧ$'/w/>P|¶Ul>k_r9Ş!(DF˙܋uĉ VQ̈́?ˏ 8(ehS?o7>cʓ >/h(wZXsW/aj]G__q ÛړSG,0e'[3*Uk(##zcF1inZd>flXe{SDS}cݣ˗;ٹ7lTݹCk_xrľQG[+Z^S|yM $(o0$1qژHVHop&kWalp;bcm@t+Q'l'_hML Ķ)<"} $6 ²g5d:6?+L/b) ̔{/ CfUVإ#I>yB13RKΤI2xa6lV>|bӟ X&[~`ffuS-Hfc;ŶݻD&OG7>z{.\= dp'12&$Bg"4FGmK8qk4Ġ + VF f}ONƤ:R='8=lG3;6;2q} [7 n(: +ʘJGs}mZZ3}gKWݗ>fl;*uO|m| VV=g]]\VʾOl591OfD mgoճCZM>V[E +!K2M)}[WCpd ѕ跣/Eɘ&K-x6%(E\ +V!UX*tKY8Ew% T47jEh5}/.:9D8Ɇ]`ZԴqwk4oc> +endobj + +1021 0 obj +<>/W[0[600.09768 0 0 317.8711]20 28 636.23049 51[603.02737]68[612.79299 0 0 0 615.2344 0 634.7656]]/DW 0>> +endobj + +1022 0 obj +<> +stream +x]n <w@׶cqcR0$oMz|3@j~8#:0*-.fuaIi3J-Zn[<έ )KZpf#NSzív8HUđo@c٩Vw_E"40 t1VA4MS_HU(y%c削Ds'%Q9vc$x) k|xs}u*Ɔp~h +endstream +endobj + +1023 0 obj +<> +stream +xZM7 +:V/ !4!@.sfHm}kwhk=5Xh,R$)6/C`K19C4 Y l__o??̓3MilT چw7|;Mp&SNtܛ_y[^z}rÇw͏l=[&y[)G!yWwmry:U)א///́*#.x:uGm;cUH +e&ZR5 PQpXؽ; +.G(N]9t +0pHǍC8 1ʄV*Xxy{';\- >/z !3*BbwGj$LcRJ[V".^F@6،3e-I*:\w0FH/y#APb #g<2aހ7"_Ⱥ?b%#m$?) $ɐ3 +4yZ)\C-;NJ)J!㠔᠐tӲ؏ +w|Й+6^Y3e]T*Wgu SY} x<ď`L&I{cQpU۾ Al+xQܓu5 hwK4Y~&JyE&I7M%ڈ+ْNLslGq0l8Fb,5Zz{:<x MJCRt=#6#F G{E+'ѧ^NN hP +uܖ/;rYx]/oݮc>yL\.+yj5/֯ v)qjhaxӶmbⳜÅ@_g8Rv7U(8uWʺ^8T->ﲴAah\<:ŏ؇J<ū`R +J+SU ;+零QF(AڐiCQ!TǼ"#B]`0n#{IF9Lknw,mP{݋8Ns}~y>G|{nݽ0PTQF@"bPm\,8ep?)W6R)RLL;!ִ*qr1nFޝy̓);7CAρmP.9~j {܈K='YOwY턔r?-ð=qkvg{XsX+pX$Oz~DVpÿ-oM5Nխ +endstream +endobj + +1024 0 obj +<> +stream +x]mܶ+/aS |)ڟߡ=Qi}v%yÇ3]L'ϋ!Շ*RN{mrw1Ovϝ~B+#z)T/xz[^ۛ]0>vJfK~$/9)9?^yo:wo^onof:ۇNf9HhQHDw{)n|u/t|ڥ뮏~o2;=6p= ++WZ}PpoؾnBnXhn@t=I) fLEgqs΢Le PH{H0}R+L}hEC14bj ,D٬ȽFX @ <6GuL"tz?mZza']2Q#"='h_ߓ<p'/؊'·p_n!${gKCFQFmGk006_po{D𓹎b}Z@!_ Mf3!fҖ>ߠj}AFh,8ΚA-uoiY6IgP{76Lyt od|7cOE$9.">8“9ǗA39+<V/qՊaS\=1Z_f · ׁN 3V 2qA0>*]d(\c#*N%DLJA(LhF[ +gesA!\ xwbJM86YMj\;i*;Iq:fNVM|_ґ2f0oLϒ9/?̍r(pklupNpߔ;(W- lmCVB#-h43'cJ|eeF7&ya_M{ZCKֈ-4>4fNS)wVt)ceف-.0^dG+؋X‹¶7qit x,7!VȍD +pw~v{g%܀#Kļ [;E$)H" HN{$ZY|h"j`_a0DWMXHp_3-Bv_ 2 +:n&ҡ 6 +gE1q3KN<";a u:.HaDrpͱN q ; İò' +VǏdBm*4Eg +O?vHNUX"'c^%-JwqCУ:!]7.H XBsY *SV}BMcN]7| K!nL![DCdݔ2V +jVmZSbƼ艼X!z$?ZD9Bd1~|^FD1\\]*d Sn u}kk-"״,MV` ]@UrNj< ȨpÆQ_NƂ&m:+.D  ]bo(ĆeXfLˆIكtȎ`[rx_vy=!gOx:![F>ͳ ntxVG9ƪ"1aI̱ΥP/_$ىOR\kC v,[;&UEjǯk% )e8LNcs|-4?R 9{ ҆]!s}okXXbEa]QZ cGD]”V E {1%Y'l;U^r(.x3)(P4o%`Hnm- :'n#lũG!@Sg9i^ 7 I9 EZ{PV_"k_8"LKDu:P+@8"ykP~H6ln# +u+к[AhJ ՗l$oQE1$<̖&:N%l?UI`GqU4/$<gP8&irp_ ?owLWwqY, >ف;3s1[-ARl{$ u9߻; m:)0զ +endstream +endobj + +1025 0 obj +<> +stream +x]YF+|`M`!vy`paVI(*H0@Fϫ!9sHyM:h=XccMmSGwJW|ї^רCHM<{|oib 40% OҍlZV|xu5oBo}tޡ64kj;m +&ٓQGՓOqO[v0x bts c=iSQ!Fsd\ykݨgga+aa{aV>ða{hEA[eV1l/MudT^Jk +E| +Evò]Bѭv"@GB˺Q82ȁw8y=m=z]޼֡2Ϗp汸e"6PVyּV7iA|h^]ySyyR syn/EFЋX{=yM Tku^([^_ QfxaUy뎰Z~u + +xmLO* t[CvNs"rd,o_*D"38Af`̸ٝ*3LRXP ~z0=@=,x}ʶ{JksfR(vԳE#gfLvL6C vHE|]E]jY/& +lm ӾPq`HH=k +f[٬ Aq%3W-YJ ?YOa"CZZCT 8kiZk_UNRg%E:5:c$;WTp#mNҤS nvU볏Ӂp ]˛(bW&O抜L(^2w q2Hf $h@yZDP#Y5_RhXޞzD]"^T{FhҒ=je5i!  jԉBs!,ɐ#AL){9LLk> NVƶf,п-A|6kriRk6ŧ: {)Fn yKi';%5#7)X3EPXAI,*iN.CYd8jQVXK:8SJw=a™?xыhІRT6C92Qb Da:"o]0g,k8Մ$°7#\s!WbO.aB[4= m +3^Q|( Lb ~+a@Znh픊7xuQҧiS +fR!mw?ô]fKAsdOds$n> :IsV Iڗpcdey b8Z{c8[{c-D`67VRw +NHJAZ:5 +=4 +蓚¨L9@OE#\[m)(,Q ҶyUcihzqr#`ݝKӚŽ.dE^W+Jsm]^]!"+v6 ^kTBɱ]xmGϲ):xyB\)> +stream +x]n8DR܀ ,!,l;q 3)JrĶZUvҊ Bm$UHUt)xl`W䨜 a9;G3E}Un3dc|^g\u1SfTfTėX^?rtxqo~՛/U wpYgS ˿1A'kur 61,')'8N~4vydԄwndD_u~N-g3xﴁRW3aHkMag1]ufl0;㬫JHJ"@V9?5c߷B8k!/ !a7"ΐ}"!kFVG5IIoK%ن>s\Wl^UrOrsZ'K'OYrv2"_CԇϙZ!|QHPǙ'|) +nV9vK c'A^\>:e^Cr2-IB95oy9X63) LbEH'&aT 2) Iu3㫫G"2!d/ssphwPhBkF% 2&-0ek]$R><98>朰N%R!Pd] $Fو{U< KV{߻c`d2,`Emu8AϘ|f6HHc#-nhA9LLtX_0X,$tY& y- g2 Xuk2)=o]%VB3Va|T U%ۃ"KAo0؜(Mk/NquPqרC.L>09hJmc. fkW&+tiɤl $sa׵]mAd.Bص] ]Lq90\[EhsޅC [ !5C!ҫzgMy_ pçkc4aF1)h0tm#6dR$:mrt|+0k6y6x&ux#icqQa0iܘl&wmJ0s:mrIK48Ns20g&IJ\+.]{du]Ju]$?ۢkbC! bSi[fk|`Rz)M>-ʽTL&͢Mn0ηlslg;˛Gk d3Ui3Vz<㞹.-]|/$~oI&L۷-m+jksM^MLF]u]yh4oJ <M`ԵǛd11*MZaegEOM+.]Ki,uU!*N ]X1ø#Bԗw94/Y{T闠0˟3fQɹɜ>4D@y؄őm@"λm':| +endstream +endobj + +1027 0 obj +<> +stream +x]K7+>#W!!?7_`#y;n?ocAY|S|P=Qs=5N06xh~)4SUIy ZŘ9w }ؔigNοAxI^9y1yҙ(?[-@9G9VK_~۳gWo_J_z^\_╱0_u@[yin_\ :9TW倿-C&r .S; W۩xo4>:^'vJ{V]%4l?6󾴿~Rf;8Q$pYqsz֤\ЌB>ɌЈ>ʆ6 \ط<[tˌ}; k4 !{j~Ap胝#Kv6yѧvW0x_\eg ?̱X,,::=<̥G~ psn|বttf +Lm9GMm=z}?e=fXvOvJӣ# +V7|Cщ$[ #{>~b;bO-] M0 !!>\Qn}egF83*;C<5 Z𙵂V]rօjh5Ug9B}UA B%A8{MH_;3尦D_J[+BV>qv8"KP$m/ . +2a}KS)qUl`7)O0˟n>+y2"_)rp4吏 t)د:{u7^ң ;;Ƣ:mRBdV2xA G;OXi1ҫGRW:Oq&EUE &0+5$w¾zNE5<]80ʄ0fz27 v9VFusF4aq} +l-E"͋9}?(- +"bV HV#LiVkB<{l}l K,}LS9L6Eu95S]R fR!17Q1S+.xZGKBy%fIX2෨ڢTeŇ3eMRYe >>-A-ZQDP>tvh mU ^0]0nm^qpnBXlTdQKO&M>ȃc al&?%^ܢऋO&N5g SRoK72wVNN^׮N&P|urԦ#W7. MbwyWjl@urBB|V7⪫E{Z%ur] ] ]|)ȮN>:;E%.A_c +g_q]ɇSKJמY^Le$2gqM]ȨwIA|qd9K7bxf=3B?:xW]fteG3Shu uyf3-꺶N.>Y\|x*ur<s6?e63Kz٘N>-ʳTWM EE} w8Ρ9AsY䷴~zur,]DW'LSj-甅rc JHYX +']|*u2ψψo!`$\G' +gpfډ]ϢN2V'd4m0ܼky|uyd(x+ԣT/N|qɢҽɩu2j  +NydW'J<;yE*.@ +^,o:gP'Q&+]fz4:qY5QwurW' N>='S'l LƘ68J &nK1iB?:y +]:9?vo3K;SGɗcÔfbxCxkf];vIhp2fwNHݼ,(a}qfЩ꾓u7e +endstream +endobj + +1028 0 obj +<> +stream +x\Ko6+<LrA0г +@C~+mĵ5 NWCz1蓾:ߋGrKI6uze]\ +l]_??kJ _/L㻀`3l4 l +x柳z *)osP1feu +Nuyl djpnbr@՗^G9N҄Qork@~~O~F)cvp?;Ⱥ[gRkCA :zrݗйa7|]ϾΖu3掦~OY)zE؛V}ץ5y>߇fQG;19tb=}2IVO؅`d]8)=ji'4ydtBF|}Ɠ5冨Md;2yƊ<|o)/c5' xքmag*]#Gl1ଫJX+UDN*g,AP+xPu{PwyLO}XZݝQ$yNҼCoYGchĽ6ziE%HZ&$HKd20ԧjr@y5 8<L3O+ fDOC:Ȉ| )"S6 y xgJς, ;cju6s';1~a-XiqY +-Yz8a~Oc.1IJ0zgRTU b IQshHq*8n(uuba kae0 vzNFMhhҌY`l-x{D*79c?( +"bVQHV#{&u6b5! .Zc=jd2l Y:RRbGʍ5yRi +ˬ2W2}lt(tYfӧ-j(J.>Y}x䠛eMAKeMY 䳢Jrf3rZAJ%Q rjwhNB'}s:cޠ#{rC +5gS,l[!n̷rbKQBa85g,G[h0;.Z6Z(|9vb]u-(~r>ZW!Ͼ\1|-|w_ |V.Pc>?F>a5Գ wѲ,+Q>hp|h9^R`@Y~a-_jr-M\BJȝ"R ZN`Z .ZEK.D%dk,]QL%$cqSthy-/.Z^󉖓c<`du唚HI~c3ޢ%Z.BY+m>>3fW6RcV9ݢkC!̙чR'O^~׬Nw]qW'Nw̢PoN}.7 > +stream +x][ܶ+zlX +;5`Ms6>Aبp]QiҮ H"\93д6 +=~Dk;mbkЂM}Soi7M~3\- i}Ƿ&z_߽7&&@CzpW)ig7/Q/^|~1*OFtU Iy\7I5JibU)?Wy<Z . @]Q^p$pAALq!uj8wv{#Uh*Dt +*|p._Ca~ *St#>-&QȬvݸCZ]n(#s` +/8Ca"}EFж؈6Ylb4oY3>t LV?z\V=͛&GT*V` f*YMqŜ]+6=Gbn0'Xr$̎fG3!!̊)oJӾ텊 +1\$BJ.8 F3h5Wr6GY`SkM*9YM)MRLuI |P5:R>t b#"SGވ=OʝoS#k{sҢf),鶤t[&m2Bx: anp[Z7DTaZבS?U3n<2c9 UEOmS2diD͘X!oRv,LEDj2RLFZrԩt#+moܿ׿<׎%&U<% +0#R2ȑGgDߩ 0=^iY`9DR`#6Ĉ%e8[ ȸS2{H+&EC,]HRb g򌞍LsoJ,Q`sh;AlV.Tx̀vYh7 0f%-nT(`=cbBw%y=j3e.0#+˸!YIN|%8_fnPO=Tt #7+2#MA*.n0>jʠlb E}X(@,7 0F,"$;"X`Fn-?\:8v1pȳD{a;%0ӱ$7,>Rl^,k,ӎ~q!gLbʕEJx>ϺD\7ޞnR=vANZ2=%P$ͼ|G;jBյYd T`:4.iP] +K8IY|eC@52*%y:o3)ۥ$I;D-5^cZ!]ΝϔȀKRgII:lOA$}LabNO" +9O_0H&s&%O} P}@zj¨%m}L,&VW|S۹sGtؾX\dh'uP'Oϕupz.NI.WJb J/40oPZ23gmAj{vI6hM)sm5^P6*.aA^19ö-C7Km/xVH&,4XN5ű1VslLRVc?kv]ZT7C3sa1;$6% @|*+$I>76Ӣ>o37ĩm> jƆ."WGT;vOU^a[/uQM&ɷ +SaI (y]W +RxV~=4OAPk'Ybq~E$Փ66!)[rKRҔ+hCFN`YJz^G @"eJ3cAy+ +X_Cn~D)=rþox {g 38CJuQFbf?;r~\s4ZvV' +endstream +endobj + +1030 0 obj +<> +stream +x]n7>p;@b'A nYZA$XOqgꮢY-esxX|TqJWə!%u l+QYrԯꣲ)5zeL6B>Ù}}U?cVJ;w c>sZEY?8d9%3߳( 83f=*-;*(ePFW9^RUVfNGpׯ޿o|+;l`;جNu6_k-IAGCT~W}*q!ir]AKv}GЮ.ףvxliCF3eaMT_nvp8CA؀Iշy񷻟>Ӂ޵* 4/Y{ v*m|V@ʵ;G!&$ odM>5Y5Ҿ󖀆V*e``9@Wȁ 2w 4@ 4O;\[~rCJSs9VwE_2RWf7iH8Znp6xc8L'W>6rO7MqItW:QWGӉL͸zCB2"L{&A;%FLHKZQig7 p3 4}3p=|T1gO8hsZ|2<&35/y2lX.ŗZ\}l$^q}{{S^tqgE0"z_\@ +endstream +endobj + +1031 0 obj +<> +stream +xZMo7+<0=Çةу65s +C~Di5#ro#g4(PǨ3Fm)hEOɪ>~PeWƧ e3l6}dw?ipwygUTBH +!jJCY7+a)j[noV3_"^#6t $ A2yF +#O |lbM8`%vvBe`j;- ޻!bE§"2xkxF5N8grCaǡot8݃sP0w8[a6bW jْ(1YZ!"x}"EQ-2!<өA\N9QlQ!#R1ve7/\N [:[Su=32c=n,6c:q}{v=}؞&%Fq[k{m \81;4 a\[id.QqO0 +|"5 \*oSddzCpteQƾt +EBX%[u=L='nc!i\+;^_r`I3Ơ*`CmQhP0ׯ`nP0\cy{wVS0ipɗ͕k +cYEN1Iϯ{fz~A)~_ךԯ@JW+Yu֯NĒzwV(-D +wLRkzKW<,i}4o# Ա>fpkUx4{ޑ9D A$z {; f@v +MlȗWX' ;Pbۘig Cn!i `72(oR { Ɂ욧_T +endstream +endobj + +xref +0 1032 +0000000000 65535 f +0000000042 00000 n +0000000311 00000 n +0000000491 00000 n +0000000527 00000 n +0000000665 00000 n +0000000734 00000 n +0000000871 00000 n +0000001051 00000 n +0000001241 00000 n +0000001310 00000 n +0000001491 00000 n +0000001672 00000 n +0000001853 00000 n +0000002034 00000 n +0000002215 00000 n +0000002396 00000 n +0000002510 00000 n +0000002571 00000 n +0000002678 00000 n +0000006507 00000 n +0000006587 00000 n +0000006725 00000 n +0000006805 00000 n +0000006914 00000 n +0000006994 00000 n +0000007103 00000 n +0000007183 00000 n +0000007292 00000 n +0000007372 00000 n +0000007481 00000 n +0000007561 00000 n +0000007670 00000 n +0000007750 00000 n +0000007859 00000 n +0000007939 00000 n +0000008048 00000 n +0000008128 00000 n +0000008237 00000 n +0000008317 00000 n +0000008427 00000 n +0000008507 00000 n +0000008617 00000 n +0000008697 00000 n +0000008807 00000 n +0000008915 00000 n +0000009025 00000 n +0000009135 00000 n +0000009245 00000 n +0000009355 00000 n +0000009465 00000 n +0000009545 00000 n +0000009654 00000 n +0000009734 00000 n +0000009843 00000 n +0000009923 00000 n +0000010061 00000 n +0000010141 00000 n +0000010250 00000 n +0000010330 00000 n +0000010468 00000 n +0000010548 00000 n +0000010657 00000 n +0000010737 00000 n +0000010846 00000 n +0000010926 00000 n +0000011035 00000 n +0000011115 00000 n +0000011225 00000 n +0000011305 00000 n +0000011415 00000 n +0000011495 00000 n +0000011605 00000 n +0000011685 00000 n +0000011795 00000 n +0000011875 00000 n +0000011985 00000 n +0000012065 00000 n +0000012175 00000 n +0000012255 00000 n +0000012365 00000 n +0000012445 00000 n +0000012555 00000 n +0000012635 00000 n +0000012745 00000 n +0000012825 00000 n +0000012935 00000 n +0000013015 00000 n +0000013125 00000 n +0000013205 00000 n +0000013315 00000 n +0000013395 00000 n +0000013505 00000 n +0000013585 00000 n +0000013695 00000 n +0000013775 00000 n +0000013885 00000 n +0000013965 00000 n +0000014075 00000 n +0000014155 00000 n +0000014265 00000 n +0000014347 00000 n +0000014459 00000 n +0000014541 00000 n +0000014653 00000 n +0000014735 00000 n +0000014847 00000 n +0000014929 00000 n +0000015041 00000 n +0000015123 00000 n +0000015235 00000 n +0000015317 00000 n +0000015429 00000 n +0000015511 00000 n +0000015623 00000 n +0000015705 00000 n +0000015817 00000 n +0000015899 00000 n +0000016011 00000 n +0000016093 00000 n +0000016205 00000 n +0000016287 00000 n +0000016399 00000 n +0000016481 00000 n +0000016593 00000 n +0000016675 00000 n +0000016787 00000 n +0000016869 00000 n +0000016981 00000 n +0000017063 00000 n +0000017175 00000 n +0000017257 00000 n +0000017369 00000 n +0000017451 00000 n +0000017563 00000 n +0000017645 00000 n +0000017757 00000 n +0000017839 00000 n +0000017951 00000 n +0000018033 00000 n +0000018145 00000 n +0000018227 00000 n +0000018339 00000 n +0000018421 00000 n +0000018533 00000 n +0000018615 00000 n +0000018727 00000 n +0000018809 00000 n +0000018921 00000 n +0000019003 00000 n +0000019115 00000 n +0000019197 00000 n +0000019309 00000 n +0000019391 00000 n +0000019503 00000 n +0000019585 00000 n +0000019697 00000 n +0000019779 00000 n +0000019891 00000 n +0000019973 00000 n +0000020085 00000 n +0000020167 00000 n +0000020279 00000 n +0000020361 00000 n +0000020473 00000 n +0000020555 00000 n +0000020667 00000 n +0000020749 00000 n +0000020861 00000 n +0000020943 00000 n +0000021055 00000 n +0000021137 00000 n +0000021249 00000 n +0000021331 00000 n +0000021443 00000 n +0000021525 00000 n +0000021637 00000 n +0000021719 00000 n +0000021831 00000 n +0000021913 00000 n +0000022025 00000 n +0000022107 00000 n +0000022219 00000 n +0000022301 00000 n +0000022412 00000 n +0000022520 00000 n +0000022609 00000 n +0000022715 00000 n +0000022870 00000 n +0000022981 00000 n +0000023136 00000 n +0000023247 00000 n +0000023402 00000 n +0000023513 00000 n +0000023668 00000 n +0000023779 00000 n +0000023861 00000 n +0000024027 00000 n +0000024138 00000 n +0000024252 00000 n +0000024418 00000 n +0000024529 00000 n +0000024695 00000 n +0000024806 00000 n +0000024972 00000 n +0000025083 00000 n +0000025249 00000 n +0000025360 00000 n +0000025526 00000 n +0000025638 00000 n +0000025752 00000 n +0000025918 00000 n +0000026030 00000 n +0000026196 00000 n +0000026308 00000 n +0000026474 00000 n +0000026586 00000 n +0000026752 00000 n +0000026864 00000 n +0000027030 00000 n +0000027142 00000 n +0000027224 00000 n +0000027336 00000 n +0000027418 00000 n +0000027530 00000 n +0000027612 00000 n +0000027724 00000 n +0000027806 00000 n +0000027918 00000 n +0000028000 00000 n +0000028112 00000 n +0000028194 00000 n +0000028306 00000 n +0000028388 00000 n +0000028500 00000 n +0000028582 00000 n +0000028694 00000 n +0000028776 00000 n +0000028888 00000 n +0000028970 00000 n +0000029082 00000 n +0000029164 00000 n +0000029306 00000 n +0000029388 00000 n +0000029500 00000 n +0000029582 00000 n +0000029694 00000 n +0000029776 00000 n +0000029888 00000 n +0000029970 00000 n +0000030082 00000 n +0000030164 00000 n +0000030276 00000 n +0000030358 00000 n +0000030470 00000 n +0000030552 00000 n +0000030664 00000 n +0000030746 00000 n +0000030858 00000 n +0000030940 00000 n +0000031052 00000 n +0000031134 00000 n +0000031246 00000 n +0000031328 00000 n +0000031440 00000 n +0000031522 00000 n +0000031634 00000 n +0000031716 00000 n +0000031828 00000 n +0000031910 00000 n +0000032022 00000 n +0000032104 00000 n +0000032216 00000 n +0000032298 00000 n +0000032410 00000 n +0000032492 00000 n +0000032604 00000 n +0000032686 00000 n +0000032798 00000 n +0000032880 00000 n +0000032992 00000 n +0000033074 00000 n +0000033186 00000 n +0000033268 00000 n +0000033380 00000 n +0000033462 00000 n +0000033574 00000 n +0000033656 00000 n +0000033768 00000 n +0000033850 00000 n +0000033962 00000 n +0000034044 00000 n +0000034156 00000 n +0000034238 00000 n +0000034350 00000 n +0000034432 00000 n +0000034544 00000 n +0000034626 00000 n +0000034738 00000 n +0000034820 00000 n +0000034932 00000 n +0000035014 00000 n +0000035126 00000 n +0000035208 00000 n +0000035320 00000 n +0000035402 00000 n +0000035514 00000 n +0000035596 00000 n +0000035708 00000 n +0000035790 00000 n +0000035902 00000 n +0000035984 00000 n +0000036096 00000 n +0000036178 00000 n +0000036290 00000 n +0000036372 00000 n +0000036484 00000 n +0000036566 00000 n +0000036678 00000 n +0000036760 00000 n +0000036872 00000 n +0000036954 00000 n +0000037066 00000 n +0000037148 00000 n +0000037260 00000 n +0000037342 00000 n +0000037454 00000 n +0000037536 00000 n +0000037648 00000 n +0000037730 00000 n +0000037842 00000 n +0000037924 00000 n +0000038036 00000 n +0000038118 00000 n +0000038230 00000 n +0000038312 00000 n +0000038424 00000 n +0000038506 00000 n +0000038618 00000 n +0000038700 00000 n +0000038812 00000 n +0000038894 00000 n +0000039006 00000 n +0000039088 00000 n +0000039200 00000 n +0000039282 00000 n +0000039394 00000 n +0000039476 00000 n +0000039588 00000 n +0000039670 00000 n +0000039782 00000 n +0000039864 00000 n +0000039976 00000 n +0000040058 00000 n +0000040170 00000 n +0000040252 00000 n +0000040365 00000 n +0000040447 00000 n +0000040560 00000 n +0000040642 00000 n +0000040755 00000 n +0000040837 00000 n +0000040950 00000 n +0000041032 00000 n +0000041145 00000 n +0000041227 00000 n +0000041340 00000 n +0000041422 00000 n +0000041535 00000 n +0000041617 00000 n +0000041730 00000 n +0000041812 00000 n +0000041925 00000 n +0000042007 00000 n +0000042120 00000 n +0000042202 00000 n +0000042315 00000 n +0000042397 00000 n +0000042510 00000 n +0000042592 00000 n +0000042705 00000 n +0000042787 00000 n +0000042900 00000 n +0000042982 00000 n +0000043095 00000 n +0000043177 00000 n +0000043290 00000 n +0000043372 00000 n +0000043485 00000 n +0000043567 00000 n +0000043680 00000 n +0000043762 00000 n +0000043875 00000 n +0000043957 00000 n +0000044070 00000 n +0000044152 00000 n +0000044265 00000 n +0000044347 00000 n +0000044460 00000 n +0000044542 00000 n +0000044655 00000 n +0000044737 00000 n +0000044850 00000 n +0000044932 00000 n +0000045045 00000 n +0000045127 00000 n +0000045240 00000 n +0000045322 00000 n +0000045435 00000 n +0000045517 00000 n +0000045630 00000 n +0000045712 00000 n +0000045825 00000 n +0000045907 00000 n +0000046020 00000 n +0000046102 00000 n +0000046215 00000 n +0000046297 00000 n +0000046410 00000 n +0000046492 00000 n +0000046605 00000 n +0000046687 00000 n +0000046800 00000 n +0000046882 00000 n +0000046995 00000 n +0000047077 00000 n +0000047190 00000 n +0000047272 00000 n +0000047385 00000 n +0000047467 00000 n +0000047580 00000 n +0000047662 00000 n +0000047775 00000 n +0000047857 00000 n +0000047970 00000 n +0000048052 00000 n +0000048165 00000 n +0000048247 00000 n +0000048360 00000 n +0000048442 00000 n +0000048555 00000 n +0000048637 00000 n +0000048750 00000 n +0000048832 00000 n +0000048945 00000 n +0000049027 00000 n +0000049140 00000 n +0000049222 00000 n +0000049335 00000 n +0000049417 00000 n +0000049530 00000 n +0000049612 00000 n +0000049725 00000 n +0000049807 00000 n +0000049920 00000 n +0000050002 00000 n +0000050115 00000 n +0000050197 00000 n +0000050310 00000 n +0000050392 00000 n +0000050505 00000 n +0000050587 00000 n +0000050700 00000 n +0000050782 00000 n +0000050895 00000 n +0000050977 00000 n +0000051090 00000 n +0000051172 00000 n +0000051285 00000 n +0000051367 00000 n +0000051480 00000 n +0000051562 00000 n +0000051675 00000 n +0000051757 00000 n +0000051869 00000 n +0000051951 00000 n +0000052063 00000 n +0000052145 00000 n +0000052257 00000 n +0000052339 00000 n +0000052451 00000 n +0000052533 00000 n +0000052645 00000 n +0000052727 00000 n +0000052839 00000 n +0000052921 00000 n +0000053033 00000 n +0000053115 00000 n +0000053227 00000 n +0000053309 00000 n +0000053421 00000 n +0000053503 00000 n +0000053615 00000 n +0000053697 00000 n +0000053810 00000 n +0000053892 00000 n +0000054005 00000 n +0000054087 00000 n +0000054200 00000 n +0000054282 00000 n +0000054395 00000 n +0000054477 00000 n +0000054590 00000 n +0000054672 00000 n +0000054785 00000 n +0000054867 00000 n +0000054980 00000 n +0000055062 00000 n +0000055175 00000 n +0000055257 00000 n +0000055370 00000 n +0000055452 00000 n +0000055565 00000 n +0000055647 00000 n +0000055760 00000 n +0000055842 00000 n +0000055955 00000 n +0000056037 00000 n +0000056150 00000 n +0000056232 00000 n +0000056345 00000 n +0000056427 00000 n +0000056540 00000 n +0000056622 00000 n +0000056735 00000 n +0000056817 00000 n +0000056930 00000 n +0000057012 00000 n +0000057125 00000 n +0000057207 00000 n +0000057320 00000 n +0000057402 00000 n +0000057515 00000 n +0000057597 00000 n +0000057710 00000 n +0000057792 00000 n +0000057905 00000 n +0000057987 00000 n +0000058100 00000 n +0000058182 00000 n +0000058295 00000 n +0000058377 00000 n +0000058490 00000 n +0000058572 00000 n +0000058685 00000 n +0000058767 00000 n +0000058880 00000 n +0000058962 00000 n +0000059075 00000 n +0000059157 00000 n +0000059270 00000 n +0000059352 00000 n +0000059465 00000 n +0000059547 00000 n +0000059660 00000 n +0000059742 00000 n +0000059855 00000 n +0000059937 00000 n +0000060050 00000 n +0000060132 00000 n +0000060245 00000 n +0000060327 00000 n +0000060440 00000 n +0000060522 00000 n +0000060635 00000 n +0000060717 00000 n +0000060830 00000 n +0000060912 00000 n +0000061025 00000 n +0000061107 00000 n +0000061220 00000 n +0000061302 00000 n +0000061415 00000 n +0000061497 00000 n +0000061610 00000 n +0000061692 00000 n +0000061805 00000 n +0000061887 00000 n +0000062000 00000 n +0000062082 00000 n +0000062195 00000 n +0000062277 00000 n +0000062390 00000 n +0000062472 00000 n +0000062585 00000 n +0000062667 00000 n +0000062780 00000 n +0000062862 00000 n +0000062975 00000 n +0000063057 00000 n +0000063170 00000 n +0000063252 00000 n +0000063365 00000 n +0000063447 00000 n +0000063560 00000 n +0000063642 00000 n +0000063755 00000 n +0000063837 00000 n +0000063950 00000 n +0000064032 00000 n +0000064145 00000 n +0000064227 00000 n +0000064340 00000 n +0000064422 00000 n +0000064535 00000 n +0000064617 00000 n +0000064730 00000 n +0000064812 00000 n +0000064925 00000 n +0000065007 00000 n +0000065120 00000 n +0000065202 00000 n +0000065314 00000 n +0000065396 00000 n +0000065508 00000 n +0000065590 00000 n +0000065702 00000 n +0000065784 00000 n +0000065896 00000 n +0000065978 00000 n +0000066090 00000 n +0000066172 00000 n +0000066284 00000 n +0000066366 00000 n +0000066478 00000 n +0000066560 00000 n +0000066672 00000 n +0000066754 00000 n +0000066866 00000 n +0000066948 00000 n +0000067060 00000 n +0000067142 00000 n +0000067255 00000 n +0000067337 00000 n +0000067450 00000 n +0000067532 00000 n +0000067645 00000 n +0000067727 00000 n +0000067840 00000 n +0000067922 00000 n +0000068035 00000 n +0000068117 00000 n +0000068230 00000 n +0000068312 00000 n +0000068425 00000 n +0000068507 00000 n +0000068620 00000 n +0000068702 00000 n +0000068815 00000 n +0000068897 00000 n +0000069010 00000 n +0000069092 00000 n +0000069205 00000 n +0000069287 00000 n +0000069400 00000 n +0000069482 00000 n +0000069595 00000 n +0000069677 00000 n +0000069790 00000 n +0000069872 00000 n +0000069985 00000 n +0000070067 00000 n +0000070180 00000 n +0000070262 00000 n +0000070375 00000 n +0000070457 00000 n +0000070570 00000 n +0000070652 00000 n +0000070765 00000 n +0000070847 00000 n +0000070960 00000 n +0000071042 00000 n +0000071155 00000 n +0000071237 00000 n +0000071350 00000 n +0000071432 00000 n +0000071545 00000 n +0000071627 00000 n +0000071740 00000 n +0000071822 00000 n +0000071935 00000 n +0000072017 00000 n +0000072130 00000 n +0000072212 00000 n +0000072325 00000 n +0000072407 00000 n +0000072520 00000 n +0000072602 00000 n +0000072715 00000 n +0000072797 00000 n +0000072910 00000 n +0000072992 00000 n +0000073105 00000 n +0000073187 00000 n +0000073300 00000 n +0000073382 00000 n +0000073495 00000 n +0000073577 00000 n +0000073690 00000 n +0000073772 00000 n +0000073885 00000 n +0000073967 00000 n +0000074080 00000 n +0000074162 00000 n +0000074275 00000 n +0000074357 00000 n +0000074470 00000 n +0000074552 00000 n +0000074665 00000 n +0000074747 00000 n +0000074860 00000 n +0000074942 00000 n +0000075054 00000 n +0000075136 00000 n +0000075248 00000 n +0000075330 00000 n +0000075442 00000 n +0000075524 00000 n +0000075636 00000 n +0000075718 00000 n +0000075830 00000 n +0000075912 00000 n +0000076024 00000 n +0000076106 00000 n +0000076218 00000 n +0000076300 00000 n +0000076412 00000 n +0000076494 00000 n +0000076606 00000 n +0000076688 00000 n +0000076800 00000 n +0000076882 00000 n +0000076995 00000 n +0000077077 00000 n +0000077190 00000 n +0000077272 00000 n +0000077385 00000 n +0000077467 00000 n +0000077580 00000 n +0000077662 00000 n +0000077775 00000 n +0000077857 00000 n +0000077970 00000 n +0000078052 00000 n +0000078165 00000 n +0000078247 00000 n +0000078360 00000 n +0000078442 00000 n +0000078555 00000 n +0000078637 00000 n +0000078750 00000 n +0000078832 00000 n +0000078945 00000 n +0000079027 00000 n +0000079140 00000 n +0000079222 00000 n +0000079335 00000 n +0000079417 00000 n +0000079530 00000 n +0000079612 00000 n +0000079725 00000 n +0000079807 00000 n +0000079920 00000 n +0000080002 00000 n +0000080115 00000 n +0000080197 00000 n +0000080310 00000 n +0000080392 00000 n +0000080505 00000 n +0000080587 00000 n +0000080700 00000 n +0000080782 00000 n +0000080895 00000 n +0000080977 00000 n +0000081090 00000 n +0000081172 00000 n +0000081285 00000 n +0000081367 00000 n +0000081480 00000 n +0000081562 00000 n +0000081675 00000 n +0000081757 00000 n +0000081870 00000 n +0000081952 00000 n +0000082065 00000 n +0000082147 00000 n +0000082291 00000 n +0000082373 00000 n +0000082486 00000 n +0000082568 00000 n +0000082681 00000 n +0000082763 00000 n +0000082876 00000 n +0000082958 00000 n +0000083071 00000 n +0000083153 00000 n +0000083266 00000 n +0000083348 00000 n +0000083461 00000 n +0000083543 00000 n +0000083656 00000 n +0000083738 00000 n +0000083851 00000 n +0000083933 00000 n +0000084046 00000 n +0000084128 00000 n +0000084241 00000 n +0000084323 00000 n +0000084436 00000 n +0000084518 00000 n +0000084631 00000 n +0000084713 00000 n +0000084826 00000 n +0000084908 00000 n +0000085021 00000 n +0000085103 00000 n +0000085216 00000 n +0000085298 00000 n +0000085411 00000 n +0000085493 00000 n +0000085606 00000 n +0000085688 00000 n +0000085801 00000 n +0000085883 00000 n +0000085996 00000 n +0000086078 00000 n +0000086191 00000 n +0000086273 00000 n +0000086386 00000 n +0000086468 00000 n +0000086581 00000 n +0000086663 00000 n +0000086776 00000 n +0000086858 00000 n +0000086971 00000 n +0000087053 00000 n +0000087166 00000 n +0000087248 00000 n +0000087361 00000 n +0000087443 00000 n +0000087556 00000 n +0000087638 00000 n +0000087751 00000 n +0000087833 00000 n +0000087945 00000 n +0000088027 00000 n +0000088139 00000 n +0000088221 00000 n +0000088333 00000 n +0000088415 00000 n +0000088527 00000 n +0000088609 00000 n +0000088721 00000 n +0000088803 00000 n +0000088915 00000 n +0000088997 00000 n +0000089109 00000 n +0000089191 00000 n +0000089303 00000 n +0000089385 00000 n +0000089497 00000 n +0000089579 00000 n +0000089691 00000 n +0000089773 00000 n +0000089886 00000 n +0000089968 00000 n +0000090081 00000 n +0000090163 00000 n +0000090276 00000 n +0000090358 00000 n +0000090471 00000 n +0000090553 00000 n +0000090666 00000 n +0000090748 00000 n +0000090861 00000 n +0000090943 00000 n +0000091056 00000 n +0000091138 00000 n +0000091251 00000 n +0000091333 00000 n +0000091446 00000 n +0000091528 00000 n +0000091641 00000 n +0000091723 00000 n +0000091836 00000 n +0000091918 00000 n +0000092031 00000 n +0000092113 00000 n +0000092226 00000 n +0000092308 00000 n +0000092421 00000 n +0000092503 00000 n +0000092616 00000 n +0000092698 00000 n +0000092811 00000 n +0000092893 00000 n +0000093006 00000 n +0000093088 00000 n +0000093201 00000 n +0000093283 00000 n +0000093396 00000 n +0000093478 00000 n +0000093591 00000 n +0000093673 00000 n +0000093786 00000 n +0000093868 00000 n +0000093981 00000 n +0000094063 00000 n +0000094176 00000 n +0000094258 00000 n +0000094371 00000 n +0000094453 00000 n +0000094566 00000 n +0000094648 00000 n +0000094761 00000 n +0000094843 00000 n +0000094956 00000 n +0000095038 00000 n +0000095151 00000 n +0000095233 00000 n +0000095346 00000 n +0000095428 00000 n +0000095541 00000 n +0000095623 00000 n +0000095736 00000 n +0000095818 00000 n +0000095931 00000 n +0000096013 00000 n +0000096126 00000 n +0000096208 00000 n +0000096321 00000 n +0000096403 00000 n +0000096516 00000 n +0000096598 00000 n +0000096711 00000 n +0000096793 00000 n +0000096906 00000 n +0000096988 00000 n +0000097101 00000 n +0000097183 00000 n +0000097296 00000 n +0000097378 00000 n +0000097491 00000 n +0000097573 00000 n +0000097686 00000 n +0000097768 00000 n +0000097881 00000 n +0000097963 00000 n +0000098076 00000 n +0000098158 00000 n +0000098271 00000 n +0000098353 00000 n +0000098466 00000 n +0000098548 00000 n +0000098661 00000 n +0000098743 00000 n +0000098856 00000 n +0000098938 00000 n +0000099051 00000 n +0000099133 00000 n +0000099246 00000 n +0000099328 00000 n +0000099472 00000 n +0000099554 00000 n +0000099667 00000 n +0000099749 00000 n +0000099861 00000 n +0000099943 00000 n +0000100055 00000 n +0000100137 00000 n +0000100249 00000 n +0000100331 00000 n +0000100443 00000 n +0000100525 00000 n +0000100637 00000 n +0000100719 00000 n +0000100831 00000 n +0000100913 00000 n +0000101025 00000 n +0000101107 00000 n +0000101219 00000 n +0000101301 00000 n +0000101413 00000 n +0000101495 00000 n +0000101607 00000 n +0000101689 00000 n +0000101802 00000 n +0000101884 00000 n +0000101997 00000 n +0000102079 00000 n +0000102223 00000 n +0000102305 00000 n +0000102418 00000 n +0000102500 00000 n +0000102644 00000 n +0000102726 00000 n +0000102839 00000 n +0000102921 00000 n +0000103065 00000 n +0000103147 00000 n +0000103260 00000 n +0000103344 00000 n +0000103459 00000 n +0000103606 00000 n +0000104144 00000 n +0000104757 00000 n +0000105330 00000 n +0000105903 00000 n +0000106324 00000 n +0000106881 00000 n +0000107398 00000 n +0000107596 00000 n +0000107741 00000 n +0000128374 00000 n +0000128413 00000 n +0000128602 00000 n +0000144531 00000 n +0000144721 00000 n +0000145213 00000 n +0000145596 00000 n +0000150164 00000 n +0000150399 00000 n +0000150694 00000 n +0000151035 00000 n +0000152668 00000 n +0000156138 00000 n +0000159491 00000 n +0000161955 00000 n +0000164434 00000 n +0000166503 00000 n +0000169786 00000 n +0000172516 00000 n + +trailer +<]>> +startxref +173939 +%%EOF diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797383870.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797383870.pdf new file mode 100644 index 000000000..799b89a38 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797383870.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797465814.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797465814.pdf new file mode 100644 index 000000000..8f6115de6 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797465814.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523170.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523170.pdf new file mode 100644 index 000000000..1dcdf38d5 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523170.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523171.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523171.pdf new file mode 100644 index 000000000..45a2180f8 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523171.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523172.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523172.pdf new file mode 100644 index 000000000..c5012bb29 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523172.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523173.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523173.pdf new file mode 100644 index 000000000..0c44b2f2e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523173.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523174.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523174.pdf new file mode 100644 index 000000000..61e984ff9 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797523174.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797668540.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797668540.pdf new file mode 100644 index 000000000..5fd77a79e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797668540.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797738231.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797738231.pdf new file mode 100644 index 000000000..71869f05c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797738231.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797738233.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797738233.pdf new file mode 100644 index 000000000..f34eaf4e5 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797738233.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739194.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739194.pdf new file mode 100644 index 000000000..37590e5e4 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739194.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739195.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739195.pdf new file mode 100644 index 000000000..76eb01c7c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739195.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739196.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739196.pdf new file mode 100644 index 000000000..599bd142e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739196.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739197.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739197.pdf new file mode 100644 index 000000000..7e182c70c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739197.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739198.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739198.pdf new file mode 100644 index 000000000..78a8a0545 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739198.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739199.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739199.pdf new file mode 100644 index 000000000..31c6e8fd2 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739199.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739200.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739200.pdf new file mode 100644 index 000000000..f611f2cd0 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797739200.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805805.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805805.pdf new file mode 100644 index 000000000..3f4526234 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805805.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805807.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805807.pdf new file mode 100644 index 000000000..c26f39222 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805807.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805809.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805809.pdf new file mode 100644 index 000000000..7b3aed0c3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805809.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805810.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805810.pdf new file mode 100644 index 000000000..d37157733 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805810.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805811.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805811.pdf new file mode 100644 index 000000000..4c491e507 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797805811.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797875440.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797875440.pdf new file mode 100644 index 000000000..75f66e5c3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797875440.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962466.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962466.pdf new file mode 100644 index 000000000..04ad1a949 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962466.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962469.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962469.pdf new file mode 100644 index 000000000..efa2af300 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962469.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962470.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962470.pdf new file mode 100644 index 000000000..31e8f05cd Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962470.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962471.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962471.pdf new file mode 100644 index 000000000..67d9dc070 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797962471.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797995201.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797995201.pdf new file mode 100644 index 000000000..615c0ab0e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797995201.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797995202.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797995202.pdf new file mode 100644 index 000000000..1d742c912 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797995202.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797995203.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797995203.pdf new file mode 100644 index 000000000..59447c396 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500797995203.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798076127.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798076127.pdf new file mode 100644 index 000000000..55b2f2951 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798076127.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798076128.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798076128.pdf new file mode 100644 index 000000000..a64cfb732 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798076128.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798076130.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798076130.pdf new file mode 100644 index 000000000..d5c2baa8c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798076130.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148835.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148835.pdf new file mode 100644 index 000000000..c97f3f2ad Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148835.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148836.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148836.pdf new file mode 100644 index 000000000..8de007628 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148836.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148837.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148837.pdf new file mode 100644 index 000000000..f46a6d614 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148837.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148839.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148839.pdf new file mode 100644 index 000000000..d23351227 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148839.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148841.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148841.pdf new file mode 100644 index 000000000..e61e68582 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798148841.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798341369.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798341369.pdf new file mode 100644 index 000000000..03a77d911 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798341369.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798342331.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798342331.pdf new file mode 100644 index 000000000..b76e8262e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798342331.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798527676.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798527676.pdf new file mode 100644 index 000000000..2482d449e Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798527676.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798527677.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798527677.pdf new file mode 100644 index 000000000..15f69002e --- /dev/null +++ b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798527677.pdf @@ -0,0 +1,5382 @@ +%PDF-1.4 +%µ¶ +% Written by MuPDF 1.29.0 + +1 0 obj +<> +endobj + +2 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1023 0 R/StructParents 0/Parent 16 0 R>> +endobj + +3 0 obj +<> +endobj + +4 0 obj +<> +endobj + +5 0 obj +<> +endobj + +6 0 obj +<> +endobj + +7 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1024 0 R/StructParents 1/Parent 16 0 R>> +endobj + +8 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1025 0 R/StructParents 2/Parent 16 0 R>> +endobj + +9 0 obj +<> +endobj + +10 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1026 0 R/StructParents 3/Parent 16 0 R>> +endobj + +11 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1027 0 R/StructParents 4/Parent 16 0 R>> +endobj + +12 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1028 0 R/StructParents 5/Parent 16 0 R>> +endobj + +13 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1029 0 R/StructParents 6/Parent 16 0 R>> +endobj + +14 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1030 0 R/StructParents 7/Parent 16 0 R>> +endobj + +15 0 obj +<>/Font<>>>/MediaBox[0 0 595.92 842.88]/Contents 1031 0 R/StructParents 8/Parent 17 0 R>> +endobj + +16 0 obj +<> +endobj + +17 0 obj +<> +endobj + +18 0 obj +<> +endobj + +19 0 obj +<> +endobj + +20 0 obj +<> +endobj + +21 0 obj +<><>]/ID(node00000005)>> +endobj + +22 0 obj +<> +endobj + +23 0 obj +<>]/ID(node00000025)>> +endobj + +24 0 obj +<> +endobj + +25 0 obj +<>]/ID(node00000026)>> +endobj + +26 0 obj +<> +endobj + +27 0 obj +<>]/ID(node00000029)>> +endobj + +28 0 obj +<> +endobj + +29 0 obj +<>]/ID(node00000031)>> +endobj + +30 0 obj +<> +endobj + +31 0 obj +<>]/ID(node00000034)>> +endobj + +32 0 obj +<> +endobj + +33 0 obj +<>]/ID(node00000036)>> +endobj + +34 0 obj +<> +endobj + +35 0 obj +<>]/ID(node00000038)>> +endobj + +36 0 obj +<> +endobj + +37 0 obj +<>]/ID(node00000040)>> +endobj + +38 0 obj +<> +endobj + +39 0 obj +<>]/ID(node00000042)>> +endobj + +40 0 obj +<> +endobj + +41 0 obj +<>]/ID(node00000044)>> +endobj + +42 0 obj +<> +endobj + +43 0 obj +<>]/ID(node00000046)>> +endobj + +44 0 obj +<> +endobj + +45 0 obj +<>]/ID(node00000048)>> +endobj + +46 0 obj +<>]/ID(node00000009)>> +endobj + +47 0 obj +<>]/ID(node00000010)>> +endobj + +48 0 obj +<>]/ID(node00000011)>> +endobj + +49 0 obj +<>]/ID(node00000012)>> +endobj + +50 0 obj +<> +endobj + +51 0 obj +<>]/ID(node00000014)>> +endobj + +52 0 obj +<> +endobj + +53 0 obj +<>]/ID(node00000015)>> +endobj + +54 0 obj +<> +endobj + +55 0 obj +<><>]/ID(node00000061)>> +endobj + +56 0 obj +<> +endobj + +57 0 obj +<>]/ID(node00000063)>> +endobj + +58 0 obj +<> +endobj + +59 0 obj +<><>]/ID(node00000065)>> +endobj + +60 0 obj +<> +endobj + +61 0 obj +<>]/ID(node00000067)>> +endobj + +62 0 obj +<> +endobj + +63 0 obj +<>]/ID(node00000070)>> +endobj + +64 0 obj +<> +endobj + +65 0 obj +<>]/ID(node00000072)>> +endobj + +66 0 obj +<> +endobj + +67 0 obj +<>]/ID(node00000075)>> +endobj + +68 0 obj +<> +endobj + +69 0 obj +<>]/ID(node00000077)>> +endobj + +70 0 obj +<> +endobj + +71 0 obj +<>]/ID(node00000080)>> +endobj + +72 0 obj +<> +endobj + +73 0 obj +<>]/ID(node00000082)>> +endobj + +74 0 obj +<> +endobj + +75 0 obj +<>]/ID(node00000085)>> +endobj + +76 0 obj +<> +endobj + +77 0 obj +<>]/ID(node00000087)>> +endobj + +78 0 obj +<> +endobj + +79 0 obj +<>]/ID(node00000090)>> +endobj + +80 0 obj +<> +endobj + +81 0 obj +<>]/ID(node00000092)>> +endobj + +82 0 obj +<> +endobj + +83 0 obj +<>]/ID(node00000095)>> +endobj + +84 0 obj +<> +endobj + +85 0 obj +<>]/ID(node00000097)>> +endobj + +86 0 obj +<> +endobj + +87 0 obj +<>]/ID(node00000100)>> +endobj + +88 0 obj +<> +endobj + +89 0 obj +<>]/ID(node00000102)>> +endobj + +90 0 obj +<> +endobj + +91 0 obj +<>]/ID(node00000105)>> +endobj + +92 0 obj +<> +endobj + +93 0 obj +<>]/ID(node00000107)>> +endobj + +94 0 obj +<> +endobj + +95 0 obj +<>]/ID(node00000110)>> +endobj + +96 0 obj +<> +endobj + +97 0 obj +<>]/ID(node00000112)>> +endobj + +98 0 obj +<> +endobj + +99 0 obj +<>]/ID(node00000115)>> +endobj + +100 0 obj +<> +endobj + +101 0 obj +<>]/ID(node00000117)>> +endobj + +102 0 obj +<> +endobj + +103 0 obj +<>]/ID(node00000121)>> +endobj + +104 0 obj +<> +endobj + +105 0 obj +<>]/ID(node00000123)>> +endobj + +106 0 obj +<> +endobj + +107 0 obj +<>]/ID(node00000126)>> +endobj + +108 0 obj +<> +endobj + +109 0 obj +<>]/ID(node00000128)>> +endobj + +110 0 obj +<> +endobj + +111 0 obj +<>]/ID(node00000131)>> +endobj + +112 0 obj +<> +endobj + +113 0 obj +<>]/ID(node00000133)>> +endobj + +114 0 obj +<> +endobj + +115 0 obj +<>]/ID(node00000136)>> +endobj + +116 0 obj +<> +endobj + +117 0 obj +<>]/ID(node00000138)>> +endobj + +118 0 obj +<> +endobj + +119 0 obj +<>]/ID(node00000142)>> +endobj + +120 0 obj +<> +endobj + +121 0 obj +<>]/ID(node00000144)>> +endobj + +122 0 obj +<> +endobj + +123 0 obj +<>]/ID(node00000148)>> +endobj + +124 0 obj +<> +endobj + +125 0 obj +<>]/ID(node00000151)>> +endobj + +126 0 obj +<> +endobj + +127 0 obj +<>]/ID(node00000154)>> +endobj + +128 0 obj +<> +endobj + +129 0 obj +<>]/ID(node00000156)>> +endobj + +130 0 obj +<> +endobj + +131 0 obj +<>]/ID(node00000159)>> +endobj + +132 0 obj +<> +endobj + +133 0 obj +<>]/ID(node00000161)>> +endobj + +134 0 obj +<> +endobj + +135 0 obj +<>]/ID(node00000164)>> +endobj + +136 0 obj +<> +endobj + +137 0 obj +<>]/ID(node00000166)>> +endobj + +138 0 obj +<> +endobj + +139 0 obj +<>]/ID(node00000169)>> +endobj + +140 0 obj +<> +endobj + +141 0 obj +<>]/ID(node00000171)>> +endobj + +142 0 obj +<> +endobj + +143 0 obj +<>]/ID(node00000175)>> +endobj + +144 0 obj +<> +endobj + +145 0 obj +<>]/ID(node00000177)>> +endobj + +146 0 obj +<> +endobj + +147 0 obj +<>]/ID(node00000180)>> +endobj + +148 0 obj +<> +endobj + +149 0 obj +<>]/ID(node00000182)>> +endobj + +150 0 obj +<> +endobj + +151 0 obj +<>]/ID(node00000185)>> +endobj + +152 0 obj +<> +endobj + +153 0 obj +<>]/ID(node00000187)>> +endobj + +154 0 obj +<> +endobj + +155 0 obj +<>]/ID(node00000190)>> +endobj + +156 0 obj +<> +endobj + +157 0 obj +<>]/ID(node00000192)>> +endobj + +158 0 obj +<> +endobj + +159 0 obj +<>]/ID(node00000196)>> +endobj + +160 0 obj +<> +endobj + +161 0 obj +<>]/ID(node00000198)>> +endobj + +162 0 obj +<> +endobj + +163 0 obj +<>]/ID(node00000201)>> +endobj + +164 0 obj +<> +endobj + +165 0 obj +<>]/ID(node00000203)>> +endobj + +166 0 obj +<> +endobj + +167 0 obj +<>]/ID(node00000206)>> +endobj + +168 0 obj +<> +endobj + +169 0 obj +<>]/ID(node00000208)>> +endobj + +170 0 obj +<> +endobj + +171 0 obj +<>]/ID(node00000211)>> +endobj + +172 0 obj +<> +endobj + +173 0 obj +<>]/ID(node00000213)>> +endobj + +174 0 obj +<> +endobj + +175 0 obj +<>]/ID(node00000216)>> +endobj + +176 0 obj +<> +endobj + +177 0 obj +<>]/ID(node00000218)>> +endobj + +178 0 obj +<> +endobj + +179 0 obj +<>]/ID(node00000221)>> +endobj + +180 0 obj +<> +endobj + +181 0 obj +<>]/ID(node00000223)>> +endobj + +182 0 obj +<> +endobj + +183 0 obj +<>]/ID(node00000227)>> +endobj + +184 0 obj +<> +endobj + +185 0 obj +<> +endobj + +186 0 obj +<> +endobj + +187 0 obj +<><><>]/ID(node00000232)>> +endobj + +188 0 obj +<>]/ID(node00000233)>> +endobj + +189 0 obj +<><><>]/ID(node00000234)>> +endobj + +190 0 obj +<>]/ID(node00000235)>> +endobj + +191 0 obj +<><><>]/ID(node00000236)>> +endobj + +192 0 obj +<>]/ID(node00000237)>> +endobj + +193 0 obj +<><><>]/ID(node00000238)>> +endobj + +194 0 obj +<>]/ID(node00000239)>> +endobj + +195 0 obj +<> +endobj + +196 0 obj +<><><>]/ID(node00000242)>> +endobj + +197 0 obj +<>]/ID(node00000243)>> +endobj + +198 0 obj +<> +endobj + +199 0 obj +<><><>]/ID(node00000245)>> +endobj + +200 0 obj +<>]/ID(node00000246)>> +endobj + +201 0 obj +<><><>]/ID(node00000247)>> +endobj + +202 0 obj +<>]/ID(node00000248)>> +endobj + +203 0 obj +<><><>]/ID(node00000249)>> +endobj + +204 0 obj +<>]/ID(node00000250)>> +endobj + +205 0 obj +<><><>]/ID(node00000251)>> +endobj + +206 0 obj +<>]/ID(node00000252)>> +endobj + +207 0 obj +<><><>]/ID(node00000253)>> +endobj + +208 0 obj +<>]/ID(node00000254)>> +endobj + +209 0 obj +<> +endobj + +210 0 obj +<><><>]/ID(node00000256)>> +endobj + +211 0 obj +<>]/ID(node00000257)>> +endobj + +212 0 obj +<><><>]/ID(node00000258)>> +endobj + +213 0 obj +<>]/ID(node00000259)>> +endobj + +214 0 obj +<><><>]/ID(node00000260)>> +endobj + +215 0 obj +<>]/ID(node00000261)>> +endobj + +216 0 obj +<><><>]/ID(node00000262)>> +endobj + +217 0 obj +<>]/ID(node00000263)>> +endobj + +218 0 obj +<><><>]/ID(node00000264)>> +endobj + +219 0 obj +<>]/ID(node00000265)>> +endobj + +220 0 obj +<> +endobj + +221 0 obj +<>]/ID(node00000269)>> +endobj + +222 0 obj +<> +endobj + +223 0 obj +<>]/ID(node00000272)>> +endobj + +224 0 obj +<> +endobj + +225 0 obj +<>]/ID(node00000275)>> +endobj + +226 0 obj +<> +endobj + +227 0 obj +<>]/ID(node00000277)>> +endobj + +228 0 obj +<> +endobj + +229 0 obj +<>]/ID(node00000280)>> +endobj + +230 0 obj +<> +endobj + +231 0 obj +<>]/ID(node00000282)>> +endobj + +232 0 obj +<> +endobj + +233 0 obj +<>]/ID(node00000285)>> +endobj + +234 0 obj +<> +endobj + +235 0 obj +<>]/ID(node00000287)>> +endobj + +236 0 obj +<> +endobj + +237 0 obj +<>]/ID(node00000290)>> +endobj + +238 0 obj +<> +endobj + +239 0 obj +<>]/ID(node00000292)>> +endobj + +240 0 obj +<> +endobj + +241 0 obj +<><>]/ID(node00000296)>> +endobj + +242 0 obj +<> +endobj + +243 0 obj +<>]/ID(node00000298)>> +endobj + +244 0 obj +<> +endobj + +245 0 obj +<>]/ID(node00000303)>> +endobj + +246 0 obj +<> +endobj + +247 0 obj +<>]/ID(node00000305)>> +endobj + +248 0 obj +<> +endobj + +249 0 obj +<>]/ID(node00000309)>> +endobj + +250 0 obj +<> +endobj + +251 0 obj +<>]/ID(node00000312)>> +endobj + +252 0 obj +<> +endobj + +253 0 obj +<>]/ID(node00000315)>> +endobj + +254 0 obj +<> +endobj + +255 0 obj +<>]/ID(node00000317)>> +endobj + +256 0 obj +<> +endobj + +257 0 obj +<>]/ID(node00000320)>> +endobj + +258 0 obj +<> +endobj + +259 0 obj +<>]/ID(node00000322)>> +endobj + +260 0 obj +<> +endobj + +261 0 obj +<>]/ID(node00000325)>> +endobj + +262 0 obj +<> +endobj + +263 0 obj +<>]/ID(node00000327)>> +endobj + +264 0 obj +<> +endobj + +265 0 obj +<>]/ID(node00000330)>> +endobj + +266 0 obj +<> +endobj + +267 0 obj +<>]/ID(node00000332)>> +endobj + +268 0 obj +<> +endobj + +269 0 obj +<>]/ID(node00000335)>> +endobj + +270 0 obj +<> +endobj + +271 0 obj +<>]/ID(node00000337)>> +endobj + +272 0 obj +<> +endobj + +273 0 obj +<>]/ID(node00000340)>> +endobj + +274 0 obj +<> +endobj + +275 0 obj +<>]/ID(node00000342)>> +endobj + +276 0 obj +<> +endobj + +277 0 obj +<>]/ID(node00000345)>> +endobj + +278 0 obj +<> +endobj + +279 0 obj +<>]/ID(node00000347)>> +endobj + +280 0 obj +<> +endobj + +281 0 obj +<>]/ID(node00000350)>> +endobj + +282 0 obj +<> +endobj + +283 0 obj +<>]/ID(node00000352)>> +endobj + +284 0 obj +<> +endobj + +285 0 obj +<>]/ID(node00000355)>> +endobj + +286 0 obj +<> +endobj + +287 0 obj +<>]/ID(node00000357)>> +endobj + +288 0 obj +<> +endobj + +289 0 obj +<>]/ID(node00000360)>> +endobj + +290 0 obj +<> +endobj + +291 0 obj +<>]/ID(node00000362)>> +endobj + +292 0 obj +<> +endobj + +293 0 obj +<>]/ID(node00000365)>> +endobj + +294 0 obj +<> +endobj + +295 0 obj +<>]/ID(node00000367)>> +endobj + +296 0 obj +<> +endobj + +297 0 obj +<>]/ID(node00000371)>> +endobj + +298 0 obj +<> +endobj + +299 0 obj +<>]/ID(node00000374)>> +endobj + +300 0 obj +<> +endobj + +301 0 obj +<>]/ID(node00000376)>> +endobj + +302 0 obj +<> +endobj + +303 0 obj +<>]/ID(node00000379)>> +endobj + +304 0 obj +<> +endobj + +305 0 obj +<>]/ID(node00000381)>> +endobj + +306 0 obj +<> +endobj + +307 0 obj +<>]/ID(node00000384)>> +endobj + +308 0 obj +<> +endobj + +309 0 obj +<>]/ID(node00000386)>> +endobj + +310 0 obj +<> +endobj + +311 0 obj +<>]/ID(node00000389)>> +endobj + +312 0 obj +<> +endobj + +313 0 obj +<>]/ID(node00000391)>> +endobj + +314 0 obj +<> +endobj + +315 0 obj +<>]/ID(node00000394)>> +endobj + +316 0 obj +<> +endobj + +317 0 obj +<>]/ID(node00000396)>> +endobj + +318 0 obj +<> +endobj + +319 0 obj +<>]/ID(node00000399)>> +endobj + +320 0 obj +<> +endobj + +321 0 obj +<>]/ID(node00000401)>> +endobj + +322 0 obj +<> +endobj + +323 0 obj +<>]/ID(node00000404)>> +endobj + +324 0 obj +<> +endobj + +325 0 obj +<>]/ID(node00000406)>> +endobj + +326 0 obj +<> +endobj + +327 0 obj +<>]/ID(node00000409)>> +endobj + +328 0 obj +<> +endobj + +329 0 obj +<>]/ID(node00000411)>> +endobj + +330 0 obj +<> +endobj + +331 0 obj +<>]/ID(node00000414)>> +endobj + +332 0 obj +<> +endobj + +333 0 obj +<>]/ID(node00000416)>> +endobj + +334 0 obj +<> +endobj + +335 0 obj +<>]/ID(node00000419)>> +endobj + +336 0 obj +<> +endobj + +337 0 obj +<>]/ID(node00000421)>> +endobj + +338 0 obj +<> +endobj + +339 0 obj +<>]/ID(node00000424)>> +endobj + +340 0 obj +<> +endobj + +341 0 obj +<>]/ID(node00000426)>> +endobj + +342 0 obj +<> +endobj + +343 0 obj +<>]/ID(node00000430)>> +endobj + +344 0 obj +<> +endobj + +345 0 obj +<>]/ID(node00000433)>> +endobj + +346 0 obj +<> +endobj + +347 0 obj +<>]/ID(node00000435)>> +endobj + +348 0 obj +<> +endobj + +349 0 obj +<>]/ID(node00000438)>> +endobj + +350 0 obj +<> +endobj + +351 0 obj +<>]/ID(node00000440)>> +endobj + +352 0 obj +<> +endobj + +353 0 obj +<>]/ID(node00000443)>> +endobj + +354 0 obj +<> +endobj + +355 0 obj +<>]/ID(node00000445)>> +endobj + +356 0 obj +<> +endobj + +357 0 obj +<>]/ID(node00000448)>> +endobj + +358 0 obj +<> +endobj + +359 0 obj +<>]/ID(node00000450)>> +endobj + +360 0 obj +<> +endobj + +361 0 obj +<>]/ID(node00000453)>> +endobj + +362 0 obj +<> +endobj + +363 0 obj +<>]/ID(node00000455)>> +endobj + +364 0 obj +<> +endobj + +365 0 obj +<>]/ID(node00000458)>> +endobj + +366 0 obj +<> +endobj + +367 0 obj +<>]/ID(node00000460)>> +endobj + +368 0 obj +<> +endobj + +369 0 obj +<>]/ID(node00000463)>> +endobj + +370 0 obj +<> +endobj + +371 0 obj +<>]/ID(node00000465)>> +endobj + +372 0 obj +<> +endobj + +373 0 obj +<>]/ID(node00000468)>> +endobj + +374 0 obj +<> +endobj + +375 0 obj +<>]/ID(node00000470)>> +endobj + +376 0 obj +<> +endobj + +377 0 obj +<>]/ID(node00000473)>> +endobj + +378 0 obj +<> +endobj + +379 0 obj +<>]/ID(node00000475)>> +endobj + +380 0 obj +<> +endobj + +381 0 obj +<>]/ID(node00000478)>> +endobj + +382 0 obj +<> +endobj + +383 0 obj +<>]/ID(node00000480)>> +endobj + +384 0 obj +<> +endobj + +385 0 obj +<>]/ID(node00000483)>> +endobj + +386 0 obj +<> +endobj + +387 0 obj +<>]/ID(node00000485)>> +endobj + +388 0 obj +<> +endobj + +389 0 obj +<>]/ID(node00000489)>> +endobj + +390 0 obj +<> +endobj + +391 0 obj +<>]/ID(node00000492)>> +endobj + +392 0 obj +<> +endobj + +393 0 obj +<>]/ID(node00000494)>> +endobj + +394 0 obj +<> +endobj + +395 0 obj +<>]/ID(node00000497)>> +endobj + +396 0 obj +<> +endobj + +397 0 obj +<>]/ID(node00000499)>> +endobj + +398 0 obj +<> +endobj + +399 0 obj +<>]/ID(node00000502)>> +endobj + +400 0 obj +<> +endobj + +401 0 obj +<>]/ID(node00000504)>> +endobj + +402 0 obj +<> +endobj + +403 0 obj +<>]/ID(node00000507)>> +endobj + +404 0 obj +<> +endobj + +405 0 obj +<>]/ID(node00000509)>> +endobj + +406 0 obj +<> +endobj + +407 0 obj +<>]/ID(node00000512)>> +endobj + +408 0 obj +<> +endobj + +409 0 obj +<>]/ID(node00000514)>> +endobj + +410 0 obj +<> +endobj + +411 0 obj +<>]/ID(node00000517)>> +endobj + +412 0 obj +<> +endobj + +413 0 obj +<>]/ID(node00000519)>> +endobj + +414 0 obj +<> +endobj + +415 0 obj +<>]/ID(node00000522)>> +endobj + +416 0 obj +<> +endobj + +417 0 obj +<>]/ID(node00000524)>> +endobj + +418 0 obj +<> +endobj + +419 0 obj +<>]/ID(node00000527)>> +endobj + +420 0 obj +<> +endobj + +421 0 obj +<>]/ID(node00000529)>> +endobj + +422 0 obj +<> +endobj + +423 0 obj +<>]/ID(node00000532)>> +endobj + +424 0 obj +<> +endobj + +425 0 obj +<>]/ID(node00000534)>> +endobj + +426 0 obj +<> +endobj + +427 0 obj +<>]/ID(node00000537)>> +endobj + +428 0 obj +<> +endobj + +429 0 obj +<>]/ID(node00000539)>> +endobj + +430 0 obj +<> +endobj + +431 0 obj +<>]/ID(node00000542)>> +endobj + +432 0 obj +<> +endobj + +433 0 obj +<>]/ID(node00000544)>> +endobj + +434 0 obj +<> +endobj + +435 0 obj +<>]/ID(node00000548)>> +endobj + +436 0 obj +<> +endobj + +437 0 obj +<>]/ID(node00000551)>> +endobj + +438 0 obj +<> +endobj + +439 0 obj +<>]/ID(node00000553)>> +endobj + +440 0 obj +<> +endobj + +441 0 obj +<>]/ID(node00000556)>> +endobj + +442 0 obj +<> +endobj + +443 0 obj +<>]/ID(node00000558)>> +endobj + +444 0 obj +<> +endobj + +445 0 obj +<>]/ID(node00000561)>> +endobj + +446 0 obj +<> +endobj + +447 0 obj +<>]/ID(node00000563)>> +endobj + +448 0 obj +<> +endobj + +449 0 obj +<>]/ID(node00000566)>> +endobj + +450 0 obj +<> +endobj + +451 0 obj +<>]/ID(node00000568)>> +endobj + +452 0 obj +<> +endobj + +453 0 obj +<>]/ID(node00000571)>> +endobj + +454 0 obj +<> +endobj + +455 0 obj +<>]/ID(node00000573)>> +endobj + +456 0 obj +<> +endobj + +457 0 obj +<>]/ID(node00000576)>> +endobj + +458 0 obj +<> +endobj + +459 0 obj +<>]/ID(node00000578)>> +endobj + +460 0 obj +<> +endobj + +461 0 obj +<>]/ID(node00000581)>> +endobj + +462 0 obj +<> +endobj + +463 0 obj +<>]/ID(node00000583)>> +endobj + +464 0 obj +<> +endobj + +465 0 obj +<>]/ID(node00000586)>> +endobj + +466 0 obj +<> +endobj + +467 0 obj +<>]/ID(node00000588)>> +endobj + +468 0 obj +<> +endobj + +469 0 obj +<>]/ID(node00000591)>> +endobj + +470 0 obj +<> +endobj + +471 0 obj +<>]/ID(node00000593)>> +endobj + +472 0 obj +<> +endobj + +473 0 obj +<>]/ID(node00000596)>> +endobj + +474 0 obj +<> +endobj + +475 0 obj +<>]/ID(node00000598)>> +endobj + +476 0 obj +<> +endobj + +477 0 obj +<>]/ID(node00000601)>> +endobj + +478 0 obj +<> +endobj + +479 0 obj +<>]/ID(node00000603)>> +endobj + +480 0 obj +<> +endobj + +481 0 obj +<>]/ID(node00000607)>> +endobj + +482 0 obj +<> +endobj + +483 0 obj +<>]/ID(node00000610)>> +endobj + +484 0 obj +<> +endobj + +485 0 obj +<>]/ID(node00000612)>> +endobj + +486 0 obj +<> +endobj + +487 0 obj +<>]/ID(node00000615)>> +endobj + +488 0 obj +<> +endobj + +489 0 obj +<>]/ID(node00000617)>> +endobj + +490 0 obj +<> +endobj + +491 0 obj +<>]/ID(node00000620)>> +endobj + +492 0 obj +<> +endobj + +493 0 obj +<>]/ID(node00000622)>> +endobj + +494 0 obj +<> +endobj + +495 0 obj +<>]/ID(node00000625)>> +endobj + +496 0 obj +<> +endobj + +497 0 obj +<>]/ID(node00000627)>> +endobj + +498 0 obj +<> +endobj + +499 0 obj +<>]/ID(node00000630)>> +endobj + +500 0 obj +<> +endobj + +501 0 obj +<>]/ID(node00000632)>> +endobj + +502 0 obj +<> +endobj + +503 0 obj +<>]/ID(node00000635)>> +endobj + +504 0 obj +<> +endobj + +505 0 obj +<>]/ID(node00000637)>> +endobj + +506 0 obj +<> +endobj + +507 0 obj +<>]/ID(node00000640)>> +endobj + +508 0 obj +<> +endobj + +509 0 obj +<>]/ID(node00000642)>> +endobj + +510 0 obj +<> +endobj + +511 0 obj +<>]/ID(node00000645)>> +endobj + +512 0 obj +<> +endobj + +513 0 obj +<>]/ID(node00000647)>> +endobj + +514 0 obj +<> +endobj + +515 0 obj +<>]/ID(node00000650)>> +endobj + +516 0 obj +<> +endobj + +517 0 obj +<>]/ID(node00000652)>> +endobj + +518 0 obj +<> +endobj + +519 0 obj +<>]/ID(node00000655)>> +endobj + +520 0 obj +<> +endobj + +521 0 obj +<>]/ID(node00000657)>> +endobj + +522 0 obj +<> +endobj + +523 0 obj +<>]/ID(node00000660)>> +endobj + +524 0 obj +<> +endobj + +525 0 obj +<>]/ID(node00000662)>> +endobj + +526 0 obj +<> +endobj + +527 0 obj +<>]/ID(node00000666)>> +endobj + +528 0 obj +<> +endobj + +529 0 obj +<>]/ID(node00000669)>> +endobj + +530 0 obj +<> +endobj + +531 0 obj +<>]/ID(node00000671)>> +endobj + +532 0 obj +<> +endobj + +533 0 obj +<>]/ID(node00000674)>> +endobj + +534 0 obj +<> +endobj + +535 0 obj +<>]/ID(node00000676)>> +endobj + +536 0 obj +<> +endobj + +537 0 obj +<>]/ID(node00000679)>> +endobj + +538 0 obj +<> +endobj + +539 0 obj +<>]/ID(node00000681)>> +endobj + +540 0 obj +<> +endobj + +541 0 obj +<>]/ID(node00000684)>> +endobj + +542 0 obj +<> +endobj + +543 0 obj +<>]/ID(node00000686)>> +endobj + +544 0 obj +<> +endobj + +545 0 obj +<>]/ID(node00000689)>> +endobj + +546 0 obj +<> +endobj + +547 0 obj +<>]/ID(node00000691)>> +endobj + +548 0 obj +<> +endobj + +549 0 obj +<>]/ID(node00000694)>> +endobj + +550 0 obj +<> +endobj + +551 0 obj +<>]/ID(node00000696)>> +endobj + +552 0 obj +<> +endobj + +553 0 obj +<>]/ID(node00000699)>> +endobj + +554 0 obj +<> +endobj + +555 0 obj +<>]/ID(node00000701)>> +endobj + +556 0 obj +<> +endobj + +557 0 obj +<>]/ID(node00000704)>> +endobj + +558 0 obj +<> +endobj + +559 0 obj +<>]/ID(node00000706)>> +endobj + +560 0 obj +<> +endobj + +561 0 obj +<>]/ID(node00000709)>> +endobj + +562 0 obj +<> +endobj + +563 0 obj +<>]/ID(node00000711)>> +endobj + +564 0 obj +<> +endobj + +565 0 obj +<>]/ID(node00000714)>> +endobj + +566 0 obj +<> +endobj + +567 0 obj +<>]/ID(node00000716)>> +endobj + +568 0 obj +<> +endobj + +569 0 obj +<>]/ID(node00000719)>> +endobj + +570 0 obj +<> +endobj + +571 0 obj +<>]/ID(node00000721)>> +endobj + +572 0 obj +<> +endobj + +573 0 obj +<>]/ID(node00000725)>> +endobj + +574 0 obj +<> +endobj + +575 0 obj +<>]/ID(node00000728)>> +endobj + +576 0 obj +<> +endobj + +577 0 obj +<>]/ID(node00000730)>> +endobj + +578 0 obj +<> +endobj + +579 0 obj +<>]/ID(node00000733)>> +endobj + +580 0 obj +<> +endobj + +581 0 obj +<>]/ID(node00000735)>> +endobj + +582 0 obj +<> +endobj + +583 0 obj +<>]/ID(node00000738)>> +endobj + +584 0 obj +<> +endobj + +585 0 obj +<>]/ID(node00000740)>> +endobj + +586 0 obj +<> +endobj + +587 0 obj +<>]/ID(node00000743)>> +endobj + +588 0 obj +<> +endobj + +589 0 obj +<>]/ID(node00000745)>> +endobj + +590 0 obj +<> +endobj + +591 0 obj +<>]/ID(node00000748)>> +endobj + +592 0 obj +<> +endobj + +593 0 obj +<>]/ID(node00000750)>> +endobj + +594 0 obj +<> +endobj + +595 0 obj +<>]/ID(node00000753)>> +endobj + +596 0 obj +<> +endobj + +597 0 obj +<>]/ID(node00000755)>> +endobj + +598 0 obj +<> +endobj + +599 0 obj +<>]/ID(node00000758)>> +endobj + +600 0 obj +<> +endobj + +601 0 obj +<>]/ID(node00000760)>> +endobj + +602 0 obj +<> +endobj + +603 0 obj +<>]/ID(node00000763)>> +endobj + +604 0 obj +<> +endobj + +605 0 obj +<>]/ID(node00000765)>> +endobj + +606 0 obj +<> +endobj + +607 0 obj +<>]/ID(node00000768)>> +endobj + +608 0 obj +<> +endobj + +609 0 obj +<>]/ID(node00000770)>> +endobj + +610 0 obj +<> +endobj + +611 0 obj +<>]/ID(node00000773)>> +endobj + +612 0 obj +<> +endobj + +613 0 obj +<>]/ID(node00000775)>> +endobj + +614 0 obj +<> +endobj + +615 0 obj +<>]/ID(node00000778)>> +endobj + +616 0 obj +<> +endobj + +617 0 obj +<>]/ID(node00000780)>> +endobj + +618 0 obj +<> +endobj + +619 0 obj +<>]/ID(node00000784)>> +endobj + +620 0 obj +<> +endobj + +621 0 obj +<>]/ID(node00000787)>> +endobj + +622 0 obj +<> +endobj + +623 0 obj +<>]/ID(node00000789)>> +endobj + +624 0 obj +<> +endobj + +625 0 obj +<>]/ID(node00000792)>> +endobj + +626 0 obj +<> +endobj + +627 0 obj +<>]/ID(node00000794)>> +endobj + +628 0 obj +<> +endobj + +629 0 obj +<>]/ID(node00000797)>> +endobj + +630 0 obj +<> +endobj + +631 0 obj +<>]/ID(node00000799)>> +endobj + +632 0 obj +<> +endobj + +633 0 obj +<>]/ID(node00000802)>> +endobj + +634 0 obj +<> +endobj + +635 0 obj +<>]/ID(node00000804)>> +endobj + +636 0 obj +<> +endobj + +637 0 obj +<>]/ID(node00000807)>> +endobj + +638 0 obj +<> +endobj + +639 0 obj +<>]/ID(node00000809)>> +endobj + +640 0 obj +<> +endobj + +641 0 obj +<>]/ID(node00000812)>> +endobj + +642 0 obj +<> +endobj + +643 0 obj +<>]/ID(node00000814)>> +endobj + +644 0 obj +<> +endobj + +645 0 obj +<>]/ID(node00000817)>> +endobj + +646 0 obj +<> +endobj + +647 0 obj +<>]/ID(node00000819)>> +endobj + +648 0 obj +<> +endobj + +649 0 obj +<>]/ID(node00000822)>> +endobj + +650 0 obj +<> +endobj + +651 0 obj +<>]/ID(node00000824)>> +endobj + +652 0 obj +<> +endobj + +653 0 obj +<>]/ID(node00000827)>> +endobj + +654 0 obj +<> +endobj + +655 0 obj +<>]/ID(node00000829)>> +endobj + +656 0 obj +<> +endobj + +657 0 obj +<>]/ID(node00000832)>> +endobj + +658 0 obj +<> +endobj + +659 0 obj +<>]/ID(node00000834)>> +endobj + +660 0 obj +<> +endobj + +661 0 obj +<>]/ID(node00000837)>> +endobj + +662 0 obj +<> +endobj + +663 0 obj +<>]/ID(node00000839)>> +endobj + +664 0 obj +<> +endobj + +665 0 obj +<>]/ID(node00000843)>> +endobj + +666 0 obj +<> +endobj + +667 0 obj +<>]/ID(node00000846)>> +endobj + +668 0 obj +<> +endobj + +669 0 obj +<>]/ID(node00000848)>> +endobj + +670 0 obj +<> +endobj + +671 0 obj +<>]/ID(node00000851)>> +endobj + +672 0 obj +<> +endobj + +673 0 obj +<>]/ID(node00000853)>> +endobj + +674 0 obj +<> +endobj + +675 0 obj +<>]/ID(node00000856)>> +endobj + +676 0 obj +<> +endobj + +677 0 obj +<>]/ID(node00000858)>> +endobj + +678 0 obj +<> +endobj + +679 0 obj +<>]/ID(node00000861)>> +endobj + +680 0 obj +<> +endobj + +681 0 obj +<>]/ID(node00000863)>> +endobj + +682 0 obj +<> +endobj + +683 0 obj +<>]/ID(node00000866)>> +endobj + +684 0 obj +<> +endobj + +685 0 obj +<>]/ID(node00000868)>> +endobj + +686 0 obj +<> +endobj + +687 0 obj +<>]/ID(node00000871)>> +endobj + +688 0 obj +<> +endobj + +689 0 obj +<>]/ID(node00000873)>> +endobj + +690 0 obj +<> +endobj + +691 0 obj +<>]/ID(node00000876)>> +endobj + +692 0 obj +<> +endobj + +693 0 obj +<>]/ID(node00000878)>> +endobj + +694 0 obj +<> +endobj + +695 0 obj +<>]/ID(node00000881)>> +endobj + +696 0 obj +<> +endobj + +697 0 obj +<>]/ID(node00000883)>> +endobj + +698 0 obj +<> +endobj + +699 0 obj +<>]/ID(node00000886)>> +endobj + +700 0 obj +<> +endobj + +701 0 obj +<>]/ID(node00000888)>> +endobj + +702 0 obj +<> +endobj + +703 0 obj +<>]/ID(node00000891)>> +endobj + +704 0 obj +<> +endobj + +705 0 obj +<>]/ID(node00000893)>> +endobj + +706 0 obj +<> +endobj + +707 0 obj +<>]/ID(node00000896)>> +endobj + +708 0 obj +<> +endobj + +709 0 obj +<>]/ID(node00000898)>> +endobj + +710 0 obj +<> +endobj + +711 0 obj +<>]/ID(node00000903)>> +endobj + +712 0 obj +<> +endobj + +713 0 obj +<>]/ID(node00000907)>> +endobj + +714 0 obj +<> +endobj + +715 0 obj +<>]/ID(node00000910)>> +endobj + +716 0 obj +<> +endobj + +717 0 obj +<>]/ID(node00000913)>> +endobj + +718 0 obj +<> +endobj + +719 0 obj +<>]/ID(node00000915)>> +endobj + +720 0 obj +<> +endobj + +721 0 obj +<>]/ID(node00000918)>> +endobj + +722 0 obj +<> +endobj + +723 0 obj +<>]/ID(node00000920)>> +endobj + +724 0 obj +<> +endobj + +725 0 obj +<>]/ID(node00000923)>> +endobj + +726 0 obj +<> +endobj + +727 0 obj +<>]/ID(node00000925)>> +endobj + +728 0 obj +<> +endobj + +729 0 obj +<>]/ID(node00000928)>> +endobj + +730 0 obj +<> +endobj + +731 0 obj +<>]/ID(node00000930)>> +endobj + +732 0 obj +<> +endobj + +733 0 obj +<>]/ID(node00000933)>> +endobj + +734 0 obj +<> +endobj + +735 0 obj +<>]/ID(node00000935)>> +endobj + +736 0 obj +<> +endobj + +737 0 obj +<>]/ID(node00000938)>> +endobj + +738 0 obj +<> +endobj + +739 0 obj +<>]/ID(node00000940)>> +endobj + +740 0 obj +<> +endobj + +741 0 obj +<>]/ID(node00000943)>> +endobj + +742 0 obj +<> +endobj + +743 0 obj +<>]/ID(node00000945)>> +endobj + +744 0 obj +<> +endobj + +745 0 obj +<>]/ID(node00000948)>> +endobj + +746 0 obj +<> +endobj + +747 0 obj +<>]/ID(node00000950)>> +endobj + +748 0 obj +<> +endobj + +749 0 obj +<>]/ID(node00000953)>> +endobj + +750 0 obj +<> +endobj + +751 0 obj +<>]/ID(node00000955)>> +endobj + +752 0 obj +<> +endobj + +753 0 obj +<>]/ID(node00000958)>> +endobj + +754 0 obj +<> +endobj + +755 0 obj +<>]/ID(node00000960)>> +endobj + +756 0 obj +<> +endobj + +757 0 obj +<>]/ID(node00000963)>> +endobj + +758 0 obj +<> +endobj + +759 0 obj +<>]/ID(node00000965)>> +endobj + +760 0 obj +<> +endobj + +761 0 obj +<>]/ID(node00000968)>> +endobj + +762 0 obj +<> +endobj + +763 0 obj +<>]/ID(node00000970)>> +endobj + +764 0 obj +<> +endobj + +765 0 obj +<>]/ID(node00000973)>> +endobj + +766 0 obj +<> +endobj + +767 0 obj +<>]/ID(node00000975)>> +endobj + +768 0 obj +<> +endobj + +769 0 obj +<>]/ID(node00000978)>> +endobj + +770 0 obj +<> +endobj + +771 0 obj +<>]/ID(node00000980)>> +endobj + +772 0 obj +<> +endobj + +773 0 obj +<>]/ID(node00000983)>> +endobj + +774 0 obj +<> +endobj + +775 0 obj +<>]/ID(node00000985)>> +endobj + +776 0 obj +<> +endobj + +777 0 obj +<>]/ID(node00000988)>> +endobj + +778 0 obj +<> +endobj + +779 0 obj +<>]/ID(node00000990)>> +endobj + +780 0 obj +<> +endobj + +781 0 obj +<>]/ID(node00000993)>> +endobj + +782 0 obj +<> +endobj + +783 0 obj +<>]/ID(node00000995)>> +endobj + +784 0 obj +<> +endobj + +785 0 obj +<><>]/ID(node00000998)>> +endobj + +786 0 obj +<> +endobj + +787 0 obj +<>]/ID(node00001000)>> +endobj + +788 0 obj +<> +endobj + +789 0 obj +<>]/ID(node00001003)>> +endobj + +790 0 obj +<> +endobj + +791 0 obj +<>]/ID(node00001005)>> +endobj + +792 0 obj +<> +endobj + +793 0 obj +<>]/ID(node00001008)>> +endobj + +794 0 obj +<> +endobj + +795 0 obj +<>]/ID(node00001010)>> +endobj + +796 0 obj +<> +endobj + +797 0 obj +<>]/ID(node00001013)>> +endobj + +798 0 obj +<> +endobj + +799 0 obj +<>]/ID(node00001015)>> +endobj + +800 0 obj +<> +endobj + +801 0 obj +<>]/ID(node00001021)>> +endobj + +802 0 obj +<> +endobj + +803 0 obj +<>]/ID(node00001024)>> +endobj + +804 0 obj +<> +endobj + +805 0 obj +<>]/ID(node00001026)>> +endobj + +806 0 obj +<> +endobj + +807 0 obj +<>]/ID(node00001030)>> +endobj + +808 0 obj +<> +endobj + +809 0 obj +<>]/ID(node00001033)>> +endobj + +810 0 obj +<> +endobj + +811 0 obj +<>]/ID(node00001035)>> +endobj + +812 0 obj +<> +endobj + +813 0 obj +<>]/ID(node00001038)>> +endobj + +814 0 obj +<> +endobj + +815 0 obj +<>]/ID(node00001040)>> +endobj + +816 0 obj +<> +endobj + +817 0 obj +<>]/ID(node00001043)>> +endobj + +818 0 obj +<> +endobj + +819 0 obj +<>]/ID(node00001045)>> +endobj + +820 0 obj +<> +endobj + +821 0 obj +<>]/ID(node00001049)>> +endobj + +822 0 obj +<> +endobj + +823 0 obj +<>]/ID(node00001052)>> +endobj + +824 0 obj +<> +endobj + +825 0 obj +<>]/ID(node00001054)>> +endobj + +826 0 obj +<> +endobj + +827 0 obj +<>]/ID(node00001058)>> +endobj + +828 0 obj +<> +endobj + +829 0 obj +<>]/ID(node00001060)>> +endobj + +830 0 obj +<> +endobj + +831 0 obj +<>]/ID(node00001063)>> +endobj + +832 0 obj +<> +endobj + +833 0 obj +<>]/ID(node00001065)>> +endobj + +834 0 obj +<> +endobj + +835 0 obj +<>]/ID(node00001068)>> +endobj + +836 0 obj +<> +endobj + +837 0 obj +<>]/ID(node00001070)>> +endobj + +838 0 obj +<> +endobj + +839 0 obj +<>]/ID(node00001073)>> +endobj + +840 0 obj +<> +endobj + +841 0 obj +<>]/ID(node00001075)>> +endobj + +842 0 obj +<> +endobj + +843 0 obj +<>]/ID(node00001078)>> +endobj + +844 0 obj +<> +endobj + +845 0 obj +<>]/ID(node00001080)>> +endobj + +846 0 obj +<> +endobj + +847 0 obj +<>]/ID(node00001084)>> +endobj + +848 0 obj +<> +endobj + +849 0 obj +<>]/ID(node00001086)>> +endobj + +850 0 obj +<> +endobj + +851 0 obj +<>]/ID(node00001089)>> +endobj + +852 0 obj +<> +endobj + +853 0 obj +<>]/ID(node00001091)>> +endobj + +854 0 obj +<> +endobj + +855 0 obj +<>]/ID(node00001095)>> +endobj + +856 0 obj +<> +endobj + +857 0 obj +<>]/ID(node00001097)>> +endobj + +858 0 obj +<> +endobj + +859 0 obj +<>]/ID(node00001100)>> +endobj + +860 0 obj +<> +endobj + +861 0 obj +<>]/ID(node00001102)>> +endobj + +862 0 obj +<> +endobj + +863 0 obj +<>]/ID(node00001105)>> +endobj + +864 0 obj +<> +endobj + +865 0 obj +<>]/ID(node00001107)>> +endobj + +866 0 obj +<> +endobj + +867 0 obj +<>]/ID(node00001110)>> +endobj + +868 0 obj +<> +endobj + +869 0 obj +<>]/ID(node00001112)>> +endobj + +870 0 obj +<> +endobj + +871 0 obj +<>]/ID(node00001116)>> +endobj + +872 0 obj +<> +endobj + +873 0 obj +<>]/ID(node00001119)>> +endobj + +874 0 obj +<> +endobj + +875 0 obj +<>]/ID(node00001121)>> +endobj + +876 0 obj +<> +endobj + +877 0 obj +<>]/ID(node00001125)>> +endobj + +878 0 obj +<> +endobj + +879 0 obj +<>]/ID(node00001129)>> +endobj + +880 0 obj +<> +endobj + +881 0 obj +<>]/ID(node00001132)>> +endobj + +882 0 obj +<> +endobj + +883 0 obj +<>]/ID(node00001134)>> +endobj + +884 0 obj +<> +endobj + +885 0 obj +<>]/ID(node00001138)>> +endobj + +886 0 obj +<> +endobj + +887 0 obj +<>]/ID(node00001141)>> +endobj + +888 0 obj +<> +endobj + +889 0 obj +<>]/ID(node00001143)>> +endobj + +890 0 obj +<> +endobj + +891 0 obj +<>]/ID(node00001147)>> +endobj + +892 0 obj +<> +endobj + +893 0 obj +<>]/ID(node00001150)>> +endobj + +894 0 obj +<> +endobj + +895 0 obj +<>]/ID(node00001152)>> +endobj + +896 0 obj +<> +endobj + +897 0 obj +<>]/ID(node00001155)>> +endobj + +898 0 obj +<> +endobj + +899 0 obj +<>]/ID(node00001157)>> +endobj + +900 0 obj +<> +endobj + +901 0 obj +<>]/ID(node00001161)>> +endobj + +902 0 obj +<> +endobj + +903 0 obj +<>]/ID(node00001164)>> +endobj + +904 0 obj +<> +endobj + +905 0 obj +<>]/ID(node00001166)>> +endobj + +906 0 obj +<> +endobj + +907 0 obj +<>]/ID(node00001170)>> +endobj + +908 0 obj +<> +endobj + +909 0 obj +<>]/ID(node00001173)>> +endobj + +910 0 obj +<> +endobj + +911 0 obj +<>]/ID(node00001175)>> +endobj + +912 0 obj +<> +endobj + +913 0 obj +<>]/ID(node00001178)>> +endobj + +914 0 obj +<> +endobj + +915 0 obj +<>]/ID(node00001180)>> +endobj + +916 0 obj +<> +endobj + +917 0 obj +<>]/ID(node00001183)>> +endobj + +918 0 obj +<> +endobj + +919 0 obj +<>]/ID(node00001185)>> +endobj + +920 0 obj +<> +endobj + +921 0 obj +<>]/ID(node00001188)>> +endobj + +922 0 obj +<> +endobj + +923 0 obj +<>]/ID(node00001190)>> +endobj + +924 0 obj +<> +endobj + +925 0 obj +<>]/ID(node00001193)>> +endobj + +926 0 obj +<> +endobj + +927 0 obj +<>]/ID(node00001195)>> +endobj + +928 0 obj +<> +endobj + +929 0 obj +<>]/ID(node00001198)>> +endobj + +930 0 obj +<> +endobj + +931 0 obj +<>]/ID(node00001200)>> +endobj + +932 0 obj +<> +endobj + +933 0 obj +<>]/ID(node00001203)>> +endobj + +934 0 obj +<> +endobj + +935 0 obj +<>]/ID(node00001205)>> +endobj + +936 0 obj +<> +endobj + +937 0 obj +<>]/ID(node00001208)>> +endobj + +938 0 obj +<> +endobj + +939 0 obj +<>]/ID(node00001210)>> +endobj + +940 0 obj +<> +endobj + +941 0 obj +<>]/ID(node00001213)>> +endobj + +942 0 obj +<> +endobj + +943 0 obj +<>]/ID(node00001215)>> +endobj + +944 0 obj +<> +endobj + +945 0 obj +<>]/ID(node00001218)>> +endobj + +946 0 obj +<> +endobj + +947 0 obj +<>]/ID(node00001220)>> +endobj + +948 0 obj +<> +endobj + +949 0 obj +<>]/ID(node00001224)>> +endobj + +950 0 obj +<> +endobj + +951 0 obj +<>]/ID(node00001226)>> +endobj + +952 0 obj +<> +endobj + +953 0 obj +<>]/ID(node00001229)>> +endobj + +954 0 obj +<> +endobj + +955 0 obj +<>]/ID(node00001231)>> +endobj + +956 0 obj +<> +endobj + +957 0 obj +<>]/ID(node00001234)>> +endobj + +958 0 obj +<> +endobj + +959 0 obj +<>]/ID(node00001236)>> +endobj + +960 0 obj +<> +endobj + +961 0 obj +<><>]/ID(node00001239)>> +endobj + +962 0 obj +<> +endobj + +963 0 obj +<>]/ID(node00001241)>> +endobj + +964 0 obj +<> +endobj + +965 0 obj +<>]/ID(node00001245)>> +endobj + +966 0 obj +<> +endobj + +967 0 obj +<>]/ID(node00001248)>> +endobj + +968 0 obj +<> +endobj + +969 0 obj +<>]/ID(node00001251)>> +endobj + +970 0 obj +<> +endobj + +971 0 obj +<>]/ID(node00001253)>> +endobj + +972 0 obj +<> +endobj + +973 0 obj +<>]/ID(node00001258)>> +endobj + +974 0 obj +<> +endobj + +975 0 obj +<>]/ID(node00001261)>> +endobj + +976 0 obj +<> +endobj + +977 0 obj +<>]/ID(node00001263)>> +endobj + +978 0 obj +<> +endobj + +979 0 obj +<>]/ID(node00001267)>> +endobj + +980 0 obj +<> +endobj + +981 0 obj +<>]/ID(node00001270)>> +endobj + +982 0 obj +<> +endobj + +983 0 obj +<>]/ID(node00001272)>> +endobj + +984 0 obj +<> +endobj + +985 0 obj +<>]/ID(node00001275)>> +endobj + +986 0 obj +<> +endobj + +987 0 obj +<>]/ID(node00001277)>> +endobj + +988 0 obj +<> +endobj + +989 0 obj +<><>]/ID(node00001280)>> +endobj + +990 0 obj +<> +endobj + +991 0 obj +<>]/ID(node00001282)>> +endobj + +992 0 obj +<> +endobj + +993 0 obj +<><>]/ID(node00001285)>> +endobj + +994 0 obj +<> +endobj + +995 0 obj +<>]/ID(node00001287)>> +endobj + +996 0 obj +<> +endobj + +997 0 obj +<><>]/ID(node00001290)>> +endobj + +998 0 obj +<> +endobj + +999 0 obj +<>]/ID(node00001292)>> +endobj + +1000 0 obj +<> +endobj + +1001 0 obj +<>]/ID(node00001296)>> +endobj + +1002 0 obj +[21 0 R 21 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R] +endobj + +1003 0 obj +[51 0 R 53 0 R 55 0 R 55 0 R 57 0 R 59 0 R 59 0 R 61 0 R 63 0 R 65 0 R 67 0 R 69 0 R 71 0 R 73 0 R 75 0 R 77 0 R 79 0 R 81 0 R 83 0 R 85 0 R 87 0 R 89 0 R 91 0 R 93 0 R 95 0 R 97 0 R 99 0 R 101 0 R 103 0 R 105 0 R 107 0 R 109 0 R 111 0 R 113 0 R 115 0 R 117 0 R 119 0 R 121 0 R 123 0 R 125 0 R 127 0 R 129 0 R 131 0 R 133 0 R 135 0 R 137 0 R 139 0 R 141 0 R 143 0 R 145 0 R 147 0 R 149 0 R 151 0 R 153 0 R 155 0 R 157 0 R 159 0 R 161 0 R 163 0 R 165 0 R 167 0 R 169 0 R 171 0 R 173 0 R 175 0 R 177 0 R 179 0 R 181 0 R] +endobj + +1004 0 obj +[183 0 R 188 0 R 190 0 R 192 0 R 194 0 R 197 0 R 200 0 R 202 0 R 204 0 R 206 0 R 208 0 R 211 0 R 213 0 R 215 0 R 217 0 R 219 0 R 221 0 R 223 0 R 225 0 R 227 0 R 229 0 R 231 0 R 233 0 R 235 0 R 237 0 R 239 0 R 241 0 R 241 0 R 243 0 R 245 0 R 247 0 R 249 0 R 251 0 R 253 0 R 255 0 R 257 0 R 259 0 R 261 0 R 263 0 R 265 0 R 267 0 R 269 0 R 271 0 R 273 0 R 275 0 R 277 0 R 279 0 R 281 0 R 283 0 R 285 0 R 287 0 R 289 0 R 291 0 R 293 0 R 295 0 R 297 0 R 299 0 R 301 0 R 303 0 R 305 0 R 307 0 R 309 0 R 311 0 R 313 0 R 315 0 R 317 0 R 319 0 R 321 0 R 323 0 R 325 0 R 327 0 R 329 0 R 331 0 R 333 0 R] +endobj + +1005 0 obj +[335 0 R 337 0 R 339 0 R 341 0 R 343 0 R 345 0 R 347 0 R 349 0 R 351 0 R 353 0 R 355 0 R 357 0 R 359 0 R 361 0 R 363 0 R 365 0 R 367 0 R 369 0 R 371 0 R 373 0 R 375 0 R 377 0 R 379 0 R 381 0 R 383 0 R 385 0 R 387 0 R 389 0 R 391 0 R 393 0 R 395 0 R 397 0 R 399 0 R 401 0 R 403 0 R 405 0 R 407 0 R 409 0 R 411 0 R 413 0 R 415 0 R 417 0 R 419 0 R 421 0 R 423 0 R 425 0 R 427 0 R 429 0 R 431 0 R 433 0 R 435 0 R 437 0 R 439 0 R 441 0 R 443 0 R 445 0 R 447 0 R 449 0 R 451 0 R 453 0 R 455 0 R 457 0 R 459 0 R 461 0 R 463 0 R 465 0 R 467 0 R 469 0 R 471 0 R] +endobj + +1006 0 obj +[473 0 R 475 0 R 477 0 R 479 0 R 481 0 R 483 0 R 485 0 R 487 0 R 489 0 R 491 0 R 493 0 R 495 0 R 497 0 R 499 0 R 501 0 R 503 0 R 505 0 R 507 0 R 509 0 R 511 0 R 513 0 R 515 0 R 517 0 R 519 0 R 521 0 R 523 0 R 525 0 R 527 0 R 529 0 R 531 0 R 533 0 R 535 0 R 537 0 R 539 0 R 541 0 R 543 0 R 545 0 R 547 0 R 549 0 R 551 0 R 553 0 R 555 0 R 557 0 R 559 0 R 561 0 R 563 0 R 565 0 R 567 0 R 569 0 R 571 0 R 573 0 R 575 0 R 577 0 R 579 0 R 581 0 R 583 0 R 585 0 R 587 0 R 589 0 R 591 0 R 593 0 R 595 0 R 597 0 R 599 0 R 601 0 R 603 0 R 605 0 R 607 0 R 609 0 R] +endobj + +1007 0 obj +[611 0 R 613 0 R 615 0 R 617 0 R 619 0 R 621 0 R 623 0 R 625 0 R 627 0 R 629 0 R 631 0 R 633 0 R 635 0 R 637 0 R 639 0 R 641 0 R 643 0 R 645 0 R 647 0 R 649 0 R 651 0 R 653 0 R 655 0 R 657 0 R 659 0 R 661 0 R 663 0 R 665 0 R 667 0 R 669 0 R 671 0 R 673 0 R 675 0 R 677 0 R 679 0 R 681 0 R 683 0 R 685 0 R 687 0 R 689 0 R 691 0 R 693 0 R 695 0 R 697 0 R 699 0 R 701 0 R 703 0 R 705 0 R 707 0 R 709 0 R] +endobj + +1008 0 obj +[711 0 R 713 0 R 715 0 R 717 0 R 719 0 R 721 0 R 723 0 R 725 0 R 727 0 R 729 0 R 731 0 R 733 0 R 735 0 R 737 0 R 739 0 R 741 0 R 743 0 R 745 0 R 747 0 R 749 0 R 751 0 R 753 0 R 755 0 R 757 0 R 759 0 R 761 0 R 763 0 R 765 0 R 767 0 R 769 0 R 771 0 R 773 0 R 775 0 R 777 0 R 779 0 R 781 0 R 783 0 R 785 0 R 785 0 R 787 0 R 789 0 R 791 0 R 793 0 R 795 0 R 797 0 R 799 0 R 801 0 R 803 0 R 805 0 R 807 0 R 809 0 R 811 0 R 813 0 R 815 0 R 817 0 R 819 0 R 821 0 R 823 0 R 825 0 R 827 0 R 829 0 R 831 0 R 833 0 R 835 0 R 837 0 R 839 0 R 841 0 R] +endobj + +1009 0 obj +[843 0 R 845 0 R 847 0 R 849 0 R 851 0 R 853 0 R 855 0 R 857 0 R 859 0 R 861 0 R 863 0 R 865 0 R 867 0 R 869 0 R 871 0 R 873 0 R 875 0 R 877 0 R 879 0 R 881 0 R 883 0 R 885 0 R 887 0 R 889 0 R 891 0 R 893 0 R 895 0 R 897 0 R 899 0 R 901 0 R 903 0 R 905 0 R 907 0 R 909 0 R 911 0 R 913 0 R 915 0 R 917 0 R 919 0 R 921 0 R 923 0 R 925 0 R 927 0 R 929 0 R 931 0 R 933 0 R 935 0 R 937 0 R 939 0 R 941 0 R 943 0 R 945 0 R 947 0 R 949 0 R 951 0 R 953 0 R 955 0 R 957 0 R 959 0 R 961 0 R 961 0 R 963 0 R] +endobj + +1010 0 obj +[965 0 R 967 0 R 969 0 R 971 0 R 973 0 R 975 0 R 977 0 R 979 0 R 981 0 R 983 0 R 985 0 R 987 0 R 989 0 R 989 0 R 991 0 R 993 0 R 993 0 R 995 0 R 997 0 R 997 0 R 999 0 R 1001 0 R] +endobj + +1011 0 obj +<> +endobj + +1012 0 obj +<> +endobj + +1013 0 obj +<> +endobj + +1014 0 obj +<>/StructTreeRoot 18 0 R/ViewerPreferences<>/Lang(en-US)>> +endobj + +1015 0 obj +<> +stream +x} tGަ{g4FjX%dY{l+^رc8q I^1 <^<#AHHf;^z͎mGk~ˆM;=<`on `@ WZ'`֍k7\o|uk@ƍ&O;/@+ qӶGVY3Q=_N4s( +yb:]y~Z붑[a'[]wy` a0`5l+ `$r3`>Nz d;|WneM1Ax{Nx a[|޹ pd1 {!,e@+#X `0 0 Fa݄w +20WB~rTS,?nr+8XY9g*pCrnܕs \a3lPp \ k Q:za.\saߨgxai\[`\ W4@#4=0 WE B'uu ޵FXk7vkv ٵcah@ +-&lK{!}^*; #w"; +܉,0]o! Y +7";6WGm"-sw rDudúu=Ց5k#L@d|hmdtdmd:2<6rDVG TG{F{Qow =WHs#ssYÍXkDj6j`^Í05xd1Cw.<ƒ% Kia貒\|Bww@wha)4FwcQBRVբ#Y^uPo9:yf9cKLobmiph7ycUX. +3n=~d|uƱ6vbX=nR\.U(4^˒{ӖIfVɒ4Kd&咭hw10}YG+EX%&3@zk@ :-dM K<7Y+_M6^EZ+ Vj|bE%k90]$%ɕpg̢5J0hRapbm¡ޮHҋ>f*g%ܳtԟ LyykOჴxB0/X7M_p#-}7΢=-MBpiw] G֡#tecƭKǎ`=N߻1*>c-WSw 'K8J( %%gp} |{ w3a<9(|< {ȳq< &}L?#?OSfG~g?A$x>I%>i}x>CCp"߃A|>G||5/#4|>GNcyr7/3e8F `= l@FQr/\'•r\$ga؄ð}|A_&-+.؊Nõpz'`;:M ;г=p=:K ;Oȝ wkr܀^$*)r;ǘo<97aannr3܂}mpGMp+m8Enzގsdx6 ĝw=.OvûB ރx\(vx?^I]r >7*r-܍7-p_Gr ܃p/G6Mj>@*\&_]d#܇&~|/Y#~>?E!r9|?L&3d5<@VCd%WISd|rxQ|d >DF1Y⟒%Y +_/~,/)2,'\ +_ar |"8B8x8|&u&Nތiiil"JATpؠXXm3de9egYXr<ݖjf5Y>ju%e9gS,8begqv +v;gXnƲVz9k}VemdSdcagYl X؜v;svo8<r^Y>KQcYL,$3v@-6+k!SYIyn sN;x;'8;gv -z +1"yY x XȂ 8x .95X/BvXTX(.4 +ke2Aݥ{<+U.].;7,ȯ<7M*p8@蚡2Bsyq|~~ Db!\Mc#w%Iu BvI!ӷc>ǯk>jhO*ꚨvЄ뺨Hd2Hֺ i2K uh0 ^?JUv+ntgveUuz ( jS(+*c }A;th~= +{>7H`{\q;팹=B?UTB22]̐!'rOsי}>Es}A,Zgc D55==bP Cd녴C2Ks2թlOu3ulcVJVŪituUU(N'[1\n`s0Q, "elOfD'峙'JTI+Q%M=_8s;[ C|pӃY(2 hJƲ 2 ksS""!bFnGq[TEm!1Ox%`C6( ( 0Ci!|4gT`k5gH>;tqreqkXÓ'Pqkx@kV , hCdgzԇbSg0y @v'' 8 (3?YɞfRߞHl.D~F桧 \GXC,f˃L' 50X׀@jHZPOq\)*gb _pP9$?'bhwDNĬȰQ=jv2TՔj'pCGH>Lp$j.Ȧ=svx"bl`_GSNk a7V7XRhy:hrmR[mUé1kqrH5YoH[j/?S{M?},O'BR5Sh6EjfZߖ󁎶zg?WTFfu *f94;:g|V>2BbTHz;9W +vkVy5՗h9 CT5G.XPȸ1aY]#*3( A6q c[9xX-Е:)yk+&s$"6R'ɴXC^Sϸ.C$ }xjT{-wxS> +QXYaM!d.QfF( +y# <` bu(nn1JmNTNgNgO>.'O46$)ޝ5ET:~gF%hA׿̻on nu|K:-TǗMtXa#譀!I^:BUJ^SzW{oi\pum\PպEX2%y4U2'(1٦EsS*mT)aD'NTwND*{|;󺏭"Q?Zd[ЍoZ[{k?xE+6h9+,ρ-z[aB,p%9"DukbL;$5'Lk9 {-./㒾m=whwu=B/M^*> Qh0XAǹ`DH=U= 1&X[yu/#/5&0>=P,&+$zMӚ )ħ ^04]IHnU᪕5FXDkU;VN `̵6743)nȜQAQO΁{nf=]1;5uMYpF-4#4MH`CҾ{]0EHy."n=RC^Bⓐ< B;Ɯ]eI;e,44 +3t?Oerޞͮ,''\.E@aEFvkyAM)V7tM|acïmI%ۧ +ܯj[}XSg0JȎ@8Xd1SƦ 99^61WAEj!lƥ8/NdEZPx* +Ơjs/Y5GI5hqͪkj~]Cj5(7-\#5g[sgs'\LqYzYB}5j$ҹ#?67 S<0a|ޥm%뮹K[wuQ\D7h :P9_Gaza7Œ?@KDYĚ+2 ",K,q lV5V88qqd$'j"ΩqoiDG8o0 q; 9jruuW۳T|:;Y<-;g֭ezx=S:rYcC"bV 3$2lpN M̍uj|RĢTjQb˗>K[Wj]RW =?nbU +~Wh]# ^hАAjWq8َW_Y,Sɧs X*LMs1z JӕcƢsmfn_)Ue=/,tju e-6և1ji>Y]>ȋx> qh)E &%ٕN1 dlNMR-w*g;-IrGZVuQ@K3FZ}͆]k1N,;Plp*-ۼa# mfPH?;)] u ; > ]U SԻhA/fce`_ !m֫1 }m{Wlii^3mڱqp-c?ƳUnx6> +t 0OY❆Yh:e"1p$O;N;EѼէ_驯#}h1>zӭ *2QCS!b Hb#,X96gWC^9w\>}(Sԩћuԏ; 52;F1] S#Q9ڞ-JfTV}ybG}tӄaoX~[Vh\ܞax0ɓ7QP _Ke%g/=UvZԜW`66$+YZ%iX{N"YO:ޥۺщ +6GAㅫ>;<^ ''ETES0c>aE++uiinɍGXy+okUъbc[EKSkExqhoXOuPO,b5S3#|@ƲWP]͎ͤDy_=Çi~t;=/xԳԫg/=KUp`@ i`ĕmW&S I=j<|-*XY#k[C]' HU*>Nc- ]9%oNZj{$쓾r'Lrr 34d 6^Ϥ+l>vY^q +Wk3U&*Sغi։h~aɺvլ__Fzaݒ/<@8> + +Rw*Ȋ *V׶S̮ 6l,6r>͹hvdTJ*x(ўc^oFWoނ>@G6IpA A_hjCxW XЌv͸ve+zB5w}L_ej{>47[VGhy~lØ$mDg,_~`|<'y-˘@;\ڶWV8EaeW:'fc˄kqhnÏoa5?}#Mz+H堷P kDfk&hbzW^ZPD>E- SڳOAka3zuPL̽k2.:G畗m@o|2\j 5\eoq@ 8lm!eHJ UOp;6eAWB tsM榕{쁧hFN!89Ԙt5]Btu5Ctuv&%[t ~=bݳ*Xms>ȌaIhe}N#lڛmI僽l}=Ya}Yvo233iQio/ $e_io?QF%1?meN0kx rF3~pi%^9}.4/֨F3f/hk#˯\~9VwD= 1\~]kUr7(@fk > +, ^K9Y8ws;@>ě>zo㆛^|lD\A׹*A0KhPWǻt7{V3ŭ'g:L[[&4KOs[l-/du1zƗ73m;?{Q_Ual~}GV+#hߙoܼy}UWI\Yc p,U-l/^\5'ϗ}vgY Y0S1M#sZ9u QSoeU7%ԣt>Х5O=ܻ5-~{[ q29Оd3\QPWcC=9 lXLbjG$4YI)4i?Ii?nESiOrW9 IOl{m\;0PXߞZp9oUHmq_YZP_H)V;k %e8K + C@0@=b漶!nE4VbХ("j+:WZ+.z:Qis:JޤDږ +#N}귘Y:k@ 6Cԫ#=RyAAwjS(vNwӞrGaOXWG>5x%fP,^3/%j=;gQӯ/l }ZIs,w)/̂uLn"!fVvF ˏƌ:fPoʩ ).UW=D"Yi=9G bJ45]ߟ4:F"CH[`$S;lgM[U0r/xEABJ2z?S]Ph8!nOT>Fi0RQo:+t X.CQ +d\)>)ΕŢx\ƛZDѲtx Il]yÖb4uQzOsT5]E+} ALnvF-j毽ΕJ0骬~@م(!HdD2VxyD ;€lM犧E%O9F!ʛES wHc]p +w.͸fN^~ +"h֡* 5kjb9ƞ>ZDV<3PU%txa+A]Z~Zʫ~B}>DvrJYhM5/i,4{M}kmy y:0s 7UĽVZ՛#&=j֎ġnA'ևnהQƆ]eUQ[ab^i+QG +CR]뇒9-.xd c-SC2J1 SuB4 x,u_aOSs9:Ǖ=tHlN$wUgtkB.$|BChȧ!ACEn߻;FP4vtaE41nk6/#~iW#>xm:o[%^mt:䠚܉Lce| c(f|T xFJlmZ<Ҽ#\)yߡCh۔W\3;pp0ꚥkZѯ:'D +Nnȶ[6( DN;;`gVj'{wPV9dSٞ=Up*~HìUӐG' T I/q09$\J~0Ȩ] mTyWM[:6.=ϣsWstxuw;[QP-v.M\vp"1[z7n>,.|*ʨ=4jQg_{UKEsTD*s{\W5]W͠m FfǙG˝ \9`[ d7|F{c X +Ck:Ct5 h +PQU :8Q_ +*2)y:il2W. |3n.: @V]g5lߓЪ2R~}=| ]Sv99[&w}4A͚( fD, +jmBt%V*H#2m#tƦ>ÖOerً;m#ae3EQ MM]Ϟ[}}J]rY c᥋UvKA=B1r(' wUvo}H9c>ey{NI!|]qLg:WT3\\._ㄡV_NxnÉvv?\2flCVs/[?y NWX)Iw<4 N0 MC[0[)Sn?ɔ ׶ 33_k qhʭ6DB[kɚ@f aoC-o[*ǂ u>? PU 0Pu!v[j4)y$!J~%ĎmQKb1@MBrq(k/5y}1Z" +endstream +endobj + +1016 0 obj +<> +endobj + +1017 0 obj +<>/W[0[500 0 0 240]9[705 0 356 356]15[246 340 246 437]29[246]34[455 974 721 672 648 737 606 574 702 734 316 529 684 563 897 756 790 644 790 667 582 614 707 722 948 0 661]68[553 604 500 604 584 422 594 589 289 0 579 316 862 589 607 604 604 422 485 444 589 550 784 554 547 500]262[708 0 736 1127]]/DW 568>> +endobj + +1018 0 obj +<> +stream +x]n0 y +%-PTUJ=%qHkOh;$g[eYkg#0#t֙x ጽu"IXoDZ/dYq]7<)+?ǥ +endstream +endobj + +1019 0 obj +<> +stream +xX\Uy 303 0D4Gқ&X ?D@1UiߋfRkԶ6Vۮn7VS-ep;Hq?9Ϝ9)+;rukRNMNʚ"|39izh wp׌Gqc9nftB/m0#ƺ٘\5\)ǬF +H+@vɸ˾:e-x48#G`ݿ~|eF c?=7z-檙+x+\ +tC*fSQE(B.~T!X*,DnB!}7q|T XR480@&b9P",AQQp` +c1[YUQ)@)J0 +c=5EX%X GoD_90`J\AK&F |}T%Jd%iYB# 7ѰD6] + a +xAqb4bzm6͘mzih&E3y!%aLH2 +d2fr ̍ +d[A)\oA +IG5'/?0Y*4tWiq +6S&!.VMeYՀm^UŶyμy=y%1a3VghGT->CCE_0TzF\u{-nuۡj?j #m Ffjk ~][o W>\ 4)#yt%"GSF3Yv&$Y{l,}Mޱ_->wrQΩ%O6=dמO9tLcrŴm?hw}ݏvXYYUpUr#y 2dB^haPlVKHNV!LwUvwNMOk~Zutc!Vb3V6 l$e;wrY{=D뙡:4c%gtFHLWqWEK;(50(.Dc'N5*CZWdXgتmGX0hJ/lQli+mphN46ŌܢzE^&%x)Z76, >:HCÑH(KA<<jZ5^I7mucuH{1Q.wtu>s;YAr;ohR+`:+bq sJݸq^ԬSgn:tyť eYOM/{ѧ$'/w/>P|¶Ul>k_r9Ş!(DF˙܋uĉ VQ̈́?ˏ 8(ehS?o7>cʓ >/h(wZXsW/aj]G__q ÛړSG,0e'[3*Uk(##zcF1inZd>flXe{SDS}cݣ˗;ٹ7lTݹCk_xrľQG[+Z^S|yM $(o0$1qژHVHop&kWalp;bcm@t+Q'l'_hML Ķ)<"} $6 ²g5d:6?+L/b) ̔{/ CfUVإ#I>yB13RKΤI2xa6lV>|bӟ X&[~`ffuS-Hfc;ŶݻD&OG7>z{.\= dp'12&$Bg"4FGmK8qk4Ġ + VF f}ONƤ:R='8=lG3;6;2q} [7 n(: +ʘJGs}mZZ3}gKWݗ>fl;*uO|m| VV=g]]\VʾOl591OfD mgoճCZM>V[E +!K2M)}[WCpd ѕ跣/Eɘ&K-x6%(E\ +V!UX*tKY8Ew% T47jEh5}/.:9D8Ɇ]`ZԴqwk4oc> +endobj + +1021 0 obj +<>/W[0[600.09768 0 0 317.8711]20 28 636.23049 51[603.02737]68[612.79299 0 0 0 615.2344 0 634.7656]]/DW 0>> +endobj + +1022 0 obj +<> +stream +x]n <w@׶cqcR0$oMz|3@j~8#:0*-.fuaIi3J-Zn[<έ )KZpf#NSzív8HUđo@c٩Vw_E"40 t1VA4MS_HU(y%c削Ds'%Q9vc$x) k|xs}u*Ɔp~h +endstream +endobj + +1023 0 obj +<> +stream +xZM7 +:V/ ! zЦ fH>5;5NNM2XH>>R8=-s(ևh5 +)T+>~0/4 " 2{cShJ¾O޼%o4L:]`n~~ݫ^ׯ_ ?k^Ȇ>`aor4n?Qzq &+gܾ^][j9E具9P"vERb/"[#{gc +I,D3@WC7" p|* + uaR(ũ+XA¾q"t!XCJ 3o޽2on\|68aԗ8R/ ~8"Qx)vgxVN4&ŭTmn/%_m +da8S Z~ +jO8D u,/ـn'H)X I4 A '5R;J +9 \J<-[P} +)b#p!:S%N%~uV8ǀCj>}p,j6`7Ujax9 w%/{ҲnMnIf}#S8Ϥ㐓[)r$F Dq%[Rɖi-qQ(3Mh]lؕ%FKo_ǐ@OuAiTitHj'X`d9}ȡF%)y%'dHHAA(`6?i[Lɭ RmYDOA+>yRTGQ#rPf.bC kFOJȕe}ʧϲ2ϸ\`#16j + O`61$`73JZDanp_uqC$ʆݹ%z_$5\ :9f_u7S3IaD|){$w@m`[*/~O`_1Þ +Ó%["⁅ ) BnwT_X +endstream +endobj + +1024 0 obj +<> +stream +x]ێܸ=& Xx Y{c@;>'.b#N6H>?EQ=U*2`$X7tNC}&ڸ@:k}Jݗw}za g 5ޛ_|~w;w!Ψ)MkWW/oS_K;P>埡Ӧt6<n>uo]|vvsSC0w.LT( Mnxkz;`qٮr{ + gpLxᦚE]fquΒ *;CV@pPk֣V_WCAьQ7QhQ(r"Xk?Ь!cvнRtVӾ6Iyq']_QU21Ed{}?o?Ctnq?I p'/Gwx +_!iI̖$. @(֨'B ZRzՠU ,z_k=҉|EGYֵ!8f <& G8ΠLi!oDz2`a>qhQ8^p-k=m&mZ}ƒ@9[+sݣJOmiy~tb NI@ﰶ.]6&*|'Bey9':f)iB H5[|1@ĘؓE/l9RNDP4RaŽJeSrEOZ+oċlNF!qWwZ}3ah!y6s@L-ɷAUM]rN/Nϕż赴.8Zd\TL@rDl]'`SwDr6La>kpA2T[B }!͓gk=Ե*@-+rSrѐe&0ɐbZv4p"]Z]g5(KpVftI\+n>qa00 ӺG7"k;P̲{:h[W<c{u=A\!Lv2wx:!t5'^m_::sE1kFhm%>'(:A8m>PhjBS`Cm֚+Y=nv-Ĥ }UOZ]2f@gHlkڋSEmFűa|E+L_6LJ^FwEˆ{U1s}WGڝyk;u]bqN/:'WGq5c ǩ: iTvNٖtu'nw4K9gRY 5󳷃Tj<.7vj(.v̽J|,b,<+s[0N嫗ӀK{fR\`Ӭk/A< +(.|v4Վ^^7 F'$_t|ʔ_MO ;&PN]3t37i)1a4Ex*:AOo7I?Îo"byv> +stream +x]YF+|`0;1n2@=X}j6)%YEQcik3mJWlRoK.ƚڐmSgwç(0jMޚ뗙{6_פƨl3|(|nt4,IStcbm_kӪ/i]&pG*ޯ8?tOݡ uM}WqWhdGUt64>e?ɠ:Ƅ)z12RCGčJ2Hs Y{iGΐV^uӦ\ӎ\%|iM$H٭>cAngɨH 4Jk +E| +EvӲBD(ƅjuwOm<upkCFPC#kό&Pku- ~*  v`J8n`xQ466wtumvNk#r:d=/4< !UEFgq{qUf7홤6QXP ~zDBw@7Vj &Mbv\}؝#ԏTkM@&}Z8}?]rU'V,7.2C3b5A"ok)z4n;^"HU/gIh=E\A"/IiMЃ}T|Xm\=^ I9l4<%ӢCd&m S~d})Ud19  86yP1ߡM.]cUaO'C^9B^\ZINFAI@Mk +LCzC%$DxPRb{KrqZ0{Soxa=9jQNXKj)OT0V<܀EO4hCX)*ƀ(0.Ho3|_O`5$°7\s!WbO. <2hzm +3(~V۲láMcq8*T\U0H+ORb @kڔfa.!rH0m!mPY'InzONҜz~Ue%YQ(\c;Lڰbv^lME!V4PIJRVMmlUl[&[t4 Kp4HQX%7rx9U~Mh7c6Gxa@yh xIfVjxfLW\ E&w~/xD3БTA?~ڐw +~3gIb]8 $JK Lr!qQ'fseS2&τ5DIqilBK$\ɂ+gbEW.ߺ͌E47fgY1,k.h!6![[0M@q/Bޭ9U¥lo9P!OMBa|C('"݊g' Ń9{3Fj>{yt"dB/Sk&9J{'s(M$xu}EV _A m@W'6縷V[!KxA<{r"d Fhk.Z/+܋ +^WrRȅ"#"d[VW|݋Ek'!wZ&4D<ie:|*y0.GߋE+^|>{v+BFyg![޷g #!w.Eݫ9>fa~5 uCrW{"D ,0w_?}(UL钀.ނj=[6O"EfSAиPui{ +endstream +endobj + +1026 0 obj +<> +stream +x]Ɏ6XRI,</@pr(i,LT[11X6X|z|Vt)xl`W䨜 a9;;xMyѓt'>B§6Ñ~SQ _AŘ5K(a-!g|/+1v.&pRU^\t_X]nϞ=}WJ?KOU7c/=xn>gZ7)cNN=U9w $mbXNxSNA  q*Gqu htytʵ+ Z[mo JVi,I;WxR! g ͊ XrmB3W 1{P;~}:Z\[Cu%Z|/D!-cx¦g~ppf 0}H۾r@j&68p:ng݌:q4 ㎉Taꘌ9[72wl{(xʼnQ =3bՈha#Æ۱N(P--52=?9qx&(IP'wixGJrN^'f@;[le7sחVU23pɢMls2԰JtXmŃ4'FҔ̛5t3D{;E_e{6uc.)#e1`Mf8ӫ+i64klD孕dhĺ<:0v2IťA]n%_#h! +L5zNB\LF]^Bؾa\oL7&]:tO{{ NS'ܼ#fB ` +CN.Bɀ.3aޱ6뺒꺀I~&G]ņB3ņb!_B|6?y6^ +ϋr/+lL͢M0ηlslg<˻I&@Bg.Vѵg&gx'=su]{_6AH'$x=s߂M>69o"śyÜ|&%wo[K+#vmr&/k&(69'9KWxކm.V5]Ylu}dZec':o0!Ի6Y}#|>ctmX~65Nx@A36kGvmɣK c'D\ +P&>m+jksMA+DT AK} 1f|D>] Kc=U%"̮%aYTrn2O|0,(o6sqdШncn +endstream +endobj + +1027 0 obj +<> +stream +x]Ɏ6 Xí^b` >{l!3]*v3>MmdիbQ?ϧ!%u4 sTΆ0L}Sߕ)w8Ð"mQCHx~ۻwN}K%-hcVVܕ&aSv~i9%;y&y 2KgvJGtĪWU.t8Z].~_^z7J|k'Uw:ʛWBkʘŠSϵ~Sr >$mbX)8wuڍ:Fuҡj׮8hm]*٥gvf̧kHgBD Ӄ&څƗ!Mud hP~\{CCeC]o\.uB[-eƾC5`^{Yacj;AG" 9lx5O/a0^LB?d3g-˒7C 0¶Ǩ&s1 +A.Ōuܓ(aBkĻe +ă))<FfRA5'ڑs9P(#' +(F`Ȉ|̧[#iiy̖SWGဒDu~ޗd9y8dTN&2BH' U +jܜ9)G0|sDqb_o09Z> +㎹.-]|xsނ.M>49Dל D/saHk(\AdnBص]L]L]<Mм!tc@c\еɗ"iKH YD^B1Ak5 ,zfGص]fB\LVeg&%=&'7 =}iqh:/݆[ ŻB2+wOM 뎵ͺ.,~E]ŇB3+)7+S*=Ӣ\`qM]E+dEǻd" }GxtE`3Mޢ^%B+.xW,B?B+SGɗױcÔfb7ʡ`> +stream +x\Ko6+<LrA0гc +@C~+ŵ5 w!c曏'}SuJ7lmʺ3>Po +vהޘwfhT6/xԗURbC9 @Nr+8 @ҫ/ZrZ҄Qorkq?}{q}{//߽Rn.~tXulj.yuUn/oPtNhupwt.$mbOxSNN b}m8u;q xVȡCؤ>Mܗԇ#ޅg ͌ tIvqepK&z̦7chP>M}eC]b&þeb?vN-8=4s:ZG'މɡI +z.dP#q}>@! &?ShpxpC&5~l'[&X^f>-e`Ð՚a-L\bx5f|gu_ sŵ _¾ %4Cs꘠. wKC4$Z}a!{ +Fs?ϣIi LXƒT@(>d'i`<,Y QpH/u?9[kr.1-2Y``_f;Sz`aV뤶;1ɬ !E=O矏k>8u8JZXi1ҫy;bs' Ճ8"dnXLCCFpSqCQ /ǮGFƬ\Q{.9ƛКx ZT 4oID* +ZE-'H )2"Xو*^ׄ,6juy򼫝 Ȓ1|0gpJuKgzzE)7Y1S+.:zW$mw,Elt(tYfӧ5j(J.>Y}(F~QYTd%`&K>)ʋ(g֊*_23rZAJ%QrjwhNB'}s:c^#{rC +5'S,l[!n̷^sbIPBa84',G[h0;&Z~p-N|;r&ZD򺉖 h9b g>s3λD>Wz|Wg(ZYTsհYhY}Q̕({ +M;~h9^R`@Y~a-jr-L\BJȝ"R ZN`Z &ZDK.D%dk,]QB%$cqSthy-/&Z>=-' +yljSj~?#%YzBhxW]ftD˹a߱4뺲u]k- +Ϭ@>^q +:j_Y U +endstream +endobj + +1029 0 obj +<> +stream +x][ܶ+zlX +;5`Ms6>Aبp]QiҮ H"\93д6 +=~Dk;mbkЂM}Soi7M~3\- i}Ƿ&z_߽7&&@CzpW)ig7/Q/^|~1*OFtU Iy\7I5JibU)?Wy<Z . @]Q^p$pAALq!uj8wv{#Uh*Dt +*|p._Ca~ *St#>-&QȬvݸCZ]n(#s` +/8Ca"}EFж؈6Ylb4oY3>t LV?z\V=͛&GT*V` f*YMqŜ]+6=Gbn0'Xr$̎fG3!!̊)oJӾ텊 +1\$BJ.8 F3h5Wr6GY`SkM*9YM)MRLuI |P5:R>t b#"SGވ=OʝoS#k{sҢf),鶤t[&m2Bx: anp[Z7DTaZבS?U3n<2c9 UEOmS2diD͘X!oRv,LEDj2RLFZrԩt#+moܿ׿<׎%&U<% +0#R2ȑGgDߩ 0=^iY`9DR`#6Ĉ%e8[ ȸS2{H+&EC,]HRb g򌞍LsoJ,Q`sh;AlV.Tx̀vYh7 0f%-nT(`=cbBw%y=j3e.0#+˸!YIN|%8_fnPO=Tt #7+2#MA*.n0>jʠlb E}X(@,7 0F,"$;"X`Fn-?\:8v1pȳD{a;%0ӱ$7,>Rl^,k,ӎ~q!gLbʕEJx>ϺD\7ޞnR=vANZ2=%P$ͼ|G;jBյYd T`:4.iP] +K8IY|eC@52*%y:o3)ۥ$I;D-5^cZ!]ΝϔȀKRgII:lOA$}LabNO" +9O_0H&s&%O} P}@zj¨%m}L,&VW|S۹sGtؾX\dh'uP'Oϕupz.NI.WJb J/40oPZ23gmAj{vI6hM)sm5^P6*.aA^19ö-C7Km/xVH&,4XN5ű1VslLRVc?kv]ZT7C3sa1;$6% @|*+$I>76Ӣ>o37ĩm> jƆ."WGT;vOU^a[/uQM&ɷ +SaI (y]W +RxV~=4OAPk'Ybq~E$Փ66!)[rKRҔ+hCFN`YJz^G @"eJ3cAy+ +X_Cn~D)=rþox {g 38CJuQFbf?;r~\s4ZvV' +endstream +endobj + +1030 0 obj +<> +stream +x]n7>p;@b'A nYZA$XOqgꮢY-esxX|TqJWə!%u l+QYrԯꣲ)5zeL6B>Ù}}U?cVJ;w c>sZEY?8d9%3߳( 83f=*-;*(ePFW9^RUVfNGpׯ޿o|+;l`;جNu6_k-IAGCT~W}*q!ir]AKv}GЮ.ףvxliCF3eaMT_nvp8CA؀Iշy񷻟>Ӂ޵* 4/Y{ v*m|V@ʵ;G!&$ odM>5Y5Ҿ󖀆V*e``9@Wȁ 2w 4@ 4O;LvA[lc-c;gI.XZ &JT6`?S,≳$8s_.HUaDv[6jYtϙwBbʺ3yLU.Ehd*LŔu!g}>ǿ٧rًdUnZӐp̵ݚ-l>u-ptN$|9m䠟o=B8w=t*t +_qGeDLv +K, &=!o&qyg%ig3`r5H=+3КՇJ+?mX|ݿ'pÏ<4 +RkZ=ǿ@~G(s*AhrPt~; s`&G:LМi4a3 LtfOyR= 1cz؞g-{ LԺ|@P[i3EDroc8N~#Hm/pm;9xl${Z~1*A혹x>3 3->.}'._ #}og0 a0a:C>''@;ǿ7Mp^t N/QzE +endstream +endobj + +1031 0 obj +<> +stream +xZMo7+<0=Çةу65s +C~Di5#ro#g4(PǨ3Fm)hEOɪ>~PeWƧ e3l6}dw?ipwygUTBH +!jJCY7+a)j[noV3_"^#6t $ A2yF +#O |lbM8`%vvBe`j;- ޻!bE§"2xkxF5N8grCaǡot8݃sP0w8[a6bW jْ(1YZ!"x}"EQ-2!<өA\N9QlQ!#R1ve7/\N [:[Su=32c=n,6c:q}{v=}؞&%Fq[k{m \81;4 a\[id.QqO0 +|"5 \*oSddzCpteQƾt +EBX%[u=L='nc!i\+;^_r`I3Ơ*`CmQhP0ׯ`nP0\cy{wVS0ipɗ͕k +cYEN1Iϯ{fz~A)~_ךԯ@JW+Yu֯NĒzwV(-D +wLRkzKW<,i}4o# Ա>fpkUx4{ޑ9D A$z {; f@v +MlȗWX' ;Pbۘig Cn!i `72(oR { Ɂ욧_T +endstream +endobj + +xref +0 1032 +0000000000 65535 f +0000000042 00000 n +0000000311 00000 n +0000000491 00000 n +0000000527 00000 n +0000000665 00000 n +0000000734 00000 n +0000000871 00000 n +0000001051 00000 n +0000001241 00000 n +0000001310 00000 n +0000001491 00000 n +0000001672 00000 n +0000001853 00000 n +0000002034 00000 n +0000002215 00000 n +0000002396 00000 n +0000002510 00000 n +0000002571 00000 n +0000002678 00000 n +0000006507 00000 n +0000006587 00000 n +0000006725 00000 n +0000006805 00000 n +0000006914 00000 n +0000006994 00000 n +0000007103 00000 n +0000007183 00000 n +0000007292 00000 n +0000007372 00000 n +0000007481 00000 n +0000007561 00000 n +0000007670 00000 n +0000007750 00000 n +0000007859 00000 n +0000007939 00000 n +0000008048 00000 n +0000008128 00000 n +0000008237 00000 n +0000008317 00000 n +0000008427 00000 n +0000008507 00000 n +0000008617 00000 n +0000008697 00000 n +0000008807 00000 n +0000008915 00000 n +0000009025 00000 n +0000009135 00000 n +0000009245 00000 n +0000009355 00000 n +0000009465 00000 n +0000009545 00000 n +0000009654 00000 n +0000009734 00000 n +0000009843 00000 n +0000009923 00000 n +0000010061 00000 n +0000010141 00000 n +0000010250 00000 n +0000010330 00000 n +0000010468 00000 n +0000010548 00000 n +0000010657 00000 n +0000010737 00000 n +0000010846 00000 n +0000010926 00000 n +0000011035 00000 n +0000011115 00000 n +0000011225 00000 n +0000011305 00000 n +0000011415 00000 n +0000011495 00000 n +0000011605 00000 n +0000011685 00000 n +0000011795 00000 n +0000011875 00000 n +0000011985 00000 n +0000012065 00000 n +0000012175 00000 n +0000012255 00000 n +0000012365 00000 n +0000012445 00000 n +0000012555 00000 n +0000012635 00000 n +0000012745 00000 n +0000012825 00000 n +0000012935 00000 n +0000013015 00000 n +0000013125 00000 n +0000013205 00000 n +0000013315 00000 n +0000013395 00000 n +0000013505 00000 n +0000013585 00000 n +0000013695 00000 n +0000013775 00000 n +0000013885 00000 n +0000013965 00000 n +0000014075 00000 n +0000014155 00000 n +0000014265 00000 n +0000014347 00000 n +0000014459 00000 n +0000014541 00000 n +0000014653 00000 n +0000014735 00000 n +0000014847 00000 n +0000014929 00000 n +0000015041 00000 n +0000015123 00000 n +0000015235 00000 n +0000015317 00000 n +0000015429 00000 n +0000015511 00000 n +0000015623 00000 n +0000015705 00000 n +0000015817 00000 n +0000015899 00000 n +0000016011 00000 n +0000016093 00000 n +0000016205 00000 n +0000016287 00000 n +0000016399 00000 n +0000016481 00000 n +0000016593 00000 n +0000016675 00000 n +0000016787 00000 n +0000016869 00000 n +0000016981 00000 n +0000017063 00000 n +0000017175 00000 n +0000017257 00000 n +0000017369 00000 n +0000017451 00000 n +0000017563 00000 n +0000017645 00000 n +0000017757 00000 n +0000017839 00000 n +0000017951 00000 n +0000018033 00000 n +0000018145 00000 n +0000018227 00000 n +0000018339 00000 n +0000018421 00000 n +0000018533 00000 n +0000018615 00000 n +0000018727 00000 n +0000018809 00000 n +0000018921 00000 n +0000019003 00000 n +0000019115 00000 n +0000019197 00000 n +0000019309 00000 n +0000019391 00000 n +0000019503 00000 n +0000019585 00000 n +0000019697 00000 n +0000019779 00000 n +0000019891 00000 n +0000019973 00000 n +0000020085 00000 n +0000020167 00000 n +0000020279 00000 n +0000020361 00000 n +0000020473 00000 n +0000020555 00000 n +0000020667 00000 n +0000020749 00000 n +0000020861 00000 n +0000020943 00000 n +0000021055 00000 n +0000021137 00000 n +0000021249 00000 n +0000021331 00000 n +0000021443 00000 n +0000021525 00000 n +0000021637 00000 n +0000021719 00000 n +0000021831 00000 n +0000021913 00000 n +0000022025 00000 n +0000022107 00000 n +0000022219 00000 n +0000022301 00000 n +0000022412 00000 n +0000022520 00000 n +0000022609 00000 n +0000022715 00000 n +0000022870 00000 n +0000022981 00000 n +0000023136 00000 n +0000023247 00000 n +0000023402 00000 n +0000023513 00000 n +0000023668 00000 n +0000023779 00000 n +0000023861 00000 n +0000024027 00000 n +0000024138 00000 n +0000024252 00000 n +0000024418 00000 n +0000024529 00000 n +0000024695 00000 n +0000024806 00000 n +0000024972 00000 n +0000025083 00000 n +0000025249 00000 n +0000025360 00000 n +0000025526 00000 n +0000025638 00000 n +0000025752 00000 n +0000025918 00000 n +0000026030 00000 n +0000026196 00000 n +0000026308 00000 n +0000026474 00000 n +0000026586 00000 n +0000026752 00000 n +0000026864 00000 n +0000027030 00000 n +0000027142 00000 n +0000027224 00000 n +0000027336 00000 n +0000027418 00000 n +0000027530 00000 n +0000027612 00000 n +0000027724 00000 n +0000027806 00000 n +0000027918 00000 n +0000028000 00000 n +0000028112 00000 n +0000028194 00000 n +0000028306 00000 n +0000028388 00000 n +0000028500 00000 n +0000028582 00000 n +0000028694 00000 n +0000028776 00000 n +0000028888 00000 n +0000028970 00000 n +0000029082 00000 n +0000029164 00000 n +0000029306 00000 n +0000029388 00000 n +0000029500 00000 n +0000029582 00000 n +0000029694 00000 n +0000029776 00000 n +0000029888 00000 n +0000029970 00000 n +0000030082 00000 n +0000030164 00000 n +0000030276 00000 n +0000030358 00000 n +0000030470 00000 n +0000030552 00000 n +0000030664 00000 n +0000030746 00000 n +0000030858 00000 n +0000030940 00000 n +0000031052 00000 n +0000031134 00000 n +0000031246 00000 n +0000031328 00000 n +0000031440 00000 n +0000031522 00000 n +0000031634 00000 n +0000031716 00000 n +0000031828 00000 n +0000031910 00000 n +0000032022 00000 n +0000032104 00000 n +0000032216 00000 n +0000032298 00000 n +0000032410 00000 n +0000032492 00000 n +0000032604 00000 n +0000032686 00000 n +0000032798 00000 n +0000032880 00000 n +0000032992 00000 n +0000033074 00000 n +0000033186 00000 n +0000033268 00000 n +0000033380 00000 n +0000033462 00000 n +0000033574 00000 n +0000033656 00000 n +0000033768 00000 n +0000033850 00000 n +0000033962 00000 n +0000034044 00000 n +0000034156 00000 n +0000034238 00000 n +0000034350 00000 n +0000034432 00000 n +0000034544 00000 n +0000034626 00000 n +0000034738 00000 n +0000034820 00000 n +0000034932 00000 n +0000035014 00000 n +0000035126 00000 n +0000035208 00000 n +0000035320 00000 n +0000035402 00000 n +0000035514 00000 n +0000035596 00000 n +0000035708 00000 n +0000035790 00000 n +0000035902 00000 n +0000035984 00000 n +0000036096 00000 n +0000036178 00000 n +0000036290 00000 n +0000036372 00000 n +0000036484 00000 n +0000036566 00000 n +0000036678 00000 n +0000036760 00000 n +0000036872 00000 n +0000036954 00000 n +0000037066 00000 n +0000037148 00000 n +0000037260 00000 n +0000037342 00000 n +0000037454 00000 n +0000037536 00000 n +0000037648 00000 n +0000037730 00000 n +0000037842 00000 n +0000037924 00000 n +0000038036 00000 n +0000038118 00000 n +0000038230 00000 n +0000038312 00000 n +0000038424 00000 n +0000038506 00000 n +0000038618 00000 n +0000038700 00000 n +0000038812 00000 n +0000038894 00000 n +0000039006 00000 n +0000039088 00000 n +0000039200 00000 n +0000039282 00000 n +0000039394 00000 n +0000039476 00000 n +0000039588 00000 n +0000039670 00000 n +0000039782 00000 n +0000039864 00000 n +0000039976 00000 n +0000040058 00000 n +0000040170 00000 n +0000040252 00000 n +0000040365 00000 n +0000040447 00000 n +0000040560 00000 n +0000040642 00000 n +0000040755 00000 n +0000040837 00000 n +0000040950 00000 n +0000041032 00000 n +0000041145 00000 n +0000041227 00000 n +0000041340 00000 n +0000041422 00000 n +0000041535 00000 n +0000041617 00000 n +0000041730 00000 n +0000041812 00000 n +0000041925 00000 n +0000042007 00000 n +0000042120 00000 n +0000042202 00000 n +0000042315 00000 n +0000042397 00000 n +0000042510 00000 n +0000042592 00000 n +0000042705 00000 n +0000042787 00000 n +0000042900 00000 n +0000042982 00000 n +0000043095 00000 n +0000043177 00000 n +0000043290 00000 n +0000043372 00000 n +0000043485 00000 n +0000043567 00000 n +0000043680 00000 n +0000043762 00000 n +0000043875 00000 n +0000043957 00000 n +0000044070 00000 n +0000044152 00000 n +0000044265 00000 n +0000044347 00000 n +0000044460 00000 n +0000044542 00000 n +0000044655 00000 n +0000044737 00000 n +0000044850 00000 n +0000044932 00000 n +0000045045 00000 n +0000045127 00000 n +0000045240 00000 n +0000045322 00000 n +0000045435 00000 n +0000045517 00000 n +0000045630 00000 n +0000045712 00000 n +0000045825 00000 n +0000045907 00000 n +0000046020 00000 n +0000046102 00000 n +0000046215 00000 n +0000046297 00000 n +0000046410 00000 n +0000046492 00000 n +0000046605 00000 n +0000046687 00000 n +0000046800 00000 n +0000046882 00000 n +0000046995 00000 n +0000047077 00000 n +0000047190 00000 n +0000047272 00000 n +0000047385 00000 n +0000047467 00000 n +0000047580 00000 n +0000047662 00000 n +0000047775 00000 n +0000047857 00000 n +0000047970 00000 n +0000048052 00000 n +0000048165 00000 n +0000048247 00000 n +0000048360 00000 n +0000048442 00000 n +0000048555 00000 n +0000048637 00000 n +0000048750 00000 n +0000048832 00000 n +0000048945 00000 n +0000049027 00000 n +0000049140 00000 n +0000049222 00000 n +0000049335 00000 n +0000049417 00000 n +0000049530 00000 n +0000049612 00000 n +0000049725 00000 n +0000049807 00000 n +0000049920 00000 n +0000050002 00000 n +0000050115 00000 n +0000050197 00000 n +0000050310 00000 n +0000050392 00000 n +0000050505 00000 n +0000050587 00000 n +0000050700 00000 n +0000050782 00000 n +0000050895 00000 n +0000050977 00000 n +0000051090 00000 n +0000051172 00000 n +0000051285 00000 n +0000051367 00000 n +0000051480 00000 n +0000051562 00000 n +0000051675 00000 n +0000051757 00000 n +0000051869 00000 n +0000051951 00000 n +0000052063 00000 n +0000052145 00000 n +0000052257 00000 n +0000052339 00000 n +0000052451 00000 n +0000052533 00000 n +0000052645 00000 n +0000052727 00000 n +0000052839 00000 n +0000052921 00000 n +0000053033 00000 n +0000053115 00000 n +0000053227 00000 n +0000053309 00000 n +0000053421 00000 n +0000053503 00000 n +0000053615 00000 n +0000053697 00000 n +0000053810 00000 n +0000053892 00000 n +0000054005 00000 n +0000054087 00000 n +0000054200 00000 n +0000054282 00000 n +0000054395 00000 n +0000054477 00000 n +0000054590 00000 n +0000054672 00000 n +0000054785 00000 n +0000054867 00000 n +0000054980 00000 n +0000055062 00000 n +0000055175 00000 n +0000055257 00000 n +0000055370 00000 n +0000055452 00000 n +0000055565 00000 n +0000055647 00000 n +0000055760 00000 n +0000055842 00000 n +0000055955 00000 n +0000056037 00000 n +0000056150 00000 n +0000056232 00000 n +0000056345 00000 n +0000056427 00000 n +0000056540 00000 n +0000056622 00000 n +0000056735 00000 n +0000056817 00000 n +0000056930 00000 n +0000057012 00000 n +0000057125 00000 n +0000057207 00000 n +0000057320 00000 n +0000057402 00000 n +0000057515 00000 n +0000057597 00000 n +0000057710 00000 n +0000057792 00000 n +0000057905 00000 n +0000057987 00000 n +0000058100 00000 n +0000058182 00000 n +0000058295 00000 n +0000058377 00000 n +0000058490 00000 n +0000058572 00000 n +0000058685 00000 n +0000058767 00000 n +0000058880 00000 n +0000058962 00000 n +0000059075 00000 n +0000059157 00000 n +0000059270 00000 n +0000059352 00000 n +0000059465 00000 n +0000059547 00000 n +0000059660 00000 n +0000059742 00000 n +0000059855 00000 n +0000059937 00000 n +0000060050 00000 n +0000060132 00000 n +0000060245 00000 n +0000060327 00000 n +0000060440 00000 n +0000060522 00000 n +0000060635 00000 n +0000060717 00000 n +0000060830 00000 n +0000060912 00000 n +0000061025 00000 n +0000061107 00000 n +0000061220 00000 n +0000061302 00000 n +0000061415 00000 n +0000061497 00000 n +0000061610 00000 n +0000061692 00000 n +0000061805 00000 n +0000061887 00000 n +0000062000 00000 n +0000062082 00000 n +0000062195 00000 n +0000062277 00000 n +0000062390 00000 n +0000062472 00000 n +0000062585 00000 n +0000062667 00000 n +0000062780 00000 n +0000062862 00000 n +0000062975 00000 n +0000063057 00000 n +0000063170 00000 n +0000063252 00000 n +0000063365 00000 n +0000063447 00000 n +0000063560 00000 n +0000063642 00000 n +0000063755 00000 n +0000063837 00000 n +0000063950 00000 n +0000064032 00000 n +0000064145 00000 n +0000064227 00000 n +0000064340 00000 n +0000064422 00000 n +0000064535 00000 n +0000064617 00000 n +0000064730 00000 n +0000064812 00000 n +0000064925 00000 n +0000065007 00000 n +0000065120 00000 n +0000065202 00000 n +0000065314 00000 n +0000065396 00000 n +0000065508 00000 n +0000065590 00000 n +0000065702 00000 n +0000065784 00000 n +0000065896 00000 n +0000065978 00000 n +0000066090 00000 n +0000066172 00000 n +0000066284 00000 n +0000066366 00000 n +0000066478 00000 n +0000066560 00000 n +0000066672 00000 n +0000066754 00000 n +0000066866 00000 n +0000066948 00000 n +0000067060 00000 n +0000067142 00000 n +0000067255 00000 n +0000067337 00000 n +0000067450 00000 n +0000067532 00000 n +0000067645 00000 n +0000067727 00000 n +0000067840 00000 n +0000067922 00000 n +0000068035 00000 n +0000068117 00000 n +0000068230 00000 n +0000068312 00000 n +0000068425 00000 n +0000068507 00000 n +0000068620 00000 n +0000068702 00000 n +0000068815 00000 n +0000068897 00000 n +0000069010 00000 n +0000069092 00000 n +0000069205 00000 n +0000069287 00000 n +0000069400 00000 n +0000069482 00000 n +0000069595 00000 n +0000069677 00000 n +0000069790 00000 n +0000069872 00000 n +0000069985 00000 n +0000070067 00000 n +0000070180 00000 n +0000070262 00000 n +0000070375 00000 n +0000070457 00000 n +0000070570 00000 n +0000070652 00000 n +0000070765 00000 n +0000070847 00000 n +0000070960 00000 n +0000071042 00000 n +0000071155 00000 n +0000071237 00000 n +0000071350 00000 n +0000071432 00000 n +0000071545 00000 n +0000071627 00000 n +0000071740 00000 n +0000071822 00000 n +0000071935 00000 n +0000072017 00000 n +0000072130 00000 n +0000072212 00000 n +0000072325 00000 n +0000072407 00000 n +0000072520 00000 n +0000072602 00000 n +0000072715 00000 n +0000072797 00000 n +0000072910 00000 n +0000072992 00000 n +0000073105 00000 n +0000073187 00000 n +0000073300 00000 n +0000073382 00000 n +0000073495 00000 n +0000073577 00000 n +0000073690 00000 n +0000073772 00000 n +0000073885 00000 n +0000073967 00000 n +0000074080 00000 n +0000074162 00000 n +0000074275 00000 n +0000074357 00000 n +0000074470 00000 n +0000074552 00000 n +0000074665 00000 n +0000074747 00000 n +0000074860 00000 n +0000074942 00000 n +0000075054 00000 n +0000075136 00000 n +0000075248 00000 n +0000075330 00000 n +0000075442 00000 n +0000075524 00000 n +0000075636 00000 n +0000075718 00000 n +0000075830 00000 n +0000075912 00000 n +0000076024 00000 n +0000076106 00000 n +0000076218 00000 n +0000076300 00000 n +0000076412 00000 n +0000076494 00000 n +0000076606 00000 n +0000076688 00000 n +0000076800 00000 n +0000076882 00000 n +0000076995 00000 n +0000077077 00000 n +0000077190 00000 n +0000077272 00000 n +0000077385 00000 n +0000077467 00000 n +0000077580 00000 n +0000077662 00000 n +0000077775 00000 n +0000077857 00000 n +0000077970 00000 n +0000078052 00000 n +0000078165 00000 n +0000078247 00000 n +0000078360 00000 n +0000078442 00000 n +0000078555 00000 n +0000078637 00000 n +0000078750 00000 n +0000078832 00000 n +0000078945 00000 n +0000079027 00000 n +0000079140 00000 n +0000079222 00000 n +0000079335 00000 n +0000079417 00000 n +0000079530 00000 n +0000079612 00000 n +0000079725 00000 n +0000079807 00000 n +0000079920 00000 n +0000080002 00000 n +0000080115 00000 n +0000080197 00000 n +0000080310 00000 n +0000080392 00000 n +0000080505 00000 n +0000080587 00000 n +0000080700 00000 n +0000080782 00000 n +0000080895 00000 n +0000080977 00000 n +0000081090 00000 n +0000081172 00000 n +0000081285 00000 n +0000081367 00000 n +0000081480 00000 n +0000081562 00000 n +0000081675 00000 n +0000081757 00000 n +0000081870 00000 n +0000081952 00000 n +0000082065 00000 n +0000082147 00000 n +0000082291 00000 n +0000082373 00000 n +0000082486 00000 n +0000082568 00000 n +0000082681 00000 n +0000082763 00000 n +0000082876 00000 n +0000082958 00000 n +0000083071 00000 n +0000083153 00000 n +0000083266 00000 n +0000083348 00000 n +0000083461 00000 n +0000083543 00000 n +0000083656 00000 n +0000083738 00000 n +0000083851 00000 n +0000083933 00000 n +0000084046 00000 n +0000084128 00000 n +0000084241 00000 n +0000084323 00000 n +0000084436 00000 n +0000084518 00000 n +0000084631 00000 n +0000084713 00000 n +0000084826 00000 n +0000084908 00000 n +0000085021 00000 n +0000085103 00000 n +0000085216 00000 n +0000085298 00000 n +0000085411 00000 n +0000085493 00000 n +0000085606 00000 n +0000085688 00000 n +0000085801 00000 n +0000085883 00000 n +0000085996 00000 n +0000086078 00000 n +0000086191 00000 n +0000086273 00000 n +0000086386 00000 n +0000086468 00000 n +0000086581 00000 n +0000086663 00000 n +0000086776 00000 n +0000086858 00000 n +0000086971 00000 n +0000087053 00000 n +0000087166 00000 n +0000087248 00000 n +0000087361 00000 n +0000087443 00000 n +0000087556 00000 n +0000087638 00000 n +0000087751 00000 n +0000087833 00000 n +0000087945 00000 n +0000088027 00000 n +0000088139 00000 n +0000088221 00000 n +0000088333 00000 n +0000088415 00000 n +0000088527 00000 n +0000088609 00000 n +0000088721 00000 n +0000088803 00000 n +0000088915 00000 n +0000088997 00000 n +0000089109 00000 n +0000089191 00000 n +0000089303 00000 n +0000089385 00000 n +0000089497 00000 n +0000089579 00000 n +0000089691 00000 n +0000089773 00000 n +0000089886 00000 n +0000089968 00000 n +0000090081 00000 n +0000090163 00000 n +0000090276 00000 n +0000090358 00000 n +0000090471 00000 n +0000090553 00000 n +0000090666 00000 n +0000090748 00000 n +0000090861 00000 n +0000090943 00000 n +0000091056 00000 n +0000091138 00000 n +0000091251 00000 n +0000091333 00000 n +0000091446 00000 n +0000091528 00000 n +0000091641 00000 n +0000091723 00000 n +0000091836 00000 n +0000091918 00000 n +0000092031 00000 n +0000092113 00000 n +0000092226 00000 n +0000092308 00000 n +0000092421 00000 n +0000092503 00000 n +0000092616 00000 n +0000092698 00000 n +0000092811 00000 n +0000092893 00000 n +0000093006 00000 n +0000093088 00000 n +0000093201 00000 n +0000093283 00000 n +0000093396 00000 n +0000093478 00000 n +0000093591 00000 n +0000093673 00000 n +0000093786 00000 n +0000093868 00000 n +0000093981 00000 n +0000094063 00000 n +0000094176 00000 n +0000094258 00000 n +0000094371 00000 n +0000094453 00000 n +0000094566 00000 n +0000094648 00000 n +0000094761 00000 n +0000094843 00000 n +0000094956 00000 n +0000095038 00000 n +0000095151 00000 n +0000095233 00000 n +0000095346 00000 n +0000095428 00000 n +0000095541 00000 n +0000095623 00000 n +0000095736 00000 n +0000095818 00000 n +0000095931 00000 n +0000096013 00000 n +0000096126 00000 n +0000096208 00000 n +0000096321 00000 n +0000096403 00000 n +0000096516 00000 n +0000096598 00000 n +0000096711 00000 n +0000096793 00000 n +0000096906 00000 n +0000096988 00000 n +0000097101 00000 n +0000097183 00000 n +0000097296 00000 n +0000097378 00000 n +0000097491 00000 n +0000097573 00000 n +0000097686 00000 n +0000097768 00000 n +0000097881 00000 n +0000097963 00000 n +0000098076 00000 n +0000098158 00000 n +0000098271 00000 n +0000098353 00000 n +0000098466 00000 n +0000098548 00000 n +0000098661 00000 n +0000098743 00000 n +0000098856 00000 n +0000098938 00000 n +0000099051 00000 n +0000099133 00000 n +0000099246 00000 n +0000099328 00000 n +0000099472 00000 n +0000099554 00000 n +0000099667 00000 n +0000099749 00000 n +0000099861 00000 n +0000099943 00000 n +0000100055 00000 n +0000100137 00000 n +0000100249 00000 n +0000100331 00000 n +0000100443 00000 n +0000100525 00000 n +0000100637 00000 n +0000100719 00000 n +0000100831 00000 n +0000100913 00000 n +0000101025 00000 n +0000101107 00000 n +0000101219 00000 n +0000101301 00000 n +0000101413 00000 n +0000101495 00000 n +0000101607 00000 n +0000101689 00000 n +0000101802 00000 n +0000101884 00000 n +0000101997 00000 n +0000102079 00000 n +0000102223 00000 n +0000102305 00000 n +0000102418 00000 n +0000102500 00000 n +0000102644 00000 n +0000102726 00000 n +0000102839 00000 n +0000102921 00000 n +0000103065 00000 n +0000103147 00000 n +0000103260 00000 n +0000103344 00000 n +0000103459 00000 n +0000103606 00000 n +0000104144 00000 n +0000104757 00000 n +0000105330 00000 n +0000105903 00000 n +0000106324 00000 n +0000106881 00000 n +0000107398 00000 n +0000107596 00000 n +0000107741 00000 n +0000128374 00000 n +0000128413 00000 n +0000128602 00000 n +0000144648 00000 n +0000144838 00000 n +0000145332 00000 n +0000145708 00000 n +0000150276 00000 n +0000150511 00000 n +0000150806 00000 n +0000151147 00000 n +0000152786 00000 n +0000156160 00000 n +0000159516 00000 n +0000161993 00000 n +0000164460 00000 n +0000166534 00000 n +0000169817 00000 n +0000172552 00000 n + +trailer +<<38221969E45EDB6AD6AC869420547D7C>]>> +startxref +173975 +%%EOF diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798527678.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798527678.pdf new file mode 100644 index 000000000..516107514 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798527678.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620869.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620869.pdf new file mode 100644 index 000000000..8c181d899 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620869.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620872.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620872.pdf new file mode 100644 index 000000000..bf972e9d0 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620872.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620874.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620874.pdf new file mode 100644 index 000000000..c459d239d Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620874.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620876.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620876.pdf new file mode 100644 index 000000000..e6dae596a Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798620876.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798745810.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798745810.pdf new file mode 100644 index 000000000..32df2c6be Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798745810.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798745811.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798745811.pdf new file mode 100644 index 000000000..595d19725 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798745811.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798745812.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798745812.pdf new file mode 100644 index 000000000..cbd59c1a9 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798745812.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798782667.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798782667.pdf new file mode 100644 index 000000000..a0340fdaa Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798782667.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798782668.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798782668.pdf new file mode 100644 index 000000000..872da56af Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500798782668.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801592506.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801592506.pdf new file mode 100644 index 000000000..2d7283bbd Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801592506.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801592509.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801592509.pdf new file mode 100644 index 000000000..2228c0dd3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801592509.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801665243.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801665243.pdf new file mode 100644 index 000000000..8b2eaa03d Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801665243.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801665245.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801665245.pdf new file mode 100644 index 000000000..8eaec971f Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801665245.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726702.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726702.pdf new file mode 100644 index 000000000..2fecef909 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726702.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726703.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726703.pdf new file mode 100644 index 000000000..d03f2a504 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726703.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726704.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726704.pdf new file mode 100644 index 000000000..e4d6f5e79 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726704.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726708.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726708.pdf new file mode 100644 index 000000000..7ce866993 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726708.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726709.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726709.pdf new file mode 100644 index 000000000..5452aed70 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801726709.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801796315.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801796315.pdf new file mode 100644 index 000000000..7ec9cc61c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801796315.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801796316.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801796316.pdf new file mode 100644 index 000000000..8c1b1f2e3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801796316.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801796318.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801796318.pdf new file mode 100644 index 000000000..c96c086c0 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801796318.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853637.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853637.pdf new file mode 100644 index 000000000..2a937e587 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853637.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853638.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853638.pdf new file mode 100644 index 000000000..9aa178d47 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853638.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853639.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853639.pdf new file mode 100644 index 000000000..1f79b0737 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853639.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853640.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853640.pdf new file mode 100644 index 000000000..e279aad4d Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853640.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853641.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853641.pdf new file mode 100644 index 000000000..42ec69736 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853641.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853642.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853642.pdf new file mode 100644 index 000000000..0693e5075 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801853642.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924329.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924329.pdf new file mode 100644 index 000000000..c5ae40a94 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924329.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924330.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924330.pdf new file mode 100644 index 000000000..2356ef5c1 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924330.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924332.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924332.pdf new file mode 100644 index 000000000..f85fbbb32 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924332.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924334.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924334.pdf new file mode 100644 index 000000000..98071b0c4 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924334.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924336.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924336.pdf new file mode 100644 index 000000000..326b1dc14 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801924336.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964238.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964238.pdf new file mode 100644 index 000000000..c2be3b4c3 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964238.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964241.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964241.pdf new file mode 100644 index 000000000..875e8305c Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964241.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964242.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964242.pdf new file mode 100644 index 000000000..39dc5b573 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964242.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964243.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964243.pdf new file mode 100644 index 000000000..6ba753fea Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964243.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964244.pdf b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964244.pdf new file mode 100644 index 000000000..bd9d25da6 Binary files /dev/null and b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/500801964244.pdf differ diff --git a/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/manifest.json b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/manifest.json new file mode 100644 index 000000000..c1a601e57 --- /dev/null +++ b/backend/documents_parser/tests/fixtures/pashub_accuracy_wythenshawe/manifest.json @@ -0,0 +1,1519 @@ +{ + "project_code": "[Wythenshawe WH:SHF RAs - WH:SF - 240426 - 494493718748]", + "source": "hubspot_deal_data + uploaded_files (rd_sap_site_note) + S3", + "note": "pre_sap is pashub's own RdSAP rating; PDFs are image-stripped (text layer preserved). Rebuild with scripts/build_pashub_accuracy_fixtures.py", + "fixtures": [ + { + "deal_id": "500671707334", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500671707334.pdf", + "oracle_sap": 63, + "oracle_match": "address" + }, + { + "deal_id": "500671707335", + "uprn": "000077046521", + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500671707335.pdf", + "oracle_sap": 64, + "oracle_match": "uprn" + }, + { + "deal_id": "500671707336", + "uprn": "000077053410", + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "500671707336.pdf", + "oracle_sap": 59, + "oracle_match": "uprn" + }, + { + "deal_id": "500671707337", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500671707337.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500677104834", + "uprn": "000077050547", + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500677104834.pdf", + "oracle_sap": 63, + "oracle_match": "uprn" + }, + { + "deal_id": "500717664451", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500717664451.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500717664452", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500717664452.pdf", + "oracle_sap": 63, + "oracle_match": "address" + }, + { + "deal_id": "500717664453", + "uprn": null, + "pre_sap_raw": "D68", + "pre_sap_score": 68, + "pdf": "500717664453.pdf", + "oracle_sap": 68, + "oracle_match": "address" + }, + { + "deal_id": "500717664454", + "uprn": null, + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "500717664454.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500717664455", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500717664455.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500719659230", + "uprn": null, + "pre_sap_raw": "D68", + "pre_sap_score": 68, + "pdf": "500719659230.pdf", + "oracle_sap": 68, + "oracle_match": "address" + }, + { + "deal_id": "500719659233", + "uprn": null, + "pre_sap_raw": "D56", + "pre_sap_score": 56, + "pdf": "500719659233.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500719659234", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500719659234.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500719659235", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500719659235.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500721469635", + "uprn": null, + "pre_sap_raw": "D68", + "pre_sap_score": 68, + "pdf": "500721469635.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500721469636", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500721469636.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500738218187", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500738218187.pdf", + "oracle_sap": 67, + "oracle_match": "address" + }, + { + "deal_id": "500738218188", + "uprn": "000077073680", + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500738218188.pdf", + "oracle_sap": 61, + "oracle_match": "uprn" + }, + { + "deal_id": "500738218190", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500738218190.pdf", + "oracle_sap": 67, + "oracle_match": "address" + }, + { + "deal_id": "500752190667", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500752190667.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500752190668", + "uprn": "000077051200", + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500752190668.pdf", + "oracle_sap": 65, + "oracle_match": "uprn" + }, + { + "deal_id": "500752190669", + "uprn": null, + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "500752190669.pdf", + "oracle_sap": 59, + "oracle_match": "address" + }, + { + "deal_id": "500752190670", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500752190670.pdf", + "oracle_sap": 64, + "oracle_match": "address" + }, + { + "deal_id": "500752190671", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500752190671.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500752190672", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500752190672.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500759637226", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500759637226.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500761275639", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500761275639.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500761275640", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500761275640.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500762478811", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500762478811.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500762478813", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500762478813.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500764850382", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500764850382.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500764850384", + "uprn": "000077052680", + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500764850384.pdf", + "oracle_sap": 61, + "oracle_match": "uprn" + }, + { + "deal_id": "500764850386", + "uprn": "000077051448", + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500764850386.pdf", + "oracle_sap": 63, + "oracle_match": "uprn" + }, + { + "deal_id": "500764850389", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500764850389.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500766759115", + "uprn": null, + "pre_sap_raw": "D68", + "pre_sap_score": 68, + "pdf": "500766759115.pdf", + "oracle_sap": 68, + "oracle_match": "address" + }, + { + "deal_id": "500766759116", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500766759116.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500766759117", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500766759117.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500766759119", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "500766759119.pdf", + "oracle_sap": 66, + "oracle_match": "address" + }, + { + "deal_id": "500766759121", + "uprn": "000077045339", + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500766759121.pdf", + "oracle_sap": 63, + "oracle_match": "uprn" + }, + { + "deal_id": "500767954150", + "uprn": "000077046582", + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500767954150.pdf", + "oracle_sap": 65, + "oracle_match": "uprn" + }, + { + "deal_id": "500767954151", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500767954151.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500767954152", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500767954152.pdf", + "oracle_sap": 64, + "oracle_match": "address" + }, + { + "deal_id": "500767954153", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500767954153.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500767954154", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500767954154.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500767954156", + "uprn": null, + "pre_sap_raw": "F30", + "pre_sap_score": 30, + "pdf": "500767954156.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500770361585", + "uprn": null, + "pre_sap_raw": "D57", + "pre_sap_score": 57, + "pdf": "500770361585.pdf", + "oracle_sap": 67, + "oracle_match": "address" + }, + { + "deal_id": "500770361586", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500770361586.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500770361587", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500770361587.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500771973359", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500771973359.pdf", + "oracle_sap": 67, + "oracle_match": "address" + }, + { + "deal_id": "500771973360", + "uprn": "000077051178", + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500771973360.pdf", + "oracle_sap": 64, + "oracle_match": "uprn" + }, + { + "deal_id": "500771973361", + "uprn": "000077045449", + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "500771973361.pdf", + "oracle_sap": 66, + "oracle_match": "uprn" + }, + { + "deal_id": "500771973362", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500771973362.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500771973363", + "uprn": "000077044951", + "pre_sap_raw": "C69", + "pre_sap_score": 69, + "pdf": "500771973363.pdf", + "oracle_sap": 70, + "oracle_match": "uprn" + }, + { + "deal_id": "500771973364", + "uprn": "000077053171", + "pre_sap_raw": "D57", + "pre_sap_score": 57, + "pdf": "500771973364.pdf", + "oracle_sap": 57, + "oracle_match": "uprn" + }, + { + "deal_id": "500771973365", + "uprn": "000077050562", + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "500771973365.pdf", + "oracle_sap": 66, + "oracle_match": "uprn" + }, + { + "deal_id": "500771973366", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500771973366.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500771973367", + "uprn": null, + "pre_sap_raw": "E46", + "pre_sap_score": 46, + "pdf": "500771973367.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500774016249", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500774016249.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500796290249", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500796290249.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500796290250", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500796290250.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500796377309", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500796377309.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500796377310", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500796377310.pdf", + "oracle_sap": 67, + "oracle_match": "address" + }, + { + "deal_id": "500796377311", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "500796377311.pdf", + "oracle_sap": 66, + "oracle_match": "address" + }, + { + "deal_id": "500796377312", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500796377312.pdf", + "oracle_sap": 67, + "oracle_match": "address" + }, + { + "deal_id": "500796377314", + "uprn": "000077042251", + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500796377314.pdf", + "oracle_sap": 62, + "oracle_match": "uprn" + }, + { + "deal_id": "500796377316", + "uprn": "000077053166", + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500796377316.pdf", + "oracle_sap": 65, + "oracle_match": "uprn" + }, + { + "deal_id": "500796377317", + "uprn": null, + "pre_sap_raw": "D68", + "pre_sap_score": 68, + "pdf": "500796377317.pdf", + "oracle_sap": 68, + "oracle_match": "address" + }, + { + "deal_id": "500796377318", + "uprn": null, + "pre_sap_raw": "E53", + "pre_sap_score": 53, + "pdf": "500796377318.pdf", + "oracle_sap": 53, + "oracle_match": "address" + }, + { + "deal_id": "500796377319", + "uprn": "000077053551", + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500796377319.pdf", + "oracle_sap": 65, + "oracle_match": "uprn" + }, + { + "deal_id": "500796377320", + "uprn": "000077051205", + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500796377320.pdf", + "oracle_sap": 60, + "oracle_match": "uprn" + }, + { + "deal_id": "500796481781", + "uprn": null, + "pre_sap_raw": "C69", + "pre_sap_score": 69, + "pdf": "500796481781.pdf", + "oracle_sap": 69, + "oracle_match": "address" + }, + { + "deal_id": "500796646641", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500796646641.pdf", + "oracle_sap": 64, + "oracle_match": "address" + }, + { + "deal_id": "500796646642", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500796646642.pdf", + "oracle_sap": 66, + "oracle_match": "address" + }, + { + "deal_id": "500796646644", + "uprn": null, + "pre_sap_raw": "F34", + "pre_sap_score": 34, + "pdf": "500796646644.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500796700866", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500796700866.pdf", + "oracle_sap": 63, + "oracle_match": "address" + }, + { + "deal_id": "500796700867", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "500796700867.pdf", + "oracle_sap": 58, + "oracle_match": "address" + }, + { + "deal_id": "500796700868", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500796700868.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500797048053", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500797048053.pdf", + "oracle_sap": 63, + "oracle_match": "address" + }, + { + "deal_id": "500797048054", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797048054.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500797200599", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797200599.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500797200604", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797200604.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500797200605", + "uprn": "000077080305", + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500797200605.pdf", + "oracle_sap": 62, + "oracle_match": "uprn" + }, + { + "deal_id": "500797312247", + "uprn": "000077050541", + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500797312247.pdf", + "oracle_sap": 62, + "oracle_match": "uprn" + }, + { + "deal_id": "500797312248", + "uprn": "000077053227", + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500797312248.pdf", + "oracle_sap": 60, + "oracle_match": "uprn" + }, + { + "deal_id": "500797312249", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500797312249.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500797313211", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500797313211.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500797383868", + "uprn": "000077045425", + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500797383868.pdf", + "oracle_sap": 62, + "oracle_match": "uprn" + }, + { + "deal_id": "500797383869", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500797383869.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500797383870", + "uprn": "000077051737", + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "500797383870.pdf", + "oracle_sap": 66, + "oracle_match": "uprn" + }, + { + "deal_id": "500797465814", + "uprn": null, + "pre_sap_raw": "E41", + "pre_sap_score": 41, + "pdf": "500797465814.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500797523170", + "uprn": null, + "pre_sap_raw": "C72", + "pre_sap_score": 72, + "pdf": "500797523170.pdf", + "oracle_sap": 72, + "oracle_match": "address" + }, + { + "deal_id": "500797523171", + "uprn": "000077050551", + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500797523171.pdf", + "oracle_sap": 67, + "oracle_match": "uprn" + }, + { + "deal_id": "500797523172", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797523172.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500797523173", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500797523173.pdf", + "oracle_sap": 63, + "oracle_match": "address" + }, + { + "deal_id": "500797523174", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500797523174.pdf", + "oracle_sap": 63, + "oracle_match": "address" + }, + { + "deal_id": "500797668540", + "uprn": null, + "pre_sap_raw": "D68", + "pre_sap_score": 68, + "pdf": "500797668540.pdf", + "oracle_sap": 68, + "oracle_match": "address" + }, + { + "deal_id": "500797738231", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500797738231.pdf", + "oracle_sap": 64, + "oracle_match": "address" + }, + { + "deal_id": "500797738233", + "uprn": null, + "pre_sap_raw": "D68", + "pre_sap_score": 68, + "pdf": "500797738233.pdf", + "oracle_sap": 68, + "oracle_match": "address" + }, + { + "deal_id": "500797739194", + "uprn": null, + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "500797739194.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500797739195", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500797739195.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500797739196", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797739196.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500797739197", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797739197.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500797739198", + "uprn": "000077051347", + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797739198.pdf", + "oracle_sap": 65, + "oracle_match": "uprn" + }, + { + "deal_id": "500797739199", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797739199.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500797739200", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500797739200.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500797805805", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500797805805.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500797805807", + "uprn": null, + "pre_sap_raw": "F31", + "pre_sap_score": 31, + "pdf": "500797805807.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500797805809", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500797805809.pdf", + "oracle_sap": 67, + "oracle_match": "address" + }, + { + "deal_id": "500797805810", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500797805810.pdf", + "oracle_sap": 67, + "oracle_match": "address" + }, + { + "deal_id": "500797805811", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797805811.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500797875440", + "uprn": "000077050090", + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500797875440.pdf", + "oracle_sap": 67, + "oracle_match": "uprn" + }, + { + "deal_id": "500797962466", + "uprn": null, + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500797962466.pdf", + "oracle_sap": 60, + "oracle_match": "address" + }, + { + "deal_id": "500797962469", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797962469.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500797962470", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500797962470.pdf", + "oracle_sap": 64, + "oracle_match": "address" + }, + { + "deal_id": "500797962471", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500797962471.pdf", + "oracle_sap": 64, + "oracle_match": "address" + }, + { + "deal_id": "500797995201", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500797995201.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500797995202", + "uprn": "000077073032", + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500797995202.pdf", + "oracle_sap": 60, + "oracle_match": "uprn" + }, + { + "deal_id": "500797995203", + "uprn": "000077051983", + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500797995203.pdf", + "oracle_sap": 63, + "oracle_match": "uprn" + }, + { + "deal_id": "500798076127", + "uprn": "000077046459", + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500798076127.pdf", + "oracle_sap": 65, + "oracle_match": "uprn" + }, + { + "deal_id": "500798076128", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "500798076128.pdf", + "oracle_sap": 66, + "oracle_match": "address" + }, + { + "deal_id": "500798076130", + "uprn": null, + "pre_sap_raw": "D68", + "pre_sap_score": 68, + "pdf": "500798076130.pdf", + "oracle_sap": 68, + "oracle_match": "address" + }, + { + "deal_id": "500798148835", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500798148835.pdf", + "oracle_sap": 63, + "oracle_match": "address" + }, + { + "deal_id": "500798148836", + "uprn": "000077045469", + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500798148836.pdf", + "oracle_sap": 67, + "oracle_match": "uprn" + }, + { + "deal_id": "500798148837", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500798148837.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500798148839", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500798148839.pdf", + "oracle_sap": 64, + "oracle_match": "address" + }, + { + "deal_id": "500798148841", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500798148841.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500798341369", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500798341369.pdf", + "oracle_sap": 65, + "oracle_match": "address" + }, + { + "deal_id": "500798342331", + "uprn": null, + "pre_sap_raw": "C69", + "pre_sap_score": 69, + "pdf": "500798342331.pdf", + "oracle_sap": 69, + "oracle_match": "address" + }, + { + "deal_id": "500798527676", + "uprn": "000077050055", + "pre_sap_raw": "D60", + "pre_sap_score": 60, + "pdf": "500798527676.pdf", + "oracle_sap": 60, + "oracle_match": "uprn" + }, + { + "deal_id": "500798527677", + "uprn": "000077051819", + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500798527677.pdf", + "oracle_sap": 62, + "oracle_match": "uprn" + }, + { + "deal_id": "500798527678", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500798527678.pdf", + "oracle_sap": 67, + "oracle_match": "address" + }, + { + "deal_id": "500798620869", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500798620869.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500798620872", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "500798620872.pdf", + "oracle_sap": 58, + "oracle_match": "address" + }, + { + "deal_id": "500798620874", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500798620874.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500798620876", + "uprn": null, + "pre_sap_raw": "D58", + "pre_sap_score": 58, + "pdf": "500798620876.pdf", + "oracle_sap": 58, + "oracle_match": "address" + }, + { + "deal_id": "500798745810", + "uprn": null, + "pre_sap_raw": "C69", + "pre_sap_score": 69, + "pdf": "500798745810.pdf", + "oracle_sap": 69, + "oracle_match": "address" + }, + { + "deal_id": "500798745811", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500798745811.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500798745812", + "uprn": "000077045588", + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500798745812.pdf", + "oracle_sap": 63, + "oracle_match": "uprn" + }, + { + "deal_id": "500798782667", + "uprn": "000077053134", + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500798782667.pdf", + "oracle_sap": 61, + "oracle_match": "uprn" + }, + { + "deal_id": "500798782668", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500798782668.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500801592506", + "uprn": null, + "pre_sap_raw": "C70", + "pre_sap_score": 70, + "pdf": "500801592506.pdf", + "oracle_sap": 70, + "oracle_match": "address" + }, + { + "deal_id": "500801592509", + "uprn": null, + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "500801592509.pdf", + "oracle_sap": 59, + "oracle_match": "address" + }, + { + "deal_id": "500801665243", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "500801665243.pdf", + "oracle_sap": 66, + "oracle_match": "address" + }, + { + "deal_id": "500801665245", + "uprn": null, + "pre_sap_raw": "C69", + "pre_sap_score": 69, + "pdf": "500801665245.pdf", + "oracle_sap": 69, + "oracle_match": "address" + }, + { + "deal_id": "500801726702", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500801726702.pdf", + "oracle_sap": 63, + "oracle_match": "address" + }, + { + "deal_id": "500801726703", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500801726703.pdf", + "oracle_sap": 64, + "oracle_match": "address" + }, + { + "deal_id": "500801726704", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500801726704.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500801726708", + "uprn": null, + "pre_sap_raw": "C69", + "pre_sap_score": 69, + "pdf": "500801726708.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500801726709", + "uprn": null, + "pre_sap_raw": "C70", + "pre_sap_score": 70, + "pdf": "500801726709.pdf", + "oracle_sap": 70, + "oracle_match": "address" + }, + { + "deal_id": "500801796315", + "uprn": "000077046508", + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "500801796315.pdf", + "oracle_sap": 66, + "oracle_match": "uprn" + }, + { + "deal_id": "500801796316", + "uprn": "000077051312", + "pre_sap_raw": "D59", + "pre_sap_score": 59, + "pdf": "500801796316.pdf", + "oracle_sap": 59, + "oracle_match": "uprn" + }, + { + "deal_id": "500801796318", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "500801796318.pdf", + "oracle_sap": 66, + "oracle_match": "address" + }, + { + "deal_id": "500801853637", + "uprn": "000077045510", + "pre_sap_raw": "C72", + "pre_sap_score": 72, + "pdf": "500801853637.pdf", + "oracle_sap": 72, + "oracle_match": "uprn" + }, + { + "deal_id": "500801853638", + "uprn": "000077053376", + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500801853638.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500801853639", + "uprn": null, + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500801853639.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500801853640", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500801853640.pdf", + "oracle_sap": 64, + "oracle_match": "address" + }, + { + "deal_id": "500801853641", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500801853641.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500801853642", + "uprn": null, + "pre_sap_raw": "D64", + "pre_sap_score": 64, + "pdf": "500801853642.pdf", + "oracle_sap": 64, + "oracle_match": "address" + }, + { + "deal_id": "500801924329", + "uprn": "000077042973", + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500801924329.pdf", + "oracle_sap": 62, + "oracle_match": "uprn" + }, + { + "deal_id": "500801924330", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500801924330.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500801924332", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500801924332.pdf", + "oracle_sap": 63, + "oracle_match": "address" + }, + { + "deal_id": "500801924334", + "uprn": null, + "pre_sap_raw": "D66", + "pre_sap_score": 66, + "pdf": "500801924334.pdf", + "oracle_sap": 66, + "oracle_match": "address" + }, + { + "deal_id": "500801924336", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500801924336.pdf", + "oracle_sap": 62, + "oracle_match": "address" + }, + { + "deal_id": "500801964238", + "uprn": null, + "pre_sap_raw": "D63", + "pre_sap_score": 63, + "pdf": "500801964238.pdf", + "oracle_sap": 63, + "oracle_match": "address" + }, + { + "deal_id": "500801964241", + "uprn": null, + "pre_sap_raw": "D61", + "pre_sap_score": 61, + "pdf": "500801964241.pdf", + "oracle_sap": 61, + "oracle_match": "address" + }, + { + "deal_id": "500801964242", + "uprn": null, + "pre_sap_raw": "D67", + "pre_sap_score": 67, + "pdf": "500801964242.pdf", + "oracle_sap": null, + "oracle_match": null + }, + { + "deal_id": "500801964243", + "uprn": "000077042536", + "pre_sap_raw": "D65", + "pre_sap_score": 65, + "pdf": "500801964243.pdf", + "oracle_sap": 65, + "oracle_match": "uprn" + }, + { + "deal_id": "500801964244", + "uprn": null, + "pre_sap_raw": "D62", + "pre_sap_score": 62, + "pdf": "500801964244.pdf", + "oracle_sap": 62, + "oracle_match": "address" + } + ] +} diff --git a/backend/documents_parser/tests/test_end_to_end.py b/backend/documents_parser/tests/test_end_to_end.py index b0858ddc6..6052e581c 100644 --- a/backend/documents_parser/tests/test_end_to_end.py +++ b/backend/documents_parser/tests/test_end_to_end.py @@ -279,6 +279,7 @@ class TestPdfToEpcPropertyData: sap_ventilation=SapVentilation( ventilation_type="Mechanical Extract - Decentralised", draught_lobby=False, + has_draught_lobby=False, pressure_test="No test", open_flues_count=0, closed_flues_count=0, diff --git a/backend/documents_parser/tests/test_extractor.py b/backend/documents_parser/tests/test_extractor.py index 0666f0d7c..a855d8016 100644 --- a/backend/documents_parser/tests/test_extractor.py +++ b/backend/documents_parser/tests/test_extractor.py @@ -329,6 +329,22 @@ class TestAlternativeWalls: ).extract_alternative_walls() assert walls == [] + def test_insulation_thickness_parses_to_mm(self) -> None: + # The surveyed "Wall insulation thickness:" line must reach + # `AlternativeWall.insulation_thickness_mm`; dropped, the cascade takes + # the RdSAP 10 §5.4 100 mm favourable default (#1649 D). + block = list(self._BLOCK) + i = block.index("Wall Dry-Lined?") + block[i:i] = ["Wall insulation thickness:", "50 mm"] + walls = PasHubRdSapSiteNotesExtractor(block).extract_alternative_walls() + assert walls[0].insulation_thickness_mm == 50 + + def test_no_insulation_thickness_line_lodges_none(self) -> None: + walls = PasHubRdSapSiteNotesExtractor( + list(self._BLOCK) + ).extract_alternative_walls() + assert walls[0].insulation_thickness_mm is None + class TestBuildingMeasurements: @pytest.fixture @@ -1181,6 +1197,36 @@ class TestRoomCountElements: waste_water_heat_recovery="None", ) + def test_low_energy_lights_absent_when_exact_counts_known( + self, rce: RoomCountElements + ) -> None: + # Base fixture lodges the exact LED/CFL counts, so the aggregate + # "low energy lights" line is absent and stays None. + assert rce.number_of_fixed_low_energy_lights is None + + def test_low_energy_lights_parsed_when_exact_counts_unknown(self) -> None: + # Arrange — splice a survey that answers "No" to the exact-count + # question and lodges an aggregate low-energy count instead (the shape + # of ~6% of the PAS Hub cohort, e.g. 5 Bailey Street / 58 Hackle St). + lines = load_text_fixture() + idx = lines.index("Is the exact number of LED and CFL bulbs known?") + assert lines[idx + 1] == "Yes" + cfl_idx = lines.index("Number of fixed CFL bulbs:") + spliced = ( + lines[: idx + 1] + + ["No"] + + lines[idx + 2 : cfl_idx + 2] + + ["Number of fixed low energy lights?", "11"] + + lines[cfl_idx + 2 :] + ) + + # Act + rce = PasHubRdSapSiteNotesExtractor(spliced).extract_room_count_elements() + + # Assert + assert rce.exact_led_cfl_count_known is False + assert rce.number_of_fixed_low_energy_lights == 11 + class TestWaterUse: def test_full_water_use(self) -> None: @@ -1377,3 +1423,83 @@ class TestSolidMasonryPartyWall: bc.main_building.party_wall_construction_type == "Solid Masonry, Timber Frame, or System Built" ) + + +class TestManualEntryBoilerDescriptor: + """A Manual-Entry (non-PCDF) boiler lodges its type/age via the labels + "Type of boiler:", "Heating System (Boiler):" (which carries the pre/post- + 1998 age band) and "Is there an open flue?" — not the PCDF-Search columns + ("Type"/"Year"/"Open Flue"). The extractor must read the manual labels so + the mapper can resolve the SAP 10.2 Table 4b efficiency; dropped, the boiler + descriptor is lost and the mapper falls to the generic 0.80 default + (#1649 A). Tokens spliced verbatim from deal 500796377318 (4a Hollyhedge).""" + + _SECTION = [ + "Heating & Hot Water", + "How would you like to select the Heating System?", + "Manual Entry", + "System type:", + "Boiler with radiators or underfloor heating", + "Fuel:", + "Mains Gas", + "Type of boiler:", + "Back boiler", + "Heating System (Boiler):", + "1998 or later - Back boiler", + "Is there an open flue?", + "Yes", + "Ventilation", + ] + + def test_manual_boiler_descriptor_captured(self) -> None: + # Act + main = PasHubRdSapSiteNotesExtractor( + self._SECTION + ).extract_heating_and_hot_water().main_heating + + # Assert + assert main.selection_method == "Manual Entry" + assert main.product_id == 0 + assert main.boiler_type == "Back boiler" + assert main.boiler_age_band == "1998 or later - Back boiler" + assert main.open_flue == "Yes" + + def test_pcdf_open_flue_column_still_wins(self) -> None: + # A PCDF-Search boiler carries the "Open Flue" column ("Room-sealed"); + # the manual "Is there an open flue?" fallback must not clobber it. + section = [ + "Heating & Hot Water", + "System type:", + "Boiler with radiators or underfloor heating", + "Open Flue", + "Room-sealed", + "Ventilation", + ] + main = PasHubRdSapSiteNotesExtractor( + section + ).extract_heating_and_hot_water().main_heating + assert main.open_flue == "Room-sealed" + + +class TestHeatedRoomsLabel: + """The PasHub PDF lodges the heated-room count under "Please enter the + number of HEATED rooms:", not "Number of heated rooms?" — the old query + silently dropped it to None (#1649 E).""" + + def _section(self) -> list[str]: + return [ + "Room Count Elements", + "Number of habitable rooms?", + "5", + "Are any of these rooms unheated?", + "Yes", + "Please enter the number of HEATED rooms:", + "3", + "Customer Response", + ] + + def test_heated_rooms_label_captured(self) -> None: + rce = PasHubRdSapSiteNotesExtractor( + self._section() + ).extract_room_count_elements() + assert rce.number_of_heated_rooms == 3 diff --git a/backend/documents_parser/tests/test_pashub_sap_accuracy.py b/backend/documents_parser/tests/test_pashub_sap_accuracy.py index 09299d1cd..bdc027c74 100644 --- a/backend/documents_parser/tests/test_pashub_sap_accuracy.py +++ b/backend/documents_parser/tests/test_pashub_sap_accuracy.py @@ -75,8 +75,10 @@ _MANIFEST_PATH = _FIXTURES_DIR / "manifest.json" # 0.5. MAE rises 2.560 -> 2.701 because two of those four are large, isolated # divergences NOT caused by the mappings (which land the others at d=-1.7/+7.6): # - 499584755922 d=-33.0 Bulk-LPG main + house-coal secondary (34.0 vs pre_sap 67) -# - 507644414148 d=+18.2 community heating — pashub path maps only the control -# code, not the full heat-network fuel/flags (70.2 vs 52) +# - 507644414148 d=+18.2 community heating (70.2 vs 52) at the time. Since +# RESOLVED: fuel/flags threaded (#1590 follow-up) and the +# control code corrected 2306->2308 (2026-07-15); now +# +2.0, the SAP-10.2-engine-vs-lodged offset (not a gap). # Both are tracked for verification (pre_sap correctness vs a deeper modelling # gap) — see docs/HANDOVER_PASHUB_838_PROBLEM_PROPERTIES.md. Re-baselined to the # full-coverage aggregate; ratchet back DOWN as those two are resolved. @@ -98,11 +100,34 @@ _MANIFEST_PATH = _FIXTURES_DIR / "manifest.json" # ~58 vs 59). Ratcheted 0.50 -> 0.51 by #1602 (semi-exposed / exposed floor # exposure flags -> RdSAP §5.14 U=0.7 / §5.13 Table 20) + #1603 (alternative- # wall sub-areas + extension floor construction now threaded): observed 51.2% -# (105/205). #1601 (upper-floor +0.25 m) RESOLVED as keep-raw — adjudicated -# against verified truth it over-corrects every verified dwelling (raw beats -# +0.25 on all 7); pashub surveys internal dims and its upper-ground height -# gap is modal 0.00, so the joist void must not be added. -_MIN_WITHIN_HALF: float = 0.51 +# (105/205). Ratcheted 0.51 -> 0.58 by the 2026-07-15 levers (low-energy-lights +# + has_draught_lobby threading in from_site_notes + heat-network control code +# 2306->2308): observed 58.5%. +# Ratcheted 0.58 -> 0.78 by the 2026-07-15c INFILTRATION bundle: from_site_notes +# uniquely dropped THREE §2 inputs the gov-API/Elmhurst mappers set — +# `percent_draughtproofed` (window §2(15) pinned at the 0.25-ACH worst case), +# the +0.25 m upper-storey joist void, and built-form `sheltered_sides` +# (defaulted to a flat 2, over-sheltering end/semi/detached). The three are +# NON-ADDITIVE — each overshoots alone (which is why #1601 upper-floor +0.25 +# was previously RESOLVED as keep-raw: that call was confounded by the +# then-present draught-proofing drop suppressing every dwelling) — but together +# they land all 7 verified dwellings toward truth (none regress) and every +# built form near zero. Observed 79.5% here; vs the DB SAP-10.2 oracle +# (property_baseline_performance.effective_sap_score, portfolio 838) the cohort +# moves 62.1% -> 83.3% within-0.5. gov-API RdSAP corpus unchanged (78.9%). +# Ratcheted 0.78 -> 0.82 by the 2026-07-15e SEMI-EXPOSED-FLOOR fix: from_site_notes +# mis-routed the surveyed "Semi Exposed (unheated)" floor label to RdSAP §5.14 +# (partially-heated constant U=0.7) when a floor semi-exposed to an enclosed +# UNHEATED space belongs in §5.13 Table 20 `u_exposed_floor` (band B as-built +# U=1.20) — the gov-API code-2 "To unheated space" and Elmhurst +# `_is_floor_exposed_to_unheated_space` siblings both route it to Table 20. The +# too-low U under-counted floor loss on the 9 label-carrying cohort fixtures (the +# adjacent Ronald St mid-terrace pair among them) → a shared over-credit. A pure +# data flip in `_PASHUB_FLOOR_EXPOSURE`, from_site_notes-only (gov-API corpus +# untouched, still 78.9%). Observed 82.4% here; vs the DB SAP-10.2 oracle the +# cohort moves 83.3% -> 86.9% within-0.5, no built form regresses, all 7 verified +# dwellings unchanged (none carry the label). +_MIN_WITHIN_HALF: float = 0.82 # Ratcheted 2.71 -> 2.64 by #1590 bug 2 (roof "Insulation At: None" -> explicit # zero thickness): observed MAE 2.632 — the two ~7-SAP roof over-raters # (507665533138 / 507670893756) correcting is exactly 14/205 ≈ 0.07 of MAE. @@ -167,9 +192,16 @@ _MIN_WITHIN_HALF: float = 0.51 # Bingley still +6.818). The three silent-drop fixes the gov-API/Elmhurst paths # already apply; the electric-shower drop (100/205) was the dominant lever. # Ratcheted 0.653 -> 0.625 by #1602 (floor exposure flags) + #1603 (alternative -# walls + extension floor construction): observed MAE 0.624. #1601 (upper-floor -# +0.25 m) RESOLVED as keep-raw — see the within-0.5 note above. -_MAX_SAP_MAE: float = 0.625 +# walls + extension floor construction): observed MAE 0.624. +# Ratcheted 0.625 -> 0.521 by the 2026-07-15 levers (low-energy-lights + +# has_draught_lobby + heat-network control 2306->2308): observed MAE 0.520. +# Ratcheted 0.521 -> 0.40 by the 2026-07-15c infiltration bundle +# (percent_draughtproofed + upper-floor +0.25 m + built-form sheltered_sides; +# #1601 upper-floor RE-ADJUDICATED, see the within-0.5 note above): observed +# MAE 0.389. +# Ratcheted 0.40 -> 0.37 by the 2026-07-15e semi-exposed-floor fix (see the +# within-0.5 note above): observed MAE 0.367. +_MAX_SAP_MAE: float = 0.37 _KNOWN_GAP_REASON = ( "pashub `from_site_notes` mapper does not int-code a main-heating " @@ -289,3 +321,48 @@ def test_pashub_sap_accuracy_aggregate(capsys: pytest.CaptureFixture[str]) -> No assert sap_mae <= _MAX_SAP_MAE, ( f"SAP MAE {sap_mae:.3f} exceeded ceiling {_MAX_SAP_MAE}" ) + + +@pytest.mark.skipif(not _FIXTURES, reason="no pashub_accuracy fixtures/manifest") +def test_walsden_pins_to_pashub_resurvey_sap_64() -> None: + """13 Walsden Street (deal 499630239947) has TWO distinct gov-EPC assessments + for the same UPRN: the PAS Hub site-note re-survey we parse (inspected + 26 May 2026, accredited SAP **64**, band D, backed by `rd_sap_site_note` + files) and a SEPARATE later lodged cert (24 Jun 2026, SAP 68, registered, no + site-note). The portfolio-838 baseline latched onto the 24-Jun SAP-68 cert, + but our engine models the survey it was GIVEN and reproduces that survey's own + accredited 64 (~64.19). Confirmed against pashub (Khalim) and corroborated by + the manifest `pre_sap` D64 + hubspot D64; see the 2026-07-15e provenance + investigation in the campaign memory. The manifest is correctly 64, but the + fixture-builder can revert manifest values to a colliding DB row — so this pins + 64 explicitly. Do NOT "correct" this target to 68: that is a different + assessment with no site-note backing, and 13 Walsden is a known + re-survey-diverges outlier, not an engine under-rate.""" + outcome = _evaluate("499630239947") + assert outcome.sap_continuous is not None + assert abs(outcome.sap_continuous - 64) < 0.5, ( + f"13 Walsden SAP {outcome.sap_continuous:.2f} diverged from the PAS Hub " + "re-survey's own accredited 64 (NOT the colliding 24-Jun cert's 68)" + ) + + +@pytest.mark.skipif(not _FIXTURES, reason="no pashub_accuracy fixtures/manifest") +def test_paxton_fixture_is_v5_resurvey_sap_76() -> None: + """5 Paxton Place (deal 507639151845, uprn 10070864419) was RE-ISSUED: the + same PAS Hub survey (inspected 29 May/Jun 2026, report B74AA5A4-…) has two + accredited revisions — V2 (ventilation "Natural", SAP 80) and V5 (ventilation + "Mechanical Extract - Centralised", SAP 76, the current version). The + portfolio-838 oracle tracks the latest revision (76), so the fixture is + refreshed to the V5 PDF (2026-07-15e); our engine reproduces its accredited 76 + (~75.6). Do NOT revert this fixture/manifest to the V2 SAP-80 version. + CAVEAT: `hubspot_deal_data.pre_sap` for this deal is still stale at "C80", so a + `scripts/build_pashub_accuracy_fixtures.py` rerun would regenerate the manifest + `pre_sap` back to 80 — this pin (asserting a literal 76 against the V5 fixture) + is the canary. Confirmed against pashub: April survey → SAP 76 (Khalim).""" + outcome = _evaluate("507639151845") + assert outcome.sap_continuous is not None + assert abs(outcome.sap_continuous - 76) < 0.5, ( + f"5 Paxton SAP {outcome.sap_continuous:.2f} diverged from the current V5 " + "(MEV) re-survey's accredited 76 — has the fixture reverted to the V2 " + "(Natural, SAP 80) PDF?" + ) diff --git a/backend/documents_parser/tests/test_pashub_sap_accuracy_lrha_wave3.py b/backend/documents_parser/tests/test_pashub_sap_accuracy_lrha_wave3.py new file mode 100644 index 000000000..d734b17d7 --- /dev/null +++ b/backend/documents_parser/tests/test_pashub_sap_accuracy_lrha_wave3.py @@ -0,0 +1,182 @@ +"""End-to-end accuracy test for the pashub site-notes extractor — LRHA WAVE 3. + +Sibling of `test_pashub_sap_accuracy.py` (the Guinness GMCA cohort); see that +module's docstring for the full chain and the meaning of the hybrid `pre_sap` +gauge. This module points at the `pashub_accuracy_lrha_wave3/` fixtures built by + + python scripts/build_pashub_accuracy_fixtures.py \\ + --project-code "LRHA WAVE 3" --out-dir pashub_accuracy_lrha_wave3 + +from `hubspot_deal_data` (project_code = "LRHA WAVE 3") + the `rd_sap_site_note` +PDFs in S3. The ratchets below are calibrated to THIS cohort — do not copy the +Guinness constants across; each portfolio discovers its own floor/ceiling by +running. +""" + +from __future__ import annotations + +import json +from dataclasses import dataclass +from functools import lru_cache +from pathlib import Path +from typing import Optional + +import pytest + +from backend.documents_parser.parser import parse_site_notes_pdf +from datatypes.epc.domain.mapper import UnmappedPasHubLabel +from domain.sap10_calculator.calculator import Sap10Calculator +from domain.sap10_calculator.exceptions import UnmappedSapCode + +# Same known in-progress main-heating-control mapper gap as the Guinness module. +_KNOWN_GAPS: tuple[type[Exception], ...] = (UnmappedSapCode, UnmappedPasHubLabel) + +_FIXTURES_DIR = Path(__file__).parent / "fixtures" / "pashub_accuracy_lrha_wave3" +_MANIFEST_PATH = _FIXTURES_DIR / "manifest.json" + +# --- Ratchets (never loosen at fixed coverage), mirroring the Guinness module. +# First full run (2026-07-16): **8 computed / 96 blocked / 0 errored**. Almost +# the whole cohort was blocked on the pashub `from_site_notes` mapper, dominated +# by ELECTRIC STORAGE HEATER systems + their charge-control labels which the +# mapper flagged as an "unsupported system". +# 2026-07-16 (#1619): taught the mapper Table 4e Group 4 (electric storage) + +# Group 6 (room heater) controls and their Table 4a system codes → **45 computed +# / 59 blocked / 0 errored** (within-0.5 46.7% = 21/45, MAE 2.989). Coverage +# growth (8 → 45) is not loosening — the floor/ceiling are re-baselined to the +# new, wider cohort per the Guinness-module convention. Residual blocks are the +# separately-ticketed mapper gaps behind the storage heaters — triple glazing +# '...2002-2021', cylinder size 'Exact cylinder volume' / 'Medium (131-170 +# litres)', 'Heating oil' fuel, community-heating charging controls, 'MV - Heat +# Recovery' — each its own field-by-field follow-up, not tuning. +# 2026-07-16 (#1622/#1632): 'Heating oil' main fuel → 28 unblocked the oil +# dwellings → **51 computed / 53 blocked** (within-0.5 41.2% = 21/51, MAE +# 2.948). The newly-computable oil configs land outside 0.5 per the +# coverage-growth convention above — floor re-baselined 0.46 → 0.41. +# 2026-07-16 (#1622 sub-issues #1630-#1637): cylinder Medium band, heat-pump +# Group 2 controls + category 4, heat-network charging controls +# 2306/2314/2313, MVHR, biomass community fuel 43, HHR-control downgrade → +# **77 computed / 27 blocked** (within-0.5 42.9% = 33/77, MAE 2.960; ratchets +# hold). Residual blocks: 'Exact cylinder volume' ×16 (extractor+dataclass, +# tracked separately), the line-wrap-truncated '…room thermostat and' +# controls label ×6 (extractor fix, tracked separately), heat_network_age_band +# '2007 - 2011' ×4 (calculator cascade dict, surfaced behind the biomass +# fuel), room-in-roof gable 'None' ×1. +# Treat the constants as a regression tripwire, NOT a cohort accuracy figure; +# re-baseline (coverage growth is not loosening) as further mapper fixes unblock +# fixtures. +_MIN_WITHIN_HALF: float = 0.41 +_MAX_SAP_MAE: float = 3.0 + +_KNOWN_GAP_REASON = ( + "pashub `from_site_notes` mapper does not int-code a main-heating " + "`main_heating_control` label to a SAP code; fix in progress field-by-field" +) + + +@dataclass(frozen=True) +class PashubFixture: + deal_id: str + uprn: Optional[int] + pre_sap_raw: str + pre_sap_score: int + pdf: str + + @property + def path(self) -> Path: + return _FIXTURES_DIR / self.pdf + + +@dataclass(frozen=True) +class Outcome: + """Result of running one fixture through the pipeline.""" + + blocked: bool # blocked on the known main-heating-control gap (xfail territory) + reason: Optional[str] + sap_continuous: Optional[float] + diff: Optional[float] # abs(our SAP - pre_sap) + + +def _load_manifest() -> list[PashubFixture]: + if not _MANIFEST_PATH.exists(): + return [] + data = json.loads(_MANIFEST_PATH.read_text()) + return [PashubFixture(**entry) for entry in data["fixtures"]] + + +_FIXTURES: list[PashubFixture] = _load_manifest() +_BY_ID: dict[str, PashubFixture] = {f.deal_id: f for f in _FIXTURES} +_IDS: list[str] = [f.deal_id for f in _FIXTURES] + + +@lru_cache(maxsize=None) +def _evaluate(deal_id: str) -> Outcome: + """Run one fixture end-to-end. Shared across the two tests via the cache.""" + fixture = _BY_ID[deal_id] + try: + epc = parse_site_notes_pdf(str(fixture.path), uprn=fixture.uprn) + result = Sap10Calculator().calculate(epc) + except _KNOWN_GAPS as exc: + return Outcome(blocked=True, reason=str(exc), sap_continuous=None, diff=None) + diff = abs(result.sap_score_continuous - fixture.pre_sap_score) + return Outcome( + blocked=False, + reason=None, + sap_continuous=result.sap_score_continuous, + diff=diff, + ) + + +@pytest.mark.skipif(not _FIXTURES, reason="no pashub_accuracy_lrha_wave3 fixtures/manifest") +@pytest.mark.parametrize("deal_id", _IDS) +def test_pashub_fixture_computes(deal_id: str) -> None: + """The extractor must yield a calculable dwelling for each real property.""" + outcome = _evaluate(deal_id) + if outcome.blocked: + pytest.xfail(f"{_KNOWN_GAP_REASON}: {outcome.reason}") + assert outcome.sap_continuous is not None + assert 1 <= outcome.sap_continuous <= 100 + + +@pytest.mark.skipif(not _FIXTURES, reason="no pashub_accuracy_lrha_wave3 fixtures/manifest") +def test_pashub_sap_accuracy_aggregate(capsys: pytest.CaptureFixture[str]) -> None: + """SAP within-0.5 of pashub's `pre_sap`, aggregated over computable fixtures.""" + diffs: list[float] = [] + blocked = 0 + errored = 0 + for deal_id in _IDS: + try: + outcome = _evaluate(deal_id) + except Exception: # noqa: BLE001 - a per-fixture bug; scored there, not here + errored += 1 + continue + if outcome.blocked: + blocked += 1 + continue + assert outcome.diff is not None + diffs.append(outcome.diff) + + if not diffs: + pytest.xfail( + f"no fixture computes a SAP score " + f"({blocked} blocked on the main-heating-control gap, {errored} errored); " + f"{_KNOWN_GAP_REASON}" + ) + + n = len(diffs) + within_half = sum(1 for d in diffs if d < 0.5) / n + sap_mae = sum(diffs) / n + + with capsys.disabled(): + print( + f"\n[pashub LRHA WAVE 3 | {n} computed / {blocked} blocked / " + f"{errored} errored]" + f"\n SAP within-0.5 = {within_half:.1%} MAE = {sap_mae:.3f}" + ) + + assert within_half >= _MIN_WITHIN_HALF, ( + f"SAP within-0.5 {within_half:.1%} fell below floor " + f"{_MIN_WITHIN_HALF:.0%}" + ) + assert sap_mae <= _MAX_SAP_MAE, ( + f"SAP MAE {sap_mae:.3f} exceeded ceiling {_MAX_SAP_MAE}" + ) diff --git a/backend/documents_parser/tests/test_pashub_sap_accuracy_wythenshawe.py b/backend/documents_parser/tests/test_pashub_sap_accuracy_wythenshawe.py new file mode 100644 index 000000000..d32889708 --- /dev/null +++ b/backend/documents_parser/tests/test_pashub_sap_accuracy_wythenshawe.py @@ -0,0 +1,213 @@ +"""End-to-end accuracy test for the pashub site-notes extractor — WYTHENSHAWE. + +Sibling of `test_pashub_sap_accuracy.py` (the Guinness GMCA cohort); see that +module's docstring for the full chain. This module points at the +`pashub_accuracy_wythenshawe/` fixtures built by + + python scripts/build_pashub_accuracy_fixtures.py \\ + --project-code "[Wythenshawe WH:SHF RAs - WH:SF - 240426 - 494493718748]" \\ + --out-dir pashub_accuracy_wythenshawe + +from `hubspot_deal_data` (the project_code above) + the `rd_sap_site_note` PDFs +in S3. + +ORACLE: this module grades against the **DB PasHub-assessment SAP** — the +`epc_property_energy_performance.energy_rating_current` (`ep.source='lodged'`) +that PasHub's own assessment lodged for the dwelling — NOT the manifest +`pre_sap` (`hubspot_deal_data.pre_sap`, surveyor hand-entered and frequently +wrong; grading against it gave a misleading 79.2% / MAE 0.75 while the engine +actually matched the DB in every pre_sap≠DB case). Each fixture's oracle SAP is +resolved (by UPRN or postcode+house-number) and baked into `manifest.json` as +`oracle_sap` by `scripts/enrich_pashub_wythenshawe_oracle.py`, so CI needs no DB +access. 20 fixtures have no DB-oracle match yet (`oracle_sap` null) and are +excluded from the accuracy aggregate until PasHub sources their SAP. + +The ratchets below are calibrated to THIS cohort against the DB oracle — do not +copy the Guinness constants across; each portfolio discovers its own +floor/ceiling by running. +""" + +from __future__ import annotations + +import json +from dataclasses import dataclass +from functools import lru_cache +from pathlib import Path +from typing import Optional + +import pytest + +from backend.documents_parser.parser import parse_site_notes_pdf +from datatypes.epc.domain.mapper import UnmappedPasHubLabel +from domain.sap10_calculator.calculator import Sap10Calculator +from domain.sap10_calculator.exceptions import UnmappedSapCode + +# Same known in-progress main-heating-control mapper gap as the Guinness module. +_KNOWN_GAPS: tuple[type[Exception], ...] = (UnmappedSapCode, UnmappedPasHubLabel) + +_FIXTURES_DIR = Path(__file__).parent / "fixtures" / "pashub_accuracy_wythenshawe" +_MANIFEST_PATH = _FIXTURES_DIR / "manifest.json" + +# --- Ratchets (never loosen at fixed coverage), against the DB oracle. +# Re-pinned to the DB PasHub-assessment SAP (#1649): grading the earlier +# pre_sap-based history (which floated 75-76% / MAE 0.67-0.85 purely on +# surveyor data-entry noise) is retired — see the module docstring. +# 2026-07-19 (#1649 A-F): with the six from_site_notes fixes in place, the +# **148 DB-oracle-matched fixtures** (39 UPRN + 109 postcode+house-number; 20 +# unmatched, excluded) score **within-0.5 89.2% (132/148), MAE 0.297**. The +# residual tail is NOT fixable engine defects — two independent causes, both +# established, not inferred: +# 1. Integer-oracle rounding: the DB oracle is a *rounded integer* SAP graded +# against our continuous engine, so a band of spec-correct dwellings sits +# just over a rounding boundary (within-1.0 is 98%). +# 2. Input-provenance drift between the site-notes survey and the lodged cert. +# The two worst under-raters, 6 Barry Road (ours 60.12, oracle 62) and 87 +# Alderue (ours 61.80, oracle 63), were re-keyed into accredited Elmhurst +# on our exact inputs: Elmhurst returned **60 and 62** — matching our +# engine, and both *below* the lodged oracle. So our engine computes +# correct RdSAP; the lodged cert simply carried a lighter input set (it +# dropped the 17.4 m² solid-brick alternative wall the surveyor recorded +# via brick-bond evidence, +1.7 SAP). Accredited engines agree on identical +# inputs — a 2-point gap is an input difference, not a calculation one. +# So do NOT chase these as engine bugs, and do NOT tune the engine to close them +# (that would move the gov-API corpus off 78.9% and diverge from accredited +# Elmhurst). Treat floor/ceiling as a regression tripwire, not a target; +# re-baseline (coverage growth is not loosening) as PasHub sources the 20 +# unmatched SAPs. The clean accuracy proof is engine-vs-accredited on identical +# inputs (done for 6 Barry / 87 Alderue), not engine-vs-lodged-integer. +_MIN_WITHIN_HALF: float = 0.88 +_MAX_SAP_MAE: float = 0.31 + +_KNOWN_GAP_REASON = ( + "pashub `from_site_notes` mapper does not int-code a main-heating " + "`main_heating_control` label to a SAP code; fix in progress field-by-field" +) + + +@dataclass(frozen=True) +class PashubFixture: + deal_id: str + uprn: Optional[int] + pre_sap_raw: str + pre_sap_score: int + pdf: str + # DB PasHub-assessment SAP (the grading oracle) — + # `epc_property_energy_performance.energy_rating_current`, `source='lodged'`, + # matched by UPRN or postcode+house-number and baked into the manifest by + # `scripts/enrich_pashub_wythenshawe_oracle.py` (see the module docstring). + # None for the 20 address-unmatched fixtures (excluded from the aggregate). + oracle_sap: Optional[int] = None + oracle_match: Optional[str] = None # "uprn" | "address" | None + + @property + def path(self) -> Path: + return _FIXTURES_DIR / self.pdf + + +@dataclass(frozen=True) +class Outcome: + """Result of running one fixture through the pipeline.""" + + blocked: bool # blocked on the known main-heating-control gap (xfail territory) + reason: Optional[str] + sap_continuous: Optional[float] + diff: Optional[float] # abs(our SAP - DB oracle); None when unmatched/blocked + + +def _load_manifest() -> list[PashubFixture]: + if not _MANIFEST_PATH.exists(): + return [] + data = json.loads(_MANIFEST_PATH.read_text()) + return [PashubFixture(**entry) for entry in data["fixtures"]] + + +_FIXTURES: list[PashubFixture] = _load_manifest() +_BY_ID: dict[str, PashubFixture] = {f.deal_id: f for f in _FIXTURES} +_IDS: list[str] = [f.deal_id for f in _FIXTURES] + + +@lru_cache(maxsize=None) +def _evaluate(deal_id: str) -> Outcome: + """Run one fixture end-to-end. Shared across the two tests via the cache.""" + fixture = _BY_ID[deal_id] + try: + epc = parse_site_notes_pdf(str(fixture.path), uprn=fixture.uprn) + result = Sap10Calculator().calculate(epc) + except _KNOWN_GAPS as exc: + return Outcome(blocked=True, reason=str(exc), sap_continuous=None, diff=None) + # Grade against the DB PasHub-assessment oracle, not the surveyor-entered + # `pre_sap`. A fixture with no DB-oracle match carries diff None and is + # excluded from the accuracy aggregate (it still asserts it computes). + diff = ( + abs(result.sap_score_continuous - fixture.oracle_sap) + if fixture.oracle_sap is not None + else None + ) + return Outcome( + blocked=False, + reason=None, + sap_continuous=result.sap_score_continuous, + diff=diff, + ) + + +@pytest.mark.skipif(not _FIXTURES, reason="no pashub_accuracy_wythenshawe fixtures/manifest") +@pytest.mark.parametrize("deal_id", _IDS) +def test_pashub_fixture_computes(deal_id: str) -> None: + """The extractor must yield a calculable dwelling for each real property.""" + outcome = _evaluate(deal_id) + if outcome.blocked: + pytest.xfail(f"{_KNOWN_GAP_REASON}: {outcome.reason}") + assert outcome.sap_continuous is not None + assert 1 <= outcome.sap_continuous <= 100 + + +@pytest.mark.skipif(not _FIXTURES, reason="no pashub_accuracy_wythenshawe fixtures/manifest") +def test_pashub_sap_accuracy_aggregate(capsys: pytest.CaptureFixture[str]) -> None: + """SAP within-0.5 of the DB PasHub-assessment oracle, aggregated over the + address/UPRN-matched fixtures. Fixtures with no DB-oracle match are counted + (`unmatched`) but excluded from the accuracy figures — they cannot be graded + until PasHub sources their SAP.""" + diffs: list[float] = [] + blocked = 0 + errored = 0 + unmatched = 0 + for deal_id in _IDS: + try: + outcome = _evaluate(deal_id) + except Exception: # noqa: BLE001 - a per-fixture bug; scored there, not here + errored += 1 + continue + if outcome.blocked: + blocked += 1 + continue + if outcome.diff is None: # computed, but no DB-oracle SAP to grade against + unmatched += 1 + continue + diffs.append(outcome.diff) + + if not diffs: + pytest.xfail( + f"no fixture grades against the DB oracle " + f"({blocked} blocked, {unmatched} address-unmatched, {errored} errored); " + f"{_KNOWN_GAP_REASON}" + ) + + n = len(diffs) + within_half = sum(1 for d in diffs if d < 0.5) / n + sap_mae = sum(diffs) / n + + with capsys.disabled(): + print( + f"\n[pashub WYTHENSHAWE | {n} graded / {unmatched} unmatched / " + f"{blocked} blocked / {errored} errored | oracle=DB energy_rating_current]" + f"\n SAP within-0.5 = {within_half:.1%} MAE = {sap_mae:.3f}" + ) + + assert within_half >= _MIN_WITHIN_HALF, ( + f"SAP within-0.5 {within_half:.1%} fell below floor " + f"{_MIN_WITHIN_HALF:.0%}" + ) + assert sap_mae <= _MAX_SAP_MAE, ( + f"SAP MAE {sap_mae:.3f} exceeded ceiling {_MAX_SAP_MAE}" + ) diff --git a/datatypes/epc/domain/epc.py b/datatypes/epc/domain/epc.py index ae4fd8241..e1b6d95aa 100644 --- a/datatypes/epc/domain/epc.py +++ b/datatypes/epc/domain/epc.py @@ -1,3 +1,4 @@ +from decimal import ROUND_HALF_UP, Decimal from enum import Enum @@ -32,6 +33,17 @@ class Epc(Enum): return cls.F return cls.G + @classmethod + def from_sap_continuous(cls, score: float) -> "Epc": + """The band an un-rounded SAP rating is *published* in. + + A dwelling is banded on the integer published on its EPC, which rounds + half up (SAP 10.2 §13) — so this is `from_sap_score` over that rounding + rather than over Python's half-to-even `round`, which would drop an + exact x.5 at a band floor into the band below.""" + published: int = int(Decimal(score).quantize(Decimal("1"), rounding=ROUND_HALF_UP)) + return cls.from_sap_score(published) + def sap_lower_bound(self) -> int: """The minimum SAP rating in this band — the inverse of `from_sap_score` (A → 92, B → 81, C → 69, D → 55, E → 39, F → 21, @@ -46,3 +58,15 @@ class Epc(Enum): Epc.G: 1, } return bounds[self] + + def sap_lower_bound_continuous(self) -> float: + """The band floor on the **continuous** SAP scale — the lowest un-rounded + rating whose *published* rating falls in this band (C → 68.5). + + A dwelling is in a band by its published rating, which is the continuous + score rounded half up, so the published rating enters the band half a + point below the integer floor. Anything judging "has this dwelling + reached band X?" against a continuous score must compare with this, not + with `sap_lower_bound`: a dwelling at a continuous 68.6 publishes as SAP + 69 and *is* band C, but reads as 0.4 short of an integer floor of 69.""" + return self.sap_lower_bound() - 0.5 diff --git a/datatypes/epc/domain/mapper.py b/datatypes/epc/domain/mapper.py index 046baa622..b506995c4 100644 --- a/datatypes/epc/domain/mapper.py +++ b/datatypes/epc/domain/mapper.py @@ -154,6 +154,7 @@ from datatypes.epc.surveys.pashub_rdsap_site_notes import ( ExtensionRoofSpace, FloorMeasurement, HeatingAndHotWater, + MainHeating as PasHubMainHeating, PasHubRdSapSiteNotes, Renewables as PasHubRenewables, RoomInRoofSurfaceDetail, @@ -352,6 +353,31 @@ class EpcPropertyDataMapper: 2, ) # TODO: verify that is the correct approach + # §2 (15) draught-proofing of windows/doors. The gov-API and Elmhurst + # mappers set `percent_draughtproofed` (from their lodged percentage); + # from_site_notes uniquely dropped it → the calculator read 0 and pinned + # the window-infiltration term at its 0.25-ACH worst case (0.25 − 0.2 × + # pct/100) on EVERY pashub dwelling — a uniform cohort-wide under-rate. + # PAS Hub surveys draught-proofing per window (SapWindow.draught_proofed; + # 198/205 dwellings are fully draught-proofed, consistent with sealed + # double-glazed units), so reconstruct the area-weighted percentage the + # sibling mappers lodge directly. See the #1601 note in + # `_map_floor_dimensions` for the non-additive height/shelter partners. + sap_windows = [_map_sap_window(w) for w in survey.windows] + _dp_total_area = sum( + (w.window_width or 0.0) * (w.window_height or 0.0) for w in sap_windows + ) + _dp_proofed_area = sum( + (w.window_width or 0.0) * (w.window_height or 0.0) + for w in sap_windows + if w.draught_proofed + ) + percent_draughtproofed = ( + int(round(100.0 * _dp_proofed_area / _dp_total_area)) + if _dp_total_area > 0 + else None + ) + return EpcPropertyData( uprn=uprn, dwelling_type=f"{general.detachment_type} {general.property_type.lower()}", @@ -371,7 +397,8 @@ class EpcPropertyDataMapper: main_heating=[], door_count=room_counts.number_of_external_doors, sap_heating=_map_sap_heating(heating, ventilation, survey.water_use), - sap_windows=[_map_sap_window(w) for w in survey.windows], + sap_windows=sap_windows, + percent_draughtproofed=percent_draughtproofed, sap_energy_source=SapEnergySource( gas_connection_available=general.mains_gas_available, meter_type=general.electric_meter_type, @@ -409,6 +436,16 @@ class EpcPropertyDataMapper: cfl_fixed_lighting_bulbs_count=room_counts.number_of_fixed_cfl_bulbs, led_fixed_lighting_bulbs_count=room_counts.number_of_fixed_led_bulbs, incandescent_fixed_lighting_bulbs_count=room_counts.number_of_fixed_incandescent_bulbs, + # When the assessor did not enumerate exact LED/CFL bulbs, PAS Hub + # records an aggregate "Number of fixed low energy lights?" instead; + # thread it so the §L calculation uses the surveyed low-energy count + # rather than falling back to the pessimistic no-data default. Mirrors + # the Elmhurst path (from_elmhurst_site_notes). + low_energy_fixed_lighting_bulbs_count=( + room_counts.number_of_fixed_low_energy_lights + if not room_counts.exact_led_cfl_count_known + else None + ), total_floor_area_m2=total_floor_area, built_form=general.detachment_type, property_type=general.property_type, @@ -424,7 +461,9 @@ class EpcPropertyDataMapper: waste_water_heat_recovery=room_counts.waste_water_heat_recovery, hydro=renewables.hydro, photovoltaic_array=renewables.photovoltaic_array, - sap_ventilation=_map_sap_ventilation(ventilation), + sap_ventilation=_map_sap_ventilation( + ventilation, built_form=general.detachment_type + ), ) @staticmethod @@ -2415,6 +2454,7 @@ class EpcPropertyDataMapper: sap_room_in_roof=_api_build_room_in_roof( bp.sap_room_in_roof, is_flat=schema.property_type == 2, + built_form=schema.built_form, ), sap_alternative_wall_1=( SapAlternativeWall( @@ -2751,6 +2791,7 @@ class EpcPropertyDataMapper: sap_room_in_roof=_api_build_room_in_roof( bp.sap_room_in_roof, is_flat=schema.property_type == 2, + built_form=schema.built_form, ), sap_alternative_wall_1=( SapAlternativeWall( @@ -5538,8 +5579,16 @@ _API_TYPE_1_GABLE_TYPE_TO_KIND: Dict[int, str] = { 3: "connected_wall", } +# RdSAP 10 §1.1 (p.7-8): built forms whose BOTH gable ends are party walls, so +# neither can be a genuinely exposed gable. 4 = Mid-Terrace, 6 = Enclosed +# Mid-Terrace. End-terrace {3, 5}, semi-detached {2} and detached {1} each have +# at least one legitimately exposed gable and are left untouched. +_BOTH_ENDS_PARTY_BUILT_FORMS: Final[frozenset[int]] = frozenset({4, 6}) -def _api_type_1_gable_kind(gable_type: Optional[int]) -> str: + +def _api_type_1_gable_kind( + gable_type: Optional[int], *, built_form: Optional[int] = None +) -> str: """Map a `gable_wall_type_*` code to the cascade's RR surface kind. `None` (type unlodged) defaults to `gable_wall` (party) — the modal @@ -5547,16 +5596,35 @@ def _api_type_1_gable_kind(gable_type: Optional[int]) -> str: main-wall U). A lodged integer outside the known set raises `UnmappedApiCode` so a new gable variant forces an explicit mapping rather than silently mis-routing its U-value (mirror of the strict- - raise pattern on the other API helpers).""" + raise pattern on the other API helpers). + + `built_form` consistency guard: a mid-terrace / enclosed-mid-terrace has + external walls on its two opposite (front/rear) faces only (RdSAP 10 §1.1, + p.7-8); both end/gable elevations — and their room-in-roof continuations — + abut a neighbour and are party (§1.4.3, p.9). So an "Exposed" RR gable + lodged on such a form is itself the data anomaly: reclassify it to a Party + gable (Table 4, p.22 → U=0.25) rather than billing it at the main-wall U. + Corroborated by S10TP-05 Appendix A (a mid-terrace's roof-gable junction + length is zero) and by three accredited Elmhurst mid-terrace worksheets + (000477/000480/000516), which all lodge their RR gables as Party. The API + path lodges no per-gable U-value, so this only ever overrides a cascade + fallback, never an assessor-measured U. Surfaced by corpus cert + 100040550095 (mid-terrace, Exposed RR gable billed 19.32 m² × 2.5 = + 48.3 W/K → SAP -10.13; reclassified to Party → SAP 40, matching lodged).""" if gable_type is None: return "gable_wall" if gable_type not in _API_TYPE_1_GABLE_TYPE_TO_KIND: raise UnmappedApiCode("gable_wall_type", gable_type) - return _API_TYPE_1_GABLE_TYPE_TO_KIND[gable_type] + kind = _API_TYPE_1_GABLE_TYPE_TO_KIND[gable_type] + if kind == "gable_wall_external" and built_form in _BOTH_ENDS_PARTY_BUILT_FORMS: + return "gable_wall" + return kind def _api_type_1_gable_surfaces( type_1: Any, + *, + built_form: Optional[int] = None, ) -> Optional[List[SapRoomInRoofSurface]]: """Translate the Simplified Type 1 scalar gable fields into the per-surface list the cascade's Detailed-RR branch consumes. @@ -5575,7 +5643,7 @@ def _api_type_1_gable_surfaces( continue surfaces.append( SapRoomInRoofSurface( - kind=_api_type_1_gable_kind(gable_type), + kind=_api_type_1_gable_kind(gable_type, built_form=built_form), area_m2=_round_half_up_2dp(float(length), _RIR_TYPE_1_GABLE_HEIGHT_M), ) ) @@ -5586,6 +5654,7 @@ def _api_build_room_in_roof( bp_rir: Any, *, is_flat: bool = False, + built_form: Optional[int] = None, ) -> Optional[SapRoomInRoof]: """Build `SapRoomInRoof` from the API schema's per-bp RR block. Two real-API shapes coexist: @@ -5621,10 +5690,12 @@ def _api_build_room_in_roof( # roof (a ~52 W/K over-count on cert 6035). Gable area = L × the # §3.9.1 default RR storey height (2.45 m); the type code routes # the U-value (Exposed → main-wall U, Party → 0.25). - rir.detailed_surfaces = _api_type_1_gable_surfaces(type_1) + rir.detailed_surfaces = _api_type_1_gable_surfaces( + type_1, built_form=built_form + ) type_2 = getattr(bp_rir, "room_in_roof_type_2", None) if type_2 is not None: - rir.detailed_surfaces = _api_type_2_surfaces(type_2) + rir.detailed_surfaces = _api_type_2_surfaces(type_2, built_form=built_form) details = getattr(bp_rir, "room_in_roof_details", None) if details is not None: rir.detailed_surfaces = _api_rir_detailed_surfaces(details, is_flat=is_flat) @@ -5633,6 +5704,8 @@ def _api_build_room_in_roof( def _api_type_2_surfaces( type_2: Any, + *, + built_form: Optional[int] = None, ) -> Optional[List[SapRoomInRoofSurface]]: """Translate the §3.9.2 Simplified Type 2 block into the per-surface list the cascade's Detailed-RR branch consumes — MIRRORING the @@ -5681,7 +5754,7 @@ def _api_type_2_surfaces( continue if height <= 0 and not cw_heights: continue - kind = _api_type_1_gable_kind(gable_type) + kind = _api_type_1_gable_kind(gable_type, built_form=built_form) length_m, height_m = float(length), float(height) if cw_heights: if kind == "connected_wall": @@ -5980,17 +6053,19 @@ def _extract_age_band(age_range: str) -> str: def _map_floor_dimensions( floors: List[FloorMeasurement], floor_type: str ) -> List[SapFloorDimension]: - # NOTE (#1601, RESOLVED — keep raw): the gov-API/Elmhurst mappers add a - # 0.25 m joist-void to UPPER-storey heights (their lodged height is a CLEAR - # internal ceiling). Adjudicated against VERIFIED truth (the reliable oracle, - # not pre_sap), pashub must NOT add it: RAW beats +0.25 on all 7 verified - # dwellings (16 Stillwater 75.6 vs +0.25's 75.2 against verified 76; every - # verified property is already slightly under truth and +0.25 only lowers - # SAP). pashub surveys internal dimensions (202/205 "Measurements Location: - # Internal") and its upper−ground height difference is modal at 0.00 — the - # joist void is not differentially present, and the absolute basis is - # inconsistent (≈half clear-ceiling ~2.3, ≈half already storey-tall >2.6), - # so a blanket +0.25 is unsafe. Left as the raw surveyed value. + # #1601 RE-ADJUDICATED — add the 0.25 m upper-storey joist void, matching + # the gov-API/Elmhurst mappers (whose lodged upper height is a CLEAR internal + # ceiling; `_UPPER_FLOOR_HEIGHT_ADD_M` at mapper.py:5492 / :6697). The earlier + # "keep raw" call was made while from_site_notes still dropped + # `percent_draughtproofed` — that pinned the §2 (15) window-infiltration term + # at its 0.25-ACH worst case on every dwelling, suppressing the whole cohort, + # so omitting +0.25 (which lowers SAP) spuriously looked correct on the 7 + # verified dwellings. With draught-proofing restored the +0.25 is required: + # draught-proofing + upper-floor height + built-form sheltered_sides together + # move all 7 verified dwellings toward truth (none regress) and lift the + # cohort 62.1%→83.3% within-0.5 / MAE 0.507→0.377 vs the SAP-10.2 oracle + # (property_baseline_performance.effective_sap_score, portfolio 838). The + # three are non-additive — each overshoots alone — and MUST land together. is_exposed, is_above_partial = _pashub_floor_exposure(floor_type) dimensions: List[SapFloorDimension] = [] for floor in floors: @@ -6000,9 +6075,14 @@ def _map_floor_dimensions( # over heated space (#1602). Mirrors the gov-API/Elmhurst siblings, # which only flag the ground SapFloorDimension. is_ground = floor_number == 0 + room_height = ( + floor.height_m + if is_ground + else floor.height_m + _UPPER_FLOOR_HEIGHT_ADD_M + ) dimensions.append( SapFloorDimension( - room_height_m=floor.height_m, + room_height_m=room_height, total_floor_area_m2=floor.area_m2, party_wall_length_m=floor.pwl_m, heat_loss_perimeter_m=floor.heat_loss_perimeter_m, @@ -6094,11 +6174,20 @@ def _pashub_room_in_roof( continue surface_kind = kind if surface_kind is None: # gable — kind from the surveyed type - if d.gable_type not in _PASHUB_GABLE_TYPE_TO_KIND: + if d.gable_type is None: + # A form variant omits the "Gable wall N type:" line, so the + # type is a genuine field-absence (not a truncation or a new + # label). Default unlodged → party `gable_wall` (U=0.25), + # mirroring the gov-API sibling `_api_type_1_gable_kind(None)` + # (SAP 10.2 Table 4 p.22 party-wall default) (#1649 B). A + # present-but-unrecognised label still strict-raises below. + surface_kind = "gable_wall" + elif d.gable_type not in _PASHUB_GABLE_TYPE_TO_KIND: raise UnmappedPasHubLabel( "room-in-roof gable type", str(d.gable_type) ) - surface_kind = _PASHUB_GABLE_TYPE_TO_KIND[d.gable_type] + else: + surface_kind = _PASHUB_GABLE_TYPE_TO_KIND[d.gable_type] thickness = insulation_thickness_mm if form_asks_insulation_known and not d.insulation_known: thickness = None @@ -6150,9 +6239,21 @@ _CANONICAL_GROUND_FLOOR_TYPE: Final[str] = "Ground floor" def _pashub_floor_type(label: str) -> str: if label.strip().lower() == _CANONICAL_GROUND_FLOOR_TYPE.lower(): return _CANONICAL_GROUND_FLOOR_TYPE + # "Same dwelling below" = an internal floor between heated storeys of ONE + # dwelling — RdSAP 10 §3 gives it no floor heat loss, mechanically + # identical to a party floor. Reuse the "(another dwelling below)" + # suppression string `heat_transmission.py` substring-matches, exactly as + # the gov-API code-8 precedent does (`_API_FLOOR_HEAT_LOSS_TO_FLOOR_TYPE`). + if label.strip() == _PASHUB_SAME_DWELLING_BELOW_FLOOR_TYPE: + return "(another dwelling below)" return label +# PasHub floor-location label for a floor directly above a heated room of the +# same dwelling (e.g. an upper-storey extension floor over the main building). +_PASHUB_SAME_DWELLING_BELOW_FLOOR_TYPE: Final[str] = "Same dwelling below" + + # PAS Hub lodges the ground-floor exposure as the "Floor type:" label. Only the # two non-ground exposures carry SAP consequence; a ground floor (or an unasked/ # blank field) routes through the default ground-floor cascade. Mirrors the @@ -6162,9 +6263,20 @@ _PASHUB_FLOOR_EXPOSURE: Final[Dict[str, tuple[bool, bool]]] = { # "Exposed Floor" → open to external air / over enclosed unheated space → # RdSAP 10 §5.13 Table 20 `u_exposed_floor` cascade (is_exposed_floor). "Exposed Floor": (True, False), - # "Semi Exposed (unheated)" → above a space heated to a lesser extent → - # RdSAP 10 §5.14 constant U=0.7 (is_above_partially_heated_space). - "Semi Exposed (unheated)": (False, True), + # "Semi Exposed (unheated)" → floor semi-exposed to an enclosed UNHEATED + # space → RdSAP 10 §5.13 Table 20 `u_exposed_floor` (is_exposed_floor), + # NOT §5.14. Table 20 "collapses exposed (to outside air) and semi-exposed + # (to enclosed unheated space) into the same lookup" (rdsap_uvalues.py:1416; + # band B as-built U=1.20). Mirrors the gov-API code-2 "To unheated space" + # (semi-exposed → Table 20, mapper.py:4797) and the Elmhurst + # `_is_floor_exposed_to_unheated_space` sibling (mapper.py:5970). §5.14's + # constant U=0.7 is reserved for a floor above a *partially* heated space + # (`is_above_partially_heated_space`); the #1602 routing transposed the two. + "Semi Exposed (unheated)": (True, False), + # Internal/party floor over a heated room of the same dwelling — no floor + # heat loss (suppressed via `_pashub_floor_type`'s "(another dwelling + # below)" normalization); neither Table 20 nor §5.14 applies. + _PASHUB_SAME_DWELLING_BELOW_FLOOR_TYPE: (False, False), } @@ -6324,6 +6436,15 @@ def _map_pashub_alternative_wall(a: AlternativeWall) -> SapAlternativeWall: ), wall_thickness_measured="Y" if a.wall_thickness_mm is not None else "N", wall_thickness_mm=a.wall_thickness_mm, + # Surveyed alt-wall insulation thickness → the cascade's + # `_parse_thickness_mm`; dropped, RdSAP 10 §5.4 assumes a favourable + # 100 mm (#1649 D). Mirror the main-wall `wall_insulation_thickness` + # string wiring. + wall_insulation_thickness=( + str(a.insulation_thickness_mm) + if a.insulation_thickness_mm is not None + else None + ), ) @@ -6433,19 +6554,34 @@ def _map_sap_heating( else: main_fuel = _pashub_main_fuel_code(fuel_type) + # Table 4a system code: heat networks resolved theirs above; storage/room + # heaters resolve theirs from the surveyed type; boilers stay None. + sap_main_heating_code: Optional[int] = ( + community_sap_code + if community_sap_code is not None + else _pashub_main_heating_system_code(main) + ) + main_heating_control = _pashub_resolve_storage_control_coherence( + _pashub_main_heating_control_code(main.controls, main.system_type), + sap_main_heating_code, + ) + return SapHeating( instantaneous_wwhrs=InstantaneousWwhrs(), main_heating_details=[ MainHeatingDetail( has_fghrs=main.flue_gas_heat_recovery_system, main_fuel_type=main_fuel, - sap_main_heating_code=community_sap_code, + sap_main_heating_code=sap_main_heating_code, + main_heating_category=( + _PASHUB_HEATING_CATEGORY_HEAT_PUMP + if main.system_type.lower() in _PASHUB_HEAT_PUMP_SYSTEM_TYPES + else None + ), heat_emitter_type=_pashub_heat_emitter_code(main.emitter), emitter_temperature=main.emitter_temperature, fan_flue_present=main.fan_assist, - main_heating_control=_pashub_main_heating_control_code( - main.controls, main.system_type - ), + main_heating_control=main_heating_control, condensing=main.condensing, weather_compensator=main.weather_compensator, central_heating_pump_age_str=main.central_heating_pump_age, @@ -6476,6 +6612,18 @@ def _map_sap_heating( cylinder_insulation_type=_pashub_cylinder_insulation_type_code( heating.water_heating.insulation_type, cylinder_present ), + # A surveyed cylinder thermostat ("Has thermostat? Yes") must reach the + # calculator, which reads `!= "Y"` to apply the SAP 10.2 Table 2b Note + # a) ×1.3 absent-thermostat cylinder-temperature-factor penalty (and the + # Table 4c(2) boiler interlock). Dropped (None), every PasHub cylinder + # dwelling was penalised as thermostat-less (#1649 F). Gated on a lodged + # cylinder — a combi/no-cylinder dwelling keeps None. Mirrors the + # Elmhurst path (`"Y" if cylinder_thermostat else "N"`). + cylinder_thermostat=( + ("Y" if heating.water_heating.has_thermostat else "N") + if cylinder_present + else None + ), cylinder_insulation_thickness_mm=heating.water_heating.insulation_thickness_mm, water_heating_code=water_heating_code, water_heating_fuel=water_heating_fuel, @@ -6497,6 +6645,13 @@ _PASHUB_VENTILATION_TYPE_TO_KIND: Dict[str, Optional[str]] = { "Mechanical Extract - Centralised": "EXTRACT_OR_PIV_OUTSIDE", "Positive Input - From Outside": "EXTRACT_OR_PIV_OUTSIDE", "Positive Input - From Loft (As Natural)": None, + # Balanced mechanical ventilation with heat recovery. PasHub's survey + # form carries no PCDF product index / wet-room count / duct type, so + # `_mvhr_system_values` always takes the Table 4g default branch + # (66% × 0.70 in-use = 46.2% heat recovery) regardless of the installed + # unit — expect these dwellings in the accuracy tail until PasHub + # captures the MVHR product reference (#1637). + "MV - Heat Recovery": "MVHR", } @@ -6527,6 +6682,14 @@ _PASHUB_COMMUNITY_HEAT_SOURCE_TO_ELMHURST: Dict[str, str] = { "Community heating - boilers only": "Boilers", } +# PasHub community-fuel labels that use SAP 10.2 Table 12 row wording rather +# than the Elmhurst §14.1 vocabulary (`_ELMHURST_COMMUNITY_BOILER_FUEL_TO_ +# TABLE_12` covers "Mains Gas"/"Biomass" etc.). 43 = heat from boilers — +# biomass (Table 12, PDF p.189). +_PASHUB_COMMUNITY_FUEL_TO_TABLE_12: Dict[str, int] = { + "Heat from boilers - biomass": 43, +} + def _pashub_community_heating( heat_source_label: str, fuel_label: str @@ -6535,14 +6698,20 @@ def _pashub_community_heating( code, Table 12 fuel code) at the mapper boundary (ADR-0015), reusing `_resolve_community_heating_fuel_code`. An uncovered heat-source label strict-raises so the dwelling is never silently priced as an ordinary - boiler (issue #1590 follow-up, fixture 507644414148).""" + boiler (issue #1590 follow-up, fixture 507644414148); an uncovered + non-empty fuel label strict-raises too, rather than passing the raw + string through to the calculator's deep `MissingMainFuelType`.""" if heat_source_label not in _PASHUB_COMMUNITY_HEAT_SOURCE_TO_SAP_CODE: raise UnmappedPasHubLabel("community heat source", heat_source_label) sap_code = _PASHUB_COMMUNITY_HEAT_SOURCE_TO_SAP_CODE[heat_source_label] - fuel = _resolve_community_heating_fuel_code( - _PASHUB_COMMUNITY_HEAT_SOURCE_TO_ELMHURST[heat_source_label], - fuel_label, - ) + fuel = _PASHUB_COMMUNITY_FUEL_TO_TABLE_12.get(fuel_label) + if fuel is None: + fuel = _resolve_community_heating_fuel_code( + _PASHUB_COMMUNITY_HEAT_SOURCE_TO_ELMHURST[heat_source_label], + fuel_label, + ) + if fuel is None and fuel_label: + raise UnmappedPasHubLabel("community fuel", fuel_label) return sap_code, fuel @@ -6554,6 +6723,7 @@ def _pashub_community_heating( # convention (issue #1590 bug 6). _PASHUB_CYLINDER_SIZE_TO_SAP10: Dict[str, int] = { "Normal (90-130 litres)": 2, + "Medium (131-170 litres)": 3, # Table 28 Medium → fixed 160 L "Large (>170 litres)": 4, } @@ -6593,11 +6763,29 @@ def _pashub_cylinder_size_code( _PASHUB_SECONDARY_HEATING_TYPE_TO_SAP10: Dict[str, int] = { # Electric direct-acting (eff 1.00) — modal cohort heater. "Panel, convector or radiant heaters": 691, + # Electric water/oil-filled radiators (PCDB 694, eff 1.00). Unhyphenated — + # the secondary-heating survey field lodges its own spelling, distinct from + # the hyphenated `_PASHUB_ROOM_HEATER_TYPE_TO_SAP10` main-heating label; + # both entries are legitimately separate, do not alias. + "Water or oil filled radiators": 694, # Gas room heaters (Table 4a column A). "Flush fitting live fuel effect open front fire, sealed to fireplace": 605, "1980 or later - Open front fire with open flue, sealed to fireplace": 603, + # Pre-1980 open-fronted gas fire, open flue, not sealed to the fireplace + # (no qualifier in the label) — PCDB 601, eff 50%. 602 (601 + back boiler) + # rejected: no back-boiler qualifier surveyed. + "Pre 1980 - Open front fire with open flue": 601, + # Balanced-flue (room-sealed) gas fire/wall heater — PCDB 609 ("Gas fire + # or wall heater, balanced flue", flue RS, eff 58%), the only + # balanced-flue code in the 601-613 gas block; distinct from the + # open-flue codes above. + "Fire or wall heater with balanced flue": 609, # Solid fuel (eff 0.32 column B). "Open fire in grate": 631, + # Solid-fuel closed room heater — SAP 10.2 Table 4a code 633 (inside the + # Elmhurst solid-fuel secondary block {631..636}, so downstream fuel/ + # category resolution already covers it) (#1649 C). + "Closed room heater": 633, } @@ -6623,6 +6811,9 @@ def _pashub_secondary_heating_type_code( # cylinder is billed ZERO storage loss. _PASHUB_CYLINDER_INSULATION_TO_SAP10: Dict[str, int] = { "Factory fitted": 1, # factory-applied foam + # Loose jacket → 2 (gov-API coding; Elmhurst "Jacket" sibling). Table 2 + # Note 1 gives it its own ~2× higher storage-loss factor. + "Loose jacket": 2, } @@ -6641,13 +6832,38 @@ def _pashub_cylinder_insulation_type_code( return code -def _map_sap_ventilation(ventilation: Ventilation) -> SapVentilation: +# PAS Hub `detachment_type` label → RdSAP §S5 sheltered-sides count (mirrors the +# gov-API `_API_BUILT_FORM_TO_SHELTERED_SIDES` int map). from_site_notes left +# `sheltered_sides` None → the calculator's flat default of 2, which over-shelters +# end/semi/detached (spec 1/1/0) — an over-credit that masked the cohort-wide +# under-rate. Keyed case-insensitively; an unmapped label falls through to None +# (calculator default 2), the prior behaviour, rather than raising. +_PASHUB_BUILT_FORM_TO_SHELTERED_SIDES: Dict[str, int] = { + "detached": 0, + "semi-detached": 1, + "end-terrace": 1, + "mid-terrace": 2, + "enclosed end-terrace": 2, + "enclosed mid-terrace": 3, +} + + +def _map_sap_ventilation( + ventilation: Ventilation, built_form: Optional[str] = None +) -> SapVentilation: return SapVentilation( ventilation_type=ventilation.ventilation_type, mechanical_ventilation_kind=_pashub_mechanical_ventilation_kind( ventilation.ventilation_type ), + sheltered_sides=_PASHUB_BUILT_FORM_TO_SHELTERED_SIDES.get( + (built_form or "").strip().lower() + ), draught_lobby=ventilation.draught_lobby, + # `has_draught_lobby` is the canonical §2 (13) gate the cascade reads in + # preference to the legacy `draught_lobby` field; the site-notes path + # previously left it None, dropping the surveyed lobby. Mirror Elmhurst. + has_draught_lobby=ventilation.draught_lobby, pressure_test=ventilation.pressure_test, open_flues_count=ventilation.number_of_open_flues, closed_flues_count=ventilation.number_of_closed_flues, @@ -7743,6 +7959,10 @@ _PASHUB_MAIN_FUEL_TO_SAP10: Dict[str, int] = { # once the extractor captured the `Fuel:`-form label it had been dropping. "Dual fuel appliance (mineral and wood)": 10, "Electricity": 30, # the standard-electricity fuel code + # Oil boiler/heater fuel. 28 = epc_codes `main_fuel` "oil (not community)", + # the same code the Elmhurst map pins for the identical label; routes via + # `API_FUEL_TO_TABLE_32` → Table 32 code 4 (heating oil) for cost/CO2/PE. + "Heating oil": 28, } # PasHub surveyed secondary-heating `secondary_fuel` label → SAP 10.2 Table 32 @@ -7759,6 +7979,11 @@ _PASHUB_SECONDARY_FUEL_TO_SAP10: Dict[str, int] = { # Solid-fuel secondary heater burning house coal → Table 32 code 11 (House # coal), the same code the solid-fuel main-heating path pins (SAP 631 → 11). "House Coal": 11, + # Dual-fuel (mineral + wood) secondary heater, e.g. an open fire in grate. + # Same fuel, same Table 32 code as the main-fuel path pins for the + # sentence-case label (10 — see `_PASHUB_MAIN_FUEL_TO_SAP10`); the + # secondary-heating survey field lodges it title-cased. + "Dual Fuel Appliance (Mineral and Wood)": 10, } @@ -7833,17 +8058,135 @@ _PASHUB_HEAT_NETWORK_SYSTEM_TYPES: frozenset[str] = frozenset({ # PasHub Site-Notes main-heating "Controls" labels for a Table 4e Group 3 heat -# network → their SAP code. All four "charging system linked to use of community -# heating" codes (2306/2310/2312/2314) are calculation-identical — control_type -# 3, DLF 1.00/1.00, temperature_adjustment 0.0 (`cert_to_inputs.py` -# `_CONTROL_TYPE_BY_CODE` / DLF / temp-adjustment maps) — so the cohort's -# "...room thermostat only" resolves to 2306, the domain's modal heat-network -# control code (`domain/epc/property_overlays/main_heating_system_overlay.py`, -# `HANDOVER_POST_S0380_176`). Every code here is in `_CONTROL_TYPE_BY_CODE`. +# network → their SAP code. Table 4e Group 3 has two independent axes: +# * charging: flat-rate (DHW factor 1.05) vs linked-to-use (DHW factor 1.00); +# * control kit: no thermostat / room thermostat only (no TRVs) / thermostat +# + TRVs → control_type 1 / 2 / 3 and space-charging factor 1.10 / 1.05 / 1.00. +# The label "charging system linked to use of community heating, room thermostat +# only" fixes BOTH axes: linked-to-use (DHW 1.00) AND thermostat-only/no-TRVs +# (type 2, space 1.05) → code 2308/2309 (calculation-identical). It is NOT 2306, +# which is the linked-to-use WITH-TRVs code (type 3, space 1.00) — that asserts +# TRVs the label excludes and over-rated 16 Bingley (56.89 vs pashub 52; 2308 → +# 54.01, the residual +2.0 being the documented SAP-10.2-engine-vs-lodged offset, +# NOT a fuel/flags gap — those were threaded by the #1590 follow-up). It is also +# NOT 2303, a FLAT-RATE code (DHW 1.05, type 1) whose oracle match (52.28) is a +# coincidence of two offsetting spec violations. Codes verified against +# `cert_to_inputs.py` `_CONTROL_TYPE_BY_CODE` (2308→2), space-charging (2308→1.05) +# and DHW (2308→1.00) maps + the RdSAP label vocab in +# `etl/epc_clean/epc_attributes/MainheatControlAttributes.py`. (Supersedes the +# earlier 2306 mapping and the ADR-0053 / HANDOVER_838 "fuel/flags" attribution.) _PASHUB_HEAT_NETWORK_CONTROL_TO_SAP10: Dict[str, int] = { "Charging system linked to use of community heating, room thermostat only": ( + 2308 + ), + # Linked-to-use (DHW 1.00) WITH TRVs — these two DO assert TRVs, so the + # with-TRVs type-3 codes are correct here (unlike the thermostat-only + # label above, where 2306 was the bug): "programmer and TRVs" → 2306, + # "room thermostat and TRVs" → 2314 (PCDB `heat_network_controls`). + "Charging system linked to use of community heating, programmer and TRVs": ( 2306 ), + "Charging system linked to use of community heating, room thermostat and TRVs": ( + 2314 + ), + # Flat-rate charging (DHW 1.05) with room thermostat + TRVs → 2313 + # (control type 2, space charging 1.05). + "Flat rate charging, room thermostat and TRVs": 2313, +} + + +# PasHub `system_type` labels that are SAP 10.2 Table 4e GROUP 2: HEAT PUMPS +# WITH RADIATORS OR UNDERFLOOR HEATING (spec PDF p.172). Their control labels +# carry 22xx codes; the system's efficiency comes from the lodged PCDB product +# (`main_heating_index_number`), not a Table 4a rd row, so +# `_pashub_main_heating_system_code` correctly leaves the code None. +_PASHUB_HEAT_PUMP_SYSTEM_TYPES: frozenset[str] = frozenset({ + "heat pump with radiators or underfloor heating", +}) +# Table 4a main-heating category 4 (heat pumps) — the calculator's Appendix +# N3.6/N3.7 efficiency, extended-heating and §4f pumps+fans paths all gate on +# `main_heating_category == 4` (same category the Elmhurst mapper lodges via +# `_ELMHURST_HEATING_CATEGORY_HEAT_PUMP`). Without it a PCDB heat pump is +# billed as 100%-efficient direct electric. +_PASHUB_HEATING_CATEGORY_HEAT_PUMP: Final[int] = 4 + + +# PasHub surveyed heat-pump control labels → their SAP 10.2 Table 4e Group 2 +# code (PCDB `heat_pump_controls`, control type 2, temp adjustment 0.0). +_PASHUB_HEAT_PUMP_CONTROL_TO_SAP10: Dict[str, int] = { + "Programmer, room thermostat and TRVs": 2210, +} + + +# PasHub `system_type` labels that are SAP 10.2 Table 4e GROUP 4: ELECTRIC +# STORAGE SYSTEMS (spec PDF p.173). A distinct group from boiler/heat-network, +# so its control labels carry their own 24xx codes (see the boiler comment on +# why the same label recurs per group under a different code). +_PASHUB_STORAGE_HEATER_SYSTEM_TYPES: frozenset[str] = frozenset({ + "electric storage heaters", +}) + + +# PasHub `system_type` labels that are SAP 10.2 Table 4e GROUP 6: ROOM HEATER +# SYSTEMS (spec PDF p.173) — kept separate from storage so a room-heater control +# never takes a storage 24xx code (the same wrong-group hazard the boiler split +# guards against; e.g. 'Appliance thermostats' is a Group 6 code, not storage). +_PASHUB_ROOM_HEATER_SYSTEM_TYPES: frozenset[str] = frozenset({ + "room heaters", +}) + + +# PasHub surveyed storage-heater charge-control labels → their SAP 10.2 Table 4e +# Group 4 code (spec PDF p.173, all control type 3). Every code is present in the +# calculator's `_CONTROL_TYPE_BY_CODE` / `_CONTROL_TEMPERATURE_ADJUSTMENT_BY_CODE` +# inventory. 2404 carries a spec footnote — it "applies to high heat retention +# storage heaters (code 409) only" — enforced by the coherence guard below. 2403 +# (Celect-type) is not surveyed by PasHub, so it is left unmapped (strict-raise). +_PASHUB_STORAGE_HEATER_CONTROL_TO_SAP10: Dict[str, int] = { + "Manual charge control": 2401, + "Automatic charge control": 2402, + "Controls for high heat retention storage heaters": 2404, +} + + +# PasHub surveyed room-heater control labels → their SAP 10.2 Table 4e Group 6 +# code (spec PDF p.173). PasHub lodges the singular "Programmer and room +# thermostat"; Table 4e's Group 6 wording is the plural "Programmer and room +# thermostats" (2605) — same control. 2601 is the lowest-control (manual / +# no-thermostat) Group 6 code: control type 2, +0.3 °C MIT adjustment (PCDB +# `room_heater_systems_controls`), one step below 2602. +_PASHUB_ROOM_HEATER_CONTROL_TO_SAP10: Dict[str, int] = { + "No thermostatic control of room temperature": 2601, + "Appliance thermostats": 2602, + "Programmer and room thermostat": 2605, +} + + +# PasHub surveyed storage-heater *type* (lodged in the "Heating System (Other)" +# field, `PasHubMainHeating.community_heat_source`, for Manual Entry) → Table 4a +# code (spec PDF p.165, all 100% efficient rd rows). A PCDF-Search storage +# lodgement instead carries a PCDB `product_id`, which per RdSAP 10 p.80 (survey +# item 7-3, "storage heaters (high heat retention types only): index number of +# each heater") is lodged for high-heat-retention units only ⇒ Table 4a 409. +_PASHUB_STORAGE_HEATER_TYPE_TO_SAP10: Dict[str, int] = { + "Modern slimline storage heater": 402, + "Fan storage heater": 404, +} +_PASHUB_STORAGE_HEATER_HHR_CODE: int = 409 + + +# PasHub surveyed room-heater emitter class ("Heating System (Other)" field) → +# Table 4a code (spec PDF p.170; the electric rows are 100% efficient, the gas +# row bills its Table 4a seasonal efficiency). +_PASHUB_ROOM_HEATER_TYPE_TO_SAP10: Dict[str, int] = { + "Panel, Convector or radiant heaters": 691, + "Water or oil-filled radiators": 694, + # Gas fire, open flue, 1980+, open fronted, sealed to fireplace — Table 4a + # code 603 (PCDB "sitting proud of, and sealed to, fireplace opening", + # eff 63%). 604 (back boiler) / 605 (flush-fitting live fuel effect) + # rejected: neither qualifier appears in the surveyed label. Same PCDB row + # the secondary table pins for its differently-phrased sibling label. + "Gas fire, Open flue, 1980 or later (Open fronted), Sealed to fireplace": 603, } @@ -7856,25 +8199,35 @@ def _pashub_main_heating_control_code( The resolution is system-aware: the same control label recurs across Table 4e's system groups under different 2xxx codes, so the code is chosen by the - system's group — Group 1 boiler (`_PASHUB_MAIN_HEATING_CONTROL_TO_SAP10`) or - Group 3 heat network (`_PASHUB_HEAT_NETWORK_CONTROL_TO_SAP10`). Any other - system group, or a label the group's lookup does not cover, strict-raises - `UnmappedPasHubLabel` (naming the label and system) rather than silently - taking a wrong-group code — the gap is fixed here, never mis-rated or - strict-raised deep in the calculator as `UnmappedSapCode`.""" + system's group — Group 1 boiler (`_PASHUB_MAIN_HEATING_CONTROL_TO_SAP10`), + Group 2 heat pump (`_PASHUB_HEAT_PUMP_CONTROL_TO_SAP10`), Group 3 heat + network (`_PASHUB_HEAT_NETWORK_CONTROL_TO_SAP10`), Group 4 electric storage + (`_PASHUB_STORAGE_HEATER_CONTROL_TO_SAP10`) or Group 6 room heater + (`_PASHUB_ROOM_HEATER_CONTROL_TO_SAP10`). Any other system group, or a + label the group's lookup does not cover, strict-raises `UnmappedPasHubLabel` + (naming the label and system) rather than silently taking a wrong-group code + — the gap is fixed here, never mis-rated or strict-raised deep in the + calculator as `UnmappedSapCode`.""" if not control_label: return control_label system = system_type.lower() if system in _PASHUB_BOILER_SYSTEM_TYPES: group_map = _PASHUB_MAIN_HEATING_CONTROL_TO_SAP10 + elif system in _PASHUB_HEAT_PUMP_SYSTEM_TYPES: + group_map = _PASHUB_HEAT_PUMP_CONTROL_TO_SAP10 elif system in _PASHUB_HEAT_NETWORK_SYSTEM_TYPES: group_map = _PASHUB_HEAT_NETWORK_CONTROL_TO_SAP10 + elif system in _PASHUB_STORAGE_HEATER_SYSTEM_TYPES: + group_map = _PASHUB_STORAGE_HEATER_CONTROL_TO_SAP10 + elif system in _PASHUB_ROOM_HEATER_SYSTEM_TYPES: + group_map = _PASHUB_ROOM_HEATER_CONTROL_TO_SAP10 else: raise UnmappedPasHubLabel( "main heating control", f"{control_label!r} on unsupported system {system_type!r} " - f"(only Table 4e Group 1 boiler + Group 3 heat-network codes " - f"are mapped)", + f"(only Table 4e Group 1 boiler, Group 2 heat-pump, Group 3 " + f"heat-network, Group 4 electric-storage + Group 6 room-heater " + f"codes are mapped)", ) code = group_map.get(control_label) if code is None: @@ -7885,6 +8238,116 @@ def _pashub_main_heating_control_code( return code +# PasHub Manual-Entry boiler descriptor → SAP 10.2 Table 4b sub-row code +# (`table_4b.py`), keyed on the surveyed "Heating System (Boiler):" cell +# (`boiler_age_band`), which carries both the boiler type and the pre/post-1998 +# age band. A Manual-Entry boiler has no PCDB `product_id`, so its efficiency +# must come from Table 4b, not the generic 0.80 gas default (#1649 A). Only the +# cohort's observed gas/liquid descriptors are mapped; an unmapped descriptor +# (or an electric "Direct acting" boiler, which Table 4b does not cover) resolves +# to None, preserving the pre-existing behaviour (no block, no regression). +_PASHUB_MANUAL_BOILER_AGE_BAND_TO_TABLE_4B: Dict[str, int] = { + # Gas boilers 1998 or later (Table 4b 101-109). + "1998 or later - Condensing combi": 104, # 84/75 winter/summer + "1998 or later - Condensing": 102, # regular condensing, 84/74 + "1998 or later - Back boiler": 109, # back boiler to radiators, 66/56 + # Gas pre-1998 (Table 4b 110-119). + "Pre 1998 - Back boiler": 119, # back boiler to radiators, 66/56 + "Pre 1998 - Wall mounted": 115, # regular, wall mounted, 66/56 + # Liquid fuel boilers (Table 4b 124-132). + "Pre 1998 - Standard oil boiler": 125, # standard oil 1985-1997, 71/59 +} + + +def _pashub_manual_boiler_table_4b_code(main: PasHubMainHeating) -> Optional[int]: + """Resolve a Manual-Entry boiler's surveyed descriptor to its SAP 10.2 + Table 4b code (#1649 A). Returns None for a PCDF-Search boiler (product_id + lodged — efficiency is the SEDBUK lookup) and for any descriptor the Table + 4b map does not cover (e.g. an electric boiler), leaving the calculator's + existing cascade untouched for those.""" + if main.product_id > 0: + return None + return _PASHUB_MANUAL_BOILER_AGE_BAND_TO_TABLE_4B.get(main.boiler_age_band) + + +def _pashub_main_heating_system_code(main: PasHubMainHeating) -> Optional[int]: + """Resolve the Table 4a system code for a PasHub storage/room-heater + lodgement at the mapper boundary (ADR-0015). Heat networks resolve their + code via `_pashub_community_heating`. A PCDF-Search boiler carries None (its + efficiency is the SEDBUK/product lookup); a Manual-Entry boiler resolves its + surveyed descriptor to a SAP 10.2 Table 4b code (#1649 A) so the calculator + bills the Table 4b seasonal efficiency instead of the generic 0.80 default. + + The surveyed heater *type* is lodged in the "Heating System (Other)" field + (`community_heat_source`) for Manual Entry; a PCDF-Search storage lodgement + instead carries a PCDB `product_id`, which RdSAP 10 p.80 lodges for + high-heat-retention units only ⇒ 409. A storage system with neither a + product nor a recognised type label strict-raises rather than guessing a + Table 4a row.""" + system = main.system_type.lower() + if system in _PASHUB_STORAGE_HEATER_SYSTEM_TYPES: + if main.product_id > 0: + return _PASHUB_STORAGE_HEATER_HHR_CODE + code = _PASHUB_STORAGE_HEATER_TYPE_TO_SAP10.get(main.community_heat_source) + if code is None: + raise UnmappedPasHubLabel( + "storage heater type", + f"{main.community_heat_source!r} (Heating System (Other))", + ) + return code + if system in _PASHUB_ROOM_HEATER_SYSTEM_TYPES: + code = _PASHUB_ROOM_HEATER_TYPE_TO_SAP10.get(main.community_heat_source) + if code is None: + raise UnmappedPasHubLabel( + "room heater type", + f"{main.community_heat_source!r} (Heating System (Other))", + ) + return code + if system in _PASHUB_BOILER_SYSTEM_TYPES: + # PCDF-Search boiler → None (SEDBUK product efficiency); Manual-Entry + # boiler → its Table 4b code (or None for an uncovered/non-Table-4b + # descriptor, keeping the pre-existing cascade) (#1649 A). + return _pashub_manual_boiler_table_4b_code(main) + return None + + +# The Manual-Entry (non-HHR) Table 4a storage codes the 2404→2402 coherence +# downgrade below applies to. Deliberately narrow: any other pairing keeps the +# fail-loud raise. +_PASHUB_NON_HHR_STORAGE_CODES: frozenset[int] = frozenset( + _PASHUB_STORAGE_HEATER_TYPE_TO_SAP10.values() +) + + +def _pashub_resolve_storage_control_coherence( + main_heating_control: Union[int, str], sap_main_heating_code: Optional[int] +) -> Union[int, str]: + """SAP 10.2 Table 4e footnote: the high-heat-retention storage control code + 2404 "applies to high heat retention storage heaters (code 409) only", and + RdSAP 10 p.80 (survey item 7-3) makes an HHR lodgement carry the PCDB index + of each heater — so a Manual Entry survey pairing 2404 with a non-HHR + storage type (402/404) can never be lodged as ticked. The surveyed type + field is authoritative and the control resolves to 2402 (automatic charge + control) — the pairing the accredited cert 0764-2894-7173-2720-5535 + (62 Mayfair Road, UPRN 77066640 — the blocked Wythenshawe fixture's own + dwelling) lodges for exactly this heater description, and the code that + preserves the tick's automatic-charging semantics (a manual-charge 2401 + would contradict it). Any other incoherent pairing still fails loud rather + than rating a mismatched pair. The converse (409 with a non-2404 charge + control, e.g. 2402) is spec-legal and passes through.""" + is_hhr_control = main_heating_control == 2404 + if not is_hhr_control or sap_main_heating_code == _PASHUB_STORAGE_HEATER_HHR_CODE: + return main_heating_control + if sap_main_heating_code in _PASHUB_NON_HHR_STORAGE_CODES: + return 2402 + raise UnmappedPasHubLabel( + "main heating control", + "'Controls for high heat retention storage heaters' (2404) lodged " + f"against non-HHR storage system code {sap_main_heating_code} " + "(Table 4e: 2404 applies to code 409 only)", + ) + + def _pashub_heat_emitter_code(emitter_label: str) -> Union[int, str]: """Resolve a PasHub surveyed main-heating emitter label to its SAP10 emitter code at the mapper boundary (ADR-0015), reusing the Elmhurst emitter map @@ -7996,6 +8459,7 @@ def _pashub_wall_insulation_type_int(label: Optional[str]) -> Union[int, str]: _PASHUB_GLAZING_TYPE_TO_SAP10: Dict[str, int] = { "Double glazing installed before 2002": 3, # double pre-2002 (U 2.8) "Double glazing installed between 2002 - 2021": 2, # double 2002-2022 (U 2.0) + "Triple glazing installed between 2002 - 2021": 9, # triple 2002-2022 (U 2.0) "Double glazing, Unknown install date": 3, # unknown → pre-2002 default (U 2.8) "Double glazing installed during or after 2022": 13, # double 2022+ (U 1.4) } @@ -9571,6 +10035,10 @@ _ELMHURST_MV_TYPE_TO_KIND: Dict[str, str] = { # picking which (25)m formula to apply. "Mechanical extract, decentralised (MEV dc)": "EXTRACT_OR_PIV_OUTSIDE", "Mechanical ventilation with heat recovery (MVHR)": "MVHR", + # PIV from the loft is treated as natural ventilation → (24d)m (per the + # MechanicalVentilationKind.NATURAL contract); only PIV from OUTSIDE is + # whole-house extract → EXTRACT_OR_PIV_OUTSIDE / (24c)m. + "Positive input from loft": "NATURAL", } diff --git a/datatypes/epc/domain/tests/test_from_site_notes.py b/datatypes/epc/domain/tests/test_from_site_notes.py index de16a931c..07b93ff5f 100644 --- a/datatypes/epc/domain/tests/test_from_site_notes.py +++ b/datatypes/epc/domain/tests/test_from_site_notes.py @@ -1,5 +1,6 @@ import json import os +from dataclasses import replace from datetime import date from typing import Any, Dict, Optional @@ -156,6 +157,30 @@ class TestCommunityHeatingMapping: assert main.sap_main_heating_code == 301 assert main.main_fuel_type == 51 + def test_community_biomass_boilers_lodge_table_12_biomass_fuel(self) -> None: + # Arrange — PasHub renders the community fuel with the Table 12 row + # wording (`Heat from boilers - biomass`), unlike the Elmhurst §14.1 + # labels (`Biomass`). + data = load("pashub_rdsap_site_notes_example1.json") + mh = data["heating_and_hot_water"]["main_heating"] + mh["system_type"] = "Community heating system" + mh["community_heat_source"] = "Community heating - boilers only" + mh["fuel"] = "Heat from boilers - biomass" + mh["controls"] = ( + "Charging system linked to use of community heating, room thermostat only" + ) + mh["product_id"] = 0 + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act + main = EpcPropertyDataMapper.from_site_notes( + survey + ).sap_heating.main_heating_details[0] + + # Assert — Table 12 code 43 (heat from boilers — biomass). + assert main.sap_main_heating_code == 301 + assert main.main_fuel_type == 43 + def test_unknown_heat_source_strict_raises(self) -> None: # Arrange data = load("pashub_rdsap_site_notes_example1.json") @@ -169,6 +194,22 @@ class TestCommunityHeatingMapping: with pytest.raises(UnmappedPasHubLabel, match="community heat source"): EpcPropertyDataMapper.from_site_notes(survey) + def test_unknown_community_fuel_strict_raises(self) -> None: + # Arrange — a recognised heat source with an uncovered fuel label. It + # must strict-raise at the boundary rather than pass the raw string + # through to the calculator's deep `MissingMainFuelType` (ADR-0015). + data = load("pashub_rdsap_site_notes_example1.json") + mh = data["heating_and_hot_water"]["main_heating"] + mh["system_type"] = "Community heating system" + mh["community_heat_source"] = "Community heating - boilers only" + mh["fuel"] = "Some novel fuel" + mh["controls"] = "" + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act / Assert + with pytest.raises(UnmappedPasHubLabel, match="community fuel"): + EpcPropertyDataMapper.from_site_notes(survey) + class TestRoomInRoofMapping: """A surveyed room-in-roof block (RdSAP §3.10 detailed measurement) must @@ -392,6 +433,23 @@ class TestCylinderInsulationTypeCoding: assert result.sap_heating is not None assert result.sap_heating.cylinder_insulation_type == 1 + def test_loose_jacket_codes_to_jacket(self) -> None: + # Arrange — "Loose jacket" → code 2 (gov-API coding; Elmhurst + # "Jacket" sibling). SAP 10.2 Table 2 Note 1 bills a loose jacket a + # separate, ~2× higher storage-loss factor than factory foam. + data = load("pashub_rdsap_site_notes_example1.json") + data["heating_and_hot_water"]["water_heating"]["insulation_type"] = ( + "Loose jacket" + ) + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act + result = EpcPropertyDataMapper.from_site_notes(survey) + + # Assert + assert result.sap_heating is not None + assert result.sap_heating.cylinder_insulation_type == 2 + def test_unknown_label_strict_raises(self) -> None: # Arrange data = load("pashub_rdsap_site_notes_example1.json") @@ -507,12 +565,16 @@ class TestWallDryLinedMapping: class TestFloorExposureMapping: """A surveyed "Floor type" of "Semi Exposed (unheated)" or "Exposed Floor" must set the SapFloorDimension exposure flags on the part's LOWEST storey - (floor==0), so the floor-U cascade routes through RdSAP §5.14 (U=0.7, - above partially heated space) / §5.13 Table 20 (u_exposed_floor) instead of - the default BS EN ISO 13370 ground-floor formula. `_map_floor_dimensions` - previously never set them — the exposure was silently dropped and every - semi-exposed/exposed floor billed as an on-soil ground floor (#1602). The - gov-API/Elmhurst siblings already flag the ground SapFloorDimension.""" + (floor==0), so the floor-U cascade routes through RdSAP §5.13 Table 20 + (`u_exposed_floor`) — which covers BOTH a floor exposed to outside air AND + one semi-exposed to an enclosed unheated space — instead of the default + BS EN ISO 13370 ground-floor formula. `_map_floor_dimensions` previously + never set them — the exposure was silently dropped and every semi-exposed/ + exposed floor billed as an on-soil ground floor (#1602). §5.14's constant + U=0.7 is reserved for a floor above a *partially* heated space, which the + PAS Hub survey does not lodge; #1602 mis-routed "Semi Exposed (unheated)" + there and this corrects it to Table 20. The gov-API/Elmhurst siblings + already flag the ground SapFloorDimension to Table 20.""" @staticmethod def _ground(part: SapBuildingPart) -> SapFloorDimension: @@ -522,7 +584,13 @@ class TestFloorExposureMapping: def _upper(part: SapBuildingPart) -> SapFloorDimension: return next(fd for fd in part.sap_floor_dimensions if fd.floor == 1) - def test_semi_exposed_sets_above_partially_heated_on_ground_floor(self) -> None: + def test_semi_exposed_unheated_sets_exposed_floor_on_ground_floor(self) -> None: + # "Semi Exposed (unheated)" sits above an enclosed UNHEATED space → + # RdSAP 10 §5.13 Table 20 `u_exposed_floor` (is_exposed_floor), NOT + # §5.14's constant U=0.7 (reserved for a *partially* heated space + # below). Mirrors the gov-API code-2 "To unheated space" and the + # Elmhurst `_is_floor_exposed_to_unheated_space` siblings; corrects + # the #1602 routing that transposed the two branches. # Arrange data = load("pashub_rdsap_site_notes_example1.json") data["building_construction"]["floor"]["floor_type"] = "Semi Exposed (unheated)" @@ -531,10 +599,10 @@ class TestFloorExposureMapping: # Act result = EpcPropertyDataMapper.from_site_notes(survey) - # Assert — §5.14 flag on the ground floor only, exposed flag clear. + # Assert — Table 20 exposed flag on the ground floor only. ground = self._ground(result.sap_building_parts[0]) - assert ground.is_above_partially_heated_space is True - assert ground.is_exposed_floor is False + assert ground.is_exposed_floor is True + assert ground.is_above_partially_heated_space is False def test_exposed_floor_sets_exposed_on_ground_floor(self) -> None: # Arrange @@ -564,6 +632,29 @@ class TestFloorExposureMapping: assert upper.is_exposed_floor is False assert upper.is_above_partially_heated_space is False + def test_same_dwelling_below_lodges_party_floor_with_no_heat_loss(self) -> None: + # "Same dwelling below" is an internal floor between heated storeys of + # one dwelling — RdSAP 10 §3 gives it NO floor heat loss. Mirrors the + # gov-API code-8 precedent: normalize to the "(another dwelling + # below)" suppression string `heat_transmission.py` substring-matches + # to zero the part's floor loss, and keep both Table 20/§5.14 + # exposure flags off (it is neither exposed nor above a partially + # heated space). + # Arrange + data = load("pashub_rdsap_site_notes_example1.json") + data["building_construction"]["floor"]["floor_type"] = "Same dwelling below" + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act + result = EpcPropertyDataMapper.from_site_notes(survey) + + # Assert — the party-floor suppression string and no exposure flags. + part = result.sap_building_parts[0] + assert part.floor_type == "(another dwelling below)" + ground = self._ground(part) + assert ground.is_exposed_floor is False + assert ground.is_above_partially_heated_space is False + def test_ground_floor_type_leaves_both_flags_off(self) -> None: # Arrange — the fixture as lodged ("Ground Floor"). survey = from_dict( @@ -766,6 +857,7 @@ class TestCylinderSizeCoding: "label, expected_code", [ ("Normal (90-130 litres)", 2), + ("Medium (131-170 litres)", 3), # Table 28 Medium → fixed 160 L ("Large (>170 litres)", 4), ("No Access", 2), # fed from the (gas) main → Table 28 "otherwise" ], @@ -821,6 +913,7 @@ class TestMechanicalVentilationKindCoding: ("Mechanical Extract - Centralised", "EXTRACT_OR_PIV_OUTSIDE"), ("Positive Input - From Outside", "EXTRACT_OR_PIV_OUTSIDE"), ("Positive Input - From Loft (As Natural)", None), + ("MV - Heat Recovery", "MVHR"), ], ) def test_label_maps_to_mechanical_kind( @@ -1084,6 +1177,10 @@ class TestSecondaryHeatingTypeCoding: # Electric direct-acting (PCDB 691, eff 1.00) — the modal cohort # heater; 691 == the old 693 fallback efficiency, so unchanged. ("Panel, convector or radiant heaters", 691), + # Electric water/oil-filled radiators (PCDB 694, eff 1.00); + # unhyphenated secondary-field spelling, distinct from the + # hyphenated main-heating room-heater label. + ("Water or oil filled radiators", 694), # Gas room heaters (PCDB Table 4a column A). ( "Flush fitting live fuel effect open front fire, " @@ -1095,6 +1192,14 @@ class TestSecondaryHeatingTypeCoding: "sealed to fireplace", 603, ), + # Pre-1980 open-fronted gas fire on an open flue, NOT sealed to + # the fireplace (no qualifier in the label) — PCDB 601, eff 50%; + # 602 (with back boiler) rejected, no back-boiler qualifier. + ("Pre 1980 - Open front fire with open flue", 601), + # Room-sealed (balanced flue) gas fire/wall heater — PCDB 609 + # ("Gas fire or wall heater, balanced flue", flue RS, eff 58%), + # the only balanced-flue code in the 601-613 gas block. + ("Fire or wall heater with balanced flue", 609), # Solid fuel (PCDB 631, eff 0.32 col B). ("Open fire in grate", 631), ("No Secondary Heating", None), # no secondary heater lodged @@ -1122,6 +1227,31 @@ class TestSecondaryHeatingTypeCoding: EpcPropertyDataMapper.from_site_notes(survey) +class TestSecondaryFuelTypeCodingDualFuel: + """The secondary-heating survey field lodges the dual-fuel appliance + title-cased ("Dual Fuel Appliance (Mineral and Wood)"), unlike the + sentence-case main-fuel label already mapped — exact-string lookups, so + both tables need their own entry. Same physical fuel, same Table 32 + code 10 the main-fuel path pins.""" + + def test_title_case_dual_fuel_maps_to_table_32_code_10(self) -> None: + # Arrange + data = load("pashub_rdsap_site_notes_example1.json") + data["heating_and_hot_water"]["secondary_heating"][ + "secondary_fuel" + ] = "Dual Fuel Appliance (Mineral and Wood)" + data["heating_and_hot_water"]["secondary_heating"][ + "secondary_system" + ] = "Open fire in grate" + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act + result = EpcPropertyDataMapper.from_site_notes(survey) + + # Assert + assert result.sap_heating.secondary_fuel_type == 10 + + class TestSecondaryFuelTypeCoding: """`from_site_notes` must int-code the PAS Hub secondary-heating `secondary_fuel` label to the SAP 10.2 Table 32 `secondary_fuel_type` @@ -1212,6 +1342,7 @@ class TestGlazingTypeCoding: [ ("Double glazing installed before 2002", 3), # double pre-2002, U 2.8 ("Double glazing installed between 2002 - 2021", 2), # double 2002-2022, U 2.0 + ("Triple glazing installed between 2002 - 2021", 9), # triple 2002-2022, U 2.0 ("Double glazing, Unknown install date", 3), # unknown → pre-2002 default, U 2.8 ("Double glazing installed during or after 2022", 13), # double 2022+, U 1.4 ("", ""), # no lodging — passes through (calc nulls it) @@ -1254,6 +1385,7 @@ class TestMainFuelCoding: # was dropping. 10 = epc_codes `main_fuel` dual fuel (mineral + wood). ("Dual fuel appliance (mineral and wood)", 10), ("Electricity", 30), # standard-electricity fuel code + ("Heating oil", 28), # oil (not community); Table 32 code 4 ], ) def test_label_maps_to_sap_code(self, label: str, expected_code: int) -> None: @@ -1677,9 +1809,11 @@ class TestFromSiteNotesExample1: ) def test_floor_height(self, result: EpcPropertyData) -> None: - # floors[0].height_m: 2.37 (Floor 1, upper) + # floors[0].height_m: 2.37 (Floor 1, upper) + 0.25 m joist-void = 2.62. + # The +0.25 m upper-storey add now mirrors the gov-API/Elmhurst mappers + # (see _map_floor_dimensions #1601 re-adjudication). assert ( - result.sap_building_parts[0].sap_floor_dimensions[0].room_height_m == 2.37 + result.sap_building_parts[0].sap_floor_dimensions[0].room_height_m == 2.62 ) def test_heat_loss_perimeter(self, result: EpcPropertyData) -> None: @@ -1823,6 +1957,7 @@ class TestFromSiteNotesExample1: has_fixed_air_conditioning=False, cylinder_size=2, # "Normal (90-130 litres)" → Table 28 code 2 cylinder_insulation_type=1, # "Factory fitted" → foam, SAP10 code 1 + cylinder_thermostat="Y", # "Has thermostat? Yes" → interlock (#1649 F) cylinder_insulation_thickness_mm=12, water_heating_code=901, # cylinder + "From main heating 1" → WHC 901 shower_outlets=ShowerOutlets( @@ -1913,7 +2048,7 @@ class TestFromSiteNotesExample1: party_wall_construction=4, # "Cavity Masonry, Unfilled" → SAP10 code 4 (U=0.5) sap_floor_dimensions=[ SapFloorDimension( - room_height_m=2.37, + room_height_m=2.62, # 2.37 raw + 0.25 m upper-storey joist void total_floor_area_m2=24.78, party_wall_length_m=6.15, heat_loss_perimeter_m=14.21, @@ -1957,6 +2092,9 @@ class TestFromSiteNotesExample1: has_conservatory=False, blocked_chimneys_count=0, draughtproofed_door_count=2, + # §2 (15) draught-proofing: area-weighted % of draught-proofed + # windows (all 4 windows draught-proofed → 100). Previously dropped. + percent_draughtproofed=100, report_reference="49D422A9-0779-44DD-9665-464D35DFF1A8", number_of_storeys=2, any_unheated_rooms=True, @@ -1974,11 +2112,139 @@ class TestFromSiteNotesExample1: flueless_gas_fires_count=0, pressure_test="No test", draught_lobby=False, + has_draught_lobby=False, + # RdSAP §S5 sheltered sides from built form: Mid-terrace → 2. + # Previously left None (calculator default 2); now set explicitly + # so end/semi/detached get their correct 1/1/0 instead of 2. + sheltered_sides=2, ), ) assert result == expected +class TestFromSiteNotesInfiltrationFixes: + """Focused coverage for the three §2 infiltration inputs that + `from_site_notes` previously dropped — `percent_draughtproofed`, the + +0.25 m upper-storey joist void, and built-form `sheltered_sides`. All + three are set by the gov-API/Elmhurst sibling mappers; restoring them + together corrects a cohort-wide SAP under-rate vs the accredited SAP-10.2 + oracle (62.1%→83.3% within-0.5). Fixture example1 is a Mid-terrace house + with 4 all-draught-proofed windows and raw storey heights 2.35 (ground) / + 2.37 (upper). + """ + + @pytest.fixture + def survey(self) -> PasHubRdSapSiteNotes: + return from_dict( + PasHubRdSapSiteNotes, load("pashub_rdsap_site_notes_example1.json") + ) + + # --- percent_draughtproofed (§2 (15)) --- + + def test_all_windows_proofed_gives_100( + self, survey: PasHubRdSapSiteNotes + ) -> None: + result = EpcPropertyDataMapper.from_site_notes(survey) + assert result.percent_draughtproofed == 100 + + def test_percent_is_area_weighted_not_count_based( + self, survey: PasHubRdSapSiteNotes + ) -> None: + # Un-proof only the LARGEST window; the percentage must fall by that + # window's AREA share, which differs from a naive (N-1)/N count. + windows = survey.windows + big = max( + range(len(windows)), + key=lambda i: windows[i].width_m * windows[i].height_m, + ) + s = replace( + survey, + windows=[ + replace(w, draught_proofed=False) if i == big else w + for i, w in enumerate(windows) + ], + ) + result = EpcPropertyDataMapper.from_site_notes(s) + + total = sum(w.width_m * w.height_m for w in windows) + proofed = sum( + w.width_m * w.height_m for i, w in enumerate(windows) if i != big + ) + expected_area_pct = int(round(100.0 * proofed / total)) + count_pct = int(round(100.0 * (len(windows) - 1) / len(windows))) + assert result.percent_draughtproofed is not None + assert result.percent_draughtproofed == expected_area_pct + assert result.percent_draughtproofed != count_pct # proves AREA weighting + assert result.percent_draughtproofed < 100 + + def test_no_windows_proofed_gives_0( + self, survey: PasHubRdSapSiteNotes + ) -> None: + s = replace( + survey, windows=[replace(w, draught_proofed=False) for w in survey.windows] + ) + result = EpcPropertyDataMapper.from_site_notes(s) + assert result.percent_draughtproofed == 0 + + def test_no_windows_gives_none(self, survey: PasHubRdSapSiteNotes) -> None: + # No openings to weight → None (not 0), so the calculator applies its + # own default rather than a spurious 0% draught-proofing. + s = replace(survey, windows=[]) + result = EpcPropertyDataMapper.from_site_notes(s) + assert result.percent_draughtproofed is None + + # --- +0.25 m upper-storey joist void --- + + def test_upper_floor_gets_joist_void_ground_does_not( + self, survey: PasHubRdSapSiteNotes + ) -> None: + result = EpcPropertyDataMapper.from_site_notes(survey) + parts = result.sap_building_parts + assert parts is not None + heights = {fd.floor: fd.room_height_m for fd in parts[0].sap_floor_dimensions} + assert heights[0] == 2.35 # ground floor: raw surveyed height + assert heights[1] == 2.62 # upper: 2.37 raw + 0.25 m joist void + + # --- built-form sheltered_sides (RdSAP §S5) --- + + @pytest.mark.parametrize( + "detachment_type, expected_sides", + [ + ("Detached", 0), + ("Semi-Detached", 1), + ("End-terrace", 1), + ("Mid-terrace", 2), + ("Enclosed End-terrace", 2), + ("Enclosed Mid-terrace", 3), + ], + ) + def test_sheltered_sides_from_built_form( + self, + survey: PasHubRdSapSiteNotes, + detachment_type: str, + expected_sides: int, + ) -> None: + s = replace( + survey, + general=replace(survey.general, detachment_type=detachment_type), + ) + result = EpcPropertyDataMapper.from_site_notes(s) + assert result.sap_ventilation is not None + assert result.sap_ventilation.sheltered_sides == expected_sides + + def test_unknown_built_form_leaves_sheltered_sides_none( + self, survey: PasHubRdSapSiteNotes + ) -> None: + # An unmapped label must fall through to None (calculator default 2), + # never silently mis-map to a wrong shelter count. + s = replace( + survey, general=replace(survey.general, detachment_type="Park home") + ) + result = EpcPropertyDataMapper.from_site_notes(s) + assert result.sap_ventilation is not None + assert result.sap_ventilation.sheltered_sides is None + + class TestFromSiteNotesVentilation: """ Fixture: pashub_rdsap_site_notes_example1.json @@ -2334,7 +2600,10 @@ class TestPasHubMainHeatingControlCoding: # mapper against drifting out of sync with the calculator's coverage. from datatypes.epc.domain.mapper import ( _PASHUB_HEAT_NETWORK_CONTROL_TO_SAP10, # pyright: ignore[reportPrivateUsage] + _PASHUB_HEAT_PUMP_CONTROL_TO_SAP10, # pyright: ignore[reportPrivateUsage] _PASHUB_MAIN_HEATING_CONTROL_TO_SAP10, # pyright: ignore[reportPrivateUsage] + _PASHUB_ROOM_HEATER_CONTROL_TO_SAP10, # pyright: ignore[reportPrivateUsage] + _PASHUB_STORAGE_HEATER_CONTROL_TO_SAP10, # pyright: ignore[reportPrivateUsage] ) from domain.sap10_calculator.rdsap.cert_to_inputs import ( _CONTROL_TYPE_BY_CODE, # pyright: ignore[reportPrivateUsage] @@ -2342,7 +2611,10 @@ class TestPasHubMainHeatingControlCoding: mapped_codes = { *_PASHUB_MAIN_HEATING_CONTROL_TO_SAP10.values(), + *_PASHUB_HEAT_PUMP_CONTROL_TO_SAP10.values(), *_PASHUB_HEAT_NETWORK_CONTROL_TO_SAP10.values(), + *_PASHUB_STORAGE_HEATER_CONTROL_TO_SAP10.values(), + *_PASHUB_ROOM_HEATER_CONTROL_TO_SAP10.values(), } unknown = {c for c in mapped_codes if c not in _CONTROL_TYPE_BY_CODE} @@ -2425,11 +2697,151 @@ class TestPasHubMainHeatingControlCoding: with pytest.raises(UnmappedPasHubLabel, match="Heat pump"): EpcPropertyDataMapper.from_site_notes(survey) + def test_heat_pump_control_maps_to_group2_code(self) -> None: + # Arrange — a Table 4e Group 2 heat pump (`system_type = "Heat pump + # with radiators or underfloor heating"`). Its control label carries + # the Group 2 (22xx) code, not the boiler 2106: "Programmer, room + # thermostat and TRVs" → 2210, control type 2 (PCDB + # `heat_pump_controls`). + from domain.sap10_calculator.rdsap.cert_to_inputs import ( + _control_type, # pyright: ignore[reportPrivateUsage] + ) + + raw = load("pashub_rdsap_site_notes_example1.json") + mh = raw["heating_and_hot_water"]["main_heating"] + mh["system_type"] = "Heat pump with radiators or underfloor heating" + mh["fuel"] = "Electricity" + mh["controls"] = "Programmer, room thermostat and TRVs" + survey = from_dict(PasHubRdSapSiteNotes, raw) + + # Act + main = EpcPropertyDataMapper.from_site_notes( + survey + ).sap_heating.main_heating_details[0] + + # Assert — the Group 2 code, its spec control type, and Table 4a + # category 4: the calculator's Appendix N3.6/N3.7 heat-pump + # efficiency path gates on `main_heating_category == 4`, so without + # it the lodged PCDB heat pump is billed as 100%-efficient direct + # electric (−47 SAP on the two LRHA WAVE 3 heat-pump fixtures). + assert main.main_heating_control == 2210 + assert _control_type(main) == 2 + assert main.main_heating_category == 4 + + def test_heat_pump_unmapped_control_label_strict_raises(self) -> None: + # A heat-pump control label the Group 2 lookup does not cover + # strict-raises (naming label + system), never silently mis-rating. + raw = load("pashub_rdsap_site_notes_example1.json") + mh = raw["heating_and_hot_water"]["main_heating"] + mh["system_type"] = "Heat pump with radiators or underfloor heating" + mh["fuel"] = "Electricity" + mh["controls"] = "Some novel control" + survey = from_dict(PasHubRdSapSiteNotes, raw) + + with pytest.raises( + UnmappedPasHubLabel, match="Heat pump with radiators" + ): + EpcPropertyDataMapper.from_site_notes(survey) + + def test_room_heater_no_thermostatic_control_maps_to_group6_code(self) -> None: + # Arrange — a Table 4e Group 6 room-heater dwelling with the lowest- + # control label: "No thermostatic control of room temperature" → 2601 + # (PCDB `room_heater_systems_controls`, control type 2, +0.3 °C MIT + # adjustment) — one step below the already-mapped 2602. + from domain.sap10_calculator.rdsap.cert_to_inputs import ( + _control_type, # pyright: ignore[reportPrivateUsage] + ) + + raw = load("pashub_rdsap_site_notes_example1.json") + mh = raw["heating_and_hot_water"]["main_heating"] + mh["system_type"] = "Room heaters" + mh["community_heat_source"] = "Panel, Convector or radiant heaters" + mh["fuel"] = "Electricity" + mh["product_id"] = 0 + mh["controls"] = "No thermostatic control of room temperature" + survey = from_dict(PasHubRdSapSiteNotes, raw) + + # Act + main = EpcPropertyDataMapper.from_site_notes( + survey + ).sap_heating.main_heating_details[0] + + # Assert + assert main.main_heating_control == 2601 + assert _control_type(main) == 2 + + def test_gas_room_heater_type_maps_to_table_4a_code_603(self) -> None: + # Arrange — a gas room-heater main system (verbatim fixture + # 500797805807 lodgement): open flue, 1980+, open fronted, sealed to + # fireplace → Table 4a code 603 (PCDB "sitting proud of, and sealed + # to, fireplace opening", eff 63%). 604 (with back boiler) and 605 + # (flush-fitting live fuel effect) rejected — neither qualifier is in + # the label. + raw = load("pashub_rdsap_site_notes_example1.json") + mh = raw["heating_and_hot_water"]["main_heating"] + mh["system_type"] = "Room heaters" + mh["community_heat_source"] = ( + "Gas fire, Open flue, 1980 or later (Open fronted), " + "Sealed to fireplace" + ) + mh["fuel"] = "Mains Gas" + mh["product_id"] = 0 + mh["controls"] = "No thermostatic control of room temperature" + survey = from_dict(PasHubRdSapSiteNotes, raw) + + # Act + main = EpcPropertyDataMapper.from_site_notes( + survey + ).sap_heating.main_heating_details[0] + + # Assert — the gas Table 4a row and the mains-gas fuel code. + assert main.sap_main_heating_code == 603 + assert main.main_fuel_type == 26 + + @pytest.mark.parametrize( + "heater_type, expected_system_code", + [ + ("Modern slimline storage heater", 402), + ("Fan storage heater", 404), + ], + ) + def test_hhr_control_on_manual_entry_non_hhr_storage_downgrades_to_2402( + self, heater_type: str, expected_system_code: int + ) -> None: + # Arrange — a Manual Entry (no PCDB index) storage lodgement whose + # surveyed type is non-HHR but whose Controls tick is "Controls for + # high heat retention storage heaters" (2404). SAP 10.2 Table 4e + # footnote pins 2404 to code 409 only, and RdSAP 10 p.80 (survey item + # 7-3) requires a PCDB index for any HHR lodgement — absent one, the + # type field is authoritative and the control resolves to 2402 + # (automatic charge control), the pairing the accredited cert + # 0764-2894-7173-2720-5535 (62 Mayfair Road, UPRN 77066640 — the + # blocked Wythenshawe fixture's dwelling) actually lodges. + raw = load("pashub_rdsap_site_notes_example1.json") + mh = raw["heating_and_hot_water"]["main_heating"] + mh["system_type"] = "Electric storage heaters" + mh["community_heat_source"] = heater_type + mh["fuel"] = "Electricity" + mh["product_id"] = 0 + mh["controls"] = "Controls for high heat retention storage heaters" + survey = from_dict(PasHubRdSapSiteNotes, raw) + + # Act + main = EpcPropertyDataMapper.from_site_notes( + survey + ).sap_heating.main_heating_details[0] + + # Assert — the surveyed type stands; the un-lodgeable HHR control + # downgrades to the non-HHR automatic charge control. + assert main.sap_main_heating_code == expected_system_code + assert main.main_heating_control == 2402 + def test_heat_network_control_maps_to_group3_code(self) -> None: # Arrange — a Table 4e Group 3 heat network (`system_type = # "Community heating system"`). Its control label carries a Group 3 - # (23xx) code, not the boiler 21xx; the accredited Elmhurst certs for - # this same cohort lodge 2306 for it (HANDOVER_POST_S0380_176). + # (23xx) code, not the boiler 21xx. "charging linked to use … room + # thermostat only" is linked-to-use (DHW 1.00) + thermostat-only/no-TRVs + # → code 2308, control type 2 (NOT 2306, the with-TRVs type-3 code). from domain.sap10_calculator.rdsap.cert_to_inputs import ( _control_type, # pyright: ignore[reportPrivateUsage] ) @@ -2452,9 +2864,58 @@ class TestPasHubMainHeatingControlCoding: survey ).sap_heating.main_heating_details[0] - # Assert — the Group 3 code, and its spec control type (3). - assert main.main_heating_control == 2306 - assert _control_type(main) == 3 + # Assert — the Group 3 linked-to-use, thermostat-only code and its + # spec control type (2). + assert main.main_heating_control == 2308 + assert _control_type(main) == 2 + + @pytest.mark.parametrize( + "label, code, control_type", + [ + # Linked-to-use charging (DHW factor 1.00) with TRVs → type 3. + ( + "Charging system linked to use of community heating, " + "programmer and TRVs", + 2306, + 3, + ), + ( + "Charging system linked to use of community heating, " + "room thermostat and TRVs", + 2314, + 3, + ), + # Flat-rate charging (DHW factor 1.05) with thermostat + TRVs + # → type 2. + ("Flat rate charging, room thermostat and TRVs", 2313, 2), + ], + ) + def test_heat_network_charging_control_maps_to_group3_code( + self, label: str, code: int, control_type: int + ) -> None: + # Arrange — a complete Table 4e Group 3 community lodgement with the + # charging-control label under test. + from domain.sap10_calculator.rdsap.cert_to_inputs import ( + _control_type, # pyright: ignore[reportPrivateUsage] + ) + + raw = load("pashub_rdsap_site_notes_example1.json") + mh = raw["heating_and_hot_water"]["main_heating"] + mh["system_type"] = "Community heating system" + mh["community_heat_source"] = "Community heating - boilers only" + mh["fuel"] = "Mains Gas" + mh["product_id"] = 0 + mh["controls"] = label + survey = from_dict(PasHubRdSapSiteNotes, raw) + + # Act + main = EpcPropertyDataMapper.from_site_notes( + survey + ).sap_heating.main_heating_details[0] + + # Assert + assert main.main_heating_control == code + assert _control_type(main) == control_type def test_heat_network_unmapped_control_label_strict_raises(self) -> None: # A community-system control label the Group 3 lookup does not cover @@ -2472,6 +2933,54 @@ class TestPasHubMainHeatingControlCoding: EpcPropertyDataMapper.from_site_notes(survey) +class TestPasHubLowEnergyLighting: + """When the assessor does not enumerate exact LED/CFL bulbs, PAS Hub lodges + an aggregate "Number of fixed low energy lights?" count. `from_site_notes` + must thread it into `low_energy_fixed_lighting_bulbs_count` (mirroring the + Elmhurst path) so §L uses the surveyed low-energy count rather than the + pessimistic no-lighting-data default that under-rates SAP.""" + + def test_aggregate_count_threaded_when_exact_unknown(self) -> None: + data = load("pashub_rdsap_site_notes_example1.json") + data["room_count_elements"]["exact_led_cfl_count_known"] = False + data["room_count_elements"]["number_of_fixed_low_energy_lights"] = 9 + survey = from_dict(PasHubRdSapSiteNotes, data) + + result = EpcPropertyDataMapper.from_site_notes(survey) + + assert result.low_energy_fixed_lighting_bulbs_count == 9 + + def test_aggregate_count_ignored_when_exact_counts_known(self) -> None: + # When exact LED/CFL counts are lodged, the per-type counts are + # authoritative and the aggregate field must not shadow them. + data = load("pashub_rdsap_site_notes_example1.json") + data["room_count_elements"]["exact_led_cfl_count_known"] = True + data["room_count_elements"]["number_of_fixed_low_energy_lights"] = 9 + survey = from_dict(PasHubRdSapSiteNotes, data) + + result = EpcPropertyDataMapper.from_site_notes(survey) + + assert result.low_energy_fixed_lighting_bulbs_count is None + + +class TestPasHubDraughtLobby: + """`from_site_notes` must set the canonical §2 (13) gate `has_draught_lobby` + (the cascade reads it in preference to the legacy `draught_lobby` field); + leaving it None dropped the surveyed lobby and over-stated infiltration.""" + + @pytest.mark.parametrize("surveyed, expected", [(True, True), (False, False)]) + def test_has_draught_lobby_threaded_from_survey( + self, surveyed: bool, expected: bool + ) -> None: + data = load("pashub_rdsap_site_notes_example1.json") + data["ventilation"]["draught_lobby"] = surveyed + survey = from_dict(PasHubRdSapSiteNotes, data) + + result = EpcPropertyDataMapper.from_site_notes(survey) + + assert result.sap_ventilation.has_draught_lobby is expected + + class TestPasHubUnmappedHeatEmitter: """A PasHub survey whose surveyed main-heating emitter label the mapper does not yet cover must strict-raise `UnmappedPasHubLabel` at the boundary, @@ -2492,3 +3001,250 @@ class TestPasHubUnmappedHeatEmitter: # Act / Assert with pytest.raises(UnmappedPasHubLabel, match="Skirting heaters"): EpcPropertyDataMapper.from_site_notes(survey) + + +class TestPasHubCylinderThermostat: + """The surveyed hot-water cylinder thermostat ("Has thermostat? Yes") must + reach `sap_heating.cylinder_thermostat` — dropped (left None), the + calculator reads `!= "Y"` and applies the SAP 10.2 Table 2b Note a) ×1.3 + absent-thermostat cylinder-temperature-factor penalty (equivalently the + Table 4c(2) −5pp boiler-interlock penalty), inflating stored-HW loss and + under-rating every PasHub cylinder dwelling. The Elmhurst sibling maps it + (`"Y" if cylinder_thermostat else "N"`); `from_site_notes` did not. + Evidence: 52 Bucklow Drive (DB 62, ours 59.44 → 61.79) and 13 Kerne Grove + (DB 67, ours 64.95 → 67.11) — the two worst DB-oracle under-raters (#1649 F). + """ + + def test_surveyed_cylinder_thermostat_yes_maps_to_Y(self) -> None: + # Arrange — example1 lodges a cylinder ("Normal (90-130 litres)") with + # "Has thermostat? Yes". + data = load("pashub_rdsap_site_notes_example1.json") + assert data["heating_and_hot_water"]["water_heating"]["has_thermostat"] is True + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act + result = EpcPropertyDataMapper.from_site_notes(survey) + + # Assert + assert result.sap_heating.cylinder_thermostat == "Y" + + def test_surveyed_cylinder_thermostat_no_maps_to_N(self) -> None: + # Arrange + data = load("pashub_rdsap_site_notes_example1.json") + data["heating_and_hot_water"]["water_heating"]["has_thermostat"] = False + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act + result = EpcPropertyDataMapper.from_site_notes(survey) + + # Assert + assert result.sap_heating.cylinder_thermostat == "N" + + def test_no_cylinder_leaves_thermostat_none(self) -> None: + # Arrange — a combi/no-cylinder dwelling has no cylinder thermostat to + # lodge; the field must stay None (not "N"), so the calculator's + # cylinder-loss path is not spuriously engaged. + data = load("pashub_rdsap_site_notes_example1.json") + data["heating_and_hot_water"]["water_heating"]["cylinder_size"] = "No Cylinder" + data["heating_and_hot_water"]["water_heating"]["has_thermostat"] = None + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act + result = EpcPropertyDataMapper.from_site_notes(survey) + + # Assert + assert result.sap_heating.cylinder_thermostat is None + + +class TestPasHubRoomInRoofGableNoneDefaultsParty: + """A survey-form variant that omits the room-in-roof gable-type field lodges + a genuine `gable_type=None` (field-absence, not a truncation or a new + label). The mapper must default it to the party `gable_wall` (U=0.25), + mirroring the gov-API sibling `_api_type_1_gable_kind(None)` — a + present-but-unrecognised label still strict-raises. Left raising, the + fixture is uncomputable (500771973367 8 Bucklow Drive, 500759637226 34 + Bucklow Drive both BLOCKED; #1649 B). Spec: SAP 10.2 Table 4 p.22 (party + wall U=0.25). + """ + + _RIR_GABLE_NONE = { + "age_range": "C: 1930 - 1949", + "floor_area_m2": 21.0, + # The form variant lodges length/height but no "Gable wall N type:" line + # → gable_type is a genuine None. + "gables": [ + {"length_m": 4.76, "height_m": 2.32}, + {"length_m": 3.16, "height_m": 2.32}, + ], + "slopes": [{"length_m": 4.76, "height_m": 2.5}], + } + + def test_gable_type_none_defaults_to_party_gable_wall(self) -> None: + # Arrange + data = load("pashub_rdsap_site_notes_example1.json") + data["roof_space"]["main_building"]["rooms_in_roof"] = True + data["roof_space"]["main_building"]["room_in_roof"] = self._RIR_GABLE_NONE + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act — must not raise + rir = EpcPropertyDataMapper.from_site_notes(survey).sap_building_parts[ + 0 + ].sap_room_in_roof + + # Assert — both unlodged-type gables default to the party gable_wall. + assert rir is not None + assert rir.detailed_surfaces is not None + gable_kinds = [ + s.kind for s in rir.detailed_surfaces if s.kind.startswith("gable_wall") + ] + assert gable_kinds == ["gable_wall", "gable_wall"] + + def test_present_but_unknown_gable_label_still_raises(self) -> None: + # Arrange — a lodged-but-unrecognised label is a real coverage gap and + # must still fail loud (the None default must not swallow it). + data = load("pashub_rdsap_site_notes_example1.json") + rir = { + **self._RIR_GABLE_NONE, + "gables": [{"length_m": 4.76, "height_m": 2.32, "gable_type": "Mystery"}], + } + data["roof_space"]["main_building"]["rooms_in_roof"] = True + data["roof_space"]["main_building"]["room_in_roof"] = rir + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act / Assert + with pytest.raises(UnmappedPasHubLabel, match="Mystery"): + EpcPropertyDataMapper.from_site_notes(survey) + + +class TestPasHubSecondaryClosedRoomHeater: + """The secondary-heating label "Closed room heater" must map to SAP 10.2 + Table 4a code 633 (solid-fuel closed room heater). An uncovered label + strict-raises and blocks the fixture (500796700868 8 Brinkshaw Avenue; + #1649 C). 633 is already in `_ELMHURST_SECONDARY_SOLID_CODES {631..636}`, + so downstream fuel/category resolution already covers it. + """ + + def test_closed_room_heater_maps_to_633(self) -> None: + # Arrange + data = load("pashub_rdsap_site_notes_example1.json") + data["heating_and_hot_water"]["secondary_heating"][ + "secondary_system" + ] = "Closed room heater" + data["heating_and_hot_water"]["secondary_heating"]["secondary_fuel"] = ( + "Dual Fuel Appliance (Mineral and Wood)" + ) + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act — must not raise + result = EpcPropertyDataMapper.from_site_notes(survey) + + # Assert + assert result.sap_heating.secondary_heating_type == 633 + + +class TestPasHubManualBoilerEfficiency: + """A Manual-Entry boiler (no PCDB `product_id`) must resolve its surveyed + descriptor to a SAP 10.2 Table 4b code so the calculator bills the Table 4b + seasonal efficiency, not the generic 0.80 "no data" gas default. Left None, + a back boiler (Table 4b 66%) is credited 80% (500796377318 4a Hollyhedge: + DB 53, ours 63.6 → 53.4) and a condensing combi's water-heating summer + efficiency (75%) is over-credited (the 84 Button / 91 Alderue / 17 Kennett + / 43 Kenninghall / 156 Gladeside over-raters). #1649 A. + + A PCDF-Search boiler keeps `None` (its efficiency is the SEDBUK product + lookup); a non-Table-4b descriptor (e.g. electric) also keeps `None` + (unchanged behaviour — no regression). + """ + + @staticmethod + def _manual_boiler(data: Dict[str, Any], *, boiler_type: str, age_band: str) -> Any: + mh = data["heating_and_hot_water"]["main_heating"] + mh["selection_method"] = "Manual Entry" + mh["system_type"] = "Boiler with radiators or underfloor heating" + mh["product_id"] = 0 + mh["fuel"] = "Mains Gas" + mh["boiler_type"] = boiler_type + mh["boiler_age_band"] = age_band + return from_dict(PasHubRdSapSiteNotes, data) + + def test_manual_back_boiler_post_1998_maps_to_109(self) -> None: + survey = self._manual_boiler( + load("pashub_rdsap_site_notes_example1.json"), + boiler_type="Back boiler", + age_band="1998 or later - Back boiler", + ) + main = EpcPropertyDataMapper.from_site_notes( + survey + ).sap_heating.main_heating_details[0] + assert main.sap_main_heating_code == 109 + + def test_manual_condensing_combi_maps_to_104(self) -> None: + survey = self._manual_boiler( + load("pashub_rdsap_site_notes_example1.json"), + boiler_type="Condensing combi", + age_band="1998 or later - Condensing combi", + ) + main = EpcPropertyDataMapper.from_site_notes( + survey + ).sap_heating.main_heating_details[0] + assert main.sap_main_heating_code == 104 + + def test_pcdf_boiler_keeps_none(self) -> None: + # example1 as lodged is a PCDF-Search boiler (product_id 18400): its + # efficiency is the SEDBUK lookup, so the Table 4a code stays None. + survey = from_dict( + PasHubRdSapSiteNotes, load("pashub_rdsap_site_notes_example1.json") + ) + main = EpcPropertyDataMapper.from_site_notes( + survey + ).sap_heating.main_heating_details[0] + assert main.sap_main_heating_code is None + + def test_manual_boiler_unmapped_descriptor_keeps_none(self) -> None: + # An electric "Direct acting" descriptor is not a Table 4b gas/liquid + # boiler — keep None (unchanged 0.80 behaviour, no regression / no block). + survey = self._manual_boiler( + load("pashub_rdsap_site_notes_example1.json"), + boiler_type="Standard", + age_band="Direct acting", + ) + main = EpcPropertyDataMapper.from_site_notes( + survey + ).sap_heating.main_heating_details[0] + assert main.sap_main_heating_code is None + + +class TestPasHubAlternativeWallInsulationThickness: + """A surveyed alternative-wall "Wall insulation thickness:" must reach + `SapAlternativeWall.wall_insulation_thickness`; dropped, the cascade takes + the RdSAP 10 §5.4 "assume 100 mm if unknown" favourable default instead of + the surveyed value (#1649 D). Mirrors the gov-API / Elmhurst paths. + """ + + def test_alt_wall_insulation_thickness_reaches_sap_alt_wall(self) -> None: + # Arrange — a main-building alt wall lodging a 50 mm insulation thickness. + data = load("pashub_rdsap_site_notes_example1.json") + data["alternative_walls"] = [ + { + "location": "Main Building", + "id": 1, + "construction_type": "Solid brick", + "insulation_type": "External", + "area_m2": 13.71, + "wall_u_value_known": False, + "thermal_conductivity_of_wall_insulation": "Unknown", + "wall_thickness_mm": 250, + "dry_lined": False, + "insulation_thickness_mm": 50, + } + ] + survey = from_dict(PasHubRdSapSiteNotes, data) + + # Act + result = EpcPropertyDataMapper.from_site_notes(survey) + + # Assert — the surveyed 50 mm reaches the SAP alt wall (string wiring, + # like the main wall) instead of the §5.4 100 mm favourable default. + alt = result.sap_building_parts[0].sap_alternative_wall_1 + assert alt is not None + assert alt.wall_insulation_thickness == "50" diff --git a/datatypes/epc/surveys/pashub_rdsap_site_notes.py b/datatypes/epc/surveys/pashub_rdsap_site_notes.py index 6b8c77de2..988ef01ad 100644 --- a/datatypes/epc/surveys/pashub_rdsap_site_notes.py +++ b/datatypes/epc/surveys/pashub_rdsap_site_notes.py @@ -224,10 +224,24 @@ class MainHeating: weather_compensator: bool emitter: str emitter_temperature: str - # §Heating "Heating System (Other)" — the community heat-source label - # (e.g. "Community heating - boilers only") lodged only by heat-network - # dwellings; blank elsewhere. + # §Heating "Heating System (Other)" — the generic RdSAP "system from Table + # 4a" lodging, NOT heat-network only. Heat networks lodge the community + # heat-source label here (e.g. "Community heating - boilers only"); Manual + # Entry storage/room heaters lodge their heater type ("Fan storage heater", + # "Modern slimline storage heater", "Panel, Convector or radiant heaters", + # "Water or oil-filled radiators"); blank when the type is fixed elsewhere + # (a PCDF-Search product, or a boiler). See #1619. community_heat_source: str = "" + # Manual-Entry (non-PCDF) boiler descriptor. A boiler selected by "Manual + # Entry" (product_id 0) carries no SEDBUK record, so its efficiency must + # come from SAP 10.2 Table 4b keyed on these two surveyed labels rather than + # the generic 0.80 gas default (#1649 A). `boiler_type` is the §Heating + # "Type of boiler:" cell (e.g. "Condensing combi" / "Back boiler"), + # `boiler_age_band` the "Heating System (Boiler):" cell, which carries the + # pre/post-1998 age band (e.g. "1998 or later - Condensing combi"). Blank on + # a PCDF-Search boiler (efficiency is the product lookup). + boiler_type: str = "" + boiler_age_band: str = "" @dataclass @@ -317,6 +331,7 @@ class RoomCountElements: number_of_fixed_cfl_bulbs: int waste_water_heat_recovery: str number_of_heated_rooms: Optional[int] = None + number_of_fixed_low_energy_lights: Optional[int] = None @dataclass @@ -364,6 +379,10 @@ class AlternativeWall: thermal_conductivity_of_wall_insulation: str wall_thickness_mm: Optional[int] = None dry_lined: Optional[bool] = None + # Surveyed "Wall insulation thickness:" (mm) for the alternative wall. + # Dropped, the cascade takes the RdSAP 10 §5.4 "assume 100 mm if unknown" + # favourable default instead of the lodged value (#1649 D). + insulation_thickness_mm: Optional[int] = None def _no_alternative_walls() -> List[AlternativeWall]: diff --git a/deployment/terraform/lambda/abri_api/main.tf b/deployment/terraform/lambda/abri_api/main.tf index a7bb1d6cf..52ed94753 100644 --- a/deployment/terraform/lambda/abri_api/main.tf +++ b/deployment/terraform/lambda/abri_api/main.tf @@ -24,10 +24,9 @@ module "lambda" { # Abri relay credentials are per-stage: the dev/staging stage points at # Abri's UAT relay endpoint; production values are pending from Abri. - ABRI_RELAY_URL = var.abri_relay_url - ABRI_RELAY_USERNAME = var.abri_relay_username - ABRI_RELAY_PASSWORD = var.abri_relay_password - ABRI_RELAY_DEFAULT_RESOURCE = var.abri_relay_default_resource + ABRI_RELAY_URL = var.abri_relay_url + ABRI_RELAY_USERNAME = var.abri_relay_username + ABRI_RELAY_PASSWORD = var.abri_relay_password HUBSPOT_API_KEY = var.hubspot_api_key diff --git a/deployment/terraform/lambda/abri_api/variables.tf b/deployment/terraform/lambda/abri_api/variables.tf index e431db62b..98d7c56c6 100644 --- a/deployment/terraform/lambda/abri_api/variables.tf +++ b/deployment/terraform/lambda/abri_api/variables.tf @@ -58,11 +58,6 @@ variable "abri_relay_password" { sensitive = true } -variable "abri_relay_default_resource" { - type = string - sensitive = true -} - variable "hubspot_api_key" { type = string sensitive = true diff --git a/docs/abri-hubspot-ops-guide.md b/docs/abri-hubspot-ops-guide.md new file mode 100644 index 000000000..d307854fb --- /dev/null +++ b/docs/abri-hubspot-ops-guide.md @@ -0,0 +1,91 @@ +# Abri bookings: what your HubSpot changes do + +**Who this is for:** operations staff who work Abri deals in HubSpot — booking surveys, +recording visit outcomes, updating deal fields. + +**The one-line version:** for deals on the Abri Stock Condition project, certain HubSpot +field changes are picked up automatically and sent to Abri's scheduling system +(OpenHousing). You never talk to OpenHousing directly — the deal fields are the controls. + +--- + +## Which deals does this apply to? + +Only deals associated with the **Abri Stock Condition — Privately Funded** project. +Changes to any other deal are ignored by this integration. + +## How fast does it happen? + +Changes are picked up automatically shortly after you save them in HubSpot — usually +within a few minutes. Nothing fires while you are mid-edit; it's the saved change that +counts. + +--- + +## What your changes do in Abri's system + +| When you… | Abri's system… | How you know it worked | +|---|---|---| +| Set **Expected commencement date** for the first time | Sends us the tenancy details for the property | Tenant contact records appear in HubSpot, linked to the deal | +| Set **Confirmed survey date** for the first time | Creates the survey booking (a "job") against the property, assigned to the surveyor on the deal | Abri's job number appears in **Client booking reference** on the deal | +| Change **Confirmed survey date**, **Confirmed survey time** or **Third-party surveyor identifier** on a deal that already has a booking | Updates the existing appointment — new date/time and/or reassigns it to the new surveyor | The deal keeps the same Client booking reference | +| Record a **3rd attempt** (Number of attempts reaches 3) **and** set **Outcome** to an unsuccessful value (see below) | Cancels the booking as abandoned | — (this only fires once per deal) | + +**Unsuccessful outcomes** that count towards abandonment — the wording must match exactly: + +- `no answer` +- `cancelled / no show` +- `tenant refusal` +- `not viable` + +Any other outcome (or fewer than 3 attempts) does **not** cancel anything in Abri's +system. + +## The fields, and why they matter + +| HubSpot deal field | What it feeds | +|---|---| +| **Expected commencement date** | Setting it the first time triggers the tenant-details fetch | +| **Confirmed survey date** | The appointment date sent to Abri | +| **Confirmed survey time** | The appointment slot: `morning` → AM, `afternoon` → PM, a clock time like `09:30` → AM/PM by whether it's before midday, left blank → all day | +| **Third-party surveyor identifier** | Which surveyor the booking is assigned to in Abri's system. **Required** — a booking or appointment change cannot be sent without it, and it must be one of Abri's valid surveyor codes. Changing it on a deal that already has a booking reassigns that booking to the new surveyor | +| **Number of attempts** + **Outcome** | Together they trigger abandonment (3+ attempts and an unsuccessful outcome) | +| **Client booking reference** | Abri's job number, written back **by the system** after the booking is created | +| **Deal name** | Used as the job description Abri's staff see | + +--- + +## Things that will catch you out + +### Clearing the survey date does NOT cancel the booking + +If you delete or blank the confirmed survey date, the booking **still exists in Abri's +system** and the surveyor is still expected. There is currently no way to cancel a +booking from HubSpot other than the 3-attempts abandonment route. If a booking needs +cancelling for any other reason, contact the tech team. + +### Don't edit Client booking reference + +It is written automatically with Abri's job number and is how the system finds the +booking when you later change or abandon it. If you overwrite or clear it, appointment +changes and abandonments will stop working for that deal. + +### The surveyor identifier (Third-Party Surveyor Identifier) must be a valid Abri code + +Free-typed or misspelt values will be rejected by Abri's system and the booking won't be +made. The tech team holds the current list of valid surveyor codes from Abri — use a +value from that list. Soon this field will be set automatically from the deal +owner. + +### Outcome wording is exact + +Abandonment only recognises the four unsuccessful outcomes listed above, spelled exactly +that way. A variation like "No Answer - left card" won't trigger it. + +### If the job number never appears + +The booking didn't go through — most often because the surveyor identifier was missing +or invalid, or the deal isn't on the Abri project. Failures land with the tech team, not +in HubSpot, so you won't see an error message. If **Client booking reference** is still +empty well after you set the survey date, flag it to the tech team rather than re-editing +fields. diff --git a/docs/adr/0064-band-membership-is-judged-on-the-published-rating.md b/docs/adr/0064-band-membership-is-judged-on-the-published-rating.md new file mode 100644 index 000000000..0615c76c7 --- /dev/null +++ b/docs/adr/0064-band-membership-is-judged-on-the-published-rating.md @@ -0,0 +1,70 @@ +--- +status: accepted (extends ADR-0016; constrains ADR-0062's Increasing EPC path) +--- + +# Band membership is judged on the published rating, not on a raw continuous score + +A dwelling is in an EPC band by the **integer rating printed on its +certificate** — the continuous SAP rounded to the nearest whole point. The +Optimiser, however, works in continuous SAP, and judged "has this dwelling +reached band X?" by comparing that continuous score against the band's +**integer** floor (`Epc.sap_lower_bound()`, band C → `69.0`). + +Those two rules disagree in the half-point window below every band floor. A +dwelling at a continuous 68.6 publishes as SAP 69 and **is** band C, but read as +0.4 short of an integer floor of 69 — so the Optimiser bought the cheapest +measure available to close a gap that did not exist. In portfolio 796 / scenario +1268 ("Reach EPC C") this sold **630 homes already published at band C** about +one SAP point of works each, £282k in total; portfolio 824 / scenario 1278 added +172 more at £56k. The measures were real and were installed against real +budgets; the gap they closed was an artefact of comparing two different scales. + +A second, smaller disagreement sat underneath it: `sap_rating_integer` published +the rating using Python's built-in `round`, which is half-to-**even**, so an +exact `x.5` fell to `x` for even `x` — at a band floor, publishing a whole band +low. SAP rounds half **up**, the convention the mapper already followed +(`_round_half_up_2dp`). + +Found and fixed while working #1652 / #1654 with Khalim, 2026-07-21. + +## Decision + +**One rule decides band membership everywhere: round the continuous SAP half up, +then band the integer. Anything comparing a continuous score to a band judges it +on that basis.** + +- **`sap_rating_integer` rounds half up** (`Decimal` + `ROUND_HALF_UP`), matching + SAP 10.2 §13 and the mapper's existing convention. A continuous 68.5 publishes + as SAP 69. +- **`Epc.sap_lower_bound_continuous()`** is the band floor expressed on the + continuous scale — the integer floor less half a point (C → 68.5), i.e. the + lowest un-rounded score whose *published* rating is in the band. +- **`_target_sap` returns the continuous floor.** The Optimiser's target must be + in the currency of everything it is compared against. This single change fixes + all four comparison sites (`target_gain`, the two reached-target checks, and + `_repair_to_target`'s loop) without touching optimiser control flow. +- **`Epc.from_sap_continuous()`** bands a continuous score as it would be + published, replacing the repeated `from_sap_score(round(x))` idiom at every + call site (`Plan.post_epc_rating`, `Plan.baseline_epc_rating`, the plan table + harness, the anomaly auditor). +- Scoped to the **SAP-goal path only**: goal-aligned CO2 / bill objectives pass + `target_sap=None` (ADR-0062) and are untouched. + +## Consequences + +- A dwelling whose **published** baseline already meets the goal band gets a + **£0, measure-free** plan. Dwellings genuinely below the band still get plans + that reach it — the target moved by half a point, not the ambition. +- Re-modelling 796/1268 should drop ~630 plans and £282,763 of `cost_of_works` + (642 measures), and 824/1278 ~172 plans and £56,226 (176 measures). Both are + unbudgeted, so no budget interaction confounds the change. The remaining spend + is an upper bound: a lower target may also let genuinely-below dwellings stop + one measure earlier. +- Half-up publishing can move a rating by one point only when the continuous + score is *exactly* `x.5`. No fixture in the accuracy corpus is, and the full + SAP suite (2,072 tests, including the Elmhurst worksheet pins) passed + unchanged — but the corpus should be re-checked if the calculator's arithmetic + ever shifts onto exact halves. +- `already-meets-goal-with-works` moves MEDIUM → HIGH in the anomaly auditor. + It was firing correctly all along and was bucketed as expected stale-plan + noise, which is how this survived: a check nobody believes is not a check. diff --git a/docs/adr/0066-modelling-asserts-baseline-coherence-rather-than-anchoring.md b/docs/adr/0066-modelling-asserts-baseline-coherence-rather-than-anchoring.md new file mode 100644 index 000000000..21f3f25a6 --- /dev/null +++ b/docs/adr/0066-modelling-asserts-baseline-coherence-rather-than-anchoring.md @@ -0,0 +1,76 @@ +--- +status: accepted (extends ADR-0002, ADR-0004; composes with ADR-0011) +--- + +# Modelling asserts baseline coherence rather than anchoring to the persisted Effective + +The Baseline stage persists **Effective Performance** — what the app reports as a +Property's current state, and what a Plan's `post_*` figures are read against +(ADR-0002 / ADR-0004). The Modelling stage does not read that row: it re-scores +the Effective EPC itself, because it needs a continuous score and a `SapResult` +to price bills from (ADR-0011 forbids an in-memory hand-off between stages). + +Both stages hydrate the same aggregate through the same repo and call the same +calculator, so they normally agree — measured across portfolios 796 and 824, +mean divergence is **0.008 SAP** over 25,838 measure-free plans. But nothing +*enforces* that, and when they drift the failure is silent and user-visible: the +app subtracts one stage's baseline from the other's post score and reports a gain +nobody modelled. Property 749719 displayed **"+9.65 SAP"** on a plan whose own +CO2, bill and consumption savings were all exactly `0.0` — the plan was empty and +correct; the +9.65 was `post_sap` (72.65, modelling's baseline) minus +`effective_sap` (63, the Baseline stage's). Two baselines, subtracted. + +#1655 originally proposed **anchoring**: read the persisted Effective and use its +`effective_sap_score` as the Optimiser's baseline. We rejected that. + +Decided with Khalim, 2026-07-21, while working #1652 / #1655. + +## Decision + +**Modelling keeps its own re-score, and checks it against the persisted Effective +Performance. A divergence beyond rounding is logged as an error; it is never +silently reconciled.** + +- **`_check_baseline_coherence(property_id, modelled_baseline_sap, persisted)`** + runs once per Property, off the Plan's already-computed `baseline` Score — the + baseline picture is scenario-independent, and re-scoring a dwelling per + Property purely to check it would not pay for itself across a 31k batch. +- **Tolerance is 1.0 SAP.** The persisted figure is the *rounded* integer, so up + to half a point is rounding alone (ADR-0064); firing at 0.5 would be noise. +- **A missing baseline row warns and continues**, modelling against the + re-score. A data gap should degrade one Property, not abort a portfolio; + ADR-0012 reserves the abort for a load-bearing calculator raise. + +### Why not anchor + +- **It would break a different coherence to fix this one.** A `Score` carries + CO2 and primary energy beside SAP, and Bills are derived from the same + `SapResult`. Overwriting only the SAP with the persisted integer leaves a Plan + whose SAP disagrees with its own carbon, energy and bill figures. +- **It hides the defect instead of surfacing it.** A divergence means the two + stages scored different pictures — a real fault upstream. Anchoring makes the + numbers *agree* without making them *right*, and removes the evidence. +- **The figure being anchored to may itself be wrong.** #1656 documents SAP 10.2 + certs where the persisted Effective sits 6–10 points below the accredited + lodged rating. Hard-wiring Modelling to that number would propagate a known + error into every Plan's `post_*`. + +## Consequences + +- Plan `post_*` figures are unchanged. This adds a signal, not an arithmetic + change — no re-modelled figure moves because of this ADR. +- A future drift surfaces as an error naming the Property and both figures, + instead of as a phantom gain in a board pack. +- The guarantee is **detection, not prevention**: a divergent Property still + gets a Plan, and the app will still show the mismatched gain until the + underlying cause is fixed. Making it fatal is a live option if the error + proves rare enough in practice. +- Paired with a HIGH `costed-plan-without-real-gain` anomaly check, closing the + auditor's coverage hole: `plan-score-below-baseline` fired only on a *drop* + beyond 0.5 and `zero-works-post-differs` only on £0 plans, so a **costed** plan + landing flat against its baseline — the 112 "no real improvement" homes in 796 + — was caught by neither. +- The divergence this was built for was **not reproducible at the time of + writing**: the properties that showed it now agree with the persisted baseline, + most likely resolved by intervening calculator fixes. This is a guard against + recurrence, not a fix for live breakage. diff --git a/docs/migrations/epc-building-part-fabric-overrides.md b/docs/migrations/epc-building-part-fabric-overrides.md new file mode 100644 index 000000000..805265f90 --- /dev/null +++ b/docs/migrations/epc-building-part-fabric-overrides.md @@ -0,0 +1,133 @@ +# Migration note — `epc_building_part` RdSAP construction inputs + +**For the team to action alongside the model-side change (Hestia-Homes/Model#1656).** +The Python side is done and tested against the SQLModel-built test DB; the +**production Drizzle schema needs one matching column** that this repo does not +own. + +## The bug this closes + +`SapBuildingPart.rafter_insulation_thickness` is read by the SAP calculator +(`heat_transmission.py:922`) but had no DB column, so it was mapped correctly +from the gov-EPC API and then **silently discarded on save** (*persist != score*). + +RdSAP 10 §5.11.2: a roof insulated **at rafters** lodges its insulation thickness +in this dedicated field, **not** in `roof_insulation_thickness` (which stays null +for rafter roofs, since rafters aren't loft joists). With the thickness the roof +bills on the **measured** Table 16 column (2) row; without it, it falls back to +the Table 18 column (2) unknown-thickness age-band default — `2.30` for bands +A–D, i.e. the spec's *uninsulated* value. + +**Measured impact.** Property 749719 (portfolio 824, End-terrace bungalow, band +D, RdSAP SAP 10.2, inspected 2026-01-20) lodges `"250mm"` → Table 16 col (2) +U **0.23**. Dropped, the roof bills at U **2.30** — a 10x error: + +| quantity | lodged | dropped | with the field | +|---|---:|---:|---:| +| SAP | 73 (band C) | 63.22 (band D) | 72.65 | +| primary energy kWh/m²/yr | 212 | 327.9 | 212.3 | +| CO2 t/yr | 1.5 | 2.40 | 1.54 | + +Confirmed on a second property, 750189 (lodged 74 → 68.08 dropped, 74.11 with +250 mm). Across portfolios 796 + 824, **0 of 1,449 certs that score within ±0.5 +of lodged carry `roof_insulation_location == 1`** — the at-rafters path never +passes today. The defect is real but **narrow**: 4 properties in those two +portfolios, and the field is populated on 17 of 1,000 (1.7%) certs in the +committed RdSAP-21.0.1 corpus. + +Secondary harm: 749719 draws a **loft-insulation recommendation worth 9.63 SAP** +on a roof an accredited assessor rated 4/5. + +## Required Drizzle migration — `epc_building_part` + +Additive, nullable, **no backfill possible** (the value was never stored): + +| Column | Type | Null | Notes | +|---|---|---|---| +| `rafter_insulation_thickness` | `jsonb` | yes | `Union[str, int]` — `"250mm"` from the API, int mm from Site Notes. **JSONB**, matching the existing `roof_insulation_thickness` / `flat_roof_insulation_thickness` / `wall_insulation_thickness` columns, so `int` vs `str` survives the round-trip. | +| `wall_is_basement` | `boolean` | **yes — load-bearing** | Must be nullable, **not** `NOT NULL DEFAULT false`. `null` = "not stated, fall back to the gov-API code-6 heuristic"; `false` = "explicitly system-built, do NOT apply the heuristic". Collapsing `false` to `null` inverts the result. | + +Generate with `npm run migration:generate`; run it **before** deploying the +backend code. + +## Backfill / re-ingest + +The column never existed, so **existing rows have nothing to restore**. Every +affected property must be **re-ingested from the gov-EPC API** before its score +moves; the migration alone changes no existing baseline. Re-run **Baseline +(stage 2) before Modelling (stage 3)** so both stages score on one calculator +version. + +## The second column — `wall_is_basement` + +RdSAP 10 §5.17 / Table 23. It is **not** a lodged U-value: it is a +disambiguation flag selecting *which* RdSAP default applies, so it belongs with +`rafter_insulation_thickness`, not with the U-values below. + +RdSAP code 6 is canonically **system-built**, and the gov-API path infers +"basement" from a code-6 heuristic. The Elmhurst site-notes mapper sets +`wall_is_basement=False` precisely to defeat that heuristic. Dropping the field +does not merely lose data — it **inverts** the answer: + +``` +wall_construction = 6 (system-built) + Elmhurst sets wall_is_basement=False -> main_wall_is_basement = False + after DB round-trip (dropped -> None) -> main_wall_is_basement = True <- flipped +``` + +A system-built wall then bills as a basement wall, and via `has_basement` drags +the whole ground floor onto the Table 23 basement-floor U-value. + +The field is declared on **no** RdSAP schema, so it never arrives via the gov +API — but the Elmhurst site-notes path sets it, and site-notes EPCs **are** +persisted (`scripts/wchg_elmhurst_ingest.py`). A corpus scan of gov-API certs +shows 0 occurrences and is therefore the wrong population to measure it on. + +Rare but real: `main_wall_is_basement` is documented at 54 of 67k parts in the +2026 sweep. + +## Deliberately NOT persisted + +The same audit found three sibling `SapBuildingPart` fields with the same drop — +`wall_u_value`, `roof_u_value`, `floor_u_value`. They are +**intentionally left unpersisted**: they are full-SAP artefacts, and we re-model +every dwelling *as* an RdSAP assessment, which derives U-values from the +construction-default cascade (RdSAP 10 §5.6/§5.7/§5.11) rather than honouring an +assessor's measured value. Carrying them would make the re-model a hybrid. + +Population on the committed RdSAP-21.0.1 corpus (1,000 certs) confirms it: +`roof_u_value` **0**, `floor_u_value` **0**, `wall_u_value` **4 (0.4%)**. + +They stay on the `_UNPERSISTED_ALLOWLIST` in +`tests/repositories/epc/test_epc_persistence_field_coverage.py`, but with a +**corrected** justification — see below. + +## Why the structural guard missed it + +The ADR-0036 guard exists precisely to catch this class of silent drop. All five +fields were allow-listed with the justification **"dormant — not read by the +calculator; no FE column"**. That was true when written; it expired silently when +the §5.1 / §5.11.2 override code landed in `heat_transmission.py`, and nothing +re-checked the premise. A stale allow-list entry is worse than no entry, because +it reads as a deliberate, reviewed decision. + +The four remaining entries now say *"deliberate — full-SAP only; RdSAP re-model +uses default U-values (#1656)"*, which is both true and the actual reason. + +**Worth considering:** make the justification machine-checkable — fail the guard +if a field claiming "not read by the calculator" appears in an attribute read +under `domain/sap10_calculator/`. + +## Model-side change (already done) + +- `infrastructure/postgres/epc_property_table.py` — `EpcBuildingPartModel` gains + `rafter_insulation_thickness`; `from_domain` writes it. +- `repositories/epc/epc_postgres_repository.py` — `_to_building_part` + reconstructs it. +- `tests/repositories/epc/test_epc_round_trip.py` — + `test_rafter_insulation_thickness_round_trips` pins it deep-equal; + `test_wall_is_basement_round_trips` pins the code-6 inversion case. +- `tests/repositories/epc/test_epc_persistence_field_coverage.py` — the three + U-value entries re-justified; the `rafter_insulation_thickness` and + `wall_is_basement` entries removed so the guard now *enforces* their + reconstruction. diff --git a/docs/migrations/epc-property-round-trip-fidelity.md b/docs/migrations/epc-property-round-trip-fidelity.md index ce7684f0c..82e751746 100644 --- a/docs/migrations/epc-property-round-trip-fidelity.md +++ b/docs/migrations/epc-property-round-trip-fidelity.md @@ -105,11 +105,19 @@ guard now *enforces* their reconstruction. | `cylinder_volume_measured_l` | `SapHeating` | `epc_property.heating_cylinder_volume_measured_l` | | `air_permeability_ap50_m3_h_m2` | `SapVentilation` | `epc_property.ventilation_air_permeability_ap50_m3_h_m2` | -(Still allow-listed as dormant — not calculator-read, no column: `SapBuildingPart.{floor_u_value, -roof_u_value, wall_u_value, wall_is_basement, rafter_insulation_thickness}`, +(Still allow-listed as dormant — not calculator-read, no column: `SapAlternativeWall.is_basement`, `SapHeating.cylinder_heat_loss`. And `SapAlternativeWall.{u_value, wall_thickness_mm}` remain FE-column-pending.) +> **Superseded (#1656).** `SapBuildingPart.{floor_u_value, roof_u_value, wall_u_value, +> wall_is_basement, rafter_insulation_thickness}` were previously allow-listed here as +> "dormant — not calculator-read". **That justification was false**: all five are read by +> `heat_transmission.py` as authoritative overrides of the U-value cascade (§5.1 lodged +> U-values, §5.11.2 at-rafters thickness, §5.17 basement wall). Dropping them cost +> **−9.8 SAP** on property 749719 (a whole band, C → D). They are now persisted and their +> allow-list entries removed — see +> [`epc-building-part-fabric-overrides.md`](epc-building-part-fabric-overrides.md). + --- ## 1. Type fidelity — convert `Union[int, str]` code columns to JSONB diff --git a/domain/abri/models.py b/domain/abri/models.py index df726608b..f60729382 100644 --- a/domain/abri/models.py +++ b/domain/abri/models.py @@ -44,6 +44,7 @@ class LogJobRequest: appointment_time: SlotCode short_description: str long_description: str + resource: str @dataclass(frozen=True) @@ -67,7 +68,7 @@ class AmendJobRequest: job_no: str appointment_date: date appointment_time: SlotCode - resource: Optional[str] = None + resource: str @dataclass(frozen=True) diff --git a/domain/modelling/plan.py b/domain/modelling/plan.py index 9e8349e9d..bd14da3af 100644 --- a/domain/modelling/plan.py +++ b/domain/modelling/plan.py @@ -91,13 +91,13 @@ class Plan: @property def post_epc_rating(self) -> Epc: - """The post-retrofit EPC band, from the rounded SAP rating.""" - return Epc.from_sap_score(round(self.post_retrofit.sap_continuous)) + """The post-retrofit EPC band, as it would be published.""" + return Epc.from_sap_continuous(self.post_retrofit.sap_continuous) @property def baseline_epc_rating(self) -> Epc: - """The baseline EPC band, from the rounded baseline SAP rating.""" - return Epc.from_sap_score(round(self.baseline.sap_continuous)) + """The baseline EPC band, as it would be published.""" + return Epc.from_sap_continuous(self.baseline.sap_continuous) @property def valuation(self) -> ValuationUplift: diff --git a/domain/sap10_calculator/rdsap/cert_to_inputs.py b/domain/sap10_calculator/rdsap/cert_to_inputs.py index 1fc568e03..ecb72917c 100644 --- a/domain/sap10_calculator/rdsap/cert_to_inputs.py +++ b/domain/sap10_calculator/rdsap/cert_to_inputs.py @@ -7698,9 +7698,16 @@ def _fuel_cost( if main_2_fuel_code is not None else main_1_high_rate_gbp_per_kwh ) + # When DHW is supplied by a community heat network (WHC 901/902/914 on a + # heat-network main), the network heat — space AND water — bills at the + # main's Table-12 heat-network rate, NOT the cert-lodged HW fuel (which + # Elmhurst defaults to "Mains gas"). Mirror the .173 inherit already applied + # on the legacy/off-peak HW-rate paths (`_hot_water_fuel_cost_gbp_per_kwh`) + # into this §10a STANDARD-tariff path, which is the one that drives (255)/SAP. water_high_rate_gbp_per_kwh = ( - table_32_unit_price_p_per_kwh(water_heating_fuel_code) - * _PENCE_TO_GBP + _fuel_cost_gbp_per_kwh(main, prices) + if _is_community_heating_hw_from_main(epc) + else table_32_unit_price_p_per_kwh(water_heating_fuel_code) * _PENCE_TO_GBP ) # Secondary fuel cost: route through the cert's `secondary_fuel_type` # when lodged (e.g. mains-gas fire SAP code 605 → fuel 26 → Table 32 @@ -7910,7 +7917,26 @@ def cert_to_inputs( if water_main is not None and water_main.main_heating_index_number is not None else None ) - if water_pcdb_main is not None and water_pcdb_main.summer_efficiency_pct is not None: + # DHW from a SEPARATE electric immersion heater (WHC 903) is not served by + # any boiler — SAP 10.2 Table 4a lists the immersion at 100% efficiency and + # SAP §9.4.11 / Appendix D2.1 Eq D1 (the boiler seasonal-efficiency cascade) + # applies only when "the boiler provides both space and water heating". But + # `_water_heating_main` resolves to the SPACE main (a gas/oil combi still has + # a PCDB record), so without this gate both the scalar `water_eff` and the + # Eq-D1 pair below would bill electric-immersion DHW at the boiler's ~87% + # summer efficiency instead of 100% (mongrel: electric fuel price × gas-boiler + # efficiency). Fires for #1600's no-water-heating default (WHC 999 → 903) with + # a gas-boiler main; the immersion path (`_water_efficiency_with_category_ + # inherit` → 1.0) is the correct fallback, mirroring the Table 3 zero-primary- + # loss gate already applied for WHC 903. + dhw_is_electric_immersion = ( + epc.sap_heating.water_heating_code == _WHC_ELECTRIC_IMMERSION + ) + if ( + water_pcdb_main is not None + and water_pcdb_main.summer_efficiency_pct is not None + and not dhw_is_electric_immersion + ): water_eff = water_pcdb_main.summer_efficiency_pct / 100.0 else: water_eff = _water_efficiency_with_category_inherit( @@ -7972,6 +7998,10 @@ def cert_to_inputs( no_interlock and water_pcdb_main is not None and epc.has_hot_water_cylinder + # Not for a separate electric immersion (WHC 903): the -5pp boiler + # interlock adjustment has no meaning for a 100%-efficient immersion + # element (see the electric-immersion note above). + and not dhw_is_electric_immersion ): water_eff -= 0.05 # Resolve the (winter, summer) seasonal efficiency pair that feeds @@ -7993,6 +8023,10 @@ def cert_to_inputs( pcdb_main is not None and pcdb_main.winter_efficiency_pct is not None and pcdb_main.summer_efficiency_pct is not None + # Not when DHW is a separate electric immersion (WHC 903): the boiler + # does not provide water heating, so Eq D1 must not apply its seasonal + # efficiency to the immersion-heated cylinder (see the note above). + and not dhw_is_electric_immersion ): eq_d1_winter_summer_pct = ( pcdb_main.winter_efficiency_pct, diff --git a/domain/sap10_calculator/worksheet/rating.py b/domain/sap10_calculator/worksheet/rating.py index ca132479a..6ed2e73fd 100644 --- a/domain/sap10_calculator/worksheet/rating.py +++ b/domain/sap10_calculator/worksheet/rating.py @@ -20,6 +20,7 @@ Table 12 (page 191). from __future__ import annotations +from decimal import ROUND_HALF_UP, Decimal from math import log10 from typing import Final @@ -59,8 +60,14 @@ def sap_rating_integer(*, ecf: float) -> int: """SAP 10.2 §13: round the continuous SAP rating to the nearest integer and clamp to a minimum of 1 ("if the result of the calculation is less than 1 the rating should be quoted as 1"). The integer value is the - one published on the EPC.""" - return max(1, round(sap_rating(ecf=ecf))) + one published on the EPC. + + "Nearest" is half-UP, as everywhere else the spec rounds (see the mapper's + `_round_half_up_2dp`). Python's built-in `round` is half-to-EVEN and would + drop an exact x.5 to x for even x — at a band floor that publishes a whole + band low (a continuous 68.5 as SAP 68 / band D rather than 69 / band C).""" + rating: Decimal = Decimal(sap_rating(ecf=ecf)) + return max(1, int(rating.quantize(Decimal("1"), rounding=ROUND_HALF_UP))) def environmental_impact_rating( diff --git a/etl/hubspot/hubspotClient.py b/etl/hubspot/hubspotClient.py index c886eb1c2..7a97ddce0 100644 --- a/etl/hubspot/hubspotClient.py +++ b/etl/hubspot/hubspotClient.py @@ -291,6 +291,7 @@ class HubspotClient: "lodgement_date", "expected_commencement_date", "surveyor", + "third_party_surveyor_identifier", "confirmed_survey_date", "confirmed_survey_time", "client_booking_reference", diff --git a/etl/hubspot/hubspotDataTodB.py b/etl/hubspot/hubspotDataTodB.py index 68f84477e..d80019b74 100644 --- a/etl/hubspot/hubspotDataTodB.py +++ b/etl/hubspot/hubspotDataTodB.py @@ -270,6 +270,9 @@ class HubspotDataToDb: deal_data.get("expected_commencement_date") ), "surveyor": deal_data.get("surveyor"), + "third_party_surveyor_identifier": deal_data.get( + "third_party_surveyor_identifier" + ), "confirmed_survey_date": parse_hs_date( deal_data.get("confirmed_survey_date") ), @@ -391,6 +394,9 @@ class HubspotDataToDb: deal_data.get("expected_commencement_date") ), surveyor=deal_data.get("surveyor"), + third_party_surveyor_identifier=deal_data.get( + "third_party_surveyor_identifier" + ), confirmed_survey_date=parse_hs_date(deal_data.get("confirmed_survey_date")), confirmed_survey_time=deal_data.get("confirmed_survey_time"), client_booking_reference=deal_data.get("client_booking_reference"), diff --git a/etl/hubspot/hubspot_deal_differ.py b/etl/hubspot/hubspot_deal_differ.py index 2842b735c..bb1e58674 100644 --- a/etl/hubspot/hubspot_deal_differ.py +++ b/etl/hubspot/hubspot_deal_differ.py @@ -100,6 +100,7 @@ class HubspotDealDiffer: "lodgement_status": "lodgement_status", "design_type": "design_type", "surveyor": "surveyor", + "third_party_surveyor_identifier": "third_party_surveyor_identifier", "confirmed_survey_time": "confirmed_survey_time", "client_booking_reference": "client_booking_reference", "survey_type": "survey_type", @@ -243,9 +244,7 @@ class HubspotDealDiffer: flows.append("abandon_job") if not flows: - logger.info( - "No Abri flows triggered for HubSpot deal %s", hubspot_deal_id - ) + logger.info("No Abri flows triggered for HubSpot deal %s", hubspot_deal_id) return None logger.info( @@ -266,6 +265,9 @@ class HubspotDealDiffer: else None ), "confirmed_survey_time": new_deal.get("confirmed_survey_time"), + "third_party_surveyor_identifier": new_deal.get( + "third_party_surveyor_identifier" + ), # Carried for the abandon flow: it dates the cancel to the confirmed # survey date, falling back to the last submission date. "last_submission_date": ( @@ -318,14 +320,24 @@ class HubspotDealDiffer: new_survey_date = parse_hs_date(new_deal.get("confirmed_survey_date")) new_survey_time = new_deal.get("confirmed_survey_time") + new_surveyor = HubspotDealDiffer._normalised_surveyor( + new_deal.get("third_party_surveyor_identifier") + ) + old_surveyor = HubspotDealDiffer._normalised_surveyor( + old_deal.third_party_surveyor_identifier + ) logger.info( "Abri job-amendment check: " "old_confirmed_survey_date=%s new_confirmed_survey_date=%s " - "old_confirmed_survey_time=%s new_confirmed_survey_time=%s", + "old_confirmed_survey_time=%s new_confirmed_survey_time=%s " + "old_third_party_surveyor_identifier=%s " + "new_third_party_surveyor_identifier=%s", old_deal.confirmed_survey_date, new_survey_date, old_deal.confirmed_survey_time, new_survey_time, + old_surveyor, + new_surveyor, ) # A first-time survey date logs a new job, not an amendment. @@ -339,7 +351,10 @@ class HubspotDealDiffer: if old_deal.confirmed_survey_date != new_survey_date: return True - return old_deal.confirmed_survey_time != new_survey_time + if old_deal.confirmed_survey_time != new_survey_time: + return True + + return old_surveyor != new_surveyor @staticmethod def check_for_abri_tenant_data_fetch( @@ -405,6 +420,14 @@ class HubspotDealDiffer: old_outcome = (old_deal.outcome or "").lower() return new_outcome == "surveyed" and old_outcome != "surveyed" + @staticmethod + def _normalised_surveyor(value: Optional[str]) -> Optional[str]: + # HubSpot sends "" for an unset property and the DB stores whatever + # the scrape wrote, so blank and missing must compare as equal. + if value is None or not value.strip(): + return None + return value + @staticmethod def _is_abandoned( number_of_attempts: Optional[str], outcome: Optional[str] diff --git a/etl/hubspot/tests/test_abri_flow_triggers.py b/etl/hubspot/tests/test_abri_flow_triggers.py index e6f5631f6..1e0ecdf52 100644 --- a/etl/hubspot/tests/test_abri_flow_triggers.py +++ b/etl/hubspot/tests/test_abri_flow_triggers.py @@ -66,9 +66,33 @@ def test_a_first_confirmed_survey_date_builds_a_log_job_message() -> None: "confirmed_survey_time": "14:30", "last_submission_date": None, "outcome": None, + "third_party_surveyor_identifier": None, } +def test_the_message_carries_the_deals_third_party_surveyor_identifier() -> None: + # Arrange + old_deal = make_old_deal(project_code=ABRI_PROJECT_CODE, confirmed_survey_date=None) + new_deal = make_new_deal( + confirmed_survey_date="2026-06-24", + confirmed_survey_time="14:30", + third_party_surveyor_identifier="THIRDPARTY", + ) + + # Act + message = HubspotDealDiffer.check_abri_triggers_and_construct_message( + hubspot_deal_id=DEAL_ID, + new_deal=new_deal, + new_project=None, + new_listing=LISTING, + old_deal=old_deal, + ) + + # Assert + assert message is not None + assert message["third_party_surveyor_identifier"] == "THIRDPARTY" + + def test_a_changed_confirmed_survey_date_builds_an_amend_job_message() -> None: # Arrange old_deal = make_old_deal( @@ -94,6 +118,115 @@ def test_a_changed_confirmed_survey_date_builds_an_amend_job_message() -> None: assert message["confirmed_survey_date"] == "2026-06-24" +def test_a_changed_surveyor_on_a_booked_deal_builds_an_amend_job_message() -> None: + # Arrange: booking exists; only the surveyor changes. + old_deal = make_old_deal( + project_code=ABRI_PROJECT_CODE, + confirmed_survey_date=datetime(2026, 6, 24, tzinfo=timezone.utc), + confirmed_survey_time="14:30", + third_party_surveyor_identifier="OLDSURVEYOR", + ) + new_deal = make_new_deal( + confirmed_survey_date="2026-06-24", + confirmed_survey_time="14:30", + third_party_surveyor_identifier="NEWSURVEYOR", + ) + + # Act + message = HubspotDealDiffer.check_abri_triggers_and_construct_message( + hubspot_deal_id=DEAL_ID, + new_deal=new_deal, + new_project=None, + new_listing=LISTING, + old_deal=old_deal, + ) + + # Assert + assert message is not None + assert message["flows"] == ["amend_job"] + assert message["third_party_surveyor_identifier"] == "NEWSURVEYOR" + + +def test_a_blank_surveyor_on_a_booked_deal_with_no_stored_surveyor_is_not_a_change() -> None: + # Arrange: booking exists; surveyor unset in the DB, blank in HubSpot. + old_deal = make_old_deal( + project_code=ABRI_PROJECT_CODE, + confirmed_survey_date=datetime(2026, 6, 24, tzinfo=timezone.utc), + confirmed_survey_time="14:30", + third_party_surveyor_identifier=None, + ) + new_deal = make_new_deal( + confirmed_survey_date="2026-06-24", + confirmed_survey_time="14:30", + third_party_surveyor_identifier="", + ) + + # Act + message = HubspotDealDiffer.check_abri_triggers_and_construct_message( + hubspot_deal_id=DEAL_ID, + new_deal=new_deal, + new_project=None, + new_listing=LISTING, + old_deal=old_deal, + ) + + # Assert + assert message is None + + +def test_a_blank_stored_surveyor_and_a_missing_incoming_one_are_not_a_change() -> None: + # Arrange: booking exists; DB stored "" for the surveyor, HubSpot omits it. + old_deal = make_old_deal( + project_code=ABRI_PROJECT_CODE, + confirmed_survey_date=datetime(2026, 6, 24, tzinfo=timezone.utc), + confirmed_survey_time="14:30", + third_party_surveyor_identifier="", + ) + new_deal = make_new_deal( + confirmed_survey_date="2026-06-24", + confirmed_survey_time="14:30", + ) + + # Act + message = HubspotDealDiffer.check_abri_triggers_and_construct_message( + hubspot_deal_id=DEAL_ID, + new_deal=new_deal, + new_project=None, + new_listing=LISTING, + old_deal=old_deal, + ) + + # Assert + assert message is None + + +def test_an_unchanged_surveyor_on_a_booked_deal_fires_nothing() -> None: + # Arrange: booking exists; surveyor and appointment are unchanged. + old_deal = make_old_deal( + project_code=ABRI_PROJECT_CODE, + confirmed_survey_date=datetime(2026, 6, 24, tzinfo=timezone.utc), + confirmed_survey_time="14:30", + third_party_surveyor_identifier="SURVEYOR", + ) + new_deal = make_new_deal( + confirmed_survey_date="2026-06-24", + confirmed_survey_time="14:30", + third_party_surveyor_identifier="SURVEYOR", + ) + + # Act + message = HubspotDealDiffer.check_abri_triggers_and_construct_message( + hubspot_deal_id=DEAL_ID, + new_deal=new_deal, + new_project=None, + new_listing=LISTING, + old_deal=old_deal, + ) + + # Assert + assert message is None + + def test_a_first_expected_commencement_date_builds_a_tenant_sync_message() -> None: # Arrange old_deal = make_old_deal( diff --git a/harness/console.py b/harness/console.py index 2f33a3f70..a87197b38 100644 --- a/harness/console.py +++ b/harness/console.py @@ -29,6 +29,10 @@ from domain.modelling.recommendation import Recommendation from domain.modelling.scenario import Scenario from domain.modelling.solar_potential import SolarPotential from domain.property.property import Property, PropertyIdentity +from domain.property_baseline.performance import Performance +from domain.property_baseline.property_baseline_performance import ( + PropertyBaselinePerformance, +) from domain.property_baseline.rebaseliner import StubRebaseliner from domain.sap10_calculator.calculator import Sap10Calculator from harness.plan_table import format_plan_table @@ -49,6 +53,7 @@ from repositories.product.product_repository import ProductRepository from tests.orchestration.fakes import ( FakeEpcRepo, FakePlanRepository, + FakePropertyBaselineRepo, FakePropertyRepo, FakeScenarioRepository, FakeSolarRepo, @@ -230,7 +235,26 @@ def run_modelling( ) }, ) + # The Baseline stage this harness has no database for. Modelling asserts its + # re-score agrees with the persisted Effective Performance (ADR-0066), so + # establish it here the way `PropertyBaselineOrchestrator` would — from the + # calculator on this same EPC. Drift is structurally impossible in this lane + # (one process, one code version, one picture), so the assertion is a no-op; + # seeding it keeps the check honest instead of reporting "no baseline" once + # per Property across a whole re-model batch. ~1% of a run_modelling call. + baseline_repo = FakePropertyBaselineRepo() + baseline_repo.save( + PropertyBaselinePerformance( + lodged=None, + effective=Performance.from_sap_result(Sap10Calculator().calculate(epc)), + rebaseline_reason="physical_state_changed", + space_heating_kwh=0.0, + water_heating_kwh=0.0, + ), + _PROPERTY_ID, + ) unit = FakeUnitOfWork( + property_baseline=baseline_repo, property=property_repo, solar=FakeSolarRepo( by_uprn={_UPRN: solar_insights} diff --git a/harness/plan_table.py b/harness/plan_table.py index 7c6e96f1a..ddb5d2513 100644 --- a/harness/plan_table.py +++ b/harness/plan_table.py @@ -17,7 +17,7 @@ _KG_PER_TONNE = 1000.0 def _band(sap_continuous: float) -> str: - return Epc.from_sap_score(round(sap_continuous)).value + return Epc.from_sap_continuous(sap_continuous).value def _signed_gbp(value: Optional[float]) -> str: diff --git a/infrastructure/abri/abri_client.py b/infrastructure/abri/abri_client.py index 66e094eab..3aac754a1 100644 --- a/infrastructure/abri/abri_client.py +++ b/infrastructure/abri/abri_client.py @@ -67,7 +67,7 @@ class AbriClient: ("client_ref", request.client_ref), ("appointment_date", _format_appointment_date(request.appointment_date)), ("appointment_time", request.appointment_time), - ("resource", self._config.default_resource), + ("resource", request.resource), ("resource_group", RESOURCE_GROUP), ], ) @@ -78,20 +78,12 @@ class AbriClient: return self._parse_job_logged(outcome) def amend_job(self, request: AmendJobRequest) -> AmendJobResult: - # OpenHousing silently drops the appointment unless a bookable resource - # is sent, so fall back to the configured surveyor when the request - # carries no explicit override (mirrors log_job). - resource = ( - request.resource - if request.resource is not None - else self._config.default_resource - ) parameters = [ ("job_no", request.job_no), ("action", "amend"), ("appointment_date", _format_appointment_date(request.appointment_date)), ("appointment_time", request.appointment_time), - ("resource", resource), + ("resource", request.resource), ] outcome = self._exchange( diff --git a/infrastructure/abri/config.py b/infrastructure/abri/config.py index f29e3f10c..445d63122 100644 --- a/infrastructure/abri/config.py +++ b/infrastructure/abri/config.py @@ -7,20 +7,11 @@ class AbriConfig: endpoint_url: str username: str password: str - default_resource: str @classmethod def from_env(cls, env: Mapping[str, str]) -> "AbriConfig": - # A blank default_resource does not error at the relay — OpenHousing - # logs the job but silently drops the appointment — so reject it here - # rather than let the misconfiguration ship an empty resource. - default_resource = env["ABRI_RELAY_DEFAULT_RESOURCE"] - if not default_resource.strip(): - raise ValueError("ABRI_RELAY_DEFAULT_RESOURCE must not be blank") - return cls( endpoint_url=env["ABRI_RELAY_URL"], username=env["ABRI_RELAY_USERNAME"], password=env["ABRI_RELAY_PASSWORD"], - default_resource=default_resource, ) diff --git a/infrastructure/postgres/epc_property_table.py b/infrastructure/postgres/epc_property_table.py index 1e36828ee..d2c2de654 100644 --- a/infrastructure/postgres/epc_property_table.py +++ b/infrastructure/postgres/epc_property_table.py @@ -650,6 +650,24 @@ class EpcBuildingPartModel(SQLModel, table=True): roof_insulation_thickness: Optional[Union[str, int]] = Field( default=None, sa_column=Column(JSONB, nullable=True) ) + # RdSAP 10 §5.11.2 — a roof insulated AT RAFTERS lodges its thickness here, + # NOT in `roof_insulation_thickness` (which stays null for rafter roofs). + # `heat_transmission.py:922` prefers it when `roof_insulation_location == 1` + # so the measured Table 16 column (2) row applies; without it the roof falls + # to the Table 18 column (2) unknown-thickness default (2.30 for bands A-D), + # a 10x U-value error. Union[str, int] ("250mm" from the API) → JSONB, like + # the `roof_insulation_thickness` sibling. + rafter_insulation_thickness: Optional[Union[str, int]] = Field( + default=None, sa_column=Column(JSONB, nullable=True) + ) + # RdSAP 10 §5.17 / Table 23 — selects the basement-wall U-value column for + # the part's primary wall (`heat_transmission.py:955` via + # `SapBuildingPart.main_wall_is_basement`). NOT a lodged U-value: it picks + # WHICH RdSAP default applies, so unlike wall/roof/floor_u_value it must be + # persisted. Nullable is load-bearing — `None` means "not stated, fall back + # to the gov-API code-6 heuristic", `False` means "explicitly system-built, + # do NOT apply the heuristic". Collapsing False to None inverts the answer. + wall_is_basement: Optional[bool] = Field(default=None) room_in_roof_floor_area: Optional[float] = Field(default=None) room_in_roof_construction_age_band: Optional[str] = Field(default=None) alt_wall_1_area: Optional[float] = Field(default=None) @@ -699,6 +717,8 @@ class EpcBuildingPartModel(SQLModel, table=True): curtain_wall_age=part.curtain_wall_age, roof_insulation_location=part.roof_insulation_location, roof_insulation_thickness=part.roof_insulation_thickness, + rafter_insulation_thickness=part.rafter_insulation_thickness, + wall_is_basement=part.wall_is_basement, room_in_roof_floor_area=float(rir.floor_area) if rir else None, room_in_roof_construction_age_band=( rir.construction_age_band if rir else None diff --git a/orchestration/abri_orchestrator.py b/orchestration/abri_orchestrator.py index c0aba0c93..9441fdd66 100644 --- a/orchestration/abri_orchestrator.py +++ b/orchestration/abri_orchestrator.py @@ -112,6 +112,9 @@ class ConfirmedSurveyBooking: deal_name: str confirmed_survey_date: date confirmed_survey_time: Optional[str] + # OpenHousing calls it the resource; the HubSpot deal property (and the + # database column) call it the third-party surveyor identifier. + third_party_surveyor_identifier: str @dataclass(frozen=True) @@ -138,6 +141,9 @@ class AppointmentChange: deal_id: str confirmed_survey_date: date confirmed_survey_time: Optional[str] + # OpenHousing calls it the resource; the HubSpot deal property (and the + # database column) call it the third-party surveyor identifier. + third_party_surveyor_identifier: str AmendJobOrchestrationResult = Union[AppointmentAmended, AbriRequestRejected] @@ -283,6 +289,7 @@ class AbriOrchestrator: appointment_time=slot_for_confirmed_time( change.confirmed_survey_time ), + resource=change.third_party_surveyor_identifier, ) ) @@ -319,6 +326,7 @@ class AbriOrchestrator: ), short_description=descriptions.short_description, long_description=descriptions.long_description, + resource=booking.third_party_surveyor_identifier, ) ) diff --git a/orchestration/modelling_orchestrator.py b/orchestration/modelling_orchestrator.py index 69e88feac..d4248f3f1 100644 --- a/orchestration/modelling_orchestrator.py +++ b/orchestration/modelling_orchestrator.py @@ -1,6 +1,7 @@ from __future__ import annotations from collections.abc import Callable +import logging from typing import Final, Optional from datatypes.epc.domain.epc import Epc @@ -27,6 +28,9 @@ from domain.modelling.plan import Plan, PlanMeasure from domain.modelling.recommendation import MeasureOption, Recommendation from domain.modelling.generators.roof_recommendation import recommend_roof_insulation from domain.modelling.portfolio_goal import PortfolioGoal +from domain.property_baseline.property_baseline_performance import ( + PropertyBaselinePerformance, +) from domain.modelling.scenario import Scenario from domain.modelling.scoring.scoring import ( MeasureImpact, @@ -51,6 +55,14 @@ from repositories.product.product_repository import ProductRepository from repositories.solar.solar_repository import SolarRepository from repositories.unit_of_work import UnitOfWork +logger = logging.getLogger(__name__) + +# How far Modelling's continuous re-score may sit from the persisted Effective +# SAP before it counts as a divergence. The persisted figure is the *rounded* +# integer, so up to half a point is rounding alone; beyond a full point the two +# stages are scoring different pictures (#1655). +_MAX_BASELINE_DIVERGENCE: Final[float] = 1.0 + # Best-practice install sequence for the role-3 attribution cascade (ADR-0016): # walls → roof → ventilation → floor, per the legacy `Recommendations` class. # Ventilation sits after the fabric that triggers it so its (negative) marginal @@ -111,6 +123,11 @@ class ModellingOrchestrator: # Resolve Fuel Rates once and reuse the BillDerivation across the batch, # so every baseline/post bill is priced at the same snapshot (ADR-0014). bill_derivation = BillDerivation(self._fuel_rates.get_current()) + # Properties the Baseline stage never established. Collected and reported + # once at the end of the batch — a whole batch can legitimately have none + # (the database-free harness), and one line each would bury the real + # divergence errors under a duplicate per Property. + without_baseline: list[int] = [] with self._unit_of_work() as uow: properties = uow.property.get_many(property_ids) scenarios: list[Scenario] = uow.scenario.get_many(scenario_ids) @@ -124,6 +141,7 @@ class ModellingOrchestrator: uow.solar, prop.identity.uprn ) has_recommendations = False + checked_baseline = False for scenario in scenarios: plan = self._plan_for( scorer, @@ -136,6 +154,18 @@ class ModellingOrchestrator: solar_potential=solar_potential, considered_measures=considered_measures, ) + # The baseline is the same picture for every Scenario, so + # check it once per Property — and off the Plan's own + # baseline Score, which is already computed, rather than + # paying for another whole-dwelling re-score per Property. + if not checked_baseline: + if _check_baseline_coherence( + property_id, + plan.baseline.sap_continuous, + uow.property_baseline.get_for_property(property_id), + ): + without_baseline.append(property_id) + checked_baseline = True uow.plan.save( plan, property_id=property_id, @@ -150,6 +180,14 @@ class ModellingOrchestrator: uow.property.mark_modelled( property_id, has_recommendations=has_recommendations ) + if without_baseline: + logger.warning( + "%s of %s properties had no persisted Baseline Performance " + "and were modelled against their own re-score; first ids: %s", + len(without_baseline), + len(property_ids), + without_baseline[:10], + ) uow.commit() def _plan_for( @@ -489,12 +527,69 @@ def _objective_for( return build_objective(bill_derivation) +def _check_baseline_coherence( + property_id: int, + modelled_baseline_sap: float, + persisted: Optional[PropertyBaselinePerformance], +) -> bool: + """Assert that Modelling and the Baseline stage agree on what the Property + scores now, and say so loudly when they do not (ADR-0002, #1655). + + Modelling re-scores the Effective EPC rather than reading the persisted + Effective Performance, so the two can drift apart. The app treats the + persisted figure as the Property's current state and reads a Plan's `post_*` + against it, so a drift is not cosmetic: it surfaces to the user as a gain + nobody modelled (property 749719 reported "+9.65 SAP" on a plan whose own + CO2, bill and consumption savings were all exactly 0.0). + + We flag rather than anchor deliberately. Overwriting the Plan's SAP with the + persisted integer would make it disagree with its own CO2 / primary energy / + bill, which all come off the same SapResult — trading one incoherence for + another, and hiding the drift instead of surfacing it. A divergence here is + a real defect upstream (see #1656) and should be investigated, not papered + over. + + A missing row is a data gap, not a modelling fault, so it is **returned** + (``True``) for the caller to aggregate rather than logged here: it degrades + one Property instead of aborting the batch (ADR-0012 reserves the abort for a + load-bearing calculator raise), and an entire batch can legitimately have no + Baseline stage at all — the database-free harness the ``modelling_e2e`` + handler runs on has none, so a per-Property line would bury the real errors + under one duplicate per Property. + + A divergence stays per-Property: it is rare, and the Property is the thing + you need to go and look at.""" + if persisted is None: + return True + effective_sap: int = persisted.effective.sap_score + if abs(modelled_baseline_sap - effective_sap) <= _MAX_BASELINE_DIVERGENCE: + return False + logger.error( + "modelling baseline diverges from persisted Effective Performance for " + "property_id=%s: modelled=%.2f effective=%s (%s). Plan post_* figures " + "are read against the effective baseline, so this surfaces as an " + "unmodelled gain — see #1655/#1656.", + property_id, + modelled_baseline_sap, + effective_sap, + persisted.rebaseline_reason, + ) + return False + + def _target_sap(scenario: Scenario) -> Optional[float]: """The SAP rating the Optimiser repairs toward — the floor of the goal - band for an INCREASING_EPC goal, else None (no SAP target).""" + band for an INCREASING_EPC goal, else None (no SAP target). + + On the **continuous** scale, because that is the currency every figure the + Optimiser compares it against is in. The dwelling is in the goal band once + its *published* rating is, which happens half a point below the integer + floor — target the integer and a dwelling publishing at the floor reads as a + fraction short, and the Optimiser buys works toward a band it is already in + (#1654).""" if scenario.goal != PortfolioGoal.INCREASING_EPC.value: return None - return float(Epc(scenario.goal_value).sap_lower_bound()) + return Epc(scenario.goal_value).sap_lower_bound_continuous() def _best_practice_key(option: MeasureOption) -> int: diff --git a/repositories/epc/epc_postgres_repository.py b/repositories/epc/epc_postgres_repository.py index bef090fc6..caa038e4e 100644 --- a/repositories/epc/epc_postgres_repository.py +++ b/repositories/epc/epc_postgres_repository.py @@ -1003,6 +1003,8 @@ class EpcPostgresRepository(EpcRepository): curtain_wall_age=bp.curtain_wall_age, roof_insulation_location=bp.roof_insulation_location, roof_insulation_thickness=bp.roof_insulation_thickness, + rafter_insulation_thickness=bp.rafter_insulation_thickness, + wall_is_basement=bp.wall_is_basement, sap_room_in_roof=( SapRoomInRoof( floor_area=bp.room_in_roof_floor_area, diff --git a/scripts/audit/anomalies.py b/scripts/audit/anomalies.py index 0ee0386d4..8c341cd3d 100644 --- a/scripts/audit/anomalies.py +++ b/scripts/audit/anomalies.py @@ -26,6 +26,11 @@ be justified against the real distribution, not guessed. Read-only: this script never writes to the DB. """ +# Every check is reached through `_REGISTRY` via the `@check` decorator, never by +# name, so pyright sees each one as an unused function. That is the design, not a +# defect — suppress it for the module rather than tagging a dozen definitions. +# pyright: reportUnusedFunction=false + from __future__ import annotations import argparse @@ -42,6 +47,11 @@ from scripts.e2e_common import build_engine, load_env # A..G, A best — index is the rank (lower = better) for band comparisons. _BANDS = "ABCDEFG" +# The smallest SAP movement that counts as a real improvement. The effective +# baseline is a rounded integer, so anything at or under half a point is within +# the rounding the published band already absorbs — invisible on a certificate. +_MIN_REAL_SAP_GAIN = 0.5 + def _band_rank(band: Optional[str]) -> Optional[int]: if band is None or band not in _BANDS: @@ -52,7 +62,7 @@ def _band_rank(band: Optional[str]) -> Optional[int]: def _band_of(score: Optional[float]) -> Optional[str]: if score is None: return None - return Epc.from_sap_score(round(score)).value + return Epc.from_sap_continuous(score).value def _int_or_none(value: object) -> Optional[int]: @@ -163,10 +173,22 @@ def _plan_score_below_baseline(a: PropertyAudit) -> Optional[str]: return f"post SAP {a.post_sap:.1f} below effective baseline {a.effective_sap:.1f} (Δ{a.post_sap - a.effective_sap:.1f})" -@check("already-meets-goal-with-works", Severity.MEDIUM) +@check("already-meets-goal-with-works", Severity.HIGH) def _already_meets_goal_with_works(a: PropertyAudit) -> Optional[str]: """The property already meets/exceeds the scenario's goal band, yet the plan - spends money on measures — nothing should be recommended.""" + spends money on measures — nothing should be recommended. + + Provenance: #1652 / #1654. Ranked HIGH because it bills real money and is the + signature of the Optimiser judging the goal against something other than the + published band. It ran at MEDIUM and was waved through as stale-plan noise + while 630 homes in portfolio 796 published at band C were each sold ~1 SAP + point of works toward a band they had already reached (£282k), and 172 more + in 824. The cause there was a continuous baseline compared against the + *integer* band floor, so a dwelling publishing at the floor read as a + fraction short; the goal is now judged on the continuous floor + (`Epc.sap_lower_bound_continuous`). Any fresh firing means a baseline the + Optimiser used has diverged from the published one again — re-debug it, + do not re-bucket it.""" goal, base = _band_rank(a.scenario_goal_band), _band_rank(a.effective_band) if goal is None or base is None or base > goal: return None @@ -175,6 +197,38 @@ def _already_meets_goal_with_works(a: PropertyAudit) -> Optional[str]: return f"already {a.effective_band} >= goal {a.scenario_goal_band} but cost_of_works £{a.cost_of_works:.0f}" +@check("costed-plan-without-real-gain", Severity.HIGH) +def _costed_plan_without_real_gain(a: PropertyAudit) -> Optional[str]: + """Money was spent but the modelled post-retrofit SAP barely moves off the + effective baseline — works that buy no real improvement. + + Provenance: #1652 / #1655. This closes a coverage hole rather than adding a + new opinion: `plan-score-below-baseline` only fires on a *drop* beyond 0.5, + and `zero-works-post-differs` only on £0 plans, so a **costed** plan landing + flat against the baseline was caught by neither. It is what the 112 + "no real improvement" homes in portfolio 796 looked like — priced plans whose + post-retrofit SAP sat ~0.2 *below* the effective baseline — and what the + band-boundary defect (#1654) produced at scale: 630 homes each sold ~1 SAP + point of works toward a band they had already reached. + + The 0.5 threshold is the same "within rounding is not a real move" line the + published banding uses: the effective baseline is a rounded integer, so a + sub-half-point shift is not a change anyone can see on a certificate. Spend + that buys less than that is not a retrofit.""" + if a.effective_sap is None or a.post_sap is None: + return None + cost = a.cost_of_works or 0.0 + if cost <= 0.0: + return None + gain = a.post_sap - a.effective_sap + if gain > _MIN_REAL_SAP_GAIN: + return None + return ( + f"£{cost:.0f} of works for {gain:+.1f} SAP " + f"(effective {a.effective_sap:.1f} → post {a.post_sap:.1f})" + ) + + @check("plan-stops-short-of-goal", Severity.HIGH) def _plan_stops_short_of_goal(a: PropertyAudit) -> Optional[str]: """The default plan ends BELOW the scenario's goal band on a scenario that is @@ -538,11 +592,14 @@ def _load( rollups = { m["property_id"]: (m["solar_sap"], m["solar_bill"], m["n_measures"]) for m in ( - row._mapping for row in conn.execute(_ROLLUP_QUERY, params) + # `Row._mapping` is public API in SQLAlchemy 2.0; only the + # stub marks it protected. + row._mapping # pyright: ignore[reportPrivateUsage] + for row in conn.execute(_ROLLUP_QUERY, params) ) } for r in conn.execute(_QUERY, params): - m = r._mapping + m = r._mapping # pyright: ignore[reportPrivateUsage] solar_sap, solar_bill, n_measures = rollups.get(m["id"], (None, None, 0)) out.append( PropertyAudit( diff --git a/scripts/build_pashub_accuracy_fixtures.py b/scripts/build_pashub_accuracy_fixtures.py index c2c2f5655..57d629ab1 100644 --- a/scripts/build_pashub_accuracy_fixtures.py +++ b/scripts/build_pashub_accuracy_fixtures.py @@ -34,17 +34,14 @@ from dotenv import dotenv_values REPO_ROOT = Path(__file__).resolve().parents[1] ENV_PATH = REPO_ROOT / "backend" / ".env" -FIXTURES_DIR = ( - REPO_ROOT - / "backend" - / "documents_parser" - / "tests" - / "fixtures" - / "pashub_accuracy" +_FIXTURES_ROOT = ( + REPO_ROOT / "backend" / "documents_parser" / "tests" / "fixtures" +) +# Default cohort (Guinness GMCA); override per-portfolio with --project-code / --out-dir. +DEFAULT_FIXTURES_SUBDIR = "pashub_accuracy" +DEFAULT_PROJECT_CODE = ( + "[The Guinness Partnership GMCA Bid - WH:SF - 052026 - 1219680020683]" ) -MANIFEST_PATH = FIXTURES_DIR / "manifest.json" - -PROJECT_CODE = "[The Guinness Partnership GMCA Bid - WH:SF - 052026 - 1219680020683]" ELMHURST_MARKER = "Elmhurst Energy Systems" # One row per deal: the newest pashub RdSAP site-note that has a pre_sap. @@ -103,7 +100,7 @@ def _is_elmhurst(pdf_bytes: bytes) -> bool: doc.close() -def _fetch_deals(limit: Optional[int]) -> list[tuple[Any, ...]]: +def _fetch_deals(limit: Optional[int], project_code: str) -> list[tuple[Any, ...]]: env = dotenv_values(ENV_PATH) conn: Any = psycopg2.connect( host=env["DB_HOST"], @@ -115,16 +112,19 @@ def _fetch_deals(limit: Optional[int]) -> list[tuple[Any, ...]]: ) try: cur: Any = conn.cursor() - cur.execute(_DEAL_QUERY, (PROJECT_CODE,)) + cur.execute(_DEAL_QUERY, (project_code,)) rows: list[tuple[Any, ...]] = cur.fetchall() finally: conn.close() return rows[:limit] if limit is not None else rows -def build(limit: Optional[int], force: bool) -> None: - FIXTURES_DIR.mkdir(parents=True, exist_ok=True) - rows = _fetch_deals(limit) +def build( + limit: Optional[int], force: bool, project_code: str, fixtures_dir: Path +) -> None: + manifest_path = fixtures_dir / "manifest.json" + fixtures_dir.mkdir(parents=True, exist_ok=True) + rows = _fetch_deals(limit, project_code) print(f"{len(rows)} candidate deals (pre_sap + rd_sap_site_note)") s3: Any = boto3.client("s3") # pyright: ignore[reportUnknownMemberType] @@ -138,7 +138,7 @@ def build(limit: Optional[int], force: bool) -> None: continue pdf_name = f"{deal_id}.pdf" - pdf_path = FIXTURES_DIR / pdf_name + pdf_path = fixtures_dir / pdf_name if pdf_path.exists() and not force: entries.append( @@ -168,10 +168,10 @@ def build(limit: Optional[int], force: bool) -> None: ) entries.sort(key=lambda e: e.deal_id) - MANIFEST_PATH.write_text( + manifest_path.write_text( json.dumps( { - "project_code": PROJECT_CODE, + "project_code": project_code, "source": "hubspot_deal_data + uploaded_files (rd_sap_site_note) + S3", "note": ( "pre_sap is pashub's own RdSAP rating; PDFs are image-" @@ -185,7 +185,7 @@ def build(limit: Optional[int], force: bool) -> None: + "\n" ) print( - f"\nwrote {len(entries)} fixtures + manifest to {FIXTURES_DIR}\n" + f"\nwrote {len(entries)} fixtures + manifest to {fixtures_dir}\n" f"skipped: {skipped}" ) @@ -194,8 +194,27 @@ def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--limit", type=int, default=None) parser.add_argument("--force", action="store_true") + parser.add_argument( + "--project-code", + default=DEFAULT_PROJECT_CODE, + help="hubspot_deal_data.project_code to select (default: Guinness GMCA)", + ) + parser.add_argument( + "--out-dir", + default=DEFAULT_FIXTURES_SUBDIR, + help=( + "fixtures subdirectory name under tests/fixtures/ (default: " + f"{DEFAULT_FIXTURES_SUBDIR}); use a per-portfolio name to avoid " + "clobbering another cohort's manifest" + ), + ) args = parser.parse_args() - build(limit=args.limit, force=args.force) + build( + limit=args.limit, + force=args.force, + project_code=args.project_code, + fixtures_dir=_FIXTURES_ROOT / args.out_dir, + ) if __name__ == "__main__": diff --git a/scripts/enrich_pashub_wythenshawe_oracle.py b/scripts/enrich_pashub_wythenshawe_oracle.py new file mode 100644 index 000000000..45701c055 --- /dev/null +++ b/scripts/enrich_pashub_wythenshawe_oracle.py @@ -0,0 +1,134 @@ +"""Enrich the PasHub Wythenshawe fixture manifest with the DB-oracle SAP. + +The accuracy harness must grade against the reliable oracle — the PasHub +company-assessment result stored in the DB (`epc_property_energy_performance. +energy_rating_current`, `ep.source='lodged'`) — NOT the manifest `pre_sap` +(`hubspot_deal_data.pre_sap`, surveyor hand-entered and frequently wrong). This +one-time / rebuild-able provenance script resolves each fixture to that DB SAP +and writes `oracle_sap` (int or null) + `oracle_match` ("uprn" / "address" / +null) back into `manifest.json`, so the committed manifest is what the test +consumes and CI needs no DB access. Mirrors `build_pashub_accuracy_fixtures.py`. + +Match order: manifest `uprn` (bigint, exact) → else postcode + house-number +parsed from the PDF "Property Address:" block. Latest cert per key by `ep.id`. + +Requires DB credentials (reads `backend/.env`); NOT run in CI. + + python scripts/enrich_pashub_wythenshawe_oracle.py [--dry-run] +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +from pathlib import Path +from typing import Optional + +REPO_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(REPO_ROOT)) + +from scripts.e2e_common import build_engine, load_env # noqa: E402 +from sqlalchemy import text # noqa: E402 +from sqlalchemy.engine import Connection # noqa: E402 + +from backend.documents_parser.parser import pdf_to_text_list # noqa: E402 + +_FIXTURES = ( + REPO_ROOT + / "backend" + / "documents_parser" + / "tests" + / "fixtures" + / "pashub_accuracy_wythenshawe" +) +_MANIFEST = _FIXTURES / "manifest.json" +_POSTCODE_RE = re.compile(r"^[A-Z]{1,2}\d[A-Z\d]?\s*\d[A-Z]{2}$") +_HOUSENUM_RE = re.compile(r"^(\d+[A-Za-z]?)\b") + + +def _address_from_pdf(deal_id: str) -> tuple[Optional[str], Optional[str]]: + """(house_number, postcode) from the PDF "Property Address:" block.""" + tl = pdf_to_text_list((_FIXTURES / f"{deal_id}.pdf").read_bytes()) + try: + i = next(k for k, l in enumerate(tl) if l.strip() == "Property Address:") + except StopIteration: + return None, None + block = [l.strip().rstrip(",") for l in tl[i + 1 : i + 6] if l.strip()] + postcode = next((l for l in block if _POSTCODE_RE.match(l.upper())), None) + house = None + if block: + m = _HOUSENUM_RE.match(block[0]) + if m: + house = m.group(1) + return house, postcode + + +def _resolve( + conn: Connection, uprn: Optional[int], deal_id: str +) -> tuple[Optional[int], str]: + if uprn: + row = conn.execute( + text( + "select eppe.energy_rating_current from epc_property ep " + "join epc_property_energy_performance eppe " + "on eppe.epc_property_id = ep.id " + "where ep.source='lodged' and ep.uprn=:u " + "and eppe.energy_rating_current is not null " + "order by ep.id desc limit 1" + ), + {"u": int(uprn)}, + ).scalar() + if row is not None: + return int(row), "uprn" + house, postcode = _address_from_pdf(deal_id) + if house and postcode: + rows = conn.execute( + text( + "select ep.address_line_1, eppe.energy_rating_current " + "from epc_property ep join epc_property_energy_performance eppe " + "on eppe.epc_property_id = ep.id " + "where ep.source='lodged' " + "and replace(upper(ep.postcode),' ','')=:pc " + "and eppe.energy_rating_current is not null order by ep.id desc" + ), + {"pc": postcode.upper().replace(" ", "")}, + ).fetchall() + for row_pair in rows: + a1 = str(row_pair[0] or "").strip() + m = _HOUSENUM_RE.match(a1) + if m and m.group(1).lower() == house.lower(): + return int(row_pair[1]), "address" + return None, "unmatched" + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--dry-run", action="store_true") + args = ap.parse_args() + + load_env(REPO_ROOT / "backend" / ".env") + engine = build_engine() + manifest = json.loads(_MANIFEST.read_text()) + + matched = 0 + with engine.connect() as conn: + for fx in manifest["fixtures"]: + oracle_sap, kind = _resolve(conn, fx.get("uprn"), fx["deal_id"]) + fx["oracle_sap"] = oracle_sap + fx["oracle_match"] = None if kind == "unmatched" else kind + if oracle_sap is not None: + matched += 1 + + n = len(manifest["fixtures"]) + print(f"resolved {matched}/{n} fixtures to a DB oracle SAP") + if args.dry_run: + print("--dry-run: manifest NOT written") + return + _MANIFEST.write_text(json.dumps(manifest, indent=2) + "\n") + print(f"wrote {_MANIFEST}") + + +if __name__ == "__main__": + main() diff --git a/scripts/smoke_test_abri_log_amend.py b/scripts/smoke_test_abri_log_amend.py index cc786f449..f02783bd8 100644 --- a/scripts/smoke_test_abri_log_amend.py +++ b/scripts/smoke_test_abri_log_amend.py @@ -13,7 +13,7 @@ production database. Usage: 1. Ensure these are set in the environment or backend/.env: HUBSPOT_API_KEY, ABRI_RELAY_URL (the UAT endpoint), - ABRI_RELAY_USERNAME, ABRI_RELAY_PASSWORD, ABRI_RELAY_DEFAULT_RESOURCE. + ABRI_RELAY_USERNAME, ABRI_RELAY_PASSWORD. 2. Create a throwaway test deal in the HubSpot UI and paste its id into DEAL_ID below; paste Abri's agreed UAT test place reference into PLACE_REF. @@ -46,6 +46,9 @@ from orchestration.abri_orchestrator import ( DEAL_ID = "EDIT-ME" PLACE_REF = PlaceRef("EDIT-ME") +# The bookable OpenHousing resource to book the UAT job against (mandatory: +# in production it comes from the deal's third_party_surveyor_identifier). +SURVEYOR = "EDIT-ME" # Log for the first weekday at least a week out (a slot Abri UAT will take), # then amend to the following day's opposite slot. @@ -73,7 +76,6 @@ def _uat_abri_client() -> AbriClient: endpoint_url=_env("ABRI_RELAY_URL"), username=_env("ABRI_RELAY_USERNAME"), password=_env("ABRI_RELAY_PASSWORD"), - default_resource=_env("ABRI_RELAY_DEFAULT_RESOURCE"), ) ) @@ -94,8 +96,8 @@ class InMemoryDealDatabase: def main() -> None: - if DEAL_ID == "EDIT-ME" or PLACE_REF == PlaceRef("EDIT-ME"): - raise SystemExit("Edit DEAL_ID and PLACE_REF before running") + if "EDIT-ME" in (DEAL_ID, str(PLACE_REF), SURVEYOR): + raise SystemExit("Edit DEAL_ID, PLACE_REF and SURVEYOR before running") sdk_client = _hubspot_sdk_client() deal_database = InMemoryDealDatabase() @@ -114,6 +116,7 @@ def main() -> None: deal_name=f"Domna UAT smoke test {date.today().isoformat()}", confirmed_survey_date=LOG_DATE, confirmed_survey_time=LOG_TIME, + third_party_surveyor_identifier=SURVEYOR, ) ) if isinstance(log_result, AbriRequestRejected): @@ -128,6 +131,7 @@ def main() -> None: deal_id=DEAL_ID, confirmed_survey_date=AMEND_DATE, confirmed_survey_time=AMEND_TIME, + third_party_surveyor_identifier=SURVEYOR, ) ) if isinstance(amend_result, AbriRequestRejected): diff --git a/scripts/smoke_test_abri_logjob_flow.py b/scripts/smoke_test_abri_logjob_flow.py index 61bae5bee..63427a83f 100644 --- a/scripts/smoke_test_abri_logjob_flow.py +++ b/scripts/smoke_test_abri_logjob_flow.py @@ -229,7 +229,6 @@ def main() -> None: endpoint_url="https://stubbed.invalid/relay", username="smoke-test", password="", - default_resource="SMOKE", ) ) abri_client._session = cast( # pyright: ignore[reportPrivateUsage] diff --git a/scripts/smoke_test_tenant_contacts.py b/scripts/smoke_test_tenant_contacts.py index 8dedeedac..9aaa7a606 100644 --- a/scripts/smoke_test_tenant_contacts.py +++ b/scripts/smoke_test_tenant_contacts.py @@ -91,7 +91,6 @@ def _stubbed_abri_client() -> AbriClient: endpoint_url="https://stubbed.invalid/relay", username="smoke-test", password="", - default_resource="", ) ) client._session = cast( diff --git a/scripts/wchg_elmhurst_ingest.py b/scripts/wchg_elmhurst_ingest.py new file mode 100644 index 000000000..f362d0a88 --- /dev/null +++ b/scripts/wchg_elmhurst_ingest.py @@ -0,0 +1,499 @@ +"""One-time ingest of WCHG Elmhurst *Summary* PDFs -> S3 + uploaded_files + epc_property, +with a SAP-accuracy report against Elmhurst's own reported score. + +For each row of the WCHG xlsx that has an Elmhurst "Summary" PDF in its SharePoint +folder, this: + + 1. resolves the folder from the row's `Sharepoint URL` (the `RootFolder` query + param, drive-relative), finds the summary PDF (basename contains "summary"), + 2. downloads it, runs it through the existing pipeline + `ElmhurstSiteNotesExtractor -> EpcPropertyDataMapper.from_elmhurst_site_notes + -> calculate_sap_from_inputs(cert_to_inputs(...))`, + 3. stamps the national `UPRN` from the sheet onto the EpcPropertyData (the summary + does not carry it), and compares our continuous SAP to Elmhurst's reported + `current_sap_rating`, + 4. (only with --commit) pushes the PDF to S3, records an `uploaded_files` row + (source=sharepoint, type=rd_sap_site_note), saves the EpcPropertyData to + `epc_property` keyed on UPRN (property_id NULL), replacing any prior + (uprn, source='lodged') graph, and links `epc_property.uploaded_file_id`. + +Writes an accuracy CSV and prints MAE + the share of records within 0.5 +(i.e. our rounded integer matches Elmhurst's). + +Dry run is the DEFAULT — nothing is written until you pass --commit. + +USAGE + source # SHAREPOINT_* + SOCIAL_HOUSING_SHAREPOINT_ID + PYTHONPATH=. python scripts/wchg_elmhurst_ingest.py \ + --xlsx "WCHG EPC Sharepoint URLs & UPRNs 160726.xlsx" \ + --out accuracy.csv [--limit N] [--commit] +""" + +from __future__ import annotations + +import argparse +import csv +import os +import re +import subprocess +import urllib.parse +from dataclasses import replace +from datetime import datetime, timezone +from pathlib import Path +from typing import Any, Optional + +from dotenv import load_dotenv + +_REPO_ROOT = Path(__file__).resolve().parents[1] +# Load DB / bucket / AWS config before importing anything that builds an engine. +load_dotenv(_REPO_ROOT / "backend" / ".env") + +from sqlmodel import Session, col, delete, select # noqa: E402 + +from backend.app.db.connection import db_engine # noqa: E402 +from backend.documents_parser.elmhurst_extractor import ( # noqa: E402 + ElmhurstSiteNotesExtractor, +) +from datatypes.epc.domain.epc_property_data import EpcPropertyData # noqa: E402 +from datatypes.epc.domain.mapper import EpcPropertyDataMapper # noqa: E402 +from domain.sap10_calculator.calculator import calculate_sap_from_inputs # noqa: E402 +from domain.sap10_calculator.rdsap.cert_to_inputs import cert_to_inputs # noqa: E402 +from infrastructure.postgres.epc_property_table import ( # noqa: E402 + EpcBuildingPartModel, + EpcEnergyElementModel, + EpcFlatDetailsModel, + EpcFloorDimensionModel, + EpcMainHeatingDetailModel, + EpcPhotovoltaicArrayModel, + EpcPropertyEnergyPerformanceModel, + EpcPropertyModel, + EpcRenewableHeatIncentiveModel, + EpcWindowModel, +) +from infrastructure.postgres.uploaded_file_table import ( # noqa: E402 + FileSourceEnum, + FileTypeEnum, + UploadedFile, +) +from repositories.epc.epc_postgres_repository import EpcPostgresRepository # noqa: E402 +from utils.s3 import upload_file_to_s3 # noqa: E402 +from utils.sharepoint.domna_sharepoint_client import DomnaSharepointClient # noqa: E402 +from utils.sharepoint.domna_sites import DomnaSites # noqa: E402 +from utils.sharepoint.sharepoint_client import SharePointClient # noqa: E402 + +_SOURCE = "lodged" +_SHARED_DOCS_MARKER = "Shared Documents/" +# Every epc_property child table, in child-before-parent delete order (floor +# dimensions handled separately as they key on building_part, not epc_property). +_CHILD_MODELS = ( + EpcPropertyEnergyPerformanceModel, + EpcEnergyElementModel, + EpcMainHeatingDetailModel, + EpcBuildingPartModel, + EpcWindowModel, + EpcPhotovoltaicArrayModel, + EpcFlatDetailsModel, + EpcRenewableHeatIncentiveModel, +) + + +def _drive_relative_path(sharepoint_url: str) -> Optional[str]: + """Extract the drive-relative folder path from a SharePoint AllItems URL. + + The URL carries the server-relative folder in its `RootFolder` query param + (e.g. `/sites/SocialHousing/Shared Documents/.../10 Deptford Avenue M23 2XA`); + the Graph drive root is the site's "Shared Documents" library, so everything + up to and including `Shared Documents/` is stripped. + """ + query = urllib.parse.urlparse(sharepoint_url).query + params = urllib.parse.parse_qs(query) + root_values = params.get("RootFolder") + if not root_values: + return None + root = urllib.parse.unquote(root_values[0]) + idx = root.find(_SHARED_DOCS_MARKER) + return root[idx + len(_SHARED_DOCS_MARKER):] if idx >= 0 else root.lstrip("/") + + +def _find_summary_pdf( + client: SharePointClient, folder: str, depth: int = 0, maxdepth: int = 2 +) -> list[str]: + """Return drive-relative paths of every PDF whose basename contains "summary" + (case-insensitive), searching `folder` and up to `maxdepth` subfolders. + + The Elmhurst summary is named inconsistently — "Summary .pdf" or + " Summary.pdf", sometimes with stray spaces — so "summary" anywhere in + the basename is the picker, deliberately excluding " Report.pdf" (the + customer EPC report) and "Energy performance certificate (EPC) ...pdf". + """ + found: list[str] = [] + listing: dict[str, Any] = client.list_folder_contents(folder, page_size=500) + for item in listing.get("value", []): + name: str = item["name"] + if "folder" in item: + if depth < maxdepth: + found += _find_summary_pdf( + client, f"{folder}/{name}", depth + 1, maxdepth + ) + elif name.lower().endswith(".pdf") and "summary" in name.lower(): + found.append(f"{folder}/{name}") + return found + + +def _pdf_to_pages(pdf_path: Path) -> list[str]: + """Render each PDF page to the textract-style token stream the extractor + expects (copied from scripts/run_elmhurst_summary.py).""" + info = subprocess.run( + ["pdfinfo", str(pdf_path)], capture_output=True, text=True, check=True + ).stdout + match = re.search(r"Pages:\s+(\d+)", info) + if match is None: + raise RuntimeError(f"Could not parse page count from {pdf_path}") + page_count = int(match.group(1)) + pages: list[str] = [] + for i in range(1, page_count + 1): + layout = subprocess.run( + ["pdftotext", "-layout", "-f", str(i), "-l", str(i), str(pdf_path), "-"], + capture_output=True, + text=True, + check=True, + ).stdout + tokens: list[str] = [] + for line in layout.splitlines(): + if not line.strip(): + tokens.append("") + continue + tokens += [p for p in re.split(r"\s{2,}", line.strip()) if p] + pages.append("\n".join(tokens)) + return pages + + +def _delete_epc_by_uprn(session: Session, uprn: int, source: str = _SOURCE) -> int: + """Delete every epc_property graph (parent + children) for (uprn, source), + so a re-run replaces rather than duplicates. Mirrors the repository's + per-property delete, but keyed on UPRN because these rows carry no + property_id (so the repo's own delete-by-property_id never fires).""" + epc_ids = [ + i + for i in session.exec( + select(EpcPropertyModel.id) + .where(EpcPropertyModel.uprn == uprn) + .where(EpcPropertyModel.source == source) + ).all() + if i is not None + ] + if not epc_ids: + return 0 + part_ids = [ + i + for i in session.exec( + select(EpcBuildingPartModel.id).where( + col(EpcBuildingPartModel.epc_property_id).in_(epc_ids) + ) + ).all() + if i is not None + ] + if part_ids: + session.exec( # type: ignore[call-overload] + delete(EpcFloorDimensionModel).where( + col(EpcFloorDimensionModel.epc_building_part_id).in_(part_ids) + ) + ) + for child in _CHILD_MODELS: + session.exec( # type: ignore[call-overload] + delete(child).where(col(child.epc_property_id).in_(epc_ids)) + ) + session.exec( # type: ignore[call-overload] + delete(EpcPropertyModel).where(col(EpcPropertyModel.id).in_(epc_ids)) + ) + return len(epc_ids) + + +def _persist( + session: Session, + *, + epc: EpcPropertyData, + uprn: int, + pdf_path: Path, + bucket: str, +) -> tuple[int, int]: + """Push the PDF to S3, record an uploaded_files row, replace-save the EPC + graph keyed on UPRN, and link uploaded_file_id. Returns (uploaded_file_id, + epc_property_id). Caller owns the transaction.""" + key = f"documents/uprn/{uprn}/{pdf_path.name}" + upload_file_to_s3(str(pdf_path), bucket, key) + + # Replace any prior uploaded_files row for this uprn + Elmhurst-summary slot + # so re-runs stay idempotent (the S3 key is deterministic, so it overwrites). + session.exec( # type: ignore[call-overload] + delete(UploadedFile) + .where(col(UploadedFile.uprn) == uprn) + .where(col(UploadedFile.file_source) == FileSourceEnum.SHAREPOINT.value) + .where(col(UploadedFile.file_type) == FileTypeEnum.RD_SAP_SITE_NOTE.value) + ) + uploaded_file = UploadedFile( + s3_file_bucket=bucket, + s3_file_key=key, + s3_upload_timestamp=datetime.now(timezone.utc), + uprn=uprn, + file_source=FileSourceEnum.SHAREPOINT.value, + file_type=FileTypeEnum.RD_SAP_SITE_NOTE.value, + ) + session.add(uploaded_file) + session.flush() + uploaded_file_id = int(uploaded_file.id) # type: ignore[arg-type] + + _delete_epc_by_uprn(session, uprn, _SOURCE) + epc_property_id = EpcPostgresRepository(session).save( + epc, property_id=None, source=_SOURCE + ) + + model = session.get(EpcPropertyModel, epc_property_id) + if model is not None: + model.uploaded_file_id = uploaded_file_id + session.add(model) + return uploaded_file_id, epc_property_id + + +def _process_row( + client: DomnaSharepointClient, + raw_client: SharePointClient, + *, + uprn: int, + folder: str, + tmp_dir: Path, +) -> tuple[EpcPropertyData, int, Path]: + """Download -> extract -> map -> stamp UPRN. Returns + (epc, elmhurst_current_sap, local_pdf_path). Raises FileNotFoundError when + there is no summary PDF / the download fails; any other exception is an + extractor / mapper / calc failure.""" + summaries = _find_summary_pdf(raw_client, folder) + if not summaries: + raise FileNotFoundError("no summary PDF in folder") + if len(summaries) > 1: + print(f" ! {len(summaries)} summary PDFs, using first: {summaries}") + sp_path = summaries[0] + + local = tmp_dir / f"{uprn}_{Path(sp_path).name}" + if not client.download_file(sp_path, str(local)): + raise FileNotFoundError(f"download failed: {sp_path}") + + site_notes = ElmhurstSiteNotesExtractor(_pdf_to_pages(local)).extract() + epc = EpcPropertyDataMapper.from_elmhurst_site_notes(site_notes) + epc = replace(epc, uprn=uprn) # summary carries no UPRN; use the sheet's + return epc, site_notes.current_sap_rating, local + + +def _read_rows(xlsx_path: Path) -> list[dict[str, Any]]: + import openpyxl + + workbook = openpyxl.load_workbook(xlsx_path, read_only=True) + sheet = workbook.worksheets[0] + rows = list(sheet.iter_rows(values_only=True)) + header = [str(h) for h in rows[0]] + + def idx(name: str) -> int: + return header.index(name) + + i_rec, i_addr, i_url, i_uprn = ( + idx("Record ID"), + idx("Clean Address"), + idx("Sharepoint URL"), + idx("UPRN"), + ) + out: list[dict[str, Any]] = [] + for r in rows[1:]: + out.append( + { + "record_id": r[i_rec], + "address": r[i_addr], + "url": r[i_url], + "uprn": r[i_uprn], + } + ) + return out + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--xlsx", required=True, type=Path) + parser.add_argument("--out", required=True, type=Path, help="accuracy CSV path") + parser.add_argument("--limit", type=int, default=None, help="first N rows only") + parser.add_argument( + "--commit", + action="store_true", + help="write to S3 + DB (default: dry run, report only)", + ) + args = parser.parse_args() + + bucket = os.environ["ENERGY_ASSESSMENTS_BUCKET"] + site = DomnaSites.SOCIAL_HOUSING + assert site.value, "SOCIAL_HOUSING_SHAREPOINT_ID env var is not set" + + client = DomnaSharepointClient(sharepoint_location=site) + raw_client = SharePointClient( + tenant_id=os.environ["SHAREPOINT_TENANT_ID"], + client_id=os.environ["SHAREPOINT_CLIENT_ID"], + client_secret=os.environ["SHAREPOINT_CLIENT_SECRET"], + site_id=str(site.value), + ) + + rows = _read_rows(args.xlsx) + if args.limit is not None: + rows = rows[: args.limit] + + tmp_dir = Path("/tmp/wchg_elmhurst") + tmp_dir.mkdir(parents=True, exist_ok=True) + + engine = db_engine + host = str(engine.url.host) + redacted_host = host[:6] + "…" if len(host) > 6 else host + db_note = "" + try: + with Session(engine) as preflight: + existing = preflight.exec( + select(EpcPropertyModel.id).where( + col(EpcPropertyModel.source) == _SOURCE + ) + ).all() + db_note = f"{len(existing)} existing lodged epc_property rows" + except Exception as e: # dry run doesn't need the DB — just note it + if args.commit: + raise + db_note = f"UNREACHABLE ({type(e).__name__}) — fine for dry run" + print("=" * 68) + print(f" MODE : {'COMMIT (writes to prod)' if args.commit else 'DRY RUN (no writes)'}") + print(f" DB host : {redacted_host} db={engine.url.database}") + print(f" DB preflight : {db_note}") + print(f" S3 bucket : {bucket}") + print(f" rows to process: {len(rows)}") + print("=" * 68) + + results: list[dict[str, Any]] = [] + deltas: list[float] = [] + n_ok = n_within = 0 + + for n, row in enumerate(rows, 1): + rec = str(row["record_id"]) + address = str(row["address"]) + uprn_raw = row["uprn"] + url = row["url"] + base = {"record_id": rec, "address": address, "uprn": uprn_raw} + + if not url: + results.append({**base, "status": "NO_URL"}) + print(f"[{n}/{len(rows)}] NO_URL {address}") + continue + try: + uprn = int(str(uprn_raw).strip()) + except (TypeError, ValueError): + results.append({**base, "status": "NO_UPRN", "error": repr(uprn_raw)}) + print(f"[{n}/{len(rows)}] NO_UPRN {address} — {uprn_raw!r}") + continue + folder = _drive_relative_path(str(url)) + if folder is None: + results.append({**base, "status": "BAD_URL"}) + print(f"[{n}/{len(rows)}] BAD_URL {address}") + continue + + try: + epc, elmhurst_sap, pdf_path = _process_row( + client, + raw_client, + uprn=uprn, + folder=folder, + tmp_dir=tmp_dir, + ) + result = calculate_sap_from_inputs(cert_to_inputs(epc)) + computed = result.sap_score_continuous + delta = computed - elmhurst_sap + within = abs(delta) < 0.5 + deltas.append(abs(delta)) + n_ok += 1 + n_within += int(within) + + epc_property_id: Optional[int] = None + if args.commit: + with Session(engine) as session: + try: + _, epc_property_id = _persist( + session, + epc=epc, + uprn=uprn, + pdf_path=pdf_path, + bucket=bucket, + ) + session.commit() + except Exception: + session.rollback() + raise + + results.append( + { + **base, + "status": "OK", + "elmhurst_current_sap": elmhurst_sap, + "computed_continuous": round(computed, 4), + "computed_int": result.sap_score, + "delta": round(delta, 4), + "within_0_5": within, + "tfa_m2": epc.total_floor_area_m2, + "dwelling_type": epc.dwelling_type, + "epc_property_id": epc_property_id, + } + ) + flag = "✓" if within else "✗" + print( + f"[{n}/{len(rows)}] OK {flag} elm={elmhurst_sap:>3} " + f"ours={computed:6.2f} Δ={delta:+.2f} {address}" + ) + except FileNotFoundError as e: + results.append({**base, "status": "NO_SUMMARY", "error": str(e)}) + print(f"[{n}/{len(rows)}] NO_SUMMARY {address} — {e}") + except Exception as e: # extractor / mapper / calc / DB failure + results.append( + {**base, "status": "EXTRACT_ERROR", "error": f"{type(e).__name__}: {e}"} + ) + print( + f"[{n}/{len(rows)}] EXTRACT_ERROR {address} — {type(e).__name__}: {e}" + ) + + _write_report(args.out, results) + + mae = sum(deltas) / len(deltas) if deltas else 0.0 + within_pct = 100.0 * n_within / n_ok if n_ok else 0.0 + print("=" * 68) + print(f" processed OK : {n_ok}") + print(f" within 0.5 (int match): {n_within}/{n_ok} ({within_pct:.1f}%)") + print(f" MAE : {mae:.4f}") + print(f" report written : {args.out}") + if not args.commit: + print(" (dry run — pass --commit to write to S3 + DB)") + print("=" * 68) + + +def _write_report(path: Path, results: list[dict[str, Any]]) -> None: + fields = [ + "record_id", + "address", + "uprn", + "status", + "elmhurst_current_sap", + "computed_continuous", + "computed_int", + "delta", + "within_0_5", + "tfa_m2", + "dwelling_type", + "epc_property_id", + "error", + ] + with open(path, "w", newline="") as f: + writer = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore") + writer.writeheader() + for r in results: + writer.writerow(r) + + +if __name__ == "__main__": + main() diff --git a/tests/applications/abri/test_abri_trigger_request.py b/tests/applications/abri/test_abri_trigger_request.py index 5d723e3f0..928c6973a 100644 --- a/tests/applications/abri/test_abri_trigger_request.py +++ b/tests/applications/abri/test_abri_trigger_request.py @@ -15,6 +15,7 @@ def _full_message() -> Dict[str, Any]: "deal_name": "49 Admers Crescent", "confirmed_survey_date": "2026-06-24", "confirmed_survey_time": "14:30", + "third_party_surveyor_identifier": "THIRDPARTY", } @@ -29,6 +30,7 @@ def test_a_full_message_parses_into_a_typed_request() -> None: assert request.deal_name == "49 Admers Crescent" assert request.confirmed_survey_date == date(2026, 6, 24) assert request.confirmed_survey_time == "14:30" + assert request.third_party_surveyor_identifier == "THIRDPARTY" @pytest.mark.parametrize( @@ -37,7 +39,9 @@ def test_a_full_message_parses_into_a_typed_request() -> None: ("log_job", "place_ref"), ("log_job", "deal_name"), ("log_job", "confirmed_survey_date"), + ("log_job", "third_party_surveyor_identifier"), ("amend_job", "confirmed_survey_date"), + ("amend_job", "third_party_surveyor_identifier"), ("sync_tenant_data", "place_ref"), ], ) @@ -97,6 +101,20 @@ def test_a_message_naming_abandon_job_validates_with_only_the_deal_id() -> None: assert request.flows == ["abandon_job"] +@pytest.mark.parametrize("blank", ["", " "]) +def test_a_blank_surveyor_identifier_is_treated_as_missing(blank: str) -> None: + # A blank resource does not error at the relay: OpenHousing logs the job + # but silently drops the appointment. Treat blank as missing so the + # per-flow validation fails loudly instead. + message = _full_message() + message["flows"] = ["log_job"] + message["third_party_surveyor_identifier"] = blank + + # Act / Assert + with pytest.raises(ValidationError, match="third_party_surveyor_identifier"): + AbriTriggerRequest.model_validate(message) + + def test_a_message_carries_the_outcome_for_the_abandonment_reason_mapping() -> None: # Arrange message = _full_message() diff --git a/tests/applications/abri/test_dispatch.py b/tests/applications/abri/test_dispatch.py index 4b7090ae2..7d898b155 100644 --- a/tests/applications/abri/test_dispatch.py +++ b/tests/applications/abri/test_dispatch.py @@ -40,6 +40,7 @@ def _request(flows: List[str]) -> AbriTriggerRequest: "confirmed_survey_time": "14:30", "last_submission_date": "2026-07-01", "outcome": "no answer", + "third_party_surveyor_identifier": "THIRDPARTY", } ) @@ -171,6 +172,7 @@ def test_flows_receive_the_deal_fields_carried_by_the_message( deal_id=DEAL_ID, confirmed_survey_date=date(2026, 6, 24), confirmed_survey_time="14:30", + third_party_surveyor_identifier="THIRDPARTY", ), ) assert log_call == ( @@ -181,6 +183,7 @@ def test_flows_receive_the_deal_fields_carried_by_the_message( deal_name="49 Admers Crescent", confirmed_survey_date=date(2026, 6, 24), confirmed_survey_time="14:30", + third_party_surveyor_identifier="THIRDPARTY", ), ) diff --git a/tests/datatypes/epc/domain/test_epc.py b/tests/datatypes/epc/domain/test_epc.py index 474c5e890..8731c5af3 100644 --- a/tests/datatypes/epc/domain/test_epc.py +++ b/tests/datatypes/epc/domain/test_epc.py @@ -4,6 +4,8 @@ target).""" from __future__ import annotations +from decimal import ROUND_HALF_UP, Decimal + import pytest from datatypes.epc.domain.epc import Epc @@ -24,3 +26,41 @@ def test_sap_lower_bound_returns_the_band_floor() -> None: def test_band_floor_round_trips_through_from_sap_score(band: Epc) -> None: # Act / Assert — a band's floor scores back to that band. assert Epc.from_sap_score(band.sap_lower_bound()) is band + + +def test_a_continuous_score_bands_on_its_published_rating() -> None: + # Arrange — callers holding a continuous SAP want the band the dwelling + # would be *published* in, which means rounding half up. Rounding half to + # even (Python's `round`) drops an exact x.5 at a band floor into the band + # below: a continuous 68.5 is published SAP 69 and so band C, not band D. + + # Act / Assert — the half point carries the score into the band above. + assert Epc.from_sap_continuous(68.5) is Epc.C + assert Epc.from_sap_continuous(54.5) is Epc.D + # And either side of a floor still bands the obvious way. + assert Epc.from_sap_continuous(68.49) is Epc.D + assert Epc.from_sap_continuous(69.4) is Epc.C + + +@pytest.mark.parametrize("band", list(Epc)) +def test_continuous_band_floor_is_where_the_published_rating_enters_the_band( + band: Epc, +) -> None: + # Arrange — the Optimiser judges "reached band X" on the calculator's + # *continuous* SAP, but a dwelling is in a band by its *published* rating + # (the half-up-rounded integer). The continuous floor is the point those two + # agree: the lowest continuous score whose published rating is in the band. + # Asserted against the real publishing path (round half up → from_sap_score) + # rather than an arithmetic literal, so the two cannot drift apart. + def published_band(continuous: float) -> Epc: + rounded = int(Decimal(continuous).quantize(Decimal("1"), rounding=ROUND_HALF_UP)) + return Epc.from_sap_score(rounded) + + # Act + continuous_floor: float = band.sap_lower_bound_continuous() + + # Assert — at the floor the dwelling publishes into the band; a hair below + # it publishes into a worse one. (Band G has no worse band to fall into.) + assert published_band(continuous_floor) is band + if band is not Epc.G: + assert published_band(continuous_floor - 0.01) is not band diff --git a/tests/datatypes/epc/domain/test_mapper_rir_gable_terraced.py b/tests/datatypes/epc/domain/test_mapper_rir_gable_terraced.py new file mode 100644 index 000000000..367ba6e31 --- /dev/null +++ b/tests/datatypes/epc/domain/test_mapper_rir_gable_terraced.py @@ -0,0 +1,65 @@ +"""Mapper boundary: a room-in-roof gable lodged "Exposed" on a both-ends-party +terraced form must be reclassified to a Party gable (U=0.25), not billed as an +external wall (main-wall U ~2.5). + +RdSAP 10 §1.1 (p.7-8): a mid-terrace has external walls on its two *opposite* +(front/rear) faces only; both end/gable elevations — and their room-in-roof +continuations — abut the neighbours and are party walls (§1.4.3 p.9). Table 4 +(p.22) bills a Party RR gable at U=0.25; an Exposed gable "as common wall". +S10TP-05 Appendix A independently tabulates the roof-gable junction length as +zero for a mid-terrace (Detached 15.6 m, Semi 7.2 m, **Mid-terrace 0**), and +three accredited Elmhurst mid-terrace worksheets (000477/000480/000516) lodge +their gables as Party. So a mid/enclosed-mid terrace lodging an Exposed RR +gable is itself the data anomaly. + +Surfaced by corpus cert 100040550095 (mid-terrace, built_form 4): its Type-2 +RR `gable_wall_type_1 = 1` (Exposed) was billed at the masonry main-wall U +(19.32 m² × 2.5 = 48.3 W/K), over-counting fabric → SAP 29.87 vs lodged 40 +(-10.13). Reclassifying it to a Party gable (0.25 × 19.32 = 4.83 W/K) lands +SAP 40 / PE 189, matching lodged. The correction is scoped to the both-ends- +party forms {4 Mid-Terrace, 6 Enclosed Mid-Terrace}; end-terrace / semi / +detached forms keep their genuine Exposed gable. +""" + +from datatypes.epc.domain.mapper import ( + _api_type_1_gable_kind, # pyright: ignore[reportPrivateUsage] +) + +_EXPOSED = 1 +_PARTY = 0 + + +class TestApiRirGableTerraced: + def test_mid_terrace_exposed_gable_reclassified_to_party(self) -> None: + # built_form 4 = Mid-Terrace: both gable ends are party. + assert _api_type_1_gable_kind(_EXPOSED, built_form=4) == "gable_wall" + + def test_enclosed_mid_terrace_exposed_gable_reclassified_to_party(self) -> None: + # built_form 6 = Enclosed Mid-Terrace: both gable ends party. + assert _api_type_1_gable_kind(_EXPOSED, built_form=6) == "gable_wall" + + def test_end_terrace_exposed_gable_stays_external(self) -> None: + # built_form 3 = End-Terrace: the outer gable is genuinely exposed. + assert _api_type_1_gable_kind(_EXPOSED, built_form=3) == "gable_wall_external" + + def test_enclosed_end_terrace_exposed_gable_stays_external(self) -> None: + # built_form 5 = Enclosed End-Terrace: one genuine exposed gable. + assert _api_type_1_gable_kind(_EXPOSED, built_form=5) == "gable_wall_external" + + def test_semi_detached_exposed_gable_stays_external(self) -> None: + assert _api_type_1_gable_kind(_EXPOSED, built_form=2) == "gable_wall_external" + + def test_detached_exposed_gable_stays_external(self) -> None: + assert _api_type_1_gable_kind(_EXPOSED, built_form=1) == "gable_wall_external" + + def test_unknown_built_form_exposed_gable_unchanged(self) -> None: + # No built form → conservative: keep the lodged Exposed classification. + assert _api_type_1_gable_kind(_EXPOSED, built_form=None) == "gable_wall_external" + + def test_party_gable_unchanged_on_mid_terrace(self) -> None: + # A lodged Party gable stays Party regardless of built form. + assert _api_type_1_gable_kind(_PARTY, built_form=4) == "gable_wall" + + def test_default_call_without_built_form_backwards_compatible(self) -> None: + # The pre-existing single-arg contract still resolves Exposed → external. + assert _api_type_1_gable_kind(_EXPOSED) == "gable_wall_external" diff --git a/tests/datatypes/epc/domain/test_mapper_ventilation_piv_loft.py b/tests/datatypes/epc/domain/test_mapper_ventilation_piv_loft.py new file mode 100644 index 000000000..60dc529e7 --- /dev/null +++ b/tests/datatypes/epc/domain/test_mapper_ventilation_piv_loft.py @@ -0,0 +1,24 @@ +"""Mapper boundary: the Elmhurst §12.1 "Positive input from loft" mechanical- +ventilation label. + +SAP 10.2 §2 (24d) treats positive input ventilation sourced from the LOFT as +natural ventilation — unlike PIV from OUTSIDE, which is whole-house extract and +resolves to EXTRACT_OR_PIV_OUTSIDE / (24c). The MechanicalVentilationKind.NATURAL +docstring states the loft case explicitly. Before this mapping existed the label +raised UnmappedElmhurstLabel, blocking the whole Summary (surfaced across 8 WCHG +Elmhurst certs). +""" + +from datatypes.epc.domain.mapper import ( + _elmhurst_mv_kind, # pyright: ignore[reportPrivateUsage] +) + + +def test_positive_input_from_loft_maps_to_natural() -> None: + # Arrange — the Elmhurst §12.1 PIV-from-loft ventilation label. + + # Act + kind = _elmhurst_mv_kind("Positive input from loft") + + # Assert — SAP 10.2 §2 (24d): loft-sourced PIV is treated as natural vent. + assert kind == "NATURAL" diff --git a/tests/domain/sap10_calculator/rdsap/test_cert_to_inputs.py b/tests/domain/sap10_calculator/rdsap/test_cert_to_inputs.py index 578cb67de..d1c31bace 100644 --- a/tests/domain/sap10_calculator/rdsap/test_cert_to_inputs.py +++ b/tests/domain/sap10_calculator/rdsap/test_cert_to_inputs.py @@ -45,7 +45,11 @@ from domain.sap10_ml.tests._fixtures import ( make_sap_heating, make_window, ) -from domain.sap10_calculator.calculator import Sap10Calculator, SapResult +from domain.sap10_calculator.calculator import ( + Sap10Calculator, + SapResult, + calculate_sap_from_inputs, +) from domain.sap10_calculator.exceptions import ( MissingMainFuelType, UnmappedSapCode, @@ -69,6 +73,8 @@ from domain.sap10_calculator.rdsap.cert_to_inputs import ( _TABLE_4G_DEFAULT_MEV_SFP_W_PER_L_PER_S, # pyright: ignore[reportPrivateUsage] dimensions_from_cert, fuel_cost_section_from_cert, + _fuel_cost_gbp_per_kwh, # pyright: ignore[reportPrivateUsage] + RDSAP_10_TABLE_32_PRICES, # pyright: ignore[reportPrivateUsage] _table_12_factor_fuel_code, # pyright: ignore[reportPrivateUsage] _table_12a_system_for_main, # pyright: ignore[reportPrivateUsage] _is_electric_main, # pyright: ignore[reportPrivateUsage] @@ -252,6 +258,50 @@ def test_thermal_mass_wall_code_8_is_park_home_only_when_property_type_says_so() assert abs(tmp_system_built - 250.0) <= 1e-9 +def test_community_heating_dhw_bills_at_network_rate_not_lodged_fuel() -> None: + # Arrange — a community heat-network main (Table 4a code 301, cat 6) whose + # DHW is heated by the network (WHC 901, "from the main system") but whose + # lodged HW fuel is the Elmhurst "Mains gas" (26) placeholder. SAP 10.2 §C3 + # bills network heat — space AND water — at the network's own Table-12 rate, + # so the DHW must inherit the main's heat-network rate, not the lodged fuel's. + main = MainHeatingDetail( + has_fghrs=False, + main_fuel_type=20, # mains gas (community) + heat_emitter_type=1, + emitter_temperature=1, + main_heating_control=2306, + main_heating_category=6, + sap_main_heating_code=301, + ) + epc = make_minimal_sap10_epc( + total_floor_area_m2=_TYPICAL_TFA_M2, + habitable_rooms_count=4, + country_code="ENG", + sap_building_parts=[make_building_part(construction_age_band="E")], + sap_heating=make_sap_heating( + main_heating_details=[main], + water_heating_code=901, # DHW from the main (heat network) + water_heating_fuel=26, # Elmhurst "Mains gas" placeholder + ), + ) + + # Act + section = fuel_cost_section_from_cert(epc) + + # Assert — total DHW cost is priced at the main's heat-network rate, NOT the + # lodged mains-gas rate. Network fuel is single-rate, so (245)+(246)+(247) = + # HW kWh x network rate. + assert section is not None + hw_kwh = calculate_sap_from_inputs(cert_to_inputs(epc)).hot_water_kwh_per_yr + total_water_cost_gbp = ( + section.water_high_rate_cost_gbp + + section.water_low_rate_cost_gbp + + section.water_other_fuel_cost_gbp + ) + network_rate = _fuel_cost_gbp_per_kwh(main, RDSAP_10_TABLE_32_PRICES) + assert total_water_cost_gbp == pytest.approx(hw_kwh * network_rate, rel=1e-6) + + def test_heat_network_main_applies_table12c_dlf_to_main_heating_efficiency() -> None: # Arrange — heat-network main heating (Table 4a code 301 = community # heating with CHP/boilers; main_heating_category=6). Cert age band @@ -962,6 +1012,61 @@ def test_off_peak_immersion_unlodged_type_defaults_to_dual_table13_blend() -> No assert inputs.hot_water_high_rate_fraction == pytest.approx(_frac_from_cost) +def test_electric_immersion_dhw_not_billed_at_gas_boiler_efficiency() -> None: + # Arrange — a separate electric immersion heater (WHC 903) is 100% efficient + # (SAP 10.2 Table 4a) and the boiler provides no water heating, so Appendix + # D2.1 Eq D1 (the boiler seasonal-efficiency cascade) does not apply. But + # `_water_heating_main` resolves to the SPACE main — a gas combi keeps its + # PCDB record — so pre-fix both the scalar water efficiency and the Eq-D1 + # winter/summer pair billed the immersion-heated cylinder at the boiler's + # ~87% summer efficiency (a mongrel: electric fuel price × gas-boiler + # efficiency). Fires for #1600's no-water-heating default (WHC 999 -> 903) + # on a gas-boiler main — 58 Hackle St M11 4WU (SAP 55.30 -> 57.67). + from dataclasses import replace + + pcdb_gas_boiler = replace( + _gas_boiler_detail(sap_main_heating_code=102), + # PCDB gas combi (winter 88.7% / summer 87.0%) — a real record so the + # buggy branches would have summer-efficiency data to (wrongly) apply. + main_heating_index_number=16839, + ) + boiler_epc = _cylinder_epc(cylinder_size=2, main=pcdb_gas_boiler) + boiler_epc = replace( + boiler_epc, + sap_heating=replace( + boiler_epc.sap_heating, water_heating_code=903, water_heating_fuel=29 + ), + ) + + # A non-boiler electric main (SAP code 401, no PCDB record) is the reference + # for a correctly-billed 100%-efficient immersion: Eq D1 cannot engage. + electric_main = MainHeatingDetail( + has_fghrs=False, + main_fuel_type=29, + heat_emitter_type=0, + emitter_temperature=1, + main_heating_control=2401, + main_heating_category=7, + sap_main_heating_code=401, + ) + electric_epc = replace( + boiler_epc, + sap_heating=replace(boiler_epc.sap_heating, main_heating_details=[electric_main]), + ) + + # Act + boiler_inputs = cert_to_inputs(boiler_epc) + electric_inputs = cert_to_inputs(electric_epc) + + # Assert — the immersion DHW energy is identical whether the SPACE main is a + # PCDB gas boiler or a non-boiler electric system: the boiler's efficiency + # never touches the immersion-heated cylinder. Pre-fix the boiler variant was + # inflated by ~1/0.878. + assert boiler_inputs.hot_water_kwh_per_yr == pytest.approx( + electric_inputs.hot_water_kwh_per_yr + ) + + def test_non_integrated_storage_heater_bills_100_percent_low_rate() -> None: # Arrange — same off-peak storage cert but SAP code 401 ("other storage # heaters"): Table 12a Grid 1 gives a 0.00 high-rate fraction → the heat diff --git a/tests/domain/sap10_calculator/rdsap/test_golden_fixtures.py b/tests/domain/sap10_calculator/rdsap/test_golden_fixtures.py index a01b25e8e..b4166d3f5 100644 --- a/tests/domain/sap10_calculator/rdsap/test_golden_fixtures.py +++ b/tests/domain/sap10_calculator/rdsap/test_golden_fixtures.py @@ -306,8 +306,8 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = ( cert_number="6035-7729-2309-0879-2296", actual_sap=70, expected_sap_resid=+0, - expected_pe_resid_kwh_per_m2=-0.1357, - expected_co2_resid_tonnes_per_yr=-0.0362, + expected_pe_resid_kwh_per_m2=-0.9246, + expected_co2_resid_tonnes_per_yr=-0.0549, notes=( "Mid-terrace, TFA 128, age A, gas combi Table 4b code 104. " "S0380.189 fixed the dominant driver: walls are solid brick " @@ -367,7 +367,16 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = ( "PE +1.37 → -0.14, CO2 -0.0004 → -0.0362 (SAP still exact 70). " "Validated against the simulated-case-6 worksheet, the only " "worksheet evidence for 'Roof of Room' rooflight deduction " - "(6035's site-notes case-4 replica lodges no rooflights)." + "(6035's site-notes case-4 replica lodges no rooflights). " + "This PR (terraced RR-gable reclassification) re-pins PE/CO2: " + "6035 is built_form 4 (Mid-Terrace), so both RR gables are " + "party (RdSAP 10 §1.4.3) — the mapper now routes its Exposed " + "Type-1 gable to gable_wall (U=0.25) instead of the main-wall " + "U. Heat loss drops → PE -0.14 → -0.92, CO2 -0.0362 → -0.0549 " + "(SAP still exact 70). Residuals stay well within noise (PE " + "<0.5% of lodged 191); corroborated by three accredited " + "Elmhurst mid-terrace worksheets (000477/000480/000516) that " + "all lodge RR gables as Party." ), ), _GoldenExpectation( diff --git a/tests/domain/sap10_calculator/worksheet/test_rating.py b/tests/domain/sap10_calculator/worksheet/test_rating.py index 8eccda886..3867abe9f 100644 --- a/tests/domain/sap10_calculator/worksheet/test_rating.py +++ b/tests/domain/sap10_calculator/worksheet/test_rating.py @@ -109,6 +109,29 @@ def test_sap_rating_integer_rounds_to_nearest_and_clamps_to_minimum_one() -> Non assert catastrophic == 1 +def test_sap_rating_integer_rounds_a_half_point_up_not_to_even() -> None: + # Arrange — §13 "rounded to the nearest integer" is half-UP under SAP, the + # convention the mapper already follows (`_round_half_up_2dp`). Python's + # built-in `round` is half-to-EVEN, so it drops an exact x.5 to x whenever x + # is even. That bites hardest at the band floors, where one point is a whole + # band: a continuous 68.5 must publish as SAP 69 (band C), not 68 (band D). + # The linear branch (9) inverts exactly, so these ECFs land on a true .5: + # ECF = (100 − 68.5) / 13.95 → SAP 68.5 (band C floor) + # ECF = (100 − 54.5) / 13.95 → SAP 54.5 (band D floor) + ecf_at_band_c_floor = (100.0 - 68.5) / 13.95 + ecf_at_band_d_floor = (100.0 - 54.5) / 13.95 + assert sap_rating(ecf=ecf_at_band_c_floor) == 68.5 + assert sap_rating(ecf=ecf_at_band_d_floor) == 54.5 + + # Act + at_band_c_floor = sap_rating_integer(ecf=ecf_at_band_c_floor) + at_band_d_floor = sap_rating_integer(ecf=ecf_at_band_d_floor) + + # Assert — the half point rounds up into the band above. + assert at_band_c_floor == 69 + assert at_band_d_floor == 55 + + def test_environmental_impact_rating_linear_branch_below_threshold() -> None: # Arrange — Equations (10)/(12): CF = CO2/(TFA+45); when CF < 28.3, # EI = 100 − 1.34 × CF. For a 100 m² home emitting 1500 kg CO2/yr: diff --git a/tests/harness/test_report.py b/tests/harness/test_report.py index 84330584e..a89c79943 100644 --- a/tests/harness/test_report.py +++ b/tests/harness/test_report.py @@ -30,13 +30,20 @@ _GOLDEN = ( _WITHIN_TOLERANCE = "0036-6325-1100-0063-1226" _DIVERGENT = "0240-0200-5706-2365-8010" -# 0390 fires three measures — an uninsulated solid floor, low-energy lighting, +# 0380 fires three measures — an uninsulated solid floor, low-energy lighting, # and the ASHP bundle — so every fired measure's trigger attributes are -# exercised together. (0330, the previous fixture, now reaches band C on the -# correctly-sized ASHP alone: ADR-0049 sizes the pump to the dwelling's design -# heat loss, so the undersized-pump-era companion solid_floor_insulation is no -# longer needed there.) -_THREE_MEASURES = "0390-2254-6420-2126-5561" +# exercised together. +# +# Fixture history, both times because the *package* changed rather than the +# trigger logic under test: +# 0330 -> 0390: ADR-0049 sizes the pump to the dwelling's design heat loss, so +# the undersized-pump-era companion solid_floor_insulation stopped firing. +# 0390 -> 0380: ADR-0064 judges the goal band on the *published* rating, so +# 0390's floor+ASHP package (post 68.772, published 69 = band C) now meets +# the target and no longer buys low-energy lighting to clear an integer 69. +# 0380 reaches band C at post 74.4 — clear of a band floor, so it does not ride +# on the rounding rule it is standing in for. +_THREE_MEASURES = "0380-2530-6150-2326-4161" def _triggers_by_measure(report: PropertyReport) -> dict[str, MeasureTrigger]: diff --git a/tests/infrastructure/abri/test_abri_client.py b/tests/infrastructure/abri/test_abri_client.py index 42ede432a..cf6308863 100644 --- a/tests/infrastructure/abri/test_abri_client.py +++ b/tests/infrastructure/abri/test_abri_client.py @@ -28,7 +28,6 @@ CONFIG = AbriConfig( endpoint_url=ENDPOINT_URL, username="DomnaWeb", password="", - default_resource="NAULKH", ) @@ -52,6 +51,7 @@ def _spec_example_request() -> LogJobRequest: appointment_time="PM", short_description="Christian's SCS External Test.", long_description="Christian's SCS External Test.", + resource="NAULKH", ) @@ -60,6 +60,7 @@ def _spec_example_amend_request() -> AmendJobRequest: job_no="AC0439951", appointment_date=date(2026, 6, 19), appointment_time="PM", + resource="NAULKH", ) @@ -145,6 +146,38 @@ def test_log_job_sends_the_recorded_logjob_envelope_to_the_relay_endpoint( ) +def test_log_job_books_the_job_against_the_requests_resource( + client: AbriClient, mock_session: MagicMock +) -> None: + # Arrange: the resource is mandatory on the request — the deal's + # third-party surveyor identifier — and is sent verbatim. + mock_session.post.return_value.content = _load_fixture( + "abri_relay_logjob_success_response.xml" + ) + + # Act + client.log_job( + LogJobRequest( + client_ref="DOM51111", + place_ref=PlaceRef("1007165"), + appointment_date=date(2026, 6, 18), + appointment_time="PM", + short_description="Christian's SCS External Test.", + long_description="Christian's SCS External Test.", + resource="THIRDPARTY", + ) + ) + + # Assert + sent_body: bytes = mock_session.post.call_args.kwargs["data"] + resources = [ + parameter.get("attribute_value") + for parameter in ET.fromstring(sent_body).findall(".//Parameters") + if parameter.get("attribute") == "resource" + ] + assert resources == ["THIRDPARTY"] + + def test_log_job_declares_the_xml_body_content_type_the_relay_requires( client: AbriClient, mock_session: MagicMock ) -> None: @@ -410,29 +443,6 @@ def test_amend_job_sends_the_recorded_amendoptiappt_envelope_to_the_relay_endpoi ) -def test_amend_job_defaults_the_resource_to_the_configured_surveyor( - client: AbriClient, mock_session: MagicMock -) -> None: - # Arrange: OpenHousing silently drops the appointment unless a bookable - # resource is sent, so an amend without an explicit surveyor falls back to - # the configured default rather than omitting the parameter. - mock_session.post.return_value.content = _load_fixture( - "abri_relay_amendoptiappt_success_response.xml" - ) - - # Act - client.amend_job(_spec_example_amend_request()) - - # Assert - sent_body: bytes = mock_session.post.call_args.kwargs["data"] - resources = [ - parameter.get("attribute_value") - for parameter in ET.fromstring(sent_body).findall(".//Parameters") - if parameter.get("attribute") == "resource" - ] - assert resources == [CONFIG.default_resource] - - # --- amend_job: rejection --- diff --git a/tests/infrastructure/abri/test_abri_config.py b/tests/infrastructure/abri/test_abri_config.py index 0884a14a3..63ea9c9f4 100644 --- a/tests/infrastructure/abri/test_abri_config.py +++ b/tests/infrastructure/abri/test_abri_config.py @@ -1,15 +1,12 @@ -import pytest - from infrastructure.abri.config import AbriConfig -def test_config_hydrates_relay_credentials_and_defaults_from_environment() -> None: +def test_config_hydrates_relay_credentials_from_environment() -> None: # Arrange env = { "ABRI_RELAY_URL": "https://relay.example.test/api/DomnaRelay?code=key", "ABRI_RELAY_USERNAME": "DomnaWeb", "ABRI_RELAY_PASSWORD": "secret", - "ABRI_RELAY_DEFAULT_RESOURCE": "CBRYAN", } # Act @@ -20,20 +17,4 @@ def test_config_hydrates_relay_credentials_and_defaults_from_environment() -> No endpoint_url="https://relay.example.test/api/DomnaRelay?code=key", username="DomnaWeb", password="secret", - default_resource="CBRYAN", ) - - -@pytest.mark.parametrize("blank", ["", " "]) -def test_config_rejects_a_blank_default_resource(blank: str) -> None: - # A blank resource does not error at the relay: OpenHousing logs the job - # but silently drops the appointment. Fail loudly at config load instead. - env = { - "ABRI_RELAY_URL": "https://relay.example.test/api/DomnaRelay?code=key", - "ABRI_RELAY_USERNAME": "DomnaWeb", - "ABRI_RELAY_PASSWORD": "secret", - "ABRI_RELAY_DEFAULT_RESOURCE": blank, - } - - with pytest.raises(ValueError, match="ABRI_RELAY_DEFAULT_RESOURCE"): - AbriConfig.from_env(env) diff --git a/tests/infrastructure/epc_client/test_sap_accuracy_corpus.py b/tests/infrastructure/epc_client/test_sap_accuracy_corpus.py index 2d9f27369..acca03161 100644 --- a/tests/infrastructure/epc_client/test_sap_accuracy_corpus.py +++ b/tests/infrastructure/epc_client/test_sap_accuracy_corpus.py @@ -260,14 +260,27 @@ _CORPUS = Path( # the plant efficiency C4 reserves for CO2/PE is a known follow-up. Spec- # verified against the SAP 10.2 PDF, not the ticket prose; unit-pinned in # test_cert_to_inputs (950/951/952 must bill identical DHW fuel). -# SHELTERED STAIRWELL SLICE (ratcheted 0.788 -> 0.798, MAE 0.626 -> 0.614): -# RdSAP 10 §5.9 (PDF p.43) sets the sheltered-wall buffer resistance by buffer -# TYPE — "Ru = 0.5 m²K/W for corridors and Ru = 2.1 m²K/W for stairwell". The -# buffer type is lodged on `SapFlatDetails.heat_loss_corridor` (0-based: 2 = -# unheated corridor, 3 = unheated stairwell), which was read NOWHERE under -# domain/, so every sheltered wall took the corridor 0.5 and every stairwell -# flat over-billed its sheltered wall. 23 corpus certs; within-0.5 +1.0pp. -_MIN_WITHIN_HALF_SAP = 0.796 +# 78.8% -> 79.5% (MAE 0.625 -> 0.599, PE 2.85 -> 2.71, CO2 0.070 -> 0.068) via +# the terraced room-in-roof gable fix (RdSAP 10 §1.1 p.7-8 + Table 4 p.22): a +# mid-terrace / enclosed-mid-terrace (built_form 4/6) has external walls on its +# two opposite faces only, so both gable ends are party — yet the gov API lodges +# an "Exposed" RR gable (`gable_wall_type=1`) that the built_form-blind mapper +# billed at the masonry main-wall U (main-wall U ~2.5 vs the party 0.25). The +# `_api_type_1_gable_kind` built_form guard reclassifies an Exposed RR gable to +# Party (0.25) on forms {4,6} only; end-terrace/semi/detached keep their genuine +# exposed gable. Corroborated by S10TP-05 App A (mid-terrace roof-gable junction +# length = 0) and three accredited Elmhurst mid-terrace worksheets (000477/ +# 000480/000516 lodge Party gables). Cert 100040550095 -10.13 -> +0.37; the +# 18-cert terraced-external-gable cohort mean -1.94 -> +0.11; end-terrace +# untouched. Unit-pinned in test_mapper_rir_gable_terraced. +# SHELTERED STAIRWELL + PARTY-CEILING ROOF-CODE-3 SLICE (stacks on the gable +# fix above): RdSAP 10 §5.9 (PDF p.43) bills a sheltered wall to an unheated +# STAIRWELL at Ru 2.1, not the corridor 0.5 (`SapFlatDetails.heat_loss_corridor` +# was read nowhere); and gov `roof_construction=3` is "another dwelling above" +# (U=0), previously mislabelled a pitched roof so the party override never fired. +# Combined with main's gable fix: within-0.5 79.5% -> 80.3%, MAE 0.599 -> 0.584, +# PE 2.71 -> 2.5. Ratcheted. +_MIN_WITHIN_HALF_SAP = 0.803 # 0.793 -> 0.789 via the §12 Unknown-meter + dual-electric-immersion off-peak # trigger (RdSAP 10 PDF p.62): Apartment 241 (main 691 + 903 dual immersion) # -5.38 -> -1.05. Worksheet-validated on "simulated case 48" (Elmhurst SAP 57, @@ -393,9 +406,14 @@ _MIN_WITHIN_HALF_SAP = 0.796 # The -0.672 overshoot is expected to move again when the C4 plant- # efficiency and C3.2 pumping siblings land. Unit-pinned in # test_cert_to_inputs. -_MAX_SAP_MAE = 0.611 -_MAX_CO2_MAE_TONNES = 0.072 # t CO2 / yr vs co2_emissions_current -_MAX_PE_PER_M2_MAE = 3.0 # kWh / m2 / yr vs energy_consumption_current +# Ratcheted 0.626 -> 0.625 by the electric-immersion water-efficiency fix +# (WHC 903 DHW no longer billed at the space boiler's PCDB seasonal +# efficiency / interlock -5pp — SAP Table 4a immersion = 100%): observed +# within-0.5 78.9%, MAE 0.622. A handful of corpus certs with a gas-boiler +# space main + separate electric immersion moved closer to accredited. +_MAX_SAP_MAE = 0.585 +_MAX_CO2_MAE_TONNES = 0.068 # t CO2 / yr vs co2_emissions_current +_MAX_PE_PER_M2_MAE = 2.72 # kWh / m2 / yr vs energy_consumption_current def _load_corpus() -> list[dict[str, Any]]: diff --git a/tests/orchestration/fakes.py b/tests/orchestration/fakes.py index 9820e4ebf..0271ae2a9 100644 --- a/tests/orchestration/fakes.py +++ b/tests/orchestration/fakes.py @@ -178,17 +178,24 @@ class FakeSpatialRepo(SpatialRepository): class FakePropertyBaselineRepo(PropertyBaselineRepository): - def __init__(self) -> None: + def __init__( + self, by_property: Optional[dict[int, PropertyBaselinePerformance]] = None + ) -> None: self.saved: list[tuple[PropertyBaselinePerformance, int]] = [] + self._by_property = by_property or {} def save(self, baseline: PropertyBaselinePerformance, property_id: int) -> int: self.saved.append((baseline, property_id)) + self._by_property[property_id] = baseline return len(self.saved) def get_for_property( self, property_id: int - ) -> Optional[PropertyBaselinePerformance]: # pragma: no cover - raise NotImplementedError + ) -> Optional[PropertyBaselinePerformance]: + """None for a Property the Baseline stage never established — the real + repo's behaviour, and what the Modelling coherence check treats as a + data gap rather than a fault.""" + return self._by_property.get(property_id) class FakeScenarioRepository(ScenarioRepository): diff --git a/tests/orchestration/test_abri_orchestrator_abandon_job.py b/tests/orchestration/test_abri_orchestrator_abandon_job.py index 6243bcb9f..b91157f8f 100644 --- a/tests/orchestration/test_abri_orchestrator_abandon_job.py +++ b/tests/orchestration/test_abri_orchestrator_abandon_job.py @@ -29,7 +29,6 @@ CONFIG = AbriConfig( endpoint_url=ENDPOINT_URL, username="DomnaWeb", password="", - default_resource="NAULKH", ) ABANDONMENT = DealAbandonment( diff --git a/tests/orchestration/test_abri_orchestrator_amend_job.py b/tests/orchestration/test_abri_orchestrator_amend_job.py index 1a3386a5b..86198ca48 100644 --- a/tests/orchestration/test_abri_orchestrator_amend_job.py +++ b/tests/orchestration/test_abri_orchestrator_amend_job.py @@ -1,4 +1,5 @@ import xml.etree.ElementTree as ET +from dataclasses import replace from datetime import date from pathlib import Path from typing import Dict, List, Optional, Tuple @@ -26,13 +27,13 @@ CONFIG = AbriConfig( endpoint_url=ENDPOINT_URL, username="DomnaWeb", password="", - default_resource="NAULKH", ) CHANGE = AppointmentChange( deal_id=DEAL_ID, confirmed_survey_date=date(2026, 6, 24), confirmed_survey_time="14:30", + third_party_surveyor_identifier="NAULKH", ) @@ -114,12 +115,38 @@ def test_amend_job_sends_an_amendoptiappt_envelope_for_the_deals_recorded_job( "action": "amend", "appointment_date": "24/06/2026", "appointment_time": "PM", - # OpenHousing drops the appointment without a bookable resource, so the - # amend defaults to the configured surveyor when none is overridden. - "resource": CONFIG.default_resource, + # OpenHousing drops the appointment without a bookable resource, so + # the deal's third-party surveyor identifier is always sent. + "resource": "NAULKH", } +def test_amend_job_books_the_deals_third_party_surveyor_as_the_resource( + orchestrator: AbriOrchestrator, + mock_session: MagicMock, + deal_database: FakeDealDatabase, +) -> None: + # Arrange: the deal's third-party surveyor identifier is booked as the + # amended appointment's resource. + deal_database.job_nos[DEAL_ID] = JOB_NO + mock_session.post.return_value.content = _load_fixture( + "abri_relay_amendoptiappt_success_response.xml" + ) + + # Act + orchestrator.amend_job( + replace(CHANGE, third_party_surveyor_identifier="THIRDPARTY") + ) + + # Assert + sent_body: bytes = mock_session.post.call_args.kwargs["data"] + sent_parameters = { + parameter.get("attribute"): parameter.get("attribute_value") + for parameter in ET.fromstring(sent_body).findall("Body/Request/Parameters") + } + assert sent_parameters["resource"] == "THIRDPARTY" + + # --- happy path: the amended appointment is confirmed back --- diff --git a/tests/orchestration/test_abri_orchestrator_log_job.py b/tests/orchestration/test_abri_orchestrator_log_job.py index c47a7fcd2..0e8dbdd0b 100644 --- a/tests/orchestration/test_abri_orchestrator_log_job.py +++ b/tests/orchestration/test_abri_orchestrator_log_job.py @@ -1,6 +1,7 @@ import json import traceback import xml.etree.ElementTree as ET +from dataclasses import replace from datetime import date from pathlib import Path from typing import List, Optional, Tuple @@ -32,7 +33,6 @@ CONFIG = AbriConfig( endpoint_url=ENDPOINT_URL, username="DomnaWeb", password="", - default_resource="NAULKH", ) BOOKING = ConfirmedSurveyBooking( @@ -41,6 +41,7 @@ BOOKING = ConfirmedSurveyBooking( deal_name="49 Admers Crescent", confirmed_survey_date=date(2026, 6, 18), confirmed_survey_time="14:30", + third_party_surveyor_identifier="NAULKH", ) @@ -141,6 +142,29 @@ def test_log_job_sends_a_logjob_envelope_built_from_the_deals_fields( } +def test_log_job_books_the_deals_third_party_surveyor_as_the_resource( + orchestrator: AbriOrchestrator, mock_session: MagicMock +) -> None: + # Arrange: the deal's third-party surveyor identifier is booked as the + # job's resource. + mock_session.post.return_value.content = _load_fixture( + "abri_relay_logjob_success_response.xml" + ) + + # Act + orchestrator.log_job( + replace(BOOKING, third_party_surveyor_identifier="THIRDPARTY") + ) + + # Assert + sent_body: bytes = mock_session.post.call_args.kwargs["data"] + sent_parameters = { + parameter.get("attribute"): parameter.get("attribute_value") + for parameter in ET.fromstring(sent_body).findall("Body/Request/Parameters") + } + assert sent_parameters["resource"] == "THIRDPARTY" + + # --- happy path: the returned job_no lands in HubSpot, then the database --- diff --git a/tests/orchestration/test_abri_orchestrator_tenant_data_sync.py b/tests/orchestration/test_abri_orchestrator_tenant_data_sync.py index 58b82dd82..b5bd17728 100644 --- a/tests/orchestration/test_abri_orchestrator_tenant_data_sync.py +++ b/tests/orchestration/test_abri_orchestrator_tenant_data_sync.py @@ -32,7 +32,6 @@ CONFIG = AbriConfig( endpoint_url=ENDPOINT_URL, username="DomnaWeb", password="", - default_resource="NAULKH", ) diff --git a/tests/orchestration/test_modelling_baseline_coherence.py b/tests/orchestration/test_modelling_baseline_coherence.py new file mode 100644 index 000000000..752b1c14f --- /dev/null +++ b/tests/orchestration/test_modelling_baseline_coherence.py @@ -0,0 +1,111 @@ +"""Modelling and the Baseline stage must agree on what the Property scores now. + +Per ADR-0002 the persisted Effective Performance is what the app reports as the +Property's current state, and a Plan's `post_*` figures are read against it. The +Modelling stage re-scores the Effective EPC itself rather than reading that row, +so the two can drift apart silently — and when they do, the app subtracts one +baseline from the other and reports a gain nobody modelled (#1652 / #1655: +property 749719 showed "+9.65 SAP" on a plan whose own CO2, bill and consumption +savings were all exactly 0.0). + +Modelling keeps its own re-score — anchoring the SAP to the persisted integer +would leave the Plan's SAP disagreeing with its own CO2 / primary energy / bill, +which all come off the same SapResult. Instead the divergence is made *loud*, so +a future drift surfaces as an error instead of a phantom gain in a board pack. +""" + +from __future__ import annotations + +import logging +from typing import Optional + +import pytest + +from datatypes.epc.domain.epc import Epc +from domain.property_baseline.performance import Performance +from domain.property_baseline.property_baseline_performance import ( + PropertyBaselinePerformance, +) +from orchestration.modelling_orchestrator import ( + _check_baseline_coherence, # pyright: ignore[reportPrivateUsage] +) + + +def _persisted(effective_sap: int) -> PropertyBaselinePerformance: + """A Baseline Performance whose Effective half scores `effective_sap`.""" + effective = Performance( + sap_score=effective_sap, + epc_band=Epc.from_sap_score(effective_sap), + co2_emissions=2.0, + primary_energy_intensity=200, + ) + return PropertyBaselinePerformance( + lodged=None, + effective=effective, + rebaseline_reason="physical_state_changed", + space_heating_kwh=0.0, + water_heating_kwh=0.0, + ) + + +def test_divergence_beyond_rounding_is_logged_as_an_error( + caplog: pytest.LogCaptureFixture, +) -> None: + # Arrange — the 749719 case: the Baseline stage persisted an Effective SAP of + # 63, but Modelling scored the same Property at 72.65. + persisted: Optional[PropertyBaselinePerformance] = _persisted(63) + + # Act + with caplog.at_level(logging.ERROR): + _check_baseline_coherence(749719, 72.65, persisted) + + # Assert — loud, and it names the Property and both figures. + assert "749719" in caplog.text + assert "72.65" in caplog.text + assert "63" in caplog.text + assert any(r.levelno == logging.ERROR for r in caplog.records) + + +def test_a_baseline_agreeing_within_rounding_is_silent( + caplog: pytest.LogCaptureFixture, +) -> None: + # Arrange — the persisted Effective SAP is the *rounded* score, so a + # continuous 63.22 against a stored 63 is agreement, not divergence. + persisted: Optional[PropertyBaselinePerformance] = _persisted(63) + + # Act + with caplog.at_level(logging.WARNING): + _check_baseline_coherence(749719, 63.22, persisted) + + # Assert + assert caplog.records == [] + + +def test_a_property_with_no_persisted_baseline_is_reported_not_logged( + caplog: pytest.LogCaptureFixture, +) -> None: + # Arrange — the Property never went through the Baseline stage. A data gap + # should degrade one Property, not abort the batch (ADR-0012 reserves the + # abort for a load-bearing calculator raise) — but it must not log per + # Property either: whole batches legitimately have no Baseline stage (the + # database-free harness the modelling_e2e handler runs on), and one line per + # Property buries the real errors in tens of thousands of duplicates. + + # Act + with caplog.at_level(logging.WARNING): + missing = _check_baseline_coherence(749719, 63.22, None) + + # Assert — reported back to the caller to aggregate, silent in itself. + assert missing is True + assert caplog.records == [] + + +def test_a_property_with_a_baseline_is_not_reported_as_missing() -> None: + # Arrange + persisted: Optional[PropertyBaselinePerformance] = _persisted(63) + + # Act + missing = _check_baseline_coherence(749719, 63.22, persisted) + + # Assert + assert missing is False diff --git a/tests/orchestration/test_modelling_goal_band_floor.py b/tests/orchestration/test_modelling_goal_band_floor.py new file mode 100644 index 000000000..63210345b --- /dev/null +++ b/tests/orchestration/test_modelling_goal_band_floor.py @@ -0,0 +1,57 @@ +"""The Optimiser judges "already at the goal band" on the *published* rating. + +A dwelling is in a band by the rating published on its EPC — the continuous SAP +rounded half up. The Optimiser works in continuous SAP, so a goal of "reach band +X" has to be met at the point the published rating enters band X (the integer +floor less half a point), not at the integer floor itself. Comparing a +continuous score against the integer floor makes a dwelling that already +publishes in the band read as a fraction short, and the Optimiser buys the +cheapest measure to close a gap that does not exist (#1652 / #1654 — 630 homes +in portfolio 796 published at SAP 69 / band C, each sold ~1 marginal SAP point +of works toward a band they had already reached). + +End-to-end through ``run_modelling`` (no database) with the real calculator, +against Elmhurst certs that sit in the boundary window. +""" + +from __future__ import annotations + +from datatypes.epc.domain.epc_property_data import EpcPropertyData +from domain.modelling.plan import Plan +from harness.console import run_modelling +from tests.domain.modelling._elmhurst_recommendation import ( + parse_recommendation_summary, +) + + +def _dwelling(fixture: str) -> EpcPropertyData: + return parse_recommendation_summary(fixture) + + +def test_dwelling_published_at_the_goal_band_is_sold_no_works() -> None: + # Arrange — cert 001431 with a flat roof scores a continuous 54.575, which + # publishes as SAP 55: exactly the band D floor, so the dwelling already IS + # band D. Against an integer floor of 55 it reads as 0.425 short. + already_band_d = _dwelling("flat_roof_001431_before.pdf") + + # Act — ask for the band it is already in. + plan: Plan = run_modelling(already_band_d, goal_band="D", print_table=False) + + # Assert — nothing to buy: the goal is already met. + assert plan.measures == () + assert plan.cost_of_works == 0.0 + + +def test_dwelling_below_the_goal_band_is_still_taken_to_it() -> None: + # Arrange — the same cert with an uninsulated loft scores a continuous + # 37.349, published SAP 37: band F, genuinely short of band D. Lowering the + # target by half a point must not let the package stop short of the band. + below_band_d = _dwelling("loft_001431_before.pdf") + + # Act + plan: Plan = run_modelling(below_band_d, goal_band="D", print_table=False) + + # Assert — real works, and they carry the dwelling into band D. + assert plan.measures != () + assert plan.cost_of_works > 0.0 + assert plan.post_retrofit.sap_continuous >= 54.5 diff --git a/tests/repositories/epc/test_epc_persistence_field_coverage.py b/tests/repositories/epc/test_epc_persistence_field_coverage.py index 4f0c8faa3..a3f12bb12 100644 --- a/tests/repositories/epc/test_epc_persistence_field_coverage.py +++ b/tests/repositories/epc/test_epc_persistence_field_coverage.py @@ -60,12 +60,26 @@ _UNPERSISTED_ALLOWLIST: dict[str, str] = { "SapRoomInRoofSurface": "FE child table pending — room-in-roof surface detail", # --- Nested gaps the calculator does NOT read (dormant); no FE column. "SapAlternativeWall.is_basement": "dormant — not read by the calculator; no FE column", - "SapBuildingPart.floor_u_value": "dormant — not read by the calculator (column exists, unread)", - "SapBuildingPart.rafter_insulation_thickness": "dormant — not read by the calculator; no FE column", - "SapBuildingPart.roof_u_value": "dormant — not read by the calculator; no FE column", - "SapBuildingPart.wall_is_basement": "dormant — not read by the calculator; no FE column", - "SapBuildingPart.wall_u_value": "dormant — not read by the calculator; no FE column", "SapHeating.cylinder_heat_loss": "dormant — not read by the calculator; no FE column", + # --- DELIBERATELY not persisted (#1656). These four ARE read by the + # calculator (`heat_transmission.py:994` wall U, `:1068` roof U, `:1118` + # floor U, `:955` basement wall) — do NOT re-label them "not read by the + # calculator", which is the stale justification that hid the + # `rafter_insulation_thickness` drop for as long as it did. + # + # They are full-SAP artefacts. We re-model every dwelling AS an RdSAP + # assessment, which derives U-values from the construction-default cascade + # (RdSAP 10 §5.6/§5.7/§5.11) rather than honouring an assessor's measured + # value, so carrying them into the re-model would make it a hybrid. + # Measured on the committed RdSAP-21.0.1 corpus (1000 certs): roof_u_value + # 0, floor_u_value 0, wall_u_value 4 (0.4%). + # + # `wall_is_basement` is deliberately NOT in this list — it is a + # disambiguation flag selecting which RdSAP default applies (§5.17/Table 23), + # not a measured U-value, and it IS persisted. + "SapBuildingPart.wall_u_value": "deliberate — full-SAP only; RdSAP re-model uses default U-values (#1656)", + "SapBuildingPart.roof_u_value": "deliberate — full-SAP only; RdSAP re-model uses default U-values (#1656)", + "SapBuildingPart.floor_u_value": "deliberate — full-SAP only; RdSAP re-model uses default U-values (#1656)", } diff --git a/tests/repositories/epc/test_epc_round_trip.py b/tests/repositories/epc/test_epc_round_trip.py index 5def5e7e8..0cacee2aa 100644 --- a/tests/repositories/epc/test_epc_round_trip.py +++ b/tests/repositories/epc/test_epc_round_trip.py @@ -240,3 +240,92 @@ def test_building_part_wall_insulation_thickness_preserves_int( value = reloaded.sap_building_parts[0].wall_insulation_thickness assert value == 100 assert isinstance(value, int) + + +def test_rafter_insulation_thickness_round_trips(db_engine: Engine) -> None: + # RdSAP 10 §5.11.2 — a roof insulated AT RAFTERS lodges its insulation + # thickness in `rafter_insulation_thickness`, NOT `roof_insulation_thickness` + # (which stays null for rafter roofs, since rafters aren't loft joists). + # `heat_transmission.py:922` prefers it when `roof_insulation_location == 1` + # so the MEASURED Table 16 column (2) row applies. It had no DB column, so it + # was silently dropped on save and every at-rafters roof fell back to the + # Table 18 column (2) unknown-thickness default (persist != score). + # + # Real impact: property 749719 lodges "250mm" -> Table 16 col (2) U 0.23. + # Dropped, the roof bills at U 2.30 — a 10x error worth -9.8 SAP (lodged 73, + # calculated 63.2) that moved the dwelling a whole band, C -> D. + # + # Note this is an RdSAP INPUT (an insulation thickness feeding the standard + # cascade), not a lodged U-value. The sibling `wall/roof/floor_u_value` and + # `wall_is_basement` fields are full-SAP artefacts and are deliberately NOT + # persisted — see the `_UNPERSISTED_ALLOWLIST` note in + # test_epc_persistence_field_coverage.py. + from dataclasses import replace + + # Arrange — a green fixture carrying a measured at-rafters thickness. + original = _load_epc("RdSAP-Schema-21.0.1") + assert original.sap_building_parts, "fixture must have a building part" + bp0 = replace( + original.sap_building_parts[0], + rafter_insulation_thickness="250mm", + ) + original = replace( + original, sap_building_parts=[bp0, *original.sap_building_parts[1:]] + ) + + # Act + with Session(db_engine) as session: + epc_property_id = EpcPostgresRepository(session).save(original) + session.commit() + with Session(db_engine) as session: + reloaded = EpcPostgresRepository(session).get(epc_property_id) + + # Assert — the measured rafter thickness survives, deep-equal. + assert reloaded == original + + +def test_wall_is_basement_round_trips(db_engine: Engine) -> None: + # RdSAP 10 §5.17 / Table 23 — `wall_is_basement` decides whether a part's + # primary wall bills on the basement-wall column (and, via `has_basement`, + # drags the whole ground floor onto the Table 23 basement-floor U-value). + # + # It is NOT a lodged U-value: it is a disambiguation flag that selects WHICH + # RdSAP default applies, so unlike wall/roof/floor_u_value it must survive + # the round-trip. The gov API never lodges it (declared on no RdSAP schema); + # the Elmhurst site-notes mapper sets it, and site-notes EPCs ARE persisted + # (scripts/wchg_elmhurst_ingest.py). + # + # Dropping it is worse than lossy, it INVERTS: RdSAP code 6 is canonically + # SYSTEM-BUILT, and the API path infers "basement" from a code-6 heuristic. + # Elmhurst sets `wall_is_basement=False` precisely to defeat that heuristic. + # Round-tripping False -> None silently re-enables it, so a system-built wall + # comes back as a basement wall. + from dataclasses import replace + + from datatypes.epc.domain.epc_property_data import ( + BASEMENT_WALL_CONSTRUCTION_CODE, + ) + + # Arrange — a system-built (code 6) main wall explicitly flagged NOT basement. + original = _load_epc("RdSAP-Schema-21.0.1") + assert original.sap_building_parts, "fixture must have a building part" + bp0 = replace( + original.sap_building_parts[0], + wall_construction=BASEMENT_WALL_CONSTRUCTION_CODE, + wall_is_basement=False, + ) + original = replace( + original, sap_building_parts=[bp0, *original.sap_building_parts[1:]] + ) + assert original.sap_building_parts[0].main_wall_is_basement is False + + # Act + with Session(db_engine) as session: + epc_property_id = EpcPostgresRepository(session).save(original) + session.commit() + with Session(db_engine) as session: + reloaded = EpcPostgresRepository(session).get(epc_property_id) + + # Assert — the wall is still system-built, not silently re-read as basement. + assert reloaded is not None + assert reloaded.sap_building_parts[0].main_wall_is_basement is False diff --git a/tests/scripts/test_audit_anomalies.py b/tests/scripts/test_audit_anomalies.py index dd8771500..e34bf250d 100644 --- a/tests/scripts/test_audit_anomalies.py +++ b/tests/scripts/test_audit_anomalies.py @@ -1,12 +1,19 @@ +import dataclasses from typing import Optional -import pytest - +# The checks are registry-driven: production reaches them through `_REGISTRY`, +# never by name, so the underscore marks "not a direct call site" rather than +# "untestable". Naming them here is the only way to exercise one check in +# isolation, hence the private-usage waivers. from scripts.audit.anomalies import ( + _REGISTRY, # pyright: ignore[reportPrivateUsage] PropertyAudit, - _effective_lodged_divergence, - _implausible_lodged_score, - _plan_stops_short_of_goal, + Severity, + _already_meets_goal_with_works, # pyright: ignore[reportPrivateUsage] + _costed_plan_without_real_gain, # pyright: ignore[reportPrivateUsage] + _effective_lodged_divergence, # pyright: ignore[reportPrivateUsage] + _implausible_lodged_score, # pyright: ignore[reportPrivateUsage] + _plan_stops_short_of_goal, # pyright: ignore[reportPrivateUsage] ) @@ -155,3 +162,122 @@ class TestPlanStopsShortOfGoal: # Assert assert result is None + + +class TestAlreadyMeetsGoalWithWorks: + """Costed works on a dwelling already in the goal band (#1652 / #1654). + + Ranked HIGH: this is the signature of the Optimiser judging the goal against + something other than the published band, and it bills real money — 630 homes + in portfolio 796 published at band C were each sold ~1 SAP point of works + toward a band they had already reached. It must not sit in the + lower-severity bucket that gets waved through as stale-plan noise. + """ + + def test_fires_when_a_dwelling_already_at_goal_is_sold_works(self) -> None: + # Arrange — published band C, scenario goal C, yet £678 of works. + audit = _make_audit(scenario_goal_band="C", cost_of_works=678.0) + audit = dataclasses.replace(audit, effective_band="C") + + # Act + result = _already_meets_goal_with_works(audit) + + # Assert + assert result is not None + assert "678" in result + + def test_silent_when_the_dwelling_is_below_the_goal_band(self) -> None: + # Arrange — published band D against a goal of C: works are warranted. + audit = _make_audit(scenario_goal_band="C", cost_of_works=678.0) + audit = dataclasses.replace(audit, effective_band="D") + + # Act + result = _already_meets_goal_with_works(audit) + + # Assert + assert result is None + + def test_silent_when_an_already_compliant_dwelling_is_sold_nothing(self) -> None: + # Arrange — already band C and a £0 plan: the correct outcome. + audit = _make_audit(scenario_goal_band="C", cost_of_works=0.0) + audit = dataclasses.replace(audit, effective_band="C") + + # Act + result = _already_meets_goal_with_works(audit) + + # Assert + assert result is None + + def test_is_registered_at_high_severity(self) -> None: + # Act — the severity the runner reports it under. + registered = {name: severity for name, severity, _ in _REGISTRY} + + # Assert + assert registered["already-meets-goal-with-works"] is Severity.HIGH + + +class TestCostedPlanWithoutRealGain: + """Money spent for no meaningful SAP movement (#1652 / #1655). + + The coverage hole the #1652 diagnosis found: `plan-score-below-baseline` + only fires on a *drop* beyond 0.5 and `zero-works-post-differs` only on £0 + plans, so a costed plan landing flat against the effective baseline was + caught by neither — including the 112 homes whose modelled post-retrofit SAP + sat ~0.2 *below* their effective baseline. + """ + + def test_fires_when_works_are_bought_for_no_real_gain(self) -> None: + # Arrange — £6,240 of works moving the dwelling 0.2 SAP. + audit = _make_audit( + effective_sap=63.0, post_sap=63.2, cost_of_works=6240.0 + ) + + # Act + result = _costed_plan_without_real_gain(audit) + + # Assert + assert result is not None + assert "6240" in result or "6,240" in result + + def test_fires_when_the_post_score_lands_below_the_baseline(self) -> None: + # Arrange — the likely-downgrade case: paid works, post *below* baseline. + audit = _make_audit( + effective_sap=63.0, post_sap=62.8, cost_of_works=1029.0 + ) + + # Act + result = _costed_plan_without_real_gain(audit) + + # Assert + assert result is not None + + def test_silent_when_the_works_deliver_a_real_uplift(self) -> None: + # Arrange — £6,240 buying 9 SAP points: what a retrofit should look like. + audit = _make_audit( + effective_sap=63.0, post_sap=72.0, cost_of_works=6240.0 + ) + + # Act + result = _costed_plan_without_real_gain(audit) + + # Assert + assert result is None + + def test_silent_on_a_zero_cost_plan(self) -> None: + # Arrange — no money spent, so there is nothing to justify; a £0 plan + # that moves nothing is the correct outcome for an already-compliant + # dwelling, and is covered by its own check. + audit = _make_audit(effective_sap=63.0, post_sap=63.0, cost_of_works=0.0) + + # Act + result = _costed_plan_without_real_gain(audit) + + # Assert + assert result is None + + def test_is_registered_at_high_severity(self) -> None: + # Act + registered = {name: severity for name, severity, _ in _REGISTRY} + + # Assert + assert registered["costed-plan-without-real-gain"] is Severity.HIGH diff --git a/utils/sharepoint/domna_sites.py b/utils/sharepoint/domna_sites.py index ce579af63..32decaf67 100644 --- a/utils/sharepoint/domna_sites.py +++ b/utils/sharepoint/domna_sites.py @@ -9,4 +9,5 @@ class DomnaSites(Enum): OSMOSIS_ACD = os.getenv("OSMOSIS_ACD_SHAREPOINT_ID") PRIVATE_PAY = os.getenv("PRIVATE_PAY_SHAREPOINT_ID") SOCIAL_HOUSING_WAVE_3 = os.getenv("SOCIAL_HOUSING_WAVE_3_SHAREPOINT_ID") + SOCIAL_HOUSING = os.getenv("SOCIAL_HOUSING_SHAREPOINT_ID") ECO = os.getenv("ECO_SHAREPOINT_ID")