From 6781b405d838d48731226b2fc9c8f847eed81a5d Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 20 Jul 2026 19:51:20 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B3=84=ED=9A=8D=EB=85=B8=EC=84=A0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- B05_wf2_Route/B05_wf2_Route_Api_Fetch.ts | 31 + B05_wf2_Route/B05_wf2_Route_Engine_Grade.py | 559 +++++ .../B05_wf2_Route_Engine_Grade_Solver.py | 351 +++ .../B05_wf2_Route_Engine_RidgeValley.py | 7 +- .../B05_wf2_Route_Engine_Sections.py | 37 +- B05_wf2_Route/B05_wf2_Route_Engine_Solver.py | 9 +- B05_wf2_Route/B05_wf2_Route_Router.py | 51 +- B05_wf2_Route/B05_wf2_Route_Schema.py | 75 +- B05_wf2_Route/B05_wf2_Route_UI_Page.ts | 18 + B05_wf2_Route/B05_wf2_Route_UI_Panel.ts | 125 +- .../B05_wf2_Route_UI_Profile_Panel.ts | 69 +- B05_wf2_Route/B05_wf2_Route_UI_Style.css | 47 + .../B06_wf3_ProfileCross_Api_Fetch.ts | 45 + .../B06_wf3_ProfileCross_Repository.py | 30 + .../B06_wf3_ProfileCross_UI_Section_View.ts | 85 +- .../B06_wf3_ProfileCross_UI_Style.css | 28 + .../B07_wf4_DesignDetail_UI_Page.ts | 11 + B08_wf5_Quantity/B08_wf5_Quantity_Template.ts | 2068 +++++++++++++++++ B08_wf5_Quantity/B08_wf5_Quantity_UI_Page.ts | 208 +- .../B08_wf5_Quantity_UI_Style.css | 212 ++ config/config_system.py | 51 + resources/templete_calc_cost.xlsx | Bin 0 -> 288446 bytes 22 files changed, 4083 insertions(+), 34 deletions(-) create mode 100644 B05_wf2_Route/B05_wf2_Route_Engine_Grade.py create mode 100644 B05_wf2_Route/B05_wf2_Route_Engine_Grade_Solver.py create mode 100644 B08_wf5_Quantity/B08_wf5_Quantity_Template.ts create mode 100644 B08_wf5_Quantity/B08_wf5_Quantity_UI_Style.css create mode 100644 resources/templete_calc_cost.xlsx diff --git a/B05_wf2_Route/B05_wf2_Route_Api_Fetch.ts b/B05_wf2_Route/B05_wf2_Route_Api_Fetch.ts index c3adb5a7..f109e05c 100644 --- a/B05_wf2_Route/B05_wf2_Route_Api_Fetch.ts +++ b/B05_wf2_Route/B05_wf2_Route_Api_Fetch.ts @@ -49,6 +49,30 @@ export interface RouteSolveRequest { cross_half_width_m?: number | null; cross_sample_interval_m?: number | null; long_sample_interval_m?: number | null; + terrain_type?: string; + main_direction?: string; + max_grade_pct?: number | null; + min_vertical_radius_m?: number | null; + min_tangent_length_m?: number | null; + balance_segment_length_m?: number | null; + start_elevation_offset_m?: number | null; + end_elevation_offset_m?: number | null; +} + +/** 계획선 산출 요약 (실패 시 null) */ +export interface RouteGradeSummary { + id: string; + cut_area_m2: number; + fill_area_m2: number; + balance_error_m2: number; + max_grade_pct: number; + vertical_curve_count: number; + pvi_count: number; + balance_segment_count: number; + balanced: boolean; + main_direction: string; + suggested_elevation_offset_m: number | null; + warnings: string[]; } /** 경로 탐색 실행 결과 (RouteSolveResponse) */ @@ -62,6 +86,7 @@ export interface RouteSolveResponse { route_data_path: string; longitudinal_length_m: number | null; cross_section_count: number | null; + grade_summary: RouteGradeSummary | null; } /** 경로 확정 결과 (RouteConfirmResponse) */ @@ -107,6 +132,12 @@ export interface RouteLatestResponse { cross_half_width_m?: number | null; cross_sample_interval_m?: number | null; long_sample_interval_m?: number | null; + max_grade_pct?: number | null; + min_vertical_radius_m?: number | null; + min_tangent_length_m?: number | null; + balance_segment_length_m?: number | null; + start_elevation_offset_m?: number | null; + end_elevation_offset_m?: number | null; } | null; } diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Grade.py b/B05_wf2_Route/B05_wf2_Route_Engine_Grade.py new file mode 100644 index 00000000..356f783d --- /dev/null +++ b/B05_wf2_Route/B05_wf2_Route_Engine_Grade.py @@ -0,0 +1,559 @@ +"""B05 종단 계획선(시공계획고) 산출 엔진. + +지반고 종단을 따라가면서 절토량과 성토량이 균형을 이루는 계획선을 만든다. +계획선은 일정 기울기의 직선(tangent)과 기울기 변화점에 삽입한 종단곡선 +(포물선)만으로 구성한다. 「임도설치 및 관리 등에 관한 규정」[별표 1-2]의 +다-(3)-(나) "시공계획고는 절토량과 성토량이 균형을 이루게 하되" 및 +다-(3)-(다) "종단기울기의 변화점에는 종단곡선을 삽입한다"가 근거다. + +절·성토 균형은 계획고와 지반고 차이의 적분(A안)으로 판정한다. 횡단 설계가 +나온 뒤 실제 단면적 기반 계획선을 추가할 수 있도록 결과는 배열의 한 원소로 +반환한다. +""" + +import math +from dataclasses import dataclass, field +from typing import Any + +import numpy as np + +from B05_wf2_Route.B05_wf2_Route_Engine_Grade_Solver import ( + balance_boundaries, + build_vertical_curves, + evaluate_profile, + grade_limits, + integration_weights, + optimize_pvi_elevations, + pvi_chainages, + segment_weights, +) +from config.config_system import ( + FOREST_ROAD_PROFILE_CRITERIA, + GRADE_MAIN_DIRECTIONS, + GRADE_TERRAIN_TYPES, +) + +GRADE_SCHEMA_VERSION = 1 +GRADE_PROFILE_ID = "design_grade_line" + +# 종단곡선 삽입 후 잔여 오차를 되먹임하는 최적화 반복 횟수 +_BALANCE_PASSES = 2 +# 시·종점 조정량 제안: 할선법 반복 횟수, 수렴 판정(m²), 제안 상한(m) +_OFFSET_SUGGESTION_ITERATIONS = 4 +_OFFSET_SUGGESTION_TOLERANCE_M2 = 1.0 +_OFFSET_SUGGESTION_MAX_M = 30.0 + + +@dataclass(frozen=True) +class GradeDesignOptions: + """계획선 설계 기준. 요청 값 → DB 저장 옵션 → config 순으로 결정된다.""" + + max_grade_pct: float + max_reverse_grade_pct: float + min_vertical_radius_m: float + min_curve_length_m: float + min_tangent_length_m: float + vertical_curve_skip_delta_pct: float + design_speed_kph: int + terrain_type: str = "normal" + paved: bool = False + main_direction: str = "auto" + balance_segment_length_m: float | None = None + start_elevation_offset_m: float = 0.0 + end_elevation_offset_m: float = 0.0 + warnings: tuple[str, ...] = field(default_factory=tuple) + + def validate(self) -> None: + values = { + "최대 종단기울기": self.max_grade_pct, + "종단곡선 최소 반경": self.min_vertical_radius_m, + "종단곡선 최소 길이": self.min_curve_length_m, + "최소 직선 길이": self.min_tangent_length_m, + } + for label, value in values.items(): + if not math.isfinite(value) or value <= 0: + raise ValueError(f"{label}은 0보다 큰 유한한 값이어야 합니다.") + if self.terrain_type not in GRADE_TERRAIN_TYPES: + raise ValueError(f"지형 구분은 {GRADE_TERRAIN_TYPES} 중 하나여야 합니다.") + if self.main_direction not in GRADE_MAIN_DIRECTIONS: + raise ValueError(f"주 진행방향은 {GRADE_MAIN_DIRECTIONS} 중 하나여야 합니다.") + if self.balance_segment_length_m is not None and self.balance_segment_length_m <= 0: + raise ValueError("균형 구역 길이는 0보다 큰 값이어야 합니다.") + + def as_dict(self) -> dict[str, Any]: + return { + "max_grade_pct": self.max_grade_pct, + "max_reverse_grade_pct": self.max_reverse_grade_pct, + "min_vertical_radius_m": self.min_vertical_radius_m, + "min_curve_length_m": self.min_curve_length_m, + "min_tangent_length_m": self.min_tangent_length_m, + "vertical_curve_skip_delta_pct": self.vertical_curve_skip_delta_pct, + "design_speed_kph": self.design_speed_kph, + "terrain_type": self.terrain_type, + "paved": self.paved, + "main_direction": self.main_direction, + "balance_segment_length_m": self.balance_segment_length_m, + "start_elevation_offset_m": self.start_elevation_offset_m, + "end_elevation_offset_m": self.end_elevation_offset_m, + } + + +def legal_grade_limit_pct( + grade_class: str, terrain_type: str = "normal", paved: bool = False +) -> float: + """설계속도 × 지형 구분에 따른 법정 종단기울기 상한(%). + + 특수지형 + 노면포장인 경우에 한하여 예외 상한까지 허용된다. + 경로탐색(느슨한 탐색 제약)과 달리 **위반 판정·계획선 기본값**의 기준이 된다. + """ + criteria = FOREST_ROAD_PROFILE_CRITERIA + terrain = terrain_type if terrain_type in GRADE_TERRAIN_TYPES else "normal" + speed = criteria["grade_to_design_speed"].get(grade_class, 20) + legal_max = float(criteria["design_speed"][speed]["max_grade_pct"][terrain]) + if paved and terrain == "special": + return float(criteria["paved_exception_grade_pct"]) + return legal_max + + +def _pick(*candidates: Any) -> Any: + """요청 → DB 저장값 → config 순으로 처음 나오는 유효값을 고른다.""" + for value in candidates: + if value is not None: + return value + return None + + +def resolve_grade_options( + grade_class: str, + *, + terrain_type: str = "normal", + paved: bool = False, + main_direction: str = "auto", + requested: dict[str, Any] | None = None, + stored: dict[str, Any] | None = None, +) -> GradeDesignOptions: + """임도 등급과 사용자 입력으로 계획선 설계 기준을 확정한다. + + `stored`에는 **사용자가 명시적으로 입력한 값만** 들어와야 한다. 해석이 끝난 + 기본값을 저장했다가 되읽으면, 등급·지형을 바꿔도 옛 기본값이 법정값을 이겨 + 갱신되지 않는다(예: 일반지형 8%가 굳어 특수지형 12%가 반영되지 않음). + """ + requested = requested or {} + stored = stored or {} + criteria = FOREST_ROAD_PROFILE_CRITERIA + terrain = terrain_type if terrain_type in GRADE_TERRAIN_TYPES else "normal" + speed = criteria["grade_to_design_speed"].get(grade_class, 20) + legal = criteria["design_speed"][speed] + legal_max = float(legal["max_grade_pct"][terrain]) + ceiling = legal_grade_limit_pct(grade_class, terrain, paved) + + max_grade = float(_pick(requested.get("max_grade_pct"), stored.get("max_grade_pct"), legal_max)) + warnings: list[str] = [] + if max_grade > ceiling + 1e-9: + warnings.append( + f"입력한 최대 종단기울기 {max_grade:.1f}%가 법정 상한 {ceiling:.1f}%를 초과합니다." + ) + return GradeDesignOptions( + max_grade_pct=max_grade, + max_reverse_grade_pct=float(legal["max_reverse_grade_pct"]), + min_vertical_radius_m=float( + _pick( + requested.get("min_vertical_radius_m"), + stored.get("min_vertical_radius_m"), + legal["min_vertical_radius_m"], + ) + ), + min_curve_length_m=float(legal["min_curve_length_m"]), + min_tangent_length_m=float( + _pick( + requested.get("min_tangent_length_m"), + stored.get("min_tangent_length_m"), + criteria["min_tangent_length_m"], + ) + ), + vertical_curve_skip_delta_pct=float(criteria["vertical_curve_skip_delta_pct"]), + design_speed_kph=int(speed), + terrain_type=terrain, + paved=bool(paved), + main_direction=(main_direction if main_direction in GRADE_MAIN_DIRECTIONS else "auto"), + balance_segment_length_m=_pick( + requested.get("balance_segment_length_m"), + stored.get("balance_segment_length_m"), + criteria["balance_segment_length_m"], + ), + start_elevation_offset_m=float( + _pick( + requested.get("start_elevation_offset_m"), + stored.get("start_elevation_offset_m"), + 0.0, + ) + ), + end_elevation_offset_m=float( + _pick( + requested.get("end_elevation_offset_m"), stored.get("end_elevation_offset_m"), 0.0 + ) + ), + warnings=tuple(warnings), + ) + + +def _ground_profile(longitudinal: dict[str, Any]) -> tuple[np.ndarray, np.ndarray]: + """종단 샘플에서 (chainage, 지반고) 배열을 만든다. 결측은 선형 보간한다.""" + samples = longitudinal.get("samples") or [] + chainage = np.array([float(s.get("chainage_m", 0.0)) for s in samples], dtype=np.float64) + raw = np.array( + [ + float(s["elevation_m"]) + if s.get("valid", True) and s.get("elevation_m") is not None + else np.nan + for s in samples + ], + dtype=np.float64, + ) + order = np.argsort(chainage, kind="stable") + chainage, raw = chainage[order], raw[order] + finite = np.isfinite(raw) + if finite.sum() < 2 or len(chainage) < 2: + raise ValueError("계획선을 만들기에 유효한 종단 표고 샘플이 부족합니다.") + ground = np.interp(chainage, chainage[finite], raw[finite]) + return chainage, ground + + +def _detect_main_direction(ground: np.ndarray, rise: float) -> tuple[str, str | None]: + """지반 종단 형상에서 역기울기 판정 기준이 되는 주 진행방향을 정한다. + + 시·종점 고도차만으로 부호를 보면 V자(계곡 횡단)·Λ자(능선 통과) 노선에서 + 오판한다. 고도차가 전체 기복(최고−최저)에 비해 충분히 클 때만 한 방향으로 + 오르내리는 노선으로 보고, 그렇지 않으면 역기울기를 적용하지 않는다. + + 반환값은 (방향, 사용자 안내 문구 또는 None) 이다. + """ + relief = float(np.max(ground) - np.min(ground)) + if relief <= 1e-6: + return "none", None + ratio = abs(rise) / relief + if ratio >= float(FOREST_ROAD_PROFILE_CRITERIA["main_direction_monotone_ratio"]): + return ("ascending" if rise > 0 else "descending"), None + return "none", ( + f"시·종점 고도차({rise:+.1f}m)가 전체 기복({relief:.1f}m)에 비해 작아 주 진행방향을 " + "특정할 수 없습니다(계곡 횡단·능선 통과 형상). 역기울기 상한 대신 양방향 모두 " + "순기울기 상한을 적용했습니다." + ) + + +def _segment_metrics( + chainage: np.ndarray, + difference: np.ndarray, + boundaries: np.ndarray, +) -> list[dict[str, Any]]: + """구역별 절토·성토 면적과 균형 오차를 계산한다.""" + metrics: list[dict[str, Any]] = [] + for index, (lower, upper) in enumerate(zip(boundaries[:-1], boundaries[1:])): + mask, local_weight = segment_weights(chainage, float(lower), float(upper)) + local_difference = difference[mask] + cut = float(local_weight[local_difference < 0] @ -local_difference[local_difference < 0]) + fill = float(local_weight[local_difference > 0] @ local_difference[local_difference > 0]) + metrics.append( + { + "index": index, + "start_chainage_m": round(float(lower), 6), + "end_chainage_m": round(float(upper), 6), + "cut_area_m2": round(cut, 6), + "fill_area_m2": round(fill, 6), + "balance_error_m2": round(fill - cut, 6), + } + ) + return metrics + + +def _balance_error( + chainage: np.ndarray, + ground: np.ndarray, + weights: np.ndarray, + boundaries: np.ndarray, + fixed: tuple[float, float], + options: GradeDesignOptions, + limits: tuple[float, float], +) -> float: + """주어진 시·종점 고도로 풀었을 때의 전체 절·성토 적분 오차(m²).""" + pvi_s, pvi_z, curves, _converged, _warnings = _solve_balanced_profile( + chainage, ground, weights, boundaries, fixed, options, limits + ) + difference = evaluate_profile(pvi_s, pvi_z, curves, chainage) - ground + return float(weights @ difference) + + +def _suggest_elevation_offset( + chainage: np.ndarray, + ground: np.ndarray, + weights: np.ndarray, + boundaries: np.ndarray, + options: GradeDesignOptions, + limits: tuple[float, float], + current_error: float, +) -> float | None: + """시·종점을 같은 양만큼 올리거나 내려 균형을 맞출 수 있는 조정량을 추정한다. + + BP·EP가 능선 정상에 놓이면 계획선이 지반 위로만 떠서 절토가 원천적으로 나오지 + 않는다. 시·종점을 δ만큼 내리면 적분 오차가 대략 δ·L 만큼 줄어드는 성질을 초기 + 추정으로 삼고, 실제 해로 두 번 보정(할선법)한다. 반환값은 사용자에게 제안만 + 하며 자동 적용하지 않는다(시·종점은 기존 도로와의 접속점이기 때문). + """ + total = float(chainage[-1]) or 1.0 + guess = -current_error / total + previous_offset, previous_error = 0.0, current_error + for _ in range(_OFFSET_SUGGESTION_ITERATIONS): + try: + error = _balance_error( + chainage, + ground, + weights, + boundaries, + ( + float(ground[0]) + guess, + float(ground[-1]) + guess, + ), + options, + limits, + ) + except (ValueError, np.linalg.LinAlgError): + return None + if abs(error) <= _OFFSET_SUGGESTION_TOLERANCE_M2: + return guess + slope = (error - previous_error) / (guess - previous_offset or 1e-9) + if abs(slope) < 1e-9: + return None + previous_offset, previous_error = guess, error + guess = guess - error / slope + if not math.isfinite(guess) or abs(guess) > _OFFSET_SUGGESTION_MAX_M: + return None + return guess if abs(previous_error) < abs(current_error) else None + + +def _solve_balanced_profile( + chainage: np.ndarray, + ground: np.ndarray, + weights: np.ndarray, + boundaries: np.ndarray, + fixed: tuple[float, float], + options: GradeDesignOptions, + limits: tuple[float, float], +) -> tuple[np.ndarray, np.ndarray, list[dict[str, Any]], bool, list[str]]: + """주어진 균형 구역 구성으로 PVI 표고와 종단곡선을 확정한다. + + 종단곡선(포물선)은 직선 폴리라인 대비 A·L²/24 만큼 면적을 바꾸므로, 그 값을 + 다음 반복의 목표 적분값으로 되먹여 곡선까지 반영한 최종 적분이 0이 되게 한다. + """ + total = float(chainage[-1]) + pvi_s = pvi_chainages(boundaries, total, options.min_tangent_length_m) + up_limit, down_limit = limits + targets = np.zeros(len(boundaries) - 1, dtype=np.float64) + pvi_z = np.zeros_like(pvi_s) + curves: list[dict[str, Any]] = [] + curve_warnings: list[str] = [] + converged = True + for _pass in range(_BALANCE_PASSES): + pvi_z, converged = optimize_pvi_elevations( + pvi_s, chainage, ground, weights, boundaries, targets, fixed, up_limit, down_limit + ) + curves, curve_warnings = build_vertical_curves( + pvi_s, + pvi_z, + radius_m=options.min_vertical_radius_m, + min_curve_length_m=options.min_curve_length_m, + skip_delta_pct=options.vertical_curve_skip_delta_pct, + paved=options.paved, + ) + corrections = np.zeros_like(targets) + for curve in curves: + segment = int( + np.clip( + np.searchsorted(boundaries, curve["chainage_m"], "right") - 1, + 0, + len(targets) - 1, + ) + ) + corrections[segment] -= curve["area_offset_m2"] + if np.allclose(corrections, targets, atol=1e-6): + break + targets = corrections + return pvi_s, pvi_z, curves, converged, curve_warnings + + +def design_grade_line(longitudinal: dict[str, Any], options: GradeDesignOptions) -> dict[str, Any]: + """종단 지반고에서 절·성토 균형 계획선을 산출한다. + + 반환 dict는 longitudinal.json의 `design_profiles` 배열에 그대로 넣는다. + """ + options.validate() + chainage, ground = _ground_profile(longitudinal) + total = float(chainage[-1]) + if total <= 0: + raise ValueError("종단 연장이 0이어서 계획선을 만들 수 없습니다.") + + weights = integration_weights(chainage) + boundaries = balance_boundaries(total, options.balance_segment_length_m) + fixed = ( + float(ground[0]) + options.start_elevation_offset_m, + float(ground[-1]) + options.end_elevation_offset_m, + ) + rise = fixed[1] - fixed[0] + warnings = list(options.warnings) + direction, direction_note = ( + _detect_main_direction(ground, rise) + if options.main_direction == "auto" + else (options.main_direction, None) + ) + if direction_note: + warnings.append(direction_note) + limits = grade_limits(options.max_grade_pct, options.max_reverse_grade_pct, direction) + up_limit, down_limit = limits + limit = up_limit if rise >= 0 else down_limit + if abs(rise) / total > limit + 1e-9: + raise ValueError( + f"시·종점 고도차({rise:.2f}m)를 연장 {total:.1f}m에서 기준 기울기 " + f"{limit * 100:.1f}% 이내로 연결할 수 없습니다." + ) + + pvi_s, pvi_z, curves, converged, curve_warnings = _solve_balanced_profile( + chainage, ground, weights, boundaries, fixed, options, limits + ) + if not converged and len(boundaries) > 2: + # 구역별 정확 균형이 기울기 기준과 양립하지 않는 경우: 절·성토 균형은 법정 + # 요건(다-(3)-(나))이므로, 구역 분할을 포기하고 노선 전체 1구역으로 다시 + # 풀어 정확 균형을 우선한다. 그래도 안 되면 그 결과(근사 균형)를 그대로 쓴다. + full_boundaries = np.array([0.0, total], dtype=np.float64) + full_pvi_s, full_pvi_z, full_curves, full_converged, full_curve_warnings = ( + _solve_balanced_profile( + chainage, ground, weights, full_boundaries, fixed, options, limits + ) + ) + if full_converged: + warnings.append( + f"요청한 균형 구역 길이({options.balance_segment_length_m:.0f}m)로는 기울기 " + "기준을 지키며 정확히 균형시킬 수 없어, 노선 전체 1구역 균형으로 대체했습니다." + ) + boundaries, pvi_s, pvi_z, curves, converged, curve_warnings = ( + full_boundaries, + full_pvi_s, + full_pvi_z, + full_curves, + full_converged, + full_curve_warnings, + ) + warnings.extend(curve_warnings) + + plan = evaluate_profile(pvi_s, pvi_z, curves, chainage) + difference = plan - ground + segments = _segment_metrics(chainage, difference, boundaries) + + # 균형이 맞지 않고 시·종점이 지반고에 고정돼 있으면, 어느 정도 조정하면 균형이 + # 맞는지 계산해 제안한다. 시·종점은 기존 도로 접속점이라 자동 적용하지 않는다. + suggested_offset: float | None = None + if not converged: + warnings.append( + "기울기 기준을 지키면서 절·성토를 정확히 균형시킬 수 없어 근사 균형을 적용했습니다." + ) + pinned = ( + abs(options.start_elevation_offset_m) < 1e-9 + and abs(options.end_elevation_offset_m) < 1e-9 + ) + if pinned: + suggested_offset = _suggest_elevation_offset( + chainage, ground, weights, boundaries, options, limits, float(weights @ difference) + ) + if suggested_offset is not None: + warnings.append( + f"시·종점 계획고를 각각 {suggested_offset:+.1f}m 조정하면 균형을 맞출 수 " + "있습니다(시점·종점 계획고 조정 입력란)." + ) + else: + warnings.append("시·종점 계획고 조정 또는 기울기·지형 구분 기준을 확인하세요.") + grades = (pvi_z[1:] - pvi_z[:-1]) / (pvi_s[1:] - pvi_s[:-1]) + max_grade_pct = float(np.max(np.abs(grades)) * 100.0) if len(grades) else 0.0 + if max_grade_pct > options.max_grade_pct + 1e-6: + warnings.append( + f"산출된 최대 종단기울기 {max_grade_pct:.2f}%가 기준 " + f"{options.max_grade_pct:.2f}%를 초과합니다." + ) + + curve_by_index = {curve["index"]: curve for curve in curves} + pvis = [ + { + "chainage_m": round(float(pvi_s[index]), 6), + "elevation_m": round(float(pvi_z[index]), 6), + "kind": "bp" if index == 0 else "ep" if index == len(pvi_s) - 1 else "pvi", + "grade_in_pct": round(float(grades[index - 1]) * 100.0, 6) if index > 0 else None, + "grade_out_pct": round(float(grades[index]) * 100.0, 6) + if index < len(grades) + else None, + "radius_m": round(float(curve_by_index[index]["radius_m"]), 6) + if index in curve_by_index + else None, + "curve_length_m": round(float(curve_by_index[index]["length_m"]), 6) + if index in curve_by_index + else None, + } + for index in range(len(pvi_s)) + ] + + station_chainage = np.array( + [float(station["chainage_m"]) for station in longitudinal.get("stations") or []], + dtype=np.float64, + ) + station_plan = ( + evaluate_profile(pvi_s, pvi_z, curves, station_chainage) + if len(station_chainage) + else np.array([]) + ) + station_ground = ( + np.interp(station_chainage, chainage, ground) if len(station_chainage) else np.array([]) + ) + stations = [ + { + "station_id": station.get("station_id"), + "chainage_m": round(float(station_chainage[index]), 6), + "plan_elevation_m": round(float(station_plan[index]), 6), + "ground_elevation_m": round(float(station_ground[index]), 6), + "cut_m": round(max(float(station_ground[index] - station_plan[index]), 0.0), 6), + "fill_m": round(max(float(station_plan[index] - station_ground[index]), 0.0), 6), + } + for index, station in enumerate(longitudinal.get("stations") or []) + ] + + cut_area = float(weights[difference < 0] @ -difference[difference < 0]) + fill_area = float(weights[difference > 0] @ difference[difference > 0]) + return { + "schema_version": GRADE_SCHEMA_VERSION, + "id": GRADE_PROFILE_ID, + "name": "계획선", + "basis": "longitudinal_balance", + "criteria": {**options.as_dict(), "resolved_main_direction": direction}, + "pvis": pvis, + "samples": [ + { + "chainage_m": round(float(chainage[index]), 6), + "elevation_m": round(float(plan[index]), 6), + "ground_elevation_m": round(float(ground[index]), 6), + "difference_m": round(float(difference[index]), 6), + } + for index in range(len(chainage)) + ], + "stations": stations, + "balance_segments": segments, + "summary": { + "cut_area_m2": round(cut_area, 6), + "fill_area_m2": round(fill_area, 6), + "balance_error_m2": round(fill_area - cut_area, 6), + "max_grade_pct": round(max_grade_pct, 6), + "vertical_curve_count": len(curves), + "pvi_count": len(pvi_s), + "balance_segment_count": len(segments), + "balanced": bool(converged), + "main_direction": direction, + "suggested_elevation_offset_m": ( + round(float(suggested_offset), 3) if suggested_offset is not None else None + ), + "warnings": warnings, + }, + } diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Grade_Solver.py b/B05_wf2_Route/B05_wf2_Route_Engine_Grade_Solver.py new file mode 100644 index 00000000..5ca57da1 --- /dev/null +++ b/B05_wf2_Route/B05_wf2_Route_Engine_Grade_Solver.py @@ -0,0 +1,351 @@ +"""B05 종단 계획선 산출의 수치 계산부 (적분 가중치·PVI 최적화·종단곡선 기하). + +[[B05_wf2_Route_Engine_Grade]] 가 설계 기준을 확정한 뒤 이 모듈의 함수를 호출한다. +설계 기준 객체에 의존하지 않고 스칼라 인자만 받아, 기준 해석과 수치 계산을 +분리한다(700줄 제한에 따른 분할). +""" + +from typing import Any, Callable + +import numpy as np +from scipy.optimize import LinearConstraint, minimize + +# PVI 간격 산정: 최소 직선길이의 2배 이상을 두되 노선을 최대 이 개수로 나눈다. +_MAX_PVI_SEGMENTS = 40 +# 종단곡선이 인접 곡선과 겹치지 않도록 확보하는 여유 비율 +_CURVE_OVERLAP_RATIO = 0.9 +# 구역 균형이 맞았다고 볼 평균 고저차 허용 오차 (m) +BALANCE_TOLERANCE_M = 1e-6 +# 정확 균형이 기울기 기준과 양립하지 않을 때 쓰는 연화(soft) 균형 가중치 +_SOFT_BALANCE_WEIGHT = 1.0e4 +_TRUST_OPTIONS = {"maxiter": 1000, "gtol": 1e-10, "xtol": 1e-12} +_SLSQP_OPTIONS = {"maxiter": 500, "ftol": 1e-12} + + +def integration_weights(chainage: np.ndarray) -> np.ndarray: + """사다리꼴 적분용 샘플 가중치(ds).""" + weights = np.zeros_like(chainage) + weights[1:-1] = (chainage[2:] - chainage[:-2]) / 2.0 + weights[0] = (chainage[1] - chainage[0]) / 2.0 + weights[-1] = (chainage[-1] - chainage[-2]) / 2.0 + return weights + + +def segment_weights( + chainage: np.ndarray, lower: float, upper: float +) -> tuple[np.ndarray, np.ndarray]: + """[lower, upper] 구간에 국한된 사다리꼴 적분 가중치를 만든다. + + 전역 가중치를 그대로 쓰면 구역 경계 샘플의 반폭이 옆 구역까지 걸쳐 있어 + 구역 면적이 과대 계상된다(가중치 합이 구간 길이와 어긋난다). + """ + mask = (chainage >= lower - 1e-9) & (chainage <= upper + 1e-9) + local = chainage[mask] + weights = np.zeros(len(local), dtype=np.float64) + if len(local) < 2: + return mask, weights + weights[1:-1] = (local[2:] - local[:-2]) / 2.0 + weights[0] = (local[1] - local[0]) / 2.0 + weights[-1] = (local[-1] - local[-2]) / 2.0 + return mask, weights + + +def balance_boundaries(total: float, segment_length: float | None) -> np.ndarray: + """절·성토 균형을 맞출 구역 경계 chainage(시·종점 포함)를 만든다.""" + if not segment_length or segment_length >= total: + return np.array([0.0, total], dtype=np.float64) + count = max(1, int(round(total / segment_length))) + return np.linspace(0.0, total, count + 1, dtype=np.float64) + + +def pvi_chainages(boundaries: np.ndarray, total: float, min_tangent: float) -> np.ndarray: + """균형 구역 경계를 반드시 포함하는 PVI 후보 chainage를 배치한다.""" + spacing = max(min_tangent * 2.0, total / _MAX_PVI_SEGMENTS) + nodes: list[float] = [0.0] + for start, end in zip(boundaries[:-1], boundaries[1:]): + span = float(end - start) + count = max(1, int(span // spacing)) + nodes.extend(float(value) for value in np.linspace(start, end, count + 1)[1:]) + values = np.unique(np.round(np.array(nodes, dtype=np.float64), 6)) + return values[(values >= -1e-9) & (values <= total + 1e-9)] + + +def _interp_matrix(pvi_s: np.ndarray, targets: np.ndarray) -> np.ndarray: + """PVI 표고 벡터를 샘플 chainage의 직선 보간 표고로 옮기는 행렬.""" + matrix = np.zeros((len(targets), len(pvi_s)), dtype=np.float64) + index = np.clip(np.searchsorted(pvi_s, targets, side="right") - 1, 0, len(pvi_s) - 2) + span = pvi_s[index + 1] - pvi_s[index] + ratio = np.where(span > 0, (targets - pvi_s[index]) / np.where(span > 0, span, 1.0), 0.0) + rows = np.arange(len(targets)) + matrix[rows, index] = 1.0 - ratio + matrix[rows, index + 1] = ratio + return matrix + + +def _polyline_area_matrix(pvi_s: np.ndarray, lower: float, upper: float) -> np.ndarray: + """[lower, upper] 구간에서 PVI 직선 폴리라인의 면적 적분 계수 벡터.""" + coefficients = np.zeros(len(pvi_s), dtype=np.float64) + for index in range(len(pvi_s) - 1): + start, end = float(pvi_s[index]), float(pvi_s[index + 1]) + if end <= lower + 1e-9 or start >= upper - 1e-9: + continue + length = end - start + coefficients[index] += length / 2.0 + coefficients[index + 1] += length / 2.0 + return coefficients + + +def grade_limits( + max_grade_pct: float, max_reverse_grade_pct: float, main_direction: str +) -> tuple[float, float]: + """주 진행방향 기준 (상승 상한, 하강 상한)을 비율로 정한다. + + 주 진행방향과 반대인 쪽이 역기울기이므로 더 엄한 상한을 받는다. + `none`이면 주 진행방향을 특정할 수 없는 노선(V자·Λ자)이므로 양방향 모두 + 순기울기 상한을 적용한다. 방향 판정은 [[_detect_main_direction]] 이 한다. + """ + main = max_grade_pct / 100.0 + reverse = min(max_reverse_grade_pct, max_grade_pct) / 100.0 + if main_direction == "ascending": + return main, reverse + if main_direction == "descending": + return reverse, main + return main, main + + +def _best_solution( + attempts: list[tuple[str, np.ndarray]], + objective: Callable[[np.ndarray], float], + objective_jac: Callable[[np.ndarray], np.ndarray], + hessian: np.ndarray, + constraints: list[LinearConstraint], + violation: Callable[[np.ndarray], float], +) -> tuple[np.ndarray, float]: + """여러 (해법, 초기값) 조합을 시도해 제약 위반이 가장 작은 해를 고른다. + + trust-constr는 활성 제약이 많아지면 Jacobian이 특이해져 엉뚱한 점에서 멈추는 + 경우가 있다. 결과를 직접 검증하고 통과하면 즉시 채택, 아니면 다음 조합으로 + 넘어가되 최소 위반 해를 남긴다. + """ + best: tuple[np.ndarray, float] | None = None + for method, initial in attempts: + extra = {"hess": lambda _x: hessian} if method == "trust-constr" else {} + settings = _TRUST_OPTIONS if method == "trust-constr" else _SLSQP_OPTIONS + try: + result = minimize( + objective, + initial, + jac=objective_jac, + constraints=constraints, + method=method, + options=settings, + **extra, + ) + except (ValueError, np.linalg.LinAlgError): + continue + score = violation(result.x) + if best is None or score < best[1]: + best = (np.asarray(result.x, dtype=np.float64), score) + if score <= BALANCE_TOLERANCE_M: + break + if best is None: + return np.asarray(attempts[0][1], dtype=np.float64), float("inf") + return best + + +def optimize_pvi_elevations( + pvi_s: np.ndarray, + chainage: np.ndarray, + ground: np.ndarray, + weights: np.ndarray, + boundaries: np.ndarray, + targets: np.ndarray, + fixed: tuple[float, float], + up_limit: float, + down_limit: float, +) -> tuple[np.ndarray, bool]: + """구역별 절·성토 균형을 등식 제약으로 두고 PVI 표고를 최적화한다. + + 목적함수는 지반 추종(∫(계획고−지반고)²ds), 등식 제약은 구역별 + ∫(계획고−지반고)ds = target, 부등식 제약은 구간별 종단기울기 상한이다. + 두 번째 반환값은 정확 균형 달성 여부다. + """ + matrix = _interp_matrix(pvi_s, chainage) + free = np.arange(1, len(pvi_s) - 1) + base = np.zeros(len(pvi_s), dtype=np.float64) + base[0], base[-1] = fixed + if not len(free): + return base, True + + matrix_free = matrix[:, free] + offset = matrix @ base - ground + # 노선 길이로 정규화해 목적함수와 제약의 스케일 차이를 없앤다. + scale = float(weights.sum()) or 1.0 + normalized = weights / scale + # 목적함수가 순수 이차식이므로 Hessian을 해석적으로 넘겨 QP로 정확히 푼다. + hessian = 2.0 * (matrix_free.T @ (normalized[:, None] * matrix_free)) + + def objective(x: np.ndarray) -> float: + residual = matrix_free @ x + offset + return float(residual @ (normalized * residual)) + + def objective_jac(x: np.ndarray) -> np.ndarray: + residual = matrix_free @ x + offset + return 2.0 * (matrix_free.T @ (normalized * residual)) + + equality: list[np.ndarray] = [] + equality_rhs: list[float] = [] + for index, (lower, upper) in enumerate(zip(boundaries[:-1], boundaries[1:])): + coefficients = _polyline_area_matrix(pvi_s, float(lower), float(upper)) + mask, local_weights = segment_weights(chainage, float(lower), float(upper)) + ground_area = float(local_weights @ ground[mask]) + # 구역 길이로 나누어 면적(m²)이 아닌 평균 고저차(m) 단위로 다룬다. + span = max(float(upper - lower), 1e-9) + equality.append(coefficients[free] / span) + equality_rhs.append( + (ground_area + float(targets[index]) - float(coefficients @ base)) / span + ) + equality_matrix = np.vstack(equality) + equality_vector = np.array(equality_rhs, dtype=np.float64) + + spans = pvi_s[1:] - pvi_s[:-1] + difference = np.zeros((len(spans), len(pvi_s)), dtype=np.float64) + rows = np.arange(len(spans)) + difference[rows, rows] = -1.0 / spans + difference[rows, rows + 1] = 1.0 / spans + difference_free = difference[:, free] + difference_base = difference @ base + + # 종단기울기 상한은 법정 기준이므로 항상 강제 제약으로 둔다. + grade_constraint = LinearConstraint( + difference_free, -down_limit - difference_base, up_limit - difference_base + ) + balance_constraint = LinearConstraint(equality_matrix, equality_vector, equality_vector) + + def grade_violation(x: np.ndarray) -> float: + grades = difference_free @ x + difference_base + return float( + max(np.max(grades - up_limit, initial=0.0), np.max(-down_limit - grades, initial=0.0)) + ) + + def total_violation(x: np.ndarray) -> float: + balance = float(np.max(np.abs(equality_matrix @ x - equality_vector), initial=0.0)) + return max(grade_violation(x), balance) + + # 시·종점 직선과 지반 추종, 두 출발점을 준비한다(전자는 기울기 제약을 자명하게 만족). + straight = np.interp( + pvi_s[free], + [float(pvi_s[0]), float(pvi_s[-1])], + [float(base[0]), float(base[-1])], + ) + following = np.interp(pvi_s[free], chainage, ground) + attempts = [ + ("trust-constr", straight), + ("SLSQP", straight), + ("trust-constr", following), + ] + elevations = base.copy() + solution, violation = _best_solution( + attempts, + objective, + objective_jac, + hessian, + [balance_constraint, grade_constraint], + total_violation, + ) + if violation <= BALANCE_TOLERANCE_M: + elevations[free] = solution + return elevations, True + + # 정확 균형이 기울기 기준과 양립하지 않는 경우: 균형을 벌점으로 완화하되 + # 법정 기울기 제약은 그대로 강제한 채 불균형이 최소인 해를 찾는다. + soft_hessian = hessian + 2.0 * _SOFT_BALANCE_WEIGHT * (equality_matrix.T @ equality_matrix) + + def soft_objective(x: np.ndarray) -> float: + gap = equality_matrix @ x - equality_vector + return objective(x) + _SOFT_BALANCE_WEIGHT * float(gap @ gap) + + def soft_jac(x: np.ndarray) -> np.ndarray: + gap = equality_matrix @ x - equality_vector + return objective_jac(x) + 2.0 * _SOFT_BALANCE_WEIGHT * (equality_matrix.T @ gap) + + solution, _ = _best_solution( + attempts, soft_objective, soft_jac, soft_hessian, [grade_constraint], grade_violation + ) + elevations[free] = solution + return elevations, False + + +def build_vertical_curves( + pvi_s: np.ndarray, + pvi_z: np.ndarray, + *, + radius_m: float, + min_curve_length_m: float, + skip_delta_pct: float, + paved: bool, +) -> tuple[list[dict[str, Any]], list[str]]: + """기울기 변화점에 종단곡선(포물선)을 삽입하고 곡선 제원을 만든다.""" + spans = pvi_s[1:] - pvi_s[:-1] + grades = (pvi_z[1:] - pvi_z[:-1]) / spans + skip_delta = skip_delta_pct / 100.0 + curves: list[dict[str, Any]] = [] + warnings: list[str] = [] + for index in range(1, len(pvi_s) - 1): + grade_in, grade_out = float(grades[index - 1]), float(grades[index]) + delta = grade_out - grade_in + if abs(delta) < 1e-9: + continue + # 비포장 도로이면서 대수차가 기준 이하이면 법정 예외로 곡선을 두지 않는다. + if not paved and abs(delta) <= skip_delta + 1e-12: + continue + length = radius_m * abs(delta) + available = min(float(spans[index - 1]), float(spans[index])) * _CURVE_OVERLAP_RATIO + if length > available: + length = available + warnings.append( + f"chainage {pvi_s[index]:.1f}m: 인접 직선이 짧아 종단곡선 길이를 " + f"{length:.1f}m로 줄였습니다." + ) + if length < min_curve_length_m - 1e-9: + warnings.append( + f"chainage {pvi_s[index]:.1f}m: 종단곡선 길이 {length:.1f}m가 " + f"기준 {min_curve_length_m:.1f}m에 미달합니다." + ) + if length <= 1e-9: + continue + curves.append( + { + "index": index, + "chainage_m": float(pvi_s[index]), + "elevation_m": float(pvi_z[index]), + "grade_in": grade_in, + "grade_out": grade_out, + "length_m": float(length), + "radius_m": float(length / abs(delta)), + # 포물선 삽입으로 직선 폴리라인 대비 발생하는 면적 차 (A·L²/24) + "area_offset_m2": float(delta * length * length / 24.0), + } + ) + return curves, warnings + + +def evaluate_profile( + pvi_s: np.ndarray, pvi_z: np.ndarray, curves: list[dict[str, Any]], targets: np.ndarray +) -> np.ndarray: + """직선 + 종단곡선으로 구성된 계획선을 임의 chainage에서 평가한다.""" + values = np.interp(targets, pvi_s, pvi_z) + for curve in curves: + half = curve["length_m"] / 2.0 + start = curve["chainage_m"] - half + end = curve["chainage_m"] + half + mask = (targets >= start) & (targets <= end) + if not np.any(mask): + continue + local = targets[mask] - start + start_z = curve["elevation_m"] - curve["grade_in"] * half + delta = curve["grade_out"] - curve["grade_in"] + values[mask] = ( + start_z + curve["grade_in"] * local + delta / (2.0 * curve["length_m"]) * local * local + ) + return values diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_RidgeValley.py b/B05_wf2_Route/B05_wf2_Route_Engine_RidgeValley.py index 3e063523..cb7714a2 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_RidgeValley.py +++ b/B05_wf2_Route/B05_wf2_Route_Engine_RidgeValley.py @@ -487,11 +487,14 @@ def _fillet_alignment( def resolve_grade_bounds(options: dict[str, Any]) -> dict[str, float]: - """options에서 방향별 경사 상/하한을 해석한다.""" + """options에서 방향별 경사 상/하한을 해석한다. + + options의 경사 값 단위는 퍼센트(%)이므로 비율로 환산한다. default는 이미 비율이다. + """ def _opt(key: str, default: float) -> float: v = options.get(key) - return float(v) if v is not None else default + return float(v) / 100.0 if v is not None else default min_uphill_grade = _opt("min_uphill_grade", ROUTE_ALT_MIN_GRADE) min_downhill_grade = _opt("min_downhill_grade", ROUTE_ALT_MIN_GRADE) diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Sections.py b/B05_wf2_Route/B05_wf2_Route_Engine_Sections.py index 00799058..67c56cde 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_Sections.py +++ b/B05_wf2_Route/B05_wf2_Route_Engine_Sections.py @@ -7,9 +7,11 @@ longitudinal/, 각 횡단은 cross_sections/ 아래 파일로 저장한다. DB """ import json +import logging from pathlib import Path from typing import Any +from B05_wf2_Route.B05_wf2_Route_Engine_Grade import GradeDesignOptions, design_grade_line from B05_wf2_Route.B05_wf2_Route_Engine_Sections_Core import ( SectionGenerationOptions, generate_sections, @@ -17,6 +19,8 @@ from B05_wf2_Route.B05_wf2_Route_Engine_Sections_Core import ( from B05_wf2_Route.B05_wf2_Route_Engine_Sections_Sampler import build_surface_sampler from common_util.common_util_json import atomic_write_json +logger = logging.getLogger(__name__) + _STAGE_SUBDIR = Path("B06_wf3_ProfileCross") _MODELS_SUBDIR = Path("B04_wf1_Surface") / "models" @@ -73,6 +77,26 @@ def _cross_summary(cross_section: dict[str, Any]) -> dict[str, Any]: } +def _append_design_profiles( + longitudinal: dict[str, Any], grade_options: GradeDesignOptions | None +) -> dict[str, Any] | None: + """종단 계획선을 산출해 longitudinal에 붙이고 요약을 반환한다. + + 계획선 산출 실패가 종횡단 생성 자체를 무효화하지 않도록 예외를 격리한다. + 횡단 설계 기반 계획선을 나중에 추가할 수 있게 배열로 보관한다. + """ + longitudinal.setdefault("design_profiles", []) + if grade_options is None: + return None + try: + profile = design_grade_line(longitudinal, grade_options) + except (ValueError, KeyError, ArithmeticError): + logger.exception("B05 종단 계획선 산출 실패 (종횡단은 유지)") + return None + longitudinal["design_profiles"].append(profile) + return {"id": profile["id"], **profile["summary"]} + + def run_section_generation( project_root: Path, route_data_path: str, @@ -81,6 +105,8 @@ def run_section_generation( smooth: bool, *, options: SectionGenerationOptions | None = None, + grade_options: GradeDesignOptions | None = None, + grade_overrides: dict[str, Any] | None = None, crs: str | None = None, ) -> dict[str, Any]: """종횡단을 생성·저장하고 DB 기록용 데이터를 반환한다. @@ -108,7 +134,8 @@ def run_section_generation( long_dir.mkdir(parents=True, exist_ok=True) cross_dir.mkdir(parents=True, exist_ok=True) - # 종단면 저장 + # 종단면 저장 (계획선은 저장 직전에 종단 데이터에 붙인다) + grade_summary = _append_design_profiles(result["longitudinal"], grade_options) long_file = long_dir / "longitudinal.json" atomic_write_json(long_file, result["longitudinal"]) long_summary = { @@ -117,6 +144,14 @@ def run_section_generation( "invalid_samples": result["summary"]["invalid_longitudinal_samples"], # 사용자 선택값의 단일 소스(DB): 재생성·재탐색 시 이 값을 우선 사용한다. "options": result["options"], + # 해석이 끝난 기준값은 기록·표시용으로만 보관한다. 이 값을 재계산 시 + # 폴백으로 되쓰면 등급·지형을 바꿔도 옛 기본값이 법정값을 이겨 갱신되지 않는다. + "grade_options": grade_options.as_dict() if grade_options else None, + # 재계산 폴백에 쓰는 단일 소스: 사용자가 명시적으로 입력한 값만 담는다. + "grade_overrides": { + key: value for key, value in (grade_overrides or {}).items() if value is not None + }, + "grade_summary": grade_summary, } # 측점별 횡단면 저장 (detail 조회가 폴더 전체를 glob하므로 이전 실행 잔재를 먼저 비운다) diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Solver.py b/B05_wf2_Route/B05_wf2_Route_Engine_Solver.py index 3f0ca367..f1d03aac 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_Solver.py +++ b/B05_wf2_Route/B05_wf2_Route_Engine_Solver.py @@ -371,8 +371,9 @@ def solve_optimal_route( min_curve_radius_m = FOREST_ROAD_MIN_CURVE_R_M.get(grade_class, 12.0) def _grade_opt(key: str) -> float: + """options의 경사 값은 퍼센트(%)이므로 비율로 환산한다.""" v = options.get(key) - return float(v) if (v is not None and float(v) > 0) else max_grade + return float(v) / 100.0 if (v is not None and float(v) > 0) else max_grade max_uphill_grade = _grade_opt("max_uphill_grade") max_downhill_grade = _grade_opt("max_downhill_grade") @@ -495,6 +496,9 @@ def solve_optimal_route( length_m += h_dist grade_sums += segment_slope * h_dist max_grade_pct = max(max_grade_pct, segment_slope) + # 여기서 다루는 z는 **지반고**다. 산지 지형이 급한 것은 위반이 아니므로 + # 법정 종단기울기가 아니라 탐색 제약(선형을 완만한 지형으로 유도하는 값)과 + # 대조한다. 법정 기준 준수는 절·성토 후 노면이 되는 계획선이 담당한다. applicable = max_uphill_grade if dz > 0 else max_downhill_grade if dz > 0: max_uphill_pct = max(max_uphill_pct, segment_slope) @@ -646,7 +650,10 @@ def solve_optimal_route( "max_grade_pct": round(max_grade_pct * 100, 2), "max_uphill_pct": round(max_uphill_pct * 100, 2), "max_downhill_pct": round(max_downhill_pct * 100, 2), + # 아래 경사 지표는 모두 경로가 지나는 **지반고** 기준이다(노면고 아님). "slope_violations": slope_violations, + # slope_violations의 판정 기준 = 탐색 제약. 법정 기준과 혼동하지 않도록 노출한다. + "search_max_grade_pct": round(max(max_uphill_grade, max_downhill_grade) * 100, 2), "curve_violations": curve_violations, "min_curve_radius_m": round(min_curve_radius_actual, 2) if math.isfinite(min_curve_radius_actual) diff --git a/B05_wf2_Route/B05_wf2_Route_Router.py b/B05_wf2_Route/B05_wf2_Route_Router.py index 7e487a26..56d143a7 100644 --- a/B05_wf2_Route/B05_wf2_Route_Router.py +++ b/B05_wf2_Route/B05_wf2_Route_Router.py @@ -13,6 +13,7 @@ from fastapi.responses import JSONResponse from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path from B05_wf2_Route.B05_wf2_Route_Debug import log_b05_debug from B05_wf2_Route.B05_wf2_Route_Engine import run_route_design +from B05_wf2_Route.B05_wf2_Route_Engine_Grade import GradeDesignOptions, resolve_grade_options from B05_wf2_Route.B05_wf2_Route_Engine_Sections import run_section_generation from B05_wf2_Route.B05_wf2_Route_Engine_Sections_Core import SectionGenerationOptions from B05_wf2_Route.B05_wf2_Route_Repository import ( @@ -25,16 +26,19 @@ from B05_wf2_Route.B05_wf2_Route_Repository import ( insert_route_points, ) from B05_wf2_Route.B05_wf2_Route_Schema import ( + GRADE_PERCENT_FIELDS, ContourIntervalUpdateRequest, ContourIntervalUpdateResponse, RouteConfirmResponse, RouteLatestResponse, RouteSolveRequest, RouteSolveResponse, + normalize_grade_percent, ) from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import ( create_longitudinal_section, delete_sections_for_route, + get_latest_grade_options, get_latest_section_options, insert_cross_sections, ) @@ -78,6 +82,40 @@ def _section_options( ) +def _normalized_route_params(params: dict[str, Any] | None) -> dict[str, Any] | None: + """복원 응답의 경사 값을 퍼센트로 맞춘다(과거 비율 저장분 자동 환산).""" + if not params: + return params + options = params.get("options") + if not isinstance(options, dict): + return params + return { + **params, + "options": { + **options, + **{ + key: normalize_grade_percent(options[key]) + for key in GRADE_PERCENT_FIELDS + if key in options + }, + }, + } + + +def _grade_options( + request: RouteSolveRequest, stored_grade_options: dict[str, Any] | None +) -> GradeDesignOptions: + """계획선 기준도 요청 값 → DB 저장 옵션 → config 순으로 결정한다.""" + return resolve_grade_options( + request.grade_class, + terrain_type=request.terrain_type, + paved=request.paved, + main_direction=request.main_direction, + requested=request.grade_options(), + stored=stored_grade_options, + ) + + @router.post("/{project_id}/route/solve", response_model=RouteSolveResponse) async def solve_route( project_id: UUID, request: RouteSolveRequest @@ -97,6 +135,7 @@ async def solve_route( "cross_half_width_m": request.cross_half_width_m, "cross_sample_interval_m": request.cross_sample_interval_m, "long_sample_interval_m": request.long_sample_interval_m, + **request.grade_options(), } log_b05_debug( logger, @@ -219,11 +258,13 @@ async def solve_route( # 종횡단 생성 실패는 저장된 경로를 무효화하지 않으므로 비치명적으로 처리한다. longitudinal_length_m: float | None = None cross_section_count: int | None = None + grade_summary: dict[str, Any] | None = None try: crs_epsg = await get_surface_crs_epsg( connection, project_id, request.surface_model_id ) stored_options = await get_latest_section_options(connection, project_id) + stored_grade_options = await get_latest_grade_options(connection, project_id) sections = await asyncio.to_thread( run_section_generation, project_root, @@ -232,6 +273,10 @@ async def solve_route( request.method, request.smooth, options=_section_options(request, stored_options), + grade_options=_grade_options(request, stored_grade_options), + # B05 폼이 계획선 입력의 authoritative 소스이므로 요청 값을 그대로 + # 저장한다(사용자가 값을 지우면 저장분도 지워져 법정 기본값으로 복귀). + grade_overrides=request.grade_options(), crs=f"EPSG:{crs_epsg}" if crs_epsg is not None else None, ) await connection.begin() @@ -256,6 +301,7 @@ async def solve_route( raise longitudinal_length_m = sections["longitudinal"]["data"]["length_m"] cross_section_count = len(sections["cross_sections"]) + grade_summary = sections["longitudinal"]["data"].get("grade_summary") except Exception: logger.exception( "B05 종횡단 생성 실패 (경로는 저장됨): project_id=%s route_id=%s", @@ -272,6 +318,7 @@ async def solve_route( route_data_path=design["route_data_path"], longitudinal_length_m=longitudinal_length_m, cross_section_count=cross_section_count, + grade_summary=grade_summary, ) except LookupError as exc: async with pool.acquire() as connection, connection.cursor() as cursor: @@ -349,7 +396,9 @@ async def read_latest_route(project_id: UUID) -> RouteLatestResponse | JSONRespo route=latest, route_points=route_points, surface_params=surface_params, - route_params=route_stage.get("params") if route_stage else None, + route_params=_normalized_route_params( + route_stage.get("params") if route_stage else None + ), ) except Exception: logger.exception("B05 최신 경로 조회 실패: project_id=%s", project_id) diff --git a/B05_wf2_Route/B05_wf2_Route_Schema.py b/B05_wf2_Route/B05_wf2_Route_Schema.py index baf7652c..8c8d44ec 100644 --- a/B05_wf2_Route/B05_wf2_Route_Schema.py +++ b/B05_wf2_Route/B05_wf2_Route_Schema.py @@ -4,7 +4,37 @@ from typing import Any from pydantic import BaseModel, ConfigDict, Field, model_validator -from config.config_system import ROUTE_GRADE_CLASSES +from config.config_system import ( + GRADE_MAIN_DIRECTIONS, + GRADE_TERRAIN_TYPES, + ROUTE_GRADE_CLASSES, +) + +# 경사 입력은 화면·API·DB 모두 **퍼센트(%)** 로 통일한다(비율로 쓰던 과거와 다름). +# 엔진 진입점에서만 100으로 나눠 비율로 바꾼다. +GRADE_PERCENT_FIELDS = ( + "max_uphill_grade", + "max_downhill_grade", + "min_uphill_grade", + "min_downhill_grade", +) +# 과거 버전은 같은 필드를 비율(0.14 = 14%)로 저장했다. 임도 종단기울기를 1% 이하로 +# 두는 경우는 없으므로, 1 이하 값은 레거시 비율로 보고 퍼센트로 환산한다. +LEGACY_GRADE_RATIO_MAX = 1.0 + + +def normalize_grade_percent(value: Any) -> Any: + """경사 값을 퍼센트로 정규화한다(레거시 비율 자동 환산).""" + if value is None: + return None + try: + number = float(value) + except (TypeError, ValueError): + return value + if 0.0 < number <= LEGACY_GRADE_RATIO_MAX: + # 0.14 * 100 = 14.000000000000002 같은 잔여 오차를 남기지 않는다. + return round(number * 100.0, 6) + return number class RoutePoint(BaseModel): @@ -48,10 +78,11 @@ class RouteSolveRequest(BaseModel): grade_class: str = Field(default="trunk") paved: bool = Field(default=False) min_curve_radius_m: float | None = None - max_uphill_grade: float | None = None - max_downhill_grade: float | None = None - min_uphill_grade: float | None = None - min_downhill_grade: float | None = None + # 경로탐색 경사 제약 (단위: %). 과거 비율 저장분은 검증 단계에서 자동 환산된다. + max_uphill_grade: float | None = Field(default=None, ge=0, le=100) + max_downhill_grade: float | None = Field(default=None, ge=0, le=100) + min_uphill_grade: float | None = Field(default=None, ge=0, le=100) + min_downhill_grade: float | None = Field(default=None, ge=0, le=100) weights: dict[str, float] | None = None allow_avoid_pass_through: bool = Field(default=False) station_interval_m: float | None = Field(default=None, gt=0) @@ -59,14 +90,44 @@ class RouteSolveRequest(BaseModel): cross_sample_interval_m: float | None = Field(default=None, gt=0) long_sample_interval_m: float | None = Field(default=None, gt=0) + # 종단 계획선(계획고) 설계 옵션. 빈 값은 null로 두어 config 기본값을 쓴다. + terrain_type: str = Field(default="normal", description="지형 구분 (normal/special)") + main_direction: str = Field( + default="auto", description="주 진행방향 (auto/ascending/descending/none)" + ) + max_grade_pct: float | None = Field(default=None, gt=0) + min_vertical_radius_m: float | None = Field(default=None, gt=0) + min_tangent_length_m: float | None = Field(default=None, gt=0) + balance_segment_length_m: float | None = Field(default=None, gt=0) + start_elevation_offset_m: float | None = None + end_elevation_offset_m: float | None = None + @model_validator(mode="after") def validate_choices(self) -> "RouteSolveRequest": if self.grade_class not in ROUTE_GRADE_CLASSES: raise ValueError(f"임도 등급은 {ROUTE_GRADE_CLASSES} 중 하나여야 합니다.") if self.algorithm not in ("dijkstra", "ridge_valley"): raise ValueError("경로 알고리즘은 dijkstra 또는 ridge_valley여야 합니다.") + if self.terrain_type not in GRADE_TERRAIN_TYPES: + raise ValueError(f"지형 구분은 {GRADE_TERRAIN_TYPES} 중 하나여야 합니다.") + if self.main_direction not in GRADE_MAIN_DIRECTIONS: + raise ValueError(f"주 진행방향은 {GRADE_MAIN_DIRECTIONS} 중 하나여야 합니다.") + # 화면·DB에 남아 있던 비율 표기를 퍼센트로 맞춰 이후 단계를 단일 단위로 만든다. + for field_name in GRADE_PERCENT_FIELDS: + setattr(self, field_name, normalize_grade_percent(getattr(self, field_name))) return self + def grade_options(self) -> dict[str, Any]: + """계획선 엔진에 넘길 요청 측 재정의 값(사용자가 비우면 None).""" + return { + "max_grade_pct": self.max_grade_pct, + "min_vertical_radius_m": self.min_vertical_radius_m, + "min_tangent_length_m": self.min_tangent_length_m, + "balance_segment_length_m": self.balance_segment_length_m, + "start_elevation_offset_m": self.start_elevation_offset_m, + "end_elevation_offset_m": self.end_elevation_offset_m, + } + def points_data(self) -> dict[str, Any]: return { "bp": self.bp.model_dump(), @@ -80,6 +141,8 @@ class RouteSolveRequest(BaseModel): return { "grade_class": self.grade_class, "paved": self.paved, + "terrain_type": self.terrain_type, + "main_direction": self.main_direction, "min_curve_radius_m": self.min_curve_radius_m, "max_uphill_grade": self.max_uphill_grade, "max_downhill_grade": self.max_downhill_grade, @@ -119,6 +182,8 @@ class RouteSolveResponse(BaseModel): # 종횡단 생성 실패 시 None (경로 자체는 저장됨) longitudinal_length_m: float | None = None cross_section_count: int | None = None + # 계획선 산출 실패 시 None (종횡단·경로는 저장됨) + grade_summary: dict[str, Any] | None = None class RouteConfirmResponse(BaseModel): diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Page.ts b/B05_wf2_Route/B05_wf2_Route_UI_Page.ts index 315b6efa..60005129 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Page.ts +++ b/B05_wf2_Route/B05_wf2_Route_UI_Page.ts @@ -167,6 +167,14 @@ export async function renderB05Route(root: HTMLElement): Promise { stationInterval: next.route_params?.station_interval_m ?? undefined, crossSampleInterval: next.route_params?.cross_sample_interval_m ?? undefined, longSampleInterval: next.route_params?.long_sample_interval_m ?? undefined, + terrainType: options.terrain_type as RoutePanelValues["terrainType"] | undefined, + mainDirection: options.main_direction as RoutePanelValues["mainDirection"] | undefined, + maxGradePct: next.route_params?.max_grade_pct ?? undefined, + minVerticalRadius: next.route_params?.min_vertical_radius_m ?? undefined, + minTangentLength: next.route_params?.min_tangent_length_m ?? undefined, + balanceSegmentLength: next.route_params?.balance_segment_length_m ?? undefined, + startElevationOffset: next.route_params?.start_elevation_offset_m ?? undefined, + endElevationOffset: next.route_params?.end_elevation_offset_m ?? undefined, }); viewer.markers.setPoints(restorePoints(next)); } @@ -265,11 +273,21 @@ export async function renderB05Route(root: HTMLElement): Promise { cross_half_width_m: null, cross_sample_interval_m: values.crossSampleInterval, long_sample_interval_m: values.longSampleInterval, + terrain_type: values.terrainType, + main_direction: values.mainDirection, + max_grade_pct: values.maxGradePct, + min_vertical_radius_m: values.minVerticalRadius, + min_tangent_length_m: values.minTangentLength, + balance_segment_length_m: values.balanceSegmentLength, + start_elevation_offset_m: values.startElevationOffset, + end_elevation_offset_m: values.endElevationOffset, }); renderLatest(await fetchLatestRoute(activeProjectId)); await restoreSections(solved.route_id); if (solved.cross_section_count === null) { showToast("경로는 저장되었지만 종횡단 생성에 실패했습니다.", "error"); + } else if (solved.grade_summary === null) { + showToast("경로·종횡단은 저장되었지만 계획선 산출에 실패했습니다.", "error"); } else { showToast("최적 경로 계산이 완료되었습니다.", "success"); } diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Panel.ts b/B05_wf2_Route/B05_wf2_Route_UI_Panel.ts index 1409aa42..73bd9dd9 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Panel.ts +++ b/B05_wf2_Route/B05_wf2_Route_UI_Panel.ts @@ -16,8 +16,30 @@ export interface RoutePanelValues { stationInterval: number | null; crossSampleInterval: number | null; longSampleInterval: number | null; + terrainType: "normal" | "special"; + mainDirection: "auto" | "ascending" | "descending" | "none"; + maxGradePct: number | null; + minVerticalRadius: number | null; + minTangentLength: number | null; + balanceSegmentLength: number | null; + startElevationOffset: number | null; + endElevationOffset: number | null; } +/** + * 「임도설치 및 관리 등에 관한 규정」[별표 1-2] 기준값. + * 등급을 바꾸면 이 값이 계획선 폼의 placeholder(미입력 시 서버 기본값)로 반영된다. + * 실제 기본값 결정은 서버 config가 단일 소스이며 여기서는 안내만 한다. + */ +const PROFILE_CRITERIA: Record< + RoutePanelValues["gradeClass"], + { speed: number; grade: Record; radius: number } +> = { + trunk: { speed: 40, grade: { normal: 7, special: 10 }, radius: 450 }, + branch: { speed: 30, grade: { normal: 8, special: 12 }, radius: 250 }, + work: { speed: 20, grade: { normal: 9, special: 14 }, radius: 100 }, +}; + interface PanelCallbacks { onSolve: () => void; onConfirm: () => void; @@ -195,10 +217,10 @@ export function createRoutePanel(callbacks: PanelCallbacks) { gradeLabel.className = "b05-route__field"; gradeLabel.append(document.createTextNode("임도 등급"), gradeClass); const minCurveRadius = numberField("최소 곡선반경 (m)"); - const maxUphillGrade = numberField("오르막 경사 상한"); - const maxDownhillGrade = numberField("내리막 경사 상한"); - const minUphillGrade = numberField("오르막 경사 하한"); - const minDownhillGrade = numberField("내리막 경사 하한"); + const maxUphillGrade = numberField("오르막 경사 상한 (%)"); + const maxDownhillGrade = numberField("내리막 경사 상한 (%)"); + const minUphillGrade = numberField("오르막 경사 하한 (%)"); + const minDownhillGrade = numberField("내리막 경사 하한 (%)"); const paved = checkbox("포장 임도", false); const avoidPass = checkbox("회피구역 통과 허용", false); const details = document.createElement("details"); @@ -234,6 +256,71 @@ export function createRoutePanel(callbacks: PanelCallbacks) { longSampleInterval.wrapper, ); + const gradeLine = section("계획선(시공계획고) 설계"); + const terrainType = document.createElement("select"); + terrainType.innerHTML = + ''; + const terrainLabel = document.createElement("label"); + terrainLabel.className = "b05-route__field"; + terrainLabel.append(document.createTextNode("지형 구분"), terrainType); + // 역기울기(5%) 상한을 어느 방향에 적용할지 결정한다. 계곡 횡단·능선 통과처럼 + // 주 진행방향이 없는 노선에 역기울기를 걸면 지형을 따라갈 수 없어진다. + const mainDirection = document.createElement("select"); + mainDirection.innerHTML = + '' + + '' + + '' + + ''; + const directionLabel = document.createElement("label"); + directionLabel.className = "b05-route__field"; + directionLabel.append(document.createTextNode("주 진행방향"), mainDirection); + const maxGradePct = numberField("최대 종단기울기 (%)"); + const minVerticalRadius = numberField("종단곡선 최소 반경 (m)"); + const minTangentLength = numberField("최소 직선 길이 (m)"); + const balanceSegmentLength = numberField("균형 구역 길이 (m, 비우면 전체)"); + const startElevationOffset = numberField("시점 계획고 조정 (m)"); + const endElevationOffset = numberField("종점 계획고 조정 (m)"); + const criteriaNote = document.createElement("p"); + criteriaNote.className = "b05-route__note"; + const gradeAdvanced = document.createElement("details"); + const gradeSummary = document.createElement("summary"); + gradeSummary.textContent = "기준값 직접 지정"; + gradeAdvanced.append( + gradeSummary, + maxGradePct.wrapper, + minVerticalRadius.wrapper, + minTangentLength.wrapper, + startElevationOffset.wrapper, + endElevationOffset.wrapper, + ); + const gradeHelp = document.createElement("details"); + gradeHelp.innerHTML = + "계획선이란?

공사 후 노면이 될 높이입니다. 직선과 종단곡선만으로 구성되며, " + + "절토량과 성토량이 균형을 이루도록(적분값 0) 자동 산출됩니다.

"; + gradeLine.body.append( + terrainLabel, + directionLabel, + balanceSegmentLength.wrapper, + criteriaNote, + gradeAdvanced, + gradeHelp, + ); + + /** 등급·지형 선택에 맞춰 법정 기준값을 placeholder와 안내문에 반영한다. */ + function syncCriteria(): void { + const criteria = PROFILE_CRITERIA[gradeClass.value as RoutePanelValues["gradeClass"]]; + const terrain = terrainType.value as RoutePanelValues["terrainType"]; + maxGradePct.placeholder = String(criteria.grade[terrain]); + minVerticalRadius.placeholder = String(criteria.radius); + minTangentLength.placeholder = "20"; + criteriaNote.textContent = + `설계속도 ${criteria.speed}km/h 기준 — 종단기울기 ${criteria.grade[terrain]}% 이하, ` + + `종단곡선 반경 ${criteria.radius}m 이상. 비워두면 이 기준이 적용됩니다.`; + } + gradeClass.addEventListener("change", syncCriteria); + terrainType.addEventListener("change", syncCriteria); + syncCriteria(); + const result = section("경로 설계 산출 결과"); const stale = document.createElement("span"); stale.className = "b05-route__stale"; @@ -264,6 +351,14 @@ export function createRoutePanel(callbacks: PanelCallbacks) { stationInterval, crossSampleInterval, longSampleInterval, + terrainType, + mainDirection, + maxGradePct, + minVerticalRadius, + minTangentLength, + balanceSegmentLength, + startElevationOffset, + endElevationOffset, ]; inputElements.forEach((input) => input.addEventListener("change", callbacks.onInputChange)); root.append( @@ -272,6 +367,7 @@ export function createRoutePanel(callbacks: PanelCallbacks) { selected.root, conditions.root, sectionOptions.root, + gradeLine.root, result.root, actionRow, ); @@ -294,6 +390,14 @@ export function createRoutePanel(callbacks: PanelCallbacks) { stationInterval: parseOptional(stationInterval), crossSampleInterval: parseOptional(crossSampleInterval), longSampleInterval: parseOptional(longSampleInterval), + terrainType: terrainType.value as RoutePanelValues["terrainType"], + mainDirection: mainDirection.value as RoutePanelValues["mainDirection"], + maxGradePct: parseOptional(maxGradePct), + minVerticalRadius: parseOptional(minVerticalRadius), + minTangentLength: parseOptional(minTangentLength), + balanceSegmentLength: parseOptional(balanceSegmentLength), + startElevationOffset: parseOptional(startElevationOffset), + endElevationOffset: parseOptional(endElevationOffset), }; }, restore(values: Partial) { @@ -312,6 +416,19 @@ export function createRoutePanel(callbacks: PanelCallbacks) { crossSampleInterval.value = String(values.crossSampleInterval); if (values.longSampleInterval != null) longSampleInterval.value = String(values.longSampleInterval); + if (values.terrainType) terrainType.value = values.terrainType; + if (values.mainDirection) mainDirection.value = values.mainDirection; + if (values.maxGradePct != null) maxGradePct.value = String(values.maxGradePct); + if (values.minVerticalRadius != null) + minVerticalRadius.value = String(values.minVerticalRadius); + if (values.minTangentLength != null) minTangentLength.value = String(values.minTangentLength); + if (values.balanceSegmentLength != null) + balanceSegmentLength.value = String(values.balanceSegmentLength); + if (values.startElevationOffset != null) + startElevationOffset.value = String(values.startElevationOffset); + if (values.endElevationOffset != null) + endElevationOffset.value = String(values.endElevationOffset); + syncCriteria(); }, setSelected(point: PlacedRoutePoint | null) { selected.root.hidden = !point; diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Panel.ts b/B05_wf2_Route/B05_wf2_Route_UI_Profile_Panel.ts index 7026ce4a..4585997d 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Panel.ts +++ b/B05_wf2_Route/B05_wf2_Route_UI_Profile_Panel.ts @@ -11,6 +11,45 @@ import "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css"; const COLLAPSED_KEY = "b05-route-profile-collapsed"; const HORIZONTAL_SCROLLBAR_HEIGHT = 16; +const BALANCE_BAR_HEIGHT = 24; + +/** 계획선 절·성토 균형 결과를 종단도 위에 한 줄 요약으로 보여준다. */ +function renderBalanceSummary(data: LongitudinalSection): HTMLElement | null { + const profile = data.design_profiles?.[0]; + if (!profile) return null; + const bar = document.createElement("div"); + bar.className = "b05-route-profile__balance"; + const summary = profile.summary; + const entries: Array<[string, string, string?]> = [ + ["절토", `${summary.cut_area_m2.toFixed(1)} m²`, "cut"], + ["성토", `${summary.fill_area_m2.toFixed(1)} m²`, "fill"], + ["균형오차", `${summary.balance_error_m2.toFixed(2)} m²${summary.balanced ? "" : " (근사)"}`], + ["최대 종단기울기", `${summary.max_grade_pct.toFixed(2)} %`], + ["종단곡선", `${summary.vertical_curve_count} 개`], + ]; + if (summary.balance_segment_count > 1) { + entries.push(["균형구역", `${summary.balance_segment_count} 개`]); + } + if (summary.suggested_elevation_offset_m !== null) { + entries.push(["시·종점 조정 제안", `${summary.suggested_elevation_offset_m.toFixed(1)} m`]); + } + entries.forEach(([label, value, tone]) => { + const item = document.createElement("span"); + item.className = `b05-route-profile__balance-item${tone ? ` is-${tone}` : ""}`; + const caption = document.createElement("em"); + caption.textContent = label; + item.append(caption, document.createTextNode(value)); + bar.append(item); + }); + if (summary.warnings.length) { + const warning = document.createElement("span"); + warning.className = "b05-route-profile__balance-warning"; + warning.textContent = `⚠ ${summary.warnings[0]}`; + warning.title = summary.warnings.join("\n"); + bar.append(warning); + } + return bar; +} function normalizedLongitudinal(data: LongitudinalSection): LongitudinalSection { return { @@ -44,24 +83,28 @@ export function createRouteProfilePanel(onSelectStation: (stationId: string) => function draw(): void { if (!detail || body.clientWidth <= 0 || body.clientHeight <= 0) return; const availableWidth = Math.max(1, body.clientWidth - 30); - const height = Math.max(1, body.clientHeight - HORIZONTAL_SCROLLBAR_HEIGHT); + const balance = renderBalanceSummary(detail.longitudinal); + const height = Math.max( + 1, + body.clientHeight - HORIZONTAL_SCROLLBAR_HEIGHT - (balance ? BALANCE_BAR_HEIGHT : 0), + ); const minimumWidth = longitudinalMinimumWidth(detail.longitudinal, stationInterval); const width = Math.max(availableWidth, minimumWidth); lastWidth = body.clientWidth; lastHeight = height; - body.replaceChildren( - createLongitudinalProfile( - normalizedLongitudinal(detail.longitudinal), - selectedStationId, - 1, - undefined, - onSelectStation, - stationInterval, - width, - height, - minimumWidth, - ), + const chart = createLongitudinalProfile( + normalizedLongitudinal(detail.longitudinal), + selectedStationId, + 1, + undefined, + onSelectStation, + stationInterval, + width, + height, + minimumWidth, + detail.longitudinal.design_profiles ?? [], ); + body.replaceChildren(...(balance ? [balance, chart] : [chart])); } const resizeObserver = new ResizeObserver(() => { diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Style.css b/B05_wf2_Route/B05_wf2_Route_UI_Style.css index 711d87c3..57b25cfd 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Style.css +++ b/B05_wf2_Route/B05_wf2_Route_UI_Style.css @@ -242,3 +242,50 @@ color: var(--color-text-body); font-size: var(--text-caption); } + +/* 계획선 설계 폼 안내문 */ +.b05-route__note { + margin: 0; + color: var(--color-text-muted, var(--color-plum-velvet)); + font-size: var(--text-caption); + line-height: 1.4; +} + +/* 종단면도 상단 절·성토 균형 지표 바 */ +.b05-route-profile__balance { + display: flex; + flex-wrap: nowrap; + gap: var(--spacing-16); + align-items: center; + height: 24px; + padding: 0 var(--spacing-8); + overflow-x: auto; + overflow-y: hidden; + font-size: var(--text-caption); + white-space: nowrap; +} + +.b05-route-profile__balance-item { + display: inline-flex; + gap: var(--spacing-8); + align-items: center; +} + +.b05-route-profile__balance-item em { + color: var(--color-text-muted, var(--color-plum-velvet)); + font-style: normal; +} + +.b05-route-profile__balance-item.is-cut em { + color: rgb(220 38 38); +} + +.b05-route-profile__balance-item.is-fill em { + color: rgb(37 99 235); +} + +.b05-route-profile__balance-warning { + overflow: hidden; + color: rgb(180 83 9); + text-overflow: ellipsis; +} diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch.ts b/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch.ts index 70c99638..1b486f42 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch.ts +++ b/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch.ts @@ -64,10 +64,55 @@ export interface SectionStation { frame: { left_xy: [number, number] }; } +/** 계획선 샘플 (계획고와 지반고, 그 차이). */ +export interface DesignProfileSample { + chainage_m: number; + elevation_m: number; + ground_elevation_m: number; + difference_m: number; +} + +/** 절·성토 균형을 판정하는 구역 단위 결과. */ +export interface DesignProfileSegment { + index: number; + start_chainage_m: number; + end_chainage_m: number; + cut_area_m2: number; + fill_area_m2: number; + balance_error_m2: number; +} + +export interface DesignProfileSummary { + cut_area_m2: number; + fill_area_m2: number; + balance_error_m2: number; + max_grade_pct: number; + vertical_curve_count: number; + pvi_count: number; + balance_segment_count: number; + balanced: boolean; + main_direction: string; + suggested_elevation_offset_m: number | null; + warnings: string[]; +} + +/** + * 종단 계획선. 횡단 설계 기반 계획선이 추가될 수 있어 배열로 전달된다. + */ +export interface DesignProfile { + id: string; + name: string; + basis: string; + samples: DesignProfileSample[]; + balance_segments: DesignProfileSegment[]; + summary: DesignProfileSummary; +} + export interface LongitudinalSection { length_m: number; samples: SectionSample[]; stations: SectionStation[]; + design_profiles?: DesignProfile[]; } export interface CrossSection extends SectionStation { diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Repository.py b/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Repository.py index fe04565c..79535892 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Repository.py +++ b/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Repository.py @@ -86,6 +86,36 @@ async def get_latest_section_options( return options if isinstance(options, dict) else None +async def get_latest_grade_options( + connection: aiomysql.Connection, project_id: UUID +) -> dict[str, Any] | None: + """최신 종단면 data에 저장된 계획선 **사용자 입력값**을 반환한다 (없으면 None). + + 해석이 끝난 기준값(`grade_options`)이 아니라 사용자가 명시 입력한 값 + (`grade_overrides`)만 돌려준다. 전자를 폴백으로 되쓰면 등급·지형 구분을 바꿔도 + 옛 기본값이 법정값을 이겨 갱신되지 않는다. + """ + async with connection.cursor() as cursor: + await cursor.execute( + """ + SELECT data + FROM longitudinal_sections + WHERE project_id = %s + ORDER BY id DESC + LIMIT 1 + """, + (str(project_id),), + ) + row = await cursor.fetchone() + if not row or not row[0]: + return None + data = row[0] + if isinstance(data, str): + data = json.loads(data) + overrides = data.get("grade_overrides") if isinstance(data, dict) else None + return overrides if isinstance(overrides, dict) else None + + async def get_route_generation_source( connection: aiomysql.Connection, project_id: UUID, route_id: int ) -> dict[str, Any] | None: diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_View.ts b/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_View.ts index 85c4fed2..704f7af5 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_View.ts +++ b/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_View.ts @@ -1,6 +1,7 @@ import { currentLanguageIndex, ui_locales } from "@ui/ui_template_locale"; import type { CrossSection, + DesignProfile, LongitudinalSection, SectionDetailResponse, SectionSample, @@ -112,6 +113,47 @@ export function longitudinalMinimumWidth( return LONG_PAD.left + LONG_PAD.right + Math.max(1, data.stations.length) * labelWidth; } +/** + * 계획선과 지반선 사이를 절토(계획고 < 지반고)·성토 구간으로 나눠 음영을 그린다. + * 부호가 바뀌는 지점에서 끊어 절토와 성토가 섞이지 않게 한다. + */ +function appendCutFillBands( + svg: SVGSVGElement, + profile: DesignProfile, + x: (chainage: number) => number, + planY: (index: number) => number, + groundY: (index: number) => number, +): void { + const samples = profile.samples; + let start = 0; + const flush = (end: number): void => { + if (end - start < 1) return; + const sign = samples[start].difference_m; + if (Math.abs(sign) < 1e-9) return; + const top: string[] = []; + const bottom: string[] = []; + for (let index = start; index <= end; index += 1) { + top.push(`${x(samples[index].chainage_m)},${planY(index)}`); + bottom.unshift(`${x(samples[index].chainage_m)},${groundY(index)}`); + } + svg.append( + svgElement("polygon", { + points: [...top, ...bottom].join(" "), + class: `b06-chart__band b06-chart__band--${sign < 0 ? "cut" : "fill"}`, + }), + ); + }; + for (let index = 1; index < samples.length; index += 1) { + const previous = samples[index - 1].difference_m; + const current = samples[index].difference_m; + if (previous === 0 || current === 0 || Math.sign(previous) !== Math.sign(current)) { + flush(index); + start = index; + } + } + flush(samples.length - 1); +} + export function createLongitudinalProfile( data: LongitudinalSection, selectedStationId: string | null, @@ -122,6 +164,7 @@ export function createLongitudinalProfile( widthPx = LONG_WIDTH, heightPx = LONG_HEIGHT, minimumWidthPx = widthPx, + designProfiles: DesignProfile[] = [], ): HTMLElement { const samples = data.samples.filter(validElevation); if (samples.length < 2) return emptyView(L("B06_Profile_View_NoLongitudinal")); @@ -141,7 +184,10 @@ export function createLongitudinalProfile( svg.append(svgElement("rect", { width: widthPx, height: heightPx, class: "b06-chart__bg" })); const maxChainage = Math.max(data.length_m, samples[samples.length - 1]?.chainage_m ?? 1, 1); - const elevations = samples.map((sample) => sample.elevation_m); + // 계획선이 지반선 밖으로 나가도 잘리지 않도록 세로 범위에 함께 반영한다. + const elevations = samples + .map((sample) => sample.elevation_m) + .concat(designProfiles.flatMap((profile) => profile.samples.map((s) => s.elevation_m))); const rawMin = yScaleOptions?.globalMinElevation ?? Math.min(...elevations); const rawMax = yScaleOptions?.globalMaxElevation ?? Math.max(...elevations); const elevationMid = (rawMin + rawMax) / 2; @@ -177,6 +223,32 @@ export function createLongitudinalProfile( ); } + // 절·성토 음영과 균형 구역 경계는 측점선·프로파일선보다 아래에 깔린다. + const toY = (elevation: number) => y(elevationMid + (elevation - elevationMid) * exaggeration); + for (const profile of designProfiles) { + if (profile.samples.length < 2) continue; + appendCutFillBands( + svg, + profile, + x, + (index) => toY(profile.samples[index].elevation_m), + (index) => toY(profile.samples[index].ground_elevation_m), + ); + if (profile.balance_segments.length > 1) { + for (const segment of profile.balance_segments.slice(1)) { + svg.append( + svgElement("line", { + x1: x(segment.start_chainage_m), + y1: LONG_PAD.top, + x2: x(segment.start_chainage_m), + y2: heightPx - LONG_PAD.bottom, + class: "b06-chart__balance-boundary", + }), + ); + } + } + } + for (const station of data.stations) { const stationX = x(station.chainage_m); const selected = station.station_id === selectedStationId; @@ -221,6 +293,17 @@ export function createLongitudinalProfile( return `${x(sample.chainage_m ?? 0)},${y(elevated)}`; }) .join(" "); + for (const profile of designProfiles) { + if (profile.samples.length < 2) continue; + svg.append( + svgElement("polyline", { + points: profile.samples + .map((sample) => `${x(sample.chainage_m)},${toY(sample.elevation_m)}`) + .join(" "), + class: "b06-chart__design-profile", + }), + ); + } svg.append( svgElement("polyline", { points, class: "b06-chart__profile" }), svgElement("line", { diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css b/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css index f01181b8..6dac0848 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css +++ b/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css @@ -298,6 +298,34 @@ stroke-width: 2.4; } +/* 종단 계획선(시공계획고): 지반선과 구분되도록 파선 + 강조색 */ +.b06-chart__design-profile { + fill: none; + stroke: var(--color-royal-amethyst); + stroke-width: 2.2; + stroke-dasharray: 8 4; +} + +/* 절토(계획고가 지반고보다 낮음) / 성토 구간 음영 */ +.b06-chart__band { + stroke: none; +} + +.b06-chart__band--cut { + fill: rgb(220 38 38 / 14%); +} + +.b06-chart__band--fill { + fill: rgb(37 99 235 / 14%); +} + +.b06-chart__balance-boundary { + stroke: var(--color-royal-amethyst); + stroke-width: 1.2; + stroke-dasharray: 3 3; + opacity: 0.55; +} + .b06-chart__station { cursor: pointer; } diff --git a/B07_wf4_DesignDetail/B07_wf4_DesignDetail_UI_Page.ts b/B07_wf4_DesignDetail/B07_wf4_DesignDetail_UI_Page.ts index 3e7bccc5..6fecd3d9 100644 --- a/B07_wf4_DesignDetail/B07_wf4_DesignDetail_UI_Page.ts +++ b/B07_wf4_DesignDetail/B07_wf4_DesignDetail_UI_Page.ts @@ -389,6 +389,17 @@ export async function renderB07DesignDetail(root: HTMLElement): Promise { const confirmActions = document.createElement("div"); confirmActions.className = "b07-drawing-actions"; confirmActions.append(confirmButton); + + // TODO: [임시 테스트용] B08 강제 이동 버튼 (테스트 완료 후 제거 예정) + const tempB08Btn = createButton({ + label: "[임시] B08 이동", + variant: "outlined", + onClick: () => { + if (projectId) goToWorkflowStage(projectId, WORKFLOW_STEP_ROUTES[5]); + }, + }); + confirmActions.append(tempB08Btn); + drawingPanel.append(confirmActions); const layout = createWorkflowLayout({ diff --git a/B08_wf5_Quantity/B08_wf5_Quantity_Template.ts b/B08_wf5_Quantity/B08_wf5_Quantity_Template.ts new file mode 100644 index 00000000..e64580e5 --- /dev/null +++ b/B08_wf5_Quantity/B08_wf5_Quantity_Template.ts @@ -0,0 +1,2068 @@ +/* ============================================================================= + * B08_wf5_Quantity_Template.ts + * 5차 워크플로우 (수량 산출) 엑셀 내역서 연동 템플릿 항목 정의 + * + * 엑셀 내역서(2025년 산불진화임도...)의 전체 145개 수량집계표 템플릿 완벽 매핑. + * 이전 단계(B07 등) 및 수식에 의해 자동 조달될 입력값(raw_qty, calc_qty 등)은 비워둔(null) 상태입니다. + * ========================================================================== */ + +export type QuantityCategory = + "earthwork" | "structure" | "revegetation" | "equipment" | "waste" | "material" | "labor"; + +export interface QuantityItemTemplate { + id: string; + item_no: string; // 호표 (예: "1", "2") + category: QuantityCategory; // 공종 분류 + name: string; // 명칭 + spec: string; // 규격 + unit: string; // 단위 + raw_qty: number | null; // B07 등 이전 설계 산출 수량 (비어있음) + allowance_rate: number; // 할증률 / 수량 보정 비율 (기본 1.0) + calc_qty: number | null; // 최종 산출 수량 (raw_qty * allowance_rate 또는 수식 계산) + formula_desc: string; // 수식 및 산출 근거 템플릿 표현식 + excel_ref_sheet: string; // 연동될 엑셀 시트명 + code_ref?: string; // 일위대가/노무/재료/경비 코드 +} + +export const QUANTITY_CATEGORY_LABELS: Record = { + earthwork: { ko: "1. 단가산출 근거 (40종)", en: "1. Unit Price Calcs" }, + structure: { ko: "2. 일위대가 구조물/배수 (25종)", en: "2. Structure & Drainage" }, + revegetation: { ko: "3. 녹화 및 환경 (37종)", en: "3. Revegetation & Misc" }, + equipment: { ko: "4. 중기 사용시간 (24종)", en: "4. Heavy Machinery Hours" }, + waste: { ko: "5. 일식 및 폐기물 (5종)", en: "5. Waste & Lump Sum" }, + material: { ko: "3. 자재 및 녹화 (37종)", en: "3. Materials" }, + labor: { ko: "6. 노무비 인력 (14종)", en: "6. Labor Personnel" }, +}; + +export const INITIAL_QUANTITY_TEMPLATES: QuantityItemTemplate[] = [ + { + id: "DG-001", + item_no: "제 1호표", + category: "earthwork", + name: "콘크리트믹서사용", + spec: "0.45 m3", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('콘크리트믹서사용')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D00083", + }, + { + id: "DG-002", + item_no: "제 2호표", + category: "earthwork", + name: "고임돌채집", + spec: "굴삭기0.7m3", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('고임돌채집')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D00091", + }, + { + id: "DG-003", + item_no: "제 3호표", + category: "earthwork", + name: "막자갈(파쇄석)채집", + spec: "", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('막자갈(파쇄석)채집')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D00408", + }, + { + id: "DG-004", + item_no: "제 4호표", + category: "earthwork", + name: "채움 콘크리트", + spec: "기계비빔", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('채움 콘크리트')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D00492", + }, + { + id: "DG-005", + item_no: "제 5호표", + category: "earthwork", + name: "단끊기", + spec: "절취없음", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('단끊기')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D00794", + }, + { + id: "DG-006", + item_no: "제 6호표", + category: "earthwork", + name: "막자갈채우기", + spec: "150mm내외", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('막자갈채우기')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D00867", + }, + { + id: "DG-007", + item_no: "제 7호표", + category: "earthwork", + name: "채움CON'C", + spec: "기계비빔", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('채움CON'C')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D00918", + }, + { + id: "DG-008", + item_no: "제 8호표", + category: "earthwork", + name: "고임돌채집", + spec: "굴삭기0.2m3", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('고임돌채집')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01030", + }, + { + id: "DG-009", + item_no: "제 9호표", + category: "earthwork", + name: "떼 하차비", + spec: "", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('떼 하차비')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01129", + }, + { + id: "DG-010", + item_no: "제 10호표", + category: "earthwork", + name: "평떼붙이기", + spec: "", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('평떼붙이기')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01329", + }, + { + id: "DG-011", + item_no: "제 11호표", + category: "earthwork", + name: "레미콘타설", + spec: "무근(장비)", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('레미콘타설')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01336", + }, + { + id: "DG-012", + item_no: "제 12호표", + category: "earthwork", + name: "유로폼 설치 및 해체", + spec: "간단", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('유로폼 설치 및 해체')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01351", + }, + { + id: "DG-013", + item_no: "제 13호표", + category: "earthwork", + name: "유로폼 설치 및 해체", + spec: "보통", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('유로폼 설치 및 해체')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01352", + }, + { + id: "DG-014", + item_no: "제 14호표", + category: "earthwork", + name: "콘크리포장(T=20cm)포설", + spec: "인력포설", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('콘크리포장(T=20cm)포설')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01354", + }, + { + id: "DG-015", + item_no: "제 15호표", + category: "earthwork", + name: "파쇄석 채집", + spec: "L3=35cm내외", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('파쇄석 채집')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01448", + }, + { + id: "DG-016", + item_no: "제 16호표", + category: "earthwork", + name: "구조물터파기(토사)", + spec: "굴착기0.6m3", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('구조물터파기(토사)')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01456", + }, + { + id: "DG-017", + item_no: "제 17호표", + category: "earthwork", + name: "구조물되메우기", + spec: "굴착기0.6m3", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('구조물되메우기')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01474", + }, + { + id: "DG-018", + item_no: "제 18호표", + category: "earthwork", + name: "구조물잔토처리", + spec: "굴착기0.6m3", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('구조물잔토처리')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01475", + }, + { + id: "DG-019", + item_no: "제 19호표", + category: "earthwork", + name: "제근", + spec: "밀림(90m3/ha이상)", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('제근')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01476", + }, + { + id: "DG-020", + item_no: "제 20호표", + category: "earthwork", + name: "토사절취", + spec: "굴삭기 0.7m3", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('토사절취')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01477", + }, + { + id: "DG-021", + item_no: "제 21호표", + category: "earthwork", + name: "암(연암)절취", + spec: "굴삭기07+브레카", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('암(연암)절취')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01478", + }, + { + id: "DG-022", + item_no: "제 22호표", + category: "earthwork", + name: "옆도랑파기(토사)", + spec: "굴삭기 0.4m3", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('옆도랑파기(토사)')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01479", + }, + { + id: "DG-023", + item_no: "제 23호표", + category: "earthwork", + name: "옆도랑파기(연암)", + spec: "대형브레카(굴삭기0.7㎥)", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('옆도랑파기(연암)')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01480", + }, + { + id: "DG-024", + item_no: "제 24호표", + category: "earthwork", + name: "도자운반-토사", + spec: "L=46m", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('도자운반-토사')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01481", + }, + { + id: "DG-025", + item_no: "제 25호표", + category: "earthwork", + name: "도자운반-연암", + spec: "L=44m", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('도자운반-연암')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01482", + }, + { + id: "DG-026", + item_no: "제 26호표", + category: "earthwork", + name: "덤프운반-토사", + spec: "L=85m", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('덤프운반-토사')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01483", + }, + { + id: "DG-027", + item_no: "제 27호표", + category: "earthwork", + name: "덤프운반-연암", + spec: "L=82m", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('덤프운반-연암')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01484", + }, + { + id: "DG-028", + item_no: "제 28호표", + category: "earthwork", + name: "성토사면다짐", + spec: "진동콤팩터", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('성토사면다짐')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01485", + }, + { + id: "DG-029", + item_no: "제 29호표", + category: "earthwork", + name: "노면 고르기", + spec: "", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('노면 고르기')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01486", + }, + { + id: "DG-030", + item_no: "제 30호표", + category: "earthwork", + name: "사토운반", + spec: "L=409m", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('사토운반')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01487", + }, + { + id: "DG-031", + item_no: "제 31호표", + category: "earthwork", + name: "수축줄눈(컷팅)", + spec: "콘크리트포장", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('수축줄눈(컷팅)')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01488", + }, + { + id: "DG-032", + item_no: "제 32호표", + category: "earthwork", + name: "낙석방지책(표준부)", + spec: "H=2.5m,B=2.0m", + unit: "경간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('낙석방지책(표준부)')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01489", + }, + { + id: "DG-033", + item_no: "제 33호표", + category: "earthwork", + name: "낙석방지책(단부)", + spec: "H=2.5m,B=2.0m", + unit: "경간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('낙석방지책(단부)')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01490", + }, + { + id: "DG-034", + item_no: "제 34호표", + category: "earthwork", + name: "구조물헐기", + spec: "무근,30cm미만", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('구조물헐기')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01491", + }, + { + id: "DG-035", + item_no: "제 35호표", + category: "earthwork", + name: "씨뿌리기", + spec: "", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('씨뿌리기')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01492", + }, + { + id: "DG-036", + item_no: "제 36호표", + category: "earthwork", + name: "중기운반", + spec: "L=34.5km", + unit: "식", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('중기운반')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01493", + }, + { + id: "DG-037", + item_no: "제 37호표", + category: "earthwork", + name: "모래(대)운반", + spec: "L=103.3km", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('모래(대)운반')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01494", + }, + { + id: "DG-038", + item_no: "제 38호표", + category: "earthwork", + name: "자갈류(대)운반", + spec: "L=77.4km", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('자갈류(대)운반')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01495", + }, + { + id: "DG-039", + item_no: "제 39호표", + category: "earthwork", + name: "시멘트(대)운반", + spec: "L=77.4km", + unit: "대", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('시멘트(대)운반')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01496", + }, + { + id: "DG-040", + item_no: "제 40호표", + category: "earthwork", + name: "파쇄(굴림)석 대운반", + spec: "L=77.4km", + unit: "톤", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Design.calc('파쇄(굴림)석 대운반')", + excel_ref_sheet: "단가산출근거목록표", + code_ref: "D01497", + }, + { + id: "IW-001", + item_no: "제 1호표", + category: "structure", + name: "유로폼", + spec: "보통", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('유로폼')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B00011", + }, + { + id: "IW-002", + item_no: "제 2호표", + category: "structure", + name: "철근(현장)가공", + spec: "Type-Ⅰ-----아님", + unit: "ton", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('철근(현장)가공')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B00032", + }, + { + id: "IW-003", + item_no: "제 3호표", + category: "structure", + name: "모르타르배합", + spec: "1:3", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('모르타르배합')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B00048", + }, + { + id: "IW-004", + item_no: "제 4호표", + category: "structure", + name: "문양 거푸집", + spec: "", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('문양 거푸집')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B00233", + }, + { + id: "IW-005", + item_no: "제 5호표", + category: "structure", + name: "연결(이음)철근", + spec: "", + unit: "kg", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('연결(이음)철근')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B00287", + }, + { + id: "IW-006", + item_no: "제 6호표", + category: "structure", + name: "돌붙임", + spec: "메붙임,L3=35cm이하", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('돌붙임')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B00374", + }, + { + id: "IW-007", + item_no: "제 7호표", + category: "structure", + name: "돌붙임", + spec: "찰붙임,L3=55cm이하", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('돌붙임')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B00378", + }, + { + id: "IW-008", + item_no: "제 8호표", + category: "structure", + name: "파형강관부설", + spec: "D=800mm", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('파형강관부설')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B00437", + }, + { + id: "IW-009", + item_no: "제 9호표", + category: "structure", + name: "물구멍설치", + spec: "D=50mm", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('물구멍설치')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B00442", + }, + { + id: "IW-010", + item_no: "제 10호표", + category: "structure", + name: "유로폼", + spec: "간단", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('유로폼')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B01299", + }, + { + id: "IW-011", + item_no: "제 11호표", + category: "structure", + name: "철근(현장)조립", + spec: "Type-Ⅰ-----아님", + unit: "ton", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('철근(현장)조립')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B01582", + }, + { + id: "IW-012", + item_no: "제 12호표", + category: "structure", + name: "돌쌓기", + spec: "찰(켜)쌓기,L3=55cm이하", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('돌쌓기')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B01608", + }, + { + id: "IW-013", + item_no: "제 13호표", + category: "structure", + name: "돌쌓기(깬돌)", + spec: "메(골)쌓기,L3=55cm이하", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('돌쌓기(깬돌)')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B01680", + }, + { + id: "IW-014", + item_no: "제 14호표", + category: "structure", + name: "파형강관부설", + spec: "D=800mm", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('파형강관부설')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02119", + }, + { + id: "IW-015", + item_no: "제 15호표", + category: "structure", + name: "관보호공", + spec: "돌쌓기(ㅁ형)", + unit: "개소", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('관보호공')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02120", + }, + { + id: "IW-016", + item_no: "제 16호표", + category: "structure", + name: "기초CON'C", + spec: "T=50cm, B=70cm", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('기초CON'C')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02121", + }, + { + id: "IW-017", + item_no: "제 17호표", + category: "structure", + name: "돌기슭막이(고1.0)", + spec: "(찰쌓기,L3=45cm)", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('돌기슭막이(고1.0)')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02122", + }, + { + id: "IW-018", + item_no: "제 18호표", + category: "structure", + name: "돌조공(고0.5)", + spec: "(메쌓기,L3=45cm)", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('돌조공(고0.5)')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02123", + }, + { + id: "IW-019", + item_no: "제 19호표", + category: "structure", + name: "제형돌수로", + spec: "B=0.75m", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('제형돌수로')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02124", + }, + { + id: "IW-020", + item_no: "제 20호표", + category: "structure", + name: "돌붙임", + spec: "깬돌,메붙임 L3=35cm", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('돌붙임')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02125", + }, + { + id: "IW-021", + item_no: "제 21호표", + category: "structure", + name: "콘크리트포장", + spec: "T=20㎝", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('콘크리트포장')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02126", + }, + { + id: "IW-022", + item_no: "제 22호표", + category: "structure", + name: "포장거푸집", + spec: "T=20cm(1면기준)", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('포장거푸집')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02127", + }, + { + id: "IW-023", + item_no: "제 23호표", + category: "structure", + name: "L형옹벽측구", + spec: "H=1.05m", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('L형옹벽측구')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02128", + }, + { + id: "IW-024", + item_no: "제 24호표", + category: "structure", + name: "기초CON'C", + spec: "(0.4×0.4 H:0.6)", + unit: "개소", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('기초CON'C')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02129", + }, + { + id: "IW-025", + item_no: "제 25호표", + category: "structure", + name: "선떼(7급)붙이기", + spec: "(단끊기無;천단부)", + unit: "m", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= B07_Structure.calc('선떼(7급)붙이기')", + excel_ref_sheet: "일위대가목록표", + code_ref: "B02130", + }, + { + id: "EQ-001", + item_no: "1", + category: "equipment", + name: "트럭탑재형 크레인", + spec: "5톤", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('트럭탑재형 크레인')", + excel_ref_sheet: "중기목록표", + code_ref: "X00002", + }, + { + id: "EQ-002", + item_no: "2", + category: "equipment", + name: "굴삭기+브레카(0.7m3)", + spec: "", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('굴삭기+브레카(0.7m3)')", + excel_ref_sheet: "중기목록표", + code_ref: "X00004", + }, + { + id: "EQ-003", + item_no: "3", + category: "equipment", + name: "불도저(무한궤도)", + spec: "19톤", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('불도저(무한궤도)')", + excel_ref_sheet: "중기목록표", + code_ref: "X00008", + }, + { + id: "EQ-004", + item_no: "4", + category: "equipment", + name: "굴삭기(무한궤도)", + spec: "0.4㎥", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('굴삭기(무한궤도)')", + excel_ref_sheet: "중기목록표", + code_ref: "X00021", + }, + { + id: "EQ-005", + item_no: "5", + category: "equipment", + name: "굴삭기(무한궤도)", + spec: "0.7㎥", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('굴삭기(무한궤도)')", + excel_ref_sheet: "중기목록표", + code_ref: "X00022", + }, + { + id: "EQ-006", + item_no: "6", + category: "equipment", + name: "대형 브레이커", + spec: "0.7㎥", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('대형 브레이커')", + excel_ref_sheet: "중기목록표", + code_ref: "X00029", + }, + { + id: "EQ-007", + item_no: "7", + category: "equipment", + name: "유압식 진동콤팩터(굴삭기 부착용)", + spec: "0.7㎥", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('유압식 진동콤팩터(굴삭기 부착용)')", + excel_ref_sheet: "중기목록표", + code_ref: "X00032", + }, + { + id: "EQ-008", + item_no: "8", + category: "equipment", + name: "덤프트럭", + spec: "2.5톤", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('덤프트럭')", + excel_ref_sheet: "중기목록표", + code_ref: "X00060", + }, + { + id: "EQ-009", + item_no: "9", + category: "equipment", + name: "덤프트럭", + spec: "4.5톤", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('덤프트럭')", + excel_ref_sheet: "중기목록표", + code_ref: "X00061", + }, + { + id: "EQ-010", + item_no: "10", + category: "equipment", + name: "덤프트럭", + spec: "10.5톤", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('덤프트럭')", + excel_ref_sheet: "중기목록표", + code_ref: "X00063", + }, + { + id: "EQ-011", + item_no: "11", + category: "equipment", + name: "덤프트럭", + spec: "15톤", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('덤프트럭')", + excel_ref_sheet: "중기목록표", + code_ref: "X00064", + }, + { + id: "EQ-012", + item_no: "12", + category: "equipment", + name: "트럭트랙터및트레일러", + spec: "20톤", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('트럭트랙터및트레일러')", + excel_ref_sheet: "중기목록표", + code_ref: "X00127", + }, + { + id: "EQ-013", + item_no: "13", + category: "equipment", + name: "굴삭기(무한궤도)", + spec: "0.2㎥:할증120%", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('굴삭기(무한궤도)')", + excel_ref_sheet: "중기목록표", + code_ref: "X00268", + }, + { + id: "EQ-014", + item_no: "14", + category: "equipment", + name: "굴삭기(무한궤도)", + spec: "0.7㎥:할증120%", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('굴삭기(무한궤도)')", + excel_ref_sheet: "중기목록표", + code_ref: "X00270", + }, + { + id: "EQ-015", + item_no: "15", + category: "equipment", + name: "덤프트럭", + spec: "2.5톤:할증125%", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('덤프트럭')", + excel_ref_sheet: "중기목록표", + code_ref: "X00272", + }, + { + id: "EQ-016", + item_no: "16", + category: "equipment", + name: "덤프트럭", + spec: "15톤:할증125%", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('덤프트럭')", + excel_ref_sheet: "중기목록표", + code_ref: "X00275", + }, + { + id: "EQ-017", + item_no: "17", + category: "equipment", + name: "굴삭기(타이어)", + spec: "0.6㎥", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('굴삭기(타이어)')", + excel_ref_sheet: "중기목록표", + code_ref: "X00283", + }, + { + id: "EQ-018", + item_no: "18", + category: "equipment", + name: "덤프트럭", + spec: "24톤", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('덤프트럭')", + excel_ref_sheet: "중기목록표", + code_ref: "X00292", + }, + { + id: "EQ-019", + item_no: "19", + category: "equipment", + name: "콘크리트 믹서", + spec: "0.45㎥", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('콘크리트 믹서')", + excel_ref_sheet: "중기목록표", + code_ref: "X00350", + }, + { + id: "EQ-020", + item_no: "20", + category: "equipment", + name: "커터(콘크리트 및 아스팔트용)", + spec: "320-440mm", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('커터(콘크리트 및 아스팔트용)')", + excel_ref_sheet: "중기목록표", + code_ref: "X00352", + }, + { + id: "EQ-021", + item_no: "21", + category: "equipment", + name: "트럭탑재형 크레인", + spec: "10톤", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('트럭탑재형 크레인')", + excel_ref_sheet: "중기목록표", + code_ref: "X00568", + }, + { + id: "EQ-022", + item_no: "22", + category: "equipment", + name: "덤프트럭", + spec: "24톤(할증125%)", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('덤프트럭')", + excel_ref_sheet: "중기목록표", + code_ref: "X00740", + }, + { + id: "EQ-023", + item_no: "23", + category: "equipment", + name: "굴삭기+부착용집게(06)", + spec: "", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('굴삭기+부착용집게(06)')", + excel_ref_sheet: "중기목록표", + code_ref: "X00750", + }, + { + id: "EQ-024", + item_no: "24", + category: "equipment", + name: "동력분무기", + spec: "4.85㎾", + unit: "시간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Equipment.time_calc('동력분무기')", + excel_ref_sheet: "중기목록표", + code_ref: "X00751", + }, + { + id: "MT-001", + item_no: "1", + category: "material", + name: "비닐", + spec: "0.07mm", + unit: "M2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('비닐')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00011", + }, + { + id: "MT-002", + item_no: "2", + category: "material", + name: "면목", + spec: "A28", + unit: "M", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('면목')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00026", + }, + { + id: "MT-003", + item_no: "3", + category: "material", + name: "문양거푸집", + spec: "910*910*25", + unit: "매", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('문양거푸집')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00028", + }, + { + id: "MT-004", + item_no: "4", + category: "material", + name: "블레이드", + spec: "d=320~400mm t=3.2", + unit: "개", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('블레이드')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00029", + }, + { + id: "MT-005", + item_no: "5", + category: "material", + name: "결속선", + spec: "#20 , 0.9M/M", + unit: "KG", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('결속선')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00034", + }, + { + id: "MT-006", + item_no: "6", + category: "material", + name: "요소", + spec: "", + unit: "KG", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('요소')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00056", + }, + { + id: "MT-007", + item_no: "7", + category: "material", + name: "인산질비료", + spec: "용성인비인산", + unit: "KG", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('인산질비료')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00057", + }, + { + id: "MT-008", + item_no: "8", + category: "material", + name: "잡품", + spec: "주연료의 %", + unit: "%", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('잡품')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00109", + }, + { + id: "MT-009", + item_no: "9", + category: "material", + name: "시멘트", + spec: "별도계상", + unit: "KG", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('시멘트')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00117", + }, + { + id: "MT-010", + item_no: "10", + category: "material", + name: "레미콘", + spec: "별도계상", + unit: "M3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('레미콘')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00125", + }, + { + id: "MT-011", + item_no: "11", + category: "material", + name: "패널", + spec: "600*1200mm", + unit: "매", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('패널')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00131", + }, + { + id: "MT-012", + item_no: "12", + category: "material", + name: "내부코너패널", + spec: "(200+200)*1200mm", + unit: "매", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('내부코너패널')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00132", + }, + { + id: "MT-013", + item_no: "13", + category: "material", + name: "천연부엽토", + spec: "", + unit: "KG", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('천연부엽토')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00157", + }, + { + id: "MT-014", + item_no: "14", + category: "material", + name: "파형강관(800M/M)", + spec: "별도계상", + unit: "M", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('파형강관(800M/M)')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00214", + }, + { + id: "MT-015", + item_no: "15", + category: "material", + name: "이형철근 D13", + spec: "별도계상", + unit: "TON", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('이형철근 D13')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00227", + }, + { + id: "MT-016", + item_no: "16", + category: "material", + name: "와이어매쉬", + spec: "#6,100*100", + unit: "M2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('와이어매쉬')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00231", + }, + { + id: "MT-017", + item_no: "17", + category: "material", + name: "휘발유", + spec: "무연", + unit: "L", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('휘발유')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00302", + }, + { + id: "MT-018", + item_no: "18", + category: "material", + name: "경유", + spec: "저유황", + unit: "L", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('경유')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00303", + }, + { + id: "MT-019", + item_no: "19", + category: "material", + name: "레미콘(울진)", + spec: "25-18-80(세액포함)", + unit: "M3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('레미콘(울진)')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00344", + }, + { + id: "MT-020", + item_no: "20", + category: "material", + name: "레미콘(울진)", + spec: "25-21-80(세액포함)", + unit: "M3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('레미콘(울진)')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00424", + }, + { + id: "MT-021", + item_no: "21", + category: "material", + name: "깬돌", + spec: "구입-자재별산", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('깬돌')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00453", + }, + { + id: "MT-022", + item_no: "22", + category: "material", + name: "모래", + spec: "별도계상", + unit: "㎥", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('모래')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00488", + }, + { + id: "MT-023", + item_no: "23", + category: "material", + name: "조달수수료", + spec: "", + unit: "%", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('조달수수료')", + excel_ref_sheet: "재료비목록표", + code_ref: "M00918", + }, + { + id: "MT-024", + item_no: "24", + category: "material", + name: "물", + spec: "", + unit: "ℓ", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('물')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01054", + }, + { + id: "MT-025", + item_no: "25", + category: "material", + name: "떼", + spec: "", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('떼')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01150", + }, + { + id: "MT-026", + item_no: "26", + category: "material", + name: "종자", + spec: "초본류", + unit: "KG", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('종자')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01225", + }, + { + id: "MT-027", + item_no: "27", + category: "material", + name: "종자", + spec: "목본류", + unit: "KG", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('종자')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01226", + }, + { + id: "MT-028", + item_no: "28", + category: "material", + name: "낙석방지책", + spec: "H2500×W2000(표준)", + unit: "경간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('낙석방지책')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01324", + }, + { + id: "MT-029", + item_no: "29", + category: "material", + name: "낙석방지책", + spec: "H2500×W2000(단부)", + unit: "경간", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('낙석방지책')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01325", + }, + { + id: "MT-030", + item_no: "30", + category: "material", + name: "P.V.C PIPE", + spec: "VG2(50m/m)", + unit: "M", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('P.V.C PIPE')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01436", + }, + { + id: "MT-031", + item_no: "31", + category: "material", + name: "파형강관", + spec: "Φ800m/m, 2.7t", + unit: "M", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('파형강관')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01513", + }, + { + id: "MT-032", + item_no: "32", + category: "material", + name: "모래", + spec: "상차가(안동)", + unit: "M3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('모래')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01514", + }, + { + id: "MT-033", + item_no: "33", + category: "material", + name: "자갈", + spec: "상차가(영주)", + unit: "M3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('자갈')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01515", + }, + { + id: "MT-034", + item_no: "34", + category: "material", + name: "막자갈", + spec: "상차가(영주)", + unit: "M3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('막자갈')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01516", + }, + { + id: "MT-035", + item_no: "35", + category: "material", + name: "시멘트", + spec: "40Kg/포", + unit: "대", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('시멘트')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01517", + }, + { + id: "MT-036", + item_no: "36", + category: "material", + name: "이형철근,SD400", + spec: "D13~32m/m(세액별도)", + unit: "TON", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('이형철근,SD400')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01518", + }, + { + id: "MT-037", + item_no: "37", + category: "material", + name: "파쇄석(L3=45~55cm)", + spec: "상차가(영주)", + unit: "톤", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Material.sum('파쇄석(L3=45~55cm)')", + excel_ref_sheet: "재료비목록표", + code_ref: "M01519", + }, + { + id: "LB-001", + item_no: "1", + category: "labor", + name: "형틀목공", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('형틀목공')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00002", + }, + { + id: "LB-002", + item_no: "2", + category: "labor", + name: "철근공", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('철근공')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00004", + }, + { + id: "LB-003", + item_no: "3", + category: "labor", + name: "석공", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('석공')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00005", + }, + { + id: "LB-004", + item_no: "4", + category: "labor", + name: "콘크리트공", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('콘크리트공')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00007", + }, + { + id: "LB-005", + item_no: "5", + category: "labor", + name: "조경공", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('조경공')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00012", + }, + { + id: "LB-006", + item_no: "6", + category: "labor", + name: "작업반장", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('작업반장')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00014", + }, + { + id: "LB-007", + item_no: "7", + category: "labor", + name: "특별인부", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('특별인부')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00015", + }, + { + id: "LB-008", + item_no: "8", + category: "labor", + name: "보통인부", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('보통인부')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00016", + }, + { + id: "LB-009", + item_no: "9", + category: "labor", + name: "용접공", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('용접공')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00019", + }, + { + id: "LB-010", + item_no: "10", + category: "labor", + name: "포장공", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('포장공')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00025", + }, + { + id: "LB-011", + item_no: "11", + category: "labor", + name: "건설기계운전사", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('건설기계운전사')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00038", + }, + { + id: "LB-012", + item_no: "12", + category: "labor", + name: "화물차운전사", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('화물차운전사')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00039", + }, + { + id: "LB-013", + item_no: "13", + category: "labor", + name: "일반기계운전사", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('일반기계운전사')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00040", + }, + { + id: "LB-014", + item_no: "14", + category: "labor", + name: "배관공(수도)", + spec: "", + unit: "인", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Labor.total_mandays('배관공(수도)')", + excel_ref_sheet: "노무비목록표", + code_ref: "L00061", + }, + { + id: "WS-001", + item_no: "1", + category: "waste", + name: "폐기물처리", + spec: "폐콘크리트", + unit: "TON", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Waste.estimate('폐기물처리')", + excel_ref_sheet: "일식견적목록표", + code_ref: "W00045", + }, + { + id: "WS-002", + item_no: "2", + category: "waste", + name: "폐기물운반", + spec: "30km이하", + unit: "TON", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Waste.estimate('폐기물운반')", + excel_ref_sheet: "일식견적목록표", + code_ref: "W00046", + }, + { + id: "WS-003", + item_no: "3", + category: "waste", + name: "깬돌", + spec: "구입별산", + unit: "m2", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Waste.estimate('깬돌')", + excel_ref_sheet: "일식견적목록표", + code_ref: "W01835", + }, + { + id: "WS-004", + item_no: "4", + category: "waste", + name: "깬돌", + spec: "구입별산", + unit: "Ton", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Waste.estimate('깬돌')", + excel_ref_sheet: "일식견적목록표", + code_ref: "W02335", + }, + { + id: "WS-005", + item_no: "5", + category: "waste", + name: "무대처리", + spec: "", + unit: "m3", + raw_qty: null, + allowance_rate: 1.0, + calc_qty: null, + formula_desc: "= Waste.estimate('무대처리')", + excel_ref_sheet: "일식견적목록표", + code_ref: "W02336", + }, +]; diff --git a/B08_wf5_Quantity/B08_wf5_Quantity_UI_Page.ts b/B08_wf5_Quantity/B08_wf5_Quantity_UI_Page.ts index 869947ba..d7b74aa6 100644 --- a/B08_wf5_Quantity/B08_wf5_Quantity_UI_Page.ts +++ b/B08_wf5_Quantity/B08_wf5_Quantity_UI_Page.ts @@ -1,26 +1,222 @@ /* ============================================================================= * B08_wf5_Quantity_UI_Page.ts - * 로그인 후 08: 5차 워크플로우 (수량 산출) + * 로그인 후 08: 5차 워크플로우 (수량 산출 UI 메인) * - * ⚠️ 본문 준비 중 — 워크플로우 셸(헤더+스텝바)만 구성. 추후 구체화. - * 제약 준수 (frontend.md §2 3단 레이아웃): createWorkflowLayout 재사용. + * 엑셀 내역서(2025년 산불진화임도...) 연동을 위한 전체 145개 템플릿 UI. + * 입력데이터(B07 또는 이전 산출값)는 비어있는(null) 상태로 조율되며, 수식 기반 템플릿 항목을 표시합니다. + * 오직 B08_wf5_Quantity 폴더 내의 파일만 다룹니다. * ========================================================================== */ import { ui_locales, currentLanguageIndex } from "@ui/ui_template_locale"; import { renderPendingWorkflow, workflowSteps } from "../A00_Common/b_page_scaffold"; +import { + INITIAL_QUANTITY_TEMPLATES, + QUANTITY_CATEGORY_LABELS, + QuantityCategory, + QuantityItemTemplate, +} from "./B08_wf5_Quantity_Template"; +import "./B08_wf5_Quantity_UI_Style.css"; /** locale 헬퍼 */ function L(key: keyof typeof ui_locales): string { return ui_locales[key][currentLanguageIndex]; } -/* ----------------------------------------------------------------------------- - * 페이지 진입점 - * -------------------------------------------------------------------------- */ +/** 현재 활성화된 공종 탭 */ +let currentCategory: QuantityCategory = "earthwork"; + +/** + * B08 수량 산출 메인 렌더링 함수 + */ export async function renderB08Quantity(root: HTMLElement): Promise { + // 1. 공통 Workflow Shell 렌더링 await renderPendingWorkflow(root, { title: L("B08_Quantity_Title"), steps: workflowSteps(), activeStep: 5, }); + + // 2. 본문 컨테이너 슬롯 확보 (Workflow Shell 내부 본문 영역) + const bodyContainer = root.querySelector(".workflow-body") || root; + bodyContainer.innerHTML = ""; // 기존 준비중 메시지 대체 + + const container = document.createElement("div"); + container.className = "b08-quantity-container"; + bodyContainer.appendChild(container); + + // 3. UI 컴포넌트 조합 + renderSummaryGrid(container); + renderTabBar(container); + renderTableArea(container); + renderActionBar(container); +} + +/** + * 1. 상단 요약 카드 그리드 렌더링 (입력 데이터 펜딩 상태) + */ +function renderSummaryGrid(parent: HTMLElement): void { + const grid = document.createElement("div"); + grid.className = "b08-summary-grid"; + + const summaryItems = [ + { title: "전체 엑셀 템플릿", val: "총 145개 항목", desc: "6개 세부 공종 100% 매핑 완료" }, + { title: "단가산출 / 일위대가", val: "65개 표준공종", desc: "토공 40종 + 일위대가 25종" }, + { title: "자재 & 노무비", val: "51개 자재/인력", desc: "자재 37종 + 노무인부 14종" }, + { title: "중기 & 일식/폐기물", val: "29개 중기/일식", desc: "중기시간 24종 + 폐기물 5종" }, + ]; + + grid.innerHTML = summaryItems + .map( + (item) => ` +
+
${item.title}
+
${item.val}
+
${item.desc}
+
+ `, + ) + .join(""); + + parent.appendChild(grid); +} + +/** + * 2. 공종 탭 바 렌더링 + */ +function renderTabBar(parent: HTMLElement): void { + const tabBar = document.createElement("div"); + tabBar.className = "b08-tab-bar"; + + const categories: QuantityCategory[] = [ + "earthwork", + "structure", + "material", + "equipment", + "waste", + "labor", + ]; + + categories.forEach((cat) => { + const btn = document.createElement("button"); + btn.className = `b08-tab-btn ${cat === currentCategory ? "active" : ""}`; + btn.textContent = QUANTITY_CATEGORY_LABELS[cat].ko; + btn.addEventListener("click", () => { + currentCategory = cat; + // 탭 업데이트 + tabBar.querySelectorAll(".b08-tab-btn").forEach((b) => b.classList.remove("active")); + btn.classList.add("active"); + // 테이블 재렌더링 + const tableArea = parent.querySelector("#b08-table-area"); + if (tableArea) { + tableArea.innerHTML = ""; + renderTableContent(tableArea as HTMLElement); + } + }); + tabBar.appendChild(btn); + }); + + parent.appendChild(tabBar); +} + +/** + * 3. 수량 집계 데이터 테이블 영역 렌더링 + */ +function renderTableArea(parent: HTMLElement): void { + const tableArea = document.createElement("div"); + tableArea.id = "b08-table-area"; + tableArea.className = "b08-table-wrapper"; + parent.appendChild(tableArea); + + renderTableContent(tableArea); +} + +/** + * 테이블 내용 렌더링 (현재 카테고리 기준) + */ +function renderTableContent(parent: HTMLElement): void { + const items = INITIAL_QUANTITY_TEMPLATES.filter((item) => item.category === currentCategory); + + const table = document.createElement("table"); + table.className = "b08-table"; + + table.innerHTML = ` + + + 호표 + 명칭 + 규격 + 단위 + 설계 산출 수량 (raw_qty) + 할증률 + 최종 산출 수량 + 엑셀 수식 및 산출 근거 (Formula) + 연동 시트 / 코드 + + + + ${items.map((item) => renderTableRow(item)).join("")} + + `; + + parent.appendChild(table); +} + +/** + * 테이블 행 HTML 생성 + */ +function renderTableRow(item: QuantityItemTemplate): string { + const rawQtyDisplay = + item.raw_qty !== null + ? item.raw_qty.toLocaleString() + : `[입력 대기]`; + + const calcQtyDisplay = + item.calc_qty !== null + ? item.calc_qty.toLocaleString() + : `[수식 자동계산]`; + + const codeBadge = item.code_ref + ? `${item.code_ref}` + : ""; + + return ` + + ${item.item_no} + ${item.name} + ${item.spec} + ${item.unit} + ${rawQtyDisplay} + ${item.allowance_rate} + ${calcQtyDisplay} + ${item.formula_desc} + + ${item.excel_ref_sheet} + ${codeBadge} + + + `; +} + +/** + * 4. 하단 컨트롤/액션 바 렌더링 + */ +function renderActionBar(parent: HTMLElement): void { + const actionBar = document.createElement("div"); + actionBar.className = "b08-action-bar"; + + actionBar.innerHTML = ` +
+ 💡 엑셀 내역서 145개 전체 템플릿 매핑 완료: 입력 수량값은 차후 이전 워크플로우(B07 등) 및 수식 엔진에 의해 자동 기입됩니다. +
+ + `; + + const confirmBtn = actionBar.querySelector(".b08-btn-confirm"); + confirmBtn?.addEventListener("click", () => { + alert("B08 수량 템플릿 항목(145종)이 확정되었습니다. B09 견적 파이프라인으로 전달됩니다."); + }); + + parent.appendChild(actionBar); } diff --git a/B08_wf5_Quantity/B08_wf5_Quantity_UI_Style.css b/B08_wf5_Quantity/B08_wf5_Quantity_UI_Style.css new file mode 100644 index 00000000..68935516 --- /dev/null +++ b/B08_wf5_Quantity/B08_wf5_Quantity_UI_Style.css @@ -0,0 +1,212 @@ +/* ============================================================================= + * B08_wf5_Quantity_UI_Style.css + * B08 수량 산출 UI 스타일 정의 + * ========================================================================== */ + +.b08-quantity-container { + display: flex; + flex-direction: column; + gap: 20px; + padding: 24px; + background-color: var(--bg-primary, #1e1e2d); + color: var(--text-primary, #ffffff); + font-family: + "Inter", + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + sans-serif; + min-height: calc(100vh - 120px); + box-sizing: border-box; +} + +/* 요약 카드 그리드 */ +.b08-summary-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 16px; +} + +.b08-card { + background: var(--bg-secondary, #2b2b40); + border: 1px solid var(--border-color, #3a3a55); + border-radius: 12px; + padding: 16px 20px; + display: flex; + flex-direction: column; + gap: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + transition: + transform 0.2s ease, + border-color 0.2s ease; +} + +.b08-card:hover { + transform: translateY(-2px); + border-color: var(--accent-color, #4e80ee); +} + +.b08-card-header { + font-size: 0.85rem; + color: var(--text-secondary, #9a9ab0); + font-weight: 600; + display: flex; + align-items: center; + gap: 6px; +} + +.b08-card-value { + font-size: 1.5rem; + font-weight: 700; + color: var(--text-highlight, #38ef7d); +} + +.b08-card-value.empty-state { + color: #ff9f43; + font-size: 1.1rem; + font-style: italic; +} + +.b08-card-sub { + font-size: 0.75rem; + color: #727290; +} + +/* 공종 탭 버튼 영역 */ +.b08-tab-bar { + display: flex; + gap: 8px; + border-bottom: 2px solid var(--border-color, #3a3a55); + padding-bottom: 8px; + overflow-x: auto; +} + +.b08-tab-btn { + background: transparent; + border: 1px solid transparent; + color: var(--text-secondary, #a0a0c0); + padding: 10px 18px; + border-radius: 8px 8px 0 0; + cursor: pointer; + font-weight: 600; + font-size: 0.9rem; + transition: all 0.2s ease; + white-space: nowrap; +} + +.b08-tab-btn:hover { + background: var(--bg-hover, rgba(255, 255, 255, 0.05)); + color: #ffffff; +} + +.b08-tab-btn.active { + background: var(--bg-secondary, #2b2b40); + border-color: var(--accent-color, #4e80ee) var(--accent-color, #4e80ee) transparent + var(--accent-color, #4e80ee); + color: var(--accent-color, #4e80ee); +} + +/* 수량 집계 데이터 테이블 */ +.b08-table-wrapper { + background: var(--bg-secondary, #2b2b40); + border-radius: 12px; + border: 1px solid var(--border-color, #3a3a55); + overflow-x: auto; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} + +.b08-table { + width: 100%; + border-collapse: collapse; + text-align: left; + font-size: 0.88rem; +} + +.b08-table th { + background-color: rgba(0, 0, 0, 0.25); + color: var(--text-secondary, #b5b5d0); + font-weight: 600; + padding: 12px 14px; + border-bottom: 1px solid var(--border-color, #3a3a55); + white-space: nowrap; +} + +.b08-table td { + padding: 12px 14px; + border-bottom: 1px solid rgba(255, 255, 255, 0.05); + color: #e0e0f0; +} + +.b08-table tbody tr:hover { + background-color: rgba(255, 255, 255, 0.03); +} + +.b08-badge { + display: inline-block; + padding: 3px 8px; + border-radius: 4px; + font-size: 0.75rem; + font-weight: 600; +} + +.b08-badge-sheet { + background-color: rgba(78, 128, 238, 0.15); + color: #4e80ee; + border: 1px solid rgba(78, 128, 238, 0.3); +} + +.b08-badge-code { + background-color: rgba(155, 89, 182, 0.15); + color: #af7ac5; + border: 1px solid rgba(155, 89, 182, 0.3); +} + +.b08-empty-val { + color: #ff9f43; + font-style: italic; + font-weight: 500; +} + +.b08-formula-cell { + font-family: "Fira Code", "Courier New", monospace; + font-size: 0.8rem; + color: #00cec9; + background: rgba(0, 206, 201, 0.05); + padding: 4px 8px; + border-radius: 4px; +} + +/* 하단 컨트롤 바 */ +.b08-action-bar { + display: flex; + justify-content: space-between; + align-items: center; + background: var(--bg-secondary, #2b2b40); + padding: 16px 24px; + border-radius: 12px; + border: 1px solid var(--border-color, #3a3a55); +} + +.b08-info-text { + font-size: 0.85rem; + color: #9a9ab0; +} + +.b08-btn-confirm { + background: linear-gradient(135deg, #4e80ee 0%, #38ef7d 100%); + color: #000000; + font-weight: 700; + border: none; + padding: 12px 24px; + border-radius: 8px; + cursor: pointer; + transition: + opacity 0.2s ease, + transform 0.2s ease; +} + +.b08-btn-confirm:hover { + opacity: 0.9; + transform: scale(1.02); +} diff --git a/config/config_system.py b/config/config_system.py index 9dae5b5d..8b44a5f2 100644 --- a/config/config_system.py +++ b/config/config_system.py @@ -244,6 +244,57 @@ SECTION_INCLUDE_ENDPOINT = os.getenv("SECTION_INCLUDE_ENDPOINT", "True").lower() FOREST_ROAD_MIN_WIDTH_M = {"trunk": 3.0, "branch": 3.0, "work": 2.5} +# ───────────────────────────────────────────────────────────────────────── +# 5-5. 종단 계획선(계획고) 설계 기준 (B05 WF2) +# +# 출처: 「임도설치 및 관리 등에 관한 규정」[별표 1-2] 임도의 설계 및 시설기준. +# 기준은 임도등급이 아니라 `설계속도 × 지형구분(일반/특수)`으로 규정되어 있어 +# 등급은 grade_to_design_speed로 간접 매핑한다. +# 위 5-3의 경로탐색(평면) 기준(FOREST_ROAD_MAX_GRADE 등)과는 별개의 값이므로 +# 서로 혼용하지 않는다. +# ───────────────────────────────────────────────────────────────────────── +FOREST_ROAD_PROFILE_CRITERIA = { + # 설계속도(km/h)별 법정 기준 + "design_speed": { + 40: { + "max_grade_pct": {"normal": 7.0, "special": 10.0}, + "max_reverse_grade_pct": 5.0, + "min_vertical_radius_m": 450.0, + "min_curve_length_m": 40.0, + }, + 30: { + "max_grade_pct": {"normal": 8.0, "special": 12.0}, + "max_reverse_grade_pct": 5.0, + "min_vertical_radius_m": 250.0, + "min_curve_length_m": 30.0, + }, + 20: { + "max_grade_pct": {"normal": 9.0, "special": 14.0}, + "max_reverse_grade_pct": 5.0, + "min_vertical_radius_m": 100.0, + "min_curve_length_m": 20.0, + }, + }, + # 임도등급 → 기본 설계속도. 작업임도는 별표에 종단 기준이 없어 20km/h를 준용한다. + "grade_to_design_speed": {"trunk": 40, "branch": 30, "work": 20}, + # 특수지형에서 기준 적용이 어려운 경우 노면포장 시에 한하여 허용되는 상한 + "paved_exception_grade_pct": 18.0, + # 비포장 도로이면서 종단기울기 대수차가 이 값 이하이면 종단곡선을 두지 않는다 + "vertical_curve_skip_delta_pct": 5.0, + # 곡선 중첩 방지용 최소 직선(tangent) 길이 (규정 외 실무 기본값) + "min_tangent_length_m": 20.0, + # 절·성토 균형 구역 기본 길이 (None이면 노선 전체를 1구역으로 본다) + "balance_segment_length_m": None, + # 주 진행방향 자동 판정 기준: |시종점 고도차| / (최고−최저) 가 이 값 이상이면 + # 한 방향으로 오르내리는 노선으로 보고 반대 방향에 역기울기 상한을 적용한다. + # V자(계곡 횡단)·Λ자(능선 통과) 노선은 이 비율이 낮아 역기울기 판정을 하지 않는다. + "main_direction_monotone_ratio": 0.5, +} +GRADE_TERRAIN_TYPES = ("normal", "special") +# 주 진행방향: auto(자동 판정) / ascending(상행) / descending(하행) / none(역기울기 미적용) +GRADE_MAIN_DIRECTIONS = ("auto", "ascending", "descending", "none") + + # ───────────────────────────────────────────────────────────────────────── # 6. 저장소 경로 # ───────────────────────────────────────────────────────────────────────── diff --git a/resources/templete_calc_cost.xlsx b/resources/templete_calc_cost.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2793157a96cd2e7fc41ab4a3cb585ba8757ecefd GIT binary patch literal 288446 zcma%i1CT9Cv+mfoZQHi@*t5sBJ+sHQZQC~X%pTjeZM`|?+;`(YH{!l{5vzMucdV|= zs>-a)@5|Nl(!d}n0000G0K}>H+G3i0F#g|Hb>9cV_hDpfDDPlv=SZ(_XGiB|Z6zBm z3*FCvAo3-3vSFigO~6PnU$8yuDZ$PbYb5Lv^zNn97qiB*$q?C&`bT|`*p)SSu*3&( zR2-lgT5Ldgt_)M06w6#4PhiqL0(r%Bkfav-H?SV64D)2hJMMWC*AY%9>n`O zrc;UqBgJ!y5wIe0|Wp_1Ofm+{7-!iZ5@pNQaC7n zOlm*?C0Li#s3^jOY(^875gJtu${%!SgMqWEPdhj*u2CyYQ651MQB*|GZZAJvBBu;< zt534BDW726N*iHg%F|uSv<^+Qj5j4$cRqJ|58XMun0E{u2~Te zxvZx%3M0?65O$=`4Q_})Qh-E|w03w{#4!-&7-RI&T^SH4oWLIgi89uD<#>(S@AvLh zAQh8~iwK8{v4)8;bJ7o2qk@ZvritqP?)A+n#l$0pP3dX&vFOwr`wV`cyh4dAG<~DG4l@s8I?P^?B}|r z1)kElSuna&G+9?Pr4@ZnDn|)As*nQmcubhZVLdDJ(xAkSr)V}PPwc_%yh<;QNsK3V zVi_-1=s?0#SAXaNMDM8USsOZMwOK13En5{DOf#14A1bD<5iC*e|a9a{50o>pZ)^)_xkHp?<4_XWjdr6`EEyms0m9lCIm8B1zdr~0eTC!+Q1F1WGRk@?}^O1Zfi*!?G;K}22HW+mJ zenxA+^FpkH`0Oe9`4p?$q?yY`w*M#>qQIyzn60aPZ%VD>7YyX4Vn25FTEzln~ha7%h-%0>&rUF#7Cf&T!R@DTl zT6Wb-j7ixH+Dny$AZ^kKr3hz0YKX8$7k0lA9%S7e!y%ZW(7 zr;ZUu)0*owNpf6bK^#;YECeMHx6!^h0UkAH0ST1>zdkWyzQ7u>wxs_EH;E-Q|F6RN zjTXfHnwBctFqlHPSSymEa$3N!PJD7Vh+HZ6h+#z+YlXtdXcsK0ye?Qmu-|$Bc`j$j zsM(QW>Gw?%MoF}#^%JZFzbzK!2m&;JE>Yk_q@vWnF_4gYxsXwZnF7UQOfyZei#d!q z4N;cJ6m@W5NS2|@Sk0A7p4Ve!N}l}$DXjgoDuY{toZfkfhs+dWO8~5^B}VedyjBd) zpbRd99||O#WD_J&jyBq?M3+o;5PVy#)840E=4z1GS^um->Dl?D^w`HjU~kGt{(bsWgizEE&x)pliwz;~O(>1HUn$hQ++qDj zOpxM&`G=WNfyUYB5yAeV8y=X@1>30h9OeWa2v6&j#E3RTh2Uv9#kY=E*&QWgk(Bgn zsx&n_*%>9INI`Z9k|_NQNFl#1o;csyXXHCpRcA{Vwt{M+9@c*$w-w<=@E*Ad$pQ?^ zdQ*IwBgNdP9~){E198Ztd-R$H`y`Ar6-T-PL=@M0nYDjn*h{cR8X%sDvTqxWPSjf- zhDcZI`?w`Dt7gH32xDBwXB#U;$|g~WZy{x}N>E8$i3b>70F>O5Aq3xAsG9Tw8hGhX z0Okj6|J1Z6)tP9{zppoL69vQ**K^57Nq9lY=BGbKS&U=W(Mif<+7Vplj!}AA5TcfB z*as*}GO2TQ9YI&;v{21vT4Fst9QzU0!jAwoe`;Y7ovyjEVjm4EsNZf8wsEd#+kIeO zi`68SS3Ry}Y1=f~mlygTU8<@yzH;wyE|R$Q`R={Xg1p~#cka;Nl$c-avvjXnZR_bX zROz`9e%5MIblH?CHFk$nai(EXV!eedwxeL>KG){Co8!%s*3~riwzRqa`%dvqQNSQz z-?=sp`pEW@R_o!gJ16Q43n{rxtH~3#WTsjbORhrAp8LY1Xh&@=Np7LW*#md0g5BfE z>4E~hgZ8&;#fC?b#f#5SRXXN}M}eZFb;rS?=0o*bJ9|Tu`pdhk&1UA(Vb8xqnGXvj zHv;%~>VyjbfbmZ#bG3D_bTl(Ic5{5T_Pg9J@JY1NYF1x1=0O;Ck~Gayv6fHms)Xlom_dpD25AODZ=N35V?(M>UbfHBI$` z`;0Q>LMq6k_T$JjMys~b|Fv3@3k=id4`)H@Arj7?ozBK;3~CE!L~atpzEaRM71WJa zF%@oJ8W2OG!TPiIyks00O=Lr*K07otPUZM9^Ju)HwM9mjUj$_2BB2}*h#8qWs1biU zjU>_%i&f)HHl!+O#QaC`EMmZWS7YTt(|N8ELnSFjO_R~+WV|bR#iW;#ZD@45!?(St z7|_!W`Q|@^_~*Ts*nVur1@PV#3TwWFHg0CvT5h<&##O29=bB%hC**LOEdUtTy;O#c zC#;^(zm<4`hgu20CV=nnU^moRv%$r|j>5-qoZ)@D+X#p)zd?HYW1TB=@&*kH@rSKmnZl4bipf68~@= z=f_Kf_XUb`QMHxtFQpO-@On42UgD`v2;dr-BYe7yC+9BQ6p@Q|#9t`3m%y@fdtdch zJe9n6>L6FJt4#)O5A;4}!hbXoJ4(dtA~MeF=qt=Kv<7y>MEGOXnHr3>kXL3Nl;<;j zU*ai$R0a3)a1f-j`f{Ee(ply5boJx{lHTR{zQuAuU-D$Jk-!BaSzwF~9)K=c5j_6L zx6&i+IqrDO=Ls)aaVhN=nv;!KCp9>dT8!#1=St$a*4xYHdPdA9w~R#-u|?-!^Go#WHF2Qyjek+xI%MKw_cV93u7v1MA{VrJpD3fZ@o3APwz5|EjTaB89sI3T(Go`hpeJZ~c4Zv##? z-#^|iJFM%UB6+rg1X+UX0=OZK)y8|1>WEqo8;lXXMv2_U;vr^>l2yUT##?07#X4%% zva>b>amYi#SLJh_MvNl1$1)-FTOcIa5w+VQ_}buU6$>D(iha%(D-lduVK<{r_X7ye z6TV1<4f;ElrC#cdfyPq&7z3WbXT9{BeF2yyxz?I}T^5WpIUAhqhahQSOSjVp4$sGG zAz^-#{W2yF>9|)Ja|F9~u@r_Fpx)3+oS04#MaICBg~(wnG(p@%8*U^Y$blt-sc{TY zU=!9YmeFfv@>{Jh5x*C`%4v6HW~y9)7@0O=OYbc{9m|7+i6HwW&V1Fw9K$73z6ocI zV&t}oC#k3OU_1#D%nghJa#bUfz4>Vcq5lkP!SKh3;`P>)XdnkNTF|nw{kQo3b~X8r zIO{)RcG@^k5^xy}^mn98<0-MZhRz{yB$lusS`f4h(G4wE4nvTYFj49$IBcfA{DF*} z$+71dIb>{j`7JlMU^trQT?s1=&rC){1F>OVTR3cOI57B!kQ^i-u1s2Ry4BJ~t#k?; z8AoJG{cE1?xv-EsaigkzDe%Y|J(*zvjywCB44IhFj&6muw=3<>4z@%CU13L;RWs+! zX9*NcaS4vX*gp37Ih;R(8S=uB6FL+aiV$;e+ft>5ApfgfI#E7dsn9`gN(yy6 z56a83;uhEHLm(+73j0(e;cl|2VPQ}!^sxcG@;8xW9P~j(y@C@tnL~FLE?pqEs~sg+sx(;-`Pwsi z52i-P^os6ETNIR!$=bFlYcMD>T?(Ublg)c;o$HMF(1Hn#bWq5swRJBo@% z_ec#2APnmo+frMv6BrO?RMDWoZRxjVI0m%%E^F+Z%Z0M}`(uO((KOXd=hYZyOmMFY zAypkdO|aihTn8;+$q3ZXSO##a5Vj%@+vN#J^VGu0IH)dKV#eR6z+{29iGU*9r{kKe zFwWI8DBHQ?CO&ZZwbp`hU=M+e;@M6@!}$8UsUO_mhsNuld!@}qA}P=I_4==f0XF4THv>}fhFw)|p0>2-$ z5G-w8rztz`yH;tE3P{ewd(it#(pSl26+6^JzvhCmgq17WCXF49#a-EhSM5&(<&0Yk za6?Unj$Vv_jRIgc1ZZA~!d`#|5H$oY&2XrT7 zRJ3kKB;-z_$U98c!^B**oWg>_7cM@WUDj?b>KU7;x}t-Lv8q)(9OoV@u?^^{UycAinfaSuWs%S?Q(MObb{G86o%>dS8A-(RiB`1rXPMA6}L?T`c z07gt8BBU#VqYe7E)O9WkbED{=a8m`_+ZwNooc6bo`t^<2=5s_Xcu2ttrUlDHv{Zp7 z46Lv1qQfZrg0xEV9ctK_^hLL2c$eLBbo)`luQHARo-HXpqug*JWxR`k-^Hr&do}rQ zN9U&)oUS5sfJ1)gO5BuIg{WJZU=#UF*FAG^?YbBt*tFT3-Z`bip*!5^L%m%`p!xm} zrp2C@&#?5{Xi~lni1;7l`H%Ee*TLB8Ka*6tzpk6&q~ZJ-5Q1xF?*U-i?eu@4Vz&fC z%Scg1c^6edw6yRcNNBg(vw!h)dyS%)Rx?Oh3eoEj6sVFVHpa~00s@`24aaKymQ8nB zw2Y+m0EAls1r71e#_z4cY@}M0nU#tD5^B^T$E>04u&~)hXJDwnFA$In_<60ah_O(@ zjov}yN6Fblssp!es~Di#^gDyapkkprJ>tRBG6l8)FP)M{xISP4znuHuUSj_N*@goF z08oMT-#f^E4D|0joarxKX+gvG2lgoD7ga)4wJ8eRRkgL1(i)O49qg$Na!{kWb31xO zSF>8nV|xd*_GOYFoCC0m3^IQAyj`@EP^bWtoypf%m9fk0G%Rvj+DfY(G#`-{$o`MPNKUP# z+ix{B9NRJt_%h|44GHNagj)8plSfx8fd`?b#Ih7FwovteSUxV1C}~R$X(vXAm1KVh z*}Ge5!qrjA>_4Tq>pk!gTO3#Fdx>Jtm9-Kmc9vI@S(gj@)wnw=E;!4J=Dmkm9uT}& zr*9rrziLHd_p(>0Q>A_gNUyB4A|T33$x=JEdrzsiR&j|%Mcc(n3b!o#Hueq`5F-uc zWHwk4AC=|`oQJeyq5A{VU_iMmL9TP}jxMnAuSg(y24idFaSp;<19`v#s6)PS!-;!fy)9kV&>_VxG3xRk zImDv8m?Q7hJXbyoRUUII3v!L|Zq*q0ab^Vi%C;G2tMyzfD)oE+rGXG6-M|NXu{fL( zfPeWA3&N}ZBJ_Ux@DlMihMi<81Xn5WQSPN^q(qw-*23hLRH?T*k+f`my&nL18Et$N z+Q3iqM)=LRBUzS5r8<8yYo#8}>b33+W(`_v_>E3fP@$#QU--^`QA~O>$DFM`+Vo$M zvU*Wg^9bOgY~iKe>m*f7KixNM&_WRTcutjF*U=zquHqDNr}+g7n`Ug1*1I1^saELx zZ%y8E!>Ab`8?B=50dZXfL*D$0-Oa|SC?v17Bv_IyCM$%1`hJIObq@c)#`B0qu?;XM z4ctn;dFm)^4suNg_?#eisArE{<)2>z=N?c_oR_}#Rk`ZARJdA$M&gldAGZLR)ILiXMCbM@54;DkZH{(Pk$H0ljN!x-O3?-cMJJ%05^kEhQ9C_*3%|CyB9fQLpXIY$f1 zVTAFD{f5Yl$BRA-(v`|7#1Yh8svp}P`R0h?<}Wpuc%$6NlKh8;olw-kla z4%IpMbcHw)y~Hi}Z_u3-sp@O$+4Vde=a0K#+%#us_TiW3E^c_QtFg!sVc`KFUWHud z7?gy`^dnCal$EDMA$Qo2Yr!-t`~=$2zy~N=M>!f5z1G_{3b7)HkvP|>V@P0*_s}JT zt&bQ2{JHs^=W6s%*zEbm6!TqmzgnGY0V4-?@hr`x@BxTK?5PgAeZZd=iTxjtCXl}p zoAnf8`qy;QOFYf^lpHkia0OhJZ+d6=jB<*wN)yF({!r%38D%BWDsJWfZWc>Y)~)3M zor90jV}*GfF5YpigI*c&hpEy@Jn!PB>YxrM%sWnqHghU89s?!|^C;(IYES!7jEA9y*LZj7xIueTWk4&>{HMd~>&q47)ka=T-_^>#5UaNgzswPCjT`tMux-+lb`tDcbk>7+VZaIj3t%qIH2@0(y&Z=N!~Glr$A`8Iv42^wRm-8kKVuto*S6g=TY=0d|$Y zg|B+aoWvdV=1+Qt|93_aDGJzr|D7@o{_mLN?~Gz1c0vl65hX~MbV7>VgnZ)9Ob(dtMpycBlsuD{NE4?(_aYXLRsex`DPxv%37)W>RbBtB)M8kPJ_I>w9~|syf!9tyyZ5 zpP1Ck#yC7*dd~v}XV$8CG9)@jOWkWdWMPlH7{lxY#+5|(bZj4m_EJj40+xw_ z-PlYbZB5VsiC#G1;}6!$n$|0RmAbF&kwdn!K%se#&MUwsn3~gUaZDig-n4KKfYSJQ zPz^dK&7Sla6&a0_DaD~~BD;|w(NvPwN8u!IQA}HrZBob7>RTR0OZYcTnIdO0_=YJP z%Wm2D{?J2558eRpi|}6}JQ&1E_~!6iaTVCLi|}4d53H$|ve(|*cGxJCHcbx*A+iSE zL+D&6C$XVpeu5katEi(0cs;{0$Zch5pQOaJpV%igQH{@SakKmkvpnx-5%~Z1y=&b< zzW*=S^0x>67i{5#3t&JHtuc53fXSCY1Voix4TX-3WK``Ob%9vtn-l_|6is)!Gj;cv zP5c|S^b_b1B&d=pJB9uQTd-UIfi3s{0b7Ws;I~^~G*h(5%uRp$60UZqM6xIAu(IDk zW27#`DC8E3(z{hs$ehmUgcC{YNy+JmE&)Gh%$KU{-H=5sTRPVqT6}C$)!WYqGl!T; zxYWK0dxQUbpvewTH(oFR0F}J|D{Nu@3$`3+Sv#%`BYsjtq_ZiK#zWe%7A60+F;@#e@b@w9a+`r<(;^qvKN1Fj>A-&%J1za#q#6R_y7x zX~Ajf$g{f#t#*EZO5Z78J?S!Gd{%zYH3tg%tSNWSa^AdfvLYAaSapcw3#W3Lk5C>c z`)Q0J=wH97Bq}Qf9-b@J+#reYP~X@Gw7H-*JZ}qmA+u%Cz^INPCC_X zqZ4f6`2H4s#CahANBkfIPsgfr1YCi9D$c7#3(cY@v%yRiS7tcZ)g!i-Ont;~7;}Uc zd9{D!h7^&P(Fc8%!CP_IxY>lg`3I-wMti^_y@K}YIsK=Qx?Huc{o*N_eVJnXKy`Aa zD!tdyA`xm?p}&!N6ZjsfDv&^D25o9^|97Pb`KNgX`=J}oT4+<9`kzI#ux5_(D0w*R zFf-|bRZTeKG>Wl;Kk?b7n@|dBNDrtTGqpr9m07p$!K6v*isIn$)zK{ZHHh9-sXpsn za`SOS7IDO53M7GuCaKvPS4KBTm|EGQ4xnRyCVb8W(7%g+ z?C|f*X5sdHVQ9W)w2*^^cn+9iYp#5qB48zfgEiNi z9cJxgkB03#yeFe|%2^F(Nu3YgS1oJ^G@6iR+41hc+qg4y|_`lmKym{Y8XkK#)-fb z^n4zTL95aIY`y;t`N?kk?)q`3H=o(_WDCdFbF<2GSmNG_r2YI-F!kJ6njG=0N+vjb zZN0Fyd?*%9GLe#If_LFCV9Rejs7$M9YRTUQI@9S0zu7Bi7OFoQ3Z5S#_W+Lv2lpyJ zoLddg&vVWG1swFzBpPT6WBf<{2RCDX9EN<*^e@5`ScPX^BoL{!q0%Z3GMQ5*VD(Q| zla4p=*V0oCl-n9wv8w9Mhf5I0_k=kw67KevEKCHcxL@)T=LIv86U?Nnq`2LEKl$ms z3gKBVfs2(vmvs5VVjZvuNn!I!tID%5ZYh^aMYRiRw^0N6s=R z#m_7Lpe>MksQTfwd}401py90Ko7CPGtHO>BwJ1x1;>T__(VIeBj;Ij5ng;oEU7E@R z49Wa>sGZSELSlg4oVI8fvZ{n@<|7CLTLWX@JzPH$N zk}CVyDM^?D^+%$@k$fI7MZXpOPNX8c+avNy+Z+|Hf@umDN4s!)=Q3OtM!Eqh^kf{( z(Mb{AqHH{92^V@pId0s0zcNQo64X&da);1weUf@XlW+@>L^!=h>GcpP*Ty!~OY|~` z@U}l$BBJs*g7Pw=^5ZI(X1ohwm(PE)lwtOSz->wD82@@`Q10dfxA(c?>Q0a5pkKY% zfF??hrpVyCow}%mTQ_;rgEs8I7zvFCAYo!Sj9OiwE5{rAjF%@8+P2Ay!LN!cW z;+*KAEk1t7uf{t*)LS>Ou`_w-)VecjUuE&&ux zgOa38q4>kdY+ocsG3LII6;{-EoT7Y4o<@X@fUTn!Z9yKbrxx;4A@~?7+7KFmPZ|lu06SU#%&=)cqYj7#aSDs8|Myq##Mn z5*znY-h~-zM%EPs!#sq+Rs^Mh6&YA9J#86SF_y?12&Dj} zG_1^svb;y---ad@3{=7PgvDSDX;{srVj|{it9n==o_#WWI#2Ab`qmFQmGE%D#mjL~+$g0qrv=0x7=BfFdH2BGG+PM^uYlToS={naD)w|+D`B<0ziV-1n*~~Nd$#@ zA)|2~B)VatZ6O|{WM-lLV|=YX9itBV4^ypeb_=7C^AWx9NcBWSOyyI;nJ8l7B!O_P zh}AS^cs%BSzzBQzR)l~+!`oncTdnOmlCqxejLLv}Pd@`o7L+t1Vl?Aii6VTY4U8dW zAW9oqVf%5IZ(01?LNG|G%uIIQyNnR6`;#xsqFs-##E^pV-Ute29R;vB6=2-)Fh}vM zgyfmqMleCt)!u|!>_eqLj|mqPIx&+SAs3V-rX=qAK6Y#Xeu&oUksyIrYID@w@=otx z9q{6aP-T7huoL@7e5lIYoYzE1ie^L=g{ZJLJ8rQS9uVO}-1S4e!;T^gKzsD*(@?^0 zHOlC&P5~=bCJr%zskac{{2q}(sjaNADcvQo=r6lEEFLuI3{nrxKnlu~wok0HpJZxa zYZeDgr)4rw0Gn2>CYp)5GK05Kgwf}7&)79skBqP0O${SwBnMaEySbNKb4VEoDfC#6 zZ&BCxW%05)J`jb(mT?IY-wSMQ-_=yK|w61AxhU1tfY}(>C0Ew zD1_46lZRAu`jh)0ThS9&4bTo@dJg5^>$9X+E4BmPLJE#-9z`sX>+y<(lNVa)iu@M5qNw~ zRmqq(c(Qj}T{#D% zKbDr3McGSi($aD#>C&1#)=gxbf~Y1W3TP%Ef=HoyGo64y8nLD#f~knkknw$0%Tb)0 zUDKgLR+XDoUtb<6AP=Jgm+daUJu9%e!nEwQ-+)W@(yFjpryZ(>*TX`zw^%leu{E12 z$&`8X3N6Y>2sDyd1V!TEoCl)NnA1lb+x-L{+y) z&gYAoUBBx+Z%BWw^f@(RoUFs3`?QWvh*Tg~Y*@W4?^Zf*oZ`5mdJzK$*vhV5xc~0I zKC5f=a==?yNp7;D+hEaloVcXDaUpjZ5aq)%o}z(CjceL*V!uWWmWrpWnH9`>f6xd z0G--#cQhR&@#s*@f0lllor&qOYXXu6M8*yeOlj=A_Ygpj;ryUyI9;kn=bU74@W(z* zQ-IHK+SX8O+HsHBt&V)-^16_>TD`u-%b*Qc!Q?wzo;UNb?VW^jcD;SN_XywJV`C#d z#aq4pm{W14@!k8qW+WsTPU6jk*^X0I!;xzOX_`%BaU*fHJRRqTSN_C0wLW%)DbG%`Ce68wXYJ~XnAti_H=y& zKYUoCY_{A3XDS`jr0i8Ht2gro8=Y9L>p=a;Ql`9-vP~!BWx~TtnelW9Q#3p>NYDq= z!U0QQS%XVe9ka#``=c*yV4C)312X^EiEAOy2TtD2fQ^7*w)?5yi=)(?Gz!}B*yUT( zxznh|Im+7`rH#>@%YBR=PqiZ&ZkP0=r9M!{CG;sSEV)V(o0+Gtd7m)(&l$Wy{U&$k_17=;Qm$ z?EViT4O-owdFk7?cD^m>|5>g5+r$2*JtpFNqWc+OLUc+001x6wuoLL{`|Ttn)9V%4 zV6%Sh@0+=M0%=o9u&?_Mn!KU=eg;=|j~cM`l`IaDfSG!0jfAn*0FXc?EYGp?>2nv zR-@!r<|>WWAMX)Tk-G|(IiHcLt67YHS_nb8evH3UlRDj|Q%J|ruYEdEr%?vn3M>v< zlEls0V0s*8pVC~g=Fs@+)-2sC4f#y0maPjY!SCV({x?g4G~%E~i39+Ur~ALMBrJck zB$*dV*y8EEUrAxRV^V;HC)w<=nIw%82oDSdm$`;PI$@^)A-u z8ysYu=MHq;Ze2sFbznz!Nq1A{-U-29JK5RnEQ(Ju@D(3UW$^K*>#LQEnh9aBb5@b2OjQf8h7IddOW0ztii>9x6ZMcO6WD301?GuMRz(vQ zU=jK0D>P~rVP%kSKg&2-6}FfvlF}6{psK1SCLHb_BNeJ_e~`)dci2}s7!EYr8Woda z9bgYT54_g`LfNI=TvV#CMQK(j)xr7$kb$AOJ?Ai%TBXKc zUYUlS5N0K$&b&CLrE>S4oh_z*bER8htIN24s5}>*wP4Y;TK|RGjEhP_7PwG_mN?%e zh!^DE0fj1$+;383vb939b(<|2L)Tm-W@e~{4R5yBh*m|{cB-CF8_1)iv83#hi2qL`ZNAhOet4LZ?~JJhg^PI!hc z_@{lIi)JPA@Q;bRMZU%sT6!~^KHQl32K#vcM6zTMgHx{x5zoa2A+H^iLK)(h-G-Hr z2WVx6(&8v`p5rW9<)dSs<2qWqZZ^c?UQho+pU7~a0Ycq)x#eZJrJSjHM>ml7Xf6ev zt^gx2>Z4^;m!`NHW``>Ran0n7<=NQ4rLIemJz#|T$)(Uk56|gmr)ig2j`vg4L*vE= zmd%DISQJqF;@*bQ(S7Ng1${LwfodXQkMi z*ZD!&kj(Dpgy%Imhs%-5BM@tH2>%D&jzo`15y}Lzmam4*_oRG&?6j9J9FEs4HG0a| zHj0l1ae7c7PSGa^qZQX5L6@`u#tZKY^gzN-;T08( z%KUAl;rWlFw&-enbQ_2l)CUP$a#Pj&SL5z#C=Jj*qfk_%9v`brV=BqH{U1skoP38n%>i&dU zoXG)wep9;|-ySprx{Ss4?Ronxf^opae^BozZlrv1we=}5z%4{wOr7T*z7k54-w9u( z)Jn$s`$b)xJ`Xw|0URHm?la4sbU9zn^xCOjISVv>GP9&W$+>#g>2P37HTQ&O48{%V zDv2E%|9*|a;LT+>%bff}^QOS4XS^{UXyklMVg$u!B=OobY?fu1C~@+V&rysXiwAHc zof)wXQNAB>+6;nX2V&akFwqXgjO%X4n0neNIcbMD_l7w4mN-|;4TcH`Q7UUGWD#C` zW1z(fK^YCgf&(H|${$M(NX1+ZR@|?g1^;K~cUuFO4~7E_7K$Uz zVL(jKFfTW#fZ&V;rO^(hRLW7414_B*<$4#jRBCMXS|Qfi2c`ahyFg_?F>=NCnYz01#0*Y#`sUh_~U&lqf$X3N-fTT*KPw~ znc*DMz}?%yDaQ@_;Y|X5D+qt|>%SGm=L0VvnF2I7{)rH3H6l!kJ+xOP=Dv_B!;&sG zX12+Kq~zbLUMZrU!Sy!4rxA+N-SqRq)i<9jGB@m}VkZh2)qGfB&5%J5SHg9ZdaZm3 z5+W&$d{eSc)y^)GA(NjxjP|s=J!A{p0_Vy}rVr|=nm-v(Yi=kgMEv|AGxSw>StU@4tU<83vv`eY5d|)4?$$w~&242*yE2=m zwH%v(&9k1JNpw z`eXj$D=8m$!zO<4sW|y2sp&h5I@qR^p+&jTM|8_(nxe)h=K5ZdwtkL#b#=Bxw>A1B z#CrD?Rouormr992p?!r|`8voh1_9C>>>$}K64gCW3Q*IzGRYSF!lY}`|7RgK;;6xc}I%!}!Dd3pwZ5j9EOsNbo^?)MPm~EU1 z+awL&BncthhYpQwWu-wabR4(a)ekp9095y$M6fI?$Oay{+W&u*aY(Z>W2C3 zEoFy+*)=Y%AG84ptl>7Mzfz>HvQ}SpnSt6~Z&=t*W5-V;&;775^i}_mL3JOIN)!TA zKe`S%THSM&nZm0l1F!*x;p?K%@ty+5m*bY^79xo#&_8f^IZM2< z>J}5F8+?jDSrU5tcO`kr;@sC|CZ5KYuc7xFL#FDXNmmL|t_m2NQ4_vu6l}$Cu!`Y8 z`Oq)auz?VjJwFxbUZ}1Ns0uMZ)SX5?0BZ4UQM^3GKzW2kj2qy=)$ts`9R(n;N{jT) zjv3AkXz)Z#p=(9|Uk0s<^89%kZ2$FH;kZ=Bd9 z=LISW24JAzbr_!KGlQ1*bk1h7A1YxJ<7d8%O5WxOE%E&@53d!0DygW1^2weW${REm zRw_@eR3A7h%fApR=A@aAxRmXj@$4P|S|_#nIYaEISmU*0r_~jN%3!33R|9*tEy0h# z&3>6h=cD{>D}Am~h9ag6)EG?2GCQPP(8$Yk1r1vlPCq~T1ya+DC#Cafh9=PsFO`TQ zm}r7&{_q%fM${wLFQ+v3<#-T+Gdwpz8yzD)ybwb zUk7K8sUnJzrxc=qaE(+)G6}LV@u%#xJ2T%o@9-9Syn(b|g6U2JB&Iixy}}`YrNo5On&S`-f@}g9~+YY4KcC<9kj9CbD8os zk8l|TtLb_LT}e-A!pQ6&5`f6l&zn}(`y)69h#%Dl>%IPZPFyb=m>+~+<_hH}hPj)^c=YrR1|pZn{`$Fk8Xok=G|=7Pv0GrWTVObkP!U8PK|dpqQz~XIbg}$9lRxQp zLd!vpX~rfIKhU!m3tFCbTcZbB4Phx?&fVEurN4{a;N zfm1#8j$AVN`60A9uh0i0JD&7EmKr;S!N~5FH-cqf_mn-Sb1n)S+@Wp~3rFouhZf*D z#Dr@Wbiucx&oT~Iu!Et`lIB{&G3z}`q^h_@7fiozgJ8H?BI-_82E;l5s5XuqxA(X6 zD#Reh4UC84L_Y(8#w`(LXCg?zXDi(p1#i@1?FJ^zr#2V^MyosH-Yf&D{;oDSJ^Ptm z=NJN$73+og{qMEmz*rrqhjmuy1e?`A2fkX8bV7=|8#At3sBc^O4jrJ}n;|PVd^p6L z1X192J4Mtkgw2ldj=6+>27~A#j_VkSlO$N2V542Ft`3d;T0C z&YIlPoTA-0vCO(FOykbuO(4%cfp!N*ys&=YNm2GAA0Wlc`^N=B9U?=?yXCbL#>cZe zi>AiuENUI!+Z|t3j?6-ufCnSvcehJqj79=RF)Q8c#By@$go{#fsfNzwDWegoRDzqk z55i)0^}G^c=!hAfdt+8vUVPl`ZiyKndSj?`w&OsS>%TqDch7fZC z2{~oqi~+15+iV}J*e)7>X_$a<;=F&ByS^crj*gUnzv(*yRP4iZig{gZ+4W(j7hWu0 zmA$f~HV)Ubi?O3-EWylJv#5#j(MMqUV~x(C$vWGbV9GdGfR+sFn1DxL^Y4A|`Z*m# zU-QHOf2NP&#^Cz}5AF5sC2RkdCrFrwPHdB3OVXV9l=Tc!$MXvP2}O}eKaq-3o+Sgi z2B$I$Qc4G~NZ&OBqma5|`K65X19RD=yLHjHfFj|PSAc#TO7jSbmdkJ1h*0(`B79=# zYlmSD!xqbnfs@kSd+(+=0gx?S95Lw0PgUq2rrs%fghaqg??=VWFosRq>#i@pPJ#RA z4|}Se41!h8>PKBhA_&FfgxX)lW=b@QZ|XoxpuZJOb@TCf-XEbjtKa+)IAb`stJYP^ zhAXh^o`%L1gSub{-K|5FL^Y1{TE{wPH?wnt@Wyyq#sbwP4tysqpBBK+Uw|=>r?a&1 z{Sl7HpKLG~QxxGtyTbb#%onLWpX+=};sv8WoI$$I9xSm7;Uw*`HE_-thzpav+^0t= z#-NV9iqVglrE?$D$q15e9JfjH;-i6~EOzVk-@~8o#pp*in!L}%YcprDT^28F4qSLu zooLi8J#M?ed4RHG3Kgku+O>%xWaDU(XJihN0Sf1m{j9 zsf=37;BO>xUf&EYBJ~rLVGk96o@pZC;k(NAT1#PpUC3X83V;j%1?ToAYY{`l?nI}eF7V-dvI>_Tkt9o1yJYUpksf7 zo?N7kTu8;%?aRlaA!#GujCldcsNOGY5rg)hKOmXUn6jV3m#DAj)V(|r>4hMzU*NyA3|owUyD&5utb zp5jk%m0SG$YrGO%rtMH`>XH$ff4JP%K6V6Zv-uiVeUT^eF0|gb_czB16xK>o`0Mca z8(myMZb!#`8>c>7O}mzn^}GoyS*aHP4|m@fooSP`8(STA(s9SOZQHifvDHz>wr$%^ z$4*N^DV=shXe7V%9!F%S%NT zlE#iB7RE-=Ki(x7OR(YhBcw2lC5!AC1AR7eXa|{WY^mON9PqI?q51f*)*f^)ap(WR zqrw;l-xd=9fA}qH!P2CK16JCMDWYLGb7u^8Z$AP?OgX~o^HzU-;+)YZ^3-%RVxp7H z6@V)gl?djQNJQ3JOa>*QLS!ILT)E0_xhiuajWpbE+DBG}DQ&;sQms>!cAsS~9zzUW znyIWz^i}$P)MbsX2@6CCc;p-J-LO!DmZoJz;ui=ul*cBwj_VfvEPQa*Va#ccU*9?m zDt~nxl^*J}6^V0ZE|3qTYlGxyRjd|!Dbcg8?%T>3RaI4J*AxVEX|eSx-q)JVt7ALq zWI6h{TXt|@I;qID(vd9s#0Suu`a}}5#;`ZB>8~{dY>c?iDv$5J0)Hfd5S|{d@M& zA9^Vve%xY(4{7kiEi^=i1$-0_$*kJzn1CdwAPOJ3fF;7{Yf1FFk|?>oaWGb{kQ0$1 zN|AXtM1e{e{CNT5RM4S3r+ZMP#V}I=@LgjaBj@wDkBQQ{H4F$X1p_t=WUiL}ap=sl zk-A&c1Z;Y`Wut41`+Zt$H~Fu4ooai@?H2BqiJMT{ZuFZcc$G~oLPctas(5$B*f_yE zbH&|JD=Q+%VB{`c{YD8msy+)3G?K~hS_c}h*ILw+uLNG%N>>)Xl^KCk z^VPfvlbqiZMV?ur8>2cj9hv#o27JN$S%%vfyYImuWz3db^FUgrr<1d{^e(7WP0U4{ zQ<5X(-woU|L&@ts4aR_R;15_ZIlfoQ%J5{D4cNwiZq#XVH7_FQ9DDWjNCoFo`8t0Y zAKn2E?lB$RnbG zAM>>;6#2jip3KQk)iyH;_}a{ZGWCn|B926L^59APBVEVbYYFf4m|9i)wBs^dl7m8F zBm->A!fPa|Yp5Yv@u4NiA0DB0*|TkW`&(l0g<&s>IQOltzxYi*S(`qt=jivh6aSFO z!!1tfcqo#fYI%nJpS&jaMtFf1VB#SIj^e=w@V@_t)Gnq!8zByAhd53LMm;z>v zKRoir-~nBZgvIH#270b%41q$n7+IcC`otiuQZK_igsmz?uCc(y$&l{DXHj}$Og`ca zZw2UxC1cbK=8t$Lj)IG6r38?h0CdwrX;teIbDM@-?Jwne6+@tAC$^^TMmh4z5jD|> z6h_L>B?&(VP|8t4t?S^*l`$cbpetTyZ@k^_J=zGYw}LiUW}T>e%zx>%sIk#~QDRgG zwkS9oDki=TOS^f@?N`STBxC19^cAJ1Kd|DUK2fi{r4aRY+R4fiS(Z?CU|F#!!dNz2 zz0#5_p(2*FmV$twurWEJ{ki=1h)G7p=gw>3&-aq&LKRBemJ@iF|0&o5X6H?Xm@8Js zM_;J15DcAWMM;7s?T#SK#i+b`R{kS*j1PRZsAf>0)UX){UldxaC{_Yg^E{@@3wG z?Ez`*I`oc`*?br?+Que*#EOus70#m~jg|Y{kG7_BW1C9E*$=RpIiML2|9%?T*!&aU z{2lRD*DnPpaYRQZ_(yBv2GiuZOd$~Qk)lWLk7PJv2B6}iaex=G2t+?Y#V=%#(=v%9 z;(!ZwV31nLvvT zh)4oq5R6z5Yk50$Cftl4K|!+8TpQaFPD-8y_3KZb)0cOs7yYkOfgjaHZImc$$_GX& z%s`#xebQ*pyDdtl`>LdrT^vsP^Unh(X{;O>70a4sl$L3AD6EZ*-{wtCSgKYJ%W14- zsy0r`eRr3i2aadZUt8?FOm6l?Oph#d&7F*Ys3&sPwbr+@*xgHgw1s^!ohCeJ7H~n)*Vadc5payKbV`CkFxOtd1cQ#)za2E zE4QYps+wcrSTG^oKYd39&mIX(?wp04YhFX?zY z9#1f~B_pxWJYn6LXsCFa7=cL!vy@bAOx!rt3NWcd;nm()*3dm0CiqoRK>c{UJn%fp zVd?eedoUpZ$%J2=2A<$sA~>7&!35=rbQ2Ea_^6iI9r$ho$J-;D#KL)VLRm$vyVgq2 zxh4Cn(z%klqo&sBQJc=1QPk^W+szP#aNO$l z+2G_1jSbi(x3RT-{=>xShQpfy-4(hC?$;s*Of0vcMRHfi`T?4u89LhZ5cizPdfJ zI>eymh`lmZPX8+(OC#@3jaJ4|kz8$bx5@K<4ERBKl;I$PP@Uj{yUo9RjH#o`#nk7)`}uw6==QDc zWs)})!V5h=>pY{^yO9ci!567ALpl{U?&e^})qZ>VTEf)Yyn&Ja&c(sUG%K}r%8FJ> z=Cvt=T*>peo*OO8W~a5N`>LVNbR9c9WwmOs?A6`#G9vrAlvT>2;nt@!DE){%&i+F5 z;)C|>J}UUVefmik7w+~U%Pa7ZHu-jzlQVnu4X;Zme)5a|$L8p54@<5a!R#(gj+^ZV zCDfCpR8!2+Gia41=_NkMQ}Pyxd9yJ?y7ztk{M(v#udNVPr1THK zcXhv(ljP4eUb#Fvw>_Nj%xne~Gk^*~sHpJ7I^-K=##2Sd-sJBJkbFYb>JvL1_g!0A z{LVlQ>U?Lq`8F8r?25WD{y+)U|?tKpSYs|@MGi-SgtOa(E%`wIYFBWL&`50|Vw-&y@ zLAsf1L0-=^`(xQW-;sQ4SMGHsTCx4*y1Vdo)s+g(3BQUp^YLH(0yT8=)sKr3{5sQn z!q&48v;LNGyozD=RiA9o1PgtG-CyN-mxZeBaA`j-2|6qF8xQl^EAs64V40f85iW$a1C=y`c7>}m?-?}`5#&h(H5D3C%)>hUg zyV3v%jmN=|-0P9+?I-8rh#3JRDx2U=Ao%-XFgqTci`VoDMc=un`0O_yt$M#%eOnHM z=yyx7ud`$@GOYfy(DMxOERcrq17`wsmeT5q)lflbY~>3xybs>BZ@g!{&y6pSTRozP z-nPE9{T!M4fjT$+v|~})DOoJIK06>;8%Two@}Py4NFjzF7dYC z@WdSUB5O*FkpHaIV+ZNgB1mCQ@@X!3Ah}?p;PXT&+&h9wKk@ zab7VNkr^E_LuaRqnpj@Vj{zMzdMy}$KECv<5|AA)Px9-^O2f(YxY`s2aqjV#FKA>@ z>5GviDn~|kg`n{ZU0d}T z@)5Y`EUa-wwC>`)q+aq6U3{u8aWDj~kPyW54EQI?hHMEW0$icoax?~bZ6xbipqOEZ zxpj3WpR0yiJdKrG{|z86Ow4 zzfU7*TuQ=B_Wvm2Cs`Ds6(&B^?Io;!L$ptmyx#qW zCjB?i{j+5=!Gk*Z+t4AdotRe?S7lZ*gt)Bu>k}_)9)Nkx!_n-4fn;ePeVF61HKSC5 zEsMmCD~crB?AE?xxP>#hg#+2X^W6peCue3KCxYuB@J01}PAzwUOFP(l&I^LHaYe8T zwh4RDWhBPc1U6U=DQXOVy(53W1a&d8P%vZ+nWb?1EZ8&)JW`;Gl)pDV*y=)}M?+|rG3~SR;;6eBwG6_>Og0}VYKX#&nNU&M$5GxpP z3BMQRSW%y9V~Bdt#xRe4wTAypy~yZ9kS~Z>Kp0%>$xLKUJo>JW=%qS{6wfe^MByJ?QXt zj}p6}&UjEO0pDv6Dt-`3A>W6`y0D&Aa~(HGZ!>F@^R?utwtrpn%M?p>`&rZ7%}-nh zu9`-@sr_RQ+I5s24>^E;bssDT8D;)njPDxmyQ2-~+i4#^$mR9sH>6O>Onp1lNf;M2 zZD2PjtDXjKM9p=z>b*U^QP9O}phhm##&&EgHy};iZuCEb>y1*@KwR72UW?sc>p^&+ zy1NPAGW_R(P5f(MH9(=qv4$w4EZ&6HdAyZozlhnb_Te>6*= z8m*8LOms8i`Zo8#vi0wM-gE{+!T{>eA+qHh1PMx%ek3wGnWACn zIb%?=y`BD1C~egHa`)|Fw6q@@AV08 zR|&CA!O-`nFlnpo&&J5SN{YM8P&|Y5KsdbR8^HE0fK4R?dx8pPTZ9-QIIoV)Tm;e% zE|9H+J@u!0%S+`!3Nu1K`3`13{fQ$~R4LLp}R3k7&{1Mg;XMveu>m$7vK@R zL|~Y)Uc%@uw#nART|bPgp~O2be)=nf0q|L>K527!5q3$@sk>GWb;pNVkE zDAV`Uwx*Ct{wkxXZV3UGO@k%cH7KI%%2>paMDsGV!tH>G)q!ej4Ji{{(1NnBjnNP;T*-7vBjAGn8bJsHev<% zb~7MOB7y@&cu1ORgaivQ<}L{&c&^}JxZDC*LKO@C1bhLm-~gQ1f}4^bB*Bg5--nd^ zEkhxSf#q1{*xqx2r6%1c+PBph&?ntxCe|_HEQWG{J6p_v%7nH|hyv5%#~4%7$A?B5 z!l|?=$B%BnYF#VhQOg!$W6{Y&#Kff}kVO)!iDlj8GjGEv3`Pga4J@Y^Q5TF77Td<; z;u3QLt)w+xHn^nmE}XNxiT|Yg zj|J?4>*J_Lri_g#7c&fE3xlXe7Z#795)BPVq^r=Q4vi&Lj{!8?DJ}b-ov*D#$01e-Sik0= zi_8$H16k6BA`FK*idDQoobwQ_H94Lest^fStOYf{1jL|RhY)r57K&*lTVXb6wBVPVWY95t`OcVxr z`25Ts4wide@vEpTakVXN{jEvoEUv5L0il~fqfkf#^JfiqxE*MXwa)|p^Sd_OX#5l0 zXtNUl^p45j=UGwLz-b7$+j8)00^lS;qMc-z@#8Gzhz#&(^BrOgZLvxF5zxypjzU@5CTW1l`QA&UC95{po~vdeM_dzr(h?~; z$iUmjU_v9(OL_IB#kY9q@_C(vxtknj+sx!EX-Y)85sQSwvT=+RQ!CXr9J05|F=0~? zz$w@?OUROQo1zYjhYY&>kF%=PIOc!DLeJ(h2I{*B>gZQj$q^*XZ?(ay1}yfmOGEHu zB17Oa2QK>x4WQV8yuyjA-q-J+2N*gzy!iZy4X& zmpyvL2eymBCeeWgyzd6jF}kGic(PVMo@2PJbDVGr$dM;WX4lqwkj*Lf>v~&iL#txw z67#Gv^Uh2*IR?RK%{B0x)Xutk?Na)g;5ON2{41%Q-`xo_$uyZLH0Il+(C4lU5<7`=aqeCiFI%yYII-osF^wLk#)@jAirPNN@2Z)#E&x`JYEdU{c{&3| z(3ob-q_nw8;byd@NXJLC)#hk*P=cE5Ak+OSqgJt>Ap)Rf*u>EF$!cjKm$2}|!9CbV@JDKMV)DCfdB)RIuMR{PFgxFD>%Ex)}U z^;F#>oO4U_zHoD#ND-UUPBNU>ba@AppsLAhtUTN(o41ruP-iOcmd@DY*~0*ydJ1a1 z0-(O+p!D9LbdU;(GAqPA)J~S7Ze7M<#FoA%!0R#!@2gLt`Xug7hTTaqvW2y1Riaeo6k z(So~@ACa+(^9=8XY?hVF#cGPw#||x|%Z8xKWYE4NY|HSHJ_P;0*q-miP_d3_a!g4fQX*F73eUOF!N{G>48EBKIrfh-bkNUT2Kt)<8fqKP}btu&!jp=9qLaEwi~Yuw(=oS)Zw01_3P#0 z)N4^D$n1=A4_kKZzbjnCuW&4C`2UKK104-(6UJ0?KZY2u0a73sWGD z?{~$vj!S)ik1p>2^YPDY%U3-UZ#{5Q54aaT{_AmQB)QIPma>|U^DW(>nCG1zmU;!DcDh+-Fbdt&cNOTq0$d&+I3!@S|8A3~VGWU`X>82I~X`=ho?2rvf z%14+PGGHyj72ch(v5o@KTM2P#kNu4R=n@PFcVr8l9f7sps+SZ1JaUJ&&~w2yKP_Po z@1lbgvj5yg7bbBD!4D4d{`$ukRYQGRCH8~5!bj$>ZFSpngoU*3Gg z+regH{z zM##z4^a06p!(e$2@LiNtCH=%+*<=fJhz-OMe?o1qWn;D!AnVtNARKc-eXC{DJ`;=I zvfk?(B5l_Jcvayf+rgIp$5{QN#-J6gW%C=)i4}vF70$#KkKFP2a#eyYq>bzh?7D}= z?YoakNR|totAw0T!-aqQ(IwEG55eYg2`hahLO%kI*YY8q2!U>7u4gXe^P#EWB6{KD z;ZK;;n_AcYU#UYFzV& zc4>U+=dc&g;d~Q7C8V56L~Zb^TcB@Lc_;>+=QY8V0HL{GrRV)E`>vegYHRKC+e61W z#^O&Oeho~o9KQFC`QBMw@yi8hvK5A!OZ-32RKG!dIGjH&GAtr8Y`Igh6(TXZP6!%m zj1IPa%FR(AB!*g)1a1C*<4G0a|8n*y$+Syz$QFoI-*Brp)!eKNjJ#rY2}K!3i410NG6=BWBC_b`M3YJ2MhLQ-+=v4QLP zTtfmnaT|7l9F1&52f3?XJccd)9jDBDxQ3ts_BTOoI|Txj!$wqZfxIbSYV+HH zOluBO!9KR4nz`P{7KH+4OXDs~hF;VE3~#s6U1)8l!peVM4@d;9pt`!4@{3fw_ngCBuu zp~b!|`9zYM+VfI(@HdTbs;Ma1~(`FCcqp1TO-Ty=S{LI@lbBaIFQ-v_j21#pYT9 zl4a>e`9sKU4%5`Ak@Ag@@Q?g3w@}1424tgQ3xOgM68f7R`2_=z9&s=dBBA_z==Xx( z>=&LzO(iH*8<*alYWkpV{NyyFIsohGDHHcdbl2)`8muLSIXU?96d_YD5SX{*8?Eaz zQPEp??S#{j1TC=6q&s`XF$M;Sjz{0@}kAW$2d{wYF0}EOb7>ix*G<6b>wXkj1!Q=ocCYCL45|= z-3B<|&%b?>`Go)KoBVA3H{YZNH(tG*6GDWbMvb)uv(SKeIZJTn9UJtF*6Uh63QDl^ za+%)lZCjnDFk?YJHOqhc^%^mRg9Ks$QY|JLRwi=i07}dqoT!6raB|r0HJez9T+CfQ zGD~syk=>Zh+f~{t2v7o1;11n6KxOwP_A}e$7cxSk)<&uU{7C}TZzdZ%cBcq7*BYCE z;b`vHf=j9WYh;&wnWEp0sD6m=jwne7ZR`%lQ2v6}&$*KRD+jU2EW^!5r;khHhq?@L zF)|r*{E6<{vW|vUg^l(W#{x!9JBPfwr6t!oM!QDz$z^nahkdQz&ztBYHcmh1BK)wQ zfqgV-2lRx^#}j{huq)>C4|vTXJdM~1|I+tC`M}42_;&#wX?X7<5cq0duc)rwvb=+9V;#F)#wj52-Pu{7D72>l;+RRT z_qh@wXvd-Jsyt*PBhUM-_w$VNi-=9rQm`+R?(6mVatLLw$9rXJoP{%0Y$JOTT^uyo z>9Ax$iQWknXd^A(?P;>HHJ+6L{u6r>*vQu0V?qPrNDEz42}rfXcop)0oVR5EU~Tu9 z5}xLO$inOgb>ZfxXHfvtc0}2jMIwF{!=GCxzK(b#1-6ePp*ay@xB)vs&$174t;!j} zyTMd|9c4=)%>MIa?2B7&f#K#fe*oFUUUFh2B-;V-M2?i?lEzm0Kg$5%e;`3e4X#tK zt4_I{4q2CGph5B9O!s#BZ_^z>mOhJmsS27+HG$*fD^UbC8%ri~c84$eRg9>-=% zqjIEVpus^jYp>*oTGsBt`j&Jy{AQEs!uxTq)cRHpVV3L5sd%MLy{bRwq8=k=SlsA- z`Hq5mZa?ROgSR;W*(_LgF)|Nx?)jY)Zxf-S6M(*ZGIT-CFI(RMfvIy(z#)9_I{%Hy z6>k0={fR(=b`enA*(l+QJ)2zGsnR<-e5wK%g>$%H>d5D}cdk(w=gk3}4gekxIc0&s z@+LOcjlAc+RGg+#(B3YCL2I@AQ==*llE;v=!VDqtC-M++@mTTd4vX0JW3au0v6@rm z6ZMi?ox7OD@^8c}Wt`b%F>MnFt*X{D61*>TZ>Qv$i<6Rj+ae9|sG_x&@?V!4B*KlB z%pCKU8%~n6T#j=srI|OIx3;UiT@W$TZ$%oeH<55tZCCrb>qlIJmA=Zj{uQQ?P;ZjA zzK!m-^Ybu^`(uew7K@!FJD%5Y!baTyrZ_n$VJL}4yc0V?PLusm=u3e%;p{EOMSfd{ z(<_J2uwNyxY8z#nVYg%*nq7qN*HlsvHymw+C=lshPG} zp9+sUTb19Q<{qaZFUmF3ltCay!9-kw6}bD`Pvh=fg!9@>jtItnq8xf0jQT#RO4gK_AlzmI&lZ zSVOt7MR2*&LmB4>b75`NaL`g;M;r4yHLeWkoJM$K2xr3l95 zBWL8H9r0ay8|LN&s2&<|C}-&ay_SMd!l)2wWpAC`Ynw8?d}Rd82f?UvsU-@b9wy1q-ev=wF?!4qgEox z1?FnU*`P^}i*VQbV%3}DIdFY-vioEhdz!`9EOyNd^$e+|hnbhCHeDN+3+tU0M3Kpc z!ZU$srv<+5_Vz`Q9x~BsCmf)!klj!Phpp_PH2;9>3`E?Y#7L=ToHdqw zd2t}%vnvMaa?;xiuoIh98yD!dGn1+fA!7dfDc7p6@wt!4=tuMY` z*x(X*$h(`LzVT< zQW8K`S2_|K6iOm9YNOEK0Mf(4zYZr?hJ+7SEU0=&X1^pq`-M%@ue}QXs`RxKtx&YL zl3ECQ?GAbcGB#{wXCbK%2myZr9vN^912m`>bnv(~f1H{>A7&8XlDtchCFSe4@@Scp zV-;%V>sxfN29I0D`jp(@wh6x%%zFfPfsGJ{Byj)&x_YkgCS~0h_bS<%2<6zEYcq2W zBmfg<6fWN6c;_hDK3c3{@-xw)!}<&m&ppjW?wcXTOw2>Z`8J&*pw~@ZP5;_xi`wp| zuxac%#|^H-kI)VRR0Y&c$=5?U0beo+#nBkcXDw=)Mvu8*8Y36N_H+W&Qfi)P_JNr^n}fM0Dgc-&&VYbzUV zaqB+eYcx7ay!v+RyjAKGJ9W%m>9lv}?y|C9G8Vc52Frw2ZpD@hO|z|?@z##sUvTq_ z;*M+{W@x9hyWJ-HH;pDn$Gn%CYTCyJUir0r=zF)vr$wR2~RirbRq1H4o`;JhEXWE;K- z{i7KJtU>^ZgH^~;b*6hp7uy~rxTd^duh&+^auR!G>mgTcm=_yAF9NM(lqs*+xMK&| zDKIgDq&#K1307zU7xIQ%=Q@{cy$W#)yg@WT8DcnI z2sY{RRSWbF`^7TC;q{;dSo-9M6^cY-Ik-VfZZ^-?{4-u&+8*?ed5yT1at%2^a8fZejw3>a_6;A#CYJaN!O{?yP+z> z-FAM2=SoE89kG9>K*)v}nZC8hmi`Ax(ZPT%Z9a1Vu4Jco&(7E=+|dBtaAEtctx>a? zR6w3YlY|u@Rjl}Ol=S^dp|^jT+4ot74vG4)%mfq&WEAQ;JP-sTz+M|MnefD62*mz7 z0Txj4sKge}I}1~I;7Ete%;N;_E1BoRyq-2(e6U@nFDc+FcwUSGAI>ZNZY$3r-1Kv{ z#V@hr49C(ztw)~|0`qw7hzC-VrkmA1m5~o~k*h}|SGhK^e??~p zFMv%MBG;n9$|oWs{ugc&kXXJ}db)%dGs95M{o+Qn792ko7aJ%=2$M8 zh^{lSEDI)_4?pj6tN;CFzjFfq|L|p6DQ=~s{RG+dc0%Hte84U|J?`Bp?%il^A#nkP z86sk81>~66t&1@i6%`gs)%gvz6Q@XS`dcUK zJO_AhY#p1+&cJm1{W~zUdRJ}%a0llOYePRboh*#xP3)>HL2!q5o*1O-0 z1XdM}hKeQ|XA@Emn>#i0v}{KCww9Xq&YJc+XCDeJuM-Wxet99X7p3loa2#bzt-iffk4!!pH->S+Ytb5Qs9UE6Km#i5~)bC|T;CU{1y=EtR-^;hY z6)pF?WjG!4VAOw@x9wPM9U*q z#2L{GY|m%AikB^!=d=U8W0~hNn^wHlBkxNij=GwU)0g$Q;iz+$E^nSC55AVfjOz-` zrb5;xm88O|a@nrVn1;?(b#~=Ct`p-PoD<_wWEGO;>RWUu>`}KA&G}KTL;W2QFU(fk zJU1sgJlWfYjI@uBhXZ5K*Uz}abV>7#=r;F01^thR46knzfa89A9(cE;>bRtU!Z|Oiu#vPkodJMp|JVxu{EBpH2!QJ#m~;F zwCMrIOj-RS&{d@~m=hTyIwQSNy*Cvc|(%Q(N!sbTcwD zj_@7gwe9NodJ+iR{Qby|tYN1%&eDrD3m3ll9r>e!!479QF;$LXvWH zVL=Db9`lCXAp%JC(Cxsw*SuTq!}A|7ePNwAfP9#StTGhK;?BZal|{6mU3iAXu%t!& zR;_q8F@~+dHS1Pa=X_ZDpo;$a)ydk;(BVXG@#990gV7Tg@HNLuT5UHEeZwOaM9(O< z!aLE`ndOx24Y0sq6X*sHFqk%JN1WA%#^!@^HTR3EDQ{Vn3R<@85AI*T~3m zxxRe34Ua~tNoUa?LnCm{-?^^Y214CKZAm9F1TDONcXyw;7u<)^?o;gbkLI90SD;W! zvP#>h(U%!yv>Ii{sKmRLu8#7G(#WSu%O2cIi$K8G02f%U{6fkJQ67cUaQwp@$R*=@ zWt}zj@+?L`#3WwwFa;{Zz_8|(D`;}R1tI^P19q1IIw%5>42s;f&RQhU3v7C!Frgi; zZz`f~bGLrzj{G>G`&V^Z65_oi^N&s4V#47$Tj=D0=6H)l5R;Zxk6tPYr&PEg3}E;# zI2TqYH_tgRu4on2KaDGO&?$9ZE9DbLHYl!l08!eNf6M3s+GR`meMy7z|NW8%=D#j! z*sz%eTqCDSb<JN{Vb=wfJ;z_q)B-qq22;TNxgMvLTD`YEiPTLP5&mS-mC?=aug_<_tby<)i9Xwxq;WBa z$vdu%T;O2kk4*f(8R(B6AKx={l)BL`CR-$EiSz-(CsCwKo;b^ce3MXNZPNc>;y2A! z9yW-=RW*x=Dit#97OxSpgsuGr#&B}UH}inP1XMW$#^XLnG&u8Ol&FK4`_pq8IR9(F zQH!!5B>iSpIZdO&)Cfi!gcRwT+OjGGhrKPr799hng)E_RCdr?>S!X?EDp^Jd*%qfH@fs&PvWoI?_C?MuLSMbvekW&o$X>0XZ;{OvXNDI zK1U=m$9lhi`nOdJozWQl|CA&6XYKxn96{v&KXU|0K;BEak$`}h&Hqj(|Mwh0mOnXy z85cGy1DJy!Xo-|6n03bMF{mZK7@`+L@`a>l2DGOz1k0A|sfD^o=$#aI180X*zIaHk z4MZ@q`T7@1Yq@^6;H&^`uDZ{vr-caq^-;|k8=G;v#jRvPjhl#p;Nx|X2{>G(eb!4n za!lDm^|&t4SQ0NObkAKPv*GMGWNYhrw_JH-VJD$f*~FuevO!_pq^u!j%e}#5uZT;& zgiQ*Km|klHW90fUxarKm+A-gLjs|^X{%5LEmj=b2<${d*&k-#N5_{7=&cGD)l@&TJ z4u$bawIr&SH42pKxvg&;ih;4pl^7JpB_`5EyK%ey>=y3G7ty@vx zy2COBM#B3cNz_Nn1r{~k*NVo&l}Zlt_1q?CVN}A>iPv$?TVGEIIjM+!)N0NoLM}{W zmfg~_U{SGM+KfG1p)$1FDcJlC+w zP-!s=PnY7yLOG4453115{H=%Ca@<{BI1^gJ(UeRHD?QYuRYILEs+bNWg9#<$R8Od8 z@Zr5FPA!F1z6Vexz!=*|l7HA8q+`!0P*2ne?lMJ}(T?1)(aeL?+~+1oLs@XkrFALn z6v#j<8>w0H#7B7qD0LSy>(pustYB9l<;H8cvgQpu zv6cIHeZytp%fz*389OcehBXJ`MU(2h=nrdjU|s`P2C<{^tXSOGi2`U5U+}{T@J~b@ zNC*fg2Q?ZA0f%1k0$3~2C{Rcdc(`;8uo0>T-CmWvdHr6D~HcGp~BJqdybs!~c zem>}oKsxSc6=yCMXO5(>;n~1k<%uLJx68Y@syN>s#-*Db`X||I{AQ0$L?b$vXRdM_ zJxtlCNY7o?G>lT&vyx{epD=Xi#$`(n+Z(n(a<>GJk5$tTuv^3A&byt~DjRDXkY_ul zj{?&29MF+jvlLZU^-9j@d$`n--ppOAGl>aCvCM(pbARgLCwF$CO#TzA7gBPeH28W8 zLaJ+1c%5VTV(Ax*xLTiz8~g`F#SWHCw~Or~7yG4~1B2^}^+)4(NpJO-)qRu@YQTLC zA2|djj42m?9vqu}NJTah+&Ai*YlRQf z)|ak;8i-WP?reX<5V!G>jAPdR(X$wMb<#PolH2vsvx0IFbF$W;XcMJCA|Z-$y#OC zf}q$-M+ZsFIuA3?Eb@-6%0S)cBzr;g2Pu94%f^M~!$Qc81ZwV>ezxPC*RgCy?8Maj zsn6;VEKHOVVySF-cn}yt@II++%_eDyl&ofcDuGF;h!H1_7A&PLMM5TVV!*&JFM_Ru zfNJcNE``=Al`$7+RC=2nD_&1#b}Sl2GP-E0SU{E*lDQ})WS|Id%ILeg+3B(ES-0{& z%Jp)>lvX|o7861wAXAJKqIOCw=EULq-HZ>P1PO^i9#Dh|Vc5R3&n8Rj=Km!H)gOQ) zG|p9suYe5R-#_g?#BdLIiz<{yiWDJ+Z?T1s1r@C6ajr_KaPnf}5eToUiVv41xh==) zjSY)%9*$)&ql7~^juZzGI`bo$NiP0VP!g!HIw)~O>6Gz7IRRmWc_gK|3F=HZPqfK% zeoZOAIHL#Qc(_n1u1so(qv!>T=8CjRuJ*(G_4f_-Kr_ZZvp$e^2GD7fQ1jVtghKK{ zc+>)Edh2YmuL!h|p|vD3Y36+ODFVw8N5FvDsrL{N-NOHDxi{rEb zay@332`E@4X;`S2W}lcjgSWp52)GNz3km!}#h2)hZ%9g7u`H|Dx3F|sf6`yK<^oX{ zR=|`^300u*wK5R?u2jTXO2>qPDijwy4W@ilNdYD;m%vXr=38ndO3bII*z<11%8MjT z!qI7V9J9~p2ZDPRAVQbdQwk|s$I1zu6Eh_RGnK!1!TeHD^uHK82k5-IwOz+*V>WJV z+qRuFZfrY^ZQDs>+qP{djcuQ|{l2~b^KXoE#z@Ayl99|c^Mm5tjFvJ~WHyDLP%^0UawG+|s6d=Jf~c}LAv%sKcHW(K?-)}jxM=6Y$O*(?HR~#D z$X@GLkWJX`aMsE3msa?+iAG)@1A-%=^heQ8C=55U2#S%=6MhJN37{o2VAcEHC7=J) z7TRp=YYX%yi|_bkcLYH!BlX3T^%{n2Q(%dmSFb2;Rzxyw;=;!N5}-_ z@s5wHumx9}AJk>&qYIyMD!vHr-(yL|U(Q9OM}c2SKnstKqoW-+9hm2Nc|$bst*Y4V zdNw{KNWktE+%+wTASv6YV;!R;)VYz{frlX7_aONA2BC{=``%T<#NWnSMdb&U;%BJt z`|L&b^>Rtc0B9%IhHLpKAsy%abvj1g4AWL{7Cwgq5m7mpEJp3jk1*JHTyH-ipm!yW zG+2lM9MOk77{3C4;&6gyHYjJZQjkfSwVcZl)=+i4|3Vtv9N0Wrtcy3Aif=6N1NTo!mrnR+7XSw#^; z49E#UBoX;N_`?~Too!Eho>&L?ln|eUBveTx{bq{eyWb(%h0lcWbAvO2i!Sj|=~21? zZKD$YXWLdn)f7Rpt_cWq5YYn&IUGJ?6vSkbfAyq8zbXS2xgzZ_u|6lj9M%#7J0}Qj z4P*P+_`zdgh+rhafKkM;ZbY}08JAv z6Z=QgLQ`Xk7Be8WP*Y->4!xkYsb|vR&iuGTjB&cccy|QcJ=VpEypRwdIL4s{{FMBoje(vu;AdO!sdz!9q@{tOm|PBe_hx38j-l#fF) z7tOxN43(15bSN9FawD<^JM&Wplz$o0dSPm@g9J&<`~ieJl#JgMPBlH{qTZc zO#2}7HMCu6$e*)&$vl8hJyo9;4aD#Z(GWJ(sKQ)t---eVk@BA2PHu3%l{H(`MeXdm zw&!)I3p3&P;S^6(s>=d!C3O1YhJ`d!Y@oIw-}{a-nQ0>FNh0pPJ7|25^anNutPY&vcxZ@yP83LP)n>$W?-ElE8%9q~kk7knmBj zSbmRBoAf`%2eW%sh~F9+)jh4KYt`ZNPu*gqVH&BIt5`zfX@1m3rs)kTKt~mXz)(q} zxKGP}?|m}kHLAPk!P@FXUf+bhdi)OEpI$&Z5%Epx?P8#pb^Xk-<6Th97=secBS?5n z8s*0a3E-oON*d7_nQ9cD|Cg?MqKFM^advA+=(==C*ZSP^k3~x^Gq37H8m&`da=CswKo~%!jeih-Wh66i$W<^92J#>ezK5Cm) zRy3R6c&r-PPjQkyJ*>Aw$`<#Ld^UyZDW)9%mASY&P@YphSz@^UG+yV-vwYqDqqAP} zO~kY5tEzcGjc3lWaxBxgVpN{u_%jdNaOE83+MfzRJoGmz9W08vqNwGj0})89Qi6)X zRwh4lk*J5Q7MVXbpw4P2l{*AwDOzNL#e)Ur!Lo#}J3n^LINJoLT|}2hWYwA9aWG9= z6sp^WooE-75>VHrh=N5vpIwsLRHzWEfT6WIFDTm4>tvS5{whtRQeNI%Dd-_hd=Ox6 zi1B(L95yp<(Un!=Xmli2gYQ7t@e1yP-wj9iiKj&~8cF(eZy|^Cu4+f2sQBfA><8Dk zD|p;H8m;f|31xQl-+?l_uh*V%KOi5`yo>{F}3sOI>S6rxhRmmo?nN76AMw2S%c_~oeL>Au^W)8i8{`YoG zS#?LVQ~-e53;4$PYa_9L-NEh;a)_83m+0j~0pC(>9v`vd;O`E|SAS9T2%3_Su8#8` zgK|Wdj5k9MWnxIoR{{&ubyioqG+mn*=VT);&Tg`ChI9TkF{ozwho6EjJh;sM#ZN5( z{FL<%KfU|IPmzD~Q=H%YH0v*ZI{BNQBL5FRr2z2L`LuG}Km61ZGl&x+eh`jBx|hkj zRfccW;+rqrEx6w94Wv;GTtK+(y$Y8mC`omyxLhxGVP$f^H(|&PSbUozD{|L1(t&A= zn5IxR8X-2VZTgPGOjYoP*hqhV?kfY%+o%#zGiD{wEQYEAcY(Khg%uus7)3f-@4G8s zugWCn`g2=LC8)NDxw&mjY0|z1dZ)Q!`8{js>tloT?mhbd?&0;V+HfQQK2`dE<5QNu z@TsNwDgd8S3cRc^H5`3X*6%$$Y_zO`y{{%)Anp)Z_;M1<_I4L%L3*cwfpt2Y+@0t^ zJIVcUcv(|g4pn(G@xaPWq-i(a}H~vuvF$ zsOp>04|t!TV+K~uGan~Rj`Wc&NjF-QH&uhRlB>sLp;@XR8GZDLGCnyG4uXdTe`@c# zTC(S6NIh0u9;tp{mvN6l(mHl8_d{ZOmnlaCZ{DQBPF-iIdmS#vNsS}=`xh(IPdgz~ zt~@J1>V$%;$YJln1T5t&P?7F3b>qbF{StO?5|LE)%Yo~~S*$#&+QS1uF)NhZ9OoUvU~CktTiQRp9DLyb z&5%HMziko-^H4&?1eFP8*7z1%z!I$<1UZwFl?`koO>#NSNy476Q7G=j7>afy3?D6x z@asSY7N;+`v!-QDf}c|7T!XINLD6*cABVe?6>)|rxu<>!7l14l3HL8JsRKHeC3c}4gs=b_CF-ev81CEM4lYXIQU+njce@C(mAvOhZlbKJjs z;IVOm35P;ja`)*Yf5W>9fD>k6+i}uGuxfVdU)RNz-31)(!XfoBgTMZcm*2@PW_k@7 z#{|#&vhyzo1qFXl%`g1_9QE?YZvP#gc1>-ANzu_&rMm!AI<6Kyk&=pzuIijODMVZ8 z^6S^Wh4Fd`E@Tm%jW@>m)q*}npbwGjSw)Qj|=qh17r*1tYo>+qZ_sq9^TzECch zh{JuBe6|e5;d(thWBng9BTBy2OeN(;E&^~uY2X}e_{_Mjulv+BU* zIVKT=U&TWSeK!;cqZX|?v!Hz4-e@qEMlyCR)V8Hh3>o_^aDE^YRS(G#G0_nEp0C~r z0gBCOFqk2klxNF_(7O%cPxtrU@zaX2;}Q;1StDj6f2<@#z_aqhHwx=1vc{Pn*L(KX zTJ7&|Sk~vKrxmY<*9DZU6PYgd&JQckDU7Vzp7saV0a)g$m1mmUv5S@3ogR8gAFgi^ zjI0$}o6VOiQb*SXjOQjOnav*CI|;~>ysYkL{U?*W&UcWlNi^Eau2;_^5qO#%9^21R zlV_SOfZe%}C!n8tB+)kkH@WXgIml{t+K$MuzBqlKXRhe_;L1B~bGo{oNWem`)K+iq zxOrYire!;+Y&tjj$!LC)5yok~uJ-6D%r&v8+5YT#CHlUyjGTwu^PG^8famqHQV_P5 z`uW%sd7-_B;6?+35*lAG<1 zE9Ys(vVEi~+N-W_J@7PVES1FOkyu5GIxWvC4T_yv+be7HrK+^+$#1RK3!43Ri~b{} zyiMJH<>SFo-ya5(9vS^fRcLhD7~J=-1MsdEW`dQRMe-|DPu#TDbt9Zk7f0TK2Kmde zZXIwyC-us4;4ZP}Tc+_RZOd`sFVp8*hVdtRx~0~?z+RpWY45Q0wzVpB9#L3pdz{s0 zxI%iA&JQAf3t=E}kDNW>sQA6vT5Htm3GXvPdQ-#J2+iL8bM%Jq=kA2JA?S9OcMRiS zpe_)fvCy4pxjxqJO0CN^vrNN$CW7p9KbKBVQinOu?-xCkn7sOW1awYo{%I#+&lk$3c{Bo#O3JL>?+jBCh`ZO?nlV<38-FJdcd#2fJ<9g6{?B%-M$u?OQ zc~c${NBTaAT$=ruqBvpJ+zfug(~Hyj{%X&g?wm5wda&H)zVV8R_fppP!t!GM{Ne?Q zdyielspq2k3TE@p<-}bMy6{*Bf_s8$ZOyJ9=9ZXlh#hPjrIRAZOgm=uTgU z!FnsM2RB2W`v9VXGMNoeKt}v%VtDO7WD|%vLEbwni&r7_zR#lH#0Seba@n2arN&>D zSTrB%f%l`6bYuMm6YA2EqgrQoya;QUUC9nN!6G|$Tw~{Z)yPZQ;n53gj+G#}eRN7h zEoT<+$`M0FZGq;&XcJAM-FTv{7R`Q3NqxKa#m04OWgCO_$@nGD3$ON?NAXzW(lD~u zJNk#~jaP-#j~iXXmXCgzk2l))({y+JJ1{Tdw#&hX_alF}LD00X2xHnIT94}e6xMG8 z^`9!Qmmzfq)|Z;!doz$HE2Sm-LDJ2awXk{XyG~&7q^d%o2a@so!M>0T z(ewL2V~~*1^9MjT{PHC_zVjIo5xaiDUW$SFe zinD)(A53XS^StQnYSlER0(dm?m+T6}Dr{W_Mct9o_9?0Zko3iRmWR{D zrJr?nq~M`UhnvIW#^O}CZUx4J$g&7^FhW?8)?pZKEz1BHImr+mel}Q+62g!DN2smkt z(CONn^l}x)tngR~H^t8|btT2+-*Lo!qq-PFtkS$PKKf$3_&gbB?#D0q-=2gyGgNdU zEuZbmE=GeIJCjd6p&T^@=&>U*9oME0uMMGI^^5E)BX;sg@WwxnE|IEd|&=NJsViFkA)PhIsKm{%6SnR#}DkCB*d>*AhpI1G`Ymc^LF5KjP zye3$b$1gB_&4qhQglgVncAJ0vFM)uRLawrws$w&VRYz(@ju z$-VpPsjl*UuPDSz-%l|F*NWtVEA{pK*DXAr?7h`?vM>hw@L(7D`%O4RGZIF#h&E(% ztlm%p;Mhg>1d>8EkguvUA{Bc|iRlzMiKhDAn&Q?Tq*{9tncP{rLkUwusC+{Sx6!31 zEQ?Ks5V9&WvI9&sB?e@6&G>f2i9`Ficy`20cFlBlN6hqlGvX8joY?u#F$pb`bx9`by|D*&OiVJfh!>uf9G)(-^Dz+G{<;%ekehQt%R zy$FIq@dC5aRpOTq^6rJ=aI)z#@0v()`nC*t^yc*G+Shr;2^0VABnISRS6yI!)0~y3 zrq*ZdRes80B;vN$6U2-}B_D3CE7$RRU1Sk+34v!*`SDA-NtQtHRsdcyEK zBqhK(N_TpIfq>}2O|mbhT4LL@ux%l+0U2i}SVDu*K!PNJ`g{WMSv_6>w@$grLbAvx zS-83D-+QBlySJ9vT+Vtw-{|i2vcFt?Gs0zc66g~6N!2$lXXj3~eVwzH3#ErE1Op+T z3>IVVr;EmKpo>r-jv$34L@b?+MRIX^qpPBV4Zm))8rwbw=Em}v&xKKg#Gvy!x2-!p zhu9^St16txTRCU8Bq8!JjMfz^viJ^8x@VsD#5iS+MX4RJd(`S1sB2fTaCV`cE=r75 zWPqFyZXSXR&b;7)ZO#?Rj2q0HoKg0@@C(i6dub?q9(tbR2D(Zkjx}@G0%J8Whp!LV zja;%jS?(RkU6&kuL30p;2CY0i>akvH;^#O0dV)SSdyyVG4)4+&&^p-079;8-WDvPw z5{fT*u_y@!MMR>+;1qgA`9j2~6w4*VD6IIv&A^T|pSB=uUI~VPLtxpvs&muX>^neZ z;2*DfAlKr8oF9H>y&r#p>w(nakE^tg&q(s}uspcM+idsJcm-_W!s_}#!xmKP`o(j{ zJ6>1N`r#PWW+(6q_P^cmj%BPBlMNcGZVH^d;Uxj}q!0RT_E8uUcqxm_bC}CUR#4Wx zV_}i;b3XFnC)WI=s_)BUk_<&yz*L~fci76bQUV5!gx;pQx!S{xwm^$~D_*$7j&|8Q{c{)IaU!-{~|uH$pQ_0s9W(8%S8&m1AAiTlFor zAT})|l<#Y>?%YfUPx9t06q{*PUT%1Dxjq)PCqY;i7)n$wOWNmdz_9L|v_NTXOCYDd z)d?_P+we9oz%yPcI&Cmd!OuPy=R=o{x5mPk$G}IaezKcd8)Im7zD-r0L@Xin9&FV{ zU9BOUtKx3efYmy_Z)K}9g=BK)KV6>3!)UIk&lP3|Yd6jOzI#dcgd;Sco@=iKgFm|1$VttukkWj@bfplbw4PKp-3fe9ZCJWhka3)S?%k#@<~bN5xcgS z!l8wWa<=jh1gL>!A{FzHKl;QRY6t|`0s5nC7F@>5!>|sUB544F%vn zzhmi2G9;9?yrpeEc4){de^3lDKRXUCvJHk^Ug9N=1jHj}lsKN?+a)=f9!Tfhb$O;s zWj0SYg-KPJXZ;Z=hKqq(auTrZf)GIwjS{(0vda!;EOx! zcWRk?|8GSLw|~0%0q!~4@~mYqR=pll)=;b^%e&28{tn71E7=Mzn#m8RRU){V@%xiy z=GWAT2p`zI}&uQe~T=mh!Ae)WRv9JK@_uyu= z_K5w-mZm#(^mlf-6!OJTs%;3cmdoXpLWIg~>|*h41)#0i+6BW#305+iw*%gH7_gt& zpi;n)KfOVb>%Oq6loQi|V<&^aNy(ik)h~c3PT|$@!zY9An1G@rgCHe$0evdK*y*q@ zw>G*CFBoQID9@5e#ek6df!*7Mq6Uo2Y9HQ}Z(KgN-PM(^D(pkfMxkqWBIvSXkMA=a zYPpMK@x@HAvV2nm)SD}{p6--DRtz7$Ca3UJau1sQ+8^5$-|Yd=Ppr2tqv0R%x_~M) ztWPP1ehNmopCa2MWEPqx%SX(Si{M(5t@vY*8I7>FzwJ>~7OZAt%AR_O-;ec{N>@Y{ zamMlxv4m{QUn80QX9oLX=*AvWf^nVc6O{Dm_gL6Jld>YedZ^B$?<>I$0`PT=9H;uA z3~k1l+sSL5&bm|HeE3IZNE=~n;-Ci#8V}67yU(+3QPfP2=&%>9JRa)t_tkphwYryV zROkMPB(c$#mO777n^M046Aj!ri`-ax3UPVyKnXh~g>0li2?-^IoY-;=f&6`LJc-fP z%%Fn(cEp&(12oH-YZVkQ)~_?yfCS3xeR`zZ`T?HTjqB}BRM*RF+2pPeY`m3JXak2U zJ$MD{-@QN07$@8#bH!#}Aj+z8Qn^zxcdlDMp7r~nM5$(GQQU!`XMv?@b)}1(XP6a- zLJ6o&yh8qX_o&DUwg+IUcc&E{6uIdk5tL#9v%4VQNpwVj+Fj1PBae5xKSx-&{4_0| zJ6~1-yy-8Wpcm<-@t7wiJdPv0J_9!sXUR;lpQG*OHc=e^ zK?hHDo~^McPW!h9Q!aNDr=2fSPjqeHfy=z1@~BQH(|j{G@9ts z0XxIhk$jlyWT@FTVgNDR#Rj{_2T2qdd*=R2WLuwiTWNlSPfmKm7}rx z^Cn>jgw2)P=K4|hUe4xPs%!YfPjT^I=Dq2Tc)^XKm#f6Yfs0#1EKP=NQSMg0s$lo9 zJEjvb7o~5aC}JJYo0Rk^p98^Nac&lF-^?*C{ViD}nhVe1iCi657HIM$@aKFJSDa9^ zzjM2h;JO2Q4iaO(R?+Ee51uB^^(SmY5`|G^`a4QK6Y4e|@0J!Xk`9cc z(rXRu@_zq1A6(pd680iNQ$pR6l?#xSEN*JHMO@qg!mUASCm`;@ zMFyY=05hp3g{Hs5%|*Y|!@1OhMN0o;h1M72SmifS7LKc*R2bjgNm#_UxP|6K^|tf2 zI?;>Z1E0yLJ>p*3DY%9P3q z55cVj#_Q%Cy;ytO1U5#t13+}r z);fka>jM~CbR)hNtjtB;xfyb`CCf@pGvJDBC`JcZ>~Jr-8H;Q%4!N5G4wh|KodFw3 zNd_m7P~35}H;iIPX`w|?=Aux^E~IUd7X_N^gG_jG=_fp=0pV3B(x+LoQ&BL%WywIP z(jRkCnvOsVl;&N{dOgA8`%HM6tdHRoClB9SM1hMD=y>en0zFve{~beZuvd};Bhluw zBwL`5BbSmnb)ZipAggoM!+#iYcY($mI&>5jIahqFVL^UqUf^c5%knvwM1GJu>9|H> z#IVPP4Odr!W@okYeGJwM*B2fq@Yb`KIuosQ=@S+i?O8e{XmDL4ihNQ@r|}9IA>`3; z1^bOxq?H)%ITJ)*r;7nWfk(|1tUk{1^fu{^UT1-{boJdNK{j%M5x$(u_nC~!~??=#CC0sk-06&)>((x#}?)k08ZNAw(lZQLRU;9NJjCgcq z-1(}~%JRB8xIm^CKbasRkyjH6=Kbfyga*R%?8N{vHdDWqSKSuP!?*TwFzo|a69+fL zNmh_C*xu5fx`?4zf?z)9LOHI4s3s;6@hneSTx!l~Uk8TSwv?46Dz|qY+s`aFe`g})vI)>Q=%W8AEqBk=1%j6id%I{(A=L7GejeZF z0C91Fr=;FFkqo2aFM%fBrOi&tP-)%aQO6USd^A64f$Ha!UsJsD_v*^=PhXRW@xt~_|YXwtRW+mGL3snK z*`XZLy(!QIIQeqoTYqdf0XS~mGlcn;2?4KnL@!menhV|j7%5ZcC*w|4wm$eLHsMb} z2$70Ywt72kiyTJ&yPq92Q`w9(1{0X{0;IggyNNNnhYSFFU|Rh$i4oVq%Z~&S`KebR z?BQt|b58o{*E*-Ac5=de`KAL>T$u~QJCd-lM_myV#WEjpT9Lu2b7<%z;$UR(cStp* zzvex|d`II1@9n%Lug3V}MM@MJD!=D{Nl z=DXyE6Rnk$h%UFnIWDMdidpB^Z=q^I|~~=#&(4V?*80e`$SwEg>C^x<&c+Mqag20vCKuSnlBNuNm)J zVQGk%0}?kwsDSgxkw9RX3rN68RzT}+gG1aROVCNa)&Nm+>;GAb^5tp)mZBl|x?)F& zfaJTfVdWLBsO76kZhQIi@vt0qjC`eA1(R+Xh~lpkN0Y5|0L=N+B|uQ(*bcW(&G@e9 zTdp|2!Z2BJoBCO8s+1auZSq>RI-!UmXVkk`1oxbD@mY`L$H+u0#Iv3TZvxX*{`F~1 zD;KfrJ)h37V3IMZQnjN|HZ6!9m+O63=p6!rFkcau`?t;jdNIW4bEC{UU08;U5`hyHvBmOAq?eJ;1{zr01 zR?SU=&yVB9fVy@OxT3PW-?(ESYx~@(FsKP0PrJH(j#_(lBbin+9)f2Uiunjhl z6^GmRB&-I)@Jy2xnqr4nY_~4hZe6*!CH4NeQG!u}IgnJxIU3*gmlIUt9O2whxj~|$ z6zg&!w=srm)7U2JBftE0^=D@OX{{*t@77L&&+IQlE2E^`_H#yZP2#H2CxdX03#A!X zI{I*N{yhz`#f~L1jNv^Zad-ydqW%0=hB=(vo{n_ueow@+E}h>KQH-d^)#<+lY0z)6 z(!YbWrmt=YmwVYTpiPY&Cf@tY^8b~h2xW3RWOKD%@E(9Ql0nN$5jVplvu{QzhNv{w{|HAv=cc$^6A#?Cq~wPbMVK~$y`tHJTWR^FHyHu_^5#L4>*f3+ zX<_5J49}8ZQYkfIdFA)~CZVKA3Tm~&VUBuY-{eZ=?;R@O=8{DVcIB8iPex-0X}Xpn z*;+clQgQtL(Ng3z`NM7rfIp<&m>NME@n?}H!TO(c)EevWbks4G%3&+VOrBle>X+Cj zIf&-Ct!VSh%y zrrnqs9Lj{g{&|W$)6iv@IU14<5^NmA*cn|Vi2MS1$mxBu&xdoAUl55rnDU4T&S=L4tyvZU32SW;i?BO3VE$Q&-K?1N&HxJN%20go^_!D(?F(Vb+wj~rBL(tHzk z9Z%28yWS&rJQ;x6;x7}=6NJ`rJ(VyB`*lYKy(b^5^}1=q0akbWP-(>TC5IvbCD&n%tz|O#A>b6a5y!T<}a&4(c5_QITvAuRGV1&WF?E zY}C&z9OXp5jC4f-1r9$ydKTsmS6J~Dl$JaUCk(}$UcJ6; zIuM4RJ#gPc8^<1Hp&Mj+S-zJv=0PQnD@csrYb@nS2EgIDl4*rrrup90NWK2j=nTJ1 z^9cZ4GL&ypU<(vJoAV$0T(Ck@A1c{1igJj;+@%+BfMA#fYV`{h>DlK;H-(xG(d6@P z`ZF~z6V>hL1h_ecJ0aIBfU|s+ABLb<79!r2W3W1w9-7*>*|lo|ZdNS%O+Gta(aUct zYFcnwO22$?Bezmrk`Nu|Rb9$oZho4B6!eTo~Dc(VQe-dJHv3(M8O@*1w$kBqYQAd8 zK=v2uehH*Je ztAQhw(siK~V7($A`t_W1@!5!EQZ1E>@GlMt{e#)g175~=WJ8~!J1b2+kk-Wc%B-jo zSRn{>@;)d59{O%yFtLe${>DhPXo3gQ?%t}u3_9fc>&*qj-U_WkO4~i9zeK3RNr)J0 zqU*Q}c?{iNGK!rPh-6670#cknr1;lCqN@1daIvgKi?sBJMeY4)y1iZIxnIn%9;hQp zQ7-UB`VKE&PrVzaWMf_hYXz}B$MYp@cq2$x zmV~Ky`cQqaA5K?j2-hjy!JVrO2PxvOhqd63*`SAmh_%qms8eg6a~u^l;vuZ^vVf?}x|bokL$-{^lX<#6lZ~mj zPlSh1_&CYPVIg=NehU*JX1uVpK+c5JjJ>KEX{nooIIp3fHd;NtzXV~GSh}ELae}@b z>?SNskQC)!R}{>U)6H^;CiAZqlt`@_WJ&fSdh; zqP~AoYZj_cRQqL1b;FkElOSmzv{LtDaL*$B0VY8R7w;gGro3`Y$P7Z=8|qt8BF{M; zDGtM(P0L!xKlHU+F%esX=C_{&&@rp3UQ7G;gr0hc(pFhhL`eBDsH()d=PYg)_j{~5 zCUo92h4erz(8aB_fcISm_zsZrhYk?7?4f{Y`4!5E!5*l4kVFc3`t!+ zg20z5e`b;LhWq{h*3Sq4`kAbWC`nsh@D5J*@L7={S11S^IB*b1v@VK&S!48aB;^*LU(r>T}0753SfC?;RA`>sTTO$GUaiA!-;yyBoJ+T zV}8X2$b30mnM`86G0sk6Rmm?9^J))I^p!gSK>_=l{jb-? zH=O59b6k8bU6pT2z1n1~9)wXukozy}Khk2E@r=hr*e~RlLy#T{n5ZDX2_R%lY0MPj z|F=c9vLqCYz^NdLKfXv5wh%Nw{}viG8B`4FBys92g$+zk(gXWxCRbZ4>)WmBq|{$* zqKij($@OV)(MjgxYW=0K-)olBg9K8WQ6UYu2wK4xwtc-+wd)AW$mZWd)Z8lFh1r%8 zpUw$50L@TRnn?=9e=BZ=##>MO@dLRsP(&SCwiUm4+XHOD;HUy>1zcStJ8|k{3E)l& zY37)4yjyg$GxLrE#DmMMz~s?C&rv?Hz~#`WDbdmw(i}c94+$;E6we=hrxcKpQrUKK zaCw-(R#0WZj*b*uPWGs0ebSARt6<1k{^du}j4DCj=Xs#9IkxvjGS1lG z_Yy|0etgg!O~+U{FXlvKD>|`#z@|1TjlE;MLv2#Fq!;+gN3Ngc1&Z0Cwo-*NbiBi* zW0{nP$BY^Kn|zJFubSiK{`+maSMvEfByfb>yS;N=O$&pDWC`QcaOVwu-zdytOUQe& zzF{?rP#qjOr4w5&JN7i6g38)g!@t#YQwxES&=>!LCee{l9G(?<1r@2d8eP5<`x>_j z`*L%m>)?W6LV#jGfjcye>B{rj&?%kD>K8^%_?|(CjV>A1z%YQEl5sM~s6-g-%o4_o zg~p;H8!oG4os(hRjeN>D;!^FdD2(~ohuQs;7e1krBOBT z6Hbfbo{hy7AS$-Rn^9K}@BZexAV&%%^_H$01x-LQ+%U?gSKZ+ocllB#-Nmx=$Nym= zcwJZ1$wjFNggdoW3L1sIHN^_jA{%p5Anq6T7E8Qta?NlpIi! zdeR&Iq><&6JY%mlHG&XuHQh;$i7dq+_Uspxe&#r4sK3&kLC*;RN!E@iIzsqn+pq8Y zEss!Xt_3IuFTlgs*r`h0Y-_I*Y*)C^caU2(JPJl!aKH-}m@$3JL-R z(jfsmDRw_b4nZWefUv$}jHX5ZO2`2bVq4%YWMg6D2Wb|a4^D_&=J`cd`Vaeyl;(i> z8BQ#)N^P{&P-i|4VN3XIMX?aA0?4`ljBqErXw5yTF#+OXahVziy=~{hUxLaC=m*8y z^JRObYVItYi|kr+LqD2N0 z&^n^N4@|`i42X%B!$v)%XWxpT!6N zn{FtV9Wa^3-U4%JP*e|-0)7IM66p}P#?3{&MTZ+1x~u34N+*|K(WtD1)TDU5JpK9i+(NTiFpNx3a zctSW}F{Xc*FLgL2{(lohmcNAk5YmK#q_=(Y;Tcl5nRpsW*&_Wzz{2J*{?JroFup*x z%tQlPc=q{u`ZmLB_tT(aE=TXX-w`iw^80h1AFXv3cEDCdo24Ihn{Sw5vpjl5pw2_Q zL$Z2EFXHHSFgQakQlXz3oG4WgA==QG1V?!BxuYx%TZ)3lIAU+U=)43rPn&!R+BO?F z4mwGseff70wh2DK{&U}dI%*ONCV%r9rzgkg_BL|f1qhjS-Xa^1LQwulAF_1k0aCK}a(wvyhSmBS*hN=Bwv8)kJ1!r*cOw zy6UK}%dGtt6NwKKWQ(GDdPKXuXyx!e-^pt{l097zALj{pT98U=J;kfZ+aXzpoPo&J zYE7}M9cM2&ivIO1%fIHtFbNj(NM^105RIR95F50jvsL-UL)IIB&8+`DKDN?bSZ_J_w0tV5TsqfONjryD zmN&E=<+DKLV+^vlq@-^0J+5$QgvsZ)UB|?*KphfUDfewbtWws^{byXXKus=Eh3<}+ zvOpDkk##7=pS~C-tX1dygYO1phdu>VmHRdrm68fJf<-KdthWQ3c5}QfG*gg4Kk2jV zg{fbb;LmH&7zy&!etsH5Dmw)Lt#eqi_JGrG7x&pjdtt2zS`!k;E2rN+5_2>ERg>$B zTfvH6-zQ(j61$z3bZ`gtr)W{DZ)YjeE(?_H-S9@eAPh-d!wQzO2-USXR^d!QE2}0y z)>Z7QCf`{C(=ucNh~F&2*l7fj(p&waCG~d;d~=Y6MUXOxcw>k#GBMC>!k#wA&;Lg7 zs>^*2k5(|J7|rUwfx0Q9q~Ds6u?freFLIFEJJ)%R+L)+kcy98BEer>Z6!w9}V7N`XPoyOBpwvl|#O)Zl!(dkgH^u?gZ-fxW zcEDqsK5Jic45gbsTbj#Os48en!{dwNH|;UV=b=K>qmDR)l&ciuG>Fgd{F&}=gdn64 zuoubS^ObZv8q}`iFJ*i-6YQj|vdoHf*lfUSQb+=2nZE14DC3;f#LV^2*^D&=P~)la z8;qCC?hrVmVV+7M&#e$mCdlX!w(_B244Uz~xghBDno2vlFzA-zh}Aw@;R3pl-HzC| zNaDtONZ+7(e)i+~0*d)DmU_Yh1ZTa;)8>Al`!Ug-m*)FY4XL$bAIVf}%Q9ev5!=$0 z>4TJ$1~Fv-$I3P!OinXmBOe(CquB>I7$c10dOg{h+2j|#vLzGe`iL3wj|ENERh?56 zQrE?z38k$PA0{Ex`Z$PN<+FG!hch75sB%t^B+Uaj8q9EAPOm+5AX}r$h69;TIV=JM;zs~nkRBbOV|i0kp|0} z$peo%FrgV&Dn*JwB=Opco+*bG^B2KsWxbO~yFQh5&6qqQwQ&J!X9Cey!AR!G?+%l0 zN?n{uTWxYJbvC;Qf+r7I#_tBmZCHF@o)6>;rFwh0gP(g_F z$&oXXEq+IX(~;?WBt|W%OwnC!o*sG#RJyM7Ve}+V-~a=gfKaw}6+X_ff%ws+8w+Z| zF8gbOkQIoTa%QTmnJ42#F5b-RaeRA&2eL_B`=R}1))|*zmT_h+@8})W%CHVi8{))L z64^5RX7Tm>33dNd5c^QK(JtS1I<3tFIvXUKnJE*>#1qJYhmXB(b)rb`9uF>=aU3%V zny71K@+U9xa63Fv&KofWy4W77*z{okWuaJ~n0TWYI)Ye<6n^-@(GynzoNINZkYx<^ zA9Mz@qYzKG{#AgAKS3mT0xFI(iON0v8jAal0zqcdZ)r#2>AQ>S;*N_^aK@$=b$A3WrBE$h&(USWmDoJe)3l!a! zBjxW6v{gkplD|<6v}G}94yX{2iLie2fQ6XN~(`J%0=?9GVfSGOx1Yfeia`|k9 zruweVQh%r1mJZn^yn#FmCd`L`k5^6?Z?yQbN%9t6%^Ivv^+ulZbyA<2Xh;G}OujBr zfI1O7B6MvC5hx+~IDwuJQ38YDPL|V=Isb4v?CRHeDXiC7Mxql0gjXyf0AV=Bfq!R5 z`Y;(NV64g2oJc+40ION2z4Lzip;_k>#$r3I7CM*7>&5RaN5lt}FSRpJQ&GJU*vx3R zDBP&F|3;yK`T~8jY{7}V@iwT1npn{{(e38bs^3&PGn25yszz(8ih6GLEtE=hEG%F9 zBG|f6=UdF3(YSG?o=%K@;pqh4uU)wFZOcz*G}HXs=Y#L#&@6OC-Mv5asAw}9* zN#T^L_fKlKfG^i*tstz?mVwlbuYrD#J;BCz`qj9RUubN4!7Y=w10~mN#IY)DdRG;g zn$R^6ON_>?KkwIoY0yZH+O^s*5Co6cS*h|on0J~I49V%r4sjQBLMrF0G3JA?Biy=5&mMs z$8P7K05y1$KzNA_V0x^c@Fjj7A>VLzb5YO@o5%)*!D;lHiu#06pAyGju-Sl}Zo%E~ z$7Mchb|u)A64IC1&6|v4z@2bqcs(C(Z)f5AX&%D$fF7ue+#+XJ5fjfZ6Bt}pTIgw2 zMF=2;|xBuyn5+`#tsOh-UwTH3)xFZMpvau}>H1w5ea?Ei#WIh?N zuJFtTCU*@Hw$k_%Jr6WqZ$PkR{c^3|l<|G9mTfP?m;l$sO6D-PRQF)0g4X_xJxkaF zZ7+4PdUuZ9$n#^Ojh*)6kM7g<9)ckST_btEruNdgb|t`#DH9Ce^)RDg<+t6BU=SY z|A89a0~*CJo_gryH1hc|0)h>e*n&M&&Bn}WqV9kdVhk2vI*#Gw*Cwag&2#CG$~4MZ z-ZgHIm+d_rJlyxs9E%>2b%a*b&t|fG4;Q?F-LM4b&2MpwBXMV$fp*zj($Npt{2TVV z*O@bNmn1{(k@y!rn5KDpRfWLBM70AwJ4@$`kJ#Os_BIe%!uaH4GAuAeq#$}MJ_d65 z1?u?WQ27c*MX(X5IzdionjNq_q~dFYBAncKm2klPtv;GOK~0Kh;#MX?wQrxV5FomY zMNjOZa5n%rO6tem;bkG~Q)k@UTQ4WP?i%43+sP$d1*q+#i22*_8Xrv7Y{4bFZ_fb~ zOcto(V>(U1Bq9orsN5r8MBVh1%&#stwutkcqI3HP>~2MSoAXS0C~~#Kc`E;OD4&#o zXdhyoaRFT+D1dce$8+N}s8`)hTbfD*bf;;v{!y$5q=Vp`$esOh0lsW2eA-EN5p8X{tbwZ_I&W@HjZDGlBa+Vd z7l0qcJ>BGRb$PkJy}1ABp2d|X$X92UgW@Qw#r6h%%r}!^mmMt~eU8oFVy`=sF(Wrb zBIX>4zy4=Ty)B0NV7HRkJtr~<9}VFqnrorJ(mGPWVv&95()g;x)BmoNn8B>fP8o(X z;m6RdEy}JH8i=n2=ojY+dWQ3!|3lbYfVI^%YoNj1Deg|8xE7~aks^iS?(XhEic6um zJ1ttExI=;B#ogWA!wt0k&VTNA{(GM%4}0&BWY%6;GxN?nvoaq37V*hdl=HmGv2Q}H zAcv0EaN_Z4@w8j`-M2>16BP`On#Q^P1inyFzRafoMn!3F#SN7FRCSZ0O&7Bf<_|Srw)|Jx(ECJ~Eein;zW%48I9aWtqp=eaeFn zoeXJ7BuOc3i21%c^e0x~#VGU18DJ<0hneh#+-vIyjSMyjhxaI?+)mGum^Is;p*RSO zI2)Z~NbCh;1Kd|h(@E_!6eQIuN*pQKG=6FDe)s~`=9kqGb|2{3KUl?DtY4F8z4+iv z$(|8X;h4scAprF~3J#)DWCBY!)!b-^-sn<&B+0mE(K!Uk`IQXx$Yw8;0jd*m zdF|%8e?)^HZfXs+HkAzYCu+#PHa<5(6i&-O7by{uKaMdWes--=<-5`|gT1QPxrR=v zR0Sr4MC`g4)c_4_)I4^T2~J;Z&6w>#)v zXR3Vj}o4IrWuS;kd}?G3b5=6cI@QoFs_=H$npt@&(a^CgdCyD@~3=|mf zT>_9D4wVIR>dGvW@UwK)>7d5jP>TfMHjCroS}*6wX>lav6iE0n3^CTN4gird)rBLC zwGAJ}&ZDZB8oFN|sUCje$*sv4j0&ZoEmBks%4e`AuxxJAW}R0t-;qx1*7)nWODv%k zJi2zQrlP2hCaafLI3Zu-%xX88&=8Kpw+&iJ<114Ne<=o!itJk>u=lV-%w=3{lJmP7 zW!nqdcUtnQlmJex)mQIw!x|L5{S}Vb|`DS*^)rO3X7jkt07SMqW1Q6E!2Se)N zegqIj|20NXp=={;=Y%AxmhhWv9?Vgt^qZ?L##o-kkXg8G(K(lSI02oHmY&UN`r4Bm zY6XJ&O#?>1CaS6qrAJ;ruG9?7Lo1UChwUFW3Zq2*zk`r4FYZlkl#Hug_rMsFLd_YB zE3L3P*T>0qUm={WA)hduFj{MVudc0D+QLkb#p#`ZTjx{|!;X7%0N$^}3%2_HT}PO& z!!Jq%aZN7hQEFsyN(5CaZl5eU%M6|Wkb_ZVXg9Tf=HwP4W@`A@EhEL-b}7U^sPQeV zgi?xlM~D>ICu-5~H5h->rWdfSPd5lKW>c3Qe#89{LE9_YE22xVCzCl&Anw3mDr#m6 zGrno3`7Unwkl5!K1=%C;vK>U?%Z9g4#ad($iiuQ9RG3#mkG9UMZ27dFB~jj- zt^!L-P}T0{*~28F`%QAH=Qi==-Ej!2#!PCZ{V>J;FF}G4f`2UPEMu?dmPAx4l_avY z2c!_`oQKy1^!!N42acOVV#ekK%5fpu)Qb}@Dcz4}& zm=a=2^z1T~x>`uLOZFAIS^}2x{XXPQ_UmKpAW+~wE+1-^v=sVWv3l#cxl(u-Z}SHj!Jlt6<0~oabAmkWi+2%zw)?%1LxN-{9aZ5gQ zLW!{bX_lh)e|>)J(T}F1b}aob*Lu2DW5fGWA4pW((OT&Ol+(52v+Kz_17t2Q7?@?` zzc+UL^w(ev|Ky!PH?!4FeHS16_X^G;FH)k4@D@Z1-glg~=$p!Dz5$WH)8tbrC?8*N zc5L7+K~C0P5+T|fik_qnFNM#Li;jmOnm>SCr?}QgNqY%drv%*hq+!^oPp8zO-`jC; zhVQ-i*6S0L*ZqbDs;-n<_32k<{d&uuh1=s|B@}J2Yi|21tGd+o*D={7DZD$?9-4m> z)7~&v33!!(_>(RQIk49eCNpW(e4o5Ka=lC^RGqa>=Ft{{P3p(9hX{kV!(S|6WuNTS}Q zUP9)Wd=YZVbRiL)9Tp>4>^*}Z^xQC(l@OZAoxAq;OxkIm486N&)YowtFvCRBW_5OJ z1=gxL{Av|anNlV-W-EZ$&NuW`w?%lOJGHKy`Gsy1USyqPk zFhTqx*JscxXya0Zkq}b|?trg@d+ZPV?G|Tt1(}NQYKX&BztOs1{;}+DuwFIpESdpR zd&EshW2N+Z&b4D}4&x@{rF$F+E$Z?p`g+ zCpW;JtxkTy*8a6KnCM|#e!(X@28)|{1@SXwsSy0{Z<}izg5kn3t7j7a>tbXBH0XKP zO@Cl!!b`y;&DiUxmg^?@*lUjNEd*`soqI#7lNs#Hs{$-fTY0hzavTF9OZ+U)MxmkCh;msZ{QVO(fx zQs$q918S<7s{aO(@+G%T`x5fT7w)?94&xs(X`Sq`$EH^J%689Mh(*R+%^^d&Z!~9# z-0wTUHRXG+B=ec~%v0yY*;L7r8DfxEoua^?(He_ULAOF!A zdf|TLJ(H?9tNn`^_wP&pV#e3L3}DRY0Ggb7Z&9;li=a((Hg7o4JCoLWaRA@ZVj2Qm z2MY$XKqT;f???g7{(x;~h!HHnHUc2fgnv!q4MbKE#7;Ot%=1DQ^7|^wi0V>~=9huD zPlD>V8LJ0p7x~9oO+#q?HQ~+xRhQPn4M15rb5XH?pUn0uV4Ii}ph4VraZt3|VhiuL z4x#lVRS?^eZ`$O;JjP! z${xTG4bA6giT(DSScerwJL)pQZ}?zR3|05-PT&=so%cgM)B%K+C@!4vBOb)aCZNpL zHMoPeEVu`CdD3G9LQDBCxsw7_*TOTs93Fro=v4v1ncy6G5&gxZyYYm+X_*VVL6 z4=%odAR>9OXV>8#d;#g&ZKs+K#)~%k&0X3mbziONzX|%u>|jWedh;DN>5c(ElC~W@ z`;K}mI{+?s6}>T7VsQcL@-1-Y5XqzwjeSnhPh{yRo=25`eKL)DRZ0H)-Npz1`f zLYPkSZ6uj4wgOqfQd++7Uhi7kpSx7!knvh~{CpdW!N%jEIp-g>C>^^nsyV*=FLJ2Y z)o^idnZ6=J1K!-lBZ>I)aN*B`6-nE-D!bdIXlK_z66YCOch6&9j@JIUGZ@=p+$I6i z&4U~5#SCUQ&z9wbXNa>5el5%7y&(AC5uBu32lzpL$CrPd1ibAq9kfIsn2eRb-Y&Im zU+0U;t!>GOEEMnnFB?mvls;E0Nn0pB8eL)5oAuGTILEwzR*|<1Xo8zdZMsRM?I?OC zx}>*xrkdODQK`;hfU~&p7P^4mA>(X#{JO(<{)9bKj@P2SV0W! zvWJnw7}5hJdOWnbkcXO&%!`;4dbB1S`#Au+K zgz;cnI+e8RyoI;nX9Mu@LFx)?r&-!TCsvC*jf7^2j-Up#cMuGXU5Pe>g3vI~BFu6J z*}jhi9^|r9<-6yLr|}pbhiVz?+h<*=`}!}p!|?14Q=qSll_`?(V!&4+K=a00V#8BH z7RM*&zgvgJv1(i6i6vCPJ+XMVj@iI-PP``G#6{}>#V4UBtZ-? zuCN0Ix(OD%gGVPFx&-tS;!IzJFX8c%^!1?3;_*uvBMf9h_3Y_|sOD|Pm{tTpy+_Q# z$4KFl{G|t(1V>k9zfZO-Op@i0g|2W6{$#LVlB{0}@N{l|{>u=+XQT^X3N{|sf@m!0 zX|;eY2n{hHM)qIhfrl~s7wKYT8((>9gp5E8LWzZrfTaR^dZDT*MB!Zc+uGvcq%gD1 zWjFvSr+@%|{WP@!aAUY1t>`fr*KKR2#M2y%eIIO|6bWt4}TpI{E zhOsOHpjTVxKo-UTms95ez*YS~fCzwrV?`$tdk$-{vZ1mX>_*BfiQpxa{if8uhd@(` z68>??EELs$jWdO4|KU|NdN!0mw~|aCjgviKd`cBGhLH`$*I_1%o!cEUQbQsZC?QVx zoIJ`eA{T`NViUkCnE~QNpNxoFCfh#kUXEtTsn3ft#K}GnuC)$w4#ja5{T=BFnMtJi z7oFOl6Uv~&js7uKG@|c4pkX*Ga&zm;m9*kla)@wW)P=0%VB)IOnaPCFQ8?jsikXp8i+-dG zgCDe>1y2HBiUo^lRyMZDVmo*@BgR0mrYmhGIdMdV{o%gZD@3w_Q}<#d#mxNPsM`nv zqJNXjHUoF~{5$y;*q5Ah-Y=_jVS~rz8hI{~mGg^+$-5pMC({;R5RrF3dfx25s0aws zhSZ~j_sb>&1hYV}>|+AnhyajbAke{Z2IbWi{;k6>!9vi6?)27U5bz3T^rwqE58S>+KAGY?MACp4d%32&WZxM>JSB zTs7>ch49hEsVye!bf=s+r@FM97?E6qtfz@&i5fg^Xy2PJI171rY;l8UWa=i#K%zGlV49# z-vfj(42f5WTHx`$evt>u!!x?vz^;MkYnmewt#yJA`!7#iYRp&Oif+R#^}OG5o>dtI|gvqa{xbRQo{eSb4{g zfRXOXL%dKgu8%yTd?dP36-Pyu6Lj9E8a3#fhoMM>e16<9jkqrLp4rQXLBK}bj``+_ z{skl$S7z*afoHv5`icX|UsEv*eo`KM_nzRenVs)%*!;Sc{ZH7eboC|Z!+djYtLm$~ zI?oi(3GjDt78ToQ>Rhg2*0X?w@FRVt*&-f)U#AA$WbXoPHyCQhLqD+;7xB9e-Lwb! zz$8+mRkK3Hg=qWav#)3qupk$Hi*(1)tf25qG_AlC8&WB{o9++19yeq~^v587y5Xy$ zAe^qIwK~aH<8gb{S49{NJPkXc?mZsSV8Pu;Zv-$gxDge1yCOyP;aBl1Oi&Q`18lLC zE?=YtK@N#Rn2wAPa1)$LWGftlMBDG4{ibJbj75!I&pW(Je;M@14s^J(ib#S@ZbbTj zr&nlQa$~?KcOz0XJENqiSutd!JC`IG`HLjSf)lc4|?<`UG~Sxl>Jx zX#6$dE-{mTeFkyf=Y=D4UMa%e;>y{8YH(QLKFV4qZjJgY*hOrKg-cB2ln5Ve!`r5@ z0c-vMJXZ)78~`2?0Gw}%Xna0_0f;_1se7Viwo0DqH9^1+gNhy=K#C+Vos#`8NwL)% z@jIzlHO|X6^N^9?Xq4TOQgKOy59TBFyu1Kr&QXljxoID}1dgY9ziFVomJAN#vKysg zB9KvZjAF#z2z#Sg#uM28BKIkk2nzjbSN)ri?E9j3TxMF83*Adk_-wveoTvUV-;}QZ zm~TNzi5(1DHwwO4Pvtm|kC~KvYG%$S8YT`=$j?xdm#w&9C{`R;K!T9s0X;VU8*1`? zQy5Q;l4x)=Dq4Z$)*1=Mx2fwwNvvK$?UW7Uo2PkTlGa6G1$_KM;y#AkwV@BApktf!~; z&zbqY>xi)&fQuh8KnsgbM{zGuw4>RSu3pL=jKUl2UEuWpihhNruAUgaA*FCZAu&O1kPd@dSRW zaFtrZ!mv}N*SKdRhPDgZ!W^~JXt#q?n(@`DN2S%bQNo$g3ksl(q*uAp>?x9SO|ak~ zeFXgK!9{j7)dBg)6!n2Puo@TPmkxB?We$@$GiF}1RLteG@nln5CjJDkS0L{FU56^k z9Ajvb9TB3q$_iWbU0~aQsPIch!l1SgbTAKURIz<2MuFtBxDVfsF*O-}PSgla>2JWE zo>2%0*_y-3P(T*%@l$aktER&m7W&Qi_mK*$3`@YWHkk;S-W z!QN-PrD)#{ht6dN;(IGji;Fy8JhKKX{CMENuIp;YCzh;DoM&N}0y6^6@NZz}#v<{% z&Otp4juIThb_9f;-wV7#3m)lKR2Y7^8#~dX;N#LW`Uy(~mP$O`SJe7uiXK$ zU~{t4F2;d@zR`}}zylzm#25*K!pakLto#X1FG#(DC5gRRdu6m`t%jNv58;C$h{szqzZONxsl?}X6%U?mPMojdhu#4Hf;Fab8>-)InzcilO!SbNQ@U8P_VM zI74ke9+W&Q=~!{s@-O4@@4L#OGOtzsO~pX{q*Bd|U86AmWNgdEcg6SVzIToHif|9# z&YAx>FbxdaT38irZLjNfO??hsFV$m^7N(;baj~i!H~H)@gWQz7>YF`o@K2@|w^%Y1 zafICY>mM1$+uY6lepLC3U&VU|nF9N8k!W<0*>B>5Wv{xQubv5Tnmb~wbXSHoe#nS<56q~FM`L5DNrFg~+s=VLsiNz>;y9+i4ux_NY& z4`Vj6%!!)(zjC~h1Mp%1*ga-{?VIDTlqi`nBGpD{4U5p&;Se>~r>~{8?Ywn$=7� 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
YqaGhS&aQ?iN@@dSGOwQ1S<%& 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

@e4~p4aq|E=3$Wx1+`@cAF|zc0e|?fI@O8 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

    d_XdT+5>+Nnqxdz2 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