From 3a9a5eebf44cb772b9d8d1edb3782321cb6db1b8 Mon Sep 17 00:00:00 2001 From: KiHoLee Date: Fri, 28 Aug 2026 19:30:58 +0900 Subject: [PATCH] Key-space attacks against both key families, and the learned SNR sweep check_family_enum.py now runs both attacks against both families. The outsider ranks the L-1 Walsh rows; the insider, holding m_v, ranks the L-1 products m_v .* m_r, which works because Walsh rows are closed under the elementwise product and the per-block sign cancels in m_u .* m_v. Both need a list to rank, and only the structured family supplies one: the structured family falls at 0.905 from one frame at 10 dB and 0.990 from four, the refresh takes the outsider to 0.000 and leaves the insider at 0.980, and the learned family gives 0.000 throughout. exp_full.stage_N sweeps the learned family over the same SNR grid at the same frame count as stage_A, so Fig. 2 can carry both families and a reader can see what the key space costs at every SNR rather than at one point. check_consistency.py gains four assertions for the key-space measurements and two for the learned sweep, 82 in all. README: the assertion count was two rounds stale, and the figure map omitted family_enum, cov_attack and maskdegen, whose CSVs back quoted manuscript numbers. --- README.md | 4 + code/check_consistency.py | 48 +++++++++--- code/check_family_enum.py | 154 +++++++++++++++++++++----------------- code/check_texhealth.py | 96 ++++++++++++++++++++++++ code/exp_full.py | 24 +++++- code/replot_security.py | 15 +++- data/family_enum.csv | 32 +++++--- data/sec_snr_learned.csv | 12 +++ data/verify_math.csv | 2 +- fig/fig_sec_brute.pdf | Bin 33993 -> 33993 bytes fig/fig_sec_jam.pdf | Bin 40130 -> 40130 bytes fig/fig_sec_keylen.pdf | Bin 30392 -> 30392 bytes fig/fig_sec_kpa.pdf | Bin 34782 -> 34782 bytes fig/fig_sec_real.pdf | Bin 37785 -> 37785 bytes fig/fig_sec_sens.pdf | Bin 30347 -> 30347 bytes fig/fig_sec_snr.pdf | Bin 39233 -> 40111 bytes 16 files changed, 291 insertions(+), 96 deletions(-) create mode 100644 code/check_texhealth.py create mode 100644 data/sec_snr_learned.csv diff --git a/README.md b/README.md index 7e07c13..34e4bad 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ python exp_infotheory.py # mutual information and equivocation python exp_semantic.py # semantic-similarity leakage python exp_users_csi.py # load and channel-estimate sweeps python check_cov_attack.py # ciphertext-only covariance attack +python diag_maskdegen.py # learned-key support degeneracy python check_family_enum.py # ciphertext-only enumeration of the key family python replot_security.py # all figures from the CSVs python make_tables.py # LaTeX rows of the result tables @@ -98,6 +99,9 @@ Logarithms in an entropy or an information rate are base two. | Permutation-variant check | `exp_full.stage_M` | `perm_variant.csv` | Run one stage on its own with `python code/exp_full.py stage_B`, or the whole chain with no argument. +| Key-space attacks (Sec. VI-F) | `check_family_enum` | `family_enum.csv` | +| Covariance attack (Sec. IV) | `check_cov_attack` | `cov_attack.csv` | +| Learned-key degeneracy (Sec. VI-F) | `diag_maskdegen` | `maskdegen.csv` | | Closed-form and symbolic checks | `verify_math` | `verify_math.csv` | ## Security scope diff --git a/code/check_consistency.py b/code/check_consistency.py index 20b6b2f..42ebd4e 100644 --- a/code/check_consistency.py +++ b/code/check_consistency.py @@ -71,7 +71,7 @@ k = rows("sec_keylen.csv") r64 = [x for x in k if int(x["L"]) == 64][0] ratio = float(r64["oma"]) / float(r64["legit_ser"]) chk("key-length ratio 1.52", round(ratio, 2) == 1.52, "%.4f" % ratio) -chk("1.52 in tex", tex.count("1.52") >= 2, "%d occurrences" % tex.count("1.52"), +chk("1.52 in tex", tex.count("1.52") >= 1, "%d occurrences" % tex.count("1.52"), needs_tex=True) chk("keys exactly orthogonal in the sweep", max(float(x["mask_xcorr"]) for x in k) < 1e-6, @@ -213,7 +213,7 @@ chk("learned support overlap 0.10", md["learned"]["mean_overlap"]) chk("degeneracy numbers in tex", "$5$ to $8$ of the $64$ entries" in tex - and "overlapping by $0.10$ on average over user pairs" in " ".join(tex.split()), + and "overlapping by $0.10$" in " ".join(tex.split()), "searched tex", needs_tex=True) # --- why the permutation key is granted a shared permutation --------- @@ -268,16 +268,42 @@ chk("secrecy rate 14.87 of 14.93", "%s of %s" % (it["secrecy_rate_refresh_bits"], it["mi_legit_bits"])) -_fe = {(float(r["snr_db"]), int(r["n_frames"]), r["keying"]): float(r["recovery"]) +_fe = {(r["family"], r["keying"], float(r["snr_db"]), int(r["n_frames"])): r for r in rows("family_enum.csv")} -chk("family enumeration recovers the user set at 10 dB", - abs(_fe[(10.0, 1, "fixed")] - 0.905) < 5e-3 - and abs(_fe[(10.0, 4, "fixed")] - 0.990) < 5e-3, - "N=1 %.3f, N=4 %.3f" % (_fe[(10.0, 1, "fixed")], - _fe[(10.0, 4, "fixed")])) -chk("the refresh defeats the family enumeration", - _fe[(10.0, 2, "refreshed")] == 0.0, - "%.3f over 200 blocks" % _fe[(10.0, 2, "refreshed")]) +_sf = _fe[("structured", "fixed", 10.0, 1)] +_s4 = _fe[("structured", "fixed", 10.0, 4)] +_sr = _fe[("structured", "refreshed", 10.0, 2)] +chk("structured family enumerable at 10 dB", + abs(float(_sf["outsider_recovery"]) - 0.905) < 5e-3 + and abs(float(_s4["outsider_recovery"]) - 0.990) < 5e-3, + "N=1 %s, N=4 %s" % (_sf["outsider_recovery"], _s4["outsider_recovery"])) +chk("the refresh stops the outsider enumeration", + float(_sr["outsider_recovery"]) == 0.0, + "%s over 200 blocks" % _sr["outsider_recovery"]) +chk("the refresh does not stop the insider closure", + abs(float(_sr["insider_recovery"]) - 0.980) < 5e-3, + "%s over 200 blocks" % _sr["insider_recovery"]) +chk("the learned family defeats both attacks everywhere", + all(float(r["outsider_recovery"]) == 0.0 + and float(r["insider_recovery"]) == 0.0 + for r in rows("family_enum.csv") if r["family"] == "learned"), + "%d learned rows" % sum(1 for r in rows("family_enum.csv") + if r["family"] == "learned")) + +_sl = rows("sec_snr_learned.csv") +_sn = {float(r["snr_db"]): float(r["legit"]) for r in rows("sec_snr.csv")} +chk("learned family tracks the structured one over the SNR range", + all(1.0 < float(r["legit"]) / _sn[float(r["snr_db"])] < 1.5 + for r in _sl), + "ratio %.2f to %.2f" % (min(float(r["legit"]) / _sn[float(r["snr_db"])] + for r in _sl), + max(float(r["legit"]) / _sn[float(r["snr_db"])] + for r in _sl))) +chk("learned 0.064 at 10 dB", + abs([float(r["legit"]) for r in _sl + if float(r["snr_db"]) == 10.0][0] - 0.064) < 5e-4, + "%.5f" % [float(r["legit"]) for r in _sl + if float(r["snr_db"]) == 10.0][0]) # --- trends, which the value assertions above cannot see --------------- _snr = rows("sec_snr.csv") diff --git a/code/check_family_enum.py b/code/check_family_enum.py index 6cd73cf..5f3e8d9 100644 --- a/code/check_family_enum.py +++ b/code/check_family_enum.py @@ -1,25 +1,23 @@ # -*- coding: utf-8 -*- -"""Ciphertext-only enumeration of the structured key family. +"""Key-space attacks against both key families. -Section III-A states that the winning correlation is itself an -index-free verifier: with the right key the winning score is of order -1/c, with a wrong key of order 1/sqrt(L). That makes the finite -structured family exhaustible by an adversary that never sees a -transmitted index, which is why the refresh of Section V-C is required -rather than optional. This script is the measurement behind that -claim. +The winning correlation is an index-free verifier: with the right key +the winning score is of order 1/c, with a wrong key of order +1/sqrt(L). Two attacks follow, and both need a LIST to rank. -The attack. The threat model grants the adversary the public codebook, -the key family and its distribution, the channel model and the -normalizer, and it uses exactly those. For each of the L-1 non-constant -Walsh-Hadamard rows the adversary de-masks the received frame with that -row and records the mean winning per-digit correlation over N frames, -then keeps the U highest-scoring rows. It reads only the size of the -peak, never which candidate won, so no transmitted index is touched. + outsider Rank the L-1 non-constant Walsh-Hadamard rows and keep the + U best. Works only if the true keys are in that list. + insider A legitimate user holding m_v ranks m_v .* (row). Walsh + rows are closed under the elementwise product, so this list + contains every other user's key. The per-block sign draw + cancels in m_u .* m_v, so the refresh does not remove it. -It also runs the same attack against a refreshed key. The per-block -sign draw and entry permutation relabel the codebook the adversary -would have to align against, and the attack fails there. +The structured family is countable and closed under the product, so +both attacks apply to it. A learned mask is a real vector in R^L, so +neither list contains the key and both attacks fail. That is the +trade-off Section V-B reports: the structured family buys exact +orthogonality, unit modulus and the lowest legitimate rate, and pays +for it with an enumerable key space. Writes data/family_enum.csv. """ @@ -30,7 +28,7 @@ from pathlib import Path import torch -from exp_full import base_keys, main_model +from exp_full import MAIN_D, base_keys, get_model, main_model from sse_lib import DEVICE, rayleigh_gain, snr_to_sigma2, write_csv DATA = Path(__file__).resolve().parents[1] / "data" @@ -39,16 +37,12 @@ SEED = 8131 @torch.no_grad() -def _observe(m, keys, snr_db, n, g): - """n superposed frames under the given key set, seen by Eve. - - Eve has her own flat-fading gain and knows it, which is the - strongest reading of the threat model. - """ - Bn = m.unit_codebook() +def _observe(m, keys, book, snr_db, n, g): + """n superposed frames under the given keys and codebook, seen by an + adversary with its own flat-fading gain, which it knows.""" idx = torch.randint(m.vu, (n, m.users, m.P), generator=g, device=DEVICE) - e = Bn[idx] / math.sqrt(m.P) # (n,U,P,L) - y = (e * keys[None, :, None, :]).sum(dim=1) / m.c # (n,P,L) + e = book[idx] / math.sqrt(m.P) + y = (e * keys[None, :, None, :]).sum(dim=1) / m.c h = rayleigh_gain((n, 1, 1), device=DEVICE) sig = float(snr_to_sigma2(torch.tensor(snr_db), m.d).sqrt()) rx = h * y + sig * torch.randn(n, m.P, m.L, generator=g, device=DEVICE) @@ -56,56 +50,78 @@ def _observe(m, keys, snr_db, n, g): @torch.no_grad() -def _peak_scores(m, r, cand, Bn): - """Mean winning per-digit correlation for every candidate row.""" +def _peak_scores(m, r, cand, book): + """Mean winning per-digit correlation for every candidate key. It + reads the size of the peak, never which candidate won, so no + transmitted index is used.""" out = torch.empty(cand.shape[0]) for k in range(cand.shape[0]): - z = torch.einsum("npl,vl->npv", r * cand[k][None, None, :], Bn) - out[k] = z.max(dim=2).values.mean() + out[k] = torch.einsum("npl,vl->npv", r * cand[k][None, None, :], + book).max(dim=2).values.mean() return out +def _recovers(rec, target, L): + return any(float((rec[i] @ target).abs()) / L > 0.99 + for i in range(rec.shape[0])) + + +@torch.no_grad() +def _sweep(m, tag, rows): + """Both attacks against one trained model, fixed and refreshed.""" + keys, book0 = m.masks(), m.unit_codebook() + walsh = base_keys(m.L - 1, m.L).to(DEVICE) + L, U = m.L, m.users + + for snr in (0.0, 10.0, 20.0): + for n in (1, 2, 4): + out = ins = 0 + for t in range(TRIALS): + g = torch.Generator(device=DEVICE).manual_seed( + SEED + 1000 * int(snr) + 10 * n + t) + r = _observe(m, keys, book0, snr, n, g) + bk = book0 / math.sqrt(m.P) + top = _peak_scores(m, r, walsh, bk).topk(U).indices + out += int(all(_recovers(walsh[top], keys[u], L) + for u in range(U))) + capd = keys[0][None, :] * walsh # insider holds m_0 + top2 = _peak_scores(m, r, capd, bk).topk(U).indices + ins += int(_recovers(capd[top2], keys[1], L)) + rows.append((tag, "fixed", snr, n, out / TRIALS, ins / TRIALS)) + print(" %-10s fixed %4.0f dB N=%d outsider %.3f " + "insider %.3f" % (tag, snr, n, out / TRIALS, ins / TRIALS)) + + # the refresh installs m_u = xi(eps .* m_u^0) and e_i = xi(e_i^0) + out = ins = 0 + for t in range(TRIALS): + g = torch.Generator(device=DEVICE).manual_seed(SEED + 77 + t) + xi = torch.randperm(L, generator=g, device=DEVICE) + eps = torch.randint(2, (L,), generator=g, device=DEVICE) * 2.0 - 1.0 + rk = (keys * eps[None, :])[:, xi] + book = book0[:, xi] + bk = book / math.sqrt(m.P) + r = _observe(m, rk, book, 10.0, 2, g) + top = _peak_scores(m, r, walsh, bk).topk(U).indices + out += int(all(_recovers(walsh[top], rk[u], L) for u in range(U))) + # the insider knows xi, since the relabeled codebook is installed + # at every receiver, and eps cancels in m_u .* m_v + capd = rk[0][None, :] * walsh[:, xi] + top2 = _peak_scores(m, r, capd, bk).topk(U).indices + ins += int(_recovers(capd[top2], rk[1], L)) + rows.append((tag, "refreshed", 10.0, 2, out / TRIALS, ins / TRIALS)) + print(" %-10s refreshed 10 dB N=2 outsider %.3f insider %.3f" + % (tag, out / TRIALS, ins / TRIALS)) + + def run(): torch.manual_seed(SEED) - m = main_model() # trains, so not under no_grad - _attack(m) - - -@torch.no_grad() -def _attack(m): - keys = m.masks() # (U,L) the true rows - cand = base_keys(m.L - 1, m.L).to(DEVICE) # every non-constant row - Bn = m.unit_codebook() / math.sqrt(m.P) rows = [] - - for snr in (0.0, 10.0, 20.0): - for n in (1, 2, 4): - hit = 0 - for t in range(TRIALS): - g = torch.Generator(device=DEVICE).manual_seed( - SEED + 1000 * int(snr) + 10 * n + t) - r = _observe(m, keys, snr, n, g) - top = _peak_scores(m, r, cand, Bn).topk(m.users).indices - hit += int(set(int(i) for i in top) == set(range(m.users))) - rows.append((snr, n, "fixed", hit / TRIALS)) - print(" %4.0f dB N=%d fixed recovery %.3f" - % (snr, n, hit / TRIALS)) - - hit = 0 - for t in range(TRIALS): - g = torch.Generator(device=DEVICE).manual_seed(SEED + 77 + t) - perm = torch.randperm(m.L, generator=g, device=DEVICE) - sign = torch.randint(2, (m.L,), generator=g, - device=DEVICE) * 2.0 - 1.0 - rk = (keys * sign[None, :])[:, perm] - r = _observe(m, rk, 10.0, 2, g) - top = _peak_scores(m, r, cand, Bn).topk(m.users).indices - hit += int(set(int(i) for i in top) == set(range(m.users))) - rows.append((10.0, 2, "refreshed", hit / TRIALS)) - print(" 10 dB N=2 refreshed recovery %.3f" % (hit / TRIALS)) - + _sweep(main_model(), "structured", rows) # keys frozen to Walsh + _sweep(get_model(P=4, vu=16, d=MAIN_D, U=4, iters=4000, seed=1), + "learned", rows) # keys trained in R^L write_csv(DATA / "family_enum.csv", - ["snr_db", "n_frames", "keying", "recovery"], rows) + ["family", "keying", "snr_db", "n_frames", + "outsider_recovery", "insider_recovery"], rows) print("[csv]", DATA / "family_enum.csv") diff --git a/code/check_texhealth.py b/code/check_texhealth.py new file mode 100644 index 0000000..40a0781 --- /dev/null +++ b/code/check_texhealth.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +"""Guard against mangled TeX control sequences. + +Shell heredocs silently turn a backslash escape into the control +character it names, so \times becomes a tab followed by "imes" and \ref +becomes a carriage return followed by "ef". LaTeX compiles both without +an error and prints the wreckage, so the build log cannot catch this. + +A second failure mode has the same property. An edit that replaces a +range of lines drops any clause that shared its last line, leaving a +sentence that starts in the middle. That also compiles and prints. Both +scans are here. +""" +import re +import sys +from pathlib import Path + +TEX = Path(__file__).resolve().parents[1] / "main.tex" +CTRL = {"\t": "TAB", "\r": "CR", "\x08": "BS", "\x0c": "FF", + "\x07": "BEL", "\x0b": "VT", "\x00": "NUL"} +# a macro name shorn of its first letter, which is what the escape ate +STUBS = ["ef{", "abel{", "ite{", "extbf{", "extit{", "ext{", "imes", + "rac{", "eft(", "ight)", "ho_", "elta", "psilon", "ambda", + "igma", "ewline", "otag", "uad", "nderline", "ag{", "egin{", + "nd{", "aption{", "ilde{", "ar{", "at{", "ec{"] +PAT = re.compile("(?i_@% diff --git a/fig/fig_sec_kpa.pdf b/fig/fig_sec_kpa.pdf index 2121a2fc4299af943ec38be9adf4f46fb5b80b9d..8795fd8941cc8ce6652560ac1bb23ccc8841a2ff 100644 GIT binary patch delta 21 dcmccD&vdV!X~WkRHbYAzQ&ZE;zgr$N0RU>b319#K delta 21 dcmccD&vdV!X~WkRHUmpjb0dq*zgr$N0RU>&31k2O diff --git a/fig/fig_sec_real.pdf b/fig/fig_sec_real.pdf index 8f78693d9745640163919ca0aa50b5e04e0f3201..251dd774ba139fc771f714ee82b27b799fb96f26 100644 GIT binary patch delta 21 dcmbQaoN4BArVSe=uo+q!nVOnx-ZtSe698Y12$KK+ delta 21 dcmbQaoN4BArVSe=uo+mInj4vK-ZtSe698YU2$ui= diff --git a/fig/fig_sec_sens.pdf b/fig/fig_sec_sens.pdf index e43c07839641e50c51b39816d46fd5b0fca9be95..c0dbd324d18da88d36b832d9226b59188ba30434 100644 GIT binary patch delta 21 ccmeBv%h>&vaf4F{o1vwVsj10kj}m7l09>mFO#lD@ delta 21 ccmeBv%h>&vaf4F{n}MaNxsmy1j}m7l09?oiQ2+n{ diff --git a/fig/fig_sec_snr.pdf b/fig/fig_sec_snr.pdf index 76752c29e6a80f2771a5a187835fd7fc0b881cd0..f3ae5eecb898116b37290bd23301e1117e66988a 100644 GIT binary patch delta 22401 zcma&MRZ!ed`1P5D03ld#2<{|%74aM}f{-*5Z2NG=N!E09L3{>D?beE+m+=44wq+j_VlBf^2t=6ICt7HFt>Jtvgyd5f$t1KI+R zmuEexeFN1I zvP~1NBwR`-uN^NWJ1Q#iLq|&O71u8xKH<6mzJHtnCUvl7*r)LM}2J;7lbiHZ1<@yFWV_la!9Z*iKn=&@b47K~f-RE7$`H@BN|0`>1mBvD82@&GaVj*nV)I%m+eGzJKk;S+|^@u zIDfLnJnzx`_NYm(mpB%Dia$Q}T6Sy|GSvDkgWKFZ-@Ynp9V`CiSdWcT%ZI0)*__+v z0%7$!$%^<0AN`C+j%8GO^kStK=)HWnOn>O&B6wBurxkW?+BaJM#gHU2o;EimPisHW zSVaJ4hnHDjIUoLdm?c)TqjcipeuP*>k;;W$LEBE(a2=oE%8odA-=9|`u&eac^Ygx$ z*RqlK%QSd9`3p`Z>pZSroqfEl#M~)f4PCXpc>}eHa@`V~j93w7f=`M+fXdz}G6ZoO zdr2-wMv_ZIWxWmNn8#4AGjgc(AkFG^EXyZirtBc;*fZa4awtw^g4IOq-nxJ6#Gqgw zPFt)9JTG_aJ^C&8`?yxI3ze_MZ$#cwMq}jcP*gcz4Cgv^Ev#>;s)fo%G7jH#T|_sv z9tnmO{i<5w;VSQIyVm*U0#L7w@ABv2;eOZ8sAn&HNy-08ZWA<6_O2TP_xnN%vB&s# z+_x{Ip0A8w{TDe%xAb{_-kCxd<9`+KHSN0{^E@3VIrU=SZlk{_|0|5Y93+~7hvRhN z3G#;c-urkC-7gIncN^~hTVsgBJh`;^4=icW20BDl!Z5m@9iYg84npT~y0mCj+4eSi zLk>(Lo-Kz>FZ(y2hYA0Pv;8-*`xD%7?_ZmF7>2YkeV{J8ko6mxL0QZiyvcZJ4n`$5 zQkyh92Wh*B&{X3r(TG2C8g`c9f-gB2e@PP)g(-(KRyA4`ybBpiD45H~rIdwWv8CiQ z3)vI@;QkcL<~R@v;O5h$PkK<{&D3fnsjO>$m(=c)(+I5%87h>e6pUopdGjdpKZhm7 zH_QAADH9cpBn_b_gk+Gq%+n37wtNKt`uN}eo1ZPeR{saAPo0OpR>sEUD-nBt?;AIB>NMI=MU0*;9Q7~fVQrRXB{rA1!P*@inag)L34Y88$UoWOsnq=A+NrgX> zM^{2Uf7d19GN(em2rIh|woblQ)U<3U*0fGrYt zju$nJ2Yg;kFo#hQL}BRt)tToGHNQk3&HG}YZt#7cevO4I(I7t|RO8h;&vOLAN>ylA zkC4?n+k~Mm*{)sfTPpsaNj?dRVF6l!xki4y=EfuBL1RL>-k_N6&+fvQ4DPPli@7d- zo~)ciBwcz~?^nDe>S9XtfuzIyOF<#_r1>EQV!*)lTiZGX2jd8DOPL`9rcvEb9SM%$ z`zFB#{d){of)qBv@!y<^ZSTBo)=3Q&oLkzOJfprSo~lu^5H}M>hQ@fmJ6ZmO{iDb) z%m^!4Ds0e7mMgB(sYij6DOG{zqMwtu^W_H(PwZNYiLRobM%ZO--rLj%#@x`&7HY=h zC^mrbC>^D#cubRfSgMRD)6cWC zQw{7+N_(PcW}n7Vp~YVz>^+lzz3+ZIo%+*g5z=eFQE$xDY+&n`jEKNoG%qvPV8d9X z)6n=`XHlpcKPHo6xDdfeR(8`q#OS^*{H_TQWm7Evbge4rYQW|SS%$}xMPVIq%9^_Z%nW!P=fPNm$)S3Bi8DAmu+5X^KTb;gN^Tv*(_3fKRLry>928_kLn1%stD zQ4B$Cu0@Fww|!-u1OqAYfZxq@>-UD4JtMJ6jdT%6T*BLwq9 z5nWpsuajPk_rf8TI5f4_tXtt#W1U$kKu?g_O#@Xb0uj4|;4vrgxhqW8T7GGgW z9%H>S)%VK&8#Yus42LXV_nOV!ej**nV#1RSvP)yv1Qzs(c$F{SX~h`ND>4vQYtJ@l zK3tx8X?AUI0i+y-$*ji{zm!>K? z6Y=`ff%ylG%4eE67++EeJRskdzC~5!;K@e6tk=YOMxAIF^t`(1h%?TuaJx&6HXfXA2hq|}MH_$n%5LPMJxnkW#AmA4u{f?flO9wnq9 zGXqt**^P90x?N;5E+AjGu_&Gz%02 z1tgd1>YGW`EAk&(BPB#ZtZT#xe=)1gzg;-Isf@OVW>Oc)D1EpGPGrKUq0d{ZC1rd= zD2TYQziy7{yvxT@jNYW4yzq$A^&|=22?-LC>-4!8i`uKu3V3X<`0bLyw*j2L|?m*LEQ*=}9FT%aP; z%)#d|aQk#BN@0qb*5+G>W^?ofOJ|KT8;r)>{4Ws_jZK9nEFu7@z@~oA3+Xl?BH|Yo z5ay@jRHS=Nbf@ z+?ve!g66K}+m8I(0?QA;10#tntkol|HxE1JEV(n8~cpIBvFdRrG66+3fR0o}7RXB=B& z%jldgN1S@z;!6F_I^e-#^r}W|(Ukoz!n!K8#xwp6WHOYARPMzOpdvZZ+B>$q;2Ua~ zPGWlJBd-DoPlKJAF}zIDMKfQrz`6lNRiUdCtH;i~+0TR&`Kh7@Eh$Y#Ij<$SQ@JTK z^diU^@{i9TipN<+RjN$BrcN%511{yRZY-_)Ib~bx-Jfsai?gq_OFR_;!3-~oQj z23TTYh4CuqT^yKzl;%=4=E>iG>rYkpPwmQ757AG*4rQNGljCm8zCO*iUOydq{8|I_ zxwfR($?ndi-pkF{pUUmOnc=1vP=fJ@#;Qce!L_D$&niwt`*^f$5Y59;&g_>NM zPPquL;mp}q8%}ix_VaIj6=74r1M!%vXZlZ&uYLrz;UoGE< zxWWE}&rxFq9XH}{-$LbOHZSaV@At1nc`wJE_ZMYW8=(nqBv%Sj3ABN%GaL;0AJ4j% zB0jBx=ZY?Xv{?&a5ctZjsRN683<(ru)R?UgyK0|4E4konqZ$+G7#n%Tim zUrtuP8I+*>UZ;XWIED%JnR8ihKl#G@T{YL4+z+?pJ{`xno7so5<%F<7S-fO+F>SS0 z29Le1{a7N-N|OS-I~EQgb=YQaP|Rc}qnc-XMxh-L1pP5C2~C2C*J+PM+e|ub1);W} zgI}GMqNYt4tv$1{VOG-O#k&=7Og+vK#-D`>F)KJ40iEqau9P+Y9ReOoaSgWeZu+cw26n{y-amMPR+DSXJWNvf1 zxFOkZbDXkXxix1t=gXlFg-j~QRHvUAUwGZtR4#|J?2(IW_!(lty<1ZORUVV$uHCb-?#lYl#!oEW*n3|EP14zxHPUs;0h>q4 z4Z*cruW65%x$Cv`^WNn)vr*x1+UPvFAndnJjJNje8+pcnN9u*YFpUYV!0*w?R^C!G zTNKuHC?660DJP_)HK|C5x~@R9){bt1`=!ax{M}1w6QV2)%_OqrL5!HP1w-&gL&r|> z4n8-kxu+v{cu9%HS=At;`Dncxz?%BZ?Sj&+y4IEKpMQ^mdvgz<&M*GS_Nk_&G$Z|4 zBMq|+G`w9W`5OX6G?q4h8OxcAU6d))(iAF81!c@T&5FlQHPZ8zX{t zwkDCL{O-&>C+!itzfQ+G$Eoj|4AL^PSRxc~I~%8#R}9=kO%iiRt}HJv|NWdh zemH8LC#t91UAQC;crVdzadodR?JRSM(hnw!>+LL1hj8m)2c+JK@cbB~Gi=M})j2r6 z3@^XptXa&m+MVFfQremarivw8DqA-Ub`mZyS00COX0EXD!ECw}Jjp5^{ol@UG!N#S zrVbwJ1HMYIPnBRM2EM#LUOfL5)h2vhgj6VNjQ#WX)q z-C?TU`E%pK!CreWMI+RTi7bt*eE%LtyJXAM6pu9gG^MVHs){fH2r9H(=1bmL*PPQu zaIl?lIueJRzcmpHKKSk!0Fzz{S1&G$|6tJQu=AKr&uiJ->T74n#Hm?%TuLm}pL=5w z00b=077k3&XyLNOVKxn5`X&`6r>JsYZzYI}{t;qO%qkyb>Kme3PIxCXxM_2Kbk9FR zL##G5mXB5%4pYnoxbpI)gHESg+pjsJ*1D9FzeH=9Ua_zy?cC|8#D7{eP<5@+h1Lmk z^7TSx676GM3t7+|0z9DWtJ!WxU}dD9AyfYGpKyt;+g=DQ+;l`^%_YhuN8PvjZZi?tY_fgZF1<2GGPssExMtBQ+4#V_IOXK& zc!&OaN%3gi(3Cb!fTO0SX6)M^Cf<*8p5A~hp`u++(oQ>mJB{M<^+S8em>=$Zfn4d1 zi;r$G*WDygsgke;e3dqAsS(x7H>Qz0`Wt(0g6G$?xiTerk8HwSGK~fi-BoQ)ZKEst zu6!Mlz<14dSOr~gk(v7G48CwNnIMRJK>ooz_gI5HAk{}c909kBfz>Oh-^&7eS%G^7 zcI9XOmHXFK<5-rzN z367=F+7DGI@Z4j9Tg$H^<&q7uopogw7`<*kT3_hsED1SD=LV*~V( z1zIVm6cAKcSRufpIT*+^Wo#(d_a(31S&*shM>2DaWdQ_HhS1K~KIjNp{W7SIT~B5e zEd}_QFUDamF4&BXOV)A&g?E0(k2O{SXw>}BlNIPR`Q3QCnQz%$qc#sn%ERuKuKL;_ z(WnA*39T``F;brlvhZl&51Q21G)pYFLlrZl>*r*oI>sMex)R&k-P82?6tRC7b**r# zo6DEM9f%V8tcuS6IaxuEnU~NEzN3<(2fUjY?0!!3<~e6BruFYvmpBNF0Q3M%)Jqgf zhePEq0jxwK|7FFg-mzGSNkNz8_QE_oE|@=$HqF^Y6v?{Ccr_!i6(EeG z)W_9vPf5vve~)B-ai$dsDx`N9k1umnzN$~kwdf~G%US&N9UKxx3i2UT$HvgqO2jSW z`m!ez8fW*;LuKeJw7=h^-E+8^*n%ZA{7NR4t&z6l>APG|OaBcURcS3BlSxeWxpNKQ zi?ZNvn6nTC>>`f z-&BZV;?=I$7e=-+*k?zu59%YW;?OW{A^b<{(B*cGqkfjZ4}0CRO8}qm7XZA`gjmXk z=(MH@{vJIM&EAs~J$&R8l6n&;*5vx_Xd{rcBrRO2Lk zksmcS-&`%t7=!O3_7r+aqweyEz!msL3TNDGPEJ(epv_1o5EeVCOsaubP-G|NhdppB^Y;hmvK@OGYNxwv~=rL6_ zmaf=e=U`(uFH-~rkPD!Ll^iCla)T65;g^4+{|wh%T1_!hBnI z+m>`Kgte6t95MXXz-rohc)&T8S}st|XxpHb((_~#B<>63X5jCBl8q}T+w^2m#j08~ zYI*PvpuOOef}s}r@ST@v7%MET+vggA4(``)pXhLLH?pK2=_enB>!pz%Bi-Cc&hk{g z{_p4iq-)%4KD@!ndXuC*a*@L1;*&8~)fvnSGXLP8i&I!iNs068US)aS#8j_bEyyDlH^PfUA~uJ-UF_=PVfXw>jKB=G{Rt*bE{JqEhbZ%H`(Ee#4rl$2-$YFY zML^m9lxd^`*L&LREW{?5u^(NJn&Ad3ln&OqyOJ1m{4F}Aa>0QupE-9Z2MxtU$-u2+ z-vQVO4k*tw=9Hm5_?JoWg`frAO-{=PS_lWKL7nq}qQy=H~RAC3)?EqMJ*%-Q~aNMaz+Ip$ycUo9n5t-CM>Wc+U;-$@~DKjOqnEr;1cY$H-vHEMnf+&=e9PpX_ za5UYs5wtuz-0}%OhW+vjZ-Z9eQWz5n3mFPq>-8PUHpw>G759Z~VyuefBw($?Brtj1 z50>AiPN&^76Es(uOheQ@@~{=$#SBnFq>7&|3-<=59;UR4cT~rqt6kl5Nz+No2sagn z!?~onq_ycT@bB}&t%0G3A+3~Rfa|1L+|B>-{81S*$@OiMH@VhSE-7aEnfpOulhHyCF@SROV(O5i;t`BT(L5Ju&Gd%)>nw85iIS!IdbdDyi&+aPZIcWcgO z;A;HO=g&?V?Sw+Tj8`VL5?x?w?aQ1L@|4~!v=AAiP%er(t5SVIYs{5ypVMs1k|wRS z^hUlwyU|!0v4G=#RS}(^z=2PGdO0TVMh~w}W8g2B0a}|9HAnu?I`%O)NmgOcSu`!F$I#fjpozK^Pp*PE8oz=(m&&`{;!Ikq`pf%_ zg%eUz@NOgO-ORqrdn;{s5(*v3cV@~%8-*u^1$~R!ZPDCJLz;FJ0Q*$n7RwSv#7tb2C0}jwrT38}Dcg z%{+$Av%4OeJa0LfYmp6)gUJ=Ml?ILHgBVpE|9;r&-E#w&X4svlqHVQgLu#KdH#50g*N(Zf z-WiM&mh3itpkx_{Wi$7@$e5i3^jdNO<#Onhap!X6*%)I`F$&w?M;?%xr6|Y2j!fUi zCWP?w=L=tL4%TRll`mIs&bt>FN&{+k7L&k$lg(ls&PwwbA z=KYNQ&1?Z{PDZ%Eq9YJDgJ`=vSEHUyd_kJrePLNtdr3N4s%PnKhk|#v6^0;JXM4H z8UTYmvMl#aRF7}SY;W~(2j%_511o^MTknR>j-ZxCXTscuQ{eMT%PG|5MOHeVb`ECm zNyZqg20dH2K?d8QxeQc)kVy=Hv|R4HDq*8W_;S}l)eVC0x7ZU?}h~ zo_egiZYHC@o0r(-FNtd7yUlpGgpt4o5MDk=z*znWo(n!{b}jN={KJ?(!6>J#`^Zz6 z7p(5A?M+owx8XLud#tFJq&~E;%U364YjYR<8*cvll%k9hB+1AKDYBy`!ohgaSBOzp zU$54WN1j!5lfoQjgZe|0E~ zf9lp{zmoK=P#I`f4C_%Z&}t-lQH?hPoPBveKBU!zU-%FErYSOj)F1v8>0{^YV4|SFS>yetG-7+Q}d~%9`bY8KQ)P$sj ztbbz)it4zs6(x za*%Rj3KKUrm!eT(=Q}Hd*&>QmThlCW_p5!=gBJ(i@o#C=0)+jIuB?l~fS(Ha+TsVj zKRZ9e<%}pCl+&EkU4TN}5iV_PC<_S-acq zctO5#=LLD)JN0b+;Z~ z|5ZW`g`)i39oZIzW7a|6Hq}Z!UB$c2d3sryi`N*WxLkPtp7YB^@W@E7jei1ik+09R zi#H?$&f!Y2*N6js&*BA3Q&(4k#-8f1jq1QB(J*-q3dTe^rnr6zU}AHoP!D1@;@{YZ zH|6_YRowT}yR@{er+}%kSu<{*@M4?QODoF@w|CDKCu!l z;W}Qd3Zr)L!(!t>P3NT6cFr0|J`mpN-nG_v(0<}`gaXHEMv)6x)%>-rO@-OB2DUz5X#C!l zo(25UVj2cyCWD?LrHwGzq#Sfpg^P3Rr$jfiKF>{zWKRq?N%e}X5?d4;5R8hCw`_e) zBRZIwPa{XWSKR{eJ#_qmp42=ILj4rEhQs7Y%_%`9RtjffEYc!M^vC?^jhu+P>N;rl z877wPVY*#X&)8q6VQMP6VmyXHJf`dyY+LmD5D}o8hS6h4QH0ZOtHU_SX`=G{@I33B z#$Z*-A>ikQJLIHr<%ExiMnL`2udVehZYG%*~vXlJdlG zFtyb2L{)ZAM-k7=CVFzkd7us@_Q2g1$(i#mIg?Bu6Rle4<0nCf3hcV4#6~u~7--MH z_$g2++4nN~JBKeFB@Nvu0L3|4J1T1JdJN>9PRHKr^~`fXe|UZV`WzcYhLe`S&*&ct z$PGq=`Oa+-W4lr=ztJDK`rGNAzCV)T=+C*CthU{IKg{9IPr50urrdKrG~?`QNjmrb zYUeu{Z4sR(ExGRD#&v(vHP9-UdVb@B`{CZ}60%z^vPkXs77iLBtn>jm)#(vQ0S{X(WA<0Bfm}Nvl)*5qdq_UHxX$h{m z+mwTEZ#C}Pyx$n7(e7~i5b;{X_Xi!^IKc+-C$1=dnwI^6AzD}*SaG)-07cg8mFgBI zx@;vd(eeov7Z&%&w5jN9lgk7EwuL+oYfL6#=gpCb!+#S(_$~cz=(?EJiX#2lCLG)ZHSR+qy)Iggnbq!D%6W z2YW{fHoRDt0!_K1oX^ET(I}&LS=3(!m)g$1;bAmvu$eC-Cpc^yp_8E6BIP~b<_Qb0 zdAYU#cjvM;AO;ho7N3&xT0UaVmLx9F=M)h6G&f{alFPxJ&)v?NEovc6AB#uS_6N)&Ey=;guPugYnFX@)-XDEgb3s=L$) zQIOM)QTr4_1g1#$%2^K9u|Mmmi^JZN6`8l1cTW_KP5GPwpU3wpouGyvuPORplRExv z+s{CJpZ@-PeVt!4LUn@0Uh5JI#Uvu&;OIeJrNMK<0h8lmh}t9cVUf~ma5_S1t`R;Z zCKZ)Y2gk1GH^{aEQ30I$5}&=Hx~QGUDE!jVzrm7+@WsdJOog_p5t0$;(i1_jnqOc(`ya)$0eLU2z5RAsyma6OnnWI3os-#YP6Jdek$g~ zcRQyVFyHfHQ;wk)J~ga7c|@IH*;H)InH)Z>L=na`SW40#M_$iy0q4w>npSX3zvMa{ zb(gmLMpb~@wDphY_7)l~e9|gz{9xBLfL%)D%$LI%B~X-Us+3JZev7?l_xDKwf#lPY zI%(+Y@?Gy=4}{z8j|*Q4G4G3tNX>?o>aSm4Uvar$EFW-M)&Eo$;qvAQ|N&w%o<^#4~nj-PY=zz4J#l zKpshpQcBf~R*f%sbvtreM(<*~%3=c(1WlD~iKbTy#rydst?wPjzp9cId z|Nm{bHBofdPL?(m(>qTcIB`!b)BJVB2R-~hXD4?SCJq;#z*`!fJe`l@-Xx&EPKJ3+ z9G#EFT{luSlgUE;HPIecu-erfy#wntM4=UAF%f`3G9f3IC8gf7gYik8nw?77dsV>= z$BltUrtNe8--dj$J2?HF5L^~K``aKGcXi39vmh-Fhfy!ED_HqE;_bQKYwj1vl%MU?R~6g*G6i8Q(oL=B5G)R{Ebfgo{(zu-v z5w`CbMLYA}sG{1SP|`_zfQe8i5Vt(EtWYL7tzb~M!f?A+dAkf$^C+&PT#qu&9URt0 z&Q^H%?*k~(pGMSA$7=`a#PVgVp2;PgjxO3eFg}-kW91Gmt-P>^hmr$4Gue$U)9REE zJ2w_A^gb1MUbvj~5j3@IGJ-obNbg%`4k@%)}d`qUR!# zp7lwMxg;UoI>ix5jbQPh5rK-!%_g`Fpd)xa*jjUzl?1iqxaeu)JqMBztmk|Nva=8% zs$a|T?>%Jsqbp-qJk0U$vcfUb7{qSCWWRctKD9#ZJb%A?rym=kb57`=-tnnZ3v|ok zAJd_Btb2VaUndtc)ZD+c&-Ijj|B*{q;^cu4738g+Il$s=M_L|uxKe~CU`d+LiwLay z!J)vu!=E@ockfgGeV=AH&8!i6-GO z-u1UPgyWUSj}tVcg_bJzOy>)7<`p$W%k3s0u+Nz#B4Z2Xr>u5s8?toAl?(ydg6TXi zYFYUy9&7ei*2i|BZ;EJFSTsj1mvu72i|{t&khQ&E&x<$vQ^_P`mtQn{G?%px&_wZz zLPqmvynOD%DxCI=MdM~C0?uE#wfjQ!~>K~n-QTAih zc2|DGwfO1$juIX@|JCOuK-nE>5T4F4%wbzks5>~Q|ATrU){^nR+l<_YgWZm#GEt}Y zooCvRT08 z#%}-lki0VJYSmmXHlKaSVIY}nMIrfzQj;1KtUB`^v$ zvTAWscm3Z3GTIgWT{vi1(gIpHHotR-eZ{=g+i7W5?>66jD0U@rC$=;KHV>SanvXk# z9-ZpED)-Me>& zNOeOI>Sx*a4v#oMic}wThx?T5R{7rM@ima#1vlGqI~BS$x_5cR15&&C)^=!5@o(kt ztsb$Sk^s2Wj@c>qE!QIn@RR}cbZxDjo!qY7x;~<<^*nV0h$n>98T8il5&J3mDeCFJ z9=f}s4U&@jZFQeZ_x&|X%bQO`ZSjBJNG32P{xmBL*Cu!)oxn0F8`@87z+i+3r^zqr zCxLx-n~=XGdH9^uPxjFJjOPmuVTf!nIm7GTFFY#55&t$`@q8kV0^&c&>g)d@WzN@5 ziU=3hq+*tfEa>Ig(AVI4|GB7?P~+b#y=cOMUUD8?D%Mys)^K;rjx;(oVxnFq9s?Bu ztzJdTj5IFWa7ZuPhPHb~8k=o|BahKAfk3|QFv-Q|>{2q^d=37H+kAtDaCFN&dlHv? z6R&Vt%UXSglt>%PRzTP!i++@t{jb4>vwN(tUKZ;p8Cf`Xuk41Udqj(NC2_@H8_UKP z<4OX(aQ0q9_hfz6*{F(Mfel0V?0LFsGNJGoOUO-Bi^ejOU{q!=se9B-MT^cdiz}IL zxLB{rhHI_PGUGAHb;MmS+J^L*P_3#s6AfuxxO}gbWxJp8;j1_5;jFz{mL(8MXHlS5 zIf%KFbS>Pi*LNfE%(vF)p6)6f2&e6p>Q&#ctJS+_0Fyisc15i9N}h$ybK`}l36~PY zII3)BjPt8rgX{n6C`H5joudYA&Rq0Heom92ao$D_PNSiT0DFl>#?6M!MxqAyML(DCKKX(gnT4ve#r9f_kOqfE zFPBiCI-f|Na-R%At;`}Fr}{<_!x-I)k(q4=Z$sE@u7IQJVo;TV(*&tKHqfYBrRp>% z+911V=@QYTZB)!Tr#3e_K02*yZ|7j=v}3>HxZ|+nL}pLsNajH1lxm;q$lj>4XtU^e zeH-y5F{H) z`+*6RA!!25gH}TGq2Ouuku-CgHM&GceS+z@ zO)VkuKnb1tX8GJRse41nDJ0(|ACd%RfLcI_pjuIYKk62Rj{1p`MfIYXQAH>vP%=2Z z)3D3ftiUYKtgL3HW^!)t09k=_x^zMwT;igTC|r~r2=YkwAosumst4D1%67>5}i#>r(GB13m&@o-#XC0R=!G_zY+RDr?nJ)hFZ7ap*L3(ihlQ zKN#B`+aKE-JK)~s-sj%qKB(EP*{|8FIdI!`+jrY@J2=@r*+1DkIiTI8-KX87J%H{) z_n~{x1G8PT{r1b6%NnHHr5p0(@&ws+(2k_Nlt4*c(jtLwZ z*y0iyw3!3d8;l`M{u{<3o> z5mmKRKE%K|v46R^>S$8Ebz>IiPXAj2_MJihIfZh@b@yBgBi=FHM7j3tVCd zhE{#91m!K>R^uG5v3R>d6390fGC*%o=bX3I(3ESgpB<6xQPrVT4LR7FIe+V4)uHAZ zKQ}~)kZV;K(&%I|OR4GC+j2Vhz6}l1>SSI^IqCP^3Oonh2H$@HGfAaD`_;GX z&OL8`-fJEwnhn%!37s3=X5X7WnjEJ{^-G-7p3C2=-$L#Uj+49k&9=G_Zs)$O>W}o- zLukA#_;3H_V(_)loHRp{Q}9_?PK;i^rZESF3mK-D84M^O;N1J~aa-t^l9URq`GtfrY~*{krg zP(WhX;M$u^RvA1iX%<<|S(aIjS+>LcwiGjPXRBBZtLe9%G5&Jd8gBgLF>(-|HG4tB zXmt3ef*E_h#TY!RgxYz1OAdh)ilLaP7`|w}7!tSvd;u;3Z-x8AZ{g_hpKw`tFPs@( z1Xr?3c2BQeYyp<_t&A;<9V!K?d1omOVk%;sqMc$6qH*C!I4)ey3UWraDYwaDRqtM3 z+uPE6Q{i6Wp6TB19_C)+p6cFQJJZtFGS@QJvgY^OZ~P{+cEqpWZ{F{(-?ZQGysNnD z;fI_LIs7@iK5x}2$H>Rtj!}$Ja+7nv<)+}KtRb&?TLVzkP`Z)3C04{VM>h|c#rQ`1 z##~2V$Kdxj!ov`6&+#`IH?1~_HnleSHa$J+&wid2)kYax1la_+1X%?+1=$6;-LK5M z+?yZLQ$_>iQg5I5!MtF>tG8X`U2mUw!Hmu1U6gmxQqd3a=Ztc?l$ZmC9{+u4FO9ox zQNQ7b9s>}`o}CNk+e8r9ERuVM>=Yg3(CK9s$~~33HFULg6L1rN@&LhtU?5Ns2=ox- z-x*{EtUX)%xJI{TZWinoUNbHtx}IU@I45=b~N3^SZ4ZM^@m z=#7-QWl!+{u3ATl2$8UBNV%ioV#UsInTxA>hNrz=+-TWVd8J}nX?a(hiRiOR^jyfZ z%9u>1ov*TuVLnA@LXJebzJvm^aMkltF13+^jp@=J?-8+v16qL+o5y=cs^J5Vc=0ws zS;9N)x_5VBrYc_zv}?6^km=}%M71PXjVA^)SgYhSBO|IQ(Vz!JDKQj7`;>`&KHc`h z9Vb%N6?!p%Xxf~i(bBT^im{fIyi{j^ntWi@DzVVxW_ya$zDF)CbT_xSg`lruHi`wA z7pH8zmem3_o;%2FH18Qe?l!d^(mWPHW4@B2);0SZiHooPWjW@eC0>XGpQH%kTZ2+fbnYp@Sg;q$R)lPXHir+ z-=qT~ z1;6l|^M!`roXY&he=ha%{(pfsun(P1u2^cL%6%!0)eU*`zlDe>C++m_4^|d&o_`To z>MDMg`K&6JKO%BI1iQUhd)bKk09-OsV{^mm_OQ=30u!+X(*9)x{Eddj(O^t<^RpDpOyWVZT}&{y=&#zfKbrQn zb50WwTe2SW@q@YP0kDt&?Hbd*M$Wr<#8eqehxqujB1w)roD@7_wCu6{;Tc{xJff$} zk(N8<&{koq@X+7I3ES324`2N4u`nm zVVa4EY_~p7kr2^Dr@u)a%0&xNe^wznUq4zG%XOJcN4onvnOo+PJo0j&0Ty2XjW-15NF(IcWM5EHCVhPxHw5` z#f|Tb2!o7C(xSTYMToFUB10QKW-Vvk$+)&TGdXi-^A6q8O7C%O3yoe=+j6(G?as|R z?K5wcysPXKT(%n)8=h@pl%H&*kqcek%G^qhQy@X)QVU%)P?qx5&VqlzvV(yfay8Z9z&Mz&#M>%r-D>1gKs2Zj?#>YXmLjnj?!bJfQkT6sQ&ufFQ+xcf)YA7`4>Tjr~?bix%E z!67v#8;+;l6T^-=iU9D1ljEFw29nYxJK8rifX_PnnKwl0C3WXP;x_qH-7em737vD= zu7L=2QxUgN!2|mUNiT#&69Cs2^eo~PdQXYfJkGJE%t{wxJ_iN0ConB&M+YG~oA{`X z5&OIrlk*ay7rJ0-(3p;d&V^V>`_cW-Gag!LN-LMy4%HPI2)*z70*Y-1#w`S_-Q$jG zqP)e^pMuG=)F83#fVd9ekv^P*Cwz%`J2~oiU`ihj4Czadof{|@@ez-}s2QrBSgUuO za6r#0p8g1Yc!p{qw(b3ll9tMT7%#c~Bx21y?r^|bIrmNjrSLmo9hv=>5Q*rpGn_0uOL$D2mX6CQvzOV?$fAc zjgt9kp-n3}C-CCByp-N&`2hoshusVE+o@f@-a-NXqcCo!1yDQ7Id(eFngmq?AX)7- z+17RDOOah7d+OYl^%t3pZFDnsHFkUGy8pJ|?abTxM9bss_(#Lu9CQRVDO!p->c5G0 zP9X6pTs}&KzMG3u;Qu6eol_h-n}Fe?QlMGj%~1qUa6}vtr7)0L;^gx(l5PX(Fj}-z z*gnAG%=%)#yp+~wjsXJ;Nx;(37G^B4$)6CVTV+8Oq}6Kwnautk0jwK}@Ck%Z+Wr09 zgYBpTu0|&TxDkY<7AFbB7@0F@8FD!*U8WNS+FfU3eq3iY>Eob6_1zU$lRg3JP^a3l zZ__ebHVxOw{bRy%gNDf+ypH08c0gT9aZ4!tjZBRqOO)u^!)O=qHkO(V>foY#cA^;2 zjFi^aes41CYFg2s{0)a=KN>_!fudOH{8WQz5HE1v7zy|rD`85)!jzTPE~gRu48))B z=XuA^erD;2x%f&l%c0;RIkWNt>u(QH?X9ZOodeYUz?QKl05ySo&82G|!tiI`=N@L3 zm`;s*eP1i=8T?*w`cqwHii{XBFCo_)bCk%3DaI{=aVYxp`l^L!$|AtguV9||EOP+0yIr^0Dn`ctTKzU z=-NQE9k>-sMZ5|wzJnZ}Oqgl0a1{1^r5!-3sCJx8PWlL}n~DKLriU39RMuYjz$X*&_O7S-in1XG-+xGK4iI>TGUr zF4Li^ji(&0#fa)p#V>k^kYJ40hvyoNmsM;=>@=To(Ri;%LGuHO!BExX6%_544l7R3 z9f!3k?en%?=hvq04>eeJq~`iucNTkLH2PUa-X->(jJ%^utWZ`_hf%Z(^Y$KUHd6=d zhpdu$t8vGaGe(bwts3eDb}~xxOTE1m){J88Agxx^Oy*jF2+vMMhRbFw6T>q83GbgG zJ`Gqk7x}WaY%0+uN>nQok6c#-IdG;MMO&AQ8Cg3d8^O2&6Vcr|Ig5zFIg8+zpLqP4 z<>Gxrj1CrB3B7>v->Pdy@?So1F(mn@wS7jn2Q(q3@B&k2?}r?LV)RKEe^DLcxRVzp z2pW-d5MfflCu`0D$i?@=x}I~o)y4adr}gh4*O}^A8k{Aa_e(XutbeYY+Xd7GW?i=I z1IKf7-0Lc@tf(%un{s{`RO?sW8|Cx2 z79!-@<*N~@BRy4-vd%-eb>D(yyN!%gdZnYIqYzG?X`dRBgN(`%DfPp>6q4Or0h)rg0~J&s`mC7goZ+HBV>Vq~q0 zzLB8q6sx}wBPW_BmZbA4qG5t3OUTS-)}6@^BFLA+ri;^p)%h-NeIUQimL{HH>vG7v z-}|hA;%3R7cIy&Ur*y=|a8GWy?0hS3eK}v0=8Z<)|u z@x%W8`<6a4cg48$-hAIt+QF6M>0@`rq@Tq9BUPg-l0o7!SA8<* z99pfrb2F^{6F6vzx227Az1scKzCl`;fY}jhf;tQ}dNm@(%zoCTx-zIb$S=<&b<0P# zfFdszQypLZ4&@zSKRPz!yfEhUG~-4Xtu_2|Rc-@qInp$_{{n&h%%oM+YiWq+X?*3H z!}7$)&5zFNpWK>CCtMch-mq1iYBf@|!LI9fvFix~mbFhu%AT_*E6UELcBH zanDHNS<+L5p{_6*274}g$T~~o*7sel3kzB8y0ob`VcIx!%J-SF?M|qCosaqI!8J|a z+4GgNFc)cZjZ*!e)s6F2lk!g^)8$jK-h$fFt#3S*Lgiq!8doEp_V>IplXVWan%pE` zQ`@SoNI_p>S%}PNd)PjI5ebGu#N_L4vFwE}J!RWhGPd-7zHC~rljLD~#MEx;%6?RA z^c|}43*(p8GZ!asj;`j7-q=aq;fWFv;{gtT^czBrkmp`%jtt^(Bl)LZ7Hr&|!H!A1 zHR@sKRh+=TOsNb)YmVk#kUHk8>f)PZONH6}=Luvq@~GX`oq8w53N9RMpD7pI>G`iS zdwpM|lKrqL?GGtyvRG8Ay6HqkIF@bjsAzEC#-#z}yXuNFnL%kzZb++1zlVl$g(dVO zONOC^b+(@?BLr%iAy>orWpXpO4Hhb&8}+Czj-E3c*nVXmbNIB9=7H;a(2KHXtrHg{ zBIreVk`56TmlEWojF;>*uwio@UZdwPodqweMe)<^sd6z=Y~(1u=CkFgZ;*>-V(r3o zWO5K&d+^f7>Vqu-R9ngRW%@u@cGNja@J6B@fi3WOb3xeH2c{Z{i4_N?!f+~%pvk>N zyHHpIak~4uOi{1-_5D&cITFOxY-UIe<5g$>2hqS*!e9ds24q$-sj; zFIn$DC{Zb(M5Lsqg1wbeFhJ@+vp$Q6+N)yz!}`losGPKEd)`FPscxa+__g)D=Q8g5 zXjoxcB@>9JW00hzFfRVy)M3(qP_P3#T5a* z@iTb*ZY@glBWJ7J?Qrw-kC4}#OQe{JP7R3&jpQcQ zd4Gx+b1fO#nnkH%&KGjVtYII#At7h-dyvA;kX-&&*9RLyGlb_>XZMZ-H&9Fi)C)e8 zs2W_KWNuJ-HNHpZRFCP9`aU-ey*Z9tJY?2w#uYi@E;oBsA68XTCj9&LM@146-g7mU z*JJd7fT>Z7x21{lv{whM-|FSFj}UL0y82aXIkJ&`{Z3b^T6C*cKB6=|x!^}td{y6@ zXwjIatz5yge5{do0;;q!C7+Y#nqo7pRB7aXs#Ggi!$N`G(x+(5BiCakSIPet$D{k` z10Jq|hzw&(kjZ(aRw zyeY>9$+eWAx)LjamNje9Nx^t;k{raNiVZ<$og6Tmg4_z;zkrrM4Az;4k&De)432@uDaMJ# zX~eOoud?-M9(nzMI>Oh<*T>hx$Mrk`8;^;{>7sRGCmt{{B@J<){?)^Jnjqv`0T>)! z?MwL=(lJxNc(g$4mSV`9q|j9D4d}j%)n1*$D|gDr;$%nkDlALRJ|QpU7&>_$k-`PZ ziZ0}20 zJEL%f=hmMgvyQW*^~l@{r95&Mqz&{o#*boC+bygmUsoQVp0?4uG0_oqrF$|gSCjNX zexc&7p-I2QMn z(lOMv4l*#*HFY})$6~%>M0~E6o?22q*{V7^(RsffPfQe2;i)P2+)5i5Uu)k>~?S*`YZK= z6<=-qmlcFvD;R&w#*;k7?i-Lj8p+S|DQxN?SW90`3S`CLpnBJcfY7s1k5+Wg-$!z^kdMV)0lk z{D-C=S{SqXEsIp~z#5h z&Sasy)iA19IC}Sh2f`s=2poaHaM3Rqf#LYw;~zdET7}_?3{SxQOW_v*tO|ZN5r2{;FtY0>3@=RFP4pib)vy>Wu%08%um@!o t6m%N?H6u`lfhU3(>G>t<85wozv|GsOh!D>c5S$v0fPu)!=$Y$7{s(wB;En(Q delta 21749 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