From 0e89819426b45781df5bb4ebe2aefd58260f789e Mon Sep 17 00:00:00 2001 From: heppen Date: Mon, 26 Jun 2023 17:36:25 +0800 Subject: [PATCH 1/2] Adapt binder as a kernel module --- 0001-Adapt-binder-as-a-kernel-module.patch | 197 +++++++++++++++++++++ binder-openEuler-22.03-LTS-SP2.tar.gz | Bin 0 -> 61638 bytes binder.spec | 41 +++++ 3 files changed, 238 insertions(+) create mode 100644 0001-Adapt-binder-as-a-kernel-module.patch create mode 100644 binder-openEuler-22.03-LTS-SP2.tar.gz create mode 100644 binder.spec diff --git a/0001-Adapt-binder-as-a-kernel-module.patch b/0001-Adapt-binder-as-a-kernel-module.patch new file mode 100644 index 0000000..b36669f --- /dev/null +++ b/0001-Adapt-binder-as-a-kernel-module.patch @@ -0,0 +1,197 @@ +From 94b7c10aba2a0c79b88a2b37598adefd206f3e5b Mon Sep 17 00:00:00 2001 +From: heppen +Date: Mon, 26 Jun 2023 17:11:55 +0800 +Subject: [PATCH] Adapt binder as a kernel module + +--- + Makefile | 21 ++++++++--- + binder.c | 26 +++++++++++-- + binder_alloc.c | 2 +- + external_symbols.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 131 insertions(+), 9 deletions(-) + create mode 100644 external_symbols.c + +diff --git a/Makefile b/Makefile +index c9d3d0c..5d07f84 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,17 @@ +-# SPDX-License-Identifier: GPL-2.0-only +-ccflags-y += -I$(src) # needed for trace events ++CONFIG_MODULE_SIG=n ++ccflags-y += -I$(src) -Wno-int-conversion -Wno-implicit-function-declaration -DCONFIG_ANDROID_BINDER_DEVICES=\"binder\" + +-obj-$(CONFIG_ANDROID_BINDERFS) += binderfs.o +-obj-$(CONFIG_ANDROID_BINDER_IPC) += binder.o binder_alloc.o +-obj-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o ++# only support openEuler-22.03-LTS-SP2 kernel. ++ifneq ($(KERNELRELEASE),) ++obj-m := binder_linux.o ++binder_linux-y := external_symbols.o binder.o binder_alloc.o ++else ++KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build ++ ++ ++all: ++ $(MAKE) -C $(KERNEL_SRC) V=0 M=$$PWD ++ ++clean: ++ $(MAKE) -C $(KERNEL_SRC) M=$$PWD clean ++endif +diff --git a/binder.c b/binder.c +index b403c7f..35384d8 100644 +--- a/binder.c ++++ b/binder.c +@@ -2039,8 +2039,8 @@ static size_t binder_get_object(struct binder_proc *proc, + return 0; + } else { + if (binder_alloc_copy_from_buffer(&proc->alloc, object, buffer, +- offset, read_size)) +- return 0; ++ offset, read_size)) ++ return 0; + } + + /* Ok, now see if we read a complete object. */ +@@ -6531,7 +6531,27 @@ err_alloc_device_names_failed: + return ret; + } + +-device_initcall(binder_init); ++static void __exit binder_exit(void) ++{ ++ struct hlist_node *tmp; ++ struct binder_device *device; ++ ++ debugfs_remove_recursive(binder_debugfs_dir_entry_root); ++ ++ if (!IS_ENABLED(CONFIG_ANDROID_BINDERFS) && ++ strcmp(binder_devices_param, "") != 0) { ++ hlist_for_each_entry_safe (device, tmp, &binder_devices,hlist) { ++ misc_deregister(&device->miscdev); ++ hlist_del(&device->hlist); ++ kfree(device); ++ } ++ } ++ ++ pr_info("unloaded\n"); ++} ++ ++module_init(binder_init); ++module_exit(binder_exit); + + #define CREATE_TRACE_POINTS + #include "binder_trace.h" +diff --git a/binder_alloc.c b/binder_alloc.c +index a77ed66..1f5446c 100644 +--- a/binder_alloc.c ++++ b/binder_alloc.c +@@ -38,7 +38,7 @@ enum { + }; + static uint32_t binder_alloc_debug_mask = BINDER_DEBUG_USER_ERROR; + +-module_param_named(debug_mask, binder_alloc_debug_mask, ++module_param_named(alloc_debug_mask, binder_alloc_debug_mask, + uint, 0644); + + #define binder_alloc_debug(mask, x...) \ +diff --git a/external_symbols.c b/external_symbols.c +new file mode 100644 +index 0000000..4ee95e7 +--- /dev/null ++++ b/external_symbols.c +@@ -0,0 +1,91 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static struct kprobe kp = { ++ .symbol_name = "kallsyms_lookup_name" ++}; ++typedef unsigned long (*kallsyms_lookup_name_t)(const char *name); ++ ++static kallsyms_lookup_name_t kallsyms_lookup_name_ptr = NULL; ++ ++kallsyms_lookup_name_t static get_lookup(void) { ++ if (kallsyms_lookup_name_ptr == NULL) { ++ register_kprobe(&kp); ++ kallsyms_lookup_name_ptr = (kallsyms_lookup_name_t) kp.addr; ++ unregister_kprobe(&kp); ++ } ++ return kallsyms_lookup_name_ptr; ++} ++ ++static void (*zap_page_range_ptr)(struct vm_area_struct *, unsigned long, unsigned long) = NULL; ++static int (*can_nice_ptr)(const struct task_struct *, const int) = NULL; ++static int (*security_binder_set_context_mgr_ptr)(struct task_struct *mgr) = NULL; ++static int (*security_binder_transaction_ptr)(struct task_struct *from, struct task_struct *to) = NULL; ++static int (*security_binder_transfer_binder_ptr)(struct task_struct *from, struct task_struct *to) = NULL; ++static int (*security_binder_transfer_file_ptr)(struct task_struct *from, struct task_struct *to, struct file *file) = NULL; ++static int (*task_work_add_ptr)(struct task_struct *task, struct callback_head *twork, ++ enum task_work_notify_mode mode) = NULL; ++static void (*__wake_up_pollfree_ptr)(wait_queue_head_t *wq_head) = NULL; ++ ++static int (*close_fd_get_file_ptr)(unsigned int fd, struct file **res) = NULL; ++ ++void zap_page_range(struct vm_area_struct *vma, unsigned long address, unsigned long size) ++{ ++ zap_page_range_ptr = get_lookup()("zap_page_range"); ++ zap_page_range_ptr(vma, address, size); ++} ++ ++int can_nice(const struct task_struct *p, const int nice) ++{ ++ can_nice_ptr = get_lookup()("can_nice"); ++ return can_nice_ptr(p, nice); ++} ++ ++int security_binder_set_context_mgr(struct task_struct *mgr) ++{ ++ security_binder_set_context_mgr_ptr = get_lookup()("security_binder_set_context_mgr"); ++ return security_binder_set_context_mgr_ptr(mgr); ++} ++ ++int security_binder_transaction(struct task_struct *from, struct task_struct *to) ++{ ++ security_binder_transaction_ptr = get_lookup()("security_binder_transaction"); ++ return security_binder_transaction_ptr(from, to); ++} ++ ++int security_binder_transfer_binder(struct task_struct *from, struct task_struct *to) ++{ ++ security_binder_transfer_binder_ptr = get_lookup()("security_binder_transfer_binder"); ++ return security_binder_transfer_binder_ptr(from, to); ++} ++ ++int security_binder_transfer_file(struct task_struct *from, struct task_struct *to, struct file *file) ++{ ++ security_binder_transfer_file_ptr = get_lookup()("security_binder_transfer_file"); ++ return security_binder_transfer_file_ptr(from, to, file); ++} ++ ++int task_work_add(struct task_struct *task, struct callback_head *twork, ++ enum task_work_notify_mode mode) ++{ ++ task_work_add_ptr = get_lookup()("task_work_add"); ++ return task_work_add_ptr(task, twork, mode); ++} ++ ++int close_fd_get_file(unsigned int fd, struct file **res) ++{ ++ close_fd_get_file_ptr = get_lookup()("close_fd_get_file"); ++ return close_fd_get_file_ptr(fd, res); ++} ++ ++void __wake_up_pollfree(wait_queue_head_t *wq_head) ++{ ++ __wake_up_pollfree_ptr = get_lookup()("__wake_up_pollfree"); ++ return __wake_up_pollfree_ptr(wq_head); ++} +-- +2.33.0 + diff --git a/binder-openEuler-22.03-LTS-SP2.tar.gz b/binder-openEuler-22.03-LTS-SP2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b0f84d1dccea039912d5cb6da01abb8210ebaa29 GIT binary patch literal 61638 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%0A^rC14)C_Kssk_ z3T&7<;T}ZOTc7yu-j)_6>>aF<-%zhb7&m(lA+n#DL8IxmbSRKFayshgEd)}4-$Txv z6M?=2>2c~JFjsbnUq8!U@BfvCqNjm}q>@~kUT13H*kkiGbfwU}s?fF3-H`tP(B4d6_igs)A{Uc z2Z4wOAas1X{oIrt=fkC(a+wr=URr!Hy0~=Z@$QMh-y0ak2dr(1;8LUhXlb#SDR@~* z&9Z!osorovW(BVyV~IIUvek4s8gnr`fWR=t>$IX}Y_;kABbA7>OiO2P;v#VK+Rz17 z9^$=!Jz8p@yQm|fBw^I(rX%7` zP;Cw8$-TEVhh&D8yU&)TP{xdvJe7E`sf9BYhx64pHTU3 zclG5{^d2a58G3+4*5?jeb6^i<8tovr=6eZtL9cJYGjP7)bItjNU!{t7>>C+x*}o(y zW{^`BBl4dZO@(v74dooOxEbO1+(x4PA%~Nwc13mO-V{fXE8Dy_bMaB%qc?6mvx#i?3>AhkqI8)tt#?w%eVyd$yd z?600DG3$AJcjBXCBeT3ZIz6M*?hnIgD~@cthNQqYn#u*eNM+4nEsc7HH4e)!6&6z)kaC&tR5vexMxAEtDC+jG$z z42{llabgD(hVGlBV>uI?{i~j1sdOnmH@{3Z*oRHd@*WJPE!$kh+D2B^#A+)0C@d2< z&J5S%qmt)3!AEtr>SY#k^J$%Bmi)#G%xU2)tUB|Lds^>=+1PVDb(qIN2;vOhROOAj zEF6l{ZOJf{K`7xPN@gY;C3Pc}_Xr9U~i~b9jrr zJ;hm3_cR9xoC(6A^v-7=@>ohu`ZTIBg-+SQmG*HByKKfKWA509HxhEG4ql*RE{IAC zgBM~}P90L6p^k(@k3XUVlhn~AaSaKNjX~b{9I>ZF=~VshPl#&%x4o^69wpq53b_Ef zs6h7f&lM+3TV1qJGrM;ahLG-reeJp+moM^v+Ss^v8M6xPR8CXEA}1zzZrLngv`E>yT0fP0=}C8WW!4qv#m+FRUF)ENi*UYB z0dA!?VBK>41xohvebdn~*vaJ<#geGw^-5mx8NQlSd!XK{UT*59ic7UU_H({dIXXB{ z0U~tVM;jfPqAz>X3nR=IGbz=lKss}{T=YnHBBzVmE5YJy_|but{RuaS9B><#;szmO zw)ORh8-3#@ONdyLH&{Ql=P3{%I8Aw+={t{{95*;poxh{KI5jvlZCQ78#-~^M=xlOY zB8k{Xy7AD~lp`snnLao0QSlZ|+j*zJgVtPduS~8sq+90J(RB0z6 zP44uXHwk#bZ0dc)=1_k}fS8%UXYq!GzBpv=NW!#ox@Agbv4K{{Ytf54t=*OY9sH_i}e`h1+DOPU6fA@oF^QuMT2Pyz-A zxN+Vnpd`VmJ3$5uEDl>i%HC)1%* z<`NUqOyw5P`!d>(Zl=}+DQI-YG*pc@>4{<{>Auu+e?1dEZ%Rba#JiHiSZ=#71t+1R z6=VQYA1^8BPZ?>19j_*hb&m*jMV6InLb*qC2ukE{ArPYAFCZbbjq7je-G>) zVoHZj9Pp;fhXeEI>a3{FCW}d1zvje}lG2#v_t>9ilc2dmsZqR(9jL2h)F!-O9E;7G9R@$>@k2=?U}C)Kd{z|T zkxOe77`7nt!S?Bqo@Lt{x?X!OsEkf76v%_QlDr&)(GXcXkW-HYWN@U;2ixd>zOli} zzLW7UHq|v+!2U1@qDr`ybxExVzeusah}ijFU(F4x^_(fT#)C;{Im0ATmS?J@Q58-+ zI$hX}eR&+`O$CbuPBW3uOu(JfE;AmB=5tEvA%#WDp;_lQgLR%)*6|!?B9{0`S*CGe z0&d#CSLNjJB?@)af;}bH^dgbkfg_1LX6b~NHSmFvLV8|nePPm-66Ay{6ppTdPSW&0 zdzRJNE!){Q+2d?C1K|78kU}jS)W;RxL>3@A3x@GLi^qm!bZ*uf(ha1?9z6I0#|G-| z#HI|yox9#fzNC}rZ6xQK@RC@WH?yz0Me#g4R%>U=bph5N zh1x5-gYZ?Z;(j0phP!H$>R2vQto^;&+)-0ar_VA^p2O7qmCc=9dT#&|Y0_ZF700`|GB*Hw2UqpYWHlNyD`lV{Zte zYcLeHaMPceq8M-s4p*$bW%&+5_l(@<^pJFO$Fo~?mN=?*-{ShHSa2VLm`e!Bn~bJ8 zm9^2BqHVP)`_6Mx8ShYcskpfbkSbkkXNx67KB7DR&ZZcS^zqG7msmw<5h1-P^}BqR zyg1x{!5)_4Oi;B+E_+2Hr?=R18gH1Ouw(ptn@JO7%eE<0j-61p$XbUrGtjd?^MO%Y zm?W>Hy+QLVxVV~U3rfqRuRwH(qWDj|Y%X*nIeoL_+H{fomi8Q%glN&l%9@N^VFtd0 z%X^H=D6ouV7C`!7Yk^!h!yfNo_hijf`ewNq0R|c9S0yEuhUqlh)AX}gVUoe&YRrAh z7mMjkUzGxfmwMKp@(oVHG@Wp!G0FQMdE{NsnKR-YVD?HOsK^#BaPw>ZcQG{7;%pD2G$|DJ_+W zGjLWqDHWnN$kltBp?gKjwIWvFqWFdR?t~kN<`z#H3y$Zsh>u`$0_+R%sTFJPf>pLq zlyr#&R& zoIj0w*^zHS4b@{Mu?F1A!*vIhGJ1g{$~NFstfr`E#vof-ZiJh)3VJe&mn$MkvsSul zo7MWqYC}vXstu%tleUF3x?a$S(+qBEm41k)J@g|iH8qn|NF5H1Mq=V*1>D69!dw^7 zA>O07gK$zqnZ)`yZOBy^9%5?#2d9 zv(^;t`E%#Tq69%An{NEORn=;YIcRMZ7GN(>Zc!sSfHMrk^Ote)o#-L$Th6MCN_o3T z=%<34Wx7pn;$kh)6p6Q#xB+}#3YcPtRiTcs{J7Kr>)l8xutwd;^t040V>LHxnp^7u z@ff*lJgODG?wHHkONXgpnCmm}y|-JTLubV^=+r{_YB(7W>p07zUoD74zhkECZe{?+ z6bg`tveWO+7L?C=mfg4I?`KAu4h77|YhQEH>sZNoP3Ho(uD3 z$gqmXRVEp&Un5o$fy7d*wj&_QN@Ln}QlbiYd`;iNU&7xrMTQ;FOV7kq-G|NLF!M zQ-~y6mr6XXm%y!xW6Nl0m8YSOjj1cU=@~;e)o5yVvIDf?+NnZMk4^N3&b`zV=;3i| zvWph1(x;%(qaZj~5=hr!*yFl4fJNj0kZ@jbdTj6DTK5!+TrN0<8<$N^1^+Or;IkX9 zb74F>R1d<@HzK3Ii#$Aj^ZM}hUhp;lTkDTUzGN@(4Nu2FVVFGJSck}J1`H|YuX)Ch z19r?rucO{*OddIWSEA%ijQC2vR}>C|{yKoIcFxY+u(b#gk++HS$y^px$u?VnIBzOD z7f`vAky+G28zE?9=p5Q}Av=gD3HNM!E^Jy*6LMoZqgIgwOz#WlCX|m&2dp)wLf@j+ zXu~7(Pn(rTyt07L*z`x-!IDg_$3T+!Y)&;_hO1W#1$=vDb2k zu&JBvU`yb3`|`G?J_cJEA4VIw zlY~6pvZ9eng2=s%b@E;J@b%lXzjaUEyg3WAJ22kNJ+G~r&6eC`@KDRo4K`TW#tKfH zZAp-1PZ_iD_u=Jz4Ug_-pN>t5IPfSLZ;h3$s?Dlu-q$?@pyq%ooBaX*bWF*~9JUE1n3*lQaHZfJGcf8F zmovp6=crjMZUN>L{$;0Rq-U5zs$j~QX+%nPj?DIrtF~tqCHRySa1{uQYLM#=pTslP z3UC{?D~Ovzjivp|(>*w~RmI)KZ~K$IFD7;e zNW^f9bybk8C`Cj`7cLcACW^|SZd-uF;@uQOa$7o^y9OsK_y0XR**`wrKR7#jb6gro zUF7CmAbqD1Cg$TXxxBxu3ZcvzfY4Q~+n1Q@2D-9HeeQi^iqU*dO(hW453{qE=D}h2 z$Nj&-@HtHA3FlGMA4s1!!4bH0bmQr_JZHRwuldXUqgRJ7^yI2pxexQ{^v7mCiOH$~ zK0pB%adoZ79(hVHeQ;d+IHdxdSC`=k4X33q(QNuU%uKo61})-P$SrZFKN)};{kxOy zn;!(@sjj#p6Z}Mzl)I!-O{rN!wW$7_0`@A)s^eF7+3GyFEeDNtK;k5vXJ`nZ7@NhU zHx_{s(zKngmQvv=$2>bDh{_!=M{_vPRQ4)Adk$5ByM6%|BuO`e`Di4IkCDRWrf^>D zNO?3Dk1k9%NP>I{8JJ=Gbi~;(Un))rU2{NjTTEN`-%TY^6w@fy+|3@WoDXUBf+~2c zIyM?wEplypcLQ^-T=2syOr&@K;3>5{|S6YOFE1Og}AXM7L(8X60?<^7U%#(nsp5W3O_Z$`t9 z_2A(KOwb(+o^azufl_3QBahfW01#9lPavQENxtlXm0D@IwXkfiTH<{|GmPa{yO0VB zO8o)t7K>~?!vhYf6Eq6uilxfaueN3SlZg5%|HA@+B@mE|GCR(O!y-33fc~|q6S)@D zK?n=;DI5Z*h9RdZ4w75I-**EMkEa2tyhmxq_{w=On_nwEwwXXb2bNL8C#8L+En8?sLYq@FRK~~ z&uhoRet`D{-Gu@4g-2vlrFJrO)uwc*U|%8&K9$4zqry!j4KFp_L>VY>ntS=TZke0{ z$@HVUOb~E2wg>SGWItVuSjo0l^v18pbhAbOQi;_RGTEA5VG1;!m_%L4z(D`f<$`*P zas&Jx-6W_iy8FOqF9(oZglq9ToOyQ1u??9AkUwPEqOzS#ykq#|olJNfEG$*o=Dv$+ ziHY=iqUg^*yFO=M+r~}z+6q$RF*mew;a5P#ba{bEZc%SK*(&=&CeAhNAq+p>iz1JB ziqKP{>l&usifIGib~5>pUN<-m8hn%zQ@(lMLBE)Stio40k!ugo$>$i8D?|^%shJ4C zNuWpD&w1I5C~R0w%lu`Img_l1FC%ykbN;ixy**^PVmI;T$HV;}DqjD2|Mmdy7TyI@RnTANI`k zXLmE854~BwewN-?>dRnb0~sVP_xzbIs5X*%>RhKQ!b0UJ>&};C`j7`ja`NC*?D=nY z);hw^cQ=CLIB+(#jDEf26yh8P`N!Q2{0F+p(~N7RPH$&54hB}>;i5pfzBT8>!W;@D z7SMr$axk4a=AD3Z=})PibJh8-6fnj474;oY+HcRvxpp<7#UQt7^XECGM5lw5S|~&+ z3BDMd%HQ%N6nLfPD%8#b0T0vt1|R#PzZjj9E}O=W;+yMThm4xh$&b~O6U)*Je~V({ zOqZyO)KjdS=u=0_2pOLHgczpf1+4sl;_p-meC%>Z*L4AW6!S4UIT*yG&BOy zUZ`^~iq#}%M+G-C=EOleFVPV#EzRH+Xiflkcw}xe=H4d_Q-ne zq+jW+nJ%&A&tAHaT|6yf`7G40;5BOA`U0KICBK#E7a%Xgu+_(6C^20VP8>BpBk=G6 zk$G*0tGwkS-7s&3~A-E^YdBN>4|oV;QZvf=_6%54N+LCFm~! zKdzQo!gz&1VzJ4ly`$e}vFVZ#LroXc>@r;<;7}EX9Hm?3^u3_A#QbDND86KJAw~?G zjRDD`6isYu4%&jVHyR~={_Ldc}M49q6BfGaN!CP#VdsKb{qW+41cX3ONWnv3{8`pZEIjDNGb?wx&Uh#wD3< z5LGchLy90!&7WeYRtxfNH&9hWFY$R#O|KY}F zWSo|DjxQa)^TF|lg+q4=b9A%Yg8!On-HSr+XQ0}{v9aaU{6@ZVvmw6EW$G$jz=J{&Y!Kv)D`$S?pMmmrKl zN8t_MY$~4<%xrEOZ#|?HC1Oa-8Z?Bzz!TV(FgLB?06b|uT0lPr_k^5jN8>q<)4ftD z?cq<#3hD1?E?~dGy*vAHzk70c`tJ2%;L_mHVX616cHZMtSA3mnRFZU9RfR-W6inG~ zxnLm2lLtp{>6bz5p91|m%&}>c9fvMB?;Th$Jp@JD2mcssoBwyjtIKfC2jlTa4Xy3`F{82AGLh}dmE}7$J(cn;{{jL3 zY14n?stE2CaTZumNjzzlM!c?RF+?%>?vB3k#_Bs1T z{l1GN5`FlKX`qc0+bTo z4ndK>G)G|60Q8ea=flK2r{W2#$t5Y0Z#EyAoDe%=5}5~+oM`GVJ*f)g^#Yb*(h=|*Bh z=`KPbp_WheTgSfL``%KCKPwupN;bFfJ>IQ)zc1G zX1fo1iTxhvkDXdDEv0}m(n%_TsA9gLblDsBX;%#KaRvCkNOPs`2X4o!8$%R~1AegD znEWBnDApU`?dJ3G2x-bZlM2H@Vd=>!eE2N|#^~c775?Uov>q+bLfLaWl0DnmBbIuS z!X!3pW{p^Cdf^;fwHBe27YgxI5$GPeb@Fuf=3Aor^`1vpDg6?KIQ_u6YFI(w9yPiK zJGNST_+FV1z}z=j2AniYInD!d1%}Nn8YJ}5EU@jMeh4b$)1&`9?7rUrYxYRjZrFc; z-gj3`4G)P+IwrZE3aM}oDDsuSSyOg0A1v9yY-)};QX%&Sg9QNG zfK}RhW189QEdkGDsm?wdx)GjW;$Z6dm1DpNw1!jM5@O(?ZD-1=B)1$)ErHS%*^knc zMeGXh+``lGMr%2|xmrhikJ%0t_~HwpJ^x;Fp-a6Q*%!o$>_@j` z0}my%6#}Omn=H8^GeZk*%ELi;U6l)=`v{ZekNYRb5Ql6&#!rwD!k;`yCnkpa(V=iQ zIloYj;In7~(ENyUqmWB3W_e*tq8WuLm4L>A&)Bu04>tuF*5<)VROEOD zW`-{28(<^cGfAW&oA8q_Cn=}yHSX#t?>}&tFUJks<$2E&fIj)EP=y$aUmL@LNDs+SK23jnp?`j+n_b9dlTQ)IUT*7heeY!4++SDJ~&XAf~miKx-L0F zphs;VY5wiu$?NztC7`($RoTO*u!zZc2^LS%ay^E_6PyiZ>VmG*bE)n)8mMj?s`;f7 z`T!TdQBhRsLqJ_@7nn7%?ye8e!1lV$Z`5E&O#T$BdJolhYFp{ zm56XL)FI;Mv$Y3@A(Dn?hbj5k;ng=Afy&059D@bjABPQW_C1}7mXCWIYYn|` zmD(40d71fvOzrYf#jEwRg3syz7Kkmxk)=X!i6Ei1ayKYpXXa~5;b+xt-AK}C!rrhP znGzqm?pU&sJfNPW5g+#cY46&RBR@Lx>uJS5^6d&~Wm(wayQ84sNsB3}y)Gr$vfh+P z;b5LzX`lYcL*?#7h~c0`Dgx`h<5b2D?_Bq#l9}}?Tw}cMq-x#*AzSw5P^G1 zkIf({7W&!nS1??o=ne-i_D+q(0z27aripv^bRiG3W&hyd@a&ki}a_R~yH;`T)P>2cA$pci~EG>!>crMx~70^M}%Q5^`4LSRU;fU^MyP4K! z*rtX9@3!ZOC6MgOteWXXmxh}USW3YqdzOJqC@X^q?$kP&-Arhsd1xZA`Mv&b|HVtc z*B7YnvpH8vB{y`OtCZV1nRcdIpa;(53Rw<5FQ3~J*a$>T+#j%c#}GJVwqqyDQQ_mV zgCU5`h=AM#HCcN)97u$?WNA|1O=v14Ok=`m)Sy#>z(}8uT@?u=GwG{Hue|ZvR5^CQ z*cwf^g6RYbpWR+xc80z9E}8`484m4ic) z4zwgd1H%My0VGoxAx@L8Ir{I42eDWjs0pmnnh)C?V+z1ToDT<)q-IkHzsImoc9o9_ zqeU4-O;w78>@y55Y?<-+dM7(Z%m~351j~C4MS6?t9otiO`iDj!T9-i)XoRUy1h;_y zOgM59B}@3aEQM2_Sd&HOX4xHpE|V8s%~jZf--+S^4FTw|-81XA*uLmtY9U2Zg!827 zr;LDzZgT1%7<4ue@JLKMra0TCRB{y2(gMiRvZ(IgQ=anb)DM-8$N<+P9h zlG0P{sD);<5ivMNaBGqQ!3tNL(6X^ph&qj=nxGO~E8=<5b^I&J6!~o_)SB=gM^6kz zO$2q($L{ZLxRIFiE9i<{e~OYHrmDo8gV*aVBVS`|vPI@V02cXr2Yn{4F%*D2DhRWK zzl0G5NMZA9F?Xi6lml6#oxlVA1DRA^v^ASkEvA}YIJx;HzSUSJ4<+VtK15YuK13rm;hRGWHwHHc zeZguxZgJ1Ttf96A857?wE0EH$%hY4jnk8_jA(hBv;K^Oa`D2x>g!p>zzJ^xBy@IX1 z+y>g2twWR7@Hii$DDA2mhNIinRUFm{6nBpBUh&Nh!kGiTH^PF4^*5)q zjcf$A-8Ek_3-S$s0<>IrI~n8NwdX_I3kz>2+IjfdRfBY1L7ZOEeub)ddLm_>$IA{l zLU|T?Hq9rk^86Rhkv<)QnUZp@A7oS3Yx>2rVC^i*o`f>H0g8cN686o9Y|ej#5YNSO zHlI^WNY97ZV9Pru6fzTP1s&@#pxglgz%hYX)imhtf`b{`0*&l?dt3TWJHm>oP+6mgDphB`xl z+BM;xDE2ByCZd)!xokM{wT~XcGbc^j=X|B}--^>mH0X3`4<2JDc=<^^v(!H~kea?r-J>ehAlO6BmJ>V@q#ck|umJVJI z{gX?4iKQ{sMoZXqJGgXa&$GvdO|faou$^>Su5dZ;+Sa6%u`WGhXMkJdK z3&sgS0>j(|hWiJE!*UzkSU7 z+y!|w7F~3pzLl>#rm2t46uK?cbG#E zis=^}CH6{3ct|6&OK1{NQq`f8H^@g{aZ_XwY$YntnEh=Us(!~AW zjI_vmi#~>Tfz$O>Z{cMC7>#+&gdg9E<+}Y?Du>lD+_bjbvRQZEOqi~H%}m5=jpP%W zx9W61%#2Cn5Hn+?Qc%p;ze%A5jEvpE4a2h%gq&DOZU{R6(#ZpsxXf(h*4s{zme~sv zO6si%?A2`c-qHbthAc4L1)0NeCe#MRjMBfyr~^TC0g?qEh?L5q=$#L5?JRwrxj$HA zAZLIZGT7{>mb(fnly&l-m(z&=_$7ap!cB%<;IJW)x@T88Foqdbqz%I-8ES<6LrHf? z?ht#yX;ke1La{RyTfwQH>LVXj;R=~VD-9A2Cu1d>mX>eS)GAHIQ;*ZKuIozZSTpJb z0htxiofVS^1iI_)CR(BX@g4|mjd0pV=TF6C3lxFr$nFJo~DCSjGBB1*wfNCNmbByhcAV7`Z5cQwwEhLVVYByJ{(`OF$zrmpAtjk&XE6oXkI79Gw@ z8b`y7(;vT@wyPEjCYejVWFIk~`|*3m4a1l6)uN~BgR zkb$UruSQgDPDVFB+(UT6c+e;iDY>Zx9S z)}(h0x=)NQODY>t*_{}ZuK?yAq8l3OQ9ocMk71wr^m>jlqH-#W+p$zdclOz?>UVZJ;(G5aZVApqESTg#tFbbFPF8Ib#7 zGQ&kgzRi>?b(t`3f&Wk%0VBaVvuSQ-onmd$S&^mWoG=i&J;?kFBD7>r5cdgD_*I6$ z()T>y4V6~ig<)Ry3i^_sHI#e9eh4mz#9>y{ccoRRZWyAjh31$wPP>_1DE4uXCyF%-3eOsnvy0!B*U2nk%!?&;g#%%eW(`rp;iwQaxywCGFX|k}JJpg57lPNk?gA29h-55&2 zIaSP|1}EnN%-8vp6nu_pld}hTOq&S-lxm1nr4NqK9!y_jRxijd!s`cM3O}dB2#KR$ zF0Sihb@M{M_~`R}S>VtxqaO7k?F*bGLI0tp{tVntFeT3g;C_H{qp`RS@h8OaQ<0bk4ajMKlI%%Ko}9M=b;#HI)dWv1W!`@u|L zk&$aM`-!4P9_UXQqP@BKkw1ixhv8R{l5~4CDXz(|J+T%;w@D}<)0yd2J|2f=&@;P` zv@KB3#$5&VA>m&}DN2d1^(H9r4f^@)L-#SS*tgyWvFo0wC?2LX1hQ9cy68SE3iL3* z)NZuRpl(4~_QL&Ck|vbS`%0#=Sq{+LiQbV2f-(rIVBiAqtu$%^KFlAuczW4%O(D)q?2I)}9rx;$- zVmhH!}>k%(E~qCdZG<(A^Q z)7}JJS2PuFKc|PJSbup69t7RveN5aVhBq@SW!F&u66)`D3#6yk#PG}hd%2W*#l3_J z_4nOs1t_g#qy`0LlzN7pv0Bh-HRwjbfXw;)a{uVnp*x}dB9;$rAHF?#bM_`Kz-*{% zDBe(37YkVI1PmDIB5~R&`xH+b+F_W~?#YZx@ZNkhrS*B})v%~hH=07gIgRG9<2`yX zKLrM(bfcO!qA9ju`i*r`1&9lye(n=)(fg1OOuf+z&@~9gERaIf-2<_L zfUg=339xST*;dMw9kk-{6^PcGPG?I>Hi)Sp%z(_5mSXf2+M3r&3G7;8O+A@?oedAl zKE^xIdp+nzyh8W9CGy$l`Wu_!VZ!~5I7BvJy?#66yV|aQ)2Ns_z0;f8$JH;T%EW^H z_8YTA?yjbbz!o2mYtJtf+(6fzArSad)b!xPY}{4fZXwmSqCzaNKr0^@kHpuR;F3vf`*i?3s%xmP*!X!;-U~-r2*)*87AWC zL!V87E@0;Cfy3$YvQB^s*Cm`VwIyiUzh%`aVK%5Q&RJTS@cH#aO`;r3s{@%E+mp@Y z`f#dFfU1$8n(VYs;f#l8ithAeWh7V@ajZBivhL(US&Q0wxACOf8vcFFR*gorO-55X{W9}O{61D|DyTkx3%VC=huL=<8GvE_?rLCl z_T!DKDntbzyk4%gk!qGKo>5|7=oIS5ZQ{AK#q(ppjm~UGQS2Fe@<# zXSKYTq47d-3_&U66fr0ekqxF7`n0GB9SBupQD6zqDMm!VkhSa$;2qh_YL_{LZ`-II zN;r~}HLJ?Noy|x6_eIz(%gMH%gBuB$hUrZ~q6gZUZI!^p1b#(R&aM{vzepV!23xOG z$`nL2%Yv^aq?JSngPC|eiFQc<+lxb_B)PmUhk_NYhUr#QZOQNDLhRjqVE~97L7S}! z;g?=Zl2Wg4ikQqv`Zd4QX~QHiu1cSy6*^ed9p}~Oa=7w$p~opz5_}n#%Z$OUdD2`142aW0RS*TT zsb@6ZRAYlF4c|bHzcO3=*w}RGROSf*lmzVBLqR*F|L?WlW*U;=G4sC`t`w zg|XU|=72M=$89SkIfZ?24YqpwS#af6YJUvKJ$v)w4TMR+p)!JC?C6M_Em->kyn2}k zNM0u4c9*^utDam-h}A;$){&|Y;oDtyDV;gZVQ8fZ&~&ZVZ`oTGT}JK{RQS`g{WDKg z06T?Huvxm%65Hd2H*;hYfF9`b$rURECFeOLY?4Fvtgy zurF4XVCz^(5j2{0+%s)U3#ugC6ZS%1!}Vufy|#0oZM&3Uzu^*8X65)@t-_{6$N`T9 zx7ISz4n17yD6yiMTSWJU^|4EfrIW8{-}Q?3_&Z-TmjxbF%aT*VzDgf5^t#WN^acG& z52^3;6o043Vm6Vkpn1jIhB3^@`r{@QJhYl%PqFvs{_>-XkTg$8DZt(i2r0ofWq4{U z0T>(Pb%ydDTK+?Pq_FsH9ee@!hUBQw!oR74`P2T=E&kyJCf@FjzThOE&F=~@P23a9 zv{A%xb7AUYOm55e*u~x&>csBHBnse)dOm50iE>}7V$O60K|r8Mn|;U^L%2-Oh6!h> zgkEW#>AI1w1_WB_i45!$`I(pD_|rK>;i*c0#wVP0G?5@6JW3%+qj}SM=y58>#`IYT zY~qlAB&G_=Ic`xBs?f=JW0_rZ;ez^(PP>OECoS7s8@#oNclhnY)02ZgTP)Bb`^)Qn z1V>y5b{yZUAo>Fwb9Xl74xe0>w`V88_d;QWNIk0gOuB-1DNlK9?of3CP-4~f`iQ;C z5rSSY@M6}$u3jH4vguLFinZ2{JEW-d0TquO<^h1tfu)}{H4$ACCHHb3x_ zwy;E7j4kJiwI{w3I<0+D+uavzJq5LnHu3{+f|s6Q#t%$V#c&&TA(;q3rY5444qhGZ zV~{Z(>Sd`&ERlPglE^$>yc7_0=`y+{#6O$t1S(nXnOEwXr$w@eYu*Y!h8qI(yc&;z z6fmoOYo&CwxoD`yBV}+e&ZR0 z6W?;I#N1VIRb-VnnX}bY5K6e+)U4Gd!m7B#{g(3=I+Hg%|Mucw?69RhYTUV#C(4*3 zDCI$_{nBlR{Kir}iX7PC4&b%*MM`dkL$*$+W*2%skP!Z*cKm@W|JSjbJ_R9or5p@; zu-OxNB?&kJeU*XVUJkTK!!JcHu13oU0|uzBlMMXV3frGg@c7t4ZD|v!;i31jlr&)< z`2qM&u%P+!+G+nbwqtL1k*P-n^8?24lz=)sBUzwzX(p!Nxj-Y?WIJAOY4JxTU~k}r zcAa#>n}KXwhiiza<%+|_L&tMG52^#OgtKGRWtJ#kVkH%-&+$v`-v347y-PCDZsKBC zdfK75tHpsTdEgc_VOpoFV7u%q)5r=zWM_&Qya_tqEW7L$&<%{K7vROzBGm>SoH=;e*7Td6m`8 z*<#kYf0?yRJ#x|@I_U$pSe&tXH}y)T?%wq*-06(>WP}`|ZEn_$%RpD`f@TS{GJ4P& z&J|J_U88koO=f~BRB+u}ad@NJu=_g5pfa3WnZu0Fvb&qxh(-Olj(u36xmi|3cFxS2 zO{1lw#M0%f%I|-TRVA0EXjMNiYW1R~mhRW5~69Z)UAsj?_fF>oLj8^ybnRM3U z2QOdjCrO9t1{TxZJF1cR%G#jA%{8LKler0-H>)1c8dK+)mC>ZE3ps)gK^Q^D>R;cs zqibM0<1}0w$$MR*k4d~m?j#o}2NXXKHDJ41-?Ozu?|y9R3P>BT>dH5eYJ&8Mm2qL*4nd zuRBi)K<>s2XsC=c``osBvr}X_o0%iYP-B?b;P-iWsOgCrfXe*#&?S2Ffp_TklQN)c zu-du51KoVz`QEz2eI)6EL>SN+9u#Ppq--F-Hx4M7D}N6)5k%l=cZLMP`sN?8CAry4 zI8tofOujD{?>&m}VCvmrpe-NF)6eJbS-CvuBf{gODq$}n>-~ne+;eryJ^$U^a?{5^ zWE@K#1DqhrF?GWUdaLnrS6zD7RiLw6X>LND?7_!cd%aV~{#L4Onknc4>$fqpO!flO zh_WpUp&_wc(Xn~%%rXi>vK#`)74Fo-B{nzJSff0PxNly&l`BSMocbO6ssssE1~WfF zGG*T^@stdB0xA~VnW#{={KM?-e1IC@&96PP%y4e$0c4{!B*?Wa#?=O8?4f5F1k~b6O28yrcw`skvbR|p9IOMk#F`j{PY9fJ4ZK#^QV?5?MQ01=wvOys5VxHy5MyND zljP}w?J%2rzH}BAT6a6XPLB3zYR{%6 zyjqNwkiT!S7|~@CX7+M1n}T4*V!&uQGJ?QA5OEDF8F6wvyCC!l&h1xB=H08wc?+8U z@#N_2(5%?OVM|4wbpe&Bqv9Q*C@}zYu$Ii^?q))o@UU}g#05JUE^~muIw>kh-CcG! z6T-K8h*FXJo7e&U9ZDvYepCh(YhKz(greC7)(ZJmnM4$uMg<{EY9k==AvxEX9ZZ9sOFPFi? zRB1jxqGwQccr*NJ-ZMxUTi6DoqFZr({R22Yfmz_yXYe|Qur52SEBwi2b`sjr)3wu| zAnuJhrr-P^8!3V}Ev<Ypi!D=rpHYGHv|8l58_Z>F zf;%q_4`+B2PX)+%IL#;(mv<}V>2Q9ySO!y{gh*ln1}a%w4oG&AZvYAxPQhroqf?-O z-DfkLuc{mwb-6K0lCw&DCgebK)1*__m)*Be_ZrJHe8$8t64APq;?SoC$*FW7;@i~2 zhgl*ZGZi?)DQ1k|B!HVGxjU%S7I8C~d9Exaj8xRO!F%$sEGL{Q>x$ya-y>K|QWI$d zqslIJsUYN75AIs=GK}#J@=EU7)!oW$f;=AxHQ*MWa)M;-t0*~In8gg&Imqkg0V~C+ zXY|Z|s<==DSA%t~5q#ScOPr+n?C4EXF2j4myZvl3YqfA#I8dvT;?!ot5k>f$xp`Z6HLMSQMY8*{FI-Q>kP^$e7*Qc6e++W1uQ5hG;SE!_LxZB6zz~z8fVE4$$X@(6Phc-3w+;2 z_eoV!*=Y(k*Pw|xCg2lxqjrzp9CVLQ@R=FJ{>jPy-@2zq|9NQ5&2TT;Ik%9h8b2*4 z@^{_XPqZaIs9zTuTJH4PE(8*lZ}F*>;Pbl5%#xaQ}-o zvSO-nZhvsjp06nOgdA_s_IG51481T3-4 znxMt%PI6J%9d;RWW|(20%k^LHPR*|{E8=e86klcl+(jm`3`caOdt0gHihE2NDke6@ z$Wz28zw6zks$7{du{bWn`xGC`-4}0;4-;oIJ@=!5t=Ne?!u-0IeA}PR-j7nDIWC8% zJ7-a(rbp4~D4*$ApCI><2IpjSOooj(mgA&8?E5eK!E|;9zL3b6UEe&rV}ot95)8-b z%$#?ICpF}5k(7fZAVA6YgXj0NUH3xMjC>3AuKs9Jyn!Yh7(5;9^!J+ML?lb5yKFKl zaM*%r32pPQztl`*jV7U!CGak}jHNrNU}s`aPsDu1#A4MBWz4HAeJ#&=D7<2?W!6=S zTh32TECzG$0Dyp%xJuV2XxXk2zrZ(WZCp6cLmBgNwx+P!G;3P!GB|_bVZg$RD(*$5)@LAq1Fp; zmZ~VAeEpNc#s1mZ;p?|&p7c6LVsG7#Ut`9IVl|)77Rwx_Si3Xpt5PVVoE)B-gEwm3 zd)u&a)%wem!$W}Rdufp>B4GgSiy{D3DdH1Sjnw@Gg$(R-66til$iX87oT<_B?kO_m z8cAXF(oc745HM-?%}Ezz5z)5lQ$w&s`4wS=LL!?A-p5~cEKtqAJLK_5H#fW0lqSUd zI$H>S>i8PvNZ^f8Kv6YI#Pil4sn64I+~HXIx=B~oyPl|y#B8msqeFAy5)&QpIWUqv z@SG-_-Cw-^tMVZRXX2GML>S%(zkSG&B@Rc^QDN5ozQ=~F9zLzaM@vS;ozxE3mfX|t zeKq9USAT>eJQ?;pOfIUxNy zKR-)W!jtjng?9moWmd!P-E-eV`iNvMQrQy%S9j3r*{EnRqm z^{+ZC@PV1Fma!1tU_jK}k|Awx?^V5~Ai;bWVX=`|-;D65e7* zBq^bGJ2a+tH_%^}GW0MaYA@UM)%4MPHF-;ytkYj1lg_P|$+gmal^XWmH0^iZW4-_J z?(p;s9IDU$+&zACcJ%V-U_U&D2ueFqrrciGTvh3^45wa!pXl-uY>x1cIJiWT{*A1A z(P8Hs_kMM4rLQh3UmDqJgscM2fctQ%=q>YXl22xfYZNSL#>|y$G=%I0-X#;(l`_Uw3MC1r>gRERtJqLCr(b&Vk4kd}T?>#f}?R zJ{=nn%3A3i817%`T)ks1{Af9(Z0*=nxAv-1rtyh#E8ifSHSZNAyK~~|b#&jpv1n~| zZ^aBLe zFLkQX9NVHb^XweMgNzuUs+pF;C8VV_3**NGsi(DX2j*2?xWhBl85E$I4|dOeB@y4oAqArMesdRyrag|Esx~JurYeTnK$b%eoY)RA@jTc^@OKp zGhfYQm*VyN6kTzALXD=UieSsOb&6au<1i|XeobnPNK=T!jW`fREQQ?@61(%MSjPz3 zNFk~F?Y;5rlfTG(dOJ^C%$w{Em~hNwj!|BzZExqjW^QrA&v!7kj zO05m2*=d4Nz$HTo(=Y=yP?>P8=5E4J{8m)kF;}T#E4H3qd|Gi|_0Dec(GuM&WuVep zbC%oPKYl^0oH%5vxLssyPg8vr%}0Q62VT#V2Tn=wg5n#EuCxvBt+%>X#`j9iC~EgE zZd-6A%zOPy3bSju5Q9NJHcTD@lyL|OXNI(y=Ye* zX{Eh`qa1r!@8TDqLQRB}GGkhT?ZrG(o#cwQG+-_=C$~Co%1@i7CryJ>ruiXbjV$re zk}#lF9xTao<;KElw0$ZFLPO+hFIVv=Ac|d0-%n>(AYEbPhPnfjt-N&iNQg(mnE^Uz z16?4%#xTw8%*Mxj5)29OnsI?e7!ITEK;832bx={n$%43|Oa}sCWRMrDLVb`>m31Oj z#515gP-T$_B`J+lsVf|WsU(VjO2=o3PfOPntewjEU`T{%aXBw?2|}Fa`faIGZG9od zjkz2Q2Vcdxv@>sk0fEoO%$Nt=X>UT&p^1Pj?6km(!8|pJjEWS^rTXlk;kEpIYrc~7 ziiy9rhNyFs4+b06H%{}OYT~1od0z6?b))ZJ>FPKUu5~9S6sICnD`5Y$C+y}1(gU%o zy)=7L`wHO8P?AH%ckQMjcklrvImbFkl`jro9wB(y(OF9X(aJWd0=7TRx(;vD=aI~JhdwX{D z-K#?z>c=00INT)Imp2D^DqEQa)Sk+$)M% zAF%8O*|!!F2B#ZLBi!Ek(+IaG9=DG&o%(5na+0g<8=w&Okp&a`+hb=)|O8l(!?UCl#4}nehqbphROc{%!tF$I4@`tE_)wxyj`5< zrYesQ4ECm9?~CiA+aJ%09BM%ez3DX#!B!QOI98YL3_OSj#r#5osFW)s2P}=^KgJ)1zgG28*^EC zbNJW8gSL&GHf6uI-Z&L52ceOYZmx{uF|=gzaf)`QL1b}SYES5)6R?px9KU&e_&QqUX&xB0isL)LkqL>@Kg&V5!N&Xcw4np0ia)c?fzD}&@@`I0`T@=3L?mE zuNQ_KhE`vw5*dWt*Tt;{j5k4O-J&zC%mo;l9-9fK zySkxXbA==AOkR@s-b-TZ&6b*t4PNd5@Eo4{Q>fqY6dJB18oTcz+6@Si5PpN5y8NSyY(<71=>uU3dx(c$~e zw0n+$$4~l#DN>OfI8KqKJ79+Z- zS@987P@?~czvx!+UhJUQP&HSnnXAjn%Pxs$v>RE%Mvo1ab5Kz&E>_^F2=5cVt+U8c z*9hfHkh>myY}ckE@W)PE4reR>0BLeO$m>=#7+hGZUAH&q*}Q93%@s2u#?y9isuvJL zJL=~xu@ayj&n(br20)m?3n@NNxQJV{;6i3EVu_WO-G@iv{`dPwpqf=yD-RsOr__p8 zxql(;Jj?!f&Bjo`44TnfM4Try$^h%9Hmm``Kr;$&s`2pOS}uSmros^7+HAN|5)8k` zt#^q>30@$g0!hKRyqFwIc)sI%I#QMkPPQ%XgQoW+zt-JmHKF*-!kG(vb|F`DoE`NB zT5~|{HBBlNc=qripOgs-(jRkm?58yQs9?;P&SyHKd=kQGj%&7=q4B5VNTbt>QV|M{M3ObG=ffpxe66B&6ibc znGAPD$Tf$cw&}n?uFA4yhdCT}8;^C#a5~CrS$=!$WY#ECl6?$2a&ma~&Pb393Nhrv~16plviiAdDQ`hL~qtV^}=f%JwtgO4h7)f)l&++~%g(cxJAwiOeY<3xQWasBnWxi7-Vmoirf|q>ZdCM%$%|Q)NsIoQAnI*9V z34avpc-Dko?#lO5MFlbBi@+#jsE=GtC5j(R0$d);Ah`1a(Z(5ldX(!^rD?Xjj!>i^{5gco(NS;O{NzzIxiLNqzqRNm>K$E98!cir7m}0SiPxUz1Yg|! zv;3ijJyJBe;aT2OUD?z=zkE6pi`1eWuxU%9`GIzs*BKN9_|;cdTOe;FH) z`pbW$`diLRf4#mk6e0DM|4@B(k_L(zfkOQbSvIM{R#QSJ{OwqGh{tIaKh;93@=V;V zdG9t@TaR{MGs@#zoUW(6bwLtBBbhT7HwAb*^Q?qOoG_UryRaOigSLq%p z9M;zHf_mVEh~b`huy-4}b?lyhv8j*C%iK*|byr8?@qV-Kyx2Q@SvfaecOq}yn=Fhk zj#Ww{iI~Z{`>=`}^8yhXc(9hbs5h6NtoZv2UA&{#L!a(nGK##}jbFz>dW5HRiIDtd zFM}Mzie_~PRDljF{hsN%c5W$1lB&+vT(v%)NAPZT4we?sXCnbOb_l-G37cbW=sjZU zz~@HO6)}h~&!Crt5PiZ`9 zEFQ`8@(z}Ky|j3#vX2gU$C={Qd7M~|$9{V@+c7X4E-7@-pAj}MKBn>GbNto5fIK_E z4_Bx&LKlkn=66{@GS*FtRvUdzRB5_nkX6P91VD!-^R(r(@>I;HVk8#+eTy1~4q{1C zB$@dr-YeSWug{^YxD43D@?tdTPO+0zK!ibeCvZxX2?8C7`5z6t4Sa|o_+6NBW59SIX%{w;DXzEO*Ic2%VvV<@X`r2|x zN-U_9L>dYNVYHSz7Zv-m$^QJa%s#e!OJ@M|%j!3Kx?NzaJI=kxNj0i6vO6(&`!yv; zz4=(G#V=^`_Fo-+@8uD8=?mRekf#w<>|1T-q>CN4)juOn%ZWeD6D1qy$C8>LWl1_c zJm?;r{gqD;-%!qod!IJfAr1Q0`uwE<2aygmVj!DI0)??ukf?<$T+V2ysJ=kdLYkak zbbR{DcQZ!nG?PtyTGIvMpTk!+80YHNnz{N4CC zG%_aKgLfe&t2~6X#;2(cRuk`4KnmK5ss|9q5!osw?Fx9Mxz16EN$;cmrqsQW4<*uU zr4uFS48Ym~M7Lec!K#B7AK@XxJB z5)+mjE*UoKbqf_dRKYU_z73~u_kTPN;2G;&8bVKF-A3{p7mV-p@lts}1kIz9qu8Qq zr=%|QSyG!PVhh9InzV~yBB;i}YUI<^L_h7Kj^_&g8#`Clc@D1Uk9NhV09S_fi*|IE zE|&Fl#2G)`V)@Q!Yq_FTIbQPp`bM5;O@upkS{{t@!A>Cdpw`db41Zg%wo1)?;*xoP zHMQ#DOiK{l#|JBWl_b}+J8&qwedmYlLY5sAZ_u(YBI`9rA)^KBZxCc0gHJng zYb_y3m&*21%KA$hGY2~Vo{FmUqM4jNi%YS8jQM~FkR|W8=E@D5B!L}%sg94WIm-^x z+SVL}WcfI_=U}uZ6-bY$BVTnwIqNIw#_+W#0^kxt-{9lu@H5VbD6v}2w^#dlP3^_# z;?h=EB7&8bKarGqPfxoo#j|Gz>;Qhzv5>l3p?ksqp1

`L8)o(nUUq>OOI069$ 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 XApg&o|I5Vz=sjpvr$ZVn3JUB$-=o)B literal 0 HcmV?d00001 diff --git a/binder.spec b/binder.spec new file mode 100644 index 0000000..29ecd71 --- /dev/null +++ b/binder.spec @@ -0,0 +1,41 @@ +%global binder_dest_path /usr/lib/modules/%(rpm -aq kernel-devel | cut -d "-" -f 3,4)/binder +%global oe_version openEuler-22.03-LTS-SP2 + +Name: binder +Version: 1.0.0 +Release: 1%{?dist} +Summary: Android Binder IPC Driver + +License: GPL-2.0 +URL: https://gitee.com/openeuler/kernel/tree/%{oe_version}/drivers/android +Source0: https://gitee.com/openeuler/kernel/%{name}-%{oe_version}.tar.gz +Patch0: 0001-Adapt-binder-as-a-kernel-module.patch + +BuildRequires: gcc, make, kernel-devel + +%description +Binder is used in Android for both communication between processes, and remote method invocation. + +# Decompress source code package, make patches to the source code. +%prep +%setup -c +%patch0 -p1 -d %{_builddir}/%{name}-%{version}/binder + +# make. +%build +cd binder +make %{?_smp_mflags} + +# install binder's ko file to a certain path. +%install +cd binder +install -d %{buildroot}/%{binder_dest_path}/ +install -v binder_linux.ko %{buildroot}/%{binder_dest_path}/ + +# copy ko file to the certain path on deployment environment. +%files +/%{binder_dest_path}/*.ko + +%changelog +* Mon Jun 26 2023 Peng He - 1.0.0-1 +- Adapt binder as a kernel module -- Gitee From dca606812c01f1dac760531b5804a3584404f79f Mon Sep 17 00:00:00 2001 From: heppen Date: Mon, 26 Jun 2023 19:27:31 +0800 Subject: [PATCH 2/2] add uname-build-checks in BuildRequires --- binder.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/binder.spec b/binder.spec index 29ecd71..88fcccd 100644 --- a/binder.spec +++ b/binder.spec @@ -11,7 +11,7 @@ URL: https://gitee.com/openeuler/kernel/tree/%{oe_version}/drivers/an Source0: https://gitee.com/openeuler/kernel/%{name}-%{oe_version}.tar.gz Patch0: 0001-Adapt-binder-as-a-kernel-module.patch -BuildRequires: gcc, make, kernel-devel +BuildRequires: gcc, make, kernel-devel, uname-build-checks %description Binder is used in Android for both communication between processes, and remote method invocation. -- Gitee