From e5973947e6b9f9fff98fe60566a2d92516e3013b Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Tue, 18 Feb 2025 23:49:53 +0100 Subject: [PATCH 01/18] test on settings API added + improves on nfproxy code including fail-open --- Dockerfile | 8 ++--- backend/modules/nfproxy/firegex.py | 5 ++- backend/modules/nfproxy/models.py | 3 +- backend/routers/nfproxy.py | 56 ++++++++++++++++++++++++++++-- tests/nf_test.py | 33 ++++++++++++++---- tests/ph_test.py | 5 +++ tests/utils/firegexapi.py | 8 +++-- 7 files changed, 100 insertions(+), 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index d8270d2..a09e4e9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,19 +15,19 @@ RUN bun run build #Building main conteiner FROM --platform=$TARGETARCH registry.fedoraproject.org/fedora:latest -RUN dnf -y update && dnf install -y python3.13-devel python3-pip @development-tools gcc-c++ \ +RUN dnf -y update && dnf install -y python3.13-devel @development-tools gcc-c++ \ libnetfilter_queue-devel libnfnetlink-devel libmnl-devel libcap-ng-utils nftables \ - vectorscan-devel libtins-devel python3-nftables libpcap-devel boost-devel + vectorscan-devel libtins-devel python3-nftables libpcap-devel boost-devel uv RUN mkdir -p /execute/modules WORKDIR /execute ADD ./backend/requirements.txt /execute/requirements.txt -RUN pip3 install --no-cache-dir --break-system-packages -r /execute/requirements.txt --no-warn-script-location +RUN uv pip install --no-cache --system -r /execute/requirements.txt COPY ./backend/binsrc /execute/binsrc RUN g++ binsrc/nfregex.cpp -o modules/cppregex -std=c++23 -O3 -lnetfilter_queue -pthread -lnfnetlink $(pkg-config --cflags --libs libtins libhs libmnl) -#RUN g++ binsrc/nfproxy.cpp -o modules/cpproxy -std=c++23 -O3 -lnetfilter_queue -lpython3.13 -pthread -lnfnetlink $(pkg-config --cflags --libs libtins libmnl python3) +RUN g++ binsrc/nfproxy.cpp -o modules/cpproxy -std=c++23 -O3 -lnetfilter_queue -lpython3.13 -pthread -lnfnetlink $(pkg-config --cflags --libs libtins libmnl python3) COPY ./backend/ /execute/ COPY --from=frontend /app/dist/ ./frontend/ diff --git a/backend/modules/nfproxy/firegex.py b/backend/modules/nfproxy/firegex.py index 37055c3..70fb5ca 100644 --- a/backend/modules/nfproxy/firegex.py +++ b/backend/modules/nfproxy/firegex.py @@ -48,7 +48,10 @@ class FiregexInterceptor: self.process = await asyncio.create_subprocess_exec( proxy_binary_path, stdout=asyncio.subprocess.PIPE, stdin=asyncio.subprocess.PIPE, - env={"NTHREADS": os.getenv("NTHREADS","1")}, + env={ + "NTHREADS": os.getenv("NTHREADS","1"), + "FIREGEX_NFQUEUE_FAIL_OPEN": "1" if self.srv.fail_open else "0", + }, ) line_fut = self.process.stdout.readuntil() try: diff --git a/backend/modules/nfproxy/models.py b/backend/modules/nfproxy/models.py index ba048c4..4417db0 100644 --- a/backend/modules/nfproxy/models.py +++ b/backend/modules/nfproxy/models.py @@ -1,12 +1,13 @@ class Service: - def __init__(self, service_id: str, status: str, port: int, name: str, proto: str, ip_int: str, **other): + def __init__(self, service_id: str, status: str, port: int, name: str, proto: str, ip_int: str, fail_open: bool, **other): self.id = service_id self.status = status self.port = port self.name = name self.proto = proto self.ip_int = ip_int + self.fail_open = fail_open @classmethod def from_dict(cls, var: dict): diff --git a/backend/routers/nfproxy.py b/backend/routers/nfproxy.py index 4cbb825..703fff7 100644 --- a/backend/routers/nfproxy.py +++ b/backend/routers/nfproxy.py @@ -18,10 +18,17 @@ class ServiceModel(BaseModel): n_filters: int edited_packets: int blocked_packets: int + fail_open: bool class RenameForm(BaseModel): name:str +class SettingsForm(BaseModel): + port: PortType|None = None + proto: str|None = None + ip_int: str|None = None + fail_open: bool|None = None + class PyFilterModel(BaseModel): filter_id: int name: str @@ -34,12 +41,13 @@ class ServiceAddForm(BaseModel): port: PortType proto: str ip_int: str + fail_open: bool = True class ServiceAddResponse(BaseModel): status:str service_id: str|None = None -#app = APIRouter() Not released in this version +app = APIRouter() db = SQLite('db/nft-pyfilters.db', { 'services': { @@ -49,6 +57,7 @@ db = SQLite('db/nft-pyfilters.db', { 'name': 'VARCHAR(100) NOT NULL UNIQUE', 'proto': 'VARCHAR(3) NOT NULL CHECK (proto IN ("tcp", "http"))', 'ip_int': 'VARCHAR(100) NOT NULL', + 'fail_open': 'BOOLEAN NOT NULL CHECK (fail_open IN (0, 1)) DEFAULT 1', }, 'pyfilter': { 'filter_id': 'INTEGER PRIMARY KEY', @@ -116,6 +125,7 @@ async def get_service_list(): s.name name, s.proto proto, s.ip_int ip_int, + s.fail_open fail_open, COUNT(f.filter_id) n_filters, COALESCE(SUM(f.blocked_packets),0) blocked_packets, COALESCE(SUM(f.edited_packets),0) edited_packets @@ -134,6 +144,7 @@ async def get_service_by_id(service_id: str): s.name name, s.proto proto, s.ip_int ip_int, + s.fail_open fail_open, COUNT(f.filter_id) n_filters, COALESCE(SUM(f.blocked_packets),0) blocked_packets, COALESCE(SUM(f.edited_packets),0) edited_packets @@ -180,6 +191,45 @@ async def service_rename(service_id: str, form: RenameForm): await refresh_frontend() return {'status': 'ok'} +@app.put('/services/{service_id}/settings', response_model=StatusMessageModel) +async def service_settings(service_id: str, form: SettingsForm): + """Request to change the settings of a specific service (will cause a restart)""" + + if form.proto is not None and form.proto not in ["tcp", "udp"]: + raise HTTPException(status_code=400, detail="Invalid protocol") + + if form.port is not None and (form.port < 1 or form.port > 65535): + raise HTTPException(status_code=400, detail="Invalid port") + + if form.ip_int is not None: + try: + form.ip_int = ip_parse(form.ip_int) + except ValueError: + raise HTTPException(status_code=400, detail="Invalid address") + + keys = [] + values = [] + + for key, value in form.model_dump(exclude_none=True).items(): + keys.append(key) + values.append(value) + + if len(keys) == 0: + raise HTTPException(status_code=400, detail="No settings to change provided") + + try: + db.query(f'UPDATE services SET {", ".join([f"{key}=?" for key in keys])} WHERE service_id = ?;', *values, service_id) + except sqlite3.IntegrityError: + raise HTTPException(status_code=400, detail="A service with these settings already exists") + + old_status = firewall.get(service_id).status + await firewall.remove(service_id) + await firewall.reload() + await firewall.get(service_id).next(old_status) + + await refresh_frontend() + return {'status': 'ok'} + @app.get('/services/{service_id}/pyfilters', response_model=list[PyFilterModel]) async def get_service_pyfilter_list(service_id: str): """Get the list of the pyfilters of a service""" @@ -246,8 +296,8 @@ async def add_new_service(form: ServiceAddForm): srv_id = None try: srv_id = gen_service_id() - db.query("INSERT INTO services (service_id ,name, port, status, proto, ip_int) VALUES (?, ?, ?, ?, ?, ?)", - srv_id, refactor_name(form.name), form.port, STATUS.STOP, form.proto, form.ip_int) + db.query("INSERT INTO services (service_id ,name, port, status, proto, ip_int, fail_open) VALUES (?, ?, ?, ?, ?, ?, ?)", + srv_id, refactor_name(form.name), form.port, STATUS.STOP, form.proto, form.ip_int, form.fail_open) except sqlite3.IntegrityError: raise HTTPException(status_code=400, detail="This type of service already exists") await firewall.reload() diff --git a/tests/nf_test.py b/tests/nf_test.py index cc780bd..c8c7bd9 100644 --- a/tests/nf_test.py +++ b/tests/nf_test.py @@ -43,6 +43,11 @@ def exit_test(code): exit_test(1) exit(code) +srvs = firegex.nf_get_services() +for ele in srvs: + if ele['name'] == args.service_name: + firegex.nf_delete_service(ele['service_id']) + service_id = firegex.nf_add_service(args.service_name, args.port, args.proto , "::1" if args.ipv6 else "127.0.0.1" ) if service_id: puts(f"Sucessfully created service {service_id} ✔", color=colors.green) @@ -64,7 +69,7 @@ try: else: puts("Test Failed: Data was corrupted ", color=colors.red) exit_test(1) -except Exception as e: +except Exception: puts("Test Failed: Couldn't send data to the server ", color=colors.red) exit_test(1) #Add new regex @@ -194,10 +199,24 @@ else: exit_test(1) #Check if service was renamed correctly -for services in firegex.nf_get_services(): - if services["name"] == f"{args.service_name}2": - puts("Checked that service was renamed correctly ✔", color=colors.green) - exit_test(0) +service = firegex.nf_get_service(service_id) +if service["name"] == f"{args.service_name}2": + puts("Checked that service was renamed correctly ✔", color=colors.green) +else: + puts("Test Failed: Service wasn't renamed correctly ✗", color=colors.red) + exit_test(1) -puts("Test Failed: Service wasn't renamed correctly ✗", color=colors.red) -exit_test(1) +#Change settings +opposite_proto = "udp" if args.proto == "tcp" else "tcp" +if(firegex.nf_settings_service(service_id, 1338, opposite_proto, "::dead:beef" if args.ipv6 else "123.123.123.123", True)): + srv_updated = firegex.nf_get_service(service_id) + if srv_updated["port"] == 1338 and srv_updated["proto"] == opposite_proto and ("::dead:beef" if args.ipv6 else "123.123.123.123") in srv_updated["ip_int"] and srv_updated["fail_open"]: + puts("Sucessfully changed service settings ✔", color=colors.green) + else: + puts("Test Failed: Service settings weren't updated correctly ✗", color=colors.red) + exit_test(1) +else: + puts("Test Failed: Coulnd't change service settings ✗", color=colors.red) + exit_test(1) + +exit_test(0) diff --git a/tests/ph_test.py b/tests/ph_test.py index 7e1df9c..c54dae2 100644 --- a/tests/ph_test.py +++ b/tests/ph_test.py @@ -42,6 +42,11 @@ def exit_test(code): exit_test(1) exit(code) +srvs = firegex.ph_get_services() +for ele in srvs: + if ele['name'] == args.service_name: + firegex.ph_delete_service(ele['service_id']) + #Create and start serivce service_id = firegex.ph_add_service(args.service_name, args.port, args.port+1, args.proto , "::1" if args.ipv6 else "127.0.0.1", "::1" if args.ipv6 else "127.0.0.1") if service_id: diff --git a/tests/utils/firegexapi.py b/tests/utils/firegexapi.py index 13f7a0c..9d40304 100644 --- a/tests/utils/firegexapi.py +++ b/tests/utils/firegexapi.py @@ -101,6 +101,10 @@ class FiregexAPI: def nf_rename_service(self,service_id: str, newname: str): req = self.s.put(f"{self.address}api/nfregex/services/{service_id}/rename" , json={"name":newname}) return verify(req) + + def nf_settings_service(self,service_id: str, port: int, proto: str, ip_int: str, fail_open: bool): + req = self.s.put(f"{self.address}api/nfregex/services/{service_id}/settings" , json={"port":port, "proto":proto, "ip_int":ip_int, "fail_open":fail_open}) + return verify(req) def nf_get_service_regexes(self,service_id: str): req = self.s.get(f"{self.address}api/nfregex/services/{service_id}/regexes") @@ -127,9 +131,9 @@ class FiregexAPI: json={"service_id": service_id, "regex": regex, "mode": mode, "active": active, "is_case_sensitive": is_case_sensitive}) return verify(req) - def nf_add_service(self, name: str, port: int, proto: str, ip_int: str): + def nf_add_service(self, name: str, port: int, proto: str, ip_int: str, fail_open: bool = False): req = self.s.post(f"{self.address}api/nfregex/services" , - json={"name":name,"port":port, "proto": proto, "ip_int": ip_int}) + json={"name":name,"port":port, "proto": proto, "ip_int": ip_int, "fail_open": fail_open}) return req.json()["service_id"] if verify(req) else False #PortHijack From d6e7cab353ef609a3ceb1d80d82d64611e45a2ab Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Wed, 19 Feb 2025 00:00:33 +0100 Subject: [PATCH 02/18] new frontend screenshot --- docs/Firegex_Screenshot.png | Bin 362458 -> 329874 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/Firegex_Screenshot.png b/docs/Firegex_Screenshot.png index 7960b957ae7065d6a882cf5742e0bbcbeff5b7c6..935d5733e11f2cd4c9285ca6831be8412257ee83 100644 GIT binary patch literal 329874 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≥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�ywm(Wm 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¥CE@18Cj&?x6(Bg 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 z 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%0DNsdhK4TuUzlMw1fRl9Vcx62VvoJ9e)oCoX zzvJgOOB3`EEC;VPDalq|mOBB~a6_?!9H10@;wc3l+|c8|K8jIG3Hb8N^QV7Y8lVQy zU=$b_m@8L-Je2yV;_gElr~$?v3a@{Ug_n*Gy4EqQ#Q#hW%Jx8jI1w}MbCm73!S`3c z5=ZSrN*4hhl+PM-Vm4g^HSm+O10?(N{0>w~9x%pycI#~qK{tSRIG2+Tns#_za{QQ> zSm#m1r3)*NIRw^fjsxwlMUh3-?hnRVP_=Wpx<5BD0MF#PG%W_EI>1^FhONROcu#^3 zK=D3l0N>N=G!WJ*k8m`j4h7D!n+s+h}*uihMs1hMt=kJCu(qjatNU92q58# z^0~Ro`)jji1fvahs$M*bp#)Z~M9F*zcEkJ$Q50Ba&uvW+f_+Aq0H89c@GU$Qj0D(d z($sRH`W^oF3H}qJbXkCIep=acXtol@YkCIQE(r@@AVt3S5DfCM6tF?foW33Az&$V) zS(XJ1r4In$A^<#`{24&%(ii6rJJW*`*bFx2_cDkK&>u3jkXJt08~wQ5ebF? zzy^bj-Gbkr7Z>;gq6B_`?(G=f1CxeUqCQsu20|s&X#dP0l%oJATe$%}=ZwU_SoYZ! zd}t}f0pPKJNCnKxga=g9(F*!Q(3IvpfI{z{`3u2!fZI-K3pUg4qo)9c#zhyczpea_wDFrDl!781yp2NRen4=g!OxY1n2C!-dyolcpgZ}C#MABfH zCRcJ3(Q;}HKn=@^vlmHd0rME-=2jo*mhZg%Yl{4Ys2eC-rTCDvgO@L3O^5(pau3L{ zk39X{AsA#_19)Ad@O*BJ1(d4vS1L6`OX+0*-qTOER|FG|gQYPEavnnH6THEzG}khj z&e4?tZhLpyXbUZ*_TWLkTJ(z}o{0ctoK{)OKdZMRp3>keer!yvaX>i+%M1DB`yWx3 zg8wgP@_TZQQjP{-;P}_zUt{V3FW(oD@DrjJ;Cty0>^JwhRE`;dYTeUiffcF-grcRV znDftz6Z{F$HbD2R&B}Q+&r<>=iiL$o=L0ZskHH}J&kW+}3T)^^CBL#*0vTZ5f&AHZ zseLKE3G8AIUbGA*R*@iB+VSbsL(nu-4!r6uT1|gxH1^6G$o%E12Yp~AX8BD5Pk#J zPl#@!EZ~c>r)dA62}Q|V=K&ng8vq+&NG=|r+f63!3R)?8Q-D5429XngwwM*l1E>rdOe#349 z?7su|hkZ>aym&o{%6`y5#?Hpp!J)ytbhJNB>lom`0-!RRg!@VNS13pimM(GcPBdjZ zA%@F*jp@rvY!xu=sWy#^rhU0{UAdlr#tTp=#cx05>)&siztq#3Z!x@GHn-@$ZrlgJ z^}GhgFOcIniI${O0EP0Q9api6p1hT@dD!5MJ%*UKYwR@0cdcvUUm*Suf&4r2DxQ{# zx^+2KCQ@^llu;$u2Qk%#Ua1;Dzd@oI*t$UtlyDv(Hia%(8qesoXNE%Bhc#n`?Rh(R zRPlAoy`;m>))L3g$KBwUW8p9A8&MxjBZ(+7MY&{zV0bmU=*RmgqC>?*^i4(tm;=HI zg*KY=70ogkF4aqWTltXMr`;~ZhcHr@SkxHFVtzic4pCt~%P^OvfS#; zu4mWyw23C1F^X^s5+s)a;R0O87q6R)f8=-3TK=4=S~ae7SU#D)@QMR|?z+{pB>Ak2-?)G4nH`{7!X=%RtzDZVX_0mYloD=d3ti-e8e| z&?>cX8$!PIIwUd&G<4I*4C`NAPgXd$STz@?3WbQw^7)}a69%B2Hn2g2GL9A zUV<9fEm2&2S7qZuE2fmPlp8RRc5#X%s84=~)~|nf+Fy9ZE_AkYTLSq#y~6)e2F7hc^oz7JTK3a;H* z282_!%2q8~t1@?z&Eii$p#}?8(VhQv{knP6_(isdwyn}_(NNZK7M**mH6$oR0)L-@ z(RdX-(i4Bdy#P3YO%emV z`{N0IK{=K>!X%XK>lpB-i38-P4j~dAf>=VR_#_bJrQ|wpvK*Y!(Nlcg-M8=xpx6#@M4QA8 z%#mCgkfK;Qau9LK0gV~p(-=mOWdEv6Yr(h@-)qW!aJ$Ld$E~;Rxn2g zs%P{Vb*-akU+S+z6 zem?taQ2qm*f_j)0m6iInPje+c8@pwzRWd8*X=`m2rn1hJ%7GPA12XZSM02MnH(;k( z?-h{R_#?mm9_CXkWkh1_E z)^eDVzgB(!`R$K)j8F-(5~gZDG{-&$_JcV4)zo3c|EGMO0d8COH#OoH`)j2u2P{{!Lc+ zSNQwOSO1|E)IkQJhueh>EyTw`vV=kP-8FE<=sw90L!$&mz@RA%X|3pqTTwZV)Lc+4 z`9oP8;>Q{atyjK$8a>yKR{*Fb4vRUiBL4(m@!de6&F9^J4%cVlvGoEywn$^Hvw2`2^$SA^hOKlCKtM0(RH%J7`Zr0+q{N!5Ad} zCx{iy1yfsVk^7>zRaQXyDlE-J_4Gd)q!PHA#Ts=BXeDH%3c%CjCi`dVXQ=beU87qPXsuP+1HqP6Lc>n7bFr>CbsPN*{-Y+U}gIR981 z_@VmaXN3x}giiwE@mFg`VhEr;bfG9G^j`e$c%a<^qj5%VmFSvDsrewwQH85=h@PlM=GS^hC*nTsZZS8xHg@&Od} zpHtDg%Lf=rrJ(^eE>C-+SL`;Wj{K1wCz@p(gzPf(mO1y$Z4NPJ>R2jb&WTNAjkq;m5#btXxN%wzF`*@5>LpY zMF=vsSz9krX_?>A>brzZT)4<%FC`UygR5Rq#wQaV#p$khO{XTQ*Br%4AEkgEU^5{= zJI|u1td8^XoOnS5_DfQ(E9*o0r9f=&4)0_tW$C|5qRH6!;m7=L?xKjdEi(%GJDY9Y z(heXg9qTYm0N7n&$@I559U0x;mYM5LE3doVP79?J7#$+wDk>Iq*GosEa$ulg5*yE` z8c=V}6xhD+OB56W9?B_sx@Ky@1To#U>3e)>LMc|+8m0V;?z%z)Oy-BdqB&q@e>VM= zR~;Fr8Z+eP`YiA6=RyBA4^85EDJ;1u4V5~D{9j0&I*wC01l*$%Tkl^2d5*fTG|1V* zru6gP7G(rHf5G!|sd{L~1}MQHtA^p|ylUWY3-$tSr{)`twl#F1NJmjm((nt&X#Pli zBWk`Uz8{Y@Dp(zgIo7aVlCv||j~FXw)(b3E3xLc>h_mc|#S*ZOW_n|2QFg=Kx+ zD_`AT=x??VbOVMR{I2WY+324eayqTQFkpAsoIcq50kYi^$(LNg)tjS1;V`@l+u!W? z`y@Nw-I_d*0NkF3|KHeXLd;jI%ZY<5O`I&lbpFcP(2^xg~~1M>uMwArz)1)%N30*GgNM&P9`7^0|>Ao=3#us<_Z zpbnUMr?845UIS-6@xd~~ z5}uc!k@5hQ?Ds2F10_@ys1hn1zyHG4FO@JJ*!))j!uxLp)xQ-~zX}xpt)Tk1g6g*+ z=f4$Hzy$nTLG>%$f##ckE2w_f8~s~B^}kNZ|BDJL;MUy~s6K=*h{*xcid)nm&gTSf zT$R!X=Y2QIa|pE)UviW1j)!0vaO*BSmpn{H=VwjWRq#FgxxRLE;Q6yV;USpkhDzVa zFWt5O#NN-EuvxGJlL>27K)cPJpbYgg$Q99nkW4fq)b0>|noZMXPcg7e>Y3t$@lZMXQHjsCaY;%9ThzwH+P!zur^ zTL6FX|6IF;iA>7KUI{YS?*XZo_p(6^TZlvjSL zDYS_;kbT8^`OZtyb6LtcKDjtr`S!yVs)Y|*IbdZU?|>b22gw5@-0WG$T$d$v zUUWe>C%UbCh8&v^BLsOo%ifUEN3HDc&-MLX%)w>1{iL4MuUAWvmF1J4^PJ(=twbc+ z^B$h$+{TKrS&y`uzI<}S*iyOHymXix=JM{G9nNS+$2l1H=SZvWdwDM($GPcJzbo_9 zCgCu9KDxWOvD_ue5}>2)W|ytaSB5us?irM|#&O&Dn6$zw1pmE+ml|$MG?9wV?p)dY zO7pYxEty>RVma6Q4VN74>Xt;sNXf?<0`js{@Rhe`QX=XmRCcZrGO25-#E(4NM#xAD zmy0RwwS`aEeS3GZu6!y+$%e-mxz5p_*_ z+;_U)OJLzm>wtIM9o>qy56%LJPaGo4#p~j87}nmn5v-#t%cGUKc+`4b7r$V$mL2*c zlI`JIWr1H9f!VtIz|s5%jlqz38=Fm3{ljRH^9SA&i6w&;mAAfZ>W_WsBc~{2q!nP_ zRXNbg?0K?#X!iJMC0#{Dg~^Dl1t@51X1m6@O6VtX3z_S;Pq>a?4;hU84P(d z^{8rZZ$o2jm=?-nv4t2tNh*V9a{Ar?G(yIE;OiLK-%HCm0O_6XwabDDkw98nyV*JR z-<3l(XUd0lJ;VwHT`rmB6J%0>v})ox1hFRwo@QQ1H(8X4X4|Hf*)<}CXR7qFZ??Mc z*;LI>l?+ zk<{*ZFF6fW%)}B^N3p+6yZwclwV+ynT{E~IT@xvRDpJ|TAEfl`L=}ZYLmy*b*K)7* z+{>k`iny+GcC(=Q8j4C zt{S#FVGA!5thQOr$hw~=xGH57)t*y2LYT)pJFQx7ZP3aUMdmG0BPruLO!Bo4x@F$V ze$!gNJN@2rErsU!0GD}v;u&p~_zz6WlBA~90H}{x!shwk&^6h=s90b{^?}#Y7?XlV zIM9r2Qbz5EE_4h<6*{ibln7y^6y+h!E$d~17HTFcffbdry!X0JH! ztjQag>w3|xxvZ%(nX)_r*FZhp?9^qf9-y>{v^IwwS3=@ci3VnSOuyD37JZ#oC*d)~ z95$0LKN&=5&CW(+3hUUcS#=B#$8Njw38kkTH`9pi+sZ3 zv$Z<4vGFNkF?KE2;e&hi42~UqW_ETK+it{Rbho1;UrQ>UpU-~Ot@JKN(y{7bg5tC8 z9g_FIycf*~I3;YZCysDf`TQ8y#|D<+c12Y^o{7r&?`aOsVVGb$#9p3s6{$Z#>{BYa zo)1iC=i1ZUzt}7%QJtmeepNcU7jSES>+u|0I=0068&K|lid(;aZF+v5^ih5QWG(q? zOP*`SqzwgPlXjMS!f1CJzWnysYRRQ39OPDoBdn3uyer&(xpGvCK!igHrz2Uc&zZV6SBu0F(meQ81-d8QYUpgqyE`N6 z%T}{fch`%rSR1)BRc-arCa#b6OepWD5uV9hd8%|Yas1XA?busGvNv|C97_>Q8iWWw zcx1j_?NjrClP=c*%F4bL#DB=GTz9{syy6zSr*l&xLOU9C@+lXFU##xrWzKI_v$87SJ}=L^qMC10Iv z4X9kIp#?=|Y7I?uF4SChbotR*86EzGhIOy<^*PI1HSks$Ah>*Ma&E`iH^CX8VvFU5 z^Z5;ne3z5TZKmp_-FFmB%F^D^m(28LQ+5-{Ak3;Z>%`31`g(~P4ZnTptJaenWviSo zkc`>z%Y&1g<=*03^7VxxYje_OodigQ(jO#HKewBJF$au)$WhO`Q>(8Lu+gMa#mf(G zR4BEWUEL#y-{$beUj2giTl8G$eImy%!$OULsw*^f9) zy(%1=kAtmLH95eJ;qtbxR`(ftoghK^9-rJchVO3|881Jl4|pz4KwBr0Md6boiB#Gu zyt!C5)+Y3tet5Tx%wWh<3)p4+WX)r&an@%6GqjoM=#^qu@HK@|lVZif3k*$3x$ zpqgGJKS@h?2p$6xjgx?r-@L)RX+ICbk6GfB-WM{Du@z|uQevI&^4iMU0#SppjE?R!%%M!0oARp|59`l`xC>n)I<++je&#mrF-dj`r^VH?0ibUbJ|run z$F*GCun{8>VlUkGwNCQ8NsQTkAzSwtmtWPUWzPbX(%m@AH~!gCltvI0!gLToBwYBp zxF(;HSo-)f??HBUrc~fDO(E-=mV@0H3S+bpW?a|lu+?awfjVz9&N!uNu3D!;1e(Qo2 zV3YO z?n;JDPTxu3@oly_Kvm}KTi3^z99JBwd*^1e+%M!IV4U!BK20D8pNXnIJF$y|HSQL| zxH$RYGq9_cBoMc$9m_k`r<8M4tR+S2Lg ziqLj;((-(NM_Af#Eu(mHdm@D6dpqC6B0j84FqYIP zt?pVikP{%cw);{?pvm$PW3rCJlP=<9vbXj=Io7kq)s*LKNaLTWfZ}&neS7aaW;z8) zX6_rQsTK%v*YM|ApKjV%%+l|C-NX{BTpgUy2ZKNiT({ZM%vYDbPDJe8f^WS>WW?{- zYFgF7vhGMgrMx^FH{4dL<6V(`&bxCuNFNHYnhSHjR9tp#Kk7^qNHIdVd+MeLie3y3jgtLUr+7R z3~3y(wkwFQQKoyW?a6~fvclvP+n?z(gc8lkvn%cjC7PTb(a8Q(T_ zho&TYI=Bc-E)Qbn&f*BuT#mJjak1Az43t^vyB1grxAj4-MiP{78MgTc#b}3i+py-1 zM~sc?V6X1X8>*cBw7@gU&w_F}Qu#MpB|PSmDR|gNw){)$K**t!0Xxrx#onHwSE?do z=<@Chiv=BTP>jWTR#x6iEe2Ygl>R>!%mVA$|8{+0aJ%gs4U z=DRgPatc&#C2?#{0wvblLt^|p?;QIjbu*op1|%D%=MUeX)+hRSP+mFP6s|(uQTsCB5E&%tFudV#p{7 zqw-BcRT(nXA06$2lNbu|tHBp5$Cx8wrotdjy(yx*aBQPKIE&f1zPTq{PBbw&LRosScUuiuvKk+PPZ{U{g125pBjAmVcSlj530tq2${p;AQW*5Xe<~pZ z+w7+0kE?h#-W@r<7C9akv-2%qf{uQnhvcq!Wkj#CEZ*$L2LFias+*NdI;$ zZ7gYo=1NEuY;EMOOsPb@tc(vA>;tRop+3y&ixHW{W!-`yPZU%=k$abApsanntm^)?V_KII*`H zZ;|c9&`N={wISW|NiK7UNeeY<3#u7T{m$P%s^#n64jj5#Y`(%U<7* zRDbn4j-PHeaOC+*H>Hvc`I)M`Lu)A0qoKlNQUat>17xhWQnT zSWXEzq2j|A7H9Dxw++5x^8O)6XXVH_Bs`VVtR@%eKxQf7ry|(GG?!Cy|v`=|&C(-ka2 zz_~uCmIAW7@?N}r0h#;l81T4-C z^ShBT9#)@)o~51$agG<4(cwaBjHZ__jZDpgCnr`qBcRsNA<@A#IatDEZY|5piMZ7Q z%B#2Ii};TfSFdW( zHUuzlSX3VSbi7Y6k;))ihap&u} z_6NzPvwRD*Iqudzu)MsQf`^Y7b6|qz;M9lbX#%TnyWbd7C8pllrZ$z@8?M+)I{j5# z*7d!hWG-TF!~I*W<3{6>q+1Ob5C1J0m-X$|z-w+uoYacFp_><5%eDw!q-ERVGV_ zLe(mnx z?pVV^_Qo1j_)C4wmx&b z^IIq#t(odhn5`+!4e6?|0QSR0W^KSUuR5u)(7p0OOhncEh2;q7j^%9Nl-ueMyJGLc0s|N@ud3cu+dzf$OxY&oGa@@7ZLO{&;XUO3g^DL6_cC&k%~Yqk zCiE^G9kkq<(=mb6Yh0k7W5H6YPV^(;tdD1O-%!4$qmBKTpCR~&)BwG!#>N~AZ@9Ng zFrH*i->5}7P0dEN?^tf-l7ASZNu zOkT_0SQd1t+^9i(9kPL*b1z%3P%V3OPb!+5J#Hlw`MeLhSG*hdY9kf7y|lR%rULKR z0NghFEF`3GPkHNX45vE;rdhdIAqhoJQtu)+)1nz^X~>lL6k&GONqshF`KaL|y?%`j zM))_>D<7Iu+bmXZB$w6OPWPowBtH2fPf9DzW7&yGFS4 zO+y4+nubwJ$(pNQ=_oNZ?b!0^UjE>8(DmvSijhk?#)B3Y>)TfG8r_4X<5xz@{{8GI*4y%8b zY^v`t0jqCvf0=i!vJe+z3zcS-Wy<#cdF0;r5{$o`QNn~eQ^pC~Sq4Kw1~YT2N9VaQ zYnmh(d{+PKwuB(HWgZ1`8nL|DuoPX9U0Sn1W;J6FVQFKTS51CNWpBQ~e88DSIeQa1 zAA8*Oyco$d9crVyUX_)VVPEBjyecK>)s6Dkk4ezWC6rZ~Vl6Jp&@bW*VH0D8T8>CB z6}XhT1jkJ7b?MmfRItJ3wS)^`HF+6E%a-TQy|%S`niuXPr;yf~KqDE^_4p+2n#iM@ zzKJ3b8lk)vsqY_ zNly+}OBysAk7jEZH#yuipQRS1aJnj6Bb>PsUgei^r8}Hy(CGc^M&Zed%q4Ol8QWWF z{N0Ie8X@kw`tLkNPu42tnq7+GbO_hW=ZDQ#xQ_a%Vz5e;+e`#or1s(G6Edp{KYq6J z@RQ%QbBU_tkx<8uho;y!#i6@G0(>-*N&|@Cc@v zsNfFs>WJ5i5@MV&504(qPVAYCR9Vu@X)@X-N!jrCdSVaz2Jr?qxxKx-NhjLqD+2rP zyVRY>jq8Nmis#8=NwUGk*%hV`5%7i5zI*ONC$e_zs0apL;+YqexEPe5&A`u?>SMPA zusn`@|Kl-;=YciBq4DH}mq!Bu_(>e`wjjkf{r2*GLg_n_PYbRxoR7b|aN?2gRo%2Z z*IvvIo0G!5WE(hpi5TRCeb#gxx7}PEI9}0K^`hR;^354n(#T}% z6dxbR%9-Y)>YPt_B)qw;*De-YbZOg=jXKOwW8YhGY7QvA67rISCu+7ghsiQipytu? z6?T&$DJ(LIHG`)oNjn~F7d2+$6E;iMNw_i&ld>!s%6Q-Z|G0V!s3_a6dt4Eb5MfAZ z8M>vUL1F0bknV0o+5mw827#f592z8~l~iHqW=IL?2I+?X&G){~^L@YnTC--|%n*yY zuXCM!_TJ}Q8_<;`!S_xpv(%o>PM{KpgpQ+5cPk2&`jj_2V#Arum)?fq&C^OibJe%c zBr&QSRgZa!9FL7~{RR=TwtXq@-|Wp4OxdiKP6=2p+xPni=%x@O4X`(cDx(-*75BeK zWz34zYY~Bl6*y|`$C94Vh?W+e92~^wbQX83)Vt0WKoh^P=TXSo#cj;*v24y1f3&EC zhn#Gu5}GMfjLAYAp$b_YF_c4Hpv~b>VIq^DeUZTH3;f*k4cxPU$>|@u2+hrsiBg$l zZj*7rWYhjgjVr?=nflC<;k>u^<{q_3iu5GwSr+u^Wg>)}lv)X>z&u*ihsUEiHdLxp zh>EnBtp{v=2iDNwPZWZn9`qp2OsoE0OO5L_RvYrj&-Ab=A5U;)Y5o&_G8lVP?9aWs z<@n#n4;!33hcC1=Gd3*Ik?(?Zl$LC$-!5ntMZbGzh4V7hlhZ97AM@o8@%s@Ps}#tG z|E$M**b11>q!*-t7;z^D7OSyUAvKq@hX5-KcSWfitvdUNfHo(o?02!+1X}f)`W2Kx zF;#gL!b%oTDd^yOz#IhoTItlOxBt@en1v|z+UY|CC%-OlBJFHQ_FQwjcC_xuM1@&# zd5Fx#T9y}k?SgFJgKKVjCU6+dGU$>n5SRo{c7;8#kiBw)88uvHfUO)S z{=Hmb-=Bpwq9?JUlr@T&p|40 zK^;q+xRBl9ixyPS7_j3xtrmSWX)F$rN*rWzO5&^uO5EU~W%<X$wF?7BTp9`Ug(O-SQp zdumzsVhI@gsWfbV^pN?9%53QE)w$QtKU8CLFhb;A^3D+T)s<*%a{qgarI|Kf27JF2 zY!fc#c0VYSKo~(R-=?L!H`koobdHxsGU0tK{OhqiLQ@&wt#jyQLiBY~E&K8DNV(N` z%$l{1JajsM^~AREZlXP&uvZ$UwhAd4wz|pjTH|3YAQgMVxrpsdt+|>O&&2Arssi<| zeJp=sMDtaytS5)h3xKpRTIJD#!5Vwc*Dv^3q{oVMletZstPkKVEs{s48^j0~&NvGJ zF(;j`;?<5Td@)AxbBAv8ExKrVh+|cqy0ny(C|jNi7fu~8&A@wi#t+qm<^vdK$9aOj zW+^Hmmsg#!PJ5t1dfgHo@AV(FwHpdHK^G_dP*>lD84A_=$0s{tIxUO7h^1~0xyN*J zstAF2AOnm+iu$Q0GzZc}NOrs_lq*E$3cc*qqXdhjrY2Lf78+{*kp8n50h`kQ*)-k- z+%2oQ%Qe^PK{m|Po9;l?_n&P(bF%zhov#o$=yqyg45iRluvtu^p`0^w?phw_^|*xGiA7 zS1Q1}UKJ0VFqye~ujvlsY|x)*$2zogUZXzb^29$cIlJyIs)`OJt{>!0~xP&Si0{qpsp?RHGs3++?d z=9PZISP?!vdHZ1{PEe(abqY1Tv>}nnr?s&kc_hD_g zOrB@D#vux&?Ko3(KZcsuxH>3YZGN=eq)~8dN7q6vvu=iHX_ zGse#YanD|1lxVbYR$k>M8U%ZP!cOEdGc_XrX5?g~1<#44lX4i}Vqc7mFic=Bk$1;^ z60G_Vmvl@p(Nr~3qbcMZmqhP+CYj)u)=;AIng9bo{?j84F0&S``LJAn6Y&ZzDc8BC z#NhQg?fE(MtLg$(`?Eb6!L*`CjX>ATk4B3Mf#FZ+G{5k%r|~O`EgIHR)@}g8iCmDz zf9~>s@3j#okZhO^VDcNpmzqUqhL=~(owgQd9WgT9fladLF#DtBelh?3ljbSOO4+oJ~GAZ~syK^7&M z(`wLSM*$iqXrm)xjfkWF6Bg;5hoyF6lVP|1)unCs0{;gyVWHK`Up()Nq8LoX22ES@ zE3mFrZI(I?a;Vu7lvG_Mf)p!sg6Zr_TFbfh`kum>xvbSHl1J6K&*aJ_9j?Ret1T+slKo$bv19{*~-s zK68rA3HhJgR1{E#SEyJjJR%*;(`1_>Uph&8J{`<+Bo(lw{}Q|lKF7P@n}(T7{x=$d z2vr7Ru-6rz84Kf?`AgvXKH(!fx7n{(wy(=r)#@TxSN_;gWt7hk1{Eu>!Q@tqf5e$M zPVDQKjgrDBB;q$OCq`{ZD;jXv17b8`bF zF2WsOb5l!M5UHjJ8&;c|4mTNUUj$7O`o%4#FnGJ?J!xCU2K8t~_UVMOWY#0Gk9)K4 zqgza<+L)#U0Bk3vGtr8)RM7^*1rHFG8dNsUT+%=`OYDp|yV@wq$A_2j8tFS%=OQURo>^;S~(c+*LKBToINjyJ8cENfCm z%k>EryHVcPh=SxKz__N&7SEEr%)-ONbH33>E2bP;qEn2~kKpa!z5@S#X19CQo`c{{ zB|-v$B1_7lKPD)6?tisTuY?eYbfl62v8y7`-sV|#SHdS1I0Ak>I%AcO@$g7F6@WUF zifrrf6Bzz|FZBWzCvN|{oMC6SUMfB}TkQX)_+}hotx!ugOXpEUd;9=Dy&pR5tA>}~ zRM|^ zg*cO9DI;$U4HnxM`$_3FRA+rcZ}g_D+B|L?^`fA*N(_oV^MeFYkbW)wt&y-|#mK8= zCfbWUW%V#@!QkJorgTFvj@KkVJ4t8&(OSQg+zSMs6XtFial;}}mjE?S8RI7LGCK>d?J(d80PZZq8C zq8;pw4~-gZp%bT;#=F&?a?;nz)h|)x+zgquKe(7{7P`&;QlyT-fq8!m!0T0+6u_ZR*ptckAgq@M zsP%v2Q8NO-a;!C}2DsP|k2|zg|FbS)(OMP4X6n$XsmMW)(NDeAMSQ^F-o zgl<%IEX2rmH{=`lRLa{87XC=5qmRJGzS91$G_vVSgAGek|2dW zmHH{i@WU$|GAkrta?I*L6!{&JkGQqfFtB!aR(4jF$rg!!_Zt0lY$3E<)b9(Ry~Sn` z*|MH;n-dbG>udv;?EOan9faz*`%Ts;iBxdlSS5^FLarZCuT@rUhhziw=q$f#6Y(Hn zgni0O>WkE%=K7+ZWvWwb`LG{b%5e$7?v(^k9uPr6JEu*cYEbe0@XM`+k4f63!8;Ww z<*bJPcEYIhth;|@lDSU))ClDxzb?^UE3dIy<8HIiIow}FF$9PF9lYn*4ZL?Mq3seK z0Y9dD9-&uiOcPhW{@@>sa<@~y#DEbY4fH7Hve`Z0G-?G9R@g88N*kJ>*D};dvzz=m zvo6B?_UI* zGxi5h#cvGg4~lLX={kyLw{=T2gY(|&wixiQb)XKl>wD&lqKWis$JdO70D_Np>hsJ&-i)>?X9p2YQZIl7&d!Xnu40ae(Rkj3$1iCO}1h?EpKJ!AcrXv0^dxT!b0=M zQ@+Edza`h*e|@%6Pp2DMDISyfJ-#L!)91?3d?q zLdD4B3mq0Pu3x#btWJ4q08CLjjSZwEiDhOdGrp}6Bgy1Oo@y1L5r+(KNh11BU8{LZ zYrXN*o?Om+c8j3q4@xZg7l`GJ3UuXRcRyL$fg+^&@%dBQpTlHUmX8VlV&2sr7Ri-z zgzh}R<&0D7^Vk0pJ}g84ScRMk3j!6iE|A#_!+LFFTu4#fl&MM_Iq-fm(x2~f$=MaY z=sU=VMf~{+b$#&YIyQ;R49S{cmrgHD%4HO)$884A`m~smYwjVysjSrllmdT$HX~FU zZ-zeBInUba>0}=OM0-Z2qx(TaVpy9FLkPGEEQM??b+8> z%71T$6ph_?vj6*ee*OBA;6>WWZpLp`tB%JdOF>s>akymMYIKs5yMZMve5~Ge*kjf5 zLKjFU@~Rh$2|xLws|JXW4Zd4SQYX6(0(7s*(WSbv+{TYXh#L7JMV2V&2-GG@Fj=qB zHAvJ~?fl56zawXHZP4zrUfTob(zH?CFBo@%f%&8WtR@UKG`OF4mk=+Ap^}D4V>m{ z7XJzI_CDyH)+P_FAtIwF)Y>i8Y1H6$DD4H0XmpAsbzhA4O}V#D!?~q*ddU)@d*T6# zE_P)(Lp)|A{lYozJ+A$1sj)&H-l1$_u?oN7SrLq5S7{$~xI&&3Ul+9UjCREYkObB8 zjrXP6R2%M4DabVAoU`J{C)0`Ndq-XusVx}$-w;DE^T${Q6nCna)ur>R?a-nUq`m1$ zo`q`MW3h8hvEx}!Zhez2SiXn)tetZhv7BrJIIxH5LWm?Te6bV8ClbQ4vKWV7BsV*X>sOtWXO5tu^6F+N05;-D4o9a-50deYzav&&&MJrALWRdH+26^ zv2#TVPRIu#p*Bh!%XNPriS3J=n6$`}?@Ey!o=N+S=4JCq!<9I51U5!^zSKv)5b`mM zkJ2zcyJ(XKnK*?xdOueNOIHR?)`=9w(J6SJLx${v-AE%k%dmf?VWCgJnd>pF9C9Jm-g_ zg*kieYah6)dM3FpBj@W+ln9aAvSdq}*m=a7*&R{#8VYp`L&}gaT%uv5F}-XoZA{Y= z>P=WNBvqs-=r-==I+@gn5r{11yW|8XnFeSnVJMKC=cPICVTykO zE<4?7Ycfm*M=u?niM?kNCoTM21{wKsnL)eR_b;b zf_1j^xE#9vm^s%z?)NZ$6$*UiG*r$t9F#^MlGbfp> znPDUh>NM>JWvG;N{~K~P7O$#yfmUsX;^-BsB==)GAVGegPCl|XwaAqM`R|G*etv+a`bDhn8T&t(z+t2 zdF5GxDDvPHF+g#9K=KG-8mO(s_K8J!MtHsi9QWq(*N$isk6H|LB|*tx+3~ppZ!@Vh zW#QF^7BoV`C*Nw8d@hSNYMf)d%?J1m4ZM%dPM>UZMk>&Q`Q%qLs~>;Kzv}83E7BQ% zJhDF~ul}&!#QXJEK^4w-mF`^=mAn2zr>3@3ZsuiQ=MRlTu8gria^Q#88q$K{{Ti0f z@G(ph-fA=L2~*ax!m!_GxXIXWR@Z|z91kTutO6n*X`;TKf6Ej%w_hi}_{)n<08Iw& z?6(inogb{`Q;Sq-e|o%unitX1T7*P){}z)(MN^D2uU&EmCxu*|&`5;rr_+kRRRB^7 z5|G@7q}B$ej*xF(q&kyOV}f-^W^_1lFlW+%KogpOsY3S;W%I)W$aNwx!2wK+XM`d^ zRs?tQfSX9m2$5G;fnnC3 z#y*n9!v1|`0zT7^`~Cf7m*nv6mm?Mqz$lOWy^`S=ss(k2G2Mo0Y#XI)0JKrYTxh>8 zA1<4p*;*S!)`Z-?lI2&2Vx#cr`288jPAdw{pAB9Ck9%jK;Fg)xzQT6zIa(Z_3l;c$iYfanrAwbv@WX|Y_;#jb?V7-w|0Z)3hpdU zgK~vwbIydcP5=$H%Fmw_Y)<2x%nUptK-s2Oi>sQ!r|Cs7?Yo_0Xs7y6-rPz=J2@Q$ zVn=4tWsrI1=^wGg0ztdoN0;lg0mzu|-ze&@CqX0uB1*1xJAD=U6d4>fK$7OGjt!EfxtH zv4OqDV^BmxzqnPqgj^^4|6c1mBV{IBw@OGWJg4kNU~M%AlZLX_DFuQ>Z&$tJ-|4uX zdGnF-|C|=-+&{=Eld4T%OmT|MRIEx`Tm~Onjg9D3D9{#vOP&nZ#=110G^Jf|xTOOXE;?(;uCWzbbVVq*?E;;h%T3*{5yGS=n67>gyudm;qBq`Z zGNJLYOA%H8mB_Xkll;v>nae|`%yGW9l5kfy;pHDJRz!|Hd^=O%3R9V3z#T4J?J%6qc&o5(E62&lpq-{|vX zk*infhVTg5PqwrAr;ksv{`;}siB=&PK=GKOmby(*tcIKsQ0wBQX0tsf=vRema4D1K zsDX{1un5K}a1-{=1*9A3@h0CmYh@_eD)IAx2{QU%~%;TW}vV$Cp7;!(`4*jL*DYMQ7pdNoeYN&)MX z<&h!IpMFT30cw0l)j_@ZdnZ>r0gl2Bakc`ilCj2bE^UrqO#4oqy_fOyE8F_;Qq=b} z&Js%P6D6C5cS@(7?B_({W0YFJgsU;3#FW1oM|C;`;9d^II5}9m;uccy5@h2zI@K%C z81$gH|Bv8rhf~>6F#4$O1}^5~Ssc_#nzr$`Rt&n2&wt=_K0Zp0cI?0{juZ!@J6d@( z#{#GFu?>u;e5aU2-!Ldh!Hq*HDZeGWG5uCh!S8F%4c57=k}X!<0FOL3`h_U=0+_mQ zd*fNt#PSP^IybQtM}|wMPqjWO1ir^6#d*8#nDo+cZxYR~h*7;W^ur&6II|fU^dSmkfNfh1cOJ|5E>wX|g;MncLx$%x5^vHGFPw@+3%I~a#ZR_FrD5=2AZ_ZnfebPA+O2VYiNtD1kwjx1 zkaaDDYM-h_%RV6!W2^VkvV2@@E7zB&BLVXozdQhHo>dbp>LYz=D+)u@ z1f0^Al|*(aC$Koyc_d*cg8e*2J>RyjHkIgnQPi(63f4|ueThX1M9*8?G@~FRp|Kq*XkKs>p!|=#^)!$qFFaEsu zo>k??92ib7nt^>Rjm_`V!SlSdz%q4oWU|15p!j(-c!`OY@j1GcFOkfXv~Yf6C&y*2 zoHB-K7CRHvvSow&mVgdtAl9 zY>)y!q&>@S(IE52-axmN%(T;%ey*LE;N0QZg}x`1Jr(WUw;EKldnD^86a`c5|8Dy; z9bF+O;*bsi#UV=i>!$@Oip0Yo24eCpGpVY_l{|mi=R}OuDnT~*5`#%Kf41}{=sNy7 zAW(k!sW^C8Tv~~picVEK|-F0$Ha@U3cOntFG_Tbe?1E!q3xid$O`vb&CvLWbvT>$5+oWM?|YRZ_w4c zF>;v8-0-<#ga+A5X=31>hu`rb8Z*Ka{}lc2#O~z0fyVIfAK%%5fXi>!Ej~+76pIxO z)P}Xq8W7w*S&4ECwq8m4T|M^;2>7D5@blv%bfKHnm}uEAAg+kyzYZ$_%Duer?o+8L zv>_P%4%Vba+^tGVM|1>ZYYqrj2hTj&~0eBzdHsvq)FI zM1d2F@5nyU+d+qZX4UrEK$R7v7uy;w#)g0xUI197vP7KJWb;x&gM+=VCh09T<+&2s z^fjS+d3tsRNo?Aa{R*E}_U4-l{{B8k%<8X)bdrJ3l2RUrakX`=!xZ z+W&>w4W*l3DC^Cz@Uu^Lri<#<3Vn<&_+@^D;;>mrOO1K#&Nk8^v3*NEA_@P&{C6^~ zE2c5<&vz+#iM`0{la^knIUT{LFKB|pl&uvD$wP%bRjwnWBEs0q+O7JX^|Pu9RoDfG zp^|xHX8Nv5?29jOmO2x`;L6FIL<9GY7W)j61;vRDAyaC~`KA|@p}9%IltWomrz85c zO8hnjt22vfAJE^WaU4SD$9MB+)?(;{e^w2%(^GkfdP+nDo3<#5zPJL%Vv$}+LZ%a9 zZE4qkZYxU!t3hhi|?44j}(cNxDe{Eo@R+#RlYE= znc~YYjyh{}sj{|^nkd2dyHq305DSSbH*ICRR^5wyJ2{>v4IHrKc`cz2ng%~ zA%&d%uKpC5##eI3#32`YeJ2a9~z{ zHK_Cy)D`KNg|H?ak7JdOkl1+RnN@jHT))^Rs3yXaUrH4TV$WAhFq#-!Pdxp2UL2VP z#HoQs24K4!7XSWEwn6+HH#P8=Wz$;^hub+5xNzk~%o}kSzig2jjo8q;o6TQrx5G82 z*K+Ni6~*oIt-{kp%D+Bsob3~%zd20y2R4WTv3-89lJE2Wi_hqDf1AoOtHQmFA&X;d zbI$08rKaT#YUk#TfCtIzP;mYggltK{vp|b;KhJ*^$kNQYwtMp-*_KR7!+<6lz4`yw z!+{946!jY|cm|Ve1DLZBfKavHCL5Kiep0HNS+X)nk6(G5#UT)Q?OL{=l9Uz?{gx{Z zCX(Ma3A@uhi&M24gm)n5|(3v>uh)elYT*YuZ9rfg>&)ZOKTuH2a zw27uHAxS}013-`&QnbSkCK;5-mRELIUJ}~XqT?l~Mb}v0-!!Vs(-E{;voH!iDmCJl zO*IZZAP1Ak_w%Xfh8`V8eGU-@)G#<1og@QI^-NuhFO_9vG=rfBgu_dbTlcOAY{{Zi z*s~c%$O)7v&D-Jyd>#D!gQjLndU9{C6oib&2C;v&<8WY){V=c5rkErpMC z&(7+9zC>i7tkl?G3Iv*=lu)%wHk+1F+7|&nb2J z_eN|uD7*18S*3ZYVc4iRWM4iWInM~3ZIp@PeHgZhr9(K=C%$}TV)>7}$^OT?%3I@Z z8ZN7@U=kki>$=h!i&;uboHm_Bse1zmiSRQ5XCAXKDG@lsLEez!7DU`wS2xYKr9~+5a)D4u5PXa9MRuI_SZfeS#~>5 zx_vCR_;}$sriCdAgMzHlH9@T&xVAK%sFc* zP^__X6-~$21ras(A63j1yyvKguvQTfm;)*HqPT2J@qmoZ7eVzhnKtx#d%!RAwC@C; zwKGJsSTsUGQlC~baoS5ttqDdE02`*~Ri^_@)hV?&w^tEGnOC&$9a5^ATGldJIu7{Y ztrbX)^(d^-R{PPF5icfLSc-%*(Wr4^RX(#$0TbavJD+ae(&%<28d9o}KkRnjzK}iC zs9?{}w>+orwH{PxqtZ+4c|B;X$oV2wiF4^{Di6yK6`@98)=U-$$6!5^iDoq`_jytJ!E|g?y72TQ_RsW((gDnXnw}R``GAj6GcXnd^c(c26@qTP?tAk< z&YY3XZ7Jdq^c2fP0J|xe>PEsaH&UMbP^LeaLf{>goWrqwVWCaFhR>YFWvXtpXdw0B zScy)K-0_wMAmv3Dc&LcyMc?XC#2rd?fB!z=b5+0z;~*JVR{H{)ko3bk22;>t(V9}qLd&|)b>e1jZqEDQ%%VSn5ZL6A zC*Ud>h*oRXrB?C)jbP*We>{MBMZN_<>x;iGg3sZDrR1knDk0YqU~t$5Fo{O%hy-Rm zTF-Slw8coKH4n}ayrvwAOzW%h+^MZq6tB&CTlg5aL_%{#a-2Xa-87!-S zp!xB~P7hcEPMi;HIAFfJGpf~V1G#{kg+n%7@$<9y=obIl5_E$u9+cZPQ$xA&bUXiq z=9ep0+(bYLHtMl(4uSkhr9kDq{l5z`^jvuiWPY5g;jz^DNoCXVh^tPkZ@Jj0!`+$U z2giGbw1N>^_{6OfA3l6wd{dAkMR8)a>$5q=lJU;cVDB*qD&=$|8Dy-Dxm2V9us>vc zXis3G8_0vCZ05U{=1+`sru`^c2CusqA9MlSWBG$NWqziBR9`TdA{%hBn=9ltr@(2z z%x>DmTKT*`OVu$l>>H7^{q@mCLe8`ym_+>-BFp7W^a&15+%k((Cgcl~bZWqD>)U$HMh zaZ3Sj2YTx3{VeyI^&tlY8-%M3ZQNyK!VdooE!+`RQjQIkb>VZiOSx^a#BtQC%GS9$ zJm{DH^xbMQ)E`@<82K44d~Dbd2b*u=pos+?a&xbSXex+ggr!@t?~BU6C}-}LbPKgV zY_<;f^=+?%?zhr#zDf*31wSc`lWC_MoXO9!Sj5cB?jvnaBPETUYG&vvZe`@? zb#g^z>3V@jy;Vzjt#=?4#vEq zm!2Xh$BTXpQVJj@x;P&O&g^0>e2blHVbl;P$Yosh>+59xK^a1*z*d#=Y5&H^3dhlx zw<&2?3qEo&8re!fAhMH@0Jl;&4gkR{zdDOw{bQt`0g^H6=`>Ft8K!tDaCy1g!iCBF zS{7clr&LBY+iGe;DP{||ExdVvH4IJc5VE+lQMkji-i`IzF!ji^Oa(8q+K|u#$y2;> zI0TlBb$p#j9AoYJKMYSs9bp00O&2l<4i4Mb9`HW?R3YNEmh9>{ktn7ex+wA$6U7Jr zt{_HDx_P`Mw7j*Io7S+(p^SS>C4dCrF;(rpH3-UZSZdbzDV{~$wjHJSaBaZs8JYBa zb3ma;o(L%C4Nb_RhcQ>>=SugV#_Y$cijAr<`3Z6{X(0J$BT9GN4|h`VfQJA*nQdQl zA^yagGYBd>3>bSI!UlF3^y>R4?X`(H0GFrC2U-!~g66A{XTrk$mqSOrt#Kp6x*FnL>^ zpmXG}r}9J-`{L)~9h6-F>0Yt5bgp2!rTX(P;dt^wU{McM-2bindjt2;c=^k*gRt3| zCb@{9rO-c}Y#|MBf$zE|8*i`bJ_1rnx_9a22-29>@!G}0MDNzo38X|D6qTFgVa=y} zn!>`=`pMU<=@s?Q9zz^3yt*r(!w(1p-z?xMxuRM=96P_|!PVuylzhzd`0U-eMs?!C zK9Z1XUf61}WW1O1;cB<6MDRMqVKh%qCDf)U>k|K^HS0stLqK2tPj|=vZTk36IQ)nK zaH!`}e;fMMkG4D3bpF$CY4a-PO^gZ%V1~KYqo|Bq8%$FLjLdpFeL`I19Q#}nAveag zbH?<&Sb%XVn^6&+<@omY<^j7&-3M?73Ip4@wC zbgQjju{tDYKP8Pn>ILVFyCbhlDp-rC`Uzn?ajywy3;M!IGU$wiy>={UA>uW)Ulg%? z)MAll5_3|KFp+j?3U6L>sgwsO2-Mn!&R6Ls8vURalUHgS=ww#+w3f}p0CI|(ziG9K zGq8EPYhJk#E2o?9^l5F@WkIyzV!hb)Ey@W4)U8a8Qq-j9b09h&9u)iq_Ur#051jT?PN@>YmZT_kJ{Tgyr5&Kiot<*4jqhMKU|P9A9{|EV>Xj!kMJ z{@1!R0v82JUIsdKbRK)qlx~iv$6vfvE?iKsr5;w{+OM6-wwE+|2G*G+8O{=Z6{^J$ zR#l_`Z1h3Cq`=d;Xn=Qw#-`Zc&cE|TZ!2@4J;a3rLq)vA>pQPk2BV>J+$sAfF!k$; zlf0a;#E?f~Z>})$sgI<{(<`^sfNOk1DwimRuGMpzXm^1NAaj#(W^G*IK*PaLR*ny z!q+qcG?pW)byPy(FSj@Db=W8`Yi?p$coZNSYo=A9Z0rVaWK0^5^MIx*19Z5X?R<+5 zv7x`rcMhmV(~ung*67#yPY{Kwq4$eve;z%)O4KWRGDJ$z?B9TmdTFqF?$ULu($X3I zBbDt>7f&kz-7D(hE@MwSkWzh}t!f&fazx(#G#@b#l%Am#KuS>pskz?Pdbdwf|$ z=?~Cj?J(A3W2D+e3SrGOevfhPFb$8?lbzOnO(HM5?Bm2_7o{Oyk-}>=V!sa`Z18Dw z4IM>%X$st`+ga>ReGtj8mm%pVAPpvoO%`w<0$?i!V331IHjQNnmwpf#LyGa9MSBO z=EV2#zqsHMB+>LSxUfKmqiEH_D`t_JfPNO`OP41uFKy|^o}U#9-xCme#~tbS+jC$g zEaf;&_z_D|=*>(`Y`J)#Qg={uu@lOzNV@#Fhtt@8i2dS;jF#9ed7Hh)jkGl%NxrvB z?dsJ(()iQ>-h};Tc`i|wxI?^lmZQzF=g3P?%;viYIn==*CB2=ZCK7VQ2rJD`QnDLV zXcZ~~*RJ`)@=%%;%Nu5(jdZ`@i&Ac_jp+kPcWZVv>i&pa%2efkSx6B#n2&^oHe^dm zKhJ4v@nfgue5=+jx|`{JaY+OwX(vYk+V$qWwt(Hd$3{x)vU;)-B(#KKB~@bYy~RNc zRro57Ve|@z$(^*9lArIe_hX>Finx^rD6;aWcK|oGJtWuhqQOdfTa>YUf`3soWPewp zvPRE9!6YVXjirS@P5E<>8{a=Pe7WH06 z-r=mP63XY>`*?FcTqzm%l0s4F^xeCc2+^Pd?kIhJz=e`}Kh*I~c({`p+?R#v|H0eu z8teWm`L@6g`vPzc5JIm@DH* zVpNY7uehQ(iRVEGM%M1%F%Cu_p>}F4q?HdguI5Z0a)%S~@ucw0&dl@S823Y_h!L_G#o z!oD{cF;r4W&0Tl%lLhusfAE(Zpr9>U094wtkBWXhau`8ET zBJdb7jeWjy&2k(*=6*z-B+seXfGvLzp&~Y5mJ4WKXy1CB(D=br6fK#L@M5fmWt{zF zgNfEMiyw`=(580TV-FIBwsuSO2!ow{Ibn=V7(_J{>$%A`)s8;Pn0 z`p9~s*fQ6vs{-&ABOshgwdpPCb3s>m_6&n52(M3!I1U;aP~82f%PNiP%S9hW!Vy`7 zWgVxChj-z?;dqxiQp(k=t|+3$#xU>qR&18`Z$pmbps^=a`3mgaj>dKl5Y|~?YR#=n zT&CmUKJS$VeOS7H)1C*LCA?ha6v5-7q`1Ba%rt()`UjF?koP6Ib(|X>66x{F>x}xebv}h9X^Bn~PUQOrf7AbCuYX(pXhy_^DHJQ}IdH)*|d1bQrBD zDJPne;Im98UR?;92KMmQxiq1m0HE+@%oCo=0&hnGf6^HH*`H}lKDzq!Aw4ZBfIeMr`^4#8EO8EBuPsUj;sx6!#zcAg9(ywF0Yx;``(3(ph zZ<7Zv*1`^EgS2y)HSo0alI;L}EV5UfxQxF+=KIfsE{@`tGNV*H-$|MpD~ zx?5nJkRk6>*3EOz6sG5Hw>Uu%R-XO6G+S_w_TzmoHszOFvO0O>Zu3qsO^J{vN(*T( zfp$HQR}li8u9%9NA1O(C?CI;;D&i4<6LxhIs?O-SRei()ZoZgrT3Bm)T~#U zwZaK|Qjmlj$%|{i+RnRFTgY96pUY#VSq7NKw1Nlosl2y}50E4mpC})R&trhWMlCgL z?K5rV;T4PQc6D~U5h0C^kX*IhEmgsTHMpFF=k=3HxGnpB@ZXkgQm-Zl6t$t&k{|D( zY`9vQXqZmtgssnCz^s%GAnrndaS{iT z;%Kp2k!5x~TVWyrS>#Ld|8;9MEGhw(7GHhf=|6l1Y2AaX=Out~maWce<6x}Dy&G57 z5W;`s<1~`rtDk?%Ao_{xvet1f1tF-ZWX5GwOG@xrhkW0~&()U}4-6OEqg{Q1p_ym0OH!+{EF=lq#ys6)_nH+Z2Gn zPUJQbJ=ou;H#0M92skar6k=uVYWbWYED9-lekSF;BYktcx$gTREW0kFVe2qX#2lxm zRSn-EVj;KVd-P*Lw^c^V`zp!fnB}=_+J#$HZ*>7>LFpkb6zHQ!|Nm%v3$Q4+u5Vls zq$CuOP`X<|q*FSFE&-L2?(S3p0qHL36p(I%7`mlVdMKqC82I*_qdw<<&hxzg_q)FL zy)G`;GsE2Xz1LcM#c!>>HZm$z|FN|En_D~JLE;3rZ?9sZWFWH+=DVU=ptZ~|moDMf z%iHW^+Y3$MBe`;AQ>Oc?W$(RLSOh!|NJ2tG<+q=8MJjE4R=R03^FAjOXVXd^GF$I5 zbA&9>?*F0sd)xgVm&4Dt#{m?ObOD6Sf#V9g`2d3UF2sUdd)7$4k`-!PNMRw%Bk^FG zFwl+z?RsgJPUW+WW8V+Ur0-2b=5c|%LOA;=_4#+<-rzEq}&Pmbr|9d%jR zm#sI@<-w)ngrctjsTDy=?ZUObUudmZyAoigW9;h>4*-IT0jQ4x6!-5R1D7sTZ0j91{l0+xrQ zF3RPF!trgzh^pR?AJSCXhiNnv+k%(%s|Y{Kr}SlqUmhG_qEQMIs=f@wkkY7@=7G&AoC{qTdG0MU*H|uSCcge&l7gCdr%%(QFvKZet;$5sWi-cO ziE*S;N&mp(E)%d&YI|b1pgiXkS(WdHckkNoDe)pRN=gs0MggScj}c<^n-XBq&Vq97 z>{5|ju(qx^s-g4p+$k~z8xsaV-PM$wzt6F7A>|pI?!X>PM+9`}(4hZ*dZ^$@_>QWW z18>vuDoP|__ASj~i49*e+2LoM&QNHZ?}eiH+siCs!8-n}^9&jZ3#lNrYvl34OfMml zZ>4byXhN_z>O6l`X})*gkVo~EwPB{C_z-A|?(o{w{=AmjmiaJVTdo7oi*12hpm z-ZD~pRe*r*A7A1A%{O}jq!BiGdrt|>`X!|P`tQ9$U{K011iCAbJ$NVj`Q^=zu+~s= zTuOd<1HW|+sc5d!M}M8=71SG;bm#drp9eE0-;sDAN%-;>>bwEJ3@6@h*exrE2^!nE z`e&2s=6z{%*%-;sPFC+?PS7ri6m0=ZMKx5B1o`;4z*9ed4d$yo zbF&Zqm!yGyJwR}$$~r!Qk8fZsLzDZn=-9jvX3>`XSiiFo$eH_NF88Ot@N~TlV9{Vw z8P1WaCWC@)fX`1}zIksNzLWvAI;0!E`s=z#F<8O)B%cryGyZ(basNXw@*3^8Q8TRd z#4|I5-hYNr2ws?QlqXG-7Dx zxZfwcID;S<7Fr1;4H^%J*K8aXVO(PeJ;uzB;Lh+oTsW}H!mf`qyTp-J<13pz$b2u7 z0l97H6nS#{x6ZLe_5rwKeJdXWH1hz_dkFSlADM~^6*LJ|9xu_%i=huwzc@eb?(J1@ z;!DVM-JXBc^!ZXIlHx7s0bo%p_1CQuS1_L66w_d0=R($Z+nb}jyl$F07ldJ&^7gG{ zVO-g?YS_fKl1is|P1Nna>=)Q;0?XF;*=!%T$|d5!hAmw%JX*tDbx%Byu%zs#6)ey06gy4a-*AorhNcG99H=z%FUqbRvC2Mcf#I2y}hGOC3 zCS24tCpzf^0shIc5&ZmN zl88vN%x<|+u8InUClp$#OpLrmYbuDpzj@Dzzua>MI~m3SD+xsHE)!E~b|g6so5xJI z_h6P>8aa}f78`-d@S0XnBE`cy4~N$r@R6=W(UA2B|!v8o3C`4*apJNgljpdW;=;))Mz=fHKiOKQWR8bue?U`EZEC9;FHYWD$ zq_eZL;ms|$kL5!5_V#jctP)^}@Y8+sVzsgak*FYhK+_Mpix@!ac#yXAwNE?SZ_%Aa zLKnPW=oD|Fiiy!&xrs%L@)v*Sx8w7Vfus+(>Q+-1s9gFusrmL1P$e~1UAI49*Df1} zys0zqj5jGPyQ9UNpa)9xq$rZ_fq%EB2U1s0h9prfZ4%zE`}p@FVZSQRl_<&L3NBjy47oj9m@BA821xvwNKs+Krb0Mfh zsRP6BtMM{|clvqpN71k1foVg79^O$v`;TJ(`)l~$b^e(5A(%XvH_|i?5M`gh9MMRz zXyQzFonAr`93)u5|92rPr}-xM2!2m96^VDQ-g&tZcDnJpVPhd0m2+`nNW<+lL6eOV8+eYRtY4T_9KQ+z)dT` zb@>x`2S6v7pEvD9-t@=nQyA6aQ{+v*gc>*ew{9x;$4$wRH-*Z$h2o=u${J9;bvun7 z80eTbf|@9535#lRP()$2jr!M_{-&^t!9+|6^r;DeK>& z|K~smxnKFr765T)dpvjNhLQB0yp?_8X&-t6Jizz#!VHjj9YD(iQy4&sk;j&U*>8E^ zMZVMj@Wv?GRXpSdlptP8g}OiKbN=HY>g!3zVeXv-7Oq&Vl{lRU0jQ??N2o59RRqzrA8@c1Qr@8~lE5@+TOk}OWz@;bs`Vew^yP|JS_$%4C9X_&w4V0%B31^YOk4#eAoz=wNT z{hez6|16-w0!yB#QYjdN=)P^j5s+zS=9!u%uVW50G_)yOF#=j@nmDg8NFs+(9*C8a zzvyljgRTvoAOQRymivEC3337FZr7k>QULW@g+cOj#HaKEzbT;7#3l1W{l@=yRZQ=s zy|avT&^MIs7^X(8jl)4fL9ghUd|gZeF;>9Fb8b4O)_Fko zqjKPVkuttV8tc2rTN}UT{@1Pfk+*IQND{$t$4B1!{ge*Nf9KX+f84t4k6Q~hzI`j! zqYY*V7QeY1#9LSlEPmGa|I3U2hl>^=(`ncrif%;_GpqvrC1lSnH1r;Ck zK-p1AY|P)xH=>qEUJcSi+7YDHa9`!4{dHmgRHV7gzw^QZ*b(F~AT^TyH^}qbYW#EH zj^x+Toa0MK?TXj&jsX@HR@HXa8xjx=I7u;SM`xYv1ptGR`aiE?uAuzOpxB&%P6YdF zgEMCL?nI&hbxIRgA`9{62MT9P3DAK{`8gVhFZh6&z1u}*{u_h0cLMLsdSAQmga4fh z427OoS8Dv$!~ew~3c2yNRUZ^%J9_K-e`A82!@_z%m}jH^5CTr@JJeV2Z6gJ!2yFjI zz@8ox3Mxw;mg*K8!9W(HNWMl7E`<95D7ODAMEO5kR;oo2RL6n{aZM*r)$I58nd4QQ z!*0&`tnR!__B~Bp@7VO)IG7uJf2hV};C}M?X2E#oM_$*5@^7;4(nrL;_|~Z?4NlD( zn*7?H)DFUm^^a?e2VBcS!k*QMfue>yw!yamB~p>%#T{3C4HQXyex^!|4G|X?zg^>^ zMXN%bjiSZQC@N|sd|_55I2=yQdFbJFw>}2-^Cl=^pk_C?r`|TET@hI1`;p;)dg2tQ zaE+IbT=qI0qk0;<*(TG^B#qr(@R>ZEignHz!(Tg0ng=6f1n))X~u$-J`e&+h3r{s zPyNr8^RIV62UQYvUJ4=w%F#ncSRl8M?;7`^!P$H{H*54WeEKl`_VTswaUDk9C#e^{ z4`$U9!d<45+RN@}TMOkl)<+~)vtrM(p#yombNwdNu@xBkPqzr$8WljyVF?%FEOm*wvBzZ}%z+uNXkLV{C7rMU@{WMJ6&1xX|b^Fk$~>*4^t zMsq>RewAQK5BRn>h5Rm>^)Vrhn!w>7&v#Lzo#c<;{KZ}bizLjN!5!9RSr$BAM)ard9=y*()x6z5HuI%ZuM4tZf@EnvLx zWvbAgMUu0MdF=AK;NcT|G{0ucsODFU{ydqSpIPtL*Axf`+><_jXMv_P=yz& zhN;bgT_fX`@dsLwYpy%QO4uNnMYWj(=hCOp_l4~OW)8<3e0{%`&)yU>Y?9Y!PX`(; zlI~j+XYP1OhDbbMn%R!}D*F=4R2J1k0f;M?Qjh8%2xXl4 zXT7l7-1!@rQw>L;$A)vOg8}>;mX|(A_zUb-^lm z>}qxIK6nF}O}pX$*J^@)dioraPvorZ)WMwYFMWlF>lntsW!wfK>I z<7e;gq3k}Q92xc!_P+*#icr+MU{gyR!Jqi#`UBE1`ogSXzoGE-8Ee_00|)>oPvLO2 z3?UE2kN7pJQvM_CW1~_`tM@FI?U9|saWUBqYr}4H8Wau69JG%EiPR1^dtE3s8VaY+ z5OPTY9qw}nm&A|(M+~|n(z8c~gQs5pq`#MXJtoq)SE(j30K+RD{6Xr!(CGj&Qh1`` zMj3V$56W=oV8tkBFV=9zgl&#$g`2J5`S7##D)$=dfC{6wp^OC%*NYE-qRjlu?_?p3pOJ_p6*Gzk1OjmvC*=E$GqXNc^ZgTL<{4=Mwe1Ft z-tnPPYSK@`4ti+#+CT8CGwW96!snMdRdQda)&lhh0X{*kK-CubYh>SSqtI*gfFJS{-N4!8%LH0! zZTG6#ZK8N?xFp;dni^lFPWA%%8zz3}$&VP?UGG?rYa(I9yRnru*mUIorN>tGMbSgpF7 zj|dmK04X${j>&MaIXRZe6iNusE5m#&qn@t}6vGo_!{Yk{ao~aYkewUX_PVBiheflX zb0ZV)G@Bw3s!*C(dD@f)=HoWfT)jw%pUdq(M37xK-z8$K=r=S*97TwP|=*q^}8!Y^rrB(zGbkI}RKxb}85i!{T5< zLBV>8^Hf3NXoY`mw!v*DT`?w^j=O<-zhQ8*XVz;+cftIkH~gfZze$}~t=h3XuG!wO z;Am$zDhzFm$ z*p;i482G_^9Srx-Pyyt66%}9h#??T`t4fu=TUSwo39?UaQTbm%!T2}7L~hGYP-#ei zrP@dsH-J54BeJlJn85|dkx;q}`?K}*D8y=tYAC3ypTVE2um(c5Ro~*Euw#SIr}DYy z!MVIQq%M!d@mcD5*D{c`TpX@!iyN$|9-!WI-6p_$m+caDqvv$ezh{AVy zH-n2J1^Inj2}~3W=dvr}h2@9l&c7a;3OqLEdtF7M07BwL$-*z*S4XP2=F85Zd!;6mTtJX`xCSInwP4Qbee&fGpx_~K6&nY?=2hKd}3G`UmTlOh2F_ueL z=hfmx%?9XiTM-L5-lwaQRN>9HDjvF3KNJ$|ph)Dg8f|~uI2@-Y%#efkU5VpBRN(w{} zDTlWd{i!qpZAeC?s6x;%BwTh@%@2DL-^@QU_|*&G!`ut`j&*UZ4{x2C3V21a3+**d z1IN{lR@rh;GCLK7Ap35slCs>JGbGLw;kVy7G}sdDa_D{Hc}Vu(hdT z^FY~vi8&3Oo?`On1o^Gpk%DPs^1^ema~0*cZ#+cn9HMPJQ*%l4NV$IGb*8TUZj}`F zEMwe=YQE8=Rf8?9}xY zQyiInPPvM752d~wr)wtli8I;ceuQAROPtO2Z(mZtrb=ns`ju?TYfxBdv~6Qme`W4?{y6Rjz9AsCJF)ytv8+v? z7+lhYX=(qIL9swg{9yTaIL3__x$nS=8<;ttN8h0m?!?_}#@%3kidNgF&v8doXO@0{ zmj~v~eAl-S3#Di%s#On@M0fYvVP6nAVO4LbIfC#AmC-9=B2c#Mz{;?Ql0i0a)k5Uj z;6SrJ7GKD=Hc_Zv<(&qe-+fo49=#(6yLZX7J2b@Ig+HnE)U*?m*?0s0~LIOdTi)gBiQ~04;IyL1q*FSq zJYzir3xdlX_QHoN4zYDHRvH0Wyj5T?hDt-`;CZ;16CixQl0bDZm4>+`yn++FI$jRkA9&Lf zTXyM}hB!jtiN4XdZR_$?>>e!AHegu7{W8dXoXl~C6kLIQ=KFOpDQUok z$$D;kQ{$yO@%!uXygA)()_o?M#glHFK$i6fia<+~>TRiy3yE-zx&wJ1q+bhhi83>SL# z`$Un`9v_rAj?t@3xbNyRC)MUgeL?F60Jn{borKE9;~1)GojICi!^} ziy%bts3@j{ivTluem$Vd7vHPE2u{?McrjuS`J&sltT2FmJT1bUhdmItS)U3GjZa6* zvV&Ra-=i}Z41E1g>HC!fQ}#E^9s9>N1)c_vZ3I$jz_xf;rKnVaz|%vO@2mWr=DH(b zh(RlwA`mkgLMjX*Y7Ojh$Loi27c$!%7W~QVV_AIhXk;auCUd<;@`teg`=;GHHR%U4 z2yeOGKJ}|~tW3){)^W-Bk6qilFQSyT%$wp7)-8BA*OS!>IOjSwjnKn#ZU}5#e8}Ki z+0n*(%XwTs&|>AS-s4#duMx5)<`yn6GSHn=OC%58>l6KAXRK6XeX_t-#H?#NzQ*`Z zMT5^6;EtAk;F$9#HxNf(F1?v&&lG)F^EizdG<)Z{kB_1bX6L!qwVA<5Oc0&Den>9lyX`U3P&s-xV`7ET8r0vZ)%4d@Dp0rd=L$ zcCq)e@6s%wV73CUX@^UXqxJh;q%{~MY}2ooEk8$$tLf^lFt2610MeJ8eZPGb^&2O! zF&C>5FMs+Tm`Ix=&Kqe#8yyI2#&p{ToUSk+_Lv5B-1kG=^P-OsD>Gk;>e%c9Imor6 zR>hI3M%F>G!Y)ksmqA!O0U0dqNp!V`tA974PDl3QD)8i6 zG=KvHfg?Ug=?BC;Q)ZMttR)l~Os{$7pSk#bO`k-(eebsS|86&Vxos5-B_ zR&L<()O+xi>W(LQ3nRw3s`xbRA`unF%HjGJV<04*9aeFHAyLyz+2VN=mulCVtxFqok{Kc()IGSE<4)*HY`3uuGknJ{{KbA`z=#^Ly)WrGKO?ngj}au8ZAew#H}ruB`2Zmamw4?@$T9CnBd9J@Aq8knC}G7uPn* zF`QOWbRbRW(8c1OzX=@A>w`w_rb9pVJ>~r@^{hy*fv0P%EJL+g@`k4cw(THK{dc4L zNs4M7X%;3vK!!uJoc)3Z&MR`)j^jIv`>QPBPa6xTG!Lo;>D-zy^S%3*y5tZEU()*0 zBg6|;jrXK7QS+`rI7L*Si5yn9?lfB`^HU>P(`Qciw6H02PR^6aRQ_{63iTYiR zdf%ii{_+>3OT|X)afeox{XXWG;7rS@oP$Id3ik_Qw98YG@%sWE2zcG?SUaq?FdaD}xAj-^k8><$(X>sFY87Nt= zq2oS(_?kb{mtoYl;dN|QN{^%#;13t0CAGiUIWiO&OnLKDK~r@APl^8II+qWsnk&~V9CtNBt2?^!)ZeOjBFECF~ zgTw{C(+y8E~Q*-`D$h=DZgWWpH87OSz9r5d{pgASy*tUe)+b*64>y3 zbc6Ncwb@OsV?l$mc!wZ_9)~HmNGyA1+gp7HfcE{JP4|h{!>Hm6#~u>a7t_hWcZ})DpkVi}jox8qTmEpYm8M((UBFaSS2Xrxye+sKns#?ZrFY2RCJ@ zfd(A5bJfc9CiRA04D;qnL9t6cVa6^w5UBz_lNG!K@iPNThM`gUd)=5FzcoV1|zw zm6Hv(;Q{v#UNjjU*Ebp+_LjSF3NyH*HXU&a!YmyB!8frzY-de;mf0f6Hm-!hNw%}X zpqhB$GooMtk*)kgkpsOA5jY88*1oy?_Vnq~O_%rgbb}z-9A5(=*)DpXz9-`b^t9Ef zaizuaB`QWFwbK=xlr-oU@9R9=dZiRhrrdz-kWhW;KZv?RHl|+N5B)w>8e=S=V70jt zHlEt#e1C4gicXllOkpj$G>G@XL+AwbOPX&|gxL}v8RJ^Imut8VO~RPIK1F7x?nGaoaFaVkzSB>e-c)UJyfr;}m(6}u5u}GF zEMze6vx~UB`JILfu;C5ADyXpf#t2rM??goKFGIuuUU%?DZ_q}A)6}zb7PfL;z0G^F z*6}B=;{2NAu?fupj3N!a3^|pn<2@~ z>cS&%%ubJ@)=&l;Q=*3bq=58o9x(IPQ#zc98H5)L+?+oZ+=ex*g1Be;+n2PMj#m(y zU1A>mm(q)YIo|vaL>W^U#$H1f%fc)@-o1CaATbPn^spo$HJv#*d7~f7yk0M6U=XA+ z?yM|Uuv9G5L`}_be%@x*Z5$=a%)?W8dO1pmD#54>+-k;WBSav) z4+E=3`Dre}Pp?cC4RECBU2o~lfMtBJdges(i`rs%w`PM}U^I=PW71;Sg|Wd2qUVth zircWhykTXhl?jb(6UAS>Pwutr^5!%Q#-u{k{Wc@LJyz~SXLt6{8E3b8hY`X#6nosF zX*9WR=Bb?-;GpPIP&QY=fpf5yVzlotcWAJ$W#huFGSqWGV9{1=nB)*7&Mvr4xIQ@N z_FRxBTyt=qQOV`}P_*pxKh04kfov$1#-))EgD%4Dp)BjAqyGb*2ba9@R||yLlci=# z{LU@n;{AkWQ((sXl-Uf={%{3M$C7sXTTQ}Sr&%~fD$8{nI7oOHKr{qrfnPFR;^A2{ z(z^C>Zx0GPwvJ7rT__F4>4@68yQ5E;&D=$(WH@%HF38#_z1_4~o4XYZ6H@S$5W|ib z986FM!)kvS(B6`_vS%x0eX&q3TacRkhNFQ$`HfbAAt8$9xQm+h0=^V>@iYoBI?+pv z+g(|atJ)=HmT?PQ(=(@(ZP(=$N9R+hvT>#Ad z5eI+L0p=$nV1oiU3QAz;9Cs>+8`t_`_m%;zCGFxZoy$&MwMzTfC3Nta^Q&ia3kCxZ z1E|sm9Z-}TSsA@^DYwMlAShXaMK<99o^V=7n?VN^;{(F2u7fq$r0+zv#Sc`*YAUac z#vI|}2{_K5QOqei+`eMmXCWtc2V!*OUFvJSi$mGW7T^2fQtELDx#-Qmg)w4R0wS^L z9^n^Hc4*6A*fNqu9C8}6jrWQkwda}=Ll>(T@Z}T|8%K6cw?_-y=iOEx(Ol0iZ#K^* zuy)j6j~-1=WOpKVfg*~CaS|}Qj_&&)Hei&?se@2q#41s4ZwqX!@cn^pm7{LWW50oC zgJ%QYz(Gh(ISBEWwbkSGaC}a=seR4gImQ2CyTgL@p{%Cy;_=P&2`6Xr4N)!ap>%?_ z9QE*0*V740f{WLs4{JVPE-x>4XA|JPaah8QYdN}mr(Av(Dv~LvGVgbJ&0}->QqIN2 zWwui(F91U#Z^X7*3-#6`K>TN01l5v1W9Yx2eJ_zNf~2By-cJQKz|D&x$qKpHW?}Ye zGX9z@BA8B%7Svgk-EuX3b+B08s)I_{!)>U$!LGopuSUq@ZQQ^lXOa0W^1)BMMmw1(dXYBq#U7k=*d-=g#<-<0`bt% z!gLV9Ok>J$qw3wP&tfvd?Pp{g#Zn!sm@h6&Kv#Gx8o&t)pm`qsr#8DemMfo&;^Km% zrm0SB;R2JQicU;qZQ5=u*{WY+A{FsYxj^FYP8Rp4(h{EyH)xN7OcTg8})T&&C{X&ZPMpclIS-n_R*8x7s z0w&Hz667pU97Lga6h{!7-EUe;9p(a<&rFz(&xYUw)#Mpi2TO4;gf@q_d|e0#vayx*xCf?zEhTnE)P1R0(mkaa1fw=Iw157X^HvBY5?P1&i+0tKnfBNw( z@7t!IoVw5JWgA{`Po;Y4kt*!I{gf_7xsMZv_xI^A#vhhl7)$ahFNj~qs|&ovonP^0 ziqkf_ahictupFX%IfviVtCBdKBHiE#rI~7`cD;1q6ECbi4krWRdG7)1qYI%z^Y{IQ z3t{b-W%F#TmYe!TH`}x=U}F{M&08lpNhq|M8WXa{#Ffx}APV$AGby(xXfB7GitI z;aE;j%T4yzbRPob+62K{IA1kPL?8Div!?2Oc70u1crZbU4RmBc&99B@YeFb?gepgn_TiOl6C z!WH84Of{>X`80S}mP(rW)ksX(&KC=+Bc}JUy=zA*G>tBuYwlBY#AcTg6r#8&8g-m? zrm*ND&V3sFfxq$(tR`8^5j9(~3VoLv5$Pw3I8)LK*Gd(w*M_bMPklQZa0fb^>od9Q zCWrQ{u-btiWMSm+oYrdjaLt%lZ*=Kau%%q4BdP#{z31+ZqxDnUE`jWto9?QJ)^9&v z2P~+be4=9%d{o6HxTZm#$yU^xud1)jInHx|(cnUga*cKf7s&3m*jr#1K4}2rD|&3) z{rQYBa^N-BHiMNoRRfatb#1g90vd>%))k|3>B&1a>S|d!ei`R^0Oj80 zi1TYceEk4cyNU&T@UhE6yiM-!*2U`*+>LPig-x!(YG1qKJI~*qSy;x!tIQW+Ba7Al zM)`mwOgaU8`D-h-UhfXb{6at!y6?_2uB|XN%b06D;H=`oMgb;WE^yRN;Rp>0%GEa7 zr9>ZP6mNmgdY%pvY|`wOrt<*Tj3CksLz2oqQGm!&-$j5>`wT6iSUsy8QXqc%1D26U zzhS}tA_~E0-qv4~U8!2DH37HL>q8F+2I?dpf94b2O<88Z0_K`IHh`-9@tguQ0BNW7 zd@pq+z#YJfVai^gKEIHfY+tM49_2QHMA7v0Lf^#fDOEXGC1ZwvvYZxn+D|Vpfm!C} zw+?tH=cQ8acvU~@CHL)q8;}(VlSX%TmhQsc`I2cCY#)#zMkU+ghF+-X!gwV&6QzUF z%}<%6duOt^;F4tvr)~ZbF4^b;j3F>HmDO_P!`VV?{N|yNobw?u39TTv!H&QgBbS+p zDr$?a<~-c7LD9=L66+Dq^%*`VEvbPP;f$Kjtf0>%-niEb*^K7O#yfYcR$|>yyT0N6 zjr`!{%K$NLv~15UuSmijuUc~{9@aJa9_%#_XpXO}LSpkagS=VA*L;gdEY5(v3}J^w83Hc7Drgcom}8m%ntJYhu4hOHF@l;DU_DXqeLag>~hrqrDV-3-yv zwJs01i!waw$fm3~Ubxe;#lJr4pbxMEXXaGJncb0NpLXM#e2o?i;0wE4m1wNaBJdOSWQN>9H8A<{<22HM$X#OPr@}2n`m0+<6A$Mxch_kcZ!EXk zwHWGmWW_Q@M(;*4F5EBR zE3!aewJQUlOGG^FF$Jusg3=O3mRtW`Li&JH!> zsPQ@Ft@{{6e)N|SviML@uMWi+^(O^siVej^)K3eU>a<^E*>W<+?iM2u=$9j-qjW0U z4t2HzoV+=YEiAPrsSD+6>Tqz%MVk{-2usNVT#;!^UUHn9VpP(=bAE=ZQ1|meqP>xx zw4I9XO_Uxa&V1YNz4PFJ zO<9UZ!AEho=2Mj(#om_|`0{wJXO+Y+ad|dMN}rknL}1g5R$M%f2|6aB z<4qHpC^r+a^L|#|cj0LIM5M7$4lUoa=TTzB@z|N~xY_9@>;B57X`b5T5EZ}fM%7^9 z)xDXwU9y*k9?Ek9JgXLNm)aB7So{|9ch*Z@9|n8bJ=Rd~>T)(AB?#ssIsd2nCBXt< z1=KJG_t6FC8*e7H2qu^#0WFnbLa~E&0c1YZcw~N79~+ih{7m zjMmG(ZIxAu6Nz>SHsc$R#*8z#!$-1)^N=%Rir|p~-VOD%EvxC0%jl`_wdts*qB6H} zV%pL@U+>$(UvNUXGutdOVudkyzD0LQpa@$|mB(fT29Oikt5pOJ&U^L;DQVSr#g!DV zViDYRL=VFKQkFUEctqi9L!@RIw{&?=A6jx?Bz_|}>Y!jlX1SBQ6MAz0S~`5!yGGB} z{oHBL^TPe&Dwk^$O@Z=80?X+krMZHx>1)kF{%kpu)YeljM9iz0O*q>2o&AJf_QAo* zPP~ZCJ}Kd*H9Pe7z9&01jl1cmyhbWNV(a+#mqC{6@3!(~h#1gm2PsHRZGuO^%2Tr1 zlfWPK=~=SFW-LMWH|aU%Yd3>ogwg`yR5SsjUT%rT*fST8Ja4)rBQ-0c-(A}o_6u6zaKh>MojLVqe#X*&#c!_B$;t?pn2;3 zSz_w3t}WCB!?JI2+w@yu%W}cnV{X&BmW%r4hVR@3>1Pa_tTKiom$n7#J9QZ`m%e9} z`*(NDkm~j`UW=$gM&@y?$4>qT(rENNmArE_2ys$#chqEo!!LFX8v2^RjS!uhL7vsJ2#V(-^YJ$DWYoY@9dHVvc z(Onl0f{KVU%u5WzJE-P5iQZw&qn{-^4?!B1Kcy?~!n?E;c%k&i#rQE+X;1J=RUwP{6AR=Bv;S=j9YnY)pDgb$ZSsis$>eX7?w1M+PV0l3F5C_|VFge=`0V&G)u&tZ`=C z`x^o)0^{gOl#YJ71;By+I#@h9(c<@{SRGyV>j0<|SoRamNc(`oMjmj2y*`>9$K6?m!~VEGD?i5p+`0g{}2-llK+wz2Vgkt#Kla)4ur zeUw-i2nAgFq9!n?hE9Q=6zav%cj&=h(+A$tjmk-p%QjS+Kdkl zyEiy0*iYyV;`e8h#hKN+Z#(2B&Y7X~oT++RZeN|NRpfMXGZGt0yRQDgz zmyM1z$)&Ii`MtkKRL*cHSR##R!%es?MuT3K}osL)`PV< zdhQFleeJ32L=C>1Fo*r#P6ndY;kE><>#+}BkJ-*q8L%wZ_(rfnD2Xgraqct#xd->NO2@gufd{c=cGl5yQIGQ^ zAcD|CQNi9g9*`n%h&nf{ozU>O9haKS&Y9^~N5GK+jIYP{7Lf9pJ{tn;5std!cX5Zb zZf?g+UVrSBCL^e+T0aamJkE43+7hzQWj3twXgP=dxFf6?b0Jw6l=+;NB$qF(J&Nc{ zrAjDQCJTv)u-9g?zdF@PY5KWjXTdnb{~9imb$Z2b=C%PbA=SjVeNCT81Yil z=@z&87<}*I-bVCt7OB7%ITeunmAwtL}0wRNdIc$?7W2+>xGQuFyQ+Xq2A zN(POhhoYXvs~~c1bDDJ8anYX>^SLeRQc?uP`%UlP)|g5QMG#Lhu`Pq}oHs@1bu1Pl zHmqyUJqAuqHz_`Y>lW@~08`pcW=`HT%ie875F>exVl_9V< zRw42fKZB9Mz@s~r;j^B79?DZ5gR{)x3R--F&Tg^BnYE2%7CgSpF69^xXcD`ldAVn_LnlLi?^BVM zmM$Y+-?_3#nh}kD$tInWlIz+V;gyI?TSl))7Dt%PlpZVN{P%>hF`g8U)itv)T#1H? zUJAIZh|%L)No}4>SnkREs1y79KB2wwj5`|-%8IO_KjydM+gD8z+qN7Dx-HCmcKFBf zyk4vpxe3ywK?68{&!1v^QuJ5P7ErzuKAN?q>%bDnKJ1a1c75C<;ow)63geSLpmg(R zQoO6E(;$W%Pr%>(1%C&Ca%-kmEDWk>Ccv|tnWAzGi9^W`fd3-RVpSsSl27haer~c{4)!v{)Z{wnt+gPs zRBksqulgJr&x-if@Al)q=6TlaLlXzf4|x*J<4?3cteR=dQg0%1O`P%Ai*YO$`x?SV z^t~8Gg8&Iz6)gO&)8{5NL*3o6(G|2g?&Xf&qc_xuy)8={--j$`MSf?GMGUhflmj5+ z?IIp~eUzoU)pH%BZWn`TJGuMH6X#_vUu?GgCw&ERqXh@xujcx^DICWYhnJEX1KQ&> z#p4??<`8;I?hEKMn-h(-jVRmUnX45DJ*x9xfco#X6rh7W>+?8ci<^yh;v=2uWhO^O zV(+B^>1fTi$dlrO0h@~#AU zxtlJ9@Vw0ItvKQz5!xIYdgIqH<}o>(s)L$+kanPVm~xmmSu|NPS;pyuHBstho47O8 zuzDJAClcc|?>jx)Qxs>a53bdDWzHOBoAnO@XpBMpUF4qFCF#!-oD_TIo9l=V>Z*-T?QDhmU`G7hfDo_T5AJhx(uX+z z#x!|dRSpfC=SyG|4;cuJ&6beL@mr<)iM{+8fuDeMRosGW@F@uBz%se^3m^~+28)Fz zIEM`6CL54}T`edzDLi=pAlc){MlES{PVr!uvV~5?=cv(q1TW1wIf8=kLtMY%0RXYK z@2?>&&hAp1@A$pZ8(bgt2|Hro;;M=D;uJ&Gw3 z75+H8Nog+P5q@4T9%3QEar_EGT_F@T{p_31E0SQid1^=2>eY6Qk zlr?4wJ$<>nX4VZGVev4IBzo-lK~_&4WSm>D8F#6=q9`p9hm2x}B%^9^YkJNa;4)0Fg*nHoB@G#?qHdpG4%mlN#1X$iW)#HZuAvPIKCiWqC- z%V$DI27hCtV%7yn7&0}~kj(4l_ia&Tv@S@w)HQnVkYi2I7 zdmg=1U_?*E!@`$S{??UWj3fO-!KuP8?R>pPO|7-ZW2alG6qG_LYg0Nj-mP7lH}mvt z=>pLjYW)S@>8&ZB?xTF~uhT1z9Zqh^XG4@b1lg^6hb`x}oh{j#jRy@M870U~(6dXw zM_!PU-PpUHt${-@J4`g*Vv&Wp;iA;Q^qd0WjGkfTBvn?b zdbOD1G?^>Qt-RPuPs@hW&nHfB0Ygd{vPP^nX2_2XqB?d*Z3i)bv z)5xaki?5?6<{B`jlt(LzXh^kIqt&&JkFoFT~v94My-3QA?RJm0L&Cm6@ zvDW;gpU)-Q>16X%zWrJN?aD5qxQH^}}G=TIB2}E({`p-A%&`j)g?RUT*XG zWyRA0-pshk+uq-Vn(SgkF%C^wJE+*7qI>D#es@-Pab_QUCDZr`_wH1d>%DGuic+@| zk!#DaQMX#F)WOSseMUTlS7qsphUrRzMw_m##onk7dT&Uqw4AHi_lm^<{bq3vMDJbh zoy8o`YzYtD3ofv^b8NB!V-Mi6ngx}Eo);4WzFeOEv#zVY8MQKsKB~o=FwJDcqQC*PKAOoQr;SESV7@RzX623_8-|E7ZZ?-3IOsFxEmK(YlOz^67cNq9fa{)rY) zNOpChuRy)mOQ3l0qaRW%kp`2^R#%+wA8gJfsqRmf)Wtz9qUN3$=9VmZ8uG2VGItMf z4;qy}W=kAsuJCy48VAUjSFpcsp>FD)8DM6Xc~LKxV57s%xa(2qQC?b>09Mt`Pcz)K zl`b_z4Bv6!Kdb7*8<5eifkp~G2|nLBxvxAU?P57bt=)?6Uc2^GczWMW{v`s~j|{V)CUw~-hWV65_|6<4lcoPesuxZT=d%%3$){zgctbTLl? zDa~Mz0l^}&K=5aX7w&f|#l&_hKOmUa(PbDlM9754vO;&6C+|8m?q7@~A43ya+js}f zDeX(o9V?#HfAV=2H%he(+C4eDTN<2pM)P)b>7Zvv&L4`M&IQNz`zx^&ssRW-gnzDo zKZ4V&H)wZ?I&m>=t7#ceLU<)@*#tdZsDRu81MvY@I0QBM;Eo$U6ce?`li^-obNZqN zYd}$e6#w3PEZ{-z@4^*tbJ!tJ3%Uv@m>!+!dlk)y98KQ>RikIqbeAnl_C37=_Kj&5 zP#O;y`(b(f;kwR>%_&T zZ{~poaT{9ytZV(-D)$#-LDF<(&U_o=L>&8OkyPDeg1$f zOO{i<6j{UF$goL&zdvSP(Yqk(S@hXsgV;~-(2`X5!I!aQ;Qte(!Q!>4qLdmY_=)7T zPX;Gaw(}*ouT#mgi5b7~ zG_QI_y_}XUOC@Eh4}%ZB<*YjORZ5~h2egpD4u%pP(WV726j1?^Tqj{yud~s@(AsL) zR7aMN+Xj1`5s6TU9A&BV7kWDdpP(JcWkusG0!>1865+|4d~ZTvTS41nExg9@qp?w8 z6GOvxT8qhL`q{=ar~cD&$#U-#^>LLfQT5`TIYhB*lmWlE^bMvP?{9f*#8R&8knRf| zHgiaS#*EX&d32_kx8sn0_C#1Y*s;4o{O?)A-{I7+4}z%(jZjeWzXRlwscjo$|JOGb zfY|PBPu#nYijRRrDNsf_jhh1@1Tx$7>VBS~-2bP&?~beaegD_ulyFiRkq*(KK`KqB zLZzu8NyDZjp&^w{G81VKNri?=My0)wlol;Y8Y&GDEiHYomvbMAdONRwevjWDpZ8zo z-RpW?*Yle9bzk@W3NrX%mk}#kQ?GC)P4-}+Q_A;x&Y~FDJh-MXVkI2&-s+|!Z^FHI zvTaGe!I#@s+Z?d+5AQI}_efm(qJ>Pd>R(**GBBq`-oEmHa6s9jtW7=Vw8D&IPwF`< zKxwWtzrfWMwJIGq#SiUQ3t7H)eoBmRRpi!;$Mt@D?BB8EE~q*;^HOfdV1tsq{-$Yh z93O7>O+9+F^~KDoZMqp2Ehe?{4ZMn>W(U7S_Qr;!-gRs-NR0pdq@s$u^YM}oeL}uL z#c$UeAB|(pa;;(i5;vEfbeA*0u*kaPjgi2o`RppLJ=*8CNt&IyQvSm4`3yfzoq3%- zk*Y>{TCQdy*6sIJ#fu%E*>0dXOQgUr^1f2}{@b>3t}YkTWlkg>v#qpwzqL1bZ`oBh z4*f;nV%0h#Ds7asJ1s{V_sVi?oc{Od;~$}A3gcFH5?37){dzf})G)d$DW~SzTbGo> z54Xw1_tsyEi_*Px-M+XJTlZEg_WW3J%*XNSvn%$=5V5E`W2V<%gT}LPa>APfx`-he{m5go;T@-XD^ms(!b?Hs3 zUKcTI1>~6znJ+qSb9sJBkjTv7QK`sJi`70Qde;UYxEJTQGwy^@uvP_8X!_Kvv5Z4+ z-SovMZoN?vCnVF;Zl+dUH9NTI`kn8x9(t!eCa4+z0Nx!|vbj~@8^Z!*Vu7vv6Bm?4 zvy&iux}-^IvC|5`gs=1NlgdA7E;_X5aP7;oW|+s7ExA{_&8_wBxA@?G8Kcby&BYDM z_v?I)u}~IIIr>C=cSu7Hr{lXXokLYwLHu&+iOUY@`55Shnqp!TJ!Vit2!2NK=N3^3F3IV^nbX zuC8`k%TjImsaai4Op4Lh%PQFz+uV+G?Rvq=Iql_R)zp{6%S?B*jBeJ@4(1h`&AoZ{ zHTx0oZ2V&u4eNJq`ffL?&M|b`$nr13`Ua6F7V{MwQ_`|;*vcK5CA&}S zL}W?o=?$`@x_kw`M!PAij=O3WlBUZ*LF!SZ5|OD|2;S>^8@@E8cK5pEKF~ zF{if`M!UU2(q1_i(GI`-wUIU^B6;Y!Oe2!B9WkhrmT3{t{~CsE%7XjyPt%EH5;o!y zrQT73O>&%)V%+at8RO8}*)}v%m>_;X&VO#Ei(q4>b5qO9hiTph1_>=|I$k=4$2wcb z_dRu<<)e7!v(RAtiS4#`<6;7On}c@c4+cQ2KlNyPjNGe8@8$f8W;(S)gvd%Y&8#b5 zjD{-XIQs%g`za}|iB{)UY)wi}Y;UQJJDC*lu;#+5e$9=W3(maEJQ!c(x#@VmbjDz! zNlBbu`rUPV#0THGUFeKtYZyK>YRb#A^BF}qCG$*<`$bOY*Bqp7?g#JNLTU|5^If8k z>q@*Rd=__qdGzs-K!I;b*8M)0MVNP6@VRCvM<{*wb}m;mse0?Tp+H!TJ&~{IW0j`# z%TC=DJ{93cn@>cqmgLutSSY(qM}EhhkE4V(xk%mP7VX;_9@|X&__AmDOrL~=`cadZ z=(|_ve;FZ#xF(s;i6NJ_HYhf`2M@ipn>O?6QR9sB(Q?-g=hZw4ORv7}x4eG0sMg$? z?yBjDH&ssV-n_HJ^+BdcZ%>s_Zpjh2t||B5dUS^)y)&WA9L35^TirkoTA2yD^VgL* zy&uXVZr^~`tn~&UzEbVH2$<+C0+giq_a|DG<_~Rj$a=E5qiZ&$ zlG$ow!LHu;BU@u$x1=ej)rq_v;E#2_$$37V!pr&Aj>SofsW(>F^L4Iv^u2-dl89|p z51uHc9kd|zo4r*a*uOS9vTH=ZzS{TTyyU^&0^h7*w^**;!pB}q2Gc*}+csCo#u%De zYn8o7yg6O4Q%G>ps&`y!-#(Ox7hW~t8xD=Go|$SCYAb1ReBqF5YrNF?uPYZZ%+>W- z@g~Bd%*v#{g?}@@+mb(Pw?9HD{QAOy|IBHlEnT&Z51P5KzkfIfDhccDgS6q3J5X5! ztTxS8A*wqAB(H4jUOjuI|De0Rm1olehO6X(q?kKBoh)&_t+qo49pkvz*Q}FDU{Xw- z#a*|lfj7ASEAuhNlAL;d7`t9xy?AjXpL`R)Z*Z;l⋙6ZDstL#;dD*8}A)17VR$F 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

(gqg?4rkg%YP~UjD+jfs8(c5zN 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 z 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

cXOGUXR{!Jv7R^R<|kd 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 CFA>53 From 8652f40235191155d4be49b7dab760d02ff03072 Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Thu, 20 Feb 2025 19:51:28 +0100 Subject: [PATCH 03/18] nfproxy module writing: written part of the firegex lib, frontend refactored and improved, c++ improves --- .gitignore | 8 +- Dockerfile | 3 +- backend/binsrc/classes/nfqueue.cpp | 15 +- backend/binsrc/nfproxy.cpp | 80 +++++- backend/binsrc/proxytun/proxytun.cpp | 165 ------------- backend/binsrc/proxytun/settings.cpp | 22 -- backend/binsrc/proxytun/stream_ctx.cpp | 39 --- backend/binsrc/pyproxy/pyproxy.cpp | 232 ++++++++++++++++++ backend/binsrc/pyproxy/settings.cpp | 71 ++++++ backend/binsrc/pyproxy/stream_ctx.cpp | 202 +++++++++++++++ backend/binsrc/regex/regex_rules.cpp | 11 +- backend/modules/nfproxy/firegex.py | 28 ++- backend/modules/nfregex/firegex.py | 3 +- backend/routers/nfproxy.py | 66 ++++- {proxy-client => fgex-lib}/MANIFEST.in | 0 {proxy-client => fgex-lib}/README.md | 0 .../fgex/__main__.py => fgex-lib/fgex | 0 {proxy-client => fgex-lib}/fgex-pip/README.md | 0 .../fgex-pip/fgex/__init__.py | 0 .../fgex-pip/fgex}/__main__.py | 1 - {proxy-client => fgex-lib}/fgex-pip/setup.py | 0 .../firegex/__init__.py | 0 .../fgex => fgex-lib/firegex/__main__.py | 1 - fgex-lib/firegex/cli.py | 5 + fgex-lib/firegex/nfproxy/__init__.py | 38 +++ fgex-lib/firegex/nfproxy/internals.py | 161 ++++++++++++ fgex-lib/firegex/nfproxy/params.py | 71 ++++++ fgex-lib/requirements.txt | 10 + {proxy-client => fgex-lib}/setup.py | 0 frontend/bun.lock | 40 +-- frontend/package.json | 18 +- frontend/src/App.tsx | 5 + frontend/src/components/AddNewRegex.tsx | 5 +- .../src/components/NFProxy/AddEditService.tsx | 139 +++++++++++ .../NFProxy/ServiceRow/RenameForm.tsx | 68 +++++ .../components/NFProxy/ServiceRow/index.tsx | 164 +++++++++++++ frontend/src/components/NFProxy/utils.ts | 99 ++++++++ frontend/src/components/NFRegex/utils.ts | 1 - frontend/src/components/NavBar/index.tsx | 13 +- .../PortHijack/ServiceRow/index.tsx | 2 +- .../src/components/PyFilterView/index.tsx | 50 ++++ frontend/src/components/RegexView/index.tsx | 11 +- frontend/src/index.tsx | 1 + frontend/src/js/models.ts | 8 + frontend/src/js/utils.tsx | 9 +- frontend/src/pages/Firewall/index.tsx | 11 +- frontend/src/pages/NFProxy/ServiceDetails.tsx | 200 +++++++++++++++ frontend/src/pages/NFProxy/index.tsx | 91 +++++++ frontend/src/pages/NFRegex/index.tsx | 18 +- frontend/src/pages/PortHijack/index.tsx | 8 +- proxy-client/requirements.txt | 14 -- 51 files changed, 1864 insertions(+), 343 deletions(-) delete mode 100644 backend/binsrc/proxytun/proxytun.cpp delete mode 100644 backend/binsrc/proxytun/settings.cpp delete mode 100644 backend/binsrc/proxytun/stream_ctx.cpp create mode 100644 backend/binsrc/pyproxy/pyproxy.cpp create mode 100644 backend/binsrc/pyproxy/settings.cpp create mode 100644 backend/binsrc/pyproxy/stream_ctx.cpp rename {proxy-client => fgex-lib}/MANIFEST.in (100%) rename {proxy-client => fgex-lib}/README.md (100%) rename proxy-client/fgex-pip/fgex/__main__.py => fgex-lib/fgex (100%) mode change 100644 => 100755 rename {proxy-client => fgex-lib}/fgex-pip/README.md (100%) rename {proxy-client => fgex-lib}/fgex-pip/fgex/__init__.py (100%) rename {proxy-client/firegex => fgex-lib/fgex-pip/fgex}/__main__.py (71%) rename {proxy-client => fgex-lib}/fgex-pip/setup.py (100%) rename {proxy-client => fgex-lib}/firegex/__init__.py (100%) rename proxy-client/fgex => fgex-lib/firegex/__main__.py (71%) mode change 100755 => 100644 create mode 100644 fgex-lib/firegex/cli.py create mode 100644 fgex-lib/firegex/nfproxy/__init__.py create mode 100644 fgex-lib/firegex/nfproxy/internals.py create mode 100644 fgex-lib/firegex/nfproxy/params.py create mode 100644 fgex-lib/requirements.txt rename {proxy-client => fgex-lib}/setup.py (100%) create mode 100644 frontend/src/components/NFProxy/AddEditService.tsx create mode 100644 frontend/src/components/NFProxy/ServiceRow/RenameForm.tsx create mode 100644 frontend/src/components/NFProxy/ServiceRow/index.tsx create mode 100644 frontend/src/components/NFProxy/utils.ts create mode 100644 frontend/src/components/PyFilterView/index.tsx create mode 100644 frontend/src/pages/NFProxy/ServiceDetails.tsx create mode 100644 frontend/src/pages/NFProxy/index.tsx delete mode 100644 proxy-client/requirements.txt diff --git a/.gitignore b/.gitignore index cf7f774..d74d9af 100644 --- a/.gitignore +++ b/.gitignore @@ -11,10 +11,10 @@ # testing /frontend/coverage -/proxy-client/firegex.egg-info -/proxy-client/dist -/proxy-client/fgex-pip/fgex.egg-info -/proxy-client/fgex-pip/dist +/fgex-lib/firegex.egg-info +/fgex-lib/dist +/fgex-lib/fgex-pip/fgex.egg-info +/fgex-lib/fgex-pip/dist /backend/db/ /backend/db/** /frontend/build/ diff --git a/Dockerfile b/Dockerfile index a09e4e9..4599907 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,6 @@ RUN bun i COPY ./frontend/ . RUN bun run build - #Building main conteiner FROM --platform=$TARGETARCH registry.fedoraproject.org/fedora:latest RUN dnf -y update && dnf install -y python3.13-devel @development-tools gcc-c++ \ @@ -24,6 +23,8 @@ WORKDIR /execute ADD ./backend/requirements.txt /execute/requirements.txt RUN uv pip install --no-cache --system -r /execute/requirements.txt +COPY ./proxy-client /execute/proxy-client +RUN uv pip install --no-cache --system ./proxy-client COPY ./backend/binsrc /execute/binsrc RUN g++ binsrc/nfregex.cpp -o modules/cppregex -std=c++23 -O3 -lnetfilter_queue -pthread -lnfnetlink $(pkg-config --cflags --libs libtins libhs libmnl) diff --git a/backend/binsrc/classes/nfqueue.cpp b/backend/binsrc/classes/nfqueue.cpp index 513db4a..582e683 100644 --- a/backend/binsrc/classes/nfqueue.cpp +++ b/backend/binsrc/classes/nfqueue.cpp @@ -131,6 +131,15 @@ class PktRequest { } } + void mangle_custom_pkt(const uint8_t* pkt, size_t pkt_size){ + if (action == FilterAction::NOACTION){ + action = FilterAction::MANGLE; + perfrom_action(pkt, pkt_size); + }else{ + throw invalid_argument("Cannot mangle a packet that has already been accepted or dropped"); + } + } + FilterAction get_action(){ return action; } @@ -141,7 +150,7 @@ class PktRequest { } private: - void perfrom_action(){ + void perfrom_action(const uint8_t* custom_data = nullptr, size_t custom_data_size = 0){ char buf[MNL_SOCKET_BUFFER_SIZE]; struct nlmsghdr *nlh_verdict = nfq_nlmsg_put(buf, NFQNL_MSG_VERDICT, ntohs(res_id)); switch (action) @@ -153,7 +162,9 @@ class PktRequest { nfq_nlmsg_verdict_put(nlh_verdict, ntohl(packet_id), NF_DROP ); break; case FilterAction::MANGLE:{ - if (is_ipv6){ + if (custom_data != nullptr){ + nfq_nlmsg_verdict_put_pkt(nlh_verdict, custom_data, custom_data_size); + }else if (is_ipv6){ nfq_nlmsg_verdict_put_pkt(nlh_verdict, ipv6->serialize().data(), ipv6->size()); }else{ nfq_nlmsg_verdict_put_pkt(nlh_verdict, ipv4->serialize().data(), ipv4->size()); diff --git a/backend/binsrc/nfproxy.cpp b/backend/binsrc/nfproxy.cpp index 520292b..96c12d1 100644 --- a/backend/binsrc/nfproxy.cpp +++ b/backend/binsrc/nfproxy.cpp @@ -1,18 +1,87 @@ #define PY_SSIZE_T_CLEAN #include -#include "proxytun/settings.cpp" -#include "proxytun/proxytun.cpp" +#include "pyproxy/settings.cpp" +#include "pyproxy/pyproxy.cpp" #include "classes/netfilter.cpp" #include #include #include #include +#include using namespace std; using namespace Firegex::PyProxy; using Firegex::NfQueue::MultiThreadQueue; +/* + +How python code is handles: + +User code example: +```python + +from firegex.nfproxy import DROP, ACCEPT, pyfilter + +@pyfilter +def invalid_curl_agent(http): + if "curl" in http.headers.get("User-Agent", ""): + return DROP + return ACCEPT + +``` + +The code is now edited adding an intestation and a end statement: +```python +global __firegex_pyfilter_enabled, __firegex_proto +__firegex_pyfilter_enabled = ["invalid_curl_agent", "func3"] # This list is dynamically generated by firegex backend +__firegex_proto = "http" +import firegex.nfproxy.internals + +firegex.nfproxy.internals.compile() # This function can save other global variables, to use by the packet handler and is used generally to check and optimize the code +```` + +This code will be executed only once, and is needed to build the global and local context to use +The globals and locals generated here are copied for each connection, and are used to handle the packets + +Using C API will be injected in global context the following informations: + +__firegex_packet_info = { + "data" = b"raw data found on L4", + "raw_packet" = b"raw packet", + "is_input" = True, # If the packet is incoming from a client + "is_ipv6" = False, # If the packet is ipv6 + "is_tcp" = True, # If the packet is tcp +} + +As result the packet handler is responsible to return a dictionary in the global context with the following dictionary: +__firegex_pyfilter_result = { + "action": REJECT, # One of PyFilterResponse + "matched_by": "invalid_curl_agent", # The function that matched the packet (used if action = DROP or REJECT or MANGLE) + "mangled_packet": b"new packet" # The new packet to send to the kernel (used if action = MANGLE) +} + +PyFilterResponse { + ACCEPT = 0, + DROP = 1, + REJECT = 2, + MANGLE = 3, + EXCEPTION = 4, + INVALID = 5 +}; + +Every time a packet is received, the packet handler will execute the following code: +```python +firegex.nfproxy.internals.handle_packet() +```` + +The TCP stream is sorted by libtins using c++ code, but the c++ code is not responsabile di buffer the stream, but only to sort those +So firegex handle_packet has to implement a way to limit memory usage, this dipends on what methods you choose to use to filter packets +firegex lib will give you all the needed possibilities to do this is many ways + +Final note: is not raccomanded to use variables that starts with __firegex_ in your code, because they may break the nfproxy +*/ + ssize_t read_check(int __fd, void *__buf, size_t __nbytes){ ssize_t bytes = read(__fd, __buf, __nbytes); if (bytes == 0){ @@ -30,7 +99,10 @@ void config_updater (){ while (true){ uint32_t code_size; read_check(STDIN_FILENO, &code_size, 4); - vector code(code_size); + //Python will send number always in little endian + code_size = le32toh(code_size); + string code; + code.resize(code_size); read_check(STDIN_FILENO, code.data(), code_size); cerr << "[info] [updater] Updating configuration" << endl; try{ @@ -44,10 +116,12 @@ void config_updater (){ } } + int main(int argc, char *argv[]){ Py_Initialize(); atexit(Py_Finalize); + init_handle_packet_code(); //Compile the static code used to handle packets if (freopen(nullptr, "rb", stdin) == nullptr){ // We need to read from stdin binary data cerr << "[fatal] [main] Failed to reopen stdin in binary mode" << endl; diff --git a/backend/binsrc/proxytun/proxytun.cpp b/backend/binsrc/proxytun/proxytun.cpp deleted file mode 100644 index 910a86b..0000000 --- a/backend/binsrc/proxytun/proxytun.cpp +++ /dev/null @@ -1,165 +0,0 @@ -#ifndef PROXY_TUNNEL_CLASS_CPP -#define PROXY_TUNNEL_CLASS_CPP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "../classes/netfilter.cpp" -#include "stream_ctx.cpp" -#include "settings.cpp" - -using Tins::TCPIP::Stream; -using Tins::TCPIP::StreamFollower; -using namespace std; - -namespace Firegex { -namespace PyProxy { - -class PyProxyQueue: public NfQueue::ThreadNfQueue { - public: - stream_ctx sctx; - StreamFollower follower; - - struct { - bool matching_has_been_called = false; - bool already_closed = false; - bool result; - NfQueue::PktRequest* pkt; - } match_ctx; - - void before_loop() override { - follower.new_stream_callback(bind(on_new_stream, placeholders::_1, this)); - follower.stream_termination_callback(bind(on_stream_close, placeholders::_1, this)); - } - - bool filter_action(NfQueue::PktRequest* pkt){ - shared_ptr conf = config; - - auto stream_search = sctx.streams_ctx.find(pkt->sid); - pyfilter_ctx* stream_match; - if (stream_search == sctx.streams_ctx.end()){ - // TODO: New pyfilter_ctx - }else{ - stream_match = stream_search->second; - } - - bool has_matched = false; - //TODO exec filtering action - - if (has_matched){ - // Say to firegex what filter has matched - //osyncstream(cout) << "BLOCKED " << rules_vector[match_res.matched] << endl; - return false; - } - return true; - } - - //If the stream has already been matched, drop all data, and try to close the connection - static void keep_fin_packet(PyProxyQueue* pkt){ - pkt->match_ctx.matching_has_been_called = true; - pkt->match_ctx.already_closed = true; - } - - static void on_data_recv(Stream& stream, PyProxyQueue* pkt, string data) { - pkt->match_ctx.matching_has_been_called = true; - pkt->match_ctx.already_closed = false; - bool result = pkt->filter_action(pkt->match_ctx.pkt); - if (!result){ - pkt->sctx.clean_stream_by_id(pkt->match_ctx.pkt->sid); - stream.client_data_callback(bind(keep_fin_packet, pkt)); - stream.server_data_callback(bind(keep_fin_packet, pkt)); - } - pkt->match_ctx.result = result; - } - - //Input data filtering - static void on_client_data(Stream& stream, PyProxyQueue* pkt) { - on_data_recv(stream, pkt, string(stream.client_payload().begin(), stream.client_payload().end())); - } - - //Server data filtering - static void on_server_data(Stream& stream, PyProxyQueue* pkt) { - on_data_recv(stream, pkt, string(stream.server_payload().begin(), stream.server_payload().end())); - } - - // A stream was terminated. The second argument is the reason why it was terminated - static void on_stream_close(Stream& stream, PyProxyQueue* pkt) { - stream_id stream_id = stream_id::make_identifier(stream); - pkt->sctx.clean_stream_by_id(stream_id); - } - - static void on_new_stream(Stream& stream, PyProxyQueue* pkt) { - stream.auto_cleanup_payloads(true); - if (stream.is_partial_stream()) { - //TODO take a decision about this... - stream.enable_recovery_mode(10 * 1024); - } - stream.client_data_callback(bind(on_client_data, placeholders::_1, pkt)); - stream.server_data_callback(bind(on_server_data, placeholders::_1, pkt)); - stream.stream_closed_callback(bind(on_stream_close, placeholders::_1, pkt)); - } - - - void handle_next_packet(NfQueue::PktRequest* pkt) override{ - if (pkt->l4_proto != NfQueue::L4Proto::TCP){ - throw invalid_argument("Only TCP and UDP are supported"); - } - Tins::PDU* application_layer = pkt->tcp->inner_pdu(); - u_int16_t payload_size = 0; - if (application_layer != nullptr){ - payload_size = application_layer->size(); - } - match_ctx.matching_has_been_called = false; - match_ctx.pkt = pkt; - if (pkt->is_ipv6){ - follower.process_packet(*pkt->ipv6); - }else{ - follower.process_packet(*pkt->ipv4); - } - // Do an action only is an ordered packet has been received - if (match_ctx.matching_has_been_called){ - bool empty_payload = payload_size == 0; - //In this 2 cases we have to remove all data about the stream - if (!match_ctx.result || match_ctx.already_closed){ - sctx.clean_stream_by_id(pkt->sid); - //If the packet has data, we have to remove it - if (!empty_payload){ - Tins::PDU* data_layer = pkt->tcp->release_inner_pdu(); - if (data_layer != nullptr){ - delete data_layer; - } - } - //For the first matched data or only for data packets, we set FIN bit - //This only for client packets, because this will trigger server to close the connection - //Packets will be filtered anyway also if client don't send packets - if ((!match_ctx.result || !empty_payload) && pkt->is_input){ - pkt->tcp->set_flag(Tins::TCP::FIN,1); - pkt->tcp->set_flag(Tins::TCP::ACK,1); - pkt->tcp->set_flag(Tins::TCP::SYN,0); - } - //Send the edited packet to the kernel - return pkt->mangle(); - } - } - return pkt->accept(); - } - - ~PyProxyQueue() { - sctx.clean(); - } - -}; - -}} -#endif // PROXY_TUNNEL_CLASS_CPP \ No newline at end of file diff --git a/backend/binsrc/proxytun/settings.cpp b/backend/binsrc/proxytun/settings.cpp deleted file mode 100644 index f4adae4..0000000 --- a/backend/binsrc/proxytun/settings.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef PROXY_TUNNEL_SETTINGS_CPP -#define PROXY_TUNNEL_SETTINGS_CPP - -#include -#include - -using namespace std; - -class PyCodeConfig{ - public: - const vector code; - public: - PyCodeConfig(vector pycode): code(pycode){} - PyCodeConfig(): code(vector()){} - - ~PyCodeConfig(){} -}; - -shared_ptr config; - -#endif // PROXY_TUNNEL_SETTINGS_CPP - diff --git a/backend/binsrc/proxytun/stream_ctx.cpp b/backend/binsrc/proxytun/stream_ctx.cpp deleted file mode 100644 index 3057ac8..0000000 --- a/backend/binsrc/proxytun/stream_ctx.cpp +++ /dev/null @@ -1,39 +0,0 @@ - -#ifndef STREAM_CTX_CPP -#define STREAM_CTX_CPP - -#include -#include -#include - -using namespace std; - -typedef Tins::TCPIP::StreamIdentifier stream_id; - -struct pyfilter_ctx { - void * pyglob; // TODO python glob??? - string pycode; -}; - -typedef map matching_map; - -struct stream_ctx { - matching_map streams_ctx; - - void clean_stream_by_id(stream_id sid){ - auto stream_search = streams_ctx.find(sid); - if (stream_search != streams_ctx.end()){ - auto stream_match = stream_search->second; - //DEALLOC PY GLOB TODO - delete stream_match; - } - } - void clean(){ - for (auto ele: streams_ctx){ - //TODO dealloc ele.second.pyglob - delete ele.second; - } - } -}; - -#endif // STREAM_CTX_CPP \ No newline at end of file diff --git a/backend/binsrc/pyproxy/pyproxy.cpp b/backend/binsrc/pyproxy/pyproxy.cpp new file mode 100644 index 0000000..1f2c51c --- /dev/null +++ b/backend/binsrc/pyproxy/pyproxy.cpp @@ -0,0 +1,232 @@ +#ifndef PROXY_TUNNEL_CLASS_CPP +#define PROXY_TUNNEL_CLASS_CPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../classes/netfilter.cpp" +#include "stream_ctx.cpp" +#include "settings.cpp" +#include + +using Tins::TCPIP::Stream; +using Tins::TCPIP::StreamFollower; +using namespace std; + +namespace Firegex { +namespace PyProxy { + +class PyProxyQueue: public NfQueue::ThreadNfQueue { + private: + u_int16_t latest_config_ver = 0; + public: + stream_ctx sctx; + StreamFollower follower; + PyGILState_STATE gstate; + PyInterpreterConfig py_thread_config = { + .use_main_obmalloc = 0, + .allow_fork = 0, + .allow_exec = 0, + .allow_threads = 0, + .allow_daemon_threads = 0, + .check_multi_interp_extensions = 1, + .gil = PyInterpreterConfig_OWN_GIL, + }; + PyThreadState *tstate = NULL; + PyStatus pystatus; + + struct { + bool matching_has_been_called = false; + bool already_closed = false; + bool rejected = true; + NfQueue::PktRequest* pkt; + } match_ctx; + + void before_loop() override { + // Create thred structure for python + gstate = PyGILState_Ensure(); + // Create a new interpreter for the thread + pystatus = Py_NewInterpreterFromConfig(&tstate, &py_thread_config); + if (PyStatus_Exception(pystatus)) { + Py_ExitStatusException(pystatus); + cerr << "[fatal] [main] Failed to create new interpreter" << endl; + exit(EXIT_FAILURE); + } + // Setting callbacks for the stream follower + follower.new_stream_callback(bind(on_new_stream, placeholders::_1, this)); + follower.stream_termination_callback(bind(on_stream_close, placeholders::_1, this)); + } + + inline void print_blocked_reason(const string& func_name){ + osyncstream(cout) << "BLOCKED " << func_name << endl; + } + + inline void print_mangle_reason(const string& func_name){ + osyncstream(cout) << "MANGLED " << func_name << endl; + } + + inline void print_exception_reason(){ + osyncstream(cout) << "EXCEPTION" << endl; + } + + //If the stream has already been matched, drop all data, and try to close the connection + static void keep_fin_packet(PyProxyQueue* proxy_info){ + proxy_info->match_ctx.matching_has_been_called = true; + proxy_info->match_ctx.already_closed = true; + } + + void filter_action(NfQueue::PktRequest* pkt, Stream& stream){ + auto stream_search = sctx.streams_ctx.find(pkt->sid); + pyfilter_ctx* stream_match; + if (stream_search == sctx.streams_ctx.end()){ + shared_ptr conf = config; + //If config is not set, ignore the stream + if (conf->glob == nullptr || conf->local == nullptr){ + stream.client_data_callback(nullptr); + stream.server_data_callback(nullptr); + return pkt->accept(); + } + stream_match = new pyfilter_ctx(conf->glob, conf->local); + sctx.streams_ctx.insert_or_assign(pkt->sid, stream_match); + }else{ + stream_match = stream_search->second; + } + auto result = stream_match->handle_packet(pkt); + switch(result.action){ + case PyFilterResponse::ACCEPT: + pkt->accept(); + case PyFilterResponse::DROP: + print_blocked_reason(*result.filter_match_by); + sctx.clean_stream_by_id(pkt->sid); + stream.client_data_callback(nullptr); + stream.server_data_callback(nullptr); + break; + case PyFilterResponse::REJECT: + sctx.clean_stream_by_id(pkt->sid); + stream.client_data_callback(bind(keep_fin_packet, this)); + stream.server_data_callback(bind(keep_fin_packet, this)); + pkt->ctx->match_ctx.rejected = true; //Handler will take care of the rest + break; + case PyFilterResponse::MANGLE: + print_mangle_reason(*result.filter_match_by); + pkt->mangle_custom_pkt((uint8_t*)result.mangled_packet->c_str(), result.mangled_packet->size()); + break; + case PyFilterResponse::EXCEPTION: + case PyFilterResponse::INVALID: + print_exception_reason(); + sctx.clean_stream_by_id(pkt->sid); + //Free the packet data + stream.client_data_callback(nullptr); + stream.server_data_callback(nullptr); + pkt->accept(); + break; + } + } + + + static void on_data_recv(Stream& stream, PyProxyQueue* proxy_info, string data) { + proxy_info->match_ctx.matching_has_been_called = true; + proxy_info->match_ctx.already_closed = false; + proxy_info->filter_action(proxy_info->match_ctx.pkt, stream); + } + + //Input data filtering + static void on_client_data(Stream& stream, PyProxyQueue* proxy_info) { + on_data_recv(stream, proxy_info, string(stream.client_payload().begin(), stream.client_payload().end())); + } + + //Server data filtering + static void on_server_data(Stream& stream, PyProxyQueue* proxy_info) { + on_data_recv(stream, proxy_info, string(stream.server_payload().begin(), stream.server_payload().end())); + } + + // A stream was terminated. The second argument is the reason why it was terminated + static void on_stream_close(Stream& stream, PyProxyQueue* proxy_info) { + stream_id stream_id = stream_id::make_identifier(stream); + proxy_info->sctx.clean_stream_by_id(stream_id); + } + + static void on_new_stream(Stream& stream, PyProxyQueue* proxy_info) { + stream.auto_cleanup_payloads(true); + if (stream.is_partial_stream()) { + stream.enable_recovery_mode(10 * 1024); + } + stream.client_data_callback(bind(on_client_data, placeholders::_1, proxy_info)); + stream.server_data_callback(bind(on_server_data, placeholders::_1, proxy_info)); + stream.stream_closed_callback(bind(on_stream_close, placeholders::_1, proxy_info)); + } + + + void handle_next_packet(NfQueue::PktRequest* pkt) override{ + if (pkt->l4_proto != NfQueue::L4Proto::TCP){ + throw invalid_argument("Only TCP and UDP are supported"); + } + Tins::PDU* application_layer = pkt->tcp->inner_pdu(); + u_int16_t payload_size = 0; + if (application_layer != nullptr){ + payload_size = application_layer->size(); + } + match_ctx.matching_has_been_called = false; + match_ctx.pkt = pkt; + if (pkt->is_ipv6){ + follower.process_packet(*pkt->ipv6); + }else{ + follower.process_packet(*pkt->ipv4); + } + // Do an action only is an ordered packet has been received + if (match_ctx.matching_has_been_called){ + bool empty_payload = payload_size == 0; + //In this 2 cases we have to remove all data about the stream + if (!match_ctx.rejected || match_ctx.already_closed){ + sctx.clean_stream_by_id(pkt->sid); + //If the packet has data, we have to remove it + if (!empty_payload){ + Tins::PDU* data_layer = pkt->tcp->release_inner_pdu(); + if (data_layer != nullptr){ + delete data_layer; + } + } + //For the first matched data or only for data packets, we set FIN bit + //This only for client packets, because this will trigger server to close the connection + //Packets will be filtered anyway also if client don't send packets + if ((!match_ctx.rejected || !empty_payload) && pkt->is_input){ + pkt->tcp->set_flag(Tins::TCP::FIN,1); + pkt->tcp->set_flag(Tins::TCP::ACK,1); + pkt->tcp->set_flag(Tins::TCP::SYN,0); + } + //Send the edited packet to the kernel + return pkt->mangle(); + }else{ + //Fallback to the default action + if (pkt->get_action() == NfQueue::FilterAction::NOACTION){ + return pkt->accept(); + } + } + }else{ + return pkt->accept(); + } + } + + ~PyProxyQueue() { + // Closing first the interpreter + Py_EndInterpreter(tstate); + // Releasing the GIL and the thread data structure + PyGILState_Release(gstate); + sctx.clean(); + } + +}; + +}} +#endif // PROXY_TUNNEL_CLASS_CPP \ No newline at end of file diff --git a/backend/binsrc/pyproxy/settings.cpp b/backend/binsrc/pyproxy/settings.cpp new file mode 100644 index 0000000..80f9a08 --- /dev/null +++ b/backend/binsrc/pyproxy/settings.cpp @@ -0,0 +1,71 @@ +#ifndef PROXY_TUNNEL_SETTINGS_CPP +#define PROXY_TUNNEL_SETTINGS_CPP + +#include + +#include +#include +#include + +using namespace std; + +namespace Firegex { +namespace PyProxy { + + +class PyCodeConfig{ + public: + PyObject* glob = nullptr; + PyObject* local = nullptr; + + private: + void _clean(){ + Py_XDECREF(glob); + Py_XDECREF(local); + } + public: + + PyCodeConfig(const string& pycode){ + + PyObject* compiled_code = Py_CompileStringExFlags(pycode.c_str(), "", Py_file_input, NULL, 2); + if (compiled_code == nullptr){ + std::cerr << "[fatal] [main] Failed to compile the code" << endl; + _clean(); + throw invalid_argument("Failed to compile the code"); + } + glob = PyDict_New(); + local = PyDict_New(); + PyObject* result = PyEval_EvalCode(compiled_code, glob, local); + Py_XDECREF(compiled_code); + if (!result){ + PyErr_Print(); + _clean(); + std::cerr << "[fatal] [main] Failed to execute the code" << endl; + throw invalid_argument("Failed to execute the code, maybe an invalid filter code has been provided"); + } + Py_DECREF(result); + } + PyCodeConfig(){} + + ~PyCodeConfig(){ + _clean(); + } +}; + +shared_ptr config; +PyObject* py_handle_packet_code = nullptr; + +void init_handle_packet_code(){ + py_handle_packet_code = Py_CompileStringExFlags( + "firegex.nfproxy.internals.handle_packet()\n", "", + Py_file_input, NULL, 2); + + if (py_handle_packet_code == nullptr){ + std::cerr << "[fatal] [main] Failed to compile the utility python code (strange behaviour, probably a bug)" << endl; + throw invalid_argument("Failed to compile the code"); + } +} + +}} +#endif // PROXY_TUNNEL_SETTINGS_CPP + diff --git a/backend/binsrc/pyproxy/stream_ctx.cpp b/backend/binsrc/pyproxy/stream_ctx.cpp new file mode 100644 index 0000000..633ca50 --- /dev/null +++ b/backend/binsrc/pyproxy/stream_ctx.cpp @@ -0,0 +1,202 @@ + +#ifndef STREAM_CTX_CPP +#define STREAM_CTX_CPP + +#include +#include +#include +#include +#include "../classes/netfilter.cpp" +#include "settings.cpp" + +using namespace std; + + +namespace Firegex { +namespace PyProxy { + +class PyCodeConfig; +class PyProxyQueue; + +enum PyFilterResponse { + ACCEPT = 0, + DROP = 1, + REJECT = 2, + MANGLE = 3, + EXCEPTION = 4, + INVALID = 5 +}; + +struct py_filter_response { + PyFilterResponse action; + string* filter_match_by = nullptr; + string* mangled_packet = nullptr; + ~py_filter_response(){ + delete mangled_packet; + delete filter_match_by; + } +}; + +typedef Tins::TCPIP::StreamIdentifier stream_id; + +struct pyfilter_ctx { + + PyObject * glob = nullptr; + PyObject * local = nullptr; + + pyfilter_ctx(PyObject * original_glob, PyObject * original_local){ + PyObject *copy = PyImport_ImportModule("copy"); + if (copy == nullptr){ + PyErr_Print(); + throw invalid_argument("Failed to import copy module"); + } + PyObject *deepcopy = PyObject_GetAttrString(copy, "deepcopy"); + glob = PyObject_CallFunctionObjArgs(deepcopy, original_glob, NULL); + if (glob == nullptr){ + PyErr_Print(); + throw invalid_argument("Failed to deepcopy the global dict"); + } + local = PyObject_CallFunctionObjArgs(deepcopy, original_local, NULL); + if (local == nullptr){ + PyErr_Print(); + throw invalid_argument("Failed to deepcopy the local dict"); + } + Py_DECREF(copy); + } + + ~pyfilter_ctx(){ + Py_XDECREF(glob); + Py_XDECREF(local); + } + + inline void set_item_to_glob(const char* key, PyObject* value){ + set_item_to_dict(glob, key, value); + } + + inline PyObject* get_item_from_glob(const char* key){ + return PyDict_GetItemString(glob, key); + } + + void del_item_from_glob(const char* key){ + if (PyDict_DelItemString(glob, key) != 0){ + PyErr_Print(); + throw invalid_argument("Failed to delete item from dict"); + } + } + + inline void set_item_to_local(const char* key, PyObject* value){ + set_item_to_dict(local, key, value); + } + + inline void set_item_to_dict(PyObject* dict, const char* key, PyObject* value){ + if (PyDict_SetItemString(dict, key, value) != 0){ + PyErr_Print(); + throw invalid_argument("Failed to set item to dict"); + } + } + + py_filter_response handle_packet( + NfQueue::PktRequest* pkt + ){ + PyObject * packet_info = PyDict_New(); + + set_item_to_dict(packet_info, "data", PyBytes_FromStringAndSize(pkt->data, pkt->data_size)); + set_item_to_dict(packet_info, "raw_packet", PyBytes_FromStringAndSize(pkt->packet.c_str(), pkt->packet.size())); + set_item_to_dict(packet_info, "is_input", PyBool_FromLong(pkt->is_input)); + set_item_to_dict(packet_info, "is_ipv6", PyBool_FromLong(pkt->is_ipv6)); + set_item_to_dict(packet_info, "is_tcp", PyBool_FromLong(pkt->l4_proto == NfQueue::L4Proto::TCP)); + + // Set packet info to the global context + set_item_to_glob("__firegex_packet_info", packet_info); + PyObject * result = PyEval_EvalCode(py_handle_packet_code, glob, local); + del_item_from_glob("__firegex_packet_info"); + Py_DECREF(packet_info); + + if (!result){ + PyErr_Print(); + return py_filter_response{PyFilterResponse::EXCEPTION, nullptr}; + } + Py_DECREF(result); + + result = get_item_from_glob("__firegex_pyfilter_result"); + if (result == nullptr){ + return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + } + + if (!PyDict_Check(result)){ + PyErr_Print(); + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + } + PyObject* action = PyDict_GetItemString(result, "action"); + if (action == nullptr){ + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + } + if (!PyLong_Check(action)){ + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + } + PyFilterResponse action_enum = (PyFilterResponse)PyLong_AsLong(action); + + if (action_enum == PyFilterResponse::ACCEPT || action_enum == PyFilterResponse::EXCEPTION || action_enum == PyFilterResponse::INVALID){ + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{action_enum, nullptr, nullptr}; + }else{ + PyObject *func_name_py = PyDict_GetItemString(result, "matched_by"); + if (func_name_py == nullptr){ + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + } + if (!PyUnicode_Check(func_name_py)){ + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + } + string* func_name = new string(PyUnicode_AsUTF8(func_name_py)); + if (action_enum == PyFilterResponse::DROP || action_enum == PyFilterResponse::REJECT){ + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{action_enum, func_name, nullptr}; + } + if (action_enum != PyFilterResponse::MANGLE){ + PyObject* mangled_packet = PyDict_GetItemString(result, "mangled_packet"); + if (mangled_packet == nullptr){ + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + } + if (!PyBytes_Check(mangled_packet)){ + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + } + string* pkt_str = new string(PyBytes_AsString(mangled_packet), PyBytes_Size(mangled_packet)); + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{PyFilterResponse::MANGLE, func_name, pkt_str}; + } + } + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + } + +}; + +typedef map matching_map; + +struct stream_ctx { + matching_map streams_ctx; + + void clean_stream_by_id(stream_id sid){ + auto stream_search = streams_ctx.find(sid); + if (stream_search != streams_ctx.end()){ + auto stream_match = stream_search->second; + delete stream_match; + } + } + void clean(){ + for (auto ele: streams_ctx){ + delete ele.second; + } + } +}; + + +}} +#endif // STREAM_CTX_CPP \ No newline at end of file diff --git a/backend/binsrc/regex/regex_rules.cpp b/backend/binsrc/regex/regex_rules.cpp index 71ef786..83fd6dc 100644 --- a/backend/binsrc/regex/regex_rules.cpp +++ b/backend/binsrc/regex/regex_rules.cpp @@ -76,12 +76,11 @@ class RegexRules{ }else{ hs_free_database(db); } - } private: - static inline u_int16_t glob_seq = 0; - u_int16_t version; + static inline uint16_t glob_seq = 0; + uint16_t version; vector> decoded_input_rules; vector> decoded_output_rules; bool is_stream = true; @@ -96,9 +95,7 @@ class RegexRules{ input_ruleset.hs_db = nullptr; } } - - - + void fill_ruleset(vector> & decoded, regex_ruleset & ruleset){ size_t n_of_regex = decoded.size(); if (n_of_regex == 0){ @@ -150,7 +147,6 @@ class RegexRules{ public: RegexRules(vector raw_rules, bool is_stream){ this->is_stream = is_stream; - this->version = ++glob_seq; // 0 version is a invalid version (useful for some logics) for(string ele : raw_rules){ try{ decoded_regex rule = decode_regex(ele); @@ -170,6 +166,7 @@ class RegexRules{ free_dbs(); throw current_exception(); } + this->version = ++glob_seq; // 0 version is the null version } u_int16_t ver(){ diff --git a/backend/modules/nfproxy/firegex.py b/backend/modules/nfproxy/firegex.py index 70fb5ca..095eb17 100644 --- a/backend/modules/nfproxy/firegex.py +++ b/backend/modules/nfproxy/firegex.py @@ -22,7 +22,7 @@ class FiregexInterceptor: self.update_task: asyncio.Task self.ack_arrived = False self.ack_status = None - self.ack_fail_what = "" + self.ack_fail_what = "Unknown" self.ack_lock = asyncio.Lock() async def _call_stats_updater_callback(self, filter: PyFilter): @@ -79,12 +79,14 @@ class FiregexInterceptor: if filter_id in self.filter_map: self.filter_map[filter_id].blocked_packets+=1 await self.filter_map[filter_id].update() - if line.startswith("EDITED "): + if line.startswith("MANGLED "): filter_id = line.split()[1] async with self.filter_map_lock: if filter_id in self.filter_map: self.filter_map[filter_id].edited_packets+=1 await self.filter_map[filter_id].update() + if line.startswith("EXCEPTION"): + print("TODO EXCEPTION HANDLING") # TODO if line.startswith("ACK "): self.ack_arrived = True self.ack_status = line.split()[1].upper() == "OK" @@ -103,10 +105,9 @@ class FiregexInterceptor: if self.process and self.process.returncode is None: self.process.kill() - async def _update_config(self, filters_codes): + async def _update_config(self, code): async with self.update_config_lock: - # TODO write compiled code correctly - # self.process.stdin.write((" ".join(filters_codes)+"\n").encode()) + self.process.stdin.write(len(code).to_bytes(4, byteorder='big')+code.encode()) await self.process.stdin.drain() try: async with asyncio.timeout(3): @@ -114,11 +115,22 @@ class FiregexInterceptor: except TimeoutError: pass if not self.ack_arrived or not self.ack_status: + await self.stop() raise HTTPException(status_code=500, detail=f"NFQ error: {self.ack_fail_what}") async def reload(self, filters:list[PyFilter]): async with self.filter_map_lock: - self.filter_map = self.compile_filters(filters) - # TODO COMPILE CODE - #await self._update_config(filters_codes) TODO pass the compiled code + if os.path.exists(f"db/nfproxy_filters/{self.srv.id}.py"): + with open(f"db/nfproxy_filters/{self.srv.id}.py") as f: + filter_file = f.read() + else: + filter_file = "" + await self._update_config( + "global __firegex_pyfilter_enabled\n" + + "__firegex_pyfilter_enabled = [" + ", ".join([repr(f.name) for f in filters]) + "]\n" + + "__firegex_proto = " + repr(self.srv.proto) + "\n" + + "import firegex.nfproxy.internals\n\n" + + filter_file + "\n\n" + + "firegex.nfproxy.internals.compile()" + ) diff --git a/backend/modules/nfregex/firegex.py b/backend/modules/nfregex/firegex.py index 3d14bda..5e6b2b0 100644 --- a/backend/modules/nfregex/firegex.py +++ b/backend/modules/nfregex/firegex.py @@ -79,7 +79,7 @@ class FiregexInterceptor: self.update_task: asyncio.Task self.ack_arrived = False self.ack_status = None - self.ack_fail_what = "" + self.ack_fail_what = "Unknown" self.ack_lock = asyncio.Lock() @classmethod @@ -160,6 +160,7 @@ class FiregexInterceptor: except TimeoutError: pass if not self.ack_arrived or not self.ack_status: + await self.stop() raise HTTPException(status_code=500, detail=f"NFQ error: {self.ack_fail_what}") diff --git a/backend/routers/nfproxy.py b/backend/routers/nfproxy.py index 703fff7..efcc664 100644 --- a/backend/routers/nfproxy.py +++ b/backend/routers/nfproxy.py @@ -7,6 +7,9 @@ from modules.nfproxy.firewall import STATUS, FirewallManager from utils.sqlite import SQLite from utils import ip_parse, refactor_name, socketio_emit, PortType from utils.models import ResetRequest, StatusMessageModel +import os +from firegex.nfproxy.internals import get_filter_names +from fastapi.responses import PlainTextResponse class ServiceModel(BaseModel): service_id: str @@ -47,6 +50,9 @@ class ServiceAddResponse(BaseModel): status:str service_id: str|None = None +class SetPyFilterForm(BaseModel): + code: str + app = APIRouter() db = SQLite('db/nft-pyfilters.db', { @@ -70,7 +76,7 @@ db = SQLite('db/nft-pyfilters.db', { }, 'QUERY':[ "CREATE UNIQUE INDEX IF NOT EXISTS unique_services ON services (port, ip_int, proto);", - "CREATE UNIQUE INDEX IF NOT EXISTS unique_pyfilter_service ON pyfilter (name, service_id);" + "CREATE UNIQUE INDEX IF NOT EXISTS unique_pyfilter_service ON pyfilter (name, service_id);" ] }) @@ -174,6 +180,8 @@ async def service_delete(service_id: str): """Request the deletion of a specific service""" db.query('DELETE FROM services WHERE service_id = ?;', service_id) db.query('DELETE FROM pyfilter WHERE service_id = ?;', service_id) + if os.path.exists(f"db/nfproxy_filters/{service_id}.py"): + os.remove(f"db/nfproxy_filters/{service_id}.py") await firewall.remove(service_id) await refresh_frontend() return {'status': 'ok'} @@ -253,17 +261,6 @@ async def get_pyfilter_by_id(filter_id: int): raise HTTPException(status_code=400, detail="This filter does not exists!") return res[0] -@app.delete('/pyfilters/{filter_id}', response_model=StatusMessageModel) -async def pyfilter_delete(filter_id: int): - """Delete a pyfilter using his id""" - res = db.query('SELECT * FROM pyfilter WHERE filter_id = ?;', filter_id) - if len(res) != 0: - db.query('DELETE FROM pyfilter WHERE filter_id = ?;', filter_id) - await firewall.get(res[0]["service_id"]).update_filters() - await refresh_frontend() - - return {'status': 'ok'} - @app.post('/pyfilters/{filter_id}/enable', response_model=StatusMessageModel) async def pyfilter_enable(filter_id: int): """Request the enabling of a pyfilter""" @@ -304,6 +301,49 @@ async def add_new_service(form: ServiceAddForm): await refresh_frontend() return {'status': 'ok', 'service_id': srv_id} +@app.put('/services/{service_id}/pyfilters/code', response_model=StatusMessageModel) +async def set_pyfilters(service_id: str, form: SetPyFilterForm): + """Set the python filter for a service""" + service = db.query("SELECT service_id, proto FROM services WHERE service_id = ?;", service_id) + if len(service) == 0: + raise HTTPException(status_code=400, detail="This service does not exists!") + service = service[0] + srv_proto = service["proto"] + try: + found_filters = get_filter_names(form.code, srv_proto) + except Exception as e: + raise HTTPException(status_code=400, detail=str(e)) + + # Remove filters that are not in the new code + existing_filters = db.query("SELECT filter_id FROM pyfilter WHERE service_id = ?;", service_id) + for filter in existing_filters: + if filter["name"] not in found_filters: + db.query("DELETE FROM pyfilter WHERE filter_id = ?;", filter["filter_id"]) + + # Add filters that are in the new code but not in the database + for filter in found_filters: + if not db.query("SELECT 1 FROM pyfilter WHERE service_id = ? AND name = ?;", service_id, filter): + db.query("INSERT INTO pyfilter (name, service_id) VALUES (?, ?);", filter, service["service_id"]) + + # Eventually edited filters will be reloaded + os.makedirs("db/nfproxy_filters", exist_ok=True) + with open(f"db/nfproxy_filters/{service_id}.py", "w") as f: + f.write(form.code) + await firewall.get(service_id).update_filters() + await refresh_frontend() + return {'status': 'ok'} + +@app.get('/services/{service_id}/pyfilters/code', response_class=PlainTextResponse) +async def get_pyfilters(service_id: str): + """Get the python filter for a service""" + if not db.query("SELECT 1 FROM services s WHERE s.service_id = ?;", service_id): + raise HTTPException(status_code=400, detail="This service does not exists!") + try: + with open(f"db/nfproxy_filters/{service_id}.py") as f: + return f.read() + except FileNotFoundError: + return "" + #TODO check all the APIs and add -# 1. API to change the python filter file +# 1. API to change the python filter file (DONE) # 2. a socketio mechanism to lock the previous feature \ No newline at end of file diff --git a/proxy-client/MANIFEST.in b/fgex-lib/MANIFEST.in similarity index 100% rename from proxy-client/MANIFEST.in rename to fgex-lib/MANIFEST.in diff --git a/proxy-client/README.md b/fgex-lib/README.md similarity index 100% rename from proxy-client/README.md rename to fgex-lib/README.md diff --git a/proxy-client/fgex-pip/fgex/__main__.py b/fgex-lib/fgex old mode 100644 new mode 100755 similarity index 100% rename from proxy-client/fgex-pip/fgex/__main__.py rename to fgex-lib/fgex diff --git a/proxy-client/fgex-pip/README.md b/fgex-lib/fgex-pip/README.md similarity index 100% rename from proxy-client/fgex-pip/README.md rename to fgex-lib/fgex-pip/README.md diff --git a/proxy-client/fgex-pip/fgex/__init__.py b/fgex-lib/fgex-pip/fgex/__init__.py similarity index 100% rename from proxy-client/fgex-pip/fgex/__init__.py rename to fgex-lib/fgex-pip/fgex/__init__.py diff --git a/proxy-client/firegex/__main__.py b/fgex-lib/fgex-pip/fgex/__main__.py similarity index 71% rename from proxy-client/firegex/__main__.py rename to fgex-lib/fgex-pip/fgex/__main__.py index adcf48a..810291c 100644 --- a/proxy-client/firegex/__main__.py +++ b/fgex-lib/fgex-pip/fgex/__main__.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 -# TODO implement cli start function from firegex.cli import run if __name__ == "__main__": diff --git a/proxy-client/fgex-pip/setup.py b/fgex-lib/fgex-pip/setup.py similarity index 100% rename from proxy-client/fgex-pip/setup.py rename to fgex-lib/fgex-pip/setup.py diff --git a/proxy-client/firegex/__init__.py b/fgex-lib/firegex/__init__.py similarity index 100% rename from proxy-client/firegex/__init__.py rename to fgex-lib/firegex/__init__.py diff --git a/proxy-client/fgex b/fgex-lib/firegex/__main__.py old mode 100755 new mode 100644 similarity index 71% rename from proxy-client/fgex rename to fgex-lib/firegex/__main__.py index adcf48a..810291c --- a/proxy-client/fgex +++ b/fgex-lib/firegex/__main__.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 -# TODO implement cli start function from firegex.cli import run if __name__ == "__main__": diff --git a/fgex-lib/firegex/cli.py b/fgex-lib/firegex/cli.py new file mode 100644 index 0000000..b95f5a4 --- /dev/null +++ b/fgex-lib/firegex/cli.py @@ -0,0 +1,5 @@ + + +def run(): + pass # TODO implement me + diff --git a/fgex-lib/firegex/nfproxy/__init__.py b/fgex-lib/firegex/nfproxy/__init__.py new file mode 100644 index 0000000..40d6559 --- /dev/null +++ b/fgex-lib/firegex/nfproxy/__init__.py @@ -0,0 +1,38 @@ +import functools + +ACCEPT = 0 +DROP = 1 +REJECT = 2 +MANGLE = 3 +EXCEPTION = 4 +INVALID = 5 + +def pyfilter(func): + """ + Decorator to mark functions that will be used in the proxy. + Stores the function reference in a global registry. + """ + if not hasattr(pyfilter, "registry"): + pyfilter.registry = set() + + pyfilter.registry.add(func.__name__) + + @functools.wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + + return wrapper + +def get_pyfilters(): + """Returns the list of functions marked with @pyfilter.""" + return list(pyfilter.registry) + + + + + + + + + + diff --git a/fgex-lib/firegex/nfproxy/internals.py b/fgex-lib/firegex/nfproxy/internals.py new file mode 100644 index 0000000..fb9fa98 --- /dev/null +++ b/fgex-lib/firegex/nfproxy/internals.py @@ -0,0 +1,161 @@ +from inspect import signature +from firegex.nfproxy.params import RawPacket, NotReadyToRun +from firegex.nfproxy import ACCEPT, DROP, REJECT, MANGLE, EXCEPTION, INVALID + +RESULTS = [ + ACCEPT, + DROP, + REJECT, + MANGLE, + EXCEPTION, + INVALID +] +FULL_STREAM_ACTIONS = [ + "flush" + "accept", + "reject", + "drop" +] + +type_annotations_associations = { + "tcp": { + RawPacket: RawPacket.fetch_from_global + }, + "http": { + RawPacket: RawPacket.fetch_from_global + } +} + +def _generate_filter_structure(filters: list[str], proto:str, glob:dict, local:dict): + if proto not in type_annotations_associations.keys(): + raise Exception("Invalid protocol") + + res = [] + + valid_annotation_type = type_annotations_associations[proto] + def add_func_to_list(func): + if not callable(func): + raise Exception(f"{func} is not a function") + sig = signature(func) + params_function = [] + + for k, v in sig.parameters.items(): + if v.annotation in valid_annotation_type.keys(): + params_function.append((v.annotation, valid_annotation_type[v.annotation])) + else: + raise Exception(f"Invalid type annotation {v.annotation} for function {func.__name__}") + res.append((func, params_function)) + + for filter in filters: + if not isinstance(filter, str): + raise Exception("Invalid filter list: must be a list of strings") + if filter in glob.keys(): + add_func_to_list(glob[filter]) + elif filter in local.keys(): + add_func_to_list(local[filter]) + else: + raise Exception(f"Filter {filter} not found") + + return res + +def get_filters_info(code:str, proto:str): + glob = {} + local = {} + exec(code, glob, local) + exec("import firegex.nfproxy", glob, local) + filters = eval("firegex.nfproxy.get_pyfilters()", glob, local) + return _generate_filter_structure(filters, proto, glob, local) + +def get_filter_names(code:str, proto:str): + return [ele[0].__name__ for ele in get_filters_info(code, proto)] + +def compile(): + glob = globals() + local = locals() + filters = glob["__firegex_pyfilter_enabled"] + proto = glob["__firegex_proto"] + glob["__firegex_func_list"] = _generate_filter_structure(filters, proto, glob, local) + glob["__firegex_stream"] = [] + glob["__firegex_stream_size"] = 0 + + if "FGEX_STREAM_MAX_SIZE" in local and int(local["FGEX_STREAM_MAX_SIZE"]) > 0: + glob["__firegex_stream_max_size"] = int(local["FGEX_STREAM_MAX_SIZE"]) + elif "FGEX_STREAM_MAX_SIZE" in glob and int(glob["FGEX_STREAM_MAX_SIZE"]) > 0: + glob["__firegex_stream_max_size"] = int(glob["FGEX_STREAM_MAX_SIZE"]) + else: + glob["__firegex_stream_max_size"] = 1*8e20 # 1MB default value + + if "FGEX_FULL_STREAM_ACTION" in local and local["FGEX_FULL_STREAM_ACTION"] in FULL_STREAM_ACTIONS: + glob["__firegex_full_stream_action"] = local["FGEX_FULL_STREAM_ACTION"] + else: + glob["__firegex_full_stream_action"] = "flush" + + glob["__firegex_pyfilter_result"] = None + +def handle_packet(): + glob = globals() + func_list = glob["__firegex_func_list"] + final_result = ACCEPT + cache_call = {} + cache_call[RawPacket] = RawPacket.fetch_from_global() + data_size = len(cache_call[RawPacket].data) + if glob["__firegex_stream_size"]+data_size > glob["__firegex_stream_max_size"]: + match glob["__firegex_full_stream_action"]: + case "flush": + glob["__firegex_stream"] = [] + glob["__firegex_stream_size"] = 0 + case "accept": + glob["__firegex_pyfilter_result"] = { + "action": ACCEPT, + "matched_by": None, + "mangled_packet": None + } + return + case "reject": + glob["__firegex_pyfilter_result"] = { + "action": REJECT, + "matched_by": "@MAX_STREAM_SIZE_REACHED", + "mangled_packet": None + } + return + case "drop": + glob["__firegex_pyfilter_result"] = { + "action": DROP, + "matched_by": "@MAX_STREAM_SIZE_REACHED", + "mangled_packet": None + } + return + glob["__firegex_stream"].append(cache_call[RawPacket]) + glob["__firegex_stream_size"] += data_size + func_name = None + mangled_packet = None + for filter in func_list: + final_params = [] + for ele in filter[1]: + if ele[0] not in cache_call.keys(): + try: + cache_call[ele[0]] = ele[1]() + except NotReadyToRun: + cache_call[ele[0]] = None + if cache_call[ele[0]] is None: + continue # Parsing raised NotReadyToRun, skip filter + final_params.append(cache_call[ele[0]]) + res = filter[0](*final_params) + if res is None: + continue #ACCEPTED + if res == MANGLE: + if RawPacket not in cache_call.keys(): + continue #Packet not modified + pkt:RawPacket = cache_call[RawPacket] + mangled_packet = pkt.raw_packet + break + elif res != ACCEPT: + final_result = res + func_name = filter[0].__name__ + break + glob["__firegex_pyfilter_result"] = { + "action": final_result, + "matched_by": func_name, + "mangled_packet": mangled_packet + } + diff --git a/fgex-lib/firegex/nfproxy/params.py b/fgex-lib/firegex/nfproxy/params.py new file mode 100644 index 0000000..e2969b5 --- /dev/null +++ b/fgex-lib/firegex/nfproxy/params.py @@ -0,0 +1,71 @@ + +class NotReadyToRun(Exception): # raise this exception if the stream state is not ready to parse this object, the call will be skipped + pass + +class RawPacket: + def __init__(self, + data: bytes, + raw_packet: bytes, + is_input: bool, + is_ipv6: bool, + is_tcp: bool, + ): + self.__data = bytes(data) + self.__raw_packet = bytes(raw_packet) + self.__is_input = bool(is_input) + self.__is_ipv6 = bool(is_ipv6) + self.__is_tcp = bool(is_tcp) + + @property + def is_input(self) -> bool: + return self.__is_input + + @property + def is_ipv6(self) -> bool: + return self.__is_ipv6 + + @property + def is_tcp(self) -> bool: + return self.__is_tcp + + @property + def data(self) -> bytes: + return self.__data + + @property + def proto_header(self) -> bytes: + return self.__raw_packet[:self.proto_header_len] + + @property + def proto_header_len(self) -> int: + return len(self.__raw_packet) - len(self.__data) + + @data.setter + def data(self, v:bytes): + if not isinstance(v, bytes): + raise Exception("Invalid data type, data MUST be of type bytes") + self.__raw_packet = self.proto_header + v + self.__data = v + + @property + def raw_packet(self) -> bytes: + return self.__raw_packet + + @raw_packet.setter + def raw_packet(self, v:bytes): + if not isinstance(v, bytes): + raise Exception("Invalid data type, data MUST be of type bytes") + if len(v) < self.proto_header_len: + raise Exception("Invalid packet length") + header_len = self.proto_header_len + self.__data = v[header_len:] + self.__raw_packet = v + + @staticmethod + def fetch_from_global(): + glob = globals() + if "__firegex_packet_info" not in glob.keys(): + raise Exception("Packet info not found") + return RawPacket(**glob["__firegex_packet_info"]) + + diff --git a/fgex-lib/requirements.txt b/fgex-lib/requirements.txt new file mode 100644 index 0000000..f7771d8 --- /dev/null +++ b/fgex-lib/requirements.txt @@ -0,0 +1,10 @@ +typer==0.15.1 +requests>=2.32.3 +pydantic>=2 +typing-extensions>=4.7.1 +fasteners==0.19 +textual==2.1.0 +python-socketio[client]==5.12.1 +fgex +orjson + diff --git a/proxy-client/setup.py b/fgex-lib/setup.py similarity index 100% rename from proxy-client/setup.py rename to fgex-lib/setup.py diff --git a/frontend/bun.lock b/frontend/bun.lock index 526f399..b28c77a 100644 --- a/frontend/bun.lock +++ b/frontend/bun.lock @@ -5,17 +5,19 @@ "name": "firegex-frontend", "dependencies": { "@hello-pangea/dnd": "^16.6.0", - "@mantine/core": "^7.16.2", - "@mantine/form": "^7.16.2", - "@mantine/hooks": "^7.16.2", - "@mantine/modals": "^7.16.2", - "@mantine/notifications": "^7.16.2", + "@mantine/code-highlight": "^7.17.0", + "@mantine/core": "^7.16.3", + "@mantine/form": "^7.16.3", + "@mantine/hooks": "^7.16.3", + "@mantine/modals": "^7.16.3", + "@mantine/notifications": "^7.16.3", "@tanstack/react-query": "^4.36.1", "@types/jest": "^27.5.2", - "@types/node": "^20.17.16", + "@types/node": "^20.17.17", "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "buffer": "^6.0.3", + "install": "^0.13.0", "react": "^19.0.0", "react-dom": "^19.0.0", "react-icons": "^5.4.0", @@ -141,17 +143,19 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - "@mantine/core": ["@mantine/core@7.16.3", "", { "dependencies": { "@floating-ui/react": "^0.26.28", "clsx": "^2.1.1", "react-number-format": "^5.4.3", "react-remove-scroll": "^2.6.2", "react-textarea-autosize": "8.5.6", "type-fest": "^4.27.0" }, "peerDependencies": { "@mantine/hooks": "7.16.3", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "sha512-cxhIpfd2i0Zmk9TKdejYAoIvWouMGhzK3OOX+VRViZ5HEjnTQCGl2h3db56ThqB6NfVPCno6BPbt5lwekTtmuQ=="], + "@mantine/code-highlight": ["@mantine/code-highlight@7.17.0", "", { "dependencies": { "clsx": "^2.1.1", "highlight.js": "^11.10.0" }, "peerDependencies": { "@mantine/core": "7.17.0", "@mantine/hooks": "7.17.0", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "sha512-i6MvxW+PtdRNYHCm8Qa/aiMkLr47EYS0+12rf5XhDVdYZy+0+XiRkwBsxnvzQfKqv0QtH2dchBJDEBMmPB/nVw=="], - "@mantine/form": ["@mantine/form@7.16.3", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "klona": "^2.0.6" }, "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-GqomUG2Ri5adxYsTU1S5IhKRPcqTG5JkPvMERns8PQAcUz/lvzsnk3wY1v4K5CEbCAdpimle4bSsZTM9g697vg=="], + "@mantine/core": ["@mantine/core@7.17.0", "", { "dependencies": { "@floating-ui/react": "^0.26.28", "clsx": "^2.1.1", "react-number-format": "^5.4.3", "react-remove-scroll": "^2.6.2", "react-textarea-autosize": "8.5.6", "type-fest": "^4.27.0" }, "peerDependencies": { "@mantine/hooks": "7.17.0", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "sha512-AU5UFewUNzBCUXIq5Jk6q402TEri7atZW61qHW6P0GufJ2W/JxGHRvgmHOVHTVIcuWQRCt9SBSqZoZ/vHs9LhA=="], - "@mantine/hooks": ["@mantine/hooks@7.16.3", "", { "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-B94FBWk5Sc81tAjV+B3dGh/gKzfqzpzVC/KHyBRWOOyJRqeeRbI/FAaJo4zwppyQo1POSl5ArdyjtDRrRIj2SQ=="], + "@mantine/form": ["@mantine/form@7.17.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "klona": "^2.0.6" }, "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-LONdeb+wL8h9fvyQ339ZFLxqrvYff+b+H+kginZhnr45OBTZDLXNVAt/YoKVFEkynF9WDJjdBVrXKcOZvPgmrA=="], - "@mantine/modals": ["@mantine/modals@7.16.3", "", { "peerDependencies": { "@mantine/core": "7.16.3", "@mantine/hooks": "7.16.3", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "sha512-BJuDzRugK6xLbuFTTo8NLJumVvVmSYsNVcEtmlXOWTE3NkDGktBXGKo8V1B0XfJ9/d/rZw7HCE0p4i76MtA+bQ=="], + "@mantine/hooks": ["@mantine/hooks@7.17.0", "", { "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-vo3K49mLy1nJ8LQNb5KDbJgnX0xwt3Y8JOF3ythjB5LEFMptdLSSgulu64zj+QHtzvffFCsMb05DbTLLpVP/JQ=="], - "@mantine/notifications": ["@mantine/notifications@7.16.3", "", { "dependencies": { "@mantine/store": "7.16.3", "react-transition-group": "4.4.5" }, "peerDependencies": { "@mantine/core": "7.16.3", "@mantine/hooks": "7.16.3", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "sha512-wtEME9kSYfXWYmAmQUZ8c+rwNmhdWRBaW1mlPdQsPkzMqkv4q6yy0IpgwcnuHStSG9EHaQBXazmVxMZJdEAWBQ=="], + "@mantine/modals": ["@mantine/modals@7.17.0", "", { "peerDependencies": { "@mantine/core": "7.17.0", "@mantine/hooks": "7.17.0", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "sha512-4sfiFxIxMxfm2RH4jXMN+cr8tFS5AexXG4TY7TRN/ySdkiWtFVvDe5l2/KRWWeWwDUb7wQhht8Ompj5KtexlEA=="], - "@mantine/store": ["@mantine/store@7.16.3", "", { "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-6M2M5+0BrRtnVv+PUmr04tY1RjPqyapaHplo90uK1NMhP/1EIqrwTL9KoEtCNCJ5pog1AQtu0bj0QPbqUvxwLg=="], + "@mantine/notifications": ["@mantine/notifications@7.17.0", "", { "dependencies": { "@mantine/store": "7.17.0", "react-transition-group": "4.4.5" }, "peerDependencies": { "@mantine/core": "7.17.0", "@mantine/hooks": "7.17.0", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "sha512-xejr1WW02NrrrE4HPDoownILJubcjLLwCDeTk907ZeeHKBEPut7RukEq6gLzOZBhNhKdPM+vCM7GcbXdaLZq/Q=="], + + "@mantine/store": ["@mantine/store@7.17.0", "", { "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-nhWRYRLqvAjrD/ApKCXxuHyTWg2b5dC06Z5gmO8udj4pBgndNf9nmCl+Of90H6bgOa56moJA7UQyXoF1SfxqVg=="], "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], @@ -205,7 +209,7 @@ "@types/jest": ["@types/jest@27.5.2", "", { "dependencies": { "jest-matcher-utils": "^27.0.0", "pretty-format": "^27.0.0" } }, "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA=="], - "@types/node": ["@types/node@20.17.17", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg=="], + "@types/node": ["@types/node@20.17.19", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A=="], "@types/prop-types": ["@types/prop-types@15.7.14", "", {}, "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ=="], @@ -295,12 +299,16 @@ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "highlight.js": ["highlight.js@11.11.1", "", {}, "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w=="], + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "install": ["install@0.13.0", "", {}, "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA=="], + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], @@ -365,7 +373,7 @@ "react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], - "react-icons": ["react-icons@5.4.0", "", { "peerDependencies": { "react": "*" } }, "sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ=="], + "react-icons": ["react-icons@5.5.0", "", { "peerDependencies": { "react": "*" } }, "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw=="], "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], @@ -379,9 +387,9 @@ "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], - "react-router": ["react-router@7.1.5", "", { "dependencies": { "@types/cookie": "^0.6.0", "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0", "turbo-stream": "2.4.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-8BUF+hZEU4/z/JD201yK6S+UYhsf58bzYIDq2NS1iGpwxSXDu7F+DeGSkIXMFBuHZB21FSiCzEcUb18cQNdRkA=="], + "react-router": ["react-router@7.2.0", "", { "dependencies": { "@types/cookie": "^0.6.0", "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0", "turbo-stream": "2.4.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-fXyqzPgCPZbqhrk7k3hPcCpYIlQ2ugIXDboHUzhJISFVy2DEPsmHgN588MyGmkIOv3jDgNfUE3kJi83L28s/LQ=="], - "react-router-dom": ["react-router-dom@7.1.5", "", { "dependencies": { "react-router": "7.1.5" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-/4f9+up0Qv92D3bB8iN5P1s3oHAepSGa9h5k6tpTFlixTTskJZwKGhJ6vRJ277tLD1zuaZTt95hyGWV1Z37csQ=="], + "react-router-dom": ["react-router-dom@7.2.0", "", { "dependencies": { "react-router": "7.2.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-cU7lTxETGtQRQbafJubvZKHEn5izNABxZhBY0Jlzdv0gqQhCPQt2J8aN5ZPjS6mQOXn5NnirWNh+FpE8TTYN0Q=="], "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], diff --git a/frontend/package.json b/frontend/package.json index 071420d..0d7cdd3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,21 +5,23 @@ "private": true, "dependencies": { "@hello-pangea/dnd": "^16.6.0", - "@mantine/core": "^7.16.3", - "@mantine/form": "^7.16.3", - "@mantine/hooks": "^7.16.3", - "@mantine/modals": "^7.16.3", - "@mantine/notifications": "^7.16.3", + "@mantine/code-highlight": "^7.17.0", + "@mantine/core": "^7.17.0", + "@mantine/form": "^7.17.0", + "@mantine/hooks": "^7.17.0", + "@mantine/modals": "^7.17.0", + "@mantine/notifications": "^7.17.0", "@tanstack/react-query": "^4.36.1", "@types/jest": "^27.5.2", - "@types/node": "^20.17.17", + "@types/node": "^20.17.19", "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "buffer": "^6.0.3", + "install": "^0.13.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-icons": "^5.4.0", - "react-router-dom": "^7.1.5", + "react-icons": "^5.5.0", + "react-router-dom": "^7.2.0", "socket.io-client": "^4.8.1", "typescript": "^5.7.3", "web-vitals": "^2.1.4", diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 7fc33a5..c13dd32 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -12,6 +12,8 @@ import ServiceDetailsNFRegex from './pages/NFRegex/ServiceDetails'; import PortHijack from './pages/PortHijack'; import { Firewall } from './pages/Firewall'; import { useQueryClient } from '@tanstack/react-query'; +import NFProxy from './pages/NFProxy'; +import ServiceDetailsNFProxy from './pages/NFProxy/ServiceDetails'; const socket = IS_DEV?io("ws://"+DEV_IP_BACKEND, {transports: ["websocket"], path:"/sock/socket.io" }):io({transports: ["websocket"], path:"/sock/socket.io"}); @@ -148,6 +150,9 @@ function App() { } > } /> + } > + } /> + } /> } /> } /> diff --git a/frontend/src/components/AddNewRegex.tsx b/frontend/src/components/AddNewRegex.tsx index 86d08c7..5437ec5 100644 --- a/frontend/src/components/AddNewRegex.tsx +++ b/frontend/src/components/AddNewRegex.tsx @@ -2,8 +2,9 @@ import { Button, Group, Space, TextInput, Notification, Switch, Modal, Select } import { useForm } from '@mantine/form'; import { useState } from 'react'; import { RegexAddForm } from '../js/models'; -import { b64decode, b64encode, getapiobject, okNotify } from '../js/utils'; +import { b64decode, b64encode, okNotify } from '../js/utils'; import { ImCross } from "react-icons/im" +import { nfregex } from './NFRegex/utils'; type RegexAddInfo = { regex:string, @@ -47,7 +48,7 @@ function AddNewRegex({ opened, onClose, service }:{ opened:boolean, onClose:()=> active: !values.deactive } setSubmitLoading(false) - getapiobject().regexesadd(request).then( res => { + nfregex.regexesadd(request).then( res => { if (!res){ setSubmitLoading(false) close(); diff --git a/frontend/src/components/NFProxy/AddEditService.tsx b/frontend/src/components/NFProxy/AddEditService.tsx new file mode 100644 index 0000000..d9287e2 --- /dev/null +++ b/frontend/src/components/NFProxy/AddEditService.tsx @@ -0,0 +1,139 @@ +import { Button, Group, Space, TextInput, Notification, Modal, Switch, SegmentedControl, Box, Tooltip } from '@mantine/core'; +import { useForm } from '@mantine/form'; +import { useEffect, useState } from 'react'; +import { okNotify, regex_ipv4, regex_ipv6 } from '../../js/utils'; +import { ImCross } from "react-icons/im" +import { nfproxy, Service } from './utils'; +import PortAndInterface from '../PortAndInterface'; +import { IoMdInformationCircleOutline } from "react-icons/io"; +import { ServiceAddForm as ServiceAddFormOriginal } from './utils'; + +type ServiceAddForm = ServiceAddFormOriginal & {autostart: boolean} + +function AddEditService({ opened, onClose, edit }:{ opened:boolean, onClose:()=>void, edit?:Service }) { + + const initialValues = { + name: "", + port:edit?.port??8080, + ip_int:edit?.ip_int??"", + proto:edit?.proto??"tcp", + fail_open: edit?.fail_open??false, + autostart: true + } + + const form = useForm({ + initialValues: initialValues, + validate:{ + name: (value) => edit? null : value !== "" ? null : "Service name is required", + port: (value) => (value>0 && value<65536) ? null : "Invalid port", + proto: (value) => ["tcp","udp"].includes(value) ? null : "Invalid protocol", + ip_int: (value) => (value.match(regex_ipv6) || value.match(regex_ipv4)) ? null : "Invalid IP address", + } + }) + + useEffect(() => { + if (opened){ + form.setInitialValues(initialValues) + form.reset() + } + }, [opened]) + + const close = () =>{ + onClose() + form.reset() + setError(null) + } + + const [submitLoading, setSubmitLoading] = useState(false) + const [error, setError] = useState(null) + + const submitRequest = ({ name, port, autostart, proto, ip_int, fail_open }:ServiceAddForm) =>{ + setSubmitLoading(true) + if (edit){ + nfproxy.settings(edit.service_id, { port, proto, ip_int, fail_open }).then( res => { + if (!res){ + setSubmitLoading(false) + close(); + okNotify(`Service ${name} settings updated`, `Successfully updated settings for service ${name}`) + } + }).catch( err => { + setSubmitLoading(false) + setError("Request Failed! [ "+err+" ]") + }) + }else{ + nfproxy.servicesadd({ name, port, proto, ip_int, fail_open }).then( res => { + if (res.status === "ok" && res.service_id){ + setSubmitLoading(false) + close(); + if (autostart) nfproxy.servicestart(res.service_id) + okNotify(`Service ${name} has been added`, `Successfully added service with port ${port}`) + }else{ + setSubmitLoading(false) + setError("Invalid request! [ "+res.status+" ]") + } + }).catch( err => { + setSubmitLoading(false) + setError("Request Failed! [ "+err+" ]") + }) + } + } + + + return +

+ {!edit?:null} + + + + + + + {!edit?:null} + + + Enable fail-open nfqueue + + + Firegex use internally nfqueue to handle packets
enabling this option will allow packets to pass through the firewall
in case the filtering is too slow or too many traffic is coming
+ }> + +
+
} + {...form.getInputProps('fail_open', { type: 'checkbox' })} + /> +
+ + + + + + + + + {error?<> + + } color="red" onClose={()=>{setError(null)}}> + Error: {error} + + :null} + + + + +} + +export default AddEditService; diff --git a/frontend/src/components/NFProxy/ServiceRow/RenameForm.tsx b/frontend/src/components/NFProxy/ServiceRow/RenameForm.tsx new file mode 100644 index 0000000..fec56b6 --- /dev/null +++ b/frontend/src/components/NFProxy/ServiceRow/RenameForm.tsx @@ -0,0 +1,68 @@ +import { Button, Group, Space, TextInput, Notification, Modal } from '@mantine/core'; +import { useForm } from '@mantine/form'; +import { useEffect, useState } from 'react'; +import { okNotify } from '../../../js/utils'; +import { ImCross } from "react-icons/im" +import { nfproxy, Service } from '../utils'; + +function RenameForm({ opened, onClose, service }:{ opened:boolean, onClose:()=>void, service:Service }) { + + const form = useForm({ + initialValues: { name:service.name }, + validate:{ name: (value) => value !== ""? null : "Service name is required" } + }) + + const close = () =>{ + onClose() + form.reset() + setError(null) + } + + useEffect(()=> form.setFieldValue("name", service.name),[opened]) + + const [submitLoading, setSubmitLoading] = useState(false) + const [error, setError] = useState(null) + + const submitRequest = ({ name }:{ name:string }) => { + setSubmitLoading(true) + nfproxy.servicerename(service.service_id, name).then( res => { + if (!res){ + setSubmitLoading(false) + close(); + okNotify(`Service ${service.name} has been renamed in ${ name }`, `Successfully renamed service on port ${service.port}`) + }else{ + setSubmitLoading(false) + setError("Error: [ "+res+" ]") + } + }).catch( err => { + setSubmitLoading(false) + setError("Request Failed! [ "+err+" ]") + }) + + } + + + return +
+ + + + + + {error?<> + + } color="red" onClose={()=>{setError(null)}}> + Error: {error} + + :null} + + +
+ +} + +export default RenameForm; diff --git a/frontend/src/components/NFProxy/ServiceRow/index.tsx b/frontend/src/components/NFProxy/ServiceRow/index.tsx new file mode 100644 index 0000000..5943bb7 --- /dev/null +++ b/frontend/src/components/NFProxy/ServiceRow/index.tsx @@ -0,0 +1,164 @@ +import { ActionIcon, Badge, Box, Divider, Menu, Space, Title, Tooltip } from '@mantine/core'; +import { useState } from 'react'; +import { FaPlay, FaStop } from 'react-icons/fa'; +import { nfproxy, Service, serviceQueryKey } from '../utils'; +import { MdDoubleArrow, MdOutlineArrowForwardIos } from "react-icons/md" +import YesNoModal from '../../YesNoModal'; +import { errorNotify, isMediumScreen, okNotify, regex_ipv4 } from '../../../js/utils'; +import { BsTrashFill } from 'react-icons/bs'; +import { BiRename } from 'react-icons/bi' +import RenameForm from './RenameForm'; +import { MenuDropDownWithButton } from '../../MainLayout'; +import { useQueryClient } from '@tanstack/react-query'; +import { TbPlugConnected } from "react-icons/tb"; +import { FaFilter } from "react-icons/fa"; +import { IoSettingsSharp } from 'react-icons/io5'; +import AddEditService from '../AddEditService'; +import { FaPencilAlt } from "react-icons/fa"; + +export default function ServiceRow({ service, onClick }:{ service:Service, onClick?:()=>void }) { + + let status_color = "gray"; + switch(service.status){ + case "stop": status_color = "red"; break; + case "active": status_color = "teal"; break; + } + + const queryClient = useQueryClient() + const [buttonLoading, setButtonLoading] = useState(false) + const [tooltipStopOpened, setTooltipStopOpened] = useState(false); + const [deleteModal, setDeleteModal] = useState(false) + const [renameModal, setRenameModal] = useState(false) + const [editModal, setEditModal] = useState(false) + const isMedium = isMediumScreen() + + const stopService = async () => { + setButtonLoading(true) + + await nfproxy.servicestop(service.service_id).then(res => { + if(!res){ + okNotify(`Service ${service.name} stopped successfully!`,`The service on ${service.port} has been stopped!`) + queryClient.invalidateQueries(serviceQueryKey) + }else{ + errorNotify(`An error as occurred during the stopping of the service ${service.port}`,`Error: ${res}`) + } + }).catch(err => { + errorNotify(`An error as occurred during the stopping of the service ${service.port}`,`Error: ${err}`) + }) + setButtonLoading(false); + } + + const startService = async () => { + setButtonLoading(true) + await nfproxy.servicestart(service.service_id).then(res => { + if(!res){ + okNotify(`Service ${service.name} started successfully!`,`The service on ${service.port} has been started!`) + queryClient.invalidateQueries(serviceQueryKey) + }else{ + errorNotify(`An error as occurred during the starting of the service ${service.port}`,`Error: ${res}`) + } + }).catch(err => { + errorNotify(`An error as occurred during the starting of the service ${service.port}`,`Error: ${err}`) + }) + setButtonLoading(false) + } + + const deleteService = () => { + nfproxy.servicedelete(service.service_id).then(res => { + if (!res){ + okNotify("Service delete complete!",`The service ${service.name} has been deleted!`) + queryClient.invalidateQueries(serviceQueryKey) + }else + errorNotify("An error occurred while deleting a service",`Error: ${res}`) + }).catch(err => { + errorNotify("An error occurred while deleting a service",`Error: ${err}`) + }) + + } + + return <> + + + + + + + {service.name} + + + + {service.status} + + :{service.port} + + + {isMedium?null:} + + + + + {service.ip_int} on {service.proto} + + + {service.blocked_packets} + + {service.edited_packets} + + {service.n_filters} + + + {isMedium?:} + + + Edit service + } onClick={()=>setEditModal(true)}>Service Settings + } onClick={()=>setRenameModal(true)}>Change service name + + Danger zone + } onClick={()=>setDeleteModal(true)}>Delete Service + + + + setTooltipStopOpened(false)} onBlur={() => setTooltipStopOpened(false)} + onMouseEnter={() => setTooltipStopOpened(true)} onMouseLeave={() => setTooltipStopOpened(false)}> + + + + + + + + + + {isMedium?:} + {onClick? + + :null} + + + + + setDeleteModal(false) } + action={deleteService} + opened={deleteModal} + /> + setRenameModal(false)} + opened={renameModal} + service={service} + /> + setEditModal(false)} + edit={service} + /> + +} diff --git a/frontend/src/components/NFProxy/utils.ts b/frontend/src/components/NFProxy/utils.ts new file mode 100644 index 0000000..492f560 --- /dev/null +++ b/frontend/src/components/NFProxy/utils.ts @@ -0,0 +1,99 @@ +import { PyFilter, ServerResponse } from "../../js/models" +import { deleteapi, getapi, postapi, putapi } from "../../js/utils" +import { useQuery } from "@tanstack/react-query" + +export type Service = { + service_id:string, + name:string, + status:string, + port:number, + proto: string, + ip_int: string, + n_filters:number, + edited_packets:number, + blocked_packets:number, + fail_open:boolean, +} + +export type ServiceAddForm = { + name:string, + port:number, + proto:string, + ip_int:string, + fail_open: boolean, +} + +export type ServiceSettings = { + port?:number, + proto?:string, + ip_int?:string, + fail_open?: boolean, +} + +export type ServiceAddResponse = { + status: string, + service_id?: string, +} + +export const serviceQueryKey = ["nfproxy","services"] + +export const nfproxyServiceQuery = () => useQuery({queryKey:serviceQueryKey, queryFn:nfproxy.services}) +export const nfproxyServicePyfiltersQuery = (service_id:string) => useQuery({ + queryKey:[...serviceQueryKey,service_id,"pyfilters"], + queryFn:() => nfproxy.servicepyfilters(service_id) +}) + +export const nfproxyServiceFilterCodeQuery = (service_id:string) => useQuery({ + queryKey:[...serviceQueryKey,service_id,"pyfilters","code"], + queryFn:() => nfproxy.getpyfilterscode(service_id) +}) + +export const nfproxy = { + services: async () => { + return await getapi("nfproxy/services") as Service[]; + }, + serviceinfo: async (service_id:string) => { + return await getapi(`nfproxy/services/${service_id}`) as Service; + }, + pyfilterenable: async (regex_id:number) => { + const { status } = await postapi(`nfproxy/pyfilters/${regex_id}/enable`) as ServerResponse; + return status === "ok"?undefined:status + }, + pyfilterdisable: async (regex_id:number) => { + const { status } = await postapi(`nfproxy/pyfilters/${regex_id}/disable`) as ServerResponse; + return status === "ok"?undefined:status + }, + servicestart: async (service_id:string) => { + const { status } = await postapi(`nfproxy/services/${service_id}/start`) as ServerResponse; + return status === "ok"?undefined:status + }, + servicerename: async (service_id:string, name: string) => { + const { status } = await putapi(`nfproxy/services/${service_id}/rename`,{ name }) as ServerResponse; + return status === "ok"?undefined:status + }, + servicestop: async (service_id:string) => { + const { status } = await postapi(`nfproxy/services/${service_id}/stop`) as ServerResponse; + return status === "ok"?undefined:status + }, + servicesadd: async (data:ServiceAddForm) => { + return await postapi("nfproxy/services",data) as ServiceAddResponse; + }, + servicedelete: async (service_id:string) => { + const { status } = await deleteapi(`nfproxy/services/${service_id}`) as ServerResponse; + return status === "ok"?undefined:status + }, + servicepyfilters: async (service_id:string) => { + return await getapi(`nfproxy/services/${service_id}/pyfilters`) as PyFilter[]; + }, + settings: async (service_id:string, data:ServiceSettings) => { + const { status } = await putapi(`nfproxy/services/${service_id}/settings`,data) as ServerResponse; + return status === "ok"?undefined:status + }, + getpyfilterscode: async (service_id:string) => { + return await getapi(`nfproxy/services/${service_id}/pyfilters/code`) as string; + }, + setpyfilterscode: async (service_id:string, code:string) => { + const { status } = await putapi(`nfproxy/services/${service_id}/pyfilters/code`,{ code }) as ServerResponse; + return status === "ok"?undefined:status + } +} diff --git a/frontend/src/components/NFRegex/utils.ts b/frontend/src/components/NFRegex/utils.ts index faa67c4..0fd8b3a 100644 --- a/frontend/src/components/NFRegex/utils.ts +++ b/frontend/src/components/NFRegex/utils.ts @@ -36,7 +36,6 @@ export type ServiceAddResponse = { } export const serviceQueryKey = ["nfregex","services"] -export const statsQueryKey = ["nfregex","stats"] export const nfregexServiceQuery = () => useQuery({queryKey:serviceQueryKey, queryFn:nfregex.services}) export const nfregexServiceRegexesQuery = (service_id:string) => useQuery({ diff --git a/frontend/src/components/NavBar/index.tsx b/frontend/src/components/NavBar/index.tsx index 456e12b..68a4f5f 100644 --- a/frontend/src/components/NavBar/index.tsx +++ b/frontend/src/components/NavBar/index.tsx @@ -1,12 +1,12 @@ -import { Collapse, Divider, Group, MantineColor, ScrollArea, Text, ThemeIcon, Title, UnstyledButton, Box, AppShell } from "@mantine/core"; +import { Divider, Group, MantineColor, ScrollArea, Text, ThemeIcon, Title, UnstyledButton, Box, AppShell } from "@mantine/core"; import { useState } from "react"; -import { IoMdGitNetwork } from "react-icons/io"; -import { MdOutlineExpandLess, MdOutlineExpandMore, MdTransform } from "react-icons/md"; +import { TbPlugConnected } from "react-icons/tb"; import { useNavigate } from "react-router-dom"; import { GrDirections } from "react-icons/gr"; import { PiWallLight } from "react-icons/pi"; import { useNavbarStore } from "../../js/store"; import { getMainPath } from "../../js/utils"; +import { BsRegex } from "react-icons/bs"; function NavBarButton({ navigate, closeNav, name, icon, color, disabled, onClick }: { navigate?: string, closeNav: () => void, name:string, icon:any, color:MantineColor, disabled?:boolean, onClick?:CallableFunction }) { @@ -36,9 +36,10 @@ export default function NavBar() { - } /> - } /> - } /> + } /> + } /> + } /> + } /> diff --git a/frontend/src/components/PortHijack/ServiceRow/index.tsx b/frontend/src/components/PortHijack/ServiceRow/index.tsx index 2f4a136..0b47b6b 100644 --- a/frontend/src/components/PortHijack/ServiceRow/index.tsx +++ b/frontend/src/components/PortHijack/ServiceRow/index.tsx @@ -1,4 +1,4 @@ -import { ActionIcon, Badge, Box, Divider, Grid, Menu, Space, Title, Tooltip } from '@mantine/core'; +import { ActionIcon, Badge, Box, Divider, Menu, Space, Title, Tooltip } from '@mantine/core'; import React, { useState } from 'react'; import { FaPlay, FaStop } from 'react-icons/fa'; import { porthijack, Service } from '../utils'; diff --git a/frontend/src/components/PyFilterView/index.tsx b/frontend/src/components/PyFilterView/index.tsx new file mode 100644 index 0000000..9a16108 --- /dev/null +++ b/frontend/src/components/PyFilterView/index.tsx @@ -0,0 +1,50 @@ +import { Text, Badge, Space, ActionIcon, Tooltip, Box } from '@mantine/core'; +import { useState } from 'react'; +import { PyFilter } from '../../js/models'; +import { errorNotify, okNotify } from '../../js/utils'; +import { FaPause, FaPlay } from 'react-icons/fa'; +import { FaFilter } from "react-icons/fa"; +import { nfproxy } from '../NFProxy/utils'; +import { FaPencilAlt } from 'react-icons/fa'; + +export default function PyFilterView({ filterInfo }:{ filterInfo:PyFilter }) { + + const [deleteTooltipOpened, setDeleteTooltipOpened] = useState(false); + const [statusTooltipOpened, setStatusTooltipOpened] = useState(false); + + const changeRegexStatus = () => { + (filterInfo.active?nfproxy.pyfilterdisable:nfproxy.pyfilterenable)(filterInfo.filter_id).then(res => { + if(!res){ + okNotify(`Filter ${filterInfo.name} ${filterInfo.active?"deactivated":"activated"} successfully!`,`Filter with id '${filterInfo.filter_id}' has been ${filterInfo.active?"deactivated":"activated"}!`) + }else{ + errorNotify(`Filter ${filterInfo.name} ${filterInfo.active?"deactivation":"activation"} failed!`,`Error: ${res}`) + } + }).catch( err => errorNotify(`Filter ${filterInfo.name} ${filterInfo.active?"deactivation":"activation"} failed!`,`Error: ${err}`)) + } + + return + + + + {filterInfo.name} + + + + setStatusTooltipOpened(false)} onBlur={() => setStatusTooltipOpened(false)} + onMouseEnter={() => setStatusTooltipOpened(true)} onMouseLeave={() => setStatusTooltipOpened(false)} + >{filterInfo.active?:} + + + + {filterInfo.blocked_packets} + + {filterInfo.edited_packets} + + {filterInfo.active?"ACTIVE":"DISABLED"} + + + + + +} diff --git a/frontend/src/components/RegexView/index.tsx b/frontend/src/components/RegexView/index.tsx index e5b0821..7f72c68 100644 --- a/frontend/src/components/RegexView/index.tsx +++ b/frontend/src/components/RegexView/index.tsx @@ -1,13 +1,14 @@ import { Text, Title, Badge, Space, ActionIcon, Tooltip, Box } from '@mantine/core'; import { useState } from 'react'; import { RegexFilter } from '../../js/models'; -import { b64decode, errorNotify, getapiobject, isMediumScreen, okNotify } from '../../js/utils'; +import { b64decode, errorNotify, isMediumScreen, okNotify } from '../../js/utils'; import { BsTrashFill } from "react-icons/bs" import YesNoModal from '../YesNoModal'; import { FaPause, FaPlay } from 'react-icons/fa'; import { useClipboard } from '@mantine/hooks'; import { FaFilter } from "react-icons/fa"; -import { VscRegex } from "react-icons/vsc"; + +import { nfregex } from '../NFRegex/utils'; function RegexView({ regexInfo }:{ regexInfo:RegexFilter }) { @@ -24,7 +25,7 @@ function RegexView({ regexInfo }:{ regexInfo:RegexFilter }) { const isMedium = isMediumScreen(); const deleteRegex = () => { - getapiobject().regexdelete(regexInfo.id).then(res => { + nfregex.regexdelete(regexInfo.id).then(res => { if(!res){ okNotify(`Regex ${regex_expr} deleted successfully!`,`Regex '${regex_expr}' ID:${regexInfo.id} has been deleted!`) }else{ @@ -34,9 +35,9 @@ function RegexView({ regexInfo }:{ regexInfo:RegexFilter }) { } const changeRegexStatus = () => { - (regexInfo.active?getapiobject().regexdisable:getapiobject().regexenable)(regexInfo.id).then(res => { + (regexInfo.active?nfregex.regexdisable:nfregex.regexenable)(regexInfo.id).then(res => { if(!res){ - okNotify(`Regex ${regex_expr} ${regexInfo.active?"deactivated":"activated"} successfully!`,`Regex '${regex_expr}' ID:${regexInfo.id} has been ${regexInfo.active?"deactivated":"activated"}!`) + okNotify(`Regex ${regex_expr} ${regexInfo.active?"deactivated":"activated"} successfully!`,`Regex with id '${regexInfo.id}' has been ${regexInfo.active?"deactivated":"activated"}!`) }else{ errorNotify(`Regex ${regex_expr} ${regexInfo.active?"deactivation":"activation"} failed!`,`Error: ${res}`) } diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx index b636476..b3212c8 100644 --- a/frontend/src/index.tsx +++ b/frontend/src/index.tsx @@ -9,6 +9,7 @@ import { import { queryClient } from './js/utils'; import '@mantine/core/styles.css'; import '@mantine/notifications/styles.css'; +import '@mantine/code-highlight/styles.css'; import './index.css'; const root = ReactDOM.createRoot( diff --git a/frontend/src/js/models.ts b/frontend/src/js/models.ts index 3f9804a..6f992f4 100644 --- a/frontend/src/js/models.ts +++ b/frontend/src/js/models.ts @@ -48,4 +48,12 @@ export type RegexAddForm = { is_case_sensitive:boolean, mode:string, // C->S S->C BOTH, active: boolean +} + +export type PyFilter = { + filter_id:number, + name:string, + blocked_packets:number, + edited_packets:number, + active:boolean } \ No newline at end of file diff --git a/frontend/src/js/utils.tsx b/frontend/src/js/utils.tsx index 0197205..55b1493 100644 --- a/frontend/src/js/utils.tsx +++ b/frontend/src/js/utils.tsx @@ -7,6 +7,7 @@ import { ChangePassword, IpInterface, LoginResponse, PasswordSend, ServerRespons import { Buffer } from "buffer" import { QueryClient, useQuery } from "@tanstack/react-query"; import { useMediaQuery } from "@mantine/hooks"; +import { nfproxy } from "../components/NFProxy/utils"; export const IS_DEV = import.meta.env.DEV @@ -101,14 +102,6 @@ export function getMainPath(){ return "" } -export function getapiobject(){ - switch(getMainPath()){ - case "nfregex": - return nfregex - } - throw new Error('No api for this tool!'); -} - export function HomeRedirector(){ const section = sessionStorage.getItem("home_section") const path = section?`/${section}`:`/nfregex` diff --git a/frontend/src/pages/Firewall/index.tsx b/frontend/src/pages/Firewall/index.tsx index 07594ca..1517e97 100644 --- a/frontend/src/pages/Firewall/index.tsx +++ b/frontend/src/pages/Firewall/index.tsx @@ -1,4 +1,4 @@ -import { ActionIcon, Badge, Box, Divider, FloatingIndicator, LoadingOverlay, Space, Switch, Table, Tabs, TextInput, Title, Tooltip, useMantineTheme } from "@mantine/core" +import { ActionIcon, Badge, Box, Divider, FloatingIndicator, LoadingOverlay, Space, Switch, Table, Tabs, TextInput, ThemeIcon, Title, Tooltip, useMantineTheme } from "@mantine/core" import { useEffect, useState } from "react"; import { BsPlusLg, BsTrashFill } from "react-icons/bs" import { rem } from '@mantine/core'; @@ -20,7 +20,8 @@ import { LuArrowBigRightDash } from "react-icons/lu" import { ImCheckmark, ImCross } from "react-icons/im"; import { IoSettingsSharp } from "react-icons/io5"; import { SettingsModal } from "./SettingsModal"; - +import { FaDirections } from "react-icons/fa"; +import { PiWallLight } from "react-icons/pi"; export const Firewall = () => { @@ -346,7 +347,7 @@ export const Firewall = () => { - Firewall Rules + <ThemeIcon radius="md" size="md" variant='filled' color='red' ><PiWallLight size={20} /></ThemeIcon><Space w="xs" />Firewall Rules {isMedium?:} Enabled: @@ -361,8 +362,8 @@ export const Firewall = () => { {isMedium?:} - Rules: {rules.isLoading?0:rules.data?.rules.length} - + Rules: {rules.isLoading?0:rules.data?.rules.length} + setTooltipAddOpened(false)} onBlur={() => setTooltipAddOpened(false)} diff --git a/frontend/src/pages/NFProxy/ServiceDetails.tsx b/frontend/src/pages/NFProxy/ServiceDetails.tsx new file mode 100644 index 0000000..95117f8 --- /dev/null +++ b/frontend/src/pages/NFProxy/ServiceDetails.tsx @@ -0,0 +1,200 @@ +import { ActionIcon, Box, Code, Grid, LoadingOverlay, Space, Title, Tooltip } from '@mantine/core'; +import { Navigate, useNavigate, useParams } from 'react-router-dom'; +import { Badge, Divider, Menu } from '@mantine/core'; +import { useState } from 'react'; +import { FaFilter, FaPencilAlt, FaPlay, FaStop } from 'react-icons/fa'; +import { nfproxy, nfproxyServiceFilterCodeQuery, nfproxyServicePyfiltersQuery, nfproxyServiceQuery, serviceQueryKey } from '../../components/NFProxy/utils'; +import { MdDoubleArrow } from "react-icons/md" +import YesNoModal from '../../components/YesNoModal'; +import { errorNotify, isMediumScreen, okNotify, regex_ipv4 } from '../../js/utils'; +import { BsTrashFill } from 'react-icons/bs'; +import { BiRename } from 'react-icons/bi' +import RenameForm from '../../components/NFProxy/ServiceRow/RenameForm'; +import { MenuDropDownWithButton } from '../../components/MainLayout'; +import { useQueryClient } from '@tanstack/react-query'; +import { FaArrowLeft } from "react-icons/fa"; +import { IoSettingsSharp } from 'react-icons/io5'; +import AddEditService from '../../components/NFProxy/AddEditService'; +import PyFilterView from '../../components/PyFilterView'; +import { TbPlugConnected } from 'react-icons/tb'; +import { CodeHighlight } from '@mantine/code-highlight'; +import { FaPython } from "react-icons/fa"; + +export default function ServiceDetailsNFProxy() { + + const {srv} = useParams() + const services = nfproxyServiceQuery() + const serviceInfo = services.data?.find(s => s.service_id == srv) + const filtersList = nfproxyServicePyfiltersQuery(srv??"") + const [deleteModal, setDeleteModal] = useState(false) + const [renameModal, setRenameModal] = useState(false) + const [editModal, setEditModal] = useState(false) + const [buttonLoading, setButtonLoading] = useState(false) + const queryClient = useQueryClient() + const [tooltipStopOpened, setTooltipStopOpened] = useState(false); + const [tooltipBackOpened, setTooltipBackOpened] = useState(false); + const filterCode = nfproxyServiceFilterCodeQuery(srv??"") + const navigate = useNavigate() + const isMedium = isMediumScreen() + + if (services.isLoading) return + if (!srv || !serviceInfo || filtersList.isError) return + + let status_color = "gray"; + switch(serviceInfo.status){ + case "stop": status_color = "red"; break; + case "active": status_color = "teal"; break; + } + + const startService = async () => { + setButtonLoading(true) + await nfproxy.servicestart(serviceInfo.service_id).then(res => { + if(!res){ + okNotify(`Service ${serviceInfo.name} started successfully!`,`The service on ${serviceInfo.port} has been started!`) + queryClient.invalidateQueries(serviceQueryKey) + }else{ + errorNotify(`An error as occurred during the starting of the service ${serviceInfo.port}`,`Error: ${res}`) + } + }).catch(err => { + errorNotify(`An error as occurred during the starting of the service ${serviceInfo.port}`,`Error: ${err}`) + }) + setButtonLoading(false) + } + + const deleteService = () => { + nfproxy.servicedelete(serviceInfo.service_id).then(res => { + if (!res){ + okNotify("Service delete complete!",`The service ${serviceInfo.name} has been deleted!`) + queryClient.invalidateQueries(serviceQueryKey) + }else + errorNotify("An error occurred while deleting a service",`Error: ${res}`) + }).catch(err => { + errorNotify("An error occurred while deleting a service",`Error: ${err}`) + }) + } + + const stopService = async () => { + setButtonLoading(true) + + await nfproxy.servicestop(serviceInfo.service_id).then(res => { + if(!res){ + okNotify(`Service ${serviceInfo.name} stopped successfully!`,`The service on ${serviceInfo.port} has been stopped!`) + queryClient.invalidateQueries(serviceQueryKey) + }else{ + errorNotify(`An error as occurred during the stopping of the service ${serviceInfo.port}`,`Error: ${res}`) + } + }).catch(err => { + errorNotify(`An error as occurred during the stopping of the service ${serviceInfo.port}`,`Error: ${err}`) + }) + setButtonLoading(false); + } + + return <> + + + + + <Box className="center-flex"> + <MdDoubleArrow /><Space w="sm" />{serviceInfo.name} + </Box> + + + {isMedium?null:} + + + {serviceInfo.status} + + + :{serviceInfo.port} + + + + Edit service + } onClick={()=>setEditModal(true)}>Service Settings + } onClick={()=>setRenameModal(true)}>Change service name + + Danger zone + } onClick={()=>setDeleteModal(true)}>Delete Service + + + + {isMedium?null:} + + + + {serviceInfo.edited_packets} + + {serviceInfo.blocked_packets} + + {serviceInfo.n_filters} + + {isMedium?:} + {serviceInfo.ip_int} on {serviceInfo.proto} + + {isMedium?null:} + + + navigate("/")} size="xl" radius="md" variant="filled" + aria-describedby="tooltip-back-id" + onFocus={() => setTooltipBackOpened(false)} onBlur={() => setTooltipBackOpened(false)} + onMouseEnter={() => setTooltipBackOpened(true)} onMouseLeave={() => setTooltipBackOpened(false)}> + + + + + + setTooltipStopOpened(false)} onBlur={() => setTooltipStopOpened(false)} + onMouseEnter={() => setTooltipStopOpened(true)} onMouseLeave={() => setTooltipStopOpened(false)}> + + + + + + + + + + + + + {filterCode.data?<> + <FaPython style={{ marginBottom: -3 }} size={30} /><Space w="xs" />Filter code + + : null} + + {(!filtersList.data || filtersList.data.length == 0)?<> + No filters found! Edit the proxy file + + Install the firegex client:<Space w="xs" /><Code mb={-4} >pip install fgex</Code> + + Then run the command:<Space w="xs" /><Code mb={-4} >fgex nfproxy</Code> + : + + {filtersList.data?.map( (filterInfo) => )} + + } + setDeleteModal(false) } + action={deleteService} + opened={deleteModal} + /> + setRenameModal(false)} + opened={renameModal} + service={serviceInfo} + /> + setEditModal(false)} + edit={serviceInfo} + /> + +} diff --git a/frontend/src/pages/NFProxy/index.tsx b/frontend/src/pages/NFProxy/index.tsx new file mode 100644 index 0000000..0817903 --- /dev/null +++ b/frontend/src/pages/NFProxy/index.tsx @@ -0,0 +1,91 @@ +import { ActionIcon, Badge, Box, LoadingOverlay, Space, ThemeIcon, Title, Tooltip } from '@mantine/core'; +import { useEffect, useState } from 'react'; +import { BsPlusLg } from "react-icons/bs"; +import { useNavigate, useParams } from 'react-router-dom'; +import ServiceRow from '../../components/NFProxy/ServiceRow'; +import { errorNotify, getErrorMessage, isMediumScreen } from '../../js/utils'; +import AddEditService from '../../components/NFProxy/AddEditService'; +import { useQueryClient } from '@tanstack/react-query'; +import { TbPlugConnected, TbReload } from 'react-icons/tb'; +import { nfproxyServiceQuery } from '../../components/NFProxy/utils'; +import { FaFilter, FaPencilAlt, FaServer } from 'react-icons/fa'; +import { VscRegex } from 'react-icons/vsc'; + + +export default function NFProxy({ children }: { children: any }) { + + const navigator = useNavigate() + const [open, setOpen] = useState(false); + const {srv} = useParams() + const queryClient = useQueryClient() + const [tooltipRefreshOpened, setTooltipRefreshOpened] = useState(false); + const [tooltipAddServOpened, setTooltipAddServOpened] = useState(false); + const [tooltipAddOpened, setTooltipAddOpened] = useState(false); + const isMedium = isMediumScreen() + const services = nfproxyServiceQuery() + + useEffect(()=> { + if(services.isError) + errorNotify("NFProxy Update failed!", getErrorMessage(services.error)) + },[services.isError]) + + const closeModal = () => {setOpen(false);} + + return <> + + + <ThemeIcon radius="md" size="md" variant='filled' color='lime' ><TbPlugConnected size={20} /></ThemeIcon><Space w="xs" />Netfilter Proxy + {isMedium?:} + + General stats: + + Services: {services.isLoading?0:services.data?.length} + + {services.isLoading?0:services.data?.reduce((acc, s)=> acc+=s.blocked_packets, 0)} + + {services.isLoading?0:services.data?.reduce((acc, s)=> acc+=s.edited_packets, 0)} + + {services.isLoading?0:services.data?.reduce((acc, s)=> acc+=s.n_filters, 0)} + + + {isMedium?null:} + + {/* Will become the null a button to edit the source code? TODO */} + { srv?null + : + setOpen(true)} size="lg" radius="md" variant="filled" + onFocus={() => setTooltipAddOpened(false)} onBlur={() => setTooltipAddOpened(false)} + onMouseEnter={() => setTooltipAddOpened(true)} onMouseLeave={() => setTooltipAddOpened(false)}> + + } + + + queryClient.invalidateQueries(["nfproxy"])} size="lg" radius="md" variant="filled" + loading={services.isFetching} + onFocus={() => setTooltipRefreshOpened(false)} onBlur={() => setTooltipRefreshOpened(false)} + onMouseEnter={() => setTooltipRefreshOpened(true)} onMouseLeave={() => setTooltipRefreshOpened(false)}> + + + + + + {srv?null:<> + + {(services.data && services.data?.length > 0)?services.data.map( srv => { + navigator("/nfproxy/"+srv.service_id) + }} />):<> No services found! Add one clicking the "+" buttons + + + setOpen(true)} size="xl" radius="md" variant="filled" + onFocus={() => setTooltipAddServOpened(false)} onBlur={() => setTooltipAddServOpened(false)} + onMouseEnter={() => setTooltipAddServOpened(true)} onMouseLeave={() => setTooltipAddServOpened(false)}> + + + } + } + + {srv?children:null} + {!srv?:null} + +} + diff --git a/frontend/src/pages/NFRegex/index.tsx b/frontend/src/pages/NFRegex/index.tsx index 6153458..19b0905 100644 --- a/frontend/src/pages/NFRegex/index.tsx +++ b/frontend/src/pages/NFRegex/index.tsx @@ -1,6 +1,6 @@ -import { ActionIcon, Badge, Box, LoadingOverlay, Space, Title, Tooltip } from '@mantine/core'; +import { ActionIcon, Badge, Box, LoadingOverlay, Space, ThemeIcon, Title, Tooltip } from '@mantine/core'; import { useEffect, useState } from 'react'; -import { BsPlusLg } from "react-icons/bs"; +import { BsPlusLg, BsRegex } from "react-icons/bs"; import { useNavigate, useParams } from 'react-router-dom'; import ServiceRow from '../../components/NFRegex/ServiceRow'; import { nfregexServiceQuery } from '../../components/NFRegex/utils'; @@ -9,7 +9,9 @@ import AddEditService from '../../components/NFRegex/AddEditService'; import AddNewRegex from '../../components/AddNewRegex'; import { useQueryClient } from '@tanstack/react-query'; import { TbReload } from 'react-icons/tb'; - +import { FaFilter } from 'react-icons/fa'; +import { FaServer } from "react-icons/fa6"; +import { VscRegex } from "react-icons/vsc"; function NFRegex({ children }: { children: any }) { @@ -33,14 +35,16 @@ function NFRegex({ children }: { children: any }) { return <> - Netfilter Regex + <ThemeIcon radius="md" size="md" variant='filled' color='grape' ><BsRegex size={20} /></ThemeIcon><Space w="xs" />Netfilter Regex {isMedium?:} - Services: {services.isLoading?0:services.data?.length} + General stats: - Filtered Connections: {services.isLoading?0:services.data?.reduce((acc, s)=> acc+=s.n_packets, 0)} + Services: {services.isLoading?0:services.data?.length} - Regexes: {services.isLoading?0:services.data?.reduce((acc, s)=> acc+=s.n_regex, 0)} + {services.isLoading?0:services.data?.reduce((acc, s)=> acc+=s.n_packets, 0)} + + {services.isLoading?0:services.data?.reduce((acc, s)=> acc+=s.n_regex, 0)} {isMedium?null:} diff --git a/frontend/src/pages/PortHijack/index.tsx b/frontend/src/pages/PortHijack/index.tsx index e4cdc08..e4f3640 100644 --- a/frontend/src/pages/PortHijack/index.tsx +++ b/frontend/src/pages/PortHijack/index.tsx @@ -1,4 +1,4 @@ -import { ActionIcon, Badge, Box, Divider, LoadingOverlay, Space, Title, Tooltip } from '@mantine/core'; +import { ActionIcon, Badge, Box, Divider, LoadingOverlay, Space, ThemeIcon, Title, Tooltip } from '@mantine/core'; import { useEffect, useState } from 'react'; import { BsPlusLg } from "react-icons/bs"; import ServiceRow from '../../components/PortHijack/ServiceRow'; @@ -7,6 +7,8 @@ import { errorNotify, getErrorMessage, isMediumScreen } from '../../js/utils'; import AddNewService from '../../components/PortHijack/AddNewService'; import { useQueryClient } from '@tanstack/react-query'; import { TbReload } from 'react-icons/tb'; +import { FaServer } from 'react-icons/fa'; +import { GrDirections } from 'react-icons/gr'; function PortHijack() { @@ -30,10 +32,10 @@ function PortHijack() { return <> - Hijack port to proxy + <ThemeIcon radius="md" size="md" variant='filled' color='blue' ><GrDirections size={20} /></ThemeIcon><Space w="xs" />Hijack port to proxy {isMedium?:} - Services: {services.isLoading?0:services.data?.length} + Services: {services.isLoading?0:services.data?.length} setOpen(true)} size="lg" radius="md" variant="filled" diff --git a/proxy-client/requirements.txt b/proxy-client/requirements.txt deleted file mode 100644 index 593817c..0000000 --- a/proxy-client/requirements.txt +++ /dev/null @@ -1,14 +0,0 @@ -typer==0.12.3 -requests>=2.32.3 -python-dateutil==2.9.0.post0 -pydantic >= 2 -typing-extensions >= 4.7.1 -textual==0.89.1 -toml==0.10.2 -psutil==6.0.0 -dirhash==0.5.0 -requests-toolbelt==1.0.0 -python-socketio[client]==5.11.4 -orjson - -# TODO choose dependencies \ No newline at end of file From 6a11dd0d1613f8ee711cf107432db61f43e8ebda Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Tue, 25 Feb 2025 23:53:04 +0100 Subject: [PATCH 04/18] push: code changes --- .gitignore | 1 + Dockerfile | 2 +- backend/app.py | 33 ++- backend/binsrc/classes/nfqueue.cpp | 184 +++++++++++-- backend/binsrc/nfproxy.cpp | 53 ++-- backend/binsrc/pyproxy/pyproxy.cpp | 175 +++++++------ backend/binsrc/pyproxy/settings.cpp | 59 +++-- backend/binsrc/pyproxy/stream_ctx.cpp | 198 +++++++++----- backend/binsrc/regex/regexfilter.cpp | 61 +---- backend/binsrc/regex/stream_ctx.cpp | 2 - backend/binsrc/utils.cpp | 120 ++++++++- backend/modules/firewall/nftables.py | 28 +- backend/modules/nfproxy/firegex.py | 118 ++++++--- backend/modules/nfproxy/firewall.py | 20 +- backend/modules/nfproxy/models.py | 14 +- backend/modules/nfproxy/nftables.py | 14 +- backend/modules/nfregex/firegex.py | 4 +- backend/modules/nfregex/firewall.py | 7 +- backend/routers/nfproxy.py | 108 ++++---- backend/utils/__init__.py | 55 +++- backend/utils/loader.py | 10 +- docs/FiregexInternals.png | Bin 118864 -> 121911 bytes docs/Firegex_Screenshot.png | Bin 329874 -> 334477 bytes fgex-lib/firegex/nfproxy/__init__.py | 42 ++- fgex-lib/firegex/nfproxy/internals.py | 246 ++++++++++-------- fgex-lib/firegex/nfproxy/params.py | 42 +-- frontend/src/App.tsx | 97 ++++--- .../src/components/NFProxy/AddEditService.tsx | 10 +- .../components/NFProxy/UploadFilterModal.tsx | 54 ++++ frontend/src/components/NFProxy/utils.ts | 9 +- .../src/components/PyFilterView/index.tsx | 53 ++-- frontend/src/index.css | 14 + frontend/src/js/models.ts | 1 - frontend/src/js/utils.tsx | 11 +- frontend/src/pages/NFProxy/ServiceDetails.tsx | 10 +- frontend/src/pages/NFProxy/index.tsx | 89 ++++++- frontend/src/pages/NFRegex/index.tsx | 2 +- 37 files changed, 1306 insertions(+), 640 deletions(-) create mode 100644 frontend/src/components/NFProxy/UploadFilterModal.tsx diff --git a/.gitignore b/.gitignore index d74d9af..88bc9d8 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ /frontend/coverage /fgex-lib/firegex.egg-info /fgex-lib/dist +/fgex-lib/build /fgex-lib/fgex-pip/fgex.egg-info /fgex-lib/fgex-pip/dist /backend/db/ diff --git a/Dockerfile b/Dockerfile index 4599907..feb8659 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ RUN bun run build FROM --platform=$TARGETARCH registry.fedoraproject.org/fedora:latest RUN dnf -y update && dnf install -y python3.13-devel @development-tools gcc-c++ \ libnetfilter_queue-devel libnfnetlink-devel libmnl-devel libcap-ng-utils nftables \ - vectorscan-devel libtins-devel python3-nftables libpcap-devel boost-devel uv + vectorscan-devel libtins-devel python3-nftables libpcap-devel boost-devel uv redis RUN mkdir -p /execute/modules WORKDIR /execute diff --git a/backend/app.py b/backend/app.py index b6646f2..f12224c 100644 --- a/backend/app.py +++ b/backend/app.py @@ -9,12 +9,13 @@ from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from jose import jwt from passlib.context import CryptContext from utils.sqlite import SQLite -from utils import API_VERSION, FIREGEX_PORT, JWT_ALGORITHM, get_interfaces, socketio_emit, DEBUG, SysctlManager +from utils import API_VERSION, FIREGEX_PORT, JWT_ALGORITHM, get_interfaces, socketio_emit, DEBUG, SysctlManager, NORELOAD from utils.loader import frontend_deploy, load_routers from utils.models import ChangePasswordModel, IpInterface, PasswordChangeForm, PasswordForm, ResetRequest, StatusModel, StatusMessageModel from contextlib import asynccontextmanager from fastapi.middleware.cors import CORSMiddleware import socketio +from socketio.exceptions import ConnectionRefusedError # DB init db = SQLite('db/firegex.db') @@ -52,7 +53,6 @@ if DEBUG: allow_headers=["*"], ) - utils.socketio = socketio.AsyncServer( async_mode="asgi", cors_allowed_origins=[], @@ -69,9 +69,6 @@ def set_psw(psw: str): hash_psw = crypto.hash(psw) db.put("password",hash_psw) -@utils.socketio.on("update") -async def updater(): pass - def create_access_token(data: dict): to_encode = data.copy() encoded_jwt = jwt.encode(to_encode, JWT_SECRET(), algorithm=JWT_ALGORITHM) @@ -90,6 +87,28 @@ async def check_login(token: str = Depends(oauth2_scheme)): return False return logged_in +@utils.socketio.on("connect") +async def sio_connect(sid, environ, auth): + if not auth or not await check_login(auth.get("token")): + raise ConnectionRefusedError("Unauthorized") + utils.sid_list.add(sid) + +@utils.socketio.on("disconnect") +async def sio_disconnect(sid): + try: + utils.sid_list.remove(sid) + except KeyError: + pass + +async def disconnect_all(): + while True: + if len(utils.sid_list) == 0: + break + await utils.socketio.disconnect(utils.sid_list.pop()) + +@utils.socketio.on("update") +async def updater(): pass + async def is_loggined(auth: bool = Depends(check_login)): if not auth: raise HTTPException( @@ -122,6 +141,7 @@ async def login_api(form: OAuth2PasswordRequestForm = Depends()): return {"access_token": create_access_token({"logged_in": True}), "token_type": "bearer"} raise HTTPException(406,"Wrong password!") + @app.post('/api/set-password', response_model=ChangePasswordModel) async def set_password(form: PasswordForm): """Set the password of firegex""" @@ -143,6 +163,7 @@ async def change_password(form: PasswordChangeForm): return {"status":"Cannot insert an empty password!"} if form.expire: db.put("secret", secrets.token_hex(32)) + await disconnect_all() set_psw(form.password) await refresh_frontend() @@ -200,7 +221,7 @@ if __name__ == '__main__': "app:app", host="::" if DEBUG else None, port=FIREGEX_PORT, - reload=DEBUG, + reload=DEBUG and not NORELOAD, access_log=True, workers=1, # Firewall module can't be replicated in multiple workers # Later the firewall module will be moved to a separate process diff --git a/backend/binsrc/classes/nfqueue.cpp b/backend/binsrc/classes/nfqueue.cpp index 582e683..7bfe9c4 100644 --- a/backend/binsrc/classes/nfqueue.cpp +++ b/backend/binsrc/classes/nfqueue.cpp @@ -17,6 +17,7 @@ enum class FilterAction{ DROP, ACCEPT, MANGLE, NOACTION }; enum class L4Proto { TCP, UDP, RAW }; typedef Tins::TCPIP::StreamIdentifier stream_id; +//TODO DUBBIO: I PACCHETTI INVIATI A PYTHON SONO GIA' FIXATI? template class PktRequest { @@ -25,6 +26,9 @@ class PktRequest { mnl_socket* nl = nullptr; uint16_t res_id; uint32_t packet_id; + size_t _original_size; + size_t _data_original_size; + bool need_tcp_fixing = false; public: bool is_ipv6; Tins::IP* ipv4 = nullptr; @@ -39,17 +43,27 @@ class PktRequest { size_t data_size; stream_id sid; + int64_t* tcp_in_offset = nullptr; + int64_t* tcp_out_offset = nullptr; + T* ctx; private: - inline void fetch_data_size(Tins::PDU* pdu){ + static size_t inner_data_size(Tins::PDU* pdu){ + if (pdu == nullptr){ + return 0; + } auto inner = pdu->inner_pdu(); if (inner == nullptr){ - data_size = 0; - }else{ - data_size = inner->size(); + return 0; } + return inner->size(); + } + + inline void fetch_data_size(Tins::PDU* pdu){ + data_size = inner_data_size(pdu); + _data_original_size = data_size; } L4Proto fill_l4_info(){ @@ -86,23 +100,92 @@ class PktRequest { } } + bool need_tcp_fix(){ + return (tcp_in_offset != nullptr && *tcp_in_offset != 0) || (tcp_out_offset != nullptr && *tcp_out_offset != 0); + } + + Tins::PDU::serialization_type reserialize_raw_data(const uint8_t* data, const size_t& data_size){ + if (is_ipv6){ + Tins::IPv6 ipv6_new = Tins::IPv6(data, data_size); + if (tcp){ + Tins::TCP* tcp_new = ipv6_new.find_pdu(); + } + return ipv6_new.serialize(); + }else{ + Tins::IP ipv4_new = Tins::IP(data, data_size); + if (tcp){ + Tins::TCP* tcp_new = ipv4_new.find_pdu(); + } + return ipv4_new.serialize(); + } + } + + void _fix_ack_seq_tcp(Tins::TCP* this_tcp){ + need_tcp_fixing = need_tcp_fix(); + #ifdef DEBUG + if (need_tcp_fixing){ + cerr << "[DEBUG] Fixing ack_seq with offsets " << *tcp_in_offset << " " << *tcp_out_offset << endl; + } + #endif + if(this_tcp == nullptr){ + return; + } + if (is_input){ + if (tcp_in_offset != nullptr){ + this_tcp->seq(this_tcp->seq() + *tcp_in_offset); + } + if (tcp_out_offset != nullptr){ + this_tcp->ack_seq(this_tcp->ack_seq() - *tcp_out_offset); + } + }else{ + if (tcp_in_offset != nullptr){ + this_tcp->ack_seq(this_tcp->ack_seq() - *tcp_in_offset); + } + if (tcp_out_offset != nullptr){ + this_tcp->seq(this_tcp->seq() + *tcp_out_offset); + } + } + #ifdef DEBUG + if (need_tcp_fixing){ + size_t new_size = inner_data_size(this_tcp); + cerr << "[DEBUG] FIXED PKT " << (is_input?"-> IN ":"<- OUT") << " [SEQ: " << this_tcp->seq() << "] \t[ACK: " << this_tcp->ack_seq() << "] \t[SIZE: " << new_size << "]" << endl; + } + #endif + } + + public: PktRequest(const char* payload, size_t plen, T* ctx, mnl_socket* nl, nfgenmsg *nfg, nfqnl_msg_packet_hdr *ph, bool is_input): ctx(ctx), nl(nl), res_id(nfg->res_id), packet_id(ph->packet_id), is_input(is_input), packet(string(payload, plen)), - is_ipv6((payload[0] & 0xf0) == 0x60){ - if (is_ipv6){ - ipv6 = new Tins::IPv6((uint8_t*)packet.c_str(), plen); - sid = stream_id::make_identifier(*ipv6); - }else{ - ipv4 = new Tins::IP((uint8_t*)packet.c_str(), plen); - sid = stream_id::make_identifier(*ipv4); - } - l4_proto = fill_l4_info(); - data = packet.data()+(plen-data_size); + action(FilterAction::NOACTION), + is_ipv6((payload[0] & 0xf0) == 0x60) + { + if (is_ipv6){ + ipv6 = new Tins::IPv6((uint8_t*)packet.c_str(), plen); + sid = stream_id::make_identifier(*ipv6); + _original_size = ipv6->size(); + }else{ + ipv4 = new Tins::IP((uint8_t*)packet.data(), plen); + sid = stream_id::make_identifier(*ipv4); + _original_size = ipv4->size(); } + l4_proto = fill_l4_info(); + data = packet.data()+(plen-data_size); + #ifdef DEBUG + if (tcp){ + cerr << "[DEBUG] NEW_PACKET " << (is_input?"-> IN ":"<- OUT") << " [SEQ: " << tcp->seq() << "] \t[ACK: " << tcp->ack_seq() << "] \t[SIZE: " << data_size << "]" << endl; + } + #endif + } + + void fix_tcp_ack(){ + if (tcp){ + _fix_ack_seq_tcp(tcp); + } + } void drop(){ if (action == FilterAction::NOACTION){ @@ -113,6 +196,14 @@ class PktRequest { } } + size_t data_original_size(){ + return _data_original_size; + } + + size_t original_size(){ + return _original_size; + } + void accept(){ if (action == FilterAction::NOACTION){ action = FilterAction::ACCEPT; @@ -131,7 +222,26 @@ class PktRequest { } } - void mangle_custom_pkt(const uint8_t* pkt, size_t pkt_size){ + void reject(){ + if (tcp){ + //If the packet has data, we have to remove it + delete tcp->release_inner_pdu(); + //For the first matched data or only for data packets, we set FIN bit + //This only for client packets, because this will trigger server to close the connection + //Packets will be filtered anyway also if client don't send packets + if (_data_original_size != 0 && is_input){ + tcp->set_flag(Tins::TCP::FIN,1); + tcp->set_flag(Tins::TCP::ACK,1); + tcp->set_flag(Tins::TCP::SYN,0); + } + //Send the edited packet to the kernel + mangle(); + }else{ + drop(); + } + } + + void mangle_custom_pkt(uint8_t* pkt, const size_t& pkt_size){ if (action == FilterAction::NOACTION){ action = FilterAction::MANGLE; perfrom_action(pkt, pkt_size); @@ -149,26 +259,58 @@ class PktRequest { delete ipv6; } + inline Tins::PDU::serialization_type serialize(){ + if (is_ipv6){ + return ipv6->serialize(); + }else{ + return ipv4->serialize(); + } + } + private: - void perfrom_action(const uint8_t* custom_data = nullptr, size_t custom_data_size = 0){ + void perfrom_action(uint8_t* custom_data = nullptr, size_t custom_data_size = 0){ char buf[MNL_SOCKET_BUFFER_SIZE]; struct nlmsghdr *nlh_verdict = nfq_nlmsg_put(buf, NFQNL_MSG_VERDICT, ntohs(res_id)); switch (action) { case FilterAction::ACCEPT: + if (need_tcp_fixing){ + Tins::PDU::serialization_type data = serialize(); + nfq_nlmsg_verdict_put_pkt(nlh_verdict, data.data(), data.size()); + } nfq_nlmsg_verdict_put(nlh_verdict, ntohl(packet_id), NF_ACCEPT ); break; case FilterAction::DROP: nfq_nlmsg_verdict_put(nlh_verdict, ntohl(packet_id), NF_DROP ); break; case FilterAction::MANGLE:{ - if (custom_data != nullptr){ - nfq_nlmsg_verdict_put_pkt(nlh_verdict, custom_data, custom_data_size); - }else if (is_ipv6){ - nfq_nlmsg_verdict_put_pkt(nlh_verdict, ipv6->serialize().data(), ipv6->size()); + //If not custom data, use the data in the packets + Tins::PDU::serialization_type data; + if (custom_data == nullptr){ + data = serialize(); }else{ - nfq_nlmsg_verdict_put_pkt(nlh_verdict, ipv4->serialize().data(), ipv4->size()); + try{ + data = reserialize_raw_data(custom_data, custom_data_size); + }catch(...){ + nfq_nlmsg_verdict_put(nlh_verdict, ntohl(packet_id), NF_DROP ); + action = FilterAction::DROP; + break; + } } + #ifdef DEBUG + size_t new_size = _data_original_size+((int64_t)custom_data_size) - ((int64_t)_original_size); + cerr << "[DEBUG] MANGLEDPKT " << (is_input?"-> IN ":"<- OUT") << " [SIZE: " << new_size << "]" << endl; + #endif + if (tcp && custom_data_size != _original_size){ + int64_t delta = ((int64_t)custom_data_size) - ((int64_t)_original_size); + + if (is_input && tcp_in_offset != nullptr){ + *tcp_in_offset += delta; + }else if (!is_input && tcp_out_offset != nullptr){ + *tcp_out_offset += delta; + } + } + nfq_nlmsg_verdict_put_pkt(nlh_verdict, data.data(), data.size()); nfq_nlmsg_verdict_put(nlh_verdict, ntohl(packet_id), NF_ACCEPT ); break; } diff --git a/backend/binsrc/nfproxy.cpp b/backend/binsrc/nfproxy.cpp index 96c12d1..1d44efc 100644 --- a/backend/binsrc/nfproxy.cpp +++ b/backend/binsrc/nfproxy.cpp @@ -4,11 +4,11 @@ #include "pyproxy/settings.cpp" #include "pyproxy/pyproxy.cpp" #include "classes/netfilter.cpp" -#include #include #include #include #include +#include "utils.cpp" using namespace std; using namespace Firegex::PyProxy; @@ -33,13 +33,13 @@ def invalid_curl_agent(http): The code is now edited adding an intestation and a end statement: ```python -global __firegex_pyfilter_enabled, __firegex_proto + __firegex_pyfilter_enabled = ["invalid_curl_agent", "func3"] # This list is dynamically generated by firegex backend __firegex_proto = "http" import firegex.nfproxy.internals - -firegex.nfproxy.internals.compile() # This function can save other global variables, to use by the packet handler and is used generally to check and optimize the code +firegex.nfproxy.internals.compile(globals(), locals()) # This function can save other global variables, to use by the packet handler and is used generally to check and optimize the code ```` +(First lines are the same to keep line of code consistent on exceptions messages) This code will be executed only once, and is needed to build the global and local context to use The globals and locals generated here are copied for each connection, and are used to handle the packets @@ -82,60 +82,53 @@ firegex lib will give you all the needed possibilities to do this is many ways Final note: is not raccomanded to use variables that starts with __firegex_ in your code, because they may break the nfproxy */ -ssize_t read_check(int __fd, void *__buf, size_t __nbytes){ - ssize_t bytes = read(__fd, __buf, __nbytes); - if (bytes == 0){ - cerr << "[fatal] [updater] read() returned EOF" << endl; - throw invalid_argument("read() returned EOF"); - } - if (bytes < 0){ - cerr << "[fatal] [updater] read() returned an error" << bytes << endl; - throw invalid_argument("read() returned an error"); - } - return bytes; -} + void config_updater (){ while (true){ + PyThreadState* state = PyEval_SaveThread(); // Release GIL while doing IO operation uint32_t code_size; - read_check(STDIN_FILENO, &code_size, 4); - //Python will send number always in little endian - code_size = le32toh(code_size); - string code; - code.resize(code_size); - read_check(STDIN_FILENO, code.data(), code_size); + memcpy(&code_size, control_socket.recv(4).c_str(), 4); + code_size = be32toh(code_size); + string code = control_socket.recv(code_size); + #ifdef DEBUG + cerr << "[DEBUG] [updater] Received code: " << code << endl; + #endif cerr << "[info] [updater] Updating configuration" << endl; + PyEval_AcquireThread(state); //Restore GIL before executing python code try{ config.reset(new PyCodeConfig(code)); cerr << "[info] [updater] Config update done" << endl; - osyncstream(cout) << "ACK OK" << endl; + control_socket << "ACK OK" << endl; }catch(const std::exception& e){ cerr << "[error] [updater] Failed to build new configuration!" << endl; - osyncstream(cout) << "ACK FAIL " << e.what() << endl; + control_socket << "ACK FAIL " << e.what() << endl; } } } -int main(int argc, char *argv[]){ +int main(int argc, char *argv[]) { + // Connect to the python backend using the unix socket + init_control_socket(); + + // Initialize the python interpreter Py_Initialize(); atexit(Py_Finalize); init_handle_packet_code(); //Compile the static code used to handle packets - if (freopen(nullptr, "rb", stdin) == nullptr){ // We need to read from stdin binary data - cerr << "[fatal] [main] Failed to reopen stdin in binary mode" << endl; - return 1; - } int n_of_threads = 1; char * n_threads_str = getenv("NTHREADS"); if (n_threads_str != nullptr) n_of_threads = ::atoi(n_threads_str); if(n_of_threads <= 0) n_of_threads = 1; config.reset(new PyCodeConfig()); + MultiThreadQueue queue(n_of_threads); - osyncstream(cout) << "QUEUE " << queue.queue_num() << endl; + control_socket << "QUEUE " << queue.queue_num() << endl; + cerr << "[info] [main] Queue: " << queue.queue_num() << " threads assigned: " << n_of_threads << endl; thread qthr([&](){ diff --git a/backend/binsrc/pyproxy/pyproxy.cpp b/backend/binsrc/pyproxy/pyproxy.cpp index 1f2c51c..41f4540 100644 --- a/backend/binsrc/pyproxy/pyproxy.cpp +++ b/backend/binsrc/pyproxy/pyproxy.cpp @@ -33,7 +33,8 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { public: stream_ctx sctx; StreamFollower follower; - PyGILState_STATE gstate; + PyThreadState * gtstate = nullptr; + PyInterpreterConfig py_thread_config = { .use_main_obmalloc = 0, .allow_fork = 0, @@ -44,24 +45,23 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { .gil = PyInterpreterConfig_OWN_GIL, }; PyThreadState *tstate = NULL; - PyStatus pystatus; - - struct { - bool matching_has_been_called = false; - bool already_closed = false; - bool rejected = true; - NfQueue::PktRequest* pkt; - } match_ctx; + NfQueue::PktRequest* pkt; + tcp_ack_seq_ctx* current_tcp_ack = nullptr; void before_loop() override { - // Create thred structure for python - gstate = PyGILState_Ensure(); + PyStatus pystatus; // Create a new interpreter for the thread + gtstate = PyThreadState_New(PyInterpreterState_Main()); + PyEval_AcquireThread(gtstate); pystatus = Py_NewInterpreterFromConfig(&tstate, &py_thread_config); - if (PyStatus_Exception(pystatus)) { - Py_ExitStatusException(pystatus); + if(tstate == nullptr){ cerr << "[fatal] [main] Failed to create new interpreter" << endl; - exit(EXIT_FAILURE); + throw invalid_argument("Failed to create new interpreter (null tstate)"); + } + if (PyStatus_Exception(pystatus)) { + cerr << "[fatal] [main] Failed to create new interpreter" << endl; + Py_ExitStatusException(pystatus); + throw invalid_argument("Failed to create new interpreter (pystatus exc)"); } // Setting callbacks for the stream follower follower.new_stream_callback(bind(on_new_stream, placeholders::_1, this)); @@ -69,21 +69,24 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { } inline void print_blocked_reason(const string& func_name){ - osyncstream(cout) << "BLOCKED " << func_name << endl; + control_socket << "BLOCKED " << func_name << endl; } inline void print_mangle_reason(const string& func_name){ - osyncstream(cout) << "MANGLED " << func_name << endl; + control_socket << "MANGLED " << func_name << endl; } inline void print_exception_reason(){ - osyncstream(cout) << "EXCEPTION" << endl; + control_socket << "EXCEPTION" << endl; } //If the stream has already been matched, drop all data, and try to close the connection - static void keep_fin_packet(PyProxyQueue* proxy_info){ - proxy_info->match_ctx.matching_has_been_called = true; - proxy_info->match_ctx.already_closed = true; + static void keep_fin_packet(PyProxyQueue* pyq){ + pyq->pkt->reject();// This is needed because the callback has to take the updated pkt pointer! + } + + static void keep_dropped(PyProxyQueue* pyq){ + pyq->pkt->drop();// This is needed because the callback has to take the updated pkt pointer! } void filter_action(NfQueue::PktRequest* pkt, Stream& stream){ @@ -92,36 +95,45 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { if (stream_search == sctx.streams_ctx.end()){ shared_ptr conf = config; //If config is not set, ignore the stream - if (conf->glob == nullptr || conf->local == nullptr){ + PyObject* compiled_code = conf->compiled_code(); + if (compiled_code == nullptr){ stream.client_data_callback(nullptr); stream.server_data_callback(nullptr); return pkt->accept(); } - stream_match = new pyfilter_ctx(conf->glob, conf->local); + stream_match = new pyfilter_ctx(compiled_code); + Py_DECREF(compiled_code); sctx.streams_ctx.insert_or_assign(pkt->sid, stream_match); }else{ stream_match = stream_search->second; - } + } + auto result = stream_match->handle_packet(pkt); switch(result.action){ case PyFilterResponse::ACCEPT: - pkt->accept(); + return pkt->accept(); case PyFilterResponse::DROP: print_blocked_reason(*result.filter_match_by); sctx.clean_stream_by_id(pkt->sid); - stream.client_data_callback(nullptr); - stream.server_data_callback(nullptr); - break; + stream.client_data_callback(bind(keep_dropped, this)); + stream.server_data_callback(bind(keep_dropped, this)); + return pkt->drop(); case PyFilterResponse::REJECT: + print_blocked_reason(*result.filter_match_by); sctx.clean_stream_by_id(pkt->sid); stream.client_data_callback(bind(keep_fin_packet, this)); stream.server_data_callback(bind(keep_fin_packet, this)); - pkt->ctx->match_ctx.rejected = true; //Handler will take care of the rest - break; + return pkt->reject(); case PyFilterResponse::MANGLE: - print_mangle_reason(*result.filter_match_by); - pkt->mangle_custom_pkt((uint8_t*)result.mangled_packet->c_str(), result.mangled_packet->size()); - break; + pkt->mangle_custom_pkt((uint8_t*)result.mangled_packet->data(), result.mangled_packet->size()); + if (pkt->get_action() == NfQueue::FilterAction::DROP){ + cerr << "[error] [filter_action] Failed to mangle: the packet sent is not serializzable... the packet was dropped" << endl; + print_blocked_reason(*result.filter_match_by); + print_exception_reason(); + }else{ + print_mangle_reason(*result.filter_match_by); + } + return; case PyFilterResponse::EXCEPTION: case PyFilterResponse::INVALID: print_exception_reason(); @@ -129,16 +141,15 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { //Free the packet data stream.client_data_callback(nullptr); stream.server_data_callback(nullptr); - pkt->accept(); - break; + return pkt->accept(); } } static void on_data_recv(Stream& stream, PyProxyQueue* proxy_info, string data) { - proxy_info->match_ctx.matching_has_been_called = true; - proxy_info->match_ctx.already_closed = false; - proxy_info->filter_action(proxy_info->match_ctx.pkt, stream); + proxy_info->pkt->data = data.data(); + proxy_info->pkt->data_size = data.size(); + proxy_info->filter_action(proxy_info->pkt, stream); } //Input data filtering @@ -152,77 +163,77 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { } // A stream was terminated. The second argument is the reason why it was terminated - static void on_stream_close(Stream& stream, PyProxyQueue* proxy_info) { + static void on_stream_close(Stream& stream, PyProxyQueue* pyq) { stream_id stream_id = stream_id::make_identifier(stream); - proxy_info->sctx.clean_stream_by_id(stream_id); + pyq->sctx.clean_stream_by_id(stream_id); + pyq->sctx.clean_tcp_ack_by_id(stream_id); } - static void on_new_stream(Stream& stream, PyProxyQueue* proxy_info) { + static void on_new_stream(Stream& stream, PyProxyQueue* pyq) { stream.auto_cleanup_payloads(true); if (stream.is_partial_stream()) { stream.enable_recovery_mode(10 * 1024); } - stream.client_data_callback(bind(on_client_data, placeholders::_1, proxy_info)); - stream.server_data_callback(bind(on_server_data, placeholders::_1, proxy_info)); - stream.stream_closed_callback(bind(on_stream_close, placeholders::_1, proxy_info)); + + if (pyq->current_tcp_ack != nullptr){ + pyq->current_tcp_ack->reset(); + }else{ + pyq->current_tcp_ack = new tcp_ack_seq_ctx(); + pyq->sctx.tcp_ack_ctx.insert_or_assign(pyq->pkt->sid, pyq->current_tcp_ack); + pyq->pkt->tcp_in_offset = &pyq->current_tcp_ack->in_tcp_offset; + pyq->pkt->tcp_out_offset = &pyq->current_tcp_ack->out_tcp_offset; + } + + //Should not happen, but with this we can be sure about this + auto tcp_ack_search = pyq->sctx.tcp_ack_ctx.find(pyq->pkt->sid); + if (tcp_ack_search != pyq->sctx.tcp_ack_ctx.end()){ + tcp_ack_search->second->reset(); + } + + stream.client_data_callback(bind(on_client_data, placeholders::_1, pyq)); + stream.server_data_callback(bind(on_server_data, placeholders::_1, pyq)); + stream.stream_closed_callback(bind(on_stream_close, placeholders::_1, pyq)); } + void handle_next_packet(NfQueue::PktRequest* _pkt) override{ + pkt = _pkt; // Setting packet context - void handle_next_packet(NfQueue::PktRequest* pkt) override{ if (pkt->l4_proto != NfQueue::L4Proto::TCP){ throw invalid_argument("Only TCP and UDP are supported"); } - Tins::PDU* application_layer = pkt->tcp->inner_pdu(); - u_int16_t payload_size = 0; - if (application_layer != nullptr){ - payload_size = application_layer->size(); + + auto tcp_ack_search = sctx.tcp_ack_ctx.find(pkt->sid); + if (tcp_ack_search != sctx.tcp_ack_ctx.end()){ + current_tcp_ack = tcp_ack_search->second; + pkt->tcp_in_offset = ¤t_tcp_ack->in_tcp_offset; + pkt->tcp_out_offset = ¤t_tcp_ack->out_tcp_offset; + }else{ + current_tcp_ack = nullptr; + //If necessary will be created by libtis new_stream callback } - match_ctx.matching_has_been_called = false; - match_ctx.pkt = pkt; + if (pkt->is_ipv6){ + pkt->fix_tcp_ack(); follower.process_packet(*pkt->ipv6); }else{ + pkt->fix_tcp_ack(); follower.process_packet(*pkt->ipv4); } - // Do an action only is an ordered packet has been received - if (match_ctx.matching_has_been_called){ - bool empty_payload = payload_size == 0; - //In this 2 cases we have to remove all data about the stream - if (!match_ctx.rejected || match_ctx.already_closed){ - sctx.clean_stream_by_id(pkt->sid); - //If the packet has data, we have to remove it - if (!empty_payload){ - Tins::PDU* data_layer = pkt->tcp->release_inner_pdu(); - if (data_layer != nullptr){ - delete data_layer; - } - } - //For the first matched data or only for data packets, we set FIN bit - //This only for client packets, because this will trigger server to close the connection - //Packets will be filtered anyway also if client don't send packets - if ((!match_ctx.rejected || !empty_payload) && pkt->is_input){ - pkt->tcp->set_flag(Tins::TCP::FIN,1); - pkt->tcp->set_flag(Tins::TCP::ACK,1); - pkt->tcp->set_flag(Tins::TCP::SYN,0); - } - //Send the edited packet to the kernel - return pkt->mangle(); - }else{ - //Fallback to the default action - if (pkt->get_action() == NfQueue::FilterAction::NOACTION){ - return pkt->accept(); - } - } - }else{ + + //Fallback to the default action + if (pkt->get_action() == NfQueue::FilterAction::NOACTION){ return pkt->accept(); } } ~PyProxyQueue() { // Closing first the interpreter + Py_EndInterpreter(tstate); - // Releasing the GIL and the thread data structure - PyGILState_Release(gstate); + PyEval_ReleaseThread(tstate); + PyThreadState_Clear(tstate); + PyThreadState_Delete(tstate); + sctx.clean(); } diff --git a/backend/binsrc/pyproxy/settings.cpp b/backend/binsrc/pyproxy/settings.cpp index 80f9a08..91b8cc2 100644 --- a/backend/binsrc/pyproxy/settings.cpp +++ b/backend/binsrc/pyproxy/settings.cpp @@ -2,58 +2,73 @@ #define PROXY_TUNNEL_SETTINGS_CPP #include - +#include #include #include #include +#include "../utils.cpp" using namespace std; namespace Firegex { namespace PyProxy { +class PyCodeConfig; + +shared_ptr config; +PyObject* py_handle_packet_code = nullptr; +UnixClientConnection control_socket; class PyCodeConfig{ public: - PyObject* glob = nullptr; - PyObject* local = nullptr; - - private: - void _clean(){ - Py_XDECREF(glob); - Py_XDECREF(local); - } - public: + string encoded_code; PyCodeConfig(const string& pycode){ - PyObject* compiled_code = Py_CompileStringExFlags(pycode.c_str(), "", Py_file_input, NULL, 2); if (compiled_code == nullptr){ std::cerr << "[fatal] [main] Failed to compile the code" << endl; - _clean(); throw invalid_argument("Failed to compile the code"); } - glob = PyDict_New(); - local = PyDict_New(); - PyObject* result = PyEval_EvalCode(compiled_code, glob, local); - Py_XDECREF(compiled_code); + PyObject* glob = PyDict_New(); + PyObject* result = PyEval_EvalCode(compiled_code, glob, glob); + Py_DECREF(glob); if (!result){ PyErr_Print(); - _clean(); + Py_DECREF(compiled_code); std::cerr << "[fatal] [main] Failed to execute the code" << endl; throw invalid_argument("Failed to execute the code, maybe an invalid filter code has been provided"); } Py_DECREF(result); + PyObject* code_dump = PyMarshal_WriteObjectToString(compiled_code, 4); + Py_DECREF(compiled_code); + if (code_dump == nullptr){ + PyErr_Print(); + std::cerr << "[fatal] [main] Failed to dump the code" << endl; + throw invalid_argument("Failed to dump the code"); + } + if (!PyBytes_Check(code_dump)){ + std::cerr << "[fatal] [main] Failed to dump the code" << endl; + throw invalid_argument("Failed to dump the code"); + } + encoded_code = string(PyBytes_AsString(code_dump), PyBytes_Size(code_dump)); + Py_DECREF(code_dump); } - PyCodeConfig(){} - ~PyCodeConfig(){ - _clean(); + PyObject* compiled_code(){ + if (encoded_code.empty()) return nullptr; + return PyMarshal_ReadObjectFromString(encoded_code.c_str(), encoded_code.size()); } + + PyCodeConfig(){} }; -shared_ptr config; -PyObject* py_handle_packet_code = nullptr; +void init_control_socket(){ + char * socket_path = getenv("FIREGEX_NFPROXY_SOCK"); + if (socket_path == nullptr) throw invalid_argument("FIREGEX_NFPROXY_SOCK not set"); + if (strlen(socket_path) >= 108) throw invalid_argument("FIREGEX_NFPROXY_SOCK too long"); + control_socket = UnixClientConnection(socket_path); +} + void init_handle_packet_code(){ py_handle_packet_code = Py_CompileStringExFlags( diff --git a/backend/binsrc/pyproxy/stream_ctx.cpp b/backend/binsrc/pyproxy/stream_ctx.cpp index 633ca50..761e20d 100644 --- a/backend/binsrc/pyproxy/stream_ctx.cpp +++ b/backend/binsrc/pyproxy/stream_ctx.cpp @@ -27,10 +27,21 @@ enum PyFilterResponse { INVALID = 5 }; +const PyFilterResponse VALID_PYTHON_RESPONSE[4] = { + PyFilterResponse::ACCEPT, + PyFilterResponse::DROP, + PyFilterResponse::REJECT, + PyFilterResponse::MANGLE +}; + struct py_filter_response { PyFilterResponse action; string* filter_match_by = nullptr; string* mangled_packet = nullptr; + + py_filter_response(PyFilterResponse action, string* filter_match_by = nullptr, string* mangled_packet = nullptr): + action(action), filter_match_by(filter_match_by), mangled_packet(mangled_packet){} + ~py_filter_response(){ delete mangled_packet; delete filter_match_by; @@ -39,34 +50,35 @@ struct py_filter_response { typedef Tins::TCPIP::StreamIdentifier stream_id; +struct tcp_ack_seq_ctx{ + //Can be negative, so we use int64_t (for a uint64_t value) + int64_t in_tcp_offset = 0; + int64_t out_tcp_offset = 0; + tcp_ack_seq_ctx(){} + void reset(){ + in_tcp_offset = 0; + out_tcp_offset = 0; + } +}; + struct pyfilter_ctx { PyObject * glob = nullptr; - PyObject * local = nullptr; - pyfilter_ctx(PyObject * original_glob, PyObject * original_local){ - PyObject *copy = PyImport_ImportModule("copy"); - if (copy == nullptr){ + pyfilter_ctx(PyObject * compiled_code){ + glob = PyDict_New(); + PyObject* result = PyEval_EvalCode(compiled_code, glob, glob); + if (!result){ PyErr_Print(); - throw invalid_argument("Failed to import copy module"); + Py_XDECREF(glob); + std::cerr << "[fatal] [main] Failed to compile the code" << endl; + throw invalid_argument("Failed to execute the code, maybe an invalid filter code has been provided"); } - PyObject *deepcopy = PyObject_GetAttrString(copy, "deepcopy"); - glob = PyObject_CallFunctionObjArgs(deepcopy, original_glob, NULL); - if (glob == nullptr){ - PyErr_Print(); - throw invalid_argument("Failed to deepcopy the global dict"); - } - local = PyObject_CallFunctionObjArgs(deepcopy, original_local, NULL); - if (local == nullptr){ - PyErr_Print(); - throw invalid_argument("Failed to deepcopy the local dict"); - } - Py_DECREF(copy); + Py_XDECREF(result); } ~pyfilter_ctx(){ - Py_XDECREF(glob); - Py_XDECREF(local); + Py_DECREF(glob); } inline void set_item_to_glob(const char* key, PyObject* value){ @@ -84,15 +96,12 @@ struct pyfilter_ctx { } } - inline void set_item_to_local(const char* key, PyObject* value){ - set_item_to_dict(local, key, value); - } - inline void set_item_to_dict(PyObject* dict, const char* key, PyObject* value){ if (PyDict_SetItemString(dict, key, value) != 0){ PyErr_Print(); throw invalid_argument("Failed to set item to dict"); } + Py_DECREF(value); } py_filter_response handle_packet( @@ -101,6 +110,7 @@ struct pyfilter_ctx { PyObject * packet_info = PyDict_New(); set_item_to_dict(packet_info, "data", PyBytes_FromStringAndSize(pkt->data, pkt->data_size)); + set_item_to_dict(packet_info, "l4_size", PyLong_FromLong(pkt->data_original_size())); set_item_to_dict(packet_info, "raw_packet", PyBytes_FromStringAndSize(pkt->packet.c_str(), pkt->packet.size())); set_item_to_dict(packet_info, "is_input", PyBool_FromLong(pkt->is_input)); set_item_to_dict(packet_info, "is_ipv6", PyBool_FromLong(pkt->is_ipv6)); @@ -108,92 +118,156 @@ struct pyfilter_ctx { // Set packet info to the global context set_item_to_glob("__firegex_packet_info", packet_info); - PyObject * result = PyEval_EvalCode(py_handle_packet_code, glob, local); + PyObject * result = PyEval_EvalCode(py_handle_packet_code, glob, glob); del_item_from_glob("__firegex_packet_info"); - Py_DECREF(packet_info); + Py_DECREF(packet_info); if (!result){ PyErr_Print(); - return py_filter_response{PyFilterResponse::EXCEPTION, nullptr}; + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] Exception raised" << endl; + #endif + return py_filter_response(PyFilterResponse::EXCEPTION); } + + Py_DECREF(result); result = get_item_from_glob("__firegex_pyfilter_result"); if (result == nullptr){ - return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] No result found" << endl; + #endif + return py_filter_response(PyFilterResponse::INVALID); } if (!PyDict_Check(result)){ PyErr_Print(); + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] Result is not a dict" << endl; + #endif del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + return py_filter_response(PyFilterResponse::INVALID); } PyObject* action = PyDict_GetItemString(result, "action"); if (action == nullptr){ + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] No result action found" << endl; + #endif del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + return py_filter_response(PyFilterResponse::INVALID); } if (!PyLong_Check(action)){ + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] Action is not a long" << endl; + #endif del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + return py_filter_response(PyFilterResponse::INVALID); } PyFilterResponse action_enum = (PyFilterResponse)PyLong_AsLong(action); - if (action_enum == PyFilterResponse::ACCEPT || action_enum == PyFilterResponse::EXCEPTION || action_enum == PyFilterResponse::INVALID){ - del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{action_enum, nullptr, nullptr}; - }else{ - PyObject *func_name_py = PyDict_GetItemString(result, "matched_by"); - if (func_name_py == nullptr){ - del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; - } - if (!PyUnicode_Check(func_name_py)){ - del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; - } - string* func_name = new string(PyUnicode_AsUTF8(func_name_py)); - if (action_enum == PyFilterResponse::DROP || action_enum == PyFilterResponse::REJECT){ - del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{action_enum, func_name, nullptr}; - } - if (action_enum != PyFilterResponse::MANGLE){ - PyObject* mangled_packet = PyDict_GetItemString(result, "mangled_packet"); - if (mangled_packet == nullptr){ - del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; - } - if (!PyBytes_Check(mangled_packet)){ - del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; - } - string* pkt_str = new string(PyBytes_AsString(mangled_packet), PyBytes_Size(mangled_packet)); - del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{PyFilterResponse::MANGLE, func_name, pkt_str}; + //Check action_enum + bool valid = false; + for (auto valid_action: VALID_PYTHON_RESPONSE){ + if (action_enum == valid_action){ + valid = true; + break; } } + if (!valid){ + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] Invalid action" << endl; + #endif + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response(PyFilterResponse::INVALID); + } + + if (action_enum == PyFilterResponse::ACCEPT){ + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response(action_enum); + } + PyObject *func_name_py = PyDict_GetItemString(result, "matched_by"); + if (func_name_py == nullptr){ + del_item_from_glob("__firegex_pyfilter_result"); + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] No result matched_by found" << endl; + #endif + return py_filter_response(PyFilterResponse::INVALID); + } + if (!PyUnicode_Check(func_name_py)){ + del_item_from_glob("__firegex_pyfilter_result"); + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] matched_by is not a string" << endl; + #endif + return py_filter_response(PyFilterResponse::INVALID); + } + string* func_name = new string(PyUnicode_AsUTF8(func_name_py)); + if (action_enum == PyFilterResponse::DROP || action_enum == PyFilterResponse::REJECT){ + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response(action_enum, func_name); + } + if (action_enum == PyFilterResponse::MANGLE){ + PyObject* mangled_packet = PyDict_GetItemString(result, "mangled_packet"); + if (mangled_packet == nullptr){ + del_item_from_glob("__firegex_pyfilter_result"); + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] No result mangled_packet found" << endl; + #endif + return py_filter_response(PyFilterResponse::INVALID); + } + if (!PyBytes_Check(mangled_packet)){ + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] mangled_packet is not a bytes" << endl; + #endif + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response(PyFilterResponse::INVALID); + } + string* pkt_str = new string(PyBytes_AsString(mangled_packet), PyBytes_Size(mangled_packet)); + del_item_from_glob("__firegex_pyfilter_result"); + return py_filter_response(PyFilterResponse::MANGLE, func_name, pkt_str); + } + + //Should never reach this point, but just in case of new action not managed... del_item_from_glob("__firegex_pyfilter_result"); - return py_filter_response{PyFilterResponse::INVALID, nullptr, nullptr}; + return py_filter_response(PyFilterResponse::INVALID); } }; typedef map matching_map; +typedef map tcp_ack_map; struct stream_ctx { matching_map streams_ctx; + tcp_ack_map tcp_ack_ctx; void clean_stream_by_id(stream_id sid){ auto stream_search = streams_ctx.find(sid); if (stream_search != streams_ctx.end()){ auto stream_match = stream_search->second; delete stream_match; + streams_ctx.erase(stream_search->first); } } + + void clean_tcp_ack_by_id(stream_id sid){ + auto tcp_ack_search = tcp_ack_ctx.find(sid); + if (tcp_ack_search != tcp_ack_ctx.end()){ + auto tcp_ack = tcp_ack_search->second; + delete tcp_ack; + tcp_ack_ctx.erase(tcp_ack_search->first); + } + } + void clean(){ for (auto ele: streams_ctx){ delete ele.second; } + for (auto ele: tcp_ack_ctx){ + delete ele.second; + } + tcp_ack_ctx.clear(); + streams_ctx.clear(); } }; diff --git a/backend/binsrc/regex/regexfilter.cpp b/backend/binsrc/regex/regexfilter.cpp index 0ea15d2..c84b12b 100644 --- a/backend/binsrc/regex/regexfilter.cpp +++ b/backend/binsrc/regex/regexfilter.cpp @@ -37,13 +37,7 @@ public: stream_ctx sctx; u_int16_t latest_config_ver = 0; StreamFollower follower; - struct { - bool matching_has_been_called = false; - bool already_closed = false; - bool result; - NfQueue::PktRequest* pkt; - } match_ctx; - + NfQueue::PktRequest* pkt; bool filter_action(NfQueue::PktRequest* pkt){ shared_ptr conf = regex_config; @@ -119,49 +113,23 @@ public: return true; } - void handle_next_packet(NfQueue::PktRequest* pkt) override{ - bool empty_payload = pkt->data_size == 0; + void handle_next_packet(NfQueue::PktRequest* _pkt) override{ + pkt = _pkt; // Setting packet context if (pkt->tcp){ - match_ctx.matching_has_been_called = false; - match_ctx.pkt = pkt; - if (pkt->ipv4){ follower.process_packet(*pkt->ipv4); }else{ follower.process_packet(*pkt->ipv6); } - - // Do an action only is an ordered packet has been received - if (match_ctx.matching_has_been_called){ - - //In this 2 cases we have to remove all data about the stream - if (!match_ctx.result || match_ctx.already_closed){ - sctx.clean_stream_by_id(pkt->sid); - //If the packet has data, we have to remove it - if (!empty_payload){ - Tins::PDU* data_layer = pkt->tcp->release_inner_pdu(); - if (data_layer != nullptr){ - delete data_layer; - } - } - //For the first matched data or only for data packets, we set FIN bit - //This only for client packets, because this will trigger server to close the connection - //Packets will be filtered anyway also if client don't send packets - if ((!match_ctx.result || !empty_payload) && pkt->is_input){ - pkt->tcp->set_flag(Tins::TCP::FIN,1); - pkt->tcp->set_flag(Tins::TCP::ACK,1); - pkt->tcp->set_flag(Tins::TCP::SYN,0); - } - //Send the edited packet to the kernel - return pkt->mangle(); - } + //Fallback to the default action + if (pkt->get_action() == NfQueue::FilterAction::NOACTION){ + return pkt->accept(); } - return pkt->accept(); }else{ if (!pkt->udp){ throw invalid_argument("Only TCP and UDP are supported"); } - if(empty_payload){ + if(pkt->data_size == 0){ return pkt->accept(); }else if (filter_action(pkt)){ return pkt->accept(); @@ -170,22 +138,21 @@ public: } } } + //If the stream has already been matched, drop all data, and try to close the connection static void keep_fin_packet(RegexNfQueue* nfq){ - nfq->match_ctx.matching_has_been_called = true; - nfq->match_ctx.already_closed = true; + nfq->pkt->reject();// This is needed because the callback has to take the updated pkt pointer! } static void on_data_recv(Stream& stream, RegexNfQueue* nfq, string data) { - nfq->match_ctx.matching_has_been_called = true; - nfq->match_ctx.already_closed = false; - bool result = nfq->filter_action(nfq->match_ctx.pkt); - if (!result){ - nfq->sctx.clean_stream_by_id(nfq->match_ctx.pkt->sid); + nfq->pkt->data = data.data(); + nfq->pkt->data_size = data.size(); + if (!nfq->filter_action(nfq->pkt)){ + nfq->sctx.clean_stream_by_id(nfq->pkt->sid); stream.client_data_callback(bind(keep_fin_packet, nfq)); stream.server_data_callback(bind(keep_fin_packet, nfq)); + nfq->pkt->reject(); } - nfq->match_ctx.result = result; } //Input data filtering diff --git a/backend/binsrc/regex/stream_ctx.cpp b/backend/binsrc/regex/stream_ctx.cpp index dc1c3fe..3ee6e3d 100644 --- a/backend/binsrc/regex/stream_ctx.cpp +++ b/backend/binsrc/regex/stream_ctx.cpp @@ -17,7 +17,6 @@ namespace Regex { typedef Tins::TCPIP::StreamIdentifier stream_id; typedef map matching_map; -#ifdef DEBUG ostream& operator<<(ostream& os, const Tins::TCPIP::StreamIdentifier::address_type &sid){ bool first_print = false; for (auto ele: sid){ @@ -33,7 +32,6 @@ ostream& operator<<(ostream& os, const stream_id &sid){ os << sid.max_address << ":" << sid.max_address_port << " -> " << sid.min_address << ":" << sid.min_address_port; return os; } -#endif struct stream_ctx { matching_map in_hs_streams; diff --git a/backend/binsrc/utils.cpp b/backend/binsrc/utils.cpp index a4d889a..59ca77b 100644 --- a/backend/binsrc/utils.cpp +++ b/backend/binsrc/utils.cpp @@ -1,10 +1,17 @@ +#ifndef UTILS_CPP +#define UTILS_CPP + #include #include #include #include - -#ifndef UTILS_CPP -#define UTILS_CPP +#include +#include +#include +#include +#include +#include +#include bool unhexlify(std::string const &hex, std::string &newString) { try{ @@ -22,6 +29,113 @@ bool unhexlify(std::string const &hex, std::string &newString) { } } +class UnixClientConnection { +public: + int sockfd = -1; + struct sockaddr_un addr; +private: + // Internal buffer to accumulate the output until flush + std::ostringstream streamBuffer; +public: + + UnixClientConnection(){}; + + UnixClientConnection(const char* path) { + sockfd = socket(AF_UNIX, SOCK_STREAM, 0); + if (sockfd == -1) { + throw std::runtime_error(std::string("socket error: ") + std::strerror(errno)); + } + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1); + if (connect(sockfd, reinterpret_cast(&addr), sizeof(addr)) != 0) { + throw std::runtime_error(std::string("connect error: ") + std::strerror(errno)); + } + } + + // Delete copy constructor and assignment operator to avoid resource duplication + UnixClientConnection(const UnixClientConnection&) = delete; + UnixClientConnection& operator=(const UnixClientConnection&) = delete; + + // Move constructor + UnixClientConnection(UnixClientConnection&& other) noexcept + : sockfd(other.sockfd), addr(other.addr) { + other.sockfd = -1; + } + + // Move assignment operator + UnixClientConnection& operator=(UnixClientConnection&& other) noexcept { + if (this != &other) { + if (sockfd != -1) { + close(sockfd); + } + sockfd = other.sockfd; + addr = other.addr; + other.sockfd = -1; + } + return *this; + } + + void send(const std::string& data) { + if (::write(sockfd, data.c_str(), data.size()) == -1) { + throw std::runtime_error(std::string("write error: ") + std::strerror(errno)); + } + } + + std::string recv(size_t size) { + std::string buffer(size, '\0'); + ssize_t bytesRead = ::read(sockfd, &buffer[0], size); + if (bytesRead <= 0) { + throw std::runtime_error(std::string("read error: ") + std::strerror(errno)); + } + buffer.resize(bytesRead); // resize to actual bytes read + return buffer; + } + + // Template overload for generic types + template + UnixClientConnection& operator<<(const T& data) { + streamBuffer << data; + return *this; + } + + // Overload for manipulators (e.g., std::endl) + UnixClientConnection& operator<<(std::ostream& (*manip)(std::ostream&)) { + // Check if the manipulator is std::endl (or equivalent flush) + if (manip == static_cast(std::endl)){ + streamBuffer << '\n'; // Add a newline + std::string packet = streamBuffer.str(); + streamBuffer.str(""); // Clear the buffer + // Send the accumulated data as one packet + send(packet); + } + if (static_cast(std::flush)) { + std::string packet = streamBuffer.str(); + streamBuffer.str(""); // Clear the buffer + // Send the accumulated data as one packet + send(packet); + } else { + // For other manipulators, simply pass them to the buffer + streamBuffer << manip; + } + return *this; + } + + // Overload operator<< to allow printing connection info + friend std::ostream& operator<<(std::ostream& os, const UnixClientConnection& conn) { + os << "UnixClientConnection(sockfd=" << conn.sockfd + << ", path=" << conn.addr.sun_path << ")"; + return os; + } + + ~UnixClientConnection() { + if (sockfd != -1) { + close(sockfd); + } + } +}; + + #ifdef USE_PIPES_FOR_BLOKING_QUEUE template diff --git a/backend/modules/firewall/nftables.py b/backend/modules/firewall/nftables.py index c27ab1c..6822fca 100644 --- a/backend/modules/firewall/nftables.py +++ b/backend/modules/firewall/nftables.py @@ -1,4 +1,4 @@ -from modules.firewall.models import * +from modules.firewall.models import FirewallSettings, Action, Rule, Protocol, Mode, Table from utils import nftables_int_to_json, ip_family, NFTableManager, is_ip_parse import copy @@ -9,7 +9,8 @@ class FiregexTables(NFTableManager): filter_table = "filter" mangle_table = "mangle" - def init_comands(self, policy:str=Action.ACCEPT, opt: FirewallSettings|None = None): + def init_comands(self, policy:str=Action.ACCEPT, opt: + FirewallSettings|None = None): rules = [ {"add":{"table":{"name":self.filter_table,"family":"ip"}}}, {"add":{"table":{"name":self.filter_table,"family":"ip6"}}}, @@ -41,7 +42,8 @@ class FiregexTables(NFTableManager): {"add":{"chain":{"family":"ip","table":self.mangle_table,"name":self.rules_chain_out}}}, {"add":{"chain":{"family":"ip6","table":self.mangle_table,"name":self.rules_chain_out}}}, ] - if opt is None: return rules + if opt is None: + return rules if opt.allow_loopback: rules.extend([ @@ -194,13 +196,18 @@ class FiregexTables(NFTableManager): def chain_to_firegex(self, chain:str, table:str): if table == self.filter_table: match chain: - case "INPUT": return self.rules_chain_in - case "OUTPUT": return self.rules_chain_out - case "FORWARD": return self.rules_chain_fwd + case "INPUT": + return self.rules_chain_in + case "OUTPUT": + return self.rules_chain_out + case "FORWARD": + return self.rules_chain_fwd elif table == self.mangle_table: match chain: - case "PREROUTING": return self.rules_chain_in - case "POSTROUTING": return self.rules_chain_out + case "PREROUTING": + return self.rules_chain_in + case "POSTROUTING": + return self.rules_chain_out return None def insert_firegex_chains(self): @@ -214,7 +221,8 @@ class FiregexTables(NFTableManager): if r.get("family") == family and r.get("table") == table and r.get("chain") == chain and r.get("expr") == rule_to_add: found = True break - if found: continue + if found: + continue yield { "add":{ "rule": { "family": family, "table": table, @@ -274,7 +282,7 @@ class FiregexTables(NFTableManager): ip_filters.append({"match": { "op": "==", "left": { "meta": { "key": "oifname" } }, "right": srv.dst} }) port_filters = [] - if not srv.proto in [Protocol.ANY, Protocol.BOTH]: + if srv.proto not in [Protocol.ANY, Protocol.BOTH]: if srv.port_src_from != 1 or srv.port_src_to != 65535: #Any Port port_filters.append({'match': {'left': {'payload': {'protocol': str(srv.proto), 'field': 'sport'}}, 'op': '>=', 'right': int(srv.port_src_from)}}) port_filters.append({'match': {'left': {'payload': {'protocol': str(srv.proto), 'field': 'sport'}}, 'op': '<=', 'right': int(srv.port_src_to)}}) diff --git a/backend/modules/nfproxy/firegex.py b/backend/modules/nfproxy/firegex.py index 095eb17..13eea5a 100644 --- a/backend/modules/nfproxy/firegex.py +++ b/backend/modules/nfproxy/firegex.py @@ -1,11 +1,10 @@ from modules.nfproxy.nftables import FiregexTables -from utils import run_func from modules.nfproxy.models import Service, PyFilter import os import asyncio -from utils import DEBUG import traceback from fastapi import HTTPException +import time nft = FiregexTables() @@ -13,29 +12,37 @@ class FiregexInterceptor: def __init__(self): self.srv:Service - self._stats_updater_cb:callable self.filter_map_lock:asyncio.Lock self.filter_map: dict[str, PyFilter] - self.pyfilters: set[PyFilter] self.update_config_lock:asyncio.Lock self.process:asyncio.subprocess.Process self.update_task: asyncio.Task + self.server_task: asyncio.Task + self.sock_path: str + self.unix_sock: asyncio.Server self.ack_arrived = False self.ack_status = None - self.ack_fail_what = "Unknown" + self.ack_fail_what = "Queue response timed-out" self.ack_lock = asyncio.Lock() - - async def _call_stats_updater_callback(self, filter: PyFilter): - if self._stats_updater_cb: - await run_func(self._stats_updater_cb(filter)) + self.sock_reader:asyncio.StreamReader = None + self.sock_writer:asyncio.StreamWriter = None + self.sock_conn_lock:asyncio.Lock + self.last_time_exception = 0 @classmethod - async def start(cls, srv: Service, stats_updater_cb:callable): + async def start(cls, srv: Service): self = cls() - self._stats_updater_cb = stats_updater_cb self.srv = srv self.filter_map_lock = asyncio.Lock() self.update_config_lock = asyncio.Lock() + self.sock_conn_lock = asyncio.Lock() + if not self.sock_conn_lock.locked(): + await self.sock_conn_lock.acquire() + self.sock_path = f"/tmp/firegex_nfproxy_{srv.id}.sock" + if os.path.exists(self.sock_path): + os.remove(self.sock_path) + self.unix_sock = await asyncio.start_unix_server(self._server_listener,path=self.sock_path) + self.server_task = asyncio.create_task(self.unix_sock.serve_forever()) queue_range = await self._start_binary() self.update_task = asyncio.create_task(self.update_stats()) nft.add(self.srv, queue_range) @@ -46,19 +53,20 @@ class FiregexInterceptor: async def _start_binary(self): proxy_binary_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"../cpproxy") self.process = await asyncio.create_subprocess_exec( - proxy_binary_path, - stdout=asyncio.subprocess.PIPE, stdin=asyncio.subprocess.PIPE, + proxy_binary_path, stdin=asyncio.subprocess.DEVNULL, env={ "NTHREADS": os.getenv("NTHREADS","1"), "FIREGEX_NFQUEUE_FAIL_OPEN": "1" if self.srv.fail_open else "0", + "FIREGEX_NFPROXY_SOCK": self.sock_path }, ) - line_fut = self.process.stdout.readuntil() try: - line_fut = await asyncio.wait_for(line_fut, timeout=3) + async with asyncio.timeout(3): + await self.sock_conn_lock.acquire() + line_fut = await self.sock_reader.readuntil() except asyncio.TimeoutError: self.process.kill() - raise Exception("Invalid binary output") + raise Exception("Binary don't returned queue number until timeout") line = line_fut.decode() if line.startswith("QUEUE "): params = line.split() @@ -67,25 +75,45 @@ class FiregexInterceptor: self.process.kill() raise Exception("Invalid binary output") + async def _server_listener(self, reader:asyncio.StreamReader, writer:asyncio.StreamWriter): + if self.sock_reader or self.sock_writer: + writer.write_eof() # Technically never reached + writer.close() + reader.feed_eof() + return + self.sock_reader = reader + self.sock_writer = writer + self.sock_conn_lock.release() + async def update_stats(self): try: while True: - line = (await self.process.stdout.readuntil()).decode() - if DEBUG: - print(line) + try: + line = (await self.sock_reader.readuntil()).decode() + except Exception as e: + self.ack_arrived = False + self.ack_status = False + self.ack_fail_what = "Can't read from nfq client" + self.ack_lock.release() + await self.stop() + raise HTTPException(status_code=500, detail="Can't read from nfq client") from e if line.startswith("BLOCKED "): - filter_id = line.split()[1] + filter_name = line.split()[1] + print("BLOCKED", filter_name) async with self.filter_map_lock: - if filter_id in self.filter_map: - self.filter_map[filter_id].blocked_packets+=1 - await self.filter_map[filter_id].update() + print("LOCKED MAP LOCK") + if filter_name in self.filter_map: + print("ADDING BLOCKED PACKET") + self.filter_map[filter_name].blocked_packets+=1 + await self.filter_map[filter_name].update() if line.startswith("MANGLED "): - filter_id = line.split()[1] + filter_name = line.split()[1] async with self.filter_map_lock: - if filter_id in self.filter_map: - self.filter_map[filter_id].edited_packets+=1 - await self.filter_map[filter_id].update() + if filter_name in self.filter_map: + self.filter_map[filter_name].edited_packets+=1 + await self.filter_map[filter_name].update() if line.startswith("EXCEPTION"): + self.last_time_exception = time.time() print("TODO EXCEPTION HANDLING") # TODO if line.startswith("ACK "): self.ack_arrived = True @@ -101,22 +129,29 @@ class FiregexInterceptor: traceback.print_exc() async def stop(self): + self.server_task.cancel() self.update_task.cancel() + self.unix_sock.close() + if os.path.exists(self.sock_path): + os.remove(self.sock_path) if self.process and self.process.returncode is None: self.process.kill() async def _update_config(self, code): async with self.update_config_lock: - self.process.stdin.write(len(code).to_bytes(4, byteorder='big')+code.encode()) - await self.process.stdin.drain() - try: - async with asyncio.timeout(3): - await self.ack_lock.acquire() - except TimeoutError: - pass - if not self.ack_arrived or not self.ack_status: - await self.stop() - raise HTTPException(status_code=500, detail=f"NFQ error: {self.ack_fail_what}") + if self.sock_writer: + self.sock_writer.write(len(code).to_bytes(4, byteorder='big')+code.encode()) + await self.sock_writer.drain() + try: + async with asyncio.timeout(3): + await self.ack_lock.acquire() + except TimeoutError: + self.ack_fail_what = "Queue response timed-out" + if not self.ack_arrived or not self.ack_status: + await self.stop() + raise HTTPException(status_code=500, detail=f"NFQ error: {self.ack_fail_what}") + else: + raise HTTPException(status_code=400, detail="Socket not ready") async def reload(self, filters:list[PyFilter]): async with self.filter_map_lock: @@ -125,12 +160,13 @@ class FiregexInterceptor: filter_file = f.read() else: filter_file = "" + self.filter_map = {ele.name: ele for ele in filters} await self._update_config( - "global __firegex_pyfilter_enabled\n" + + + filter_file + "\n\n" + "__firegex_pyfilter_enabled = [" + ", ".join([repr(f.name) for f in filters]) + "]\n" + "__firegex_proto = " + repr(self.srv.proto) + "\n" + - "import firegex.nfproxy.internals\n\n" + - filter_file + "\n\n" + - "firegex.nfproxy.internals.compile()" + "import firegex.nfproxy.internals\n" + + "firegex.nfproxy.internals.compile(globals())\n" ) diff --git a/backend/modules/nfproxy/firewall.py b/backend/modules/nfproxy/firewall.py index 59002d9..c424686 100644 --- a/backend/modules/nfproxy/firewall.py +++ b/backend/modules/nfproxy/firewall.py @@ -15,18 +15,18 @@ class ServiceManager: self.srv = srv self.db = db self.status = STATUS.STOP - self.filters: dict[int, FiregexFilter] = {} + self.filters: dict[str, FiregexFilter] = {} self.lock = asyncio.Lock() self.interceptor = None async def _update_filters_from_db(self): pyfilters = [ - PyFilter.from_dict(ele) for ele in + PyFilter.from_dict(ele, self.db) for ele in self.db.query("SELECT * FROM pyfilter WHERE service_id = ? AND active=1;", self.srv.id) ] #Filter check old_filters = set(self.filters.keys()) - new_filters = set([f.id for f in pyfilters]) + new_filters = set([f.name for f in pyfilters]) #remove old filters for f in old_filters: if f not in new_filters: @@ -34,7 +34,7 @@ class ServiceManager: #add new filters for f in new_filters: if f not in old_filters: - self.filters[f] = [ele for ele in pyfilters if ele.id == f][0] + self.filters[f] = [ele for ele in pyfilters if ele.name == f][0] if self.interceptor: await self.interceptor.reload(self.filters.values()) @@ -43,16 +43,11 @@ class ServiceManager: async def next(self,to): async with self.lock: - if (self.status, to) == (STATUS.ACTIVE, STATUS.STOP): + if to == STATUS.STOP: await self.stop() - self._set_status(to) - # PAUSE -> ACTIVE - elif (self.status, to) == (STATUS.STOP, STATUS.ACTIVE): + if to == STATUS.ACTIVE: await self.restart() - def _stats_updater(self,filter:PyFilter): - self.db.query("UPDATE pyfilter SET blocked_packets = ?, edited_packets = ? WHERE filter_id = ?;", filter.blocked_packets, filter.edited_packets, filter.id) - def _set_status(self,status): self.status = status self.__update_status_db(status) @@ -60,7 +55,7 @@ class ServiceManager: async def start(self): if not self.interceptor: nft.delete(self.srv) - self.interceptor = await FiregexInterceptor.start(self.srv, self._stats_updater) + self.interceptor = await FiregexInterceptor.start(self.srv) await self._update_filters_from_db() self._set_status(STATUS.ACTIVE) @@ -69,6 +64,7 @@ class ServiceManager: if self.interceptor: await self.interceptor.stop() self.interceptor = None + self._set_status(STATUS.STOP) async def restart(self): await self.stop() diff --git a/backend/modules/nfproxy/models.py b/backend/modules/nfproxy/models.py index 4417db0..bb691cd 100644 --- a/backend/modules/nfproxy/models.py +++ b/backend/modules/nfproxy/models.py @@ -15,13 +15,19 @@ class Service: class PyFilter: - def __init__(self, filter_id:int, name: str, blocked_packets: int, edited_packets: int, active: bool, **other): - self.id = filter_id + def __init__(self, name: str, blocked_packets: int, edited_packets: int, active: bool, db, **other): self.name = name self.blocked_packets = blocked_packets self.edited_packets = edited_packets self.active = active + self.__db = db + + async def update(self): + self.__db.query("UPDATE pyfilter SET blocked_packets = ?, edited_packets = ? WHERE name = ?;", self.blocked_packets, self.edited_packets, self.name) + + def __repr__(self): + return f"" @classmethod - def from_dict(cls, var: dict): - return cls(**var) + def from_dict(cls, var: dict, db): + return cls(**var, db=db) diff --git a/backend/modules/nfproxy/nftables.py b/backend/modules/nfproxy/nftables.py index eafa129..84c24c9 100644 --- a/backend/modules/nfproxy/nftables.py +++ b/backend/modules/nfproxy/nftables.py @@ -1,6 +1,14 @@ from modules.nfproxy.models import Service from utils import ip_parse, ip_family, NFTableManager, nftables_int_to_json +def convert_protocol_to_l4(proto:str): + if proto == "tcp": + return "tcp" + elif proto == "http": + return "tcp" + else: + raise Exception("Invalid protocol") + class FiregexFilter: def __init__(self, proto:str, port:int, ip_int:str, target:str, id:int): self.id = id @@ -11,7 +19,7 @@ class FiregexFilter: def __eq__(self, o: object) -> bool: if isinstance(o, FiregexFilter) or isinstance(o, Service): - return self.port == o.port and self.proto == o.proto and ip_parse(self.ip_int) == ip_parse(o.ip_int) + return self.port == o.port and self.proto == convert_protocol_to_l4(o.proto) and ip_parse(self.ip_int) == ip_parse(o.ip_int) return False class FiregexTables(NFTableManager): @@ -61,7 +69,7 @@ class FiregexTables(NFTableManager): "chain": self.output_chain, "expr": [ {'match': {'left': {'payload': {'protocol': ip_family(srv.ip_int), 'field': 'saddr'}}, 'op': '==', 'right': nftables_int_to_json(srv.ip_int)}}, - {'match': {"left": { "payload": {"protocol": str(srv.proto), "field": "sport"}}, "op": "==", "right": int(srv.port)}}, + {'match': {"left": { "payload": {"protocol": convert_protocol_to_l4(str(srv.proto)), "field": "sport"}}, "op": "==", "right": int(srv.port)}}, {"mangle": {"key": {"meta": {"key": "mark"}},"value": 0x1338}}, {"queue": {"num": str(init) if init == end else {"range":[init, end] }, "flags": ["bypass"]}} ] @@ -72,7 +80,7 @@ class FiregexTables(NFTableManager): "chain": self.input_chain, "expr": [ {'match': {'left': {'payload': {'protocol': ip_family(srv.ip_int), 'field': 'daddr'}}, 'op': '==', 'right': nftables_int_to_json(srv.ip_int)}}, - {'match': {"left": { "payload": {"protocol": str(srv.proto), "field": "dport"}}, "op": "==", "right": int(srv.port)}}, + {'match': {"left": { "payload": {"protocol": convert_protocol_to_l4(str(srv.proto)), "field": "dport"}}, "op": "==", "right": int(srv.port)}}, {"mangle": {"key": {"meta": {"key": "mark"}},"value": 0x1337}}, {"queue": {"num": str(init) if init == end else {"range":[init, end] }, "flags": ["bypass"]}} ] diff --git a/backend/modules/nfregex/firegex.py b/backend/modules/nfregex/firegex.py index 5e6b2b0..701ca9d 100644 --- a/backend/modules/nfregex/firegex.py +++ b/backend/modules/nfregex/firegex.py @@ -79,7 +79,7 @@ class FiregexInterceptor: self.update_task: asyncio.Task self.ack_arrived = False self.ack_status = None - self.ack_fail_what = "Unknown" + self.ack_fail_what = "Queue response timed-out" self.ack_lock = asyncio.Lock() @classmethod @@ -158,7 +158,7 @@ class FiregexInterceptor: async with asyncio.timeout(3): await self.ack_lock.acquire() except TimeoutError: - pass + self.ack_fail_what = "Queue response timed-out" if not self.ack_arrived or not self.ack_status: await self.stop() raise HTTPException(status_code=500, detail=f"NFQ error: {self.ack_fail_what}") diff --git a/backend/modules/nfregex/firewall.py b/backend/modules/nfregex/firewall.py index d0d5479..ec9231e 100644 --- a/backend/modules/nfregex/firewall.py +++ b/backend/modules/nfregex/firewall.py @@ -45,11 +45,9 @@ class ServiceManager: async def next(self,to): async with self.lock: - if (self.status, to) == (STATUS.ACTIVE, STATUS.STOP): + if to == STATUS.STOP: await self.stop() - self._set_status(to) - # PAUSE -> ACTIVE - elif (self.status, to) == (STATUS.STOP, STATUS.ACTIVE): + if to == STATUS.ACTIVE: await self.restart() def _stats_updater(self,filter:RegexFilter): @@ -71,6 +69,7 @@ class ServiceManager: if self.interceptor: await self.interceptor.stop() self.interceptor = None + self._set_status(STATUS.STOP) async def restart(self): await self.stop() diff --git a/backend/routers/nfproxy.py b/backend/routers/nfproxy.py index efcc664..77405d1 100644 --- a/backend/routers/nfproxy.py +++ b/backend/routers/nfproxy.py @@ -10,6 +10,10 @@ from utils.models import ResetRequest, StatusMessageModel import os from firegex.nfproxy.internals import get_filter_names from fastapi.responses import PlainTextResponse +from modules.nfproxy.nftables import convert_protocol_to_l4 +import asyncio +import traceback +from utils import DEBUG class ServiceModel(BaseModel): service_id: str @@ -28,12 +32,10 @@ class RenameForm(BaseModel): class SettingsForm(BaseModel): port: PortType|None = None - proto: str|None = None ip_int: str|None = None fail_open: bool|None = None class PyFilterModel(BaseModel): - filter_id: int name: str blocked_packets: int edited_packets: int @@ -52,6 +54,7 @@ class ServiceAddResponse(BaseModel): class SetPyFilterForm(BaseModel): code: str + sid: str|None = None app = APIRouter() @@ -62,12 +65,12 @@ db = SQLite('db/nft-pyfilters.db', { 'port': 'INT NOT NULL CHECK(port > 0 and port < 65536)', 'name': 'VARCHAR(100) NOT NULL UNIQUE', 'proto': 'VARCHAR(3) NOT NULL CHECK (proto IN ("tcp", "http"))', + 'l4_proto': 'VARCHAR(3) NOT NULL CHECK (l4_proto IN ("tcp", "udp"))', 'ip_int': 'VARCHAR(100) NOT NULL', 'fail_open': 'BOOLEAN NOT NULL CHECK (fail_open IN (0, 1)) DEFAULT 1', }, 'pyfilter': { - 'filter_id': 'INTEGER PRIMARY KEY', - 'name': 'VARCHAR(100) NOT NULL', + 'name': 'VARCHAR(100) PRIMARY KEY', 'blocked_packets': 'INTEGER UNSIGNED NOT NULL DEFAULT 0', 'edited_packets': 'INTEGER UNSIGNED NOT NULL DEFAULT 0', 'service_id': 'VARCHAR(100) NOT NULL', @@ -75,7 +78,7 @@ db = SQLite('db/nft-pyfilters.db', { 'FOREIGN KEY (service_id)':'REFERENCES services (service_id)', }, 'QUERY':[ - "CREATE UNIQUE INDEX IF NOT EXISTS unique_services ON services (port, ip_int, proto);", + "CREATE UNIQUE INDEX IF NOT EXISTS unique_services ON services (port, ip_int, l4_proto);", "CREATE UNIQUE INDEX IF NOT EXISTS unique_pyfilter_service ON pyfilter (name, service_id);" ] }) @@ -132,7 +135,7 @@ async def get_service_list(): s.proto proto, s.ip_int ip_int, s.fail_open fail_open, - COUNT(f.filter_id) n_filters, + COUNT(f.name) n_filters, COALESCE(SUM(f.blocked_packets),0) blocked_packets, COALESCE(SUM(f.edited_packets),0) edited_packets FROM services s LEFT JOIN pyfilter f ON s.service_id = f.service_id @@ -151,7 +154,7 @@ async def get_service_by_id(service_id: str): s.proto proto, s.ip_int ip_int, s.fail_open fail_open, - COUNT(f.filter_id) n_filters, + COUNT(f.name) n_filters, COALESCE(SUM(f.blocked_packets),0) blocked_packets, COALESCE(SUM(f.edited_packets),0) edited_packets FROM services s LEFT JOIN pyfilter f ON s.service_id = f.service_id @@ -202,9 +205,6 @@ async def service_rename(service_id: str, form: RenameForm): @app.put('/services/{service_id}/settings', response_model=StatusMessageModel) async def service_settings(service_id: str, form: SettingsForm): """Request to change the settings of a specific service (will cause a restart)""" - - if form.proto is not None and form.proto not in ["tcp", "udp"]: - raise HTTPException(status_code=400, detail="Invalid protocol") if form.port is not None and (form.port < 1 or form.port > 65535): raise HTTPException(status_code=400, detail="Invalid port") @@ -245,38 +245,38 @@ async def get_service_pyfilter_list(service_id: str): raise HTTPException(status_code=400, detail="This service does not exists!") return db.query(""" SELECT - filter_id, name, blocked_packets, edited_packets, active + name, blocked_packets, edited_packets, active FROM pyfilter WHERE service_id = ?; """, service_id) -@app.get('/pyfilters/{filter_id}', response_model=PyFilterModel) -async def get_pyfilter_by_id(filter_id: int): +@app.get('/pyfilters/{filter_name}', response_model=PyFilterModel) +async def get_pyfilter_by_id(filter_name: str): """Get pyfilter info using his id""" res = db.query(""" SELECT - filter_id, name, blocked_packets, edited_packets, active - FROM pyfilter WHERE filter_id = ?; - """, filter_id) + name, blocked_packets, edited_packets, active + FROM pyfilter WHERE name = ?; + """, filter_name) if len(res) == 0: raise HTTPException(status_code=400, detail="This filter does not exists!") return res[0] -@app.post('/pyfilters/{filter_id}/enable', response_model=StatusMessageModel) -async def pyfilter_enable(filter_id: int): +@app.post('/pyfilters/{filter_name}/enable', response_model=StatusMessageModel) +async def pyfilter_enable(filter_name: str): """Request the enabling of a pyfilter""" - res = db.query('SELECT * FROM pyfilter WHERE filter_id = ?;', filter_id) + res = db.query('SELECT * FROM pyfilter WHERE name = ?;', filter_name) if len(res) != 0: - db.query('UPDATE pyfilter SET active=1 WHERE filter_id = ?;', filter_id) + db.query('UPDATE pyfilter SET active=1 WHERE name = ?;', filter_name) await firewall.get(res[0]["service_id"]).update_filters() await refresh_frontend() return {'status': 'ok'} -@app.post('/pyfilters/{filter_id}/disable', response_model=StatusMessageModel) -async def pyfilter_disable(filter_id: int): +@app.post('/pyfilters/{filter_name}/disable', response_model=StatusMessageModel) +async def pyfilter_disable(filter_name: str): """Request the deactivation of a pyfilter""" - res = db.query('SELECT * FROM pyfilter WHERE filter_id = ?;', filter_id) + res = db.query('SELECT * FROM pyfilter WHERE name = ?;', filter_name) if len(res) != 0: - db.query('UPDATE pyfilter SET active=0 WHERE filter_id = ?;', filter_id) + db.query('UPDATE pyfilter SET active=0 WHERE name = ?;', filter_name) await firewall.get(res[0]["service_id"]).update_filters() await refresh_frontend() return {'status': 'ok'} @@ -293,8 +293,8 @@ async def add_new_service(form: ServiceAddForm): srv_id = None try: srv_id = gen_service_id() - db.query("INSERT INTO services (service_id ,name, port, status, proto, ip_int, fail_open) VALUES (?, ?, ?, ?, ?, ?, ?)", - srv_id, refactor_name(form.name), form.port, STATUS.STOP, form.proto, form.ip_int, form.fail_open) + db.query("INSERT INTO services (service_id ,name, port, status, proto, ip_int, fail_open, l4_proto) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + srv_id, refactor_name(form.name), form.port, STATUS.STOP, form.proto, form.ip_int, form.fail_open, convert_protocol_to_l4(form.proto)) except sqlite3.IntegrityError: raise HTTPException(status_code=400, detail="This type of service already exists") await firewall.reload() @@ -308,29 +308,41 @@ async def set_pyfilters(service_id: str, form: SetPyFilterForm): if len(service) == 0: raise HTTPException(status_code=400, detail="This service does not exists!") service = service[0] + service_id = service["service_id"] srv_proto = service["proto"] + try: - found_filters = get_filter_names(form.code, srv_proto) - except Exception as e: - raise HTTPException(status_code=400, detail=str(e)) + async with asyncio.timeout(8): + try: + found_filters = get_filter_names(form.code, srv_proto) + except Exception as e: + if DEBUG: + traceback.print_exc() + raise HTTPException(status_code=400, detail="Compile error: "+str(e)) + + # Remove filters that are not in the new code + existing_filters = db.query("SELECT name FROM pyfilter WHERE service_id = ?;", service_id) + existing_filters = [ele["name"] for ele in existing_filters] + for filter in existing_filters: + if filter not in found_filters: + db.query("DELETE FROM pyfilter WHERE name = ?;", filter) + + # Add filters that are in the new code but not in the database + for filter in found_filters: + if not db.query("SELECT 1 FROM pyfilter WHERE service_id = ? AND name = ?;", service_id, filter): + db.query("INSERT INTO pyfilter (name, service_id) VALUES (?, ?);", filter, service["service_id"]) + + # Eventually edited filters will be reloaded + os.makedirs("db/nfproxy_filters", exist_ok=True) + with open(f"db/nfproxy_filters/{service_id}.py", "w") as f: + f.write(form.code) + await firewall.get(service_id).update_filters() + await refresh_frontend() + except asyncio.TimeoutError: + if DEBUG: + traceback.print_exc() + raise HTTPException(status_code=400, detail="The operation took too long") - # Remove filters that are not in the new code - existing_filters = db.query("SELECT filter_id FROM pyfilter WHERE service_id = ?;", service_id) - for filter in existing_filters: - if filter["name"] not in found_filters: - db.query("DELETE FROM pyfilter WHERE filter_id = ?;", filter["filter_id"]) - - # Add filters that are in the new code but not in the database - for filter in found_filters: - if not db.query("SELECT 1 FROM pyfilter WHERE service_id = ? AND name = ?;", service_id, filter): - db.query("INSERT INTO pyfilter (name, service_id) VALUES (?, ?);", filter, service["service_id"]) - - # Eventually edited filters will be reloaded - os.makedirs("db/nfproxy_filters", exist_ok=True) - with open(f"db/nfproxy_filters/{service_id}.py", "w") as f: - f.write(form.code) - await firewall.get(service_id).update_filters() - await refresh_frontend() return {'status': 'ok'} @app.get('/services/{service_id}/pyfilters/code', response_class=PlainTextResponse) @@ -343,7 +355,3 @@ async def get_pyfilters(service_id: str): return f.read() except FileNotFoundError: return "" - -#TODO check all the APIs and add -# 1. API to change the python filter file (DONE) -# 2. a socketio mechanism to lock the previous feature \ No newline at end of file diff --git a/backend/utils/__init__.py b/backend/utils/__init__.py index 1d9c23a..c4fc13d 100644 --- a/backend/utils/__init__.py +++ b/backend/utils/__init__.py @@ -8,15 +8,22 @@ import nftables from socketio import AsyncServer from fastapi import Path from typing import Annotated +from functools import wraps +from pydantic import BaseModel, ValidationError +import traceback +from utils.models import StatusMessageModel +from typing import List LOCALHOST_IP = socket.gethostbyname(os.getenv("LOCALHOST_IP","127.0.0.1")) socketio:AsyncServer = None +sid_list:set = set() ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) ROUTERS_DIR = os.path.join(ROOT_DIR,"routers") ON_DOCKER = "DOCKER" in sys.argv DEBUG = "DEBUG" in sys.argv +NORELOAD = "NORELOAD" in sys.argv FIREGEX_PORT = int(os.getenv("PORT","4444")) JWT_ALGORITHM: str = "HS256" API_VERSION = "{{VERSION_PLACEHOLDER}}" if "{" not in "{{VERSION_PLACEHOLDER}}" else "0.0.0" @@ -153,4 +160,50 @@ class NFTableManager(Singleton): def raw_list(self): return self.cmd({"list": {"ruleset": None}})["nftables"] - +def _json_like(obj: BaseModel|List[BaseModel], unset=False, convert_keys:dict[str, str]=None, exclude:list[str]=None, mode:str="json"): + res = obj.model_dump(mode=mode, exclude_unset=not unset) + if convert_keys: + for from_k, to_k in convert_keys.items(): + if from_k in res: + res[to_k] = res.pop(from_k) + if exclude: + for ele in exclude: + if ele in res: + del res[ele] + return res + +def json_like(obj: BaseModel|List[BaseModel], unset=False, convert_keys:dict[str, str]=None, exclude:list[str]=None, mode:str="json") -> dict: + if isinstance(obj, list): + return [_json_like(ele, unset=unset, convert_keys=convert_keys, exclude=exclude, mode=mode) for ele in obj] + return _json_like(obj, unset=unset, convert_keys=convert_keys, exclude=exclude, mode=mode) + +def register_event(sio_server: AsyncServer, event_name: str, model: BaseModel, response_model: BaseModel|None = None): + def decorator(func): + @sio_server.on(event_name) # Automatically registers the event + @wraps(func) + async def wrapper(sid, data): + try: + # Parse and validate incoming data + parsed_data = model.model_validate(data) + except ValidationError: + return json_like(StatusMessageModel(status=f"Invalid {event_name} request")) + + # Call the original function with the parsed data + result = await func(sid, parsed_data) + # If a response model is provided, validate the output + if response_model: + try: + parsed_result = response_model.model_validate(result) + except ValidationError: + traceback.print_exc() + return json_like(StatusMessageModel(status=f"SERVER ERROR: Invalid {event_name} response")) + else: + parsed_result = result + # Emit the validated result + if parsed_result: + if isinstance(parsed_result, BaseModel): + return json_like(parsed_result) + return parsed_result + return wrapper + return decorator + diff --git a/backend/utils/loader.py b/backend/utils/loader.py index 435c8c2..5e5dd32 100644 --- a/backend/utils/loader.py +++ b/backend/utils/loader.py @@ -7,6 +7,7 @@ from starlette.responses import StreamingResponse from fastapi.responses import FileResponse from utils import DEBUG, ON_DOCKER, ROUTERS_DIR, list_files, run_func from utils.models import ResetRequest +import asyncio REACT_BUILD_DIR: str = "../frontend/build/" if not ON_DOCKER else "frontend/" REACT_HTML_PATH: str = os.path.join(REACT_BUILD_DIR,"index.html") @@ -87,12 +88,9 @@ def load_routers(app): if router.shutdown: shutdowns.append(router.shutdown) async def reset(reset_option:ResetRequest): - for func in resets: - await run_func(func, reset_option) + await asyncio.gather(*[run_func(func, reset_option) for func in resets]) async def startup(): - for func in startups: - await run_func(func) + await asyncio.gather(*[run_func(func) for func in startups]) async def shutdown(): - for func in shutdowns: - await run_func(func) + await asyncio.gather(*[run_func(func) for func in shutdowns]) return reset, startup, shutdown diff --git a/docs/FiregexInternals.png b/docs/FiregexInternals.png index 6a19f3c050822458de2d809d389823ca20875a02..7ecc3e037949abba71009a1fda7aba8b86affe31 100644 GIT binary patch delta 55646 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

5qFGo=ZU?UX72%9Qn~r1AB6rW}m|i6@%qScRQq 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

;d`Z2;m!df8md_o~S?N6}y4?8{y=A2ZlK+`E$ z=_(cZEsf0&GKGe*i-xk_iQ<4W&#Fh=JQR``E0OZmIdHSC&Pm=&Ja`4n*uAX86?aug zw#X1~0#YBQoU-)M3ZzWW^6X-jB6h4??n^RPx22V|Z?eisY1+k`9xQFi^s`+tl}2AH zauc@Nu`YOjj7U_Uo(Sdv|H|Ce#3k;-)&x_!E#nBC8h4kC2e*hj*nXsbuNO zaBMGQuJdx+m+o;cY1br;#7GA%8VgtieYHf<4y(*{j&&_hpGb!iHgi+n)tz{bn3=Mz zuWg6j4pN#IpTrbTT68;*EsnwSLzR|HpBD6qoZfC=4WPS+bHkUhBL!OBG@!b`Ay8$gfDx; z*J`~3>Aj{PWTc>JhwN{Z3WO+5C6Xxvd7U+ge9klBhMwN?LgL9NTDfcTi?A#g1k?r` zv|4??A6HMf#0&BGh?99loAjY~=j3+n3I$ikuTOA{zjJ7+OlkWhjIAaEu`q0`Gj3kn zOh-h(?PWFJjQK`oc|?SQu#|8-SBquIVqTq;$F6bG7@>anmc@yy`|?1e#BgZhgV!+|<@g@=QI><+d=)0I zgZ=saP-D1ARD`_EenHT74MK;OjiZ{kl{HT(?G-DC)10yHHXCgF(}b1%mDiaIl$0<= z-s#*{?!OI1ol62<1h5;%>}}>z1*_w}7#6N~wD3C_`=)$!mIvFQH0`)_;vI$V*%Cro z6j%OO&u&GX%_QK~yPqi1%Je5U=>s)O^B)1r|5`i0Kq^W_9&aarkf)p4 zt!ODcuV=8IuHMA9QL@e%G&LNeE#PrTm=*+=Q(=?ctoHD1b0jlZYsi0VpUXt)zWoY> zK|e683`^eb9v% z^Kd?dNIHUromVw2h~fqHB4j_JymKuPZ;Yf?W%=n~?Y!(bNZvc{oX{2(mCC z9<8)9E79LD*SadCN;r3ykX#m1yrOTZt7s*8W~Rb%PSzph$xL!m5<8F9m_%M>H~Hf; znR2X)vI(20Y7vL(sp(Jm{-Bcakra*}S7GFy2TVPwfZ7QbSGoCnMokha6hsJZKyM%G7WOXDMN zH@*lpYnUZL7{D+51g(L}68+??OkuX=7-w5?V!1uqWVv|u?UBP5V~NhyL)txyCQ2(* zo_>Sa+4e2k8$3LiQfUyESA9|WHk-?tHr*JVCqh?{oz}WczY{8(#MQS|+B4c*>Qj8l zfv{q*-W`x9(qC}NHK7)_Rkhy!{yUw47kh7>VVXqUHJHl6isDLy>vGN5tOF}JZ2dUN zql*N9u-Glwri#{Ot47;~biM_s}6 z#d|n@a<_TXk`^xiAKimiy^8jP-uCZJ#FGU|JKt=`1lxR*y2u>PB9@ zoqC^}FZ0%_QRLbcDlhIqPnP2rqtvlqJ}zY_f4a+z#1?)&@9g!^?`+$_F?`qx?|oN6 zq~3{n&qX$6q`Z0E9j&^n@MyL}8MRy;7HXaYmLbQb$fYG3=3B32McDu`9t`m%l)uDO zYO*P4YDX_5x<6M#x+g7ehqeaF0SkZja|qza z0#0aw<2iwYp+SP-4Zy%eeR(GFEGA3QAxF8$#6fnWJ67wh0twIOiQ*3}vDm>@3Hsn7 z)w!PSM^qxqLPM^J?B$?wsBP%l3C`rrG>5%4$DG|+`ij!d(@=!rsVasI#&v^G{zi-) zPE!IKo#xQ-rqOx~)ReJh6^Bkud7W<}Znix zt)-K7BQFUaMGkMn!mgUIZV$Wr^`ceVT-s*$V(?_e+!doM!wFl$Td^+?UM`1j_w1Dm zo)(-H*?pYkwm{X=d3LX@;iA0JRlU*6Y(ZDJH(kOB%D$oe+Fw=gnSC2)XXOtNw^|ss zGvlO=`Wc)9VS@;C|GE(Xl;kX_mkuWArL1!qw0-u~t;_WD z>|ItgiOHG>PVs?xt2&NFCQoFtZmB4N zFRPR+X3$F-E0%GFTo!)+uKf~$3GPvSz$w*|bxXUJDmTXb?aykUhsCydkX(=wt?QxI zb&*kCF_AJt_m2QZ0JHoZ{j(qlXO4nNVg~d!9f$`A(~I(X$$lC>@Lf3(-Ci2iuZqN< zQtd&Y0?uWaSAm>~v;lU^mL`nyGiZtAbqTjSS^lvUO?uOPV}u4^Fp_V;$z(oF7^V7V@jLL!urJx=jXl9kwZIKFsq+qN z&INGZ{CI~%{>Dcb*9oFm8u|TD#KYeJ-1ButD%X2Lio~%t z|%UCCr#W;5=iwx6&vOgdbqO@`Rq(37B`SdF8;&ob@AyBd_P2AyeS*$ zcj9!Zy9)67&Ge25?R&dqLu*+dB~F|@Pfk-L(8~m?-PnrnUTD0CwTK7KUzSw6v^yWwby3{BWqf`aYb(-uM_kjm3yk3X< z4dRxN@vr7)9dre~;Toc*D`R3^^IXqcSn>>v%S{&JKb`SX+KNjse zZ&k{1%`W(DZa~>8rT{crZq^CmqA%&wuMT-KS^zTyU4xyAZ-R4~o2!s5!QKSH9BGZoV%TniLU!I9h0sEt?=H zR~yIIHmk!*28O0s5xBX`L-wz(G-MR);YhzT5nw3AWo&}~B-9^gPy(W^G?2#a`L+)X zzZQ-m396)TEO0syg+t|bJB&cDcIqB+(gPB?AQ!x)*!j+f1HzH*YpY>@2OGU!Qqf1{xb|aIXLe_b(uU&rWxk12oNftot~gfl~7- zm3$pJjbbBqZH~&UZy!3lbv>i#gk159{5k8*^wf+zTJ#A4yBQ6o=0p0J+A7QZK3v(woJ;-|56I{1P4`0Y8^0PgGGu4J1J5xS4le>SwbXJJ>_FJ?| zVor{Gcx)`HhBEuauy$+JL)-z@LHz8#`;xnYcJnpf3~!w}Htjhc-b{x?`O zsJkn2X#}%RT7Kjqf0qP@(~CxI`XA8VHHU! z->BZTPD0OgvZF{ufTtCfE92vR6H2C)>lx3S=lPpU1WE_x7LoDEt9hxq$xfE^e3b~w zeJ$c$wVI7sbD=av;&<#j3#vk)8LhQ7Q}Qh%1rl}U0P)1ripgW2b=wRac!X6pc=<^s zRGPSHj~1{KfA+njU4Pp&v?Z^0&^OzK1>+~L|Mmt08e#HOrO>)|z(d^Ncw7n9csDf>FzgdL-gNUr4uh3WuW`;qOz z>_obtVyUI{a^@9V2E=o2~IF{cawWvlkrv#+E& z=|=X0+seaYVwg-Y#S;#*Tnp5oo_C5w=kI--a8M+@Kyt6wfJs~9YL->fMeMi=UZZcy zn~Eb~>+sv60GWBhfe&q%f;uoG4P0xt!HiK&P#tZQ#;AP|jV<<*OQQJM!0=pKip8pH zsFAQUlyu>i>@*C-d`VR_eL{pwe3QPexO_;l<4n@Aa zb)t2pgzla0Gu<-<9=mMh3~@beCD$Wh<#q?W%<$4cv)G!)6e7H>Y0lWv-1HHavo4XS z0N~otbpf^X*I_3!y`}DOe4UA_8AB%9%o}$b^e?9BM73aMaS;!l@h&w_91~z^`(}&7 zBn^yd#>Z+#y6f}XGGj#+XZzPIlS)LR1=rD?m!-3T12UFknzaRIv*QSfyf}uZzvf~> zq3)5Ao?hDqKm5zgdk0lgIv(bMteOWg?hpNb3t%oqr|M=! z??*e4$us-X&$uyx859`B6vCV*Ygs6ty);Rim|VkIgHT**>f(zT&FchuwXJ?QSd7)~3`^+$P<7D%50qlo+X! zxTQxIb;Vpu;C6fM!u=NYx&b4Yi68QdZeaN46;&L=R~~JPh>yoAo&}1lstDXe{Sl7i zb>GoeKCJG+r6wP)Pz{t!SuUDyS5O>DJ?M!2$vYHX&yUag@AM8`}_B#>HoC7CSvQCqN_I3BrAnl)Bm z0!~Ca9!fU6>MIcuAn@SU@Rg37)*&oRNs6xekR9J?jC2Y#tN$pz{+VHnR#XUP4GnF# z`uG6gpw)XY_;!Nh%){R^l{*l<4gF%{EdU;S2~NaO;&((zGo}JFT0I2*Auq9K&9I?h zTE)w^K3@o_M|o|Ju^c;C>3?RB>}HZxyZaJ*u+ z_Jo*kMXK`;XXrG+S+UeDb8YKwer*!7554OHP{<`$N%k7Gyl;Olr5nhZUUeL{4>23w zv3#MCR5roKYtWv)&0V7pbj}v;!_smX^I@#G@rOQ8^W>Am#cbep9&fX-$AopBdvZkboLrmw(eq6V{2b%~9dQ_bP9R603LyJ8TZwL!_T`28I&`AfJ#XHehb z@r{h~aTOnV!_USI%U`QnH41b*JZH39Gz#Qlz1hrcE7gy#*jZ$cX@V~D9zY`OS3eku zvpJZW%`nsOzqHgAHs)7*U2~Q_%x1bLW1vsF{g1D;s?_?+_CDgpBVYGvxd&-D3~M+g zhuF|LItD`_b*;g~Z3dX`y6N$LZDnkuUV8sL(`y%n$b9(2{50>!b;I{$hlpE8Rt(6B zlTA(TvvLQEAJbiTPjJW|X*-tTFw{R&a~f{gM&B^XosX4Am+?RP;^Fw(*>v%&jKSor ztpO&VCEaClGJWlaVSGJI)%bw60k=kd8frGD^k-VmQkQLF0@D^`uy-`1_BXUWdvm?5 z>xK`0Bz8Fx(CcQbhms6OuRk5xy0+JmeS%a79l~jN$9mL_YIjL8q|mAA^5$3f?sqjT zz2<@L>r*JM-5}1U8~L9AtOj=c^$_S9Uj}DkusZ2+NL>@!^=r_vrvuTQhq{4%pIS6y zQiggG0+<fN<7(BSK_yHA+5uG$z%! zPOmj5N6zcEpG1X-u9SuH!_Wy45!ZFy)-q&w?W7B;t`Fdn0m&A3{ylT~et;d>&vFnW zn^hcJxt`>y)Z~6!r*~WOwgjsW+{6tC>^#r|5*zFe<%I2(m@tm&^b* z;<`hq=%6&RCye~ENdk#B-R1%C@XKU zIKg6Sg)ZL$Ig9@Hn(N{n0M?UGXkwKF`SaAOO7LTmdU2FQ-Z}3BAFaS=Js+XN?a)DE zlhsf|L6)ZZKKMhrwE^da7GzQwDDGTF-hqug1t1)4%Oud9`VNg;j0H#kJ}O=S@9ED2 zh8`OOz}s|EM>SF#{bqXpSz zbZ4eq3@TZU%mk4v>h9~B?}lHu8LgQ8oDrkNI-BSitdgbp?pq$fv*-g!xAjkf9H0a~ z3mEd>`PD#y)M-&6S5PJ`G+(^8fy=KujE)^^CpD#MD!KqTB-)YpeU5i8F0f3aSzM(@ zD(wTG)#ZaBf^d)}cOA33Q-@b8ED}0A*=*U6N?ib^UY~+QSl0sUSahJ1r(TrV8ER{5 zi(4rP;|Sz(d;~)G1~EV=@GocNIfxCdo*2m=>?#csJ#>D3xSwuV$5@5%Fmr+^97OKi zy!I0#HPdsW+BiN9$FM>cAX-nJG+5*ov}f0I4#Zp>^~aI5Mi|U+0W*lv`S4wbZw3K^ zd{AGgH&3_jj5FM(-?EfqakhhCAEURc_3YJfAnA!RZ1{AiXUfWfekA#}Mv3?x;|%Nv z)igQVAv7pN8g%&Swu-E{v-@q3xh-h%d*;-d_C>EywoLfxY*koZQZe_4EcPUDx+6KN zQX-T(2_-F_on4NCZ~<#)df4MqmnA!Oo;A%CO`E-r7?}-C*PTdBG8G0k+d&$43s8{B zE!*4}G)%aK)p3^;8Oy;wF46yLDr_&EJ^n>|i@sP*qjQ$;4MYl4xhV7Jq3TN9-P1F@ z?>H9DZ*LOsOAXrP+oxz4`S@xN6S-MFbxA#Xbi>)YQPFrf>m8p7?)zJwVY`5=F?t&! zh|}wvUls6KG~jK2Q73!!+hYKcA&!YvS`|+T}X==grwZ)EEY1VBCYd`ouuMwn7whcMgIQ(uU93cgmz`ZNnhPwUab5!tIg{!s$qrk7Rn*?X`@l;DE%i zg>(=H_VWAS$_nM778!z9f<%q~=|#x~vLRyuk&L0Jdd?hbtFRSO zww=c|7=PqL(+oW}Np=oTk5u4^pVhYrGZ)#v3HtD!Mq#9%qq-jGF5u%0*=`RFCT1z> z)SN*s2nd)H<`Gq}QUin5=q`sD6Sh80TGP?7s%MF2hxoH~8@bN@TS-DAxFl|B^2Dj- zL6!m2!zdxooc;%92aW=W#qOPnBAgnbcvsWk`{n34)c&m=g*Y2A$k1qDaJ*78*_13zv0 zfCR+xfMYoF4#rpM7deP14M?2)(;!ZHM(A*0^gMRk{cnRHzbADr$TGy$qlnU;@rxfd z@k@81RfssI>F~LUO2ep?Wr^t0(G1W5Lf<8Z+89)XNLX?4U0bX~&2FX}w{5gD?eZJ$y9S%z zBUe?xRKs-MkR|u48+bh4Mm!`NYIm_tHbUlrJb?hNMhkK^+SHGJ<1wruSqpgz|EJep zKul_Kf4$JZeR{*Vs@!oXsm>fB34g{8`1=@-`c1zct}#^#Z;v)^dXQ4=1843-%k><-kt=bEdJYnC3=7R#2EP@txrCjf4Y^aH{mUSpD_A;*m_v8zBwuqu2lXZ|B5jZ0+fj$m561ThH)^9aSMhioFsMP>~1m zmo2K^Xj|%Gu%u`z?21r$^jqT zEU-_T<-yxrzqa7(i(pl(3l&cRNFQJlq5C_C>9=3?dU>I|QWVB7I%IZ?39DGzICm&ru3xIs$EA zD9#0dNGl|fM;2q6ww6Ab6&ot-zdjkH~y1a-W zj?2*hETpQ*@BA7Pn>qKM+=+9MLmlx}4bmYZIM-b@G2)DccW~|@!hI_?M3W-K7)uSBDJ3|5f>?!;D?&;X>!!1JlqGSTEkRYxp`+CN_l3Y9L zjLW8VY~7Q0&K++6Lv7>`M0RRb3Nl*5A6&IRhp%~|jP^u8<2jJgLR?qWe-EwyT$u}U zFSL;t%*A8R9(}{{!2%wpt_N<07QAuQx)nL)mEHJbXEP(0EoceBW>ni2D8V3r%wMjdm z`n@1KzT(a5>^{~?6t8NQ`4Fg52mpR8;Tts|uyMLip48gf+I>h;t7>L?)78oZB+}A; zMMLocw{3cj@DBZE8~ou+@~0KFzv2ZeR`QO_sCe!fC!KPhFy4r}2pBM#%OEnvaWlx* z==|Wq{BbYVV1L5SP`tSce9iCZ`d@<1KX0B9{fB_UjfGY&4x$SZFA_5^7_v=1y$KyR z(tt>AI|w;~3>V_%p6S3$y-f?bM~Po1(1($;9CGGgcb{lnRSB4BZjtE}(UZ6D7%b^t z=^tu0m4~QqhauL~7e$b-{z-cK?S1*q&~rA(K!;M7wj7x2 zCNw>K0UPjvM=;5Sn)D46=9H)f;IPf|!kGVx zo&M=O8lmx$5pJMs%Qcph!#YrAnXLc(d2~+NtrB@)lI{7KGJr=9<*L3ts;sE^L`Pz= zQR+JiP*TMTPhYo1`}+EJXDk{3HwF==TR_~~9|piXP54Qj{^K$e5GMo;>xGA)i3pHu zmn?w@+MgTdpFUmC1^-}&0UDp$Dz%Pr7|T1D~*d^#6?j-HQm~0~-;)!Aq{LizLnh ztsQpWj8S!Y5(S`OyG#HuVJrDwK)CV^DuM1_x&3>d`L!*00oFf8W*MQ0SFwN&mA_S~ ze+^dt^}yi}ovK|-68Pbkcp>E)FZmFVz;xuh3cN6^e8m=|T6{_XT=NXjaKW}rKb-va zuMA(nLw&*@<#HnmmjqvNf$bjr|JI+7gt(Bqv|YfD4f_X9{^Kf3KJW!vip5pH2sU2Z z2~@^s#Q<&gYe-k|+fOJbVx;E%oHzY##5*VVPP{oAUUj#7zSc;tnKK2#lV{?wB{jvowUMTZv4ru;*UXlyC z*bm{7|I1Vun15Vs0J<1v(3KTBfD?ck?TYVXUr@+Aa+Zl8Po z(97Objo+lVBiML3Yi)=66wspJ3S$O6A*yCY7xh}V3Vj0u-)_bwP~S)Z<>3JJLFfh7 zyORMk{qhFz0H1@@U@~%h82Gbn+iH z#ekQpARYon^IkbDTfz!v6a5LdIa2lo2+vx_Jcq2wdgT(v{l8|e7a)J(6d-8@6D)h8 z2_8ocW`nzDF?=gFHa2YWwy44qFL`o33N*XI-!nR`v0^u!>DPM z`CDM+pD!C43Eoa>)e@AknQkUUMcshi&CrqA0C9EBxC-k7_`*H_5|*#<|JT;{+`qUZ zoN7(X7CXG33hX6$E123lW}F9LY}?OU^^~`2tvl@q&J%TTg9#;cfyaM&o(YKZpN9R) z!$%BI?ssGU;~n$=%T4^@l@1&-`N;H5&`=$FjO8*&JpaQhJ)??KUO53&XjVuMX8{mz z$m+xqq6A2xM18T|=(o2$1Fh)yR8D=OaEQA(oL#Wz_i)BPUsVzYHeQ#ug*QBG+y23m z*0{WcT@@zwIQKQ zWd4&S{vQ{RF%cNp96Mh<>hrF}aJdr5U#|}tlek>}ahzNP>xTt#T)E}7|3B6*Y)!RF z7U(n!awUqtrv&bXOrGxs*cS3YK!A`5?aKcIA$Oze*&Wq?ewV+`hIB|SWh8?Mgekh@ zZviC<3c*CzLYEMS@3RBQXwI0K!sVKbl#~zE!ToO{9>7s36qkFe#Ec3V8Cix5rtQBH z>b(%%BTaZ*m!M_$0G%+%D}F_V8Sqdvt!Slku0Qk>zqca5D#Jt3it(iUoUD09e3H|H zkQ3)o-J9)}r@}EN4NLD0<1%Q)=eC^&z3?+F^&hc?OpX<19ZA>KowJ|Z|HBJX9r0(# zltU09%@n;^mAz2y?d=Sv&6ye?1iGmZ$IypXqcIoiMEI?6RS;pZ;{3OnO@V z&2FgNz*uW*;+$*ClVu_mqv@5Jww+8Y(h#yCeSJ{gINy0LWCYU6qH-LqQt-yOkO z@8|^%fR*@PesOYI5=6zJ&Gb=c49j?8OsBHC*0DJQGxm%M376xPH>y%LoNdOmkF}!? zc6tP<)*E~NOOI0v$nDTmi{u@N$R8gjM~(?7I0sl^A+Z7xDg@a7zw$KRdQcB)Rt0`X z6+6{hXkfh0>@FV?)&nuR~1KLp@w-2s6doG>$FWsvL zk$jG>yiOfjdGFM>`s@33ZwS+!Y<}1HKceTG+l)_tqh(Ib5>I3s5R@!jR})V&-IZkk zF4K#$2+S&SSLwjymOXh_pGePJ%xpC1V-UKLtvz57o~sGS8a#h~Ja1~e3K*3MX6qEy z?&ifA(%i97=6%b$&g$UCHxUovCLWg6{K|23eT@kVDH8Mm)JhSDNq~s`D}L}n8-mE) zX6pyV{}1=_`WU#l^?S)v=Z_HmV7NX1k0BWdhj-3DDMNkERlVzw_ze0G;;691Kh5^B z1o&WP0dhxmV`8K-S~W&3+3lu*vhwiRkotkJj}O#6aMQ}=jtVG2&}|p8Ra1-30w;OU z>~)a$0iE;E`JPNC)~9txwk2npJcU|6)>ye1p@DWa*YnK)x}K^WO-FzmOOc?WWCu4| z4U`!ebU-NjsqHVZ6RR9>1I<5_8IEv(KhpW%6}iq(?5ysdGS+r~SE zuKn#7Uip1{Jcyo;DT%j+#ruEursZd~8D$|{>yGJaah79}jOCgRl+n3< z%L*`D$JW#$h+NZIh{6?8?)t!`5m-T0T>DnIT9rKN+3dvL>c)G=Skzj+eov|rjM{nn)ZzB8 zT4fO~fTM<0w|%D-xa9w++6vZj6mX^d4hH}B36$&itPoMWS8_M}2CY@}ec-b^@l$(J z&1)y?bZ1BBuLdLQzn*^`D{2g)jeA{}g?Pcr_?JmV-0Uv5)}x;n8!~9+zyJ4wam4f9 zY|B=}9m816_arAjWWuGmg~5!XVS7UEOz--}#zXFAld~nOU7p1{1$3nMU!5;WqZgB$2oN3r7 z9*Q%x5Njk^Rp)+KD2XkdzVyFl295Fz8uci&IYBC_v`ozIne!og7#6-OQQRr%7|mLb zI`N1uw@1ivY*6xIw23EZPejH0-GCHY=GaXDe@1Hdd^Ko7SM-Y!zitX~?bP!Uj$1_q z5>_vU6k2h}8(CLpjYq4=->U|&IZnOC z^9C6fX?K}5O9PjN<2VRKXMHhBuR+@5d-9Pz5m37Uk{Dt;;o~YV@6-0v)-!K=4-c+9 zuUL@oyxsMy^<;yPeo+KQC0buURd8z8pGa4j?%-T;inRXzV_5&?1&|SEf~7FbBTM@; zBZh22BH)wac`*3zkl_D?It9R3R0JzaBP}0mcbg!hdtv11W-k6<=XNs(WspIGGdmp=LB{&sW;+1t^y~66P2oarb^xf!4Qtk{b6LG%O z61b)KzN&yo>VC3|AzfGPT>dU?UxnI3^0$80xf&X0(}r)|$z#K9dT3#0Hi{SWtiNII zB18|8^07MWHzN(LVt+fSdnYT!oTrnl_xS@`BuQ3+RIi_70S zD9E05dA}xzLu+I`tT9=s*wbQeZwdDv8M7l+#(_F_M!q_Qz|W75+K0ccM_ITp zwtAL$3e%U#Wf~u5HMlmTW|#~m!QLt+3>i$X@Oix!T<*(>zlj;{7nSGB_Lsox%Gm1f z?wA)YgzVEzht+~LFjm@?xd*mwm$o(dfeW%<0VPqEP%!?rQb&mHMZt$yhj&(PRv3;m zw6wfgKBTx!e|b70Fi?7Z;`O`ka;1kGQc$;s+M-e%z!uuMbNVwyY~zfn-UZDhEqH;>_EV?Q^&FPNKn;8vq`x|95MAvMxCvyU@m zqA6oJdm-A|S-2DDw(mSxy`8Uflh2bQ%v(sHL&EBJ3;r*E{D$pZ$9QCTfS42P+gFuo zcwUqV?ebRDlM@HAH>wQJL|^wy+x8NFLzAHV9yC}cw)b5mrM0tDB1vUY(mPQaUo)Ans zRZt(|bctPKJ^K{hdZ2`QwT>Y7)cGGMy;Fz3kSudbO}-E%y(^_OAUAe~9NRuRHweYTfWux1G@vGZ9vFjkdq(w!`4$!JxgH0fj~ zU34O{FMcMp3NLPmRBJxTU$M@=Y=b!W`K@<<%xK88Mxw??p*(>{HK~S+_FDJp5r-NV zac)?STY=y(wLu&{5=f&*(U zkSGvSgIQ=>?_Mmoylzf|GohF^^QL5dY2A&CU8V4@%Bpk~)6}sc0mpRxL*e@(fDl6L zlsuJu(-(MC2~HKug&TG^%@zNYBy!MX-97b<)TPGq<_bVlj3SdA=QOmxENN+r=n`1JR^{n9j!-MO&j^W_>ujLk^I^J#^-%_aj>5*5yB#9vBzs!d&=D*9W0mjDVI6n z`LDH!&F`5Ml3;0LmnXq${l|c9^b{FjV?^86zX{htO1B84`Mo^r0calVRH#3Cn^zB8m+nLOl()}V5jU@<0D~Ed@f2SPoyKe#-n+#jvwKt z)_MJpbaIsGhBG=CJxwjR?p9kjYaArB%i)rQwm{_3Wzsj52WF>=#@>@~chV?W>=R-~ zbfi+xxTzXC7IxmcOSxq~BSc4~BErKoI#?Zx8wu`r&BC`2=OR z?=O+wAQL$-)fUu((YV&~M`4pkuQ|ti_H_2e6q2K*_G{tb2r%HYvnn(5sLI~bi*A_N zmrP=`v6ALPC1&IZ$fCGFIRMDJ1*a)w-SW}lQ?p#prHG4L-F+T1(-~;aZXyB0rJ+42 z*&-VJ{5{xbl(MG)tXbMZ@@&gb$j*;C+bAN~KFSlPi9v;DZx8~6 z=RUw6?@M3KFi$tb_lDbxExx?Oo1n=sRJ$W*!?O~!u-A$ZkY7l!tBRD%ogzQkO}BXd zTfts|cZOD!%ZX&IdPc`5&D=+FGe^I?4YtPiludY@UWOT=Jfu@vRb=~q3oi<(Q>(Y|N6Se0XQVtM=>;KP+=tI; zxYfwMg$?T={kScKTM||BeN&ZHS6aR|Na(+$sBYD={hEe1e;6DN@61ETjG&2;q+}x^ zMeA9QKazRFZxE$BcSGHmWk^xf&RuUrpq`mPp7prETad@?ZNk^o3JKq!LyPbjUFz$A z>StPMxiamUS>Yp0u|8r9A69?qdh`;NaTDK-dlMHqVUEf4 z&GbLh$q>%{Dt*7eo9?qUrZ@lLDgFwLD#E&35{uIm=}{^HE@FaUzDu-d=cqGQjFyZBe{)Vfj;zGxvK;muDEZktqN3_nc-k6B z6!AWuyEQY)b=H-1SuPX(o_ne+)}Z`w;bQmw@E^-U{nxS_vMAPQa62!ct_pu=?wd#> zNp3AaE3!8B?TF*9j%&&0@-*p^reE3vIG6(n6LL)>T#fBFyx9uAPE1{D#!GYpe4+Fn z_w!f3R|ArURyv*uG_qg61siLXnR?TNW!@hBa_k6O#3Kevg7ARg)B7qjL*pVLQX11~ zg5KP_KCJhtF+KrD`9`N*{%9sI=RC%zbDvhIBCYIBW{T=+ZNKF}&y~7fO_I2fCgnKCDUc8OguLrwzGCWGyt>Hkt`7 zck#D6RrmGlns*bGJfz2$v-Km-YI#-NfP(V33RpqhT#8=?mg;Z~Rc_Fx7R&1#2Vsgj z!3>KXwp%@Kp-T=hJj~t+BqpP50W^XIJ&_@@R>Yv{Ynw^|u(3M80+ui@&i}GS(FDjY zHi-3iPBKD}`BjRlrh#UeK6nUeK4)&YGK1;-@qzsw^y@D*O$7*4>)EDND&|*mz zVr=thLj#`#t4+|_t)IL})lk?EuQBp-6pA00SM0RK&GaSXoYCIa+M8x+LF&ses}o^? z_uI6H*>HgEMJ>Wa9ZL>)S3F3GW?xdi;XFQ)=l zHQVseO{Pw~9=#+&Db+tw(In~g4~uyIwYZgZ7k8~~SjZFJcg%fKQ9YKSXv2}r?K0Du zCw%YMO_OWkFigxYk4Ik2Y+f>xfNp zVpZ=!ZK=DULEYvl(l$draj-NbUeFmG=%E*g6(aTdj|ba*Yrh$D-%0;oV)$w_ltPN* z{d|KiqbEXMjHVmL9e&(Ad2^xdN_hd1ap3!4bgqZ4T6?f~zi6n=$jN0R%BGUV`u@W$$YE;URY$Co|3}w8A+5E9Tx`!lq!;mgC*$&6w&+#-_kPdv!lB= zvu=7&qn}`?Eo*Ps0>Mj5S_>jbxBEY8N|L%4nA)2#M=6+H2DE&PHKJR|@%polp5l$~ z)B>n8Y?0_ifldzf5iq&DytTU#AT8)4xl9|OLRJ)H zV*1L%ztucHAn9FMNqm1ly<>0O3@uZKZaB=azu>Cb9@DAKQkw&#jCB8DYv8jS};}!9&vX3?|AqRJ_#rD!5z>^@RmFdJU;@Ea^yT6BEA4 zaLh^4OP6TEeVoHcKtK3#@G?wDNZX>kHbl$bKtUp;=kjo)RB|gpuUSTiP9T8l<_%}S zK6ycC@Y)MeW6j>(p_onk!z^QSX`gH_LLS2QSzuD^YKJ zU8wMpSWbyJxQq>6TOggeoEtc+p4W%EF+5qR*SoPTh$-toZ!VnV#nKnEP!BTW$%Q^` zIx!*lqe)mHABnsactIx*9hQ?F=cX5ke$ZvB5(Xt?{?#P}3&%b++J0*aoawwo{)Dx* zip0q6wvf-6A-ZALiQPz3mp@VddwJvMf=!3;%a}M)XXHQH>Rv0{X2Mk1JHu#f^Li`w zU+NTFt`Wj<8>an3=LJHVe^duE@GVhpr_>H=bu)v8X5e|GamfkqV)FNd_&s|)KLz2Y zx=k17I-NYmHSh$?oS@%$qpqrAcl~PV3%5|VVkJz z{G?7eM%;_BhBAK(t-JqK2Zz6;O+gS$i?aOMx`BUmsNr7Y>4_2VM3f0FkVjEBa5Wn^ z*E+a}#ixBy>K&#HUEdb$tDQ?~-tgzYy^MEFQd^EgnwBrmI&W1GnyGA_nCm<6!-Z`B zJz#txYDRqFDz9qk1AAkqHXeTcgZ}A4^NAqgtiCU`GO*-9363#7y%ZX)JI&C+Ho^HL zqVHgc>=X4(O{%iYExC1VcEM0F28Uu{lWz$Xx7})8>U6|!y3P>yO?#fb*WWhg>XEj$ ziK9#A54!~-jvsXnFH*qcv2&AK$n#QiJHz?7s$D71nL#y7rt z$DMlbD23OO2v5tG6={lRsJ^|MsNs|}x@;w9YN7CS`OSu189wZAl~!G8?^<~&2O?v% zo@wPnFy0Jg(v42Fh`Q%rTl-oqh1_4|;ZYXalUCZ)Z05)0UBp!zobt9z1lVP01AMxM zX~hbOQj1+G%Q*iiX^8Cl;Fjdj)19nSPr$pl609pKZG}Efn>p9^f2kQoKkxd!FQ}@u z*}i|cch%J+*0^`-e|pLZEyz=vkSuJ{T%SKJ--XayJb{p|Pr~h1>?&uP`S;ctzlzL$ z{4n^^OiN}Nd#^*U@RQMyDG~srx$75Vd9`FAL&`zzogm)x@bfa3nC^7`0z$V^OI4GD z8V|OeDT#o*^B>k;FMNoO_qK+9p?Yb0t%9-0#>Qat%iNwTNALf`-dl!6xpj}jf*>WK zhzdv;fV6^uG%5|!AuZA^NJtG1)}b4uk!C1~plt7u^N1F0p6DbkDZ+%_aatuyyb@KW^?t(c-c%qNhG(6p!2 zKx)WcOnL08uLQ7oB1x-gcbufcah{|cb1i4fbw_dK4()1w3_33>M90B=!^BxlqpS4l z@KE3Sx=3)wgpnsOEh;-=#g{bO?PAH}J&O_Z-Hn zdTwK6=!DB>+epasBkT@l<(~S_O#3FmOX+e@vO0Dw@!p;!Gy8@Y7A9H^pU%ZZL}IXq60xCR1jsasKEV6r0(_^X@hqOkEwwK6a3 zZ{(P`Zx6LS%iE-Oa>puSt5B}8@3=N&_GLzsXAq4?jljxz+xVp4B^sE|Kn}7!Nh4cz z0{T;gjabMX-(|zXW^<(qR(WoW@oj&|vbM>&mH5Kj2Iq76%_~Vby3`S)o}bIgqUWlg zWrb)kWL3v*E+q}lRr)|@sIIYT7X;SaUmRLN!5A30(RNcyE9JA+-t_!jnimHv2kP{7 z!poSNA9V{~tY!#e?ag9QygafP?)>aKrMzP}4Wq0Ixaf;DWyWSymuCh;%a zOGmEI%b@4MaX7b+W~+eJqMH=i%u;ARgCXbh_2Rt&)&){fokNtF5fjBSE@o&ws7&%< zBJm^b%$x%nFHb!@9=~DbNWWcMU=5F^ zi8b&{y;}DW#fwN$aavC};UB;v(C80xz}PcI3T`ZU%refh9P-z7P=Fd~67viS%AaGv zA907?D`($EcEOs^ge#6N?Vn-`O^_yhry);G#vdhdO-CfUG+rZ36v@vJ`w8Q zm2JIpB+@mXs-iFmqH)ya>>w;-^Gd6xPPb^=y0}k4nnuAX-B+LL22ZzzM+uLS7i|od z8Zx;bd<4p&I5D9%y0qCDQbMMt*;4vWyvKdPHRE9cMsRT zLy<2dST*j#?W33anNQRr;k1`p(OCsXd3;ljK`|)Xo}Vu1`l_;q-SYdwfX*Nrs@Wp; z!Q{I{)2H~fFXrel-DVaaxv@#nTk*Qf`*;J$;SO4hd?z(b5cZk6_bNc=oF_~P< zbMyIlS?awPSBB-X)M;8wyp_mnyJWIZ#vEO*WBG0EM(2`8@6aP=+e0xmpZthc98vkC zZfWd;@GZ?LR$Yf>cQ!(^xs0wsOH>gAH19b5=jI*YG)xu`dIvO0FI#5O97aywc!6F$ zIV6^WkkPq*=AaAd{YXx8%=_Fy34V0dqep6ysgH1piOW9J8{Vs@k)o__w7wj&Gp>=$qQP1RTA_O~?)(Qra{kc}glNVjeT08~PDIzZs>ha{u5samy79{< zMuvtjMY~B2+#D`=E{!P`mn<8hI6K(Gtti(rDlR{~=b35&-vm{OO;NA~)>i?(1$vr=nq;|EJD3?n3mZ521Sy}}n;&nm<=}|s*-Y97 zbr-u>aTPGZ!zJts1}rq}XrXoJu4K!ApHSUxrtE}$*s}A_wG+c&IHZ|r>*AR)_WZbO z0wf0yx60REKj&_M6VVw8%|AZEW($HH|=>ty|xl!)Jh&O7jKatUm9A@ zRVm)bofPjAOv|*o|0#o-XJxo)_ocG;RcYjlHNU04dj!T?jmEu&`l8$8Q6Qm6 zzwcz~K8rS}HyVC8*u4z(Jh*g0Q%WG-b3OmD1b>PN3*j+mTo)5Ox1H5)-Dd`LM$J}@ zZ(N)<5p_k-OXXy6#`5?8rFpJf!N`6tGg_bEbLa?>btFe&xgH|-vQxLCXLIO9Pg@hd z5xeOxf@>Q-K7@gOeZ4Fm23{LUJf;)$&^bNCx$SL5chp-e2xIH9m%c78q;9Kqn(7mx zadWfCj;x)bGqAdgCL6Q{8?BEED98UVOK|uUI*ALXO0e$BL6izF=Y$%jg5jd6d|p^) zp<#xp_nt_AsTV$O=sOA(bt;~jb>$>fZrJ8>v9zA|_lkvA+8-Q+#>P_jNYyJvC}k2=s~Mg&cBXGw@Pc&bm8rCelfqwfVeP3 zts_UOw9xV_$tz=?B65G)0eLw~+%q>aGAa%OgNV3qC1=b9C*F?9Sk!KD=SG^{+!GmW zKXQbxNlx;Hh6Fliq7UkbmsO|bSY-@Vss%fVAuk*;CBTRiMWnz)-j+da05n7AvLtxbTKwJY>urR_u9v=lQR z58ECSvY5_S3#oPAn36!esOR4lIeWjP;o@Q*%6kFS`sAGz|JjselVeHmszkC# zKe(H~!^@M(;K*=G;$Q`?@-*|h727eg+l241O;gD@sz8&xABef3IW&Y+VwkE>)7cya6 z@z0jHn&>_tNkaoxlP|5Gad@@3@mSB*V8`MixX`Oy)w6xxlWA?3?ztR>&bHa%fn&}& z%pAF$sLyEuM7~YjZJa@SVQF9486H$wTDtcl^DH#SeX)AqYyV;Yq>r=c0Wvq2fnZo> zZ|0$9Ne*?f&fc4i7b7yy2NnpD`skPUm!>AF+VAdNR2eLDxAC(lAM;#X^Z&A*<5JBy zma4tKB02-^(R@FgJA6_zNGW@)KFsZQppc>3Pu zBe;@hn+8PK?nx>w(B0tjSdOj_KF9aF9ctL_-7v(Bfe?wEue3B61Q+7H?P;k$V}#i` zt~)F{RZh%!vXv6h7KrU07lf}GLwZx;?9($2`|J@uiJXi4R4-iV;!q<+)yGkS62Z$Z zkE}c=-o{K%4UO+i`JTB=Gu!N`eSAIs*`C9b8u2Nc1F?aI3LA#?_~e~?fi+iWC?AYV zWC$Z`zKB_kr9Z7qjuX(f_rj z9#qZjGGZSTq4}~-6(>$1tG4WMu+Q?IJInZ)*Yyp_gYFId+!<68LIrJ4x1#z9nM;+O zrnixwlvT7NHT4{wfI8N?@f7sH$U1sMn$G;e(e|fO2Yw zb%Txw74I;q!jlP3{$4*9*@vQVlMTmiCennVsG(31lw z?1@rnV?%43!c1>+my!uiS+K+!{>FkjOIdT+jSiRQO{E``q#C!yFHF_N|9<8p!s+?5{;59`Db}``({Y z=Yp%7BP_%au}mi1o+?hov~jbJ5189(8EWR;at`Wqv}kJZE6m(b+v2;knvXtfjg#4F^E?2@q~{|(HBf|^<##hMmIfN>{*rdZQi<8 zxhy?-y4F>mm1|hP2is0lYUZK3SrE4Ex!j|hv^yo?6JA6)*YLQ zPo#_6R9`tpvWua_fNv)&c!A82ZZisvQW5ZV_*o-R$T~t#oVgZ}s283f|IVgePn&tJ zPGfsK!oKSqfwPB3oT-eG`FIjdpdaTet2VXRiut$?w&Qkkhe4xV zO>QZ${aE-*nhkNM7i0{3!i;<5N1~&m75wB?Vj`naK3yT?;BGp0G=lF9*5^lX<-jpb z)HPk=L%x-$0;)tlMxaCNgsk^hkMQj+|@BGkR0+7q$ajX?H5bcw zC`Wy+yS3qMMpl*VG3)KS9y^omu~jRLYgCq-dxm;(cJ3W(R*S&TshAw@`%|ya3A!s| z$cZ!d?XBGiOnfd!KX0^Cn!n&tR;eMxACi!s^nTLH(AKfOiN~U!*Q((4)^|4oS_STM z!d4I$wZN@n5PhHWIr-fxL9MYipPBJ3ko`s=`wcP%di6PPt5+|UGx)sJv6a)wN!V%c zV7msd9(CN6%FHj#Q&e)FPNhj+J~Hr)+lpXvU&DvD=1qxz-+%ICg(;&n4zL5~qb zS!SUW6G=Amo-cRVQqtJJK+hH4Q+j*c9aRSDsr05qEJhA3PB;48E*HgJr|T;Z8ufH% zK#cbZ+L#U3xbzg+nOOCwzRc4t*MS(+$<@Uc>7M4$Jn$`KkSw+lSkLtcn^3RR=X>ZT zxc8|Oa@%{d@7bG^nk9bI*V-e^Y>3Saksh(vZJy?Ja=$U|MWA8(RrVl=ZhqI=2V zKK2{D-jk6zLzy}Gm97!(dZkKrNwtdo8~cxA=RIC}!aK*eqIk(xR+KZ86WA_uL@U|F z<;3Y&C(@d&gu{6pJJoayQV!76Gx?~6y%FWW&F8bdwKd4@<(Hn?O`4oBQVG}1u72_R zbH&ml2~mpqF){Tdk>35I3Y&L@;Z;xBksmJeMr-Y2not~U<*MWh;~(o#k#}vGaK||- zZx5X5$e(8I_`l%6MG6S7fjea$==NU5EOFo3=BCJxIge%F;<7cngoyMJsL(~=2G(h- z0_s0ks+QhDRzBBRs;C@q!TM^&JUkslw=09 zhP-u@3bBLkuauR(4?ExzodHhbGWTKuIys_i_V(uLrc{>J^7PEQ1A2s>?jW;fea~XQ zwoWzxG(K>gFugztQ^lc)Q1B;{TyW)+p0iPOmNBZJ2(G)9EIW~TKwrtTv?Drp^Z?`L zvnL&0pn;R}`pfwyw`dZdk^WWn{)UySSnEW7*rl~kR0Q$|^me{xNUjdZ z-rcy|6kqj=&#Gwaz6;(D?=OX(@IFdo)94vbOpJb8)bzEOdt7Y|oZneUohOXnXVvkqrw6$nKkBJVwmTZ#M&u4akbKMpR z=5Fk_-cpX}MbldroXLrZ=?oEaUnqqJY2n~sHZAdbR4p!HKehWNH)D$^DVNrotH^|v)K!i zdP%dAsgJK{e|9gsI=^W3X$V9=zp{#6=nc8V(A`k>IbS{@`6+K)9F~zu(Exk$(Zv+i zkj{>2E0;-)jk#%BX4(DBlZ8W_ZcPof)1UV3(yF!G4|*^pGY#lDf*r|$j5!9(>l5K4 z9KxS!P;GBg)hgE;Sb3}lR{Lu%(NTkM9f^wdPN!Mtc8Q|Hks zfiGP!Pe9H{!w6(9vSfeW8?}e>UJMa4vuV$`l>y@K*?ni3px<)HxeUAFx`fw6v(ZIv^{~vYg^;rf>&7H&03o zY0<*|s&|nFy+{AvcCpW~O-XL#RSBVT2Wy4K&ksH{>#QNQ1N#5?w4(=m-6wpDJR~iA zS+^!bk;~@`do1G8xVTlTV5u!q#TguFDm%*M=x;SY)OmHyh?LY5t^v&{a!WevAlJ>u z?Y(58^UBts&r>7gUZO}w&g~%2Q1Z5Njb;TBs5_7nNvr0N1ZIs&&|-?tAcP)OBgK z1HSM0F&Ev^mAly@`ce7QyPQuEpAyT?ZdkGrWQ{^D;82fDuB0L146Q_^1h|6cc|_A6 zjs%l^K2G0vBaW{#JR_IC?Kx$PCzL~bymO$y<(A<6E;_|#>&>bQvHQIqIu)jA96Fkp zmq(^$3kx`>pF9?N;ZS~W&mi4bX$~oPL#t4oDW4)X4XbGTLZ#7zj_dCMAwEQxmvp^Vxmq(tFXa>CH{OA6B{f*uGUSW-u2%jxscu zpWA1#hK!8Rs#qbMT0pBnN+;;g7So#&YcYezF6wO!2`UJcHis&1l23l}BaDpp<7nZI zV0C9&tIy-)F|o3mHYU}d;YXbp<`dV~o!JO$)LHHuN1G13&dU*&a(B-;6`dCfkN1f* z!=Ezq?jG$MJI?;YboO9xWyjS$EDMq#2GT8GAJZ6qsPAu>E$AO@ZQAIss@XYg-0cE8H&lgtgtejE3Nwqrsr>NpEl$dju z1daK1~EJP%&E3Y zu3b7)xwh%^VsW0Ko-(V>NJP27XEAJ^3+|B|N|`lEmiqV_auk&UCKa~ggtGl1cy}pEd ziD2{&>V(d;99NPm#B8CHqTJcnrr{*3TQR#6O@*xlyevED`hXpV1eyi>N6r$BB=hsD zul=M3-s0Qqzn6wT19hOaVoy1=JehD3?^Ccoqz}(Eu@E>xU-DWOGZwQIc54UjLT9=^ zN$T`@FM_R;fe`=c9LbXQrqzqY^Jy#B6?Mxkrw6?jOOj`buJZ1A`p`iF^g?#Xylp*Q zwT`;)70M_q&O+mi+G9SN_`F(i^jO$-VO$J~S61P>$YNT%*{@H%kL-I*ytGTTl{;Gk zEo{ahQ5Yx9T6CPiBxLZ-f1AIb5gd9AU`sA7al3B)O5=^R*{Uk>aF7hJ z@!YQ&NpB-t?%+XeyJvFTsg>+p@ky^7*Qn7^@}4yxQq#S+lIGKgndqy($bKy7W_^|f zqb&US#}z>GY!pAN~Xun<5PL=Ab!iKH&k@D z=c!bN)97Zh2gb3(zV3BxWng!~Z1qfy=*){fp{h0RxQfzuM7ndLOlRODT#MO>KI* z!d$&>6f=H?&A>L^oO5QtgzHoC_?4X#v1OJ?m5Aw-h?xW&ne8rL7Pajl)iXk;GTv&n zkqk(R`i(LRUw7$AB52z@+Qm;9oqJdQMmMunSa07bg3l#E&4V&cSrZ0hJ=hb94A4Rg5{i~lM5`{hCWK+KvcKo zmCa6N@T}*A=9DDDWc?~-rAOKAgFNfH0Hx8}&(786(iK9Kk`Y=3?i$I`v#1K0736?R ze)rx+Ft-@QjoQhS9MQJ%^lM7)6WuNWRm}#a_ISMVIJkAe(5v_Cc;J)9Om2NvZSlRF zWe3!UB11RL2K*G~>ivhCyE`ye4+xqACh9Qlorx>{EA$_MnqqZECKnv|=3!XhJVy@n zE&Ar0D`0)|?ct$oxUATsy1GFv^?FuswLamPeSe$ zm?)1?3!sI?E&E||58OZRBDS-X7A_nJ?2)(|Px_d8e|$#FhaRfT+TE-Wm$jeDT#LD? z+&pb$p*f#M8xCUY&GD))kd_wvJI4F#Ms<3p^9@vAj`4k!ib8k2v1g38K}dC`=Bi-s zyhJ4NFy2vNs-uD)@&d_j`G{0pp;;uk(}F*;Y0*t0nQj^?zA~e0);p^vxc}_4>kCv` z^-y;7%E<)ohYZ=dafR12o+t2S=dRopql9R%D2ZYctH?IiX9wvN8CyJ2xH?s1UNsQy zgg(7au?r^~NB2*@+TzL=D8$U0eK2 zyNPiEIa2hcM$e6=FMIb26=L)x@3XyW08JHt);xc{$8+g6;P@U(*1#jUMBrv>)LoU< z?=JTaFud{zx6a@bvYKC2du1H45-G@5+Y4`@_a`CfH+01u;OZj7;$&pq^A^76$;R|i z;P7g~!Xa$8gSKNYiOw~OK)F_)#>@T$8FXto_Uz_ zzW>^Ez7Cg=t(JQ7*N`cvYGERh=*tJ5`UpSg2ba!9R!{~kc?tPW^=ngBdMTTV!8y1? z&4f_&`$Eef#_6g9^qrgpFn9L!OYcP-uT-yP=*8lm}3=&QvvSn=4mstG^04(`*uwNX19 zB5Wle!o$w@b~(? zdjnHLyza@qHpozi*6&d7k`urmaM;R4FYqm5qzcC@7C--K==NV~FI&Yx;t9 zXlUkKstfy!my52(r``g0_DbUk!D6Er!}?j`L59w_OF|FfNMS$NO@jXS*Q>*J=USid z${c(dC){2QEZoD~IaBW~MNoZjbI>j%(IstTI49S=##J4fusv#*s@w-dsgFNaA0wlm zu^T^T;fq6k=6LZ9nk-XHrLg#f$wlEXb1KPV2FzHod)aX@Snbkqj^FMTZX+apxrTpP zWRB{}I~I)hz}3Wb_3Crf+r~*829-l1AxQ|iDaFc_gcYYgNEl^|ynNdXIa(1kbET4= z)r2N93&uJ%5TrTJLOaCu9ZF!vI>sH^?QRpSNJO=_prxm26@ z5Lgy^bBGVcvDMs zk6N#R_CTk3BFmQQB1dGmQD-?{?RL$}Ovv*A*sME7p-U-$cb3V9zctjDA=?Ed-Uber z9KRsZTB|ZK0_*XsvPas30+AuhoZ;xdo+Q z7FU?dZz`zwM&fao4?QJr8&URb*Ji{h>x?dzi}JUP!B(9F*XM(s8mJ9!$BS7mv{~iO zr1`Z?kHp$!WLGHCWD8ZhS#kMPrerxIS=AKC&u(@Xu5G;7HXk@9#V2WxQQ~VR-}|-S)oi zSTjy7R^b|QBzu+Lf#_Fg$+xwozl6C<6uLUKRqmzBrQPok7w1*2i>cqPX!nq`)6+*}(e8uR3 z4zn+uwRYvNyXplX>^AGmL@IWAW^I39j>&38Co$D^EhUpoqn>9DQ^q(?wz4})9=JMT zq^Rb`qEQZzodA)m=E1tP!m%w$&Cc(T%QIW!=&|UNR68}>L%8l1Y+Ou02+g0YmT#gv;Zv*_{*1XyM}8>cXC6RVT%s zw^<9go!GoP6CO1r!L?&2Ac)ECWIleX`ewtx)#SOBPvz!vv1OmcQM${*>WLmMpZ!Fq zmu`$r=5Eh)tBYy=9wXDJ#B0n_+jES0){Lt! zBpbfia&wh)2f3o`R+9Ys%j=eV4K^{&Yvjof62JU&XF4nshJ&LAHmlN8;G_W$o9DiA zdFGHM8TUZ0En{5RqKPma28`7gq<;L3+I08T;LoI~0=PI(U+Ms}eiq)NoS%)##+G@k z>ZT-wubj#&xZC0qc-Nv_nQ!guCqN^qMyW>M5iteGOXP^{ z$6mq~8EBDWuCa+~SndklgPEP)Ej2#9ro0)Nn1Z3pGa&Dc3F#OgPLbU!jNDXqJh_=G5-qHL)W4r(VgmLa=2W*(O<59-a2Ct10;N_e07ik01L zo7L$lv?y5Wzo=d1YB`zwF8!#w`dnUwa-Gh38{$4zbx5ef>T3)hO3GL6g2Avr6l6?K zo`EXGdIT1>$eBBErX`&^ce*#H%}l{h=tQg6y(NJ@dry}kxj|db+Ul}!SI!5vX*-o{ zJ|&8A@SBad4K6UjG7Sxm!nu?`Y?0*kl3&XSHgL7(+H)Pbv6Fp76Sz^3j(*teyP>w} z-i3e~mt$Lb7FRaykgUb4PU}J@U4^h=Vq+f zuv`|~BtN}d?JV%9u-!!JQzE~6R2$gSamZ={-NjJYSC8reHEBuuy4mxQYf@gf7J?qN zmPEF3D~H4sPlj7tnVRxPa}m^}SZDVIk*#SE_GBNU{8ZE{i7Qx8O){J9z+ExrG3;2C zg1+j4i{{Fs9HXx&^b+Gk5Py+`;SVmrQ9_Vct(umGm1Q(* z{=bFY=Yid^&G6Y;;YRV$6IR?RS4@iXc1+E0o*Q0rjlJd|@Sa3g3g2lrB{-?oGc)4W zimuVKmACbYDilp5LYg!pJmhbt3{tYzwsCEU^524EAD>G{rn?HO=I83~-Z2$3(DoTk zs&yE#9LY`SBGF|<+@FvqB@GI=iikI{*=v`6Gt~jntTxOSzG0iY-jtwxhH#})pP%am zn@yef;O6XaP#LR=(%00^0V-oVVnSa;es3YPf%Th{Ruc^_hGK7jO#0Z6x>+*Qb%|ct zhX%@eLK`mDMNjtAo}7IDs)eh^YSq{|-f~ z@b!$2$e44!oHO+C5gXw?>7@p))M+?Es=0cFwM2cokh__WR+byxmopy?(%;Ei&D)yq za*&Q`D<)5h6Ghr(Hhz%K1u+GqSEeP+kGLsSXL_GwQrOkJNLczQ8G*kUq(`^5jxH=4yRPKECs) zJlnSK=r(7`txp9`nTaCamN5sIEAAbl?h<(IqFhDk5c+l9sX9EsRm^Va+%_)v02t zv_{y-C$DSkV{@G+}!9S6KD19KK9I z9vYaiw9Ngc*@GMF{c+HV>iBCr$hI2N@()Q3qbqOm6vyT6aLG>j^1)b7+4d-WN{XdW z(hx_tACyhKt!MC_ThpnZP)#XdINr0q5aOXV<7LRON0nw|3ULrCKjM>EP{)-beszW2 zrqHQw-W#@Ux0&st#h;AIdt(`<90XH94RD3Z!9oNCG_ z6mYg==Ir-QYlpD>lt{(?GaCnlL41$ePl1jw6yTA_IGyk?=agOoz;%XTmgt~;z_fzo zcvSDpjHQS7#NVj*o8*@e5nXoozPG7fe|}GcTwp!c!KIMq0=jPY zuIlZNw+3=8N|MjIbQ~QtloB`ikV{L1J)^fbeK>AtP#g66p?cG3wQBvgiv_x9+5VyF zcvwWCKBHpDWy5O80WV?c#B1Uh{_FpK+xk%^!djK+ykYz1ol z#WB$j_9PygHAlj%Nc#IZg=W*lz#Rk3T>~F_KFJW<3H)Mbzx%H*s|=EB4Hn7G zz3AHV4+KR?(!$C6t~V~N;&BPTUVQ1Gp{(8|n!SXKf9tZ|gg>mA*zDzjKq1GKE0SXe z`~0sa$KP^aP~IOcG#x`TRA~KorOD3>57otWnPjp4)N!t!8f}93KV)s)Vf|(}R1j8>^;^r@(=`Ewq>V2@A!+x=>sH7W z!qqNg4aO#N)I2egm-4tjYA$IThf&z%`j@m-+k)oO_`9LY7S@YZFSj>%`BGcAYs7Zg zr4h}$VJQ)@()}*udZa?J!_YkxMt*=Qw#x~X5+S_M(wX(_*}%efcrPD!7X{yn;4K7*8!v@kH5qCyXMKwq7 z-efh@VT?ah7v$kewPe?0Kbgrp3BXi>D;+*#5cUN5R45 zLq|f-5W=p_PiH#U(~I(a`m7|*gL7%{95Hc@ve16xfkL4`yW2-;u;wI>F^Y@Z*> z;vb&ULAS-6J}-wn8tDHe7rz-EiJO4cm?9(Y0i}z*ekS)W*A zR%%GJz6%B`HdQKRbgoUBkreDZJJH&{AwDsZ|)? z@%`#74;GMHQE>o};{cErl?>+JBp3usu+_v86FfCdfMZyl;J|ljb&&@Dk?2mv0Vdl1 zU-9AJQ0ONc_JJ8}W8|GA3ozkF!6#6!748xp0vI|B{zDD3SLA`$gYAtVRBN~O-|bfZ z5*wGW2dHbdIp8?S4^#w2-BE^pKTe{-I=*jXI-^g>VvPsu&g32b-@}1Q6Tn`7(U~_+ z6cQ=eK_5{)pMLP=2W;QVky%M@00_2f8h$`_=g$)_|Aq~KSf7K(O;sqFUYu|7yL%cPT;ucRehf2LlJ-te*~!9654ufcr7>{P*#$OJnXY=rj`r zJ~1RZvse{}i{f3v6`BgHzHk9m!E>3>_d*4ue+ADxdvUdJK_D?#_8(LHTuW@%{TJIA zbJt;o^OuD$ou?&|lWiVes3{MZ6RPxf$ig5y^I;Ff(e4ky=;}nFIWGv4&%}DikjVfN zV^0Q}su5B!N<2COeTKh3TSQ<>jTszSwf;hP>?ET^3Keb$W~8YvVYa|?cEEN}_R$fX z?|=Wd4=K^FaYB&gS`T)+j8?LT3c|oU?nF!HuScD!btn4vEe$-tn>p#;6tYGD&wDf@ z=l^!OAD;x9@m0@P;U~bseS4nqI^Q{exn+-m6i)vj2yKh3J872qA-&jr;ykyniYfqTY0XWUc zWjW{@t}Ok)<`iDszWM0&6+%KK(xa)`UvcpFJNx?HlZnU>K$K$eN>qm0fZR7oPicXj zzRD;9!;WA8g)oUxK&2lT`n!i~ml&`2Q^eoEBb;UgdplaidPs&+utpCoYm7ox2asU~ zHB9@9U4fmaxM0ap!cU2V+X1k{H)nC}@Fhl2xPga97%2tz$Prbn^czSk0yOY9V8{hD zPzG;xy`ef>E9E>+ea^EF$1g}Q5`d?3?{6Ps;Gb|Os{){?PaQr9l?3aa@eMoq zloScpiSSrL3QHyM8A0*1ZwUBjXv>H}E5eh66qf@41$EfW62I}(-!snN;UBwaiCX|| zq(#({k0i*zlVD1G_&5HLRREjL_ZTLHMuJVN6#(br*Cf?t0TdOo;XT3lJ^^g*0YsYe z@THsgTV=r4bO2>r)mRrV{hB*Y=>e2{*envl#oGaI?QrOS-vG@?fVMw67;*8OC@2zI zamFHlDODhH#-g4B#(6?k0|3_jX880sEWZ~5bR5u$_d5ce1)qsq=Z*V@fPaMcZZ7DI zzzzMMApB1d{!&=~CkX$u2>+l!{$~+z@&0EK{=sMXpKJ6#*XZx{$NwL$5hyftadzJD zY^ggFyFgss&Dv<=-TX$4^{Goe$6MWo{XBZD!M)AR7EAOm;y)B}a%b-j|D^I__(BSA_ zn)RQ8H>fq#kFv2LvLyl*Z_*Fzzv{5>3t6TCe-)Yq+~1^~S>|tkZaDB$OsZ=`VI zWh%y=>&;YJDIess8Eo)U9Sbco- zFc3HiAeD>kW+p6sD&dBH@nKaJ(>J;}>P}+vwlRngbM1FxGm2)sDj{K$ac}d1cNMGq z?nUMu!*Sj;AU+9=0iYSK%`zQ=b^?Hw8OeVWfJP?rsk>Xy$rMpr;Puc&q+;XcH*Eac z*|(*9A!Jtg;tFJ`Y-HKTerdr^c(uj?Q%eGZwNu!@?Q+yBvTuP~N+|#@gER3drKJKC zOvZXQ-Qw9lirK{vFd3`b{7vvm%fIsp--&2W&&#K|b#zOVF9M?fEiQv3w6!hHy*fyU z!x$hSx7t1Ls&#vx2xctFH1e z?!5#8knqcCw<#>yp|QM~4e4@}HY@I%D88cR@qP7PY3%-fV!@yPC&d8YTrvKnNt5f~ z=>FOa`@N5;Oy6+A=l}wp8uq&&=Z9S*Wdn;w?w6z#mcmdlZqQcH1(ueUHj8|kWnFCf z8}V6b#%qa}IY=b3St%a1Fw_^#&wu-o#Aj^eY;=+RZ~3zo}!RSHjbM2=wOENoLxtnf1DS&3mL0<`Soyi5E$C-$ z!Xyc|Qg_g+9s+rsU%|~t1wC<5D7EBdG>w6v4y@W!(K&>=wkDr2Ash9OfaFZw6Ml)5W&C5bN!Fg1kNoOGSOlNHHggg1g(Bb!GgvhIP)j@o zx`oYDhr|B}^gMBU!c|V@+i}<5snWCjTBs>3S)em*+V9>-DGXb+ZOK29XaO6QH^*6hFxr{z_&TH z0RJeqmMV8ml$Awl);``b6g0Me`z(mGt^wrI2&cJ$e()j9JIvr*t_1wnLSng%N4TVx zg5?G`x26}}X{oun>_Wma(lRnlTutu(l$Dj>nsvH$Qfe#t5*AQAoL-M0>RcQ*3TL|@7a5y?O8_E$@$ zWB|$FoZ+Ybw!6?&Kn#CPILp7m3A7k1o3*|J%HKXc4fJD_ClSZL+Q=gbaezt4C9I?I z74%!cS*D4L$@(V$|AD-J1gR9z7)I4Pd+5f6p9Y4!s)k?Y-|R(24eTWRbZ7CQ>X`)8 zqRKk0b@SgWB5^k!(1V}I=euJ<19XlxMJHAQ{son*K`(b}fk_X(ZwPo#56HEwYEk_g zw(S4DavAI0RHDq_-##sY12h)#ol^=Ie#vA1u~kb?fR(ZXyd#I}c7Tj6AG_smDE$9G z8}uX4jx-Q;hr|63D*|$L5ZhP(E2LxqZN(-P%W;_1y<7~y3(GaJ`&WxBvw^g3K~y;y ztciv4?gyaqo(1&;{0GRt5epp0Qu&pt$B9Gw6kzG2>yG&y4f$jFp8$|x1zV9>m2C^iBfdHD(3h>hsJE!5YT5?9Ot)e?GNw8keDkj#mchAGKfOzt!XbSG0KY9u>lgkj%rd@D0le|}{|^ARz=g9DYOCV?bjXyl|QC|NbE%|M*aP2e4PeMCQeB@bv%^%NJ(4{wu?- z0s(ToHu#?G+oz!kfcc!b9xePkYuX3)4}+#2$}!`WQ()1TmhRC%IO%sDBy4~>)19(C z{Y_dJjlm*M0&Hyl5eGjrKn4|1DRv7S3E#eW*&mQcmCg9Kf~^1h(BGc9{Tl*RYXT80 zU-J+=RQcE=#$^>V&wr(@F9W-wF~nwG`)zX)9|4YtwNH}#E0fGf;j1o&d#HpYBEUXw zAur|CaH zdc{dG?pl$`V)5DEP{mL$yl8Ht6XaY5r$t5M*K{7~0BLyt1Q3Gq;j`~<8V^oA>o^V$ zZVsVhUcwbVlbyc#`FUA0g{{N-hwpp&OOCm6{A&ba`T22CsuOM$1K^NW5M*d(TI;ZX z;}#WJ!2LI)8&U}=&ZfR@r|wPQ;gjSI`F^7Om#cnL1H-o&g}tpo=3}|c4#Omo@(z%j zi7P4N@YM#aPb5v32cpGB{H<6~_QoLEkuM~Hzr&T5v`{e0ys2iJWY`?R4?@~Xpex=lShN&&Km_@{43)>$v~IPJCC= z-+pR1arSEJMIm8fla1_x`4xJ~F%#)kC&xGH)tA-)qu_%;mreFO$KyjWF9gJKx3QSP z8#cH*8)$Xas^=XJwU$_okXC^{6)l@F>yMI}Z|ME=#|}3H-N3J6I}alQS82`|MVl?F-x34| zXm^@S!;(&~%>@pVmnyZbBX)9}XJ!6Z=LWOp;`Yngw?x`ID-H3m&FV^*BxbH|*x| zp$p&phdF5^siMqAIJN67pw|bMdV#YJss?oWYP5{xpAr@s3VhqOjN%h4Eo_>J*W@y_ zQpcc3r-A&ptZWJEPJ{pUn*CKc-~Ddy{DDrQ-k`{&O5uM9C;5Ztco zjr-I#D6aPD@Ty6HhoSkop^JZA`QJDUDxNH-ghJm6#|TmUTe1yvZ16j*yCc$oLgLp3 z1VfS1q4no~T?E{UxZ9jA&sEG1E-`-WG8ybZ|5WS)cjndpZ%?kDC0#Az&2Uksu}l*% zp=S~}iN!yoIsdCv-r}cG4b{}tur+vp#?DYNy6nIIGJ(5Kzon>kv` zywao6fJNk&1op0ax5kI>-7^=1T)dAvx8XZZ$To!Ly8$Pbb5;Ly z8*;&jl2KmM*PKCJV^!KVllS^$cgg=9+6^Ri+_!8{Cei>8*z5^befvWTV6a0}cfZvY&$oy$X zdVn?5bJAd{{IO{xyv|H2OhI=4{HGuQ=AJmtuX7ey ztI(j88Hf2haccn1UIYfu4gW1j8Tc<{HsfDwy#lt4>ygy&zXkCCzj>(02>!hS<-ZB6 zvG1*;#=et)tg07(F8z6=#mpp5uK~LYD(~fhkIe3b{-PfK(<2T6hd3p@Y_EY;Xm2>f1uGn(C9DV>i@ww|3D*^e|&_$_&@)Gr~mO0{_zq1 zll$_Iv;2><{2wTlf1Krm|G#F9fV#`Oq32E{-*8cPvoHORae0*}0I0n&IO=p>PBBF-R+!B~RbKDd7GU!u$)PcR3dzupVmIJluEC0N|kvgO2nPtMFUeF9LfzWC$l^ z2p&$@IrhNDo9@eXT|Wk`az5Y{9F@!)OLsT?4cdY5#ydGryY?i*E!67VOCZEM-(y?w zxMk9$+UNcl*xTyyF>V=Go}RNsZugDt=OP=gueoW@^dW)3B60mqXX}oQ=;Dwi)-cCd zO4-c>I3kiY4t?M&A;GHT@4ay_S3Me~>bwvyuiW~=2f3vJ_yeGd|@GSYta z0{Fui1U&`_>1gr1uoL$H(#w$=dz}qZvsSEsV0TrH1}>c~QuXZ$M$&FsxJ}GC)uKYf za5$UEW&tZMjPk^$&(~9Y;4JZ6i!HaE^-5%e^q>W|jNvTBs#7MT3Xrd*>x>V{A8>1lD_rC>Qbje)FJwdy5XwMGqgMw9IN zcl(Ac-E`O%J(mx$Gv%_fX1#N*mO>Z# z2Wpy6S?yLPp^T4iv$FbJQP{K4POVl5mz(`@P66gzFIq_~1vhZor=BV!1U5Y*1KBT; zD7(4dwC&i&s{z!FGvswYEZN`DSk|6nJ@3A3-iBV5)?a!*c&1QT#?oVIC=10h2XNUz4>tCG@U*A+=LDfzX z-M6aec+A?8bXrKM-~G~ zMI>?P*`(I5`Y(3-na@6f_S=(Nmwz5Jm&VwcYhXpnfq{6x%#y}tgJj?tD4d2aaOlkp zB%cM6!}Q7~+NB^7Wi^xzFB&&-vmX=43-ujEd)2#y)t03;Db0S_J2m2zAKuy78F)ly z%+02Ho=g<;A(0K47KysJRG~{Ey_jZ(x zahdvL50LRyP)xr?QJ(Vzx}F^@R=c^yW)q>bkyU}5cv8LdMs%vZsFO$)VWt90b3+tY zN>)CwS7Yo5Zr1~+k_m6v;hX98DmcLW$)U~W5b*KzyI~`)9!;s5?iwhO_( zf%iA!F_GK4tg!pUSbC(~-A0iS9OA-RMugLytsY=^`OZlCO|Sv!{=zE>qtFNtV^fGJ zezVp~%;K~Ea8t4XV`I4Y4$w&A|JFYIu|=0-0IQIgZJW1mgxQ7Kf$<(iMy(sOsV&{r;2!x#uo2ieI0r?~w(AHc;1BNjLUfh5#Hs2CuSN!~7lo$_= zkYD}1eEGRHxvzAp!<+zfd@RH&y=`9n#68!tsd!waE&ojw9>Cp zdp21HN}^i8qK9&{WtBUX=Gyna}*jt)21gwneWdG^)m_ z%|Y1fdaEHzru}D))whX$7CNcl46`kiiNELm)zY)T@cyBSevP( zVgDv-?HaLF_@O^}sCrjkp{U@Rc;*%p*SGZrGyGNr$>zs&p3H-2CO zi21AFZVjMcM-U(iY?0pY9+ltHR+Xz+cxjB4aIKvg;5E_>ZCg71kvpH^)t(|(M0!rD zn8W*YI9Y?CIKk77b5 z#MT<)Eud$3w37(M%wi?*%4}yU$MC#O{T8>9-_sew z2`Q11R6{heeaOU@@s*X$X5#Ce0=Mpu%@DV>pJCzubIG_kek9$H+E5&Kzv?)}&?f!p zuX~#WMBW^YzWcE3GZO^PNMyd&xAv#a%ECN+mg6UM_o(2rxSCr0yy0HWn$fDXjXu=3 znFKh7q-gqOK0}R<7cjeOIQs>!YHGFTpdoa;1!TBjJ-^ z#uP`%z0%?u@-8S8L4)kd8?m>uxX9p^t*-{|Y%b)BQ=y7m9V?5B&8{SPf0$IJc7$=w zLR?g;MZD!84F{(xt<;dMxs0v6yqGyncpHThEdASHL$bE-6vSoJl~lb*lAS*a9r2*` zp%mrtjM}xyL)tz&r6h3#9qEk~3S6#tnjG#@zOKAdu#L)w&$n@~kC4la`MAl7#J<$o z;g#8bj4vEOmZbPh4(yNMl^`mz%!azL*q;M>U4IPxh_;(AQK&Og&{VA$jxp&y?|`(u1ytoLuqM6{MoQUXO(uZTB<}R?of^M+_+3lwi}^rD^An>W!L1cZn*P zzP}cS^c{cqw3+QuR}*Q6aNSWc6X>FX6I*U3mNl$$BPx>ZSNwib)Bh5ncANZPTEm!G zqs6Yr1*7)Ua=ah)>3r3vu$a8CtS9-9UVwa{k0)aNuwtPx!5&;&#GQ#>E z0Xnw_fc22yn7ZN~#&vMKZwkbquB3x3Oa~X*thXEkR`nTrWmuyon`4Ss8pC8hFqtQ7imdL9cy)J#t%ISrjnX&u-`ApG@b_7#(o$XusLt(-#3XsOzM|`&B@HlEj$(PS++0pZa9xAxgd!sgMaFo;Sf+RML8Y+e>ZgL0YDc?p*p6kUj#`C-=EI`f&jDY(N>dqxXW}&&(L0`ue%Pi>_Vr z#Ykq3jIu3{`j7cpbJs92MZ-mJGOldUF@Mn7fHA zwzFuOMxqCxyW5nNZ$evrEZIc>{nG=a{%+l$LZ90{ltRay{5* zhrqyXcpsxY>PV7~Tki99Cq^*fI;utblK^CGPr6xLSN)(Psl@!N*^5-@74rI#e?>?4 zbidr!7dGlo(>w0AYH-*PnE3dIHT;!*`zsXYW2!i37It%sn<}$jP*9 z4nMAic|*?)gfpAB2_hS%Jk#RdFhju5zT}nBZ&-PKbz0nD&lE_W(t`Tgbg0Qd@jPVZ z-FA~QSIZ8%Sr}6{0Z?!f!&qx-hJdoEw0aPo5YOKO_y>zh*TjesBi@Aag;ot4OwESl zHk^w0x8~U@w3&=j<3n%dTe6}8w{ooSY-rXH!t2m;U@~aZDIp*OpYA?+Ur6ojEY}a} zItnZwffVT1X%zU*yEuLP~3SG@Vlg+-3V2EHT5lP;^2d$ zQ}O#L+369=BFeP+wMAtbdJW8Ly}jDtMO*vvWN_TTZnvS!`kbV13;0-btz&;SQ}Z=S zBDNOGS2B~meV_L{lg#N(Ox1%8XAr`~j>}kJ+c4$VIu#ekk}%wtWxW_<6;~bmvff>V z`*jqUP67M2RGdY?d)NS(uODXDtZSyNr))rs#~rmUVJIvu)$4^BVtWla)tnwayzwI* z%zYFRcJAs035+awt3`Wc9^Ntbm~gkWwmolvT+!tV3z%9==v#2i5@);3=ib*g1zZn@ zC)Gf6v|k&?`~}FML1|@JSo&++{DRgOHt6R2`DY*#8vx~hM`ILk!Y+S6IXh4wpC;l>O13Vkw69w+(+z6PfvZJ-z7htxB?~68{ZEP=38=?89&{Bjq^ePi1GDQ z1UP^8y8@|P>X^dL?@91cE==uep-)dtS~(Gh0)y$V*QO>hBpyY_>$1}C5D8-G3elrWNmHenPMb3SxK&>e!+~4-`O^g{9cZ5ybkE#4?pw8=o$nIN;^oKnNp+%2^87n9X3} z5qZVLDA^`pG^-KSHC#|Bc@lqAX=Tofdul+M`;kkAcm{zl?pAp24wVuGRDs)k`a*|9%I!P+Nm;S8fKoF{C%S>yVkoa%C0qAuYN2nWXsu+s(n{hZNlG%@cCs~BhJoNEWFW}dbW3i zJeVN;I6q|9hVi}U!3+Jt-K9D6=f+qD4pfTFDju}*ci94;OAt3Ng?HNX?SyWUylYE# zYquxIRnuw&mkn`gIC~lchaj9BMw|Czml)&z8=go486g?A55>f_Wq1!&!5!&Bza%0R zxzmR=xMgNNdh*E#-lXE4yq9{w_KtRA5fc6*ykito^johdlKQc^_60A(9_e+rdZq(9 zQs97Ej0jvh<=!$_TdO}>ntUo8VHmKK4#LAm$z5egKeL@_p}{{BPXAxCF=F~)V^RBU zE8_7Jdlr8o9p|7{>xRZte1qlUg4pgog)Zg(?se(`v`CZrx#^54Cq+)L)msbVS=C2fin;1%0G1c ze=m}J&xF&VUE}_QT^P?!=!^X&@BAjvANGANd<|#=>8v}~x4s8+1jvWW7a~k-N1Z@a zs`i_uzK<7nSC2rX7a~)?uCvE|ZgtzKtg4z?$dP#4#N+dz7t;ngu{{HDC4|k!veK7m z80D)mFZIplwnsH#ZgzhXXCK@jG-~K3OC;+_Boz) z&~Z1AN+UECU}S5pjRoq^gVozFH|HV(J`<`+r7hMoFyFQqtBEdUyY%*3j)PX7l(Xc( z)VNm>J8Mmo)>wK6(Q=qzzzvEU4u+_x5}BHG%2 zV7Um%xPV_B@b3E~5By&a*zmyyH@-jL94L{^IPs1_VN)+MV$;$Xr}z^&CAqnfr?f;A32Vh`_gF)x&$7+&3P4y->D?;ltB>!XI@|!@u;KgqP(+i%F2rhNUeHj6j3D@~yo!P3 zI^z6j=}!4!-nEPCN$_E``tZDZNg!x@S#64&u!M*<1Wu-{mXYeS-HSAGO7dB*%ZNLb zZdKl5U>=8iUoyp-d`q@b!7U=Am{qj!HV-^=6i!%-}5#pg|Q1e9}W@dP{mTO6pP0No02QEHRx)RZ%(=g`|S z4wK(D$prjqQYYb~8id_h(P{oe_S7 zIL*ENhV{&e6Q}n%pJtus=l{sB75fM!AiWOZSGmVh?P)KSoQfOnxHQ~Bvcq~F8%|X4 zcHJ85So4YA*>D{zZ&`>(xA$(l5NcJ;aJ>Tt;JooZo4v?bQ2fplze{;7OK9e zGf@d>#e273E=msd%i{CE9?<98c5&utWs4<-)zL~sS7p^{g6kNWwbQafgv_fTYF_e8>k6pC zVd~;?;vKBSJBJ-n| zwH@#GZ5N{aJigxVK+gJpRF5A5du@~Pc%-aX%cgCqA;DTRQX%<9fwNs(eBQN3)0f-) zJA)-_ms1S#^cpHmu&^?L1Y6s~zk2fj>H&UmZ&2U3-%C(WfVxR&wx(k33;-2fb@P8-JG7y&5t(A|-fuI!21)YzuZMf16tF}DU?)U38Om9}Kd5jyR7@qMr{ZQ>YJu(?g zS*#I)w9T(^5UHUt_lOZYPI02P7Jj?i+Di}HsEOA^OfO?kcO)1eL&}Mw#I_Amrw0dS zE2Hmd?V`Q&{4hMP+s0@OeOVkF`%u*?AKz&2>x1Y+<3#Q~5qXg$qDUEuDu0jjRVQAL zlhi)_0evJNb67hS`>wfDpL2ccDj-rTd@8>M=>St6&WMOM$o||<{wK`Q4#b`-SN0uu z16sS!?2B$l@Q1ljE7iQKZf`wm62TmpNPi=Vy?$?-0`GHi(n`7!Gqg*?;n}~16+ai8 zIGf^O@#4piCrXN5G?%hB9@&OPuco_@gn~E5b0NogqcgorB0qiV(|+PSuq3hNyo0h* zLMEyY4p!ehdGh3vmd{~Gs;v911wzkvD;XuB7ikRSk$`qTp^OPoz-1dSFVvA#mxi0^ zkg<}9%`TO3McmA&lBDWtL>-7EUp+k4rE0oUg`;e?Y!)o zsd-r6o2$n9bE>7vZ$Cxn>zyxzI`og`dz?Phyq;>KGrH%`du4s@CHo%(f)u$u^(uHX zZ$}+9c_)Ut!v_wptmXcV`X<|@Lc%l|9#ZXc7ePnlakX^}#sjBV|E$klVj_B{+&v_e z=9_o%V#ce49>?oNHrt>5&C%BA6lZxi1HNQgH8O-?Fg?q2E}e3;-}Xyt*}W6uPi%QaewW@#0NZAtZB^HPrXD=TS36~gHZI7G6+35h z9fjosb4xOoz+%?9V-Gk(v-N9>L+9bxtjO+n$iTSyMfz1GvQPK=cI&E9(^>v zVTS@QbaBp6c?~&F)JrqE`IZV!c>B5(DLOjt&{s^ZRYtB|D6m46p2k zDTI{}gIDPx)Tjo0cjF3K9XeM1z9c6tv4Ui6S|vJgd1F+xP8i$W^Eu|r^0nYkg=f}s^?>#bsqvb4g$-Tj^qpJ7-yQ${L06D*z{r1)sK0|lD%gNXNK{ct16kd68B zGa?3&+|cTqT+-E+v_TzU{^^7vt#eN?AFirp6nb=JVYuBuPr(z-TNzrf@8-BT;Nqd3 z47=O^w8kjM$S`m-Fla`~sH#=#9M~vHrfM`Juy8}|%F*KGfqAI`Y@`;{E!#fAb#)+F z)nfbV;RRekPKq*oqr!biMIm^5tw0f|j zB+D`?Hyk%2VbrB<{)rs_*o$y^t>K;enRZDjZ z6m+(q{CU}TfT3)y5#`r`VF${5$J1)*e<(MV{V0;t;LRJZBRs!5&~m%>A6;nE*H)G|3dMHVB#Rp7#fR`gaA8X= zLi<}8Y4DLLsoL`4Oc(#*YTLIp!U$HB!2z&@=|#i*s!n`@`$yPFwmGKOqTEeavNZ$F zvPwYYC%ikihT6$a7B$L`4gt+ODK4xg;m2cz=GNxAH1gyr7Te9vb)CHCw>!F#O+6W4 z4FWx4tB7snuTwPnKkeJ$O!32LI60WiaN$&g;YLsPoGPi(exW`yqwJz4=#?VtZB-eb zDB@^;(OWIS+%-}tiI7jgd#{GJGi-`#dv(JK1v6qw-$tHz?l)bOn92JhWwhy{65WR~Q?ltLMINJk z!vV`#7oDbZEc0W>KCtG*esHgrcY1APU*;|xUMFnmvoR^?`{e7>wkt_CZmqa*eMej+ z&TJ50>)unfq7@B*f=g${lRgr&X96@$*FvTTVRE#|Zit>H+X`Bhs8i;x zq}@ibReusx?UbSS`s4O)UP!ou0;1zgN&4?LZtASqOZjw5Ogalx#&J*e*^-E){8e9I5byqapThcc zladzEqQ-p)EjRvW&&mMkR~`3}kLBP#<^-De#?R=#Z1yx@vx9d|UfZ+pD|1fDfTWk7 z_iGOhA9d{~j(tD0r_*&o_PdX9>n2r3T3fDk9vSaDK=uDcDvr=ighO4&0@k#yEf>&T zbCkFGiaxTO$MZ42YSn@~k4ig!hUcj_k8*&CE3~gKu*w^Az_xi2GlJRmijJ!j*8Y&I z3_sA^1(qB{`L1bE9s{-h@%n+JEe_kxG2eKq!9%|n`Zat@=b=Zoz-7dKw0}{Gf_Eoz zH*{=sF@mC(6*;F(@3>bL-gP|1qi-CTx%98|*G>TUCSTm@_9ZI$<0(eL+%rX52a8hf z<9Aet9u>Zx=aLJ{r{!BRh&QCkiB@{|*!DD7-ist5A^k68?<$0U_+V=eTToz}qo!CZ z3}6Jiik)*g5VenLG`DBi{m-2FqB|i_A`mC<7bve~aIbA)x#3-3xZzsbd|q(!N83(v z^5bdt97_J(r%nP#MG^*84cJ4|E}%L`m37o`&PGLVYEQ+=Bg?nhw;s*-d5Nehlte3J zTjqp3=iA(Lk_)_HC24HUQx9fijEK~q&HGI7RDL}GyP&J^K-kGEfI4@UGd=jT#KlXA z+1Y+@a`hc~nXL4LoGU2{#zg+iaBh*<0a!|#2+ol%4U^<9d4XoQc@oq=wrHaUO}BK^ZHDu5H|2VDQ;z z=Cvy)3weLKeRrFx+ICH$QO93dc)rl0`Z1l+q?4@rIZOt#K>&F<4#qF^=d?%<8pK|+ zRoCdgaHoX*RJ+iL6DO28T?^0lMMQulg|t&+RYQ)o;cIA*M@xyTVc#sjeB{tiQMjc6Nc59Dj`TbHDNI)j82fc$c{+zTr!a5>t(0%I zRTL{~e52&c#8NiECx#`D2_9hQ^SG={aaAuh$svj-|aj%(caAcJN}OEvC=f(eJQ~3$9X& zKg6rq|dCyT+)s@53SB4_-`bl)-5YjL@!;s)T%{+N`(zpKmf59H@}|X zjtra}3*D`RH+8O335+2O+`aJe$}O~6$s1e!7*v3OBekHNuPFjF_~KonOUT?`?SHcb z3;i&J;xeM*Ctb*zZk1MG5;$BicsmmY*(ME#tY15m?HdqHIq+5Xm9bqeO--3TZ>+Dd z@Tm1!zK2%9SHH`s{$)wQo1+b*3+G0wYWgIs)!EPC6edOezc*$1&r#xLI>N=*HO^$~ zO^D>wbJ%z+PJ%4<8U8N(>i!bZo=<_Pl(v?UO=S&E zLKAywjJ%nNLtN=%uTxP6*v8|jQB@$Ipf9A$B@7-|7>q}m-{@)U&CU@K7L{iA(ln`s zWabtSw+&DM4xGKCJSlo!ne>f>fJ)~)`4SNQ2t>H)wXl`rTrSB5)lw1bmH_{a55hAz zEFzon6$Y*uGX8kMWB$XJOx31&vN*ez-R9Xk^pW0`_Z%#~#kk*V^K}e7d~_2;@N8K% zzxy?&#lGExkGn@hinJgjbW*6IbMOw&xl^}k6hXC1`+zPT8N)bl^{K|N+i;%;{1F7k zroIt|ekWeST;kB7LqR<1rNrcMgHlVgORrQ)nKOEc@v(<~&PGx(V!~BN_ifeRfFiV;C@R zUnvhxj%8yv$Hx(++u=%%kEsF68MY5*oWz$6blDUIFIf+GAE|t_GT0;%ka5do!N+Uh zq$xW1MM}h+8R0yY@R+8P78Env+PJHhlJmPwvn_Q+zsJ9Nu}g_Z^)42*6g|@uX*B-! zDyMQXJ73%$YhS8Ve3g@hkgELk!I1UUP*Cxe5x$&>#MbNt2?->{S4Gmi&^@GD36VHo zJJnDgqHwRHP>}MG1BH;p(#yJ5O4}-?T&?}D_gV>OhATkCcl>jTv-P$5j+rm`1dd!V zEfXEU$J@9qgjHzR&d)NIs6F!cotn_fS_@89Nw{2@DT$|Z=!oLy`U}IL{gkMHiu83m zQhKZ*07{QQexs(N^zS#v|P-Bn&U*L zVs})nV>pawpTwn$_oFumS9s<*E?ZW{K7E3~7FU#&+`cnRM_k{{+nhT@c^J&bAs#R1 zIoC2#pU=>mM_SdV8~#MEK}-CA2c(dD!Skov8uSd1xx<&isRGYbViLKAMVVroook>&PXpfP>}(BM&+`p`FC#>faFvyC65tfu z0?siGUsib{zYbl3&5w^3)G&!^t|A{zIE2jT(v@Bx$-y)Wuv1H&*VYrI^vId!OH}nZ zF=6a(WosZYpr_D_d$^#U2L9|8h{u&+U+DjG#cZizq;mbv)VB#>gtaI@fq9_Un0(X) zVuEa1IKcg=$6l6L45T%<#4OP6zzLtcvb5P!z~1q!UC%u{MVVnA7qzK!%r4b&#$>W z@U97H7_gL3km6(yVC)D)gXPP36u2dM)wHj^(ZVG1>Z6};**3-~QE-;{epuW#9W=PY z#hc9^bNDHGIqG4?5rgHnWGx9R7jGuLWC-oFT-L;ew#VrQ23BCLv{{GDjxugZTrwk% zWf=F=W?kuv=HTo1w$QU(NL))e*>F`>+Ob74IxVBq@K2@jvKpA+7HNI!(leDIrY}~R zfiH5Z8caohk3Fm{2V#n5MTd%&r1eI+g{Rh?GF4fR^{n-P<@3WOZIl>WoKhdDwse*L z*?TPT(eO-LLdKmO|2xE`m^1;47y3x;O#@ObO+rKDj7Md93+^O{yer9Kc>Ku1C+5V6eHL$IcLE>M$*dz4p_+1t10On}pYkv-`_h8s2hPlH|^Ql9A0wGYmq> zdpRoHumKZ_>@nA&zS>Du{w03^2u>G7=gK!PF_jy~e)o0APaiqNIfkAbr_}=H)tgu}5i?Pnzwyd=%Ij_`#%8>vDV7lwdrLxqw zosMqRMS}w3I-Ag>n-7d16&{g)+NgSzL1;~oQTNDL+MZ+JzvhIrjgX@|t?wPd+_!&J zszrJtws)I)hEfM7h1bv?*-mAO7uw9Z4r3Y5coYI}F&@-?x=7g9cR@fv5J5jDtXusK zpspd=R>t=o2eZ!)8sv_<-t$-*a_5wxOPN+UmW;}eEkl5rTi%eqTfYT;VM_lF7tkR1 zPv_;JJAh%&*FHM}3cA9ajw$_?_}21cPmxVrQh!NYj%~;EwQh~Y0kh`GQ;U(o-MNRA z6<41iwy1=#yHPVaho`G$f5^>`mPO3K)7>^wDpq&iCxmKXtm~y^DeL;$zaL(zP&g}Q zaS^jiIF9)$yufi9Q@!(iW8R|_-1^y3Klr`Dxz?2*gH&DLt&E%DcQ!mJY@r*x3T+=$ zLzZlfgyKXjMG2BAk_)}WlnBbA%)JCxC9MYfF$lUdQ=4YSbv+BZU~CEGao&a?&$vT;McJ6^) z5mvUdpK}>4@3d{dg@8=)o?<+7dey3m+9>FjTzt+NNy)DT>NF_F;rVOA=dT%?Dno}i zMP(^#ZM(&mp&s*lkghf;v+dfxSx7}$zPPOPc#d4**0^qhU-1cLaEC15lch;txt5zPkJjC{7k#t39YrKP$lCAoLira6>6NFr0=$Vms0^! zzvs|h%F{!d**XTRbL~<2_E}4*Un)e6GrV(Y3?d~zuD!n%DOomipwu?sFwKa?xP+Ih zE7e};0u+CA?}7E0aNbdKBSY*U&3*W=Y00+n>;A8LL9!xG&Sxud5hTP(t_wGYr2RK6 zI2Ag#u}Ak_oz+>288^6`&t-F$Uy(^D%vDM`{gmkC55EDi-bX#BSq^Rjqgi9EeJPFb z5)A{tuf`-;?kdB%mr$=J06t!#5sOmYz4mCn5ILhyJkTeik^u|T3puP|i1tYBLtAQ) zu-Mcw*rIq^(h15TTW@J6;RDBb)=jz=>;UweZH&o05bp5=F+D+&1;TpOGD~}PKU^>I zkLlM;CcjzI6y=|Ms-E%RuiP*H1H*j1p3ly zsOQbQKzBxs`0ubfGhsPg09VF#t^ex0J>@}yCqh?OcXc+B5hGzKFGuLX^wVw;*JrE! z$Nb61;v`Z*p9Aim$;Oq{?!sP;(r{H?aUY=AhrZUt3z@Zqenucb;`{|vKhyeRT_=3z zm`I9bM9Ld1KT$d9am((;Uh$0k6!mQ-o3aaYZ=g?~ocHd}S}K4vZI?_Z#)nblK>=93 zSw=-e1t;1h_j495s;|I#4Z?YiD#TRn6Q1lEH(f$Jw5K}T-;uIlc}IwS>g1|F+`4yj z;4I^tIng8G`XVWPyBn2yfFHIytg8`tq9g{`<#qw$ z8E^U7V)E1uEo5yUN-^&=^_u7vTGFFQI%+r3MX4HT41P^2r`}dMaroQq1I3Ib{MPX1 z%O&Lo%??Q@UUB=tI_}ZRhoBI4P!wm;T-&6ehE#tD2IPt>Ongcjf~Y4*%=E0w6JKx; z__p%_?zMY{kJSOt-s+>ja~q?669Hj`B{p z>>Y$!f0=nVjDB00i&B6Pnynw`ca_pOD|zzF$nvbtMA(ZF(k*)kvRhT(cXfJY_G(SI zhpsZG+*fJYj9lfNakv8kzkx1DTavJ>yeN`e=uhPvF7n2lmaw>&pJQQ~UzJ}7vl{A6 z->#8%3XDsu;VaEWeZ4Ajaf&ol>6IMH%}5lpF3@A=L-T6`XeY+p6^$XkivuG9+tjp? zasp-e0h5!bPH9n#F34tR0_hx-)lnf@HZm=F+2T#NL1H!8Njh+Ivr4cHjwFee6#PU&iB0!x1x{r1s4WV0~6%CqfV^$zJ*g(T|y$55Tl~61)!_JwaZynwew$e zeVr$HfV;sjWwZT$w8leY=5XPiQOg``X`7MXG3nZ1hQA3wEVO_NLMWD>Qjn6CSu&HKk-*cS>S)c9Pr@S_!iDQ;- z>iteS=<0y)HDP=`Izgz{If#Tk-neYn`G+^oIIeBn11y`xqQW#i*>Rx*{*#D=CJ!vi z?MH3!fCWWMNduag)~IqH7i#{gLXA-e^&0P@NdQBfX`L8t;t`i^m;eVI19AXDxc7;l zO7XxR3}!nMU54knFlZj|Y_bn(-!cu&tU|~hB&{!W->LNW+I^4B8!c^f!W=z8q1_H& z2jo~C$x(7bg&*j~i(;|Y?)qtYBeeiG(l#deG1tMDL4dkvNEAx4XxEMuv|^GRhE1||9ccmp zIWb(mzM0fLZt(PJvDl7lzCpe-ZQVX1)yG#qxM!qvkzWC3f_Uy$mTx(o`T?3boOD~J|F_=Qk1YSnVW^ZJVnPe&oW`CByHQsH5EHw&2x~}s(l2p` zjZTfMwfQdLGMEukj7!K3&m1%^CEr``z#v-6k%N^6wCb+CdU;RXYj*G_tXqfQ4pcET zNrXH3{V-Sc0hpen)TAif`(jh$uQ-RKUX>i$GBr0mG#m|N4GNK_LPgJ<1d^BM)D>3`Q!Dr z++!$R)|%{@7VCp7no7{J;65W~oFJxy-kqIPvlK@oMGtso&kuSA5-tiLO!ANfoe#wU zJ&S?6I|3bUrM;ad5jR};Yq)Wbp-r;7RnNAr$iwJ>W z&>W7O<;0QmqB;la&?+qjElk1%|A|b)(P9f);eTbzDa^(0=8CdW4{wU@87@QgChTCS~Id8p&xnxT3wK@ ziQFjZVu1;Oxx~}Kd^XpiejVB422IC^GcP8{iQ6#mZrX%$p<|rAz|?T)epKIDiQ_=5 zsTAry;0lM$Ufc0Aq@BhKAp?!hikmGJgdLh{QeU(4_RpOnb_l42H}CSww*XvoHT90R3?I`JD#`5Au)40a^|7uE$bXDF{`vIG|BRVmI5Ec*~n3#(k{k)|n(O znT=DrdpNCm0P^?RYI?-XTS@H65_2uPa5r{{u!8NCmA0-7oe$3wKU`Px-&ivB4g9XL z+S_BB>EX@cwTS0OhI5K%sKm&Y#*zbA1S=X%r0TNDfSE$(W+nBmYSWB%!ny4 zGjHl@)X4J?oT(Vlng)`OD1Mmsots8bLOL=hQjeDG)Vko}|9CpO-wd0OaXaYT*2W6y zB$}w656kdFbRVt>eERsM;`jIA>;14>dQAv5?R&^ByM?M7hJf`<8(^^tUYqImHrR%D z?WuwIHGTSe%QKB6xSg+`R39Q-B{d(G5zvyLppJ==5z&)O+-U=?4!@ynZ-t#{YyM(a zra_5CZI|Z!>IINm(&uX8Xe{Ohp;FblRy5VFY1C4p2-Yn}?s97@c!{JV zENraRYWQa~>J+J-5o<1o-1Sd6=@MHvl|Vh!?ylsIm4CX{tPswIIFfIybNZ zK${|I1~CS^!56DPC;9tfJnmEQPUV=#i!7C~t3-G|eChfw{JvXjXXE`F96&w-f%TH? zj5R@}4C2=6#k&944k}IEqRmo~eOFw;)TMI? z)tTo3$v?{P3h=?-nKGZ0@qquQ5;~p@So&LDGv{PjCWL@M8`voymb|)QQUy!RT8{0H zN`og(DomkI4ghZ(~JFuhmZ(XG+%WWG{`DN!Gi_D&KQ!&HQjne=mre zzs8>uo0WB0?c>wb92_>Y>z!~t_?$3G8wnXKy7T6AR5vIr^3_qO_Mm6>>IP9^8b`$^ z05H=(;0E(T9Ct*O7>S$v@N~)Oqgrw>M^{XmR_yFv=x2+U41mJVNqFCInH(xMo?{Tl z&<7^zyMr4Cl&q9K89EYbQ>%ApkGCWbZiImG$|#t4vf>Q)*5h^)-3j4ie+eJ&JO24B z5VcUJWU^dO2UTkuJZZ*Vh0Q~+xey84MA|}s9d?U?!dg}PUiPlVL6A+j9Oq8rv07|^4rt00e_ zqHJ`0GVKuAt~hL<^pQ2YFA9HEI@cqtda&W__`K4?S4+w;J!sR`+oGT~xK|B%n$v|x zYW+dXNU$RiuJhw>%g(n+JbbI<|D)}#9lt`B} z!w85-qjZDhkkSnT(lJU(=g=XY!#vmQt^3^P?6dFZyr1_x{|v)tV18GuUf;DA`FVB4 zzz}h}QH*0bQS2CDPs02utfKRiAM=xHGJigRWT=cM!Mby3cli`w^Bh+R?xpr%HDJ*k zJ)zS3JcHzALLScepoE>A*^K;cKnXirG(?FzMYgFr4E(10-t;cq!=ksgh#_fX=BwrR zwqm;;?avk5E2>%--e1(&$~Xoo-lU?Uc163ck&k8mzhRwYP=M@OW0F6ySf4P6L0M~`Y`nA3+_t$c$84=JJ#Jq1G06|Oaz8PtKvU_he@$%HqC7!@d z%X=o0EEjYp?=P@qFrUbIKUk>Oowxs#)oQ9l63lpj7kvw*n1X%GuXY)a8Y70w$0+rK zQ1C}*8wZyhmEO%skFun8`mS{WM@heme!&t>ekX)Tfk{t$x-dRGuY!3}kne(g-eo9Z zBIj8B`N?X3dFkTBrYPgHPp_Y@@8mkio@`W>?@anga-wT-KE%c@tF|Zj0E0nxyy9>b zn!6>W+};_%fQ;d3?0QEa_5pQjo$}iTT=XxZ7S{!X%Zl8f7%C(t{=!(eaj@W;qv!K` zF0*{q#bf(AvD}&v1KekR3?G9UFd|sch2(#_X5&%`ZKs>RN9=s8HEt;D=fXx$ztU>a zPG4RdG1erD794u7mYiF{SE+8N+`Vg^A zx~H>WHu*tnzYb9yKfX3h<;l2xC1zrZ&nAaM*m=ZSHCM$ey<;yoA0tYonU>O(j{7;Y z4pHvg(qlFTrF>QB>U?7rtB#2jlhMVbzTWD3{lX1?;xtq+zr?AQ0g!&R1=%(e+SNY7 zLnUdHxuvNVg{P0A?^sb#;Kq2Vz+BL*b71jaz_XeS+G;f8k}SfQgAS;{K2vU|iXO zK&-#+;v=1EH`}b5_Q;J9l2sPTsHZJwi5|4!XX3WsTjmgOUyr4XS22X=;iov03v+c$ z(LS~Omg)s%RL{-GDQEhK>P``BObiN(fn+PKpp_E&8DZ!9F%9|+!|y^vqt}=;ho?w0 z_h2A}FmgHpG6s~fg09QqIVuFwi`awgO|Ov{Ni%O6$ki9GGykhYu&J9TzWGJ^BS@{nH`{!}>j->u5e3 z4IG&dfs%M@#uxxI2AA595V<=OuWz8mM9lsX=jHi;i-to(kuz6~EFK=576ktLl(p+= z&2(XuDthC+%g(GhWmr>2OqO^_8L4x=j#t=_sew!uMoB&H37NcREJBuO#5A5?R(< zHb~3YqUN90s9Z4D%Z@jG-@aP}LqVqDUB;P_2^O19%+c=!k@DuomC$!X>eWnl4yoQZ z9+-<6IF@jZv1mP%+N_^-N9|N5otmtr8Mm=^kI;_^Gsiq&0?zb@$#!L};bJDWG+rLI zebLyGMdduEEY9*REs714qj78h!Ew%2q0q#y)3mu1?db}$SpB&by&56%A?$zS`eYW0 zqrIRRj@g%0@ybdi*c;h^hszP=cOto=&0}&@Ya5%zVZ6vfCN_%)AtNmWidR?hfy8g# zGZ-37Tx-txc}3K301f(mHR4diZq^09Pi*6bSkZrWSO4KUh-(1*_R>J_le|bK`j9+* zX8-xVP67~h{V07GH$xfx`$=6+k|>bIE4y;G*5C&*Ucm`=w$)muXvdGWPJ=iS+ttca zlO4VRMN_i+WjolN(Hd+2bM|!Wqn&Dfks6u9!o~1s2z`R?*%oQfQN;?&Ab@+&QKf$) zUI9>&QPwfh0e|8iKm?(S$@~Otst1F6$frj9G`4>&_|G_J8pbB!9u9c=wh{!=e(1ws zh~$|_m|qJkzk1pu97dJY*SA=nsT^!g7tOb|)oh+E8|>#>Ce1|lo@{$x%y@k2?CeTR z?OrtK7Nj3c6i>uta4Yt7@yEPA74rG7847O zt>uHKt@0*tmAP%>o0ZNX_ftfZGEr|KcDbPY45f9c@$0~uNSOo=o$gY^OSDLw14fRz z?~}dMeQ`9z#BIt=!ZHi*GzgBmNf&sh<->cbkZ8XklJOz|4iGlw^soa5+{6r4>^k!H z{Vxi6hp|83`x(XJ0?;ooe4`UX8#rr<&JJ1oBzlL`eQ@2^BMq8{3zJ;}G+FPeS1 zM;jj11gGiMmh+P+k_mnH?)8zbqEhtt*{u$ErhG|0+U|-{^|*D{RY4(~99*S%bH0 zJ?uW)=?B>`Jrehe1Rn{vM$0FQ(yJ>Rcp59Vw%SSoipe=Xmj|l<`4Qx8`c-A?Rd-nQ zhOnevS2$neipxy-kSTHW* zw`6c29LrL3=d`KT!C||ZWhG=L(ri(MK*i6)Zgp6PyaNDCKC$miL5n$O0+!ZC8u+gq z{1~iKmg?XkX8xWncr-L(x>2)#V5y`E{QpdCJ3#(T7~j2W#Q)nbI>N=!k+-DLJ6!5i zKy7m&f6EJDztt-FA+)&$zTSLZ$vB-)+Qf(m)gn%0np`7f9I6dlYBKpYNgL4+-V)K+ z^I-~C$*uiv?uA_7){6|DO1OP8b2+79f41ivOm^sp8q;KGx|{6oDNbeXVat39plTxO z^h)tYjf?j|?n^Bf#|)$jCV+78@qpf@_{p7bUIRY9@$CLvaJ)6ZjF|!fhkv_Van~!i zEWhc0?A8FeX)YaXpJ&vwGok|9^ApsRhRfH$IWCpc@FPbVN?oofxv}RoL+tJCPsFxT zu3Ghi^8y3KH)V1zL!Fw1C*a(kzs5@J!Sd^c3&gnxF}2$2T+G+9O^B zS9W%K38*vsX%$=yrCJ>H*k-ES+h`<(gl^WKcETaqA@YrNmvmfnW!^V)I`w0p>LL;Y zB0`gD#)<@FF`Ce#i3|vBj5?dqr;-Bh(eKxM4};FaCJDF)gf<(Hd3^s8dH#zC95n#4 z2R0HrqqgWdKR36qK3aP7&Ygtnw`Y5=z;Q;i=u-petn*|AMUA|w>Ic-A0YlTR5+^%JTotS^lyfOB#Q-zd1nnhNDYsn~+(`MD2qCqXDc+i}B7^8;GFi zSCvtpo@bfoy71Xr*DN;EgRQ!Nt-c8a=b@s-*cR|}qY@aE@G|DD_r2GzBfyt3++h1x zWb2>hSAWo5$6L(p)aGDkd#>HFy1?WE@y1hvyJ&oRlMT4_5DLN}LJSu7UW?CQ2-)lU z?F+vcuL{F>2I6nS#BXCtgVI}Hncy1@42ImPFRB6YM9ZH!b=mtGFjQ2T!w)3vn5=0nKyj5F zMy!T9J-_vHsW+Oz(;vBR-xkC&1UJgmLz1}iv-I?DcJ~IDS0FzmgmKgaD=6RnMhw{D ziW2$rO;BvTdONEY5~u@p8)GOTSoL1;gTOfU}&I$$MDIo&4Hd1 z*^jK6ZnI$-Vv5LuNmJl|XRiMKFZUjNG8;KaCEo`~9h@Q8iR*7?B8AANBS8!$#MoVX zw9Gu>OKWT9()(*8bo|7g0Du>(MUf07_GIOaCdRGA9AFW7gGe6n5zlk%UyGQ-EW+~w znJAVa#t;oANr3;aCp?M~gKZ@5!OKJ)6p&@5YD1p1U6)I=d3o7-_6#VhvNtmY^s1)4 zb!!~z1DO(digy7U3ple(KP*4v{*>j^UoZ!JgvIHJ-7EvX@ir?jiYz*%2bI}FbUntcZn3I^p>-a&4OAF}0u5fSdcq&iUvSrj-+I(L8R)xFB%#f`U=dDHjrFUZqY;v z+82C{bf>zJsCw0$3Ottg<0T*;{J~~to?Vvm{>diyFa-97G%Stw#tX2GW~-(+wx3e! zZ)|~Qz=7J?D#66(ioUt)>H;4p(!ICKcSg+)CmV|}UUiEP+%0s3Fmb0ZKpU7HuHX>8 z4K9MQVLufQ&^An8NW*7oZ%APt`LZ~U>3@IZ_un7c|NA2?MDkqX91;nC=UyBpaHa$p z?q#0%f5W|E)8ZSPNPb#yqJ)W8Ou^7PffS=jePp0~H1po3Yrh2}su^SM@VMEi6Sk4zfSo{E4O#iGw4-kCZ zrkFjB0=6pECPr9bBw=#-^ZUQ}^doruqgS)Hd9e&ZogmXS(j>K0^r48bCEqn<1{#Dk@oF?6 zAR$05n+X_Y_MgBLiKT*i)&6(w+^m7IR$`Jd){6Rbxed-tecx@|!q#c0Rb)T3LDG+j_LdxR>RF4Ey0+w8d25NsIYKO z90$3=#0Coik21&Oz>c(1%>@LibEjqa{;21XL$p%<^UYjUCK!bAuAcnPlgRM90uH9; z=(OR{p}ZKR(GG_|(kI!_M4fx~G0tzsZrx_bq6geXkDp=yq8j}0s|u}cZ7=G)SzI|M zd?BS~Ud(=1flCFN&M7M;30gNEw97v9%Njfjyv4`@VNm>}ypKuHeTV0v;v>|+7r{vq zfw^Lbu^Be^4PX5tF)R#;J%4|j1`Br?ymh7h_o4yt_tB%7>e`Q)dK(W6xQThKd!}O_ z(0VC#d^px%9#-yJv`wainvN*pC!fkzq{yIrSJnlU7o(s+;vc(MUs1}O=DURjY0GaG z;pZ_tyA9Wce`vag5Jm@Dji0BW#zq*LNa9s@^YjY>J@=Y~4&a+(^*Sf}u!;YU*Kh%w zlleyz$}Ll(^<57yQ8c1xI)(*-sGS+99%1Eq7PtUk8xd{J+=h^%qZ`AnU5{CLJ0X0y zKDIf+VW3kTZ!mu7G7qdKW(B)0kLju^{-~_Gx)VZmsTnyDkYk& z(%^LG{_V#Q3$NaUNk)W-$XC&!p~n38pf=0;zeRU(gwL}VM zDLYZpXDJ@zumStzr^Cij1==@>miia_`5(V_|uOb@P-5zSa;ydtlK`zYsY4zU${&bIpKm7am zXNV}DBO7oJHuag_*Py4@Pp@uFk}_XRcJ1@p2#R=)uLwU5IW>8s3n})2=K2~y^@a;| zZ2w#LKt}w$5+2-DExHt@m;K$kYiLxHZe0+`EIVEC*siP8OamvI<|=Wt_P~;C=sR4* z#hu;Byw1)NcsJ^U=VDokM+pzG`r`%I*p$?O_IbNQxCy4Dg3@B2V@Cz~@3u3gH*3+a z;VkK-O_cGuDh-JWw}tw->nk<{J3wuYqN(n8a0}Z?|54kFX1c%A!>>oMruRbM@Ax^m z>!k#4;vA$@(}>Ww))s|(3spwnVRfUGH=B{Al$D=()NiQeF#|8lwWsn%5K}4O&}W611PYEQWprW9~gBzRc>hV zOK{O(1eZzLZF($R(0F<3mu>r3HB3hQ?A+u+r=$&2x@XoBn*m|R{?>6B?G}HCUszL^`KYMH=?BFX80e0L~cOoWH-;0-i_jgeSISPn}*U1^>S8LC=QxAH|Vu zdR?OBpq{N8loYOyBvt{6a^OkBzJTom0nUhBAzu2=#Fh6A;NcNJ3Tjm$#C7y0AJHto z^}SkXxFiu21ph;@{qwtP7eHzF)v12vs}ubr%WVurG5BZq+83|=kkvW2xDU!s*n@L2 zh#JrnHn68JWNWdrOWwpOd1AUh_{Wkc`svtp`B3YS5+;_g7G1po6**=e&{jq{M=PAa zsKE$;5zQhdCVpZT=^{$K43Ck^3N0(6Ylb2ZUob5+0~fCAOA`PIV;2MKlv@Ap+h4)^ zKNB7x4)kgMmhG>Kkbhn}*pv4)Jd^Gjwa~GOf3*e_hGr_PQMA80LO_9g z899QfZGlIXG->_HN4?)Immk&yATlX1TNuH|ke3txG9O>uc%=Z~k@Qe^8KFw@m?_@^O&u=HeOrN{lzOd=FPX4Y&$}mI$N36bParKS z{*og5kp+!|=leAW?4cW(dxjPanIEBjxuFNi@(SS#NBpvaP6})klkB92TakIP0S6ia zKikawPsbGN9w;P?jF%6e&;-Rh5fUPZcs%%l~p z(Oj0I@AEpZh>`_mOO+Vgue~QVw$GF{DMmkz4mf;b z;--vRhR&=JXX>Z>oS^o*5gkWq#nDbsEr79!i7$&H2IBTC577y6QP z=)I2PA|E`R(62&&mT+?h3Or2AmK_fn5gY5t>2RdNXi%6BC2tR1fk^PvF!g|9-Lpn*9JOP@EH6qMF(~c@t8RwgG)faEYv*|B{PZoPE;G zIgZ>+Y?pi=>5Av!7E>H=Bl|-w+HPTUj`5K@*J(tBw0zXHZ2$e*l6m&C%gqQV;1!V7 z6{ov}8@n2&tDp95SC!d$uv99{SGb&4*pY7gMtj*x1G(9od9wn81E(W}A#;Q0YQC#7 zabddecZK+5&xXbBuk2kJXKna5VHGWw83ee>K=x+H)SE1am;#2@vC#0uryS8fvJ5U= z+sDeC$fNn_L#TQz=rY?SM)k zDqd~Xd945bgm3aC`FVnEJuPS*!wYgb|M@N1YzJ}YGU2SL@9FuL-73Mdhiyhc8rN|< zj)K%y?&C03JjAhA_2nH4SGYj2!AW;y(!G^|{U-QJs7Pu$@iKx8!da*;+1~O%)0FY> z?#Y0q#R$CV{zy`))%;fr!OJO$rz3Y9*OiHHk1#^>XzC@>b%`_fY{~sKaw=_w&FTbW zgbWhK%MqiZ_yrBl&v4Sz3OR?GG?Zae-1r3(NbNPqbp-ruBKrEx!&ABRd-{KMExlQY zez@4lDcj6hujfv`bkshA6JiJ-Io$|1zFhhu z+t~-A&rU?_3-Wo9Fj61z0=+mX*u*$Oe49Tt<<ctygS((x%BaQYY30@fq*|dtu70_p`8?-g zifZ9xX;P-JC3$0O)gZK9g1s$MQvsgbAI1?HIVJ2qn!M+rn;S3cJnm`L@@n$9s~DXT zA&nf2Z(SEPHMpkq7sX1=j9mgMMi$?{{}IWT#yI5Mb3G~3j!1`^X|vMa!MTMr_q+2# z2Yep|&!K=1+MCERY%H;R>^s6dI|2L}nduzuFkvVc1^*m*RmpVWfeQblsaO^D!8}1x zsAI}m0}~sqqUkc34}{EUKJ7PfYCG(re*%4mnSb+jQI8ONz)Q zFG8XSWqr?c^O&Tp;eu&uP;t=soXSfjBy2`ah4r#8klX}7Pzul3f$--aTl#_FLO!`c zfKPZ100B|e>hIVfGIAAgW`T5Cu8|wcX7b+5S7aSt%}#%?TMjl@BGtJXf)x z?i%)$gh`D|1vAqvn+ShIjBwj7otMR*hzEOF&kv=z+-{_N-CqRJ;qB{@;L;JwC9c=9 z7G~QW+FX%fUpi1gWpY1H39Gda(3P!wzyM2ThzX@ABM2b+tLgJO1qc00Sitmh)Us5n}%j1stSTH@*t(GI_mv`o50^CqMTBem*M(M^a zda9`7vBo{hRWoagY{v5WNWthnfqMgOlybIQak z-XieOEG*LRRWn3;`*OPXV2@Ur2f>A(v12M^l|`nMyJDCv$>)Zx$B_WUuw!FsOn3%E>BXbXZ7WyAS+{L9&jlBmcVyv2y)Lzby-E&Q!=I#oKZ!3Q+;!mw? zF~h{;nqiYSCiSpmSXEBwrdjwE0+<=EEnhdm-0>&&4*XViqSxgc5TxQjJkC_T>5M9`iu$S z6c~93ZJQx0R}=#(($%WH^XQ}tAIJ(;%ZGXn47DSU%F)=6pO}27W%I?9=-lZHtVO6=!4gE*9j!TPpoa?aKg)Y;1GpKv}^CXp0Ri|NhS%LY&o249=~u6F9!UbnxZ3}?vl5|XEfaZRFHBQst0bVQ262~j+;J(i{-V$jsWesCI z91NOz@1_fvxNqH1p^?QS4{1R`3Joml*hm$^9c+T;p=~psuiAc0X}^|5)GyHGR3m_;ez@ z@6`%QUg!^An`fC;Xwwf|E*GjjH*@Zu zg4t9yTvV^sr`yxCZGjA}wRNNtSXt*dE2YSMh{Ynj3FFnm->SXu*dR#bQK6?&dFBpI zlbJo_RO0yoPpg%f(!t~L*{O_^r_lC#2COa>YI?y`6mZ2svR~h@e0MO<*C1Mle9#5% zdh~-Zj>Dq?;}RnEsqrw*V3JTp1Zaa%ea(3C)qF3Gl9&|3IEO8~Wz)XJpi zs(#XM4HoHv7&6{CToM)7@5WE*tM72q%Xr?Zp`EZgV!!%Tzx=n58dU-EnBO8FS0D4G zS1hTHe`8wpm#l_}w-3LsPM&HM#ixB|g6(^Ej7MqU>Jx!OGxC@kmD0gQ%T>g&_K=K# z!UowquT7Tj+I2zUboZ|*j=9-~>kAv)_~VZF)&hsN+$*{^qbUU?*-kun)p{Kh_+%!w zm_sOC|4oAGjONBWV8O{8XY*F|Fw_I(B(4S@Q!Uwzao1Vm>y3bj5jdG^5=VM13k3iZ zy^x-v!@D?yb?xZmLm`0D4H~nzIA2J2rfHvve7daL{-DwwYWzr@QL_^&E)L}%$RHr- zSZ&SDr##dmYhp}!+OI37&LA42T z0XJJ&YZF8~3WF*5nszAtrZD{WAEkHt8^1r5G|sRJ8}CO`E5E7#++^z&@g-tg)c#$U zrcxKT>ws~p^p*@775msunw{H6yux9B2zMf9_27A^v!U)<7@U0yJ86$KeO>t_!{Yg# z5dM7s>4=9Sg+I#N-~GVZis1Vg50g6=8@rFvTiJJqf&3M>OA6vX;1b&tAQBA4y zGzp56Ql&`yI;uL-ao@;7n)szZv~Tl-NTBBV$NNe6>kPVMm%26oqP;o_vAnM;X>ABb zt;`I*VC66GQMAiF6b4^d0)u$p)?S5=A1`3*ibeM2TJ8_pX~1|K5AlLG202 zAvxvbhMYpQgnu9Qs}j(9RJJft;G*E$^|50lv*yB?-q0?O?_W62ZJ+V7J*_hG#yE3j~eX8oCoMPCP_QIZt?TY2Z77T6u7<#a+N z?&#c*Mp~&Qw%x_%94Wp0YT{B-a2h!RPC^kHITI@KGINsiM1EtMgXAB+*4Y2W*HXNY z73r`9W@kWL22~Z8fv1Il>p8(g%T`CpxrYXp@}lydj@t;;I|o#V#odw%lsRGzHM$0uDr>1u zc1|LH(|-}+a76w(edd8JW%j_X^W_2v zc(47 zHtcb<06WlyPK=s3LpJZebyuPz&cmCCY;|e*cv(`#&_~dO`?Jl&sEH%h5?vcNGb0|9 z11gY<^L*pkd^ExU_{NEmmryKU@6%Tb>#;PZcw9j&N+(eu+A z2N`gi&bWtI_b~V)lbBHNUuA%wFqz)ysONWasl%he{g%DyIW*3ViJoJ%h{LOXL`{L! z4x6~YJ&vC}e`O?>gU&W)j^||5=KDoX#(jm6ir1m<(>ZWHl(~l@qnl_U{Icb?mWYE4 zb(nVCs+ehe_TYJ$QN0)~u1Q%$|69?U=^{K#^Ph5-zBW8%cGAs#vcEc!QlrFJIiliJ z{EV5^>B+f}E|eqy+)%*@f-o<;x>39^T`?Fm+pt@XY{ji1Py z^CC|cRwW$_D{Y+x2bMmQ{zbTof0m#g^o3Y3Wx6ZGbbO3jSdB6f;7+SPXp&xhsGMwh zN4~g%YPD4K5K-yy0*QP1!gTUmBfC{U!l-qL2h!Jx1KrWplcAEL0$XSc9P_Vb;pfI3 z4Xo!w1{8PL)VNip6dLu}PoSoWo+rbi?c<^%z&U^@k#}Qx3kx`Qj1UKsi|P0IP`0Gw z?GK=miy4q}#QrI}m!Ge$x?msg7N^IGEhCbY?T*oRV0#fsJnz&tCFs)InB826y>ci6y{cm8^AfvSXKE9P9PUte#&{s}fAHFp2K~z+ReQ z-kvN6PU=108DU9i@XrZ(?fbd9_cHQJNsr&NKy{BNMqLxLUvsyE_=8@DP!@7*T88lh zL-96ZbQNACH6yJ)a#3Y0KtI``KrE}lmFR)o71hy{r>raUDs&a16z!&K?Rvj;@lxvO zgl_PcWh&K^#eAzQ;MnNGr6jvhq~;&VRAE296v63SFSg%Wb->Lw;=amQTKX96o=38= z;w1%Ryv~16RP)qdW9tlt?pm3S{$6W#uYPRKc5ieJ0^wMay9 zP|yE!AaR~iX9@9I4${d3`z=1jO^@{kkM**FP!7Z9VKBw8>URD1@@-zLmgVV2m`9Da z@njUUW?QpgkkNsBsqt9Z%JzCGq7@9+A|W_m5-WDK-$zdyh9rUMZD8UM{(!m6YjFZR zT&4YoRkMH0qw+o>0wXgTMapTg_Q7O~p@t+1*!nrg%k_5$JgN!eexFO?c8$lPT+}1W z(9UNK+3l&bL?7N-Ug!Oo^HH?v3yO!1#`=~ zJ*P3tgn2Xe{)S!q5pI3cq&aA-;I3PN)0s)IRb=3CmWcYL${nwgopouU#i+en!7CcX z!&>-H)DNfIT#uhq#A;Sdy_ztpWKD@dc-?z(wxW5AD|+RB&e?hmhKT4fsStqqR4sfV z_FIkgyvuwK<74{5K<_55XkpaI_vfEyZZ|9ybL@N$d+~x<-&0t>YOcN$dcGy8Cl}{L z&tGmcP*6c}GaF@cnm?CM8r@FNaIPziHkpO}R=?FmJAcG(Mdo{n&y>N}bN{H_=w!ik zZL`dm2RmC3H(RUdsuj;Cn5WB`RK1|T`<=6afyK7nZq0)LQy#kP!0UGebCi2B_34Z4 zwo6`aA_u;#w)P8>OM_t~_6K8fR|abUj}~mD9uxgB=C+;ob1)z!A2ayR{Sk4V zHMBYH8@H?YDLGs*^--$ZN}%iJoDh@T7_4@P8FmA8=~_39IO|2hp{9(wtp!-edmIOC zQOz>~;an^sOD5$pvkOUQPcn?eA8a%{6E#t33eSIMgx1jXfrnll{!Jo7&{cc(Njl-+w>unw@m7e%YZu-Wm zhnpTo&J)h)GFQXCkDm6OW_Q+lr=q(VYyqGu# zsmv54wQ9p=b6pquVw}&&7e(o|v|3v-4{I)7UggsXJG&n3PyER+dx?p|z2K@1F+>}l zqfSq0Yh8c)jw^CTeKTR_mK5`#t_L+UJR-4fsLo1O;dJA0;1b(EkChRBEgpk6_}Gp~ zlB{^^ve5#wXvK?^pi92R zo1muOJ=<@zftE1DIbMC zm_C)K6wZNNyZe?0G zTJFqKULWa9msatoW4SjzclwIA{-!2*EarGEB+lX|d{a zbYM#r>YtpXlPuk@?8f6)+jQ}?wSB4vQiuFpQ1V=Z*W`|vM!rQTv#kdcTm4G$oWYs= znAt8<4~LHJFnaa&hXc2T&FyFuLw+fOdDE4JtsXfW*huqiop0?S>S(zgo^AL%+Zm)#M^0{oLDycn zD^%p})7iXXkEb|m)P48V!o~DNxe8BPgEh8lYQTZ!N$!tCU@b9ZD_JKbiXvC5K0`Vg zLAOMugw>#tw~sGNHD>L($QFiP&9|@tv+`nG%Br2Q$+f|Mrd3YQT^Wo7Y^rD-)A@6Z zIrJ&`gnctmfROrYH26q|$&xMMsB@(7*z|e>+1DaiFqHuPTl~9sxk!5gVn}+GX>Pmm zr>~KgeG50tREo)eM$)ZO_&|iOzn6=2asrN2;$MhqB}(qPkfR|HZ}nzXTv6aTq_|yO zBFR(Rt@csWJIeCm~z6NjFOZpg{bD_VZ&7Yq1qnXi&b@51cX1?(g0UM8hf3jeT5 zJgya@<$1|`Bg&1T-sD1#2}J=~D6Uf8U(S+2vwQ!AX{(DY1#nb4|MhB9?_j$#^Yb{M ziHyFSQx$4|D`7;3#*KJp?+IFp_@QP{7ykh|Y1i?2;ZSJp z&?BLt>g`k_~%Y{(p+b+w@exN;-#~7cRYBs zE_cJnG-$rij52TyeHwOz7|bqlxkErfs0lq<&voB$JL7}?}{DsBSmW4?;I4Jdu2sM7d#_|ykHBwGXJ)ctp8-c zSNRLV#+4f$SIAZ!xF#=sK3B{h#J5?guAzHOyWzMKgl9bWf_7|uSF=*|rdaJt+SLT3 z>CW5Pb-T#zHYmNCbIha}v`_m65g)~mv3j~cD0e5LY*hfBBAVUH z)Ya_`V*licCokageE%YHe)BH8wG75-rLrCb6x*KK52@DB@T(6QvI`FaPmeVAq$k`5 z0)4@(kl~9ZL_m2XJDB30@Q_j?H@DMf4;YKx-+;P|b-HgEnAS;&r(AC9JMeXI&cs%; zz{1AhaXFax2d0umJ(##b{k0tgnNN-`#Zmqt?YKt( zJ!oKRFRedAlZUVU8!3!~gtgn3AydTdl~({|d$uy@xlUpL={ni`VR3vMkMw7x;^w?3dK9E|8@lB*g z(F0{m+wjDNSKBcMK^v7UZ;tz!dOO*#HSUhL&mmltLex8FQJft zFsgb>s~Y>`(>j`Cy5ZBlYLTqQvYd~o)eOYb?RjMi-KWue0!}t(%V7kqzRHNevdNhX zirYI$d?8^}#nM)S7BAs8!%N3}Q71imE@KXAXAAR1j6?Fa$+5f)UVBTY^WJ9qEPHW1 zyGWtnps+@yY4NBOvau%N;CRZ`fNEfgE&pYTcBW=inq7)$ft$g=Mu$$+c$EAO>SkgW z5A>%>_>++ISikBt!96L=U74;w&5W5*D^xufwwl}OCfKae#YhNQr|)=JE1i&(+gvOa zilTaJB(6*XhN~W>BnP7rS=xovsC4JYAAYDcW;J(uvQB#xlE}agYwllB%xqk901C$* zkVojax$J9k1Q=PopI`ayrzJ0V3s~|kiskpQoPM|DLpC;M29Iq~uIr^kO6n2kv(tqE zd7HHbx%tS)XfM=UPi5k>s|@N5F!Sv*SNo=k@4Ny~rUFej5g`wEPcR_c$-|CGgn~(g zj;XP)ZnnQ_V;i;sNUdl%idflhwv znorI?*F$s=thre%tItEirbQ;5?BL<>QbW+f@XQwKIsM(k|68VD=^|^$JmOTk#~|_y z*=EwSQ!ZF>x7JYiY*e!~TmosZe2$!Av_C)|M&;3=yiPMTzf6sXFh*rUy?*Faw)(Vo zM^wsI$~IQFkR({$j`3Xmv?|IVLS?4s=JKunYp;tEKmWm$vsE?XSbolTx}I^7U0*|; zop{nAV%EO1-5>?Kp=-BprNL}&J?}iOuHYF2uc-O${jG5(_VVuOB?#j|OgZEFQlvpj zOyiy`#y$CyG{Bo>RqrW$rOY6*YV;M3m%H`Gql2;>TZKWjub?86aYWhf+I5ceSCpLk zl-C;Q>?Ydov^}Nmg5~7f_7>XqEE05XUGUP{_a8rLs~a{W@r{^HzjjyUoTBxl%)CtS z4`Wk1V=F8?o{Y zkx3d+Bx;wkDPvEbcrNDRjjw(j=}NB7x$$Fl8JnI`7Yx|Ml9rXB59!X(ieq^Pxz>BD z?ZGAUesb3C(xo$Kv9Bt1_E*8R>W})oN;`?6juQ#=UoMBm#%cz)C+pl`NRGh{-pP~v zYTl?P)qYGhE(A+}QaY|uaCms#uW>e{c)W*)BeYQ><1&UdytTT3$9 zt)OmECVEAajG-{-?5(mg?v33XuEH?MP6IN9k^19hL;F_J=~%uFQN+oHp8Wt6K{wEI z%G|@}5w{1MFsyC!*RS<}D-JJ>j(lm(^ebQ5-*I}8B3s++K7cq|fD6xP#5yOOCKY50 zpGQsujWaX(SC`rDltJo#_On;!G1ten9Aw<;PCRyNU!jVU?M!!UU!rQtl#__DHH!3! zE5$rm@Ufie!jnb!qX~WIe;E4ap-1ZqHAWj+Gtm8BYXGa>ek^af7zyVocqjt3P`Q~* z{_r!pR>i!`s5SRl^qZ_iPIdTPviK61Z7jHy&2s@ugaP=uj>A$k;=eP@%kCb)7%bu3U~OkS_nN#(Y( z5DCOoryDpNE}hM)THOg3BZyL^@TVTycpe$B8bl@6a)J@%C+Dc?+f@8By_x6JsNJI0 zU>x?SWMP>=bF%)?#MqIc;HuPp5sTX`yD(Lj%Xahi5j%xL`4 zU1W>eY^pj>L746yeO_}3CaClBKT~(08QkGtwd8x^SW`FWJ`iobb?3g=0D|xiey~{L zK~}CPdzHJYE^LHLtCyg`Cg$j~Wmi*f8G;s3#b%kH_CSB-H{>bdh}w3n%|X@ z$M0?(BjeGN6|}~8KebA7y!u=f%02Xg0xL*UAq=K?ydY@drkKi$^Y%V^>U<~dqVY)6 zMI)n|S>)r52G``fW!t-PWx8;06Jfrf;r;LPM3OKNu&P=u4SbZmIxyt zuZXcW8u3&vAnlUA4MhKx!{IN}d|1&dc+Kte8Vq;E-eX z7lmhstoGYtg_e#VRsxh=F}P%=GfN*8wZ#!r|l30 zUUf^z7luRLT|!z9ATppsTP;@+L~R5ChH;4)Wf}p3PGhGh_bJ0iXs-c8Us=Kd)pU{5F1?^Hg#rliH^t6(ULxN$A#kQ z(1Zonl8CIn8c)@g>bm4QbaNh_n7hh)`9`d2{hci+Ti@|yz3l#weUm>yAjG+|f2%%Gd-T{O|4JPHY3^A@#p?D5chLvSe)%Xz8hzKk zTEr>HPD*eM?U(be0fY_0CL{pZQjfq}oDM-s z4`zO+h7yoNcF* zMmEc6PP*uv{jeQT8(LX@ta&-R-!1Wc5lwp8x>A!j)2%b$+1Akt{C#01a=#v=VroOj z>6w!S4_jTQ*_DfORe{m8@CD8i8^KQ=XRk}58PrRG!pecfdSsF15TGFp zHM%{s;?IDspa=@xxV>QQrL8mS`nm$>W|VZ;n84KjYJi)c>wzE6w)gINyZ~xteWd+u zr$K8^(U!sCbk*vXGAR`vM~U$FD2EJ@ECdy_yKuYkaRnlwm5Xb!{c?koyv97j?5@`2 z(muhLE%dglp+N~g(_-vFtaG9+L%n&C>xcw$UyRFG|E|kyO6dqvTut&fCQHq4nnSzV zT|x82QhF2-Fh`r&VdZ}^k3bYuoD^?eu+ZRaImu7#Xs}g}PuGPCHTlu?rTZF;VB^}C z4hf+zqVtGV1=6uXiJ9pEr4YC74=|!vgnvX(v2oRakEL$!N-duHd!&1|mxJezXQc81 z{bOOA((~arZ(NLvg$IHV`vsMtH%$c+f7Ha*<80b~@p_CDI?HSHiXyH5weBw1*`ejU zON32<_SXwUE|3JnQT|Th2Klnv_9pADgy_> zp?7t)RojK;_M1giUCI8}S4d&P=uiE%dy9@@ReYP!R~kdET7D$+jmX!mbGut?iTTkD z1{Fr?b(_0q`9u7uAhS17Mq`HH&6(4@LzED4LmIqUP1S=PYX8u=&P4kEER3^ z)VsM(e#6`@cjsiC4i@B*9Q)MaL4Egc4ogGZi>QhKc1nn-J@dwHxxuOR|7q{J<7$4R zCS{b7ky0Y7z0gi|&7_5vc8XH8&|a>sBtL0rleCNWE~8RfnzXg|-t#?QeJ>Sq@B4Y* z|M=_b-sgGFbM`sUdCp^OV-aefC>wUr({R8mEgzl-yE>Y3@!P?j95&2D+|38x2J7vS zp6?VRR97J7GYJ{=s4=dT6=n&PYTl$e+8z@e5nZ}@&TTzy2jV;&A1Hs!PYvAG4ilYl zhdG_zwjcc49sWGz%Za=p0@B;5VMrX9wSFgs!j4(T;$tFa`JHK8 z@ymG%DX-CZK8tpJD_ZKEB2C=^agmd?ft81#CCGDdEP$qT4{oU#Pi^}zfGswZ!(pCKc6JV9--~Zu5q;urFyQ7<%#2E$LmG0VD{$>MN4)AWJX`RWwyszT8nT*AWFx}+=ux(463)>24I zJoDwQyE61Rp#UpCj@Z}dT%Ftwz3L2cpIx48u&LGOwfY;iZ;h{=XSaJA z9O8=@J7q%ExuUgZVz=}t71uHfJhLoz3cL;}RIvM2`Q>_PQNnv|%@MQ|&i}_7<_%`85KKjcZq}kLVaI;!uBk# zNHp9L-^t$=-d~Wqp^#oc>#cadh=>Rqnc_tRd%6NjmX{g zJ#G~b1?lteN5XT)IoHn52wvge%|6pGg9I1J@U)k^ups|8=49rIXCodenf)V`2G^}e zH<#%<&E)3qH}!vO+~2yMxs+|@&`6%L)`YkNb1w6wqyw2vZ)|s4Lf^}dI8oo3z%Lh? z>Jyqu?#xQHcyG7rSr;IDu=j%6#nG4Y#y%WX+E-M}--Qlpe{DUZqe^pa>(=*nnU;4* z^$S@>a|M~4DlFAYdWy>=pyogE7lU5ISl<*p(rDT$Cc~!F*c9x#yW7sRSavc$2G!iu z(m*{pwXk1P8iJVY9xn^@c*N!eVzRH?c|cD0dOZ-|WLd0vO$i+NNlF?I-z$8u@fL5M z_CT~?q|>LK#9%%7I=faKEjQ!M(NR@9l6ebK`Y8iOdu_%$8^=~See@}jxvn;tD!o;z zgsH4;Owx=bu-LZ5sPu;IopdSB2wqh)OWL%?G~*5$;m0+BB9CVC75lro+5=jrUJZN* zP6-PyEN$v@(BtGY>1!5SA4q;O)w|g zGXAxuExwu~Q+w;>IvB#$x_DL9K5M$MiDo+q%hM)J_>#>~$*7-_E<44t)wZSc3dNOA z6C9}Y+l*aE zWPQ{HIB-Q0?zpgObv#OiibDap+iFLJXcZYU*P9-akZ=fB{=;P-7 z09sTtC->QYop!s%J0xZwQZ71GR8vd1qyBtR377>THiJV%!~#gt>kNN4?hxtt^0!Rt zBt*n|$ANil1j~S56nbBqSr0pAyU|-r_}Xn9bbYzpVZfx%)GG6{)s80=VJflAwWc{t zZ;TYb-S&y^8p-7w?=y2_-Z?oKnUzO!?Np(6VtYirtUw?~>P&)px76gt67h=3I7m;B zq@~&91!_jJ#TDl6wE33E*B;-hGs=djh2e}+hK7R*s$Zf`MGBkcJdhbD4Y|pcxlGa{ zG?-Dn*H320P|hT~P$2ErNPFAC7iTd+RHZq0r8@!|*V7b>6!4vo|6&z*CZHofKeTaA zYt3dSX|>a&TLL)DPTrKG^gU~%S32u8>Bga(10Ri7 zhVQrh;0J!DLi4)lLNi|zWeHCgP*z{1Cqjx8)542iUf+ziS6 zD$eqZB>GRP!VarNo?{34zMH?f^P#WE7BdMC#jgEqk`XWK@_DyyO6TvUxYOEDxWRj}&>T)(-^G;Z={x$a zHLEx9{J_u9B~v!CPCbE%OiFdcomO{m4Ocqx4?4FtYJ44oA zP5t(1mWIZOYP*~7KvIaX(`-R_f9X(SW)#mver?zzg{}j_1^f{L4~Hj8A|3^NQrJ@Y zs#E+SX(#Iy@fPo=I)f~w%qfiBm){Cn#oo1a<`5J#YgMtXyeJP*`&nkh}vyO;X#7|N%NQmPkL zA|drl^m>O`9R`NlgOq9zMw+6q8=;(gOcOWipwRe17~eQo%Be1zB@)wFVd z9c*Y8Z-lsO6N`L!o{#cO&}4mSD7)cCFEL^;p_fOLiOZ)Guf84&vZ3J6;WS6iOMDWzNqiu0#tjCA5U21);hwm8AK4pk%-H<*IWImb} z$(9;==)VxzFAenTjt86%-A1OS*Z*qjOU>KhJ*IYYpcS;Dm%~GvTUnL2?^#KCgbx?~ zK4mCrh^W0KQ?>p2apO!7tAT?#6)%mSH62{n76Wu!?isR7s+?~8zqpT)4bw`U`%H>w zoauFAS^b>tZ7YhS<1%Rho!SF z@(RgNz2>XCGIb^8>awor-b(IA=FP4FriJ54LeJgRF$1ksqZA1F#~SQze(35V01Si@FJWr|BkCn4gr#e@tl(*0Cbdh)`FKQ>?SRx^hUCE4DC_XX z<7>B-a{Eq{ zZ@rxPqp{|kNQVcWj;yhhb;-Vu$Rg4L+kjST`uQw&3f0;0Jc*^gWABIHO+GY>(+>-@ zV-iy5L1Szp38h3p9TTR&0`#oy1QKa}P>t6nibZmbX*Qj~^`+kgduRgFzO4wznJx?n z%p@Dsar3E4;eq4~ z-uwH+6|{|?Tc-?+g=$UFA8m|^+###yTx;FkI+|Ix!+aNuRVSi-Ytt^b+myEk+datq zBu{@a=Su*Kujq#sttZ0iDt!HHcGG3*)wFiAy+d8;8w_pAc>3Gpd;Uv5)$(<_sMkog zrmvWB6lHU$QTn+1dE;@)+SBY(J!uo3f{li=-e*}^9{Q40J$Vu%ciuZEjh@$~uxwH$ z?3|ML`INAdm|HKaAILnryK_lr<$5&eTHY0%KFhG|h#((0MT=&e91)*0NYJo`SPuza zY^=&<-Uj!kO_#jMZmGKHoNSldXgpAMc>`$xMM+6;gwVI@wz^V|%cHn6FjL=|FZxqF z#yw{kE;1Z0Ub$xZFcFFI39@;@C>oCGL$s$BK z!DfPwO{d#W5iT78o85SXoS%62qMJMAv^slUWSF7QAAiCDT=>OtWY)IHbk zUpJF(ezkJytfKJDazTA0)ns?v;zRGugzQwG-Of|Fxe+?s6n@$#mGzMu z1meZ5A1)72=(yTL`ON>7lk~vXTyoQ~k5ATgU;a{1nN8dGDlGG6fJ39lWbe7&a>xKX z_>b^0KGQt^sG@eZ!ae=^na~ks!xTlNqT)YW0|Cv(b4i*ODG3@x6hEU_0_jIZc%patdDSDBuj1yTX3pnbf3X zVye=HgQzDmYC9w)zwV6|c4bwjP^g))hDzZsbIshTFBji^G|%ku{P1~|;kIe!4mJrX zPl2Ai^z1H@Pxe}Y{>L`WQ15WF?r~w8P}!z1-TgIT^1o;OO{L>+2FqzOSHXdy}=)A1V>&wMZ$3~arhYtSg zZ}dZj>qf(A8Uskg9auO_y}P9kwAxSS)XECA_71jhDNlH1scU4A>mucq8~aN#YJt8l zLh5pBbV7BAh?9`Rq02(U&_xna5nO(t`BxYu?b{r51~kWreswv+-dzvguBfaysZT^f zlrOIE;TmP#nKQ*RRpFzvx z=;Z5f(`U&o?;W8@H|I3)=1M)6m{5B?I47yrX6yrB|HmV%4W}(xN(CA#oEzdMU(s&> z=UH{O^>ugS2j0kO;`q2MfyRO4hVoVPlu59*X23F2>-v7zde4^gMl74oP2%D=1ATa8XNA}bwf zKc}70+Z;rGj^~=KMDjp{{gaV8gS1xu{YGCt9C^>x_H^Zy0Tvsno7|Vlie*<_Exy}) zTI!pwN!Od{zJ$J~b0k4 zq>~;x*QTkaG`usW7r2VJtkVz1s@VswfojymK8#-|5=bk_+Rc53d5;9r)vn5%SdZ_4 zbh#tHwHsAhXG{0xmpoWfEXf8*N5yzy6@;lI;{^BLH8eeU{C%#5WTwsjdS}-wk29}5 zDdh5#A(d}dZNhq9tvYtKYBk}#U(ru*Zss|trFaxDLl8OZo0y1|Qx;|6@NhGBSuSCu?t1>&SV&~{5TfNV!Q^|?#Uh6-% z3{T~e^m}*qNKbevTKmT2-8^kE+;FY(o6=3Cuhz^&vWmkm#VowXlS*uNZx!NZQcIe2 z8mIg9PR9>CA|HzM5dl3Bss#di4g}QUu!$%tph!7xV|OCO<{&vlK)b77duL_RM^=T~ zIF{0%-qqKjK0`yc(_0Ne=6TQUTRgk^`d^->e#WFmaoB^~jlo2@T-3?R^v74v zB6t&-A_bW^gee0R!`veS56yP;4~|-dc34Kwn&`9Ij);tl`!2xqFJ`rk2N7`pvi*>y zV+DTB^h-j0twqWDNz({jjoB{~AC8i>-yPwW^Ta%PtVmlp-Sp^^T3VD0wdC~O54Wc| z!e@5Kd!2r|%C~q-VlD*f*y1zz&6!&FuxUW7Gm8~FxHbWsLzJGn-8|_s9mcj=R+S@M z(Y=T|H+oHg$iQfhPP3fKHRZSd*4{LGO>)ESr(crDb+Wp;O+;8rv9v1CG>eIZXQ>A& z6su?2UhEXV_p#+^ZIhP#BL!ANel>Z)4H^{uEU8ZtB~n{FKc{FaR$|dZr9bJs8pOj7 zPZ40i_>m!EOfI8dv6^4f%S#&m#%@d%T?6+Q zy3XtSo|Yx8-Fr0PyqC#Ji^|n)P0?Yb9Wm?MVgzw5``wOAxZ~uGwy2-)U zJ)qzZ0R7qhOE;nlJ_u3pNrUB*ej|{#s7%*cA-cgKzwVmGB#qwZJ|Y>8NgY<-)YszM zSFW#Njx+yCl9>kkykJ<#C=D;%c4^;g(iwRs>~>RbymY`+*Res4qDWE3;%xlI)ME4Y z1PgM;4J#=^bPncJHs7L{j3i|U=q=}tY#7TNewr=QW*2VxQIjxpPxl-}g z#1oM*YIiQ{rnZk|4xDw2F}QlMvp@)LnkjKaI`b$UO^r$E}d3dXoUkmJAAnqbfy52pi#L;rv%VBay zN%K61R8oeVvXifO(@2}EU*Vd$zjuf8DqYgI&#pWU!AL2cwXTRt=}7z{trYv>P4QkvI_5=^Tm7?xGBZfDtFE{ zE_W+7^ulze1;yRMR&Qx~eMP7ORm&W1k<2Zy$OvsV7t1e=jPZdAF13NycPU#BS?c83 z)VB=X`3sN#JVo^*LlTV3&QRib9I(MXGNUYnRoVoB@0fw3i0Ld9m+7%=!J?@1#IE^X zJ4+%`LY2#t$9-C}{LWWxnJl<q#b z=I+%!O*O77PP5&@xHJaD4z@OYu~-!_kmBcPNilfka*8!r2QndwNwIsOm(+bkKlK;4 z<|Z}|21Ue|_dAa$Zjfu-*B$Cp)y7Nn!f_x>b>cuLcPE3;;VYS5?fviaMRJtJ7oSKi z3>dIJ$X=Lq8^N$B0*wnu^`ud2k^nmmXCK}dILeLqd+E5oni z<{{S}np6p_lguA$oPKk?vf4nkv3{dqrnaEXE{~OKSsuyIrUa9c#cu4&Av!EJ_KJM% zDLq8IV+Lo6sWVyDjmfSw9hh`&mMgqt8)Y0-E>^@mD`CL=iR^I5^@l^uF`+vQ*EIt{ zO`?{EROvKcXpG$<(jBYk#gjs6Vn3|($SpN5o267&NR7YEMUo?4JXB#=;j8rX$ld48 za&*H>gu}%}r4F+RyIu1w+3o&zwjqR^ZD^IQgt93bHQgYz2 zv)O4mpDpr2l#^n~!HgWfH)I*vo!rbkoRqKlQbt}=v&c+QeeOG?WBWo@!12n|&_Roj zzJsopNw-kcQcmjYaI(^*`zd*dTBHm`a29q&b3SK|4C|r3DRsxzevo-YhAJ|l;AMKT zrE_lL(dVj4kEa3?e44Ml$`T({ar5Hh_8+QTH>allM14zy+zhdf$8TVC5cTCBh&t^U zx{c6dg&WGH-Z1o1TGxvKyv1>w85Ppq6rD{_(tE88N& zE#y|-CS5^!>&Tt{Xk+`gfg$|^Yh>dJCkh2~vN?vF-LwyKl(D2;)>4z}l%&>qzi&9V zS?v6$dYRz5>oL~VP0<%EXc}Ec8T6I6Gte5ETw}E~Jhyp5%W<3TeA`~3i!)(;JV>JM9*S(5F#Odl4N8lGHR zV_rvf;Hn!H-<2anJGpo!)=_y3J+|9WwZ7-VVL#TDvSYas>?ENBZwF0v^TGCyp|-y% zkyC9y`BT{(qLXa7;xYwySw_?;q)w^tZI+v6IIb^5Ss}CSdhQA}-Qk#&{QlxyAz4@a z)ym&e=a!7zsTIdYy)ze!XCu;3EE^KloyjpX7=Lmu(OinvSCGv$bxeZw*~m$*NEP{z zj=w}~sce9YDnSivBI0rdjFFyAKq)S<7IcyBXCGP*~JS_gpX++C# zC+gEn`t1VWk@{*Co5$R5+D?I*jVLXpTuxMjoF8~6O`x|3e~BaKIp|!EkYJ}P)@4(W z35-{&J3PoRC-0W3!0Hw8!1Uzjq~WXK+h-jYL-QNWpb-uLUT*G(f=J=L0LDF@_p);U zU@O6=4av7Tc$vr%IiA0tY>+<>lHZEn4Y)l=34&!QBeaRGNC>8`X$(<7&$+N5meiM` z*<3J=z=aMDdWaTwoEA-~ zePmG~%5R_yx`-gIR_Gc-(T{sDbEB@`0_5`gbpS35KqGc+mG}NpO8lFNP%}#{1&IF^ zSABC$X&8*pH}HOdt64(IP9nQ*TR_bcJ1lCl#sc*+{yZD(?X@uAt<(SI`sGA6z;q!T zT{rpB0o=f!awSzd1H{y);G5@hRhl?~UV=3E9_WXZc^@=f@-*x_<}r1M^Q1g^o(EbK zK)Ib>K2I%fL*?S||5SHbu&)~s!eJ#jq5cL(us?mk(86!a-qI@(VOIj;^&UIMNuW$K ziCCmU`9knk!U4O`KLii1E?O9*=ouE~q18fdT7X-dD@P^nEyHqyF$n)Ji|p_4EyJ1u zfUzsY<%oza+vwkjI7fa!F4PkYOj?IzY*&peAN<{cN-51+aRW0+Q2~!3fk|&)HICtIGlGQ2z7Ez0wH+? z-xzk#c>Y~2oE8Bz4M)4lAMvXNwbfyBFC48hXfuUf8Zhv{9IA-EIQ}>Zt-Qo7_&XwV zCBV|R?3T0oV%945n*7o(_(=3&&)*@vfw>2u3Ve74`GQnrt7L6=QGw_H-4K#C zQlhuI6gf>5>Wzq9I#l^CVU~y(w1zpto%)}b$G#Jk4&s$HXuP8Im1z(Uxf{|4l&7VN zXp7#!AcewLzCA*Pp=cL;v;K`PEW?2)E~2Dec;L|l45QpVPdzc>pZC|k3o_ORIVI-5 zyaxo5A7(BX*M+xg|BAlT%U#lSqYRI4o-QCp^$B_1xrZiSC*m_vA2rq$O^ z!XA%ap#~txU{vZ2gOjLQO+)zUvPk${j1Xdr2YZxg{t6t%4y3AR@V2dvH=pi>O3$&l8}sZUUol z_|ZK1b^PMLoW2J;G)V|{J?19`({)_e`cW*75WpvzXA|5GK&ay7TmDyt0JFm#e5N|$ ze`4`ZEO31J2d?=i7GNv?Sqs#G`va38%Kx9WKtrZ~*5WVB^3RDvIOYGEN3Axw?A0lkmue(5oaM_id8kXw*V~ zsX15bG$rDZym8!m*l!ncT#fdTwbWd%%aj5oJU5EFv0s*pz{4Sg&_o>j_SUM*t&P0; zirYWAvN;9%*v82v!b6FR1G*qGSU%~?2?x3&aw27e{la%Q>@3#{kJc`HkT|$ChFRe^ z>7QRg@C(Q|vFBd4`)7Zpt=Tt8$g~EY>dv9Y4++&QW$NIWHv~}_RU{tD!W8J1&32$_T3bu2G{~`1We^&dHj>y)2TIc5u^#pW#g{8x?$G`8lIJJigE|Hh zcIUNm z^q&W}w6vU*_Ebu|DtEN<92aEd)FJTc?fq{XI)e?;(81I6mxeb->(s#Oqwr^{>>O=1ZSPq6#CO=+>$Y_L3)@><`~s8Daci$*aQqiPu`g`%{tA z*fu11t*u?&hzbNZ2MENV@}=d()bcolmM6_v3{qyLSdeLs+f!T)Z$(@FEV)~Z&FZz= zIq6P3+P-6t=vw8@n=N_IXiC)G6UznEz6-`5F?$Ki7EiVF{k_QPor!1tGR0l98ZyN- zb+2wJv)_9xR!{EQ(PYI#e^YQz)JF>SfnIX$DRQKd!Ck7~9(e%q;1iRz!uus|Z1 z#Znn?9dDK~hDvBY61q-pRa%CWRT@uBM+8+&`P+aP1ZO+=&5b%3Ypy7MJHy$+A{!+0dE>A;xe=jZpodq}C(Q*B}LW`_f4 zEMw4E)H;#jPv^vcUM*hg?xJ+N^e-3kE(J;t+ov7IBbQ+#O(%4*BU3S2t2tNB#_+24 zF_2*sP=etrK3<+n8{Ei9f)&g6H3=;zie=<9s=qiejdPo-CdDC@Uc*?KIa@>{B|Iz6=Q|)2R{rB9v{A!g6i3<%J-f7 zaT{`UrB+9TOCJ3MdPxVY2s!egcz}35-~A8dXrQt+0QI);;R5&#)(28-9cwOXp-Y({ zCn^6aMuo3D_o2rBOwP%8M{0$f9{a6}Y- z^W#5Y3BwBsVUs-(5vUr=g8k_|w23=Kz#Pl4m5_1^37#@cZju_j1KrR{$l2+=UKg+Odr-z^yQ=tI8&7V+yiJ@9 z7R}KnbAP*n=*^hs*)s8)_l>TFpiH;eGMrt#I`C{*&OUUNk3{c+KUNt-zWxt*{>>h+ z5ilsilb3gnUYwE`K5oZi2mB{M#z|}@my+}!+Kr+t^oCJLXG=al$>JXzPp*jJqp%R{ zK`Yi@l9NjXoO2dOl@NX#;sP+Zl@m}UgB^#RjlZe|H;w>atOwvbLj8JCx$Y*pEz@mB zw2UBp5RtA9Bx28WnHz*v0XS49ucB;;A2iqhqE`g#`WUB*DMOGNikuhWa z@^7W7uOfukmlI_JIkOe&(Lor~<=(?!Z;)W#IB}&45#w@Fc`k! zWjTBBlUW=S@BoYO+!92OvVwrvA@MSs@i<%ixu+&da;fIJ=Wv{cuqO6B;PgG25gxAl zJgQ-5chPxG>|~t5k;WX@-_pNXkub_w0cEVbyiuok%T{tJ3bhEd!7ZN5Rt$nx98r*o z>UKuh4Wp;g2EyQ&g-K>&`$W)D8INxm>D|wF`-w9g`j`3(D+Rd}Tl4VMxk>zPfp&lI znop2geGF#BMPI82W!2ljF?W<7kP$>)@-Zi)Tqhi@`py8CZ7ixFNDr-M1+&728AkmI zKR4J)MVcfE6+XBir+a)9wxT6%fL5&$18qsv9)%LLl^DQitZM38l(vdMTg4}}M{#@m zVHB78py30w^a~vloGi02EspVs!mOq3ipncXJp8_iBsj?G9 z+M;6^zOoCSv(Q8Ma?p+CUo8*fDX^&8IRh#*$g3B}4>O<%Y)J{i25|!{+|d2O5uNb@ zQ0W5MHB~}z3McIEg127g**gdP>$BiLoUKSEOj;fS99h-YxU%~`klJa+se6R5#|;b> z(8XOYVf7p!kL7?aCf9lh@(oXeZzyMxtc{j2#(~!x$0>N5AUHBufG#ZT8*uR&;`W9< zNGE_vfrfl+bY23f%UjV&+JSA`6)vHX0)Enqy$K876z7J6e1s`pD*$0Cs&ols5FfyR z52FRH5Yz~4RMOji^mfZqN@E_3*rNc*(Y{Cf=6>G+Q+9L}?R29r-zkc+L4E2%>C}JeVlc;gu-x+JGBv zF-!Dr7mjj&iOjGT0KA23Eh=(c;EZsqro16YY>$An9Er?sp2Hq?EzG!9`Kl-(M8O)s zAOjj+jya5RszT<$yOfL|FjiZG`(;Bvgyz%yl0jG|IWnexat|Kl-3ZEKV|;_u+#n1y zP$|SDk@e4n{0(V0!yxD5G-#>YIS5~rbUN`UHJ`u834p`@Y8rYan0yQbZk&lQnY|AS z+sAL_MSIXK6rK5NErAv#P{>MQUmv52@DxbPDb-#)>iXw_%1KY>MSX3M4W|gD!CCk3 z+erv}EGIe-*5$nXx7{dR;3fyCKVQBC8GikW6c#3BFN4ZO1k)L6Ko~W{ zK%Arb>+gT}7xRVYHNz3WTA3|6H|4K<{rkVH2d%UItsvTrJ_x*zkZ5t|dF21O??2(V z6iiat*8s6O7#H~>zXSX?I?ZUI+f)Al_VVC~4xXb?7`s6Gbq||T&k4tA$g{~A1)o6W z2fwLKa?p95NNX?HHS@&3J7;C{6T zs0<O(o^z-3gRDWa-AE5(EzPh-<*Il?Qb~YCqaMAi&2I_ zRb@2jT~YUabY33&+Jy)LgSZ8NZ&9>FgX|(%Aj*`Bmg5xzdB_O_>Aj-;Ol2O@Ti@ir=$8Hs2qM)M1~4W4+u+7`m#Y>eE0`q{y^vV z562+TI9_cpi0a^Api*#oa}+^1m4rc(TlLYqLK@y6!rtM$1c50=g<78a9KJg(}@12w}P5RjK2 zk6Td$XzTRO4)fk27e>qT zWMUp2aD4GYlPor`yZ{!>_ML>eAAEZufkNDSZVst_kHB3oV3#Dwx||jT6RqP$kDf;@ z^hNN*$|AQ1%K&>}IOT)SrLCVUEKJ>C4ug7q8$eA^Q2|{l2;DU4Iu!3-5X^Yj-WViE z7p_(TMpf8shXZ~Q&;6j^k{_^afC09=_2?wb5Zy5wR$L)SU=~W*qP*WyoHY+JtS|U* zqTfW&g|YiV`rSPZ31hNzOb~qqch<~Jf*}LKIB?^0{pKf-bkBe=U*D;?&56OHunJFQ zMCUa?gJTzKuoO1LLneedg=AnG$WEuCH;3B5WOu|GmJoD0*90k-<}c35=pZaG3)Zbs zk08qG!ytVHLnBlbx`KvweL0G!-ax7A4nCoWPP-&Z6d52&NhUtmIOh=sVkqVzOBM8t z@FN|aSMKY5W(1l2HgE|$;*1ATbd9cO7KsjiVEEkuOOWZY4n0&018E5_9X22YjO9dHfPnqH zb-37V3WP_5bQY%f*{;R@wrhLOOUw<3ToU|e+t$TfARAJ!qlI2MEP`Kw2apb zz#xmv>!OT5ejKv!Z~-d-v=&I_T0;n@VrT&Y-l`tx!O=orWCRoE{GM9 zK`E-y1X=7wQnoPf_e1Ue<%2CCWaph(oS0{U^lKTU9bZ7azlo1V0GPIb2s2dN*o;x~GVH&i2b}ZrujpYhZ~QBI_{kfHq4`(zurOv^ z82l_cj$QcEKSeYDiXIkuF#n1k7Rub}g=w6BMGyaq9u_gkzoLhELGr(%hXtv?e?<@T zc;kCp$$v!;^D(mM0Qz6i!@`4xe?<@fiXL!>6m!AhzoLf)-p9Y9hxzP5_pj(-f%oyR z=wV?J;9t?hLVWxydRUlo{8#j_Kz)$Y{VRHy@2rEV`B(HX&))v)?yx|8{Oj&8k2k>3 zVE=V@Sb&g4Ro;v4oiF(5qMZECL-l{%9Ts^oi)spu7G85)5G(!Z2x!@&8ag>^+EjpyL-0~V8I z5}U*i3%C^+;ps%Vf?~A$LB>k}%Xz(8)gLv>B6s@xG|z#uN1Q~_{-c!1YPc+>x%**`*fQJ@g^Rzzqcskg!RWzPI; zBxS^0mav7OMpB#)0FJ%4%IW8jby^x@6yg)^O_=Pf!0Vn#%&kJGyPn~8qyDKh_6Nf7 z`G7eDSTsL)2JH;=SONpLnlhdewwF7wmn~Z5XeX)D$ZMppB2o$5%R+^bu~41h$FOiU z!-zSLaSM7|5Q@gVas~KJ2)df_5MF=h9=JY?_FP%0UYC%x1z!b1&t55GMchRjb7=8z z$z@DnTP#DMOzq}*w>se>;A(E1P~sHrl9=K21IpYuT86fgg4QrbA>r{Q3mo_bfd5XW zw}XWdcyR&u?5>6=XysMe1a{Z)28;;&Xb3@t%;BZjL6C{j*bWFW)(%EnVEQ?OE@Lpy zCg?&G`4`ws<=cMTo2Ev`Fh(8spK$+f-+#tzCA1BW{m~I(5t8vE5L~r+8$7h96qV5; zr04r6F|PT?pO;=hy81H!{pSy~IQeISIb~F~62$N1mq60WZhuAFaA$l3CA&vj!H^(~ zD1vs6l9IyRr=$WnIQ>tf4c+iV$TBQEBdYh@2={_O0z6@DlAljtO9(yW*}&3RT&v=R ziU~hJFb4qo3oB&U=QJ}pXlCYG30YkCF}&msgE7kG#Vu!!Q0X`(k}$Fa!K;FD%gfMy z4jC#ymTURS@CYoPyn%={KM38`JTaHKLC_Q8ZE(i>GX(X7$cTZ3OCG5;qH`cDcJ|2# zVOQo(BhTo01$fWFjuiuLp{GrWBgjBNJ1MC<9wnKCHYk@CE(cAUYS&WFf{( zXtx~vI80*`z#+CWTyky>KOdMwNLi3DCQE<@?h-hu6RW zWtQIyK^x@zA&(O)6WURV4=jwyu^ehtL^9xU@6z>;2<#{&02nd3X@>S(<3#4*i!LST zc4r13Afz$xECZ^`7+`NwKiXU3saRjbvlX$o8gZR8>+b^~8~0ttb2O?opu4Y^US~Jg z97Yx)89xHS_0F3z?V>>_q5P1imV4I_+Ktj5p!a_uh*}ja^2%;t0xLoMP6yY+j6&A@ z=qdFdX!jF75w!$iBns^IMQ^VpR5Nn|9Oq9wM;lz?hmhq&4zQUc-)^EZW+Vw_*TeHi zn;3MDD8BwQXDRX;eDG!TeQ=G1is?^-7Mf(Z-+5CeXXPvOB?q|QSudONEC}av;@pCz zH4;Q}Kks+GfQ>oaP$TT>?rG#vb)pb96s3t^`&vBW4G1#2SK(cpW_M?1bdC(z81|k& z%C>l7Ll^kr6>Vx3I>%XX zv?CL}cf1YoaX>=M5kIy-DI5(-D4)l88jU$JVQcozl?3*N_yic>*j$OC&s`PF#Rvyx zmLNbj!pgg)j^lb|FoPzOZ9Gd*L&}W30EhEhCC|BqF+wnhWt=HtvTp>>#CL>vjpBq| z9p)4!K@~lYdVgV*exO7{{;}gI91GoV{G=sg3#=>iP|+Ek19_p)BWZ-dy)04~3)KmJ zfWT?T+j*f6oOT#7cQ%z0)XSO^Nl|?)DMP#REmW_6QC~kakr%vlBanGcRejZ$ui8M{7J?}*vy_&R@m5` zcO*FZ@c^0R<|VMrR1mziCnr;Zc9mPCq!t792S9RQCr{Q%B%)MWn6CZ9m|w^RPrT!n zt3M7Kqg`|JXi>>WVR^{@XNyXyi|$XT z339HqA>-|#-!Osp9<>Lyr(lT1=k-$@Euq@L4X~(2AA>$Z%b5&p+NFMDh9E$815%HB z*?XW`O%}9Ta8>}?fe$}6!HNMT=(ol2pkAIO%rShW8n{*Ro!!h-X6vjezf+rvg!yvj)kiqht zV1l}3E;2C~Fk;Le*HPFkR*+8WHv*uk^s zS+EXoUV2xU?ugaP*Iah{9E+8>Un99MKuv0;q7!6EvXP|dLz1# zq1dL3T%CIf((|bQE4N_TiNsm;62GuC7QIMacW7Q*Lgx;UzQ!`5&c#P4f^ad^W}cxZ z+Q-3=UY&01i~5xiTMh#uS=~DR^Xzw z-$QIgB+jLmXdXB5%cKP`srRaSb9B;lm~>{_qpG)~=YtL9ABy`QL>2cR$XC6_I?F#T z|D;WFy@7(rJlCNOc`I6`?&}=0WRSx$M;{vd(VM%p**Kp=j zX1QAOhIln2r=P#VX2D#JZ)wq&EFJ=Kxoah^nGWq;zmL`Bnpen@-Wc7(j7?5T>^*nz?7x1#)+8(~S4Qn9Ya=*4msDCRqm_hn#Y@pK8m>}LX_VA=ozL<~=dC-c0 zp9aNU9FjB<7M-~F4A8T=Rm41+XJ*WTR~Wed{O#{FcfARA-|kqIu+i$2M74U4d3ZR1 z;K7d;O@}>%u#UUuik2xoC&e}PkR^+jG)~OTNx@?nL76ZQU+^AKz3fGeD%3}AM8YYN zMk-oTiA?uf%yWA0S3#KjOCRIwV=rADhCT8>!c&F}=idy>Be8rDmYDZ{L;c9Z;C0w<^(Yt?qErs+aaGzWtm= zh-0+O(tw^;(|B-_jk5FLFS~yXyWe%P3MI%O*q?mCNlWj#JFn7gYiq*IQvOzC<99z} z(|=0rGqoe%vg$TW&GY-9gY(~XEfB&qiP37hK51m#xqGi8qZCF!Q#+2%S0p^b3MboGEy~o9rOEMnZCm?b4DD3SiHW#I2Bh zC*xnBto}n7rUAJVg&2~#KVXnYn44B~sm-WrbVOR-ew8GBeEE;x{`N!AzSp!q6P;Yk zLzG%Z&>&?sxw`^TsrG9p`bYpH!WXNr=IZwxks*?iu_f`C$BDnPg@zQidznjLsh9e# zpWLMf(PY_^SllZ=jt~WK`LkCC70I42x=~e=&!=(c)Doibk&*74v$0;G-c}z=`bM+~ zI`9|v05Ivr?cHcKkOWfL)8EGtZ%Y}}FCwYxdT6G>d%T}Ae8~c``c>z{J$7RI7Mw>e zI`l=4gc&O9*;Dp#nw%doyGv=>x0GwLoG6@_IHKSr*=g_3Q9qA;Gxh_Kw4~&5{*(_e zuTVgL{fT<^zCBzf{)2^1f`N8Bnv$qrI;ymV{GiD%Do0{3r^F6j_Y?Lu*6(C88TEe_ zFVsVER_;BVYcp4xknv4DUA$LBNpNX^Tmg=9R4Nr)X-IuyU7J$qy*WrUrGa z;__)2ZzK*X@U*z~L$PIm=T_=!|KnhJGmwJe^($pdN|*653o{*}|8CNzCzLrvN^`QX zEhRJNTg>_24Gpa9^sqOGtL1Bo?UViZhS46k(4ymJ=)#Rud+ujWa%@kjn|XLfv!9ui z%fiUv)+c+jOGlSf{%Mqa+YJR$jC%8Sdv?(lO@FOA>ac+~sUm3J<9%mHYG;NU3ww9k zy(kZ4N2kM>1J(NWbeyj5sH@oN7OGCG7i`m%*^_3`?U^0x8MSn6Aq7dA)n_eo#xni#XeJrdreKe10PS>K)QYilt(SSaFO7O(@iGBvEs<*z5(#yl`+oH$X| zHdUFe(srrU#alF%=FQRzza=*H$0Tp?<-Xb;pyO$hKKnIaQk+*LsUmRRhBuPb+D?o{ z_S#MLi+-pq#qrTe#L?1}aI{y+ydli4kWTHb-s!&CyNk8PLN?TBaw&q+Jyy}+rH+~G zOY4_$=v7}oI2rBWDQ{qVJ6L93w(iC1lq}pM{pNb3eD}@nC0#u@@9;eHJm0erBgJMLCl){HTUHliH0ZCay8fri zB0p2#?WR6EIa6hremqPPJzrUdMa~zPvSbrK%1N{}UL6h{NDPPR7}Pjhp`i5(P!ek3V0kSWeUGX~R9mKbZ@Y2DPlLki+pGiffYC&qQ1&}tNz z6@Xuy^~EE51>uV`!Z`htCmL4dC}N4iM{0Md*8A?qM*U!N!@F&X56Xx6yw&dt3ML^e zzEO_k-m=G&nJ{z#TVu;Eo9=L?zvRNf3G#cP!bbC3%7+rCUV$-s0aqeQYR1Pp1rnqs zozMJ^TuMLd`#sRqm+w{}pR7I>uJ@!nR5%^0K8;WCaYF1n%619vfdk1i2~=;TYvYwL zd>5;!i436Z3mCtS`6{@g=`?9`^zT##_%~Ojv z#5;FARi6~4hTYu7Z(-#3e_`;M>gJ4tW*ir}2IlK|y4k#lA?=ut@q|jj4+}ljwyJ%?mOYEGDD+`;Uzf>_qZtS*S~P15$aM}7 zy}5mM9$4~fnu(YdAtC>Wfkuq-BltFDZZI9|$45IQAo{V$#gq2jwt4r#q+Epelu;B_ z{_h^f(8#5B@=rZ|?>=f~h0!SNWz0hm^9wrX{cO?V$A*;T)r>gBZ}3KWpWb_o>tv(l zOH;3Ta1B>1{Ot`!JaX)huOGfQ(i7LW`QdG|$}ll9&@Ro6ap0YVUkdp{o#!Q0-P~|i zu)d1Xw%fPo^(n7A|7^%mQ+U2CiRXcLZ%15Y{u}7cv)^A)>z7C8IA_Uo5-jzpfLS^+ zD70_k2jPCFG@%^0Bk6|E_TqxY-edlvK8zv9B*?m0Rdy(r^&U4un%l(pQ?z*Z3OP@5$|Cj^CimGtQY4%FXz35O$(|lE5G5u=%R5|D;CzwGq)|aeB-+(>jhjxp0ud z*MwrPuPvdbWZI>smMlZfv0-Psp1o0i{*rqi`UWdQNklH+=P794;F&57uW@u z;iay%%1IIN?ekx`-+yS0B%+lsPD)NPzy%|akfJJq0pD3_|B2n?#7kkEnRah)?=YVw zsWANFKDx$Rt9d4;RQS~YMtvM#cdQ^c05|aH+@BJ`%0wuE13tbI3U=G(uU2=k!ckc(PO7QfvTjJK@7zD?p zM=x`glZyr!N;#x$ER&WK;>X=@`>yPy%IIj9a<^}$d2H_lC#LL&W3W7Erxmj+Oec<_^^x?q=?+>gW?7p{ur@s~SMXi+8 zGm=TcM}t1^LwRWVN7p3R=wZoI2^e!?cyg!Y@7JaN`Y*X2Z#`mQHhL`1jLf#wc*33% z^)fj8d2;Ee(vZQIHOeb#KH1jl1$i^WFRbsl(N}!ZRT7nMkoV2Z&Nk0pOutjW0!u{0 zvMaSV>M_z4VXK%`_f`Fa+in4;8V7W%tixNmP3Z%cFkW%p=bT}cQ7{!@S#OE6wB~-t z;h$DSe2bP4%V8`15f6o&e$ExzQyDMZhA6}vMEp#a!a(`pZ|hw?3mcdv{b+sGL}qLM z{VeLdXmo{)P0lDm!4l??9mj@*UHT#3Mgb|L`G%6&L z{3Q8S^0ZKa&~z=PmaCSycF2{(HEgw#=UFy&Wcv?eF4Ikmnb(N>=DeSHlzDA;iZRAo zfem913YT(N2RTM3GvU%(kzz{XU~xTU0HWc-7k}z&FC*p^s#)$G&vk=uZtuOxXl`)R zHzJQ6-sh$#8-JR+@vY!J=X+7PHo0awjZ8PWoKLl%;@c2yI&J8XuzT=?r^-Ic-&xQq zp^4|sgJw?Jg89!!tzcDo=~f@|T3kO`p;s(;Y|1>!q{>9ik9zVJZTDRFMizS(r|+=b zG37MZ9o9ZKS15U{XRcdVA!2bd(}e*ISf@i9MqF$}ZBpFcx`iBwK1c{D>bae$n7CFc zqgQEHxp94x!#y_{ZIEpcFm2{NJkw)n+tl1>cg@(pov8Ce*Uc*0VY(OOC**wO6m;>S zbD;sD2cg{Zx}TKkYfOIEM9e1XCp#xq3Qp5yiGo}qbGdEmMadgU1ijR~WAa0Cgdr(B zwZ{7#G~P53-Ey&$g*V1Z3P}wT4Vr3e>N=;ar-i0Dr!=R>>Sj&WiZjQR#+O8i=r8D9 zL=r^AylOocJvWceyStk?CT()Y_MVNJ%9vJ$c&^(m_8iU3Pj7zPRXCVfAKJ88?LI2l z_x)|L$+|zedGyJ&yK{bhzJ4FR8+*dAi|jl2-8-K`^cBw!KNw#ZzXJakem6eDwRi%v zYa`d(2GrdeoEif;z^?h`pC`lD*Y=A(hZ2S9A z1HMB;e>49_8Dh6&cA2zfXTnND6K=UZO1Mi$ZEzFIYYzGGBhIDd)3`#3u<2~;NjvAq zx(5zaMIRhg(^$Veg0R-B-FT@VKQ3nfyISWL*W-JSf+FvKR_G+|oQ(8tBMdd-X=HBY z%VJwtytYO>#G)T(`Sh8^{D8u~!np#W260|cp0H-qHuFjJc?z!~=Cs@%SF0GdEw#+5 z&$)iv^CK)cCCfXfNEw+jms|qM#`odD}I3pFl5 z0luSR8NJV(f}#^1yXBpB8s1hB<-Wm7QGA-UX2zu(&N5<>GvPV-$bG%r{K2WWDfWDK zId;XBRpPu}C5-ZRmdC8P57DS0VU&>V?i)VuU&-w$55@19izT(jSD5iX7q)ZXqumoE zU3C3HmZHZOCdBPMQxu>Yz(G3OtClod{nfI0iXaS0a*>z)GV>+O)h2zcMdjnR?7VEj zM|p0;s$;#9;$xE_O$DpY*vEd4X^`{>E)#tXN<*=gTrPT*PJ&J~uTOfY8#z!g>w+iR zCmti?P&c#=`lD8p0gqKrfJW?~icOvkwasLAOZWXzoqWBb?4 z#5>1tBO!vc+(waWp-}P}y{X zb0)DN+5K*f;u$&h*h9CWwc0hFwaEvc?_Fw?JtwmhF?{tK+3}pvr*2>4yWzy?8 z<{x=9@1#%-QW>!FsEXOA4Er1nS8I-`$*0vuTK-oCi3GSoUiUM_~b=SD+jO?rDow7>olqXBjjaq7kq}A?+LR+U<4{i!z?AvDR zeK{6jXLfTNOK|7S`cux!sy_JA4D%F6W07am{@b~CU9)z`*`du*#J=&@Z!z*EVVh!i zL=ZbN7r&L-{c_54vig)$pyF`E%<#Qo&xNoZq-%Y6)d+H@!kr2ZnwTxT#hV)NyoH&Q}_+Lp@hct0MWZ+UR;r0(?60UvKDcqXMdm`h(KTdnb$0S*g0NZ2S>z12w1f}oSbMEKQIe{ZMT|DhwjXgN+U6}uMk^j1mjG2q6vz4Q(m4iLw)pdu_Z{;ysC|5KqZX3o+McEC+t#s0@&|Gw}4 z-udqnMYylp{=fR-Umg9=R-mWFNJO~*+iJjH|`_~d! z#|Ov1>a;`R;7H&o$VfswaM!2d9@Ha^Z94)DtX~L;48pT{ac|1Ve#g_^ULN>Wk!gZo zlAe*v2)eUAUy@1BVbUHy z#A}V~2M#&iD;E5VmI1v|d~HeyzNI9~h9Lc$b`df5=MoS}@vZiKTm18$zOvHSTZ}}l zTYqIR+-vt6a3pi(E`!Dy|E`xQ{pSV#+}QtgXo%q(Mo8wRj4kEgj6vLML{d8s{&pO5 zO8|oy$;AKRkH_ynO}dtTO!gOZ0Jw%kCJiIe$g=p&2Qq(WX+QA!^}ic$X#=E`{?_}c zAIO;g&eD=>2>idCLd#cE=v3|d^_zcX={JnGoBnRFQCjZfT}!`@Wi@&CcTKwTbbmM4 zh4>74sfsj-op+4#M=xoHAT_`6B{^A!*Rpz0hP9DLEK&e4gHSyEJQc8}Nv znsXe$d{@WkF0RXf$<=?4M46w{1*6 z7Z)Bj9UAXi-Fs5>0mt+DNyqf0CWeN}^2ucWnQxSmne1awCl|y?v52cbDCS(J_WJp&9_4VGc4Tw>=V6^6Yp@R=<~iEXr`{WoSJ{J z54z>eOmraNRCDt7HuWNhFwZm$w`&%y+x;f;`X!3wu})Mxa5Y9(#uDi}tc`-YyTi}^+6is@MM zgBbHxcKCE)4@wA9MkW;<9UV^sUg=VvMGwwPB@c4Lj>712Gfkv#FE2sYQil=>@`Q}n z19vHiVyOL{U0l!y`q%$Bu1jEvj=x`HKi@BOE|QIiI-O{asIk^D4$^3vPHXwTe%%+h z?+)GV@iXTd&l7=Vm$3c7XqqK{khZxCRz`2`cZ$QoEPwOIzA}A^R@O z>akiFzOn=s`|EVOowL>&LqS493y5uP=4y?kI=i#CUzuElNpX0C73M+MX5#Hy6#-Br`K(7^?MBNo_1rttmITZl2ao|4)DS1fHSsMev1I5%byO`xBdy zi|6U{<@H_@(ekf8`4LX*a@z=u$(F_RLabCxB7L#uH~mXNl4f5XqsyNvS=58KbXj<9hZgTpucd#=M z9edgCWHd%|LO|fPS8xR4d_YB2AfK%o6FVmUknQZv@v+Rb=)%M3m>5igkh^7$O=0cu zjKNwN)OfXq#whRLI2a!v?|h_4ZQ+tR@pA&IY19Gr;*-svdBnH6ME>L(U)~g|SKRFk z$B_KCe+fIyD5#)ANc=jlyHpY@Af)Z5y*~B?Tx}7sdy$~Im&ROO)k&DHsH7Mbk&>S= znQqi%| z>>NB$9TpieZkd-q3Co(91&Q1`WtY}| z3}gE&!{1ZF2e2qAG~e z6($Sh3a@|#ogWpZr>TM#i(H#l?CU5$5Rjp??jXjmFkRwm-B2hN9h#g}D!M$HP&_*`nSr1F%v7_r z19Cng-(z;&de@r#U@h7|%sqPvqypVFB*xg5lFR8oOKiS>oyCpudT9emUZ2Gp?ONG^ zJe-DWB<516yUuJ>lZz(r-mxu}%>6vi^tg2^s!1z|#c04NHf)`RL36RN?c23$7^kd z=7%$qO0k#OG=^S1&)$>%;XLlbQ#TEbhRaAS$Zf95q_I8L>U0?!?$kY$^&_c6Cs=cIw@X%!e9Un5v_|DQks0)~1SGkz^u=aBi(X?W55z;}@c%63`uBWW(OZ_37hdH6ZwD0>SUhw=LpDS~lbG zOanWn+$?cuOt;Ry0byAGV}R!F-L%*g@0KgK2W$QEplw#&ZsH9N(%>|el+RH@oXUO= zVrbad7ka;FApyqHgB4!;ZOzKfPIsjmpe~W z`q^fqih&T^dEa5SMDx=3fK#uoLjG*0*PEepXnpV8MZUAUyL%>|H5H+bzBnFo>Ld8G z==@b2uYhZd8y-pUGuQiVY0ItFzKaS~8hfW*eCNH>rKYT+q1MC`lZ95#uH%)rEP4Hp z-hn6LtrS(K3JUF{_Xn6Q@_dyY3&dtVx{O+?DTb;tjH?o}6jWQm-}j2 zO~{!^HXittB61zBvO4wK4;(Uv-(2Dk5^BaIbJOCfjXN!*y<(3scS^jbG?vlp==6W`eNt z6s|-MFcUon8rpSwvod15>m2){W@1S(|`j6))(lvW0%K|SZeOe3IEYd z=wAomw~;M10I$WKjvlODOJCJ3ryu3$=!2R}xdXt-O6;X!TH%KD!mkBmkQA26Fvgq@OFkMQ@Z=})SLF}x_MlBhLlhbX& zVJr6|W0Wr^H#c|4i-Xq&=UdMXS#p*_604Sz;Y*fhp~`Y(2^bm9Ybnv z1AAVj-r82nPf7gY0vj4VHxLB{#m01EhL#~xk02o6ke#a!CX1eF@B%T3D9??i7K5p2 zV%hjOd(IWKoSlPV=e4E1D40&)-SMWPj0`4f>YIgMze?ya+Kz3$&_Q14HsuW-mD$$8 z*XErsC#$v~u*0{|VUp*4>qvbD*+fzQz`z7Jd1P#C&W7*M58<3IU#vzLkRY*#0}C!3 z?yi=zs?E)BsS`m4IXM=XnF5W>$i(qcPP^H!3b6(3Vh=kH?FrpyKstpjT%ji^|}^HnAs z(kvAYR6lFC-py~--Ip(AGBKgPJDfp3v%byc2^jV|`EpKT5yRRo$Eltw4p!DNv!;ej zu6N)FmVTFunoQo;+dGE~$teY|2By@ShWkFo=H=)ASh?%{>p_u-1)fhYIs&`ZAb5IO zcVc~ysvz-`Y+Yr^p;hP}8Pz5P2CMwlI3ED*L?N4Igbt!2t#90$Sc-~@iUYyWe8^@d zyYcFY86SzI@zDZauiq;|h@VcoPy66*>zD@lqQ;%d%J?^tZrZp7IjM1**3~HP7?7tr-CE~`gZCS?ni?B;cNU$fb6~ZVh_I>| z&(z)BJ&p>k`Vu@N9t<W$qr*VRw(zb?G-@bV`c4)BUkONQZc>037(>%#&DZq{zXb zNR<**D7)s-FrOjycypp~cTlPaiTET`K{C2H9ltvASjs9spsSNRrY;YU`rc}evnKUw z5F9x+z(VQP+poHNbO0$_VL%M&`wH&S1_T~s+K}5=7PH^CSDmR4ik%%=3RX24-_Gr@ zo954KlFu`4i5{;y_axM*rq8L9gnY>RB_Mp>ebfK*DiaYk?d@C_xl}VeS=O#0SpU`^LEhU4pcvg0qby@zv=g z@xo_!A#N#VzC#CEi6|vQXkF4wY+};~BLucV?07j+h*(OenH#M;7SF8ec3O|+E1WG> z=xaDu42jOMr$aWJ9tw^wXrv-`Di#4<I&EByhzUfR(0%ApnfNo%-9sMv*7nU^ckSPiRNsTw?~AXuHA z-X6sEWF+=u)!ORH9`)^8g+MM!YnsqSAek#oA(iaD+If0Ju#_+x-zRzbq|$ye-NML2 z2bPtKY6sEps!QWbVo=%8Qiov2rCY=Kbr6&;SdzX8o`Yej)*Xv6O1 z>wpOIeUF8Ms*24bvOvg9&{M{**P7Z;@<)Y)r^kxF3LN(LT`ors>4Z5dCLLN-7EtZk zY7t={XQhpe)ALC9WaD*o4%tJ?Qd5gkyw)EQT)+MT12VLos5PKaMNVDgQ_+aT|Ifqi zTk}T%kd6@Nm&`pqC|DZ-MtOxLU7;3C7xl&80L0NX;7yU7o;m4{0STJDrm=ik1dH|q z6X$t)?R7WVLepw1N%^1|Q@3x<=NQV%TOPFC#vTocyCo2-wQlu54JCsL#c~3f^p2sJ zf@tn>Ai!QAQb5n%=2rivP4+!o+C8MWLLgbbCTM04ro9v}0V&6>SCv3iL4JeqQ^9^D*l z%!x02Hk&IMO~{a}I<98wt{S>o3r~2?gAR<(&$CE=rhj>Ibi$=|g1Asi!1fZ3oc4*s zqk4rcURSuI(}&OXJht$|Ea6l1IauC5K>qrp{z(GH9s>cS(XBy9GPm|l!MB55=d$R} zw{xhx{MTBA)gn@>a$2N)qLa10{KR3P0-Y=w!>T(;1a*85nO}U>qtheoMx~bWacPnw z!Zf=bk;&tA6}s1;ML$gmpchjKsL!R&R2jR_MxDJR;l}=%b!RwcRy4YUAL??>g3u||cW63GPeJ(9=7Yo!e{I0UHKa^F=Y4VwYLSw*>&ap{cTFX( zUdPZ`Fu+#yH7P-yqSGa+SqjwlsO#yQaUPLgbd#AaA68>mSiVQcMcJ->2nyA(jF!+E zxyRtM9|Y7U1|#O}*xw3NBS4ul`o19V3sxeeZ$wA0O! zZxc?ArMWmh`d*9(oI3Vegzo$aw$-0>Efk3ATjRZ}W>~9f9S6?ToDrwQun&DQl&c?( zl|xl-`8$Jo8$Xsu$(Vg%St&_W>o>D-k8BECYPK5$9YCJ(LA#;1RHE~Ud1zKAsl9L0 zk0?q$G_FYUe0_tN2r3|%`|~HGC_fgVDVr}-)Q8aG&?+i{BD~frXh6_62|PzGzNf8Y zm5#%YX|PJH6mKVYDkE^p78lagnGmc@|E5Zx z0U&%|R(acfONke?&y0ZbF|!AiJzOTQW#Hb~G%_grqQh&;o54fd$@>=V-Z~97Y%P;m zz|f}2&9icmOYZ{x`LpKlU%v{jg12i2r%KbXk>IT|Ev< zwkjbmqE0+2W`I$nKXTp81QI+>sDzvq!FKW^p-ZE_esdc0KuO)EX@diw|Ym&@%Jw}2v!$a?XF3gnxjCyrSBKqO74 zAepR>&2k=BjnvWX zLB)VuV6x)GsdJNt-3cKTPqP|be_8e?rDpgd6?60hV98uNmL$`FcjSxOO^8T-`xy

y!J+8)z6S?KUR&R4LMu0?Yc2N{?V|Bsg!VRZTT}Tf@;R44O!H z1f#B;aA+zz5yw7RtDQH74&4_xBso}{M4OZi*=R}T+7vbZxRdM5-|00&%H2?C#({7d zwIh9|v!_PuQ$KWJPcUU9uvX=GzyLnw6`7|v(z9?E{Y{6m%j<%)PmBdAE}rAE zd_w6v}c6r)+CY>;t*2`X}$o);Vw?T zOM!z!2dAe?jq(AQ?3?~VcN;K$g7g1SC0)JBk;qrYK3Ke{_>_#{2I2%jxH#=`QDS{_ zSx8ykI|l!ORcq;}y~;>M*pIQrV?0@z_JoELhH<744_-;Oyh4x^6#Jt-B?LiRnFru{e|QCalxSbeQY4H{hm z+mP9Co;lg}ZPxBpCT>)X^y*b@^y5>A!U}FdM&3SqHjuE>@4LJ0NGIib2cR4jRO%-@ zE3Rrw1JTVGtk@(*NyXjB=b%6=ZqI6jQ+Sh*Y`y3~yTL+rk=G6;@v;mW>MZcK2qk}& z6;z+S)rIn-g<`$`09Q=-EMZC}HNtYu?21+Q-gzl z95n^s0V_$DJh!`urE+S}(%E)9&4xKiN%bEY;WXe4j-rTNb>#W}gWLrJheWiBn za+%!nEKSnVRqu>miVefXpX6fJ_Yu1WRjA2<Q=|;zu??VLMI(~ zW3WQY2$sH(+I{dqz~(fQ=hDj2*==m&*OA^pS0``7eplkDS*NpwLHWb~SP{kh?5)Zg zqG(KDbuiPYq0ngdqd*(u@LT`1b+Hh>e|p*dS1q{=KsR-dUY>ja=(5;Yj_GSDgDTrV zrK>ObFr6f9ipGEUN%u%MJQc+g>cA>cbt><2=s*AYx$g^PnZ1wCTRc4(b`d5ydsS4` zi^R$CNdUDm0;<7AUlqyRX!MxnB2St1L2kmRf{N1EE_KBjGO1St3)zDYoEWtckRl_X za~%kM=YbQUz5ThvN$aH*o|M5;vP4vcuub*)XHq_sWA@%!TRWiZV0<7nC>m`#BOqSA ziW;72G|&Thn=Fk)EXy-?ovK-A&2DT%AEFY^GAtn&W@u=5n2k*tyQq*16TA3e<_Mv2O4(>zjpoFa@JDn_-wKCrV+MXS9E8eG}Nulz$M^)($jt?qXUzF!4*~3 zWkY9?f#fmJxz3TfCqxGw<=!JKl@(}qw?RW~?Ob&Gbm?qGujttm>{|W68Jz_g8wfNy zeWaqPu{)z1VnO*IJHoFKSE9v5hw(T+aNsS!(k3%gQfauG|Gxeg>4R$kHvBnrOChzFltLl!=3!T4(4xDeBfDz=N<)2nWicusHbP8 z^7}REeqbl>c^iY19MCdq1ZfTUP87e*&o_wLlhcwB%m!Hn*~I?ZkP=mUSeY8yb>?4O zfMH%ix`Q?9_kPpS;_}+o;uc(~q(CnrSVr?ucoR&xK3=1DB(_~_8lM1qo@McRbukDo z*tWTqVHya;!PWy03&~uaKGDLouV1m8z8%=Hsi#+|J73|im6g1}990-P<{4jTnUHwg zUS8wz>LfPQ^bfMVp({bwUX?A7#MKf>PRy1+3rJ6JrtI4EEq=@92X=2h6&E;Vgm`+^ ze5P_|XXQ|_NO(GEbCi+|Z<@@VOwoBXWF~w?QwbQ2cf(><&Zz5LotyYcNDl|PQ!nz! zga_Sbq4?#3T$)Db^(xHQD=VO(ryk9B3MM{h1koI+CoVHi3f-Fs@LErvU09hjZ&6F8 zreDuluV?bDcpd2c=pNO55YZKA*03|`?RLt4E&U7TdU~zv<`?#(DZ`wL-a8-FUJfT8 zi7YQCxK4V|0l+H&zR8Z1P@g3kw11ab3zDaI95u6Xx#OR3#f`mK*>qMlaGQEz{P}rV z>0#Ye2anoND^2LcRy85Lm$F`^{p{9@>wm!X_Um7}FHMQ!k_I1cjcT`mdma**2~^>! zH#sPbDemR)69TC<+elBG9D{#XXBXJyoV+54q<>zE3u2iT*2rg^^O2=5657xyL|IU&QVZ!4*J?!K2ogx+*om!%aS;lS&unSkc97{#!S0-4i^&zTt zsV=AGlP4>|K$2%(e~?HlOR!oW8KxnnSXlZ)+oq=jEKY^M6o%tCBn##?Ab6>>7vmj= zl_K9yq!^hTMkGaWBN@~-o#q4^KD#^kB& zYb&kGe$D7muAb!3LqFbm82aqMO+AqjBJrjPNa}D22)9TrM$2OXM8mpk_#TV@37n}s zyLtaV4}6UMH?EPxDN$ll;KRPryMP@4pIu{gd9LUOK4f^sEF`eX2vKl~n1?$=Dw3)^ z&Yct5`l8BTn|e8(c{z0yGFVEou(_Ds-cB(vUgjOQs?vHo2=ToySluAy=fn3qf#P7r zG?SWcv*=M`SA2o3U^+&ZohUk9^NTEcp0`;3)46YhEi@|y>lo6K zq07PcNZH;z3>x;FYMTwzp{45n9sodY-=#(M7qivyNth*|yeDQwC36>V`tJg=4>Y&v z#_rP7y$Kym1xK$L(oR@WWubiklXCmE5|@yXMT*!I5JTou*oP`?;2SBzi&N_NU3xoE zN-s8(3DUEtkyS$F4r_Nccjf^fw>G(j$RBs@AIq~^IV0l?0U$fq-TvkZMB6%iX6$H> zX4Fdr{|}^R0Gk!aLj+9)N*Mv+DPzDh9dfH^8}Z@#_$9U{-^Z>| zehH(o9Wa{IblW3nfI>7-IWu}$RH1fxRH0T`M#|OJdOk6QcPCWT&bQ#nJmryBD5&?W z9pp_@tlSMt3((7gLD?L-0#2uU0J>+Eod5ws6|sl{E(_5?^LdZg_Q*mPXkT6X^(T>r zdJf+vpkCIAE-Zbn0nvcG0!c;Z$!eF|5HTD73*Tl>uCcg--3Ne3A)xyrn67HdH92%`tj9-i(IO3a^_g&!}FgJ^^j zFpIoM(m!S?0%O-fL}nF5Q=bierSQwYAdwdMB3W|`1AvtXPHL`L)_w^%_W1m6g~Pq| z{)xnhqIj0?`%{EyYTBQ6AgSbB@`8622)zWk)N%EQbVO;30!%iykDj3*_bF2EaZDIs zb(K2cgVejbZ%nffxgSU@ZnnBxR=ajYrjVTwnFEm6h7^sB`bYYsMq)FYUPqH5mBAV? z?bT$5(KP_uw!wz-%2Rfscq@F>Vqz}h(B&0%)_m+GA7%0wK7Zy!dm5RDAp`RRPa{t*ozs#2p|oy&_HsZ_}yGD?AZ zcAz96WAaD#@@px=4o)@eY9H^cjR?#*0X*RL?(X1FnE03QaO6cn@zF#dkf+98Ea4?1 zFi+3I6_=_-iEGzp@}e=TzuLNoG>1Zbfha!`Qw6fzP*H#?yFx0&(8epfMh7iQMZz1I zH~#>uUVP;E!VgS#O{f+uP6Oq{^-bi1eA9yTjV1WNP+MyDf3hCnn2-JJk^Sdx@ zw#Qasc?nV3b=+Gy!dxpHY83GH@cF^#dJ-!!@uYw*Qm>?5l_^5xl)K);As>v z<5Sy%6m)QN;vA6#@n56EVgq~c4;wb+2f?qUll0UU`Ie~ec)PeRWwlSV0V=e_Rduu- zbKK+%d9kp>as6M5&xnwkG{Pq})iU}w2wz#lohrOX&2<yS2;eK3z?R^J^v&CAV!`&MoCLETR!v!ZJkGQ?H~`5}{suUDJ3Vplqer7Jkt^_q&* zV3x&21PTVE_kP|l1-#Tx^Eg$DtE&+XDeoFI3(=yi=Q(R0Poe*xB>P( z!9@i(vQ&DpE4^?3k zzM&+wMn_;?SD(DM;VniQo!MoTK^rT+qyxY~mD$#|JpO04O+EZevGo0OT zyeKTPr-etK)ET*i_XE%s$y3q2->v}wMy02_ru=oeB)+d3^#d~W%x7Goc7E_<68Xta zj?w<<`XzuEq9k;pt3{HpOafs z3C>z@A z`%GMPbU{($g`rYR0a(sF=A>?!i$lis)GEhvIb5>R`%GKQ!a|bGX1(>2J~P51Y0)|X zp;NES-5@k+hDkD7z9y!mn&x zaj6=}`&?W=j~xhjT!Zpk%Ay9-n841S&S02?Ro{%hUKq6qFvUMi`I%7PjvhxnmyIjd z)bXsjrMVjwo?wHf9T9pCPM2&1Nck~&aeIDf+H)XsHwK50lov!M=%mS_564lmW(g9I zAYz_?>!-`#X9`A|^vdg%57^g={lHs@Ds`Yd@AFUbyM6m-frqA37fJ?T#$EyskaS}9 zKl2d-@<%4Ssbo%Zapc0{YmSatY4l8^%m9nF8J!bL{z3l(j{WBI4L~4?ev?M2=WTk* z;0Nvja+Ze4f!ay`&-vk@WtqeN)W{37ygL{5GQ`9R0GC}(@EKESRdDm0ntD5Vp)_Q# z@kDY9v0YMT#&^+X^BU@o0v@)2*n-$RA*2L4&_rt#$pQ$_63~8;XGqBSndWn}W)UtJ~2Np9?-%tMfO z2^j#SDt`%$HOeq%rEr?ksxL-KPV;%9@>g~KM2gBQ|MorbXks>H6!w7t1n}fh2K9$a zC}0elO9uc`eB?ryZogx9_j%Ta3Ix_>sM2ugVIW#thgSerr(;0cDh!}PI)x5%iS!6q z9g2`3)diXuHcs?ce_=)CaK+tcBe_yQNhBfeKy_oHD#B=tb%joIB`<(j0Z`EmK>UK8 zYrmamXaM0M?9_D*riq)QzrYg5w-}YVKZ<3hoht;uLD9>d`zpR}HBv2l?2mX`%y3#) zr0=Ii068$Aw-C=$;<||KrFF6{Kp2c}VW5_%c|77E1+Sm!?NNz|S|t-sba(Ef+UaYI z8pXsyEAeZJ@pOyoFDlzY8m1O_wSb07&5E_Jj_!=rCFzx9R&Ln_#AS;<2f7-g<5atW zAu$rY*v2Oz+AbQk;Hy7eyexk;#~pnN=(zY?+8`&@PfJ^L!^C!MvjqP{%?;G}tHMMh zcYzw;VUp4~cahdV!A)}`7%|=?-|8}(DaA2^DSW_mLzWVC-+Nl%>Zz&6?1mSHvR*b_ zM0$@|ypMCaQq7@}ATG|xu-F_C(Il;gycJJbminkfBU@5_f@80V7LCHTA|TSD8BUua zsa@q{@khggLV0Ryir>VKjUzYXD`Za0E=WFph{%bBXI*^r1we-rg7kV3(SxtPk;8>{ zw#nz`rKK+WU(4?)&LnF5@{)&(DOOE8zdOesL6y-?j?ulB4VNXb^Gc0Ak!KBxed1Mo z1nK$eT86tbN+15~zX04zQ~~vfI2HL^7m1Q6b_#iLh7wOIbpBP1)`xu#4pSR80MNvE zVmMT^ElF6>wD+D4kkMS8=Z}@!wmO7*bN%N}1BZ%SVb%_i#7zLR&cuYFdxkA2QO^R? z*69!E-dp!xv6f?n{U5M;!;AW}|M;{MlE4=%9L%zLoy4`y5E_-*{TCHCC|-Q0rnuby zJm_rj!ZT&@vKHuhpNg~Y5)#sUT35`S)I4@>?x9#EcMec?!8!gripw^RbwF&mM=GV0 zIy*L|H5SsKj6FNZ+qQYJ-Ccj~BPzD%X*W|^0E;x$s~V=On#tcTUd_|8AiYgPv-Z(* z)@n1y2qYr19u6cFW@s0=`Q z>*F2+E7bi}K8uPw_>xCr1`Tv}fBpLPYN$6o7=d_OW{>%UF2n(}S%gOss~kjbj{wx# zor{u%XgGdahv<(3`xw_=T!XQZ>s<^CCZe|dfOH{IRzDC_3H#)fbhJVE(`*SCZ}QU4GhNwM`+|(J{OsZ**zIW^@%xu>`VL^BWSJ znVGp_uYx~)a>O(_4c$@k{;iPXd)Q{onhHF=a~X!M#7vO9YB*@3KvxX?$IJ<%<7)u< z7pmTZ7)j>FFR6u7zZbd{I?=skby(_oPznWl5)fjoepQ(U{;$Di!IAt-T{}D{>Whcl zhr{7Ws`snk4GYL;Q7N=e;sw2j3VaWmdO-Nax7$p3NXr%rfc(m`~)29;e2+4-oS;=6wYYCV3=4NI# z)2AU<`iIAlw+eP`go^dhQkse5u;5Q0o;IgDo}8Vq1B}QHv4Y}DWesCv<1B(nAo>LY z@JC+3e9!(pH7o3U73xHNL+^y2SAs#;uKwoLfd-op>I@PRl5*1}`zsL<)@-IB`&R~O z?+_ammy4UocE9Nrb%nOqs{>y2$?mDT6~RtIy(B>@@u#_!TjLAmsdE1@`}ekuQ-X5! zXQP@gK{_I7`@Gq1`DqWT2nDd)tB3DKEdX^AJ2kNC4K?gJmp_}(Sy5D&$tif-AD-1 zN=w(k(A}kUBSYs%4lsmt!+W!IJ^R`3vycC?Sl{+>>~D;RbH^3uRp<4ar1aFBXL{HC z1R$oD@945L$WnKJO|ra}74s4_-lCK_&{~;BQ+l~p`S>3s#XB3pX{NWObgm_nHdd3b zQ2s6&`Qq!W)#B*TB9kV1D&~OzIY-3_tA=KKVl zpyB!*XnW5qBs#U#S78(NG9$EhPxdgjg}TjngZ4NbPDG+e{~22sowp63^Yzj0S12)H zNe|m2B)JChe-sgurU(Lkaj6k9S777VJNQ6r#dGDvW%rto)n-6iPV_60O1+b(l}q=BJzM5M9lblyGrE1l@Rx<8|LQ0YOPhVY(#f!fJP$ znxtxS!%G*KyLN84*{)#_3x|IGqN4k_a89k!+=C9z_VG>~(bK6idP~2~@37v}oW!$N z%HpyD2S+!CDq3%j=MKvNX>0vsaP8?Iq^~#no+$9R6W7EEFYQ6hWJ?ia5bmngNV0*9 zVRrdpMqr3FI199v?Nx)g|IvP~vFYUAeb@49k2}tCg)I`-#P+#L?cTPNzyG^?JEl?2qS! z8T6gZG!0-!f8=(cDbGBVNm_v&k~||Dg)1MuQ|qbKMqd;$QRA{RyIx)DG^?vsuvFp! z8_cwQRZ0u=skcx3b^Ot>W(zWx>U68-wo_rwCvTVTKo^J@0rDFrexRLbv53fFdX~#+ zCLRq@T+44;RIhYix#b4Ys<}jl^AZRK>xo)&m(u5I8Dn)<{9=W0UsCK3=aG7w zBJsmZRe+dvT5BqlN-d)1Oki*JVpvhgW|A7%)P|U>*%4Ss%XX>&)1_wbBeTX}&Tg$D zm295%LBCqfr7CvSYm7W6`fDOF^%5R#2>`j@T?>CX13kNa94E3p(cQ{i^Hc|M&2iJu zBG>BdnHH3UP33cYjMnNih=D&xKloFD%6z(K7@=WNgR1Vd(k6RE@{ICkM5IpAwfbfg zOQ*W@7*}U7g8`H<-f_J;Xsm!kE@RuwAX{^%@3?z;lu?^FgjZ8$n8tWM-4MpHzT1^c z-`?LiS@uDQv9fA+nySPQR+OS;AD*xGqBNJwMhuvYR|qW#sh&;S$N;mZVQH0a%qzZ> z$4_iFL0<6|@P;i&?48b& z0wW940?d8ytS?pTO37uHn9I`yuB+aD$z=$@^B}TDr4@i&d;z?gO&kF0FICUuQUBxc}Z;O=uRUoV)c0;W)QQ zNGqs5CwTaVi1~MwVe;&mG@-JeVHugrB{ou@0kRB4N~IlWIUIRPM^KvHdWndk9$*C; zzsvSp+u?ehcAK|336o@>F?|C&S1q+CZqLLwKA>2@sHcpqSkI^gaBh0#xz}-A`nGhq08p}HaV%IvR0`hWxK4Hn{O%xP|$$s z;+)ATtB>!87*o@um)?+8NX^+!ImBtinC*Y<8=8hU)o^vQige4^X?loZ? zl)r!k5k`c|^@+!sSlJOq!KUFpqie~!XDLp=9HPpm{R(>VU|d1zDDsnszZ+-nlgC--R0$o#yI!_#0hJM!+;hA#(;K&Ks(u(cyzbT8uB;WkyOR&)x z+k~LdgYU_)6Sc14VR|`7db(NDSH?`$>$&NYAa9ulUQOvz#%#^LJ*j&HYCI~BNYt>; z#D#VPl!yCuq(EDDjg|SOhG>3vx_iEY+gLh|iYwDI4^N5CD_p0 zBL1D%8?AD|PbRFbr=@PGZ-tLSfmBdCIQbvY=PzB2@c|N+!;@g(jFzLSn=dO9l+Mo0 zvb`dw1iWO@p5CMqL#N00VpjG?yW89xA+{di7Ersh>2Os6_3#Sx%Pzz_i^%&qZVFJp z37t%v=Bh^_kMc;7+5}+D5|?5N64Eyfa?MAPc08i=XZR;Ywc`0Mr62;fwd|?*C$fr+ zq8VRagzZGnbb+=!>MVe4a#AO(fwfO#d_15aRgO1^)Dr1m>&-9wkgE-}ODTEnr&V=CW~JIW6xnmf z$6K^keP;p6MKM552WXfj!$9e16e6gT5${xVe0+*4LfOU-%ub!o8Y?xcj?1rnX;Hs$ ziVO^ecs>7Q!nZ!bnIDUy4mXRfT7zRJYV!$K`OKw2phDCx9m7cV3za-d3OmJogNd8zYoA)_047_`V8yOI5MD80IkkA z4)>{$)d}uR4#I3y@h!R6os+7yOy7HDBxs=>-OQoBCgT+xI(O^JWc7p{gLASJ03>~G z6<~7=p<)o`(p%-X<=GNqHc!%L>lJjZ=%KVdyd+{XokHt$ma1^aVQM<&oed_{rgI;A zXMY0@--r>O&AgJ(>K$|K_~ZnrTORSJ8}ZmKO@M%ckW0R;y?Zc5NnzCCMlaqUkJ}Fxi4g4kT+!Rv2>iVHT%TS|O7m^9tJ=8J^AXU){m-AvNWxff zcCf0GoKG9PiewXzPGb-J^!gm_B$HzlP zvtKF+H`g(5xn&h9E&U{w`e4PWw6yf?OGUYCHHnS1rHzamk|Nf9ze7sH~dso|&qhN7xE9S5kTbH}408IM@Rw=t#a>;TtXQvk;%hU^U zm^4FsK?X8UM9N)PS#n{8DMi9-j^_Fkr{6s*j{Bv=*XXi9u6x5Ft(9t%1dW}ok_U@H zUaAyZ`!pAnz#kqSY}7cV^BhFpV@18ptAyTTHA&P13$Uu{427%7k@SOcbRk`SY>7_q z$lVvigLX$yW2AdRrJOgz@CSse1Ld<`k$P6Aeovvc;_(#x`yx_{lV>bO>#@oqBSlK;PnA{&3Uq%R-Z+0-{Ptn$`O<4%;JEuWG zaNpbNfbF~AkYB)#f4$h^-OHYeTEeuVNS31-)YLaXrMhgQ$kmAPvOPQC(Git=s=4aq zw0yQ32P$_0_o<Luz&0(F4kQ1b85>%!Qa`nu>5jS`+*%!?wdm>7}WN-XXRGDwfhx z>|s9~m2FmMYz-q5RC#8n{UDGWeR}%Vt*o?+rn93b2gVU%Ug!vyfURt-k)^T-h|npF zm%8S#)Fp@gFRA}s*Ssx%NfenNWDhL8Yyk$z4Qy7M`T}QiXlbTc4Hg-jAwS+y5T+L1 zEvqeaWRr_vPH}7Ze04?2gfOE49`@K$-7%dXjG;F3l4G%jD3u%QmT+_C+!D6+PC)qz zc*;}2&P}c)7rQqnvl0H~vzB(`uEnOQnOVTXvVR*RgWt-rr<`zcX$vA7Yp`cOiJz0 z>YbETII~#Wp$2Q2nU&CdLrhH61Zp3;+Rk?%v((8k?(fccF-@-Jppx8NE>bntARlNz zSdy}{6Jtgijem;*$W!VAHt6$p1SxZ*l)+p@2M>;!C9(X%dzKM0LtIMOy{G(J*TH06AWb}I)N?8@0t4qinRres# zXWvJv<-3a$LjkrONrfVu#Mr_ZF&d(6uZd+FPkfF4}YHM-#!= z4UAgLG*vC%W`MLo!`wqp#c};b!VCKu3HjyPhu(*~0>TgTV|cfq--N4vRPthZ)XcYg zb^{~s6jg3;$0Ws)9va|h8DPf=KHm3U{*Kj3tku28g!hsqT0p=m%v2gG=F|Fpdj4}6 ziv};xl=Di@Mso-yIYEcabBP4a&}BKkQH}UZNiFG->Ln?3bU~~E#>n798o@zjwPDtn z>(QYF%Bre%a}S~6zN^v5{NcQ<>UOj;r8E=VD(&v(qf8K zf{S=;%(qJ`f1q}+C!-W0{BJFFPWW&J^|!4qD*^Uo>WVEM_EKbF>1IFskdX=;qf%sT zm6DXipc(d6Ma&hpB2+9`cUUMk+vZB&)G@g8IUXE9su`Jh)vGA=5w57t?v}5CBh*#f zX8D`ah%&)Wzyj?z#DZO4F!jLLRh99v=SrYJrb-!sFtb&TRlT88?QsYv%slN<#sU|J zHlsN^C6^Xg+*X^cCQ3z{+?rIf=|q7oM9e5CKqx(E#o_tZ=+H#CcL|ZWwek{Ey^HKz z2zmABvXV&!wr{j^cGs6kTwY$aW)}H{-S+rX7q4E`Zry&10;T^ZJHea%Hg;_H^sT=O zi~lC(0{J8!FGcKI3PJlTk8lRzn&bEXw6bNu$|$|1`(JfNKK;l=$eh9;LcdI^6?$2A z)g&Xjrgo&t| z@;ZtFOgy$Fwk`@(OJhUu`rScKcw?&Za+9%)C#2gfv=GDQ7de*Z4?c7|G>?K?-Msm@ zrTb&d;Sd8$PsmKe#H*VE5;Amx5lwknsuHuC%^ow8O93>w_mHDO)u@2w(2lDzZ z0RZtW$-5JG(x|~VdL#d|ENNG)^^L2^kC(BgZ>DQ7=h@thYwPNLz2j5&=lV%;G=w(a zKsTCNr^?jQ9}jpd(VBTFwhMq>n>s>u;GBO7i)xIsO|9rJLMomp(a-w-vABoq}F3kicR6uh9vw`PA%%Mz>sN=bB4(2_Z z`#%d+X5^e7(5?>}4uz|PuIM)mwDmB*x~zAP>JWwIkbzlP1aWZ%Z5(>p`EyL2WH|^r z?&a_G1o2RCbM3|`QL?l*-iX`oj25bYZWmK1H8)Qy%0&DRBvk+cVy|40jn?do+b?Z@ zm^0zi;tVGDmkZm!!p{O?4^dY)zRVG}6*I*t*_YL9qU{ZCv!#)E?I}H>G%Q z?{o$7NU(MX_JLMS3Z1a+LHvf-R)_|%x2cYnex?~dlWXd%vs0o^A}Tu-*7yv(DMT;A zBfU3Di~6K;R15<_GW?Ow@Qtbhh_k|ik)1MOmf^BR`xf7q_bOrr)+GZFsV)Bxp9dAu zr-sihEbe{U6JB2=5vpOJbhbF59w=smv|#1WVBle+ z<}{OPNmbQWx-s9~e~_EttJ4FSV^0eG+I1`Ztj26JYT)1qF@&Y-+9ztTbV0fm6wIoJ zzs_swbo|59;LRy2Yrnrn4yPP3 zEShkvAopB6*`0eUH4_Zu29aNO3z_Hn4C zrE6>H{us)GqgQ+mkLuxvR623hwW=4xMUc{sN~&XlshzPe@UBZ?9J3ZA-c>(ioM)HO zg7=_}tt~${*|7_DQWs8YuHu-}03x^tD(Aipu&-~ZlYRv9841C-xrN}G%b%41!hdq60@G{rHTUlU%_ zUtt3o=+;B&5@s2^XI)3gX|$g~8x$x`mM~*RH(O*s9#5x+`WA5*@RXOduvx}aga}qY zWfj^Q{9IdxQW>Tm=!*AgB@;REb@;IaWrug<0jF_|*v{!zvdJ>(!W_7`xg^Y_uI1qg zR4+N}-Y4m7@6oX=NndC&Hqjw-(8_O(y5oULDI!tke|jKL^t!(uOL2GitC5?o=z|4f zNn0IA$eG*r*G)Xo#iac8k9+vu%cEZ8vOpdju@c{RExBrx504I#r%7aM7TJ6w7){H1 zx__7yrOUzhSor{h zyKbFM))`xQ+OShgk-3MaQJ}rD|E;K|e?j~OJ zF0>b{l3%Rj;Jn<)DW(SZ9@_0KdMZw`!~_nHC{oD~cLz;|Whq9*!5zqpFe6=0BOrM2 z_1S>gq`9NEWNg->+*>axC{jDDQuUidjkPOtgpvjx3Tsw>pL3QsQF@?2Mb!-{RoZKq zkz1$6m4HHxq&D)xo>&@>O7@lv4N6Vc(Ds#NnWonD_;9KZvb!4@ScP3J^bey}v1tD! zYi6KgM((yOw{bdaA8;NpvqXcK+5EnQ`82!hX+N|VE_!xn)J)sui1==+-YFNGPe{xI zfURmzQK+_7eLb1db*0_d*to4rOHmy^RVt!&AHIs&{+Sxm3RTnX&n5iG@2P0AxYYci z7rMYA%k(CQQkb=co^oktU@N4F$D-ohcQrr$jS7`nJm2~!rpsAjHx2eApo1MFu4CD6 z#=PSV9GgQc=306!9>_YKd^;nca_Og^Nn@)s3DZZm8)UQ$%UAPnt`eVV`qR|qR0tBeD^0Z0m$vK|X?e}@53gQYwhPj%< zdh-J((*r*yBUT>;*od0ESoWzGrl7Ak*-N`D=f+7#h**w#`pPMk#k?ROhts=ctEr7l z_$ew&o~ySfq--HFXg5MQipSLWfn5A2Tyfa`3qWN9y$YArI+=J@G>`5YhI&f7iE`UQ z>AxkXY^XfRK+^QrR;9BGyN>E8MJI+GB*cbM0POy#6<3V9suCF+OKz}{Ue-s;iT&44 zH3!KJ=;Z?@(wr15^>n-x6ZwxC)C;W!on%G~_H<@f6kH!~Zf?%RP)*|R9b-kXJN2P# z6rxD2^&=JSvyAK^GSgv3=Vp5J(dgWYZ}Ymvna1&98QCzFN>sl(u!7}1SdT*sgh$W@eP{RJ9sYRM`Na7zDRQ;U0 zGNU8a+h!P}t6sq`eRJy#P|m!%B1WNRW~OCGKaJQn&C2@dgSeGaT39HAGdLBu)Jerh zv>Lh z*ALij=JtWa_@itA0=rcUuP>zrSNW*O^Rov#bx*^O;`f?LhtG1xBTEs~VE%S}XR3Jc zBYrm3T#b81+E#DMyT{SjtA5PowKMV!RQr?Pja%W@mX(5x6M$hOXL&ATw95t)9uKi+ydSvY9!h7$#0TB{oB|z%^{#l z+0)^p<~#3Cv4Cz2f*~zg^8vHpg*sHYT4Jci<^DMTvv z`p{HHBNtD3OVHW+QpI-0T`8!JMR>>;{7Oe`mOgBzl+tW0l6pW3?c!3iwQA{iwC2uG zXT1~hX7SUb!XpcT)|jkihvj;#Cyx%XhBo+t^J=Mcjz%qAg4=Foo=*Ip7I2UVl`^GT z{5WL||4#P$M-u|O;F$)LgZb_iCA9i5pS)98*?KirbYrFg^JaSU0K0?G+Z~<%I%l6v zz2?5W*4E4X@x)GmCc$yT4~f)#_~DvF;ntkcn~sVlP-!0R#$23lm^2g;ZxBc-O!roH zEO+ZD-D1ssbB*RlS>8wW~f_Er-I zKUp@s&~D8As>)zey@P!SyHiueeixKVegWogX=@98yE5?OiRB5H&OGvZPQsTX@rBy4 z!!cxTe$NE)0&(-O{E_Ye*FX!8`{qI5Ag$5qGrGWpr#KP!HogA6iSXZ%#DjwN+409E zr6TMi1=q>@gz|+iP$l^A)?`)d%q05ZHG(@UL+p4%tltZMo+3}y^UvYq?n?wGKZSVfj%X;)Jl>qOae*qO^BqGC~MuQ|**`^_8@R|%|KCYB|NI6AkrN~3tn;@z<) zdDYXHjb4FJY9%)}7tA;@Fs_6jqcQdOxAZil@03pMobJ^z2Mg>jR!nE`H0PF27V7G? zM&({hM&b8DjdT)maa{Lh&Ir~)S;V!cpUQ#kxRU$SX1JT8(NGw@F?P3QJcOTJfKJxng?(>IKE{Dm*pk8*K9?>`*TIs z%$b-NdRDS45hv?j)L{A`vI}+q?UG(>bSbgVARh|6yLQEX8B*TsH-?F{$6nuRT_vM+ zuFKGBLH}l@&~Xx@dUv$L8P-1N5v^AK$AK|L z;+^vxeK4ly3R4U>_sy2z<>OOnOHJ%@>KX#kSHhHuGcZPJ2eivR2+(c?Qr^qO3sTxz zsYzP~JC|nW(7cB{b8?vr0e+wc>@zmD({zh@Hd~}l77$HL9lb<=k z`p*+7F2!?(+q59oL;Sgz`Huu%Di5D6WmW9diP&CGUJgTNY#&Zih=jBzI#UzyJDnt3 z2Gkm@CE|*@t}Sysf0R=+ll)oLbnGWTD=w7cIkv50^|Zdp*4>=#iJB&u2z|J1`z1?- z=X8E~e~-YPhVX05oBW4IEmC3MRh-;=BB+9VTI|ArE+6dfF>UY&X2jvChE!F(O^@EB zofvAjN_IZIgnxjmzS5?V*03&wIgtc?JWyI_wX?~~F?tlf!SQCGfE|8_dq!NzSGf@% zTSvrV<|W%pXMmYsfM%K1?jZM|S*j;%yNS&;&8sGp&CEoGm$hQ!7)(~)31j?2no{Q3 zU~BBF{~e?L_b$z%l1ENWT=Y9-Wqk(5f|+GW4;snBpNB`OxhAknu@sT6N!Rz4iv5ztnF=p^f6qCp z6c*if=ODt)6rdWJV}m$f z);+Wru`;7m->Kble~6F}o0-)Ud6Z=~eg!@&CFd_Aa*%o+OAGgUZZz$MYdE`EZ#^AK9JE}apBIrZQFfz!ld$Ti6hFDH!^3UVhnQl zlT~Fmu-9!LMZ?L-Bb*3MGBvg63WTF#6#|ASwj(R%Mcf0)PLC&h;Qg^)d;E`kc&8io zo6+tM-0P|*5l?U;PUH7CLwb6^w#$d8>R>*`DW^H-*%1552RxHjI>UKAM-9g*6}wyY zz20TQ+s!<-J_&heGl`+!RovpjOSot+<>2L8i);_dE@H`ew4<+nqns#k4nto{=59~< ze9^E-{jae2Z0l=$(Vt;a%{e(}Z3?=vwjSt-3v%clgk8qFwH`8dc3L&wf;GFc^Mx9G zvp*6{l%=Wi5SZLFd4ImP(ReGw?}|NH{8hy=@>X*hrttx`1Y$WzHpjQ_BDLyu z1PE-vw!-}m&=ticqt>d}$UOfsVq&A0%GXj`B&NP^_MCQ!#qJm8q_EZ<#kS7esCRy@ zSrqWba8p-Qv`-a1-lRA=Ho%3m(-fv4Wnkc(M9<9Ut1sr;(uBJj@oBB*XbPA(jrW|| z+{8y{5II>FY5W40LRp(GuoJWmjlfrWftHr7(Ad@6jdSsx!x# z9@&WWl0v|8u9u_!81_-C%C~WMufi_u&$A3$jKm*Iv0IpJ9>w@1XliObUj-NobEsDr z%+>$6*G8s9ZZK83_s6IldZY!VCqg8bJwzzI)B~9h4-R_d8#fp)cIU8g==f;7Pr26c zEB|&TH8?BICrDK-FR&v*#$ceJrebM^r$xBGQ{cH&tkB2E!!cQstlZ2;C~B~(?$q1F z)wSTVp)zAljfb|qZ2mRV^IuFAfmvnQI|!Jo3DPcdU2SUHxCBbv($+VdTELL`tdv{3 z^n;pnO|}{SvWk%&i3tRmH~gsx#k=!_%3rN}jDynQ=jV!Q6BI-@kzB*2PafciI&jy4sdZA z-Q*-BT#&R-&P7&MJtmE03q}d0(}*G`b`sXx*_NDQRda(|njuP@ZW&0JdBFPFsUHmq z2a|5~Sz1uKu1Y@%v5vFe@y|U4Neefn^O~xe7D^^mo=OVHR(cqssd-;b&(Va=+@?i? zSX@E^im_rloTvoto0z&B`Df2gOHqZK$-Pv`7hd_Xf5?*`NT29bwN)uMX>&E%qIO*Y z#FduKz0)QM z^ILMh92qf*APAFC*odpiQ&vs5@P+F#8CO=11EUoHQG$A3&Ykcel|umaabpQWIJ12 z>9G?<%HQO@DqJZK**g|*zb$r$pTo*Wb|s?n`Z5iR z8BtTr(NHhv?WWq@b^y5JeF9X~a$Yqkg81^v762MizF#>NpOAFGW=eV;-vWyUL6BT7 z0K(i^*qE75Laoif#0zwg2l>pC&WrnUetXOjL71#*7Mog0CqO!G#c?S&+igdErMMI6 z(3q_9goj>$00nB)>QozUZLQzvt(dPnP*PNk1ACH|b6<@ZG{a7giI3m+mTs+B$g-3) z0fAhmJJBC8deP&2E01ohQf0WVgv%~2Wo73Ft!vxCl^>Zx9TJSyThcDT&DO13U@O39hSqjxwDlZq!5i((FO4vapBaFN(kj#z$c)2E zxCSK$y@qMN#L#$ge9ado^Om0Me+IUNKyx(97>ZJ8fit_GoX_9b?F`|D^n^(_x2(hb z6=53~_ga$KQ1`UmQCpk)PVK>MCc!HyLvzK%^7$+&rHmS8Iu>0zV8Z&E`B9|8Wla-B zv*rC{__iAXM?^9zLa;jNxv<*?Y-8nkP)S{z^odkZKtoDh)U!#T5Jhf&hL0lj+T;49 zMBu6e!^8G(Fos60Q1r3%Z7S}kr*7C)_(Y*p>kiN9<5T#NPJFNV+FL*mM{7>+Toz7< zn-kaT`0V2OnQw01oH<^1$+3>%kgs@_dE55g@lX4xX8I{x-3gmc+l|(0i{%w`0yS7; z<9o&a_PT_UC`fz1w*O6g$A|b?+uF)Sceap+VRoHhOX+N0*y@-jFho0xyX(fMTe{`( zXCq?GWj}Jqr%V30KWX4&8tLE%v=GYzYeN4h8_pnT+UJ7V()h1zkx`C4 zCOD?^=tMssS_s=#x7x15T0y4LVb)z-v0B*{&a04EQfjA*5o7vg){6HOE%xGV00-CT#2_?{Pkyg(Hw z<7t`;dX@F4hZpN19Z`9rO+#tI}$E=23L)tlIK-Z#elys_#i z9(Ry%%itTTk{#X^-eamnakpjyi2tgpaa$g2ty2P2_-d0b@Z+Nm0e+vcMGm~Dh;N9f z$T||e>a}Ba6_wEgSqpg!@~XYQjm2W1qm<3D3ZO*{pJVy{OlFi6)KPP8K#&|U?RWrl+41Hu-n{>9A?Go0-Sil1H z2jKH6;CzcNF$?Ozm}G?IfxYkQXv^gLYXQR;$O1dKSL`sE2DSv77S4{I;=ir zU}5xQu0JVl>+KDxKV7BT*ot-QFLf^78warGhTzF0anqyX;I2T|HA1SO51kmJwSKB= z2OmI+%L{D^OcDrvZcPHLU3j4P4nJbpZ>U0C!`K_mwQ|e1m9a;Xewpqc! z!SDM3-k}XT%--m-*1VWhtA{f=Wn)-}9MADVHN4aPG}_Tc%Tsa5%Ti>y$>FGv>Z4Ek zp@UUV;}^vN3zfIfm!Mlw-61jnA9d4zr*kac;W%@{r*Y~Y+tWCT5RpAa@`6@<_@ErI z{q;3E~| zlE4zF_5~v}{^G66Vt1z)JKhGZ-;!A>HbXkODCL~?)(98YrNpC2J_yvld%s2X*I5AR z3OR^;))cp?cqJa^Np~z-ZFqDNy9^xCZZn&k%L2kTl>_JIeQY_5ArUEh7A$0JMP9eJ zKjL1_4x&v$wRLM~-OI`b+gacLXd2K4x}wx>G+Y86#*|qlX8ti4N(k%LV8?vmf**MW z%y`oTLNvppaB)jZN?JnG9uJ81J`Jd*)FH7KsbW}oij-w~IWMjR(zyMQ`}xfP>CmNW z#?Pe@I~JDq!_?qm_OZ}U!&wl*LYvXeinDK0GrI!oevy%pc_BIW?tPe^0238^|Kgq_ zm#2DlZ))qhT^#|2!=F>V&DzAE(X9mk05^vrNfnnB3XI`p!TJ-70taDgmGDn1FGY;o zPiCMd&}m(Css~zuyz3n*)!fhpx2=2hO%qij`DcDp5Lc!MPTwQGOyFkPDyZoyH?9d zoa%pX()@SAu@i(k_YR~AQ^7C_wJ9gmTpGmNZZZTlrO+|{p>i@eL!o-j)Os9nY(iOK z!J92q1(STAfLXHTc$l_SW6F&beYa2yQn&t{bp2$1r?x}=&6fygnMPi@AUvhmt0|_Y zL*g>Zct%|Xp1kHm6}-m~f|(yetu5PrVoxknUw}7twNy%=<&vWM_ai&xPs`}2z9^#J zT7lZZ?cVK)oY?*tLbFgN#q542#YXAW^gKp@U9Lo4aTHA>7)sGg>ybg9p!X1wc=hG!*DBlpZX58u+o@z*k&J zRDPkjL4?3QsD$L25v$Rpp%;Y+d09p3q4-`RcmDGkw z!=$2UD>GNrtBP2Op62^ahPnSlrN~Ctwv*X!1@3$_G)=R)7ZE}wAY z40@m_Kbn5@@u@=Q=LR2E#k6%=__2f9tNc=B3^EF#UwW4ad?YpCy0;k_KLU)%R}D&) zKxYNY4r}H9)G0Bi=R$mv+if|L^mLD!HNV$~KEww%C0 zF1!s?=(2-;UrZXzHb+y3N{$5vaB-q>g$d~*9B(u`S}NnuNZQ%x^dz zdS9M}1>{%O(jv={m0ZV7;O{@Qz|hqjtdBSV;WLQm)>MQjiAlo@964G!=$$HcU#$AiPO@?afTQ#Cb6?!Q=SblNY>(}}Gm_8xmGSHB9- zgUY3hrY{K|Y67#^yO8kqhasR1`Eo zxX6`~+h8YzUTE1iM}Nt#8EKv=3>J_^Us)9PUPXRxVF7wxB`0p)3e8ez-;0}=XzS^b z*X`{QT>2*z%|8>cN#8 zJ&-g5;qmbVe4u?sJpOqaNCMDmvQyopCvcKZ1SQCyRs4rm|E8#b_WLC&U_@do>SvPd%`Ubo9Mgjqer!G)ja7^|u4LCsn@~v8>oaA3u{5!e!zx|)Dy8!zN77}Cs zuPa{gk3|T;Y1N(Qe)un;T=0+a^KBs^)2R!V`Tu&~B(-Z-lbs^Q4ga4J{68c3zuE{i zq^MkN#&>HL|1lciY)1m;ELehK|1qGg619oq=6;iH>$X zugA)2FBbO~2>^(5ogsPZ`3q$K+@w314$ryJSnYMvO`Ml_17W3XzaA=S9Ps+8_<{Eq z^ZGK47x<>JnS#I5w%c|9czru1dwq7H%Lpg~SCLwdjs5*bYQP(wELS{@yhs>%{T>&1 zqk=1?zqOr&xeDM|&rsWi9_4Bo9RQzPk4}Dn%cB%{7B|9+f%pn9AO;E}%eTK}3(!|y z?i61s*1kwo^0)*ns&OR+_rLvhbB}}vKx_o*7!dqN*!`bcLnB2%NRD*f{>#Yt0X_3G zPW(?_`OoVw+MWj`dY(tWV$pX!;39|Eb`743#HOz=@bSG#aWahW{*vvB{Bxr6&0^5S zglm3oEMZSc|7wVl-2wuxdCG^2*vk7Cmgg#oEOGoTTQ^{_cyK-B`}GSw%V8ma4kE&W zGQY{cPHI5%U|-vPvAB_x4O~SH?=PyU2g`W|aY^c83o#y)M1XbZzi#|(9ap3PDgB5; z#9v6!+aiFTPwn5T%Kl0RR;bSn`KqPnMGW`SWxw~-;d)nof9ESVfHbft;jI@EEzb6P zKq_~WNJD?=l_VPQ!z)|btNs_!bCUbHiG^4fN&oi5yXT)h#0sun#SX2FXs*(MzUfK=6sdiBfvzy3iCxWkVd=FS%aDA)5fT?ML;=HDr@D+u_^ z7VlGfAw}Qj1{C|vZe~~Jm!i$f0hF-ocf3#xdH3-3zMwfHR8u>NEaEI`p}7j$;gLFQn=#T7VC~PR#%7tcXbl z0HlJVeIEZ?z470@;pcMztaa(4TYnqxw{v55=$-2M3qb$YGuhPustp#o!u(s+hk%cR zMfeyxFQjUcPv>5|sSf+C+C^MI+6jtWbQh8CA099Qd|=a_Ug57Q@g;r-+og+Lg5rEL zZg!>nH_&Z!01x73_d4>oKm0wTd6sl;9Ru*O+rMrOw4po|g)+^|FM=+YE^7hSF;*0! z`}2(TfEmoAb6r)^x(}dly^-9*yP4;>8^Cd*iuv+%|XkrRUc_ z&H*c~xP;&$*5Yvr81CR%PnZ91ccwVsZ}j>hcOk=lK@IHeZJPZhs1ZrvePG_3Bo|XN zC6Lc8UjmE$PA#vfoWoT@w$5K}`L|@eeHXa*DO_Il_uAq1CE&C0JDkYB9_~N0(f`B0 zJTnHYLx- z|N0tGJn2(+VhCtT-yX&cvW9i4buuYge=;=6ZH}4`VQD(<{YcQCCTw zUug4YtGK*{N#ZulBriDq5TT@Z;xdru_Bcyzf;g9@lx(F<4N&;@IgHiWQmX!5Oxo5z zw{I8T$iG)4d?mWJ=_4PAde|!798EcHvN~KBA!Fg^|G_=bC#F(>a_}ag$Aa@vE0<*a7iO7D1Kz5_H1?N@|7Uwx z#9kINsuk$46VA(L+kyfoTkfLY?9B4i=h!lvqMytZHXh zQdX8Xy!PiY6Sv8MC-$(8w0rrl-sJ!A$LnV}X^eV(%E@HKo=Kp>fUFd5@LEw@pIW>wXn4% zTesAHV34b6-QCgPc*TcGN=sRn15cWeFsi9ygWyfWT>P7rNL3p(#FZ<8K z+yAew{BL;bfVg~Zp2J`+*+|mPt(}=7OQ9Y;rcS`TUi+L>Rd6^P`;@dwN_Jw_`g54t zQ1;gDt|5yYr0_>3o7CiThLf}D7T|xc&y$W=!#-a1YrwB+Kc=U*uf^}*j<@#{+7+M) z=37{d=Cgjw$;sIwW33msC34`0%*+icoNZ}cJE9`;rL+?#fA`g`(6BG1;-H19306M! zT>atdc_-$IDqtaBDRYDVmXnhxUN)gcD&_N8e)Ub_zr%tj#!|mUR;&7uDfcRu<9hzx zeSEO5C8xfb3Tl-NN<=Jyup$NVr|ZS4#JU+1*g`aCEJGYk>7z zBPQWhPN?ZhQR^D~IQEp@ZVJ|GY-;Mi%mvx#&Ubl4#HLHau{*(LH+l4)_cZ#+V-Yqs z(pat8A(7+fZtuFezU&=!Q0D%*hoxHy-~=-d=jH#VlwaXRi0#>7X=2Fnw2G5kiZG{` zLGy&V-FTD}R6=F9_VLZmx7!`suF%lKEI#(VX@%X0d39irTG2l}iA4!zvx%Nyb5Ve{Y`pg6G!l_?1OP`VJqB`-yLX)ikV^1*LUb^&IsgB0 z_Lc#0b<4JBAh^2(x5nL_H14heg1d&`7Tg_zLvVKw?gR)B++Bma!&`iN-+%j@x9|Ol zcK4h$M~xaa=Blxo&P1p$Lf*3rsj&*?dFi$oH1zZlfD4)vq>zDT|JpT}S8pSQVPF-t zGosPw{o2AU5krhwceBF$C81Q=nhviHdiTd!uvC8z%8 z&woVKg{D$9`unnW>=*Yq9?LA`ro%BkdMu3Cr~(NElhO4J5xld#-Pa9Ef(3ij`8nS& z2e__`$7~{65-I+sQBoc+>E{LB0pUsVga=odVbUwwwpsxPnoLe$M1s z0f*J|^x1X!>t&VE`6ksT?+#``hpRu51NcSRjep`5gtroE95!;_Rz}ZYIPn*2ZZVZa zOgaXM!1EIxmyt<*BiCT5>4@=7U7hj4g=t*yQEgpqZbJbTel;UzqD-%f^L0aw#mjQB zP6HcAKI?;I`$m*9SDS#{>)@JEx4(GJV3ucpVu>n686&^XHjchT;e^Nm(FsvC$vKCAz?24=5JXiiR+5@xQ8v#X9PsVty+6u_JL@ksXth^!e<7$Ugz9=ovrTf zkd{9zXIDJ|`x3n4UrTeqMdK)Ndo{(n*Rt^E`-^aZw1cIyxVRd%df#NYg1j_UapUZF z8Yw!7C_GNkfP7X){oFvEqEJ?%M|pHp##u+o&&!h<4|(;(?^q46#f#)G-j9suuM7OB zcQoN#k-`V<+$vHzfva(qQVF@F{$CI1)Gf)|^S)h?Pe!ODK1idZq2~u&DL_(Eig=tp zr!N>Yw`!`O%B>UmnwhWC@;|O2wzQ|4XJvESi|Fd=Zh)jJ!rq~iLW=zmLn9?q3u{K^ zfF~D$3jODM-{8<7{`)UD&{%G5kRD+^TNJxLg8wAXQSk2jD=;rF7CDv}RQN>Y!r7e`SosQlcCE*VWse}UJ3(ERlm zm=k?2JV|(S`!jvh)Kx|=R1R0U`7T*KHEpNuVPS- z!h|kdF2yQ&Fh_dJ4to!#fr5zOs*j>d9beQx3P1~bQ&RUCJ?>ufciWG4_mWC)ocXE!XEsv1HU#l`a zT-3l7O?qH85{)LCwihqyMEUs+*c2IRKNZG6Hcn2%F{udCF{#NVG#nfhUtixq_L}gh z22O!gYsLO>?0oq|cP6=emmU)V_X{z6PrcM!xE%et<<-7REiIj#j|pbQx(&gk-@?Pf zMa1L;mPb4`+s&fT3GqS+xGMunGGnoDW88K>m|0rCcXC1u7DY|P$CtxM>eUs!PMyMx z%}9LL+3Jc$fE`vkW8IVd?E5%?O*uHg!aB{u^YbV9_jZ^V;`xX?Nfe5>D9NyYFBkRO za*aJo)Perrmg_ylp2n1+&E7MYu2sie3NdEr8D`z3t!4_$s&jJhw9KW>RZrw4s9s*) zEwIZvZ#7Uh$NDY8u`p<6z{NSDonlL4za5*G%)X=EH1ACG`2D?2~W+ciIrhi_>qB`Yhg;XwyU zA}sc;lf-JKlA7nE9-n7;*p=>|inTqri!&ylJ3CNrp0WN~|77aFj-tpOloVWnQ$7dj z+hP5G2r@qM^;t`*tEl^d*TmYXgtN^qO+IMlnqO5cEVYvdDFx2e<&jW#*{9k%MT(ce z#{5Xcq-g-toSf8qEf{e=IXXI~usU&N2_dVLVZJvrGfUxeW-C=IVF*qfL?+&8QDxz{)Pa8z5nreUI{>Xs&0Vnuyu8KlH06eS6FkP%q zq@nR0T;u!dPJg8pHcZTtWig6kux8mFlY6gY4RJXU+$crrL51 zKdP!?_!_Kx=bFd~35g8Mt?8RFfnVO#K4aHyc7rb|DJfks*?9uuTjxjr<7w~65@I74 z*U>{S`shH1(`}_gB649tSHFy@puqaU4!k`xbF*hN1&B|lxyVm3o2^@iB|dz=v~SRE zvL0Oy>B~gH-aEB&jdWfQRhvsPc!7-Hd%8WJDkRa6X2&0#4(Zkv1CD9R0Z z!r2HNN2}U3xx|F2RGFB#xnCBDn&};kET22Ft(AGKTJkdS7$R_rVbRqQd zY~i^tGg$vR4Stg%-vX5iHkkep{tKA@FZa4@NxCcVP~uyKbzvV|wR7kA4azKS`0yza zc?Y@jz-{+IOdkf(KmWNZNu&fD>^)n={nO=H40*OkT-M>`3A&-#s>`qC>FI6@A%&%g z#By`95FV3SR%1Q~Kq<$|-LfHee0aELp>D4lnE&LEOlO%U ze9Es@x=oL~llr;MB$Wlne*5?s`GlNGo>s1Ys#Q_gQYv*1ToJ?X+$Txm{4F3LfUPoZ zgS^=Hg*PhOcOiIt8*9cYXEfE?Sh?MUQ!bNDI*RsmNc(7^4z>062>T)phMSEIJQz)q zYn{x*!p%K3Er!qUyFuP)_pDtuA-AAJ)vMk7lc#rV^4(aaoyAfKH61H!VuzoQN($-U zhlVn#&=^UXFBp-j>!TU)SzuAoxXe^P)WybtCPnxBB6Cu9#>{qMBRgZ8HXA|jzCNmr zxL46Y7})iPf=d>2qgELCwcdc%CWG-lwPT@^@Ct(2^`}(Tq0wOp9U*`ABumw}f5RNy z8_dNLe4P5P4s6#aiLTK#vpsiW)@lo63JSxqNM=HSr3fw9;J9@$|hapuSo7?A|QAb(|{=OW#z%t1n~gaCxW zjg;KTM=dZ8Bssg|qc{u`bpDp*R}I<}?-MM>NWparW!Ofuq=n9qEEdkM{yBcUkE#m3 zqfWF*mAWWj<~=4%^35cw=Pb~SREbI14*23Hv!9D_H_s0WU$361j9~c< zr_N;_4Nzb1tLr~Q{?3L&^HY)eF^!Nj`&5s>#KgpQgi0*Xm;X!Ew5AQA-Q!y1)-Jo0 z6QAvCvz$Sm{8OFlsn1jOx~Bt#qCPDR4<5Vu7yLJN@q<*TZTsawQj9Z%#8R8zHVAjy-tT$fet2eo+B=0w91}|luxqc7&d$2uFB>u`p`I*@J-dFW zK_!w$yLqD3@tJ@K9<{pak03QMGa+N(fZ9_eG2bka)Y+55{uh8NUBJbnm2R(KrlJ2= zpuTDXsnBq|p*xPQk%eP_VLI7>{Y?a{gwazaLB1*R6+-9LRbHsvE?j~0x6%m3>9yMH z3ev$S@LFxOPYHR^!*2Mb65#YINTxM>WPuMu2Wb zC((Z|QMX^N#}7ey&WW_fcoi`4$F;U5Xl`ktTiQw5IHs1*Dzv%a3shQuwwN6~2*SV( z!;FlI>M#Cdj84MrT07adxgjd7rKR=la+G#HR#7{lRi+#9k1aW(=t>veEa~5T@>ftZAXD-UrfK4)9(I-sO#fMn9~M-bWF|uzJZP18DGbw z7I4eYpFOQ!;sTxzP@GmX!S+dML!+Z63M#x(^0K`_s=h`eW-65Z|7a9=WQ{=2-5>%@ z-K)tage>#M$|oe&mBm0@8L~aJogB9EFA2>N>c(mgN67S;r?1;jUngI)M8G7H1s3e2M4eb=zm*vR%xL zw8VI&q1OiS^Ajvbg)ix9RI0(lz>Iq6it7BdfmX;CqL{9?pVM$({m!@+f{eK%H8o>B zmm;cM&Gz+SR2vEg2Eo+c-kw3PRtd=Aw6wJQD@EB1vn5lKz{K!Qh5^K7>4V`J>t^>Y z&~OrSNHFq;t_AI}Z%wUU_n$}8U*C_@sp>P-*4D0{p2kSVWOe=dh2CI2<4=o;RRWrE zJU%+A_E}M6v(sg$cU|*&dU=H4TBGFQ;i*2iGMe}S0c3|{`4_>14GNO@*}xEG0BZ*97g5YIzlH$gu&iVbJaf2AMy)| za;%_Tq3+g9A&VCG1>HCZN17=FDKcARR(f_2_YBO8B7u)UE^r0i=IyoqsRgF)<8K(x zRMIH;9HwkRzu%OB81}IL%DDyp@8EM}`fYQiG2SYxaItUv&pto~PUEs2U9BqGn%EEy zzsgX~Pf(=>e*C{wVc!D3DGt^;l$_FpDSd}4#)NCd2>TY$VjVI4sjXuuuuzALb zH`qSTRm@B42wU*Scz||q1a@akd8$xeB6G1JX%CHkYrs2# z8Un%yeNn5AjXFOp0mM$G(_G8wDwf7+&6h#ALo()A^8vRatVDn1X9}NlycSlpt`?W& zg_?FGF0jJ>ta+W^`^PgozZJ+Pj~KaQ-(7!Tt4Rwfq8`?)3|IX5HOM-Zt=VPg19={K zTv`T{)2;|M2}#IwqFDXu89E`M9y%s=)a&tzpC~LU{HT>iRp3#*7+z{h?%X$Yhg-Us z>1hsuo7R|-SADa+cXa9{e)B0(iHx6cR(I%t@&_LsC!AkS$@%6;dw`y!szin8UqF$_ z0!bN2XUH8`DEhYHH18nj>FGJ_UznVRDf?9Jk0W4~q3mTTJaoZs&SoEe7P z)S}-z!K@{M<*@10M4A*^L&Z0M`WE^`LGIsW*8dbdO1h8(8WP3xE3iNo=_d+*=%j+e z@Q+{bqhuSS6P^qDG zC>zsCv!QFYz2&g6p=SLVVNqiVZ*h|{a8e?8^DR|bK^CY0PluOuz1sgHKLFz5!g&wt zO%{Qj&tf)8({^jeu07Ryd%|ishGZ(2ez*4!MUcY2=gE1V#AS%?%KL%iPWG%tW~vMg z%xQ6k0+N5y@c3Yu#cnn>aJ=LSly&QsawFfFf*Tr=%1?Yp<17znKPR%2jcVi0*495smDl{t$4M#GMpxByd)bn)ncx0QaP&-=efc7QSfXlIB z8Kf5l`Lh|0DF(p$j_KwfrF1bs#E>laUZ-;#*z^efDA$69KW9C=y6~@y;72)G398#u zsGAeXxOi}O)Z>8pSKzb}1A*fqm~p@WtlNI{H)_o7Wcob{g0rWfh@)rwpA3Z+T`P8L zrl)i2Q^KPM--Xu_uha@75epU55j5x6J`@dS$Jnj>WSq8Lsg*u<-(T~sT7Ps$O!Ve# z!Gwi|HJ&c68RoKA4HlL?JUra<{Izh@5RaDqZN6EnyPubrmugLD`hTlU+H9ek;Yz=( zU9h;4X=XMZuj1Z%B=oABttSsw=^^!tD~z9m(Sq9XtY4U*$87%KFe0$idD*>o4g z^B*7;vArWB%fS=cq}MJd4ch1p{vn?}TU)pc5ynpzCJhAH2y+M-Ih%?Nh@X#_*AU2% zwRp@7hWz2#aYr;`##LZA&M(^z^;Qf1s8w=4K0YZdj^VZCY4|KZveOb~B5=v@SlQjshF3r?oSA&bd(t1tNd^AdND{ zrJB#}_pEmQDzV2TXgKZ?Fm8k>GR4joo0J*!=z2=VKu#zPf6l_iWrU)%0q27gC=r#m z`HW*58=n;fduwleebEojevnV2pkaV?DlsFEz!KkJkvt z82?Ulu1#t5Z)xFev|lRKSZSBEH>tk;L&e+D+Pc-+QfFXnoadaTLWbq*vo-EG`Ss?A zmqEW)4xgMX5hEye;d%)L4jVA*GCcub!Fz9 z*j>?odCmQ*yR;OY@gp2E`T=;)XF6~W=EY?EM*1TyeF+>_IwA^6GIFAQKFw>390PuiNt~ip17mc>47AlR(XiK|;RKfVNsqG;!IKlL+zSEj)mQO2m81W~@#AAmEgVK)_pIfX^!t zeY652aG7`bhkY3XH}}?>4J#G}Iv+eZ$SLxsHz$FIv+Dh6)l{^U8WJ`?9m$4)rU2OH zy7%MD&Ty?zsXv+gW;Va;iP7R!YOPOcP>ap&xs`g^aL?oI zYc!ygfFjxv$fk#}M}Yc^i62#%S-7*YkJo{?w8Xv>LP}0ei^|HV+x1+(&8@_W+tht+ zRc~TyO7*+DggV^L;U{$VLdAd<_ZO1*Gw2xe@yySd zi~X}hSU~4Ar(4LL1oVAkVq{$8NIs}3WokAI@$s0-4LZmm|6w2p;|mNwkkScYc;ZJ8 z%vF&IGIGXft6={-kksA+sl+vSR~&$AF380|rLeFtJi%Q8G4UNn&_h*_5)KZ|{LKhX z!$<<(XsLP!l3c0)x^5(;{Ogm`hY`*4$)7dg0GQJsmQx@=a_#+-=ezkUfqL?UCK9cb zY{|ixe928Tt*4iQ#bn>XvRG{|f;;J2`%NWlPBZCvtdoNMT=8{==N8Y z$qUDRy6pPHq5Qka2&?b+T-EJ9=!#H9;|6u5ku~w5^07sxES>R%qi@a-f zQ*x$x|1gQ;#WtB&@HwU<>vYPWJf*_Oh($trM3RLJD>f-D z{IRK$f{P5|SokP#Kt8>Dc^C%fh|}1@q7Mp~lVPNwl=D&XoN^sLJ|#dy&4yz+6|O=K zA2mOpva8NUdtQs5<+cQg%Z2UfiFkde`xy=eWs*;_^dC4v^NW`T}x{s$1Usey(6lG9#P*{+qzSnBtY(Wngrn+4-=sapX6*0#FH&%Y%z2CRiFR z1HH@zeMksX-&g;I!QZs-eYwZ=(aAe`qMDuhx7ha|QKsz|lod)9l2h^%ca(Pm{zSt; zw8$4N1iK2KAFU9ak@dDe1nGG2t%`Hd-a`JzHo6;DT-Z35WanfU=e0IGP|<68pnQ1x zO%WT56Y2!a`2}2}4$v`lL>aeMI{DLG27<32nDjh2w5VlHb z@BqI_tf)Zdvem6>47FP8c-=_0T|)E{wwkN#*9|Q!ZTQ@50Y8>KuC4=!HBeAcMn^pN zC#$9JEirhGSKD#heF;q4oHY|c6p2^)>ZNKD5x409rvsHg9h4UpMyvFi^ye$| z7;twjjBSxMJt=l?u84(>CQ)PFL!NQ4pjoDBhepE%HMH=?Z*4g|E_O;8<`#e8w9a!m z{#otn5GaJHT2Pcv#>E9ghQ2XmRH=DB%1a;dtQpZDZRk(O?u2>g=H5FrfrJm)OPJ4| zTs*R;Xt)=B9OS}6KiZ)D3BcXAC=djc*@G(up|{9}*Hhy*kl1*rspEI?nHi_HKK9jw^u(mhDx8tCWeSI!q;OT%h$mMkZd zL=&Ov_b=u5KL^7BREE`3-V?RH{e$V`b-Nj4%&o9^UzBFu{%h~w!j#$W2hPvvnbH4{ zE&)iVm(alt{*rzIFV19C za>jcwL(GNWsMJ3u%|`(V5uOjw7|uXwG)Z6@6rYPNK`u_6DL89ei=TF_O0gE$crG9I8WF!N~ zN=6L)m9m_HF*YtfFm~ObkM&PNK>;TrVWxqd<*&3lBD<@r9D5u8=0G0GB2b=L1s@A5 zn}pF9$hP*jb(6i(J{89vBjFQ?e%EE;`#F;NR$mhMoca~K@PA-khUQJ4pCAyOB8Lj~XG3B^8I7Gz3pa@)aV&a_h zjAhPZ$Gl*0CcNkC)3qkW^y2w%w9T!}q;uaYUF?g~>8hegK<`jU#bpNuSR}W@c7C}| z`!W?We3aU|I;LPlNBABxo1BtT41YusuAlq3Sf?O-B1?Gi>&de8LbCbh))utpC)Sks z`0zt+yHN3lJTl|iYQy(;)xTLX=Ii2uf_Q-zVM>54rQLFK|FRk98n+{HdgzWc9;xz1aC_U4wK{=#Jr+|(zrx)W-6WQjaxF~lnqK#g5fEb!9&K>c(*w>DgB zRoKj+Hn=r@^yK5g!u^^0#tWAKH{!<+gXIoy$!5hi!L^h;9rgZatj8iY&2{U!$_VkO z!Q8Q=RzA(r?J}<2OI+r&s}eIwLswT-z#N?kCAg;0cwbqYT$+bnO`?D+5J(?In@ zZ5ZCY7YIK~zQ&*XB49IWW6C1JPFlMBPS^~hPUCJ_L2UX$=?~M z*=y{>G^6n-p*6EK`@E~}|3Xz;P+ zzK_Ev`ZjH@srBi1Hg(xeLh`l2--UMr3Q2|*r@t##{C@MJ;VZ|);dtSv9<4#z{+cf+ zbvO=oS!JoG>s{;+0UeIq=hv-C%7=Xpf#?6c8MPLBu}vZ`ADAMafX?Dr5q4GG8YD|1fycLZ|7-BFfJ^-;}|CWvnn}9*Kqc3von`P|=YAuPC?Uq`rM@$LU>o z&vMSn?F2g;wE1`RYcXdj(}jaA>A_$@D&!iFMECW11d-kb!`6G32TU> z(NY}G4COWV-aZCb_U@x{!oES1+TY9UXiq%Q$%+HD&LJ05U-x$+|DJ073ZN^fPh?=o z#wf-xt)js6&Z!ECp&d@-^sC6*T)UyZjdwg5w+MtP`1LStVGwj9I5THA{Gq1jdw+NF z(liVwfi?v-Kdk3$2>E)>?i_5k=OeL#&3ys!7-85z&=xBm-*3!W7x&l9^Uln`=XBAe zqFM9jwPS;rFG;@*1}iCO<81v&vi!=-H_x^^cAe!>6JPC&kC|=YE(G%USm+@u3`ePUa;1gA=4i*!|G+-!=sRYSd~XPhf$J-HNj#QJYyO6vg>yJIFtAyB-DzT zVp7F7sPGq=0-XQmnXiF>vj2j4^i>4_w(yUn!em$^X^8OykP>5zw~_^X4Mt0iM9srcdTAKAGo#tJndRa3lPnGsdp!f>3Dk-vkTjU4 zg07Ie(OuB;;^^S>#}RI1V0!antE+IM?HU;}yt`gaEXt^`;{NQjs>4Q{)n+H`Qsb#f zW$&O;K-iGk?+hmEo**yLkf_-HKCt7Sm5og#_DFIyvWRXUSrCOVwQnXso`yGdIht(_ z$lW|VhBx<^b^CgPB1~E7{>cXaF;654K$=At7GEcMQDo(gO^yyBu`i8FK!f}z6Mfnn zFEkCtn}N=v86z#1=GbpQ0de)}UKv z<8+-J^VhN|(c&yuFQ!T;y^p64**Vq~ib3H>u^VQK`r<+z*iQBb*8S1wpWe zw>3}Mrv46LgLBu*Lw$xQlOU^m-vB1#m-Ex0W?W2vIeTu*#t(g}mZ_FnUyUFt1*e`` z$``ws-v`?mud*@@vih#mJBxeJUtxM9 zV1cD-S!jHB;XvB0W7j(;N`7mj+Q%P>U2ex|F4FRED?65BbBJt@&7j7I)tyE=n=xw&V8pGoH5RpN+2Bqa5M?6hkqeN6vRwZlYA5IkS`@rW~7C57zLX31C- zD@&rRQ{&<&QL!MX26mP4R#m71L8JZetrbh1(jNUy$Au!{?5H;#rl_}24a0|~M$B{z zfkH}iLz5!iZZ`YrA3=;BNX|hO0dWID0&bUJ0WL-)38OZDd|YT`yuF-;b}d%xVqv2^ zwzCy8(3d(65gi$>LL`q+JkWkT2o~3PbYUM6Q`I|ASaC3t`8hW0dz3hTSywcC%!Lg1 z*r4&wl}JulNsCa2wib#|(kQ3Py|*I`)WQiG4mgwNj`K;DomSsY&+qiLx(sa4QWwh`)7rCO&Z(1D} zWPt`;ziZ`-zm~qa47tjtl>s&)E?(Y|I2DzoOxyRddCu?zgKQJtJP`tj+1)zOt zaA3gbsM#JJlfqYPtMwbRb{m=tU2E9oN=l0Xb<{B_qkLOMOiU9;;8fAL!2w&p0!}T0 z22ChhDWnsRPP0RYmF82eE&t8&W42BPd#a#yFez8O#zj!rn{fci(nwjC3~Oy8<5Y-A zp4)yE<4(p{VEpuU{1bQCZ>Rn0I2-f(o_0g$OPUBB6ZFk+fL5QO zp=p>^5*-CQBPO665yGO>W-`wkDR!_#Q+IreN~T4BqpG1I2jn8);z{RDi$-AS-a(^- z9Tn2J0@u%b5OUhu1XwLMp`sKjy#!_wGcx>5M>N-gb_z||stcff@7|j&Yn}b(M2Nq0 z>bGxoF`lawv>L|)6fIq~I-3I{9=_quY9AsnjgS0DGNT6OX@^rB+-=CTg7y>6}bPuO1fyn*x2W(Xbap_##>pD;C+{*2&xP z;*k$@KfMBC<32~t-U%>TOF_SVivMWq^?S__NtIAIv&(+<-}IOJs&>ihR^<;4>?R6s zmMUU!Ix61L|FrMJd56&P>QotPf3So=v8oP-FebZi&P`mMv4tyF|^~q zO?kw`)mL}85XVlY>q+4qLLcbF@lvN@KCFc_Jr;=jo*M4A1Pdpb1HK6G)o;p~1A(|| zF~=_N6&lwwy;oC#ay%lnnI?jt<2>{(`0u@@W zb&Z1_JUVRVZlHH}mww9|Viu!50x{mvb&6wMfxI~kFDA6Qsq_BSCob2N7wA^aGyYBO zO=wGBEZI?3X)`QJK7bxUX8hkJE>vh2xlr~JhfPGvBn&>PYg$c=+!J#mr492 zv&gQD#2iE7u21#Hk&HiS|1uJ1lnP=w*G$!-V%M{!Ir&P7z*-M4mY<6QI4$JI1pJ*a zos>otWJM(MJCE9ODH3Tu{4yFdmu|WpUJQk1vfBicWPJ%z8tvYhgn9AfKuS%=1Ezd& zH=r-(2Q7o|R+*D>iB8Im*K}&|HEY)#yTzp~iZ3YQGKC{}%cO&pCT~2BZvXVPGdaO; zcE)&sPZI}=(C!BVz511OO}3{U;SUS7#{0ynb#?oyeh<|^MiLJ9cFEP0q|jh&QM1&4 z36ia{JzB)-jNsMAmqKl4glmkz2!=CM!% zY$jW_r@?lV(TaC`I9`KHjjZMJBjQNdnv*(pt$*7a9ls|GAJO%azpQC?(wSdnPOK6q z#!LVK@lVuz^@Q&MGtgrl-q~^Y%wde;qnpvMI$!mi@_ydiF~uteX0)YRZf#{0dN|(l zhAr-c15PSD84Kf5Z2QSD{By#|3(84oVOjmQ7^I7y{GSe=D`c$BB}t#Ct}Nu1^eWUWB^>!hnn0yCCJH^hcd2n%0m44W znq$?cG_GxHthf9OhJ}p`Bkpa<((FZ^4XO(Fw`(`& zAsl5!L2;L>9zCV0NI9gf$MzrQ8&xaebb9kb*y)3cH9nu;{+%swi;C7t8^AW!6J`!T zVP2`~$*N&}l}8gZZb%tPimM^s$_P04EPw^2Ym~i7cp6gCJCzd9j}NY31~ecknE*gH zHlYjG0uVm_b9)4$!Hd<_-*3J2sK83S*68-f zo8Globf@!QXgC5bEiDLk;0m1vwQ%kH%ovha#4=x%wJ?ck=2iet?Cg-8P2f29=o?$^KJ{gW)NbJsrD#{u36p7^*71GVKDks1% z39fW!X*03^`Q-JL!)Vjk@V9PuGu-fUU&i%qZ?L>II(p8%ygRXKKHa}il*SLRW2-~j zBgg}83qJvPEH$`(SnZa-l26aKv`1cr&bvJVwX-NXg!Eba`B34PSYN*?X}JC%wx-i%af(K=AS(|&a52!c?foTv-k-t) z+W`T)7Ah+D)2w^YcIi7K2VPIdJiW*!A`=QRUpXjkavQGTuqB#+U&lc$L4lo#DVkR~ zN{r5vcqi;N>#5laIwNz3@ZS8xQysDlkiPy0zD<=a(y!RQp+sSi8{)4U1n4D=K8^Ag z9%o|^HZAqi3sDh~X_{^%xR7IH0?IXTI)C9B)~no`pRVF-+Y2Mr;2JLfq8zo<$Sy>- zvPIdRM=5pOKf#!hWYTUgshMT>a}qIa&t>REZJ}Ztp_83mNWQNMPMPqCS6Xy*=D%5; zXWYKT06Wf=eXt9c&$kn3jh->rB%`Bs6%2-OqB~eK_(7_r^W{q%sn=#ec(jt=A3wY% z-+BjPTjBi6O%&y2S{b=4x#gLOR`i<{lO8N&6b>VP`N5>@mmx8oljiZ|QZu5|Xe1Ef z#;>^+j9q74((QsV9q8TiK6^iE}KA zP~`XUIUG?3tXCxa_~{hK3)s6L4mnlK0tzf#nV^&Xikc{nVk~e?gK;-K0bSWu`fFo_OrJWuV?# z!zksJg-{-}Ba62*O7Uc16(?vtS=!%dh zN|9pPG}Svt89XgATI{~tM9!UT{l4S|%J5dC(y7m-3H<3Rh#oOO-@&~@kwk0lZz-$+ z0;yTYK-G7>^26d&r*D9qjx^!Nu&F={^yFddCEuH8-gVFS)&221gziDI= zDd+rz=6XhpOp)qeqc5SDF2(n2_F?k<{#n7ym;2KqLT^>tw-TF8+4?l;3-bgBcG{W>gYe|c zrs6{QC&LY1_Ud>nn#F^+@vOdA##HtvXq@ii(1wA&D3V)y1!?`;_Zi>{KFSvkyAG{l z9A*We1@*0aPiDp^1l=)m?Y{x+HD z_Izhgy?MU1%w1yC`ttmc>$Im}r0lXCk#PrZc)O&rDc&EV2#pQ4baLOMUN>HCcO}{J z@|uQH+Jpi;)M0|2w_)NN#bM%(K}vv10sVQuAPo`{vK!j=mPFuNSPd)PgGOHn(c(z+ zrO@DuKs2ZIY>CTw-RNm%Q!>B6itgElEa#emVSG3Ow@3ep2&qFa{-#MSJ5$;~e@2mG5*C$&#o~ks0%l5jcVPiIXdAelY z(3WDj+#~9MhgMA6?Q|c}Amnk7vWa$GEs6P+0HPTYz{DbqRL;Ztyb8F9bL9^;!0q%) zp`z+GedEqY^NyykcXw{7>8zcz-2pIkhy9}m?B+pHoLMkJrsH(je}L}8nLK%ZSVYP| zG(pVXxRdbu9A#kq&Bp!FkxdTj-q=c%@FBlQL)h#^<(f;eU^Z|y1M3N2`O}x`roo46 z>*=ga^_5WP-~NbK%?_db+$Er~Z}zzucUQEf8YQ_m4~dPyzni?)z4u-xNY~OD+WUDq zw+6MxEJPx|*XDUjTqvJjvWo=D6yEutZ=%Sc_@(tOz?3nW^=F~Eis;-QSQ%#c!&!z? z1U_6Zq8xQ}$a0zc*a?OFNFj|}xNT4x)Jx*Jz1Mcoj2|c9Pc7DH_NIH=XC~oYUEt#ra* z_0&3(@#Gwo@AJhRD{iac=U2b_mH`1=iGu?Izg9m>*-G!*u8A>Ohqz5Ul}VFL9n7&6 zE`*#EUmUhS-=9vS>un7$V#wLf7tD^G=ti}SmI{UF4NW&0aUz_jL4lhAHw0ULyCjQ< zTQPsX;D((ebgLQ$DLHXHur*Pt-soYRJAhD|KQ7meL{CN$ zlG{5c+4rNXO41G*9ygTOb;0)({IWGS-^cSkD8QZCFjhiwiDWRwzYLnBFAwKE1>2fjHs_c6Ke)lnGFZF#N zcV|*S_E3<<1<#Zk`B4Gtiu77rc3_Ru`)ypM9$5f1Hn>9zC81UgAPe;2`ZK*HVqQKV z&->Ts7VeE_Zvp1VvrX|6f8hhI#Xe!_u&|!!$;rk=U?MYd?@wm}4voi$2cy+nr<4u} zL-z8LKbuq|4magSdjb9kId?o>5Muc5{R_Y79JzYx}zYqZK z!p1JP+mD{Rk(R~kWrdAo^#ggixhY*X@uLkg*2YN)s;ca6&3y2PE5nZ(k`79wO!^&t z<+7?9Cq^SsE{qe^mWcW0W*fYow!m~N@;F|wDI34t%Pv1Xb;LP@r>b3#3%hHeC%)!< zb&!=8I+3q+R%&W@M&6h8JzrD;u5!^2m=elBs}mr9ev|TVSIiz?{v3sMElB~E2&>*Mn~;Odt6LbUlE?v`qy92Q|%0k$q_quH^CDGf8(^iK)D*+lT#y#yQh_iA`SrzlN&Zw{^CUnB!=tXUaT}P z*Skf#TX^FH*CN7NrN>hR5pQl>jHKMvu)*!&Ef)#@r<38XpS3~Igha&U4-dm$vs_n2^Jte4f1rV^ zMwD~)BjmcBt9xu&!GSN$Lu%u!kNNNAz~@|V^?nIWOq9sMJUHK-20pfpi8SIvEqlQX zb365j*D>dh6QIC{pZ6BsE8(bYUUO)HR2DDgn(i3Vg}`|!p-B9ECpyZ@h4@R(B!_k( zoqxSG`f}aofB~+rS*g6bB+k`1(!OB+oAqoQe)Bb$42$-Nr}UUzwa&qGm2t+QW_YmE z#XqS;zh(f9zY|a_M*iv<%&DBWqSyHHs06%XvtVh&CS+424$Zb1S@YCqQ)3w`GE4MC zeeS1Q_+xuU!cy%3HUq9;`cU(3)7An+yofEso5WVCZ_-V*YJO z35w8ht9>=VVW4w;=ej&RCKViJ%}7Rkz4w(;n1_7(9RKn_JCqq(7kNCuB?T5&0yntj z4f=&sJUKxE)*^ZWKWy`Xg|J`7eZ2elcoZi+ilMKr322Sp_6%FgvP0CXixm#>lNTPW z*LHMpuU9`}inrJ~_%aXDwR*jW;0@dE%08jH+9kPp^eZcp5Q{3Zef-Xwe(ESjl*v%V zY(z`O32Un%hE>zFYga+{fCud6G8|@fLO!ok^JEC_`a6HLdqva&YN_%sueP`L+u0@L=m6(R-woLFmyUh%z?eFQ$IpY4}{;%i&pfb@|kpu)PEiNb_1N^J%``eX$ zM*%N%t?{gtZr9h@-JyKstt5I)VA9K%1-s2s+lDY-K)noVaWd;p=EdGgdU-gsFMqL= z&uV46-T#9u==pVyPfj^V$*b$;c*$_0>xIQ6S{zz>@Rg5@A#@9|L@j{}rym=fnvw!n zspJ)M?O$ji`u6djipvL0?K5`^Th`II_)DdNqS}3IX36JkCRo;E<3Q(r^T1Pd_4l zpWxR#$^KN(HPycm665U>F4a0{0t=8#X|Nz{!No~sK3L0gxXe25Ui5X-@_W(&)Q3UZ z4~gNY?YP1iT^p#}y+zIFX*%>e$hc_LZ2H!5yq6o2Fu#0VH@9nFi%G`}OGaBdzPl(?k*f0TW7K-69HuK`LZf=CD=AOeDz>dpcY)srmt_wFmMfu;Lbk?wnd-twM@=F#u_x<;~)n<(UBlT1Ip=~N!L@FHzfZ^*Y zZ%*B@d)S{xq~T*?3ggWTN!4N_#5M|()$b0*C*41IXLN|mayUMj32D$S*?{^Adub6a z#D?FRbaSDreP%PWKF9Y$t{w*BG9=(!PxzjYYInWr zuA7q$Gt?-BGO!TokE`4kv@g0IT;qs;QBJ^fqjBt~65DVLQOYb=v60P7!B~tNOR)8D z>Rk_=+n;KphGz-dXxCC6#dIYQ#Sl_80U!gp^X!M+(`!`i+p$h4@H!2Qyl7V}ex-p{ z#$~!Q9Q+MWoqlN|omjtan>h`mLw=|O&T3L6pqS}MO>dS;>UUua5Y}EHm^e;SP5hKW z%D($kkjJHvXwCHs;T(&^6W;=fTgYm23MpPPDk{pISbEf~-AyHi<5zb8MNbTqDhQwz ziP@choZ3+QwsMGEw@S)&U!$3epD-(25ArRygK`1>rUD#1lqkf>znsnB)ZNvmKGOAE z&GnFJace8i*;rvL z^-#x)_vMb*RQ;B}-O85M%bwH9Uc|W3FG175pcBF1@3=_a`>8SMC2*tF%2%7_0|QT8 zJ|af~e)Ws3ey<7?fqb1FCz#$GWUvyT!l7?9i%OhL|hYLW*) z^+d`1KSVp3g87Iq+qE0hOkl)mWxc)EM;)796~*vpGd<#I9`!DV?rP;1^2_w?Qg-*` zd7LfS=k+-AJiW@@CaKmj4hy>r9W-U7&r zciK8+JL+2;Y;_%(hHZg`z%$v8i}?*ob%kqq)|u1`RGyBxClfok&H8owclRXqZ@?Lq^lAE%K2vnDqi620*?zWPE@^% z0N(6$wl5ld>`&jL1G3@RL^Z9EH6V?C;wjI4%5=5X&9Q~6d&7I1}pW>iQNk|tHz z$rNB5_QNN(-vJ6yz_M>WCd?udQL?aL2kIWR3&atqyTJL0u|H}&N0qim(;izRo5?*7 zH$MfvIW9MmDK}ewTagGMl^b=8OAnWz;?_R(x0?35%zHu?r!TK!#{<+B!pWsa{oZ4dJpX!Ght;du_VKuW*E-^+&49+=guuJ<;)nb}!6VCXxxWWFXb#mt$VW zQ17lS8I!3ps=FBr-MdK<7T+ThYnIZ^K2kk-qajLI){MQM(Ix$4Kvdnn@Df)kO;rx; zSMi%n+xHPowFFX3irFl{xwnDwq3A=sPqPedb(a&>)R*P5a;UN!M$F5y45Cv)s$11t zN?2H`lYTsZ6}m<~r#-Gc=50dd2u3Rs*k2rKRFe2QF-2<_F1j7 zCXwlzP4VBk4;4{03QzIavdy1QP(x;~=aPmxzwq=?T+Zunb<*u*ynl!Y5q%UABBR9K zy`C=(S5k=PQ`FYzeZxCiNtGg@8br( zc{2F4H$YKC;j{BqqlR0k`(@49A7nkm08%dZiSz6fa8oVv@T!wIhO&Pk4MjRGDUY)0 z0DATBjA@E2?0_i6_!R!>$Y#{M=5;&ySF zu}a;Joc<(I$c{W?EQ=6T;@(hDLZ7mAgK*XfY2YU^DmD98agVjfslWH?U|qR6nTdUU z*rY1oZmcJfc0WT%$B(kynT-fn+%LDX1tlh~5_{jAtK_L))2p%36bMk!s{2HkrLSM< z!TH5~fG<@nxq)OTvYHN7a7TAiaX8sPj6C@Io_}1a5~kfP^Emi0+Tqp4W21NOMH*mW9;;R7ww*A4yaRt%Z<0VD6<*ne?pvKG&tG6O98#gR1 zMHa861@bK^86k0pOw7y_ZxsT}zD`$)hzRr9r_!a1y8oEW3q`$lgO4iA{eF@n`R(jg zo?&Xi*<%^zU`ZdT2jWA7NFRS78LXS77wH;xcQ1m$rCXUGSMiO*$zhskMhNf#8fX{B zy}u?wFbRL5U<)L+e<}!(xSB2je%hMlGTgcy92gcD!Q^HF2&VYrdtd+Yrmlrz0lSNr z0b|^LXTpo6yWT~y`C(zH_O_yYjn#Cf3&;_clE0|WY&{IrL#CWKoJ6^bjyvj@9$qzY+c4T&{g@zRbjaPUd;c|8smY z{95?W)_k_Js8d|(!-vvxr+E3Nxc2U$hXIZ+>9QWDiGCzZ3pzavtdL_5P`zUC_Iskr z+>Cm6{1CHETI)nTkznZ0tSxyUY;?8Ka0 z%6fB;uQ+L_cdoPJ=n!RZymyICTK0i;1b;}PRj<{KPaCEA{1o28o$hjH1}Msc!o>X} zFQ>(vfdf~k8OQH7r9fp%Q873~~(t?(5v}xYkneIlN3N3r$^BcE)Fc~_* zi!t^)ncPI1430kqI(A20Lq1TYo1w=pKeg%?n9S8(Z195c`9z=g3 zz%ZW3<#1C&n~XK~w#48qn%3g-Yrh7)D}Qo%p_YEwujNH^U;E2qWI4AO8?HaOc3Ix+ z{^U^{VHPE^lyKpDj>C+$7j?%Es{q?B*Y57Av-v9gd1qKchrv?Tgy%iJ#X{=tz0S13 zR0%!qs*op7Zg=@~z!4&@6AT|F9%bJpHYwtNAjR<4HTywpqx5oVxqMM5?0e@|DHA;- ze;}K}LV_#2-iPb%i9p~z0l7`X`_2KX8y!7MNu(BY@{G4!-^}(Yh}xqHQmEzv8;|DF z7Hg=VD9%tbxBJoO8!wW!xvHqjJ}B4s2q!Tkk!#wLf7X2-6iTW1!8f5P)`7%@eQa}k z>J*?_sHmNNcX z+>>~}Pb0&=P?99$7Kk$^?`E)rl>I?*{x9RA*}U-L`>ESo+LK0aFwPqU%(RUc@C)rA zGs}L2ZNxlQF)6V?wglC~h%{Q2c}w_kIat$de{GgSeW(0b*eMAp#3G;km=aL0-mlgA~m#j-$5UrTS1bqtBc= znVi-S@!8djBg3m6vjjW|LEfNylg)Nai`V=>UGrYeN9D-3z>Am*WNv$BW>zn(!zu9j zFGVI5QpVWaTztn=z2e1Aj{^ihhhF`q37_%oAnDaJe90auyl@thBBW*bponDo>qTNf z1VgJO_o_V*I~O|bAj@h19zN>o-XWJ-*j#))ytnPsMkb}#e9A3gJ>4B3ZDgVLlb?7K z-C)IbqN>d7jcrqTE?o%zc2A%PR0Ogn+;&>mB$x2rQ4&QY4;7K5Fx))L&>tFar)T+mLhgIIF!1jZ`t4~L~Jkd;$T%{Bh z@NVAD^1xpT)l<|`<9oP%mwFNY`KvP!sHJLrQ`AT@7TNZ~)Bc%oxG5TTxK~fFUYoYlyi4ThE9hsK^|x;k5BI15@4%;i7%Rc;f27j z9zQZi%ZEctnpv@Kj#S22?Sc`7sHQxzpft+aLS=5Aa`n<@Nv}=fE>L~3W0WU3(etXQ z!9Qvmj6aKa^X`9UsEQ=DXmte$n*oWRm5k(5k7X>jO`or8TB*J@&jAubmJ;ga zOnINOQWXh1>$53vdZ7$i0#r{$K-8OUGoQOZ|K-!uB$p~Dl*4~>D((=>%_TW#V&gi= z9NrN4PCiJZ^vkTy|ti<#rOl$5+vX@0%$hQ{otN$B;&)K?#l*(!OD7@;wDG{}U2EH@i*vUk zfeI*iM6<<{@d!t*yDW*-eN-~-9)5M5u_3YRcOvi-^4|GlzLsewQ}W6_*xbD@R$Cup|4MhB-Gc4hn-65L*tK&F zZ15Kb%ANeo^LDK%@@G7x9}D}Gk2A7OU7&y6_*83I_1sMacn5DaT|4uTS>qAi3z!{M zFL@36ktC*ebV<`Af{IJ``CNO%XGTVD3ZR-&{I^wl3WNKF{2Xr#XFsz&GD`t2UDZY{ zuZ6}Ys6Hlo>{(B^8gA*gDSZIqx#i{d)I!T}!Yn*iWSuUnfjqH%EO*%$h2oP5zz^4o z1ZR8<0zwOwcCM}+KrT`2Tv!qr6RaJmwP5^eV=VKVNaEvH<$NVth3sbm&bGZ5Q5h~9 ze&XI9FQ0XvURo@0-uY;3rfeGh=>MGzlk4|88Rl8J+c8M7j+tC6!i~)XeTcG6e82Rn zJU|7eKM^uD3cgGw%eh?j!tQ0LazqD^LH;c&dC=_OglJQ?(PpKqje5$MW3OnS#o$KN zTz;hl#CZU4?Kkcum>X34|HKBv7Uu?s!YsV2@qsj_n;n=lr@#F}PCkmJ+QVBd_)j#v z*k(N_PZUZplQ&?pagRXwPse{S4Z&B#ZhokzyNna_m0p2V_oqgVn5(s^TY4L@KWDtQ zwFe}wyvb*tA8!I~sD7G{NlV)b$;o%!1SxiR5(F85ypnN#N}1>u5lVFe)2VIZvB#&X zLJ0!3bo$zP{kA;DHfEE(OKt5Wok}qx#RQklkBoX+xiy?mi1=fIfz*ShD&{@8jbA@q zB2_pkMm|UhfwGbqei+^3^5#3VWg?F>WtQfpVq*P#Melhl?$*7F&nyM&NRIUEeJC#8 zhS~UFL`~a+36#`D>4BW@!I+}okxk9>$Y!lCQ378s({N8$l1Jm^e6Av(QdsnDo`DBc zxov5B#1C_V;_`~%H7Ea(pRpX$}mnQ^8tCK zK5WLI^p2<#XeRkdMm}%G^fNE3ykblTM%&v!8dJdK8be*C=f$#?D9iX)CW#7F$>IPr zk{x)cLl)-*BxG)UEEF#QwMiw`ap|Rewo&o2yD3HZVdW}dBG{f4AEfvt^N|#CA$s~N zix(9=7A8(EWBPWnIctH}jP>eSg~Xwu;PD2t%0ROOQo51}I;LsK&rUD@iV&(QpG63< zl!N%BzO|8(PXkr%C~WDA;ea>fU&mj?VJ?GJ1)5MqA%tWquP#bUmoq4;lin)#`(ETH zdFz#A=-{o-{tTG}FWkv+S}M1^L8PRw*ak%y??+F2;*fkhT%N95HZGN(f~ZYQ--*%I zkEA5NC9i%wuga4NR`H#X%PFSnf&}m)&9b_kpf#FF)C6*B`i=9jzL;m*E=3RVW&`FB z*|9!eh7qW=Ad=Fv!$Ns|PU|j3v1WL&r-QS$xp8ayDnGV?TH&EU2TG0xD|x)EJ_+3S zI@A^lPEwhd$5MJUV9IN*GIPV}N0NwOGa7DU4ETAfM;BcYhQ$SHyQt#^K?N7C`4|; z9wsi3_rsHSqUQ_LZ!1 z`gKB$G`sizI(v>W-%torDd{X}=1B^WvV(UZ2}Ff+}gy}SWsz3vo-C}Jdl zLp_njkJJ(-GkkBYCV8(V5JPmUA4d0A^%y@=9ro&_-JL2irr=DJ{MTsB@f;e-3eG9P9nS-4zHc?z+SEUbuM-9g~ERD;rxB>6|$a0si z@I?C!EIyD*PPi4ucw%!c@JG)<651wg!w<$0qI1_upE?iPKjHC9*0^DY)<3wnDZhMe z^=j6j^IUB&=v}>=l+)%Q8)dHnZ9cZYviz}T;R9IpeS)~nmvP~$(m7R_`So`@Q4&-) zBx^vVt4tYmcTec+c^~hmti5fs9_{Z=_iinOLgX6``VY%sM{#v)wX`_QN1E3(0dg{G zj*R*0$Az1R-!2EW<~xA023>ZkGD2>13vPM7D+4=b9E}{)g1hFbmz1MCu_{M=S%vj* zppt(lS{_r=b~s#IWW4H!tdZ8N_9l>mtG*G5qYUtvFEow$u3}vdzb=JYPpF)$*CEE~ zO;h%(kU=h@MmXNp0+{%{f3#8~gTrEfQ(8F^&!`R5DE8UP5=ymmv%hayEN?J(QHz z({7cGwM_?!j;~i77fGAmIMoO(Up!ID=(vM{yWvidnze=Buw_06DM#Z6f{)Ede|N(9 zpRHU}rZ0&F?|%@aZ_+Eedb~-v6;cM$Zqpk&p?pGTW9bJjU;t zEM~ToqhMI$X~E;|Pluw+E_WK#1cFoU)-l?6&*Lc4l&97P@%ww-1(fPGbfn9yISAso zu#1}=9U|>bd=0irr4C)nTez2^LL0s>E*4ca+0UoUM(dG8j9yPCO+fCo9Q9Pvg58>d zGWBKa9&gsmH`495!ccE8`9IYVE-Bm7iKopGa3xh(A+E}M`@pmHkZGE8={JE=OVG+twtwg%5v?2%RBN0K3FUQBv1kEtRO|Fh8dgy+k z7O(5V;sSd< zaWaV7+3K4@Mdk@F(=2`%zqJ~dT8Mqt}uRI?fvxO>fTdINeX~S_TrlYmYUqaJ9Pks>!xEvVT+Ww4c5sdr|`WSlwpoiY(DfXSzD)Vx32PZ*@`S z#TMEwMh{_LyR3T-xCkrngY^2ATaVP%sz?_(15Zf7wv|E@mG z5_qj`k~?SeC^7y@mMVYV5cm;WJ!(1CdAlFR6^@*GETZqdQjOEUMy*ROn_3T2@OrkT z0Sb^a%Gx?LPvL0g$F#-mOmR!-h-~^?ZfHl9dVBA$PcdthXwkEJ&m?K_xGD-WKsG|gQ;xgOHs zBgp;Hw44(qvOBj=uiTAJlrU5D0`Knef)CrvH|&2!3mtukn1N*I35j7{JdIvJw7|XZ z8kX9a9A-9yD40?lZB0fAq$s-8rAXO9{&JwKT^$|uKz8Yj;~hBWRsf{PDC2_fA<)p* zBB+KzoiAGVcaI~8B+$%+h;sZEp%afUu=K&<;3Y`9z8%*6`X#0VZ2*Y-FyBxnv#lXO zI^drF-YoV6r~Pwe(7)YJMb_tFIgxj+8o8)lj5L_`kk^>0-h?tmin71$n>w|+ zy%s*?05vx#@Q2s~+XS0;4%|?sTkLL15Eh@3AA4=s0O+z7kRCn!OUfUECLS1gBooz+>Jfw2) zD1Dk>JHd`Z<$8KG)L;Niz3D2B8b!?2izwn}p;7DfOJ4hp)Ce>4DV@+w;E_$w94;NJ z=CT>8jCK2jI<;Jtm}`V#8C0F~?4k5W$`gpxxys6nkm;$D))6RuxAMenT-e;0fnp?n z4^=Bk&h#DR_)=A|7-$|nV%vNMM-E3Kuv;hdQp)dis$EP)Ga7vCHm_o3_i1CQd$mq2 zyyi5at6P>Sn&tNz3S+qC_4O&0bum^uQ#yvLNTk^2!oXormPfzuzDX3Y*hl@%Dab#u#pxDwSG1<4M{prn?7-eaxWVo4LcgPA<`fzm7KDSkw3s zRlR4>4MNkT5f5DNM`$R58Q$U^HI33{<3yr5G1^mFoOWH$1Y5s*a`%<89hz=Wn=M}Q z@-)p?t^T5J51IHNxG>$3tUG3*_~W>jH|ET^idnIo?GdCX^BG29UB}U>)MJh(BQE3- z_*tqQpZaO&Mb;~L=Z|nckC?D_d#UU0!QPfujh6ksisGJa70&jGm<_Xt?K2nyX=OO)jz?`#pWk;0LiGv-w&G{k*s}9G0?ACM3K4J2IsBR+pa4J zHcN>`6Xn+3+%|uE9p%;A$S1Z^`^#|QktMVzwrgR)R&ta&CPf)>7l-;-w>+U%;ZqT$ z;idg$w(DqV`1_VbZFU1f2S3Y#ts+g1Kq}Wak3pS?JGX=rB86FK7kuko4FXrE!6(Q9 zAXjIjFZj9ujbJUV931V;84n6f+|o_*aodcM6~r>X`bKya?=O2uGWe`_=NEZPW4tHD zlJfp4gtKB>?yh%E4!RVRhi^!2z>u@Y(JIms+XGJk82iLf>wblwe+>)5+@(0QR8DF63jK!bc4%S8>DPu_Mv)Fkw=@y% z32p#KX@2N?Zju=scPCWX!!Ztf{k9<)xKk?Ul!8M!7b zV6nroIsX{!5BOBN_aRhhru7pM_Hfzu;NZwuq|61Gk$3w0(COZotNBT zWpn4Grwa%)ynkFVeqz(RdTbMKDjX}$8w^Y{_A!I;YTucwI9Q;(nP?$(Cg13@jq zHUbS4BZP5DNJ>5aWfP>};RiMGDqhloUvG$Mu518W^TiCg9(hP26@l&6gF^V5fM@c$ z57>xpAKy7D;6AOXQB`fJq}2(%k|j_a^)6v^@K<~mebWPv@CklP1Gj!@DCCKtz{A!! z8*>*@cFo(?ZStu0L0O->YOmnzcMZXaFWMO2pLhJNv^>|XLx9r=jCZ}d>&3e~_@i$~& z)OE{vvwU>(@h|G_Y1=m^&L;(61D8}{*Xv^k1uu-g)lbw$%`>~=mL>G!{aFxm1ci^@A}qvP{V=DEPm)#q0NUax;?4S zKl_b3mi$yas{rd3J!zESWB<#D=^n`1!b*Ow?pU^LL_^yHHGO%GxFf=PeHU?fE5M^; z^RjW7zW~-16<_qWmEM*Oi>xK*PLBqq%Ly7dPVd*DB9HAi6(`y)TTn7?yG6@ zLrxD4Bs!Fq$z;<6xKt@h>L>JIX;gxGhZe;>_>Bl-Ppfw6o$l;B*jAHpKUn~~dQmK( z@6I}b2_(XHT3*=qM%APZ;KdyTre>Nfz{2tshK%8-F3 z`OsrtJUzkSPBl{<`=I#NE5Gt+!IWa2ha6{R1()VJpmHw@KPsa+bJ}V+=>n2@W}NM( zp-Ydc5oxZ|6t$!|CFz!VNr8lcaDaYxe0#UJIABY2D*=#rS z{V0Q*F6N}y!m?7ln+>=CCqbmH(`p>GTq&dhY{fXpGx!wX>cT{SyU};7@84~DY?eo= z4tZ1q*DwjgZa>G?0{}KWJz}Eh?XwA(MVCp&BsNBDYLVEJqb~U9JbTSSD7_xGWqGvB zb^}`F2#+d@lsKJ<^bxFZa;7QYbMzt?Mp9X83;1zYY z-A&pH+4Y#~%fdV|Hy)gNcGfTLopAr~7S|}%P6{kyxt5g3pMOE6{EHGKemK9Q9affH zz6^h1^cg*oc+tecgqBoZlPjca4x@&X$U$*Ge^FxW46s_eQvLX_w8g)IpI(5fp_2!TidJR^^ zeOL<{eH6?I?0;dDO9#f(e*G>L*lic3U0r}6p&38B#gDnK_YIU-)@o%C_lokZCAsax zWoe-G3%xyNB_CwD!SxG*HNPThn|U6vka(9^coW-{G*!L*RkxfuL)Tw+6ml{E$np8JY^GKHUw&x7LykzQ_J&d zHTpf+iIc2W(fm*gt2Ipute&U8@8ba#z9Z)W$5WeXc$UEYbU$baOHuSz6w#^&?Nm@K zTNa*adNqWre&3pm&)pWvhMI40%3f|dK0rnj%ao>L)CVk8O-6l~a^yGrji;(thjVqD zXpi&O)8{irvW`aBisoZauoR;!ivJlc5hgAup(wCq* z0Qxc~!v>f&?+@;KA0gK?`ZuM0@%qMoKYWU%4YW2>zB@NcKumr7) zS$~2ZT%PdOEvlbfjA(MiS**qusa6T(HK`nVe;c+ZdU~A>F6P<(QMZ#7q$fv_fWB^l zhS?To4>(5Idg0b?@C15K?;rX=4M@fc4~M(s*5y=~Pz1BJvtGP!fu{kN8?qQ|m0qpaT&%kXFa85j1s8zqs zj&YnSsoYak^vOF>BVaesX4gBdH0ZNA#3%y!#xI{1$QV8*XHYq76#bFh^IWNazQV)H zdeSYIeARcAY;2N2J?gI5tlwUL1kk_hRvUyqK#t0Lmi%gazJ#-#{~8tN>swI^kPQXz zcNXED2dF&3=JKc1EP+YQ-h*sA`$PSY>u{6wUa*1f?%6hZ2av-^dpYvxEr)Jh!LMlm z1Xl-gJh@t(y>qgX)i>Vttqa@F)+(3Mp=fK6;(bDM4c9ldp$;I?gMGCmWt!iT)x&f9N(IW@PA5xlaA$dhe4YmMo2iS^Xu)#SlCWKfJ@bZ@(PE4(%m>+&)q zYcG;@d;1|WOj{oN>SG9@6h(!GD&UW9^x@ARt|{bEE5D%bxG6tc zXO$Q7wMC`qmjJp;P&QfPFcLJuURX!z{smgtb{nn>KZ^)f-jM6B^3Dnfz!S#@cIuhq0;wg_KS(Or_OXP9b2=FIyQ1BBG%`^`0bocgm$2yh$#!m~JvP;^N z*)`J~4^hS`)&khKL#Hie&_%$jQVZ*$e+%Z~uHQbT=6ma8t%HDW(W5$`OX&tb7yq?| zb>=C4JNS*&HKhBC;~T>SJ+BQ%E<2iZ+tQZp55@zvLdu$V$^~niKWghlzBB-cSHQhp zB&*RX4AxbJLGO3iQt!a2MGUt-?w1TjvhrBZ(CxJT=#dlPeOe%ekRz7L9iSq9wqO=l zb~COF9gF*s(GRv^7mb6JR%iIBlu$THT)dQW)=?emuzB859ijwyp;qH30|?a{B`y6_ z-tD$+DsP;5@S1?wRdZ^Q>L+&GV>2D7gXyHxP;U(TCH|UR!%kP2qulzJmK2(X``!Em z{DxoO>zbC(w|@1#92VK6Mar&Mcjg2)G7zmYCn)ieEleIsbH#F&*6l)G_-5DZKmk1& zn?_Af8Sl>Ltda0d;MNSbLgm3@+uSD;-PxO$fs*XBh1r8wQDb63B<>r*@~Q_FV9bf{ z(Q$9>bI901kf0TEok4vS#@SxK)l47Sa^pm5YNkE>Hs4%gmqApui!hOH7ROvyBlQK)zdQ@Qj}pmI-_^I;=8lR%fEqE zxB*a0(h>h|QZq}l*O1?${xr+zM#X_J?-#Qk@VhrDqPnaUOkWJ!KJD}ub|g48`l$pq z#!&}!_h%MLs$-MU8Eg-n*OSy%1rye_NFi^kp0G$7lApEmzTl924s_8}qygRXK&R|X zRlHFABpTw>TPbQLjGqB--?6yM@=pU4Jvp{hCtfPe-2Q9aiVPS_DR<~wT& zVo+%MuqLf?yL)*cr^4{nXsKT1L_D_v*kcV)QA6Q#?uj)7kI>1om# z{VnGEt9Rn>JP*gs=8njfx)0aD;~r}z6^6Z@)0j;lSTSP@SIEjg3vJre&E&bgTOCH% znsqEt2gq%;FjE;&zoT2T0YZ{dW!@NCUTegDeebxBj@IMleb{xtgBSMA|Ek%Rkq7sh z4V#xM!d1Cs;#OJXu3Ty8=qM3l^={SM;uXvbib{|Db&*jfy-Ub*ZUjdrHbgGmmTC-ppHv2kSicX9Z#LlM9K!}j25B~^gc%t_UPMY6jc-= z=3C{IwEhDB()rl8oBV}Qfi($D*(3D@&M8V-dkEgaB&Qle3@OHEm%28Zo=op#unGocAViMT!J>XD2hw-Q8Gh;m3bDbwA$;!3 zX(J|(0-fIctsm-zU+;Q)@f>1)isM&i0NFLVZUfBaKu;OJLnjqAHS(oYOcS+)kM8Dj z^@b)4t$4bQrq#FnBKt22FPVvVX-?viK+u-xXFRdB3MRrI9)>mw#~W1@iGw?y2N6+C z+WeIjTG#v;RN5}VJl;sB?sYJmGHwTv8AOy{KI953r*4g>O03zAbTeKw-4KX&Adsq_ zc$2b|8A%yn(H=W-aPw(_%fcbgCA?K2+z9{nMgDvd=5hekve7O5c2yk{DI`}ZQd&VI zzMpKK$ev@X%nx)rc zp?l@od&v$eH=jPlQ5Q0yO|QR{y{L<1>!dGHXnts*_N1Brcd{>mmdF{mhKPYzW%Je7HTANJ)~LZ zfD6vFufurh%(-1jpGxb9<%1Q=Hg3^+w#vFL-?qK0rZzJ7Sm+WSyTPwB7i^8JX6r^& z8OK^z_$JIV{Pq{KYwOxa@<-hsKd+3k`{F-L4__h1-74ci%NL=?CsP2^VgWCUNDP5~ zK?*66K9D^Fe7vmWhYL@Bt4!u9@GAsMap5mTrr`KlYl{?GnP6>QGmt23t2{FW!YoUn zrEMsv@Bh4!o{O^%;r^XLCbaT8t#`+MWO|Fo^IGgwwk3*-EDf5%v^44`w}ywpvQE zWk<6Hs^!Zj!QGg!@ZAzTfkSu4>4)B-9fyus({WntFFC-@ zPzQdZYQ%5;|GXA}lu8B?4-XHwc8J#)c+Iz*$N-8fAe=&F;Kf@CJv2LWXj<*QrUI60%{H+foB!^f!kE!4x6aN&0;E?*@HXO>TBpOp?X zS?y7q1G0D`f##i!E}z8y1txzFdcM+F=+}ZMeHtKzglq3rP5<^tnLcINw2M=UxK)bl z)Ezwwbj`brIK+58zx*upgrszMhF0+6B?>Me*~Ylq*}GV7u7 zh(sraYt&H9ltb;pG|tqWj>O}2=C~(bb1agX-vLEo_qurf+{J7z0bB0j-IfA@)bl4O3VnDM?(g0$1>a0RUh0!}N?`Ve+( zVWrhjp=dS&l`l)ITI2L`Z0^TmGPPhf?kVWiaDZC9K*+(OGbjw<0nbw#Q?Yi{8#d#y4JP0GN8{&tnONw^FUxF#J~lth9SY>bQuAdr zeO3*!OvNK`k_6~UQdf}o{I`viD2mzvYsG2@qsn zdDF~4k|KykCXVE)H1egV=E7-$sHZH4$A0|BKJT$LlCY;HHy*6;byx2l5Bc1#G-#~X z4K~xoBTx?kR5^~L>fQONPy$fZqABa{|3$z5rIY_n;|EP&zf37d*j(<2!#*|L5BRMq z?=md3=3E+uJoeMHWGcBaDjHnw;`$!u4lDHYguq7r--g;B(Di|tZ!*@zc-b>5s&C38 zVUK6R3UGIEhY5p4SVuULr{8)Dz+a)J=ZuR4Gw1+#5OCHG7Ou7F{pfZaLv9SONOZt{ z$gyO{tru}wS2j=EmIdr|gHwO40&Y9Mt3C*uxXe|iylxdH1Kh##fU7Y^jc(R$;p37? zJ0BGU56-ADbf3WK4j|2umGN(XXGIXiY5~&R`n4Xg&HrHT%=?!xu0jvcN{EL0-nNBG ze~TCA!I9q*iRY9Nulf2#eCs$L9x#I2fPz=~cKioCCq3^yac0L{mfr~gtebIpRO{dpuCWaw$uCf%PG|9JIja3V znWsk8*7qcED1O;w9+A2UaY@<*UryjKsBTO6df|Kpa%2GKW8)qv{TWKqkS`Bc%kJMf z7+DtIKX}DwShS4rG+MVp5t;I?h7=zPntLwK+Nd^LAfX4i8bNxS1>+e1MH;w_HNCw{o zBHAiF?;f3x!Uh0>Tw#&zpGnEzD^>&u%)c?m@i)^n0HVZyC;2BU0Rr%6AnfXJ zoBwN;(0^Llf4p%1>7FF<&kU^X+1tP|dB&oj&1VMI+Qz#-Lz2IzStSClitsPW=K^Rh z1yF_XPX6Eg`?JCRFX(&{36Q!&Tb}P9k)=QsAZ@n}AJe(Rq9z*fUr_p?wEmgI0mA>F z?Bd_@mIM%`H^AZcKNGl{XP|rmlyENk9Y6}*YT}xO#-CB+oV0O_fUR|YD7ViB z{dSM~(mz>?Bpl!mXk#!%=$y-{0FmNDq3QojYA4PN{$Dyf5hf) zz!-xRCv^NeAH@Mc2=;t959L2$kgo-hO#`W+5H$GxEyGGcg9K9gBK{F=@m_NRJFt+V zJEt}L9zbi(ht}!;Xp{xuECxju87rJ~NE@Ja+(HHQt$)O!IDoI9E~ylja}J$F&qrui z|IJnWKk)49A~3ggY3j*2Z6Rk=s%I87`bV^VbjFdKHlAC*zm?et(6-ytJN!Jb|DQ1F zzkxK<1OOK2^#gv9^HI()4neA>`HyIe_xjAxkpdom{+<;Mc>h67mbQ!kXcQg5r(@Am z=1X?YXNogEGZLF7{-aUoQ~|+###Qw4{Jxt@3Xmxfa^?#C?`{8m0{=fhd8`bK;;vMB z@BBXk7-AFtzhC-aGklE)xQcK%Og|3?s3!tA8OWJ9bCcnxv9ErUhfJA%Q?^;u=0J%~ zZ9(A*4G^BPv6ry`P`Ide*sX=kFrMva7urc1Of!c%hBI>?S8#i)L*;wClf_- ze=+>_J(15`0Mq1xVNfSzrnWT?&(PmUo}Y5l2E>CIP8=*4Iw5 z7Ij~XtfZbl5FA~M(?vfSvk|`J#K{%Ag)LuR(AIF4Q7>{rv*S?1DPn@ z-KxAiOQ#jp)8G>X@sQ(R8z`IRGVmN?|(i2TU)p@Xh{KjQLjW`V1q≥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�ywm(Wm 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¥CE@18Cj&?x6(Bg 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 z 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%0DNsdhK4TuUzlMw1fRl9Vcx62VvoJ9e)oCoX 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⋙6ZDstL#;dD*8}A)17VR$F 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 None: + self.glob["__firegex_pyfilter_result"] = { + "action": self.action.value, + "matched_by": self.matched_by, + "mangled_packet": self.mangled_packet + } + + def reset_result(self) -> None: + self.glob["__firegex_pyfilter_result"] = None + +def context_call(func, *args, **kargs): + internal_data.filter_glob["__firegex_tmp_args"] = args + internal_data.filter_glob["__firegex_tmp_kargs"] = kargs + internal_data.filter_glob["__firege_tmp_call"] = func + res = eval("__firege_tmp_call(*__firegex_tmp_args, **__firegex_tmp_kargs)", internal_data.filter_glob, internal_data.filter_glob) + del internal_data.filter_glob["__firegex_tmp_args"] + del internal_data.filter_glob["__firegex_tmp_kargs"] + del internal_data.filter_glob["__firege_tmp_call"] + return res + +def generate_filter_structure(filters: list[str], proto:str, glob:dict) -> list[FilterHandler]: if proto not in type_annotations_associations.keys(): raise Exception("Invalid protocol") - res = [] - valid_annotation_type = type_annotations_associations[proto] def add_func_to_list(func): if not callable(func): raise Exception(f"{func} is not a function") sig = signature(func) - params_function = [] + params_function = {} for k, v in sig.parameters.items(): if v.annotation in valid_annotation_type.keys(): - params_function.append((v.annotation, valid_annotation_type[v.annotation])) + params_function[v.annotation] = valid_annotation_type[v.annotation] else: raise Exception(f"Invalid type annotation {v.annotation} for function {func.__name__}") - res.append((func, params_function)) + + res.append( + FilterHandler( + func=func, + name=func.__name__, + params=params_function, + proto=proto + ) + ) for filter in filters: if not isinstance(filter, str): raise Exception("Invalid filter list: must be a list of strings") if filter in glob.keys(): add_func_to_list(glob[filter]) - elif filter in local.keys(): - add_func_to_list(local[filter]) else: raise Exception(f"Filter {filter} not found") - return res -def get_filters_info(code:str, proto:str): +def get_filters_info(code:str, proto:str) -> list[FilterHandler]: glob = {} - local = {} - exec(code, glob, local) - exec("import firegex.nfproxy", glob, local) - filters = eval("firegex.nfproxy.get_pyfilters()", glob, local) - return _generate_filter_structure(filters, proto, glob, local) + exec(code, glob, glob) + exec("import firegex.nfproxy", glob, glob) + filters = eval("firegex.nfproxy.get_pyfilters()", glob, glob) + try: + return generate_filter_structure(filters, proto, glob) + finally: + exec("firegex.nfproxy.clear_pyfilter_registry()", glob, glob) + -def get_filter_names(code:str, proto:str): - return [ele[0].__name__ for ele in get_filters_info(code, proto)] +def get_filter_names(code:str, proto:str) -> list[str]: + return [ele.name for ele in get_filters_info(code, proto)] -def compile(): - glob = globals() - local = locals() - filters = glob["__firegex_pyfilter_enabled"] - proto = glob["__firegex_proto"] - glob["__firegex_func_list"] = _generate_filter_structure(filters, proto, glob, local) - glob["__firegex_stream"] = [] - glob["__firegex_stream_size"] = 0 +def handle_packet() -> None: + cache_call = {} # Cache of the data handler calls - if "FGEX_STREAM_MAX_SIZE" in local and int(local["FGEX_STREAM_MAX_SIZE"]) > 0: - glob["__firegex_stream_max_size"] = int(local["FGEX_STREAM_MAX_SIZE"]) - elif "FGEX_STREAM_MAX_SIZE" in glob and int(glob["FGEX_STREAM_MAX_SIZE"]) > 0: - glob["__firegex_stream_max_size"] = int(glob["FGEX_STREAM_MAX_SIZE"]) - else: - glob["__firegex_stream_max_size"] = 1*8e20 # 1MB default value + pkt_info = RawPacket.fetch_from_global(internal_data.filter_glob) + cache_call[RawPacket] = pkt_info - if "FGEX_FULL_STREAM_ACTION" in local and local["FGEX_FULL_STREAM_ACTION"] in FULL_STREAM_ACTIONS: - glob["__firegex_full_stream_action"] = local["FGEX_FULL_STREAM_ACTION"] - else: - glob["__firegex_full_stream_action"] = "flush" + final_result = Action.ACCEPT + data_size = len(pkt_info.data) + + result = PacketHandlerResult(internal_data.filter_glob) + + if internal_data.stream_size+data_size > internal_data.stream_max_size: + match internal_data.full_stream_action: + case FullStreamAction.FLUSH: + internal_data.stream = [] + internal_data.stream_size = 0 + case FullStreamAction.ACCEPT: + result.action = Action.ACCEPT + return result.set_result() + case FullStreamAction.REJECT: + result.action = Action.REJECT + result.matched_by = "@MAX_STREAM_SIZE_REACHED" + return result.set_result() + case FullStreamAction.REJECT: + result.action = Action.DROP + result.matched_by = "@MAX_STREAM_SIZE_REACHED" + return result.set_result() + + internal_data.stream.append(pkt_info) + internal_data.stream_size += data_size - glob["__firegex_pyfilter_result"] = None - -def handle_packet(): - glob = globals() - func_list = glob["__firegex_func_list"] - final_result = ACCEPT - cache_call = {} - cache_call[RawPacket] = RawPacket.fetch_from_global() - data_size = len(cache_call[RawPacket].data) - if glob["__firegex_stream_size"]+data_size > glob["__firegex_stream_max_size"]: - match glob["__firegex_full_stream_action"]: - case "flush": - glob["__firegex_stream"] = [] - glob["__firegex_stream_size"] = 0 - case "accept": - glob["__firegex_pyfilter_result"] = { - "action": ACCEPT, - "matched_by": None, - "mangled_packet": None - } - return - case "reject": - glob["__firegex_pyfilter_result"] = { - "action": REJECT, - "matched_by": "@MAX_STREAM_SIZE_REACHED", - "mangled_packet": None - } - return - case "drop": - glob["__firegex_pyfilter_result"] = { - "action": DROP, - "matched_by": "@MAX_STREAM_SIZE_REACHED", - "mangled_packet": None - } - return - glob["__firegex_stream"].append(cache_call[RawPacket]) - glob["__firegex_stream_size"] += data_size func_name = None mangled_packet = None - for filter in func_list: + for filter in internal_data.filter_call_info: final_params = [] - for ele in filter[1]: - if ele[0] not in cache_call.keys(): + for data_type, data_func in filter.params.items(): + if data_type not in cache_call.keys(): try: - cache_call[ele[0]] = ele[1]() + cache_call[data_type] = data_func(internal_data.filter_glob) except NotReadyToRun: - cache_call[ele[0]] = None - if cache_call[ele[0]] is None: + cache_call[data_type] = None + if cache_call[data_type] is None: continue # Parsing raised NotReadyToRun, skip filter - final_params.append(cache_call[ele[0]]) - res = filter[0](*final_params) + final_params.append(cache_call[data_type]) + + res = context_call(filter.func, *final_params) + if res is None: continue #ACCEPTED - if res == MANGLE: - if RawPacket not in cache_call.keys(): - continue #Packet not modified - pkt:RawPacket = cache_call[RawPacket] - mangled_packet = pkt.raw_packet - break - elif res != ACCEPT: + if not isinstance(res, Action): + raise Exception(f"Invalid return type {type(res)} for function {filter.name}") + if res == Action.MANGLE: + mangled_packet = pkt_info.raw_packet + if res != Action.ACCEPT: + func_name = filter.name final_result = res - func_name = filter[0].__name__ break - glob["__firegex_pyfilter_result"] = { - "action": final_result, - "matched_by": func_name, - "mangled_packet": mangled_packet - } + + result.action = final_result + result.matched_by = func_name + result.mangled_packet = mangled_packet + + return result.set_result() + +def compile(glob:dict) -> None: + internal_data.filter_glob = glob + + filters = glob["__firegex_pyfilter_enabled"] + proto = glob["__firegex_proto"] + + internal_data.filter_call_info = generate_filter_structure(filters, proto, glob) + + if "FGEX_STREAM_MAX_SIZE" in glob and int(glob["FGEX_STREAM_MAX_SIZE"]) > 0: + internal_data.stream_max_size = int(glob["FGEX_STREAM_MAX_SIZE"]) + else: + internal_data.stream_max_size = 1*8e20 # 1MB default value + + if "FGEX_FULL_STREAM_ACTION" in glob and isinstance(glob["FGEX_FULL_STREAM_ACTION"], FullStreamAction): + internal_data.full_stream_action = glob["FGEX_FULL_STREAM_ACTION"] + else: + internal_data.full_stream_action = FullStreamAction.FLUSH + + PacketHandlerResult(glob).reset_result() diff --git a/fgex-lib/firegex/nfproxy/params.py b/fgex-lib/firegex/nfproxy/params.py index e2969b5..025ff3e 100644 --- a/fgex-lib/firegex/nfproxy/params.py +++ b/fgex-lib/firegex/nfproxy/params.py @@ -9,12 +9,15 @@ class RawPacket: is_input: bool, is_ipv6: bool, is_tcp: bool, + l4_size: int, ): self.__data = bytes(data) self.__raw_packet = bytes(raw_packet) self.__is_input = bool(is_input) self.__is_ipv6 = bool(is_ipv6) self.__is_tcp = bool(is_tcp) + self.__l4_size = int(l4_size) + self.__raw_packet_header_size = len(self.__raw_packet)-self.__l4_size @property def is_input(self) -> bool: @@ -33,19 +36,25 @@ class RawPacket: return self.__data @property - def proto_header(self) -> bytes: - return self.__raw_packet[:self.proto_header_len] + def l4_size(self) -> int: + return self.__l4_size @property - def proto_header_len(self) -> int: - return len(self.__raw_packet) - len(self.__data) + def raw_packet_header_len(self) -> int: + return self.__raw_packet_header_size - @data.setter - def data(self, v:bytes): + @property + def l4_data(self) -> bytes: + return self.__raw_packet[self.raw_packet_header_len:] + + @l4_data.setter + def l4_data(self, v:bytes): if not isinstance(v, bytes): raise Exception("Invalid data type, data MUST be of type bytes") - self.__raw_packet = self.proto_header + v - self.__data = v + #if len(v) != self.__l4_size: + # raise Exception("Invalid data size, must be equal to the original packet header size (due to a technical limitation)") + self.__raw_packet = self.__raw_packet[:self.raw_packet_header_len]+v + self.__l4_size = len(v) @property def raw_packet(self) -> bytes: @@ -55,17 +64,16 @@ class RawPacket: def raw_packet(self, v:bytes): if not isinstance(v, bytes): raise Exception("Invalid data type, data MUST be of type bytes") - if len(v) < self.proto_header_len: - raise Exception("Invalid packet length") - header_len = self.proto_header_len - self.__data = v[header_len:] + #if len(v) != len(self.__raw_packet): + # raise Exception("Invalid data size, must be equal to the original packet size (due to a technical limitation)") + if len(v) < self.raw_packet_header_len: + raise Exception("Invalid data size, must be greater than the original packet header size") self.__raw_packet = v + self.__l4_size = len(v)-self.raw_packet_header_len - @staticmethod - def fetch_from_global(): - glob = globals() + @classmethod + def fetch_from_global(cls, glob): if "__firegex_packet_info" not in glob.keys(): raise Exception("Packet info not found") - return RawPacket(**glob["__firegex_packet_info"]) - + return cls(**glob["__firegex_packet_info"]) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index c13dd32..a988fdc 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -15,8 +15,21 @@ import { useQueryClient } from '@tanstack/react-query'; import NFProxy from './pages/NFProxy'; import ServiceDetailsNFProxy from './pages/NFProxy/ServiceDetails'; - -const socket = IS_DEV?io("ws://"+DEV_IP_BACKEND, {transports: ["websocket"], path:"/sock/socket.io" }):io({transports: ["websocket"], path:"/sock/socket.io"}); +export const socket = import.meta.env.DEV? + io("ws://"+DEV_IP_BACKEND, { + path:"/sock/socket.io", + transports: ['websocket'], + auth: { + token: localStorage.getItem("access_token") + } + }): + io({ + path:"/sock/socket.io", + transports: ['websocket'], + auth: { + token: localStorage.getItem("access_token") + } + }) function App() { @@ -25,33 +38,20 @@ function App() { const [reqError, setReqError] = useState() const [error, setError] = useState() const [loadinBtn, setLoadingBtn] = useState(false); - const queryClient = useQueryClient() + const getStatus = () =>{ - getstatus().then( res =>{ - setSystemStatus(res) - setReqError(undefined) - setLoading(false) - }).catch(err=>{ - setReqError(err.toString()) - setLoading(false) - setTimeout(getStatus, 500) - }) + getstatus().then( res =>{ + setSystemStatus(res) + setReqError(undefined) + }).catch(err=>{ + setReqError(err.toString()) + setTimeout(getStatus, 500) + }).finally( ()=>setLoading(false) ) } useEffect(()=>{ getStatus() - socket.on("update", (data) => { - queryClient.invalidateQueries({ queryKey: data }) - }) - socket.on("connect_error", (err) => { - errorNotify("Socket.Io connection failed! ",`Error message: [${err.message}]`) - getStatus() - }); - return () => { - socket.off("update") - socket.off("connect_error") - } },[]) const form = useForm({ @@ -145,19 +145,7 @@ function App() { :null} }else if (systemStatus.status === "run" && systemStatus.loggined){ - return - }> - } > - } /> - - } > - } /> - - } /> - } /> - } /> - - + return }else{ return Error launching Firegex! 🔥 @@ -167,4 +155,41 @@ function App() { } } +const PageRouting = ({ getStatus }:{ getStatus:()=>void }) => { + + const queryClient = useQueryClient() + + + useEffect(()=>{ + getStatus() + socket.on("update", (data) => { + queryClient.invalidateQueries({ queryKey: data }) + }) + socket.on("connect_error", (err) => { + errorNotify("Socket.Io connection failed! ",`Error message: [${err.message}]`) + getStatus() + }); + return () => { + socket.off("update") + socket.off("connect_error") + } +},[]) + + return + }> + } > + } /> + + } > + } /> + + } /> + } /> + } /> + + +} + + + export default App; diff --git a/frontend/src/components/NFProxy/AddEditService.tsx b/frontend/src/components/NFProxy/AddEditService.tsx index d9287e2..daa5585 100644 --- a/frontend/src/components/NFProxy/AddEditService.tsx +++ b/frontend/src/components/NFProxy/AddEditService.tsx @@ -26,7 +26,7 @@ function AddEditService({ opened, onClose, edit }:{ opened:boolean, onClose:()=> validate:{ name: (value) => edit? null : value !== "" ? null : "Service name is required", port: (value) => (value>0 && value<65536) ? null : "Invalid port", - proto: (value) => ["tcp","udp"].includes(value) ? null : "Invalid protocol", + proto: (value) => ["tcp","http"].includes(value) ? null : "Invalid protocol", ip_int: (value) => (value.match(regex_ipv6) || value.match(regex_ipv4)) ? null : "Invalid IP address", } }) @@ -50,7 +50,7 @@ function AddEditService({ opened, onClose, edit }:{ opened:boolean, onClose:()=> const submitRequest = ({ name, port, autostart, proto, ip_int, fail_open }:ServiceAddForm) =>{ setSubmitLoading(true) if (edit){ - nfproxy.settings(edit.service_id, { port, proto, ip_int, fail_open }).then( res => { + nfproxy.settings(edit.service_id, { port, ip_int, fail_open }).then( res => { if (!res){ setSubmitLoading(false) close(); @@ -111,13 +111,13 @@ function AddEditService({ opened, onClose, edit }:{ opened:boolean, onClose:()=> /> - + />} diff --git a/frontend/src/components/NFProxy/UploadFilterModal.tsx b/frontend/src/components/NFProxy/UploadFilterModal.tsx new file mode 100644 index 0000000..1208393 --- /dev/null +++ b/frontend/src/components/NFProxy/UploadFilterModal.tsx @@ -0,0 +1,54 @@ +import { Button, FileButton, Group, Modal, Notification, Space } from "@mantine/core"; +import { nfproxy, Service } from "./utils"; +import { useEffect, useState } from "react"; +import { ImCross } from "react-icons/im"; +import { okNotify } from "../../js/utils"; + +export const UploadFilterModal = ({ opened, onClose, service }: { opened: boolean, onClose: () => void, service?: Service }) => { + const close = () =>{ + onClose() + setError(null) + } + + const [submitLoading, setSubmitLoading] = useState(false) + const [error, setError] = useState(null) + const [file, setFile] = useState(null); + + useEffect(() => { + if (opened && file){ + file.bytes().then( code => { + console.log(code.toString()) + setSubmitLoading(true) + nfproxy.setpyfilterscode(service?.service_id??"",code.toString()).then( res => { + if (!res){ + setSubmitLoading(false) + close(); + okNotify(`Service ${name} code updated`, `Successfully updated code for service ${name}`) + } + }).catch( err => { + setSubmitLoading(false) + setError("Error: "+err) + }) + }) + } + }, [opened, file]) + + return + + + + {(props) => } + + + + {error?<> + + } color="red" onClose={()=>{setError(null)}}> + Error: {error} + + :null} + + + + +} \ No newline at end of file diff --git a/frontend/src/components/NFProxy/utils.ts b/frontend/src/components/NFProxy/utils.ts index 492f560..f5287ca 100644 --- a/frontend/src/components/NFProxy/utils.ts +++ b/frontend/src/components/NFProxy/utils.ts @@ -25,7 +25,6 @@ export type ServiceAddForm = { export type ServiceSettings = { port?:number, - proto?:string, ip_int?:string, fail_open?: boolean, } @@ -55,12 +54,12 @@ export const nfproxy = { serviceinfo: async (service_id:string) => { return await getapi(`nfproxy/services/${service_id}`) as Service; }, - pyfilterenable: async (regex_id:number) => { - const { status } = await postapi(`nfproxy/pyfilters/${regex_id}/enable`) as ServerResponse; + pyfilterenable: async (filter_name:string) => { + const { status } = await postapi(`nfproxy/pyfilters/${filter_name}/enable`) as ServerResponse; return status === "ok"?undefined:status }, - pyfilterdisable: async (regex_id:number) => { - const { status } = await postapi(`nfproxy/pyfilters/${regex_id}/disable`) as ServerResponse; + pyfilterdisable: async (filter_name:string) => { + const { status } = await postapi(`nfproxy/pyfilters/${filter_name}/disable`) as ServerResponse; return status === "ok"?undefined:status }, servicestart: async (service_id:string) => { diff --git a/frontend/src/components/PyFilterView/index.tsx b/frontend/src/components/PyFilterView/index.tsx index 9a16108..3602029 100644 --- a/frontend/src/components/PyFilterView/index.tsx +++ b/frontend/src/components/PyFilterView/index.tsx @@ -1,7 +1,7 @@ import { Text, Badge, Space, ActionIcon, Tooltip, Box } from '@mantine/core'; import { useState } from 'react'; import { PyFilter } from '../../js/models'; -import { errorNotify, okNotify } from '../../js/utils'; +import { errorNotify, isMediumScreen, okNotify } from '../../js/utils'; import { FaPause, FaPlay } from 'react-icons/fa'; import { FaFilter } from "react-icons/fa"; import { nfproxy } from '../NFProxy/utils'; @@ -9,42 +9,39 @@ import { FaPencilAlt } from 'react-icons/fa'; export default function PyFilterView({ filterInfo }:{ filterInfo:PyFilter }) { - const [deleteTooltipOpened, setDeleteTooltipOpened] = useState(false); const [statusTooltipOpened, setStatusTooltipOpened] = useState(false); + const isMedium = isMediumScreen() const changeRegexStatus = () => { - (filterInfo.active?nfproxy.pyfilterdisable:nfproxy.pyfilterenable)(filterInfo.filter_id).then(res => { + (filterInfo.active?nfproxy.pyfilterdisable:nfproxy.pyfilterenable)(filterInfo.name).then(res => { if(!res){ - okNotify(`Filter ${filterInfo.name} ${filterInfo.active?"deactivated":"activated"} successfully!`,`Filter with id '${filterInfo.filter_id}' has been ${filterInfo.active?"deactivated":"activated"}!`) + okNotify(`Filter ${filterInfo.name} ${filterInfo.active?"deactivated":"activated"} successfully!`,`Filter '${filterInfo.name}' has been ${filterInfo.active?"deactivated":"activated"}!`) }else{ errorNotify(`Filter ${filterInfo.name} ${filterInfo.active?"deactivation":"activation"} failed!`,`Error: ${res}`) } }).catch( err => errorNotify(`Filter ${filterInfo.name} ${filterInfo.active?"deactivation":"activation"} failed!`,`Error: ${err}`)) } - return - - - - {filterInfo.name} - - - - setStatusTooltipOpened(false)} onBlur={() => setStatusTooltipOpened(false)} - onMouseEnter={() => setStatusTooltipOpened(true)} onMouseLeave={() => setStatusTooltipOpened(false)} - >{filterInfo.active?:} - - - - {filterInfo.blocked_packets} - - {filterInfo.edited_packets} - - {filterInfo.active?"ACTIVE":"DISABLED"} - - - - + return + + + + {filterInfo.name} + + + {isMedium?<> + {filterInfo.blocked_packets} + + {filterInfo.edited_packets} + + :null} + + setStatusTooltipOpened(false)} onBlur={() => setStatusTooltipOpened(false)} + onMouseEnter={() => setStatusTooltipOpened(true)} onMouseLeave={() => setStatusTooltipOpened(false)} + >{filterInfo.active?:} + + + } diff --git a/frontend/src/index.css b/frontend/src/index.css index df910b8..192a8f7 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -96,6 +96,20 @@ body { opacity: 0.8; } +.firegex__regexview__pyfilter_text{ + padding: 6px; + padding-left: 15px; + padding-right: 15px; + background-color: var(--fourth_color); + border: 1px solid #444; + overflow-x: hidden; + border-radius: 8px; +} + +.firegex__regexview__pyfilter_text:hover{ + overflow-x: auto; +} + .firegex__porthijack__servicerow__row{ width: 95%; padding: 15px 0px; diff --git a/frontend/src/js/models.ts b/frontend/src/js/models.ts index 6f992f4..1c1a128 100644 --- a/frontend/src/js/models.ts +++ b/frontend/src/js/models.ts @@ -51,7 +51,6 @@ export type RegexAddForm = { } export type PyFilter = { - filter_id:number, name:string, blocked_packets:number, edited_packets:number, diff --git a/frontend/src/js/utils.tsx b/frontend/src/js/utils.tsx index 55b1493..39cbdc9 100644 --- a/frontend/src/js/utils.tsx +++ b/frontend/src/js/utils.tsx @@ -72,9 +72,14 @@ export async function genericapi(method:string,path:string,data:any = undefined, const errorDefault = res.statusText return res.json().then( res => reject(getErrorMessageFromServerResponse(res, errorDefault)) ).catch( _err => reject(errorDefault)) } - res.json().then( res => resolve(res) ).catch( err => reject(err)) - }) - .catch(err => { + res.text().then(t => { + try{ + resolve(JSON.parse(t)) + }catch(e){ + resolve(t) + } + }).catch( err => reject(err)) + }).catch(err => { reject(err) }) }); diff --git a/frontend/src/pages/NFProxy/ServiceDetails.tsx b/frontend/src/pages/NFProxy/ServiceDetails.tsx index 95117f8..855900e 100644 --- a/frontend/src/pages/NFProxy/ServiceDetails.tsx +++ b/frontend/src/pages/NFProxy/ServiceDetails.tsx @@ -162,22 +162,22 @@ export default function ServiceDetailsNFProxy() { + + {filterCode.data?<> <FaPython style={{ marginBottom: -3 }} size={30} /><Space w="xs" />Filter code : null} - + {(!filtersList.data || filtersList.data.length == 0)?<> + No filters found! Edit the proxy file Install the firegex client:<Space w="xs" /><Code mb={-4} >pip install fgex</Code> Then run the command:<Space w="xs" /><Code mb={-4} >fgex nfproxy</Code> - : - - {filtersList.data?.map( (filterInfo) => )} - + :<>{filtersList.data?.map( (filterInfo) => )} } { + if (files?.length??0 > 0) + setFile(files![0]) + } + }); + const [file, setFile] = useState(null); + useEffect(() => { + if (!srv) return + const service = services.data?.find(s => s.service_id === srv) + if (!service) return + if (file){ + console.log("Uploading code") + const notify_id = notifications.show( + { + title: "Uploading code", + message: `Uploading code for service ${service.name}`, + color: "blue", + icon: , + autoClose: false, + loading: true, + } + ) + file.text() + .then( code => nfproxy.setpyfilterscode(service?.service_id??"",code.toString())) + .then( res => { + if (!res){ + notifications.update({ + id: notify_id, + title: "Code uploaded", + message: `Successfully uploaded code for service ${service.name}`, + color: "green", + icon: , + autoClose: 5000, + loading: false, + }) + }else{ + notifications.update({ + id: notify_id, + title: "Code upload failed", + message: `Error: ${res}`, + color: "red", + icon: , + autoClose: 5000, + loading: false, + }) + } + }).catch( err => { + notifications.update({ + id: notify_id, + title: "Code upload failed", + message: `Error: ${err}`, + color: "red", + icon: , + autoClose: 5000, + loading: false, + }) + }).finally(()=>{setFile(null)}) + } + }, [file]) useEffect(()=> { if(services.isError) @@ -37,7 +102,7 @@ export default function NFProxy({ children }: { children: any }) { <ThemeIcon radius="md" size="md" variant='filled' color='lime' ><TbPlugConnected size={20} /></ThemeIcon><Space w="xs" />Netfilter Proxy {isMedium?:} - General stats: + {isMedium?"General stats:":null} Services: {services.isLoading?0:services.data?.length} @@ -50,8 +115,16 @@ export default function NFProxy({ children }: { children: any }) { {isMedium?null:} - {/* Will become the null a button to edit the source code? TODO */} - { srv?null + { srv? + + setTooltipAddOpened(false)} onBlur={() => setTooltipAddOpened(false)} + onMouseEnter={() => setTooltipAddOpened(true)} + onMouseLeave={() => setTooltipAddOpened(false)} onClick={fileDialog.open}> + + + : setOpen(true)} size="lg" radius="md" variant="filled" onFocus={() => setTooltipAddOpened(false)} onBlur={() => setTooltipAddOpened(false)} @@ -85,7 +158,9 @@ export default function NFProxy({ children }: { children: any }) { } {srv?children:null} - {!srv?:null} + {!srv? + :null + } } diff --git a/frontend/src/pages/NFRegex/index.tsx b/frontend/src/pages/NFRegex/index.tsx index 19b0905..83ec802 100644 --- a/frontend/src/pages/NFRegex/index.tsx +++ b/frontend/src/pages/NFRegex/index.tsx @@ -38,7 +38,7 @@ function NFRegex({ children }: { children: any }) { <ThemeIcon radius="md" size="md" variant='filled' color='grape' ><BsRegex size={20} /></ThemeIcon><Space w="xs" />Netfilter Regex {isMedium?:} - General stats: + {isMedium?"General stats:":null} Services: {services.isLoading?0:services.data?.length} From 8ae533e8f79125781a24a74fbe4b4649833c8e32 Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Fri, 28 Feb 2025 21:14:09 +0100 Subject: [PATCH 05/18] push: code changes x2 --- Dockerfile | 2 +- backend/app.py | 2 +- backend/binsrc/classes/nfqueue.cpp | 270 +++++++++++------- backend/binsrc/pyproxy/pyproxy.cpp | 38 +-- backend/binsrc/pyproxy/stream_ctx.cpp | 31 +- backend/binsrc/regex/regexfilter.cpp | 77 +++-- backend/modules/nfproxy/firegex.py | 40 ++- backend/modules/nfproxy/firewall.py | 24 +- backend/modules/nfproxy/nftables.py | 8 +- backend/modules/nfregex/nftables.py | 4 +- backend/modules/porthijack/nftables.py | 4 +- backend/routers/nfproxy.py | 43 ++- backend/utils/loader.py | 2 + frontend/src/App.tsx | 27 +- frontend/src/components/Header/index.tsx | 15 +- frontend/src/components/ModalLog.tsx | 17 ++ .../components/NFProxy/ExceptionWarning.tsx | 27 ++ .../components/NFProxy/ServiceRow/index.tsx | 10 +- .../components/NFRegex/ServiceRow/index.tsx | 7 +- .../PortHijack/ServiceRow/index.tsx | 10 +- .../src/components/PyFilterView/index.tsx | 33 +-- frontend/src/components/RegexView/index.tsx | 15 +- frontend/src/js/utils.tsx | 21 +- frontend/src/pages/Firewall/index.tsx | 39 +-- frontend/src/pages/NFProxy/ServiceDetails.tsx | 61 +++- frontend/src/pages/NFProxy/index.tsx | 38 +-- frontend/src/pages/NFRegex/ServiceDetails.tsx | 21 +- frontend/src/pages/NFRegex/index.tsx | 27 +- frontend/src/pages/PortHijack/index.tsx | 21 +- tests/benchmark.py | 2 +- tests/run_tests.sh | 5 + 31 files changed, 544 insertions(+), 397 deletions(-) create mode 100644 frontend/src/components/ModalLog.tsx create mode 100644 frontend/src/components/NFProxy/ExceptionWarning.tsx diff --git a/Dockerfile b/Dockerfile index feb8659..4599907 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ RUN bun run build FROM --platform=$TARGETARCH registry.fedoraproject.org/fedora:latest RUN dnf -y update && dnf install -y python3.13-devel @development-tools gcc-c++ \ libnetfilter_queue-devel libnfnetlink-devel libmnl-devel libcap-ng-utils nftables \ - vectorscan-devel libtins-devel python3-nftables libpcap-devel boost-devel uv redis + vectorscan-devel libtins-devel python3-nftables libpcap-devel boost-devel uv RUN mkdir -p /execute/modules WORKDIR /execute diff --git a/backend/app.py b/backend/app.py index f12224c..1869b97 100644 --- a/backend/app.py +++ b/backend/app.py @@ -219,7 +219,7 @@ if __name__ == '__main__': os.chdir(os.path.dirname(os.path.realpath(__file__))) uvicorn.run( "app:app", - host="::" if DEBUG else None, + host="0.0.0.0" if DEBUG else None, port=FIREGEX_PORT, reload=DEBUG and not NORELOAD, access_log=True, diff --git a/backend/binsrc/classes/nfqueue.cpp b/backend/binsrc/classes/nfqueue.cpp index 7bfe9c4..36d4d9e 100644 --- a/backend/binsrc/classes/nfqueue.cpp +++ b/backend/binsrc/classes/nfqueue.cpp @@ -7,6 +7,7 @@ #include #include #include +#include using namespace std; @@ -17,7 +18,17 @@ enum class FilterAction{ DROP, ACCEPT, MANGLE, NOACTION }; enum class L4Proto { TCP, UDP, RAW }; typedef Tins::TCPIP::StreamIdentifier stream_id; -//TODO DUBBIO: I PACCHETTI INVIATI A PYTHON SONO GIA' FIXATI? +struct tcp_ack_seq_ctx{ + int64_t in = 0; + int64_t out = 0; + tcp_ack_seq_ctx(){} + void reset(){ + in = 0; + out = 0; + } +}; + +typedef map tcp_ack_map; template class PktRequest { @@ -28,6 +39,7 @@ class PktRequest { uint32_t packet_id; size_t _original_size; size_t _data_original_size; + size_t _header_size; bool need_tcp_fixing = false; public: bool is_ipv6; @@ -39,18 +51,15 @@ class PktRequest { bool is_input; string packet; - char* data; - size_t data_size; stream_id sid; - int64_t* tcp_in_offset = nullptr; - int64_t* tcp_out_offset = nullptr; + tcp_ack_seq_ctx* ack_seq_offset = nullptr; - T* ctx; + T* ctx = nullptr; private: - static size_t inner_data_size(Tins::PDU* pdu){ + static inline size_t inner_data_size(Tins::PDU* pdu){ if (pdu == nullptr){ return 0; } @@ -61,9 +70,9 @@ class PktRequest { return inner->size(); } - inline void fetch_data_size(Tins::PDU* pdu){ - data_size = inner_data_size(pdu); - _data_original_size = data_size; + inline void __internal_fetch_data_size(Tins::PDU* pdu){ + _data_original_size = inner_data_size(pdu); + _header_size = _original_size - _data_original_size; } L4Proto fill_l4_info(){ @@ -72,14 +81,14 @@ class PktRequest { if (tcp == nullptr){ udp = ipv6->find_pdu(); if (udp == nullptr){ - fetch_data_size(ipv6); + __internal_fetch_data_size(ipv6); return L4Proto::RAW; }else{ - fetch_data_size(udp); + __internal_fetch_data_size(udp); return L4Proto::UDP; } }else{ - fetch_data_size(tcp); + __internal_fetch_data_size(tcp); return L4Proto::TCP; } }else{ @@ -87,73 +96,23 @@ class PktRequest { if (tcp == nullptr){ udp = ipv4->find_pdu(); if (udp == nullptr){ - fetch_data_size(ipv4); + __internal_fetch_data_size(ipv4); return L4Proto::RAW; }else{ - fetch_data_size(udp); + __internal_fetch_data_size(udp); return L4Proto::UDP; } }else{ - fetch_data_size(tcp); + __internal_fetch_data_size(tcp); return L4Proto::TCP; } } } bool need_tcp_fix(){ - return (tcp_in_offset != nullptr && *tcp_in_offset != 0) || (tcp_out_offset != nullptr && *tcp_out_offset != 0); + return tcp && ack_seq_offset != nullptr && (ack_seq_offset->in != 0 || ack_seq_offset->out != 0); } - Tins::PDU::serialization_type reserialize_raw_data(const uint8_t* data, const size_t& data_size){ - if (is_ipv6){ - Tins::IPv6 ipv6_new = Tins::IPv6(data, data_size); - if (tcp){ - Tins::TCP* tcp_new = ipv6_new.find_pdu(); - } - return ipv6_new.serialize(); - }else{ - Tins::IP ipv4_new = Tins::IP(data, data_size); - if (tcp){ - Tins::TCP* tcp_new = ipv4_new.find_pdu(); - } - return ipv4_new.serialize(); - } - } - - void _fix_ack_seq_tcp(Tins::TCP* this_tcp){ - need_tcp_fixing = need_tcp_fix(); - #ifdef DEBUG - if (need_tcp_fixing){ - cerr << "[DEBUG] Fixing ack_seq with offsets " << *tcp_in_offset << " " << *tcp_out_offset << endl; - } - #endif - if(this_tcp == nullptr){ - return; - } - if (is_input){ - if (tcp_in_offset != nullptr){ - this_tcp->seq(this_tcp->seq() + *tcp_in_offset); - } - if (tcp_out_offset != nullptr){ - this_tcp->ack_seq(this_tcp->ack_seq() - *tcp_out_offset); - } - }else{ - if (tcp_in_offset != nullptr){ - this_tcp->ack_seq(this_tcp->ack_seq() - *tcp_in_offset); - } - if (tcp_out_offset != nullptr){ - this_tcp->seq(this_tcp->seq() + *tcp_out_offset); - } - } - #ifdef DEBUG - if (need_tcp_fixing){ - size_t new_size = inner_data_size(this_tcp); - cerr << "[DEBUG] FIXED PKT " << (is_input?"-> IN ":"<- OUT") << " [SEQ: " << this_tcp->seq() << "] \t[ACK: " << this_tcp->ack_seq() << "] \t[SIZE: " << new_size << "]" << endl; - } - #endif - } - - public: PktRequest(const char* payload, size_t plen, T* ctx, mnl_socket* nl, nfgenmsg *nfg, nfqnl_msg_packet_hdr *ph, bool is_input): @@ -168,22 +127,129 @@ class PktRequest { sid = stream_id::make_identifier(*ipv6); _original_size = ipv6->size(); }else{ - ipv4 = new Tins::IP((uint8_t*)packet.data(), plen); + ipv4 = new Tins::IP((uint8_t*)packet.c_str(), plen); sid = stream_id::make_identifier(*ipv4); _original_size = ipv4->size(); } l4_proto = fill_l4_info(); - data = packet.data()+(plen-data_size); #ifdef DEBUG if (tcp){ - cerr << "[DEBUG] NEW_PACKET " << (is_input?"-> IN ":"<- OUT") << " [SEQ: " << tcp->seq() << "] \t[ACK: " << tcp->ack_seq() << "] \t[SIZE: " << data_size << "]" << endl; + cerr << "[DEBUG] NEW_PACKET " << (is_input?"-> IN ":"<- OUT") << " [SEQ: " << tcp->seq() << "] \t[ACK: " << tcp->ack_seq() << "] \t[SIZE: " << data_size() << "]" << endl; } #endif } - void fix_tcp_ack(){ + inline size_t header_size(){ + return _header_size; + } + + char* data(){ + return packet.data()+_header_size; + } + + size_t data_size(){ + return packet.size()-_header_size; + } + + size_t data_original_size(){ + return _data_original_size; + } + + void reserialize(){ + auto data = serialize(); + packet.resize(data.size()); + memcpy(packet.data(), data.data(), data.size()); + } + + void set_data(const char* data, const size_t& data_size){ + auto bef_raw = before_raw_pdu_ptr(); + if (bef_raw){ + delete before_raw_pdu_ptr()->release_inner_pdu(); + if (data_size > 0){ + before_raw_pdu_ptr() /= move(Tins::RawPDU((uint8_t*)data, data_size)); + } + } + } + + Tins::PDU* before_raw_pdu_ptr(){ if (tcp){ - _fix_ack_seq_tcp(tcp); + return tcp; + }else if (udp){ + return udp; + }else if (ipv4){ + return ipv4; + }else if (ipv6){ + return ipv6; + } + return nullptr; + } + + void set_packet(const char* data, size_t data_size){ + // Parsing only the header with libtins + Tins::PDU *data_pdu = nullptr; + size_t total_size; + if (is_ipv6){ + delete ipv6; + ipv6 = new Tins::IPv6((uint8_t*)data, data_size); + if (tcp){ + tcp = ipv6->find_pdu(); + data_pdu = tcp; + }else if (udp){ + udp = ipv6->find_pdu(); + data_pdu = udp; + }else{ + data_pdu = ipv6; + } + total_size = ipv6->size(); + }else{ + delete ipv4; + ipv4 = new Tins::IP((uint8_t*)data, data_size); + if (tcp){ + tcp = ipv4->find_pdu(); + data_pdu = tcp; + }else if(udp){ + udp = ipv4->find_pdu(); + data_pdu = udp; + }else{ + data_pdu = ipv4; + } + total_size = ipv4->size(); + } + _header_size = total_size - inner_data_size(data_pdu); + // Libtins can skip data if the lenght is changed to a bigger len (due to ip header total lenght), so we need to specify the data section manually + set_data(data+_header_size, data_size-_header_size); + } + + void fix_tcp_ack(){ + need_tcp_fixing = need_tcp_fix(); + if(!need_tcp_fixing){ + return; + } + #ifdef DEBUG + cerr << "[DEBUG] Fixing ack_seq with offsets " << ((int32_t)ack_seq_offset->in) << " " << ((int32_t)ack_seq_offset->out) << endl; + #endif + if (is_input){ + tcp->seq(tcp->seq() + ack_seq_offset->in); + tcp->ack_seq(tcp->ack_seq() - ack_seq_offset->out); + }else{ + tcp->ack_seq(tcp->ack_seq() - ack_seq_offset->in); + tcp->seq(tcp->seq() + ack_seq_offset->out); + } + #ifdef DEBUG + size_t new_size = inner_data_size(tcp); + cerr << "[DEBUG] FIXED PKT " << (is_input?"-> IN ":"<- OUT") << " [SEQ: " << tcp->seq() << "] \t[ACK: " << tcp->ack_seq() << "] \t[SIZE: " << new_size << "]" << endl; + #endif + } + + void fix_data_payload(){ + //Stream follower move the payload data, so we need to reinizialize RawPDU + auto bef_raw = before_raw_pdu_ptr(); + if (bef_raw){ + delete bef_raw->release_inner_pdu(); + auto new_data_size = packet.size()-_header_size; + if (new_data_size > 0){ + bef_raw /= move(Tins::RawPDU((uint8_t*)packet.data()+_header_size, new_data_size)); + } } } @@ -196,10 +262,6 @@ class PktRequest { } } - size_t data_original_size(){ - return _data_original_size; - } - size_t original_size(){ return _original_size; } @@ -225,11 +287,11 @@ class PktRequest { void reject(){ if (tcp){ //If the packet has data, we have to remove it - delete tcp->release_inner_pdu(); + set_data(nullptr, 0); //For the first matched data or only for data packets, we set FIN bit //This only for client packets, because this will trigger server to close the connection //Packets will be filtered anyway also if client don't send packets - if (_data_original_size != 0 && is_input){ + if (_data_original_size != 0){ tcp->set_flag(Tins::TCP::FIN,1); tcp->set_flag(Tins::TCP::ACK,1); tcp->set_flag(Tins::TCP::SYN,0); @@ -241,10 +303,16 @@ class PktRequest { } } - void mangle_custom_pkt(uint8_t* pkt, const size_t& pkt_size){ + void mangle_custom_pkt(const char* raw_pkt, size_t raw_pkt_size){ if (action == FilterAction::NOACTION){ - action = FilterAction::MANGLE; - perfrom_action(pkt, pkt_size); + try{ + set_packet(raw_pkt, raw_pkt_size); + reserialize(); + action = FilterAction::MANGLE; + }catch(...){ + action = FilterAction::DROP; + } + perfrom_action(false); }else{ throw invalid_argument("Cannot mangle a packet that has already been accepted or dropped"); } @@ -259,7 +327,7 @@ class PktRequest { delete ipv6; } - inline Tins::PDU::serialization_type serialize(){ + Tins::PDU::serialization_type serialize(){ if (is_ipv6){ return ipv6->serialize(); }else{ @@ -268,15 +336,17 @@ class PktRequest { } private: - void perfrom_action(uint8_t* custom_data = nullptr, size_t custom_data_size = 0){ + void perfrom_action(bool do_serialize = true){ char buf[MNL_SOCKET_BUFFER_SIZE]; struct nlmsghdr *nlh_verdict = nfq_nlmsg_put(buf, NFQNL_MSG_VERDICT, ntohs(res_id)); switch (action) { case FilterAction::ACCEPT: if (need_tcp_fixing){ - Tins::PDU::serialization_type data = serialize(); - nfq_nlmsg_verdict_put_pkt(nlh_verdict, data.data(), data.size()); + if (do_serialize){ + reserialize(); + } + nfq_nlmsg_verdict_put_pkt(nlh_verdict, packet.data(), packet.size()); } nfq_nlmsg_verdict_put(nlh_verdict, ntohl(packet_id), NF_ACCEPT ); break; @@ -285,32 +355,20 @@ class PktRequest { break; case FilterAction::MANGLE:{ //If not custom data, use the data in the packets - Tins::PDU::serialization_type data; - if (custom_data == nullptr){ - data = serialize(); - }else{ - try{ - data = reserialize_raw_data(custom_data, custom_data_size); - }catch(...){ - nfq_nlmsg_verdict_put(nlh_verdict, ntohl(packet_id), NF_DROP ); - action = FilterAction::DROP; - break; - } + if(do_serialize){ + reserialize(); } + nfq_nlmsg_verdict_put_pkt(nlh_verdict, packet.data(), packet.size()); #ifdef DEBUG - size_t new_size = _data_original_size+((int64_t)custom_data_size) - ((int64_t)_original_size); - cerr << "[DEBUG] MANGLEDPKT " << (is_input?"-> IN ":"<- OUT") << " [SIZE: " << new_size << "]" << endl; + cerr << "[DEBUG] MANGLEDPKT " << (is_input?"-> IN ":"<- OUT") << " [SIZE: " << packet.size()-header_size() << "]" << endl; #endif - if (tcp && custom_data_size != _original_size){ - int64_t delta = ((int64_t)custom_data_size) - ((int64_t)_original_size); - - if (is_input && tcp_in_offset != nullptr){ - *tcp_in_offset += delta; - }else if (!is_input && tcp_out_offset != nullptr){ - *tcp_out_offset += delta; + if (tcp && ack_seq_offset && packet.size() != _original_size){ + if (is_input){ + ack_seq_offset->in += packet.size() - _original_size; + }else{ + ack_seq_offset->out += packet.size() - _original_size; } } - nfq_nlmsg_verdict_put_pkt(nlh_verdict, data.data(), data.size()); nfq_nlmsg_verdict_put(nlh_verdict, ntohl(packet_id), NF_ACCEPT ); break; } diff --git a/backend/binsrc/pyproxy/pyproxy.cpp b/backend/binsrc/pyproxy/pyproxy.cpp index 41f4540..93e7714 100644 --- a/backend/binsrc/pyproxy/pyproxy.cpp +++ b/backend/binsrc/pyproxy/pyproxy.cpp @@ -16,6 +16,7 @@ #include #include #include "../classes/netfilter.cpp" +#include "../classes/nfqueue.cpp" #include "stream_ctx.cpp" #include "settings.cpp" #include @@ -46,7 +47,7 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { }; PyThreadState *tstate = NULL; NfQueue::PktRequest* pkt; - tcp_ack_seq_ctx* current_tcp_ack = nullptr; + NfQueue::tcp_ack_seq_ctx* current_tcp_ack = nullptr; void before_loop() override { PyStatus pystatus; @@ -89,7 +90,7 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { pyq->pkt->drop();// This is needed because the callback has to take the updated pkt pointer! } - void filter_action(NfQueue::PktRequest* pkt, Stream& stream){ + void filter_action(NfQueue::PktRequest* pkt, Stream& stream, const string& data){ auto stream_search = sctx.streams_ctx.find(pkt->sid); pyfilter_ctx* stream_match; if (stream_search == sctx.streams_ctx.end()){ @@ -108,7 +109,7 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { stream_match = stream_search->second; } - auto result = stream_match->handle_packet(pkt); + auto result = stream_match->handle_packet(pkt, data); switch(result.action){ case PyFilterResponse::ACCEPT: return pkt->accept(); @@ -125,7 +126,7 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { stream.server_data_callback(bind(keep_fin_packet, this)); return pkt->reject(); case PyFilterResponse::MANGLE: - pkt->mangle_custom_pkt((uint8_t*)result.mangled_packet->data(), result.mangled_packet->size()); + pkt->mangle_custom_pkt(result.mangled_packet->c_str(), result.mangled_packet->size()); if (pkt->get_action() == NfQueue::FilterAction::DROP){ cerr << "[error] [filter_action] Failed to mangle: the packet sent is not serializzable... the packet was dropped" << endl; print_blocked_reason(*result.filter_match_by); @@ -146,20 +147,21 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { } - static void on_data_recv(Stream& stream, PyProxyQueue* proxy_info, string data) { - proxy_info->pkt->data = data.data(); - proxy_info->pkt->data_size = data.size(); - proxy_info->filter_action(proxy_info->pkt, stream); + static void on_data_recv(Stream& stream, PyProxyQueue* pyq, const string& data) { + pyq->pkt->fix_data_payload(); + pyq->filter_action(pyq->pkt, stream, data); //Only here the rebuilt_tcp_data is set } //Input data filtering - static void on_client_data(Stream& stream, PyProxyQueue* proxy_info) { - on_data_recv(stream, proxy_info, string(stream.client_payload().begin(), stream.client_payload().end())); + static void on_client_data(Stream& stream, PyProxyQueue* pyq) { + auto data = stream.client_payload(); + on_data_recv(stream, pyq, string((char*)data.data(), data.size())); } //Server data filtering - static void on_server_data(Stream& stream, PyProxyQueue* proxy_info) { - on_data_recv(stream, proxy_info, string(stream.server_payload().begin(), stream.server_payload().end())); + static void on_server_data(Stream& stream, PyProxyQueue* pyq) { + auto data = stream.server_payload(); + on_data_recv(stream, pyq, string((char*)data.data(), data.size())); } // A stream was terminated. The second argument is the reason why it was terminated @@ -178,10 +180,9 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { if (pyq->current_tcp_ack != nullptr){ pyq->current_tcp_ack->reset(); }else{ - pyq->current_tcp_ack = new tcp_ack_seq_ctx(); + pyq->current_tcp_ack = new NfQueue::tcp_ack_seq_ctx(); pyq->sctx.tcp_ack_ctx.insert_or_assign(pyq->pkt->sid, pyq->current_tcp_ack); - pyq->pkt->tcp_in_offset = &pyq->current_tcp_ack->in_tcp_offset; - pyq->pkt->tcp_out_offset = &pyq->current_tcp_ack->out_tcp_offset; + pyq->pkt->ack_seq_offset = pyq->current_tcp_ack; // Set ack context } //Should not happen, but with this we can be sure about this @@ -205,18 +206,17 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { auto tcp_ack_search = sctx.tcp_ack_ctx.find(pkt->sid); if (tcp_ack_search != sctx.tcp_ack_ctx.end()){ current_tcp_ack = tcp_ack_search->second; - pkt->tcp_in_offset = ¤t_tcp_ack->in_tcp_offset; - pkt->tcp_out_offset = ¤t_tcp_ack->out_tcp_offset; + pkt->ack_seq_offset = current_tcp_ack; }else{ current_tcp_ack = nullptr; //If necessary will be created by libtis new_stream callback } + pkt->fix_tcp_ack(); + if (pkt->is_ipv6){ - pkt->fix_tcp_ack(); follower.process_packet(*pkt->ipv6); }else{ - pkt->fix_tcp_ack(); follower.process_packet(*pkt->ipv4); } diff --git a/backend/binsrc/pyproxy/stream_ctx.cpp b/backend/binsrc/pyproxy/stream_ctx.cpp index 761e20d..ba7db5c 100644 --- a/backend/binsrc/pyproxy/stream_ctx.cpp +++ b/backend/binsrc/pyproxy/stream_ctx.cpp @@ -7,7 +7,9 @@ #include #include #include "../classes/netfilter.cpp" +#include "../classes/nfqueue.cpp" #include "settings.cpp" +#include "../utils.cpp" using namespace std; @@ -50,17 +52,6 @@ struct py_filter_response { typedef Tins::TCPIP::StreamIdentifier stream_id; -struct tcp_ack_seq_ctx{ - //Can be negative, so we use int64_t (for a uint64_t value) - int64_t in_tcp_offset = 0; - int64_t out_tcp_offset = 0; - tcp_ack_seq_ctx(){} - void reset(){ - in_tcp_offset = 0; - out_tcp_offset = 0; - } -}; - struct pyfilter_ctx { PyObject * glob = nullptr; @@ -105,12 +96,14 @@ struct pyfilter_ctx { } py_filter_response handle_packet( - NfQueue::PktRequest* pkt + NfQueue::PktRequest* pkt, + const string& data ){ PyObject * packet_info = PyDict_New(); - - set_item_to_dict(packet_info, "data", PyBytes_FromStringAndSize(pkt->data, pkt->data_size)); - set_item_to_dict(packet_info, "l4_size", PyLong_FromLong(pkt->data_original_size())); + + pkt->reserialize(); + set_item_to_dict(packet_info, "data", PyBytes_FromStringAndSize(data.c_str(), data.size())); + set_item_to_dict(packet_info, "l4_size", PyLong_FromLong(pkt->data_size())); set_item_to_dict(packet_info, "raw_packet", PyBytes_FromStringAndSize(pkt->packet.c_str(), pkt->packet.size())); set_item_to_dict(packet_info, "is_input", PyBool_FromLong(pkt->is_input)); set_item_to_dict(packet_info, "is_ipv6", PyBool_FromLong(pkt->is_ipv6)); @@ -129,8 +122,7 @@ struct pyfilter_ctx { #endif return py_filter_response(PyFilterResponse::EXCEPTION); } - - + Py_DECREF(result); result = get_item_from_glob("__firegex_pyfilter_result"); @@ -235,11 +227,12 @@ struct pyfilter_ctx { }; typedef map matching_map; -typedef map tcp_ack_map; + struct stream_ctx { + matching_map streams_ctx; - tcp_ack_map tcp_ack_ctx; + NfQueue::tcp_ack_map tcp_ack_ctx; void clean_stream_by_id(stream_id sid){ auto stream_search = streams_ctx.find(sid); diff --git a/backend/binsrc/regex/regexfilter.cpp b/backend/binsrc/regex/regexfilter.cpp index c84b12b..f50616e 100644 --- a/backend/binsrc/regex/regexfilter.cpp +++ b/backend/binsrc/regex/regexfilter.cpp @@ -20,6 +20,7 @@ #include "../classes/netfilter.cpp" #include "stream_ctx.cpp" #include "regex_rules.cpp" +#include "../utils.cpp" using namespace std; @@ -30,8 +31,6 @@ namespace Regex { using Tins::TCPIP::Stream; using Tins::TCPIP::StreamFollower; - - class RegexNfQueue : public NfQueue::ThreadNfQueue { public: stream_ctx sctx; @@ -39,7 +38,7 @@ public: StreamFollower follower; NfQueue::PktRequest* pkt; - bool filter_action(NfQueue::PktRequest* pkt){ + bool filter_action(NfQueue::PktRequest* pkt, const string& data){ shared_ptr conf = regex_config; auto current_version = conf->ver(); @@ -85,12 +84,12 @@ public: stream_match = stream_search->second; } err = hs_scan_stream( - stream_match,pkt->data, pkt->data_size, + stream_match, data.c_str(), data.size(), 0, scratch_space, match_func, &match_res ); }else{ err = hs_scan( - regex_matcher,pkt->data, pkt->data_size, + regex_matcher, data.c_str(), data.size(), 0, scratch_space, match_func, &match_res ); } @@ -102,7 +101,7 @@ public: throw invalid_argument("Cannot close stream match on hyperscan"); } if (err != HS_SUCCESS && err != HS_SCAN_TERMINATED) { - cerr << "[error] [filter_callback] Error while matching the stream (hs)" << endl; + cerr << "[error] [filter_callback] Error while matching the stream (hs) " << err << endl; throw invalid_argument("Error while matching the stream with hyperscan"); } if (match_res.has_matched){ @@ -113,41 +112,13 @@ public: return true; } - void handle_next_packet(NfQueue::PktRequest* _pkt) override{ - pkt = _pkt; // Setting packet context - if (pkt->tcp){ - if (pkt->ipv4){ - follower.process_packet(*pkt->ipv4); - }else{ - follower.process_packet(*pkt->ipv6); - } - //Fallback to the default action - if (pkt->get_action() == NfQueue::FilterAction::NOACTION){ - return pkt->accept(); - } - }else{ - if (!pkt->udp){ - throw invalid_argument("Only TCP and UDP are supported"); - } - if(pkt->data_size == 0){ - return pkt->accept(); - }else if (filter_action(pkt)){ - return pkt->accept(); - }else{ - return pkt->drop(); - } - } - } - //If the stream has already been matched, drop all data, and try to close the connection static void keep_fin_packet(RegexNfQueue* nfq){ - nfq->pkt->reject();// This is needed because the callback has to take the updated pkt pointer! + nfq->pkt->reject(); // This is needed because the callback has to take the updated pkt pointer! } - static void on_data_recv(Stream& stream, RegexNfQueue* nfq, string data) { - nfq->pkt->data = data.data(); - nfq->pkt->data_size = data.size(); - if (!nfq->filter_action(nfq->pkt)){ + static void on_data_recv(Stream& stream, RegexNfQueue* nfq, const string& data) { + if (!nfq->filter_action(nfq->pkt, data)){ nfq->sctx.clean_stream_by_id(nfq->pkt->sid); stream.client_data_callback(bind(keep_fin_packet, nfq)); stream.server_data_callback(bind(keep_fin_packet, nfq)); @@ -157,12 +128,14 @@ public: //Input data filtering static void on_client_data(Stream& stream, RegexNfQueue* nfq) { - on_data_recv(stream, nfq, string(stream.client_payload().begin(), stream.client_payload().end())); + auto data = stream.client_payload(); + on_data_recv(stream, nfq, string((char*)data.data(), data.size())); } //Server data filtering static void on_server_data(Stream& stream, RegexNfQueue* nfq) { - on_data_recv(stream, nfq, string(stream.server_payload().begin(), stream.server_payload().end())); + auto data = stream.server_payload(); + on_data_recv(stream, nfq, string((char*)data.data(), data.size())); } // A stream was terminated. The second argument is the reason why it was terminated @@ -181,6 +154,32 @@ public: stream.stream_closed_callback(bind(on_stream_close, placeholders::_1, nfq)); } + void handle_next_packet(NfQueue::PktRequest* _pkt) override{ + pkt = _pkt; // Setting packet context + if (pkt->tcp){ + if (pkt->ipv4){ + follower.process_packet(*pkt->ipv4); + }else{ + follower.process_packet(*pkt->ipv6); + } + //Fallback to the default action + if (pkt->get_action() == NfQueue::FilterAction::NOACTION){ + return pkt->accept(); + } + }else{ + if (!pkt->udp){ + throw invalid_argument("Only TCP and UDP are supported"); + } + if(pkt->data_size() == 0){ + return pkt->accept(); + }else if (filter_action(pkt, string(pkt->data(), pkt->data_size()))){ + return pkt->accept(); + }else{ + return pkt->drop(); + } + } + } + void before_loop() override{ follower.new_stream_callback(bind(on_new_stream, placeholders::_1, this)); follower.stream_termination_callback(bind(on_stream_close, placeholders::_1, this)); diff --git a/backend/modules/nfproxy/firegex.py b/backend/modules/nfproxy/firegex.py index 13eea5a..22c189a 100644 --- a/backend/modules/nfproxy/firegex.py +++ b/backend/modules/nfproxy/firegex.py @@ -5,9 +5,12 @@ import asyncio import traceback from fastapi import HTTPException import time +from utils import run_func nft = FiregexTables() +OUTSTREAM_BUFFER_SIZE = 1024*10 + class FiregexInterceptor: def __init__(self): @@ -28,14 +31,20 @@ class FiregexInterceptor: self.sock_writer:asyncio.StreamWriter = None self.sock_conn_lock:asyncio.Lock self.last_time_exception = 0 + self.outstrem_function = None + self.expection_function = None + self.outstrem_task: asyncio.Task + self.outstrem_buffer = "" @classmethod - async def start(cls, srv: Service): + async def start(cls, srv: Service, outstream_func=None, exception_func=None): self = cls() self.srv = srv self.filter_map_lock = asyncio.Lock() self.update_config_lock = asyncio.Lock() self.sock_conn_lock = asyncio.Lock() + self.outstrem_function = outstream_func + self.expection_function = exception_func if not self.sock_conn_lock.locked(): await self.sock_conn_lock.acquire() self.sock_path = f"/tmp/firegex_nfproxy_{srv.id}.sock" @@ -50,16 +59,37 @@ class FiregexInterceptor: await self.ack_lock.acquire() return self + async def _stream_handler(self): + while True: + try: + line = (await self.process.stdout.readuntil()).decode(errors="ignore") + print(line, end="") + except Exception as e: + self.ack_arrived = False + self.ack_status = False + self.ack_fail_what = "Can't read from nfq client" + self.ack_lock.release() + await self.stop() + raise HTTPException(status_code=500, detail="Can't read from nfq client") from e + self.outstrem_buffer+=line + if len(self.outstrem_buffer) > OUTSTREAM_BUFFER_SIZE: + self.outstrem_buffer = self.outstrem_buffer[-OUTSTREAM_BUFFER_SIZE:]+"\n" + if self.outstrem_function: + await run_func(self.outstrem_function, self.srv.id, line) + async def _start_binary(self): proxy_binary_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"../cpproxy") self.process = await asyncio.create_subprocess_exec( proxy_binary_path, stdin=asyncio.subprocess.DEVNULL, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.STDOUT, env={ "NTHREADS": os.getenv("NTHREADS","1"), "FIREGEX_NFQUEUE_FAIL_OPEN": "1" if self.srv.fail_open else "0", "FIREGEX_NFPROXY_SOCK": self.sock_path }, ) + self.outstrem_task = asyncio.create_task(self._stream_handler()) try: async with asyncio.timeout(3): await self.sock_conn_lock.acquire() @@ -101,9 +131,7 @@ class FiregexInterceptor: filter_name = line.split()[1] print("BLOCKED", filter_name) async with self.filter_map_lock: - print("LOCKED MAP LOCK") if filter_name in self.filter_map: - print("ADDING BLOCKED PACKET") self.filter_map[filter_name].blocked_packets+=1 await self.filter_map[filter_name].update() if line.startswith("MANGLED "): @@ -113,8 +141,9 @@ class FiregexInterceptor: self.filter_map[filter_name].edited_packets+=1 await self.filter_map[filter_name].update() if line.startswith("EXCEPTION"): - self.last_time_exception = time.time() - print("TODO EXCEPTION HANDLING") # TODO + self.last_time_exception = int(time.time()*1000) #ms timestamp + if self.expection_function: + await run_func(self.expection_function, self.srv.id, self.last_time_exception) if line.startswith("ACK "): self.ack_arrived = True self.ack_status = line.split()[1].upper() == "OK" @@ -132,6 +161,7 @@ class FiregexInterceptor: self.server_task.cancel() self.update_task.cancel() self.unix_sock.close() + self.outstrem_task.cancel() if os.path.exists(self.sock_path): os.remove(self.sock_path) if self.process and self.process.returncode is None: diff --git a/backend/modules/nfproxy/firewall.py b/backend/modules/nfproxy/firewall.py index c424686..045f9ab 100644 --- a/backend/modules/nfproxy/firewall.py +++ b/backend/modules/nfproxy/firewall.py @@ -3,6 +3,7 @@ from modules.nfproxy.firegex import FiregexInterceptor from modules.nfproxy.nftables import FiregexTables, FiregexFilter from modules.nfproxy.models import Service, PyFilter from utils.sqlite import SQLite +from utils import run_func class STATUS: STOP = "stop" @@ -11,13 +12,20 @@ class STATUS: nft = FiregexTables() class ServiceManager: - def __init__(self, srv: Service, db): + def __init__(self, srv: Service, db, outstream_func=None, exception_func=None): self.srv = srv self.db = db self.status = STATUS.STOP self.filters: dict[str, FiregexFilter] = {} self.lock = asyncio.Lock() self.interceptor = None + self.outstream_function = outstream_func + self.last_exception_time = 0 + async def excep_internal_handler(srv, exc_time): + self.last_exception_time = exc_time + if exception_func: + await run_func(exception_func, srv, exc_time) + self.exception_function = excep_internal_handler async def _update_filters_from_db(self): pyfilters = [ @@ -52,10 +60,16 @@ class ServiceManager: self.status = status self.__update_status_db(status) + def read_outstrem_buffer(self): + if self.interceptor: + return self.interceptor.outstrem_buffer + else: + return "" + async def start(self): if not self.interceptor: nft.delete(self.srv) - self.interceptor = await FiregexInterceptor.start(self.srv) + self.interceptor = await FiregexInterceptor.start(self.srv, outstream_func=self.outstream_function, exception_func=self.exception_function) await self._update_filters_from_db() self._set_status(STATUS.ACTIVE) @@ -75,10 +89,12 @@ class ServiceManager: await self._update_filters_from_db() class FirewallManager: - def __init__(self, db:SQLite): + def __init__(self, db:SQLite, outstream_func=None, exception_func=None): self.db = db self.service_table: dict[str, ServiceManager] = {} self.lock = asyncio.Lock() + self.outstream_function = outstream_func + self.exception_function = exception_func async def close(self): for key in list(self.service_table.keys()): @@ -100,7 +116,7 @@ class FirewallManager: srv = Service.from_dict(srv) if srv.id in self.service_table: continue - self.service_table[srv.id] = ServiceManager(srv, self.db) + self.service_table[srv.id] = ServiceManager(srv, self.db, outstream_func=self.outstream_function, exception_func=self.exception_function) await self.service_table[srv.id].next(srv.status) def get(self,srv_id) -> ServiceManager: diff --git a/backend/modules/nfproxy/nftables.py b/backend/modules/nfproxy/nftables.py index 84c24c9..5bb1050 100644 --- a/backend/modules/nfproxy/nftables.py +++ b/backend/modules/nfproxy/nftables.py @@ -28,22 +28,22 @@ class FiregexTables(NFTableManager): def __init__(self): super().__init__([ - {"add":{"chain":{ + {"add":{"chain":{ #Input chain attached before conntrack see it "family":"inet", "table":self.table_name, "name":self.input_chain, "type":"filter", "hook":"prerouting", - "prio":-150, + "prio":-301, "policy":"accept" }}}, - {"add":{"chain":{ + {"add":{"chain":{ #Output chain attached after conntrack saw it "family":"inet", "table":self.table_name, "name":self.output_chain, "type":"filter", "hook":"postrouting", - "prio":-150, + "prio":-290, "policy":"accept" }}} ],[ diff --git a/backend/modules/nfregex/nftables.py b/backend/modules/nfregex/nftables.py index 34ed844..c352226 100644 --- a/backend/modules/nfregex/nftables.py +++ b/backend/modules/nfregex/nftables.py @@ -26,7 +26,7 @@ class FiregexTables(NFTableManager): "name":self.input_chain, "type":"filter", "hook":"prerouting", - "prio":-150, + "prio":-301, "policy":"accept" }}}, {"add":{"chain":{ @@ -35,7 +35,7 @@ class FiregexTables(NFTableManager): "name":self.output_chain, "type":"filter", "hook":"postrouting", - "prio":-150, + "prio":-301, "policy":"accept" }}} ],[ diff --git a/backend/modules/porthijack/nftables.py b/backend/modules/porthijack/nftables.py index 1d8dcde..0590b2f 100644 --- a/backend/modules/porthijack/nftables.py +++ b/backend/modules/porthijack/nftables.py @@ -28,7 +28,7 @@ class FiregexTables(NFTableManager): "name":self.prerouting_porthijack, "type":"filter", "hook":"prerouting", - "prio":-300, + "prio":-310, "policy":"accept" }}}, {"add":{"chain":{ @@ -37,7 +37,7 @@ class FiregexTables(NFTableManager): "name":self.postrouting_porthijack, "type":"filter", "hook":"postrouting", - "prio":-300, + "prio":-310, "policy":"accept" }}} ],[ diff --git a/backend/routers/nfproxy.py b/backend/routers/nfproxy.py index 77405d1..96fffa2 100644 --- a/backend/routers/nfproxy.py +++ b/backend/routers/nfproxy.py @@ -14,6 +14,7 @@ from modules.nfproxy.nftables import convert_protocol_to_l4 import asyncio import traceback from utils import DEBUG +import utils class ServiceModel(BaseModel): service_id: str @@ -107,6 +108,10 @@ async def startup(): await firewall.init() except Exception as e: print("WARNING cannot start firewall:", e) + utils.socketio.on("nfproxy-outstream-join", join_outstream) + utils.socketio.on("nfproxy-outstream-leave", leave_outstream) + utils.socketio.on("nfproxy-exception-join", join_exception) + utils.socketio.on("nfproxy-exception-leave", leave_exception) async def shutdown(): db.backup() @@ -121,7 +126,13 @@ def gen_service_id(): break return res -firewall = FirewallManager(db) +async def outstream_func(service_id, data): + await utils.socketio.emit(f"nfproxy-outstream-{service_id}", data, room=f"nfproxy-outstream-{service_id}") + +async def exception_func(service_id, timestamp): + await utils.socketio.emit(f"nfproxy-exception-{service_id}", timestamp, room=f"nfproxy-exception-{service_id}") + +firewall = FirewallManager(db, outstream_func=outstream_func, exception_func=exception_func) @app.get('/services', response_model=list[ServiceModel]) async def get_service_list(): @@ -355,3 +366,33 @@ async def get_pyfilters(service_id: str): return f.read() except FileNotFoundError: return "" + +#Socket io events +async def join_outstream(sid, data): + """Client joins a room.""" + srv = data.get("service") + if srv: + room = f"nfproxy-outstream-{srv}" + await utils.socketio.enter_room(sid, room) + await utils.socketio.emit(room, firewall.get(srv).read_outstrem_buffer(), room=sid) + +async def leave_outstream(sid, data): + """Client leaves a room.""" + srv = data.get("service") + if srv: + await utils.socketio.leave_room(sid, f"nfproxy-outstream-{srv}") + +async def join_exception(sid, data): + """Client joins a room.""" + srv = data.get("service") + if srv: + room = f"nfproxy-exception-{srv}" + await utils.socketio.enter_room(sid, room) + await utils.socketio.emit(room, firewall.get(srv).last_exception_time, room=sid) + +async def leave_exception(sid, data): + """Client leaves a room.""" + srv = data.get("service") + if srv: + await utils.socketio.leave_room(sid, f"nfproxy-exception-{srv}") + diff --git a/backend/utils/loader.py b/backend/utils/loader.py index 5e5dd32..d13b9d3 100644 --- a/backend/utils/loader.py +++ b/backend/utils/loader.py @@ -8,6 +8,7 @@ from fastapi.responses import FileResponse from utils import DEBUG, ON_DOCKER, ROUTERS_DIR, list_files, run_func from utils.models import ResetRequest import asyncio +import traceback REACT_BUILD_DIR: str = "../frontend/build/" if not ON_DOCKER else "frontend/" REACT_HTML_PATH: str = os.path.join(REACT_BUILD_DIR,"index.html") @@ -70,6 +71,7 @@ def get_router_modules(): name=route )) except Exception as e: + traceback.print_exc() print(f"Router {route} failed to load: {e}") return res diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index a988fdc..375cdcd 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -5,9 +5,8 @@ import { ImCross } from 'react-icons/im'; import { Outlet, Route, Routes } from 'react-router-dom'; import MainLayout from './components/MainLayout'; import { PasswordSend, ServerStatusResponse } from './js/models'; -import { DEV_IP_BACKEND, errorNotify, getstatus, HomeRedirector, IS_DEV, login, setpassword } from './js/utils'; +import { errorNotify, getstatus, HomeRedirector, IS_DEV, login, setpassword, socketio } from './js/utils'; import NFRegex from './pages/NFRegex'; -import io from 'socket.io-client'; import ServiceDetailsNFRegex from './pages/NFRegex/ServiceDetails'; import PortHijack from './pages/PortHijack'; import { Firewall } from './pages/Firewall'; @@ -15,22 +14,6 @@ import { useQueryClient } from '@tanstack/react-query'; import NFProxy from './pages/NFProxy'; import ServiceDetailsNFProxy from './pages/NFProxy/ServiceDetails'; -export const socket = import.meta.env.DEV? - io("ws://"+DEV_IP_BACKEND, { - path:"/sock/socket.io", - transports: ['websocket'], - auth: { - token: localStorage.getItem("access_token") - } - }): - io({ - path:"/sock/socket.io", - transports: ['websocket'], - auth: { - token: localStorage.getItem("access_token") - } - }) - function App() { const [loading, setLoading] = useState(true); @@ -162,16 +145,16 @@ const PageRouting = ({ getStatus }:{ getStatus:()=>void }) => { useEffect(()=>{ getStatus() - socket.on("update", (data) => { + socketio.on("update", (data) => { queryClient.invalidateQueries({ queryKey: data }) }) - socket.on("connect_error", (err) => { + socketio.on("connect_error", (err) => { errorNotify("Socket.Io connection failed! ",`Error message: [${err.message}]`) getStatus() }); return () => { - socket.off("update") - socket.off("connect_error") + socketio.off("update") + socketio.off("connect_error") } },[]) diff --git a/frontend/src/components/Header/index.tsx b/frontend/src/components/Header/index.tsx index 938c8fb..02f5f6a 100644 --- a/frontend/src/components/Header/index.tsx +++ b/frontend/src/components/Header/index.tsx @@ -31,8 +31,6 @@ function HeaderPage(props: any) { const [changePasswordModal, setChangePasswordModal] = useState(false); const [resetFiregexModal, setResetFiregexModal] = useState(false); - const [tooltipHomeOpened, setTooltipHomeOpened] = useState(false); - const [tooltipLogoutOpened,setTooltipLogoutOpened] = useState(false); return } onClick={() => setResetFiregexModal(true)}>Reset Firegex - + setTooltipHomeOpened(false)} onBlur={() => setTooltipHomeOpened(false)} - onMouseEnter={() => setTooltipHomeOpened(true)} onMouseLeave={() => setTooltipHomeOpened(false)}> + onClick={go_to_home}> - - setTooltipLogoutOpened(false)} onBlur={() => setTooltipLogoutOpened(false)} - onMouseEnter={() => setTooltipLogoutOpened(true)} onMouseLeave={() => setTooltipLogoutOpened(false)}> + + + setChangePasswordModal(false)} /> setResetFiregexModal(false)} /> diff --git a/frontend/src/components/ModalLog.tsx b/frontend/src/components/ModalLog.tsx new file mode 100644 index 0000000..d57c515 --- /dev/null +++ b/frontend/src/components/ModalLog.tsx @@ -0,0 +1,17 @@ +import { Code, Modal, ScrollArea } from "@mantine/core" + +export const ModalLog = ( + { title, opened, close, data }: + { + title: string, + opened: boolean, + close: () => void, + data: string, + } +) => { + return + + {data} + + +} \ No newline at end of file diff --git a/frontend/src/components/NFProxy/ExceptionWarning.tsx b/frontend/src/components/NFProxy/ExceptionWarning.tsx new file mode 100644 index 0000000..64886b3 --- /dev/null +++ b/frontend/src/components/NFProxy/ExceptionWarning.tsx @@ -0,0 +1,27 @@ +import { IoIosWarning } from "react-icons/io" +import { socketio, WARNING_NFPROXY_TIME_LIMIT } from "../../js/utils" +import { Tooltip } from "@mantine/core" +import { useEffect, useState } from "react" + + +export const ExceptionWarning = ({ service_id }: { service_id: string }) => { + const [lastExceptionTimestamp, setLastExceptionTimestamp] = useState(0) + + useEffect(() => { + socketio.emit("nfproxy-exception-join", { service: service_id }); + socketio.on(`nfproxy-exception-${service_id}`, (data) => { + setLastExceptionTimestamp(data) + }); + return () => { + socketio.emit("nfproxy-exception-leave", { service: service_id }); + } + }, []) + + return <> + {(new Date().getTime()-lastExceptionTimestamp <= WARNING_NFPROXY_TIME_LIMIT)? + + + + :null} + +} \ No newline at end of file diff --git a/frontend/src/components/NFProxy/ServiceRow/index.tsx b/frontend/src/components/NFProxy/ServiceRow/index.tsx index 5943bb7..f90627e 100644 --- a/frontend/src/components/NFProxy/ServiceRow/index.tsx +++ b/frontend/src/components/NFProxy/ServiceRow/index.tsx @@ -15,6 +15,7 @@ import { FaFilter } from "react-icons/fa"; import { IoSettingsSharp } from 'react-icons/io5'; import AddEditService from '../AddEditService'; import { FaPencilAlt } from "react-icons/fa"; +import { ExceptionWarning } from '../ExceptionWarning'; export default function ServiceRow({ service, onClick }:{ service:Service, onClick?:()=>void }) { @@ -26,7 +27,6 @@ export default function ServiceRow({ service, onClick }:{ service:Service, onCli const queryClient = useQueryClient() const [buttonLoading, setButtonLoading] = useState(false) - const [tooltipStopOpened, setTooltipStopOpened] = useState(false); const [deleteModal, setDeleteModal] = useState(false) const [renameModal, setRenameModal] = useState(false) const [editModal, setEditModal] = useState(false) @@ -109,6 +109,8 @@ export default function ServiceRow({ service, onClick }:{ service:Service, onCli {isMedium?:} + + Edit service } onClick={()=>setEditModal(true)}>Service Settings @@ -118,13 +120,11 @@ export default function ServiceRow({ service, onClick }:{ service:Service, onCli } onClick={()=>setDeleteModal(true)}>Delete Service - + setTooltipStopOpened(false)} onBlur={() => setTooltipStopOpened(false)} - onMouseEnter={() => setTooltipStopOpened(true)} onMouseLeave={() => setTooltipStopOpened(false)}> + aria-describedby="tooltip-stop-id"> diff --git a/frontend/src/components/NFRegex/ServiceRow/index.tsx b/frontend/src/components/NFRegex/ServiceRow/index.tsx index 53a5c1b..9086d54 100644 --- a/frontend/src/components/NFRegex/ServiceRow/index.tsx +++ b/frontend/src/components/NFRegex/ServiceRow/index.tsx @@ -25,7 +25,6 @@ export default function ServiceRow({ service, onClick }:{ service:Service, onCli const queryClient = useQueryClient() const [buttonLoading, setButtonLoading] = useState(false) - const [tooltipStopOpened, setTooltipStopOpened] = useState(false); const [deleteModal, setDeleteModal] = useState(false) const [renameModal, setRenameModal] = useState(false) const [editModal, setEditModal] = useState(false) @@ -115,13 +114,11 @@ export default function ServiceRow({ service, onClick }:{ service:Service, onCli } onClick={()=>setDeleteModal(true)}>Delete Service - + setTooltipStopOpened(false)} onBlur={() => setTooltipStopOpened(false)} - onMouseEnter={() => setTooltipStopOpened(true)} onMouseLeave={() => setTooltipStopOpened(false)}> + aria-describedby="tooltip-stop-id"> diff --git a/frontend/src/components/PortHijack/ServiceRow/index.tsx b/frontend/src/components/PortHijack/ServiceRow/index.tsx index 0b47b6b..7b29996 100644 --- a/frontend/src/components/PortHijack/ServiceRow/index.tsx +++ b/frontend/src/components/PortHijack/ServiceRow/index.tsx @@ -1,5 +1,5 @@ import { ActionIcon, Badge, Box, Divider, Menu, Space, Title, Tooltip } from '@mantine/core'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { FaPlay, FaStop } from 'react-icons/fa'; import { porthijack, Service } from '../utils'; import YesNoModal from '../../YesNoModal'; @@ -17,11 +17,9 @@ export default function ServiceRow({ service }:{ service:Service }) { let status_color = service.active ? "teal": "red" const [buttonLoading, setButtonLoading] = useState(false) - const [tooltipStopOpened, setTooltipStopOpened] = useState(false); const [deleteModal, setDeleteModal] = useState(false) const [renameModal, setRenameModal] = useState(false) const [changeDestModal, setChangeDestModal] = useState(false) - const portInputRef = React.createRef() const isMedium = isMediumScreen() const form = useForm({ @@ -113,13 +111,11 @@ export default function ServiceRow({ service }:{ service:Service }) { } onClick={()=>setDeleteModal(true)}>Delete Service - + setTooltipStopOpened(false)} onBlur={() => setTooltipStopOpened(false)} - onMouseEnter={() => setTooltipStopOpened(true)} onMouseLeave={() => setTooltipStopOpened(false)}> + aria-describedby="tooltip-stop-id"> diff --git a/frontend/src/components/PyFilterView/index.tsx b/frontend/src/components/PyFilterView/index.tsx index 3602029..f1c647f 100644 --- a/frontend/src/components/PyFilterView/index.tsx +++ b/frontend/src/components/PyFilterView/index.tsx @@ -9,7 +9,6 @@ import { FaPencilAlt } from 'react-icons/fa'; export default function PyFilterView({ filterInfo }:{ filterInfo:PyFilter }) { - const [statusTooltipOpened, setStatusTooltipOpened] = useState(false); const isMedium = isMediumScreen() const changeRegexStatus = () => { @@ -24,24 +23,22 @@ export default function PyFilterView({ filterInfo }:{ filterInfo:PyFilter }) { return - - - {filterInfo.name} - - - {isMedium?<> - {filterInfo.blocked_packets} + + + {filterInfo.name} + - {filterInfo.edited_packets} - - :null} - - setStatusTooltipOpened(false)} onBlur={() => setStatusTooltipOpened(false)} - onMouseEnter={() => setStatusTooltipOpened(true)} onMouseLeave={() => setStatusTooltipOpened(false)} - >{filterInfo.active?:} - - + {isMedium?<> + {filterInfo.blocked_packets} + + {filterInfo.edited_packets} + + :null} + + + {filterInfo.active?:} + + } diff --git a/frontend/src/components/RegexView/index.tsx b/frontend/src/components/RegexView/index.tsx index 7f72c68..787ae1b 100644 --- a/frontend/src/components/RegexView/index.tsx +++ b/frontend/src/components/RegexView/index.tsx @@ -19,10 +19,7 @@ function RegexView({ regexInfo }:{ regexInfo:RegexFilter }) { let regex_expr = b64decode(regexInfo.regex); const [deleteModal, setDeleteModal] = useState(false); - const [deleteTooltipOpened, setDeleteTooltipOpened] = useState(false); - const [statusTooltipOpened, setStatusTooltipOpened] = useState(false); const clipboard = useClipboard({ timeout: 500 }); - const isMedium = isMediumScreen(); const deleteRegex = () => { nfregex.regexdelete(regexInfo.id).then(res => { @@ -54,18 +51,14 @@ function RegexView({ regexInfo }:{ regexInfo:RegexFilter }) { }}>{regex_expr} - + setStatusTooltipOpened(false)} onBlur={() => setStatusTooltipOpened(false)} - onMouseEnter={() => setStatusTooltipOpened(true)} onMouseLeave={() => setStatusTooltipOpened(false)} >{regexInfo.active?:} - - setDeleteModal(true)} size="xl" radius="md" variant="filled" - onFocus={() => setDeleteTooltipOpened(false)} onBlur={() => setDeleteTooltipOpened(false)} - onMouseEnter={() => setDeleteTooltipOpened(true)} onMouseLeave={() => setDeleteTooltipOpened(false)} - > + + setDeleteModal(true)} size="xl" radius="md" variant="filled"> + diff --git a/frontend/src/js/utils.tsx b/frontend/src/js/utils.tsx index 39cbdc9..20c7527 100644 --- a/frontend/src/js/utils.tsx +++ b/frontend/src/js/utils.tsx @@ -2,12 +2,11 @@ import { showNotification } from "@mantine/notifications"; import { ImCross } from "react-icons/im"; import { TiTick } from "react-icons/ti" import { Navigate } from "react-router-dom"; -import { nfregex } from "../components/NFRegex/utils"; import { ChangePassword, IpInterface, LoginResponse, PasswordSend, ServerResponse, ServerResponseToken, ServerStatusResponse } from "./models"; import { Buffer } from "buffer" import { QueryClient, useQuery } from "@tanstack/react-query"; import { useMediaQuery } from "@mantine/hooks"; -import { nfproxy } from "../components/NFProxy/utils"; +import { io } from "socket.io-client"; export const IS_DEV = import.meta.env.DEV @@ -19,6 +18,24 @@ export const regex_port = "^([1-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}| export const regex_range_port = "^(([1-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(-([1-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])?)?)?$" export const DEV_IP_BACKEND = "127.0.0.1:4444" +export const WARNING_NFPROXY_TIME_LIMIT = 1000*60*10 // 10 minutes + +export const socketio = import.meta.env.DEV? + io("ws://"+DEV_IP_BACKEND, { + path:"/sock/socket.io", + transports: ['websocket'], + auth: { + token: localStorage.getItem("access_token") + } + }): + io({ + path:"/sock/socket.io", + transports: ['websocket'], + auth: { + token: localStorage.getItem("access_token") + } + }) + export const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: Infinity } }}) diff --git a/frontend/src/pages/Firewall/index.tsx b/frontend/src/pages/Firewall/index.tsx index 1517e97..3a26aa1 100644 --- a/frontend/src/pages/Firewall/index.tsx +++ b/frontend/src/pages/Firewall/index.tsx @@ -25,12 +25,7 @@ import { PiWallLight } from "react-icons/pi"; export const Firewall = () => { - const [tooltipAddOpened, setTooltipAddOpened] = useState(false); - const [tooltipRefreshOpened, setTooltipRefreshOpened] = useState(false); - const [tooltipApplyOpened, setTooltipApplyOpened] = useState(false); - const [tooltipSettingsOpened, setTooltipSettingsOpened] = useState(false); const [currentPolicy, setCurrentPolicy] = useState(ActionType.ACCEPT) - const [tooltipAddRulOpened, setTooltipAddRulOpened] = useState(false) const queryClient = useQueryClient() const rules = firewallRulesQuery() const [state, handlers] = useListState([]); @@ -364,31 +359,22 @@ export const Firewall = () => { Rules: {rules.isLoading?0:rules.data?.rules.length} - - setTooltipAddOpened(false)} onBlur={() => setTooltipAddOpened(false)} - onMouseEnter={() => setTooltipAddOpened(true)} onMouseLeave={() => setTooltipAddOpened(false)}> + + - + queryClient.invalidateQueries(["firewall"])} size="lg" radius="md" variant="filled" - loading={rules.isFetching} - onFocus={() => setTooltipRefreshOpened(false)} onBlur={() => setTooltipRefreshOpened(false)} - onMouseEnter={() => setTooltipRefreshOpened(true)} onMouseLeave={() => setTooltipRefreshOpened(false)}> + loading={rules.isFetching}> - - setSettingsModal(true)} size="lg" radius="md" variant="filled" - onFocus={() => setTooltipSettingsOpened(false)} onBlur={() => setTooltipSettingsOpened(false)} - onMouseEnter={() => setTooltipSettingsOpened(true)} onMouseLeave={() => setTooltipSettingsOpened(false)}> + + setSettingsModal(true)} size="lg" radius="md" variant="filled"> - - setTooltipApplyOpened(false)} onBlur={() => setTooltipApplyOpened(false)} - onMouseEnter={() => setTooltipApplyOpened(true)} onMouseLeave={() => setTooltipApplyOpened(false)} - disabled={!valuesChanged} - > + + + @@ -424,10 +410,9 @@ export const Firewall = () => { No rule found! Add one clicking the "+" buttons - - setTooltipAddRulOpened(false)} onBlur={() => setTooltipAddRulOpened(false)} - onMouseEnter={() => setTooltipAddRulOpened(true)} onMouseLeave={() => setTooltipAddRulOpened(false)}> + + + } diff --git a/frontend/src/pages/NFProxy/ServiceDetails.tsx b/frontend/src/pages/NFProxy/ServiceDetails.tsx index 855900e..d642541 100644 --- a/frontend/src/pages/NFProxy/ServiceDetails.tsx +++ b/frontend/src/pages/NFProxy/ServiceDetails.tsx @@ -1,12 +1,12 @@ import { ActionIcon, Box, Code, Grid, LoadingOverlay, Space, Title, Tooltip } from '@mantine/core'; import { Navigate, useNavigate, useParams } from 'react-router-dom'; import { Badge, Divider, Menu } from '@mantine/core'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { FaFilter, FaPencilAlt, FaPlay, FaStop } from 'react-icons/fa'; import { nfproxy, nfproxyServiceFilterCodeQuery, nfproxyServicePyfiltersQuery, nfproxyServiceQuery, serviceQueryKey } from '../../components/NFProxy/utils'; import { MdDoubleArrow } from "react-icons/md" import YesNoModal from '../../components/YesNoModal'; -import { errorNotify, isMediumScreen, okNotify, regex_ipv4 } from '../../js/utils'; +import { errorNotify, isMediumScreen, okNotify, regex_ipv4, socketio } from '../../js/utils'; import { BsTrashFill } from 'react-icons/bs'; import { BiRename } from 'react-icons/bi' import RenameForm from '../../components/NFProxy/ServiceRow/RenameForm'; @@ -19,6 +19,10 @@ import PyFilterView from '../../components/PyFilterView'; import { TbPlugConnected } from 'react-icons/tb'; import { CodeHighlight } from '@mantine/code-highlight'; import { FaPython } from "react-icons/fa"; +import { FiFileText } from "react-icons/fi"; +import { ModalLog } from '../../components/ModalLog'; +import { useListState } from '@mantine/hooks'; +import { ExceptionWarning } from '../../components/NFProxy/ExceptionWarning'; export default function ServiceDetailsNFProxy() { @@ -31,11 +35,30 @@ export default function ServiceDetailsNFProxy() { const [editModal, setEditModal] = useState(false) const [buttonLoading, setButtonLoading] = useState(false) const queryClient = useQueryClient() - const [tooltipStopOpened, setTooltipStopOpened] = useState(false); - const [tooltipBackOpened, setTooltipBackOpened] = useState(false); const filterCode = nfproxyServiceFilterCodeQuery(srv??"") const navigate = useNavigate() const isMedium = isMediumScreen() + const [openLogModal, setOpenLogModal] = useState(false) + const [logData, logDataSetters] = useListState([]); + + + useEffect(()=>{ + if (srv){ + if (openLogModal){ + socketio.emit("nfproxy-outstream-join", { service: srv }); + socketio.on(`nfproxy-outstream-${srv}`, (data) => { + logDataSetters.append(data) + }); + }else{ + logDataSetters.setState([]) + socketio.emit("nfproxy-outstream-leave", { service: srv }); + } + return () => { + logDataSetters.setState([]) + socketio.emit("nfproxy-outstream-leave", { service: srv }); + } + } + }, [openLogModal, srv]) if (services.isLoading) return if (!srv || !serviceInfo || filtersList.isError) return @@ -101,6 +124,8 @@ export default function ServiceDetailsNFProxy() { {isMedium?null:} + + {serviceInfo.status} @@ -115,7 +140,13 @@ export default function ServiceDetailsNFProxy() { Danger zone } onClick={()=>setDeleteModal(true)}>Delete Service - + + + + setOpenLogModal(true)} loading={buttonLoading} variant="filled"> + + + {isMedium?null:} @@ -133,23 +164,19 @@ export default function ServiceDetailsNFProxy() { {isMedium?null:} - + navigate("/")} size="xl" radius="md" variant="filled" - aria-describedby="tooltip-back-id" - onFocus={() => setTooltipBackOpened(false)} onBlur={() => setTooltipBackOpened(false)} - onMouseEnter={() => setTooltipBackOpened(true)} onMouseLeave={() => setTooltipBackOpened(false)}> + aria-describedby="tooltip-back-id"> - + setTooltipStopOpened(false)} onBlur={() => setTooltipStopOpened(false)} - onMouseEnter={() => setTooltipStopOpened(true)} onMouseLeave={() => setTooltipStopOpened(false)}> + aria-describedby="tooltip-stop-id"> @@ -177,7 +204,7 @@ export default function ServiceDetailsNFProxy() { Install the firegex client:<Space w="xs" /><Code mb={-4} >pip install fgex</Code> Then run the command:<Space w="xs" /><Code mb={-4} >fgex nfproxy</Code> - :<>{filtersList.data?.map( (filterInfo) => )} + :<>{filtersList.data?.map( (filterInfo) => )} } setEditModal(false)} edit={serviceInfo} /> + setOpenLogModal(false)} + title={`Logs for service ${serviceInfo.name}`} + data={logData.join("")} + /> } diff --git a/frontend/src/pages/NFProxy/index.tsx b/frontend/src/pages/NFProxy/index.tsx index 0bb4a1f..bdd9edd 100644 --- a/frontend/src/pages/NFProxy/index.tsx +++ b/frontend/src/pages/NFProxy/index.tsx @@ -20,9 +20,6 @@ export default function NFProxy({ children }: { children: any }) { const [open, setOpen] = useState(false); const {srv} = useParams() const queryClient = useQueryClient() - const [tooltipRefreshOpened, setTooltipRefreshOpened] = useState(false); - const [tooltipAddServOpened, setTooltipAddServOpened] = useState(false); - const [tooltipAddOpened, setTooltipAddOpened] = useState(false); const isMedium = isMediumScreen() const services = nfproxyServiceQuery() const fileDialog = useFileDialog({ @@ -116,27 +113,22 @@ export default function NFProxy({ children }: { children: any }) { {isMedium?null:} { srv? - - setTooltipAddOpened(false)} onBlur={() => setTooltipAddOpened(false)} - onMouseEnter={() => setTooltipAddOpened(true)} - onMouseLeave={() => setTooltipAddOpened(false)} onClick={fileDialog.open}> - + + + - : - setOpen(true)} size="lg" radius="md" variant="filled" - onFocus={() => setTooltipAddOpened(false)} onBlur={() => setTooltipAddOpened(false)} - onMouseEnter={() => setTooltipAddOpened(true)} onMouseLeave={() => setTooltipAddOpened(false)}> + : + setOpen(true)} size="lg" radius="md" variant="filled"> + + } - - queryClient.invalidateQueries(["nfproxy"])} size="lg" radius="md" variant="filled" - loading={services.isFetching} - onFocus={() => setTooltipRefreshOpened(false)} onBlur={() => setTooltipRefreshOpened(false)} - onMouseEnter={() => setTooltipRefreshOpened(true)} onMouseLeave={() => setTooltipRefreshOpened(false)}> + + queryClient.invalidateQueries(["nfproxy"])} size="lg" radius="md" variant="filled" loading={services.isFetching}> + + @@ -148,10 +140,10 @@ export default function NFProxy({ children }: { children: any }) { navigator("/nfproxy/"+srv.service_id) }} />):<> No services found! Add one clicking the "+" buttons - - setOpen(true)} size="xl" radius="md" variant="filled" - onFocus={() => setTooltipAddServOpened(false)} onBlur={() => setTooltipAddServOpened(false)} - onMouseEnter={() => setTooltipAddServOpened(true)} onMouseLeave={() => setTooltipAddServOpened(false)}> + + setOpen(true)} size="xl" radius="md" variant="filled"> + + } diff --git a/frontend/src/pages/NFRegex/ServiceDetails.tsx b/frontend/src/pages/NFRegex/ServiceDetails.tsx index bb6255f..7b3b806 100644 --- a/frontend/src/pages/NFRegex/ServiceDetails.tsx +++ b/frontend/src/pages/NFRegex/ServiceDetails.tsx @@ -27,15 +27,12 @@ export default function ServiceDetailsNFRegex() { const [open, setOpen] = useState(false) const services = nfregexServiceQuery() const serviceInfo = services.data?.find(s => s.service_id == srv) - const [tooltipAddRegexOpened, setTooltipAddRegexOpened] = useState(false) const regexesList = nfregexServiceRegexesQuery(srv??"") const [deleteModal, setDeleteModal] = useState(false) const [renameModal, setRenameModal] = useState(false) const [editModal, setEditModal] = useState(false) const [buttonLoading, setButtonLoading] = useState(false) const queryClient = useQueryClient() - const [tooltipStopOpened, setTooltipStopOpened] = useState(false); - const [tooltipBackOpened, setTooltipBackOpened] = useState(false); const navigate = useNavigate() const isMedium = isMediumScreen() @@ -133,23 +130,19 @@ export default function ServiceDetailsNFRegex() { {isMedium?null:} - + navigate("/")} size="xl" radius="md" variant="filled" - aria-describedby="tooltip-back-id" - onFocus={() => setTooltipBackOpened(false)} onBlur={() => setTooltipBackOpened(false)} - onMouseEnter={() => setTooltipBackOpened(true)} onMouseLeave={() => setTooltipBackOpened(false)}> + aria-describedby="tooltip-back-id"> - + setTooltipStopOpened(false)} onBlur={() => setTooltipStopOpened(false)} - onMouseEnter={() => setTooltipStopOpened(true)} onMouseLeave={() => setTooltipStopOpened(false)}> + aria-describedby="tooltip-stop-id"> @@ -168,11 +161,9 @@ export default function ServiceDetailsNFRegex() { No regex found for this service! Add one by clicking the "+" buttons - + setOpen(true)} size="xl" radius="md" variant="filled" - aria-describedby="tooltip-AddRegex-id" - onFocus={() => setTooltipAddRegexOpened(false)} onBlur={() => setTooltipAddRegexOpened(false)} - onMouseEnter={() => setTooltipAddRegexOpened(true)} onMouseLeave={() => setTooltipAddRegexOpened(false)}> + aria-describedby="tooltip-AddRegex-id"> : diff --git a/frontend/src/pages/NFRegex/index.tsx b/frontend/src/pages/NFRegex/index.tsx index 83ec802..f5df64d 100644 --- a/frontend/src/pages/NFRegex/index.tsx +++ b/frontend/src/pages/NFRegex/index.tsx @@ -19,9 +19,6 @@ function NFRegex({ children }: { children: any }) { const [open, setOpen] = useState(false); const {srv} = useParams() const queryClient = useQueryClient() - const [tooltipRefreshOpened, setTooltipRefreshOpened] = useState(false); - const [tooltipAddServOpened, setTooltipAddServOpened] = useState(false); - const [tooltipAddOpened, setTooltipAddOpened] = useState(false); const isMedium = isMediumScreen() const services = nfregexServiceQuery() @@ -50,23 +47,17 @@ function NFRegex({ children }: { children: any }) { {isMedium?null:} { srv? - - setOpen(true)} size="lg" radius="md" variant="filled" - onFocus={() => setTooltipAddOpened(false)} onBlur={() => setTooltipAddOpened(false)} - onMouseEnter={() => setTooltipAddOpened(true)} onMouseLeave={() => setTooltipAddOpened(false)}> + + setOpen(true)} size="lg" radius="md" variant="filled"> - : - setOpen(true)} size="lg" radius="md" variant="filled" - onFocus={() => setTooltipAddOpened(false)} onBlur={() => setTooltipAddOpened(false)} - onMouseEnter={() => setTooltipAddOpened(true)} onMouseLeave={() => setTooltipAddOpened(false)}> + : + setOpen(true)} size="lg" radius="md" variant="filled"> } - + queryClient.invalidateQueries(["nfregex"])} size="lg" radius="md" variant="filled" - loading={services.isFetching} - onFocus={() => setTooltipRefreshOpened(false)} onBlur={() => setTooltipRefreshOpened(false)} - onMouseEnter={() => setTooltipRefreshOpened(true)} onMouseLeave={() => setTooltipRefreshOpened(false)}> + loading={services.isFetching}> @@ -78,10 +69,8 @@ function NFRegex({ children }: { children: any }) { navigator("/nfregex/"+srv.service_id) }} />):<> No services found! Add one clicking the "+" buttons - - setOpen(true)} size="xl" radius="md" variant="filled" - onFocus={() => setTooltipAddServOpened(false)} onBlur={() => setTooltipAddServOpened(false)} - onMouseEnter={() => setTooltipAddServOpened(true)} onMouseLeave={() => setTooltipAddServOpened(false)}> + + setOpen(true)} size="xl" radius="md" variant="filled"> } diff --git a/frontend/src/pages/PortHijack/index.tsx b/frontend/src/pages/PortHijack/index.tsx index e4f3640..e6fa5ce 100644 --- a/frontend/src/pages/PortHijack/index.tsx +++ b/frontend/src/pages/PortHijack/index.tsx @@ -14,10 +14,7 @@ import { GrDirections } from 'react-icons/gr'; function PortHijack() { const [open, setOpen] = useState(false); - const [tooltipAddServOpened, setTooltipAddServOpened] = useState(false); - const [tooltipAddOpened, setTooltipAddOpened] = useState(false); const queryClient = useQueryClient() - const [tooltipRefreshOpened, setTooltipRefreshOpened] = useState(false); const isMedium = isMediumScreen() const services = porthijackServiceQuery() @@ -37,17 +34,13 @@ function PortHijack() { Services: {services.isLoading?0:services.data?.length} - - setOpen(true)} size="lg" radius="md" variant="filled" - onFocus={() => setTooltipAddOpened(false)} onBlur={() => setTooltipAddOpened(false)} - onMouseEnter={() => setTooltipAddOpened(true)} onMouseLeave={() => setTooltipAddOpened(false)}> + + setOpen(true)} size="lg" radius="md" variant="filled"> - + queryClient.invalidateQueries(["porthijack"])} size="lg" radius="md" variant="filled" - loading={services.isFetching} - onFocus={() => setTooltipRefreshOpened(false)} onBlur={() => setTooltipRefreshOpened(false)} - onMouseEnter={() => setTooltipRefreshOpened(true)} onMouseLeave={() => setTooltipRefreshOpened(false)}> + loading={services.isFetching}> @@ -57,10 +50,8 @@ function PortHijack() { {(services.data && services.data.length > 0) ?services.data.map( srv => ):<> No services found! Add one clicking the "+" buttons - - setOpen(true)} size="xl" radius="md" variant="filled" - onFocus={() => setTooltipAddServOpened(false)} onBlur={() => setTooltipAddServOpened(false)} - onMouseEnter={() => setTooltipAddServOpened(true)} onMouseLeave={() => setTooltipAddServOpened(false)}> + + setOpen(true)} size="xl" radius="md" variant="filled"> } diff --git a/tests/benchmark.py b/tests/benchmark.py index 02b5aaa..64ace98 100644 --- a/tests/benchmark.py +++ b/tests/benchmark.py @@ -35,7 +35,7 @@ else: def exit_test(code): if service_id: - server.stop() + server.kill() if(firegex.nf_delete_service(service_id)): puts("Sucessfully deleted service ✔", color=colors.green) else: diff --git a/tests/run_tests.sh b/tests/run_tests.sh index cfe00d9..8812f44 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -27,5 +27,10 @@ python3 ph_test.py -p $PASSWORD -m udp || ERROR=1 echo "Running Port Hijack UDP ipv6" python3 ph_test.py -p $PASSWORD -m udp -6 || ERROR=1 +if [[ "$ERROR" == "0" ]] then + python3 benchmark.py -p $PASSWORD -r 5 -d 1 -s 10 || ERROR=1 +fi + + exit $ERROR From 072745cc06b8027a1df46047c947613df534de71 Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Mon, 3 Mar 2025 20:25:36 +0100 Subject: [PATCH 06/18] code push --- backend/binsrc/classes/nfqueue.cpp | 4 +- backend/binsrc/nfproxy.cpp | 2 +- backend/binsrc/pyproxy/pyproxy.cpp | 37 +- backend/binsrc/pyproxy/settings.cpp | 40 +- backend/binsrc/pyproxy/stream_ctx.cpp | 34 +- backend/modules/nfproxy/firegex.py | 2 +- fgex-lib/firegex/nfproxy/__init__.py | 25 +- .../{internals.py => internals/__init__.py} | 97 ++--- fgex-lib/firegex/nfproxy/internals/data.py | 190 +++++++++ .../firegex/nfproxy/internals/exceptions.py | 3 + fgex-lib/firegex/nfproxy/internals/models.py | 40 ++ fgex-lib/firegex/nfproxy/models/__init__.py | 28 ++ fgex-lib/firegex/nfproxy/models/http.py | 385 ++++++++++++++++++ fgex-lib/firegex/nfproxy/models/tcp.py | 113 +++++ fgex-lib/firegex/nfproxy/params.py | 79 ---- fgex-lib/requirements.txt | 3 +- frontend/src/components/ModalLog.tsx | 4 +- .../components/NFProxy/ExceptionWarning.tsx | 19 +- frontend/src/components/NFProxy/utils.ts | 74 ++++ frontend/src/components/NavBar/index.tsx | 7 +- frontend/src/pages/NFProxy/ServiceDetails.tsx | 17 +- frontend/src/pages/NFProxy/index.tsx | 23 +- 22 files changed, 1020 insertions(+), 206 deletions(-) rename fgex-lib/firegex/nfproxy/{internals.py => internals/__init__.py} (69%) create mode 100644 fgex-lib/firegex/nfproxy/internals/data.py create mode 100644 fgex-lib/firegex/nfproxy/internals/exceptions.py create mode 100644 fgex-lib/firegex/nfproxy/internals/models.py create mode 100644 fgex-lib/firegex/nfproxy/models/__init__.py create mode 100644 fgex-lib/firegex/nfproxy/models/http.py create mode 100644 fgex-lib/firegex/nfproxy/models/tcp.py delete mode 100644 fgex-lib/firegex/nfproxy/params.py diff --git a/backend/binsrc/classes/nfqueue.cpp b/backend/binsrc/classes/nfqueue.cpp index 36d4d9e..02de950 100644 --- a/backend/binsrc/classes/nfqueue.cpp +++ b/backend/binsrc/classes/nfqueue.cpp @@ -364,9 +364,9 @@ class PktRequest { #endif if (tcp && ack_seq_offset && packet.size() != _original_size){ if (is_input){ - ack_seq_offset->in += packet.size() - _original_size; + ack_seq_offset->in += data_size() - _data_original_size; }else{ - ack_seq_offset->out += packet.size() - _original_size; + ack_seq_offset->out += data_size() - _data_original_size; } } nfq_nlmsg_verdict_put(nlh_verdict, ntohl(packet_id), NF_ACCEPT ); diff --git a/backend/binsrc/nfproxy.cpp b/backend/binsrc/nfproxy.cpp index 1d44efc..cbb6c38 100644 --- a/backend/binsrc/nfproxy.cpp +++ b/backend/binsrc/nfproxy.cpp @@ -72,7 +72,7 @@ PyFilterResponse { Every time a packet is received, the packet handler will execute the following code: ```python -firegex.nfproxy.internals.handle_packet() +firegex.nfproxy.internals.handle_packet(globals()) ```` The TCP stream is sorted by libtins using c++ code, but the c++ code is not responsabile di buffer the stream, but only to sort those diff --git a/backend/binsrc/pyproxy/pyproxy.cpp b/backend/binsrc/pyproxy/pyproxy.cpp index 93e7714..2062866 100644 --- a/backend/binsrc/pyproxy/pyproxy.cpp +++ b/backend/binsrc/pyproxy/pyproxy.cpp @@ -34,7 +34,7 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { public: stream_ctx sctx; StreamFollower follower; - PyThreadState * gtstate = nullptr; + PyThreadState * tstate = nullptr; PyInterpreterConfig py_thread_config = { .use_main_obmalloc = 0, @@ -45,15 +45,16 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { .check_multi_interp_extensions = 1, .gil = PyInterpreterConfig_OWN_GIL, }; - PyThreadState *tstate = NULL; NfQueue::PktRequest* pkt; NfQueue::tcp_ack_seq_ctx* current_tcp_ack = nullptr; + PyObject* handle_packet_code = nullptr; + void before_loop() override { PyStatus pystatus; // Create a new interpreter for the thread - gtstate = PyThreadState_New(PyInterpreterState_Main()); - PyEval_AcquireThread(gtstate); + tstate = PyThreadState_New(PyInterpreterState_Main()); + PyEval_AcquireThread(tstate); pystatus = Py_NewInterpreterFromConfig(&tstate, &py_thread_config); if(tstate == nullptr){ cerr << "[fatal] [main] Failed to create new interpreter" << endl; @@ -64,6 +65,12 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { Py_ExitStatusException(pystatus); throw invalid_argument("Failed to create new interpreter (pystatus exc)"); } + + if(!PyGC_IsEnabled()){ + PyGC_Enable(); + } + + handle_packet_code = unmarshal_code(py_handle_packet_code); // Setting callbacks for the stream follower follower.new_stream_callback(bind(on_new_stream, placeholders::_1, this)); follower.stream_termination_callback(bind(on_stream_close, placeholders::_1, this)); @@ -100,11 +107,24 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { if (compiled_code == nullptr){ stream.client_data_callback(nullptr); stream.server_data_callback(nullptr); + stream.ignore_client_data(); + stream.ignore_server_data(); return pkt->accept(); + }else{ + try{ + stream_match = new pyfilter_ctx(compiled_code, handle_packet_code); + }catch(invalid_argument& e){ + cerr << "[error] [filter_action] Failed to create the filter context" << endl; + print_exception_reason(); + sctx.clean_stream_by_id(pkt->sid); + stream.client_data_callback(nullptr); + stream.server_data_callback(nullptr); + stream.ignore_client_data(); + stream.ignore_server_data(); + return pkt->accept(); + } + sctx.streams_ctx.insert_or_assign(pkt->sid, stream_match); } - stream_match = new pyfilter_ctx(compiled_code); - Py_DECREF(compiled_code); - sctx.streams_ctx.insert_or_assign(pkt->sid, stream_match); }else{ stream_match = stream_search->second; } @@ -140,6 +160,8 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { print_exception_reason(); sctx.clean_stream_by_id(pkt->sid); //Free the packet data + stream.ignore_client_data(); + stream.ignore_server_data(); stream.client_data_callback(nullptr); stream.server_data_callback(nullptr); return pkt->accept(); @@ -233,6 +255,7 @@ class PyProxyQueue: public NfQueue::ThreadNfQueue { PyEval_ReleaseThread(tstate); PyThreadState_Clear(tstate); PyThreadState_Delete(tstate); + Py_DECREF(handle_packet_code); sctx.clean(); } diff --git a/backend/binsrc/pyproxy/settings.cpp b/backend/binsrc/pyproxy/settings.cpp index 91b8cc2..6648994 100644 --- a/backend/binsrc/pyproxy/settings.cpp +++ b/backend/binsrc/pyproxy/settings.cpp @@ -16,9 +16,13 @@ namespace PyProxy { class PyCodeConfig; shared_ptr config; -PyObject* py_handle_packet_code = nullptr; UnixClientConnection control_socket; +PyObject* unmarshal_code(string encoded_code){ + if (encoded_code.empty()) return nullptr; + return PyMarshal_ReadObjectFromString(encoded_code.c_str(), encoded_code.size()); +} + class PyCodeConfig{ public: string encoded_code; @@ -32,22 +36,24 @@ class PyCodeConfig{ PyObject* glob = PyDict_New(); PyObject* result = PyEval_EvalCode(compiled_code, glob, glob); Py_DECREF(glob); - if (!result){ + if (PyErr_Occurred()){ PyErr_Print(); Py_DECREF(compiled_code); std::cerr << "[fatal] [main] Failed to execute the code" << endl; throw invalid_argument("Failed to execute the code, maybe an invalid filter code has been provided"); } - Py_DECREF(result); + Py_XDECREF(result); PyObject* code_dump = PyMarshal_WriteObjectToString(compiled_code, 4); Py_DECREF(compiled_code); if (code_dump == nullptr){ - PyErr_Print(); + if (PyErr_Occurred()) + PyErr_Print(); std::cerr << "[fatal] [main] Failed to dump the code" << endl; throw invalid_argument("Failed to dump the code"); } if (!PyBytes_Check(code_dump)){ std::cerr << "[fatal] [main] Failed to dump the code" << endl; + Py_DECREF(code_dump); throw invalid_argument("Failed to dump the code"); } encoded_code = string(PyBytes_AsString(code_dump), PyBytes_Size(code_dump)); @@ -55,8 +61,7 @@ class PyCodeConfig{ } PyObject* compiled_code(){ - if (encoded_code.empty()) return nullptr; - return PyMarshal_ReadObjectFromString(encoded_code.c_str(), encoded_code.size()); + return unmarshal_code(encoded_code); } PyCodeConfig(){} @@ -69,16 +74,27 @@ void init_control_socket(){ control_socket = UnixClientConnection(socket_path); } +string py_handle_packet_code; void init_handle_packet_code(){ - py_handle_packet_code = Py_CompileStringExFlags( - "firegex.nfproxy.internals.handle_packet()\n", "", + PyObject* compiled_code = Py_CompileStringExFlags( + "firegex.nfproxy.internals.handle_packet(globals())\n", "", Py_file_input, NULL, 2); - - if (py_handle_packet_code == nullptr){ - std::cerr << "[fatal] [main] Failed to compile the utility python code (strange behaviour, probably a bug)" << endl; - throw invalid_argument("Failed to compile the code"); + PyObject* code_dump = PyMarshal_WriteObjectToString(compiled_code, 4); + Py_DECREF(compiled_code); + if (code_dump == nullptr){ + if (PyErr_Occurred()) + PyErr_Print(); + std::cerr << "[fatal] [main] Failed to dump the code" << endl; + throw invalid_argument("Failed to dump the code"); } + if (!PyBytes_Check(code_dump)){ + std::cerr << "[fatal] [main] Failed to dump the code" << endl; + Py_DECREF(code_dump); + throw invalid_argument("Failed to dump the code"); + } + py_handle_packet_code = string(PyBytes_AsString(code_dump), PyBytes_Size(code_dump)); + Py_DECREF(code_dump); } }} diff --git a/backend/binsrc/pyproxy/stream_ctx.cpp b/backend/binsrc/pyproxy/stream_ctx.cpp index ba7db5c..f9e2cb4 100644 --- a/backend/binsrc/pyproxy/stream_ctx.cpp +++ b/backend/binsrc/pyproxy/stream_ctx.cpp @@ -55,11 +55,15 @@ typedef Tins::TCPIP::StreamIdentifier stream_id; struct pyfilter_ctx { PyObject * glob = nullptr; + PyObject * py_handle_packet = nullptr; - pyfilter_ctx(PyObject * compiled_code){ + pyfilter_ctx(PyObject * compiled_code, PyObject * handle_packet_code){ + py_handle_packet = handle_packet_code; + Py_INCREF(py_handle_packet); glob = PyDict_New(); PyObject* result = PyEval_EvalCode(compiled_code, glob, glob); - if (!result){ + Py_XDECREF(compiled_code); + if (PyErr_Occurred()){ PyErr_Print(); Py_XDECREF(glob); std::cerr << "[fatal] [main] Failed to compile the code" << endl; @@ -69,7 +73,10 @@ struct pyfilter_ctx { } ~pyfilter_ctx(){ + cerr << "[info] [pyfilter_ctx] Cleaning pyfilter_ctx" << endl; Py_DECREF(glob); + Py_DECREF(py_handle_packet); + PyGC_Collect(); } inline void set_item_to_glob(const char* key, PyObject* value){ @@ -82,14 +89,16 @@ struct pyfilter_ctx { void del_item_from_glob(const char* key){ if (PyDict_DelItemString(glob, key) != 0){ - PyErr_Print(); + if (PyErr_Occurred()) + PyErr_Print(); throw invalid_argument("Failed to delete item from dict"); } } inline void set_item_to_dict(PyObject* dict, const char* key, PyObject* value){ if (PyDict_SetItemString(dict, key, value) != 0){ - PyErr_Print(); + if (PyErr_Occurred()) + PyErr_Print(); throw invalid_argument("Failed to set item to dict"); } Py_DECREF(value); @@ -111,11 +120,18 @@ struct pyfilter_ctx { // Set packet info to the global context set_item_to_glob("__firegex_packet_info", packet_info); - PyObject * result = PyEval_EvalCode(py_handle_packet_code, glob, glob); + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] Calling python with a data of " << data.size() << endl; + #endif + PyObject * result = PyEval_EvalCode(py_handle_packet, glob, glob); + PyGC_Collect(); + #ifdef DEBUG + cerr << "[DEBUG] [handle_packet] End of python call" << endl; + #endif del_item_from_glob("__firegex_packet_info"); - Py_DECREF(packet_info); - if (!result){ + if (PyErr_Occurred()){ + cerr << "[error] [handle_packet] Failed to execute the code " << result << endl; PyErr_Print(); #ifdef DEBUG cerr << "[DEBUG] [handle_packet] Exception raised" << endl; @@ -134,7 +150,9 @@ struct pyfilter_ctx { } if (!PyDict_Check(result)){ - PyErr_Print(); + if (PyErr_Occurred()){ + PyErr_Print(); + } #ifdef DEBUG cerr << "[DEBUG] [handle_packet] Result is not a dict" << endl; #endif diff --git a/backend/modules/nfproxy/firegex.py b/backend/modules/nfproxy/firegex.py index 22c189a..5febad6 100644 --- a/backend/modules/nfproxy/firegex.py +++ b/backend/modules/nfproxy/firegex.py @@ -78,7 +78,7 @@ class FiregexInterceptor: await run_func(self.outstrem_function, self.srv.id, line) async def _start_binary(self): - proxy_binary_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"../cpproxy") + proxy_binary_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../cpproxy")) self.process = await asyncio.create_subprocess_exec( proxy_binary_path, stdin=asyncio.subprocess.DEVNULL, stdout=asyncio.subprocess.PIPE, diff --git a/fgex-lib/firegex/nfproxy/__init__.py b/fgex-lib/firegex/nfproxy/__init__.py index 8948e4c..aaee250 100644 --- a/fgex-lib/firegex/nfproxy/__init__.py +++ b/fgex-lib/firegex/nfproxy/__init__.py @@ -1,23 +1,11 @@ import functools -from firegex.nfproxy.params import RawPacket -from enum import Enum - -class Action(Enum): - ACCEPT = 0 - DROP = 1 - REJECT = 2 - MANGLE = 3 - -class FullStreamAction(Enum): - FLUSH = 0 - ACCEPT = 1 - REJECT = 2 - DROP = 3 +from firegex.nfproxy.models import RawPacket, TCPInputStream, TCPOutputStream, TCPClientStream, TCPServerStream, TCPStreams +from firegex.nfproxy.internals.models import Action, FullStreamAction ACCEPT = Action.ACCEPT DROP = Action.DROP REJECT = Action.REJECT -MANGLE = Action.MANGLE +UNSTABLE_MANGLE = Action.MANGLE def pyfilter(func): """ @@ -45,8 +33,7 @@ def clear_pyfilter_registry(): pyfilter.registry.clear() __all__ = [ - "ACCEPT", "DROP", "REJECT", "MANGLE", "EXCEPTION", "INVALID", - "Action", "FullStreamAction", - "pyfilter", - "RawPacket" + "ACCEPT", "DROP", "REJECT", "UNSTABLE_MANGLE" + "Action", "FullStreamAction", "pyfilter", + "RawPacket", "TCPInputStream", "TCPOutputStream", "TCPClientStream", "TCPServerStream", "TCPStreams" ] \ No newline at end of file diff --git a/fgex-lib/firegex/nfproxy/internals.py b/fgex-lib/firegex/nfproxy/internals/__init__.py similarity index 69% rename from fgex-lib/firegex/nfproxy/internals.py rename to fgex-lib/firegex/nfproxy/internals/__init__.py index cfa9169..cf6d7a5 100644 --- a/fgex-lib/firegex/nfproxy/internals.py +++ b/fgex-lib/firegex/nfproxy/internals/__init__.py @@ -1,60 +1,23 @@ from inspect import signature -from firegex.nfproxy.params import RawPacket, NotReadyToRun -from firegex.nfproxy import Action, FullStreamAction -from dataclasses import dataclass, field +from firegex.nfproxy.internals.models import Action, FullStreamAction +from firegex.nfproxy.internals.models import FilterHandler, PacketHandlerResult +import functools +from firegex.nfproxy.internals.data import DataStreamCtx +from firegex.nfproxy.internals.exceptions import NotReadyToRun +from firegex.nfproxy.internals.data import RawPacket -type_annotations_associations = { - "tcp": { - RawPacket: RawPacket.fetch_from_global - }, - "http": { - RawPacket: RawPacket.fetch_from_global - } -} - -@dataclass -class FilterHandler: - func: callable - name: str - params: dict[type, callable] - proto: str - -class internal_data: - filter_call_info: list[FilterHandler] = [] - stream: list[RawPacket] = [] - stream_size: int = 0 - stream_max_size: int = 1*8e20 - full_stream_action: str = "flush" - filter_glob: dict = {} - -@dataclass -class PacketHandlerResult: - glob: dict = field(repr=False) - action: Action = Action.ACCEPT - matched_by: str = None - mangled_packet: bytes = None - - def set_result(self) -> None: - self.glob["__firegex_pyfilter_result"] = { - "action": self.action.value, - "matched_by": self.matched_by, - "mangled_packet": self.mangled_packet - } - - def reset_result(self) -> None: - self.glob["__firegex_pyfilter_result"] = None - -def context_call(func, *args, **kargs): - internal_data.filter_glob["__firegex_tmp_args"] = args - internal_data.filter_glob["__firegex_tmp_kargs"] = kargs - internal_data.filter_glob["__firege_tmp_call"] = func - res = eval("__firege_tmp_call(*__firegex_tmp_args, **__firegex_tmp_kargs)", internal_data.filter_glob, internal_data.filter_glob) - del internal_data.filter_glob["__firegex_tmp_args"] - del internal_data.filter_glob["__firegex_tmp_kargs"] - del internal_data.filter_glob["__firege_tmp_call"] +def context_call(glob, func, *args, **kargs): + glob["__firegex_tmp_args"] = args + glob["__firegex_tmp_kargs"] = kargs + glob["__firege_tmp_call"] = func + res = eval("__firege_tmp_call(*__firegex_tmp_args, **__firegex_tmp_kargs)", glob, glob) + del glob["__firegex_tmp_args"] + del glob["__firegex_tmp_kargs"] + del glob["__firege_tmp_call"] return res def generate_filter_structure(filters: list[str], proto:str, glob:dict) -> list[FilterHandler]: + from firegex.nfproxy.models import type_annotations_associations if proto not in type_annotations_associations.keys(): raise Exception("Invalid protocol") res = [] @@ -103,22 +66,27 @@ def get_filters_info(code:str, proto:str) -> list[FilterHandler]: def get_filter_names(code:str, proto:str) -> list[str]: return [ele.name for ele in get_filters_info(code, proto)] -def handle_packet() -> None: +def handle_packet(glob: dict) -> None: + internal_data = DataStreamCtx(glob) + print("I'm here", flush=True) cache_call = {} # Cache of the data handler calls - pkt_info = RawPacket.fetch_from_global(internal_data.filter_glob) + pkt_info = RawPacket._fetch_packet(internal_data) + internal_data.current_pkt = pkt_info cache_call[RawPacket] = pkt_info final_result = Action.ACCEPT data_size = len(pkt_info.data) - result = PacketHandlerResult(internal_data.filter_glob) + result = PacketHandlerResult(glob) if internal_data.stream_size+data_size > internal_data.stream_max_size: match internal_data.full_stream_action: case FullStreamAction.FLUSH: internal_data.stream = [] internal_data.stream_size = 0 + for func in internal_data.flush_action_set: + func() case FullStreamAction.ACCEPT: result.action = Action.ACCEPT return result.set_result() @@ -138,17 +106,19 @@ def handle_packet() -> None: mangled_packet = None for filter in internal_data.filter_call_info: final_params = [] + skip_call = False for data_type, data_func in filter.params.items(): if data_type not in cache_call.keys(): try: - cache_call[data_type] = data_func(internal_data.filter_glob) + cache_call[data_type] = data_func(internal_data) except NotReadyToRun: cache_call[data_type] = None - if cache_call[data_type] is None: - continue # Parsing raised NotReadyToRun, skip filter + skip_call = True + break final_params.append(cache_call[data_type]) - - res = context_call(filter.func, *final_params) + if skip_call: + continue + res = context_call(glob, filter.func, *final_params) if res is None: continue #ACCEPTED @@ -168,8 +138,10 @@ def handle_packet() -> None: return result.set_result() -def compile(glob:dict) -> None: - internal_data.filter_glob = glob +def compile(glob:dict) -> None: + internal_data = DataStreamCtx(glob) + + glob["print"] = functools.partial(print, flush = True) filters = glob["__firegex_pyfilter_enabled"] proto = glob["__firegex_proto"] @@ -187,3 +159,4 @@ def compile(glob:dict) -> None: internal_data.full_stream_action = FullStreamAction.FLUSH PacketHandlerResult(glob).reset_result() + diff --git a/fgex-lib/firegex/nfproxy/internals/data.py b/fgex-lib/firegex/nfproxy/internals/data.py new file mode 100644 index 0000000..0f4ff00 --- /dev/null +++ b/fgex-lib/firegex/nfproxy/internals/data.py @@ -0,0 +1,190 @@ +from firegex.nfproxy.internals.models import FilterHandler +from typing import Callable + +class RawPacket: + """ + class rapresentation of the nfqueue packet sent in this context by the c++ core + """ + + def __init__(self, + data: bytes, + raw_packet: bytes, + is_input: bool, + is_ipv6: bool, + is_tcp: bool, + l4_size: int, + ): + self.__data = bytes(data) + self.__raw_packet = bytes(raw_packet) + self.__is_input = bool(is_input) + self.__is_ipv6 = bool(is_ipv6) + self.__is_tcp = bool(is_tcp) + self.__l4_size = int(l4_size) + self.__raw_packet_header_size = len(self.__raw_packet)-self.__l4_size + + @property + def is_input(self) -> bool: + return self.__is_input + + @property + def is_ipv6(self) -> bool: + return self.__is_ipv6 + + @property + def is_tcp(self) -> bool: + return self.__is_tcp + + @property + def data(self) -> bytes: + return self.__data + + @property + def l4_size(self) -> int: + return self.__l4_size + + @property + def raw_packet_header_len(self) -> int: + return self.__raw_packet_header_size + + @property + def l4_data(self) -> bytes: + return self.__raw_packet[self.raw_packet_header_len:] + + @l4_data.setter + def l4_data(self, v:bytes): + if not isinstance(v, bytes): + raise Exception("Invalid data type, data MUST be of type bytes") + #if len(v) != self.__l4_size: + # raise Exception("Invalid data size, must be equal to the original packet header size (due to a technical limitation)") + self.__raw_packet = self.__raw_packet[:self.raw_packet_header_len]+v + self.__l4_size = len(v) + + @property + def raw_packet(self) -> bytes: + return self.__raw_packet + + @raw_packet.setter + def raw_packet(self, v:bytes): + if not isinstance(v, bytes): + raise Exception("Invalid data type, data MUST be of type bytes") + #if len(v) != len(self.__raw_packet): + # raise Exception("Invalid data size, must be equal to the original packet size (due to a technical limitation)") + if len(v) < self.raw_packet_header_len: + raise Exception("Invalid data size, must be greater than the original packet header size") + self.__raw_packet = v + self.__l4_size = len(v)-self.raw_packet_header_len + + @classmethod + def _fetch_packet(cls, internal_data): + from firegex.nfproxy.internals.data import DataStreamCtx + if not isinstance(internal_data, DataStreamCtx): + if isinstance(internal_data, dict): + internal_data = DataStreamCtx(internal_data) + else: + raise Exception("Invalid data type, data MUST be of type DataStream, or glob dict") + + if "__firegex_packet_info" not in internal_data.filter_glob.keys(): + raise Exception("Packet info not found") + return cls(**internal_data.filter_glob["__firegex_packet_info"]) + + def __repr__(self): + return f"RawPacket(data={self.data}, raw_packet={self.raw_packet}, is_input={self.is_input}, is_ipv6={self.is_ipv6}, is_tcp={self.is_tcp}, l4_size={self.l4_size})" + + +class DataStreamCtx: + + def __init__(self, glob: dict): + if "__firegex_pyfilter_ctx" not in glob.keys(): + glob["__firegex_pyfilter_ctx"] = {} + self.__data = glob["__firegex_pyfilter_ctx"] + self.filter_glob = glob + + @property + def filter_call_info(self) -> list[FilterHandler]: + if "filter_call_info" not in self.__data.keys(): + self.__data["filter_call_info"] = [] + return self.__data.get("filter_call_info") + + @filter_call_info.setter + def filter_call_info(self, v: list[FilterHandler]): + self.__data["filter_call_info"] = v + + @property + def stream(self) -> list[RawPacket]: + if "stream" not in self.__data.keys(): + self.__data["stream"] = [] + return self.__data.get("stream") + + @stream.setter + def stream(self, v: list[RawPacket]): + self.__data["stream"] = v + + @property + def stream_size(self) -> int: + if "stream_size" not in self.__data.keys(): + self.__data["stream_size"] = 0 + return self.__data.get("stream_size") + + @stream_size.setter + def stream_size(self, v: int): + self.__data["stream_size"] = v + + @property + def stream_max_size(self) -> int: + if "stream_max_size" not in self.__data.keys(): + self.__data["stream_max_size"] = 1*8e20 + return self.__data.get("stream_max_size") + + @stream_max_size.setter + def stream_max_size(self, v: int): + self.__data["stream_max_size"] = v + + @property + def full_stream_action(self) -> str: + if "full_stream_action" not in self.__data.keys(): + self.__data["full_stream_action"] = "flush" + return self.__data.get("full_stream_action") + + @full_stream_action.setter + def full_stream_action(self, v: str): + self.__data["full_stream_action"] = v + + @property + def current_pkt(self) -> RawPacket: + return self.__data.get("current_pkt", None) + + @current_pkt.setter + def current_pkt(self, v: RawPacket): + self.__data["current_pkt"] = v + + @property + def http_data_objects(self) -> dict: + if "http_data_objects" not in self.__data.keys(): + self.__data["http_data_objects"] = {} + return self.__data.get("http_data_objects") + + @http_data_objects.setter + def http_data_objects(self, v: dict): + self.__data["http_data_objects"] = v + + @property + def save_http_data_in_streams(self) -> bool: + if "save_http_data_in_streams" not in self.__data.keys(): + self.__data["save_http_data_in_streams"] = False + return self.__data.get("save_http_data_in_streams") + + @save_http_data_in_streams.setter + def save_http_data_in_streams(self, v: bool): + self.__data["save_http_data_in_streams"] = v + + @property + def flush_action_set(self) -> set[Callable]: + if "flush_action_set" not in self.__data.keys(): + self.__data["flush_action_set"] = set() + return self.__data.get("flush_action_set") + + @flush_action_set.setter + def flush_action_set(self, v: set[Callable]): + self.__data["flush_action_set"] = v + + diff --git a/fgex-lib/firegex/nfproxy/internals/exceptions.py b/fgex-lib/firegex/nfproxy/internals/exceptions.py new file mode 100644 index 0000000..6084bf1 --- /dev/null +++ b/fgex-lib/firegex/nfproxy/internals/exceptions.py @@ -0,0 +1,3 @@ + +class NotReadyToRun(Exception): + "raise this exception if the stream state is not ready to parse this object, the call will be skipped" diff --git a/fgex-lib/firegex/nfproxy/internals/models.py b/fgex-lib/firegex/nfproxy/internals/models.py new file mode 100644 index 0000000..86c1819 --- /dev/null +++ b/fgex-lib/firegex/nfproxy/internals/models.py @@ -0,0 +1,40 @@ +from dataclasses import dataclass, field +from enum import Enum + +class Action(Enum): + ACCEPT = 0 + DROP = 1 + REJECT = 2 + MANGLE = 3 + +class FullStreamAction(Enum): + FLUSH = 0 + ACCEPT = 1 + REJECT = 2 + DROP = 3 + +@dataclass +class FilterHandler: + func: callable + name: str + params: dict[type, callable] + proto: str + +@dataclass +class PacketHandlerResult: + glob: dict = field(repr=False) + action: Action = Action.ACCEPT + matched_by: str = None + mangled_packet: bytes = None + + def set_result(self) -> None: + self.glob["__firegex_pyfilter_result"] = { + "action": self.action.value, + "matched_by": self.matched_by, + "mangled_packet": self.mangled_packet + } + + def reset_result(self) -> None: + self.glob["__firegex_pyfilter_result"] = None + + diff --git a/fgex-lib/firegex/nfproxy/models/__init__.py b/fgex-lib/firegex/nfproxy/models/__init__.py new file mode 100644 index 0000000..dc28830 --- /dev/null +++ b/fgex-lib/firegex/nfproxy/models/__init__.py @@ -0,0 +1,28 @@ +from firegex.nfproxy.models.tcp import TCPInputStream, TCPOutputStream, TCPClientStream, TCPServerStream, TCPStreams +from firegex.nfproxy.models.http import HttpRequest, HttpResponse, HttpRequestHeader, HttpResponseHeader +from firegex.nfproxy.internals.data import RawPacket + +type_annotations_associations = { + "tcp": { + RawPacket: RawPacket._fetch_packet, + TCPInputStream: TCPInputStream._fetch_packet, + TCPOutputStream: TCPOutputStream._fetch_packet, + TCPStreams: TCPStreams._fetch_packet, + }, + "http": { + RawPacket: RawPacket._fetch_packet, + TCPInputStream: TCPInputStream._fetch_packet, + TCPOutputStream: TCPOutputStream._fetch_packet, + TCPStreams: TCPStreams._fetch_packet, + HttpRequest: HttpRequest._fetch_packet, + HttpResponse: HttpResponse._fetch_packet, + HttpRequestHeader: HttpRequestHeader._fetch_packet, + HttpResponseHeader: HttpResponseHeader._fetch_packet, + } +} + +__all__ = [ + "RawPacket", + "TCPInputStream", "TCPOutputStream", "TCPClientStream", "TCPServerStream", "TCPStreams", + "HttpRequest", "HttpResponse", "HttpRequestHeader", "HttpResponseHeader", +] \ No newline at end of file diff --git a/fgex-lib/firegex/nfproxy/models/http.py b/fgex-lib/firegex/nfproxy/models/http.py new file mode 100644 index 0000000..bfe1c05 --- /dev/null +++ b/fgex-lib/firegex/nfproxy/models/http.py @@ -0,0 +1,385 @@ +import pyllhttp +from firegex.nfproxy.internals.exceptions import NotReadyToRun +from firegex.nfproxy.internals.data import DataStreamCtx + +class InternalCallbackHandler(): + + url: str|None = None + _url_buffer: bytes = b"" + headers: dict[str, str] = {} + _header_fields: dict[bytes, bytes] = {} + has_begun: bool = False + body: bytes = None + _body_buffer: bytes = b"" + headers_complete: bool = False + message_complete: bool = False + status: str|None = None + _status_buffer: bytes = b"" + current_header_field = None + current_header_value = None + _save_body = True + + def on_message_begin(self): + self.has_begun = True + + def on_url(self, url): + self._url_buffer += url + + def on_url_complete(self): + self.url = self._url_buffer.decode(errors="ignore") + self._url_buffer = None + + def on_header_field(self, field): + if self.current_header_field is None: + self.current_header_field = bytearray(field) + else: + self.current_header_field += field + + def on_header_field_complete(self): + self.current_header_field = self.current_header_field + + def on_header_value(self, value): + if self.current_header_value is None: + self.current_header_value = bytearray(value) + else: + self.current_header_value += value + + def on_header_value_complete(self): + if self.current_header_value is not None and self.current_header_field is not None: + self._header_fields[self.current_header_field.decode(errors="ignore")] = self.current_header_value.decode(errors="ignore") + self.current_header_field = None + self.current_header_value = None + + def on_headers_complete(self): + self.headers_complete = True + self.headers = self._header_fields + self._header_fields = {} + self.current_header_field = None + self.current_header_value = None + + def on_body(self, body: bytes): + if self._save_body: + self._body_buffer += body + + def on_message_complete(self): + self.body = self._body_buffer + self._body_buffer = b"" + self.message_complete = True + + def on_status(self, status: bytes): + self._status_buffer += status + + def on_status_complete(self): + self.status = self._status_buffer.decode(errors="ignore") + self._status_buffer = b"" + + @property + def keep_alive(self) -> bool: + return self.should_keep_alive + + @property + def should_upgrade(self) -> bool: + return self.is_upgrading + + @property + def http_version(self) -> str: + return f"{self.major}.{self.minor}" + + @property + def method_parsed(self) -> str: + return self.method.decode(errors="ignore") + + @property + def content_length_parsed(self) -> int: + return self.content_length + + +class InternalHttpRequest(InternalCallbackHandler, pyllhttp.Request): + def __init__(self): + super(pyllhttp.Request, self).__init__() + super(InternalCallbackHandler, self).__init__() + +class InternalHttpResponse(InternalCallbackHandler, pyllhttp.Response): + def __init__(self): + super(pyllhttp.Response, self).__init__() + super(InternalCallbackHandler, self).__init__() + +class InternalBasicHttpMetaClass: + + def __init__(self): + self._parser: InternalHttpRequest|InternalHttpResponse + self._headers_were_set = False + self.stream = b"" + self.raised_error = False + + @property + def url(self) -> str|None: + return self._parser.url + + @property + def headers(self) -> dict[str, str]: + return self._parser.headers + + @property + def has_begun(self) -> bool: + return self._parser.has_begun + + @property + def body(self) -> bytes: + return self._parser.body + + @property + def headers_complete(self) -> bool: + return self._parser.headers_complete + + @property + def message_complete(self) -> bool: + return self._parser.message_complete + + @property + def http_version(self) -> str: + return self._parser.http_version + + @property + def keep_alive(self) -> bool: + return self._parser.keep_alive + + @property + def should_upgrade(self) -> bool: + return self._parser.should_upgrade + + @property + def content_length(self) -> int|None: + return self._parser.content_length_parsed + + @property + def method(self) -> str|None: + return self._parser.method_parsed + + def _fetch_current_packet(self, internal_data: DataStreamCtx): + # TODO: if an error is triggered should I reject the connection? + if internal_data.save_http_data_in_streams: # This is a websocket upgrade! + self.stream += internal_data.current_pkt.data + else: + try: + self._parser.execute(internal_data.current_pkt.data) + if self._parser.headers_complete and len(self._parser._body_buffer) == self._parser.content_length_parsed: + self._parser.on_message_complete() + except Exception as e: + self.raised_error = True + raise e + + #It's called the first time if the headers are complete, and second time with body complete + def _callable_checks(self, internal_data: DataStreamCtx): + if self._parser.headers_complete and not self._headers_were_set: + self._headers_were_set = True + return True + return self._parser.message_complete or internal_data.save_http_data_in_streams + + def _before_fetch_callable_checks(self, internal_data: DataStreamCtx): + return True + + def _trigger_remove_data(self, internal_data: DataStreamCtx): + return self.message_complete + + @classmethod + def _fetch_packet(cls, internal_data: DataStreamCtx): + if internal_data.current_pkt is None or internal_data.current_pkt.is_tcp is False: + raise NotReadyToRun() + + datahandler:InternalBasicHttpMetaClass = internal_data.http_data_objects.get(cls, None) + if datahandler is None or datahandler.raised_error: + datahandler = cls() + internal_data.http_data_objects[cls] = datahandler + + if not datahandler._before_fetch_callable_checks(internal_data): + raise NotReadyToRun() + datahandler._fetch_current_packet(internal_data) + if not datahandler._callable_checks(internal_data): + raise NotReadyToRun() + + if datahandler.should_upgrade: + internal_data.save_http_data_in_streams = True + + if datahandler._trigger_remove_data(internal_data): + if internal_data.http_data_objects.get(cls): + del internal_data.http_data_objects[cls] + + return datahandler + +class HttpRequest(InternalBasicHttpMetaClass): + def __init__(self): + super().__init__() + # These will be used in the metaclass + self._parser: InternalHttpRequest = InternalHttpRequest() + self._headers_were_set = False + + @property + def method(self) -> bytes: + return self._parser.method + + def _before_fetch_callable_checks(self, internal_data: DataStreamCtx): + return internal_data.current_pkt.is_input + + def __repr__(self): + return f"" + +class HttpResponse(InternalBasicHttpMetaClass): + def __init__(self): + super().__init__() + self._parser: InternalHttpResponse = InternalHttpResponse() + self._headers_were_set = False + + @property + def status_code(self) -> int: + return self._parser.status + + def _before_fetch_callable_checks(self, internal_data: DataStreamCtx): + return not internal_data.current_pkt.is_input + + def __repr__(self): + return f"" + +class HttpRequestHeader(HttpRequest): + def __init__(self): + super().__init__() + self._parser._save_body = False + + def _callable_checks(self, internal_data: DataStreamCtx): + if self._parser.headers_complete and not self._headers_were_set: + self._headers_were_set = True + return True + return False + +class HttpResponseHeader(HttpResponse): + def __init__(self): + super().__init__() + self._parser._save_body = False + + def _callable_checks(self, internal_data: DataStreamCtx): + if self._parser.headers_complete and not self._headers_were_set: + self._headers_were_set = True + return True + return False + +""" +#TODO include this? + +import codecs + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = "\x00".encode("ascii") # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + +def guess_json_utf(data): + "" + :rtype: str + "" + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return "utf-32" # BOM included + if sample[:3] == codecs.BOM_UTF8: + return "utf-8-sig" # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return "utf-16" # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return "utf-8" + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return "utf-16-be" + if sample[1::2] == _null2: # 2nd and 4th are null + return "utf-16-le" + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return "utf-32-be" + if sample[1:] == _null3: + return "utf-32-le" + # Did not detect a valid UTF-32 ascii-range character + return None + +from http_parser.pyparser import HttpParser +import json +from urllib.parse import parse_qsl +from dataclasses import dataclass + +@dataclass +class HttpMessage(): + fragment: str + headers: dict + method: str + parameters: dict + path: str + query_string: str + raw_body: bytes + status_code: int + url: str + version: str + +class HttpMessageParser(HttpParser): + def __init__(self, data:bytes, decompress_body=True): + super().__init__(decompress = decompress_body) + self.execute(data, len(data)) + self._parameters = {} + try: + self._parse_parameters() + except Exception as e: + print("Error in parameters parsing:", data) + print("Exception:", str(e)) + + def get_raw_body(self): + return b"\r\n".join(self._body) + + def _parse_query_string(self, raw_string): + parameters = parse_qsl(raw_string) + for key,value in parameters: + try: + key = key.decode() + value = value.decode() + except: + pass + if self._parameters.get(key): + if isinstance(self._parameters[key], list): + self._parameters[key].append(value) + else: + self._parameters[key] = [self._parameters[key], value] + else: + self._parameters[key] = value + + def _parse_parameters(self): + if self._method == "POST": + body = self.get_raw_body() + if len(body) == 0: + return + content_type = self.get_headers().get("Content-Type") + if not content_type or "x-www-form-urlencoded" in content_type: + try: + self._parse_query_string(body.decode()) + except: + pass + elif "json" in content_type: + self._parameters = json.loads(body) + elif self._method == "GET": + self._parse_query_string(self._query_string) + + def get_parameters(self): + ""returns parameters parsed from query string or body"" + return self._parameters + + def get_version(self): + if self._version: + return ".".join([str(x) for x in self._version]) + return None + + def to_message(self): + return HttpMessage(self._fragment, self._headers, self._method, + self._parameters, self._path, self._query_string, + self.get_raw_body(), self._status_code, + self._url, self.get_version() + ) +""" \ No newline at end of file diff --git a/fgex-lib/firegex/nfproxy/models/tcp.py b/fgex-lib/firegex/nfproxy/models/tcp.py new file mode 100644 index 0000000..e18671a --- /dev/null +++ b/fgex-lib/firegex/nfproxy/models/tcp.py @@ -0,0 +1,113 @@ +from firegex.nfproxy.internals.data import DataStreamCtx +from firegex.nfproxy.internals.exceptions import NotReadyToRun + +class TCPStreams: + """ + This datamodel will assemble the TCP streams from the input and output data. + The function that use this data model will be handled when: + - The packet is TCP + - At least 1 packet has been sent + """ + + def __init__(self, + input_data: bytes, + output_data: bytes, + is_ipv6: bool, + ): + self.__input_data = bytes(input_data) + self.__output_data = bytes(output_data) + self.__is_ipv6 = bool(is_ipv6) + + @property + def input_data(self) -> bytes: + return self.__input_data + + @property + def output_data(self) -> bytes: + return self.__output_data + + @property + def is_ipv6(self) -> bool: + return self.__is_ipv6 + + @classmethod + def _fetch_packet(cls, internal_data:DataStreamCtx): + + if internal_data.current_pkt is None or internal_data.current_pkt.is_tcp is False: + raise NotReadyToRun() + return cls( + input_data=b"".join([ele.data for ele in internal_data.stream if ele.is_input]), + output_data=b"".join([ele.data for ele in internal_data.stream if not ele.is_input]), + is_ipv6=internal_data.current_pkt.is_ipv6, + ) + + +class TCPInputStream: + """ + This datamodel will assemble the TCP input stream from the client sent data. + The function that use this data model will be handled when: + - The packet is TCP + - At least 1 packet has been sent + - A new client packet has been received + """ + def __init__(self, + data: bytes, + is_ipv6: bool, + ): + self.__data = bytes(data) + self.__is_ipv6 = bool(is_ipv6) + + @property + def data(self) -> bool: + return self.__data + + @property + def is_ipv6(self) -> bool: + return self.__is_ipv6 + + @classmethod + def _fetch_packet(cls, internal_data:DataStreamCtx): + if internal_data.current_pkt is None or internal_data.current_pkt.is_tcp is False or internal_data.current_pkt.is_input is False: + raise NotReadyToRun() + return cls( + data=internal_data.current_pkt.get_related_raw_stream(), + is_ipv6=internal_data.current_pkt.is_ipv6, + ) + +TCPClientStream = TCPInputStream + +class TCPOutputStream: + """ + This datamodel will assemble the TCP output stream from the server sent data. + The function that use this data model will be handled when: + - The packet is TCP + - At least 1 packet has been sent + - A new server packet has been sent + """ + + + def __init__(self, + data: bytes, + is_ipv6: bool, + ): + self.__data = bytes(data) + self.__is_ipv6 = bool(is_ipv6) + + @property + def data(self) -> bool: + return self.__data + + @property + def is_ipv6(self) -> bool: + return self.__is_ipv6 + + @classmethod + def _fetch_packet(cls, internal_data:DataStreamCtx): + if internal_data.current_pkt is None or internal_data.current_pkt.is_tcp is False or internal_data.current_pkt.is_input is True: + raise NotReadyToRun() + return cls( + data=internal_data.current_pkt.get_related_raw_stream(), + is_ipv6=internal_data.current_pkt.is_ipv6, + ) + +TCPServerStream = TCPOutputStream diff --git a/fgex-lib/firegex/nfproxy/params.py b/fgex-lib/firegex/nfproxy/params.py deleted file mode 100644 index 025ff3e..0000000 --- a/fgex-lib/firegex/nfproxy/params.py +++ /dev/null @@ -1,79 +0,0 @@ - -class NotReadyToRun(Exception): # raise this exception if the stream state is not ready to parse this object, the call will be skipped - pass - -class RawPacket: - def __init__(self, - data: bytes, - raw_packet: bytes, - is_input: bool, - is_ipv6: bool, - is_tcp: bool, - l4_size: int, - ): - self.__data = bytes(data) - self.__raw_packet = bytes(raw_packet) - self.__is_input = bool(is_input) - self.__is_ipv6 = bool(is_ipv6) - self.__is_tcp = bool(is_tcp) - self.__l4_size = int(l4_size) - self.__raw_packet_header_size = len(self.__raw_packet)-self.__l4_size - - @property - def is_input(self) -> bool: - return self.__is_input - - @property - def is_ipv6(self) -> bool: - return self.__is_ipv6 - - @property - def is_tcp(self) -> bool: - return self.__is_tcp - - @property - def data(self) -> bytes: - return self.__data - - @property - def l4_size(self) -> int: - return self.__l4_size - - @property - def raw_packet_header_len(self) -> int: - return self.__raw_packet_header_size - - @property - def l4_data(self) -> bytes: - return self.__raw_packet[self.raw_packet_header_len:] - - @l4_data.setter - def l4_data(self, v:bytes): - if not isinstance(v, bytes): - raise Exception("Invalid data type, data MUST be of type bytes") - #if len(v) != self.__l4_size: - # raise Exception("Invalid data size, must be equal to the original packet header size (due to a technical limitation)") - self.__raw_packet = self.__raw_packet[:self.raw_packet_header_len]+v - self.__l4_size = len(v) - - @property - def raw_packet(self) -> bytes: - return self.__raw_packet - - @raw_packet.setter - def raw_packet(self, v:bytes): - if not isinstance(v, bytes): - raise Exception("Invalid data type, data MUST be of type bytes") - #if len(v) != len(self.__raw_packet): - # raise Exception("Invalid data size, must be equal to the original packet size (due to a technical limitation)") - if len(v) < self.raw_packet_header_len: - raise Exception("Invalid data size, must be greater than the original packet header size") - self.__raw_packet = v - self.__l4_size = len(v)-self.raw_packet_header_len - - @classmethod - def fetch_from_global(cls, glob): - if "__firegex_packet_info" not in glob.keys(): - raise Exception("Packet info not found") - return cls(**glob["__firegex_packet_info"]) - diff --git a/fgex-lib/requirements.txt b/fgex-lib/requirements.txt index f7771d8..2cad7f7 100644 --- a/fgex-lib/requirements.txt +++ b/fgex-lib/requirements.txt @@ -7,4 +7,5 @@ textual==2.1.0 python-socketio[client]==5.12.1 fgex orjson - +httptools +pyllhttp diff --git a/frontend/src/components/ModalLog.tsx b/frontend/src/components/ModalLog.tsx index d57c515..4c07760 100644 --- a/frontend/src/components/ModalLog.tsx +++ b/frontend/src/components/ModalLog.tsx @@ -10,8 +10,8 @@ export const ModalLog = ( } ) => { return - - {data} + + {data} } \ No newline at end of file diff --git a/frontend/src/components/NFProxy/ExceptionWarning.tsx b/frontend/src/components/NFProxy/ExceptionWarning.tsx index 64886b3..45115d1 100644 --- a/frontend/src/components/NFProxy/ExceptionWarning.tsx +++ b/frontend/src/components/NFProxy/ExceptionWarning.tsx @@ -2,6 +2,7 @@ import { IoIosWarning } from "react-icons/io" import { socketio, WARNING_NFPROXY_TIME_LIMIT } from "../../js/utils" import { Tooltip } from "@mantine/core" import { useEffect, useState } from "react" +import { round } from "@mantine/core/lib/components/ColorPicker/converters/parsers" export const ExceptionWarning = ({ service_id }: { service_id: string }) => { @@ -17,9 +18,25 @@ export const ExceptionWarning = ({ service_id }: { service_id: string }) => { } }, []) + const [_time, setTime] = useState(new Date()); + + useEffect(() => { + const interval = setInterval(() => { + setTime(new Date()); + }, 1000); + + return () => clearInterval(interval); + }, []); + + const deltaTime = new Date().getTime()-lastExceptionTimestamp + const minutes = Math.floor(deltaTime/(1000*60)) + const seconds = Math.floor(deltaTime/1000)%60 + + const deltaStringTime = `${minutes.toString().length>1?minutes:"0"+minutes}:${seconds.toString().length>1?seconds:"0"+seconds}` + return <> {(new Date().getTime()-lastExceptionTimestamp <= WARNING_NFPROXY_TIME_LIMIT)? - + :null} diff --git a/frontend/src/components/NFProxy/utils.ts b/frontend/src/components/NFProxy/utils.ts index f5287ca..55ddec6 100644 --- a/frontend/src/components/NFProxy/utils.ts +++ b/frontend/src/components/NFProxy/utils.ts @@ -96,3 +96,77 @@ export const nfproxy = { return status === "ok"?undefined:status } } + + +export const EXAMPLE_PYFILTER = `# This in an example of a filter file with http protocol + +# From here we can import the DataTypes that we want to use: +# The data type must be specified in the filter functions +# And will also interally be used to decide when call some filters and how aggregate data +from firegex.nfproxy.params import RawPacket + +# global context in this execution is dedicated to a single TCP stream +# - This code will be executed once at the TCP stream start +# - The filter will be called for each packet in the stream +# - You can store in global context some data you need, but exceeding with data stored could be dangerous +# - At the end of the stream the global context will be destroyed + +from firegex.nfproxy import pyfilter +# pyfilter is a decorator, this will make the function become an effective filter and must have parameters with a specified type + +from firegex.nfproxy import REJECT, ACCEPT, UNSTABLE_MANGLE, DROP +# - The filter must return one of the following values: +# - ACCEPT: The packet will be accepted +# - REJECT: The packet will be rejected (will be activated a mechanism to send a FIN packet and drop all data in the stream) +# - UNSTABLE_MANGLE: The packet will be mangled and accepted +# - DROP: All the packets in this stream will be easly dropped + +# If you want, you can use print to debug your filters, but this could slow down the filter + +# Filter names must be unique and are specified by the name of the function wrapped by the decorator +@pyfilter +# This function will handle only a RawPacket object, this is the lowest level of the packet abstraction +def strange_filter(packet:RawPacket): + # Mangling packets can be dangerous, due to instability of the internal TCP state mangling done by the filter below + # Also is not garanteed that l4_data is the same of the packet data: + # packet data is the assembled TCP stream, l4_data is the TCP payload of the packet in the nfqueue + # Unorder packets in TCP are accepted by default, and python is not called in this case + # For this reason mangling will be only available RawPacket: higher level data abstraction will be read-only + if b"TEST_MANGLING" in packet.l4_data: + # It's possible to change teh raw_packet and l4_data values for mangling the packet, data is immutable instead + packet.l4_data = packet.l4_data.replace(b"TEST", b"UNSTABLE") + return UNSTABLE_MANGLE + # Drops the traffic + if b"BAD DATA 1" in packet.data: + return DROP + # Rejects the traffic + if b"BAD DATA 2" in packet.data: + return REJECT + # Accepts the traffic (default if None is returned) + return ACCEPT + +# Example with a higher level of abstraction +@pyfilter +def http_filter(http:HTTPRequest): + if http.method == "GET" and "test" in http.url: + return REJECT + +# ADVANCED OPTIONS +# You can specify some additional options on the streaming managment +# pyproxy will automatically store all the packets (already ordered by the c++ binary): +# +# If the stream is too big, you can specify what actions to take: +# This can be done defining some variables in the global context +# - FGEX_STREAM_MAX_SIZE: The maximum size of the stream in bytes (default 1MB) +# NOTE: the stream size is calculated by the sum of the dimension of the packets in the stream (both directions) +# - FGEX_FULL_STREAM_ACTION: The action to do when the stream is full +# - FLUSH: Flush the stream and continue to acquire new packets (default) +# - DROP: Drop the next stream packets - like a DROP action by filter +# - REJECT: Reject the stream and close the connection - like a REJECT action by filter +# - ACCEPT: Stops to call pyfilters and accept the traffic + +# Example of a global context +FGEX_STREAM_MAX_SIZE = 4096 +FGEX_FULL_STREAM_ACTION = REJECT +# This could be an ideal configuration if we expect to normally have streams with a maximum size of 4KB of traffic +` diff --git a/frontend/src/components/NavBar/index.tsx b/frontend/src/components/NavBar/index.tsx index 68a4f5f..ca00a25 100644 --- a/frontend/src/components/NavBar/index.tsx +++ b/frontend/src/components/NavBar/index.tsx @@ -37,9 +37,14 @@ export default function NavBar() { } /> - } /> } /> } /> + + Experimental Features 🧪 + + + + } /> diff --git a/frontend/src/pages/NFProxy/ServiceDetails.tsx b/frontend/src/pages/NFProxy/ServiceDetails.tsx index d642541..40edf80 100644 --- a/frontend/src/pages/NFProxy/ServiceDetails.tsx +++ b/frontend/src/pages/NFProxy/ServiceDetails.tsx @@ -3,7 +3,7 @@ import { Navigate, useNavigate, useParams } from 'react-router-dom'; import { Badge, Divider, Menu } from '@mantine/core'; import { useEffect, useState } from 'react'; import { FaFilter, FaPencilAlt, FaPlay, FaStop } from 'react-icons/fa'; -import { nfproxy, nfproxyServiceFilterCodeQuery, nfproxyServicePyfiltersQuery, nfproxyServiceQuery, serviceQueryKey } from '../../components/NFProxy/utils'; +import { EXAMPLE_PYFILTER, nfproxy, nfproxyServiceFilterCodeQuery, nfproxyServicePyfiltersQuery, nfproxyServiceQuery, serviceQueryKey } from '../../components/NFProxy/utils'; import { MdDoubleArrow } from "react-icons/md" import YesNoModal from '../../components/YesNoModal'; import { errorNotify, isMediumScreen, okNotify, regex_ipv4, socketio } from '../../js/utils'; @@ -45,17 +45,20 @@ export default function ServiceDetailsNFProxy() { useEffect(()=>{ if (srv){ if (openLogModal){ + logDataSetters.setState([]) socketio.emit("nfproxy-outstream-join", { service: srv }); socketio.on(`nfproxy-outstream-${srv}`, (data) => { logDataSetters.append(data) }); }else{ - logDataSetters.setState([]) socketio.emit("nfproxy-outstream-leave", { service: srv }); + socketio.off(`nfproxy-outstream-${srv}`); + logDataSetters.setState([]) } return () => { - logDataSetters.setState([]) socketio.emit("nfproxy-outstream-leave", { service: srv }); + socketio.off(`nfproxy-outstream-${srv}`); + logDataSetters.setState([]) } } }, [openLogModal, srv]) @@ -199,11 +202,13 @@ export default function ServiceDetailsNFProxy() { {(!filtersList.data || filtersList.data.length == 0)?<> - No filters found! Edit the proxy file + No filters found! Edit the proxy file, install the firegex client:<Space w="xs" /><Code mb={-4} >pip install fgex</Code> - Install the firegex client:<Space w="xs" /><Code mb={-4} >pip install fgex</Code> + Then create a new filter file with the following syntax and upload it here (using the button above) - Then run the command:<Space w="xs" /><Code mb={-4} >fgex nfproxy</Code> + Before upload the filter you can test it using the fgex command installed by the python lib + + :<>{filtersList.data?.map( (filterInfo) => )} } {(services.data && services.data?.length > 0)?services.data.map( srv => { navigator("/nfproxy/"+srv.service_id) - }} />):<> No services found! Add one clicking the "+" buttons - + }} />):<> + + + Netfilter proxy is a simulated proxy written using python with a c++ core + + Filters are created using a simple python syntax, infact the first you need to do is to install the firegex lib:<Space w="xs" /><Code mb={-4} >pip install firegex</Code> + + Then you can create a new service and write custom filters for the service + + Below there is a description and example about how a pyfilter has to be composed (this example is replicated in every empty service) + + + + Add your first service + setOpen(true)} size="xl" radius="md" variant="filled"> + } } From 832c6e1530871d07331bb70c2b19878bdeb28fc3 Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Mon, 3 Mar 2025 21:15:49 +0100 Subject: [PATCH 07/18] changed datahandler max size managment --- fgex-lib/firegex/nfproxy/__init__.py | 4 +- .../firegex/nfproxy/internals/__init__.py | 42 ++-- fgex-lib/firegex/nfproxy/internals/data.py | 51 ++--- .../firegex/nfproxy/internals/exceptions.py | 12 ++ fgex-lib/firegex/nfproxy/models/__init__.py | 6 +- fgex-lib/firegex/nfproxy/models/http.py | 184 ++++-------------- fgex-lib/firegex/nfproxy/models/tcp.py | 127 +++++------- 7 files changed, 135 insertions(+), 291 deletions(-) diff --git a/fgex-lib/firegex/nfproxy/__init__.py b/fgex-lib/firegex/nfproxy/__init__.py index aaee250..4bcbeed 100644 --- a/fgex-lib/firegex/nfproxy/__init__.py +++ b/fgex-lib/firegex/nfproxy/__init__.py @@ -1,5 +1,5 @@ import functools -from firegex.nfproxy.models import RawPacket, TCPInputStream, TCPOutputStream, TCPClientStream, TCPServerStream, TCPStreams +from firegex.nfproxy.models import RawPacket, TCPInputStream, TCPOutputStream, TCPClientStream, TCPServerStream from firegex.nfproxy.internals.models import Action, FullStreamAction ACCEPT = Action.ACCEPT @@ -35,5 +35,5 @@ def clear_pyfilter_registry(): __all__ = [ "ACCEPT", "DROP", "REJECT", "UNSTABLE_MANGLE" "Action", "FullStreamAction", "pyfilter", - "RawPacket", "TCPInputStream", "TCPOutputStream", "TCPClientStream", "TCPServerStream", "TCPStreams" + "RawPacket", "TCPInputStream", "TCPOutputStream", "TCPClientStream", "TCPServerStream" ] \ No newline at end of file diff --git a/fgex-lib/firegex/nfproxy/internals/__init__.py b/fgex-lib/firegex/nfproxy/internals/__init__.py index cf6d7a5..28d2ba7 100644 --- a/fgex-lib/firegex/nfproxy/internals/__init__.py +++ b/fgex-lib/firegex/nfproxy/internals/__init__.py @@ -3,7 +3,7 @@ from firegex.nfproxy.internals.models import Action, FullStreamAction from firegex.nfproxy.internals.models import FilterHandler, PacketHandlerResult import functools from firegex.nfproxy.internals.data import DataStreamCtx -from firegex.nfproxy.internals.exceptions import NotReadyToRun +from firegex.nfproxy.internals.exceptions import NotReadyToRun, StreamFullReject, DropPacket, RejectConnection, StreamFullDrop from firegex.nfproxy.internals.data import RawPacket def context_call(glob, func, *args, **kargs): @@ -76,32 +76,8 @@ def handle_packet(glob: dict) -> None: cache_call[RawPacket] = pkt_info final_result = Action.ACCEPT - data_size = len(pkt_info.data) - result = PacketHandlerResult(glob) - if internal_data.stream_size+data_size > internal_data.stream_max_size: - match internal_data.full_stream_action: - case FullStreamAction.FLUSH: - internal_data.stream = [] - internal_data.stream_size = 0 - for func in internal_data.flush_action_set: - func() - case FullStreamAction.ACCEPT: - result.action = Action.ACCEPT - return result.set_result() - case FullStreamAction.REJECT: - result.action = Action.REJECT - result.matched_by = "@MAX_STREAM_SIZE_REACHED" - return result.set_result() - case FullStreamAction.REJECT: - result.action = Action.DROP - result.matched_by = "@MAX_STREAM_SIZE_REACHED" - return result.set_result() - - internal_data.stream.append(pkt_info) - internal_data.stream_size += data_size - func_name = None mangled_packet = None for filter in internal_data.filter_call_info: @@ -115,6 +91,22 @@ def handle_packet(glob: dict) -> None: cache_call[data_type] = None skip_call = True break + except StreamFullDrop: + result.action = Action.DROP + result.matched_by = "@MAX_STREAM_SIZE_REACHED" + return result.set_result() + except StreamFullReject: + result.action = Action.REJECT + result.matched_by = "@MAX_STREAM_SIZE_REACHED" + return result.set_result() + except DropPacket: + result.action = Action.DROP + result.matched_by = filter.name + return result.set_result() + except RejectConnection: + result.action = Action.REJECT + result.matched_by = filter.name + return result.set_result() final_params.append(cache_call[data_type]) if skip_call: continue diff --git a/fgex-lib/firegex/nfproxy/internals/data.py b/fgex-lib/firegex/nfproxy/internals/data.py index 0f4ff00..a3c7ab8 100644 --- a/fgex-lib/firegex/nfproxy/internals/data.py +++ b/fgex-lib/firegex/nfproxy/internals/data.py @@ -1,5 +1,5 @@ from firegex.nfproxy.internals.models import FilterHandler -from typing import Callable +from firegex.nfproxy.internals.models import FullStreamAction class RawPacket: """ @@ -109,26 +109,6 @@ class DataStreamCtx: def filter_call_info(self, v: list[FilterHandler]): self.__data["filter_call_info"] = v - @property - def stream(self) -> list[RawPacket]: - if "stream" not in self.__data.keys(): - self.__data["stream"] = [] - return self.__data.get("stream") - - @stream.setter - def stream(self, v: list[RawPacket]): - self.__data["stream"] = v - - @property - def stream_size(self) -> int: - if "stream_size" not in self.__data.keys(): - self.__data["stream_size"] = 0 - return self.__data.get("stream_size") - - @stream_size.setter - def stream_size(self, v: int): - self.__data["stream_size"] = v - @property def stream_max_size(self) -> int: if "stream_max_size" not in self.__data.keys(): @@ -140,13 +120,13 @@ class DataStreamCtx: self.__data["stream_max_size"] = v @property - def full_stream_action(self) -> str: + def full_stream_action(self) -> FullStreamAction: if "full_stream_action" not in self.__data.keys(): self.__data["full_stream_action"] = "flush" return self.__data.get("full_stream_action") @full_stream_action.setter - def full_stream_action(self, v: str): + def full_stream_action(self, v: FullStreamAction): self.__data["full_stream_action"] = v @property @@ -158,14 +138,14 @@ class DataStreamCtx: self.__data["current_pkt"] = v @property - def http_data_objects(self) -> dict: - if "http_data_objects" not in self.__data.keys(): - self.__data["http_data_objects"] = {} - return self.__data.get("http_data_objects") + def data_handler_context(self) -> dict: + if "data_handler_context" not in self.__data.keys(): + self.__data["data_handler_context"] = {} + return self.__data.get("data_handler_context") - @http_data_objects.setter - def http_data_objects(self, v: dict): - self.__data["http_data_objects"] = v + @data_handler_context.setter + def data_handler_context(self, v: dict): + self.__data["data_handler_context"] = v @property def save_http_data_in_streams(self) -> bool: @@ -177,14 +157,5 @@ class DataStreamCtx: def save_http_data_in_streams(self, v: bool): self.__data["save_http_data_in_streams"] = v - @property - def flush_action_set(self) -> set[Callable]: - if "flush_action_set" not in self.__data.keys(): - self.__data["flush_action_set"] = set() - return self.__data.get("flush_action_set") - - @flush_action_set.setter - def flush_action_set(self, v: set[Callable]): - self.__data["flush_action_set"] = v - + diff --git a/fgex-lib/firegex/nfproxy/internals/exceptions.py b/fgex-lib/firegex/nfproxy/internals/exceptions.py index 6084bf1..a0b2dad 100644 --- a/fgex-lib/firegex/nfproxy/internals/exceptions.py +++ b/fgex-lib/firegex/nfproxy/internals/exceptions.py @@ -1,3 +1,15 @@ class NotReadyToRun(Exception): "raise this exception if the stream state is not ready to parse this object, the call will be skipped" + +class DropPacket(Exception): + "raise this exception if you want to drop the packet" + +class StreamFullDrop(Exception): + "raise this exception if you want to drop the packet due to full stream" + +class RejectConnection(Exception): + "raise this exception if you want to reject the connection" + +class StreamFullReject(Exception): + "raise this exception if you want to reject the connection due to full stream" \ No newline at end of file diff --git a/fgex-lib/firegex/nfproxy/models/__init__.py b/fgex-lib/firegex/nfproxy/models/__init__.py index dc28830..3197012 100644 --- a/fgex-lib/firegex/nfproxy/models/__init__.py +++ b/fgex-lib/firegex/nfproxy/models/__init__.py @@ -1,4 +1,4 @@ -from firegex.nfproxy.models.tcp import TCPInputStream, TCPOutputStream, TCPClientStream, TCPServerStream, TCPStreams +from firegex.nfproxy.models.tcp import TCPInputStream, TCPOutputStream, TCPClientStream, TCPServerStream from firegex.nfproxy.models.http import HttpRequest, HttpResponse, HttpRequestHeader, HttpResponseHeader from firegex.nfproxy.internals.data import RawPacket @@ -7,13 +7,11 @@ type_annotations_associations = { RawPacket: RawPacket._fetch_packet, TCPInputStream: TCPInputStream._fetch_packet, TCPOutputStream: TCPOutputStream._fetch_packet, - TCPStreams: TCPStreams._fetch_packet, }, "http": { RawPacket: RawPacket._fetch_packet, TCPInputStream: TCPInputStream._fetch_packet, TCPOutputStream: TCPOutputStream._fetch_packet, - TCPStreams: TCPStreams._fetch_packet, HttpRequest: HttpRequest._fetch_packet, HttpResponse: HttpResponse._fetch_packet, HttpRequestHeader: HttpRequestHeader._fetch_packet, @@ -23,6 +21,6 @@ type_annotations_associations = { __all__ = [ "RawPacket", - "TCPInputStream", "TCPOutputStream", "TCPClientStream", "TCPServerStream", "TCPStreams", + "TCPInputStream", "TCPOutputStream", "TCPClientStream", "TCPServerStream", "HttpRequest", "HttpResponse", "HttpRequestHeader", "HttpResponseHeader", ] \ No newline at end of file diff --git a/fgex-lib/firegex/nfproxy/models/http.py b/fgex-lib/firegex/nfproxy/models/http.py index bfe1c05..253727e 100644 --- a/fgex-lib/firegex/nfproxy/models/http.py +++ b/fgex-lib/firegex/nfproxy/models/http.py @@ -1,6 +1,8 @@ import pyllhttp from firegex.nfproxy.internals.exceptions import NotReadyToRun from firegex.nfproxy.internals.data import DataStreamCtx +from firegex.nfproxy.internals.exceptions import StreamFullDrop, StreamFullReject +from firegex.nfproxy.internals.models import FullStreamAction class InternalCallbackHandler(): @@ -15,14 +17,16 @@ class InternalCallbackHandler(): message_complete: bool = False status: str|None = None _status_buffer: bytes = b"" - current_header_field = None - current_header_value = None + _current_header_field = b"" + _current_header_value = b"" _save_body = True + total_size = 0 def on_message_begin(self): self.has_begun = True def on_url(self, url): + self.total_size += len(url) self._url_buffer += url def on_url_complete(self): @@ -30,35 +34,32 @@ class InternalCallbackHandler(): self._url_buffer = None def on_header_field(self, field): - if self.current_header_field is None: - self.current_header_field = bytearray(field) - else: - self.current_header_field += field + self.total_size += len(field) + self._current_header_field += field def on_header_field_complete(self): - self.current_header_field = self.current_header_field + self._current_header_field = self._current_header_field def on_header_value(self, value): - if self.current_header_value is None: - self.current_header_value = bytearray(value) - else: - self.current_header_value += value + self.total_size += len(value) + self._current_header_value += value def on_header_value_complete(self): - if self.current_header_value is not None and self.current_header_field is not None: - self._header_fields[self.current_header_field.decode(errors="ignore")] = self.current_header_value.decode(errors="ignore") - self.current_header_field = None - self.current_header_value = None + if self._current_header_value is not None and self._current_header_field is not None: + self._header_fields[self._current_header_field.decode(errors="ignore")] = self._current_header_value.decode(errors="ignore") + self._current_header_field = b"" + self._current_header_value = b"" def on_headers_complete(self): self.headers_complete = True self.headers = self._header_fields self._header_fields = {} - self.current_header_field = None - self.current_header_value = None + self._current_header_field = None + self._current_header_value = None def on_body(self, body: bytes): if self._save_body: + self.total_size += len(body) self._body_buffer += body def on_message_complete(self): @@ -67,6 +68,7 @@ class InternalCallbackHandler(): self.message_complete = True def on_status(self, status: bytes): + self.total_size += len(status) self._status_buffer += status def on_status_complete(self): @@ -112,6 +114,10 @@ class InternalBasicHttpMetaClass: self.stream = b"" self.raised_error = False + @property + def total_size(self) -> int: + return self._parser.total_size + @property def url(self) -> str|None: return self._parser.url @@ -187,14 +193,29 @@ class InternalBasicHttpMetaClass: if internal_data.current_pkt is None or internal_data.current_pkt.is_tcp is False: raise NotReadyToRun() - datahandler:InternalBasicHttpMetaClass = internal_data.http_data_objects.get(cls, None) + datahandler:InternalBasicHttpMetaClass = internal_data.data_handler_context.get(cls, None) if datahandler is None or datahandler.raised_error: datahandler = cls() - internal_data.http_data_objects[cls] = datahandler + internal_data.data_handler_context[cls] = datahandler if not datahandler._before_fetch_callable_checks(internal_data): raise NotReadyToRun() + + # Memory size managment + if datahandler.total_size+len(internal_data.current_pkt.data) > internal_data.stream_max_size: + match internal_data.full_stream_action: + case FullStreamAction.FLUSH: + datahandler = cls() + internal_data.data_handler_context[cls] = datahandler + case FullStreamAction.REJECT: + raise StreamFullReject() + case FullStreamAction.DROP: + raise StreamFullDrop() + case FullStreamAction.ACCEPT: + raise NotReadyToRun() + datahandler._fetch_current_packet(internal_data) + if not datahandler._callable_checks(internal_data): raise NotReadyToRun() @@ -202,8 +223,8 @@ class InternalBasicHttpMetaClass: internal_data.save_http_data_in_streams = True if datahandler._trigger_remove_data(internal_data): - if internal_data.http_data_objects.get(cls): - del internal_data.http_data_objects[cls] + if internal_data.data_handler_context.get(cls): + del internal_data.data_handler_context[cls] return datahandler @@ -262,124 +283,3 @@ class HttpResponseHeader(HttpResponse): return True return False -""" -#TODO include this? - -import codecs - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = "\x00".encode("ascii") # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - -def guess_json_utf(data): - "" - :rtype: str - "" - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - return "utf-32" # BOM included - if sample[:3] == codecs.BOM_UTF8: - return "utf-8-sig" # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return "utf-16" # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return "utf-8" - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return "utf-16-be" - if sample[1::2] == _null2: # 2nd and 4th are null - return "utf-16-le" - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return "utf-32-be" - if sample[1:] == _null3: - return "utf-32-le" - # Did not detect a valid UTF-32 ascii-range character - return None - -from http_parser.pyparser import HttpParser -import json -from urllib.parse import parse_qsl -from dataclasses import dataclass - -@dataclass -class HttpMessage(): - fragment: str - headers: dict - method: str - parameters: dict - path: str - query_string: str - raw_body: bytes - status_code: int - url: str - version: str - -class HttpMessageParser(HttpParser): - def __init__(self, data:bytes, decompress_body=True): - super().__init__(decompress = decompress_body) - self.execute(data, len(data)) - self._parameters = {} - try: - self._parse_parameters() - except Exception as e: - print("Error in parameters parsing:", data) - print("Exception:", str(e)) - - def get_raw_body(self): - return b"\r\n".join(self._body) - - def _parse_query_string(self, raw_string): - parameters = parse_qsl(raw_string) - for key,value in parameters: - try: - key = key.decode() - value = value.decode() - except: - pass - if self._parameters.get(key): - if isinstance(self._parameters[key], list): - self._parameters[key].append(value) - else: - self._parameters[key] = [self._parameters[key], value] - else: - self._parameters[key] = value - - def _parse_parameters(self): - if self._method == "POST": - body = self.get_raw_body() - if len(body) == 0: - return - content_type = self.get_headers().get("Content-Type") - if not content_type or "x-www-form-urlencoded" in content_type: - try: - self._parse_query_string(body.decode()) - except: - pass - elif "json" in content_type: - self._parameters = json.loads(body) - elif self._method == "GET": - self._parse_query_string(self._query_string) - - def get_parameters(self): - ""returns parameters parsed from query string or body"" - return self._parameters - - def get_version(self): - if self._version: - return ".".join([str(x) for x in self._version]) - return None - - def to_message(self): - return HttpMessage(self._fragment, self._headers, self._method, - self._parameters, self._path, self._query_string, - self.get_raw_body(), self._status_code, - self._url, self.get_version() - ) -""" \ No newline at end of file diff --git a/fgex-lib/firegex/nfproxy/models/tcp.py b/fgex-lib/firegex/nfproxy/models/tcp.py index e18671a..eba92bb 100644 --- a/fgex-lib/firegex/nfproxy/models/tcp.py +++ b/fgex-lib/firegex/nfproxy/models/tcp.py @@ -1,61 +1,15 @@ from firegex.nfproxy.internals.data import DataStreamCtx -from firegex.nfproxy.internals.exceptions import NotReadyToRun +from firegex.nfproxy.internals.exceptions import NotReadyToRun, StreamFullDrop, StreamFullReject +from firegex.nfproxy.internals.models import FullStreamAction -class TCPStreams: - """ - This datamodel will assemble the TCP streams from the input and output data. - The function that use this data model will be handled when: - - The packet is TCP - - At least 1 packet has been sent - """ - - def __init__(self, - input_data: bytes, - output_data: bytes, - is_ipv6: bool, - ): - self.__input_data = bytes(input_data) - self.__output_data = bytes(output_data) - self.__is_ipv6 = bool(is_ipv6) - - @property - def input_data(self) -> bytes: - return self.__input_data - - @property - def output_data(self) -> bytes: - return self.__output_data - - @property - def is_ipv6(self) -> bool: - return self.__is_ipv6 - - @classmethod - def _fetch_packet(cls, internal_data:DataStreamCtx): - - if internal_data.current_pkt is None or internal_data.current_pkt.is_tcp is False: - raise NotReadyToRun() - return cls( - input_data=b"".join([ele.data for ele in internal_data.stream if ele.is_input]), - output_data=b"".join([ele.data for ele in internal_data.stream if not ele.is_input]), - is_ipv6=internal_data.current_pkt.is_ipv6, - ) - - -class TCPInputStream: - """ - This datamodel will assemble the TCP input stream from the client sent data. - The function that use this data model will be handled when: - - The packet is TCP - - At least 1 packet has been sent - - A new client packet has been received - """ +class InternalTCPStream: def __init__(self, data: bytes, is_ipv6: bool, ): self.__data = bytes(data) self.__is_ipv6 = bool(is_ipv6) + self.__total_stream_size = len(data) @property def data(self) -> bool: @@ -65,14 +19,52 @@ class TCPInputStream: def is_ipv6(self) -> bool: return self.__is_ipv6 + @property + def total_stream_size(self) -> int: + return self.__total_stream_size + + def _push_new_data(self, data: bytes): + self.__data += data + self.__total_stream_size += len(data) + + @classmethod + def _fetch_packet(cls, internal_data:DataStreamCtx, is_input:bool=False): + if internal_data.current_pkt is None or internal_data.current_pkt.is_tcp is False: + raise NotReadyToRun() + if internal_data.current_pkt.is_input != is_input: + raise NotReadyToRun() + datahandler: TCPInputStream = internal_data.data_handler_context.get(cls, None) + if datahandler is None: + datahandler = cls(internal_data.current_pkt.data, internal_data.current_pkt.is_ipv6) + internal_data.data_handler_context[cls] = datahandler + else: + if datahandler.total_stream_size+len(internal_data.current_pkt.data) > internal_data.stream_max_size: + match internal_data.full_stream_action: + case FullStreamAction.FLUSH: + datahandler = cls(internal_data.current_pkt.data, internal_data.current_pkt.is_ipv6) + internal_data.data_handler_context[cls] = datahandler + case FullStreamAction.REJECT: + raise StreamFullReject() + case FullStreamAction.DROP: + raise StreamFullDrop() + case FullStreamAction.ACCEPT: + raise NotReadyToRun() + else: + datahandler._push_new_data(internal_data.current_pkt.data) + return datahandler + +class TCPInputStream(InternalTCPStream): + """ + This datamodel will assemble the TCP input stream from the client sent data. + The function that use this data model will be handled when: + - The packet is TCP + - At least 1 packet has been sent + - A new client packet has been received + """ + @classmethod def _fetch_packet(cls, internal_data:DataStreamCtx): - if internal_data.current_pkt is None or internal_data.current_pkt.is_tcp is False or internal_data.current_pkt.is_input is False: - raise NotReadyToRun() - return cls( - data=internal_data.current_pkt.get_related_raw_stream(), - is_ipv6=internal_data.current_pkt.is_ipv6, - ) + return super()._fetch_packet(internal_data, is_input=True) TCPClientStream = TCPInputStream @@ -85,29 +77,8 @@ class TCPOutputStream: - A new server packet has been sent """ - - def __init__(self, - data: bytes, - is_ipv6: bool, - ): - self.__data = bytes(data) - self.__is_ipv6 = bool(is_ipv6) - - @property - def data(self) -> bool: - return self.__data - - @property - def is_ipv6(self) -> bool: - return self.__is_ipv6 - @classmethod def _fetch_packet(cls, internal_data:DataStreamCtx): - if internal_data.current_pkt is None or internal_data.current_pkt.is_tcp is False or internal_data.current_pkt.is_input is True: - raise NotReadyToRun() - return cls( - data=internal_data.current_pkt.get_related_raw_stream(), - is_ipv6=internal_data.current_pkt.is_ipv6, - ) + return super()._fetch_packet(internal_data, is_input=False) TCPServerStream = TCPOutputStream From fde3ee57a536b2ac9d17fd9ce9c136433fd30abf Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Mon, 3 Mar 2025 23:55:24 +0100 Subject: [PATCH 08/18] crash and unexpected behaviours fix --- backend/binsrc/pyproxy/stream_ctx.cpp | 7 --- backend/modules/nfproxy/firegex.py | 14 ++++-- .../firegex/nfproxy/internals/__init__.py | 13 +++--- fgex-lib/firegex/nfproxy/internals/data.py | 26 ++--------- .../firegex/nfproxy/internals/exceptions.py | 2 +- fgex-lib/firegex/nfproxy/models/http.py | 44 +++++++++++-------- fgex-lib/firegex/nfproxy/models/tcp.py | 8 +--- 7 files changed, 47 insertions(+), 67 deletions(-) diff --git a/backend/binsrc/pyproxy/stream_ctx.cpp b/backend/binsrc/pyproxy/stream_ctx.cpp index f9e2cb4..9c249bc 100644 --- a/backend/binsrc/pyproxy/stream_ctx.cpp +++ b/backend/binsrc/pyproxy/stream_ctx.cpp @@ -73,7 +73,6 @@ struct pyfilter_ctx { } ~pyfilter_ctx(){ - cerr << "[info] [pyfilter_ctx] Cleaning pyfilter_ctx" << endl; Py_DECREF(glob); Py_DECREF(py_handle_packet); PyGC_Collect(); @@ -120,14 +119,8 @@ struct pyfilter_ctx { // Set packet info to the global context set_item_to_glob("__firegex_packet_info", packet_info); - #ifdef DEBUG - cerr << "[DEBUG] [handle_packet] Calling python with a data of " << data.size() << endl; - #endif PyObject * result = PyEval_EvalCode(py_handle_packet, glob, glob); PyGC_Collect(); - #ifdef DEBUG - cerr << "[DEBUG] [handle_packet] End of python call" << endl; - #endif del_item_from_glob("__firegex_packet_info"); if (PyErr_Occurred()){ diff --git a/backend/modules/nfproxy/firegex.py b/backend/modules/nfproxy/firegex.py index 5febad6..f9a85d2 100644 --- a/backend/modules/nfproxy/firegex.py +++ b/backend/modules/nfproxy/firegex.py @@ -6,6 +6,7 @@ import traceback from fastapi import HTTPException import time from utils import run_func +from utils import DEBUG nft = FiregexTables() @@ -62,20 +63,25 @@ class FiregexInterceptor: async def _stream_handler(self): while True: try: - line = (await self.process.stdout.readuntil()).decode(errors="ignore") - print(line, end="") + out_data = (await self.process.stdout.read(1024*10)).decode(errors="ignore") + if DEBUG: + print(out_data, end="") + except asyncio.exceptions.LimitOverrunError: + self.outstrem_buffer = "" + continue except Exception as e: self.ack_arrived = False self.ack_status = False self.ack_fail_what = "Can't read from nfq client" self.ack_lock.release() await self.stop() + traceback.print_exc() # Python can't print it alone? nope it's python... wasted 1 day :) raise HTTPException(status_code=500, detail="Can't read from nfq client") from e - self.outstrem_buffer+=line + self.outstrem_buffer+=out_data if len(self.outstrem_buffer) > OUTSTREAM_BUFFER_SIZE: self.outstrem_buffer = self.outstrem_buffer[-OUTSTREAM_BUFFER_SIZE:]+"\n" if self.outstrem_function: - await run_func(self.outstrem_function, self.srv.id, line) + await run_func(self.outstrem_function, self.srv.id, out_data) async def _start_binary(self): proxy_binary_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../cpproxy")) diff --git a/fgex-lib/firegex/nfproxy/internals/__init__.py b/fgex-lib/firegex/nfproxy/internals/__init__.py index 28d2ba7..ef2562e 100644 --- a/fgex-lib/firegex/nfproxy/internals/__init__.py +++ b/fgex-lib/firegex/nfproxy/internals/__init__.py @@ -68,12 +68,9 @@ def get_filter_names(code:str, proto:str) -> list[str]: def handle_packet(glob: dict) -> None: internal_data = DataStreamCtx(glob) - print("I'm here", flush=True) - cache_call = {} # Cache of the data handler calls - pkt_info = RawPacket._fetch_packet(internal_data) - internal_data.current_pkt = pkt_info - cache_call[RawPacket] = pkt_info + cache_call = {} # Cache of the data handler calls + cache_call[RawPacket] = internal_data.current_pkt final_result = Action.ACCEPT result = PacketHandlerResult(glob) @@ -108,8 +105,10 @@ def handle_packet(glob: dict) -> None: result.matched_by = filter.name return result.set_result() final_params.append(cache_call[data_type]) + if skip_call: continue + res = context_call(glob, filter.func, *final_params) if res is None: @@ -117,7 +116,7 @@ def handle_packet(glob: dict) -> None: if not isinstance(res, Action): raise Exception(f"Invalid return type {type(res)} for function {filter.name}") if res == Action.MANGLE: - mangled_packet = pkt_info.raw_packet + mangled_packet = internal_data.current_pkt.raw_packet if res != Action.ACCEPT: func_name = filter.name final_result = res @@ -131,7 +130,7 @@ def handle_packet(glob: dict) -> None: def compile(glob:dict) -> None: - internal_data = DataStreamCtx(glob) + internal_data = DataStreamCtx(glob, init_pkt=False) glob["print"] = functools.partial(print, flush = True) diff --git a/fgex-lib/firegex/nfproxy/internals/data.py b/fgex-lib/firegex/nfproxy/internals/data.py index a3c7ab8..c9940ed 100644 --- a/fgex-lib/firegex/nfproxy/internals/data.py +++ b/fgex-lib/firegex/nfproxy/internals/data.py @@ -75,8 +75,7 @@ class RawPacket: self.__l4_size = len(v)-self.raw_packet_header_len @classmethod - def _fetch_packet(cls, internal_data): - from firegex.nfproxy.internals.data import DataStreamCtx + def _fetch_packet(cls, internal_data:"DataStreamCtx"): if not isinstance(internal_data, DataStreamCtx): if isinstance(internal_data, dict): internal_data = DataStreamCtx(internal_data) @@ -93,11 +92,12 @@ class RawPacket: class DataStreamCtx: - def __init__(self, glob: dict): + def __init__(self, glob: dict, init_pkt: bool = True): if "__firegex_pyfilter_ctx" not in glob.keys(): glob["__firegex_pyfilter_ctx"] = {} self.__data = glob["__firegex_pyfilter_ctx"] self.filter_glob = glob + self.current_pkt = RawPacket._fetch_packet(self) if init_pkt else None @property def filter_call_info(self) -> list[FilterHandler]: @@ -128,14 +128,6 @@ class DataStreamCtx: @full_stream_action.setter def full_stream_action(self, v: FullStreamAction): self.__data["full_stream_action"] = v - - @property - def current_pkt(self) -> RawPacket: - return self.__data.get("current_pkt", None) - - @current_pkt.setter - def current_pkt(self, v: RawPacket): - self.__data["current_pkt"] = v @property def data_handler_context(self) -> dict: @@ -146,16 +138,4 @@ class DataStreamCtx: @data_handler_context.setter def data_handler_context(self, v: dict): self.__data["data_handler_context"] = v - - @property - def save_http_data_in_streams(self) -> bool: - if "save_http_data_in_streams" not in self.__data.keys(): - self.__data["save_http_data_in_streams"] = False - return self.__data.get("save_http_data_in_streams") - - @save_http_data_in_streams.setter - def save_http_data_in_streams(self, v: bool): - self.__data["save_http_data_in_streams"] = v - - diff --git a/fgex-lib/firegex/nfproxy/internals/exceptions.py b/fgex-lib/firegex/nfproxy/internals/exceptions.py index a0b2dad..6c953c3 100644 --- a/fgex-lib/firegex/nfproxy/internals/exceptions.py +++ b/fgex-lib/firegex/nfproxy/internals/exceptions.py @@ -12,4 +12,4 @@ class RejectConnection(Exception): "raise this exception if you want to reject the connection" class StreamFullReject(Exception): - "raise this exception if you want to reject the connection due to full stream" \ No newline at end of file + "raise this exception if you want to reject the connection due to full stream" diff --git a/fgex-lib/firegex/nfproxy/models/http.py b/fgex-lib/firegex/nfproxy/models/http.py index 253727e..c22a658 100644 --- a/fgex-lib/firegex/nfproxy/models/http.py +++ b/fgex-lib/firegex/nfproxy/models/http.py @@ -54,8 +54,8 @@ class InternalCallbackHandler(): self.headers_complete = True self.headers = self._header_fields self._header_fields = {} - self._current_header_field = None - self._current_header_value = None + self._current_header_field = b"" + self._current_header_value = b"" def on_body(self, body: bytes): if self._save_body: @@ -98,14 +98,14 @@ class InternalCallbackHandler(): class InternalHttpRequest(InternalCallbackHandler, pyllhttp.Request): def __init__(self): - super(pyllhttp.Request, self).__init__() super(InternalCallbackHandler, self).__init__() - + super(pyllhttp.Request, self).__init__() + class InternalHttpResponse(InternalCallbackHandler, pyllhttp.Response): def __init__(self): - super(pyllhttp.Response, self).__init__() super(InternalCallbackHandler, self).__init__() - + super(pyllhttp.Response, self).__init__() + class InternalBasicHttpMetaClass: def __init__(self): @@ -162,9 +162,12 @@ class InternalBasicHttpMetaClass: def method(self) -> str|None: return self._parser.method_parsed + def _packet_to_stream(self, internal_data: DataStreamCtx): + return self.should_upgrade and self._parser._save_body + def _fetch_current_packet(self, internal_data: DataStreamCtx): - # TODO: if an error is triggered should I reject the connection? - if internal_data.save_http_data_in_streams: # This is a websocket upgrade! + if self._packet_to_stream(internal_data): # This is a websocket upgrade! + self._parser.total_size += len(internal_data.current_pkt.data) self.stream += internal_data.current_pkt.data else: try: @@ -173,20 +176,21 @@ class InternalBasicHttpMetaClass: self._parser.on_message_complete() except Exception as e: self.raised_error = True + print(f"Error parsing HTTP packet: {e} {internal_data.current_pkt}", self, flush=True) raise e #It's called the first time if the headers are complete, and second time with body complete - def _callable_checks(self, internal_data: DataStreamCtx): + def _after_fetch_callable_checks(self, internal_data: DataStreamCtx): if self._parser.headers_complete and not self._headers_were_set: self._headers_were_set = True return True - return self._parser.message_complete or internal_data.save_http_data_in_streams + return self._parser.message_complete or self.should_upgrade def _before_fetch_callable_checks(self, internal_data: DataStreamCtx): return True def _trigger_remove_data(self, internal_data: DataStreamCtx): - return self.message_complete + return self.message_complete and not self.should_upgrade @classmethod def _fetch_packet(cls, internal_data: DataStreamCtx): @@ -216,12 +220,9 @@ class InternalBasicHttpMetaClass: datahandler._fetch_current_packet(internal_data) - if not datahandler._callable_checks(internal_data): + if not datahandler._after_fetch_callable_checks(internal_data): raise NotReadyToRun() - if datahandler.should_upgrade: - internal_data.save_http_data_in_streams = True - if datahandler._trigger_remove_data(internal_data): if internal_data.data_handler_context.get(cls): del internal_data.data_handler_context[cls] @@ -266,7 +267,10 @@ class HttpRequestHeader(HttpRequest): super().__init__() self._parser._save_body = False - def _callable_checks(self, internal_data: DataStreamCtx): + def _before_fetch_callable_checks(self, internal_data: DataStreamCtx): + return internal_data.current_pkt.is_input and not self._headers_were_set + + def _after_fetch_callable_checks(self, internal_data: DataStreamCtx): if self._parser.headers_complete and not self._headers_were_set: self._headers_were_set = True return True @@ -277,9 +281,11 @@ class HttpResponseHeader(HttpResponse): super().__init__() self._parser._save_body = False - def _callable_checks(self, internal_data: DataStreamCtx): + def _before_fetch_callable_checks(self, internal_data: DataStreamCtx): + return not internal_data.current_pkt.is_input and not self._headers_were_set + + def _after_fetch_callable_checks(self, internal_data: DataStreamCtx): if self._parser.headers_complete and not self._headers_were_set: self._headers_were_set = True return True - return False - + return False \ No newline at end of file diff --git a/fgex-lib/firegex/nfproxy/models/tcp.py b/fgex-lib/firegex/nfproxy/models/tcp.py index eba92bb..fc46431 100644 --- a/fgex-lib/firegex/nfproxy/models/tcp.py +++ b/fgex-lib/firegex/nfproxy/models/tcp.py @@ -7,13 +7,9 @@ class InternalTCPStream: data: bytes, is_ipv6: bool, ): - self.__data = bytes(data) + self.data = bytes(data) self.__is_ipv6 = bool(is_ipv6) self.__total_stream_size = len(data) - - @property - def data(self) -> bool: - return self.__data @property def is_ipv6(self) -> bool: @@ -24,7 +20,7 @@ class InternalTCPStream: return self.__total_stream_size def _push_new_data(self, data: bytes): - self.__data += data + self.data += data self.__total_stream_size += len(data) @classmethod From caafb46fdbdae2dca50ad14e8b60818a95a9b7c4 Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Tue, 4 Mar 2025 01:39:45 +0100 Subject: [PATCH 09/18] skip already None datamodel, auto-ungzip body --- .../firegex/nfproxy/internals/__init__.py | 3 ++ fgex-lib/firegex/nfproxy/models/http.py | 35 ++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/fgex-lib/firegex/nfproxy/internals/__init__.py b/fgex-lib/firegex/nfproxy/internals/__init__.py index ef2562e..c57cf4c 100644 --- a/fgex-lib/firegex/nfproxy/internals/__init__.py +++ b/fgex-lib/firegex/nfproxy/internals/__init__.py @@ -104,6 +104,9 @@ def handle_packet(glob: dict) -> None: result.action = Action.REJECT result.matched_by = filter.name return result.set_result() + if cache_call[data_type] is None: + skip_call = True + break final_params.append(cache_call[data_type]) if skip_call: diff --git a/fgex-lib/firegex/nfproxy/models/http.py b/fgex-lib/firegex/nfproxy/models/http.py index c22a658..7ec3a3f 100644 --- a/fgex-lib/firegex/nfproxy/models/http.py +++ b/fgex-lib/firegex/nfproxy/models/http.py @@ -9,6 +9,7 @@ class InternalCallbackHandler(): url: str|None = None _url_buffer: bytes = b"" headers: dict[str, str] = {} + lheaders: dict[str, str] = {} # Lowercase headers _header_fields: dict[bytes, bytes] = {} has_begun: bool = False body: bytes = None @@ -53,6 +54,7 @@ class InternalCallbackHandler(): def on_headers_complete(self): self.headers_complete = True self.headers = self._header_fields + self.lheaders = {k.lower(): v for k, v in self._header_fields.items()} self._header_fields = {} self._current_header_field = b"" self._current_header_value = b"" @@ -65,6 +67,14 @@ class InternalCallbackHandler(): def on_message_complete(self): self.body = self._body_buffer self._body_buffer = b"" + try: + if "gzip" in self.content_encoding.lower(): + import gzip + import io + with gzip.GzipFile(fileobj=io.BytesIO(self.body)) as f: + self.body = f.read() + except Exception as e: + print(f"Error decompressing gzip: {e}: skipping", flush=True) self.message_complete = True def on_status(self, status: bytes): @@ -75,6 +85,18 @@ class InternalCallbackHandler(): self.status = self._status_buffer.decode(errors="ignore") self._status_buffer = b"" + @property + def user_agent(self) -> str: + return self.lheaders.get("user-agent", "") + + @property + def content_encoding(self) -> str: + return self.lheaders.get("content-encoding", "") + + @property + def content_type(self) -> str: + return self.lheaders.get("content-type", "") + @property def keep_alive(self) -> bool: return self.should_keep_alive @@ -126,6 +148,14 @@ class InternalBasicHttpMetaClass: def headers(self) -> dict[str, str]: return self._parser.headers + @property + def user_agent(self) -> str: + return self._parser.user_agent + + @property + def content_encoding(self) -> str: + return self._parser.content_encoding + @property def has_begun(self) -> bool: return self._parser.has_begun @@ -162,6 +192,9 @@ class InternalBasicHttpMetaClass: def method(self) -> str|None: return self._parser.method_parsed + def get_header(self, header: str, default=None) -> str: + return self._parser.lheaders.get(header.lower(), default) + def _packet_to_stream(self, internal_data: DataStreamCtx): return self.should_upgrade and self._parser._save_body @@ -172,7 +205,7 @@ class InternalBasicHttpMetaClass: else: try: self._parser.execute(internal_data.current_pkt.data) - if self._parser.headers_complete and len(self._parser._body_buffer) == self._parser.content_length_parsed: + if not self._parser.message_complete and self._parser.headers_complete and len(self._parser._body_buffer) == self._parser.content_length_parsed: self._parser.on_message_complete() except Exception as e: self.raised_error = True From c90d817ad468db3fe12a01bbda97eeb6b7c93bae Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Tue, 4 Mar 2025 15:51:46 +0100 Subject: [PATCH 10/18] cli command with proxy simulation --- backend/modules/nfproxy/firegex.py | 1 - fgex-lib/firegex/cli.py | 54 +++- .../firegex/nfproxy/internals/__init__.py | 9 +- fgex-lib/firegex/nfproxy/models/__init__.py | 7 +- fgex-lib/firegex/nfproxy/proxysim/__init__.py | 248 ++++++++++++++++++ fgex-lib/requirements.txt | 7 +- 6 files changed, 313 insertions(+), 13 deletions(-) create mode 100644 fgex-lib/firegex/nfproxy/proxysim/__init__.py diff --git a/backend/modules/nfproxy/firegex.py b/backend/modules/nfproxy/firegex.py index f9a85d2..821f116 100644 --- a/backend/modules/nfproxy/firegex.py +++ b/backend/modules/nfproxy/firegex.py @@ -198,7 +198,6 @@ class FiregexInterceptor: filter_file = "" self.filter_map = {ele.name: ele for ele in filters} await self._update_config( - filter_file + "\n\n" + "__firegex_pyfilter_enabled = [" + ", ".join([repr(f.name) for f in filters]) + "]\n" + "__firegex_proto = " + repr(self.srv.proto) + "\n" + diff --git a/fgex-lib/firegex/cli.py b/fgex-lib/firegex/cli.py index b95f5a4..3920a0b 100644 --- a/fgex-lib/firegex/cli.py +++ b/fgex-lib/firegex/cli.py @@ -1,5 +1,55 @@ +#!/usr/bin/env python3 + +import typer +from rich import print +from typer import Exit +from firegex import __version__ +from firegex.nfproxy.proxysim import run_proxy_simulation +from firegex.nfproxy.models import Protocols + +app = typer.Typer( + no_args_is_help=True, + context_settings={"help_option_names": ["-h", "--help"]} +) + +def close_cli(code:int=1): + raise Exit(code) + +DEV_MODE = __version__ == "0.0.0" + +@app.command(help="Run an nfproxy simulation") +def nfproxy( + filter_file: str = typer.Argument(..., help="The path to the filter file"), + address: str = typer.Argument(..., help="The address of the target to proxy"), + port: int = typer.Argument(..., help="The port of the target to proxy"), + + proto: Protocols = typer.Option(Protocols.TCP.value, help="The protocol to proxy"), + from_address: str = typer.Option(None, help="The address of the local server"), + from_port: int = typer.Option(7474, help="The port of the local server"), + ipv6: bool = typer.Option(False, "-6", help="Use IPv6 for the connection"), +): + if from_address is None: + from_address = "::1" if ipv6 else "127.0.0.1" + + run_proxy_simulation(filter_file, proto.value, address, port, from_address, from_port, ipv6) + +def version_callback(verison: bool): + if verison: + print(__version__, "Development Mode" if DEV_MODE else "Release") + raise typer.Exit() + +@app.callback() +def main( + verison: bool = typer.Option(False, "--version", "-v", help="Show the version of the client", callback=version_callback), +): + pass def run(): - pass # TODO implement me - + try: + app() + except KeyboardInterrupt: + print("[bold yellow]Operation cancelled[/]") + +if __name__ == "__main__": + run() diff --git a/fgex-lib/firegex/nfproxy/internals/__init__.py b/fgex-lib/firegex/nfproxy/internals/__init__.py index c57cf4c..6033eee 100644 --- a/fgex-lib/firegex/nfproxy/internals/__init__.py +++ b/fgex-lib/firegex/nfproxy/internals/__init__.py @@ -11,9 +11,12 @@ def context_call(glob, func, *args, **kargs): glob["__firegex_tmp_kargs"] = kargs glob["__firege_tmp_call"] = func res = eval("__firege_tmp_call(*__firegex_tmp_args, **__firegex_tmp_kargs)", glob, glob) - del glob["__firegex_tmp_args"] - del glob["__firegex_tmp_kargs"] - del glob["__firege_tmp_call"] + if "__firegex_tmp_args" in glob.keys(): + del glob["__firegex_tmp_args"] + if "__firegex_tmp_kargs" in glob.keys(): + del glob["__firegex_tmp_kargs"] + if "__firege_tmp_call" in glob.keys(): + del glob["__firege_tmp_call"] return res def generate_filter_structure(filters: list[str], proto:str, glob:dict) -> list[FilterHandler]: diff --git a/fgex-lib/firegex/nfproxy/models/__init__.py b/fgex-lib/firegex/nfproxy/models/__init__.py index 3197012..9da4c6a 100644 --- a/fgex-lib/firegex/nfproxy/models/__init__.py +++ b/fgex-lib/firegex/nfproxy/models/__init__.py @@ -1,6 +1,7 @@ from firegex.nfproxy.models.tcp import TCPInputStream, TCPOutputStream, TCPClientStream, TCPServerStream from firegex.nfproxy.models.http import HttpRequest, HttpResponse, HttpRequestHeader, HttpResponseHeader from firegex.nfproxy.internals.data import RawPacket +from enum import Enum type_annotations_associations = { "tcp": { @@ -19,8 +20,12 @@ type_annotations_associations = { } } +class Protocols(Enum): + TCP = "tcp" + HTTP = "http" + __all__ = [ "RawPacket", "TCPInputStream", "TCPOutputStream", "TCPClientStream", "TCPServerStream", - "HttpRequest", "HttpResponse", "HttpRequestHeader", "HttpResponseHeader", + "HttpRequest", "HttpResponse", "HttpRequestHeader", "HttpResponseHeader", "Protocols" ] \ No newline at end of file diff --git a/fgex-lib/firegex/nfproxy/proxysim/__init__.py b/fgex-lib/firegex/nfproxy/proxysim/__init__.py new file mode 100644 index 0000000..fb7b6fc --- /dev/null +++ b/fgex-lib/firegex/nfproxy/proxysim/__init__.py @@ -0,0 +1,248 @@ +import socket +import os +import threading +from watchdog.observers import Observer +from watchdog.events import FileSystemEventHandler +from firegex.nfproxy.internals import get_filter_names +import traceback +from multiprocessing import Process +from firegex.nfproxy import ACCEPT, DROP, REJECT, UNSTABLE_MANGLE +from rich.markup import escape +from rich import print + +fake_ip_header = b"FAKE:IP:TCP:HEADERS:" +fake_ip_header_len = len(fake_ip_header) + +class LogLevels: + INFO = "INFO" + WARNING = "WARNING" + ERROR = "ERROR" + DEBUG = "DEBUG" + +def load_level_str(level:str): + if level is None: + return "" + match level: + case LogLevels.INFO: + return "[chartreuse4 bold]\\[INFO][/]" + case LogLevels.WARNING: + return "[yellow bold]\\[WARNING][/]" + case LogLevels.ERROR: + return "[red bold]\\[ERROR][/]" + case LogLevels.DEBUG: + return "[blue bold]\\[DEBUG][/]" + case _: + return f"\\[[red bold]{escape(level)}[/]]" + +def log_print(module:str, *args, level:str = LogLevels.INFO, **kwargs): + return print(f"{load_level_str(level)}[deep_pink4 bold]\\[nfproxy][/][medium_orchid3 bold]\\[{escape(module)}][/]", *args, **kwargs) + +class ProxyFilterHandler(FileSystemEventHandler): + + def __init__(self, reload_action): + super().__init__() + self.__reload_action = reload_action + + def on_modified(self, event): + if self.__reload_action is not None: + self.__reload_action() + return super().on_modified(event) + + def on_deleted(self, event): + if self.__reload_action is not None: + self.__reload_action() + return super().on_deleted(event) + + +def _forward_and_filter(filter_ctx:dict, source:socket.socket, destination:socket.socket, is_input:bool, is_ipv6:bool, is_tcp:bool, has_to_filter:bool = True): + """Forward data from source to destination.""" + try: + def forward(data:bytes): + try: + destination.sendall(data) + except OSError: + return + def stop_filter_action(data:bytes): + nonlocal has_to_filter + has_to_filter = False + forward(data) + while True: + try: + data = source.recv(4096) + except OSError: + return + if not data: + break + if has_to_filter: + filter_ctx["__firegex_packet_info"] = { + "data": data, + "l4_size": len(data), + "raw_packet": fake_ip_header+data, + "is_input": is_input, + "is_ipv6": is_ipv6, + "is_tcp": is_tcp + } + try: + exec("firegex.nfproxy.internals.handle_packet(globals())", filter_ctx, filter_ctx) + except Exception as e: + log_print("packet-handling", f"Error while executing filter: {escape(str(e))}, forwarding normally from now", level=LogLevels.ERROR) + traceback.print_exc() + stop_filter_action(data) + continue + finally: + if "__firegex_packet_info" in filter_ctx.keys(): + del filter_ctx["__firegex_packet_info"] + + result = filter_ctx.get("__firegex_pyfilter_result", None) + + if result is not None: + del filter_ctx["__firegex_pyfilter_result"] + + if result is None or not isinstance(result, dict): + log_print("filter-parsing", "No result found", level=LogLevels.ERROR) + stop_filter_action(data) + continue + action = result.get("action", None) + + if action is None or not isinstance(action, int): + log_print("filter-parsing", "No action found", level=LogLevels.ERROR) + stop_filter_action(data) + continue + + if action == ACCEPT.value: + forward(data) + continue + + filter_name = result.get("matched_by", None) + if filter_name is None or not isinstance(filter_name, str): + log_print("filter-parsing", "No matched_by found", level=LogLevels.ERROR) + stop_filter_action(data) + continue + + if action == DROP.value: + log_print("drop-action", "Dropping packet can't be simulated, so the connection will be rejected", level=LogLevels.WARNING) + action = REJECT.value + + if action == REJECT.value: + log_print("reject-action", f"Rejecting connection caused by {escape(filter_name)} pyfilter") + source.close() + destination.close() + return + elif action == UNSTABLE_MANGLE.value: + mangled_packet = result.get("mangled_packet", None) + if mangled_packet is None or not isinstance(mangled_packet, bytes): + log_print("filter-parsing", "No mangled_packet found", level=LogLevels.ERROR) + stop_filter_action(data) + continue + log_print("mangle", f"Mangling packet caused by {escape(filter_name)} pyfilter") + log_print("mangle", "In the real execution mangling is not so stable as the simulation does, l4_data can be different by data", level=LogLevels.WARNING) + forward(mangled_packet[fake_ip_header_len:]) + continue + else: + log_print("filter-parsing", f"Invalid action {action} found", level=LogLevels.ERROR) + stop_filter_action(data) + continue + forward(data) + finally: + source.close() + destination.close() + +def _execute_proxy(filter_code:str, target_ip:str, target_port:int, local_ip:str = "127.0.0.1", local_port:int = 7474, ipv6:bool = False): + + addr_family = socket.AF_INET6 if ipv6 else socket.AF_INET + server = socket.socket(addr_family, socket.SOCK_STREAM) + server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server.bind((local_ip, local_port)) + server.listen(5) + + log_print("listener", f"TCP proxy listening on {escape(local_ip)}:{local_port} and forwarding to -> {escape(target_ip)}:{target_port}") + try: + while True: + client_socket, addr = server.accept() + log_print("listener", f"Accepted connection from {escape(addr[0])}:{addr[1]}") + try: + remote_socket = socket.socket(addr_family, socket.SOCK_STREAM) + remote_socket.connect((target_ip, target_port)) + except Exception as e: + log_print("listener", f"Could not connect to remote {escape(target_ip)}:{target_port}: {escape(str(e))}", level=LogLevels.ERROR) + client_socket.close() + continue + try: + filter_ctx = {} + exec(filter_code, filter_ctx, filter_ctx) + # Start two threads to forward data in both directions. + threading.Thread(target=_forward_and_filter, args=(filter_ctx, client_socket, remote_socket, True, ipv6, True, True)).start() + threading.Thread(target=_forward_and_filter, args=(filter_ctx, remote_socket, client_socket, False, ipv6, True, True)).start() + except Exception as e: + log_print("listener", f"Error while compiling filter context: {escape(str(e))}, forwarding normally", level=LogLevels.ERROR) + traceback.print_exc() + threading.Thread(target=_forward_and_filter, args=(filter_ctx, client_socket, remote_socket, True, ipv6, True, False)).start() + threading.Thread(target=_forward_and_filter, args=(filter_ctx, remote_socket, client_socket, False, ipv6, True, False)).start() + except KeyboardInterrupt: + log_print("listener", "Proxy stopped by user") + finally: + server.close() + +def _build_filter(filepath:str, proto:str): + if os.path.isfile(filepath) is False: + raise Exception(f"Filter file {filepath} not found") + + with open(filepath, "r") as f: + filter_code = f.read() + + filters = get_filter_names(filter_code, proto) + filter_code += ( + "\n\n__firegex_pyfilter_enabled = [" + ", ".join([repr(f) for f in filters]) + "]\n" + "__firegex_proto = " + repr(proto) + "\n" + "import firegex.nfproxy.internals\n" + "firegex.nfproxy.internals.compile(globals())\n" + ) + + filter_glob = {} + exec(filter_code, filter_glob, filter_glob) # test compilation of filters + return filter_code + + +def run_proxy_simulation(filter_file:str, proto:str, target_ip:str, target_port:int, local_ip:str = None, local_port:int = 7474, ipv6:bool = False): + + if local_ip is None: + if ipv6: + local_ip = "::1" + else: + local_ip = "127.0.0.1" + + if os.path.isfile(filter_file) is False: + raise Exception(f"\\[nfproxy]\\[init] Filter file {filter_file} not found") + + proxy_process:Process|None = None + + def reload_proxy_proc(): + nonlocal proxy_process + if proxy_process is not None: + proxy_process.terminate() + proxy_process.join() + proxy_process = None + + compiled_filter = None + try: + compiled_filter = _build_filter(filter_file, proto) + except Exception: + log_print("reloader", f"Failed to build filter {escape(filter_file)}!", level=LogLevels.ERROR) + traceback.print_exc() + if compiled_filter is not None: + proxy_process = Process(target=_execute_proxy, args=(compiled_filter, target_ip, target_port, local_ip, local_port, ipv6)) + proxy_process.start() + + + observer = Observer() + handler = ProxyFilterHandler(reload_proxy_proc) + observer.schedule(handler, os.path.abspath(filter_file), recursive=False) + observer.start() + reload_proxy_proc() + log_print("observer", f"Listening for changes on {escape(os.path.abspath(filter_file))}") + try: + observer.join() + except KeyboardInterrupt: + observer.stop() + + diff --git a/fgex-lib/requirements.txt b/fgex-lib/requirements.txt index 2cad7f7..ae67857 100644 --- a/fgex-lib/requirements.txt +++ b/fgex-lib/requirements.txt @@ -1,11 +1,6 @@ typer==0.15.1 -requests>=2.32.3 pydantic>=2 typing-extensions>=4.7.1 -fasteners==0.19 -textual==2.1.0 -python-socketio[client]==5.12.1 +watchdog>=6.0.0 fgex -orjson -httptools pyllhttp From 47496287d5582f6d4560e0a46e27cbe79aa6e01d Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Tue, 4 Mar 2025 16:19:30 +0100 Subject: [PATCH 11/18] asyncio simulator + fix close --- fgex-lib/firegex/nfproxy/proxysim/__init__.py | 266 ++++++++++-------- fgex-lib/requirements.txt | 2 +- 2 files changed, 157 insertions(+), 111 deletions(-) diff --git a/fgex-lib/firegex/nfproxy/proxysim/__init__.py b/fgex-lib/firegex/nfproxy/proxysim/__init__.py index fb7b6fc..31d1d57 100644 --- a/fgex-lib/firegex/nfproxy/proxysim/__init__.py +++ b/fgex-lib/firegex/nfproxy/proxysim/__init__.py @@ -1,14 +1,13 @@ import socket import os -import threading -from watchdog.observers import Observer -from watchdog.events import FileSystemEventHandler from firegex.nfproxy.internals import get_filter_names import traceback from multiprocessing import Process from firegex.nfproxy import ACCEPT, DROP, REJECT, UNSTABLE_MANGLE from rich.markup import escape from rich import print +import asyncio +from watchfiles import awatch, Change fake_ip_header = b"FAKE:IP:TCP:HEADERS:" fake_ip_header_len = len(fake_ip_header) @@ -37,47 +36,49 @@ def load_level_str(level:str): def log_print(module:str, *args, level:str = LogLevels.INFO, **kwargs): return print(f"{load_level_str(level)}[deep_pink4 bold]\\[nfproxy][/][medium_orchid3 bold]\\[{escape(module)}][/]", *args, **kwargs) -class ProxyFilterHandler(FileSystemEventHandler): - - def __init__(self, reload_action): - super().__init__() - self.__reload_action = reload_action - - def on_modified(self, event): - if self.__reload_action is not None: - self.__reload_action() - return super().on_modified(event) - - def on_deleted(self, event): - if self.__reload_action is not None: - self.__reload_action() - return super().on_deleted(event) - - -def _forward_and_filter(filter_ctx:dict, source:socket.socket, destination:socket.socket, is_input:bool, is_ipv6:bool, is_tcp:bool, has_to_filter:bool = True): - """Forward data from source to destination.""" +async def watch_filter_file(filter_file: str, reload_action): + abs_path = os.path.abspath(filter_file) + directory = os.path.dirname(abs_path) + # Immediately call the reload action on startup. + if reload_action is not None: + reload_action() + log_print("observer", f"Listening for changes on {escape(abs_path)}") + try: + # Monitor the directory; set recursive=False since we only care about the specific file. + async for changes in awatch(directory, recursive=False): + # Process events and filter for our file. + for change in changes: + event, path = change + if os.path.abspath(path) == abs_path: + # Optionally, you can check the event type: + if event in {Change.modified, Change.deleted}: + if reload_action is not None: + reload_action() + except asyncio.CancelledError: + log_print("observer", "Watcher cancelled, stopping.") + +async def forward_and_filter(filter_ctx: dict, + reader: asyncio.StreamReader, + writer: asyncio.StreamWriter, + is_input: bool, + is_ipv6: bool, + is_tcp: bool, + has_to_filter: bool = True): + """Asynchronously forward data from reader to writer applying filters.""" try: - def forward(data:bytes): - try: - destination.sendall(data) - except OSError: - return - def stop_filter_action(data:bytes): - nonlocal has_to_filter - has_to_filter = False - forward(data) while True: try: - data = source.recv(4096) - except OSError: - return + data = await reader.read(4096) + except Exception: + break if not data: break + if has_to_filter: filter_ctx["__firegex_packet_info"] = { "data": data, "l4_size": len(data), - "raw_packet": fake_ip_header+data, + "raw_packet": fake_ip_header + data, "is_input": is_input, "is_ipv6": is_ipv6, "is_tcp": is_tcp @@ -85,103 +86,151 @@ def _forward_and_filter(filter_ctx:dict, source:socket.socket, destination:socke try: exec("firegex.nfproxy.internals.handle_packet(globals())", filter_ctx, filter_ctx) except Exception as e: - log_print("packet-handling", f"Error while executing filter: {escape(str(e))}, forwarding normally from now", level=LogLevels.ERROR) + log_print("packet-handling", + f"Error while executing filter: {escape(str(e))}, forwarding normally from now", + level=LogLevels.ERROR) traceback.print_exc() - stop_filter_action(data) + # Stop filtering and forward the packet as is. + has_to_filter = False + writer.write(data) + await writer.drain() continue finally: - if "__firegex_packet_info" in filter_ctx.keys(): - del filter_ctx["__firegex_packet_info"] - - result = filter_ctx.get("__firegex_pyfilter_result", None) - - if result is not None: - del filter_ctx["__firegex_pyfilter_result"] - + filter_ctx.pop("__firegex_packet_info", None) + + result = filter_ctx.pop("__firegex_pyfilter_result", None) if result is None or not isinstance(result, dict): log_print("filter-parsing", "No result found", level=LogLevels.ERROR) - stop_filter_action(data) + has_to_filter = False + writer.write(data) + await writer.drain() continue - action = result.get("action", None) - + + action = result.get("action") if action is None or not isinstance(action, int): log_print("filter-parsing", "No action found", level=LogLevels.ERROR) - stop_filter_action(data) + has_to_filter = False + writer.write(data) + await writer.drain() continue - + if action == ACCEPT.value: - forward(data) + writer.write(data) + await writer.drain() continue - - filter_name = result.get("matched_by", None) + + filter_name = result.get("matched_by") if filter_name is None or not isinstance(filter_name, str): log_print("filter-parsing", "No matched_by found", level=LogLevels.ERROR) - stop_filter_action(data) + has_to_filter = False + writer.write(data) + await writer.drain() continue - + if action == DROP.value: log_print("drop-action", "Dropping packet can't be simulated, so the connection will be rejected", level=LogLevels.WARNING) action = REJECT.value - + if action == REJECT.value: log_print("reject-action", f"Rejecting connection caused by {escape(filter_name)} pyfilter") - source.close() - destination.close() + writer.close() + await writer.wait_closed() return + elif action == UNSTABLE_MANGLE.value: - mangled_packet = result.get("mangled_packet", None) + mangled_packet = result.get("mangled_packet") if mangled_packet is None or not isinstance(mangled_packet, bytes): log_print("filter-parsing", "No mangled_packet found", level=LogLevels.ERROR) - stop_filter_action(data) + has_to_filter = False + writer.write(data) + await writer.drain() continue log_print("mangle", f"Mangling packet caused by {escape(filter_name)} pyfilter") - log_print("mangle", "In the real execution mangling is not so stable as the simulation does, l4_data can be different by data", level=LogLevels.WARNING) - forward(mangled_packet[fake_ip_header_len:]) + log_print("mangle", + "In the real execution mangling is not so stable as the simulation does, l4_data can be different by data", + level=LogLevels.WARNING) + writer.write(mangled_packet[fake_ip_header_len:]) + await writer.drain() continue else: log_print("filter-parsing", f"Invalid action {action} found", level=LogLevels.ERROR) - stop_filter_action(data) + has_to_filter = False + writer.write(data) + await writer.drain() continue - forward(data) + else: + writer.write(data) + await writer.drain() + except Exception as exc: + log_print("forward_and_filter", f"Exception occurred: {escape(str(exc))}", level=LogLevels.ERROR) finally: - source.close() - destination.close() + writer.close() + try: + await writer.wait_closed() + except Exception: + pass -def _execute_proxy(filter_code:str, target_ip:str, target_port:int, local_ip:str = "127.0.0.1", local_port:int = 7474, ipv6:bool = False): - - addr_family = socket.AF_INET6 if ipv6 else socket.AF_INET - server = socket.socket(addr_family, socket.SOCK_STREAM) - server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - server.bind((local_ip, local_port)) - server.listen(5) - - log_print("listener", f"TCP proxy listening on {escape(local_ip)}:{local_port} and forwarding to -> {escape(target_ip)}:{target_port}") +async def handle_connection( + reader: asyncio.StreamReader, writer: asyncio.StreamWriter, filter_code: str, + target_ip: str, target_port: int, ipv6: bool): + """Handle a new incoming connection and create a remote connection.""" + addr = writer.get_extra_info('peername') + log_print("listener", f"Accepted connection from {escape(addr[0])}:{addr[1]}") try: - while True: - client_socket, addr = server.accept() - log_print("listener", f"Accepted connection from {escape(addr[0])}:{addr[1]}") - try: - remote_socket = socket.socket(addr_family, socket.SOCK_STREAM) - remote_socket.connect((target_ip, target_port)) - except Exception as e: - log_print("listener", f"Could not connect to remote {escape(target_ip)}:{target_port}: {escape(str(e))}", level=LogLevels.ERROR) - client_socket.close() - continue - try: - filter_ctx = {} - exec(filter_code, filter_ctx, filter_ctx) - # Start two threads to forward data in both directions. - threading.Thread(target=_forward_and_filter, args=(filter_ctx, client_socket, remote_socket, True, ipv6, True, True)).start() - threading.Thread(target=_forward_and_filter, args=(filter_ctx, remote_socket, client_socket, False, ipv6, True, True)).start() - except Exception as e: - log_print("listener", f"Error while compiling filter context: {escape(str(e))}, forwarding normally", level=LogLevels.ERROR) - traceback.print_exc() - threading.Thread(target=_forward_and_filter, args=(filter_ctx, client_socket, remote_socket, True, ipv6, True, False)).start() - threading.Thread(target=_forward_and_filter, args=(filter_ctx, remote_socket, client_socket, False, ipv6, True, False)).start() - except KeyboardInterrupt: - log_print("listener", "Proxy stopped by user") + remote_reader, remote_writer = await asyncio.open_connection( + target_ip, target_port, + family=socket.AF_INET6 if ipv6 else socket.AF_INET) + except Exception as e: + log_print("listener", + f"Could not connect to remote {escape(target_ip)}:{target_port}: {escape(str(e))}", + level=LogLevels.ERROR) + writer.close() + await writer.wait_closed() + return + + try: + filter_ctx = {} + exec(filter_code, filter_ctx, filter_ctx) + except Exception as e: + log_print("listener", + f"Error while compiling filter context: {escape(str(e))}, forwarding normally", + level=LogLevels.ERROR) + traceback.print_exc() + filter_ctx = {} + # Create asynchronous tasks for bidirectional forwarding. + task1 = asyncio.create_task(forward_and_filter(filter_ctx, reader, remote_writer, True, ipv6, True, True)) + task2 = asyncio.create_task(forward_and_filter(filter_ctx, remote_reader, writer, False, ipv6, True, True)) + try: + await asyncio.gather(task1, task2) + except (KeyboardInterrupt, asyncio.CancelledError): + task1.cancel() + task2.cancel() + await asyncio.gather(task1, task2) finally: - server.close() + remote_writer.close() + await remote_writer.wait_closed() + +async def _execute_proxy( + filter_code: str, + target_ip: str, target_port: int, + local_ip: str = "127.0.0.1", local_port: int = 7474, + ipv6: bool = False +): + """Start the asyncio-based TCP proxy server.""" + addr_family = socket.AF_INET6 if ipv6 else socket.AF_INET + server = await asyncio.start_server( + lambda r, w: handle_connection(r, w, filter_code, target_ip, target_port, ipv6), + local_ip, local_port, family=addr_family) + log_print("listener", f"TCP proxy listening on {escape(local_ip)}:{local_port} and forwarding to -> {escape(target_ip)}:{target_port}") + async with server: + await server.serve_forever() + + +def _proxy_asyncio_runner(filter_code: str, target_ip: str, target_port: int, local_ip: str, local_port: int, ipv6: bool): + try: + return asyncio.run(_execute_proxy(filter_code, target_ip, target_port, local_ip, local_port, ipv6)) + except KeyboardInterrupt: + log_print("listener", "Proxy server stopped", level=LogLevels.WARNING) def _build_filter(filepath:str, proto:str): if os.path.isfile(filepath) is False: @@ -219,7 +268,7 @@ def run_proxy_simulation(filter_file:str, proto:str, target_ip:str, target_port: def reload_proxy_proc(): nonlocal proxy_process if proxy_process is not None: - proxy_process.terminate() + proxy_process.kill() proxy_process.join() proxy_process = None @@ -230,19 +279,16 @@ def run_proxy_simulation(filter_file:str, proto:str, target_ip:str, target_port: log_print("reloader", f"Failed to build filter {escape(filter_file)}!", level=LogLevels.ERROR) traceback.print_exc() if compiled_filter is not None: - proxy_process = Process(target=_execute_proxy, args=(compiled_filter, target_ip, target_port, local_ip, local_port, ipv6)) + proxy_process = Process(target=_proxy_asyncio_runner, args=(compiled_filter, target_ip, target_port, local_ip, local_port, ipv6)) proxy_process.start() - - observer = Observer() - handler = ProxyFilterHandler(reload_proxy_proc) - observer.schedule(handler, os.path.abspath(filter_file), recursive=False) - observer.start() - reload_proxy_proc() - log_print("observer", f"Listening for changes on {escape(os.path.abspath(filter_file))}") try: - observer.join() + asyncio.run(watch_filter_file(filter_file, reload_proxy_proc)) except KeyboardInterrupt: - observer.stop() + pass + finally: + if proxy_process is not None: + proxy_process.kill() + proxy_process.join() diff --git a/fgex-lib/requirements.txt b/fgex-lib/requirements.txt index ae67857..17654e5 100644 --- a/fgex-lib/requirements.txt +++ b/fgex-lib/requirements.txt @@ -1,6 +1,6 @@ typer==0.15.1 pydantic>=2 typing-extensions>=4.7.1 -watchdog>=6.0.0 +watchfiles fgex pyllhttp From 22b90376b36fab04fa6626fdd51c1109fbbfa83b Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Tue, 4 Mar 2025 16:57:15 +0100 Subject: [PATCH 12/18] minor fixes --- fgex-lib/fgex-pip/setup.py | 4 ++-- fgex-lib/firegex/__init__.py | 4 +--- fgex-lib/firegex/cli.py | 23 ++++++++++++++++++- .../firegex/nfproxy/internals/__init__.py | 3 ++- fgex-lib/firegex/nfproxy/proxysim/__init__.py | 3 +++ fgex-lib/requirements.txt | 2 +- 6 files changed, 31 insertions(+), 8 deletions(-) diff --git a/fgex-lib/fgex-pip/setup.py b/fgex-lib/fgex-pip/setup.py index b4bf8ce..37c85b2 100644 --- a/fgex-lib/fgex-pip/setup.py +++ b/fgex-lib/fgex-pip/setup.py @@ -5,11 +5,11 @@ with open("README.md", "r", encoding="utf-8") as fh: setuptools.setup( name="fgex", - version="0.0.0", + version="0.0.1", author="Pwnzer0tt1", author_email="pwnzer0tt1@poliba.it", py_modules=["fgex"], - install_requires=["fgex"], + install_requires=["firegex"], include_package_data=True, description="Firegex client", long_description=long_description, diff --git a/fgex-lib/firegex/__init__.py b/fgex-lib/firegex/__init__.py index 5f63222..fc84752 100644 --- a/fgex-lib/firegex/__init__.py +++ b/fgex-lib/firegex/__init__.py @@ -2,6 +2,4 @@ __version__ = "{{VERSION_PLACEHOLDER}}" if "{" not in "{{VERSION_PLACEHOLDER}}" else "0.0.0" #Exported functions -__all__ = [ - -] \ No newline at end of file +__all__ = [] diff --git a/fgex-lib/firegex/cli.py b/fgex-lib/firegex/cli.py index 3920a0b..99b1207 100644 --- a/fgex-lib/firegex/cli.py +++ b/fgex-lib/firegex/cli.py @@ -3,10 +3,13 @@ import typer from rich import print +from rich.markup import escape from typer import Exit from firegex import __version__ from firegex.nfproxy.proxysim import run_proxy_simulation from firegex.nfproxy.models import Protocols +import os +import socket app = typer.Typer( no_args_is_help=True, @@ -18,6 +21,19 @@ def close_cli(code:int=1): DEV_MODE = __version__ == "0.0.0" +def test_connection(host, port, use_ipv6=False): + family = socket.AF_INET6 if use_ipv6 else socket.AF_INET + sock = socket.socket(family, socket.SOCK_STREAM) + + try: + sock.settimeout(3) + sock.connect((host, port)) + return True + except Exception: + return False + finally: + sock.close() + @app.command(help="Run an nfproxy simulation") def nfproxy( filter_file: str = typer.Argument(..., help="The path to the filter file"), @@ -31,7 +47,12 @@ def nfproxy( ): if from_address is None: from_address = "::1" if ipv6 else "127.0.0.1" - + if not os.path.isfile(filter_file): + print(f"[bold red]'{escape(os.path.abspath(filter_file))}' not found[/]") + close_cli() + if not test_connection(address, port, ipv6): + print(f"[bold red]Can't connect to {escape(address)}:{port}[/]") + close_cli() run_proxy_simulation(filter_file, proto.value, address, port, from_address, from_port, ipv6) def version_callback(verison: bool): diff --git a/fgex-lib/firegex/nfproxy/internals/__init__.py b/fgex-lib/firegex/nfproxy/internals/__init__.py index 6033eee..9dbd689 100644 --- a/fgex-lib/firegex/nfproxy/internals/__init__.py +++ b/fgex-lib/firegex/nfproxy/internals/__init__.py @@ -57,8 +57,9 @@ def generate_filter_structure(filters: list[str], proto:str, glob:dict) -> list[ def get_filters_info(code:str, proto:str) -> list[FilterHandler]: glob = {} - exec(code, glob, glob) exec("import firegex.nfproxy", glob, glob) + exec("firegex.nfproxy.clear_pyfilter_registry()", glob, glob) + exec(code, glob, glob) filters = eval("firegex.nfproxy.get_pyfilters()", glob, glob) try: return generate_filter_structure(filters, proto, glob) diff --git a/fgex-lib/firegex/nfproxy/proxysim/__init__.py b/fgex-lib/firegex/nfproxy/proxysim/__init__.py index 31d1d57..a82f755 100644 --- a/fgex-lib/firegex/nfproxy/proxysim/__init__.py +++ b/fgex-lib/firegex/nfproxy/proxysim/__init__.py @@ -262,12 +262,15 @@ def run_proxy_simulation(filter_file:str, proto:str, target_ip:str, target_port: if os.path.isfile(filter_file) is False: raise Exception(f"\\[nfproxy]\\[init] Filter file {filter_file} not found") + else: + filter_file = os.path.abspath(filter_file) proxy_process:Process|None = None def reload_proxy_proc(): nonlocal proxy_process if proxy_process is not None: + log_print("RELOADING", "Proxy reload triggered", level=LogLevels.WARNING) proxy_process.kill() proxy_process.join() proxy_process = None diff --git a/fgex-lib/requirements.txt b/fgex-lib/requirements.txt index 17654e5..15e2e37 100644 --- a/fgex-lib/requirements.txt +++ b/fgex-lib/requirements.txt @@ -1,4 +1,4 @@ -typer==0.15.1 +typer==0.15.2 pydantic>=2 typing-extensions>=4.7.1 watchfiles From e31796b2496dd37bc44513ecb02534df6e3dffe0 Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Wed, 5 Mar 2025 10:02:15 +0100 Subject: [PATCH 13/18] push partial docs --- frontend/src/components/DocsButton.tsx | 39 +++++++ frontend/src/components/Firewall/utils.ts | 2 +- .../src/components/NFProxy/NFProxyDocs.tsx | 105 ++++++++++++++++++ .../src/components/NFRegex/NFRegexDocs.tsx | 69 ++++++++++++ .../components/PortHijack/PortHijackDocs.tsx | 9 ++ frontend/src/js/utils.tsx | 7 ++ frontend/src/pages/NFProxy/index.tsx | 3 + frontend/src/pages/NFRegex/index.tsx | 3 + frontend/src/pages/PortHijack/index.tsx | 3 + 9 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/DocsButton.tsx create mode 100644 frontend/src/components/NFProxy/NFProxyDocs.tsx create mode 100644 frontend/src/components/NFRegex/NFRegexDocs.tsx create mode 100644 frontend/src/components/PortHijack/PortHijackDocs.tsx diff --git a/frontend/src/components/DocsButton.tsx b/frontend/src/components/DocsButton.tsx new file mode 100644 index 0000000..0d1ef5b --- /dev/null +++ b/frontend/src/components/DocsButton.tsx @@ -0,0 +1,39 @@ +import { ActionIcon, Box, Modal, ScrollArea, Title, Tooltip } from "@mantine/core"; +import { useState } from "react"; +import { FaBookBookmark } from "react-icons/fa6"; +import { NFRegexDocs } from "./NFRegex/NFRegexDocs"; +import { NFProxyDocs } from "./NFProxy/NFProxyDocs"; +import { PortHijackDocs } from "./PortHijack/PortHijackDocs"; +import { EnumToPrimitiveUnion } from "../js/utils"; + + +export enum DocType{ + NFREGEX = "nfregex", + NFPROXY = "nfproxy", + PORTHIJACK = "porthijack", +} + + +export const DocsButton = ({ doc }: { doc: EnumToPrimitiveUnion }) => { + const [open, setOpen] = useState(false); + + return + + setOpen(true)} size="lg" radius="md" variant="filled"> + + setOpen(false)} fullScreen title={ + Firegex Docs 📕 + } scrollAreaComponent={ScrollArea.Autosize}> + { + doc == DocType.NFREGEX ? + : + doc == DocType.NFPROXY ? + : + doc == DocType.PORTHIJACK ? + : + Docs not found + } + + +} + diff --git a/frontend/src/components/Firewall/utils.ts b/frontend/src/components/Firewall/utils.ts index c051df8..54fc4cc 100644 --- a/frontend/src/components/Firewall/utils.ts +++ b/frontend/src/components/Firewall/utils.ts @@ -90,4 +90,4 @@ export const firewall = { ruleset: async (data:RuleAddForm) => { return await postapi("firewall/rules", data) as ServerResponseListed; } -} \ No newline at end of file +} diff --git a/frontend/src/components/NFProxy/NFProxyDocs.tsx b/frontend/src/components/NFProxy/NFProxyDocs.tsx new file mode 100644 index 0000000..bbf0179 --- /dev/null +++ b/frontend/src/components/NFProxy/NFProxyDocs.tsx @@ -0,0 +1,105 @@ +import { CodeHighlight } from "@mantine/code-highlight"; +import { Container, Title, Text, List, Code, Space } from "@mantine/core"; + +const IMPORT_CODE_EXAMPLE = `from firegex.nfproxy import pyfilter, ACCEPT, REJECT` + +const FOO_FILTER_CODE = `from firegex.nfproxy import pyfilter, ACCEPT, REJECT + +# This is NOT a filter +def useless_function() -> int: + print("This is a useless function") + return 42 + +@pyfilter +def none_filter(): # This is a filter that does nothing + useless_function() + return ACCEPT + +` + + +export const NFProxyDocs = () => { + return ( + + 🌐 Netfilter Proxy Documentation + + 📖 Overview + + Netfilter Proxy is a simulated proxy that leverages nfqueue to intercept network packets. + It follows a similar workflow to NFRegex but introduces Python-based filtering capabilities, + providing users with the flexibility to upload custom filters. + + + ⚙️ How to Use Netfilter Proxy + + To use Netfilter Proxy, simply create and upload a Python filter. The filter is passed to the C++ binary, + which then processes packets using the provided logic. This allows you to tailor the filtering behavior + to your needs. + + + 🚀 How It Works + + The proxy is built on a multi-threaded architecture and integrates Python for dynamic filtering: + + + + + Packet Interception: + The nfqueue kernel module intercepts network packets(a netfilter module) 🔍
+ The rules for attach the nfqueue on the network traffic is done by the nftables lib with json APIs by the python manager. +
+
+ + + Packet Reading: + A dedicated thread reads packets from nfqueue. 🧵 + + + + + Multi-threaded Analysis: + The C++ binary launches multiple threads, each starting its own Python interpreter. + Thanks to Python 3.12’s support for a per-interpeter GIL, real multithreading is achieved. + Traffic is distributed among threads based on IP addresses and port hashing, ensuring that + packets belonging to the same flow are processed by the same thread. ⚡️ + + + + + Python Filter Integration: + Users can upload custom Python filters which are then executed by the interpreter, + allowing for dynamic and flexible packet handling. 🐍 + + + + + + HTTP Parsing: + A Python wrapper for llhttp (forked and adapted for working with multi-interpeters) is used to parse HTTP connections, making it easier to handle + and analyze HTTP traffic. 📡 + + +
+ + 💡 How to write pyfilters? + + First of all install the firegex lib and update it running pip install -U fgex. + After that you can use firegex module. + + With this code we imported the pyfilter decorator and the ACCEPT and REJECT constants.
+ Let's create a first (useless) filter to see the syntax: + + You see that the filter must be decorated with the pyfilter decorator and must return a statement about how to manage that packet. +
+ You can save every data about the current flow in the global variables, the code you write will be executed only once for flow. The globals are isolated between flows. + For each packet the filter functions will be called with the required paramethers and the same globals as before. +
+ Saving data in globals of other modules is not recommended, because that memory is shared by the flows managed by the same thread and lead to unexpected behaviors. +
+ Global variables that starts with __firegex_ are reserved for internal use, don't use them. + +
+ + + ); +}; diff --git a/frontend/src/components/NFRegex/NFRegexDocs.tsx b/frontend/src/components/NFRegex/NFRegexDocs.tsx new file mode 100644 index 0000000..aee093b --- /dev/null +++ b/frontend/src/components/NFRegex/NFRegexDocs.tsx @@ -0,0 +1,69 @@ +import { Container, Title, Text, List } from "@mantine/core"; + +export const NFRegexDocs = () => { + return ( + + 📡 Netfilter Regex Documentation + + 📖 Overview + + Netfilter Regex is a powerful feature that enables filtering of network packets using regular expressions. This capability is especially useful when you need to inspect packet content and match specific strings or patterns. + + + ⚙️ How to Use Netfilter Regex + + To get started, create a service and attach a regular expression to it. Once the service is configured, apply it to a network interface to dynamically filter packets based on the defined regex. + + + 🚀 How It Works + + The packet filtering process is implemented in C++ and involves several key steps: + + + + + Packet Interception: + The nfqueue kernel module intercepts network packets (a netfilter module) 🔍
+ The rules for attach the nfqueue on the network traffic is done by the nftables lib with json APIs by the python manager. +
+
+ + + Packet Reading: + A dedicated thread reads packets from nfqueue. 🧵 + + + + + Packet Parsing: + Intercepted packets are parsed by libtins, a C++ library that extracts the payload from each packet. 📄 + + + + + Multi-threaded Analysis: + Multiple threads analyze packets concurrently. + While the nfqueue module balances network + load based solely on IP addresses—resulting in a single thread handling traffic in NAT environments + like CTF networks, firegex manage this threads user-level in a different way. + The traffic is routed in the threads based on IP addresses combined with port hashing, + ensuring a more balanced workload and that flows will be analyzed by the same thread. ⚡️ + + + + + TCP Handling: + For TCP connections, libtins employs a TCP follower to order packets received from the kernel. 📈 + + + + + Regex Matching: + The extracted payload is processed using vectorscan — a fork of hyperscan that runs also on arm64. + For UDP packets, matching occurs on a per-packet basis while saving only the match context rather than the full payload. 🎯 + + +
+
+ ); +}; diff --git a/frontend/src/components/PortHijack/PortHijackDocs.tsx b/frontend/src/components/PortHijack/PortHijackDocs.tsx new file mode 100644 index 0000000..8b62750 --- /dev/null +++ b/frontend/src/components/PortHijack/PortHijackDocs.tsx @@ -0,0 +1,9 @@ +import { Box } from "@mantine/core" + + +export const PortHijackDocs = () => { + return + PORT + {/* TODO write me pls */} + +} \ No newline at end of file diff --git a/frontend/src/js/utils.tsx b/frontend/src/js/utils.tsx index 20c7527..56297fd 100644 --- a/frontend/src/js/utils.tsx +++ b/frontend/src/js/utils.tsx @@ -20,6 +20,13 @@ export const DEV_IP_BACKEND = "127.0.0.1:4444" export const WARNING_NFPROXY_TIME_LIMIT = 1000*60*10 // 10 minutes +export type EnumToPrimitiveUnion = `${T & string}` | ParseNumber<`${T & number}`>; +type ParseNumber = T extends `${infer U extends number}` ? U : never; + +export function typeCastEnum(value: EnumToPrimitiveUnion): E { + return value as E; +} + export const socketio = import.meta.env.DEV? io("ws://"+DEV_IP_BACKEND, { path:"/sock/socket.io", diff --git a/frontend/src/pages/NFProxy/index.tsx b/frontend/src/pages/NFProxy/index.tsx index 4de0959..f95d69b 100644 --- a/frontend/src/pages/NFProxy/index.tsx +++ b/frontend/src/pages/NFProxy/index.tsx @@ -13,6 +13,7 @@ import { MdUploadFile } from "react-icons/md"; import { notifications } from '@mantine/notifications'; import { useFileDialog } from '@mantine/hooks'; import { CodeHighlight } from '@mantine/code-highlight'; +import { DocsButton } from '../../components/DocsButton'; export default function NFProxy({ children }: { children: any }) { @@ -131,6 +132,8 @@ export default function NFProxy({ children }: { children: any }) { + + diff --git a/frontend/src/pages/NFRegex/index.tsx b/frontend/src/pages/NFRegex/index.tsx index f5df64d..16c5e7c 100644 --- a/frontend/src/pages/NFRegex/index.tsx +++ b/frontend/src/pages/NFRegex/index.tsx @@ -12,6 +12,7 @@ import { TbReload } from 'react-icons/tb'; import { FaFilter } from 'react-icons/fa'; import { FaServer } from "react-icons/fa6"; import { VscRegex } from "react-icons/vsc"; +import { DocsButton } from '../../components/DocsButton'; function NFRegex({ children }: { children: any }) { @@ -59,6 +60,8 @@ function NFRegex({ children }: { children: any }) { queryClient.invalidateQueries(["nfregex"])} size="lg" radius="md" variant="filled" loading={services.isFetching}> + + diff --git a/frontend/src/pages/PortHijack/index.tsx b/frontend/src/pages/PortHijack/index.tsx index e6fa5ce..a0c1072 100644 --- a/frontend/src/pages/PortHijack/index.tsx +++ b/frontend/src/pages/PortHijack/index.tsx @@ -9,6 +9,7 @@ import { useQueryClient } from '@tanstack/react-query'; import { TbReload } from 'react-icons/tb'; import { FaServer } from 'react-icons/fa'; import { GrDirections } from 'react-icons/gr'; +import { DocsButton } from '../../components/DocsButton'; function PortHijack() { @@ -42,6 +43,8 @@ function PortHijack() { queryClient.invalidateQueries(["porthijack"])} size="lg" radius="md" variant="filled" loading={services.isFetching}> + + From 5a523817cca2b39d814d749648f856ebe917732d Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Wed, 5 Mar 2025 10:04:28 +0100 Subject: [PATCH 14/18] Update regexfilter.cpp --- backend/binsrc/regex/regexfilter.cpp | 118 ++++++++++----------------- 1 file changed, 41 insertions(+), 77 deletions(-) diff --git a/backend/binsrc/regex/regexfilter.cpp b/backend/binsrc/regex/regexfilter.cpp index bfb2407..2aef9ff 100644 --- a/backend/binsrc/regex/regexfilter.cpp +++ b/backend/binsrc/regex/regexfilter.cpp @@ -20,6 +20,7 @@ #include "../classes/netfilter.cpp" #include "stream_ctx.cpp" #include "regex_rules.cpp" +#include "../utils.cpp" using namespace std; @@ -30,22 +31,14 @@ namespace Regex { using Tins::TCPIP::Stream; using Tins::TCPIP::StreamFollower; - - class RegexNfQueue : public NfQueue::ThreadNfQueue { public: stream_ctx sctx; u_int16_t latest_config_ver = 0; StreamFollower follower; - struct { - bool matching_has_been_called = false; - bool already_closed = false; - bool result; - NfQueue::PktRequest* pkt; - } match_ctx; - + NfQueue::PktRequest* pkt; - bool filter_action(NfQueue::PktRequest* pkt){ + bool filter_action(NfQueue::PktRequest* pkt, const string& data){ shared_ptr conf = regex_config; auto current_version = conf->ver(); @@ -91,12 +84,12 @@ public: stream_match = stream_search->second; } err = hs_scan_stream( - stream_match,pkt->data, pkt->data_size, + stream_match, data.c_str(), data.size(), 0, scratch_space, match_func, &match_res ); }else{ err = hs_scan( - regex_matcher,pkt->data, pkt->data_size, + regex_matcher, data.c_str(), data.size(), 0, scratch_space, match_func, &match_res ); } @@ -108,7 +101,7 @@ public: throw invalid_argument("Cannot close stream match on hyperscan"); } if (err != HS_SUCCESS && err != HS_SCAN_TERMINATED) { - cerr << "[error] [filter_callback] Error while matching the stream (hs)" << endl; + cerr << "[error] [filter_callback] Error while matching the stream (hs) " << err << endl; throw invalid_argument("Error while matching the stream with hyperscan"); } if (match_res.has_matched){ @@ -119,85 +112,30 @@ public: return true; } - void handle_next_packet(NfQueue::PktRequest* pkt) override{ - bool empty_payload = pkt->data_size == 0; - if (pkt->tcp){ - match_ctx.matching_has_been_called = false; - match_ctx.pkt = pkt; - - if (pkt->ipv4){ - follower.process_packet(*pkt->ipv4); - }else{ - follower.process_packet(*pkt->ipv6); - } - - // Do an action only is an ordered packet has been received - if (match_ctx.matching_has_been_called){ - - //In this 2 cases we have to remove all data about the stream - if (!match_ctx.result || match_ctx.already_closed){ - sctx.clean_stream_by_id(pkt->sid); - //If the packet has data, we have to remove it - if (!empty_payload){ - Tins::PDU* data_layer = pkt->tcp->release_inner_pdu(); - if (data_layer != nullptr){ - delete data_layer; - } - } - //For the first matched data or only for data packets, we set FIN bit - //This only for client packets, because this will trigger server to close the connection - //Packets will be filtered anyway also if client don't send packets - if ((!match_ctx.result || !empty_payload) && pkt->is_input){ - pkt->tcp->set_flag(Tins::TCP::FIN,1); - pkt->tcp->set_flag(Tins::TCP::ACK,1); - pkt->tcp->set_flag(Tins::TCP::SYN,0); - } - //Send the edited packet to the kernel - return pkt->mangle(); - } - } - return pkt->accept(); - }else{ - if (!pkt->udp){ - throw invalid_argument("Only TCP and UDP are supported"); - } - if(empty_payload){ - return pkt->accept(); - }else if (filter_action(pkt)){ - return pkt->accept(); - }else{ - return pkt->drop(); - } - } - } //If the stream has already been matched, drop all data, and try to close the connection static void keep_fin_packet(RegexNfQueue* nfq){ - nfq->match_ctx.matching_has_been_called = true; - nfq->match_ctx.already_closed = true; + nfq->pkt->reject(); // This is needed because the callback has to take the updated pkt pointer! } - static void on_data_recv(Stream& stream, RegexNfQueue* nfq, string data) { - nfq->match_ctx.matching_has_been_called = true; - nfq->match_ctx.already_closed = false; - nfq->match_ctx.pkt->data = data.data(); - nfq->match_ctx.pkt->data_size = data.size(); - bool result = nfq->filter_action(nfq->match_ctx.pkt); - if (!result){ - nfq->sctx.clean_stream_by_id(nfq->match_ctx.pkt->sid); + static void on_data_recv(Stream& stream, RegexNfQueue* nfq, const string& data) { + if (!nfq->filter_action(nfq->pkt, data)){ + nfq->sctx.clean_stream_by_id(nfq->pkt->sid); stream.client_data_callback(bind(keep_fin_packet, nfq)); stream.server_data_callback(bind(keep_fin_packet, nfq)); + nfq->pkt->reject(); } - nfq->match_ctx.result = result; } //Input data filtering static void on_client_data(Stream& stream, RegexNfQueue* nfq) { - on_data_recv(stream, nfq, string(stream.client_payload().begin(), stream.client_payload().end())); + auto data = stream.client_payload(); + on_data_recv(stream, nfq, string((char*)data.data(), data.size())); } //Server data filtering static void on_server_data(Stream& stream, RegexNfQueue* nfq) { - on_data_recv(stream, nfq, string(stream.server_payload().begin(), stream.server_payload().end())); + auto data = stream.server_payload(); + on_data_recv(stream, nfq, string((char*)data.data(), data.size())); } // A stream was terminated. The second argument is the reason why it was terminated @@ -216,6 +154,32 @@ public: stream.stream_closed_callback(bind(on_stream_close, placeholders::_1, nfq)); } + void handle_next_packet(NfQueue::PktRequest* _pkt) override{ + pkt = _pkt; // Setting packet context + if (pkt->tcp){ + if (pkt->ipv4){ + follower.process_packet(*pkt->ipv4); + }else{ + follower.process_packet(*pkt->ipv6); + } + //Fallback to the default action + if (pkt->get_action() == NfQueue::FilterAction::NOACTION){ + return pkt->accept(); + } + }else{ + if (!pkt->udp){ + throw invalid_argument("Only TCP and UDP are supported"); + } + if(pkt->data_size() == 0){ + return pkt->accept(); + }else if (filter_action(pkt, string(pkt->data(), pkt->data_size()))){ + return pkt->accept(); + }else{ + return pkt->drop(); + } + } + } + void before_loop() override{ follower.new_stream_callback(bind(on_new_stream, placeholders::_1, this)); follower.stream_termination_callback(bind(on_stream_close, placeholders::_1, this)); From 3494d10032ed7a861fa2dfd6cc7ec82f2d28ebf2 Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Wed, 5 Mar 2025 14:05:31 +0100 Subject: [PATCH 15/18] docs completed --- fgex-lib/firegex/nfproxy/models/http.py | 6 +- fgex-lib/firegex/nfproxy/proxysim/__init__.py | 32 +- frontend/src/components/DocsButton.tsx | 9 +- .../src/components/NFProxy/NFProxyDocs.tsx | 349 ++++++++++++++++-- frontend/src/components/NFProxy/utils.ts | 17 +- .../components/PortHijack/PortHijackDocs.tsx | 38 +- frontend/src/pages/Firewall/index.tsx | 23 +- frontend/src/pages/NFProxy/ServiceDetails.tsx | 9 +- frontend/src/pages/NFProxy/index.tsx | 22 +- frontend/src/pages/NFRegex/index.tsx | 20 +- frontend/src/pages/PortHijack/index.tsx | 21 +- 11 files changed, 452 insertions(+), 94 deletions(-) diff --git a/fgex-lib/firegex/nfproxy/models/http.py b/fgex-lib/firegex/nfproxy/models/http.py index 7ec3a3f..9cbc5f0 100644 --- a/fgex-lib/firegex/nfproxy/models/http.py +++ b/fgex-lib/firegex/nfproxy/models/http.py @@ -188,10 +188,6 @@ class InternalBasicHttpMetaClass: def content_length(self) -> int|None: return self._parser.content_length_parsed - @property - def method(self) -> str|None: - return self._parser.method_parsed - def get_header(self, header: str, default=None) -> str: return self._parser.lheaders.get(header.lower(), default) @@ -271,7 +267,7 @@ class HttpRequest(InternalBasicHttpMetaClass): @property def method(self) -> bytes: - return self._parser.method + return self._parser.method_parsed def _before_fetch_callable_checks(self, internal_data: DataStreamCtx): return internal_data.current_pkt.is_input diff --git a/fgex-lib/firegex/nfproxy/proxysim/__init__.py b/fgex-lib/firegex/nfproxy/proxysim/__init__.py index a82f755..d604cd1 100644 --- a/fgex-lib/firegex/nfproxy/proxysim/__init__.py +++ b/fgex-lib/firegex/nfproxy/proxysim/__init__.py @@ -12,6 +12,8 @@ from watchfiles import awatch, Change fake_ip_header = b"FAKE:IP:TCP:HEADERS:" fake_ip_header_len = len(fake_ip_header) +MANGLE_WARNING = True + class LogLevels: INFO = "INFO" WARNING = "WARNING" @@ -36,7 +38,7 @@ def load_level_str(level:str): def log_print(module:str, *args, level:str = LogLevels.INFO, **kwargs): return print(f"{load_level_str(level)}[deep_pink4 bold]\\[nfproxy][/][medium_orchid3 bold]\\[{escape(module)}][/]", *args, **kwargs) -async def watch_filter_file(filter_file: str, reload_action): +async def _watch_filter_file(filter_file: str, reload_action): abs_path = os.path.abspath(filter_file) directory = os.path.dirname(abs_path) # Immediately call the reload action on startup. @@ -57,7 +59,7 @@ async def watch_filter_file(filter_file: str, reload_action): except asyncio.CancelledError: log_print("observer", "Watcher cancelled, stopping.") -async def forward_and_filter(filter_ctx: dict, +async def _forward_and_filter(filter_ctx: dict, reader: asyncio.StreamReader, writer: asyncio.StreamWriter, is_input: bool, @@ -66,6 +68,7 @@ async def forward_and_filter(filter_ctx: dict, has_to_filter: bool = True): """Asynchronously forward data from reader to writer applying filters.""" try: + has_to_drop = False while True: try: data = await reader.read(4096) @@ -73,7 +76,8 @@ async def forward_and_filter(filter_ctx: dict, break if not data: break - + if has_to_drop: + continue if has_to_filter: filter_ctx["__firegex_packet_info"] = { "data": data, @@ -128,8 +132,9 @@ async def forward_and_filter(filter_ctx: dict, continue if action == DROP.value: - log_print("drop-action", "Dropping packet can't be simulated, so the connection will be rejected", level=LogLevels.WARNING) - action = REJECT.value + log_print("drop-action", "Dropping connection caused by {escape(filter_name)} pyfilter") + has_to_drop = True + continue if action == REJECT.value: log_print("reject-action", f"Rejecting connection caused by {escape(filter_name)} pyfilter") @@ -146,9 +151,10 @@ async def forward_and_filter(filter_ctx: dict, await writer.drain() continue log_print("mangle", f"Mangling packet caused by {escape(filter_name)} pyfilter") - log_print("mangle", - "In the real execution mangling is not so stable as the simulation does, l4_data can be different by data", - level=LogLevels.WARNING) + if MANGLE_WARNING: + log_print("mangle", + "In the real execution mangling is not so stable as the simulation does, l4_data can be different by data", + level=LogLevels.WARNING) writer.write(mangled_packet[fake_ip_header_len:]) await writer.drain() continue @@ -170,7 +176,7 @@ async def forward_and_filter(filter_ctx: dict, except Exception: pass -async def handle_connection( +async def _handle_connection( reader: asyncio.StreamReader, writer: asyncio.StreamWriter, filter_code: str, target_ip: str, target_port: int, ipv6: bool): """Handle a new incoming connection and create a remote connection.""" @@ -198,8 +204,8 @@ async def handle_connection( traceback.print_exc() filter_ctx = {} # Create asynchronous tasks for bidirectional forwarding. - task1 = asyncio.create_task(forward_and_filter(filter_ctx, reader, remote_writer, True, ipv6, True, True)) - task2 = asyncio.create_task(forward_and_filter(filter_ctx, remote_reader, writer, False, ipv6, True, True)) + task1 = asyncio.create_task(_forward_and_filter(filter_ctx, reader, remote_writer, True, ipv6, True, True)) + task2 = asyncio.create_task(_forward_and_filter(filter_ctx, remote_reader, writer, False, ipv6, True, True)) try: await asyncio.gather(task1, task2) except (KeyboardInterrupt, asyncio.CancelledError): @@ -219,7 +225,7 @@ async def _execute_proxy( """Start the asyncio-based TCP proxy server.""" addr_family = socket.AF_INET6 if ipv6 else socket.AF_INET server = await asyncio.start_server( - lambda r, w: handle_connection(r, w, filter_code, target_ip, target_port, ipv6), + lambda r, w: _handle_connection(r, w, filter_code, target_ip, target_port, ipv6), local_ip, local_port, family=addr_family) log_print("listener", f"TCP proxy listening on {escape(local_ip)}:{local_port} and forwarding to -> {escape(target_ip)}:{target_port}") async with server: @@ -286,7 +292,7 @@ def run_proxy_simulation(filter_file:str, proto:str, target_ip:str, target_port: proxy_process.start() try: - asyncio.run(watch_filter_file(filter_file, reload_proxy_proc)) + asyncio.run(_watch_filter_file(filter_file, reload_proxy_proc)) except KeyboardInterrupt: pass finally: diff --git a/frontend/src/components/DocsButton.tsx b/frontend/src/components/DocsButton.tsx index 0d1ef5b..6be3537 100644 --- a/frontend/src/components/DocsButton.tsx +++ b/frontend/src/components/DocsButton.tsx @@ -1,4 +1,4 @@ -import { ActionIcon, Box, Modal, ScrollArea, Title, Tooltip } from "@mantine/core"; +import { ActionIcon, ActionIconProps, Box, Modal, ScrollArea, Title, Tooltip } from "@mantine/core"; import { useState } from "react"; import { FaBookBookmark } from "react-icons/fa6"; import { NFRegexDocs } from "./NFRegex/NFRegexDocs"; @@ -6,7 +6,6 @@ import { NFProxyDocs } from "./NFProxy/NFProxyDocs"; import { PortHijackDocs } from "./PortHijack/PortHijackDocs"; import { EnumToPrimitiveUnion } from "../js/utils"; - export enum DocType{ NFREGEX = "nfregex", NFPROXY = "nfproxy", @@ -14,12 +13,12 @@ export enum DocType{ } -export const DocsButton = ({ doc }: { doc: EnumToPrimitiveUnion }) => { +export const DocsButton = ({ doc, ...props }: { doc: EnumToPrimitiveUnion } & ActionIconProps) => { const [open, setOpen] = useState(false); return - - setOpen(true)} size="lg" radius="md" variant="filled"> + + setOpen(true)} size="lg" radius="md" variant="filled" {...props}> setOpen(false)} fullScreen title={ Firegex Docs 📕 diff --git a/frontend/src/components/NFProxy/NFProxyDocs.tsx b/frontend/src/components/NFProxy/NFProxyDocs.tsx index bbf0179..8f4a8a4 100644 --- a/frontend/src/components/NFProxy/NFProxyDocs.tsx +++ b/frontend/src/components/NFProxy/NFProxyDocs.tsx @@ -1,5 +1,7 @@ import { CodeHighlight } from "@mantine/code-highlight"; -import { Container, Title, Text, List, Code, Space } from "@mantine/core"; +import { Container, Title, Text, List, Code, Space, Badge, Box } from "@mantine/core"; +import { CgEditBlackPoint } from "react-icons/cg"; +import { EXAMPLE_PYFILTER } from "./utils"; const IMPORT_CODE_EXAMPLE = `from firegex.nfproxy import pyfilter, ACCEPT, REJECT` @@ -18,6 +20,46 @@ def none_filter(): # This is a filter that does nothing ` +const TYPING_ARGS_EXAMPLE = `from firegex.nfproxy import pyfilter, ACCEPT, REJECT +from firegex.nfproxy.models import HttpRequest + +@pyfilter +def filter_with_args(http_request: HttpRequest) -> int: + if http_request.body: + if b"ILLEGAL" in http_request.body: + return REJECT +` + +const IMPORT_FULL_ACTION_STREAM = `from firegex.nfproxy import FullStreamAction` + +export const HELP_NFPROXY_SIM = `➤ fgex nfproxy -h + + Usage: fgex nfproxy [OPTIONS] FILTER_FILE ADDRESS PORT + + Run an nfproxy simulation + +╭─ Arguments ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ * filter_file TEXT The path to the filter file [default: None] [required] │ +│ * address TEXT The address of the target to proxy [default: None] [required] │ +│ * port INTEGER The port of the target to proxy [default: None] [required] │ +╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ --proto [tcp|http] The protocol to proxy [default: tcp] │ +│ --from-address TEXT The address of the local server [default: None] │ +│ --from-port INTEGER The port of the local server [default: 7474] │ +│ -6 Use IPv6 for the connection │ +│ --help -h Show this message and exit. │ +╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯` + +const HttpBadge = () => { + return HTTP +} + +const TCPBadge = () => { + return TCP +} + + export const NFProxyDocs = () => { return ( @@ -30,13 +72,291 @@ export const NFProxyDocs = () => { providing users with the flexibility to upload custom filters. - ⚙️ How to Use Netfilter Proxy + ⚙️ How to use Netfilter Proxy To use Netfilter Proxy, simply create and upload a Python filter. The filter is passed to the C++ binary, which then processes packets using the provided logic. This allows you to tailor the filtering behavior to your needs. - + 💡 How to write pyfilters? + + First of all install the firegex lib and update it running pip install -U fgex. + After that you can use firegex module. + + With this code we imported the pyfilter decorator and the ACCEPT and REJECT statements.
+ Let's create a first (useless) filter to see the syntax: + + You see that the filter must be decorated with the pyfilter decorator and must return a statement about how to manage that packet. +
+ You can save every data about the current flow in the global variables, the code you write will be executed only once for flow. The globals variables are isolated between flows. + For each packet the filter functions will be called with the required paramethers and using the same globals as before. +
+ Saving data in globals of other modules is not recommended, because that memory is shared by the flows managed by the same thread and lead to unexpected behaviors. +
+ Global variables that starts with '__firegex' are reserved for internal use, don't use them. +
+ You can manage when the function is called and also getting some data specifying some paramethers, using type decorators. + Default values of the paramethers will be ignored, also kvargs values will be ignored. +
+ Functions with no type decorator are considered invalid pyfilters! +
+ + In this code we are filtering all the http requests that contains the word "ILLEGAL" in the body. All the other packets will be accepted (default behavior). + The function will be called only if at least internally teh HTTP request header has been parsed, and also when the body will be parsed. +
+ If we have multiple paramether, the function will be called only if with the packet arrived is possible to build all the paramethers. +
+ 🔧 How can I test the filter? + + You can test your filter by using fgex command installed by firegex lib: This will run a local proxy to a remote destination with the filter you specified. +
+ This can be done by running for instance: fgex nfproxy test_http.py 127.0.0.1 8080 --proto http + + You don't need to restart the proxy every time you change the filter, the filter will be reloaded automatically. +
+ 📦 Packet Statements + + Here there are all the statments you can return from a filter: + + ACCEPT: The packet will be accepted and forwarded to the destination. (default if None is returned) + REJECT: The connection will be closed and all the packets will be dropped. + DROP: This packet and all the following will be dropped. (This not simulate a connection closure) + UNSTABLE_MANGLE: The packet will be modified and forwarded. You can edit the packet only with RawPacket data handler. (This is an unstable statement, use it carefully) + + + ⚙️ Data Structures + + Here there are all the data structure you can use for your filters: + + + <CgEditBlackPoint style={{marginBottom: -3}}/> RawPacket + + This data is the raw packet processed by nfqueue. It contains: + + + + + data: The raw packet data assembled by libtins (read only). + + + is_input: It's true if the packet is incoming, false if it's outgoing. (read only) + + + is_ipv6: It's true if the packet is IPv6, false if it's IPv4. (read only) + + + is_tcp: It's true if the packet is TCP, false if it's UDP. (read only) + + + l4_size: The size of l4 payload (read only) + + + raw_packet_header_len: The size of the raw packet header (read only) + + + raw_packet: The raw packet data with ip and TCP header. You can edit all the packet content and it will be modified if you send + the UNSTABLE_MANGLE statement. Be careful, beacause the associated layer 4 data can be different from 'data' filed that instead arrives from libtins. + When you edit this field, l4_size and l4_data will be updated automatically. + + + l4_data: The l4 payload data, directly taken by the raw packet. You can edit all the packet content and it will be modified if you send + the UNSTABLE_MANGLE statement. Be careful, beacause the associated layer 4 data can be different from 'data' filed that instead arrives from libtins. When you edit this field, l4_size and raw_packet will be updated automatically. + + + + + <CgEditBlackPoint style={{marginBottom: -3}}/> TCPInputStream (alias: TCPClientStream) + + This data is the TCP input stream: this handler is called only on is_input=True packets. The filters that handles this data will be called only in this case. + + + + + data: The entire stream in input direction. (read only) + + + total_stream_size: The size of the entire stream in input direction. (read only) + + + is_ipv6: It's true if the stream is IPv6, false if it's IPv4. (read only) + + + + + <CgEditBlackPoint style={{marginBottom: -3}}/> TCPOutputStream (alias TCPServerStream) + + This data is the TCP output stream: this handler is called only on is_input=False packets. The filters that handles this data will be called only in this case. + + + + + data: The entire stream in output direction. (read only) + + + total_stream_size: The size of the entire stream in output direction. (read only) + + + is_ipv6: It's true if the stream is IPv6, false if it's IPv4. (read only) + + + + + <CgEditBlackPoint style={{marginBottom: -3}}/> HttpRequest + + This data is the Http request processed by nfqueue. This handler can be called twice per request: once when the http headers are complete, and once when the body is complete. + If the http data arrives in 1 single TCP packet, this handler will be called once + + + + + url: The url of the request (read only) + + + headers: The headers of the request (read only). The keys and values are exactly the same as the original request (case sensitive). + + + get_header(key:str, default = None): A function that returns the value of a header: it matches the key without case sensitivity. If the header is not found, it returns the default value. + + + user_agent: The user agent of the request (read only) + + + content_encoding: The content encoding of the request (read only) + + + content_length: The content length of the request (read only) + + + body: The body of the request (read only). It's None if the body has not arrived yet. + + + http_version: The http version of the request (read only) + + + keep_alive: It's true if the connection was marked for keep alive, false if it's not. (read only) + + + should_upgrade: It's true if the connection should be upgraded, false if it's not. (read only) + + + method: The method of the request (read only) + + + has_begun: It's true if the request has begun, false if it's not. (read only) + + + headers_complete: It's true if the headers are complete, false if they are not. (read only) + + + message_complete: It's true if the message is complete, false if it's not. (read only) + + + total_size: The size of the entire http request (read only) + + + stream: It's the buffer that contains the stream of the websocket traffic in input. This is used only if should_upgrade is True. (read only) + + + + + <CgEditBlackPoint style={{marginBottom: -3}}/> HttpRequestHeader + + Same as HttpRequest, but this handler is called only when the headers are complete and body is not buffered. Body will always be None + + <CgEditBlackPoint style={{marginBottom: -3}}/> HttpResponse + + This data is the Http response processed by nfqueue. This handler can be called twice per response: once when the http headers are complete, and once when the body is complete. + If the http data arrives in 1 single TCP packet, this handler will be called once + + + + + url: The url of the response (read only) + + + headers: The headers of the response (read only). The keys and values are exactly the same as the original response (case sensitive). + + + get_header(key:str, default = None): A function that returns the value of a header: it matches the key without case sensitivity. If the header is not found, it returns the default value. + + + user_agent: The user agent of the response (read only) + + + content_encoding: The content encoding of the response (read only) + + + content_length: The content length of the response (read only) + + + body: The body of the response (read only). It's None if the body has not arrived yet. + + + http_version: The http version of the response (read only) + + + keep_alive: It's true if the connection was marked for keep alive, false if it's not. (read only) + + + should_upgrade: It's true if the connection should be upgraded, false if it's not. (read only) + + + status_code: The status code of the response (read only) (int) + + + has_begun: It's true if the response has begun, false if it's not. (read only) + + + headers_complete: It's true if the headers are complete, false if they are not. (read only) + + + message_complete: It's true if the message is complete, false if it's not. (read only) + + + total_size: The size of the entire http response (read only) + + + stream: It's the buffer that contains the stream of the websocket traffic in output. This is used only if should_upgrade is True. (read only) + + + + + <CgEditBlackPoint style={{marginBottom: -3}}/> HttpResponseHeader + + Same as HttpResponse, but this handler is called only when the headers are complete and body is not buffered. Body will always be None + ⚠️ Stream Limiter + + What happen if in a specific TCP stream you have a lot of data? The stream limiter will be activated and some action will be taken. + You can configure the action performed by setting some option in the globals: +
+ First import the FullStreamAction enum: + + Then you can set in the globals these options: + + + FGEX_STREAM_MAX_SIZE: Sets the maximum size of the stream. If the stream exceeds this size, the FGEX_FULL_STREAM_ACTION will be performed. (this limit is applyed at the single stream related to the single data handler). + For example if TCPInputStream has reached the limit but HttpResponse has not, the action will be performed only on the TCPInputStream. The default is 1MB. + + + FGEX_FULL_STREAM_ACTION: Sets the action performed when the stream exceeds the FGEX_STREAM_MAX_SIZE. The default is FullStreamAction.FLUSH. + + + Heres will be explained every type of action you can set: + + + FLUSH: Flush the stream and continue to acquire new packets (default) + + + DROP: Drop the next stream packets - like a DROP action by filter + + + REJECT: Reject the stream and close the connection - like a REJECT action by filter + + + ACCEPT: Stops to call pyfilters and accept the traffic + + +
🚀 How It Works The proxy is built on a multi-threaded architecture and integrates Python for dynamic filtering: @@ -71,7 +391,6 @@ export const NFProxyDocs = () => { allowing for dynamic and flexible packet handling. 🐍 - HTTP Parsing: @@ -80,26 +399,12 @@ export const NFProxyDocs = () => { - - 💡 How to write pyfilters? + + 📚 Additional Resources - First of all install the firegex lib and update it running pip install -U fgex. - After that you can use firegex module. - - With this code we imported the pyfilter decorator and the ACCEPT and REJECT constants.
- Let's create a first (useless) filter to see the syntax: - - You see that the filter must be decorated with the pyfilter decorator and must return a statement about how to manage that packet. -
- You can save every data about the current flow in the global variables, the code you write will be executed only once for flow. The globals are isolated between flows. - For each packet the filter functions will be called with the required paramethers and the same globals as before. -
- Saving data in globals of other modules is not recommended, because that memory is shared by the flows managed by the same thread and lead to unexpected behaviors. -
- Global variables that starts with __firegex_ are reserved for internal use, don't use them. - + Here's a pyfilter code commented example: +
-
); }; diff --git a/frontend/src/components/NFProxy/utils.ts b/frontend/src/components/NFProxy/utils.ts index 55ddec6..541f3c7 100644 --- a/frontend/src/components/NFProxy/utils.ts +++ b/frontend/src/components/NFProxy/utils.ts @@ -103,7 +103,7 @@ export const EXAMPLE_PYFILTER = `# This in an example of a filter file with http # From here we can import the DataTypes that we want to use: # The data type must be specified in the filter functions # And will also interally be used to decide when call some filters and how aggregate data -from firegex.nfproxy.params import RawPacket +from firegex.nfproxy.models import RawPacket # global context in this execution is dedicated to a single TCP stream # - This code will be executed once at the TCP stream start @@ -158,15 +158,18 @@ def http_filter(http:HTTPRequest): # If the stream is too big, you can specify what actions to take: # This can be done defining some variables in the global context # - FGEX_STREAM_MAX_SIZE: The maximum size of the stream in bytes (default 1MB) -# NOTE: the stream size is calculated by the sum of the dimension of the packets in the stream (both directions) +# NOTE: the stream size is calculated and managed indipendently by the data type handling system +# Only types required by at least 1 filter will be stored. # - FGEX_FULL_STREAM_ACTION: The action to do when the stream is full -# - FLUSH: Flush the stream and continue to acquire new packets (default) -# - DROP: Drop the next stream packets - like a DROP action by filter -# - REJECT: Reject the stream and close the connection - like a REJECT action by filter -# - ACCEPT: Stops to call pyfilters and accept the traffic +# - FullStreamAction.FLUSH: Flush the stream and continue to acquire new packets (default) +# - FullStreamAction.DROP: Drop the next stream packets - like a DROP action by filter +# - FullStreamAction.REJECT: Reject the stream and close the connection - like a REJECT action by filter +# - FullStreamAction.ACCEPT: Stops to call pyfilters and accept the traffic + +from firege.nfproxy import FullStreamAction # Example of a global context FGEX_STREAM_MAX_SIZE = 4096 -FGEX_FULL_STREAM_ACTION = REJECT +FGEX_FULL_STREAM_ACTION = FullStreamAction.REJECT # This could be an ideal configuration if we expect to normally have streams with a maximum size of 4KB of traffic ` diff --git a/frontend/src/components/PortHijack/PortHijackDocs.tsx b/frontend/src/components/PortHijack/PortHijackDocs.tsx index 8b62750..1ddd48b 100644 --- a/frontend/src/components/PortHijack/PortHijackDocs.tsx +++ b/frontend/src/components/PortHijack/PortHijackDocs.tsx @@ -1,9 +1,37 @@ -import { Box } from "@mantine/core" +import { CodeHighlight } from "@mantine/code-highlight" +import { Code, Container, Space, Text, Title } from "@mantine/core" +import { HELP_NFPROXY_SIM } from "../NFProxy/NFProxyDocs" export const PortHijackDocs = () => { - return - PORT - {/* TODO write me pls */} - + return + ⚡️ Hijack port to proxy + + 📖 Overview + + 'Hijack port to proxy' uses nftables to redirect the traffic from an external IP to a localhost server. + You are responsable to run and keep alive this server, that is your proxy. The original service will be accessible using loopback (127.0.0.1). + In this way you can run your custom proxy without touching the service configuration. + + + ⚙️ How to use Hijack port to proxy + + To use this feature, simply create your proxy, run it, than create a new service and set the proxy port and the external ip and port. + The traffic will be redirected to your proxy, that will still be able to contact the original service using loopback. + The responses of your proxy will be redirected to the original client, and teh proxy will see as the requests were made by the original client. +
+ You can use for instance the proxy simulator of nfproxy feature of firegex, and run it using nfproxy features. This will advantage you if for instance you need to mangle the traffic. + changing packets it's possible but not sure to do with nfproxy, but the simulator can change the packets normally (on PacketRaw data is always == l4_data in the simulator, check the nfproxy docs for more info) +
+ You will need to install firegex library with pip install -U fgex and than use the simulator command + + for instance: fgex nfproxy test_http.py 127.0.0.1 8080 --proto http --from-port 13377 +
+ 🚀 How It Works + + This modules works in a simple way: this only thing done is to change the destination and source ip using nftables rules so that the kernel will see that the request was done to the proxy port, + but externaly the packets exists as connections to the original service. This mangle is done only for external packet arriving from the external ip indicated, localhost traffic won't be touched. + + +
} \ No newline at end of file diff --git a/frontend/src/pages/Firewall/index.tsx b/frontend/src/pages/Firewall/index.tsx index 3a26aa1..65a7fef 100644 --- a/frontend/src/pages/Firewall/index.tsx +++ b/frontend/src/pages/Firewall/index.tsx @@ -407,15 +407,20 @@ export const Firewall = () => { )} :<> - No rule found! Add one clicking the "+" buttons - - - - - - - -} + + + Firewall Rules allows you to use nftables but through a web interface + + Add new rules, sort it and enable the firewall: be carefull, wrong rules could also drops out firegex access + + + + + + + + + } - No filters found! Edit the proxy file, install the firegex client:<Space w="xs" /><Code mb={-4} >pip install fgex</Code> + No filters found! Create some proxy filters, install the firegex client:<Space w="xs" /><Code mb={-4} >pip install -U fgex</Code> + + Read the documentation for more information<Space w="sm" /><DocsButton doc='nfproxy'/> Then create a new filter file with the following syntax and upload it here (using the button above) - - Before upload the filter you can test it using the fgex command installed by the python lib - - :<>{filtersList.data?.map( (filterInfo) => )} } Netfilter proxy is a simulated proxy written using python with a c++ core - Filters are created using a simple python syntax, infact the first you need to do is to install the firegex lib:<Space w="xs" /><Code mb={-4} >pip install firegex</Code> + Filters are created using a simple python syntax, infact the first you need to do is to install the firegex lib:<Space w="xs" /><Code mb={-4} >pip install -U fgex</Code> Then you can create a new service and write custom filters for the service - - Below there is a description and example about how a pyfilter has to be composed (this example is replicated in every empty service) - - - Add your first service - - - setOpen(true)} size="xl" radius="md" variant="filled"> - - - - + + + setOpen(true)} size="xl" radius="md" variant="filled"> + + + + +
} } diff --git a/frontend/src/pages/NFRegex/index.tsx b/frontend/src/pages/NFRegex/index.tsx index 16c5e7c..f51ed03 100644 --- a/frontend/src/pages/NFRegex/index.tsx +++ b/frontend/src/pages/NFRegex/index.tsx @@ -70,11 +70,21 @@ function NFRegex({ children }: { children: any }) { {(services.data && services.data?.length > 0)?services.data.map( srv => { navigator("/nfregex/"+srv.service_id) - }} />):<> No services found! Add one clicking the "+" buttons - - - setOpen(true)} size="xl" radius="md" variant="filled"> - + }} />):<> + + + Netfilter Regex allows you to filter traffic using regexes + + Start a service, add your regexes and it's already done! + + + + setOpen(true)} size="xl" radius="md" variant="filled"> + + + + + } } diff --git a/frontend/src/pages/PortHijack/index.tsx b/frontend/src/pages/PortHijack/index.tsx index a0c1072..288fa63 100644 --- a/frontend/src/pages/PortHijack/index.tsx +++ b/frontend/src/pages/PortHijack/index.tsx @@ -51,11 +51,22 @@ function PortHijack() { {(services.data && services.data.length > 0) ?services.data.map( srv => ):<> - No services found! Add one clicking the "+" buttons - - - setOpen(true)} size="xl" radius="md" variant="filled"> - + + + Hjiack Port to Proxy is a feature that allows you to run your custom proxy without touch the service config + + It hijack the traffic to a secondary port, where you can run your proxy, that will still be able to contact the original service using loopback + + Start using port hijacking creating a new service and routing the traffic to your proxy not changing the original service configs + + + + setOpen(true)} size="xl" radius="md" variant="filled"> + + + + + } From 9eb7d5461f959645e46cb9d3d1077c26ca82b8fd Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Fri, 7 Mar 2025 18:16:23 +0100 Subject: [PATCH 16/18] added checks and changed prio --- backend/binsrc/classes/nfqueue.cpp | 11 ++++++++--- backend/modules/nfproxy/nftables.py | 4 ++-- fgex-lib/firegex/nfproxy/internals/data.py | 5 +++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/backend/binsrc/classes/nfqueue.cpp b/backend/binsrc/classes/nfqueue.cpp index 02de950..cb9eccb 100644 --- a/backend/binsrc/classes/nfqueue.cpp +++ b/backend/binsrc/classes/nfqueue.cpp @@ -134,7 +134,8 @@ class PktRequest { l4_proto = fill_l4_info(); #ifdef DEBUG if (tcp){ - cerr << "[DEBUG] NEW_PACKET " << (is_input?"-> IN ":"<- OUT") << " [SEQ: " << tcp->seq() << "] \t[ACK: " << tcp->ack_seq() << "] \t[SIZE: " << data_size() << "]" << endl; + cerr << "[DEBUG] NEW_PACKET " << (is_input?"-> IN ":"<- OUT") << " [SIZE: " << data_size() << "] FLAGS: " << (tcp->get_flag(Tins::TCP::FIN)?"FIN ":"") << (tcp->get_flag(Tins::TCP::SYN)?"SYN ":"") << (tcp->get_flag(Tins::TCP::RST)?"RST ":"") << (tcp->get_flag(Tins::TCP::ACK)?"ACK ":"") << (tcp->get_flag(Tins::TCP::PSH)?"PSH ":"") << endl; + cerr << "[SEQ: " << tcp->seq() << "] [ACK: " << tcp->ack_seq() << "]" << " [WIN: " << tcp->window() << "] [FLAGS: " << tcp->flags() << "]\n" << endl; } #endif } @@ -237,7 +238,8 @@ class PktRequest { } #ifdef DEBUG size_t new_size = inner_data_size(tcp); - cerr << "[DEBUG] FIXED PKT " << (is_input?"-> IN ":"<- OUT") << " [SEQ: " << tcp->seq() << "] \t[ACK: " << tcp->ack_seq() << "] \t[SIZE: " << new_size << "]" << endl; + cerr << "[DEBUG] FIXED PKT " << (is_input?"-> IN ":"<- OUT") << " [SIZE: " << data_size() << "] FLAGS: " << (tcp->get_flag(Tins::TCP::FIN)?"FIN ":"") << (tcp->get_flag(Tins::TCP::SYN)?"SYN ":"") << (tcp->get_flag(Tins::TCP::RST)?"RST ":"") << (tcp->get_flag(Tins::TCP::ACK)?"ACK ":"") << (tcp->get_flag(Tins::TCP::PSH)?"PSH ":"") << endl; + cerr << "[SEQ: " << tcp->seq() << "] [ACK: " << tcp->ack_seq() << "]" << " [WIN: " << tcp->window() << "] [FLAGS: " << tcp->flags() << "]\n" << endl; #endif } @@ -360,7 +362,10 @@ class PktRequest { } nfq_nlmsg_verdict_put_pkt(nlh_verdict, packet.data(), packet.size()); #ifdef DEBUG - cerr << "[DEBUG] MANGLEDPKT " << (is_input?"-> IN ":"<- OUT") << " [SIZE: " << packet.size()-header_size() << "]" << endl; + if (tcp){ + cerr << "[DEBUG] MANGLEDPKT " << (is_input?"-> IN ":"<- OUT") << " [SIZE: " << data_size() << "] FLAGS: " << (tcp->get_flag(Tins::TCP::FIN)?"FIN ":"") << (tcp->get_flag(Tins::TCP::SYN)?"SYN ":"") << (tcp->get_flag(Tins::TCP::RST)?"RST ":"") << (tcp->get_flag(Tins::TCP::ACK)?"ACK ":"") << (tcp->get_flag(Tins::TCP::PSH)?"PSH ":"") << endl; + cerr << "[SEQ: " << tcp->seq() << "] [ACK: " << tcp->ack_seq() << "]" << " [WIN: " << tcp->window() << "] [FLAGS: " << tcp->flags() << "]\n" << endl; + } #endif if (tcp && ack_seq_offset && packet.size() != _original_size){ if (is_input){ diff --git a/backend/modules/nfproxy/nftables.py b/backend/modules/nfproxy/nftables.py index 5bb1050..046d98d 100644 --- a/backend/modules/nfproxy/nftables.py +++ b/backend/modules/nfproxy/nftables.py @@ -34,7 +34,7 @@ class FiregexTables(NFTableManager): "name":self.input_chain, "type":"filter", "hook":"prerouting", - "prio":-301, + "prio":-310, "policy":"accept" }}}, {"add":{"chain":{ #Output chain attached after conntrack saw it @@ -43,7 +43,7 @@ class FiregexTables(NFTableManager): "name":self.output_chain, "type":"filter", "hook":"postrouting", - "prio":-290, + "prio":-310, "policy":"accept" }}} ],[ diff --git a/fgex-lib/firegex/nfproxy/internals/data.py b/fgex-lib/firegex/nfproxy/internals/data.py index c9940ed..ce5062c 100644 --- a/fgex-lib/firegex/nfproxy/internals/data.py +++ b/fgex-lib/firegex/nfproxy/internals/data.py @@ -56,8 +56,7 @@ class RawPacket: raise Exception("Invalid data type, data MUST be of type bytes") #if len(v) != self.__l4_size: # raise Exception("Invalid data size, must be equal to the original packet header size (due to a technical limitation)") - self.__raw_packet = self.__raw_packet[:self.raw_packet_header_len]+v - self.__l4_size = len(v) + self.raw_packet = self.__raw_packet[:self.raw_packet_header_len]+v @property def raw_packet(self) -> bytes: @@ -67,6 +66,8 @@ class RawPacket: def raw_packet(self, v:bytes): if not isinstance(v, bytes): raise Exception("Invalid data type, data MUST be of type bytes") + if len(v) > 2**16: + raise Exception("Invalid data size, must be less than 2^16 bytes") #if len(v) != len(self.__raw_packet): # raise Exception("Invalid data size, must be equal to the original packet size (due to a technical limitation)") if len(v) < self.raw_packet_header_len: From e0b74b188603fd7e92d60f09a35a387914e2d8c4 Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Fri, 7 Mar 2025 18:22:18 +0100 Subject: [PATCH 17/18] fix Dockerfile --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4599907..451aa22 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,8 +23,8 @@ WORKDIR /execute ADD ./backend/requirements.txt /execute/requirements.txt RUN uv pip install --no-cache --system -r /execute/requirements.txt -COPY ./proxy-client /execute/proxy-client -RUN uv pip install --no-cache --system ./proxy-client +COPY ./fgex-lib /execute/fgex-lib +RUN uv pip install --no-cache --system ./fgex-lib COPY ./backend/binsrc /execute/binsrc RUN g++ binsrc/nfregex.cpp -o modules/cppregex -std=c++23 -O3 -lnetfilter_queue -pthread -lnfnetlink $(pkg-config --cflags --libs libtins libhs libmnl) From 8a271da8399867570a23321d151da86959b3ae7a Mon Sep 17 00:00:00 2001 From: Domingo Dirutigliano Date: Fri, 7 Mar 2025 22:14:03 +0100 Subject: [PATCH 18/18] fixed mangle --- backend/binsrc/classes/nfqueue.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/binsrc/classes/nfqueue.cpp b/backend/binsrc/classes/nfqueue.cpp index cb9eccb..4f3d557 100644 --- a/backend/binsrc/classes/nfqueue.cpp +++ b/backend/binsrc/classes/nfqueue.cpp @@ -346,6 +346,7 @@ class PktRequest { case FilterAction::ACCEPT: if (need_tcp_fixing){ if (do_serialize){ + fix_data_payload(); reserialize(); } nfq_nlmsg_verdict_put_pkt(nlh_verdict, packet.data(), packet.size());

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�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