From 837df6bc9e05f5a5b4af27a36356efdd4cff2ecd Mon Sep 17 00:00:00 2001 From: Gahow Wang Date: Sat, 30 May 2026 11:23:04 +0800 Subject: [PATCH] v2 exp(a): three-tier KV-hit latency microbench (GPU >> CPU >> miss) Measures TTFT to serve a reused prefix of length L from each KV tier on a single H20 (Qwen3-Coder-30B-A3B, vLLM 0.18.1): miss (recompute), CPU-tier hit (native DRAM offload), GPU-tier hit (HBM prefix cache). Each measured request is bracketed by /metrics scrapes so the tier is verified (vllm:prefix_cache_hits vs external_prefix_cache_hits), not assumed. Result: GPU hit is ~flat (42->111 ms over 1k->64k tokens); CPU hit is transfer-bound (PCIe H2D ~54 GB/s, 57->272 ms); miss grows superlinearly (78 ms -> 15.2 s). GPU beats CPU 1.4-2.5x (gap grows with context); miss/CPU up to 56x, miss/GPU up to 137x. pcie_transfer.py is the independent CPU-hit floor backstop. Evidence for the GPU-hit-first principle (paper section 2.2). Co-Authored-By: Claude Opus 4.8 --- v2/.gitignore | 3 + v2/common/util.py | 106 +++++ v2/exp_a_tier_latency/driver.py | 140 +++++++ v2/exp_a_tier_latency/pcie_transfer.py | 59 +++ v2/exp_a_tier_latency/plot.py | 68 +++ v2/exp_a_tier_latency/results/cpu.json | 309 ++++++++++++++ v2/exp_a_tier_latency/results/gpu.json | 533 ++++++++++++++++++++++++ v2/exp_a_tier_latency/results/miss.json | 533 ++++++++++++++++++++++++ v2/exp_a_tier_latency/results/pcie.json | 40 ++ v2/exp_a_tier_latency/run.sh | 50 +++ v2/exp_a_tier_latency/run_cpu.sh | 39 ++ v2/figs/exp_a_tier_latency.png | Bin 0 -> 82750 bytes 12 files changed, 1880 insertions(+) create mode 100644 v2/.gitignore create mode 100644 v2/common/util.py create mode 100644 v2/exp_a_tier_latency/driver.py create mode 100644 v2/exp_a_tier_latency/pcie_transfer.py create mode 100644 v2/exp_a_tier_latency/plot.py create mode 100644 v2/exp_a_tier_latency/results/cpu.json create mode 100644 v2/exp_a_tier_latency/results/gpu.json create mode 100644 v2/exp_a_tier_latency/results/miss.json create mode 100644 v2/exp_a_tier_latency/results/pcie.json create mode 100644 v2/exp_a_tier_latency/run.sh create mode 100644 v2/exp_a_tier_latency/run_cpu.sh create mode 100644 v2/figs/exp_a_tier_latency.png diff --git a/v2/.gitignore b/v2/.gitignore new file mode 100644 index 0000000..351cd46 --- /dev/null +++ b/v2/.gitignore @@ -0,0 +1,3 @@ +# raw per-request replay dumps (~0.6 MB each) — regenerable; keep summary/m0/m1 +*/results/metrics_blk*.jsonl +*/results/vllm_*.log diff --git a/v2/common/util.py b/v2/common/util.py new file mode 100644 index 0000000..5483fd0 --- /dev/null +++ b/v2/common/util.py @@ -0,0 +1,106 @@ +"""Shared helpers for v2 GPU-hit-first experiments.""" +from __future__ import annotations + +import random +import time +import requests + +# Qwen3-Coder geometry (from config.json): 48 layers, 4 KV heads, head_dim 128, bf16 +KV_BYTES_PER_TOKEN = 98304 # 96 KiB +VOCAB = 151936 +# Safe token-id range: avoid low special-ish ids and the high special tokens (>=151643) +TOK_LO, TOK_HI = 1000, 151000 + + +def make_token_prompt(length: int, seed: int) -> list[int]: + """Deterministic, content-addressed token-id prompt of exact `length`. + + Same (length, seed) -> same ids -> prefix-cache hit. + Different seed -> fresh ids -> miss. + """ + rng = random.Random(seed) + return [rng.randint(TOK_LO, TOK_HI) for _ in range(length)] + + +def scrape_prefix_cache(endpoint: str) -> dict: + """Return cumulative prefix-cache counters from vLLM /metrics. + + Keys: gpu_hits, gpu_queries, ext_hits, ext_queries (floats, cumulative). + """ + out = {"gpu_hits": 0.0, "gpu_queries": 0.0, "ext_hits": 0.0, "ext_queries": 0.0} + try: + txt = requests.get(f"{endpoint}/metrics", timeout=10).text + except Exception: + return out + for line in txt.splitlines(): + if line.startswith("#") or not line: + continue + try: + name, val = line.rsplit(" ", 1) + v = float(val) + except ValueError: + continue + # strip prometheus labels and match only the cumulative _total counters + # (exclude _created epoch-timestamp series, which would dominate the sum) + metric = name.split("{", 1)[0] + if metric == "vllm:external_prefix_cache_hits_total": + out["ext_hits"] += v + elif metric == "vllm:external_prefix_cache_queries_total": + out["ext_queries"] += v + elif metric == "vllm:prefix_cache_hits_total": + out["gpu_hits"] += v + elif metric == "vllm:prefix_cache_queries_total": + out["gpu_queries"] += v + return out + + +def measure_ttft(endpoint: str, model: str, prompt_ids: list[int], + max_tokens: int = 1, timeout: float = 600.0) -> dict: + """Send one streaming /v1/completions request; return TTFT and e2e seconds. + + TTFT = time from send to first streamed token chunk (== prefill wall time). + """ + url = f"{endpoint}/v1/completions" + payload = { + "model": model, + "prompt": prompt_ids, + "max_tokens": max_tokens, + "temperature": 0.0, + "stream": True, + "stream_options": {"include_usage": True}, + } + t0 = time.perf_counter() + ttft = None + usage = None + with requests.post(url, json=payload, stream=True, timeout=timeout) as r: + r.raise_for_status() + for raw in r.iter_lines(): + if not raw: + continue + line = raw.decode("utf-8") if isinstance(raw, bytes) else raw + if not line.startswith("data: "): + continue + data = line[6:] + if data.strip() == "[DONE]": + break + import json as _json + obj = _json.loads(data) + if obj.get("usage"): + usage = obj["usage"] + choices = obj.get("choices") or [] + if ttft is None and choices and choices[0].get("text"): + ttft = time.perf_counter() - t0 + e2e = time.perf_counter() - t0 + return {"ttft_s": ttft if ttft is not None else e2e, "e2e_s": e2e, "usage": usage} + + +def wait_healthy(endpoint: str, timeout: float = 900.0) -> bool: + deadline = time.time() + timeout + while time.time() < deadline: + try: + if requests.get(f"{endpoint}/health", timeout=5).status_code == 200: + return True + except Exception: + pass + time.sleep(3) + return False diff --git a/v2/exp_a_tier_latency/driver.py b/v2/exp_a_tier_latency/driver.py new file mode 100644 index 0000000..c9ad160 --- /dev/null +++ b/v2/exp_a_tier_latency/driver.py @@ -0,0 +1,140 @@ +"""Exp (a): three-tier hit-latency microbench. + +Measures TTFT of serving a prefix of length L from each tier: + - miss : fresh unique prompt -> full prefill (recompute) + - gpu : re-request same prompt -> HBM prefix-cache hit + - cpu : warm -> evict to CPU offload tier -> re-request -> DRAM hit + +Each measured request is bracketed by /metrics scrapes so the tier is *verified* +(gpu_hits delta vs external_prefix_cache_hits delta), not assumed. +""" +from __future__ import annotations + +import argparse +import json +import statistics +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +from common.util import make_token_prompt, scrape_prefix_cache, measure_ttft # noqa: E402 + +LENGTHS = [1024, 2048, 4096, 8192, 16384, 32768, 65536] + + +def delta(a: dict, b: dict) -> dict: + return {k: b[k] - a[k] for k in a} + + +def one_measurement(ep, model, prompt, expect): + m0 = scrape_prefix_cache(ep) + res = measure_ttft(ep, model, prompt) + m1 = scrape_prefix_cache(ep) + d = delta(m0, m1) + cached = (res.get("usage") or {}).get("prompt_tokens", None) + # classify + if d["ext_hits"] > 0.5: + tier = "cpu" + elif d["gpu_hits"] > 0.5: + tier = "gpu" + else: + tier = "miss" + return {"ttft_s": res["ttft_s"], "e2e_s": res["e2e_s"], + "tier_observed": tier, "expect": expect, + "d_gpu_hits": d["gpu_hits"], "d_ext_hits": d["ext_hits"]} + + +def run_miss(ep, model, L, reps, base): + rows = [] + for i in range(reps): + p = make_token_prompt(L, seed=base + i) # fresh each time + rows.append(one_measurement(ep, model, p, "miss")) + return rows + + +def run_gpu(ep, model, L, reps, base): + rows = [] + for i in range(reps): + p = make_token_prompt(L, seed=base + i) + measure_ttft(ep, model, p) # warm + rows.append(one_measurement(ep, model, p, "gpu")) # hit + return rows + + +def run_cpu(ep, model, L, reps, base, flood_tokens, flood_chunk): + rows = [] + for i in range(reps): + p = make_token_prompt(L, seed=base + i) + measure_ttft(ep, model, p) # warm -> GPU (+offload) + # flood with distinct content to evict p from the GPU pool to CPU tier + sent = 0 + fseed = 10_000_000 + (base + i) * 1000 + while sent < flood_tokens: + fp = make_token_prompt(flood_chunk, seed=fseed) + measure_ttft(ep, model, fp) + fseed += 1 + sent += flood_chunk + rows.append(one_measurement(ep, model, p, "cpu")) # should hit CPU tier + return rows + + +def summarize(rows): + t = sorted(r["ttft_s"] for r in rows) + return { + "n": len(rows), + "ttft_p50": statistics.median(t) if t else None, + "ttft_mean": statistics.fmean(t) if t else None, + "ttft_min": t[0] if t else None, + "ttft_max": t[-1] if t else None, + "tier_observed": _modal([r["tier_observed"] for r in rows]), + "verified_frac": sum(r["tier_observed"] == r["expect"] for r in rows) / len(rows) if rows else 0, + } + + +def _modal(xs): + from collections import Counter + return Counter(xs).most_common(1)[0][0] if xs else None + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--endpoint", required=True) + ap.add_argument("--model", required=True) + ap.add_argument("--mode", required=True, choices=["miss", "gpu", "cpu"]) + ap.add_argument("--reps", type=int, default=8) + ap.add_argument("--out", required=True) + ap.add_argument("--lengths", type=str, default=None, + help="comma list override, e.g. 1024,4096") + ap.add_argument("--flood-tokens", type=int, default=120000, + help="cpu mode: distinct tokens to flush GPU pool") + ap.add_argument("--flood-chunk", type=int, default=8192) + args = ap.parse_args() + + lengths = ([int(x) for x in args.lengths.split(",")] if args.lengths else LENGTHS) + out = {"mode": args.mode, "reps": args.reps, "by_length": {}, "raw": {}} + base = {"miss": 1_000, "gpu": 2_000, "cpu": 3_000}[args.mode] + + for L in lengths: + t0 = time.time() + if args.mode == "miss": + rows = run_miss(args.endpoint, args.model, L, args.reps, base) + elif args.mode == "gpu": + rows = run_gpu(args.endpoint, args.model, L, args.reps, base) + else: + rows = run_cpu(args.endpoint, args.model, L, args.reps, base, + args.flood_tokens, args.flood_chunk) + base += 100_000 + s = summarize(rows) + out["by_length"][str(L)] = s + out["raw"][str(L)] = rows + print(f"[{args.mode}] L={L:>6} ttft_p50={s['ttft_p50']:.4f}s " + f"tier={s['tier_observed']} verified={s['verified_frac']:.0%} " + f"({time.time()-t0:.0f}s)", flush=True) + Path(args.out).write_text(json.dumps(out, indent=2)) + + print(f"wrote {args.out}") + + +if __name__ == "__main__": + main() diff --git a/v2/exp_a_tier_latency/pcie_transfer.py b/v2/exp_a_tier_latency/pcie_transfer.py new file mode 100644 index 0000000..2aafa36 --- /dev/null +++ b/v2/exp_a_tier_latency/pcie_transfer.py @@ -0,0 +1,59 @@ +"""Exp (a) backstop: direct CPU(DRAM)->GPU(HBM) KV-transfer cost. + +Independent lower bound on a CPU-tier hit: fetching L tokens' KV over the +host<->device link. CPU_hit(L) >= GPU_hit(L) + KV_bytes(L) / BW_h2d. +Uses pinned host memory (best case for the offload tier, which pins buffers). +""" +from __future__ import annotations + +import argparse +import json +import time + +import torch + +KV_BYTES_PER_TOKEN = 98304 # Qwen3-Coder, bf16 +LENGTHS = [1024, 2048, 4096, 8192, 16384, 32768, 65536] + + +def time_h2d(nbytes: int, reps: int) -> float: + n = nbytes // 2 # bf16 elements + host = torch.empty(n, dtype=torch.float16, pin_memory=True) + dev = torch.empty(n, dtype=torch.float16, device="cuda") + # warmup + for _ in range(3): + dev.copy_(host, non_blocking=True) + torch.cuda.synchronize() + ts = [] + for _ in range(reps): + t0 = time.perf_counter() + dev.copy_(host, non_blocking=True) + torch.cuda.synchronize() + ts.append(time.perf_counter() - t0) + ts.sort() + return ts[len(ts) // 2] + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--reps", type=int, default=20) + ap.add_argument("--out", required=True) + args = ap.parse_args() + assert torch.cuda.is_available(), "need a GPU" + print("device:", torch.cuda.get_device_name(0)) + + out = {"device": torch.cuda.get_device_name(0), "by_length": {}} + for L in LENGTHS: + nbytes = L * KV_BYTES_PER_TOKEN + sec = time_h2d(nbytes, args.reps) + bw = nbytes / sec / 1e9 + out["by_length"][str(L)] = { + "kv_bytes": nbytes, "transfer_s": sec, "bw_GBps": bw, + } + print(f"L={L:>6} KV={nbytes/1e9:6.3f}GB t={sec*1000:7.2f}ms bw={bw:6.1f} GB/s", flush=True) + json.dump(out, open(args.out, "w"), indent=2) + print("wrote", args.out) + + +if __name__ == "__main__": + main() diff --git a/v2/exp_a_tier_latency/plot.py b/v2/exp_a_tier_latency/plot.py new file mode 100644 index 0000000..8d889dc --- /dev/null +++ b/v2/exp_a_tier_latency/plot.py @@ -0,0 +1,68 @@ +"""Plot exp (a): TTFT vs prefix length for miss / gpu-hit / cpu-hit (+ PCIe floor).""" +import json +import sys +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +R = Path(sys.argv[1] if len(sys.argv) > 1 else "v2/exp_a_tier_latency/results") +FIG = Path(sys.argv[2] if len(sys.argv) > 2 else "v2/figs/exp_a_tier_latency.png") +KV_BYTES_PER_TOKEN = 98304 + + +def load(name): + p = R / name + return json.load(open(p)) if p.exists() else None + + +miss, gpu, cpu, pcie = load("miss.json"), load("gpu.json"), load("cpu.json"), load("pcie.json") + + +def series(d): + if not d: + return [], [] + items = sorted(((int(k), v["ttft_p50"]) for k, v in d["by_length"].items()), key=lambda x: x[0]) + return [a for a, _ in items], [b for _, b in items] + + +fig, ax = plt.subplots(figsize=(7.2, 5.0)) +for d, lab, mk, c in [(miss, "miss (recompute)", "o", "#d62728"), + (cpu, "CPU-tier hit (DRAM offload)", "s", "#ff7f0e"), + (gpu, "GPU-tier hit (HBM APC)", "^", "#2ca02c")]: + xs, ys = series(d) + if xs: + ax.plot(xs, ys, marker=mk, label=lab, color=c, linewidth=2, markersize=7) + +if pcie: + items = sorted(((int(k), v["transfer_s"]) for k, v in pcie["by_length"].items())) + xs = [a for a, _ in items]; ys = [b for _, b in items] + ax.plot(xs, ys, "--", color="#7f7f7f", linewidth=1.4, + label="CPU-hit transfer floor (PCIe H2D)") + +ax.set_xscale("log", base=2); ax.set_yscale("log") +ax.set_xlabel("Reused prefix length (tokens)") +ax.set_ylabel("TTFT (s, log)") +ax.set_title("Cost of serving a reused prefix from each KV tier\nQwen3-Coder-30B-A3B, 1xH20") +ax.grid(True, which="both", alpha=0.3) +ax.legend() +FIG.parent.mkdir(parents=True, exist_ok=True) +fig.tight_layout(); fig.savefig(FIG, dpi=140) +print("wrote", FIG) + +# Table +print(f"\n{'L':>7} {'miss(s)':>10} {'cpu(s)':>10} {'gpu(s)':>10} {'miss/cpu':>9} {'cpu/gpu':>9}") +allL = sorted({int(k) for d in (miss, gpu, cpu) if d for k in d["by_length"]}) +for L in allL: + m = miss["by_length"].get(str(L), {}).get("ttft_p50") if miss else None + c = cpu["by_length"].get(str(L), {}).get("ttft_p50") if cpu else None + g = gpu["by_length"].get(str(L), {}).get("ttft_p50") if gpu else None + f = lambda x: f"{x:.4f}" if x is not None else " - " + r1 = f"{m/c:.1f}x" if (m and c) else " -" + r2 = f"{c/g:.1f}x" if (c and g) else " -" + print(f"{L:>7} {f(m):>10} {f(c):>10} {f(g):>10} {r1:>9} {r2:>9}") + +if cpu: + vf = {k: v.get("verified_frac") for k, v in cpu["by_length"].items()} + print("\nCPU-tier verified fraction (ext_hits>0):", vf) diff --git a/v2/exp_a_tier_latency/results/cpu.json b/v2/exp_a_tier_latency/results/cpu.json new file mode 100644 index 0000000..b5835a7 --- /dev/null +++ b/v2/exp_a_tier_latency/results/cpu.json @@ -0,0 +1,309 @@ +{ + "mode": "cpu", + "reps": 4, + "by_length": { + "1024": { + "n": 4, + "ttft_p50": 0.057389369496377185, + "ttft_mean": 0.08805505199416075, + "ttft_min": 0.055113587994128466, + "ttft_max": 0.18232788098976016, + "tier_observed": "cpu", + "verified_frac": 1.0 + }, + "2048": { + "n": 4, + "ttft_p50": 0.05680296401260421, + "ttft_mean": 0.05688378225750057, + "ttft_min": 0.05582832600339316, + "ttft_max": 0.05810087500140071, + "tier_observed": "cpu", + "verified_frac": 1.0 + }, + "4096": { + "n": 4, + "ttft_p50": 0.06417885900009423, + "ttft_mean": 0.06439992749801604, + "ttft_min": 0.063741421996383, + "ttft_max": 0.0655005699954927, + "tier_observed": "cpu", + "verified_frac": 1.0 + }, + "8192": { + "n": 4, + "ttft_p50": 0.07612077200610656, + "ttft_mean": 0.07600563450250775, + "ttft_min": 0.07499952000216581, + "ttft_max": 0.07678147399565205, + "tier_observed": "cpu", + "verified_frac": 1.0 + }, + "16384": { + "n": 4, + "ttft_p50": 0.10476256850233767, + "ttft_mean": 0.10426848525821697, + "ttft_min": 0.10178845902555622, + "ttft_max": 0.10576034500263631, + "tier_observed": "cpu", + "verified_frac": 1.0 + }, + "32768": { + "n": 4, + "ttft_p50": 0.15755228500347584, + "ttft_mean": 0.15822456649766536, + "ttft_min": 0.15535229499801062, + "ttft_max": 0.16244140098569915, + "tier_observed": "cpu", + "verified_frac": 1.0 + }, + "65536": { + "n": 4, + "ttft_p50": 0.27175235451431945, + "ttft_mean": 0.2716009145078715, + "ttft_min": 0.26732781299506314, + "ttft_max": 0.27557113600778393, + "tier_observed": "cpu", + "verified_frac": 1.0 + } + }, + "raw": { + "1024": [ + { + "ttft_s": 0.18232788098976016, + "e2e_s": 0.182449893996818, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 1024.0 + }, + { + "ttft_s": 0.05692533400724642, + "e2e_s": 0.057079910999163985, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 1024.0 + }, + { + "ttft_s": 0.05785340498550795, + "e2e_s": 0.05796545499470085, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 1024.0 + }, + { + "ttft_s": 0.055113587994128466, + "e2e_s": 0.055113587994128466, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 1024.0 + } + ], + "2048": [ + { + "ttft_s": 0.05582832600339316, + "e2e_s": 0.055943820014363155, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 2048.0 + }, + { + "ttft_s": 0.057600113010266796, + "e2e_s": 0.05772249499568716, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 2048.0 + }, + { + "ttft_s": 0.05600581501494162, + "e2e_s": 0.05611848901025951, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 2048.0 + }, + { + "ttft_s": 0.05810087500140071, + "e2e_s": 0.0582130889815744, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 2048.0 + } + ], + "4096": [ + { + "ttft_s": 0.0655005699954927, + "e2e_s": 0.06560429997625761, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 4096.0 + }, + { + "ttft_s": 0.063741421996383, + "e2e_s": 0.06384500698186457, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 4096.0 + }, + { + "ttft_s": 0.06445824800175615, + "e2e_s": 0.06458494698745199, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 4096.0 + }, + { + "ttft_s": 0.06389946999843232, + "e2e_s": 0.06403137900633737, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 4096.0 + } + ], + "8192": [ + { + "ttft_s": 0.0759067680046428, + "e2e_s": 0.0759067680046428, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 8192.0 + }, + { + "ttft_s": 0.07678147399565205, + "e2e_s": 0.07678147399565205, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 8192.0 + }, + { + "ttft_s": 0.07633477600757033, + "e2e_s": 0.0764636590029113, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 8192.0 + }, + { + "ttft_s": 0.07499952000216581, + "e2e_s": 0.07499952000216581, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 8192.0 + } + ], + "16384": [ + { + "ttft_s": 0.10444335200008936, + "e2e_s": 0.104556644015247, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 16384.0 + }, + { + "ttft_s": 0.10178845902555622, + "e2e_s": 0.10188649001065642, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 16384.0 + }, + { + "ttft_s": 0.10508178500458598, + "e2e_s": 0.10518974298611283, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 16384.0 + }, + { + "ttft_s": 0.10576034500263631, + "e2e_s": 0.10587632199167274, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 16384.0 + } + ], + "32768": [ + { + "ttft_s": 0.15535229499801062, + "e2e_s": 0.155460513982689, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 32768.0 + }, + { + "ttft_s": 0.15777600501314737, + "e2e_s": 0.15777600501314737, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 32768.0 + }, + { + "ttft_s": 0.16244140098569915, + "e2e_s": 0.16244140098569915, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 32768.0 + }, + { + "ttft_s": 0.15732856499380432, + "e2e_s": 0.1574467390018981, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 32768.0 + } + ], + "65536": [ + { + "ttft_s": 0.27309533301740885, + "e2e_s": 0.273235183005454, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 65536.0 + }, + { + "ttft_s": 0.27040937601123005, + "e2e_s": 0.27040937601123005, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 65536.0 + }, + { + "ttft_s": 0.27557113600778393, + "e2e_s": 0.27557113600778393, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 65536.0 + }, + { + "ttft_s": 0.26732781299506314, + "e2e_s": 0.2674778919899836, + "tier_observed": "cpu", + "expect": "cpu", + "d_gpu_hits": 0.0, + "d_ext_hits": 65536.0 + } + ] + } +} \ No newline at end of file diff --git a/v2/exp_a_tier_latency/results/gpu.json b/v2/exp_a_tier_latency/results/gpu.json new file mode 100644 index 0000000..1f4f2f6 --- /dev/null +++ b/v2/exp_a_tier_latency/results/gpu.json @@ -0,0 +1,533 @@ +{ + "mode": "gpu", + "reps": 8, + "by_length": { + "1024": { + "n": 8, + "ttft_p50": 0.04180275100225117, + "ttft_mean": 0.05689269150025211, + "ttft_min": 0.041313502995762974, + "ttft_max": 0.1606091230059974, + "tier_observed": "gpu", + "verified_frac": 1.0 + }, + "2048": { + "n": 8, + "ttft_p50": 0.044922845510882325, + "ttft_mean": 0.04646045462868642, + "ttft_min": 0.04261300901998766, + "ttft_max": 0.06082483098725788, + "tier_observed": "gpu", + "verified_frac": 1.0 + }, + "4096": { + "n": 8, + "ttft_p50": 0.0462174300046172, + "ttft_mean": 0.04691218675361597, + "ttft_min": 0.044408742018276826, + "ttft_max": 0.05101387499598786, + "tier_observed": "gpu", + "verified_frac": 1.0 + }, + "8192": { + "n": 8, + "ttft_p50": 0.052487702007056214, + "ttft_mean": 0.05252782000388834, + "ttft_min": 0.050384567002765834, + "ttft_max": 0.055209266021847725, + "tier_observed": "gpu", + "verified_frac": 1.0 + }, + "16384": { + "n": 8, + "ttft_p50": 0.06340778700541705, + "ttft_mean": 0.06307360512437299, + "ttft_min": 0.059953891002805904, + "ttft_max": 0.06587072199909016, + "tier_observed": "gpu", + "verified_frac": 1.0 + }, + "32768": { + "n": 8, + "ttft_p50": 0.07986902150150854, + "ttft_mean": 0.08412684850554797, + "ttft_min": 0.07615292401169427, + "ttft_max": 0.11761908099288121, + "tier_observed": "gpu", + "verified_frac": 1.0 + }, + "65536": { + "n": 8, + "ttft_p50": 0.11140661900572013, + "ttft_mean": 0.10751268000240088, + "ttft_min": 0.07390080401091836, + "ttft_max": 0.1206158839922864, + "tier_observed": "gpu", + "verified_frac": 1.0 + } + }, + "raw": { + "1024": [ + { + "ttft_s": 0.1606091230059974, + "e2e_s": 0.16078226300305687, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 1008.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.043477901024743915, + "e2e_s": 0.0436010490229819, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 1008.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04137404798530042, + "e2e_s": 0.04146770399529487, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 1008.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04179324599681422, + "e2e_s": 0.041887808009050786, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 1008.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04326947100344114, + "e2e_s": 0.04335355598595925, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 1008.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04149198398226872, + "e2e_s": 0.04157822398701683, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 1008.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04181225600768812, + "e2e_s": 0.04190706100780517, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 1008.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.041313502995762974, + "e2e_s": 0.041313502995762974, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 1008.0, + "d_ext_hits": 0.0 + } + ], + "2048": [ + { + "ttft_s": 0.04491939002764411, + "e2e_s": 0.045019031007541344, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 2032.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.045014784001978114, + "e2e_s": 0.04511277299025096, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 2032.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04492630099412054, + "e2e_s": 0.04502850098651834, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 2032.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04566141500254162, + "e2e_s": 0.04576313399593346, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 2032.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04261300901998766, + "e2e_s": 0.04271370900096372, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 2032.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.06082483098725788, + "e2e_s": 0.06096197199076414, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 2032.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04355804901570082, + "e2e_s": 0.04355804901570082, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 2032.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.044165857980260625, + "e2e_s": 0.044268568977713585, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 2032.0, + "d_ext_hits": 0.0 + } + ], + "4096": [ + { + "ttft_s": 0.05101387499598786, + "e2e_s": 0.051123478973750025, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 4080.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.044408742018276826, + "e2e_s": 0.044408742018276826, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 4080.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04538871700060554, + "e2e_s": 0.045498208986828104, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 4080.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04754545699688606, + "e2e_s": 0.047664124984294176, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 4080.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04840670898556709, + "e2e_s": 0.04840670898556709, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 4080.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.0462190090038348, + "e2e_s": 0.04632823000429198, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 4080.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.04609913402236998, + "e2e_s": 0.046204126003431156, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 4080.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.0462158510053996, + "e2e_s": 0.0462158510053996, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 4080.0, + "d_ext_hits": 0.0 + } + ], + "8192": [ + { + "ttft_s": 0.05042222701013088, + "e2e_s": 0.05053543800022453, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 8176.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.05319672200130299, + "e2e_s": 0.053308423986891285, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 8176.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.05063424099353142, + "e2e_s": 0.05073276098119095, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 8176.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.050384567002765834, + "e2e_s": 0.05048462699051015, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 8176.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.055105848994571716, + "e2e_s": 0.055215683998540044, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 8176.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.05349100599414669, + "e2e_s": 0.053595816978486255, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 8176.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.05177868201280944, + "e2e_s": 0.05188246400211938, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 8176.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.055209266021847725, + "e2e_s": 0.05531894601881504, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 8176.0, + "d_ext_hits": 0.0 + } + ], + "16384": [ + { + "ttft_s": 0.0633803239907138, + "e2e_s": 0.06349112599855289, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 16368.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.06337857199832797, + "e2e_s": 0.06350608498905785, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 16368.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.06098292299429886, + "e2e_s": 0.061115075019188225, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 16368.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.06343525002012029, + "e2e_s": 0.06355450401315466, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 16368.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.0636955969966948, + "e2e_s": 0.0636955969966948, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 16368.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.06389156199293211, + "e2e_s": 0.06389156199293211, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 16368.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.06587072199909016, + "e2e_s": 0.06587072199909016, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 16368.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.059953891002805904, + "e2e_s": 0.060058912000386044, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 16368.0, + "d_ext_hits": 0.0 + } + ], + "32768": [ + { + "ttft_s": 0.07615292401169427, + "e2e_s": 0.07625289200223051, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 32752.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.07992992899380624, + "e2e_s": 0.0800386439950671, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 32752.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.07980811400921084, + "e2e_s": 0.07995001602103002, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 32752.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.11761908099288121, + "e2e_s": 0.11776423300034367, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 32752.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.07834753501811065, + "e2e_s": 0.07834753501811065, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 32752.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.0814115820103325, + "e2e_s": 0.0814115820103325, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 32752.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.08212830501724966, + "e2e_s": 0.08224253499065526, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 32752.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.07761731799109839, + "e2e_s": 0.07772363899857737, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 32752.0, + "d_ext_hits": 0.0 + } + ], + "65536": [ + { + "ttft_s": 0.1206158839922864, + "e2e_s": 0.1206158839922864, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 65520.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.10727833199780434, + "e2e_s": 0.10727833199780434, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 65520.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.11010084400186315, + "e2e_s": 0.11023741000099108, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 65520.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.11566799599677324, + "e2e_s": 0.1157765949901659, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 65520.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.11422122400836088, + "e2e_s": 0.11422122400836088, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 65520.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.07390080401091836, + "e2e_s": 0.07390080401091836, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 65520.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.11271239400957711, + "e2e_s": 0.11271239400957711, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 65520.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.10560396200162359, + "e2e_s": 0.10572021701955236, + "tier_observed": "gpu", + "expect": "gpu", + "d_gpu_hits": 65520.0, + "d_ext_hits": 0.0 + } + ] + } +} \ No newline at end of file diff --git a/v2/exp_a_tier_latency/results/miss.json b/v2/exp_a_tier_latency/results/miss.json new file mode 100644 index 0000000..b4f8c38 --- /dev/null +++ b/v2/exp_a_tier_latency/results/miss.json @@ -0,0 +1,533 @@ +{ + "mode": "miss", + "reps": 8, + "by_length": { + "1024": { + "n": 8, + "ttft_p50": 0.07843716802017298, + "ttft_mean": 0.1441972145003092, + "ttft_min": 0.0768489159818273, + "ttft_max": 0.6051040079910308, + "tier_observed": "miss", + "verified_frac": 1.0 + }, + "2048": { + "n": 8, + "ttft_p50": 0.13254689799214248, + "ttft_mean": 0.14012471562818973, + "ttft_min": 0.13148935200297274, + "ttft_max": 0.19460841300315224, + "tier_observed": "miss", + "verified_frac": 1.0 + }, + "4096": { + "n": 8, + "ttft_p50": 0.2613626064994605, + "ttft_mean": 0.2620435417484259, + "ttft_min": 0.26085699602845125, + "ttft_max": 0.2652779980271589, + "tier_observed": "miss", + "verified_frac": 1.0 + }, + "8192": { + "n": 8, + "ttft_p50": 0.588181210012408, + "ttft_mean": 0.5881437246280257, + "ttft_min": 0.5867919930024073, + "ttft_max": 0.5897468629991636, + "tier_observed": "miss", + "verified_frac": 1.0 + }, + "16384": { + "n": 8, + "ttft_p50": 1.5470821364870062, + "ttft_mean": 1.5479571051182575, + "ttft_min": 1.5448924789961893, + "ttft_max": 1.5552692519850098, + "tier_observed": "miss", + "verified_frac": 1.0 + }, + "32768": { + "n": 8, + "ttft_p50": 4.603862981006387, + "ttft_mean": 4.601982127005613, + "ttft_min": 4.594119774992578, + "ttft_max": 4.608500114001799, + "tier_observed": "miss", + "verified_frac": 1.0 + }, + "65536": { + "n": 8, + "ttft_p50": 15.230140178493457, + "ttft_mean": 15.229316346121777, + "ttft_min": 15.177009812992765, + "ttft_max": 15.28301460199873, + "tier_observed": "miss", + "verified_frac": 1.0 + } + }, + "raw": { + "1024": [ + { + "ttft_s": 0.6051040079910308, + "e2e_s": 0.6052766389911994, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.08014080999419093, + "e2e_s": 0.08025239198468626, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.07735737299663015, + "e2e_s": 0.07746260898420587, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.0768489159818273, + "e2e_s": 0.0768489159818273, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.07845149302738719, + "e2e_s": 0.07860825702664442, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.07842284301295877, + "e2e_s": 0.07842284301295877, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.07716230300138704, + "e2e_s": 0.07729722000658512, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.08008996999706142, + "e2e_s": 0.08020236299489625, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + } + ], + "2048": [ + { + "ttft_s": 0.19460841300315224, + "e2e_s": 0.19472959099221043, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.13326648401562124, + "e2e_s": 0.13339112501125783, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.1324451889959164, + "e2e_s": 0.13255105601274408, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.13292257199645974, + "e2e_s": 0.1330343289882876, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.13170140300644562, + "e2e_s": 0.13180866098264232, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.13264860698836856, + "e2e_s": 0.13274579899734817, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.13148935200297274, + "e2e_s": 0.13160509002045728, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.13191570501658134, + "e2e_s": 0.1320405500009656, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + } + ], + "4096": [ + { + "ttft_s": 0.2652779980271589, + "e2e_s": 0.2653735490166582, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.26092263497412205, + "e2e_s": 0.2610465929901693, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.26085699602845125, + "e2e_s": 0.2609657910070382, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.2613706949923653, + "e2e_s": 0.2613706949923653, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.26135451800655574, + "e2e_s": 0.2614478030009195, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.2610389889741782, + "e2e_s": 0.2611535779724363, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.26337735800188966, + "e2e_s": 0.2634820609819144, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.26214914498268627, + "e2e_s": 0.26226521999342367, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + } + ], + "8192": [ + { + "ttft_s": 0.5897468629991636, + "e2e_s": 0.5898835949774366, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.5884731799887959, + "e2e_s": 0.5884731799887959, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.588430589006748, + "e2e_s": 0.588430589006748, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.5895502530038357, + "e2e_s": 0.5896741840115283, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.5879318310180679, + "e2e_s": 0.5879318310180679, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.5870601140195504, + "e2e_s": 0.5871822330227587, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.5871649739856366, + "e2e_s": 0.5871649739856366, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 0.5867919930024073, + "e2e_s": 0.5869127069890965, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + } + ], + "16384": [ + { + "ttft_s": 1.5552692519850098, + "e2e_s": 1.5552692519850098, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 1.5471642419870477, + "e2e_s": 1.547288056986872, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 1.5476988689915743, + "e2e_s": 1.5476988689915743, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 1.5459686409740243, + "e2e_s": 1.5460858139849734, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 1.548691272008, + "e2e_s": 1.548691272008, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 1.5470000309869647, + "e2e_s": 1.5471212370030116, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 1.5448924789961893, + "e2e_s": 1.5448924789961893, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 1.5469720550172497, + "e2e_s": 1.5470902820234187, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + } + ], + "32768": [ + { + "ttft_s": 4.603710585011868, + "e2e_s": 4.603829422005219, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 4.608500114001799, + "e2e_s": 4.608500114001799, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 4.604015377000906, + "e2e_s": 4.604134508001152, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 4.606255694001447, + "e2e_s": 4.606392626999877, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 4.598494538018713, + "e2e_s": 4.598494538018713, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 4.594119774992578, + "e2e_s": 4.59425267498591, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 4.594318103016121, + "e2e_s": 4.594462227018084, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 4.60644283000147, + "e2e_s": 4.60644283000147, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + } + ], + "65536": [ + { + "ttft_s": 15.276076515991008, + "e2e_s": 15.276189939002506, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 15.275313204998383, + "e2e_s": 15.275428983004531, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 15.274311708984897, + "e2e_s": 15.274442903988529, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 15.28301460199873, + "e2e_s": 15.283127713017166, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 15.185968648002017, + "e2e_s": 15.185968648002017, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 15.177009812992765, + "e2e_s": 15.177117884973995, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 15.181360610004049, + "e2e_s": 15.181482268002583, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + }, + { + "ttft_s": 15.18147566600237, + "e2e_s": 15.18147566600237, + "tier_observed": "miss", + "expect": "miss", + "d_gpu_hits": 0.0, + "d_ext_hits": 0.0 + } + ] + } +} \ No newline at end of file diff --git a/v2/exp_a_tier_latency/results/pcie.json b/v2/exp_a_tier_latency/results/pcie.json new file mode 100644 index 0000000..12d38cb --- /dev/null +++ b/v2/exp_a_tier_latency/results/pcie.json @@ -0,0 +1,40 @@ +{ + "device": "NVIDIA H20", + "by_length": { + "1024": { + "kv_bytes": 100663296, + "transfer_s": 0.001876260997960344, + "bw_GBps": 53.65100916633112 + }, + "2048": { + "kv_bytes": 201326592, + "transfer_s": 0.003709116979734972, + "bw_GBps": 54.27884671741612 + }, + "4096": { + "kv_bytes": 402653184, + "transfer_s": 0.007338636991335079, + "bw_GBps": 54.86757070494469 + }, + "8192": { + "kv_bytes": 805306368, + "transfer_s": 0.01476299500791356, + "bw_GBps": 54.548983290201164 + }, + "16384": { + "kv_bytes": 1610612736, + "transfer_s": 0.02972855800180696, + "bw_GBps": 54.17729093695375 + }, + "32768": { + "kv_bytes": 3221225472, + "transfer_s": 0.059267577016726136, + "bw_GBps": 54.35055107940257 + }, + "65536": { + "kv_bytes": 6442450944, + "transfer_s": 0.11847134301206097, + "bw_GBps": 54.37982536708583 + } + } +} \ No newline at end of file diff --git a/v2/exp_a_tier_latency/run.sh b/v2/exp_a_tier_latency/run.sh new file mode 100644 index 0000000..a849f5c --- /dev/null +++ b/v2/exp_a_tier_latency/run.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Exp (a): three-tier hit-latency. Runs on dash0. One H20 (GPU $GPU). +set -uo pipefail +cd /home/admin/cpfs/wjh/agentic-kv +PY=.venv/bin/python +MODEL=/home/admin/cpfs/wjh/models/Qwen/Qwen3-Coder-30B-A3B-Instruct +GPU=${GPU:-0} +PORT=${PORT:-8100} +EP=http://127.0.0.1:$PORT +OUT=v2/exp_a_tier_latency/results +mkdir -p "$OUT" + +VLLM_PID="" +launch() { # $1 = extra args, $2 = logfile + echo ">>> launch vllm: $1" + CUDA_VISIBLE_DEVICES=$GPU VLLM_LOGGING_LEVEL=WARNING \ + $PY -m vllm.entrypoints.openai.api_server --model "$MODEL" \ + --host 0.0.0.0 --port $PORT --tensor-parallel-size 1 --trust-remote-code \ + --enable-prefix-caching --enforce-eager --dtype auto --max-model-len 200000 \ + $1 > "$2" 2>&1 & + VLLM_PID=$! + echo " pid=$VLLM_PID waiting for health..." + $PY -c "import sys; sys.path.insert(0,'v2'); from common.util import wait_healthy; \ + sys.exit(0 if wait_healthy('$EP',900) else 1)" || { echo "LAUNCH FAILED"; tail -30 "$2"; return 1; } + echo " healthy." +} +teardown() { + [ -n "$VLLM_PID" ] && kill -TERM "$VLLM_PID" 2>/dev/null + for _ in $(seq 1 40); do kill -0 "$VLLM_PID" 2>/dev/null || break; sleep 1; done + kill -0 "$VLLM_PID" 2>/dev/null && kill -TERM "$VLLM_PID" 2>/dev/null + sleep 3; VLLM_PID="" +} +trap teardown EXIT + +# ---- Config A1: big GPU pool, NO offload -> measure MISS + GPU hit ---- +launch "--gpu-memory-utilization 0.9" "$OUT/vllm_a1.log" || exit 1 +$PY v2/exp_a_tier_latency/driver.py --endpoint $EP --model "$MODEL" --mode miss --reps 8 --out "$OUT/miss.json" +$PY v2/exp_a_tier_latency/driver.py --endpoint $EP --model "$MODEL" --mode gpu --reps 8 --out "$OUT/gpu.json" +teardown + +# ---- Config A2: small GPU pool (80k tok = 5000 blocks) + CPU offload 40GB -> CPU hit ---- +launch "--num-gpu-blocks-override 5000 --kv-offloading-size 40 --kv-offloading-backend native" "$OUT/vllm_a2.log" || exit 1 +$PY v2/exp_a_tier_latency/driver.py --endpoint $EP --model "$MODEL" --mode cpu --reps 4 \ + --flood-tokens 88000 --flood-chunk 16384 --out "$OUT/cpu.json" +teardown + +# ---- PCIe backstop (uses the now-free GPU) ---- +CUDA_VISIBLE_DEVICES=$GPU $PY v2/exp_a_tier_latency/pcie_transfer.py --reps 20 --out "$OUT/pcie.json" + +echo "=== exp (a) DONE ===" diff --git a/v2/exp_a_tier_latency/run_cpu.sh b/v2/exp_a_tier_latency/run_cpu.sh new file mode 100644 index 0000000..6f8e337 --- /dev/null +++ b/v2/exp_a_tier_latency/run_cpu.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# Exp (a) CPU-tier + PCIe only (miss/gpu already done). HMA fix applied. +set -uo pipefail +cd /home/admin/cpfs/wjh/agentic-kv +PY=.venv/bin/python +MODEL=/home/admin/cpfs/wjh/models/Qwen/Qwen3-Coder-30B-A3B-Instruct +GPU=${GPU:-0} +PORT=${PORT:-8100} +EP=http://127.0.0.1:$PORT +OUT=v2/exp_a_tier_latency/results +mkdir -p "$OUT" + +VLLM_PID="" +teardown() { + [ -n "$VLLM_PID" ] && kill -TERM "$VLLM_PID" 2>/dev/null + for _ in $(seq 1 40); do kill -0 "$VLLM_PID" 2>/dev/null || break; sleep 1; done + sleep 3; VLLM_PID="" +} +trap teardown EXIT + +echo ">>> launch A2: small pool + CPU offload (HMA disabled)" +CUDA_VISIBLE_DEVICES=$GPU VLLM_LOGGING_LEVEL=WARNING \ +$PY -m vllm.entrypoints.openai.api_server --model "$MODEL" \ + --host 0.0.0.0 --port $PORT --tensor-parallel-size 1 --trust-remote-code \ + --enable-prefix-caching --enforce-eager --dtype auto --max-model-len 200000 \ + --num-gpu-blocks-override 5000 --kv-offloading-size 40 --kv-offloading-backend native \ + --disable-hybrid-kv-cache-manager > "$OUT/vllm_a2.log" 2>&1 & +VLLM_PID=$! +echo " pid=$VLLM_PID waiting for health..." +$PY -c "import sys; sys.path.insert(0,'v2'); from common.util import wait_healthy; sys.exit(0 if wait_healthy('$EP',900) else 1)" \ + || { echo "LAUNCH FAILED"; tail -25 "$OUT/vllm_a2.log"; exit 1; } +echo " healthy." + +$PY v2/exp_a_tier_latency/driver.py --endpoint $EP --model "$MODEL" --mode cpu --reps 4 \ + --flood-tokens 88000 --flood-chunk 16384 --out "$OUT/cpu.json" +teardown + +CUDA_VISIBLE_DEVICES=$GPU $PY v2/exp_a_tier_latency/pcie_transfer.py --reps 20 --out "$OUT/pcie.json" +echo "=== exp (a) CPU+PCIe DONE ===" diff --git a/v2/figs/exp_a_tier_latency.png b/v2/figs/exp_a_tier_latency.png new file mode 100644 index 0000000000000000000000000000000000000000..cbeae7dfd7aab1569f267fc969fae372cc9a689f GIT binary patch literal 82750 zcmd@6X*5^u`#+3tWQ>T)kP=A|GGv}YgCtXud7dM)$e2izC;A8GKfFI{b$!;=#rwVYxzF=BUemEJ>uMiiV&GyR2!iRT#zB38 zpqe5G%1SyK{EbGDK`#DJ-sg~!&k1)2pR?9p_QY{(9}ib|A6I9a9e(y+-p=l4Bt^x= zMCF8cIQjT^c+2nG=k~upA?ohsxKH5l2V;B+y@!UeH$iN^ME;?8)p_6nK|v5l52_mY z-y8pW)?ia-5AD>XtM$l>OIIFbTDgZ&AEFL?`EBzt;mcC>HxEV|rP;_7vg?N1rzb7uk^etl^cujioSjbKqD|Dm6A z`AP-F|NM&@-J5OHQ~&2*H0TddDE{xyQR)&p|L3=E5u0k*{{1@sv5WZs=C5cd(=jlF zM@7+IyLPR{lUw$>x`Ba#o=o<;bu={L{j&Q{cjRQ=RlD-c;q9IC{j&JWExsqFqt#Mt z+B1&nr5$GC;NYN3p&(c`Z_fBLSvQ>dNA*_36{=vkVv{B_%&TIk~sC~PdM&BK&(^~|z62lbE{(4~Z`bwSS0ln0= zboaIgsuyr0G)!FS;%zEx%R9}iM!&sK(7rFf%S^XCbgjy8$+*~oN%s1Mq$JLpadF;n zEkE|QMFd6jANoqDY5cx@YirN{8DU#pnpF8x8Nh}$ zIiHZgj*mP!>~<|CrlBQClH!3z2>7Q>RtJZ$hw6rjaii++zm1m|W z6B(=an&Txto1W;Z3RXBbH=cD%G+wjs#}EBXw})-~H@}v-^@w?VKhQYf#kgIOW2`ej zN`pVVxL9(#O31aEngcB8{f@cT5{Eg~lCZfHb|e0bdd_O6Wo^iO(Gi^@xZe}C~xOK-u-9ei$bPm+DX+(=u1V(MK%$ncu2IV-gcNh*1@)rdxs+mi|tj z4vvykdFROb#$}?rbhx)#<)@cieGE@b^i~-);VpZ=7WP*7?v;>`@X8tb_4RqV|8G9R zsxg*#p}W4nA*O$IWoc?^skDq!u6PMgDAgcKUo(J_ ziRpc=sf<~L4}Gy?o9M&aTSP)Qc)!Z+_}LTZ%i-y{!1$nzzivGpT}|VSovFHe#BA#s zh0QAroRu%CUZ7FsXYHFE>y-8Ssd3%+_u1a;li3#+XUEu`p40Q*A-`8|uekWe>a|q` zf_!3Ab91fYDh-~A(r$N}{OURII4<56F|BKAVmNp1+#b_1;l;U$tJ$aWU2-O0U1l3@ z&seXSAS$BhJ~=*qP1L-?>cgYsYE}5&)S!iF&56dv$ISXq6Iv+NN%x(fvMzD!*&;11&2sr59V6qbcd6>Np4=Cid6I4KZk2YWyWU^m^q$Y! zR6DNA{{Fq;g_$7^d7nLaZd6HHG`n~2UjFkzM?*v7U3vA9nC+>S)gcAN#TTlol+Db{ z$mL5Kl&@rl5Xw7h-$K2vXJj!_|{v$M1OCt70T#*N=) zH{gH}5>YwQZrz)1-@YvrCuwhIXEihUcIx-<^QEOyfByW@eWbg3%xJrO*7H+Gzy=A-LCuG z&y74{E@PdKCLK!y|DN#~en;Ww=lAZzhYR=bZ<9a!D@UU4Qhq|{i{diz(gec{XD7w0r5?aVVX?ZOx--`&b_`v5{7dp^!px1t#7nr*mv7%PJ$m#=Z2$g< z?CiZ{ZIN;Rmg%P6@z+jGjZ#4S-X(_3LNzrt1fFI?iSvhus+SxuyGu{&}OUdx~bi1QYigNVPIDy)iFRA9{=IX}2RRsq|L`4mitJHJM{rbAz($eyl zs5zHJ5+iQH>D>bghqmP0--;A9xu#FwWuMyD_4%`^KwRzX*VM%hZ<{_0#mHlaz5Mwm z4!3}f`Do6&$n|rP)90dH#LxL)!Gz{Q-!Vg?=6mgh((Y=}-nM7QZT=3v-Kv$W$oVPz zR8(Q1II6sEvBU9}dva_k%E9`k0%MN#udlMde-U{0me5HCo5IB8H@kOj-5J3mQNzjDFiE;UO0H#*UGY6ce+;tvGHLGO*&iaf!l; zX{)pyJw3gqeX??}(75ABdj=y>Tu@;3>({TAH*YSxeXC45bnqbEkfNNNvD@7>RPer_ z%8(V4uBw0;2bwS`w{C-sYiVgascLTTvuwrwPSO&v^&RW5$8}umm&H#wy$j2D{5boT zQs}Cpq`0^>k(ivkJ=^rDsJEx*#_Pp+#*D;WaofXrLkihvzE+46EnQuSCv%K$JbV6p z{lw3hol;UKAIs|`E50GbjvP569kT3C6ZZM@XK@^C!wMf~zv-Vx>p5&aJw0=r_Aj{R?6hwyE5*E&)0JDJq;s2w{h5x*PN%)($R^bu)28hVvfa& zb9K*9hEL};q#o^9-Mi+1d;x3}$v4I9)szjeG>Hq?(tk>m2|NnPQoEd9t&Stp{7X6Vy|85m(;ek;Sy2s z9ZxV(55&)}1DdT&+);dg__av7Lpbr46%fTZQt2 zJDQrVP*|a$krH7ps5#kuk6~jOC0BiHzhuPGkL46t*v#1c9TOv-%3w+ zN?_|axVpBCe#&kjOLRJ(=rxwyD+$qhgQWo0iR=p*%Z5yuB_r6B`Z+ZPX@>zMgSfNo1A;!+mJ~#SlZ@kxX z2)l^MD}L6?9(j9D<+UuYtdz>rs9o8~@SUF5C3>5}Z3-*Yv_|i3tE;PZG4o%apIzT` zLSMftf}Smchut`IUDJS9U&F^MoA(-oqX+*gL~YsY);vP%rCJu>Fu8=zEkEJimaJ4q zeR-?QnLQcUi^Wv58wxJaG7Gt>cn>nhY4DRN|z^*|UyBS1hmkttNY= zBl=mlL`+IF1m7Li)U;uU440FW6DNfC?>BI}`&cKXl_)^b-s9FO5SE~s;aU?$A*`%y zp`qY6&LO#fza7!_==j}RO;~Gsd(#r9+J|XrktJ8z_Z8`9Xws|P^kw>vlF%$_R$jA- zA+mjrynX;LF=G60Z)j(hwsIKz)z?}AafRQ%Tcw6Xs@3Z2>vPy%D|PF^vY_xgJU#Q3 zwaL-Wt^gQM0;L8p<}+^W)@a*l!ZLA1SYFdiwO~yT?UUDV$4d2lR#Fiw;L~6|(QMpmUDeu+4@Qy;%QPywK~`WTn07 zD(C)Oir;%myZ=zey`QCR61M~1&;Rak5bBB9uGHk}=Eh0*{rVyo@3U(3_U+rxfWL16 zl_E;g)A`Hno45Ea{&CKbFm78xrH>cAy*k@zS$AlIx#ig^k(H&tj(GZ;!oQk7_Zu*g z-nHwHfA8wTP>Rcp&q({Ba*app-KtZhsHd2DlsAc<0Yr@tUi@=ZBXDK0bShwUVj@?6 zceN$9aLD4w?hNm@f4$W-`Tp%y--+&c3ahHBssN$2g&9W&7ndhp!Qe(^~hS z07dW|>|Sgql=IyN2BgB)u+EVRC%b=4=7|^=9duj7iBGz5VQ~o-f^aFCJu_T2 z><%h-K?*Cx(ZA~m_=(HxDa&o2+eiPMvzhyo4ax^m0Q6Yg)n#ODa6V5}Sf_`u_^@#4+Owvz{Ny}PxwwS4K=F{=5Hl|^yFb-b(4rFj=We}RO36V6^; z>lcbNZ`YGFg^nAQXzt#m~=wz|xWj`|d@zBHM25bp*G9 zpO*h%TSvzheC7Q7@0}aCWn&))vm2UL-$HjJzJpBoW6|;!EMJ_91j13{yYc<`WYvkg z4YjotXts@wjql3SQyvu&B!eN6+Fl<%a%67?3EgnXPhj@TbcZs1VaGq&)cpDBb>n5&T3vJuLqii;Dr$6m*bojw(`@LOw z8e8~ojJB~?{Q{3EZM#Kv$1>r*!dbOc-3M+xWpxWp*F(+u`1q=ZjaSEoPCki1XQLwO zqqj!onLqylgyi%wQ}4XWgW6#gspPo}F%LWMnn`E>$z2`1FTIOx)bu24$Vu zr*tyYfUSi_&YU?z7^pCN-Q-D$K0EpCH7XKGXZE{)<3{;A++QDE7_{I;)SzYEnx6dj zV(Wpyp;KqPUu8rHWt2&eq1J5~CDp5o>qkaL_MCjO zsk_W=>Ci;`p>yZt=f*!%5nR=Gk85c~IL=E2J4^@1$L3S#Qi16-fBd+Km;%aGj1NVV z2y40Qyx)9Xrd}Eiv18XRYCSzYl5-s7+eqTv&&7^u!Ao=Ge+>!>dRJhr?jI14)e@e< zGu_>>@6$7H$MW*>@2&S0JUl!|Nc}$jDBFIQk90s|5n2K#n%Z>Eprm>)Z=A&*qaZ9Q z{Zpl1pd@oO8$L0hXX4slgA3Wn${LQMxZZi0)l=!*pLZ@Rz2p1uODZTR5V}d1E`^%A zbmrw2wgT7mhzZ%!(VGMVT{rHytnYkhF%ew9>9)w#%*;$h9-Z0IPu{spfVEET>6bOPAD{RUvw&LR z^rgJ8TX8%zu5s7y-8+Fo`cL0uN5O3 z!6)zh+M3qK5=D#GS2lk-Gt_psxY+ypNJY@!pb^J@2oTpI*Rv1G>RGwE=CoJ4f32V< zu$69fOtffrwyC?}Qr3gnbv^Tb>>=)j_WSI1w)t~u+<7$c^iC)s6ciL{Tq;Y;VH8vh zl{yZyQ+?|EyLM4DF4Re?j96P#&Cm&6-V?SvBJ(6P5~3z-Scnq z5Du;P=z%+P%$~7=e38_m!1c3)2RAJb509`(30u6h>dehq2xTnD@BqT%@@VLzN zGvB%?K|#U!rOE2ZKb7xFELYFC%<;4>GyAi#u|@k1-g6k63%UOLFPJlEqs++DgCD3^KX&Yk$1d$OLC%F4<@Db&k*q>k@& z_DUNYN-YDz6ML?}^U9k$3gX3(i66ua4h28q@Cz4y<7U-S4gogH17;q@S|rYQZa#26 zWN4#)`#Y9%WbHN21O>`u%;=!uF?tcaWN4e5(>!L!^h);nOR#s(l||o!M~>J6<#DKl zD585sVp(c?dbZ|Uyl8)RocevoK6_i+3qTZn^733y-FxeCDBhQzK82lNjn<{vJUf*} z)fB&%_O@Kq(d(fB+d_Ik9~Q+~v!cx&E3Ok&oc# zexFkb)-Nh<4}I_nj+t&)?s2bn_H8jvxZcc+n|O(4L19PZk(!!Hw|;$dXYjCELffn5 zWyO~4eIvy|1q#-6>*kl1(x7^XL4ToiKAu9myr*=2ex6bxukxk_e^;5?RPs!^z@ zr~ttYndCvIh<#({zciQYaU-UB=^JWNc}2w*r{~4}mZz@w??`C&4mS5SmcAW(^BN`D z@KDwxGctBPzg6NX39>wkKHJR#>?kQc<=z(6js|x+7l%{-q?qi+PvBen#a~1ud|GwJm(3Nsf%9 zmiHMZh`Md6AuGM-sc1ufFLd0#dUZYFWX7)abpLU%Q-&QgeDM{IS#2pQ`QG=te^{!o zUcW6m|6Jn^rBR5#hc-h+%J0dH=VvFM9A85Nwx|lqI&uHAeW>y&^RJ*!@3UI>1(;Xe zG7~)l=FY;y6NAoV^XBF*LSoWya41sKd@8>mT8Y$Pp9;Czsr!yC3abJK+Dj#VjQ4&Vw9=zK3WN+Ap)N>5B-ru|Y9BffcO6riN<`ps36Mi5F zG_i6%20A+XI;E2m6X{g$6s;BvM6FT=Z0$C|vg#)%C)cgbG?=8SQGd)n#mo??=A@(A zx4U>fJ-uGV)|c-47y$z)V&xeB03ivD9J$WDF**1nb+2X7^(WuO>q&j<{@6!D>@^Cz z*4+=r?hoV8P&5WZ5sL&1kFzW->DB;62+;|Wz?T}4HQ_vq`9_L21LW>fUB!8WJB6WHNDIU ziZE;ts>XZe(@?;LMj%*sl{m-ge|z|6SFrTswhMnJdrwzp_n^yra7TF$wes@usdWml zUl~_j25I+Z`mu0e1sZVe;M=bT9{oOGn3qUy8p>TsNWRoTKYGapJ`1^rLYRv&O}F zxgo#^(sqq3B$0^EczB&#j!*dMEniMaP%u!?g^nqQu2gJzBC_S_)&gVkf*!yzE7I;?cTh3LuwB>rccjk_V}8+>=O}* z{@m3iM$~~0ZI$Urw7hHovuGdlD+vAGK0XHB$-dj>4RcKju`KJI6ZTm;0K&9>ke^zv z7-qd3u`<)9Qa2Y7v5vgjNBQ|Fk2?)Mc-nP7Ik^|AK$iX?`)H?nj=<%4^7<%Dt3zJ2 z&jGKB5s+q}&PrPcdU;7K4J24bc;8r&5^V{As;1y@<_u^p+IulRm{&wm@g64^*I={! z)XOO5Q!bNL!Aps$sk~G*gKa7K2HHJUDz05(Gf}NAxCSZRPC! z(Kf*qa5pV}R`EikoR92~!rMrRhA4nYJcvpUIaeX zPdTcs?SSR|RKB6|QQPe=tuX@20e@#^P8>a^qvHtufW4{#O-HID?#2yXVOu9Fs|SVJ zZq7?9IU|8T(3 zhX15N?0VjsFIB!z-WlXSVS z;qL!vb9s4rU~AAz$38rcX;sxeeE1^EJ>nm`1fa5oCWgmV2;Q*CiCF7WWAP_Rw4v$-1q(N&T_FOPTQpO@+oJWoEpD; z`H~nH$M%n)-W)qOcV}wJ6aqeYZp*7z5#$|#iqbpdklJ8XH3v#2mVoH$?tCB;(H2N) z3M@b~MdkB_q)M8p_wV163qfH8JxFMvh~}?j>%I3spgAnleFwFA{lqX=DCpOzT$6an zX-E9sL_|bBS-cZ|LL?Vf&VGhoQAkQJ_V}?TmyemX!0VDSGVC20r~X!HYihEJdQn*! z8XA)K2~kb2Kk~^#y6>DHL@uSk(`a{G%R2Gc$K{w`caX}^A0U-@t=owdYmH+SXCBnFz$aF^cAr>Y5&ChO~Q1@bT$hoWMO}pR(DZLUKbYhw3H{)ZYQB zR_57%IOE2S?vMGR=Bc^`05Z_1o12fhJ?FF?@3aiHCydbVjLgjL8BRC~hf@02b1W?{ zNTSvJles0Or5&(tIoRc7$ruMSc4^*ZPqZ0*TXY4O2T$QCE-bW$&?qM>TTpv}wis7C zxL9QfofVo!4wj&$qvJNDVFyRY26CSbwj`x_HI!%Kt4f%E@Ti2e$X*!b{80^l*8Q$s1(|o% z|K$k2lT?aD-_;z3BW~=J@#G5jW!<%3=(iW6qmS$Dk0BEW>ALR$?D35q5Th?ZT!0)> z1Dgg4i~sK*)E3ntOgp?+hCs#usGnRi)nwpeO2r4O4R1geA=V}b!d&8hXI32H^TWeV zX3xB+Q&d7Pq6lvhHVOl3(3{f6^~Acjr+SFHC@3qtXdpxaZQ!Y?4>~G+pe74NDK|;=HBro( zva+)B`|vOwDn6nDHJ?9ol9oOWqjzpUI+GJblN>O3D=Pw$x>l0Jq5iSNS)0RiD)0nC& zp@r1hLxQ29p#X5W=dARv6~61e2U}F}8CKxb(*cm=qRhrr&i>*iWhV$0!((G@B2k6N>t-18t zh9(U9wwR-%BiWCjR_x`jMm>2BCZ0T|qorj>MZ;*t-5^eoy$w%KoSB)~FiU@z0Q~)6 zCT>|Vo)|6iYhT>3t%)E@;XgA8CJ4M;R8F>5^8*LM>Zhw$=I(l!k!6~6x}f+m z5@gv3{QV6G+jM5 zk8-?i_uA0VP(uDv-+jdZ{V`=FSkV9Za?VS5__w-E;F0}Xkz0ake*!#a29HPk=37=L zUp~m!H~ZvNe)5!wv5`>$PHX5$Dy!Nh?JJ!!N;o@;ZyFn|pmqRT0q&74d+ETBNPXGp}9np{|M7+t}JB#l$dE)nEbB^+m^?`7i#-(p&_SO9Fqy zCEgavZrAa-apOiU)WrxZ?Ym)fVEV#)_FQ@qw4m=CXkx-;TI>+*LE-ZL;UOXW1;XO1 zGJKXURLDqMOIYT~F~{zsS10@a`jYfENiqrtr+eqV$pE#pGf62 zhc$B%F@4PF4jA-1%` zfH{$Cs0JUi#&Jc3XTHi4WMD!U+mw4|Y-Ge5TUw~+!-o%r=Vo2@pZUVEWy_X#ot;O3 z@x_AXJrvLV(Xb7^CZ1ziy&X{b0!{|d(z`M@(}RZ(yL?(jseK4ayywItMuax3?Cm3Q zF}7efE;F<=Gz@K<_ikc8!GF_Bs_KcF42eLZZgrbm! z=S_rRE00yWBY4ucHq##Ce^=U#l7Lx7jdK!#)CMaX+eR*~J45md%1=(O{ruf9x2qxE z64)sMrYIt4AmQ3>$;aD73L+rx65ql1G@U_TyQ)J~ z2rC>pA$xm?q^adli^Uzh5kEJR@jm^!ZHoRZ5Ea8T`0EnIZN1(irF0rH5+$LgrWP@Q zh!iaW{ZB2U1>X|6)&`v-S=5XU!5~AyQyH3@*R5Ok9kri~0^u-{_yIcB%dcOzp&)g1 zb?iKHy#`qi+6~-c;7;gkzX1%b>#uPRLukuuxbqdKj)D*n5U7)TX9)KKnF?!X=gZKG zMl0QSNIrm=P|K{c90r_-)5eMp)c`%HAY|p-#~kAm6V$9byeW(E{r%`M1tld1@lZYH z#*O_018w2Ma{Yb7@e(DvZ(<@E)&`%P+`rU^fzaz4JCD2r-r-(ivSozQUISf!YHq?5 z8h%Z8x4ce6%1JM;BC*T&(UA1J5rc|VN)^T)?}`W2eoz%!T$cC=Tp;SM4{!g_=bi=s%=a#cWaTk$OO21Ahcd=@tKV1Zw%d z{eI&{Pz3TV%*P~DmZzwwYS2prU5|k)1Di62wa@%U-ER5vcob?euR|b))r?^cVNfUgarf!W|uIpZS4?>*Zd5#)fmeVOV$#4wj1|l zJ^4Cq18zK?hKp}Xsq+kV_ zRh{H(oNpoZY8lrqbdAdg>&ni26>`;q2j3g~cN<6oSJc*hMg<4_zbPmxnh8!o1|~r= zg%vV)dYV0z0mWhz_raAEg60ciZ(|z{9c};d<3|^6A@S)`8LArKszgBlCduGMAFRw1 zgQK=e=>A)}6G}zyTzuC&;6(-$%AjKXr-wk$kke_X;jrCnn8Pv{_dO-88oVHR`+E&Q z3zR<_(hU?VG%+x^rKx;eeHi%am8fM^3v4@Kt+LxIoJ-4(npqYPUEP903zaz0Ukrux z6IO%53iq!s7{{YN>^%eH|8&qT8#r5x1ga3*pk?DPETG!LZk^=e5_j~8y`no#rp5nk&lnqU#Zr3&7#fKJp3r5ze(~!lAolg+0>|$Zpj5jE z$Ho0K|4E$-UiY7o6V}pW+Z6mV(;q*6yuR%t>}8X#Jl#Esh*eV6Ak&zyFS>K5dg3jS zzydaQ_J(WG(Mcd9fC~COz?pvH1lh1Odlrc8#L`%P^|V)GICPS%$}JEaTx-Lrg%JSS zh2&;f#ZXNE!cH4UuS7?0E^}o1F112xTm#{ed8E}f$9Djjii41LZcjHGLwP;nk^nYs zTYv4nY%M=e&FMvG4kVaxxv;kU=opc&yC-73-!k>qRX!WEn@`G*lcmBs=X4T?RgiZ0 zJziY`!qf13!4jtFf(Cuzz zKHny9m%JA0?(UAdazXsj{%gr=YdJ56$e!ZZww)MFv8IuT>V(&$Zy#!$6}X*;;6mz< zkW-elfSya52&jQ@Xo#?538L0x9l1gcxlC2pM2F-^t5+3{D=uxgBloUm#X-JWXloP) z{O7h1BpvVj{2gZ7lUr<;54t?1g3w3{$I`L<*|Sf*p5nL;tlNDK7bIffZ^>=Ik} zvGYSIp45+ogKft-}og`g%*h8 z-M@c-!_Y^HJ=?M?RA^~w?|1J^Xnv0rlw#;AH=tNun&Fo81-h@O|KCsB)w&ndJ3CDBin^> zt>ecjhW(O@&;7HDk2W3To9%2{xcnPl#+8zi{h(WYz_J8^bPYn%7H)FK+Z4!HLuNkg z0InX0#$hd;U}P48Z$XV&-z2P&8%K4%0ym*l#T!TW)mkOpRHXJTX|ekyL< zx)vl68*t|10(`Z2fgCD{eXq3cN;83>97GxR#5E!^JL;pjEcpvCM95o^%#|V_P={XQ z`Mrk1XS_?#Rtb*Ird3PP1X~2TNgj%P?Dbc#4)%p>`{4;4f^6C}2Sp_fzS2Adhr)BSBkJ_&*VrQ{MGB%*5JX2 zMstyN0-1Xt2yhpv4${RSSgyXVd%f8W_{?TudVst)l*Ws&zHLBCh>|f{#D(jA#*7L` zmXwtpe(pC>;NGk3+Fc^pKq&9Md@!6>{URBxMdskOd-cji02ZOI186tEag#=-raNJWLhVKVJT&!JiulD;^(fNBI(+yrU|@CqQPu_JdFa1l z^$}OijDH7pKUVlk{RW5!NcA;t-eY0f zo;NJ?@2~sa>zRxv72&;eAh#nMIG5vb)~qv_DycSKz&NU4W?^A%a8p=y;9uDv6?w5_^9eJOFJjOJWKOaP~l%g zjgfyUvm1$Cm$n4aoqWV>KK0a^H#d%&Aa$29ny#i`e%^fNjxqBPw?zt-pl^+hbZB5) zYiJ}usAQ`8e)sDXwga=3!(L{eV{$Wd!GQwj#?Rw)XeTSuLwy?m_QG^xW{BDv?6#}G znhIJq3v72R@<3uWgtEHfC7`}$IU7jgg!x&Lv7?6~V5j8&kMbp#0JyLnr- z#>yoHn^$zifu*^LPc$k)Vj&Rf$pX*aAo$gK=)>QMo+wnq%yg=xwiv(RcdAY&JU4FL zx_6ze@94+(S*}oX#o%cXH5gLxej#=Pj|eA`VeJgWHW&uUDxrCEd1+>%4dCz;c2&}q z&=bX!The~(=rDBNHV>1sqdGJ+daNej^r^OygYekRGq71*UtQWLmq!JW z(Jb`^kc80K(}w!`q6ZIlNPGS`m@#puwXh5sfj3~6FY_#3Jh{1L+qSnrtNTjigoU+s z>G=DX$5wd_Xj+T>LV$6wzyBpsfNXB&tq&y|6emfF!skwTrQQ0b2~px*a$+C z_>m!#Q-+=SmX3&sQ&^pNq_xqanC#UnqcD9?27R6+u&7n7BPslJyvEU^)?@@W(|GzMdh}KYAc7Xw!ps1E}8QK&Nc=y zhBS9oUrY(6bw&}U4{`u_)XstACf&We^2$>GbcUd12Q#-(xhe=IgUumbEW$r~E{X0aF>x?C?G zvNC%r^*XW##b7ZE6nPLDP>77LFZsf0L=&h>A+N2vIcw74@jnt%tUUk=(}406>>w=o z$Vee!S1xVbNj~5^l=GM#I+eL|Nv?TS279>F zH{ZDU@Nj-dM+fQQw0!({i^2-BuFF2%jc6AS5in7!l3*7#v)Xz18tDULio$4~Vtp74 zJnd|GM0jrWe|^8}*loHIoM*X?&HvB#&{+m#f>r#d!rmq;-7R(fe3Oj61FSxJ{I~&( z?X^jn>zh>sbZ;jnW`2@ud<(hdGYF+I4mORhPX5Kv=I!UZ-qF(G#i{$~UX@EKzRUEsmqxu74b z)(}_ikl-PG1qdufm)Uj~L7XXFC{DgQ9x9P^4We`rnS(%NV%SF!qgrZ8-4+DuT)YRx z1!jwvb#+~kf{f5qjo_(})-9?mIp+X7A$FTeh?#A05RtN?gX{x3oMClHu(V?<_ZA+W z{IVbo4Z8n=)-&d|RVqK{WT4xpYGDS^gHf>7kAv~vDDs4 zk9>SHSbvMFt1CH3L;4O|<-F3H0xzxVHhym@P!asBqlWx!v-A%)%&xz=ZI=Fj|CoDDvQck-y16ZF zm&@<7-`eggoO&gqw+~aF1XSIVuS9rXQ~%%m8bZ9nvFApR8vmc`NMHAWJf8pkn;^wM zi}b&L(irNOhrjH6+)uO~1?LW!{ZTgSWoLmrX-lJviL% z2>zV5CXk4DFRIL!{}O924&af*-i)T4&u6h^AKQ7M z{&z3+wZeyI7|4e=P4Ry_`~GfI4f)aJPiZn9vf*oY@1;4Web_5YKlbF4b?;>)*4W`t z2RzcyIygN$rm_6jlHam=!y$crJsH7X4BmzH%R(V%cUC~-Cr3a*Au2U`RDJ$_ucd>gi*MFFSu&<1y>#uaiF( zJkR3E%R67bk5Ty8yH-xFx)R$XMzfQ&#u=K2y6WEe0ZiwruNMndU8U2 z_O&ktxX6itL^*E(D2oIeTim|9IPwO6nzC)>xHL??ogvDKexU`*7nFE10DCou z3CO^x#A)NX+0jU_{LRJ+8sCsq;Y0+;sLU$Q8e%HF1}L!tOy^XR#LyWle`pnZp+u##iNTeof{2aPqfwP^@) zq=Ag?V|)ju6KPOk1U=fz@Z|>7&43?7l$atZX;Rq3c zhaDTuAM!tEWd@ zM~4|8hy$ZQP!&G?ngstIMzRF<=X#7S2L=XW;FbohA5hdw?zXUTIGIm?WZ>Z7;PkEX znWi#AZ;{w0hFwb(ALBA^Y=kwy@bZUbH@$>#=^Wv z!dz9z3K#S*$oB`q6W=56jr#cmEz_vfWivVV4-o?cWl$~ogoGFXYSbWE$ASx@wAnzF zO@zS#SmE`h6FtRaqFbuOBF~uA*1yNU5_YSv*ggk8f zI!yhL!U@*vJn(xz#CLe!EQr*dW(QPWU(W%_lMay%C<)|$g!{RZ{2RjRS}IIIn65lR zr}C}=OYtHBj-dGP$1FDTsgja?MlKL-?SH0~Bd*_OZFMD4(s2WaEkyB`_vF04kBwag zv9<=bNK_1vz@GhhU74J!CzTnX%T(w{vKV26qLv1uM+E8{qy0JjDiyNRBvLG#qm@P__U0+S_1)R-Gb>p zUz~rjRO5M1djMW*=B5B4ou!}f;_0v+k$A%YdLg2MboBJKc#0c2IqAVih#FYSdMFpd zmQ~!<%hSiM*Y-k>A@kq332S&5n$E}=#A-afgsq6Cs@iLhTf0p z@_CdY=aw1Re&icBAS*_Kq7*0r5Fl3)26_ZwwjO|%*A2UA_`_r7kfjM3QXeCx5NUlOyVVV`JIVEvtxwd4itA z&s6!0=#%y>c1WgfDkWj{C#~;LGxmGgF*z#8D-=6W9;-J0GL4i=Tkx! z1v_W%-p7-}aBbv9#?fEhy)OdUAz2@Scka17?}>K@&^wcuZ(sFtIKcFi@m@^w6QnhI zzvmEn3a3RhgXhKCJTLKyZ_J9>Ui-i>H|WgC_YZmh^l}`sdDt2n5d2}vNMApBZYkrA zjJxQ%Nn%I5COH+~_e+B3AY~Yw1_b;`>oenk)NbPo_Q{~ih70h5kdpWMO53|-^?HQ> zG)jZdZP<0Ov9V#OwPcS70{~CM>@r^Y@w`A}&mKD1Fr@Bb5Pp_`kDQ}#5mIeDxj$j= zsSPTt^E*-8$TVfVJZ5C_=PGya+SLacoE<+*j#|N1^MvUfe`G6Rg)X2rwSnMnutr1! zU_>*9<>yndB{gW?psAX*3bAs=_hCwwWpNhSySOlb>g6u6|F>&JmE;$%HVqxo();pm zoB#BuC+5$~nxq2*m&`sO4-*Yx=yc9gEHNpKi(wXxTP1`W-BcCXpZIVcVrqIi9N8oU zH)1f9Oujb630f|401sy`ty`4?74?n|z%VcQhM4#XY(v`Eg*~+p9Zt4m_?d-`?EgpLY}QRPn^9VyQhM6G#!pO}g=s7-r#4qpb}K`=*F;5!33- zyVvBbh}2T7QApX-_3+XO{$_8ZQ@X7NB& z3t*-nwiIY0Em8C7(`LMvK@Bs#1lfkj2`KW=;0+Jt&tNV?cx`#6jSPi(DbcLvozvVf z)C+-rb=eEABLvIhtn?=i2~ z59gJ_Zi65*BVzf;kcKX6+->%TB*tVL9{t zni?7`bE!-ySb+8q(d6YP{{v{JZ_h2u*>vU~S^gG$Kvd>KiTz;DNcL4#;v7w~ld7HF zI>}z`0HLMQDo=m?tWD&MAu1<1Ln>B3g*m*;pD-0OFv=_$=2eUf7)&E*b=>W%O(8-loOpaQP0Sgc9q5cufIce!A~E=XMTjL|K)bGA+HK?7 zU+vP`=lgriv`zYCjedHi<)lLdae7_kZh4>~>1TC^Oe;#+#|_LwlXPQaV^jpXQQDlS z=Uk9n7REC1-UiRUI_mp9a{g0RiHV6;c$q`F_t16Ca}dAvSw@G3Xh9c*Eh>#BX2y)E ztPsQ_l8Rd$w|!gv@p`?manU-~%j*CfKRkO|(N$!>{>-;Z!DY-=>)TPvSLFPrkVwqQG1ovBm{K!(hx7G#e+5 zYgcd8g#_FB??)T7HRgwS4y5Y7NwZ9&Y06tSiuA zof5um1NyQP0z1#GQsy=X<+|U4h++fLm#jJPcHv5rC6HUzgMjowQuu$v$z+-qyH)R* zmp$4+A0$7Fo{?|0K^!Z7tO~DtLW`xOqWV2Oa4aL~yZ6hsi{B7>C3_+2+Ii4#5T}he zWU$XtQMP1#hFQW|97mqIehx?Rc?n<-T_+roJP->Hth}t8oHcx40&|%(R>1ruq(LU- zG6sg|#%da1mtimuoi4oFdTb#B_Oeq~0q?oLznB2L$!ZD%=`gUJm_rK(ZwiDE=(rb< zpi4!oz(m$-fHaiC>zJf?a{qf9Mghs6$J;>2Nn0}L+T6SzDYQ(B7xJi{k%;$ghh|0! zJVxzfLxLxk1E9gM2O4V)FnqY0Xo6fn|WrcEu&Hzir$B9x2vB$ zYZT2*fs-9^TH3B#c>)d3gimAahFos+>UnOwhBaw59{ z1XrZ(=7t9NybjWZyi6cPts1nAiY2 zB`O7$HI2_Kmtl6v257>=%c~9;hXnWI-KEDeej%{ck5f##{T?{|c6hB39u&4BCBe8= zni1``{^qV@ES#K|r=~nGWlY~Z{Cnpn|D#8bc0E74kAw^m`Pjc4{cph?IBYc(m-g9o z=BTz0G;_^xN;y-G-Pmbml%L$~ldXEeYJB7}b5B`c|F>XWyQGw>p+7qx>ZIgP)7Tht z+sYlXNtboTCJOtK;yjp8;N|Np66=?)9F#d1{gRWjw#1g!Xm;%Hr)p0IQ~0J+t1E$D zUId;>yp_xUeX?ez_{|V4SP%K;AFz{yXk62|-@;3f4(hD8Nl zm8oM6TV6G7Ot*WetXh<&tT!zdNtuFQY`Iga@yz#_t#aIL5o;-%b&O9=tGv$#u6lne zFKpMY+ArU>qvu@xT4~x{f2QK0rOrXeBF%VRa2=~9ymu=258ahl2eCDFh+1yvQ&(Tq zvmhubDajFY*WRja0PZ5AgDl&?KU?m~kRkqu-|v$&*;48Djq?%eQ7q3LMD%%-4N{Ks zhdVFL6>L`)){$8SppIR2x97RwKK^jSArt;K{DoNN$z$_pRh1`~bIDPmjy&^hPX{0U zAiT$i8~(v79Na4vg5*KqrH1j*XX`I()0umuyV!A5@@R(GRe|}( zSXP_)slG#B*WIK=HZ}}zsM90mM-cb}djM&wPqW*|xJE3$-C7zTo5VP%6j8R?mCcNRX4 z`gB&^`djYSgNuuiU+UbCy)o9UATYK|(pe90?+aQ2RR4&1OCdRa@Gj3>0q===33Nhs zY1rEgk8A(u>`J_TrUn@KJtEJjYNlOh931}jV`L{#(u5w|CWl<` z$r`K2D!i!MqL_{tJpDEA^Cz=g@#2{?9$f_#+6rpcKl-V({~V9HacK1JcC~y=D#1v` zv<7;-zF}{}*fT9nbZ<#sPnkvZWMd zOQ}>6MY2bvK~l+8uttvLRo*mo9+*coD1Qq%<6+m3U}D9kE&l)2Q8&_M7W z>_+hNEw-{V5JNfiV~bIN)If(Skc6lM1pJjw3yLc!=ZM(>AsYb061dkXB?a9A=hMsg zg+=n2|GO9J>Q}K3?(dd5*1vesQq*{hpdd9e|8l75+Q5GrUjmHehw_a$Cuj_s*S~%A z&1?sfNjT?`5*62cH4>}8VA9^ID}esC9aY)}-23X)0M!2E7y%ts3$Wa{=N#RCAR!Fd zV1jqVGXJe56DzA4{FLf`zcDV5gI6UTW#fEtxSyY&5{|Md-UI1C39L-8w~&7Bf6;xB z?{lDZ>GBg9HE3BU!Tvo9nF@#$h2VFmMf7)Bd?>hhZGLDgi-r={q4s~5Sv1#!h=4%T zc3;CxmP?Pf{Cc2a+VYd*6rOh8nwe*3{(|vFFDXWc7oOcXs=OBvyNRjk@rOqR_XB4o zxEaU=NT#Sk#k1?Hqer;`d$%GqY1p{A{Xy0@MO~zEKF7Y_8$@jy3hMJ)5QLDc7XYRd zWJBQA`*j3SC?NYPqQ4zHXnY#ntq&wUg3`j}l_=^!Fd3BK|DculbgqU+esN+gjvlHB zg8Tq6YELRyDn@o#4LimwO&Lcm&!p)3!?1yhf;Ph_G91W1R*`^$4$4TSXhD2)D^kj2 zvvL-wns9u<5aPh2`ZOv97B_NsU@!&OdRWMc-%-(y3M?X77z7}?(1w%Vx4qt>zqpca zG6hnoBGgNFv-gu&6s;W_%kS2(tMuwGy4ilo%j4F2HhgxT@c3RW5Y*VjVas^P=r|>5 z^U}|0z>G0Q8Hc#xf_N7&Hd5;6TOS{+BiJdiU?7_V8{Yc*^-~&}$BvZ&35=e4RE-Ss zIgrNU0{E=0faJ*lbVX#1jvG$~8%xk8dNdZ1A z)>z#he0Euyq&PfSY6^IE zF(KDs_ZcS>YYy5z9g<%!xZNRzk6n{X;{nti2RU}nIU^pFX#(a2p(Q(>8NbHHU8xP0Fv+-eAR2RQE9XEnt1P`eF$@*Oa9=m^eajiI5g zTRAK!F0LEMd(Tfepk(T0jK=w6oG2UvD3Fr&S^yi5?AiuFd&At}YVjC%Ppywk8K zSL4VLcJCt~A}L2}vCr+8I7{hMF8d`$*>GEiYYAH+2$saSREs`++Fm{$G${k$M9L%a za~DNRUW%3Jd`sJ3)!4ORHwaB;q~t*dk-`SX#jRh%dETOnUfv2Ir)6&T7RZ)j!E zOTUFet$ks3oPd%+;jF!IW4sA&d<A5Kbu5AT}D01#JQUSZWB&Y_%~HiGqX#cNpM_FbMiFl<0C4hzj!HzPXql3F z4lAwfk0cf=oi$!$&_d zK3+M=?UrD^-bs7S@ksuk$0M~gN84#a5ELAzukL0JJY&0l{qBL zUjy5gc+&ngO&Kz|EP@8upIs@79CDF@Mn=r)i*NO#MIRQjY`C;q^mEBM&OK)5{B!QV zG{hnlQ22lSS=5F!nH*=2WmY-{Pw0M-cYA}&h@QYD*_cjXp~MgdNZoCyDCm?+Hkgqv zANGk47!}U}>uPkvj?Eu6SFgky8Okp>Xaiy^1;%`vz8!%o0J=QF$3h+xR`zZ|%o3z~ zkZ4bGbzQav!F#@W(|6=8c!nz}gbGd} ze!_?aE5Vv0R?dy|;|@St2>4+0=iBCJW3cx&z$5`Jr~9i5EpX_Flbtf?2!tjJIEDTa z=&j-)YWb6X2B9Ys5;TzA&yV*Wwls!8S4Nq{QG_NoKoFv$qTDhLS`UTKqJJ2Vq{VHv zn}cKps1hj@Xv@%j)94<(i99?FxClZJu?)UFi0E4kili9Ww(#3J_yarIJuRPAA<_<$A{MfhN|KJO?~#cNgv2=9vG7vIL}4 z<1j1LBl#adCq)*Xu(sX&%-@aw6-f{gB?L!A1c2>j0yWBex$(!R30oe_AIdp7Nw~!p zTvaWpzIIbGR}oG5E$KU5P`O)A8p<-v9P2n7WSo|waMmAFN~V=-*sN>K%C$q ziI|0jNNferfk)!2JjR5s;}S-3U_2^`CCG87@nhg}<#{EFDTU=N2< z{~55H7#}YoArV?|=>AvZx0IpLNSM-`Fo|j8cqi>TCqewy;j|C~b&tj+h|GWFI*P+G zCjf8{Lz4cn$)3;`iL7HBS>zY|rYG$zw}nx)BhRGQA$chF0^#<-c6*8f9x*|Q5u}vj z+|Wh9cUHUPjN{nW*?9{=&O$~LEMtd>UbfP+DP`rF`PU^FWw%wtYX%MEPs#=Vg}bd3 z7FzNYoU$8bw99RidG|40cqV;Qq_`rS@vzO{S_wv1D$?+Vn&H@a2=J|8i{W`GXe0PB z#XR3T(x%25t{`uQ3kHYBvhl&IKoO9>c5qZFxI^edSmKwS+`nJTan%0?P8!0RDXzrJ zwGd)h`)1k;K;5I&c8BrGr>AsC{z3MWBwDTz zcNBgwij;){oiv>lGtske`!FhWOu;oDWTT0;$1EO*(TC$AS`d{r!I6 z)=>PkgDLI+k7qysZ)i?tY{poS0&X=Mhxd?Hd^QGK^Hvp}Ob+3S4NG7FtN<`#8lZpn2+*;M;@# zUYDNKxA|FDm})2YhAq~A^uJbh->~teXw%DxJ45HkzI|QZh6;G7wIC4N9Io7|J!8o5 zPCUMCv^JnqC!*x5pJt`B{~Y%GcEz(;$bzjNfp_nMO;ly0ln*{@m?a*!V`JotpShdY z-1+3?I9mY%10@KRWsfw0pSidgQ*?LyqWuj+;^-md$emztbK-!2t3o0^+Ln46vw$1u zDBG_Y!;2vbjtK;KhB8oR>i&0l{wCiTHUf0Xh-i2a`8_fFeikT#a>CR zmZ`0+Eow3!m)ae;Ar(VAg+$gHCO5F0zkO%o-7)Hq;g!;Qf^UA!*+5W4i8oXvsK&OT zkl|m71CP^Z>;^bT3LMSf)gq0A>b3Ak6PE!?;Basf4f;%vBXx#Le_zfx+7fw-qo1lE z|Fiy2nX!op6%~~gCPtE7;0orv&%le%RnQaB@z15^!Z-E`$aZSljSYL(%MTG z#=jvMb4=_+28IV1k7W-id5k)U@Dd<R}=Eci5)c=3v8cTM;^SX(E56SDt_ zs+AP-!A%kBrx#YG}_>CF0)@yNP>-{Hw?bPPpG8J(Q)zGEbVwk z*x<9?u@j4r10I3GunO7r$KIdv*gBilzkPq>dnR?|o#2;ye~VeaS=Gi$H))eq&}<;WF?Quob~(6E!R(;X?1dwHh!`zv7fBn2ZH!90sknnB=S z+9wz@E|o~`+O`FBu8D` ztNvRA`9|(Oiq6AprsqAvoo~*hzR>y&Zcw~l`gXV}Cg~u8TM+_d+#DREjw4xz_?%AE zIA3SOLB0(eUZo@;n|7ETBgP?PgX76UF=u)Y9Z~^@Z+hnheHrIBG(65$ua8|G9+k46 z=yNW#j^dlR+@Q4GqfRvI{qc}>({jhPQmbn@@1ETSRt&_J$?54I$P>&tqml|f>{&1j zeDB;*1e`#^LYNFGXS40LfjJV^vq+Lw3aO0w_cjeg0>CN`x-J*FZ|0(%G2BY+AK}5# zPyqkEm|8VQgk{4mvI+en=8pRhQgCzr?Y|+Jcs9LZ?OGa=iOM*xfx_9&f;rPe#@kPKl zq|-&}yfK*>6bh@kxb9*HyN+_RJRWg%fv2*1)t>0DXugmV6)91B2L_dZK>$GRRJL*$02&N7| zdqfq`xf|>D3v)-%Oa~Q*!_y9D0dAMPAhnbu1hn_{`2nf`SjvWvAou1m3|PP_)7=jr zO)a!=e)@A%T+bq;X~zUmb2ZEYAh`!NZWJi^U~)l8d;F2A`~hU}D^{)~0u@5Q(8!^f z!0c)FzJ1=94}n1sg!hY2+yp8r`1J6i)DNf{y@-<~OLS-ulgJr1{38CcMeMAdov znIxnDq>4exNowV?aZ*>>!E`<@H*rx6#We!#K~RhESXcqMb--@c*VoqrPnlSk>u9=t zRgwqnM~sU=zflI&y9Tz~gb*ts!HyUR7$)W0d!%seU@fttCbb)G;Q_1)Ad=RM3ARVY zxL`y3mQiY_;07S9HuNOd*57OeQvuU10>P+xV=2P->js{It_$z_b&qdHgr2JtR=;k1 zBGP2Th8a6>F6-Z__PH;=suEgLlxBE9mzi(nBDdQOmr6g2$fz^D1;>$Yw1EFby2p5a z9{_HlZ*d2u0CIGo@XyiZB;gnjb5wO6p0>h-lZ_J41ixtpmQsWyh-Cx`)ZqN!|oo{F0vJiTZV#C%%Xk=_kP?N7_FT~gQ{b{3^hapMGb zUpay&)KyOLbynxj5qsfwOh+n0bwwEII&V%fBby{%+$c+uG7Q}pCpjP!f7Y{(g8<5& zh2LsN#ddI~^fzqUxn09`%PaN^`Oi#buW(Lq^Dw5n#yWIz*6w~Lugmr9iGp^RL+=ry(lN6voUoqTTP>$+toZbI^%<0vO zf;r#N@X}m* zqs-GID}f`K?zN+fMM-AMc=!P@`?Pz_cB(hp4h^L-6^b*otL+zn#W87)lMEZ_$a?#0 z>SB9gi9$NNc&MV7KtveJ+t#cd6|h@%R?J{X+Ivq0S)lsra==PApSfZiH@;px@&qY(J61hCn>i3K)2fcl(K2rQfd+cmy-%T%CHAXU!BJMM8#m%NrfG zQzdGJX_j2pcI}V5X!`!L%h7m>i3`oS!IpYqryP$ggSl?7eu3UzLK#@g$7d}Oy}d&1 zfAiGTcZDPxDSv+aUEN7TFjGWCXZ~{9hV^z37Qc-(bPf68zJl zdT-WWM%Gl;b_G*&Gh>QLL2uoX0^s1gJ`%R>4*S=-js5A;lEK8_i^Yrq~F7g>UscgXEpw%H3CA@hDKzAH>Jf zpBoNQLi|QA4m7;Zaz6$wM(b9+RsYluL7pGFY-73QJYy5|gW-)ecjTpg9AWvN(wO6+wq(`m4l-{7G}&hB@Zs` z+xjpj{>k_kTpE;e8{FrjA&c|#^S3&skX4(9$%EkwB4Blt;%s98jwuEnv4VjC%}9kI zYJIH&x5b#NEAa?JE~5KhdbQENe5YQ=;O8@FN(M&@?0_x9ht6`X%X1P8Er(LHTw)Zp zJGfo1vybokT$0N;Zr$}WIOb}A9wd6@D9Z?i1E`=9J_OS-lpwHAaTq;onx=FL0@X$M z#ge-K{S2UyI-e?6rGjX>u_@{(ue~Md7S+!lCiAYk9Ua4pb zqkC#{J6Gpf3v^v}WAr<6)O4|g)mqMt>H7UGif7GEtk}6(MRsF>`k0V%@XfuF^>oWd z*Ib!%D;<u(Uh0NcA&Fj(@}c0`*1 z`s|IQ0`vsTM0}ROT2h8Hkkdr(adsbC3Vaa?fy9_tS{k0StX72_&l-s+h$h|o&)}}1 ziui^eK&X}d7#Zk+AyhOJs1^Omo8itS929g0+kgLlp?y#=m|sSQ8^!Wv<8a((a4hU{ zJX--+O2%!0le?Vw88|G??bYb9=1>S<;^N@&!PV4;0+g_#@r;iH!Un$D4#_C#I1+9y zFbqbHFamGmo+IALs5oQnuR;;T?mU(y1$IHZvN|1mr2LyNn=;;ccJs^YPW+)6U3Oz! zt^Es=7{|JLQ=dC5j4ogN?XoZ`79cC{eJUWqFZtxM73gfF_0(6Na2JKY4!le^ljkjV z{u4XwkKe?e(bs>&bi5T6403dDR3aRgC{};P5)Fb)1&OiRm+~`Cg9!_2&_7d|KAd z{$Ab>mWFsb_E{GDRP(@Q?ee&~MwlnccSHvsL7H2L^#a-3cry&|Gys$-0Z4&+3N(kOpJ>_a zs|w+Pk7R{@IjM4F4AkFt{Mg%0Y;j11DIR3H#vf9^px1*u>}^N}V0)x%0E@dXwIY)v zSQK3Q0??)+BSplDE8B168mV}54T48t#(P_L>0 zV1#|vMMxRU0H#U($1~nDstfCU^tedRkpRAc!GQ1RrB7m&3-N%!w_!ww7!GxG@LWh6u(kF4M@rbXP>`{bh1(Zn_6Xhq?oN8L zE2>*?hDzYSPP`uD_JA?03iS$M^K9|4f# zp@>FcquwYg+R$v;icgN{ARkdY{w7z~dE|KZ zQ=4vk+oLiJ2dLA&&1ABaDpyX~Gd02zW_L+6q{_9N+OP#)d)Xhus0 z-9B%);-M*c+i9KOXSJ082_!O3KauI%T~_zIYNqx3x!XztvEVr~BMyl|KfVG^TXD8% za}?s)r2vQ^#z~0Lr(eT4!7)f9PA~JGe1w=;8C+k_Y{e~J1C7$>2w5%wbt(X5(AJF3 z$Xght$}aedok6U$8|A(Z6G{snum*L?yE+n&&L1E)Q48s2TzS-3L6!ce0QrG3 z`pdWt!g}bZX4rON%iO}h>bv(y{9+TJMNaV_ElGQ7|9ZM;IYo5nI>!0jeK+03r55QY3^8Gg3yeDv6uvFsNmdf4q!B4;#jme z1}h~*mRAj-{Yu#rc{6ga#RH8w_^f*^Utn&7^9pFo_hbf7G+W!c?OVoWBlG>$J*-*i zPW^r5GPnp!ApEa;K}$>9j(%6I?i5PnVxjBsnjlaL207eCBaZke5*rfT>qsW)SXs;Q z-${=bw+uV*6J(~}J3i_ls?aO^_Og))=p+?22GjBpBs}Mwk>a#5q%oT*U#`(0$_O|H zr^&KMVlbZUCNuSx_b1HW)iv`RytNSZ^1~)4uTXaOLXK@Sm%~nPd7vox$$5HD2xs@KUl{rkAcqj|qOhDV;Ipow{)OA@ zIaCrDjJkc^*2bm?m+!S^4&wl0s{_JN(|%0FzJfmQ$hPLDCjCprvPbRxKAfd!U6yng zLky*nvTpMz+lPp{_4_3_dtI}xkQcEuHI4q3|F-JT_@%x^#)ai;KeF?`f={r$yr?!! z)N<^cC2K)5E;3lJ5G+Cq1azXBLTcpm{Q2|7Y-#(x6|hnO1lSIn4e*C%V3`ow_xY9O znK*=QEE|xggJ5Teegf%>4l*V+Ev=wr1A|kI6UKNUCd8JO5i3LG?hQ9AV_#fw;{~y? z>(8Rz>eF#|wlAd$Wex{)LR26n{>z?YJZ=W<)^w({(Fj$}CdV`}Pdj!|G z5-@wBf3vb0rf%ktciI0k`qe^n#arcP&tqc7(s>pJ+R?bv;i|r*y{2I}1DOegbBy+p zphN)-QUxyqr0y*%Mt-6y054}X&T|=P2yN}{(Y9=d^Z}-=Ke&hU(!=;30HK(kv*q&d z_EmmpHu?ChBK&e-OPJ@Q-6M?-2WX5Hf<$d@S$f;c+{If~^2K0d(dAOQ-W;8;J*U{T zU8)C|RYV?Nh-iR|Xt~tbfI3x%x;VgDU{;t|kyz+6HC9qp)jjfSUF3_yLFmEQIURc# zX(;#dI=kdTvxQ-#Pa>dQ5VA%P20hIm9OPS?&gGV0<*|hjUzDN?krwVg_c2IjI51Km zAJ`iP>&AcLlRqvHDJnWsF^Nkdy#JluLi5yHUKs}p23(&$-5`@m`nc@`zOXUYjre4{ za%FO)>|M_rW8X0ryGx@sd-(mCYpzFw-!d9w^N?Y!s29weGIk>Wj@@VMCi8NzyPFpN zsh}skGCXF17BcbW*(iDSZS9U`^tPm%&rgkvC_v3YVj}t?uVZ1;8dfpyw{dx40!wbU zy}aslq5QNlC(+me+k}ih28@#ZzwPbqKcE~T#(t*19SmiGXo3akg;o%{#wj3&hZP|G z287BlC8cX=op29ohbWLoP=^*GIU!1eFd4+szt?qdwLsh;;AZ$xZG`0r*fS4bE|LlB zXCUp~`gvcH2$BsQ=7L#hvEV)!B4Rk4KR%N)V)?X@UEz%_2EiI2!7;^58*6)e!pnl% zm=+>lBwn3ZS~5f$y`OYFX9GxiJOSZFp~5r&{(2o!hFhR!;E>SZZYjkbZgTOW4;0P4 zI!Q3g#KfMPs9K(b5DJ|fa{3biH%2ot+!=35xMjE%HXz?(#P}7$Y6S_c1cL{HNn6hB zi&aZY3xP7BB=E-hChh}(Ta|$2UfaEC0EE`!6&hyY9w1;Q)E ztXgCewuD@%{arb?04h%*=dH-d$g*;7C~pZ(fpCJbeBdaDf1QWR3#r&p``tvUO2{ba zC?JE7f%7u)nnkG(zXZceg0d7Tbg9uXtU;EQ%PmN-880#K*f$ON@hqxmixSdQ)NK^0 zWGapuVTJ1rjBlZ=Vpu%m0IP5WeIlpO#SC<;7a>Ft+?BY^zCNi8-8_;YI(_{n(MCcN zAhKZMd5fHj=w3m4hFQFrY4M69k0lO0{BEF+)Be{nmm1_T#5UmRR|2Tugx+m~R}!2U zRK*WiX4J!`R#vPaO8~fDyc-~1fTzO*h=O#2A%3R3H(-&MFEF5Sz&w=e(Eg`CKLUjISz=7cj{Q!Iv(_c^GroN5wrK zT6+#qq_MtC!Nqn|)=~h&Z=&5Q!+Jv4aT=^Bp#L#glw$20*<0h?6zeLhhP^zCHCN~v zTwJpSNNQ<=CNI}rRv^F0mRx&U+-IMv;yLN~$*3wWNX7!9GUv+qHQGuY^7@c;Sc zcyCt4+Z!I|ipBEFy&0iU@V6e#pBLUF`|q((9R|G+eP zCuC>mpuW&>k5SMxB386Axhb?^xQ8)6CdabC!G=h?Gz+o|wtpcUYJ0FN&)D1I`!+wR>4&Bcy4~ zvvoz*E7!-+GJyx1=J&f|FSGNsXN1pzkm&)%PesZm6%|SwFPhUW?n^MOj$;&Bx4moH zbhY+dNIpIveJnwbG>)1=_@if2q#7Qrhq)nZRPUDi&kqf#U#}DPm97(ISXBmkTPK>#J%5>>{{E-7iBJIuU&gMJw$s~&Q&12)|TE_M5M5p$M4k%HrH+j zUF|iW2L}b-=mu|jyUFuE5VE)7gcyeLu6Vxes&FXoo8VPuoCf?ng@Z0Katn)+atrII zXW{BL{^z8fcQ(`9g;|?UBfe6NC#&l26jOztF*m`iFtF4L)Zs8tbxf zLb!NMAR{Qq3M$sWU&w3qI=@hM7bZsKUk`SwJ5T7E$=!LzgBe}790P}fbamO!GSbgZ z0bnBUt3<~ZTX46`$5OzzmDkUI#^K)V1TyuwR)vQdmuUljUlxqj`rn@_jtw68drofo zcud$$K2i~Un0A@=aKX*p@rF+#tb}8O$W$Eit{)}+&Yx?m9qsgOdPiFko@D-6c#qgk z$12|BfhLY`pd6&!_6mBdqS{PR`nWtkJ&h-ZOS5{r`#-KKba@PEhMQ}EccLdx555-~ z#<-+7oVd^)Wkk{V?7Yw((-aL2=XsUH@UiLVlz^zm0){AWKP^o{^0(`UH~R{ zlAP4BbsuLY=u?0%{Cd6D=pN5YF^7h0c3#aBm*UxN)&R%EXc2Wbth&p0&?Y>AQ^df) z0#5YA#RK9&F_S_Hft0q1^2uCW6#wT?kG@+VPGH;u&Ur<}w(>=b`!D$ckL=J?ZUl1c z7n?V`6A(1U>Jbz8m8`s=-(85p)q1-nK=IZ}Vgd}!Trn&>2-JdU85~Xr#wr1ewe|JA zw%wIlV1>X87B}v*i@?%eCqNbQA9)a0$_`BD!Pp3`H>Y+k%yb53IZr2QyX9*Zd@)UE z7j5tA3hlQjvEfEzD=fnhB`ES6HLyv*6oYe!HyoAPeE8f75!)o{?@v|%%p#yQ8qZ=V z`U#iNaz98OxF1%5VN(i{{MhvBV8zS3*CL>ImN6)?J@r$vA`Qk8Fsx(Y z^*CSP2G!p>+r#t%eaL0TPHO-EsSK#w4g-D^H>>GJpOm_`|A3(%ENNeOt2EN%TK zu{BB>a%G$$y9|{Ks@J>7*-)Dtv6MTe$@+rlK%s4$LT^qMyR8VlKqDNeT*8n*{be0s zgb_)}o~9Nv6de-u`|4}_c3rXabGiPZxH@8nuz@vGGx=St_mfJC{SL|gYhFb5;zya zeR|9RiL(XHQG{%A6!0DO{s#+nNycPY<#YJt|8>Xnz#ncP$_>)M)jrldOYMP&XIAJz z^#cqLBz4I!7LA)gS3e335wIp@33oJ|gZO{FR6nd-yhKBS%d6?3OP_@?XGb-%CAqhm zYmLYor7HpgDyJvDXyy}LZ!sPO%I4d^Vqd|z!ouhmGFh(k8K2~4%NamF6a!O} zL`HNkW)_@K^^@U36adEG`u4UxlXYGX2*3vb1T=tzE`l(`zir!}yW_yDvBvG#6QKF? z6F043_0ayOj2H${h|W?qXsKZ)2ZTwT2Wo0eObn5FPzup-vVrbb0xfZL^)L6QW@eUS z7goPG%9Sv+7UT!07mKlHU|kD|90_m|5vdCj5Os&O@leq4p(8UL^WqbLMs=cf2JD`& zQ6aO54|xgo2|(aSjnnG{yeJ+r`_>OHFRTsBbshN~ZY;5K_}%uC=q3-xJ9J20Id~5` zSU9W=72Z!eW@5q*aBep&VqwhF{ZMj#r0y4cz4kWuh0#?Y4Xpsb1-47Xy%;`Iv^b5n zJON~^4ryEfgHYmUq=3FvuUiIstoVh`h0sJ(C;%)tzP)2LU4p!tR4rsiHKc##03>dw z0a=PhFAI1YEgs$o90W*pg6Q)j&sh?z-jh?VC?w#?x0)!$z=0y?pGb@{uQn5w^X;Ax zFl__C^Hl`C1tWGK?Vw{4iUAQ(f;oFqDgdo0>_G<15-t{BTyS3w%sUVm_&R^uV|jn- zxeI$9y^x7cy?W0+^M^R&js@=^IV-Qk|x+* z(I#|UT^Dq6^>G`j(9Miz_=Nfr(Rf>)-FUT*ml6keH0ebG|U4A;PH{WTTz7S~#ugi$y z!f(lfB8#LvZvfQJPb1-lMlnG>n>E+>=GGcfwht@&@7y2SV?CV5T5)x{S$%bo_4kwN zhWSjRwJ%bbxNBCItdRTk=*SjF_KJ3E1$NcQ+Weer($BQEhgnNMb8B*0n(d*ww?z}Q z7etT;eEJEeW?8MRw0oRhCmOE+S~MY50K6WAxp!4PxgCBYyD{%Tu4y(EfIFoS?oLjN z?rlfeRVf~o-D6pa&!5u(z+FKB(>1PKmc}tap|jVo9n;6kkoVY__ROWi!il(FI81&& zJ^ER^>SOJ@oFNgvn1xCFQ2>@88eZqXQXLd*F!#O<(Is3h%+;{R_B|!bJwP;nCZ^on zw!sy>X#a%;m)We!?qVDgLiHhoZX|zM-zwivnQ16ky6wKu$(Pj`aG>iN`Zl!PfaVJ}k?DVf&M7VH^ zRZhXiCdFl_V5z@=B7>09 zJGz`Yzg#)w3aeIToK|@#vgBsF){+-dM(R#zwnsP*70EBpYJvxI%4qsm>y#mAMt+FR zok{MCBB2`RBU>3ME@KtKlwVc~6ZK!`f1!zLvgc7yWMm+WesvR0k%y@DN(Vl97YdeK zujl1UJv%m=O>8FQXDc*!0|6lW_)_!10DRW|g|YC0QnK@Xc%8OJ^<1Qf&Vq$0l`% z-BjM1^4ooBZGh3ILV9VQG|3i9b4OG3CthX|ip7Z&Gt@jnQ}ko&2VIN**eS&^xMhFA zomX@Z@uD_7V+`DAh*VjkMl62tmm27o^ zHR{u#;Yo;Hp1*jp64h=ngk|%if$lqmhdrD>Eu)McdD6PD(%5zKq)Nj{W7~?&ZZAD= zXtv~>yKteSUf=3NQ!c-B6NXgp%9qE7=;cT3J{RGCfO*g%Wj;12vg)+_M zik40pE-;8jM+Q=>sI3cXI;^Dt3b2JX<Oms^Xc-z@bQXu5eSJj3@SUAUQ)c$Jz{c zakz~?X=Rd5?CZNMGf}Nv{l`wO;r*(Z{`8j9-=1NjbHb_q8{y7^8+lbyH`KGrdv#AX zw7-@c%zP#&zIOC3hq7}gvzCyMmza_u1MQZP<5vMLjj2z0(lSQrY@a`JD!cyi)KoyA zQIeX5hDKynQbWJ&&~xoq)Y)Gf#<`fhJreI>B-*E(liR~y8&Cgv{B<62w&ROrYpB__ z9Xm=3mgfsPgVlHyU0iajdgz7L7s@g(KrA*TC5el7zrc{6DG))~p(jtCU;ww3Rd|)X zD~3_>4(41?WSUrhp46YcCLghHKF`Y0aX(pBLcYZy)<2^cj<~w!J3L8HO`*? zlh~hK?}PilT&`jC&G*aiuRHPM%6WUrLP2b%_Qwz3Csz3z&>^Un$mN2R~?N_4rZ$JM-DqKK9sM`YTIL zo>rtQ+G-M;tQnMPKDaiT({}q9V%|`8KXps!Wt5tGtl`>*NMB~gen1PDI!pY8EPlGN&>P0tU+s;1=JBK_en?q? zB`U;R#RW^4cTb>izinxxr-X71CyWcqUk#G)R3)r z+Ue){a8tCy9p?VLB)Y-eiEoDy>#idpt_OVHFFuv1GJzO8@?PA5<9Zfp_A;FC&Nc+bD}1lBN$GK730r;h>q> zrYrlJqTEyL7iDtxiTS6Ml^ry2o%~MvJR{)+3$!@N(;ma$PaZM_j;38Sc(H_U$>aC$3k!?G?%`|06D94J z#^sk&TXSsYZM(xxcYuZJ_2Fz0ZqLyc=izqu7pL~?_-1FK$B(+HsTr?r{T}oG; zz{<}2`5_t#iML~Ac1shJ!>Ro}vp+9JGD{~G^+x0_|Iu_W4s@G%uGoyh6W3cW1LsO!Y$P%o|wqitFTY? ziJYr6$!LiYQ&QfPUf{T4PJ!JnDmmBWwmbX! z7;M$sqK56OWT)HwL=p=LXL&epIwmhKPwh!|w)8KQi!;5?1D*03uq2z}b+#|yKAhTm z@ds=Zv|qO?f97ob_sgWpfV+SgvNYGL=hnyLw&vh-8KG)%>fdQ# zT|}D&o(>tBfkZ5K{ObX8bMrz?_qkf%x=Zbc`&Ctc zKHND8A>p)<<7Tug$yBC5ZO1hWuDn<#X!IhttNcL{1wO6-CKxak5aD{s|2t8Yw;~4>|(f7dGw6o6zpH zlh!$TvYm9Uq2=;uDdc<$lrDFs<8Btdw+#t`Xr__0Uv6o}j1ZBCk^(G%mA~9}6E-3y z&3IhcKcO0@Z3?iTh+~Z0X3ys$C)v7d*FiToxq<5k@|TyK3E7^-=XurME)HWCu_YWL zj^$Cl<(p(-k>bfRFf!J(v;>Te*^+dZWXJe_cK2p2z8}nJ8bLTG!guq_m&aybv{kuH ziG#xD%xz(A9@HfL?3l#9eI0L-@`yz3zl8d|s`XUn0tkE*ATeAtPk9(? zqKEK}@r59s&=jUyoJAAg|9-3}Th3*bdy{N(lozG=e7}GI7JM%=$arV)18@Ag-ejq` zkVt)Fd2t%eZtA4`x$SsPj4x~NAd{YcRJh!CxIR(oeOGfw%X}Z) z7m6ubn{X;Ee}32FeOJBm(mq=qfXZ9_{d{YX?fjsYQ{IEsH6xqUU3V(Q#*;Cr6xXEI z!A5!~Y$t)hS2_9DqhGfBxC&mE*t<8H9FH%m`%A)^*2qOQ9#NY{W#z&Fg-`?c=S zT8Z5?EyC1an&i;-2X9!ID6VPsxo(@x3 z6i%L8M+}Rdhu#Z+i(Y-)Lnxea5E0-{_q}9p>8{LY#U=`4Jeiv&TbGzG?+O%%G1`4o zSTM%JJY7#_v~+DSi`kFuTeouRbTbJu@SS!(px5%l^Y>|^o1LFG6byEZjRn0M;1z1M zWn_19<=i9`6YWR71Afx#A8%e)PfVY#&OXnmlKRssXXcT3P`1ndH5aP9qfAa-6lCCD z>j3$*Uf_a7Hv<({-lAH6mo_~;{o}`v9!5z$qN@dCOz|BsF1xP2o|*!G)=k`OHPu3Q1f{12 zNVc|{ZwA{`)kP*`y{J-O^NmfrBqi}>YOH~atOTd0@Z6pv=y$WTH&Tj23J*Vfk}>jy zy02JHF+bVZE27SF?an+Sl-XS$X_X~b+}W~Luf>h)3)eD>^ZB^e>wPuPgKevt)s52V zG;Rs}ecKOsTUdUayLb_IJuRx~MHy1y_KRp4n9`|;tN>! z{mO`~3IUHdO5}~PrsXb4mrh+T7_>X_lHY#TmNPM%!Bcxf8QmT8tWIOi<6rTOf1OdQ z`wQnF9ItfAD>CsAI5JF^nUO(F!67alb75cnA^eeJ>h4Ie5dD`gUxHblYZ|(G#vhiN z_Yyi}?KaKxIVo>tQ$(IZ&l7*yc%5nk*S#IXSv-9hNK2`%`?e-S%I84-F%%8MYmdDY z7rM3XNZa#YU{w%%%2^u}?JJ%OV3+wZht$$zu;%XN@knd8;R2?oL7^*}cV;Tw=ugms z$uz#SuhUs-zHZ==x1si=rV#o-oc5ixtw{nK2S<<3q-X|-4sdkcbM?%<9ixepUA<7% zP_q!|UU=qoPv)~1AALj5R|eVD9@R2WR}8$h(mQEw*G|28mG}n?du|5WI_2@=A4=4z zH=DSbaX@OS&xwetku2SHo=5%Eo7U@d`%}qTo(MPo`eompt$pMi;&?n1I<)4UuDg3^~6}E`TU4-;h%|S^;cfe zGkUQ*jaizzDvDU2`fg?V?{i9jYG}Z|WUXGSBS*+jCW<)~e`)!qOYL9O^ZIw;?YgEy zDsNBm9KgFB)Meorb2i2_h!87d|2p@1$@tWFN(+Xo*>11@clQ0_%b2;e3a0iegg8CD z|M^1N6}NRelk&YM%6V1CVpPo?%@`jWJJJS-UtDMr-zCbr4L``Sy;x3dc zT~ye`?s4slTKbvpDj6zNC!e#vXK8*qh?}M0%S3pU%BOed)gQ`oc`C7$s^9Sy4Ez_% zRJ{^nOJ&DeSo1?}{68a85ksKw{~nYt%&IGT(qh<;YUjN^p*?qm%Q$2^o6ze#!Zk=M@ zjc>(I_Tzh(togV83=9>2RLb*R%^f?L?FJf|vkcstws&+!7mR77SvA!cXxn;vgdP~? zc1cE+wff&{HnKb0@5M+Y#eRLOk~60pEcBb>!UY{`1ci(w`55we|9cu#@~7v_0+mka zNc;%G!xH-UmFlcwzIaa!@;&dqCuy=YkZRPl{ltmjG;4tn4pGk+$<>_(jehGW9&_nc zlX7cB>D1i^j=z^>tFbQqw|S{A$l6fvOe(lpKizWcM`K?>G{1uThjr=zTf7~w2~23G z%36M45c>T1HZtIvxv2xIbH4kW?wwTEa}d`a%Dum7SVdw$?B6LgdM_frBpw{=_)uN-lwL8Kb7Xw`gj2j|HXSAE@L{eI zR~&1$e`^`CpNorpO|t$!G@tdQCm`r_eYhL!F#bg=F4k+Cl3+~x-M@RbX1DNrgWZFz zfdE<*<`WG)YX4*=tmX@h(%Uut57w4II+wjfuQ`b46X4|_t z3r}h|%eLO}{mAj}@s)T?mL5vG;z(mToXdFHxVv>%0e3~F=)q!uJvE1CB?Sc;M7N9x zOuy=rff=#uE$y$)6E&R#qMgSy9>0 znx)nxzd#rAbD$taj~VFG`^o}CxwW{x@)huQt>o?amPS^QDvR*=C?=pm;wmpBpV4-U z^`MkAxl}fPeX-@nZ01gV6H$@=bV~zMvNI3j*hFg_Wj^7BwbJ!dU$y#BQtlW7uR|LZ z@p9RCZ>1-{33$_aM&lnijN2gIP=g!Bgp({}8#mpT#v^4Le-2(JS$fv*#}-{?+rt=$ ziyw+R&&33^;%jyby*KEc>00}A=}(o`o{PKsBAvfljqU2SQ`fWO8rx^3R5U*akeb5XxK$67rlh_P<-7kGATrsm<(exoztf~ z;Vu85X`h5dVYe+AJjpw)uBoYZhHu!9Tpp8UHouwlT3i@+TIJLC{7lWu_gecb>PK!f@3l2o)yls>cAZv^W&n(HpNOVeG>hw)6*szPr1)_BTUfIHyD(RS*fUqnd=IVET(|; zM?rtZCh!`z)hY^#QZ>2tP_!N1^?n6LgBRYDY@sWZ^~2EBs|!<^1%s3CVUhV~drF23~`~y1Kf0P?Mcw zZ?um!Ko(OJoms#rM{`;iS+I?6G~1unJqzc}m}un?A$%6ggXtC@%W@X=^>>%cG&W0| zHlP|jDk*q%&hGDX-14w+ReV2B1S-nN9vF5w=Q7$g7~W_H5Jeao|D9L3>ZMn099g>l zYIx%#&BKTLt!7Nu{ogVs%d9E-i`T@F0<5ys&nP^l-DuI2wXiVW-FncU?u1vcxWW92 z*>X9>mY8%+ud@?8Ce(bk@{4~oM{6UOB)*wq#~)`8R$+Ug$r^ROlFNMAVO5*;jHL*+ zd+w05P-{MC_TgPO`RPpkLw$W?=-19r?C<5y>st^kH#9WV+MC?F%Kn`LXVP+Kx9DZ& z(yJXknq-;2c1u=eL9?}NC_TNYUl3lpfxI-qRdn07BG}r=eEnWuk8$5LC~gB)%<&%V zAB1vv1`phTV150=slopAg(rgB=nqM@`XdHM<&6~YK6nV9M1{Bc0vjoGT$sS@CCn11 zr%l=RZ+>n0fokIO1#wE@-;8)jNmF?xetNN+V$0cdO(~J>CXUOlx(G|!eBG^eCtfPt zs6AS3;JA6ky_H)iFSaha^0A~e3Y)iKALyq|(+?@}nF7z*%fP^p3^013OISYGq6n#V z2j+krgoG0Zdi_L?VdhmH_z-N8{|f5F+%>YC*1i|SujE`WnroT2=HCC!LLdGj)h*Vt zc9Op+-Muw`m&5y=>9ay~*Li`M&``MlENsrfiGKfke%)z(0v1C7oK*)qcUfsHZ6gO+imPs$fMJCd(ktO z`MaFJp*4^cM0HO}R!VO5)=TvNJQ8Aq@h}M8oWfA%>@IsDbxK9!xr|bBXQ0h1GCa4XzlGno zrlf@__^!(bW6+pKhEv|sBruusWkmkWSQI(@nWY8zMr+oI4f|Oizrl@42 zviRPK7?d)eTf$HO>jrs^{687r#9GB+Y&j|=X1*q}J8J0Pd1u+NuG8#H`)%08 zAaRYrW+GL;3?`>F=m$rSF;`oN4c=iuAvK?Mr}9&sJ@vcIKvV~erbZ1DpJT6wVD(Kt z!nh$WK7$8Ai8B%)9Py#xLZg4F3m$xaUTED9ftNU{>qwDn0TG8PPcZ4OJyPsV&V z71x%xru1^;KBbHQO<(1HtfmO7}bW|iK)&FYEt}k7GPlZxI zu!qT*!TODmf}$^Tw72YeOr`?ixjYPBA9-)SS=!T$^jT_k3sgm_?@unlslfhQ=}{OW zWqiQ8TM+B67{`llyPqfACg%Qxzv88%2k&-So}CZ?5in%WVT|eL!+=emw)T$#fig+d zyb33O?vqeN>jhkb_-fVhw-WtS;L?f>omtgpcv9$*?Qrf)ShK>z`@bq*-&-?+Vhdi| zt6W@S!SFbgng9KHs;VTi{V%?<2bzoBK0nsCw$+)^44oW5mYu z+c{sm!U*Kbe_n7u3&x@^RI=^Nm|LyJygG(dG#j?Zai!M*q7f%@Dl0M5nU-R}Fz2P6P#= zzd1`=yZnc-<5N?00;fe>1kn5Uy+N#naPcG%2IdpLs^Za(1F znW!oXd^L}W#^p6B9$5sJV~z9o=>FDp6|P?0jwy9BhpT`h|S{arZK2~dBVmf`Vy08cL`(ICpiZtYrkU4BK`|U8y7fDYK zm*3MVKkMf;P||o{jT=JJ=k}`DC^*!(yblH=CQ|`8xj(OD8T>yzp^}n0awwBKG2NCJ zuK|@Rmopbut$)%#9HMOj9xOi`bb@2$KP27vMu_Qx9QGYYi2blTt$*#%-gV>?-dR)- z@?yB5tb!YY5<%}075`=NJwO!VaDbjDyljDukv7lh0p=KgIip_*pgMGD6TF_1aK49x6tjC@V~X>?`IvS|Ki6XdhNc&SDJb{K-+o z0lDSxA^TSv;_9OZZj6gd9nL2syw-Fbju;h|jizHqq_F~hg91qB0knPj@+D%7;J5eF z79sS)Y$PzJs0bIvigb=mhl_fl*XEaZeU>Hdr{4Tn!Btg+sx1sK;dRDMxnmGc(o5lr zWx$(}Axs+8zGDT+r3ThlDnW6lbV{0p*#sL2!IA@EEIIE_c-a7#*WVnre*c}|!TqV( z9lHIu;wF~djY{ra-s{@_cykO%?U(O?!ysN zu1sLv`dj$I5+oLIxSzI%rVvEBaWEJ{Jk0f*xzHfH2|EuC!tw#n3Wo{ou3?LP^OuCc z<7v~)B2wJ06fkuo9Q^fb1`mqiNNiqKyb~wj+{l{+!iXOMjiA}FDJ@ZfkBMYSONxT?6!Kk!}eUWf_dDdnve zJ<|)VH+QnJ*a0Hn0tjo39ZHE6`6`ei{$4^Y9SB z-1h*8K3ly&`~n4c2h48bYieqoLy^QliUi360a)^`cs%6boGvr5BoZBp$!aP>90f5& z)}D&O#DV5A8+<-B0!{RD7&=am+LyxNu-P7)I-^Q4^Sp>DAH=FI_GpVKVE3&>PGuz} zLZOEtJ2J>Rfr0%egbXo9-F%=drT~E#{}K?<4v*~N`9%Y`)#|U z2!-EX=xq@?!e6vfO~`Lr>Aor9d+-$z)Z7YFwa&G0QH zq6~&69+~N_Y~{Y}yc6>CAvOvb9OrUcLk&+F_qDoYAW(grGfDy}URo$I{+4;`{q2qw-qZ<&PwdpClmp$NFC5{M~rKswlk zf3%AP*aq^+o??XMSmULt#w@u9_aR0qo6rg)!N`ekkeow7k6V#}<8OAhQlB0h9qj{G zH2XAIcXwz;fua$#Rw`#sAK63}qa|$J#9gn&?vH*^|RQnpmsIB#1cHH%F?vE#o3UA6?-M{kwzx(g)!vQ-}K9fk6P3 zVlGgN{tkbEG76@6^gxZA0bnySoXhtnY^56C$Ks~^BV_wY&yV-QEek?0 zfL(qJG3D}a<|}w7;Ht9?)FFhO@o1xVDIqzTB@0YLg&F++=r;fj8~H!C=96{9S&;fq z1tNQ2lLHULzQ^mwHvU!AgAbNVYtX|F+XcR*;oPl`HG~U@yvzo_8KHG+LemJWx(ydT zNy$rKu%n=^j%N=1RixS!wu3locs*pVcntZK57}Np5ouScR`Xi}o`&kDadAC%)==i_ zaHY8|aHdL&idqzjr3dZP>`Q8~5u$11shEbx^5{FX70aNHs#P3!#AKT~6Uv`S^mt@tXDkv}`DmGX5sOa}*#(qWh7@HNPq zic;s!$lIU5iU;Ygzslnh+|I|K+?6TSr@0^ifj)fJdfB!+MBy!=Vm>^kK_|ZYDa=WW zNrqKOQ@voTgK#tg_R6!6^RVKAIM{a}Hv}v~Ls`<9+hNT4@ETwwL^wc11Dom4yx+yJ z`F4O=@2OQ5lM~WLu&AP*V1Xlj_7%?M{i15tXuw_2$4Vy3)_-EWZ))nb4{cMjgHP8z zUK^PvK?zw_5>?-cnW}|x;>c-qVDdL6T{>>tddf{GrJur@%@yLE{QXy`2IYynBs?F8 z3y4S`v5kb1gb`Tbj}dW2NeK}`@q;Ia8POVSaWYFigKMj1{J#*P7)xO#C5*W%{1FS? zqE@GNJTU1)^<9wb`<313DC1r|fqhdxcxsickUY+*ISi>~Ayv?{@ZVu(!+QC%JSRhx zdIjJ&k`RkrxOGZ1tZLUSl${>W0S&3+bbl%yjy~?E!+m{Lbp>$32NH!cfV^UKITyGl zRHv!`jab2JL`95ys_q{4-_T7KO|?djiTbalY#cVC#>@wj*MQ->1Y&g}9IY&RC8T^g zKd`BJnRe{Qchg7W0-Q4nizf$M227mK zrfnA1grGyg#^Q43XUEr&pe_kz&^Lmv2b;`nQ1Jo72FGt5NxBN=d)-KE{K1RAIB&`HZWQ#G4}WB+LNF<);i6VH_XAgp8o0 z(V)9l%edrBr1U$(>$1b))wbA+7Ngr9%e2ipY$S#lTZp~H>3wT31il+1wa^Aa?eYCTq?yKsMpGTXdkkkT( zJyQREaIUC041OwgFA)EGVb-S~17uH+xh38@0e;y}!lEu`P`h;FU^FjiKHB|`U~t+9 z+<_Lr(Genvs_lRyKM%o?8|NRN5-<2$wA}9;T3#qF6@JP(LoXBFJ(tlSOz^-!YB=8b>B7A#DqoE6r{kt3NVW*0eE9xkYC~cA|Xt+?o98vi0`huAH;{ zHk-o;c#^g2x~_)|2JKP-d9NbpupDh>q(9zo{k@RWQrQ0XM`ZJSQctKq6|`*fdYmWM zbZ@^$N5N>mc2ac~3k`4|?rNmuAh9pqO~<#`5t*iu!!vRq6Y$|q5Sqv+i_b(~z8*q8 zw;~jvDty=Ugh~b%MPVqMFq?j|!;^WVgdY)F?KQ+(Ftg^-; zgXPG;wnlgpkrOMeJb!#xc^fVQ-q4xo1%Fe|Wi+TfLYjPU=*`)bsvhdsT)lQ!7Iyx{ ziQ`Ew=N^dBuqJX8YEJ1fUm-(aj z2AviTk$cJAbBdDi@SxJzuHKZw_72@NqPys-A0dP1X0oDbFKp=VmfUIFkd$-XJvWca zleRCh)j=Puo9@t(r=-L~HWH#xfyZN0h*>sh!DvM%+zswLhI4uqxmh`iza>1!w&&n= zQ_~0uSkzj!HH!=F;*S7V5fT-oh?Tc;!0Mq}G5oqt&_ede`_>B$f;&2%9Bbm=C(?S@ zww;1=IJy4@2E1I(Ss;ZYwi)2Nf$5uVAPe{EsjrD&R72dv$wErP!>SfO!`InqQtBn0 zC5_9u3EEGPmx+nQtfiJb^HO()BvEz>H{V%)j7y5s>Pvjt6>B-lw7WmT(~8ulVWI8D zb`5OuR!AfvReoNc^HG{NU@8D6h!ntYKySLn$KNZ>dlqdRnI%L2H8k|!)jzg=fZ5}I z$ynAOx2$^qT*d{jWm&UVH;hr5QjO-~$s;aqC1vzY-rzv@ugDB1gDvI1Y%lv&Hp~FX z=lP1+oUJnbqMi31&wU{s0aD~%Z*x$2KI^nSmLmFWftK?4pZk%Jp1;1kf(oJ!nz)C7 zPG3wc1VB52Z$QT}mas|Ahx0U+Bm2!M{>rEm{EPPM&{wpHuP>}ag>0^-UrcFvA$YN5 zkN~AzZR~jsRki$$I)rQV7yzMvbwDnjpRzJoMo$qH8$P-1)c7o_o){p>R*+iHcf642 zTvAd>WKkzGE!6pVc1T?oxGlbB5lH?hxA=yFfB&O4?XU*EH7C8-o}0|b#cJB?f5 zQ`8%Pbu&ZK_|^}`;OUCJW0_ob(jNVkblnkE?T~zJeEBxv8@NfVgqHfs=LlQz(RMra z_K#Z@%;0m5LTpmTAI-&<8NrAC^hp6hWYn~^2|dIVHTFpl{!N5t!SUyBclrYD{uM&y zj1i9UbZu<`e;+yXu8nu4#0MrG=6t}4iUU-RB=F~5J=*Yq^_&0q#@)WLj~DU7%(n4( zba!aw->2$)A%XcY>(vmPHp{{qFH5Mw6kHfSjyN zxalk}9|uQhA_7S?Lteb@A)_yQ8Yb!OMQDlPc>2XrWVjH`I0Z%9qgF8aUkSWkJ;f(m z^7{2h;6Dc=^CX1Yi$dH{AFUQwLqh6LfCsjA_b!5wN$hP#9PaQldGzqDBrBjz>2&V&CEGE!!r{E8VBf z@fxd{XOq%ay5I19YLw(s$qry~;olw<3U*>R62s=cgpfEMtK=n)A!L1HxKq4BT7mC~63Fk%A)WjK;F3Sk8+)Et8Yy$8Bt=JpOg9 zp~8A{&(p~14o!;eGS)5Rxyc-_2_cFc925ebrONo%`JF)x`x$mAIK!kqjD_yvc_eWU#d0auH6te!d#n*5MO5kEPMwMFWib-beyT z%^HumvUoZI&Zi$^pV^Uos`{}Fq#RJy0v7;bs(^lg$25neUw{qXP)bVVZ7F~|DD#NK zI{P~m0i$^2^Py&<_sI&|fiI--chF!(JEkTtg0jZQn!g4@+;Uac}10B%66MNy9O@vKmygi00$3;DhmW zS+xe}?fOPWfRzCZvk44yq^AL!;SQv^h7+p~W1Nt@HyY+0j%RB^k?aPR)CA~I$*+m? z%JA`3puxQ$yv4`SXF4-UcsA~`&$qP{he5~|^!@6WG=i49#OaJ?x;+ca67Bhb27_9x zjX&^E^RKkpKvy~ps7zp&coEq>gKW3@r>X^(`V52&1c8JV5)sgHA#2K@RsT%yHBK7c z2c)N((NW8zH6d@_dT4y%MBlvwOt>ou_3hxIP_~9T-rqCbn(&=S_?a*JFL=dc*#cG@ zh+keOykd0er7yX1B3zEKu`wb!+3K=5BSXL<#Htk0Lu`vv-b`Wz10~R!;~*S=1j{YD zVfs>6co3M#|K^pJonL~Ws={v!klRm6*V(T)=y|#JoJAEqi>mayysUqnX|gn*Y}Vgs z7V^;wi&oQ@eMS3j&~l8syOJPR{)-R&c5OiH-5Pi6MYcHo&*%emaUfWUp%W(~XV+?Z zcFR2Kjw6vW1vvsmgP&wEaL-=5MeI}645x5Fo%q^o0!v$8KWqQ}t(%>zBi&i_p(FjI zMyL?f`oZ=_sQ=KFWxf{|u>QWZgy|D&4APq#1FMpSEuvZYJ#`+>sA%*t2mPtXJ+_nt zIj<;A0GA6E!od0~Yq89@$jkXiUs&qjW6SH&`B0^6@mBxu6?=r3m|tu(<1+bUa#Eak zvhn$Zz8U@2&Ks536|E8e2&kukD2j88u)7FltBA5^LYM50YUkwK*n%>f$Bwn>iDMf2 z%x*UxFU?DN74J^PT$rHn&87KRyP`xv@sC1@8p>2ps?Xq5@aklPTCHoQHK>cS&kfIn zceYSBS+k*?lFHQtCVBeVS9s-GJ2MTYZes-QG~9B*o{I9hP6RFLk~pAE0OknW{Wne> zl&vnYSQnY==)|kv7|;~wg(jkif3d(3&!;+LYOEJ~>1>qMa=s?B)5n_1D~JQ1^zToD zi^pO5HCY;v6f&NfH&K(jJ(w&(vP))7KT~dzHeT?Cq*TE7X5QS)duK`r|h++Whp7G zt_QfIUh7Z2(ikJ#(wr227gyI6w%ZHK#{i0H2lY($ZpHB6eoySe!(zC~wtnO)O;K%b z68X0&3*%=T-FVg;>rMu-HE*1XY#{M_;ehv zg~9UIU=!<-kGB7&)?j7S$68s^FtaaY2ZfnFf9ZWdp;6qWP@+IDsk&wqM;E;Nh17_M zF?ivNRZWjb=-MIZE52-KLzm!^OJG;B^)N@F03`|DQx^be3pTrQ_B<2dzTYEys=> z)hry;ox;0wb%MjnV!2y06h66D3S`P7z+{5hJJhN=p10N!k3pn*?o@C?!R;efpLRO# zL>u1nNHya+W5CGf7<6tgSP=ZMLd-$V=EbetfN_5D-PTuNy! zr!0RWm}+8@4VX!z)=R%7^-yKzMGJX5r>ej7y9na0@6#|jRam1Lc`4zcL*!1*E+^@N z?hf+0)5Chy8RH%xP@bqTsApB>2d;w&_{6!3n-RVtTioB}lPRjNUJfFonvOnnse;B&@@a_1u z|1Jr2OBLsxDzw=v@E$__gf^l1B5773m+Y*|_8J7-4WI+Kt zXu)&yD=<4W<89)^aQHrkar;v$g^9gWnNd7?19ZiWfJ$miGz3>xAlJe~RQ?ALyFb%`@>4aR3NNaBc)5 zd});2>FAPAyfR4wU<xh&8aLn+2`I!P*Z2z)gU5OwqbJ1f_ZT|n4$<6R;k-|qB zVY2`sef|sJV_|WxetO-ns$$Zv9cJ~|*xPvajw22mdkb5PwDx=vED@BAjW5C$qWW7zgPJ)SMeDKFarP+L}nM9S(o2Txb;e-f?&g~iWnI! zcRC@VIoo)g+(QTYzQ#dgV}xWq5sJ6bzq>ux`oSvw{~x4)&tUL4e&8WTP+Z;gxJ3$j z4BgU;qQZC#G8I964t(_F&d?7Zu0DPGJiDTTf~vg!-E7lKe><8VK`VO?(j8?9%YVe& z-~O%#SDH~m#9rCCbQ<2p>8D11fYb}%!kFV1&0y}mK#AxH#oU)kUk zFG`LP9x^!jG zU+7YIS|Q~VP}h3u@uV0_xmY=ML|DJ6!1uSK!N@%6Ufn@(Z|+5+ye+|$zeGu8W#unj zU9C`wf|75RIsg%&B8p`&Fh%@V*>y87pb!I-|3O&5#7xE9Jkzf`@N_uPYJGIlYxFsG z*$bL>BK4$cF}H%-c-1UrAb?_hTX`-@j@d>@rU2VeW8hze7aI4|8!sKM-JERGUM%11th<1v^Dr9O}fz9j`mJ#bzBrv!g-oY#`2Cu z;OkXW@YGm`SJObD&zXuUV#B(Yam_|8nh4y)4;>M4K=2;W8MEw*q2r`rg7i z@o$3<2f3Id%a07G_JlvyALrUfoPgSzVQH~9i@2pRIlv1ss)Mpqk>QduN56IO?ueif zQC4a7Mo|evUn2z`UY}0Qh>g3MG`I8@QYiAVg1gWv487QwCZl}VEZ-12NqrTYE}RPA z7mucG17)U&u7x%hck@&vw0A^#%TjNbq082Y1;Fq(N?At3{*cMg zCQX+~*Vbacs35<+d2=ZtRpEEMXWR$BJmGo6Y|PE~|dl-~cov?@Nf{Y&xb-&S1$+Q^d{zp4#)4 zq0vVMi;D`<0dzO!KG(}$iZw;T3t(;}@46Y(Yp?4J=_>XIV28ZjOsqzeu2jGhWF{zS zdl(rdPC{Njqw!7UQ^#AT$esi#4*e_TwGWF#hI2o!>Gbrb_I^=6GX8EnqBNGBrMNm+ zr}~pOPp|Z?>Z=^GUv=(xKHFaA5h4)7kwd@X!X4AY5c^3m3__8j0!d0h9V_*<%yF^l zRSTKJtBZGfqH6UIQg350YQt$2%vL&WL7TcuR;RM~J-31NRz(L6s$|Fz>d&y>UN6O;U`s|aOKRX3|&LR{?m|={^Sl%{SG_1Fe5AUz@-pn)@zs-&2 zs~VYUgu3uT&Xq4A35Rvb+mGsku^#tLJs*pzx%a`cc`avGO$j5i>RHw8K3v;PU!1Ic z>)R-PplL{vi*DR=g+dHJVKfo{)!|9=NSBIfIHgyqT>9@5%fXxqMIc0U0Cb$A7s@U_ zXODH@RuW~O3du1G&MAQ z+`;b81gzgIkN*5h#Er#PgECq-BV=KV)Z2Z+XBHC%D6eUs;g1sVC3uAnYo`an1Q7Qt zgAFcZfyW$mK~+Lc$ve+AvQHl_XG-#YRCUetJ+t3f(;4JXV$EqE8ekFJJgV!tfrIyv zU%L3_18Gm!6wxO_cUUyDu!=Q!s-gaACpcfJl~2F^TFKm;0cdq#z5x5Zdp^G5y!wv( z0A}6OFKjcBT?A#o^pAG~1I1@!N=g6mjKt`OB6GiJuhqF^NaENovAZE>Ln?qSsZ%)H zmrFJNxoD~Zgom5@q?ob3N*}SZF;FHZA(TgDErhmz+2+?C9)+^X3y3~)An`gn8KxIu zzD>@@HOs^v7tSMCIJQLRZC01B?b55c|EiVf&xg)IxmVnSTUpKS8C&GZ3fxCZ-2}>&BtX%Qf*j*~1_15+o4tKd%D9+lOR-mqU&yQVYRkeONzr(gO z%RuC{>jz$SGSCl2e9e1yP_tr_UsyN?j$%(Y!GS4zc-0CV%)kn-p+RbXanTyqo$9^q z)xGWX0DopJQ$BKUieAx?T(YIn{s{3#i|;^ffuc(>$*(qI2OGZo>~1hu6>ITWRdD?vslPc&889x!S>u=iv_JK-%3AW@hP@Nxln#YC4`m5I z-Y4wb(Fj4eRtQ(UzOgbcpriFIxJVZ#m-W}Lfj`rv%}Yn4cB$bh(zg54=U>l=Q3)@e zUL4A3A6s+CjPkBFn^@)DB_Taox$q!tl!dD|x>w=(@rWHB)Pw&Rma->X z*|QhlZLn++P+bYS{<;l#H7v9SUVvZ#)jM>^YclMP%sF2kB7F=KW!WvM&)(KADCI}m zov7sBFFm@zJToPwe)aR8hVc~s9^f57vKT9`z z?_5R9S2%fjl^q<4r#u06Lo|pLCg)D53vB&o68)8EwatWIak%fWY(cT5q(qhvi&JNS z4Y(&(6?h)7Hq~qqFfJXOCF;b0Ac9C;15P}&FtcLUN(};+PHUhDSv?tJ{7(zRU|^gp zKNn6|WO1C{n{RS8t^dQ}O+*_$!01bHzj5s|f7Io*XU|~U;$3$!71q(o*;fu9?KtAqa~;&nc2%fv9PvN*tk@>zAD*AN65LE6V%8s*KCaZl`o5Lq@VRQA9jZ)Nzrlw1nk%Oy72 zT+>_ve!nrdq=kZM2k!tcz$vI6rsc}K^R^on>|5$-!|lbo&yjss)h7T)Ud z5MYCf-_VsOwdUb+iEr3fJT15H-|mzd(S6oxEL3LZ{!Cr{zaBJ0{TLI>F}_{^AU={6 zZIS)_)sV^C(;iG3;V^u)uX`Fj9qEDZ7=Lz2pk4mGD19{f3LXftV;~8>d@!__gQ*Xu zFMPyK;Fb@27y51|Z)rkhKozLh3Z@EuS>(?Ayd`hnDndo6p{c2V^X9_)Z#6JvB8q6W z@!UYJGc**_PWZ|%npL=XL_!4!wiOs`yu9W>+h^kLR(XVI$g}z^XdgETOE{ z;PSI!qJ7U2*(70gs6`~3d#>HFxpBf-L@{$L>QMf33p$cq=%4B7n=Cp8ABg7?S?V}8-8mxPONeGJ2ys8TK8l~ga zwuCDzs*kB1?#`PoEF{!D%cH?xzlD_PVKzB^ZW9uu`VTKX>c1pUmcw;=%Q;tX zwf>p$&Xwv#jc?cr!fem&ILX;ai}wttqG~GfwD)!_s>QLZO8YIBZ~DZ)T%OP@d$l^y zDiJ-Iwzub5+i)AYZg&ZKn13)FHZb8L*9CKES6A2hy0vk?xVk5ClUf1b@{A8It(eYD zF{Z4AUs4AjT(~#RvbujBo4;C0Y$65zS|-$>g%re$%B|OW`3kE{xL)?1nT6N!_?(dt z6H)euFLIo7;|62(DMrc73>eHZl-ztBv{w%#NF|`endsjT_ix;Bd;AKG&~SfFMU&;_ zJ8kBlucc{*Oq;N)X`N!f-hB>Q4bUbcaTQ)xNcc-GllRKyNibnm$=43pn2j5&(%QXr z#B5^0p&)of6e<>sIL^WGBz5+cC)olEMqYO`Liv6}6~{8khK^VU`g}Eji(BZZdNIdt zeOli!;=vY5VxR~?SEF0^rQUxk#l(y;&DbOy^Md}K*Q~?(^BAw&w;{55g|5bmFbZoB zsw}HmhB{&nRNVhP%r#1Jvi@aC&wkIMx1m0E%At+-^KB+2eR&NSP5)cKhp$t(*}aRn zAHf7_u12Sjz~hl{TbOY0IYMv;ZaU_8CZ6A)?-Z2sk?|3CHqKwN{WE$9DFP}fbN_-) z(Sp8HslIbO>-cKwciPS`$GSO~8v)-l@;UBeeErg#qfMbhl+tR8KKU%wOO`6mW8tg_ zlk&R9YiY6_VKb9>8=uO_rJ_UCLK%E9ZyanxYME5fTdb_ECZ?otFdA@DfHxXLXFZTq z09c$Sa{|SAR@$nc0l)nnct z&qhUpRyQ}P?$VVVX{mjRmPo=B`-T?d=gVmCqI;K-d-g(5qyO|Ufkw8aW8bHo;W)9Z$kl-! zj>U`)a*?RVN8X2Tk0+@&>$Y-Oqc6jDD4yXvvOt;zS1bnKHNp6wAHu@I;A08U#&TY{ z0>!cUjc*07a`^M{PT(^NK#10p!BUo6G4sk<_%VEROGAew!F4GkhX6*|PY^ISzH=Kp zrCg}f@t6Pn*zkM3AFRaJ!f5+mxd*Ujotvbsd26Mu{nSaDXAnH^{*trPcwNb%bUbb; zUWOR;MW-unJ+r^f zLoq~!TeV?PEx#;PfNMOlJxxA$A)%r(p+cQRL_I+mzK9|b>D-umsiZb~XJ6cbj8&UV z$>D1D0NQEB#(gYHk4-gc)?>`D3{BUWUW-%XfRiP~z|T)ZxkwqqL?ydry0S%#)A}Ad zd2Y5jx&_krdo17+!a-5{k$+h^Ipl`+n-10C_Y~Ur!e<(nJ#EoUcxMjHHcrboOZ9f2 zfjKq~)T9BukT~&cYimg`nSTf75exO7d9inWAvAy^T%vh0z=jHnJKsNF_h&UHN!ZFd z=K|ImzIe(+hTZM4?6S&q-4=(9eA6<|f?S6&(CfBk| z9Nq(ZOqAk-yIYpWm=>zmnE*L4W}W19Y~T87{?UPYimLC+gWd>pF}N@Hbck+4o_@-WzJ~8-hhXXM?92R_ zn;Tjem-cTAEAcf4lJC3nwi5-eW+4cXXXjX|n5%WK_GE*`E0No2%*thhR@SDohi1c- zEIzEuW)>XwNv%~S>El51HZ#j;c;5Kt4Sw#38*vDH3N5gj5Af?(rv59Luq{$*#Q(+9 z0qYACy?vuGWhFIvP%-%P#AP!d%Ktcjn)n>iRFcu>K)=y%?~7w8>LKH}xmVeFYIIgt z?y%oc)wB2541;!K-c0XcGJ!Wid-Mj{JC;}G=f$E}-gjbi(^?ngo)ovw<@FClHv1h@ zHxEmBPj?EaEUOm|c*jH*J}{7G@Zx_))ghXeI|SA?`q!_|?!aPGI;7$erqyqIkw>v` zFvPgq>pW)s^60Y+X#gL`w17AJcvF&{IO*ozh;7m&nv!!HchM|a1KGwrs^AqzeOEeR zVZU=O)BDc_TIe$nE7*X;ApVzUOxm_L+z>v4(%v7-qP=RS=Cg~3hQhSbRLi}3ed zQ~Rv#@i>_`X?d$_A0`qt>L#n|d=5<{_tUY^?a!C%{_?)KU+M>eGx{<%nQ!4ppTzj2b;-KM-)R`q3P&+H$Q(U4<~%k#SDT!vNm z=XAIv&NBzNE7fjrT;}4#gOdzj&31+J_ixw{FCS595^Qug50_`Dp}xsIsbymoG;m*j zbJz&NL^|1kaoaSo42>sqde_A;W`rYy353f?5Q-FLy;u; zT1|;kgV0CA)yAeFFU=uxrq{bcCc{5dA}`za{**pw{&0?gy2E}qJb%)wf`pB9JrPjbxIPzAzFYBDTi@Mr%$lGV*KiT27(7swKh?lhYv>yIxh9+yvx%$cA z53n7JN=j5f8-}!;a32m$b#&s=Tfk@=-1fTEeZlU>7G>~_;6C~}_;SvGISuZDL0d!7 zTMXG$iKZli@M2j46VAbm(){MqUi@Y!!#}G#C{<%LIg$)DpSit{eslfWuRNUIP!-|` zWA883VD3}w)Py=N)kzPzGdvOcBgRoAthhv+{IS6hcRbdwW~=0QBFkqgagid!uCj8^ zzWdSJVv$_79v>UMO9}6^RX!AqMGVhTIN(F)q}E>}OYGU<5$G{>eD&!O9@b~j8UnA! zHL4mG8Qm&I&Q3r;(+OBx(}P>GN**aBA?CN0+KQ?bXWas^776SnGgHiOPs7GMTWD7y%D;Ed~d;_?C-b9a-ARdgAGDejBgti5z(s?@MF< zKADgqUK}ksU~`!s{_65)pF!rV8OtX=fh1^Kv|hE&KknhGKkKiIrKc`}WjJydR_{J= z7?zc9mTi*P>3Ws(acbFqczNZd;ZU*Zov|0U{Etnp6{rNiu@_0c^~!zI_@IU5{O0=2 z5&cSxe`q+T5zJD+eO`(;0BnE}!mHn;o$yyYzw6hN(#w{XmJ|!WD|0@`T?SUmCm@|i z2VVNcX(!;<=)LX!yuRm9j`K$g{iVkjnU$aXusz9K8MTrz8GfhlJYwdVO2>ZKx+dIZ z;WZ+;RakmHzdw3DdTep5zXTDz`=75NMqj_NGgYm(-Fj zafysW>zGY4byhE73h+Anb)(L_F#lMhz~EQvLlO@OuMIjFi4WN9h&%D}@-oCf(_jM! z>klNVsuaFri0PSCd84ajrtFavib;|;ElrQ``Y@+gL|&`V%$`O;ebe(X@y4Xh9@5`A zI;BJVnUTJ+FQHn<>46MHeQf#(ax!M+vWf4PGtdP3o6FMcdlB@Bd4 zr0@xAIx8F#)snPF~D4*4sFA4~}J%fK=W40E%g>IYkZR2b!Tlx#ucg7R~cDV$y`QISxhou>dJ4@+HjA`i`nB%j*rEEQnSx$Mw z(oJ&0bzUnra5r^C=)7)is`Iz=!ZZx&&b~SwpK|(sU({O(MU~w>K$Y$kl&kQUMo&`( z?<+7lp=r@GHjaAvk~aR;dk{qK6m=1y5Ml_BhqL?b=54?%R6h0z;%efX1t#Lmud#an zE$jH-eg`NG5B}psuZ->FS+_f^*AAD-`B40<9G&qXe*RQRW!tO&XfMjDm94gH`%W(* z!GAL{ycNy{P1jC!kNCE+g%@_dtdo3Cd_%_;y!lM+-?JzOp)xcg9)X{Ad3>9sIVFGf zuQQ|4fh^f!?}lo#cCVqewunO63u0B#arkTE^&D@e=9!}@!B8Jjq3hkeiIv>xbzk|J z#)8`oX;D$p!5LD04lw;emRT6py0W1xKZam|kUDW9aW_RIKo{$S&6WM6Sb3SFwvIv> zg`bl*f6sjo6RF}quJ7ILStD<4g>GCySyefHj*^~IY%l=V&24e7PXFcpz57iC>0a8B z@k3XwKT;G%J~l5_ZIEE_sXRLw=9VU#B_k=72y8g6-RP*3so-`ndM;R_M18j1DSPBU z!E?8Cy6TD3B|}Z#Whro)qJ0c5`$3bl6{givQxgiRMWibbANM3 zLU!G^-Zp**t!GIF1wxJ~tvX?>AQxnBTd zv!AHGD?sLjr?@4xWUmLq=48QYdh3GNRKf9~V|;yP*PMCA((&B6~XIZjRr%|U9T7H7q|tRr@-MK7jQ7= zTEER1#FBq)ZH<9#1}vysDcMO0!MKxFc=LYZdx?quVY~9uwqX{oy<~x7?P&js>iV^f zn$`f*Wx5Pafcsh0TI1aQv*I&DSsV8r|e{HnE-eq0-EO}FIPmeh_ z6ZGWo4Bx8G7JvVxXKudHuTyMj^DPzlvsXg>&=y>5SeinErsnqUzQ z=15cTrna73NT}+bRLIKSO3<0b$_-XN0>X@uCTBa>-^ZRr+2YUmZqc%{+DB=Xj&{=jFp> zC&r8;&gpp&t^JgQq3ulLVS4wy9We`YbE1?ktXJ2$7=dbVoa?h=bD35Q?uDhlgGNQM z>us96D1S4&@^mRL_8ymLF}tU- z*dpZ35e=I`?zdo@klAr=i;k}Gc<()1^VCg0W&7r8jeOv~gN9~}oamLr$+JDIxQfp* z&o8iC#*blDFDfmKfbAa$=r;%YR(g7R28ZONr1_U?hlhutWw(lZ9(g$yPm1u1r6&3= zTSBP#^}O!+D3;>+Shm*4NFUp4Y2e<-9#~Ob4NK%PfJ2@=uJZbZH5jrBywCz50C40; z6cSdT=7f18YT8+hDLQxR^^KW|@_V)|dG^(@wS*}#HEq(Tw{v99jlIuY_HDSCzvXrR ze~SCka4f@h?N>8}gh-(@kU|3)GL)fcAQ2^$BqDRjEE$RpHLVy6*E_MKSJPivPG@cu>Sqw6ZQD zuTl@&yj6N~%QvI)<@+_+RGdE!^ia=3XqnPB_QmmpGkfcw0rL;<9y$y&bHArVlLjZIp5_ZLsws$Y~sktbr~|kcNgWc7-C$bM{HtX z(mU+V9kyi1f$^1Cq#HsyRAx^^UsSDWP)Nu%w512w)D&I6CMe!HO*LiLO4g;P5EBXb zalPs5bi3TUQS-9qqUOA)=mow~Ox8!uRy59!PE6lQ8|}I|u_AA$D=^t~y>Cnddr$o? zKUs)om<#--$AF-p9|Hu-b>U*d(+%<%VD4yKLX zIF`GCK#U#;>-=`2RHa4>)bG`B00{Lr`}r%v#X)H7dL4%r#zn98Ho7FE4+ETnNhHs* zE>FmW;QWG&y?2D@#Z_Eu*8)!mMMU7p&f3>+Z)cTDaQ5k5Zy1opGdr$RBn?6Xas?U&r_upC%h*^1cM*s{&7Q3e$_%XpN$ z2tau>>(%8m&l?k7M4K+H--~H2^%_$Piv#Ei;M;e)|AAkdeB?eDRUpqTp||m>-m09s^L8yvi$PdIy01+c%#?``s++I|kYPa4)X= zz) zq&M3v$G9jgg}OSx`WW~>EWAcU+5c|KmwA=<7DDVo~~s^Vq+FHT5$gqKzHVgNAcbZjfnxGuQ@=)?)(F@3UO7L{XmpHsN2k zfHcLZKOR1O$WvcA_y!7c(6Z#y+`RQ61jYVCmy+d{51w4yEPm559UZ~@S5CvX26blF zFdA#b=?yE9?2(|Lt3Q5RI&Wm8w8IqQ0)JKDJ>P?NdinCWYGZEw%lmK(+cbz0eY`5r z%?q~B@+-aKT7LRo7x*;4;?$2llCWL?OIb-lLBTegOc$EU(WBl6qJK%m9FM;p9?o-X zB~*k(ab^I2YAm5N1UQANdMFj=jIazH)38#ByG)e{$>pY|rWp#G`TW+96VUh#YUs@+ zC##09K7){X+9Go?obm27aRwZq>;rn7U$2*T!*HVACnbh_MQ6z8O9vbsGascnpy&BW z1UF8(P2>3SLHItcyK&=2JJa3kCMVCno09%Op~#1;DDKys-(Wmgzyv~tmY;nT}A%w9yux;92XR*embE#|=Lg9c7>Euz+nVA9{L=eq!M`HeN8RG0UV_{wJg3UPV^_d;d;UhjgnzUeF$LzNOR~~ z(c%0UT+1Z4Kw7KHcm6|Hz{nGJ2+%w7a@oFNL*&7saNxG6C_dcCPL%M`RbG2FaWr!M z{9{tM-C|J+BjnEbU#OBEAgGc9S(!(nj)qfXi?6+2pJD`|-eFGY0zpN7?mMbhuAdu% z;^)Vp2e6?ok2!AW2EVA%3%1PCgA~LvK0lWEI}@b~St2q|o<^lkNb^Dg8MZQ<0VO>2 z(jg8|7<-M17DK&<;E#i;HrSY8aO!<29^zT_+Z*jge%%WRS$Nmay$(a-QhA?9;8VK& z?mQVvC16=gYY7J4!4@`S7Q$vNRVM&#kNs>)_^~8N?A*E2Q=OGXebamtV%UhsgfbCY zzhpWdz)q%-Sgpc-0|VHyG`P!J`9Ql({qF;MfQ&W`S1r$4)8CHzDfQ8ia|4TY=-I9h zRY(MB@c!sJvLz(vTlqhHD~LD=Cbl+mFHll#6y=g6 zgHPDoe;e}SR+_o~qvHb8f1~A| znn|ys_I*Z1&vNdy)UP1&g|Hlg$CK zSMTA0@>PHeBrb_F$wq1_DnW;H;0xv>2}K0I6Y~pW8Xh7NcD-yQi^A!2A_Egy7}z9F zv_R%la72U%e}9z}AGW!|yr63oxCEk7gKa_>JW!^J>R$4Z1rT6&QU8O`u~k){N;Zry+C)WeFFFG}i)uwBFn4iVlkq&E0aaeh2@0}2-8 z*q5SWQ6r|!X6~7k1L-49p{I|4TC{Er3ri5HZ@hqQ7-pWwAR!KO%4Vw~MjoRUC@Xg^ z!YEGU{1QPCiTSf2hKGo2OXuHXt1HX_EkvOdBRS{ML>CJfL~AkoX5qXl|GC1w zKXa}P4Gr;>vNOz0R8W7kV2feb&gW{zHKd&}KhQw-c;HKm1JUZLZU4mHJpFiZK7#XC zONH+iqC7GX-ZhkouQh;E{ZL1$VJVJ+V|zg%z0fe4NL-vGdLuYieh4~tB)uYUV^tP* z*-Tv0*3jq(Du|7VIR}}cc7_n_^dEE4Rb6uehMq2##7%97bb?G{%+se&Aa98vhRLe^X!J=S1M_j&&wVnZEmAg4dIiUp z5GgC*<~tRH^^HU|t;r`R$BVaNVe>qLB=dEFk@@%R#;&B%v{V}s5)zOCT=M2FpLmX< zLfv6nBM_%KU40d=KR$jM$2UwKz$k7VnKZ=0#;DTxrRXY?mAt&nD#7cQdAhiu-8Z*R zu20ViGqYX8FTgnkt%TnaqmV!tH3@t85TUZ{NknYYHaa+07mSm z5=Qan^%1b6h0Y;NoaGG+B6IG^AZe3qfODLsE^X>Yik`JLF)b20|t?03*f0K3xzuQzk8LBYY}`Y(u^y3h`(S7?AOoY z6u)V$AdypqKVeky{(G?6#rj0F3BLBQyeV5Y#wylI{ia^Yi;|CAxJCdoBcR z7=iDiqqG~eG1TG9N(_&IgKi$v#K+vhV@65}d~-Usni$^m>@D5K#?aZ-_0H@wHiXQc zNQmS`MT&e|H4Y2F#Stz;^l)SM!o+NWMS2HTbRkR*rsusR{x4^^o|M!zHZo9%@&w~tRuL~a^xtHsQRH zxyTJ#g#vl! z_)(o^@WB4F+^jyiUks)nPSS3WX25u&H>^dOr^7Jn|KQx7uwM}KL?zW|DCI&<_yEF! z32_i%MgUMOQutpSc*+x32_B5*oms{UD@fuV3(UR51u|d7Os_uQymxOk;QG5#jLRWM z$^<(E9Jq#<<0#~O{P^*?AQmOSW=rqlPOK3r(A913XvRS|x(tWlpB7N}rQ>f8-bCc| z;Y-5&0t*y|Un_*qVz=)?DRlH`fV9vbH0zXAR9>sO4Y6hhtX~H5BrYK#gmo09g23JP z%MQ$KFjE{o*t{9@FHuoZJl!blZr{GWK7Gw~SYMrkM#dG`Zax87clz}5g4`Q=y1I|P z^!=Ncg+$D;A^le>#K_`}O+I)UaUlzf0aZulqd4625)(fd9-KJ!>VjjpCJwkInLi>?NXnt z_h7HXfX7b+%qk@|r5tFCf^iyi)L*&iJWe)=i`N@+@1+C+=p!|Y7fD@Z7W-NLV}V^; z0bN9CHV(IZ`m|)7hJ@l@Nzk%m{T%4?;3G=mmEC6D?5rUPP^{)JA|T*_p*rIS3ZIVk zv$9En3Hhs=zO4BB-W?xU$CHB`+@pWMEe*Gr-k2!J8eys$^XN!ip!ne}dF4lHsq}$r zk(@z!C?XKd3KtX^na7)3Nq~)mHOd$2XztUei{J|WOG5kfX@59G9*K~ZSrv(W2180O zC>lsY`Y;Z`YQ&`DvXuI%Q}oeQ0=!{JmKVxH*#}UoV|%Qrqn{=L?!)eiv(N*D&1QUQ zX42{O_vZN5@o}ir`k;E5l8!wdzXJx=xDp&}@Ri(!n8Y=J%W#K^Y4npP6i7K1&MlVJ zE@o!i!rdk>lJe&BOCy$ms(EQcE42iF>C!?FXAt+@>K7#Pgjm4I@v?ezf{`i9`4%5s3D zSQr=M*eNUgo7(>}Lig^SLxY#c^71!$0McU)ms7?m?a_rbL(!WO0dkj1ahpFbPig8nlIcu+u@|L_j^_*0%YX|Is|jlTuW z{ehXn3$G$!p9=i;K+No3sq$oobqByYEN7AIhjd2M(nKNWK2W(;ar__Zne&wm4u^Tr zyVSty0;=ZdHDZ=a_iGXsPLu$2=&GxCnm3AOnqxc&YmE-K0bng}HAJ1NUKA5ZTv&K% zPc(r07x!5i{CXS?a-r?D>%DVu0qo|jTkPt+LFeIy#m&F^D_KqhE!nQ&WpCf!jxDwo z!dY~dAWH(~1fZBLuc5(89tG--HM=jYmyLoe!Ij`ORS55g|(At=j2X0+2 zOiI||Jcc^P!5iV0LRseNfsi3-P=P+g@%WpX4amHTJBjrkOw9cF2*Zw>L+TH0?J}{? zbZBvZ*mxDQ9R>L_P5B1EmOy%eif_r==A7!H40=Ju6M2}qX^>sH@wKKAuiR0k%X9OP zt>Z{`f#?e0E`qRGY*7c}4F5a|Rr9ZS_m2KEmoR=cUoY>U69*L8uHi9Zf&w$OSS1Ll z2d%ABn=jytD@~~g_%?<5`0-v|Uh}C{@eipR{8&(`s6t8MePvZuyLBEex+4{U#eKTe zohY7ruJ_sv#s-g-g8Cg!neWUrxS9S#KsJE-_}$tmMIvL%M69JUZM&ywu!dLA(pt^M z#pSfA4<%eAQ`N$`GnoInxkxYkl+W9L?}hXEZBhxY{PbyoI-87Xc<=8?3~Fm7C?PJQ zwni&qUJXfcCw9kw?Ib)afbyH%Aq>!)e3>p4@+F z8W6Ay-h7@xV*xPv`5XHFA?0t%dKSMLL#zrZ^$R^Jj;kuNokk@MdTnF<`IPv07#H)H z10OE_*T$Hv0aO6_qF$4y$F>$@F|_#SE@lA+kgy8S$n!7$6n#`rkGrv{$zTU(ry)+I zEi)zsy`res+!yQuvn4m(&g@o!!2GWIYez>%5ey>nhtY@-F8_L-@_I>03CS>jEY22TO1u@c85RDOTDcB+03&G6BO&#}uchrFrfC5x25z#&d}eh9v$Y z_Z0SA_IY||-G9SA`H17xf~bp@&#QXv{hWWX0wDR5nrZNiWWw%i;7PR{u1XXPz6hp+1!G`M~g^(}UP`OsUxG>*k zm@h-yP}be6*n0O6DAEp`X~$3ne!$(3QP9GUM;?;Z#K$0pa$PhL&lcfSNBEZ($PMe( z?8GLZXlrO)@qujv+uhD|pL~llp=Hj6Z&D%r4oRQ*eGUEg5&eJh{HpQh=4LBz;uN7+ zvkjljX1k8bw=^8vog8mObWJ))A}gRcmQtaKDBtegA#*}T*9A<$4@GSN#TFS8vjhv1 zusWE7;c@I_0T+;Y6uAJgFeo%sFvXB}_k|T{I_8Tu&i@ADq|6l@8Wz@N_XDMVZ>ok1 zax>{Qlwy&Tf=s&&OfmpA41YX5u`d|6lAtp7#XS&UGopL({sPc+I71|Ji+}TG?~T&r z)P6=w|%jlex<Ft`O&}c=eWGsWD$0wquNUAR|EqC8-sGF5ye=M4{>D}->lQ;( z8!QQi?F}OQ)Tc9p|8sJ?aqMQ^LTuk~{n^=chuA9h6BnT&dH3nARm$>9cHLgIsw;5e zdWGeS7O;f%SiFJ3B;)l@e1fB^o<6(#`jom37uVhF#cx)ZmS|bs@Ywafror?5Q?EDs zL|4!oE?6@*T*z;yq40gB;EAo{ZguB`Oe6HVb-O#?Th)G^`mv*Fu>Dm%b%_h6ALGGS zUWW5}V~ZH`iWOL_U=tDg|c0LX-^-zoUSZcK&gB4M;)7^5y=@M|bU&r2OIzr8$zd0ag@UKW-}>_lcIdVIWY7Ji~~Fn&ucP#a$3Shizzo|(yI*@c&T=o~9p$ng*a zgbBJq@87+v`ZF_iLQk*%R2P$Hg5(xQ^C4J%y%jD^q*a`I}XsG44b}q@d9=1HV@MDrmsO z<0G=iR;-gaMo&-AKu@1ab?oR=K}^q~wi347PRaE}89ho6bP#(@`TXEc|iLc3DZuQ(6hNA(3^< zCF!)^F8_NS8*LWc;xbbet*JSI&lTRj{fL2qL2xIlH&<^7XLOM-bJIPCva&LbKpvTz zYzNEJ5qMUD>(}qY)1`UlqT*y=W**aTBUhH=vw&xih)O`ev_dN_LfY|@h4b8!vZU(R z!QgZoAD_INn;Xxq)p+$jLj^i!(HAJEg!HmB^QVUnC%J;;Km(vNZIdpR48Qy$ysT{@ zo~!uIk_N41*KggTQGI=Uq}YFg-ZX{3rn!mBs|)4QT-(Ukf5GSJdLXhlG5X8lx5M@! z7H5G!*YWS#bsXI>21Z6I`wtM>EBu$@UzVQdJ*Wa#YPUo zEg%BRP=;F=uk`R=wpjYuK?J%`Irlu2CAt>O3=A(B{egyP+ZwjEl6|Nvz;LDDHLySW z`22Ema(ZqPU9?dgGr@j-KiYUM6)l-}cnTXfT$Sg>>-SxY^eEk&0ze@*JN?T1orp24{I72g;or|kC=>_?@Pqf$uGfdDU zmj`E24Ze|T`9=2by?cj(3kwVH1O*wSL%PAD1(@j>N=~JN2b;`ExbP^szJNy-x8xAo z8MMqFSmrjLQ=UFmLk>fZg6lE9_Hdjiv%`rF4jsbEh*VG z7wZd@ych5U9Kt8!;E#FH*X7HXn>TG=?O*-U0>kT?xN2mFLe`GCr&=S>)^3M%+4$1P zAGBpcgxjPFV!ZH_x0hF3T%0mWOBxN@X!FsM(yB!F%;T5iBvajD!d6%}d-5T>7BKEn_ZJEmv=lT9jkKlX;QW~ANbuu@bl zV3DLd*tuw(*ytmx6T=w`7rSf}hY&fWB+EyoWMy0Zt7_CvoVbf4{&(kt5Wd<3e5k!` zO-M)xEbqT;#oC9iF;bS6yu9avg$r{zCCQx=p7~<{Qi7Ghv-lKWiFtQ|1(I3bW8q>QyAtV zE5(Jt0P;uHW5L`vQ+W5$kwif8V1D93wjZTn>HoWr+2@hIa9;~q+MsiK>ypCK6|Cbi z!4k~2a-UAScIP794I(6!{Js08KO}#ly|+zNw5ETmiz$a0ZR|_8H(A|p$#yUUq14K> zFksogg??vM^gIN2?fTR|MddWS*)-;N_;~qS53Eop$yK7O|Ld1zY1(@3{U6-6wyh)N zw&5NR{4Z~R`l*~Nscw+qM~n6l!V~(z!c*msBsI2f-HL#xg~XJG(^VBq7y{!DtJa8F zT3N@H)lX%1hid>du=DUFXJkki85@UiaHM8+z99s<9>Sq1q6k*;Wl&QW!R&`KujaAN z%jbZKFt%aT=U2wgTlQU1(i=M0TND5CJ%U(r2_{9kuUYK zF01d~f7SS!-A0Bh8AnxAZa{nBH~fU^8jY)>ltLw}qr#nfx4Oc){E(WOHXOh&!-bFe z0D~I2-e=6hJa!XKDKG#d8V$eAt?TayYN--S`eeDN^Qr&6%&(pfKpS1E9Fr znv>}WR$PW-z4U;tq_wQ8)h~&Nlrb0$-`w;H5-UE;EA(w;C9S8&tv9}dymwan!fW-@ z>5o9mib4eMTa#tJ7@pPzn0JLUuGF_q&Vf?1Ur$YZNcS~Q?Z?~r!I+=LO_Sl(T=Ua;RA}sUcIHN>e%XdJ*EbbAfq|H-eMmJP& zP)t+*Mt>==0Ly?5F|{nDkxtjj%7#r_=Gk~S4l z9tV@qd3Z(~!y3~qBPK`t6JUp?hzwd;%Ils8g0nAotaWe73^zD^)OmjX{;$je0|L5y z69TOqR13z$E~_H6UYs8P#U)_{&+_1AHZiW_3SC6ex#p<~E3(XYC|&zQmF%^zlx)-n z8^UG_Zrxgi!KqIamLgUzK9S_yQ5~U^FZMx2pdJ(-)v%OF51!_rVa+^tdt{3#l0lhAaVpliG8#ti|X4O6w&}PmPjmQ{x!OiBC1d75 z;NW$0N!?0G^vsT8kN;?di1`xRQf`L~Aq%w*tP;E7a&eg1>#O#Yw5_Fe?-q~Db2Q?U zKTe@{bT2q}~l5Nj0hZ>e-=GWIK1yHB~tcF9VL6p_)ijeTdGp4!R5PWTG8KN} z8w#&+WDIwE?esB7<+wW8`6fWTHO?}BMhi`^S2Kr|l`A9ujPSdTxBD`(3rfG$liNn_ z55X@uabwot*pbuK-A(R}UtnOmv(*t`0bKW8 zjK``pX4=MLGsGYpH%S+hh0g^tP|B|NDcK@uyC2`T&jYS0-|pI8b=FlT@y(^eyYmeI z>u)$onLuEPR75fxHzJx}y?QlVZcRop{vDGEb`TN-NLGPHR_JcyTTJUDo?tSvcw6^^ zu{cZ8ofY8YE3`O+8fLU@*EntY#HpPIg^L)uM3n(>q^#OJ01uzySSjN=iAwUOjLJs9 z2?de->6c5Gc@ojWHO05*6obuBPvug%&|c_m-vm)h%T1CqVLb? z4jtNspA`e2zYCR5_N!KCT(z_={laQ&$TVHtEeQOo=Hq6lEe=&kxW_VUAeb z{El00+iDU0OE8`@^SpNLC^qYdgS@VtnXD!hw!yep;01PHYS^*y9nlwUWm+0QnFohK ztOO~}7nk({ZR-38G#ADP+Ybb14u9Nx6!1I; zB2SKg|B~^aCl4@DpC>2R0gNVjFXu3QdwatqTtr@rS8l%bPwax4n86WHSFy!vDGwED z)z484$KZjQU=mBXUN7fY$=cdTg{2ism!_G@gB^cn z9PU_R6al*H@Sm{n$L0TtqH%TJ1gl0_WGwuP>drF#zW{s%znpkNAq^uOR*tma-hh(K+MUIUk$TTWq7k$FGkul-j=kP0R- zW1I+ZvJWlsA$u6Hu+y~yxLf@~8NFFU0L$3+F!<14U=OaW=7m%XkaY5U0@IjcbxO@9{TUrvvDojznaztf`qWbCq zCazCPZ#8uoVZ#)eWMlt0~(KU zm}^6ErE%p-hSTVecr{pL$6Nkv%{59rsmo&su_+)!lr^uYq)h$kKAR0w;V%GYhe#ed zbm-HQ{nvDvl=P8NmoRcY{r=qqefJ*Nx>VynYK>8S{2a_&oaL819Bg=z zEnLD0jT1GT7$#-Ayn;e)rmZplro!S3fRYxZL^kz65h?AcYup;)0aGThR&pXhyzuX+ z=+QN$1+3ZqEhqVEG|p<6zQ40IYv}zp_EoE*u3uk<5d<|D1v~Vf4q?T8CC>thj-8F| zX_-jAuI;xE)|s<}szV3RFCgHAiAfxRN;p;bw#NmQhEHHeE2$UJ=<`xUCrz1K>hdv= z8ff&0Su{&L2L1K1dj<(2E-~?lg3k(TsZzMqs08Dj!lj)O9}Q+fq~3k}IH{rGByM3m zg02%18}5T8$h`H?x`-dVERLFm#pig0H7Z3SXS@zgpp5&MdCri49pmxDS~Ho z0tDc}1)Tuu7jqf6x}Tb;Lp?;mHVS0?VdLP44VQ5?9ca!}b$#{fmC?;Aut=x6Z5Md> zFLr37qwuh=JUg2ZiwnibR6Q&vNni@#5<7&OG6_H+c4hD^rZ5g;JbYhn;8=rUU=I$q zfIteGDL9{+f{DlTL&~_uwsvg-c62XvMXR2lNJs-6 zzj(=##z}x69bB^pnoFc;e=KQxVE2U&mH5zJ_CDnAM6mLQFeyMP8-iIOulgOxyA}pY z-)r1)Jjw~)Fn|}&&{Nokj{2vR;wd?rNhed~(bf0_A+X=Lb1IX+ zi>_g^&ID7frl=|`a(*39IS$^&G+-Fhd$pLd8-cQC0`vxHV}K<}SU7d;+Pab0J~e$@ z%7jP&v?rhxYRlhIV^rT@LcNp23gx&OWtW621JeR{%YJ*B|BQ-(KxqPW0h%O9^6q%QzU-shnseHFw3`EDG zk=p`mqC-cI)}pi!gGCl0DG~pUV~#VabWe#16wu0WZ2ys?5!hyo zJklot5D3tOXIV1*gbt$(PiwNoO*l{0`Hi*oJw7)4d9~eQ4}TvzO2JX|sRK4ur<{?C zHLsAJN(?&xr`!EcX|gMfg%1QfLR$R@W;>H+0I_1AbhTy2j!HH*wuVOM-@QhrQ@_a` zn5+648$tLT!6rbdX5D*6Q}g`PEI{260J@8K@RBy2*Y)zd!<|1W?-I!!2~IM{$?OBc zbN_@vkE9uBb8eB6YE<5Z5bm(X*xb7G&6@|thWM@4_;+ZT!-l ziR<2N)2XbXuWyl_zyI2jH7Xa7s%WF3DPaj$x(OP42$9n!DzAi9fv9C`Gibtx;5r{* zO7sCZB33rG^SDR)u{gz>fd#%h_`~d-0)3KsO3S`#vsCeW~5_gX08XSIDw3Zvi8g|X~0)>6dX(g{rq0e%pz}VgM}bv zF4)1Q-_DrX1y>o3s8L!+vuc-D`Gj|aJ-%S3cH~G6#*KQ}yYb)P@y~ONVeojPitv5w zzJ}Cj9Q^31k#!!u1o+cq={^;Pv(IHSk6nd-2R(QYC*FER0T-DC$U4_502eKiHy#BN zU;F0_56WkZUWO-U4@kAZUBbTUoS~r@&_B1V%Sp&5UUvG4zl{ZEY}8M`SbYH5ukn>} zV9T+=(7k2I+D}`irbc?AQMcCZ9mT1cc+{h`dL-#A1Rl~*vgy4ZjXh634sGpj*B>O7 zf>7q#an_?+z!QEE+mO}$R|_4-8LVpO!-o%(C@-X&aSSzKHHz-8?lE_FB9nJISkz%a zH(NLT1WR*6#Z2agmLQ?1-GPMY9&RA)B#%rz%L?A7nR7pdS& zU>iwwqL;seGBSz>^{!ehU;a`P2iP*rIfp;vR_m>6O1Hefi8Q?8Qxa%dR=@KsTC%o+ zK>6Y_98gUY*2|KhVp;U!xU~kN0KD%O$M%a2_lR_c)^SQ-d4aJ3+1$}av*4#N3GR*b z<;i;D`Ujf>M-q`Jb@Z%@ z*@c&P;fRgUnYM~)||M}HH!r7QN zp;uWOtHx`N90S$f&_9E|auT`jxc@+CwoY#H0k?0jyg#8?-?tNYK}bL6q+Ygt?F)mV z8oUX=diYV%jG3&T

ib)&L?`(l=@x`;z58nX!N?>VEyICQ6> zkG^xi*i65rdr0v)jFjEecbhP}Utt*MxZ|veiAmBwmi54n1XqnlydX1s!j5rPmH#wX7jB06VNpY8*2wDr0guDUIUr<1xGD^w624_mh zrg3Pt_SM*q-yvbVU5q43G)h2`z3F+dl$l5ROPOZh6e23nU8l`fac#AZ6v;poc8`ap zfgw+%a8}s=XxK@R0m0^0Rxfy52KQ%2_Wo99odqps^Km@($U~d`Qz_=(?OgNi2Vftz zA)(fEYGsE@%_D8|UpUm*_&b3GFbgIsCt)V1iIhP0*ZnDr)|?5+d>%BXy19ox6WRc! z!gpkcNgUz1jPn2{n56IhlAm8zwOp)TV9S<-Lt*_UzGv6Lj)f59>`2}3@YsyVohV`oo}{Y(M9 zYKnqL>dGMDuz%E80)~-c0OwnaDY^{k;Zk^5P)7j!J&%eiq>X3*R)B1eCWI6YJ3E|u z15cPSdvC4s9LrMQtnvpti+Y65;tX4vXCnH8Ry@Tiq1k6h|az5jE?kILV?$G5C1kE1;?liM$%K7#~4--;V{;TAG-kpX&sI)h^1PP4zU=kuhp1*+~7y}g0RDLnVG5IxE zlztmVa@y&Jm-TMq%qv4hVj@=VrKU5~7jfZsS(W6An#$ALcJ$fTG7?eP@v#Fu56~?J+Vveo_Lw5`l7gCNxPjNab7N28+r9+!&g`_(dNO|yZDVPh>f!T5hGRsJ- z^Uru7WgXO$j%Omk9X!Y8$m*vxVOlI^^Wl3YSZi5u@vqa7Lu4d3Km1NiSOqME!k;YVE>2P!AUIanJ_2=iG zmRxG0m5-pHM{hC|s4f)#1z|WjRCSSi958JdYne152!qPX$!UTiB2r(RN;3&+$r=`; zUHW_uwV^3ACvMi7ieYLh1_AM#n)_tPXCyAYFXRev{%x)sfr_^}%g$^V@jaAulFYcr zfxU)t+rmahE|X73=j}sHyv9+)BE8vAyEc+sKF;LfjQThH3~|T}5Hc4`TQ%lmhOrMw zhofooafQ?%?lt-966{J?IF!WC4t13U6rbA(WFiK(p!?=e-BO&m5hF;Kw8Q9^FW(JR z8Uudg8}6ehguT+59Ll8zlO?_>2B6BFYodThB0Un2?&k?#tnbvbdE+}5;Bxz!u^*oe zmoTj}L67ey2BA&|&gk~N+N+|UqJ+^^R{f?{sG5d9%A)1G-@ZFGytD<9@9GH{$elfKzn~T zY@zSGtEfn+mdt*SFy&g0V{KuiO5@@(MUKCK4w)qZm9|5jDzUC311(K&N=icUIPcdl zqX=JEZK!+mC_3~!yTOu@t^2;bJZVhNI-?X6V?3zC(>UvtIL6(z{5NjR_i*QdDpczI zb?T)lWy@#){Rlg?06n?fOq46@Y>{vZHg{tP%-ZxcDF0U1F+J+V>Jqc!?2*2uQrKEu zlK0KCHA%`qm!qEO5cD6T6l{Ays9|AARGFIKr_k7Wf-#2v=1dJx3L&7mQ3!R_Hefag zI8NFXj0%Zj$i}%`YKD+Rk3>~Tf*Fv>@EldTB62CEpo~-gr(;UakYB6YlzCTY=XYEu zcJQ$S2YiT_c2lq?CNlQ?a~$E@|FTt18twmICKdiia}$5$q+hjdSw8fFMy^*yNmVgf I{;cQ!0eP!q^#A|> literal 0 HcmV?d00001