ࡱ; c  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abdefRoot Entry  !"#$%&'()*+-./023456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno ®`VTextStarWriter 5.0l{: SfxDocumentInfo Mike P|1tMike W|1hMike W|1 Info 0 Info 1 Info 2 Info 3 P|1t7t <44Standard LIBIMBEDDED LIBIMBEDDED TASK,0,1,H32,0,100,1,2368;121736;110;0;116076;14971;124381;0;0SW5HDR.0W|1h!Outline0 #ZSBX sb Z Standard StarBASICSBX ARSBX AR SBX AR2c%bqqOSWG, A<  #$%&'()*./0123456789:;<=>?@ABCDGHK  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFQRSTU0R'&@ TimesNewRomanX'@d X' @X'(!@. !. XA'2*@'dxdxdxdXXJJ@NX@dPM' TimesNewRoman$' '(. . p. @ . . . . . P. . . !. $. `'. 0*. -. /. 2. p5. @8. ;. =. @. 6')(02 StandardStandard@ Text bodyStandard Text body2A'List Text bodyList'CaptionStandardCaption'' '2A'JJIndexStandardIndex'JJ FooterStandardFooter@('JJ<|?Oh+'0 h t 10@@ݯv.@.@lgMike Mike SW5HDR.0W|1h! Frameformat ZeichenformatTextformatvorlageStandard Text bodyListCaption IndexFooterRoot 10Standard  Illustration Table TextDrawingY  .Y  .Y  .Y .q= GeneralGeneraldNC#,###.00#,###.00SystemNC #,##0.00 CCC#,##0.00 CCCNC$#,##0.--;[RED]-$#,##0.-- $#,##0.---$#,##0.--REDNC$ MM/DD/YYYYMM/DD/YYYY def/SystemNC%MM/DD/YYMM/DD/YY def/SystemNC&NNNNMMMM DD, YYYYNNNNMMMM  DD, YYYYSystemNC' MMM D, YYMMM D, YY def/SystemNC. [HH]:MM:SS.00 [HH ]:MM:SS .00NC3MM/DD/YYYY HH:MM:SS MM/DD/YYYY HH :MM:SS  NCK MMM D, YYYYMMM D, YYYY def/SystemNCL MMMM D, YYYYMMMM  D, YYYY def/SystemNCM NN, MMM D, YYNN, MMM D, YY def/SystemNCNNN, MMMM D, YYYYNN, MMMM  D, YYYY def/SystemNCONNNNMMMM D, YYYYNNNNMMMM  D, YYYY def/SystemNCP D. MMM. YYYYD. MMM. YYYYDIN 5008 (EN 28601)NCQ D. MMMM YYYYD. MMMM  YYYYDIN 5008 (EN 28601)NCRMM-DDMM-DDDIN 5008 (EN 28601)NCSYY-MM-DDYY-MM-DDDIN 5008 (EN 28601)NCT YYYY-MM-DDYYYY-MM-DDDIN 5008 (EN 28601)NCUWWWWNCBXoeP<p5 2$99 SAP/=APdddAPddA PAu Prk FooterSYAPddADPN;T2SA @A0SAAP/=APdddAPddZSW5HDR.0W|1hC(569a(Build:5169)(SV569)]D!Address Book Fileaddress! Frameformat ZeichenformatTextformatvorlageStandard Text bodyListCaption IndexFooterRoot 10Standard  Illustration Table TextDrawingd:/1 4 5*jK standard.dic soffice.dicZsun.dic@ IgnoreAllListY  .Y  .Y  .Y .6NA:T=The System Call InterfaceSA A @T$SA A @T{WThe POSIX API defines a standard set of functions that the kernel should export to appsSA A @T$SA A @TfBThe System Call mechanism provides the physical interface between SA A @T$SA A @Ti-The wrapper functions that reside in libc andS1APdddA A @Tj.The kernel routines that provide the services S1APdddA A @T<S1APdddA A @TXExample (the write function)S1APdddA A @T<S1APdddA A @TRThe user function callS1APdddA A @T<S1APdddA A @TYlen = write(sock, buf, 1500);S1APdddA A @T<S1APdddA A @Tj.Eventually results in a call in kernel mode toS1APdddA A @T<S1APdddA A @TYasmlinkage ssize_t sys_write(S1APdddA A @TMunsigned int fd, S1APdddA A @TNconst char * buf, S1APdddA A @TI size_t count)S1APdddA A @T2S'APdddA @Te)Our objective will be to understand both S1APdddA A @T<S1APdddA A @TqThe binding of libc functions to the internal kernel functions that actually carry out the requested services SBAPdddA A @A@. T<S1APdddA A @Ti-The details of the call and return mechanism.S1APdddA A @T<S1APdddA A @T:System calls are predefined in /usr/src/linux/asm/unistd.hS;APdddA PA A @T<S1APdddA A @TLEach call has a S1APdddA A @T<S1APdddA A @Tf*conventional name (exit, read, write,...) S1APdddA A @Td(unique numeric identifier (1, 2, 3, ...)S1APdddA A @TSSHAPdddACourierA A @Tp1 #ifndef _ASM_I386_UNISTD_H_SHAPdddACourierA A @Tp2 #define _ASM_I386_UNISTD_H_SHAPdddACourierA A @TU3 SHAPdddACourierA A @T[4 /*S1APdddA A @A8CourierT/5 * This file contains the system call numbers.SHAPdddACourierA A @TW6 */SHAPdddACourierA A @TT7SHAPdddACourierA A @Tj8 #define __NR_exit 1SHAPdddACourierA A @Tj9 #define __NR_fork 2SHAPdddACourierA A @Tj10 #define __NR_read 3SHAPdddACourierA A @Tk11 #define __NR_write 4SHAPdddACourierA A @Tj12 #define __NR_open 5SHAPdddACourierA A @Tk13 #define __NR_close 6SHAPdddACourierA A @Tm14 #define __NR_waitpid 7SHAPdddACourierA A @Tk15 #define __NR_creat 8SHAPdddACourierA A @Tj16 #define __NR_link 9SHAPdddACourierA A @Tm17 #define __NR_unlink 10SHAPdddACourierA A @Tm18 #define __NR_execve 11SHAPdddACourierA A @Tl19 #define __NR_chdir 12SHAPdddACourierA A @TT:SHAPdddACourierA A @T\:S'APdddA @A8A8CourierTr226 #define __NR_madvise 219SHAPdddACourierA A @TG227 #define __NR_madvise1 219 /* delete when C lib stub is removed */S'APdddA @A8GA8GCourierTr228 #define __NR_getdents64 220SHAPdddACourierA A @Tr229 #define __NR_fcntl64 221SHAPdddACourierA A @T2S'APdddA @T{IThis same file also defines macros used to generate the wrapper functionsS'APdddA @TSSHAPdddACourierA A @Tu"246 #define _syscall0(type,name) \SHAPdddACourierA A @Th247 type name(void) \SHAPdddACourierA A @TZ248 { \SHAPdddACourierA A @Te249 long __res; \SHAPdddACourierA A @Tw$250 __asm__ volatile ("int $0x80" \SHAPdddACourierA A @Th251 : "=a" (__res) \SHAPdddACourierA A @Tn252 : "" (__NR_##name)); \SHAPdddACourierA A @Tw$253 __syscall_return(type,__res); \SHAPdddACourierA A @TX254 }SHAPdddACourierA A @TSSHAPdddACourierA A @TSSHAPdddACourierA A @Ty=There is one wrapper for each different number of parameters S1APdddA PA @T2S'APdddA @TPAll system calls with a single parameter (e.g. exit()) are defined via _syscall1S'APdddA @TSSHAPdddACourierA A @TW255 SHAPdddACourierA A @T-256 #define _syscall1(type,name,type1,arg1) \SHAPdddACourierA A @Tn257 type name(type1 arg1) \SHAPdddACourierA A @TZ258 { \SHAPdddACourierA A @Te259 long __res; \SHAPdddACourierA A @Tw$260 __asm__ volatile ("int $0x80" \SHAPdddACourierA A @Th261 : "=a" (__res) \SHAPdddACourierA A @T.262 : "" (__NR_##name),"b" ((long)(arg1))); \SHAPdddACourierA A @Tw$263 __syscall_return(type,__res); \SHAPdddACourierA A @TX264 }SHAPdddACourierA A @TSSHAPdddACourierA A @T8266 #define _syscall2(type,name,type1,arg1,type2,arg2) \SHAPdddACourierA A @Ty&267 type name(type1 arg1,type2 arg2) \SHAPdddACourierA A @TZ268 { \SHAPdddACourierA A @Te269 long __res; \SHAPdddACourierA A @Tw$270 __asm__ volatile ("int $0x80" \SHAPdddACourierA A @Th271 : "=a" (__res) \SHAPdddACourierA A @TA272 : "" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2))); \S'APdddA @A8AA8ACourierTw$273 __syscall_return(type,__res); \SHAPdddACourierA A @TX274 }SHAPdddACourierA A @TSSHAPdddACourierA A @TNInline wrappers for some (but not all) system calls are predefined in unistd.hSNAPdddA TimesNewRomanA A @TSSHAPdddACourierA A @Ts 334 #define __NR__exit __NR_exitSHAPdddACourierA A @Ty&335 static inline _syscall0(int,pause)SHAPdddACourierA A @Tx%336 static inline _syscall0(int,sync)SHAPdddACourierA A @T|)337 static inline _syscall0(pid_t,setsid)SHAPdddACourierA A @TU338 static inline _syscall3(int, write, int, fd, const char *,buf,off_t,count)SHAPdddACourierA A @TM339 static inline _syscall3(int,read,int,fd,char *,buf,off_t,count)SHAPdddACourierA A @TS340 static inline _syscall3(off_t,lseek, int, fd, off_t, offset,int,count)SHAPdddACourierA A @T.341 static inline _syscall1(int, dup, int, fd)SHAPdddACourierA A @T<342 static inline _syscall3(int, execve, const char *,file, S'APdddA @A8<A8<CourierTs char **,argv,char **,envp)SHAPdddACourierA A @TSSHAPdddACourierA A @Tq5The wrappers may be used in any application program S1APdddA PA @TSSHAPdddACourierA A @TSSHAPdddACourierA A @Tb/* syscall.c */SHAPdddACourierA A @TSSHAPdddACourierA A @Ty&/* This demos a system call wrapper */SHAPdddACourierA A @TSSHAPdddACourierA A @T] int errno;SHAPdddACourierA A @Tr#include S'APdddA @A8A8CourierTSSHAPdddACourierA A @Tj#define __NR_mycall 240SHAPdddACourierA A @T5_syscall3(int, mycall, int, p1, char , p2, short, p3)SHAPdddACourierA A @TSSHAPdddACourierA A @TYmain()SHAPdddACourierA A @TT{SHAPdddACourierA A @Td int v1 = 10;SHAPdddACourierA A @Td char v2 = 11;SHAPdddACourierA A @Td short v3 = 12;SHAPdddACourierA A @TSSHAPdddACourierA A @Ti mycall(v1, v2, v3);SHAPdddACourierA A @TT}SHAPdddACourierA A @TSSHAPdddACourierA A @Tr .type main,@functionSHAPdddACourierA A @TXmain:SHAPdddACourierA A @Tg pushl %ebpSHAPdddACourierA A @Tm movl %esp, %ebpSHAPdddACourierA A @T< subl $8, %esp !make room for local varsSHAPdddACourierA A @T9 movl $10, -4(%ebp) !initialize v1, v2, v3SHAPdddACourierA A @Tp movb $11, -5(%ebp)SHAPdddACourierA A @Tp movw $12, -8(%ebp)SHAPdddACourierA A @Tk subl $4, %espSHAPdddACourierA A @Tp movswl -8(%ebp),%eaxSHAPdddACourierA A @T~+ pushl %eax !wordify and push v3SHAPdddACourierA A @Tp movsbl -5(%ebp),%eaxSHAPdddACourierA A @T~+ pushl %eax !wordify and push v2SHAPdddACourierA A @T~+ pushl -4(%ebp) !push v1SHAPdddACourierA A @Ti call mycallSHAPdddACourierA A @Tl addl $16, %espSHAPdddACourierA A @T` leaveSHAPdddACourierA A @T^ retSHAPdddACourierA A @TSSHAPdddACourierA A @T:This is the wrapper function that is generated by syscall3SXAPdddA PA TimesNewRomanA A @TYSNAPdddA TimesNewRomanA A @T:Parameter passing is register based instead of stack basedSNAPdddA TimesNewRomanA A @TwEAX - System call # (here 240)SNAPdddA TimesNewRomanA A @TaEBX - p1SNAPdddA TimesNewRomanA A @TaECX - p2SNAPdddA TimesNewRomanA A @TaEDX - p3SNAPdddA TimesNewRomanA A @TYSNAPdddA TimesNewRomanA A @TwReturn code is in register EAXSNAPdddA TimesNewRomanA A @TJIf the return code is [-1, -125] , it is saved in errno and -1 is returnedS'APdddA @A8"A!8" TimesNewRomanA8 27A8 7JT<S1APdddA  A @TZmycall:SHAPdddACourierA A @Tg pushl %ebpSHAPdddACourierA A @Tm movl %esp, %ebpSHAPdddACourierA A @Tg pushl %ebxSHAPdddACourierA A @Tk subl $8, %espSHAPdddACourierA A @Tq movl 12(%ebp), %eaxSHAPdddACourierA A @Tq movl 16(%ebp), %edxSHAPdddACourierA A @Tp movb %al, -5(%ebp)SHAPdddACourierA A @Tp movw %dx, -8(%ebp)SHAPdddACourierA A @Tm movl $240, %eaxSHAPdddACourierA A @Tp movl 8(%ebp), %ebxSHAPdddACourierA A @Tp movsbl -5(%ebp),%ecxSHAPdddACourierA A @Tp movswl -8(%ebp),%edxSHAPdddACourierA A @TW#APPSHAPdddACourierA A @Td int $0x80SHAPdddACourierA A @TZ#NO_APPSHAPdddACourierA A @Tm movl %eax, %eaxSHAPdddACourierA A @Tr movl %eax, -12(%ebp)SHAPdddACourierA A @Ts cmpl $-126, -12(%ebp)SHAPdddACourierA A @Tf jbe .L6SHAPdddACourierA A @Tr movl -12(%ebp), %eaxSHAPdddACourierA A @Tg negl %eaxSHAPdddACourierA A @Tn movl %eax, errnoSHAPdddACourierA A @Tq movl $-1, -12(%ebp)SHAPdddACourierA A @Te .p2align 2SHAPdddACourierA A @TW.L6:SHAPdddACourierA A @Tr movl -12(%ebp), %eaxSHAPdddACourierA A @Tm movl %eax, %eaxSHAPdddACourierA A @Tq movl -4(%ebp), %ebxSHAPdddACourierA A @T` leaveSHAPdddACourierA A @T^ retSHAPdddACourierA A @TSSHAPdddACourierA A @TU SHAPdddACourierA A @T~The kernel side of the callSXAPdddA PA TimesNewRomanA A @TYSNAPdddA TimesNewRomanA A @TQThe table that binds system call # to kernel is in Linux/arch/i386/kernel/entry.SSNAPdddA TimesNewRomanA A @TYSNAPdddA TimesNewRomanA A @Ts 425 ENTRY(sys_call_table)S1APdddA A @A8CourierTX 426 .long SYMBOL_NAME(sys_ni_syscall) /* 0 - old "setup()" system call*/SHAPdddACourierA A @Tx% 427 .long SYMBOL_NAME(sys_exit)SHAPdddACourierA A @Tx% 428 .long SYMBOL_NAME(sys_fork)SHAPdddACourierA A @Tx% 429 .long SYMBOL_NAME(sys_read)SHAPdddACourierA A @Ty& 430 .long SYMBOL_NAME(sys_write)SHAPdddACourierA A @T2 431 .long SYMBOL_NAME(sys_open) /* 5 */SHAPdddACourierA A @Ty& 432 .long SYMBOL_NAME(sys_close)SHAPdddACourierA A @T{( 433 .long SYMBOL_NAME(sys_waitpid)SHAPdddACourierA A @Ty& 434 .long SYMBOL_NAME(sys_creat)SHAPdddACourierA A @Tx% 435 .long SYMBOL_NAME(sys_link)SHAPdddACourierA A @T3 436 .long SYMBOL_NAME(sys_unlink) /* 10 */SHAPdddACourierA A @Tz' 437 .long SYMBOL_NAME(sys_execve)SHAPdddACourierA A @Ty& 438 .long SYMBOL_NAME(sys_chdir)SHAPdddACourierA A @Tx% 439 .long SYMBOL_NAME(sys_time)SHAPdddACourierA A @TW :SHAPdddACourierA A @TW :SHAPdddACourierA A @TSSHAPdddACourierA A @ToThe 0x80 interrupt handler is set up at boot time to point system_call in module entry.S in directory arch/i386S'APdddA @A8oA8 ;FT2S'APdddA @Ti194 ENTRY(system_call)SHAPdddACourierA A @T3195 pushl %eax # save orig_eaxSHAPdddACourierA A @T_ 196 SAVE_ALLSHAPdddACourierA A @TYSNAPdddA TimesNewRomanA A @T9Save application registers and switch DS to kernel space.SNAPdddA TimesNewRomanA A @T#Note that eax is pushed a 2nd time SNAPdddA TimesNewRomanA A @A8  A8  "A8:eTYSNAPdddA TimesNewRomanA A @Th85 #define SAVE_ALL \SHAPdddACourierA A @T^ 86 cld; \SHAPdddACourierA A @Td87 pushl %es; \SHAPdddACourierA A @Td88 pushl %ds; \SHAPdddACourierA A @Te89 pushl %eax; \SHAPdddACourierA A @Te90 pushl %ebp; \SHAPdddACourierA A @Te91 pushl %edi; \SHAPdddACourierA A @Te92 pushl %esi; \SHAPdddACourierA A @Te93 pushl %edx; \SHAPdddACourierA A @Te94 pushl %ecx; \SHAPdddACourierA A @Te95 pushl %ebx; \SHAPdddACourierA A @Ts 96 movl $(__KERNEL_DS),%edx; \SHAPdddACourierA A @Th97 movl %edx,%ds; \SHAPdddACourierA A @Tf98 movl %edx,%es;SHAPdddACourierA A @TYSNAPdddA TimesNewRomanA A @T]SRAPdddA PACourierA A @TKAfter the SAVE_ALL the contents of the kernel stack is laid out as follows:S'APdddA @A8KA8  TSSHAPdddACourierA A @Tl 24 * 0(%esp) - %ebxSHAPdddACourierA A @Tl 25 * 4(%esp) - %ecxSHAPdddACourierA A @Tl 26 * 8(%esp) - %edxSHAPdddACourierA A @Tl 27 * C(%esp) - %esiSHAPdddACourierA A @Tl 28 * 10(%esp) - %ediSHAPdddACourierA A @Tl 29 * 14(%esp) - %ebpSHAPdddACourierA A @Tl 30 * 18(%esp) - %eaxSHAPdddACourierA A @Tk 31 * 1C(%esp) - %dsSHAPdddACourierA A @Tk 32 * 20(%esp) - %esSHAPdddACourierA A @Tp 33 * 24(%esp) - orig_eaxSHAPdddACourierA A @Tl 34 * 28(%esp) - %eipSHAPdddACourierA A @Tk 35 * 2C(%esp) - %csSHAPdddACourierA A @To 36 * 30(%esp) - %eflagsSHAPdddACourierA A @To 37 * 34(%esp) - %oldespSHAPdddACourierA A @Tn 38 * 38(%esp) - %oldssSHAPdddACourierA A @T]SRAPdddACourierA  A A @TMUsing the syscall # in AX as an index, call the kernel handler for this call.SXAPdddA TimesNewRomanA  A A @T7The EAX register is saved at offset 0x18 in the stack.S'APdddA @A8)A8 )A!8) TimesNewRomanA8  T2S'APdddA @Th197 GET_CURRENT(%ebx)SHAPdddACourierA A @T1198 testb $0x02,tsk_ptrace(%ebx) # PT_TRACESYSSHAPdddACourierA A @Tc199 jne tracesysSHAPdddACourierA A @To200 cmpl $(NR_syscalls),%eaxSHAPdddACourierA A @Ta201 jae badsysSHAPdddACourierA A @T.202 call *SYMBOL_NAME(sys_call_table)(,%eax,4)SHAPdddACourierA A @T;203 movl %eax,EAX(%esp) # save the return valueSHAPdddACourierA A @TSSHAPdddACourierA A @TOReturn to application that called. The iret is contained within the RESTORE_ALLS'APdddA @A8OA8 '+A8 +DA8 DOTSSHAPdddACourierA A @To204 ENTRY(ret_from_sys_call)SHAPdddACourierA A @T?205 cli # need_resched and signals SHAPdddACourierA A @Tq206 cmpl $0,need_resched(%ebx)SHAPdddACourierA A @Te207 jne rescheduleSHAPdddACourierA A @To208 cmpl $0,sigpending(%ebx)SHAPdddACourierA A @Th209 jne signal_returnSHAPdddACourierA A @Tc210 restore_all:SHAPdddACourierA A @Tb211 RESTORE_ALLSHAPdddACourierA A @TW212 SHAPdddACourierA A @TSSHAPdddACourierA A @TcSXAPdddA PA TimesNewRomanA A @TPThe addl instruction is used to skip over the spot where eax was pushed at entrySNAPdddA TimesNewRomanA A @A8  A   A8 9<A8 <PTGWhy push it at all... because it contains the system call number??? SNAPdddA TimesNewRomanA A @A8 FTSSHAPdddACourierA A @Tn100 #define RESTORE_ALL \SHAPdddACourierA A @Tj101 popl %ebx; \SHAPdddACourierA A @Tj102 popl %ecx; \SHAPdddACourierA A @Tj103 popl %edx; \SHAPdddACourierA A @Tj104 popl %esi; \SHAPdddACourierA A @Tj105 popl %edi; \SHAPdddACourierA A @Tj106 popl %ebp; \SHAPdddACourierA A @Tj107 popl %eax; \SHAPdddACourierA A @Tn108 1: popl %ds; \SHAPdddACourierA A @Tn109 2: popl %es; \SHAPdddACourierA A @Tm110 addl $4,%esp; \ SHAPdddACourierA A @Tn111 3: iret; \SHAPdddACourierA A @TSSHAPdddACourierA A @T?If a signal is pending against this process it is handled here.SNAPdddA TimesNewRomanA A @TYSNAPdddA TimesNewRomanA A @T` ALIGNSHAPdddACourierA A @Tasignal_return:SHAPdddACourierA A @TS sti # we can get here from an interrupt handlerSHAPdddACourierA A @Tx% testl $(VM_MASK),EFLAGS(%esp)SHAPdddACourierA A @Ti movl %esp,%eaxSHAPdddACourierA A @Tp jne v86_signal_returnSHAPdddACourierA A @Ti xorl %edx,%edxSHAPdddACourierA A @Tv# call SYMBOL_NAME(do_signal)SHAPdddACourierA A @Tj jmp restore_allSHAPdddACourierA A @TSSHAPdddACourierA A @JGeneric PrinterSGENPRT PostScriptH`Tl`Tld,,lprdefault_queueSGENPRT7 UV88/?/=U$2P  ˆU$y0?B$B$B*$ B6$ BB$ BN$ BZ$ E" Bf$ E" Br$ E"  B~ $  B $  B $ E"  B $ E"  B $ EB B$ E" B$ E" B$ E" B$ EB B$ EB B$ EB B$ EB B$ EB B$ B&$ E" B2$E"BJ$ E" BV$ E" Bb$ ,U6$'$ F @$ >/=U$2p  ŒU$y0?.B$ B $ B$ E" B$$ EB  B0$ EB !B<$ EB "BH$#B.$$B$%B$&B $ 'B $(B $)B $*B $+B$,Bj$-BP$.B6$/B$0B$1B$2B$3B$4B$5B$6Bf$E"7BL$E"8B2$9B$:B$;B$<B$ E" =B$ >@B $?AB!$@BB"$ACBz#$BDB`$$CEBF%$DFB,&$EGB'$FHB'$GIB($HJB)$IKB*$JL,U6$'$ F @$ 0}/=U$2P  U$y0?&B$ KMB $ LNB$ MOB$$NPB $OQB$PRB$QSB$RTB$SUB$TVBn $UWBT $VXB: $WYB $XZB $Y[B $Z\B$[]B$\^B$]_B$^`Bj$_aBP$`bB6$acB$bdB$ceB$ dfB$egB$fhB$giB$hjB$ikBr$jmB>$koB $lqB!$mrB"$nsB#$otB$$pu,U6$'$ F @$ Є%/=U$2p  7U$y0?)B$ qvB $rwB$sxB$tyB$uzB$v{B$w|Bp$x}BV$ y~Bb$zBH ${B. $|B $}B $~B $B $B$B$Bx$B^$BD$B*$B$B$B$B$B$B$Bt$BZ$B@$B&$B $B$B$B$B $B!$Bp"$BV#$B<$$,U6$'$ F @$ %/=U$2P  U$y0?,B$ B $ E" B$ E" B$$ E" B0$ E" B<$ E" BH$ E" BT$ E" B`$ E" Bl $ E" Bx $ E" B $Bj $BP $B6$B$B$B$B$B$B$B$Bf$BL$B2$B$B$B$B$B$B$B|$Bb$BH$B. $B!$B!$B"$B#$B$$B%$Bx&$B^'$BD($,U6$'$ F @$ %:/=U$2p  ¸U$y0?.B$ B $ B$ E" B$$ E" B0$B$B$B$B$B $Bz $B` $BF $B, $B$B$B$B$B$B$Bv$B\$BB$BZ$ Bf$BL$B2$B$ B$$ B0$ B<$ BH$B. $B!$B!$B"$B#$B$$B%$Bx&$B^'$BD($B*)$B*$B*$B+$ ,U6$'$ F @$ Ч%y/=U$2P  ZU$y0?*B$B$ B$B$B$B$B$Bp$BV$B<$B" $B $B $B $B $ B $ B$ Bl$ BR$ B8$ BD$ BP$  B\$ BB$ B($ B$ B$B$B$B$B$ B$B~$Bd$BJ$B0 $B!$B!$ B"$!B#$"B$$#B%$$,U6$'$ F @$ У%/=U$2p  VU$y0?B$ %B $ &B$  'B$$!(B $")B$#*B$$+B$%,B$&-B$'.Bn $(/BT $)0B: $*1B $+2B $,3B $-4B$.5B$ /6B$ 07B$18B$29B$3;Bh$4<BN$5=B4$6>B$7?B$8@B$9AB$:B,U6$'$ F @$ lZRoot Entry ®`VCompObj<Ole persist elements" SfxDocumentInfo uBasicManager2 4StarBASIC SfxWindowsCSwNumRulesUStandardjSfxStyleSheetsSummaryInformation( ,0SwPageStyleSheets$ 1StarWriterDocument&R