V|[~SD.BCKSD.BCK.BACK/LO *.TXT,SD.PAS,SD.OBJ*,SD.HLP SD.BCK/SAV JONATHAN (nn V6.2 _RUBENS::  _DSA10: V6.2 ~ x'*[SYSEXE.SOURCE.SD]FREEWARE_README.TXT;4+,я9. / 4O F-I0123KPWO56+v7R4v89BiGHJ;SD, UTILITIES, Another SD, rich-featured, powerful, robust.KSD is a powerful and flexible alternative to the DCL command "SET DEFAULT".It has the capability toC . quickly set default to the default login directory (SYS$LOGIN);O . quickly set default to any user's default login directory (privileged use);F . set default to logical directory names, wildcarded directory names) and complex directory specifications;L . store a history of "visited" directories in a "Last In First Out" (LIFO) directory stack;> . set default to any given directory in the directory stack;0 . display the contents of the directory stack;, . allow different styles of stack display;3 . manipulate the contents of the directory stack;0 . set the maximum size of the directory stack;& . re-initialize the directory stack;H . write the directory stack to a disk file for later re-loading of the stack;H . read a previously dumped directory stack from a disk file to re-load the stack;G . change the session prompt to reflect the current default directory;I . allow flexible specification of the format of the new session prompt;D . provide direct access to help information from the command line;The author of SD is Jonathan Ridler,$ Information Technology Services, The University of Melbourne,) Parkville, Victoria, AUSTRALIA, 3052." Email: jonathan@unimelb.edu.auESD is written entirely in DEC Pascal and has been built and tested onDOpenVMS VAX v5.5-2 and v6.2 (DEC Pascal v5.4) and OpenVMS Alpha v6.2(DEC Pascal v5.5).(*[SYSEXE.SOURCE.SD]FREEWARE_RELEASE.TXT;1+,o. / 4P -I0123KPWO56v7v89BiGHJFreeware Developer Release Form-------------------------------KAs the owner/developer of this software, I release it to be included on theMOpenVMS Freeware CD-ROM. I expect no remunerances or payments for the use of2this software from Digital or Digital's customers.Jonathan Ridler.P--------------------------------------------------------------------------------LJonathan Ridler (VMS Systems Manager) Information Technology Services,HTelephone: +61 3 9344 7994 The University of Melbourne,CFax: +61 3 9347 4803 Thomas Cherry Building,MEmail: jonathan@unimelb.edu.au Parkville, Vic., AUSTRALIA, 3052.P--------------------------------------------------------------------------------mu~SD.BCK5IYSEXE.SOURCE.SD]SD.PAS;61Pck*[SYSEXE.SOURCE.SD]SD.PAS;61+,5.c/ 4Pc\-I0123KPWO]56px7;px89BiGHJHI{************************************************************************ * *H* SD = Set Default. A program to set the default disk and directory *G* of a process. SD also optionally may update the session prompt of *E* an interactive session to reflect the current default directory. * * *H* SD is stack-based, storing as many past directories as one requires *B* in one of two styles for recall. Flexible options allow easy *&* configuration of the program. * * *;* See the DCL help file for details of command syntax. * * *B* The program must be installed with SYSNAM privilege to allow *1* supervisor mode logical name definitions. * * *I*.......................................................................*#* Author: Jonathan Ridler. *+* Information Technology Services, *'* The University of Melbourne. *+* E-mail: jonathan@unimelb.edu.au *I*.......................................................................** History: *'* 29-Nov-1994 JER Original version. *6* 05-Dec-1994 JER Allow Help subtopic specification. *-* 13-Feb-1995 JER Cope with parser errors. *;* 23-Feb-1995 JER Correct problem with Swap_With_Current. *8* 01-Mar-1995 JER Fix handling underscore in diskname. *7* 09-Aug-1995 JER Fix minor bug in Swap_With_Current. *9* 27-Sep-1995 JER Recognise and flag as unsupported the *$* use of a node access string. *1* 27-Nov-1995 JER Minor fix to character sets. *9* 18-Jan-1996 JER Handle empty directory as first entry *!* logical name search list. *-* 20-Feb-1996 JER Implement Quiet option. *9* 11-Mar-1996 JER Add shortcut operator ("`") for going ** up directory tree. *:* 13-Mar-1996 JER Fix unnecessary msgs from first parse. *;* 08-Jul-1996 JER Handle empty wildcarded directory specs ** more neatly. *;* 28-Aug-1996 JER Eliminate version numbers from dirspec. *I************************************************************************}![ INHERIT ('SYS$LIBRARY:STARLET',& 'SYS$LIBRARY:PASCAL$LIB_ROUTINES',& 'SYS$LIBRARY:PASCAL$LBR_ROUTINES',( 'SYS$LIBRARY:PASCAL$MTH_ROUTINES') ]#PROGRAM Set_Default (OUTPUT,Data) ;TYPED{ Define stack style types: Absolute == Fixed; Relative == Sliding }2Stack_Type = (Absolute,Fixed,Relative,Sliding) ;Prompt_Style = (Centre,Left) ;CONSTNull = ''(0) ;Default_Stack_Size = 20 ;5Max_Stack_Size = 200 ; { Set Max_Digs accordingly }.Max_Digs = 3 ; { Digits in Max_Stack_Size }Initial_Tos = -9999 ;Digits = ['0'..'9'] ;;Max_Prompt_Size = 32 ; { Limit in DCL (OpenVMS v6.2) }'Default_Prompt_Size = Max_Prompt_Size ;Default_Head = Null ;Default_Tail = ' ' ;<Empty_Stack_Msg = '%SD-I-EMPTY, Directory stack is empty.' ;TYPE$UBYTE = [BYTE] 0..255 ;$UWORD = [WORD] 0..65535 ;<Status_Block_Type = [UNSAFE] PACKED ARRAY [1..4] OF $UWORD ;Item_List_Cell = RECORD CASE INTEGER OF 1: ( { Normal Cell } Buffer_Length : $UWORD ; Item_Code : $UWORD ; Buffer_Addr : UNSIGNED ; Return_Addr : UNSIGNED ) ; 2: ( { Terminator } Terminator : UNSIGNED ) ; END ;IItem_List_Template (Count:INTEGER) = ARRAY [1..Count] OF Item_List_Cell ;VAR/Quiet , { Display new default directory ? }&Undo , { Undo expansion errors ? }%Expanding , { Expanding a spec ? }/Phantom_Dir , { Directory does not exist ? }+Phantom_File , { File does not exist ? }HUpdate_Prompt : BOOLEAN := FALSE ; { Make prompt reflect current dir ? };Stack_Fixed : BOOLEAN := TRUE ; { Stack style is FIXED ? })Poppy , { Stack slot number for Pop }.Poppy2 , { Stack slot number for Pop too! }'Table , { Symbol definition table }Tos , { Top-Of-Stack }Bos , { Bottom-Of-Stack }+Tos_Vs , { Top-Of-Stack Virtual slot },Bos_Vs , { Bottom-Of-Stack Virtual slot }Depth , { Stack depth }IMax_Prompt_Size_User : INTEGER := 0 ; { Maximum prompt size set by user }FStack_Size : INTEGER := Default_Stack_Size ; { Number of stack slots }GStack_Style : Stack_Type := Absolute ; { Stack slot numbering scheme }5Tos_Str , { Top-Of-Stack number as a string }5Bos_Str , { Bottom-Of-Stack number as a string }7Depth_Str , { Depth-Of-Stack number as a string },Str_Poppy , { Slot number as a string }JStr_Poppy2 : VARYING [4] OF CHAR := '' ; { Slot number as a string too! }DPrompt_Format : Prompt_Style ; { Where to squeeze prompt overflow }%Prompt_Head , { Start of prompt }<Prompt_Tail : VARYING [12] OF CHAR := '' ; { End of prompt }'Symbol , { Scratch symbol register }-Symbol2 , { Scratch symbol register too! }5Search_Result , { Filename returned from $SEARCH })Target_Dir , { NEW default directory }&Default_Dir , { Default directory }&Current_Dir , { Current directory }#Cmd , { Collapsed input line }ACommand : VARYING [255] OF CHAR := '' ; { Compressed input line }5Data : TEXT ; { File of directory specifications }%[ASYNCHRONOUS] FUNCTION SYS$SETDDIR ( New_Dir_Addr :A [CLASS_S] PACKED ARRAY [$L1..$U1:INTEGER] OF CHAR := %IMMED 0 ;2 VAR Length_Addr : [VOLATILE] $UWORD := %IMMED 0 ; %STDESCR Cur_Dir_Addr :7 PACKED ARRAY [$L3..$U3:INTEGER] OF CHAR := %IMMED 0 ) : UNSIGNED ; EXTERNAL ;PFUNCTION Str_Compress (Source : [CLASS_S] PACKED ARRAY [L..U:INTEGER] OF CHAR ;$ VAR Dest : VARYING [D] OF CHAR ;, Collapse : BOOLEAN := FALSE) : UNSIGNED ;L{ Compress a string by removing leading and trailing white space (blanks andL tabs), and replacing multiple consecutive white space with a single blank./ If collapse is set, remove ALL white space. }% CONST Blanks = [' ',''(9),''(0)] ; Maxsize = 1024 ;F Warn_Inpstrtru = UAND (LIB$_INPSTRTRU,%Xfffffff8) ; { Warning only }! VAR S , J , K : INTEGER := 0 ; Done : BOOLEAN := FALSE ;, Spacer : VARYING [1] OF CHAR := ' ' ;5 Dstr, Sstr : VARYING [Maxsize] OF CHAR := '' ; BEGIN { Str_Compress }. Str_Compress := SS$_NORMAL ; { Presume so } S := LENGTH (Source) ;% IF S = 0 THEN { Nothing passed } Dest := '' ELSE BEGIN IF S > Maxsize THEN BEGIN$ Sstr := SUBSTR (Source,1,Maxsize) ;& Str_Compress := INT(Warn_Inpstrtru) ; END ELSE Sstr := Source ;% IF Collapse THEN Spacer := '' ;D IF FIND_MEMBER (Source,Blanks) = 0 THEN { Nothing to change } Dstr := Sstr ELSE WHILE NOT Done DO BEGIN& J := FIND_NONMEMBER (Sstr,Blanks) ; IF J = 0 THEN Done := TRUE ELSE BEGIN/ Sstr := SUBSTR (Sstr,J,Sstr.LENGTH-J+1) ;& K := FIND_MEMBER (Sstr,Blanks) ; IF K = 0 THEN BEGIN Dstr := Dstr + Sstr ; Done := TRUE ; END ELSE BEGIN/ Dstr := Dstr + SUBSTR (Sstr,1,K-1) + Spacer ;+ Sstr := SUBSTR (Sstr,K,Sstr.LENGTH-K+1) ; END ; END ; END ; { of While } IF Dstr <> '' THEN! IF Dstr[Dstr.LENGTH] = ' ' THEN* Dstr:= SUBSTR (Dstr,1,Dstr.LENGTH-1) ; IF Dstr.LENGTH <= D THEN Dest := Dstr ELSE BEGIN Dest := SUBSTR (Dstr,1,D) ;! Str_Compress := LIB$_OUTSTRTRU ; END ; END ; END ; { of Str_Compress }PROCEDURE Get_Logical_Name (< Lognam : [CLASS_S] PACKED ARRAY [L1..U1:INTEGER] OF CHAR ;= Default : [CLASS_S] PACKED ARRAY [L2..U2:INTEGER] OF CHAR ;% VAR Actual : VARYING [Sz] OF CHAR ;< Table : [CLASS_S] PACKED ARRAY [L3..U3:INTEGER] OF CHAR := 'LNM$FILE_DEV' ; Mode : $UBYTE := PSL$C_USER ) ;K{ Get the translation of the logical name specified. If it does not exist, use the default value. } VAR Rst : UNSIGNED := 0 ;2 Item_List : Item_List_Template (2) := ZERO ;" BEGIN { Get_Logical_Name }4 Item_List[1].Buffer_Length := SIZE (Actual.BODY) ;- Item_List[1].Item_Code := LNM$_STRING ;8 Item_List[1].Buffer_Addr := IADDRESS (Actual.BODY) ;: Item_List[1].Return_Addr := IADDRESS (Actual.LENGTH) ;A Item_List[2].Terminator := 0 ; { Terminate the item list }1 Rst := $TRNLNM (Attr := %REF LNM$M_CASE_BLIND, Tabnam := Table, Lognam := Lognam, Acmode := %REF Mode, Itmlst := Item_List) ; IF Rst = SS$_NOLOGNAM THEN Actual := Default ELSE IF NOT ODD (Rst) THEN LIB$SIGNAL (Rst) ;% END ; { of Get_Logical_Name }PROCEDURE Set_Logical_Name (< Lognam : [CLASS_S] PACKED ARRAY [L1..U1:INTEGER] OF CHAR ;< Xlate : [CLASS_S] PACKED ARRAY [L2..U2:INTEGER] OF CHAR ;= Table : [CLASS_S] PACKED ARRAY [L3..U3:INTEGER] OF CHAR := 'LNM$FILE_DEV' ; Mode : $UBYTE := PSL$C_SUPER ) ;K{ Define the logical name specified. BEWARE! SYSNAM privilege is REQUIRED# for supervisor mode or greater. } VAR Rst : UNSIGNED := 0 ;2 Item_List : Item_List_Template (2) := ZERO ;" BEGIN { Set_Logical_Name }$ Item_List[1].Buffer_Length := U2 ;- Item_List[1].Item_Code := LNM$_STRING ;2 Item_List[1].Buffer_Addr := IADDRESS (Xlate) ;# Item_List[1].Return_Addr := 0 ;# Item_List[2].Terminator := 0 ;" Rst := $CRELNM (Tabnam := Table, Lognam := Lognam, Acmode := Mode, Itmlst := Item_List) ; IF NOT ODD (Rst) THEN LIB$SIGNAL (Rst) ;% END ; { of Set_Logical_Name }PROCEDURE Get_Command ;'{ Get the foreign command input line. } VAR Rst : UNSIGNED := 0 ; BEGIN { Get_Command }+ Rst := LIB$GET_FOREIGN (%DESCR Command) ; IF NOT ODD (Rst) THEN LIB$SIGNAL (Rst) ; { Compress it. }/ Rst := Str_Compress (Command,Command,FALSE) ; IF NOT ODD (Rst) THEN LIB$SIGNAL (Rst) ; { One is both the same. }; IF (Command.LENGTH > 0) AND_THEN (Command[1] = '/') THEN Command[1] := '\' ; { ... and collapse it. }* Rst := Str_Compress (Command,Cmd,TRUE) ; IF NOT ODD (Rst) THEN LIB$SIGNAL (Rst) ; END ; { of Get_Command }.PROCEDURE Exit (Msg : VARYING [Len] OF CHAR) ;#{ Just a dinky shorthand routine. } BEGIN { Exit } WRITELN (Msg) ; $EXIT ; END ; { of Exit }8PROCEDURE Change_Prompt (BODY : VARYING [Len] OF CHAR ;! Literal : BOOLEAN := FALSE) ;M{ Modify the session prompt. Using LIB$DO_COMMAND to do this means that thisM routine terminates the program. It must therefore be the last thing called, before the desired end of program logic. } VAR Rst : UNSIGNED := 0 ;& Max_Avail , Max_Div2 : INTEGER := 0 ;3 Prompt : VARYING [Max_Prompt_Size] OF CHAR := '' ; BEGIN { Change_Prompt } IF Prompt_Head = Null THEN Prompt_Head := '' ;O Max_Avail := Max_Prompt_Size_User - Prompt_Head.LENGTH - Prompt_Tail.LENGTH ;& Max_Div2 := (Max_Avail - 1) DIV 2 ; IF Literal THEN+ IF BODY.LENGTH > Max_Prompt_Size THENI Exit ('%SD-F-INTERROR, Bad prompt literal - notify Systems Programmer.') ELSE Prompt := BODY ELSE# IF BODY.LENGTH <= Max_Avail THEN/ Prompt := Prompt_Head + BODY + Prompt_Tail ELSE! IF Prompt_Format = Centre THEN= Prompt := Prompt_Head + SUBSTR (BODY,1,Max_Div2) + '*' +C SUBSTR (BODY,BODY.LENGTH-Max_Div2+1,Max_Div2) + Prompt_Tail ELSE IF Prompt_Format = Left THEN BEGIN Max_Avail := Max_Div2 * 2 ;" Prompt := Prompt_Head + '*' +G SUBSTR (BODY,BODY.LENGTH-Max_Avail+1,Max_Avail) + Prompt_Tail ; END ;N Rst := LIB$DO_COMMAND ('$ SET PROMPT = "' + Prompt + '"') ; { Black Hole!! } IF NOT ODD (Rst) THEN LIB$SIGNAL (Rst) ; END ; { of Change_Prompt }:PROCEDURE Set_New_Default (Dir : VARYING [Len] OF CHAR ;! Notify : BOOLEAN := TRUE) ;3{ Set new default directory and new default disk. } VAR Rst : UNSIGNED := 0 ; Colon : INTEGER := 0 ;( Def_Dev : VARYING [32] OF CHAR := '' ;( Def_Dir : VARYING [255] OF CHAR := '' ; BEGIN { Set_New_Default } Colon := INDEX (Dir,':') ; IF Colon = 0 THEN? Exit ('%SD-F-BADDIR, Directory specification is corrupt.') ELSE BEGIN? IF Dir [Colon+1] = ":" THEN { Double colon -> node name }C Exit ('%SD-F-NONODE, Node name specification is not supported.') ;& Def_Dev := SUBSTR (Dir,1,Colon) ;7 Def_Dir := SUBSTR (Dir,Colon+1,Dir.LENGTH-Colon) ; END ;? Rst := SYS$SETDDIR (SUBSTR (Def_Dir.BODY,1,Def_Dir.LENGTH)) ; IF NOT ODD (Rst) THEN LIB$SIGNAL (Rst) ;) Set_Logical_Name ('SYS$DISK',Def_Dev) ; IF Notify THEN BEGIN4 IF NOT Quiet THEN WRITELN (Def_Dev,Def_Dir) ; IF Phantom_Dir THEN5 WRITELN ('%SD-W-NODIR, Directory does not exist.') ; END ; END ; { of Set_New_Default }APROCEDURE Parse_Filename (File_Spec : VARYING [Len1] OF CHAR ;7 Default_Spec : VARYING [Len2] OF CHAR := '[]*.*' ;' First_Parse : BOOLEAN := FALSE) ;1{ Perform basic RMS file specification parsing. } VAR Rst : UNSIGNED := 0 ;: Saved_Length , { Length of useful saved $PARSE result }= Zap : INTEGER := 0 ; { Offset for underscore in diskname }/ Fab : FAB$TYPE := ZERO ; { File Access Block }- Nam : NAM$TYPE := ZERO ; { File Name Block }. Wild_Dir , { Wildcard in directory spec ? }; Use_Saved : BOOLEAN := FALSE ; { Ignore $SEARCH result ? } Parse_Result ,- Saved_Result : VARYING [255] OF CHAR := '' ; BEGIN { Parse_Filename }2 Fab.FAB$B_BID := FAB$C_BID ; { FAB Block ID }6 Fab.FAB$B_BLN := FAB$C_BLN ; { FAB Block Length }E Fab.FAB$L_FNA := IADDRESS (File_Spec.BODY) ; { Primary File Spec }3 Fab.FAB$B_FNS := Len1 ; { 1ry File Spec Size }G Fab.FAB$L_DNA := IADDRESS (Default_Spec.BODY) ; { Default File Spec }3 Fab.FAB$B_DNS := Len2 ; { Def File Spec Size }; Fab.FAB$L_NAM := IADDRESS (Nam) ; { NAM Block Address }2 Nam.NAM$B_BID := NAM$C_BID ; { NAM Block ID }6 Nam.NAM$B_BLN := NAM$C_BLN ; { NAM Block Length }J Nam.NAM$L_ESA := IADDRESS (Parse_Result.BODY) ; { Expanded String Area }G Nam.NAM$B_ESS := SIZE (Parse_Result.BODY) ; { Max Expand Strng Syz }K Nam.NAM$L_RSA := IADDRESS (Search_Result.BODY) ; { Resultant Strng Area }H Nam.NAM$B_RSS := SIZE (Search_Result.BODY) ; { Max Result Strng Syz } Rst := $PARSE (Fab) ;( IF ODD (Rst) OR (Rst = RMS$_DNF) THEN BEGIN+ Parse_Result.LENGTH := Nam.NAM$B_ESL ;# Saved_Result := Parse_Result ;4 Saved_Length := Nam.NAM$B_DEV + Nam.NAM$B_DIR ;% Wild_Dir := Nam.NAM$V_WILD_DIR ; IF Rst = RMS$_DNF THEN Search_Result := Parse_Result ELSE BEGIN Rst := $SEARCH (Fab) ;8 IF ODD (Rst) OR (Rst = RMS$_FNF) OR (Rst = RMS$_DNF) OR (Rst = RMS$_PRV) THEN BEGINI { With logical name search-lists which have an empty target directoryE in the first directory in the list, the parse succeeds, but theH search fails with RMS$_DNF. In this case, use the original resultF from the $PARSE because the $SEARCH will change the Parse_Result again. } IF Rst = RMS$_DNF THEN BEGIN Use_Saved := TRUE ;& Search_Result := Saved_Result ;= Rst := RMS$_NORMAL ; { Prevent flagging no directory } END ELSE* IF (Rst = RMS$_FNF) AND Wild_Dir THEN Exit (I '%SD-F-EMPTYWILDDIR, Cannot determine name of empty wildcard directory.' ) ELSE. Search_Result.LENGTH := Nam.NAM$B_RSL ;# IF Search_Result[1] = '_' THEN BEGINI Search_Result := SUBSTR (Search_Result,2,Search_Result.LENGTH-1) ; Zap := 1 ; END ; END ELSE BEGIN( IF Undo AND (Current_Dir <> '') THEN, Set_New_Default (Current_Dir,FALSE) ; LIB$SIGNAL (Rst) ; END ; END ;" Target_Dir := Search_Result ; IF Use_Saved THEN( Target_Dir.LENGTH := Saved_Length - Zap ELSE; Target_Dir.LENGTH := Nam.NAM$B_DEV + Nam.NAM$B_DIR - Zap ;; Phantom_Dir := (Rst = RMS$_DNF) AND NOT First_Parse ;6 Phantom_File := (Rst = RMS$_FNF) OR Phantom_Dir ;2 IF (Rst = RMS$_PRV) AND NOT First_Parse THENE WRITELN ('%SD-E-NOPRIV, Insufficient privilege or file protection ', 'violation on directory.') ; END ELSE* BEGIN Phantom_Dir := FALSE ;*P IF Undo AND (Current_Dir <> '') THEN Set_New_Default (Current_Dir,FALSE) ; IF Rst = RMS$_DNR THEN $EXIT (Rst) ELSE LIB$SIGNAL (Rst) ;s END ; END ; { of Parse_Filename } PROCEDURE Zip (Rst : UNSIGNED) ;){ Another very dinky shorthand routine. }t BEGIN { Zip } IF NOT ODD (Rst) THEN LIB$SIGNAL (Rst) ;e END ; { of Zip }l7PROCEDURE Get_Symbol (Cymbal : VARYING [Len] OF CHAR) ;*+{ Get the symbol definition if it exists. }t VAR Rst : UNSIGNED := 0 ;  BEGIN { Get_Symbol }m7 Rst := LIB$GET_SYMBOL (Cymbal,%DESCR Symbol,,Table) ;p IF NOT ODD (Rst) THEN " IF Rst = LIB$_NOSUCHSYM THEN7 Exit ('%SD-F-BADSTACK, Directory stack is corrupted.'). ELSE LIB$SIGNAL (Rst) ;h END ; { of Get_Symbol };PROCEDURE Set_Symbol (Cymbal_Nam : VARYING [Len1] OF CHAR ;b. Cymbal_Val : VARYING [Len2] OF CHAR) ;{ Define the symbol globally. }. VAR Rst : UNSIGNED := 0 ;. BEGIN { Set_Symbol }oF Rst := LIB$SET_SYMBOL (Cymbal_Nam,Cymbal_Val,LIB$K_CLI_GLOBAL_SYM) ; IF NOT ODD (Rst) THEN LIB$SIGNAL (Rst) ;9 END ; { of Set_Symbol }8PROCEDURE Get_Number (Source : VARYING [Len1] OF CHAR ; VAR Num : INTEGER ; + Msg : VARYING [Len2] OF CHAR) ;1*{ From a string variable, read a number. } BEGIN { Get_Number }s& READV (Source,Num,Error:=CONTINUE) ; IF STATUSV <> 0 THENg Exit (Msg) ;  END ; { of Get_Number }'FUNCTION Rs (Vsn : INTEGER) : INTEGER ;cP{ The left hemisphere of the brain of the stack - return the real slot number of? a given virtual slot number. Take stack style into account. }" BEGIN { Rs }  IF Stack_Fixed THEN' Rs := (Vsn - 1) REM Stack_Size + 1s ELSEs( Rs := Vsn + Bos - 1 - (Stack_Size *? ((Vsn > (Stack_Size - Bos + 1)) AND (Depth > 0))::INTEGER)1 END ; { of Rs }'FUNCTION Vs (Rsn : INTEGER) : INTEGER ;*J{ The right hemisphere of the brain %of the stack - return the virtual slotG number of a given real slot number. Take stack style into account. }B BEGIN { Vs }T IF Stack_Fixed THENO Vs := Rsn + (Depth - ((Rsn >= Bos) AND (Tos < Bos))::INTEGER) * Stack_Sizei ELSEsP Vs := Rsn - Bos + 1 + (Stack_Size * ((Rsn < Bos) AND (Depth > 0))::INTEGER) END ; { of Vs }2PROCEDURE Zero_Stack (Notify : BOOLEAN := FALSE) ;{ Reset the stack completely. }2 VAR Rst : UNSIGNED := 0 ;{ I : INTEGER := 0 ;n$ Str_I : VARYING [4] OF CHAR := '' ; BEGIN { Zero_Stack }o FOR I := 1 TO Stack_Size DO BEGIN_* Str_I := DEC (I,Max_Digs,Max_Digs) ;D Rst := LIB$DELETE_SYMBOL ('SD__'+Str_I,LIB$K_CLI_GLOBAL_SYM) ; IF NOT ODD (Rst) THEN'4 IF Rst <> LIB$_NOSUCHSYM THEN LIB$SIGNAL (Rst) ; END ;;; Zip (LIB$DELETE_SYMBOL ('SD__TS',LIB$K_CLI_GLOBAL_SYM)) ;5; Zip (LIB$DELETE_SYMBOL ('SD__BS',LIB$K_CLI_GLOBAL_SYM)) ;O; Zip (LIB$DELETE_SYMBOL ('SD__SD',LIB$K_CLI_GLOBAL_SYM)) ; ; Zip (LIB$DELETE_SYMBOL ('SD__SZ',LIB$K_CLI_GLOBAL_SYM)) ;tC IF Notify THEN Exit ('%SD-S-ZEROED, Directory stack zeroed.') ;  END ; { of Zero_Stack }PROCEDURE Get_Prompt_Specs ;F{ Get the user's specifications for the prompt changes. If we are not' interactive, ignore update request. }! VAR Rst , Mode : INTEGER := 0 ;e# Iosb : Status_Block_Type := ZERO ;d- Item_List : Item_List_Template (2) := ZERO ;i BEGIN { Get_Prompt_Specs }{# Item_List[1].Buffer_Length := 4 ;o' Item_List[1].Item_Code := JPI$_MODE ;p/ Item_List[1].Buffer_Addr := IADDRESS (Mode) ;f! Item_List[1].Return_Addr := 0 ; < Item_List[2].Terminator := 0 ; { Terminate the item list }' Rst := $GETJPIW (Itmlst := Item_List,  Iosb := Iosb) ; IF NOT ODD (Rst) THEN LIB$SIGNAL (Rst) ELSE  IF NOT ODD (Iosb[1]) THEN  LIB$SIGNAL (Iosb[1])s ELSEo" IF Mode = JPI$K_INTERACTIVE THEN BEGIN { Header to the prompt? }3 Get_Logical_Name (Lognam := 'SD_PROMPT_HEAD',:! Default := Default_Head,u" Actual := Prompt_Head) ;# IF Prompt_Head.LENGTH > 8 THENo> Exit ('%SD-F-BADHEAD, Prompt head definition is too long.') ; { Trailer to the prompt? }{3 Get_Logical_Name (Lognam := 'SD_PROMPT_TAIL',{! Default := Default_Tail, " Actual := Prompt_Tail) ;# IF Prompt_Tail.LENGTH > 6 THEN ? Exit ('%SD-F-BADTRAIL, Prompt tail definition is too long.') ;:M { The prompt can be squeezed in the centre or at the left - which one? }r5 Get_Logical_Name (Lognam := 'SD_PROMPT_FORMAT',r Default := 'LEFT',  Actual := Symbol) ;E3 READV (Symbol,Prompt_Format,Error:=CONTINUE) ;  IF STATUSV <> 0 THEN? Exit ('%SD-F-BADFORM, Prompt format definition is invalid.') ;o% IF (Prompt_Format <> Centre) ANDl (Prompt_Format <> Left) THEN{? Exit ('%SD-F-INVFORM, Prompt format definition is invalid.') ; + { Determine the maximum prompt size. }Y7 Get_Logical_Name (Lognam := 'SD_MAX_PROMPT_SIZE',a. Default := DEC (Default_Prompt_Size), Actual := Symbol) ; - Get_Number (Symbol,Max_Prompt_Size_User,K7 '%SD-F-BADPSIZE, Maximum prompt size is invalid.') ;L% IF (Max_Prompt_Size_User < 2) ORD/ (Max_Prompt_Size_User > Max_Prompt_Size) THENL; Exit ('%SD-F-INVPSIZE, Maximum prompt size is invalid.') ;A END ELSE { Don't do it }r BEGINK WRITELN ('%SD-W-NOTINTER, Not interactive - update prompt ignored.') ;; Update_Prompt := FALSE ;E END ; END ; { of Get_Prompt_Specs }PROCEDURE Initialize_Stack ;O{ Find and validate all logical name definitions and set appropriate variables;l4 check the stack state, possibly initializing it. }+ VAR Rst , Stack_Size_Sym : INTEGER := 0 ; BEGIN { Initialize_Stack }t/ { Size of stack, i.e. number of real slots. }n/ Get_Logical_Name (Lognam := 'SD_STACK_SIZE',D* Default := DEC (Default_Stack_Size), Actual := Symbol) ; Get_Number (Symbol,Stack_Size,; '%SD-F-BADSIZE, Directory stack size is invalid.') ;e; IF (Stack_Size < 2) OR (Stack_Size > Max_Stack_Size) THEN? Exit ('%SD-F-INVSIZE, Directory stack size is invalid.') ;S: { Ensure consistency of stack size across invocations. }P Rst := LIB$GET_SYMBOL ('SD__SZ',%DESCR Symbol,,Table) ; { Size last time } IF NOT ODD (Rst) THEN; IF Rst = LIB$_NOSUCHSYM THEN { Zeroed stack }S9 Set_Symbol ('SD__SZ',DEC (Stack_Size,Max_Digs,Max_Digs))t ELSE LIB$S.IGNAL (Rst)  ELSEG BEGIN' Get_Number (Symbol,Stack_Size_Sym, > '%SD-F-BADSYMSIZ, Directory stack pointer is corrupted.') ;* IF Stack_Size_Sym <> Stack_Size THEN BEGIN- { Warning required - ignore invalid value. }I WRITELN ('%SD-E-NODYNSIZE, Dynamic re-sizing of stack not supported.') ; E WRITELN ('%SD-I-STACKSIZE, Current stack size is ',Stack_Size_Sym:1,S ' slots.') ;E END ; END ; { Determine stack style. }0 Get_Logical_Name (Lognam := 'SD_STACK_STYLE', Default := 'ABSOLUTE', Actual := Symbol) ;. READV (Symbol,Stack_Style,Error:=CONTINUE) ; IF STATUSV <> 0 THENNA Exit ('%SD-F-BADSTYLE, Directory stack style is invalid.') ;D Stack_Fixed := (Stack_Style = Absolute) OR (Stack_Style = Fixed) ;O { Determine if we must undo changes to default disk and directory if an errorl3 occurs during expansion of the specification. }2 Get_Logical_Name (Lognam := 'SD_UNDO_IF_ERROR', Default := 'TRUE', Actual := Symbol) ;' READV (Symbol,Undo,Error:=CONTINUE) ;U IF STATUSV <> 0 THEN G Exit ('%SD-F-BADLNM, Logical name is invalid: SD_UNDO_IF_ERROR') ; , { Change and keep the prompt up-to-date? }2 Get_Logical_Name (Lognam := 'SD_UPDATE_PROMPT', Default := 'FALSE',o Actual := Symbol) ;0 READV (Symbol,Update_Prompt,Error:=CONTINUE) ; IF STATUSV <> 0 THENSG Exit ('%SD-F-BADLNM, Logical name is invalid: SD_UPDATE_PROMPT') ;m IF Update_Prompt THEN Get_Prompt_Specs ;N { Determine if new directory names are to be displayed - the Quiet option? }* Get_Logical_Name (Lognam := 'SD_QUIET', Default := 'FALSE',m Actual := Symbol) ;( READV (Symbol,Quiet,Error:=CONTINUE) ; IF STATUSV <> 0 THEN? Exit ('%SD-F-BADLNM, Logical name is invalid: SD_QUIET') ; J { Check the state of the stack - start with Top-Of-Stack. If TOS is not8 defined, assume the stack needs to be initialized. }9 Rst := LIB$GET_SYMBOL ('SD__TS',%DESCR Symbol,,Table) ;U IF NOT ODD (Rst) THEN" IF Rst = LIB$_NOSUCHSYM THEN Symbol := DEC (Initial_Tos) ELSE LIB$SIGNAL (Rst)T ELSEC( IF Table <> LIB$K_CLI_GLOBAL_SYM THENE Exit ('%SD-F-BADTABLE, Directory stack symbol is not global.') ;m Get_Number (Symbol,Tos,s? '%SD-F-BADTOS, Directory stack pointer is corrupted.') ;  IF Tos = Initial_Tos THENo BEGIN Tos := 0 ;B Tos_Str := '0' ;  END ELSEo* IF (Tos < 1) OR (Tos > Stack_Size) THEN? Exit ('%SD-F-INVTOS, Directory stack pointer is invalid.')  ELSE BEGIN- Tos_Str := DEC (Tos,Max_Digs,Max_Digs) ;n( Get_Symbol ('SD__BS') ; { Bottom } Get_Number (Symbol,Bos,; '%SD-F-BADBOS, Directory stack pointer is corrupted.') ; - Bos_Str := DEC (Bos,Max_Digs,Max_Digs) ;' Get_Symbol ('SD__SD') ; { Depth }g Get_Number (Symbol,Depth,= '%SD-F-BADDEPTH, Directory stack pointer is corrupted.') ;L1 Depth_Str := DEC (Depth,Max_Digs,Max_Digs) ;s END ; END ; { of Initialize_Stack }PROCEDURE Push ;I{ Push the stack *pointers* to reflect a directory push onto the stack. }S BEGIN { Push }  IF Tos = 0 THEN BEGIN Tos := 1 ;> Bos := 1 ;m END ELSE BEGIN Tos := Tos + 1 ;. IF Tos > Stack_Size THEN BEGIN Tos := 1 ;d Depth := Depth + 1 ;O END ; IF Tos = Bos THENR BEGIN Bos := Bos + 1 ;o& IF Bos > Stack_Size THEN Bos := 1 ; END ; END ;* Tos_Str := DEC (Tos,Max_Digs,Max_Digs) ;* Bos_Str := DEC (Bos,Max_Digs,Max_Digs) ;. Depth_Str := DEC (Depth,Max_Digs,Max_Digs) ; END ; { of Push }PROCEDURE Pop ;G{ Pop the stack *pointers* to reflect a directory pop from the stack. }I BEGIN { Pop }5 IF Tos = Bos THEN { Last in stack - re-initialize }  Zero_Stacke ELSEa BEGIN Tos := Tos - 1 ;r' IF (Tos = 0) AND (Depth > 0) THEN  BEGIN Tos := Stack_Size ; Depth := Depth - 1 ;0 END ;- Tos_Str := DEC (Tos,Max_Digs,Max_Digs) ;- Bos_Str := DEC (Bos,Max_Digs,Max_Digs) ;d1 Depth_Str := DEC (Depth,Max_Digs,Max_Digs) ;i END ; END ; { of Pop }t4PROCEDURE Push_Stack (Dir : VARYING [Len] OF CHAR) ;H{ Push the stack *symbols* to reflect a directory push onto the stack. } BEGIN { Push_Stack }E Push ;# Set_Symbol ('SD__'+Tos_Str,Dir) ;a! Set_Symbol ('SD__TS',Tos_Str) ;D! Set_Symbol ('SD__BS',Bos_Str) ;a# Set_Symbol ('SD__SD',Depth_Str) ;_ END ; { of Push_Stack }:FUNCTION Getuai 7(User : VARYING [Len] OF CHAR) : BOOLEAN ;F{ Get the required information for the particular user from the UAF. } VAR Rst : INTEGER := 0 ;2 Def_Dev , Def_Dir : VARYING [255] OF CHAR := '' ;- Item_List : Item_List_Template (3) := ZERO ;; BEGIN { Getuai }_0 Item_List[1].Buffer_Length := SIZE (Def_Dir) ;- Item_List[1].Item_Code := UAI$_DEFDIR ;;9 Item_List[1].Buffer_Addr := IADDRESS (Def_Dir.BODY) ;'# Item_List[1].Return_Addr := 0 ;(0 Item_List[2].Buffer_Length := SIZE (Def_Dev) ;- Item_List[2].Item_Code := UAI$_DEFDEV ; 9 Item_List[2].Buffer_Addr := IADDRESS (Def_Dev.BODY) ; # Item_List[2].Return_Addr := 0 ;r? Item_List[3].Terminator := 0 ; { Terminate the item list }:A Rst := $GETUAI (Usrnam := %STDESCR SUBSTR (User,1,User.LENGTH),: Itmlst := Item_List) ; Getuai := ODD (Rst) ;f IF NOT ODD (Rst) THEN BEGIN IF Rst = RMS$_RNF THEN 4 Exit ('%SD-F-NOSUCHUSER, Username does not exist.') ELSE LIB$SIGNAL (Rst) ;i END ELSET BEGIN. Def_Dir.LENGTH := INT (Def_Dir.BODY[1]) ;. Def_Dev.LENGTH := INT (Def_Dev.BODY[1]) ;= Def_Dir.BODY := SUBSTR (Def_Dir.BODY,2,Def_Dir.LENGTH) ;i= Def_Dev.BODY := SUBSTR (Def_Dev.BODY,2,Def_Dev.LENGTH) ;D& Target_Dir := Def_Dev + Def_Dir ; END ; END ; { of Getuai }PROCEDURE Get_User_Dir ;M{ Determine the default disk and directory of the target user from the UAF. } 6 CONST Alpha_Plus = ['a'..'z','A'..'Z','_','-','$'] ; VAR Stop : INTEGER := 0 ;W User ,i9 Stub : VARYING [255] OF CHAR := '' ; { Save any extras }_ BEGIN { Get_User_Dir } ' Stub := SUBSTR (Cmd,2,Cmd.LENGTH-1) ;e3 Stop := FIND_NONMEMBER (Stub,Alpha_Plus+Digits) ;  IF Stop = 0 THEN  User := StubO ELSEF BEGIN% User := SUBSTR (Stub,1,Stop-1) ;p4 Stub := SUBSTR (Stub,Stop,Stub.LENGTH-Stop+1) ; END ; Getuai (User) ;d Command := Target_Dir + Stub ; Cmd := Command ; END ; { of Get_User_Dir }&PROCEDURE Parse_Spec_And_Set_Default ;9{ Parse the input specification and set default as we go. ; Handle all shortcut characters except tilde ("~") here. }  VAR / Braced , Brace_It , Done : BOOLEAN := FALSE ;d Target : INTEGER := 0 ;C= Spec , Stem , Root , Result : VARYING [255] OF CHAR := '' ;=' BEGIN { Parse_Spec_And_Set_Default }$ Root := Cmd ;N Result := Current_Dir ; Expanding := TRUE ;RF { Replace all "`" characters with "-". This allows us to go back upB levels in the subdirectory tree without the need for braces. } REPEAT Target := INDEX (Root,'`') ;/ IF Target <> 0 THEN Root[Target] := '-' ;A UNTIL Target = 0 ; WHILE NOT Done DO BEGIN Target := INDEX (Root,',') ; IF Target = 0 THEN$ BEGIN Stem := Root ;e Done := TRUE ; END ELSEl BEGIN) Stem := SUBSTR (Root,1,Target-1) ;Z: Root := SUBSTR (Root,Target+1,Root.LENGTH-Target) ; END ;* IF Target = 1 THEN { Comma ONLY }) Set_New_Default (Default_Dir,Done)e ELSE; BEGIN2 Target := INDEX (Stem,':') ; { Device ? } IF Target <> 0 THENN BEGIN# Spec := SUBSTR (Stem,1,Target) ;A6 Stem := SUBSTR (Stem,Target+1,Stem.LENGTH-Target) ; END ;: Target := INDEX (Stem,';') ; { Version number ? } IF Target <> 0 THEN 8 Stem := SUBSTR (Stem,1,Target-1) ; { Get rid of it } IF Stem <> '' THEN BEGIN. Braced := INDEX (Stem,'[') <> 0 ; { [] ? } ʹ~SD.BCK5IYSEXE.SOURCE.SD]SD.PAS;61Pc&>> Brace_It := (NOT Braced) AND ((Stem[1] = '.') ORc (Stem[1] = '-') ORv% (Stem[1] = '^')) ; { MFD? }t* IF Brace_It THEN Spec := Spec + '[' ;6 IF (Stem.LENGTH > 0) AND_THEN (Stem[1] = '^') THEN= Spec := Spec + '000000' + SUBSTR (Stem,2,Stem.LENGTH-1)s ELSE Spec := Spec + Stem ;u IF Brace_It THEN Spec := Spec + ']*.*' ELSE IF Braced THEN Spec := Spec + '*.*' ; END ELSEu Spec := Spec + '*.*' ;R% Parse_Filename (Spec,Result) ; Result := Target_Dir ;F Spec := '' ; & Set_New_Default (Result,Done) ; END ; END ;r Expanding := FALSE ;* END ; { of Parse_Spec_And_Set_Default }!PROCEDURE Show_Stack_Attributes ;;'{ Display directory stack attributes. }  VAR I : INTEGER := 0 ;" BEGIN { Show_Stack_Attributes }. WRITELN ('SD Directory stack attributes:') ; WRITELN ;* WRITELN ('Stack size: ',Stack_Size:1) ;. WRITELN ('Stack limit: ',Max_Stack_Size:1) ; WRITEV (Symbol,Stack_Style) ;(% Str_Compress (Symbol,Symbol,TRUE) ;_$ WRITELN ('Stack style: ',Symbol) ; WRITE ('Stack usage: ') ;H IF Tos = 0 THEN { Empty }L WRITELN ('None.') ELSE$ BEGIN# I := Vs (Tos) - Vs (Bos) + 1 ;  WRITE (I:1,' slot') ; IF I = 1 THEN BEGIN WRITELN ('.') ;& WRITELN ('Slot in use: ',Vs(Tos):1) ; END ELSE BEGIN WRITELN ('s.') ;N7 WRITELN ('Slot range: ',Vs(Bos):1,' to ',Vs(Tos):1) ;n END ; END ; WRITELN ;  WRITEV (Symbol,Undo) ;% Str_Compress (Symbol,Symbol,TRUE) ;& WRITELN ('Undo errors: ',Symbol) ;! WRITEV (Symbol,Update_Prompt) ;S% Str_Compress (Symbol,Symbol,TRUE) ;X& WRITELN ('Update Prompt: ',Symbol) ; IF Update_Prompt THEN BEGIN$ WRITEV (Symbol,Prompt_Format) ;( Str_Compress (Symbol,Symbol,TRUE) ;) WRITELN ('Prompt format: ',Symbol) ;O WRITE ('Prompt head: ') ;( IF Prompt_Head = Default_Head THEN WRITELN ('Default.')V ELSE WRITELN ('User specified.') ; WRITE ('Prompt tail: ') ;( IF Prompt_Tail = Default_Tail THEN WRITELN ('Default.')L ELSE WRITELN ('User specified.') ;; WRITELN ('Max Prompt size: ',Max_Prompt_Size_User:1) ;H END ; $EXIT ;A% END ; { of Show_Stack_Attributes } PROCEDURE Stack_Typer ;h:{ Allow directory stack style to be verified or changed. } BEGIN { Stack_Typer } IF Cmd.LENGTH = 2 THENV BEGIN" WRITEV (Symbol,Stack_Style) ;( Str_Compress (Symbol,Symbol,TRUE) ;? Exit ('%SD-I-STYLE, Directory stack style is ' + Symbol) ;a END ELSEC BEGIN1 READV (Cmd[3],Stack_Style,Error:=CONTINUE) ;t IF STATUSV <> 0 THEN= Exit ('%SD-F-BADSTYLE, Directory stack style is invalid.') ;R" WRITEV (Symbol,Stack_Style) ;( Str_Compress (Symbol,Symbol,TRUE) ;1 Set_Logical_Name ('SD_STACK_STYLE',Symbol) ; ? Exit ('%SD-S-STYLE, Directory stack style is ' + Symbol) ; END ; END ; { of Stack_Typer } PROCEDURE Stack_Undoer ;6{ Allow undo error option to be verified or changed. } BEGIN { Stack_Undoer }h IF Cmd.LENGTH > 2 THENl BEGIN* READV (Cmd[3],Undo,Error:=CONTINUE) ; IF STATUSV <> 0 THEN@ Exit ('%SD-F-BADUNDO, Undo value must be "True" or "False".') ; WRITEV (Symbol,Undo) ; ( Str_Compress (Symbol,Symbol,TRUE) ;3 Set_Logical_Name ('SD_UNDO_IF_ERROR',Symbol) ;T END ; IF Undo THENB Exit ('%SD-I-UNDO, Errors during expansion will be undone.' ) ELSEiJ Exit ('%SD-I-NOUNDO, Errors during expansion will not be undone.' ) ; END ; { of Stack_Undoer }PROCEDURE List_Stack ;M{ Display the contents of the stack (if any) and the current default disk and) directory. }# VAR I , Sig_Digs : INTEGER := 0 ;s$ Str_I : VARYING [4] OF CHAR := '' ; BEGIN { List_Stack }N IF Tos = 0 THEN { Empty } BEGIN WRITELN (Current_Dir) ; Exit (Empty_Stack_Msg) ;2 END ELSEI BEGIN2 Sig_Digs := TRUNC (MTH$ALOG10(Vs(Tos))) + 1 ;6 WRITELN (PAD('','-',Sig_Digs),'> ',Current_Dir) ; END ;' FOR I := Vs (Tos) DOWNTO Vs (Bos) DOi BEGIN;. Str_I := DEC (Rs(I),Max_Digs,Max_Digs) ;! Get_Symbol ('SD__'+Str_I) ;T( WRITELN (I:Sig_Digs,': ',Symbol) ; END ;$ $EXIT ;) END ; { of List_Stack }PROCEDURE Read_File ;LP{ Load the stack with the contents of a disk file - one default spec per line. } VAR Count : INTEGER := 0 ; BEGIN { Read_File } IF Cmd.LENGTH = 2 THENY Symbol := 'SD_INPUT_FILE' ELSE, Symbol := SUBSTR (Cmd,3,Cmd.LENGTH-2) ; Parse_Filename (Symbol) ;N IF Phantom_File THEN6 Exit ('%SD-F-FILNOTFOU, Input file not found.') ;G OPEN (Data,FILE_NAME:=Search_Result,HISTORY:=Old,SHARING:=READONLY) ;a RESET (Data) ;E WRITELN ('%SD-I-READING, Reading stack data from ',Search_Result) ;d WHILE NOT EOF (Data) DOl BEGINZ READLN (Data,Symbol) ; Push_Stack (Symbol) ;] Count := Count + 1 ; END ;] CLOSE (Data) ; IF Count = 1 THEN] Symbol := 'entry' ELSEf Symbol := 'entries' ;= WRITELN ('%SD-I-LOADED, Loaded ',Count:1,' ',Symbol,'.') ;e END ; { of Read_File }IPROCEDURE Write_File ;N{ Dump the contents of the stack to a disk file - one default spec per line. } VAR I , Count : INTEGER := 0 ;$ Str_I : VARYING [4] OF CHAR := '' ; BEGIN { Write_File }H IF Cmd.LENGTH = 2 THENa Symbol := 'SD_OUTPUT_FILE'L ELSEm, Symbol := SUBSTR (Cmd,3,Cmd.LENGTH-2) ; Parse_Filename (Symbol) ;  IF Phantom_Dir THEN: Exit ('%SD-F-DIRNOTFOU, Output directory not found.') ELSE { Remove version }sI Search_Result := SUBSTR (Search_Result,1,INDEX(Search_Result,';')) ; 5 OPEN (Data,FILE_NAME:=Search_Result,HISTORY:=NEW) ;l REWRITE (Data) ;C WRITELN ('%SD-I-WRITING, Writing stack data to ',Search_Result) ;i# FOR I := Vs (Bos) TO Vs (Tos) DOi BEGINg. Str_I := DEC (Rs(I),Max_Digs,Max_Digs) ;! Get_Symbol ('SD__'+Str_I) ;e WRITELN (Data,Symbol) ;L Count := Count + 1 ; END ;D CLOSE (Data) ; IF Count = 1 THENy Symbol := 'entry' ELSEo Symbol := 'entries' ;= WRITELN ('%SD-I-STORED, Stored ',Count:1,' ',Symbol,'.') ;o END ; { of Write_File }PROCEDURE Swap_Slots ;F{ Swap the contents of two slots with each other. This is an on-stack< manipulation ONLY - the current default is not affected. }; VAR Tmp : INTEGER := 3 ; { !!! Note initial value !!! } # Str : VARYING [80] OF CHAR := '' ;D BEGIN { Swap_Slots }p Bos_Vs := Vs (Bos) ; Tos_Vs := Vs (Tos) ;, Tmp := Tmp + (Command[3] = ' ')::INTEGER ;4 Str := SUBSTR (Command,Tmp,Command.LENGTH-Tmp+1) ;M Get_Number (Str,Poppy,'%SD-F-BADSWAP, Directory number must be integer.') ;e/ IF (Poppy < Bos_Vs) OR (Poppy > Tos_Vs) THENs; Exit ('%SD-F-INVSWAP, Directory number is invalid.') ;  Tmp := INDEX (Str,' ') ; IF Tmp <> 0 THENc BEGIN/ Str := SUBSTR (Str,Tmp+1,Str.LENGTH-Tmp) ;SP Get_Number (Str,Poppy2,'%SD-F-BADSWAP, Directory number must be integer.');3 IF (Poppy2 < Bos_Vs) OR (Poppy2 > Tos_Vs) THENs7 Exit ('%SD-F-INVSWAP, Directory number is invalid.') ;, END ;4 Str_Poppy := DEC (Rs(Poppy) ,Max_Digs,Max_Digs) ;4 Str_Poppy2 := DEC (Rs(Poppy2),Max_Digs,Max_Digs) ;" Get_Symbol ('SD__'+Str_Poppy2) ; Symbol2 := Symbol ;a! Get_Symbol ('SD__'+Str_Poppy) ; ) Set_Symbol ('SD__'+Str_Poppy,Symbol2) ; ) Set_Symbol ('SD__'+Str_Poppy2,Symbol) ;y END ; { of Swap_Slots }PROCEDURE Swap_With_Current ;sM{ Swap the contents of a given slot with the current default, setting the new $ default to be the slot contents. }& VAR Bos_Vs , Tos_Vs : INTEGER := 0 ; BEGIN { Swap_With_Current } Bos_Vs := Vs (Bos) ; Tos_Vs := Vs (Tos) ;0 Get_Number (SUBSTR (Cmd,2,Cmd.LENGTH-1),Poppy,< '%SD-F-BADSWAP, Directory number must be integer.') ; IF Poppy < 0 THENt1 IF ABS (Poppy) > (Tos_Vs - Bos_Vs + 1) THEN)A Exit ('%SD-F-INVRELSWAP, Relative directory number is invalid.')N ELSE> Poppy := Tos_Vs + Poppy + 1 { Make it a virtual slot number } ELSEp> IF (Poppy = 0) OR (Poppy < Bos_Vs) OR (Poppy > Tos_Vs) THEN; Exit ('%SD-F-INVSWAP, Directory number is invalid.') ;%2 Str_Poppy := DEC (Rs(Poppy),Max_Digs,Max_Digs) ;! Get_Symbol ('SD__'+Str_Poppy) ;E Parse_Filename (Symbol) ;c Set_New_Default (Target_Dir) ;- Set_Symbol ('SD__'+Str_Poppy,Current_Dir) ;.6 IF Update_Prompt THEN Change_Prompt (Target_Dir) ;! END ; { of Swap_With_Current } PROCEDURE Overwrite_Slot ;N{ Overwrite the contents of a given slot with the current default. This is anE on-stack manipulation ONLY - the current default is not affected. }t BEGIN { Overwrite_Slot }_0 Get_Number (SUBSTR (Cmd,3,Cmd.LENGTH-2),Poppy,< '%SD-F-BADSLOT, Directory number must be integer.') ;3 IF (Poppy < Vs (Bos)) OR (Poppy > Vs (Tos)) THENo; Exit ('%SD-F-INVSLOT, Directory number is invalid.') ;'2 Str_Poppy := DEC (Rs(Poppy),Max_Digs,Max_Digs) ;- Set_Symbol ('SD__'+Str_Poppy,Current_Dir) ;E END ; { of Overwrite_Slot }PROCEDURE Pop_Stack ;N{ Pop the stack. } VAR I : INTEGER := 0 ;$ Str_I : VARYING [4] OF CHAR := '' ; BEGIN { Pop_Stack } Bos_Vs := Vs (Bos) ; Tos_Vs := Vs (Tos) ;* IF Cmd.LENGTH = 2 THEN { Pop the Top } Poppy := Tos_Vs ELSEV BEGIN3 Get_Number (SUBSTR (Cmd,3,Cmd.LENGTH-2),Poppy,S8 '%SD-F-BADPOP, Directory number must be integer.') ; IF Cmd[2] = 'B' THEN8 Poppy := - ABS (Poppy) ; { In case they put "/B -n" ! } END ;$ { Validate slot to which to pop. } IF Poppy < 0 THEN=1 IF ABS (Poppy) > (Tos_Vs - Bos_Vs + 1) THENS@ Exit ('%SD-F-INVRELPOP, Relative directory number is invalid.') ELSE> Poppy := Tos_Vs + Poppy + 1 { Make it a virtual slot number } ELSEe> IF (Poppy = 0) OR (Poppy < Bos_Vs) OR (Poppy > Tos_Vs) THEN: Exit ('%SD-F-INVPOP, Directory number is invalid.') ;) { Set default to valid slot contents. }2 Str_Poppy := DEC (Rs(Poppy),Max_Digs,Max_Digs) ;! Get_Symbol ('SD__'+Str_Poppy) ;) Parse_Filename (Symbol) ;t Set_New_Default (Target_Dir) ; { Stack emptied? Reset! } IF Poppy = Bos_Vs THENt Zero_Stack  ELSE BEGINE { Pop the *symbols* to reflect a directory pop from the stack. }r% FOR I := Tos_Vs DOWNTO Poppy DOE BEGINB* Str_I := DEC (Rs(I),Max_Digs,Max_Digs) ;? Zip (LIB$DELETE_SYMBOL ('SD__'+Str_I,LIB$K_CLI_GLOBAL_SYM)) ;N Pop ;i END ;-$ Set_Symbol ('SD__TS',Tos_Str) ;$ Set_Symbol ('SD__BS',Bos_Str) ;& Set_Symbol ('SD__SD',Depth_Str) ; END ;6 IF Update_Prompt THEN Change_Prompt (Target_Dir) ; END ; { of Pop_Stack }tPROCEDURE Give_Help ;t-{ M'aidez! Allow a subtopic specification. }i5 VAR Spot : INTEGER := 2 ; { Note initial value }G% Topic : VARYING [80] OF CHAR := '' ;D BEGIN { Give_Help } IF Cmd[1] = '\' THEN  Spot := 3 ;: IF (Spot <= Cmd.LENGTH) AND_THEN (Cmd[Spot] <> '') THEN; Topic := SUBSTR (Command,Spot,Command.LENGTH-Spot+1) ;n@ Zip (LBR$OUTPUT_HELP (Output_Routine := %IMMED LIB$PUT_OUTPUT,# Line_Desc := 'SD ' + Topic,N, Library_Name := 'SYS_HELP:PUBHELP.HLB',- Input_Routine := %IMMED LIB$GET_INPUT)) ; END ; { of Give_Help }HPROCEDURE Prompt_Handler ;4{ Allow prompt updating to be verified or changed. }( VAR B4 , Modified : BOOLEAN := FALSE ; BEGIN { Prompt_Handler }  IF Cmd.LENGTH > 2 THENo BEGIN B4 := Update_Prompt ;3 READV (Cmd[3],Update_Prompt,Error:=CONTINUE) ;, IF STATUSV <> 0 THENI Exit ('%SD-F-BADPVAL, Change prompt value must be "True" or "False".') ;c$ WRITEV (Symbol,Update_Prompt) ;( Str_Compress (Symbol,Symbol,TRUE) ;3 Set_Logical_Name ('SD_UPDATE_PROMPT',Symbol) ;E& Modified := Update_Prompt <> B4 ; END ; IF Update_Prompt THEN BEGIN8 WRITELN ('%SD-I-UPDATE, Prompt will be updated.') ; Get_Prompt_Specs ;DG Change_Prompt (Current_Dir) ; { Update prompt now - just in case }p END ELSEh BEGIN> WRITELN ('%SD-I-NOUPDATE, Prompt will be not updated.') ;2 IF Modified THEN Change_Prompt ('$ ',TRUE) ; END ; END ; { of Prompt_Handler }PROCEDURE Hush_Hush ;I/{ Allow quiet flag to be verified or changed. }T BEGIN { Hush_Hush } IF Cmd.LENGTH > 2 THEN BEGIN+ READV (Cmd[3],Quiet,Error:=CONTINUE) ;D IF STATUSV <> 0 THENI Exit ('%SD-F-BADPVAL, Change prompt value must be "True" or "False".') ;; WRITEV (Symbol,Quiet) ;( Str_Compress (Symbol,Symbol,TRUE) ;+ Set_Logical_Name ('SD_QUIET',Symbol) ;f END ; IF Quiet THENO WRITELN ('%SD-I-QUIET, New default directory name will not be displayed.')t ELSE]M WRITELN ('%SD-I-NOISY, New default directory name will be displayed.') ;  END ; { of Hush_Hush }dE{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *C * * * * * * * * * * M A I N P R O G R A M * * * * * * * * * *_G * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }_BEGIN { Set_Default }] Get_Command ; Initialize_Stack ;0Get_Logical_Name ('SYS$LOGIN',' ',Default_Dir) ;;Parse_Filename ('[]*.*',,TRUE) ; { Get current directory. }NCurrent_Dir := Target_Dir ;s0IF Cmd = '' THEN { No parameter = SYS$LOGIN: } BEGIN" Set_New_Default (Default_Dir) ; Push_Stack (Current_Dir) ; 8 IF Update_Prompt THEN Change_Prompt (Default_Dir) ; END ELSE IF Cmd[1] = '?' THEN { HELP! } Give_Help ELSE.@IF Cmd[1] <> '\' THEN { Directory Spec or shortcut character } BEGIN6 IF Cmd[1] = '~' THEN { Particular user's default } Get_User_Dir ; Parse_Spec_And_Set_Default ; Push_Stack (Current_Dir) ;f7 IF Update_Prompt THEN Change_Prompt (Target_Dir) ;  END ELSE IF Cmd = '\' THEN { "\" ONLY } IF Tos = 0 THEN { Empty } Exit (Empty_Stack_Msg) ELSE BEGIN.# WRITEV (Cmd,'\',Vs (Tos):1) ;T Swap_With_Current ;u END % ELSE { A backslash command ... }  CASE Cmd[2] OFt? 'A': Show_Stack_Attributes ; { List the stack attributes } - 'C': BEGIN { Show current directory }F WRITELN (Current_Dir) ; IF Phantom_Dir THENB: WRITELN ('%SD-W-NODIR, Directory does not exist.') ; $EXIT ; END ;0 'E': Stack_Undoer ; { Change undo action } 'H', { Help! }! '?': Give_Help ; { Help! } + 'L': List_Stack ; { List the stack }p/ 'Q': Hush_Hush ; { Change Quiet action }c* 'R': Read_File ; { Read from file }/ 'T': Stack_Typer ; { Change stack type } = 'U': Prompt_Handler ; { Change prompt updating action } OTHERWISEG! IF Tos = 0 THEN { Empty }R Exit (Empty_Stack_Msg)C ELSE CASE Cmd[2] OFr1 'P', { "Pop" the stack - absolute number }u; 'B': Pop_Stack ; { ... or go "Back" - relative number }lD '-': Swap_With_Current ; { Negative number - swap back nth slot }9 'O': Overwrite_Slot ; { Overwrite slot with current } 5 'S': Swap_Slots ; { Swap two slots on the stack } ' 'W': Write_File ; { Write to file }I. 'Z': Zero_Stack (TRUE) ; { Zero the stack } OTHERWISEt@ IF Cmd[2] IN Digits THEN { Swap current with slot on stack } Swap_With_Current  ELSE0 Exit ('%SD-F-BADPARAM, Bad parameter - ' +: 'check HELP for correct syntax (or use "$ SD ?").') ; END ; { Case }1 END ; { Case })END. { of it all }IF Target = 1 THEN { Comma ON>4c~SD.BCK ZI[SYSEXE.SOURCE.SD]SD.OBJ_AXP;1;*[SYSEXE.SOURCE.SD]SD.OBJ_AXP;1+, Z.;/ 4;7-I0123KPWO<56dux7 89GHJEE SET_DEFAULT0128-AUG-1996 15:38DEC Pascal V5.4-41 i$CODE$ $DATA$ LIB$INITIALIZE $ABS$p $LITERAL$p $LINK$$BSS$PAS$WRITEV_CHAR PAS$WRITEV_INTEGER PAS$WRITE_STRING PAS$WRITELN2PAS$CLOSE_LOCAL PAS$HANDLER2PAS$FIND_MEMBER PAS$FIND_NONMEMBERPAS$READV_INIT PAS$READV_INTEGERPAS$READV_FINI PAS$STATUSVPAS$DEC PAS$READV_ENUMERATED PAS$WRITE_INTEGER PAS$READV_BOOLEAN PAS$WRITEV_ENUMERATEDPAS$WRITE_CHAR PAS$WRITEV_BOOLEAN PAS$OPEN2 PAS$RESET2PAS$LOOK_AHEAD PAS$READ_VARYING PAS$READLN2 PAS$CLOSE2 PAS$REWRITE2 OTS$MOVEMOTS$ZEROOTS$STRCMP_EQLPOTS$MOVEOTS$FILL OTS$INDEX OTS$REM_I OTS$BIT_MOVEOTS$FILL OTS$BIT_OR OTS$BIT_MOVEM OTS$BIT_ZERO OTS$BIT_IS_MEMBER PAS$FV_OUTPUT SYS$SETDDIR SYS$TRNLNM LIB$SIGNAL SYS$CRELNMLIB$GET_FOREIGNSYS$EXITLIB$DO_COMMAND SYS$PARSE SYS$SEARCHLIB$GET_SYMBOLLIB$SET_SYMBOL LIB$DELETE_SYMBOL SYS$GETJPIW SYS$GETUAI MTH$ALOG10LBR$OUTPUT_HELPLIB$PUT_OUTPUT LIB$GET_INPUT =0#~^^~޴cGGb#@Pb#@b?$ ! =&I@B" s"}c C% ']Cݲ'#0B# {# }C$]tG("="]" }"("@b#;@=,GBt}JA=H% &4D=< "G B"@Zk"Cݲ4GGG =.t}JB""Q=J B"4F =>G@ZkC( ? ,"(="]"Hb# @pcGh,Bj"3v`J@H4aB FrC"tcJGDh<% $@Zk# BG"1v JB"G@ZkRC"B8vKTC<CGG>.tK"GQ JC4F >G@Zk8vK"C ݲ="b#@h#B!v HT @<CGG^.t HG!v HR@J"TF@>jC"@ZkG%@C= ݲ"`b#V@ӰBVæ6vJTB<CGG^.tJGR@J6vJTF@>"C"@ZkGBC "="b#@;Ø4G%vH @J`@ , HD b#+@-D>Db#B@Pb#\@h% $BjC" vHT@<CGG>.tH"Q!JG4F!>G@Zk vHC@ ݲ"`b#@ӰBpæ6vJTB<CGG^.tJGR@J6vJTF@>"rC"@ZkGBݰC "="b#@Ø#4G B"@B"1v JG@Zk/àGBBt}J.% ?' "WJGF>R"@Zk&9#0=C4&? 0"G0B#"8bGG4GG@Zkݰ"b# @`BhbG#"G4GG@Zkb#%@ӵTG @f@, H!@?D"@K B\<@ CkGb#@ӠGhjC"BtGb1vH`G@ZkBbG4G@ZkPGBGBtGb@R"@ZkBGb4G@ZkBb4G4G@Zk|Gb#@xGb#*@tGHb#h@pGb#j,@lGb#@hGb#@dGpb#n+@`Gc& `,GBBt}J@H% &D< "GR"@Zk&"0ݲC4=0"Gã=@`D$b#Z%@Bã]@`%U@D\@ CkGb#'@4Gb#&@0Gxb#"@,Gb# @(G"Xb#X @"GGB_"bG"@Zkb#-%@8},GBt}JB% $C}HP tD8}<:"G R"@ZkP ݰC "0b#@ӀGpBxbG4G@ZkGc4G]]}ݤ#k""4G`#G~H^P^X~`hp޴x>^cGGGB!vJG<CGG2GGG@Zk=C$=,=&&$1@8 8B4G(]"&@C "=B8G@ &"04J8G8K@G4G@5vH GuB;uB uGt/T." tJ[ tKwtJRTJaGt?WFT>GxB"GZ#]@"B""@.!tB 4DB$a}JWJB"F@>G@Zk "]B"@.!BB 4DWJaJB"F@>G@Zk '06JGb8B"@b"GXs"G_"@ZkHBPbGG]""G@Zk@}"8].B3v`JR]J1pB 0F:h "q}JQF8]>GB]"@ZkB @8vI G_b8B?#@b"GXs"G_"@ZkXB`bGG]""G@Zk4G(vI( A8AIK@= @09 A1v J 9@0B"F@.6AB FWJvIB]"GF@>B"GTB@Zk@=9v IG7 b8B? @b"GXs"G_"@ZkHBPbGG]""G@Zk,@=:]"8}hB!v H3v`JaB<CGG<CGGGGG@ZkhBB]"G@ZkBGGG@Zk"B"  8-%B DB:"eJHIGE8=G@Zk4Ge)v I39@) A`G 8 A8 @ 89C@0vJB8}:]"hB3v`JaB<CGG<CGGGGG@ZkhBB]"G@ZkBGGG@Zk0= @hBGG!v HB<AGG<CGG GGG@ZkhB2]"G@ZkBGGG@Zk"C69B 9@"8=,7C FB:"wKA=HG7D8=<G@Zk@"0vJB@/94AB 4GXKy=IB]"GG@?B"GTB@ZkG"8=BG:"1v JxB"G@Zk&87vI*vI3BCB 8"7J(vIB0-"0I $E (9A88A09`@'vH"@@8.3A tFB:"sIUJGF8>:]"@Zk8ݦ$vH6vJ B8} 3v`JdB7dB4- F." tJW JctJI4IF #E>4=GGr84@ 05A vH$@ = l@n!@t, $D4," HA 4HiHCtH7DiD4<t<G:]"BG@ZkcGH]P]X}`hpݤx=]#k"5"D"Y"j"y""""""" 8 AG8 @?"89C"@0vJB""2"@"^"f"j"}""@"G #G~G^G^G~޴>^~cGGBG#vJG=G<CGGGGG@Zk!GB֦8=!v HG<ݠG<CGGGGG@ZkݶGBX7vJG\= G<CG GGGG@ZkC$}&,}&4}01B9 YB 4G0}s"}B(C]<=CD=& f@L=CT=91 C@&CP}C8}) ICHݰC\=G<}Cdlt!1 @`)@p}X}h=\]mlGTG<CxG|=GG)vJ&"Ga B_ } 5vJ& BCt&Cݲ'4a@I$]xH " } ="G =}"0B$&?KGD =c ,](]"(}G(8b(JE(@ZkG<]D @0@24@ - F.B " HT JdHH IF>E =G@ZkGBbGTG@ZkGc]]}ݤ=]}#k"""@"G0#G~Gp^Gx^~޴>^cGGpB7vJGG <CGGGGG@Zk!G֦DpB%v H(=G<CG,GHݶ6vJGLGGG@Zk GpB<CGG GGGG@Zk C&&$01B8 XB4G }s"}BC ],C4' B<CD81C0C@}C(}( HC8CLG,GTݲC\ݲ%1@dݲ@P`}H}XL]LKGTGh<CGGlݲGD &" 0@@ t ,}!v H$'@C4?&tx Ia K ]G }"=GGݤ0B8b6HFݴ]=="G}]"*HAE=@ZkGBbGTG@ZkcGp]x]}ݤ=]#k""à#G~G ^G(^G0~8@H޴PcG {G% $8Bc C  @b"@ZkGxBbGTG@Zk$ C vHC vH"@ =="]]"Pb#_GxBbGTG@Zk4GG!vH vH B0q@q"Q.G"SJwJEF@.VJF>c CC8vK4GCݰ "}="]"Pb#_GxBbGTG@ZkGc ](]0}8@HݤP`#k"#G~G^^ ~(cGG@B!vJT @<CGG ]GX FC =D@Zk8B@Zk!.!J 0bpBA"xbtGG@Zk`BGhb4G@ZkPBXb4G4G@ZkcG]] }(0#k.U JF#G~4G^?'^~޴>cGGG vJ=T@<CGG GB!?HCXD= ]F$GG@ZkB!v HG@Zk@B"GB"GG@ZkG$8KD$$!v H0vJ! !B! 0@29 @ _BSB7@J2 .J"p,G0Bt}JB@H% 'DpR"D 7/7Kݦ !CBE 7..6vJdD"7JT J3v`J4F`B<CGG<CGGTBGGG@ZkBW"G@Zk0BGGG@ZkĦBGG6vJC< @GG<CGGGGG@ZkBD"G@Zk0BGGG@Zk@dG=,4@ FA=HtH"4D=<GG(ĢG! 2CU`%vHT@G 8 @8CQ ..09B8@JU JF0BK@dD"B3v`JxB<CGG<CGGGGG@ZkB@"G@Zk0BG4GGG@@Zk<@BG G79B!9 @GGGG@ZkB8B"G@Zk,,HG HDB <C0BGGaBG@"GGGTB@Zk =AB<CGGGGGG@ZkBGG@Zk$GBG!v H@<CGG<CGGGGG@ZkBD"G@Zk0BGGG@Zk@G,4@ F"tHGHGD<GpG8F=nX@N)v I9 3C8 C` Gd4G =&CB99 C3v`J%9@hB<CGG<CGGGGGD"@ZkB8B"G T A@Zk0BGGG@Zk!-.!IW J7EB<CG0BGyBGA"GGGTB@@Zk<CBG GGGGG@ZkBGG@ZkBGG%vHB<CGG<CGGGGG@ZkBD"G@Zk0BGGG@ZkAG/4A FXKtI"G?GG0B@ZkGݤGB8"B"&vH4GfB<CGG@ZkB]"GG@Zk0BGG8]"@Zk@B<CGGGGGG@ZkBB"G?$@Zk<CBGGGGGG@ZkpBG$vHG@Zk`B@=Chb "4G@ZkGPBXbGGTG@ZkGcG]]}ݤ=#kT/Z TKVG4"S,@ HD_"""""""$?"!"D"v0#G~^^~޴cGGG vJBT@<CGG ]C =GXDF6vJ8JG@ZkB7JTB@Zk4GA.".G0BAJT JTF8B"@Zk8@B8=,4G0Bt}JA=H% &4D8=<:"GR"@Zk1"Cp1#tݲp"Pb#;_f .J8@GC3@BPB`2AJ0B% ?'@:".R"79#JXGF@8.GBt}JGWJhR"F8>C@Zkx=7"|x"Pb#_ .J0 BGG@ ]8@09B 79`Br/,&9@rK@ H`GPC @G=.4@ F0B"tHQ=JR"4F=>G@Zk8/8,8KA 8H!GBBG=.4B F0BX"tJQ=J"4F=>GGTB@Zk3vH`G8@09 CGB<CBGGGG]"G@ZkpBG vH$@Zk@BGHb@C ݲ"GGtG@ZkGPBXbGGTG@ZkG}?&1"=L@ !v`H !v H?'&@8=C< 9#@=J@DTGH"¤8="@]"H}"b#S_',, 1v`HBGbGtG@ZkBb1vH]"GtG@ZkBGb4G@ZkƠGBtG BbG@R"@ZkBGb4G@ZkcG]]}ݤ#k .Q J0F"# .Q J0F0 BG@">"G@<"9"@D"A"BS"P"_"bG#G~^^~޴> ^(~0cG0GѦ" B2v HGT@B@Zk<C0vJGG=GTBG ]C<C ]GGGݶCGݢXF=GH=GwG5vJBG(B0=K{J FGG@Zk BC@ZkH=X DHGGH]!F=7vJB(B;[JuJGuGGG@Zk B%H9?K H@Zk B h"G@Zkh=P HPC=="!?HC`! D&h=C8 t="GpݦClGGh=FHB@Gpݶ0Gh"PbtG?%@ZkGJ)!} A0Jp=E PJGG PBp Jj ?Bh拖fJB5Jv JGFG=3v`J}/"4`B F[}Kt}JGtG}?]"@Zk E 0`E }G."3v`JVJ4wB F]"teJGF>GXB"`bGGtG@Zk?$GB! E7  E5?&1"A"E/ %G8B"1v JG@Zk8DBGF%E"% '!v HT @<CGG>.t H"Q JG4F >G@Zk!v HC8@= ݲ"="b#_BGbGGTG@Zk_ EB}G%,%3v`JA%H4rB F"teJG4D%<]"@Zk4G!&G&B"A% $ F`/GpBt}JXK"G?G(R"@ZkF C =F""b#_ h}p`I`A0Ha`IF4GD%2v J rB@1v J.s"JkF`19 B GX`B09B7vJ4GB@Ge/4aB F[eKteJ"tGe?GE"B@Zke G,B"3v`J@H4kB FE"teJGD<@Zk /= Ŧ& FA@0JxHFŴ à%0JPJ7@! &@ ?@0?K` HF A%XB_&`bk! $ER" A 0 E%ApB0 E qEE eOGGR"tG@ZkpBGXBG`btGR"@ZkHBGPb4G@Zk<%GB"E8B"1v JG@Zk8D G IEB E"% ?'$vHT@<CGG.tHGWJ$vHF>"@ZkG@C "="b#_G8B$@brc E`G4G@ZkGBGbGTG@ZkGc]]}ݤ= ](}0@#k"5"M""3":"@"E"xH0JFŴr"kG#G~TG^cG[{@ZkcG] #kG#G~G@^H^PcGG!vJBT @<CGGGG ]X FC =DG@ZkB@Zk.J> (b5vJ&0BB`s"P @% ' =C{#}8bs""="GG@ZkG ?$d! `BF ].Gt}J-?"R]J% &TF]>B "G-"pR"@ZkC8<ݲ8"b#_GBGbTG@ZkcG@]H]P`#k.V JF#G~G ^G(^0cGGB1vJG ]T B<CGX FGFG@ZkBCG@Zk! ݲ5v HTB<CG=GG]C}G.X FGGqGJ)B@ZkB@Zk.J&7vJ?$8B5vJ@bBPB ݲB=P@TG"="]"tG@ZkGBbGTG@ZkcG ](]0@#k.T JF /Y K5GG#G~G0^8^@~HcGG=G8B1vJT B<CG]X FG1DGG@Zk0BCG@Zk=5vH,TB<CG]GGX FHO 8BGFC@Zk0B@ZkݲGHHB!"Pb "tG@Zk8B "@b="TG@Zk= hB "pb4G@ZkXB`bG@Zk!]% '=Br..!v HrJT JR"tFTB<CGG.tJGUJ6vJF>"@ZkGBCݲT @ "b#_GcG0]8]@}HP#ka/[ aK`G"GGcG0G@0]8}509 @@Zk8@cGkl0l"1@29@B C1 B8 B !BFNG PBckGGcG=(=tQ lp1"G1 @ @B`F BLBck(]G!lrlR"R B0 B C8B2F1LBckG#~8^@^H~PX`޴hpcGGpG0JTG4G$[GB"btGG}"tGG@ZktG`BG,4aB FB "t}J@HGD<]"@ZkGB"B"7vJTGwB<CGG@ZkB ]"GG@ZkBGG]"@Zk<CBGGGGGG@ZkBG6vJ@Zk8BG@bBݲC=ݰ"="@ZkGB ?$d! bFG GTG@Zk @G8@G8B$ I@ =@b"ݰ="TG@Zk"b#_8BJ@" ="@bTGݰL@@Zk"b#_8B" ="@bTGݰK@@Zk"b#_8B" ="@bTGݰ% $@Zk"b#_`,G`Bt}JB "GHGD<8R"@Zk% 0C4ݰ0"b#% _cG8]@]H}PX`ݤhp#k"TG`#G~GX^`^h~px޴cGG"BG@ZkB"]"G@ZkTG=G}<CPBGG u#"_&GR"CU#5G GXbGG"G@ZkGBbGGTG@ZkrGBGbTG0vH@Zkh$X¤ $xDQH@PB"= C% $]C$% # !(C,=tG0"=" ]"(}"0"b#_TG8Bt}JB vH% & =." R"2"Q=JC4F=>G@ZkH2? LݲH"b# _F@1[@@="$C tG(",="0} ]"(}"0"b#_tG8Bt}JB% ?$$vH" ,GR"3! GHCD<@ZkH=LH"b#_3 $ &O@"`f"N@=% $C$} " C(tG,0]"=" ]"(}"0" `?=b#_`'vHGBbb&""tG@Zk8"`B"hb]"1"tG@Zk( B"(b4G3 @ZkBGb@Zk,tG8BBt}JDH% &D<"GR"@Zk3"HݲCL=H"b#_(tG8BBt}J5@@% &D=,"GA=HxR"4D=<@Zk3"CH3 LݲH"b#o_ӐB8Gb"tGG}"G@Zk$B` " C<CGGGG]"tG@ZkB6vJG&@ZkGBݲ`& CC$=" C(tG,"0}=" ]"(}"0"b# _`B% &bF"$vH!T@<`@GG,tHG@H$vHD<"@ZkG8B@CG,GBt}JGH% $D<"G0R"@Zk/ CPT"GP]"b#_Ơ/ G8BBt}JY@@"D!-GGHIR"E=@ZkCHH"Lb#/ _G¤G8BtG B(bGXR"@ZkBGb4G@ZkGcGX]`]h}pxݤ#k"G0#G~tGX^G`^Gh~px޴>^~cGGB"b}"% $@Zk?$ " B ! =H@<CbGGGG]"tG@ZkB6vJG&@ZkGBݲ`c CC$$ B" C(,}tG0ݰ"=" ]"(}"0"b#R_#% $B% ?%!!v H/)!T @<CGG^.t HGR@J!v HTF@>"C"G@Zk'@=CݲG=.GhBt}JBQ=J"4F=>G R"@ZkCP=/?#T="GP]"b#_GhBt}JB/"Y@@" D=.Gp R"Q=JC4F=>G@ZkH=H"Lݲb#5__%B` GbJ!]CC=c""="GG@ZkGC?$d! BF(7 b"=tGG}"tGG@Zk=,Gt}JB A=H 4D=<% &"G`B"@ZkT@B" C$ݲ<CGGtG6,4`B F vHtvJA6H"4D6<G]"@ZkG@C "="b#O_cBGbTG@Zk]#% &B6"6?#!v HT @<CGG^.t HGR@J!v HTF@>"C"G@Zk'@=CݲG=.GhBt}JBQ=J"4F=>G8 R"@ZkCP"T=="P]"b#}_=GhBTG GPB`EXb$G R"tG@Zk@BHbG4G@ZkhBGPBGXbtG R"@ZkBGbG4GtG@ZkPBXbGG8B"tG@Zk@BGHb4G@Zk%G!b!% C }!J@C}"C "$="(ݰ]" }"("b#:_c+v`IG`0Bc!8b"GtG@Zkh""B]"btG1"@Zk= x"PB4GXb@Zk@BGHb@Zk=.4GhBt}JBQ=J% &4F=> "G8R"@Zk1"@CDݲ1? @"b#0_x%"!&C "@L@5@}CB#C  D$}"(ݰ="]" }"("b#_ vHGJ0B"8bGtG@Zk`B"hb="TG@Zk= "PB4GXb@Zk@BGHb@Zk=.GhBt}JBQ=J% &4F=> "G R"@Zk7"HCLݲ7? H"b#_x %C0"" !C]C#C $="(ݰ="]" }"("b#_ vHG0B"8bGtG@Zk`B"hb="TG@Zk= 0"PB4GXb@Zk@BGHb@Zk=.GhBt}JBQ=J% &4F=> "G` R"@Zk7"HCLݲ7? H"b#_00b#_ C F@=C"C "$="(ݰ]" }"("b#L_,vIG0B8b"GtG@Zk`Bhb"="TG@ZkPB"Xb4G/ @Zk@BGHb@Zk,GhBBt}JFH "D<G0 R"@Zk C@=@"Db#G_ӐBP ]C C}bc""="GG@ZkGB$d bF_!]"tGG}"G@Zk#-tGBtcJ"I#IG 4E#=]"@ZkBGbTG@Zkc% $hB "B5 X`E`,Gt}JGDH R"D<@Zk C@ݰ@"Db#5!_cC"B% $# XB+v`I3 T`A<CGG,t`IG+v`IEH"D<G@Zk gA}C ݰG.tGhBBt}JWJ"F>G R"@ZkCH3"L"GH]"b#_' G 8O=`CGAGhB4GB At}JhE-% $ "GMI R" E=@Zk1 C@D=@"b#_1 B"btGG}"tGG@ZktG`B G`C-4kB FBb"tcJJCIG TE`C=]"@Zk,GBt}J% ?%FH "D<GXB"@Zk)!= C"`b#_cBC" "+v`ICT`A<CGG,t`IGEH+v`ID<"@Zk GhB gA} C G/tGBt}JXK"G?GP R"@ZkH3"L="GH]"b#_B" CtGbG}"]tGG@ZktG`B!hc- GB4mB FKcItcJj" tEhc=G]"@Zk,GBt}J "DHGDG R"@Zk5#HCL5? "GH]"b#_B"CtGbG}"]tGG@ZktG`B3!p, GB4kB FDHtcJr"Dp<G]"@ZkGcGX]`]h}pxݤ=]}#k"a"""F""r"#4G~^ ^(~0cG{Gttc ##G8@# B8 @4G#D# D 8@ @4FB"#tGbG}"=tGG@ZktG`BML"GB0,4qB F]"tpJA0HG4D0"GG@Zk%@=C 9.% $Y. B9JR YJ2FT @<CGG~.t6HG!v HSvJ"tFv>Y"@ZkG%@C="="b#_=,GBt}JA=H "4D=<G@B"@Zk CݰݲD" vHBT@<q@GG>.tH"GQ!JC4F!>G@Zk vH"@="b#h_=,GBt}J "A=HG4D=.tH"Q!JG4F!>G@Zk vHC@"="b#?_=,GBt}JA=H "4D=<GXB"@Zk CݰݲD" vHBT@<q@GG~,tHG vHCaH"tDa<G@Zk@Cݰ"="b#_Gc ](]0}8@HݤP`#kG#G~GX^`^h~pxcGGG vJBT@<CGG =GX FC <CGQFGGG@ZkBGG@Zk"H}B]"J" CC5JGV`.@}`J;KH@}tG_&=GR"V` ] &" G1v J8@r.09B.T BrJU JuFpC <CBGGGGR"G@ZkB vHG&@ZkG@C0B #8bGG]"GGGG@ZkG`B0FG! ?&1"FG }.*_"TGBtJS}J% &tF}> "GR"@Zk*"C8<ݲ8"b# _bGBGbTG@Zk[G@H=PHP HGBhg`?Bi h4Hu@J6?Hw J3v@JFF1v Jb`d X`B@GH=09CGX CB69@C]BB"C]"G@ZkBG@ZkGBUBJ"K]"GG _=@ZkBG@Zk@=P"H}J]"B!v H3v`JaB<CGG@ZkBB]"GG@Zk`BGGP]"@ZkB7(G4B`B FP,tJG@HGDP<(R"@ZkGcGX]0D`]h}px#k .Q J3F2";"K"?B?""?""""À#~8^@^H~PX`޴hpxcG{G(=xxc vH 9@cX@!?H3v`J(=09 BpB G(].4@ F B*"¦tHR]JGTF(]>C"@Zk(0"bG0B%vH8b&H_"s"G""G#@Zk0ݴG @@Bv JHbG<CGGGG}"G"@ZkPBGXb* @ZkGpBxbGGGG@ZkG(}G0-2"*]"3v`JHI4aB Ft}JGE0=/$vHG$ @8@69@(ݤ8B09C@&vH79B@ 9@ G0-4B F B2"tJHIGE0=*]"@Zk(0vJB G(=,4@ FA=HtH*]"4DG(=<*"GTB B% &@Zk0ݦ2]" B6vJTB<CGG/tJG6vJXK"G?G@ZkBݲC ="b#'_(cC"B'vH3v`JgB<CGG<CGGGGG@ZkB*]"G@Zk BGGG@Zk@EG(.4@ F B*"tHWJGF(>G@Zk(cG-" B*C"3v`JHI4yB FtcJGE=@ZkGc8]@]H}PX`ݤhpx#k""":"M"69@g"e"b"h"v"G#G~H^P^X~`hp޴xcGG bG(=0xc H xc G .3v`JB4wB8ݦ FUJt}J JF >""GC"@ZkcG02"G0.3v`JC"4zB FBUJt}JGF0>@Zk!?H6J(=4G8ݶdG =4GB""HB"1v J@Zk8@ =G3 B!v HC0Bg@f` "1!JGB".wJVJF> =4GB""@B"1v J@Zk8@ }G8].B:"3v`JR]J4uB F4Gt}JGTF8]>"]"@Zk1 ݦ6vJ6 B@8@!9@BD 8 @09@BB4vJ89 BB79B>`G8=.42@ FB:"t=HQ=J"]"4F8=>G@Zk 0vJB0@G }.4BB FS}JtJ"]"tF }>G""GTB@Zk8DhBjC"% &8vK0DTC<CGG>.tK"Q JG4F >G@Zk8vKCC ݲ=G8=4GB:"B"1v J@Zk8@088@8vK8 C 8}8@09 B8C3v`J!9 @pB99 CG(.4@ FB*"tHWJGF(>:]"@Zk80vJB G8].4CB FR]JtK:"TF8]>:]"GGTB@Zk8=B4G:"1v JB"@Zk8@ 9@8=8@09 C!v H0@`G8.4@B FUJtH:"F8>G:]"@Zk8=BG:"1v J0B"G@Zk8=4GB:"0B"1v J@Zk8@C84G8vK 8CC99,99#9H+D %D@%D GG4G B#(}4G@"3v`J*]"wB<CGG@Zk B0B"G@ZkBGGG@]"@ZkCG(=,4C FB*"tKA=HG4D(=<G@ZkG8=4G7v H!v HJ !CxC9/99#K GB39Bs`G(}G BX @3v`J99 BxB<CG@"G*]"@Zk BXB"GG@ZkBGG@]"@Zk80vJBZ`<CBGGGG;]"@ZkB B<CGGGGGG@Zk BGG@Zk?CEG(,47C FEHt=K*"D(<GG#(}@"8=*]" B3v`J!v HaB<CGG@Zk B:]"GG@ZkBGG@]"@Zk@$G(.4@ FWJtH*"F(>GGBG@ZkG"(}@" B*]"3v`JxB<CGG@Zk BPB"GG@ZkBGG@]"@Zk?@G(=/4&@ FY=Kt=H*"4G(=?GGFG(}tG B@"3v`J*]"vB<CGG@Zk B8B"GG@ZkBGG@]"@ZkBG(=/4B FY=KtJ*"4G(=?GG"(}tG B@"*]"3v`JaB<CGG@Zk B8B"G@ZkBGGG@]"@Zk@G(,4@ F*"tHEHGD(<GB@Zk(% $B*]"7vJTB<CGG,tJGEH7vJD<"@ZkGBBC =0%vHT@<CGG^.tHG%vHRAJ"TFA>2]"@ZkG@C"="]"b#_cG0=.(2"3v`JBQ=J4rB FC" n=t}J%H4F0=>G@Zk(2]"0=0DB9v KT C<CGG>.t K"GQ JC4F >G@Zk9v K&Cݰ ݲ"="b#3_GGdcH]P]X}`hpݤx#k""8@!9@"?""""?"""""+"."P"s""""""""=À#G~tG ^(^0~8@H޴PX`>h^pcG{G$BGB% %b!R"8@ZkBbG4G@ZkBbG4G@ZkBGbGPB"tG@ZkBGb4G tG@ZkBbG4G@ZkBGbGB"tG@ZkBbGG4GtG@ZkBGb4G @Zk}}Q~SD.BCK ZI[SYSEXE.SOURCE.SD]SD.OBJ_AXP;1;X|>` BGbG3HG4GG@Zk CC vH 4G vH"@ =="]]"hb#=z_BGbG`B"tG@ZkBGbG1vHtG@ZkBbG4G@ZkBGbGB"tG@ZkDBGbG@8B"tG@Zk_G]"b#D_ G"b#tG=_ӰB Bb 8@GG4G@ZkBbGGB"tG@Zk 8@EPB@XbGG4GtG@ZkBbG4G@ZkGG@B""BGbTGB"tG@ZkBbG4G@ZkBGbGB"tG@Zk D"b#]tG_ӰBbGG4G@ZkGGB"BtGb@ZkD"b#tG]_ӰBGbG4G@ZkBGb4G@ZkBbG4G@ZkDGBGbG0@EG@ZkDCC"*v@I]" GA] hb#=="=_BbGGB"tG@ZkDGBGbtG1v@I@ZkBGb4G@Zk0DBGbG0@EGG@ZkDCC*v@I" GA] ]"=="hb#=_BGbGB"tG@ZkDBGbG1v@ItG@ZkBbG4G@Zk0DE"GBG}@b3HGG@ZkDCC*v@I="GA ]""hb#=v_BGbGpB"tG@ZkDBGbG1v@ItG@ZkBbG4G@ZkBGbGB"tG@Zk$B4G"1v J0B"G@ZkGG0B"GGB"BbtG@ZkBbG4G@ZkBGbGB"tG@Zk$B4G"1v JB"G@ZkGG0B"GGB"BbtG@ZkBbG4G@ZkBGB4GbtGpR"@ZkBG$4GbtG@ZkBbG4G@ZkB4Gb4G@ZkcG ](]0}8@HݤPX`=h]p#k#G~GH^P^X~`hp޴xcG{Gxxc HB vHXDO`#B#"Pb4G3!H㳸R"@Zk&# c" vHC vH% &@ =C}"4G"="]"0b#_#GBB!v HpR"aB<CGG<CGGGGG@ZkBC"G@Zk8BGGG@ZkT@8B<BGG/tHGXK vHG?% &"G@ZkG@C =$vHtG @CB Hb"`@ "4GtG@ZkB b"G]"tG@Zk= `"B4Gb@ZkBGb@Zk=.4GBt}J8BQ=J% &4F=> "G8R"@Zk1"@CDݲ1? @"Xb#_`#"HBGPbG3H4GG@Zk$ $vH#"$vHC@% & C=s"}4G"="]"0b#;_?$! $vH=F@ $vH&@CX" "CTG "="]" }"b#e_GBB% '$vHR"dB<CGG<CGGGGG@ZkBC"G@Zk8BGGG@ZkT@8B<@GG.tHGVJ%vHF>"GG@Zk@C "Xb#m_GGcH]P]X}`hpݤx#k"NÀ#tG~GP^X^`~hpxcG{Gxxc !vH vH! o BCB1!Jb"q@1"4GtG@ZkBb"="TG@Zk= B"b4G@ZkBbG@Zk=.GBt}JB% &Q=J "4F=>G8R"@Zk4"C@4? Dݲ@"8b#_B#"bG0DGG@Zk$ vHC" vHC@% & =C]"4Gݲ"="]"b#w_&" vHF@ = vH&@C ~=8" "CݲTG ="="]" }"b#_ctGBBt}J`,% ?$ "DHGD<R"@Zk3! @=CD3 @"G,4GBt}JB% $EH "D<GR"@Zk9 CH9 LH"8b#_GcP]X]`}hpx#k"Zp#G~ H@^tGH^P~X`h޴px>cG{Gttc ¤C"G!XB`bG1vH@ZkHBGPb4G& @Zk,GpBt}JB% &@H"D<GR"@Zk&"C8ݲ<=8"b#h_XG"hb#_"G4G8B@bGW@Zk%W&_G8@@71 @GB<CGGGG@@Zk<C(BGGGG8B"G@Zk(BGG@Zk<C(BGGGGGG@ZkBG@ZkGXB`bGGtG@ZkXB`bGTGHB"tG@ZkäC"XBG`btG1vH@ZkHBGPb4G@ZkàG"ݰhb#_G"hb#y_G @ Gݰ"b#M_Bb"tGG}"tGG@ZktG`BG,4aBB F@Ht}J "D<G]"@ZkG(B"B"7vJ% $wB<CGG@Zk(B ]"GG@ZkBGG]"@ZkTBB<CGG,tJG@H6vJD<"GG@ZkBݲC="hb#_BbGGGtG@ZkXBG`bTG0B"tG@ZkXB#!`bG1vHGtG@ZkHBGPb4G@Zk @iG&9@ݰ"b#_Bb"tGG}"tGG@ZktG`BsG,4aBB F@Ht}J "D<G]"@ZkG(B"7vJB"wB<CGG@Zk(B ]"GG@ZkBGG]"@ZkTBB<CGG,tJG@H6vJD<"GG@ZkBݲC="hb#Q_BbGGGtG@ZkXBG`bTG0B"tG@ZkXBG`bG1vHtG@ZkHBPbG4G@Zk @8BG@b4G4G@ZkGc@]H]P}X`hݤpx=#k"""!"À#~8^@^H~PX`޴hpxcGH{GGxxc vHXD @"H"0J#B Y@Cx@09 @2v@JPB  G.4@ FB"tHUJGF>C"@Zkæ% $BC"6vJTB<CGG>.tJ"Q JG4F >G@Zk6vJBCBݲG =tJG}._""GS}JB"tF}>% ?$@Zk! C=ݲ" =" ]"b#_G(Bt}JB=.% &GQ=J "4F=>GR"@Zk&"C0&? 4ݲ0"b#_ӠGB  b2vHG4GGtGGG@ZkPBXbG4G@Zk(BGBGbtGR"@ZkGBGbtG1vH@ZkBGb4G@ZkǤ0BG8b4GH@ZkG6H3G`B"hbGGtG@ZkpBxbG4G@ZkC"B vHT@<CGG>.tH"GQ!JC4F!>G@Zk vH"@ ݲb#_Ǥ8@0B8bGH4G@ZkG6HBGbG4G8D@Zk%H@"D#t@(BGBGbtGR"@ZkBGbG4GtG@Zk`BhbGG4GtG@ZkäC"BGbtG1vH@Zk`BGhbG4GtG@ZkBbG4G@ZkGc8]@]H}PX`ݤhpx#k""G`#G~!'HH^P^X~`hp޴x>^cG{G=xxc G` vHXD h"# Y@Cx@09 @2v@JPB G.4@ FPB"tHUJGF>C"@Zkæ% $PBC"6vJTB<CGG>.tJ"Q JG4F >G@Zk6vJPBCBݲG=tJG}._""GS}J`B"tF}>% ?$@Zk! C =$ݲ"( ="(]"b#I_ӸGBPB"=.t}J% &Q=JG4F=>GR"@Zk,"C@,? Dݲ@"pb#]_G#PB4G"1v J@B"@Zk8@T#8@09C!v H0@Q`G.4@PB FUJtH"F>GC"@Zkp PB4G Xb2vJGGGG@ZkpBxbG4G@ZkBGBGbtGxR"@ZkGBGbtG1vH@ZkBGb4G@Zkà"b#ݰ_G"b# G_G B ="0b#V_PB"XbtGG}"tGG@ZktG`BG,4aB FPB = "t}J@HGD<]"@ZkGB"HB"7vJC!wB<CGG@ZkB ]"GG@ZkPBGG]"@ZkTBPB<CGG,tJG@H6vJD<"GG@ZkBݲC="b#_BGbG1vHtG@ZkBbG4G@Zk &A8@\G 8 A="0b#_PBXb"tGG}"tGG@ZktG`BG,4aBPB F@Ht}J "D<G]"@ZkGB"7vJHB"wB<CGG@ZkB ]"GG@ZkPBGG]"@ZkTBPB<CGG,tJG@H6vJD<"GG@ZkBݲC="b#i_BGbG1vHtG@ZkBbG4G@Zk &A8@BbGG"4G@Zk8Dä&H@ôC _E tNACGBGBtGb`R"@ZkBbGG4GtG@Zk0BG8bG4GtG@ZkBC"bG1vHtG@Zk0B8bGG4GtG@ZkBGb4G@ZkcGH]P]X}`hpݤx=]#k"J"M""""X #~^^~cGGP`b"8b# Hl#lc P=S_#("8b#=M_4#tG0v H 0B1q@!v H5Q.51"QJ$Bx B! 1@8 @* , 4C!B09`B:v@K59 BPC4"'`*@)GP=.42@ FB6C"t=HQ=JR"4FP=>GGTB@ZkPݦ% $,R]"B% $6vJ0 TB<CGG~.tJG6vJS`J"tF`>G@ZkBݲC =G.0"G@Bt}JBUJ"F>GR"@Zk"HCL="GH]"b#K_(#tG,+?"BG @ B " D].t}J% &R]JGTF]>@B+"CR"@Zk8<ݲ8"b#`_GP=B4GR"1v J0B"@Zk8@Pe8vK8 C8@P=@09 C 9@1v J0BGP.4C FBR]"tKUJR"FP>GGTB@ZkP=R]"BC9v KT C<CGG,t!KG@H9v KD<"@ZkG@B$C=C G=.Gt}JB0"Q=J"4F=>GR"< @ZkH"LݲGH]"b#_(,#tG<t}J@B+"B% & @ %@ "D=.GR"Q=J+"4F=>G@ZkC8<ݲ8"b#_"xb#G<_ӘB"btGG}"tG@ZktG<`BU"GB,4aB F]"tpJ@HGD<"@Zk"xb#_ӘBb"tGG}"tGG@ZktG`B9D"BG,4`B FEHtpJGDN"@Zk<@GBG,t6HG@H!v HD<"GG@Zk$@=C ="8b#E_GB vHB"`B<CGG<CGGGGG@ZkBC"GT @@ZkBGGG@Zk<@BGG.t H"GWJGF>@ZkL!v HBG%vH$@=T@C<C GG^.tHG%vHRAJ"TFA>NC"@ZkG@CL"="="b#^_DGD BB" vH`B<CGG<CGGGGG@ZkBFC"G@ZkBGGG@ZkT @B<@GG.t H"WJGF>G@Zk!v HGB$@=%vHCT@ <CGG^.tHGRAJ%vHTFA>"C"G@Zk@C=""="b#_Gc]]}#k""?""*@"">";"?""p#~P^X^`~hpx޴cG{G"b#llc _#G"b#=_ #G!v H!9 @ cX @09 B3v`J C"pB@T @8B<CGG~/t HG[`K!v HtG`?"C"@Zk% $GB&@=C G.G0"8Bt}JUJ"F>GR"@Zk% &# 0"CHLݲ"GH]"`b#_GBt}J8B7"! C$ @D8@ @G =.% & "R"Q=J7"4F=>G@ZkCHLݲH"@8@å @G@ @D=.tGBt}J8B% &Q=J "4F=> p=GR"@Zk+"C8+? <ݲ8"Xb#_"b#G=_8B@b"tGG}"tG@ZktG`B"G8B,4gB F]"tpJEHGD<"@ZkGB vH0B"`B<CGG<CGGGGG@ZkBC"GT @@Zk8BGGG@Zk<@8BGG/t HG!v HXK"G?G@ZkG&@C= ="b#_C"8B C%vH?#T@<CGG>,tHGA H%vH4D <"@ZkG8B@C ݲG,Gt}J"DHGD,tHGA H%vH4D <"@ZkG@C ݲ"=="b#_G B0B"%vHeB<CGG<CGGGGG@ZkBC"G@Zk8BGGG@ZkT@8B<@GG.tH"VJGF>G@Zk#$vHG8B@!v HCT @ <CGG>.t6H"Q6JC"4F6>G@Zk!v HG&@=C"="b#v_$C"8B $vHT@<CGG>.tH"GQ JC4F >G@Zk$vH"@ ݲ="b#)_GcGP]X]`}hpxݤ#k"z"~"G#~P^X^`~hpcG({Gxxc vH Y@Cx@09 @2v@JPB T@`B<CGG>.tH"Q!JC"4F!>G@Zk vHB% $`BG@C 0"G.Gt}J"UJGF>R"@Zk% & 0"CHLݲ"GH]"b#`_"âb#_Ӡ BG"b#_Ӡ @.tGB`Bt}JWJ% ?$F>G "GR"@Zk+! C8=+"<=8"b#k_"@b#G_`Bhb"tGG}"tG@ZktG`BcG,4aB F`B"tcJ@HGD<]"@ZkGBXB"7vJwB<CGG<CGGGGG@ZkBC"GTB@Zk`BGGG@Zk<C`BGG>,tJG6vJA H"4D <G@ZkBݲæGC =`B6vJTB<CGG^.tJG6vJRAJ"TFA>C"@ZkGBC"="b#o_cGP]X]`}hp#k"3"6"G`#G~!'HX^`^h~px޴cG{G="b#llc Q_#("b#=K_ #,!v HX D I!Y @ x @09`B "5vJB T @<CBGG,t6HG!v H@H"D<C"@Zk% $BGB @CG.G/"t}JUJ"F>GR"@Zk% &# /"PCT"GP]"(b#e_ TG vH @Za@C !. ! !JX(D 3 CRFG3 CcDG(,G8 CDB7 @8B B]/t}J% ?$"Z]KGTG]?B`R"6! C@ZkH=6?#LH"@8@,#@( $@ @$F}.*_"TGBBtJS}J% &tF}>"G0R"@Zk*"@CDݲ@" b#E_"b#G_Bb"tGG}"tG@ZktG`B"GB,4eB F]"tpJDHGD<"@Zk#G`B !v HB"aB<CGG<CGGGGG@Zk`BC"GT@@ZkBGGG@Zk<BBGG>/tHG vHY!K% $4G!?"GG@Zk@C"b#_BC" vH% &T@<CGG>.tH"Q!JG4F!>G@Zk vHBC@Gݲt}JG,"GB"EH"D<C@Zk $?#(" ="(]"8b#_C"B4G vHT@<CGG>.tH"GQ!JC4F!>G@Zk vH"@ݲ="=b#_("DGHb#:_3G,G"G @ Gݰb#_B"btGG}"tG@ZktG`BTG,4aBB F@Ht}J "D<G]"@ZkG`B"7vJB"wB<CGG@Zk`B ]"GG@ZkBGG]"@Zk<C`BGGGGGG@Zk@BG6vJ@ZkB$bGBCݲ=TG"="TG@Zk"b#9_b#_Ӡ @WG&9@ݰ"b#_Bb"tGG}"tGG@ZktG`BG,4aBB F@Ht}J "D<G]"@ZkG`B"7vJB"wB<CGG@Zk`B ]"GG@ZkBGG]"@Zk<C`BGGGG H=\ T GG@Zk@BG6vJ@ZkBGbBݲC=TG"="TG@Zk"b#_b#_Ӡ @=.Gt}JB "Q=JB"4F=>G@ZkT? B% $ vH T@C<CݲGG>,tHG vHA6H"4D6.tH"GQ JC4F >G@Zk%vH"@ ݲ="b#_GcGX]`]h}pxݤ#k"o"s""""@[ #4G~xG^xR"^!vHcG BG|QB}TG.1" vHJ3J F}tFC B*G3 B0Bm`l1!J(2QB,1"!v HHD! 4@8 @c e(B09`B59B vH@a`*@cG.41@ FxB*R"t=HWJ"F>GGTB@ZktGBp"8B" vH?$`B<CGG@ZkB]"GG@ZkxBGGp]"@Zk<CBGGGGGG@ZkBGX6vJ@Zk "GHBB_&=C 1"0R"]C=PbG]"}"GG@Zk"b#_cG]]#k"""""*@"Gp#~P^X^`~hpx޴cGh{GGxxc !vH vH! w tG# @C$HBb0 Dd@$""4GtG@Zk@BHb"="TG@Zk0B"8b4G= @Zk BG(b@Zk=,GHBBt}JA=H% &4D=< "GR"@Zk="HCLݲH"b#?_0B#"8bG0DGG@Zk$ $vH#"$vHC@% & C=s"}4G"="]"b#_?$! $vH=K@ $vH&@Cݰ" "CTG "="]" }"0b#_0D0DDCàGtGHB(0BG8bR"@Zk B(bG4G@Zkb#\_C"B% &$vHT@<CGG,tHG@H$vHD<"@ZkG@C ݲ"="%GtGHBtG0B 8bGxR"@Zk BG(b4G% $@Zk},TGBt}JC}H "tD}<GPB"@Zk C4Gݲ"="pb#_GcGP]X]`}hpxݤ#k")À#tG~GP^X^`~hpxcG{Gxxc !vH vH! o BCpB1!Jxb"q@1"4GtG@ZkBb"="TG@Zk= B"b4G@ZkBbG@Zk=.GBt}JB% &Q=J "4F=>GR"@Zk="CH=? LݲH" b#S_ӴB#"bG0DGG@Zk$ vHC" vHC@% & =C]"4Gݲ"="]"b#_&" vHF@ = vH&@C " "CݲTG ="="]" }"b#_ӴcPGBtG`BbG@R"@ZkG PTGBtGBbGR"@ZkGB4Gb@ZkGcP]X]`}hpx#k"k4 GOTS$MOVE4 @OTS$MOVE4 G<OTS$MOVE4 8@<OTS$MOVE4 pGOTS$MOVE4 @OTS$MOVE4 GOTS$STRCMP_EQLP4 @OTS$STRCMP_EQLP4 GOTS$MOVE4 @OTS$MOVE4 8GxOTS$MOVE4 t@xOTS$MOVE4 GOTS$MOVE4 @OTS$MOVE4 pGOTS$MOVE4 @OTS$MOVE4 GOTS$MOVE 4 @OTS$MOVE4 PGhOTS$STRCMP_EQLP4 d@hOTS$STRCMP_EQLP4 xGOTS$MOVE4 @OTS$MOVE4cGPAS$WRITEV_CHAR4db# PAS$WRITEV_CHAR4c@PAS$WRITEV_CHAR<eGPAS$WRITEV_INTEGER<fb# PAS$WRITEV_INTEGER<e@PAS$WRITEV_INTEGER< GPAS$WRITE_STRING< b# PAS$WRITE_STRING< @PAS$WRITE_STRING4G PAS$WRITELN24b# PAS$WRITELN24@ PAS$WRITELN2< GPAS$WRITE_STRING< b# PAS$WRITE_STRING< @PAS$WRITE_STRING4G PAS$WRITELN24b# PAS$WRITELN24@ PAS$WRITELN24GSYS$EXIT4b# SYS$EXIT4@SYS$EXIT4 GOTS$MOVE4 @OTS$MOVE<iGOTS$BIT_IS_MEMBER<jb# OTS$BIT_IS_MEMBER<i@OTS$BIT_IS_MEMBER4 GOTS$MOVE4 @OTS$MOVE4gGPAS$CLOSE_LOCAL4hb# PAS$CLOSE_LOCAL4g@PAS$CLOSE_LOCAL4 GOTS$MOVE4 @OTS$MOVE4  G( OTS$MOVE4 $ @( OTS$MOVE4 L Gp OTS$MOVE4 l @p OTS$MOVE4A G OTS$BIT_MOVE4B b# OTS$BIT_MOVE4A @ OTS$BIT_MOVE4C G PAS$FIND_MEMBER4D b#PAS$FIND_MEMBER4C @ PAS$FIND_MEMBER4 G OTS$MOVE4  @ OTS$MOVE4A0 GT OTS$BIT_MOVE4B8 b# OTS$BIT_MOVE4AP @T OTS$BIT_MOVE<ET Gt PAS$FIND_NONMEMBER<FX b#PAS$FIND_NONMEMBER<Ep @t PAS$FIND_NONMEMBER4 G OTS$MOVE4 @ OTS$MOVE4A G$ OTS$BIT_MOVE4B b# OTS$BIT_MOVE4A @$ OTS$BIT_MOVE4C$ GD PAS$FIND_MEMBER4D( b#PAS$FIND_MEMBER4C@ @D PAS$FIND_MEMBER4T G OTS$MOVEM4 @ OTS$MOVEM4 G OTS$MOVEM4 @ OTS$MOVEM4 G OTS$MOVE4 @ OTS$MOVE4 G OTS$MOVE4 @ OTS$MOVE48 Gl OTS$MOVEM4h @l OTS$MOVEM4l G| OTS$MOVEM4x @| OTS$MOVEM 4 | G OTS$MOVE4 @ OTS$MOVE4 G OTS$MOVEM4 @ OTS$MOVEM4 G OTS$MOVEM4 @ OTS$MOVEM4 G OTS$MOVE4 @ OTS$MOVE4 G@OTS$MOVE4 <@@OTS$MOVE4 \GOTS$MOVE4 @OTS$MOVE4 GOTS$STRCMP_EQLP4 @OTS$STRCMP_EQLP4 ,GPOTS$MOVE4 L@POTS$MOVE4 $G0OTS$MOVE4 ,@0OTS$MOVE4 GHOTS$MOVE4 D@HOTS$MOVE4 PGOTS$MOVE4 @OTS$MOVE4 GOTS$MOVE4 @OTS$MOVE4;<G SYS$TRNLNM4<lb# SYS$TRNLNM4;|@ SYS$TRNLNM4 GOTS$MOVE4 @OTS$MOVE4G LIB$SIGNAL4b# LIB$SIGNAL4@ LIB$SIGNAL4 GOTS$MOVE4 @OTS$MOVE4 GPOTS$MOVE4 L@POTS$MOVE4 TGxOTS$MOVE4 t@xOTS$MOVE4G SYS$CRELNM4b#p SYS$CRELNM4@ SYS$CRELNM4G4 LIB$SIGNAL4$b#p LIB$SIGNAL40@4 LIB$SIGNAL4aGLIB$GET_FOREIGN4bb# LIB$GET_FOREIGN4a@LIB$GET_FOREIGN4G LIB$SIGNAL4b# LIB$SIGNAL4 @ LIB$SIGNAL4\Gt LIB$SIGNAL4db# LIB$SIGNAL4p@t LIB$SIGNAL4G( LIB$SIGNAL4b# LIB$SIGNAL4$@( LIB$SIGNAL4G OTS$MOVEM4@ OTS$MOVEM4GOTS$ZERO4@OTS$ZERO< GPAS$WRITE_STRING< b#PAS$WRITE_STRING< @PAS$WRITE_STRING4G  PAS$WRITELN24b# PAS$WRITELN24@  PAS$WRITELN24 G SYS$EXIT4b#SYS$EXIT4@ SYS$EXIT4G OTS$MOVEM4@ OTS$MOVEM4GOTS$ZERO4@OTS$ZERO4 G$OTS$STRCMP_EQLP4 @$OTS$STRCMP_EQLP4 GOTS$MOVE4 @OTS$MOVE4LG OTS$MOVEM 4@ OTS$MOVEM4G OTS$MOVEM4@ OTS$MOVEM4 GOTS$MOVE4 @OTS$MOVE4G  OTS$MOVEM4@  OTS$MOVEM4 G OTS$MOVEM4@ OTS$MOVEM4 G0OTS$MOVE4 ,@0OTS$MOVE4G OTS$MOVEM4@ OTS$MOVEM4G  OTS$MOVEM4@  OTS$MOVEM4 G(OTS$MOVE4 $@(OTS$MOVE4,GT OTS$MOVEM4P@T OTS$MOVEM4TGd OTS$MOVEM4`@d OTS$MOVEM4 GOTS$MOVE4 @OTS$MOVE4G OTS$MOVEM4@ OTS$MOVEM4G OTS$MOVEM4@ OTS$MOVEM4G( OTS$MOVEM4$ @( OTS$MOVEM4( G8 OTS$MOVEM44 @8 OTS$MOVEM4 8 GL OTS$MOVE4 H @L OTS$MOVE4 G! OTS$MOVEM4 @! OTS$MOVEM4!G! OTS$MOVEM4!@! OTS$MOVEM4 !G(!OTS$MOVE4 $!@(!OTS$MOVE4 L!Gx!OTS$MOVE4 t!@x!OTS$MOVE4|!G! OTS$MOVEM4!@! OTS$MOVEM4!G! OTS$MOVEM4!@! OTS$MOVEM4!G! OTS$MOVEM4!@! OTS$MOVEM4!G! OTS$MOVEM4!@! OTS$MOVEM4 !G"OTS$MOVE4 "@"OTS$MOVE4 D"GL"OTS$MOVE4 H"@L"OTS$MOVE4X"G" OTS$MOVEM4|"@" OTS$MOVEM4"G" OTS$MOVEM4"@" OTS$MOVEM4 "G"OTS$MOVE4 "@"OTS$MOVE4"G" OTS$MOVEM4"@" OTS$MOVEM4"G" OTS$MOVEM4"@" OTS$MOVEM4"G# OTS$MOVEM4#@# OTS$MOVEM4#G#OTS$FILL4#@#OTS$FILL4#G@#LIB$DO_COMMAND4,#b#LIB$DO_COMMAND4<#@@#LIB$DO_COMMAND4D#G`# LIB$SIGNAL4L#b# LIB$SIGNAL4\#@`# LIB$SIGNAL4$G$ OTS$MOVEM4$@$ OTS$MOVEM4$G$OTS$ZERO4$@;=5z~SD.BCK ZI[SYSEXE.SOURCE.SD]SD.OBJ_AXP;1;||$OTS$ZERO4%G% OTS$INDEX 4%@% OTS$INDEX4 ,%GT%OTS$MOVE4 P%@T%OTS$MOVE4 %G%OTS$MOVE4 %@%OTS$MOVE4 &G&OTS$MOVE4 &@&OTS$MOVE4 &G'OTS$MOVE4 '@'OTS$MOVE48'GX' OTS$MOVEM4T'@X' OTS$MOVEM4X'Gl'OTS$FILL4h'@l'OTS$FILL4l'G' SYS$SETDDIR4t'b# SYS$SETDDIR4'@' SYS$SETDDIR4'G' LIB$SIGNAL4'b# LIB$SIGNAL4'@' LIB$SIGNAL< @(G\(PAS$WRITE_STRING< L(b#PAS$WRITE_STRING< X(@\(PAS$WRITE_STRING< \(Gx(PAS$WRITE_STRING< `(b#PAS$WRITE_STRING< t(@x(PAS$WRITE_STRING4x(G( PAS$WRITELN24(b# PAS$WRITELN24(@( PAS$WRITELN2< (G(PAS$WRITE_STRING< (b#PAS$WRITE_STRING< (@(PAS$WRITE_STRING4(G( PAS$WRITELN24(b# PAS$WRITELN24(@( PAS$WRITELN24*G*OTS$ZERO4*@*OTS$ZERO4*G* OTS$MOVEM4*@* OTS$MOVEM4*G*OTS$ZERO4*@*OTS$ZERO4*G + OTS$MOVEM4+@ + OTS$MOVEM4 +G4+OTS$ZERO40+@4+OTS$ZERO44+GH+OTS$ZERO4D+@H+OTS$ZERO4+G+ SYS$PARSE4+b# SYS$PARSE4+@+ SYS$PARSE4 ,,Gx,OTS$MOVE4 t,@x,OTS$MOVE4,G, SYS$SEARCH4 ,b# SYS$SEARCH4,@, SYS$SEARCH4 ,G0-OTS$STRCMP_EQLP4 ,-@0-OTS$STRCMP_EQLP4 4-G-OTS$MOVE4 -@-OTS$MOVE4-G- LIB$SIGNAL4-b# LIB$SIGNAL4-@- LIB$SIGNAL4 -G.OTS$MOVE4 .@.OTS$MOVE4 ,.Gp.OTS$MOVE4 l.@p.OTS$MOVE4 D/GL/OTS$MOVE4 H/@L/OTS$MOVE4 X/G/OTS$MOVE4 /@/OTS$MOVE< /GH0PAS$WRITE_STRING< /b#PAS$WRITE_STRING< D0@H0PAS$WRITE_STRING< P0Gh0PAS$WRITE_STRING< X0b#PAS$WRITE_STRING< d0@h0PAS$WRITE_STRING4h0G|0 PAS$WRITELN2 4p0b# PAS$WRITELN24x0@|0 PAS$WRITELN24 0G0OTS$STRCMP_EQLP4 0@0OTS$STRCMP_EQLP4 0G1OTS$MOVE4 0@1OTS$MOVE4,1GP1SYS$EXIT441b#SYS$EXIT4L1@P1SYS$EXIT4X1Gp1 LIB$SIGNAL4`1b# LIB$SIGNAL4l1@p1 LIB$SIGNAL4T2Gd2 LIB$SIGNAL4X2{# LIB$SIGNAL4`2@d2 LIB$SIGNAL42G2 OTS$MOVEM42@2 OTS$MOVEM42G2OTS$ZERO42@2OTS$ZERO4! 3GT3LIB$GET_SYMBOL4"83b#LIB$GET_SYMBOL4!P3@T3LIB$GET_SYMBOL4 d3G3OTS$MOVE4 3@3OTS$MOVE43G3 LIB$SIGNAL43b# LIB$SIGNAL43@3 LIB$SIGNAL484Gl4 OTS$MOVEM4h4@l4 OTS$MOVEM4l4G|4OTS$ZERO4x4@|4OTS$ZERO44G4 OTS$MOVEM44@4 OTS$MOVEM44G4OTS$ZERO44@4OTS$ZERO44G<5LIB$SET_SYMBOL44b#(LIB$SET_SYMBOL485@<5LIB$SET_SYMBOL4D5GX5 LIB$SIGNAL4H5b#( LIB$SIGNAL4T5@X5 LIB$SIGNAL45G6 OTS$MOVEM46@6 OTS$MOVEM46G6OTS$ZERO46@6OTS$ZERO4L6Gd6 OTS$MOVEM4`6@d6 OTS$MOVEM4d6Gl6OTS$ZERO4h6@l6OTS$ZERO4'x6G6PAS$READV_INIT4(6b#PAS$READV_INIT4'6@6PAS$READV_INIT<%6G6PAS$READV_INTEGER<&6b#PAS$READV_INTEGER<%6@6PAS$READV_INTEGER4+6G6PAS$READV_FINI4,6b#PAS$READV_FINI4+6@6PAS$READV_FINI4)6G6 PAS$STATUSV4*6b# PAS$STATUSV4)6@6 PAS$STATUSV4 6G@7OTS$MOVE4 <7@@7OTS$MOVE4#7G7 OTS$REM_I4$7}# OTS$REM_I4#7@7 OTS$REM_I,-09GX9PAS$DEC,.89b#(PAS$DEC,-T9@X9PAS$DEC4 t9G9OTS$MOVE4 9@9OTS$MOVE49G9 OTS$MOVEM49@9 OTS$MOVEM49G9 OTS$MOVEM49@9 OTS$MOVEM4 9G9OTS$MOVE4 9@9OTS$MOVE49G: OTS$MOVEM 4:@: OTS$MOVEM4:G$:OTS$FILL4 :@$:OTS$FILL</$:GP:LIB$DELETE_SYMBOL<0,:b#(LIB$DELETE_SYMBOL</L:@P:LIB$DELETE_SYMBOL4T:G: LIB$SIGNAL4d:b#( LIB$SIGNAL4|:@: LIB$SIGNAL</:G:LIB$DELETE_SYMBOL<0:b#(LIB$DELETE_SYMBOL</:@:LIB$DELETE_SYMBOL</:G;LIB$DELETE_SYMBOL<0:b#(LIB$DELETE_SYMBOL</;@;LIB$DELETE_SYMBOL</;G<;LIB$DELETE_SYMBOL<0(;b#(LIB$DELETE_SYMBOL</8;@<;LIB$DELETE_SYMBOL</L;Gt;LIB$DELETE_SYMBOL<0`;b#(LIB$DELETE_SYMBOL</p;@t;LIB$DELETE_SYMBOL4 ;G;OTS$MOVE4 ;@;OTS$MOVE4\<Gh<OTS$ZERO4d<@h<OTS$ZERO4 h<G|<OTS$MOVE4 x<@|<OTS$MOVE4=<G< SYS$GETJPIW4><b#P SYS$GETJPIW4=<@< SYS$GETJPIW4=G= LIB$SIGNAL4=b#P LIB$SIGNAL4=@= LIB$SIGNAL4(=GD= LIB$SIGNAL40=b#P LIB$SIGNAL4@=@D= LIB$SIGNAL4 =G >OTS$MOVE4 >@ >OTS$MOVE4 >G>OTS$MOVE4 >@>OTS$MOVE4'|?G?PAS$READV_INIT4(?b#PPAS$READV_INIT4'?@?PAS$READV_INIT<??G?PAS$READV_ENUMERATED<@?b#PPAS$READV_ENUMERATED<??@?PAS$READV_ENUMERATED4+?G?PAS$READV_FINI4,?b#PPAS$READV_FINI4+?@?PAS$READV_FINI4)?G? PAS$STATUSV4*?b#P PAS$STATUSV4)?@? PAS$STATUSV4 ?G @OTS$MOVE4 @@ @OTS$MOVE4 H@G@OTS$MOVE4 @@@OTS$MOVE,-@G@PAS$DEC,.@b#PPAS$DEC,-@@@PAS$DEC4@GA OTS$MOVEM4 A@A OTS$MOVEM4AG$AOTS$FILL4 A@$AOTS$FILL4 AGAOTS$MOVE4 A@AOTS$MOVE4 AGBOTS$MOVE4 B@BOTS$MOVE4 HBGBOTS$MOVE4 B@BOTS$MOVE< BGBPAS$WRITE_STRING< Bb#PPAS$WRITE_STRING< B@BPAS$WRITE_STRING4BGB PAS$WRITELN24Bb#P PAS$WRITELN24B@B PAS$WRITELN2 ,-CGCPAS$DEC,.Cb# PAS$DEC,-C@CPAS$DEC4CGC OTS$MOVEM4C@C OTS$MOVEM4CGDOTS$FILL4D@DOTS$FILL4 pDGDOTS$MOVE4 D@DOTS$MOVE4 DGEOTS$MOVE4 E@EOTS$MOVE4 8EGxEOTS$MOVE4 tE@xEOTS$MOVE4!EGELIB$GET_SYMBOL4"Eb# LIB$GET_SYMBOL4!E@ELIB$GET_SYMBOL,-EGFPAS$DEC,.Eb# PAS$DEC,-F@FPAS$DEC4 $FGPFOTS$MOVE4 LF@PFOTS$MOVE4 TFGFOTS$MOVE4 F@FOTS$MOVE4FGF LIB$SIGNAL4Fb# LIB$SIGNAL4F@F LIB$SIGNAL4 FG@GOTS$MOVE4 +|RITE_STRING< q@qPAS$WRITE_STRING<7qGqPAS$WRITE_INTEGER<8qb#p PAS$WRITE_INTEGER<7q@qPAS$WRITE_INTEGER4qGr PAS$WRITELN24qb#p PAS$WRITELN24r@r PAS$WRITELN2<KrG8rPAS$WRITEV_ENUMERATED<Lrb#p PAS$WRITEV_ENUMERATED<K4r@8rPAS$WRITEV_ENUMERATED< rGrPAS$WRITE_STRING< rb#p PAS$WRITE_STRING< r@rPAS$WRITE_STRING< rGrPAS$WRITE_STRING< rb#p PAS$WRITE_STRING < r@rPAS$WRITE_STRING4rGr PAS$WRITELN24rb#p PAS$WRITELN24r@r PAS$WRITELN2< rGrPAS$WRITE_STRING< rb#p PAS$WRITE_STRING< r@rPAS$WRITE_STRING< rGsPAS$WRITE_STRING< rb#p PAS$WRITE_STRING< s@sPAS$WRITE_STRING<7DsGdsPAS$WRITE_INTEGER<8Lsb#p PAS$WRITE_INTEGER<7`s@dsPAS$WRITE_INTEGER< dsGsPAS$WRITE_STRING< hsb#p PAS$WRITE_STRING< |s@sPAS$WRITE_STRING41sGsPAS$WRITE_CHAR42sb#p PAS$WRITE_CHAR41s@sPAS$WRITE_CHAR4sGs PAS$WRITELN24sb#p PAS$WRITELN24s@s PAS$WRITELN2< sGsPAS$WRITE_STRING< sb#p PAS$WRITE_STRING< s@sPAS$WRITE_STRING4sGs PAS$WRITELN24sb#p PAS$WRITELN24s@s PAS$WRITELN2< sGtPAS$WRITE_STRING< tb#p PAS$WRITE_STRING< t@tPAS$WRITE_STRING<7,tGDtPAS$WRITE_INTEGER<80tb#p PAS$WRITE_INTEGER<7@t@DtPAS$WRITE_INTEGER< PtG`tPAS$WRITE_STRING< Xtb#p PAS$WRITE_STRING< \t@`tPAS$WRITE_STRING<7xtGtPAS$WRITE_INTEGER<8tb#p PAS$WRITE_INTEGER<7t@tPAS$WRITE_INTEGER4tGt PAS$WRITELN24tb#p PAS$WRITELN24t@t PAS$WRITELN24tGt PAS$WRITELN24tb#p PAS$WRITELN24t@t PAS$WRITELN2<GtGtPAS$WRITEV_BOOLEAN<Htb#p PAS$WRITEV_BOOLEAN<Gt@tPAS$WRITEV_BOOLEAN< uG8uPAS$WRITE_STRING< ub#p PAS$WRITE_STRING< 4u@8uPAS$WRITE_STRING< @uGXuPAS$WRITE_STRING< Hub#p PAS$WRITE_STRING< Tu@XuPAS$WRITE_STRING4XuGlu PAS$WRITELN24`ub#p PAS$WRITELN24hu@lu PAS$WRITELN2<GpuGuPAS$WRITEV_BOOLEAN<Hxub#p PAS$WRITEV_BOOLEAN<Gu@uPAS$WRITEV_BOOLEAN< uGuPAS$WRITE_STRING< ub#p PAS$WRITE_STRING< u@uPAS$WRITE_STRING< uG vPAS$WRITE_STRING< ub#p PAS$WRITE_STRING< v@ vPAS$WRITE_STRING4 vG v PAS$WRITELN24vb#p PAS$WRITELN24v@ v PAS$WRITELN2<K0vGTvPAS$WRITEV_ENUMERATED <L%SD-I-QUIET, New default directory name will not be displayed.=0&%SD-I-EMPTY, Directory stack is empty.8= SYS_HELP:PUBHELP.HLBP=H9%SD-I-NOUNDO, Errors during expansion will not be undone.=@3%SD-I-UNDO, Errors during expansion will be undone.=@4%SD-F-BADUNDO, Undo value must be "True" or "False". = Max Prompt size:  =(SD Directory stack attributes:8 =8*%SD-F-NOSUCHUSER, Username does not exist.h =u %SD-F-BADDEPTH, Directory stack pointer is corrupted. =@3%SD-F-BADBOS, Directory stack pointer is corrupted. =@1%SD-F-INVTOS, Directory stack pointer is invalid.P =@3%SD-F-BADTOS, Directory stack pointer is corrupted. =@5%SD-F-BADTABLE, Directory stack symbol is not global. =7/%SD-F-BADLNM, Logical name is invalid: SD_QUIETx x =@7%SD-F-BADLNM, Logical name is invalid: SD_UPDATE_PROMPT( =@7%SD-F-BADLNM, Logical name is invalid: SD_UNDO_IF_ERROR` =0'%SD-I-STACKSIZE, Current stack size is  =H:%SD-E-NODYNSIZE, Dynamic re-sizing of stack not supported. =@6%SD-F-BADSYMSIZ, Directory stack pointer is corrupted. =8/%SD-F-INVSIZE, Directory stack size is invalid.0 =8/%SD-F-BADSIZE, Directory stack size is invalid.` =XP%SD-F-BADPARAM, Bad parameter - check HELP for correct syntax (or use "$ SD ?").=pd xxxxxxxxxxxx0 xx@xxxPxx`=d\ p 0@P`p =0`;=0 7 PAS$HANDLER207 PAS$FV_OUTPUT8OTS$ZERO8 OTS$MOVEMPSYS$EXIT PAS$WRITELN2 PAS$WRITE_STRING=";= $ SET PROMPT = ";=0P;= 7 PAS$HANDLER28OTS$MOVE=*8OTS$STRCMP_EQLP LIB$SIGNALLIB$DO_COMMAND8OTS$FILL=0 4;=@ 7 PAS$HANDLER2`LIB$SET_SYMBOL=0px;= 7 PAS$HANDLER2 SYS$CRELNM=0@$;= 7 PAS$HANDLER28 OTS$INDEX=: SYS$SETDDIR= LNM$FILE_DEV=SYS$DISK=0);=@ 7 PAS$HANDLER2H=P=` SYS$PARSE SYS$SEARCH=0@2;=` 7 PAS$HANDLER2!LIB$GET_SYMBOL=07;=7 PAS$HANDLER2# OTS$REM_I;=005;=P 7 PAS$HANDLER2@ %PAS$READV_INTEGER'PAS$READV_INIT) PAS$STATUSV+PAS$READV_FINI=088;=7 PAS$HANDLER2=0PX;= 7 PAS$HANDLER2=SD__-PAS$DEC=[]*.*=002;= 7 PAS$HANDLER2(=088;= 7 PAS$HANDLER2` /LIB$DELETE_SYMBOL=SD__TSx=SD__BS=SD__SZ=SD__SD=0H;= 7 PAS$HANDLER21PAS$WRITE_CHAR=;3 PAS$OPEN2=SD_OUTPUT_FILE5 PAS$REWRITE2=entrie  7PAS$WRITE_INTEGER9 PAS$CLOSE2=entry=0;=< 7 PAS$HANDLER2x= =0P;= 7 PAS$HANDLER2=0U;=P< 7 PAS$HANDLER2=0X;= 7 PAS$HANDLER2=0;= 7 PAS$HANDLER2@; SYS$TRNLNM=0X<;= 7 PAS$HANDLER2=SD_PROMPT_TAIL=SD_PROMPT_HEAD= SYS$GETJPIW ?PAS$READV_ENUMERATED=LEFT=SD_PROMPT_FORMAT=0Hh;= 7 PAS$HANDLER2A OTS$BIT_MOVE CPAS$FIND_MEMBER EPAS$FIND_NONMEMBER=0P0;= 7 PAS$HANDLER2p GPAS$WRITEV_BOOLEAN IPAS$READV_BOOLEAN=$ =SD_UPDATE_PROMPT=0Hx;=| 7 PAS$HANDLER2=SD_STACK_STYLE KPAS$WRITEV_ENUMERATED=0S;=@ 7 PAS$HANDLER20=0 W;=`| 7 PAS$HANDLER2`=080;= 7 PAS$HANDLER2MPAS$LOOK_AHEAD=UT_FILE SD_INPO PAS$RESET2 QPAS$READ_VARYINGS PAS$READLN2=0P;=< 7 PAS$HANDLER2 =SD_QUIET=0@;= 7 PAS$HANDLER2H =: P U MTH$ALOG10=> h =0;= 7 PAS$HANDLER2 7LIB$PUT_OUTPUT=SD   WLBR$OUTPUT_HELP7 LIB$GET_INPUT=0P|;=< 7 PAS$HANDLER2 = SD_UNDO_IF_ERROR to  =Update Prompt:  =Prompt head: 0 =s.8 = Stack limit: H = Stack usage: X = slot` =User specified.p =0 p;= 7 PAS$HANDLER2 = Default.None. = Slot in use:  = Stack size:  = Stack style:  =Prompt format:  =Prompt tail:  = Slot range:  =Undo errors:  =0Hd;=| 7 PAS$HANDLER2P =[X =*.*` =,h =`p =]*.*x =000000 =0X[;= 7 PAS$HANDLER2 Y SYS$GETUAI=08h`;= 7 PAS$HANDLER2 [ OTS$BIT_OR] OTS$BIT_MOVEM_ OTS$BIT_ZERO=0X0C;=? 7 PAS$HANDLER2P =FALSEX = slots.` = SD_STACK_SIZEp = ABSOLUTE0TRUE =0 ;=`| 7 PAS$HANDLER2  aLIB$GET_FOREIGN=0;=| 7 PAS$HANDLER2  cPAS$WRITEV_CHAR=\ = SYS$LOGIN0  ePAS$WRITEV_INTEGER gPAS$CLOSE_LOCAL7PAS$CLOSE_LOCAL`  iOTS$BIT_IS_MEMBERE E=5-, SET_DEFAULTDEC Pascal V5.4-41T  = 4 4= SET_DEFAULT4=/ ܔ    P $ $= 04 = h44= STR_COMPRESSh4=' P<  ,$ $= x 4: := 04= H  = 44=GET_LOGICAL_NAME4=D  @    $ $=  4: := 4=  = x4p4=SET_LOGICAL_NAMEx4=               $< %  $ $= 4: := 44=  = 4 4= GET_COMMAND4=ogf ) ) ) ) ) ) 7 < <, < $ $= 4: := (4= | |= `44= EXIT`4= G L$ $= 4: :=  4= ( (= P44= CHANGE_PROMPT!P4= Q  Q  Q Q  Q Q Q  Q  Q  g g j4 n v8 b0$ $= d4: := d#4= 3 3= @$44=SET_NEW_DEFAULT@$4= {  { {  { { {     (   >  0 4 $ $= $4: := (4= p1 1= )44=PARSE_FILENAME)4=                                                            ,              , 5  @   U$ $= 4*4: := p14=  = 0244= ZIP024=/'&    m$ $= 424: := d24= P = 244= GET_SYMBOL24=)!   $ $= 24: := 34=  = 44(4= SET_SYMBOL44=;32 ! ! ! ! )$$ $= D44: := X54=  = 544= GET_NUMBER54==54 / / / / 6 $ $= 54: := h74=  = 744=RS74=910 < B B E E $ $= 74N N= 74,84=  = 8844=VS884=>65 J P P Q S S t$ $= L84N N= 8484=  = 84(4= ZERO_STACK84=med W ] ` ` d$ ` i j k0 b$ $= 94: := ;4= H = <4P4=GET_PROMPT_SPECS<4= q q q q v  x x | }              4 $ $= $<4: := B4=  = 0C4 4=INITIALIZE_STACK0C4=            ȴ      $         $ ' 0 08 6̼8 ;H     T$ $= 4C4: := S4= p = *S44= PUSHS4=vnm C C C J O P R R [ \ [u$ $= S4: := U4= 0 = U44= POPU4=XPO a a f j k m q( p $ $= U4: := W4=   = W404= PUSH_STACKW4=B:9 w w w } }0$ $= 8X4: := [4=  = [4 4= GETUAI[4=OG                              >    (    $ $= 0\4: := _4=  = h`4 4= GET_USER_DIRh`4=                (4   $ $= \a4: := $d4= p = 'd4 4=( PARSE_SPEC_AND_SET_DEFAULTd4=[S        8               t G7 (       $ $= 0e4: := o4=  ; ;= "p4p 4=#SHOW_STACK_ATTRIBUTESp4=      $ $ $ $ $참 'и , 0 0 0A 2İİ Eİ<$ $= p4: := Dx4=  = x44= STACK_TYPERx4=TLK Z Z Z Z _ܨԨ, g $ $= x4: := |4= h = |4 4= STACK_UNDOER|4=VNM r r r r wب ( y $ $= |4: := 4=  = 4 4= LIST_STACK4=          p l 8 $ $= 4: := ȅ4= X = 04`4= READ_FILE04=vnm    d    4 $ $= |4: := 4= # #= 44= WRITE_FILE4=        Ĉ 4  4 /  < $ $= \4: := 4= - -= 4H4= SWAP_SLOTS4=           3  = P   ܨ$$(  P$ $= ̒4: := 4=  = X44=SWAP_WITH_CURRENTX4=h`_     #  00  $ $= 4: := 4=  = 44=OVERWRITE_SLOT4=4,+ 5 5$ ; $ $= ,4: := L4= 4 4= 44= POP_STACK4= E E E E M N V \ ] nF u u u0 T$ $= ܦ4: := 84=  = 4h 4= GIVE_HELP4=               8$ $= 4: := ij4=  =  y~SD.BCK ZI[SYSEXE.SOURCE.SD]SD.OBJ_AXP;1;2604@4=PROMPT_HANDLER04=xpo      ب   0  $ $= x4: := 4=  = 44= HUSH_HUSH4=XPO     ب (  $ $= 4: := h4= : := (4= h =  5 TEV_= 7 PAS$HANDLER2H =: P U MTH$ALOG10=> h =0;= 7 PAS$HANDLER2 7LIB$PUT_OUTPUT=SD  *[SYSEXE.SOURCE.SD]SD.OBJ_VAX;1+,bh.Q/ 4QQ-I0123KPWOR56Kc 7 89GHJH6 SET_DEFAULT0113-Sep-1996 17:2113-Sep-1996 17:21DEC Pascal V5.4-41 SET_DEFAULTP!DATAQ%SD-F-INTERROR, Bad prompt literal - notify Systems Programmer.Q$ SET PROMPT = "%SD-F-BADDIR, Directory specification is corrupt.Q%SD-F-NONODE, Node name specification is not supported.QLNM$FILE_DEVSYS$DISK%SD-W-NODIR, Directory does not exist.QSD__SD__TSQSD__BSQSD__SDQSD__SZQ%SD-S-ZEROED, Directory stack zeroed.Q%SD-F-EMPTYWILDDIR, Cannot determine name of empty wildcard directory.Q%SD-E-NOPRIV, Insufficient privilege or file protection violation on directory. #,2; STACK_TYPEABSOLUTEFIXEDRELATIVESLIDINGQ%SD-I-STYLE, Directory stack style is Q%SD-F-BADSTYLE, Directory stack style is invalid.QSD_STACK_STYLEQ%SD-S-STYLE, Directory stack style is QSD_OUTPUT_FILEQ[]*.*Q%SD-F-DIRNOTFOU, Output directory not found.%SD-I-WRITING, Writing stack data to QSD__entryQentriesQ%SD-I-STORED, Stored Q%SD-F-BADSWAP, Directory number must be integer.%SD-F-INVSWAP, Directory number is invalid.Q%SD-F-BADSWAP, Directory number must be integer.%SD-F-INVSWAP, Directory number is invalid.QSD__SD__SD__SD__SD_INPUT_FILEQ%SD-F-FILNOTFOU, Input file not found.Q%SD-I-READING, Reading stack data from QentryQentriesQ%SD-I-LOADED, Loaded Q%SD-I-EMPTY, Directory stack is empty.> SD__: QSD Directory stack attributes:QStack size: QStack limit: QStack style: QStack usage: QNone.Q slotQSlot in use: Qs.Slot range: Q to Undo errors: QUpdate Prompt: Q$ PROMPT_STYLECENTRELEFTQPrompt format: QPrompt head: QDefault.User specified.QPrompt tail: QDefault.User specified.QMax Prompt size: Q%SD-F-BADPOP, Directory number must be integer.Q%SD-F-INVRELPOP, Relative directory number is invalid.Q%SD-F-INVPOP, Directory number is invalid.QSD__SD__SD__TSQSD__BSQSD__SDQ%SD-F-BADSWAP, Directory number must be integer.%SD-F-INVRELSWAP, Relative directory number is invalid.Q%SD-F-INVSWAP, Directory number is invalid.QSD__SD__000000Q]*.**.*Q*.*Q%SD-F-NOSUCHUSER, Username does not exist.Q LNM$FILE_DEVSD_PROMPT_HEADQ%SD-F-BADHEAD, Prompt head definition is too long.QSD_PROMPT_TAILQ%SD-F-BADTRAIL, Prompt tail definition is too long.QLEFTSD_PROMPT_FORMAT%SD-F-BADFORM, Prompt format definition is invalid.Q%SD-F-INVFORM, Prompt format definition is invalid.QSD_MAX_PROMPT_SIZEQ%SD-F-BADPSIZE, Maximum prompt size is invalid.Q%SD-F-INVPSIZE, Maximum prompt size is invalid.Q%SD-W-NOTINTER, Not interactive - update prompt ignored.%SD-F-BADPVAL, Change prompt value must be "True" or "False".QSD_UPDATE_PROMPT%SD-I-UPDATE, Prompt will be updated.Q%SD-I-NOUPDATE, Prompt will be not updated.Q$ QSD_STACK_SIZEQ%SD-F-BADSIZE, Directory stack size is invalid.Q%SD-F-INVSIZE, Directory stack size is invalid.QSD__SZQSD__SZQ%SD-F-BADSYMSIZ, Directory stack pointer is corrupted.Q%SD-E-NODYNSIZE, Dynamic re-sizing of stack not supported.Q%SD-I-STACKSIZE, Current stack size is Q slots.QABSOLUTESD_STACK_STYLEQ%SD-F-BADSTYLE, Directory stack style is invalid.QTRUESD_UNDO_IF_ERROR%SD-F-BADLNM, Logical name is invalid: SD_UNDO_IF_ERRORQFALSEQSD_UPDATE_PROMPT%SD-F-BADLNM, Logical name is invalid: SD_UPDATE_PROMPTQFALSEQSD_QUIET%SD-F-BADLNM, Logical name is invalid: SD_QUIETQSD__TSQ%SD-F-BADTABLE, Directory stack symbol is not global.Q%SD-F-BADTOS, Directory stack pointer is corrupted.Q%SD-F-INVTOS, Directory stack pointer is invalid.QSD__BSQ%SD-F-BADBOS, Directory stack pointer is corrupted.QSD__SDQ%SD-F-BADDEPTH, Directory stack pointer is corrupted.QSYS$LOGINQ[]*.*QSYS_HELP:PUBHELP.HLBSD Q%SD-W-NODIR, Directory does not exist.Q%SD-F-BADUNDO, Undo value must be "True" or "False".SD_UNDO_IF_ERROR%SD-I-UNDO, Errors during expansion will be undone.Q%SD-I-NOUNDO, Errors during expansion will not be undone.Q%SD-F-BADPVAL, Change prompt value must be "True" or "False".QSD_QUIET%SD-I-QUIET, New default directory name will not be displayed.Q%SD-I-NOISY, New default directory name will be displayed.Q%SD-F-BADSLOT, Directory number must be integer.%SD-F-INVSLOT, Directory number is invalid.QSD__%SD-F-BADPARAM, Bad parameter - check HELP for correct syntax (or use "$ SD ?").SD__SD__TSQSD__BSQSD__SDQ%SD-F-BADSTACK, Directory stack is corrupted.^ԭ PAS$HANDLERm}<Э<Э<ЭЏЏԭ­^ЭVЭQ^SV(acV(Vací^VV^}<<<̂ЏЏ­^ЭVЭQ^SV(acV(Vací^VV^} }<<<ЏЏ­^ЭVЭQ^SV(acV(Vací^VV^^\V\^^\\WЭP WQ, A\谭ЭWЭWЭWЭЭWԧ ݭЭԭܭЭ찭谏꟭Џ SYS$TRNLNMPVVѭѭ̭̏ ЭP`(`VV LIB$SIGNAL<^}<\\\^Э\^Pl`(`^ЭP` PAS$FV_OUTPUTPAS$WRITE_STRING PAS$FV_OUTPUT PAS$WRITELN2SYS$EXIT^ԭ PAS$HANDLERm}|(^ԭ PAS$HANDLERm^P\^V |( ~<P<QQRR QRRPPPP|RQb(`bV^~(n0nఏ% ^䞭^P<|RRP^R~(n~ݮnذ% ^ܞح^PY&V^&~(n,n% ^^PϮ PAS$OPEN2 PAS$RESET2' PAS$FV_OUTPUTPAS$WRITE_STRING PAS$FV_OUTPUTPAS$WRITE_STRING PAS$FV_OUTPUT PAS$WRITELN2ݏ|PAS$READ_VARYING PAS$READLN2<|PPV^P~(n~ڮn% ^^P\0 PAS$HANDLER SYS$TRNLNM LIB$SIGNAL PAS$FV_OUTPUTPAS$WRITE_STRING PAS$WRITELN2SYS$EXITLIB$DO_COMMAND SYS$CRELNM SYS$SETDDIRPAS$DECLIB$DELETE_SYMBOL SYS$PARSE SYS$SEARCHPAS$WRITEV_ENUMERATEDPAS$READV_ENUMERATED PAS$STATUSV PAS$OPEN2 PAS$REWRITE2 PAS$CLOSE2PAS$WRITE_INTEGERPAS$WRITE_CHARLIB$SET_SYMBOL PAS$RESET2PAS$READ_VARYING PAS$READLN2PAS$LOOK_AHEADPAS$LOOK_AHEAD1 PAS$CLOSE2\|(T~|(F~C PAS$FV_OUTPUTPAS$WRITE_STRING\ PAS$FV_OUTPUTPAS$WRITE_INTEGER PAS$FV_OUTPUTPAS$WRITE_CHAR~| PAS$FV_OUTPUTPAS$WRITE_STRING. PAS$FV_OUTPUTPAS$WRITE_CHAR PAS$FV_OUTPUT PAS$WRITELN20^ԭ PAS$HANDLERm^P\V,^W PAS$FV_OUTPUTPAS$WRITE_STRING PAS$FV_OUTPUT PAS$WRITELN2&W^&~(nn谏% ^잭^Pϝ1ωNP߭ MTH$ALOG10JPPPVVVVW^^X,n-VnVX PAS$FV_OUTPUTPAS$WRITE_STRING3 PAS$FV_OUTPUTPAS$WRITE_STRING PAS$FV_OUTPUTPAS$WRITE_STRING PAS$FV_OUTPUT PAS$WRITELN2PPѭ1Э\WP^W\ZZQzQQ{,QQQQ[Q,RRZRQR$RRQ,QZRQRR[W^PW[蟭 PAS$DEC($ PAS$DECD(F؏U<4WW^W~(n6n% ^^PP^~(nan԰% ^؞ԭ^P<<PP^P~(n>n% ^^PP^~(n n԰% ^؞ԭ^Pm<DPP^P~(nFn% ^^PP^~(nn԰% ^؞ԭ^P<PP^P~(nҮn% ^^Pϟ(^ԭ PAS$HANDLERm^P\V^W P\PV0W^0~(nn% ^^P<Q<RRSS RSSQXXXRP^R~(nhnذ% ^ܞح^PPPP\VXXPX7W^7~(nn% ^^P<PF\V+W^+~(npn% ^^PWP^WVV\z\X{,XXXX\,RRVR\R$RR\,\V\VVXW^PWX PAS$DECL(N<LXXVVVW^^\(n(XNcV~n谏% ^잭^V׭W^~(n߽nذ% ^ܞح^P<|\\P^\~(n~خnఏ% ^䞭^P؞<PPW^P~(nݮnఏ% ^䞭^P$<PPW^P~(nn% ^^P<L\\VVVP^^X(n(\NcV~n谏% ^잭^V[<PPW^P~(nϮnఏ% ^䞭^Pθ^ԭ PAS$HANDLERm^PX,,,ͼ,͸^ͼ(;͸(ͺ<ͼR:`R;PPRPPRRX<ͼRͽP XRPP -`X1<ͼR:,R;PPRPPRRXͼ(ͼ;<ͼPXRQQ RQQP;PPPR(R`<ͼPXR<ͼQXQRSS QSSP;PRPPQͼ(Q`;X<PP^P~(nn԰% ^؞ԭ^P1V^~(nn% ^^P5V^5~(nɮn% ^^P$<|VVP^V~(n~ۮnذ% ^ܞح^P$ PAS$DECD(F^ԭ PAS$HANDLERm^P\Џ% LIB$GET_FOREIGNP\\\ LIB$SIGNALЏ% 谏쟭ϯP\\\ LIB$SIGNAL<PQ PQQ a/<QP QPP \`Џ% 谏쟭+P\\\ LIB$SIGNAL^ԭ PAS$HANDLERm^\sߏ iЏ% 쟭ఏ➏ 䟭 ذڞܟᯞ\^~(nnఏ% ^䞭^PP^~(n̬nذ% ^ܞح^P6P`(`- n1<PP\^P~(nݮnఏ% ^䞭^P)<PP\^P~(nݮn% ^^P1<PP\^P~(nٮnఏ% ^䞭^P41<PQ PQV fWW?1X,RW\X<PXP<PQ XPQQ -a <P<QXQQXRR QRRPPXPPQP Q(Q` LIB$GET_INPUTԭ PAS$FV_OUTPUTPAS$WRITE_STRING PAS$FV_OUTPUT PAS$WRITELN216: PAS$FV_OUTPUTPAS$WRITE_STRING PAS$FV_OUTPUT PAS$WRITELN21121~1&\^&~(nQn% ^^P[1j--\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\11Ϡ10\^0~(nn% ^^P<Z<XXYY XYYZZZZXP^X~(njn% ^^PZKPZX3PXZXX+\^+~(nn% ^^P\P^\XXZzZZ{,ZZZZY,VVXVYV$VVY,YXYXXZ\^P\Z PAS$DECL(N<PP\^P~(nn% ^^P<LZZXXXP^^Y(n(ZNcX~n% ^^XeϫGWWWﻣeÏP\^P~(nCn% ^^PrPPAS$CLOSE_LOCAL_R3$^ԭ PAS$HANDLERm}<\\\^Э\^Pl`(`^^\,$, PAS$DEC4(6 PAS$DEC<(>$ PAS$DECD(FЭVn% ^^PP^~(nաnܰ% ^ܭ^Pϯ<DPP\^P~(nFn% ^^PP^~(nnܰ% ^ܭ^PR^}Q< Q'QQ*gQ RQBQe Q QQQQQ8QRQBQJ Q QcQpQQQ &Q OQ QQ Q%Q Q QQQQ Q QQQ Q QbQQ2Q Q IQQQQQ!Q$QQ"Q2OQ2QQ'QQ@QQQ6QoQ=qQ$Q!0QQhQ=QQ2Q1MQQQQQQ=QQ QPQ8LEQDQQ QsQQQhBQ Q 0Q;QQQ{AQ Q 0QEQ;QQ QZQ=QQ QXQ: @Q)Q:?Q@Q|Q]Q@QQ0Q`Q\9Q Q&QQ[QWQ*Q4QQ>QQ QPQ89Q%Q#=QJaQ]QQ'Q#%QJ$Q#"QQ QFQB>2QQQnQQ3Q2oQVQ Q Q 1QHQ>QQ QZQ;1QQ QQQQ Q cQ Q6Q.Q /QQ- Q Q QQQQ Q;QQQQQQ)Q"QQCQQQCQQQQQQQ?QQQQ5QQNQ5Q1QQQ.Q:QQYQ4Q Q QeQQ4QlQQQ QQQSQb0Q0QQ!0Q79Q0QQ Q\Q1*QQ%Q(Q 0QgQd\Q&5QQQ Q 0QnQnQjQQbQ kQQ!0Q9 QQQ 0QQ 0Q6QQ 0Ql?Q&Q%IQ y乴n+|ve} j2Xʴ}E,8N+r2:9p6IA-/EܑJJ̙x]`Q>}-(I>Շ<70LGyȶб5{4<5VUuQbxsDqe[2gxH[t2tYz;."GͥX/_%]*c8G$|R0|AdqP!dppyVf ڼp8Љ&邝4 .W||݂#/ɑ\7SBcDȹl^me5?KQ{!Xsg5M2w5YlZ(~z'Y *`#1Tc{\1"D%Fѫxe (1є >l,ڧic'^# EBG0PT07q6g}_|!0:a)FL.EXLns+AzRe/i)G>A݉^[Y4u*JX(4 cyM v5 Oh &pf*$ S[芁Q5 ԯZi[B9PAm7 +!CS"g%'WKpѦyDiIX 0nSYCeeԖjbŐZewH/8|T/P)x o1l~J8zPhO/uLسm?¼]|4Y B-/z۩ S `&A}; :6/6;f ,r>CHЁ55Kug4zTjg%Yъ1M0A3}3.M4 "GJNW }QU0 !Z FMAܺD}®<3D>ˆ̒:9))nJ"91U0O+>wbI~+K8}}dqPf"7TE{p4gwA/܂tTsRMUS'뎙R=5:uǫv㖲`g<p9oNXQU~«1:VLtj\ p)/gN0{ԥ"Ih{?b@M%2!zS1(IsvI'ifu5D At LwgwDkTv ,4V< '-ŔUMXKCXcYY#5@IS HlJ_{ g5֧Շ5- ixsusЩ?Axgd}RdC\PbKJK&G ᔸKaŠfG5Ite' iTIc2۱.'2j۪%Xbq d{W&En/=vRٻ90~Im KNĨЪo].}DY`~}X9:Ҷ"Nd҉ ÂYT-mqauDdI1 vѤ;B<>˷ĕBе*Ign(]cs[[\ Nאն0:1}bF#TvPQ2Zgܙ Its")g L^[A[@,3nQ #7xI+]NlONjy+=Ư\Zc c9= 㭱krА<)H;OD^%窿rWEnfX!Zp-BtA"!\ӛ EKjuנ4Q\ck8@Cr!r y>^:%Y=i[\2fT x.?}{YL56] AzaO/GŤS*._osW.hIf*H#>8cPޣlE œ`kD/e)M87sLaGoAf>\&m`Ș7+&}jgI>Y]gR)[XcBuڷ ]C藣cD^f ^{q/Fj|i!Et8ܛMGQz<5¦7 hC =SƬIz;չ`u@QpM%=IM{"Z>t?L~'A/I\P.ui(؟OOeI]DXъ^ճȖ(7[C"4]S;p͘WQi{J ߪvqGuk-d12ͪ")=-`#6ښ L"fB08ۨņŏ.rYѯ?^ti~JYa[G Q8g]I$$%+ؖE58y Av;y<\<OǪ&I\*nc: exŠ1'GBcKr~F;Y'|sG?BPZqWJed,iȁ_ śgS`BϖaNs*9؏zM@).g7ܙ;ƈ[ByocY:T^4Ү!n~j9im8§`tIO@yq&!rv~r2pvkؗ]UHr+B:c@({Y r̄NOZ:>*h;EZB 0%u}<2 ul,`QHM'nV !y HIM-U=TrSng>Fa!bTt 692H?kX6*N/0Ol rbo&/!v4M>ϽE˵U0Vkf mBFy5P }YX?G8d+i*N},q+ aÃ"('N lSnG 3MnG=g&t!.>夸JϑR"nQBZFU%\+^uR&lrp<୎m oeW$ u9RL>՛S6F>T7DPH=$S^=SV,u xܫC*A=Ray[hܪl.ڬX%̋s]g#):t i6]_!lKWIQ m#FOCO\/+1Խn(Bƣ*0Yjײen|Xro !wM&3M m^Pdu&].-jȁ$Vpo'Mi%|N!E e{X|@'K֓3 _+}xw:3=:d˞59J'+ 埏<+^:FvѽE{a$fɕ_\Y?\jǃbj89,/w mr .*-U'`/ \LWoB70vѫ|bnwbYM@nҰQ\}fu[N0<}Zy;)t"G/5nF.UguVV%hI^t䋃999 pRg$U֩&E$Y5eH8VWʍw& e+ èsO'7M[v{35WD̝a:fLGFڭȍȅ!㵤  뿚]nM"v/Dܾ[]fN* :7+ 6nOOm FcU-4G~Y*6 F( 9At:!<a0}*դ+.a!3Q}85T,IDV8:()C-$B)؟@-<>hȃETZtG7¡pb6DD$jB:N!taOPF jJ)ԒVi5q(&\TVo]~7z ,IVן.p؀-7]e=+6r}@US7変ä; wryZg&hٱ]ӹo@0"tjZQ ]ijay097;9u,&uwݿ)WվJu!0PAFXe3_f[R-`|rgҐB<Vp=r(W hvTmHyo8`0ܑ((݌>I+` r+O)练[o ?Itbv?&/äT#V9P?/kU_V^~7@'-4PĿRzO'3pTOMV4\p5rZٟ~5D-ʔra/ Mpm^OpdXng]R'q 4H‘Kzf)qVފ:"|l1U\a_ :#cb9_"~=O 5N_89%[\5FRg2LP}j\l/lJ{gj36O9dT>JT 'bf^] Q]ʈc `{oma8Sm('sOq[5vS8KgҪJ(+˱{tnE Tۥ uqYQ y#]i:fPl7?⋿o!PS ejmiQ̧i5٬ᇡvVTĴʔ`򟬝5_Vdg}tN,*./$U)_! nk? ׋;tT>ֹdL^nq9lI}^Z%)wĖ UXt|ak֖!wRyNv;Eb0OСUR*eD@\hz IHCN*+th-r`Ɖ 8-a~Fbx]: []BWJ0 k˦s^wQp.F<%'Դ?(b(ʙd&e33y)&$칂_}/hreץ%C)ι'we<&ie,-ʟ/.hSG#.M>DO?T@ 6uvQ%6d{fvazq.򘢒²mtCIn Ͳ w͔}(zc:<P*;&wLHo MiG|%%bg:L q;2وE@"Dm 0/L\$̽po.p.?ܫ<&28;;W7A!W3!d$ gݼaIRs6>`?'=mOȎ; fhjС&GyK|bR\P[^g5ᥦK^O*7zq`X$V+$)F14;b)_^%hW`@\7k])5SMoͻCfL?@Ybfry*/$F]lKMrp=oUrvB?K9p]}xn,Kdد0d +.>2՜u=Թ,# VƋYp- -{D5oucu"PLcnhH%1d; 'R8L D\'_6Laۃ'$ ^ A@M\=Ad6D ys S2_ ATmtTfс-T, V `ʓءd .GkV^G P!"ܦ30:z[ ⌭ȿê^ty\zI4J$B><yn$D;nji;I(1"[хgrNL&;;F:#6]o@$9i7'T: y;t"ۀ@f<}m%.~e4rO[͍KSZ.'ֻAƇ@?mQe!MqK9wxMVpo2]=a:utcSؖKܚ0ݡMp(7O [>;+2Ҵby Ww\<$«}PX } K® NFb="cyÆ?WRKfsnl4a7t'K CY$DvqgpmR, .`ueYL+zFLd S Ᶎ}hH%Zr0HѝzYx*Eॵ~ծZJT +H{%ަa6+S(&0z *V V'$,A̽[vM'mB77̞( BU=KA|HMT.-q .Xߞgz39| BߤWO*9Fb~ɢ T/^?&ùt8[ao>o <~<@@BthWE};N%#SZR(ۛ}z6pxl!w̜Z9Xz3/gf+RYi%-[s42q((jl>Qb/(EAM]v{Czy?z闄TAH5ȵvRd?E9 !TNv$Wh{mCzyƩb"qhX]KХ:ۅϒ14YApOU{'lKvo'BQզ @Zx:{W|؟GlECZJ}Np ]*Q=Nk09by$P]^H# $ xКlU, '4I*z]"y;?TAa Cry>Vv`jL:"܎cYClJ ƘL 7tij+5}:ql.rnƕ,L羽yb>=*eLKꈉ*em$I&+ Yt]U(<;Қ  7`5&K6{+%UN!ڭxY2Bt*Ȫ{t"40[Bd2BJ 0&Q6J3|RUĢ>G܈lj ,kӑ& 8y9hHKx*B`nE @l!7ڣBǏfhXO4^ߘJgvg=m-F7 '[ǐ\T&uܯV=\ @7K#ZaO='RpvO3yspZ,5T=Ao5RƬ^mw _JvRIav0fkDlԏTP@_{º8e ꭸOS 1mBcbCTE(˰*e0*n\|=FL e)dïU7 ʃ 6(`d)^ռ)>|F E9u9p LTaPКa`4=G'{(#T{ Y*>wtDQ;‰ GBt8RAaOL K$ax&쿟h?-a~1b!7d𬔪/^rK/êVOͯamRh^>4 _!wOS 񰚖·WFcFmgݻzn" >jBA;>jibC)lpj "e'Ӓ\ŦZo/ c)لa|Yb0$Gm>w]޾a??v4FTfgL g%Hfw)ءtG4^EQJ;79m@%n$Sɣ GQYs5mh>b\ .ɲ]䖀KN? jBC_% V`@ چ&B2߅i6-~w 9 6wDϪ_bKdI-qϒEr%[hǾ+Wxx ߄ᩑzזpň"C_msbO/cB L̼FPӸŬnʦH~0170ZKiD`E}Jv7.Atw\Lp_>Šm4CvΝw%vO hUXPtM""d 4yrW!駮w+|v~0k?rn Ժb ڵ-ܖIΑ3RSr4sQvEaecR^C,|;f|i5M)0\Gb\LL_IxsYJ2oz d~q8oY1M"RCS0GЩ dua5Lad:Ca6K@!`U;" 8c@\o2f˾NR[L- B:c$ݝ_v^P%Ly<@b-@tU²!9Ce*>ٍ,t(k s6U5n ~Ly]U[9wZ4m0FZK:J9Y%Pko^ 9d̈u?io}\қH >Lߡt?-ڿ ³gDM! T !Ve u$\V({Ln ՠG`D蟿IJcy]O 2t0NϦYsktXx 9CT U$0!Q>er(>zX~L/s< *!bв;eFqiVw{LOAv ߀vDUҢ4VLjZtV)S)g 88Ku/1q=~ÖQ4-!oLglϦ ۠Y 3r4ZhrgӋ]39 ֆŁʻfa$2I+xc>*KN}dXIkzBhsI1KLцcAd f 6kibF/ ">ZZ{-* B~ Ntu' FBA 6@:\=Q sFBnm IhCW4fm;v:A3{<|HQ!BQͧ<}s=Sכ#j4~^7{bQ;MЀ5W9NAHfF v ADj0veHJ=OfR*JqD tS\2ۑI{[=qvs;eeZ$B 0A-Dfo2|JpR6W%4ՏKGt5iהu)]s2=ՠDW[8+[(4koAg=߂r嶛}ʨ[&$>1фb-iTz<ƚ aSш1'MItEe٭vIC@7)=WHG'R|@ ㇈[SI1,HDO%vx>ABwCrz>˰3hzh;2va103ʛaFBȞHOrc"@1R2H3B H.伔ipZV:-*fPEþ@.b)]N⛘]&ӌOukZ]̷uC)P!8 ~NZt2,ll E6v1c{coׅΐ H(Rk=|3_!5ҷAE6p54R*FP٥2!MH`THt pvSkzbN:+CNyov7JE;˽J{tv3P`8ڄՉʤI|Zd2X}&VR)f% vOWA%P%zGό۵ zx9]JƼU$d] hl+!:1jkyuŌt|SPE7[/m OefKr(r(I))vPJR K>n&V<-B㦋T!{nUo6brVGQj ;)P)l3D4}º YUW'^4]ziʋo2DnHkVIXtIѨݩs+<0EjiKL x(E ZO38w'zA~\]򾦐];4D9Bջ.%HM5j1HbugtpĪ f%Am9֚Yi2>\Q7n^bV+D1T"UYb ?#ŭ-!@wk*oY+dJ'YۏVW ~K gwWŵyy!2r;k H F?˶1aD1*V )R=%(Y|"gڅ//,b;^Sx>t`rO!v{h6*V%=WZpUk};[%E]8t>fx8w'H+L_D`$)1< @jf>3 _zf5h.Ng7Snٝ~;dǐyޜZjg=H-I5ݲ6xm"xM&H!t8\>#3biIVvEk![qO/V4(w!.r}LR_O/JCivE$F08XaIyUܠ<l‡.tjP Mmz_nɾW; CBGF`; u0cVjx#agzFhu+7L1RG:ԥE{ހ]ۛ!0Ft-BBu[G]2'!D4'6*řl#[fMmB ̯?N4N"B@Y%]k7.`)my'bhZ/˵ޞ'|@5|wsT`h5h PcfVIWrY &J^B.wu7uK"+.er?D[+8ygSt[jϑgzN\K*gwuJEBGo0hAvbo[EWy-W\G+^.KPX4*MzbnoM,PL\@ʷ|ƭh6Pd/E+Wo=nMӵJ@fZ>U&8VK;8h P5 d@E9DlCzv[1kAGP?%X5Ň 8*wUI{F͡&aq!Ez6+J-÷kdfԅATNe8YqkĒLiy BB|PRӥqv{q̙}:}I 6kg$ .{g'gIkOCjaAo(͈*(+K;j*%%lݥJ{Q+ysET`M!,a7{`_Rj}3BB2xRS Q7zW[d[ȸ* xw/N {Z#ZM…tA fr5T![V1xzm@!t$Ae @p'W  $Χ!d|ն[-̻I[W.kR3[+Wb<'_wgDZj[s5 {od,9wT"}6)=|]Xs^\.Mf :^Qv, ZeW" T5lxh-E s8},g0,z9dz !.ן,?AR.#)oV(h_m^~ KXI%DTb=r3$~bFsh{ )4GrXrD@$)w&q4`qC)t3dvb>^@B$EHjFO:vэsfk=_,qDR;ir$yb\W[9NSL [ ]/1="]<[drH3JboYf*e׀6;Z!j&{]:-uIUPH8?&`.#qnہ[2FN ſHaArD͉~3so@ؾ.r9)EТao@alK.`5  7R!cn6V zC_!q]xC[mii Z b`eA(WtI}}<;sd45)}ƳPU=^f溊*%4:<xOsza[ruFbeq0òjC I?!:4jF;ŧzU,eB/E@\ԝV!*KamYlqW# !ONA,M:%8B #< tjY7\BO.;&*rf53yb*BWhU#&ȕoFDyx%t pI$]C))=Wr-g rZ`QS@L| )E$Va1jm5_[3Sdܧ7V 2D!C'9-4}50FML}ցZeDOKQx"=ৠXŃ|r?ːHzL&"/k]dA"dv_?km)vA/n՗y.No:$םx{J\vޗ[#gF ))C_3VCDrXrʅ*f'Sת|ݧ݃m`aws] !ވtC|]90׻vl1ή詿~z0g% Iic-P︗Cp6M",ex4яNo#0L2lfJtyW~Pwmh (qyr}͕@va'1#woM4Gpt~5 0B7'8/ոI 8y$uQ(yrGCox 0k72 ;N%nk9 xh/V0 e~!<09hd.j#T*trz'Isf Lu/\ 켿 {qʣQ [vy/?-Xr~WuX֦UjGrǾH@4U^8$]-*9vvqphecbSJ'\\^-tf& <נ<\?{WtZ? o\rR`D J?Iq?Y^ua 0!L!-2WuL*TM޼r v\,JMx&)K=^doYs::{o2:#H]g jX*Hgut7 AnGNuSMP`匥$iʞU!-k`ĎBɣB ܏x %<1߁R'Di~ILv.rSeNo UEb\dX8l(۹?X%p4Fc1 /OI 69=qidIIg_Ș<_S7^\ zXxW6ͽ!VO&bۜ/,@27S%Ϩzց9A^".͜|g۷}2z0#<y|N|?]7D:ǁnQ?\ ɄE5KG&$kG*E Iʩ<ē) mau'̀chW; Y 2A,'=8QqDs lN?NCu3Z+^ޝ<6lFVkO Ft3'!{7F8`Y=ߑ,Eh{w/s jJ. rS&Б^cWk]=bz}|ɏ9gՃn험7 k~(3_7jjV):R $j_݀؁I9U< uAcںHz@+)L_P ֥>v-t\[:]+3XdC#Hv'n=;gk`8,_kS&gڀB8{lzCp4p}ZXH%qD MO`QY9gѴn S˺ M%"Ӄr[o$XD)4Au΋, /rqJ.i%ɶBwJxhk|_&NC{7$D${MEg, ;L^dTgN&d b\j,ero7`G}K<x %7LhyPeG/FH-(g C!`)FS&qK,ƿq0i;$ ˡ{Xi}FJ9N.JZ ̻2ΎV[j%zT0":nnBV>V*kO6>$ t)e/S{sRL y9TZxtݭP7Bj!\7<|(x崊VI)wg/HK} ub+01gՐQGVovΛERk)[l`kʙO% xJ?H T{Fc_? 43B9G4d8 P:ITSZ cQNQּf4=.+,fj Qy)˘R-:4j@]x%0OZFoL]* ?ʞ {į-=2~ޅAݏ=MI)PX ^{u(YӡVIϒ6_g_=֙llnv "ihw5ӣ謊7V;4@xI\( #Z}N} #3T4U5Belh Fy7mXo1[;kcuW l!:<T FBes:m+=a;^U/sj´-@.EӶeᆊ-D5.qu шX;lQ$FYnjr5YH9#6cIbǹLEXbѬ.=6" Zm+&@4I7zWݏ,ΰ8 &+";#7,a6IA $=0 ꒆ14io[wa`0NKlե@+#(KY Y.JohDU/`8O\eGO>Ί-_֣> p ?0li:5N0Lg5*1^.o@2`مg1xa: nTbAUopK%8lW0V~-l_8VzM>5Z0㨎daE&Y9hzAt>HoR>Ҙܕ+Cjm!4'c4%& OV5"Q+5Hx lz1t'ކI ^Da\j@a9jİ Q5K5 aM' /9!&E'c:)amˀ{ CQ84ݶ; u st fIMzlƋOl,gQH_=8;YǛƏS2HN348}ޖ;f{;+Dz[2uqbWgZ 2{]Fa m`spo=} s0H{ کkg _8fܰ2F8̤"Nc5&Rt " g}s'4ʈ|q3GݮLF os BJC!t!>;^%Fm{W7شn9*$| a1Zq*3|@`|j')W:ݚB V\$yN:͜K}ڦoQ( EpvVuG*U_WYn2 >J6y4i(~A̒7I֜JOwZRJbE&[$< ]qqcClD]M/5Q3A ;᎙juŧ+H0x h/Gɉ潢|)'=ǥ - YJc7ex͘ɹ`y JRӕdo(~>Bס)5e_%Wd !Pl8unNTtwnUsA0n_ M &wN(٧P*Tege?^ۊp;`HX "_ȩt-Ϙ~ %)'^# 18 v+t'h= pS>E27ll+v rA^0w΢02ol}C}Rs^T#Ȫ@LȺ!}_<%fvISzJ/bt yqzVc([5z}6&)h eߖ.lL e ]jw QOZIpbEXT& _>wܸӃu*W3MwS_?+:QdBªiMQ!x]3u#pzMVq4mL忼l?۶\hHL1B7pW7yLM櫹^(,= Azrrj/X5nLk0>,=DLS8igʱIT2ȱ=, +7ќgk@>"d XXҤS "WHbNEABs2 t{S @_%thD>w4>Hi3vr K:^k/2b7пTvS%M^fSw.EOΤݏ0߽dgpq>* a8u2'(sΎYC] *xә*? &1KQ+]0@؆MA;}8&FK<9[N,]r#j 3p~OJl /WJ=9)`#TAŹ!Io쏃j舍Mo;rēV ϛ%aۨ5fQd_{U Ųy;sclT>1 K(<\BO1㷕d`}f,@%6v<Ι< 2Ô9^WFսDsaǍbE=%iՎ]\Kٶ8kT1#)lQ^2?DFG;EUѡq6㚾&|~@O m˗ Y^Ð*%z8szb U6f{7gn_5YhՄ6L,;~FW 5|B ߝ KnC'[ |5RƗ%S@C-2[,DFs8͐g a1⹂Kpc-mΣM qA~}`Kjp60ێ.<%R{lisB͟-n?&SC`0'r:i*0zIԹJ \ҨMub-F %OC=J1f1`;˺ ̺YGP{xM )϶ڌq<'RVا{ B#-ϵAIj ӯQ:X|{7KHQr/;Q<TD)L0h.k\ fa튎=k$܇+>jAh.IwXJ=H<` NI|?"ikVI>M^EO"9`[_ =osM1j65`_T1m67bX(78RVr } -ᖇxqS]l5 9vW_%ű*9)*j&ks)7;. %327gP] er;D,Y/e/5>ZhEM ğm@F ʌi`XFC>#+N|ME߷gz ~ 86*%A)jӱV%b~i~`nױR&sm `P~#Z)t{{y7/o4O@B%OW;^}>>J8^H<*B!`m;k..l/3ne 7c] $B` lpCgVA* |D{M V=#?SVQ2ߙu+y`}IuoSdB sW\x GQ6^ !nzϟ2_,׮{BW !qi,i}]F }Ȧ^҂tmpfvC g;J^^V(= ~}6N%j!5 #i]z}m+^Ծ&$qt!2=BS0&m؆&_IFE=2y=@&p/|b=h V€4aqgWsߌ3O"Gs7=M|jROS偧$b42V}!a>7 xTZruq't`FCFa~΂84(11fkpI%$ZN)u#X}?(6˝ WG\+Pď8t/Szo7gۃM+q|k|qĦ8mW!a{˥ u)D8;z; UTYQ.ÓrWF 0mW/㌫󚘤Bϛᶝ<6ɞ=\ɞYjU&v *hإdb%)15jfb!L+buL:*81j:h%6|h&crIa-iB,x}{Q"re%fYŝ5"j07mvM{3#@4~=v(PA ONQk3f_,+PkJ(lNH+5yݵ_DgYd8ō܃!1-jp^l'ޅ#R<&V8y&7WX}ṵ}Cw\dKǔ"@=a.SIvUaN6k6M0:g:s rvIwC"meWfn4xB&@KANf*M4kO ޽] ^LC B@N$6 _J`QA^L sB+ OW-WI^OIU&? KaöuGTDS&UT5V}(pI_WYMBS-ZUR<49f#? ._# U [Wij4=  =  CTy~SD.BCKXI[SYSEXE.SOURCE.SD]SD.HLP;5L-@*[SYSEXE.SOURCE.SD]SD.HLP;5+,X.-/ 4L-*-I0123KPWO+561B7HoW89BiGHJ1 SDKSD is a powerful and flexible alternative to the DCL command "SET DEFAULT".It has the capability toC . quickly set default to the default login directory (SYS$LOGIN);F . set default to logical directory names, wildcarded directory names) and complex directory specifications;L . store a history of "visited" directories in a "Last In First Out" (LIFO) directory stack;> . set default to any given directory in the directory stack;0 . display the contents of the directory stack;, . allow different styles of stack display;3 . manipulate the contents of the directory stack;0 . set the maximum size of the directory stack;& . re-initialize the directory stack;H . write the directory stack to a disk file for later re-loading of the stack;H . read a previously dumped directory stack from a disk file to re-load the stack;G . change the session prompt to reflect the current default directory;I . allow flexible specification of the format of the new session prompt;I . provide direct access to this help information from the command line;Format:. $ SD [directory_spec [, directory_spec ...]] or $ SD option2 Directory_SpecsHA directory_spec can be any valid VMS directory specification or anyHvalid relative VMS directory specification with or without squareHbrackets, with the exception of any specification which ends with theminus sign ("-").HStandard VMS wildcarding is allowed. When wildcards are used, the firstHvalid directory name to match is used. Note that empty directories are%NEVER matched when using wildcarding.3Examples of valid VMS directory specifications are: D_J:[JEREMY] [JULIE] [XFILES.TRIAL_DATA]% [URSULA.FUN_AND_*] ! Wildcard.) LAB_SYSTEM: ! Logical name.GExamples of valid relative VMS directory specifications used in SD are:> [.TRIAL_DATA] ! Square brackets are optional here.B .TEST.DONUT.SPICY ! Optional square brackets omitted here.< .FUN_AND_* ! Wildcard and no square brackets.I [--] ! Must have square brackets when ending in "-".; -.SURFER ! No square brackets needed here.E [...BAMBI] ! First occurence of a BAMBI sub-directory.G ...SAVE...RAW_DATA* ! First occurence of a sub-directory startingK ! with RAW_DATA under first SAVE sub-directory.HSD allows valid directory_specs to be specified as a comma-separatedHlist to be successively expanded in order so as to create a path to a%given target directory. For example, LAB_SYSTEM:,.SOURCE.GUIHwhere LAB_SYSTEM: is a logical name which cannot syntactically haveHsub-directory specifications added to it, yet it points to a directorywhich contains sub-directories.2 Logical_NamesHSD uses a number of logical names to determine its actions. SomeHlogical names have corresponding commands which allow you to change theHlogicals from SD using the command line, or you can explicitly DEFINE orHDEASSIGN them from DCL. Other logical names can only be explicitlyHchanged from DCL. In no case is any logical required for SD to function"- all logical names have defaults.&SD_STACK_STYLE (default ABSOLUTE)H The stack used by SD can be one of two types: ABSOLUTE (or its synonymH FIXED), or RELATIVE (or its synonym SLIDING). This logical name must be one of these four values.H An ABSOLUTE stack has its slots numbered in ascending order startingH from 1, and continuing beyond the size of the stack such that anyH given entry will always retain the same slot number. This allows youH to use a given valid slot number and be assured of getting the same directory each time.H A RELATIVE stack has its slots numbered in ascending order startingH from 1, and continuing up to (but not exceeding) the size of the stackH such that any given entry will retain the same slot number until theH stack is full, at which point, slot numbers for particular entries4 will change as new entries are added to the stack.8SD_STACK_SIZE (default 20, minimum 2, maximum 200)H This logical name is an integer value which determines the number ofE slots in the stack. One slot corresponds with one directory entry.#SD_UPDATE_PROMPT (default FALSE)H This logical name is a boolean value (TRUE or FALSE) which determinesH if the session prompt will be updated to reflect the current  defaultH directory. The update prompt function is ignored if specified in a non-interactive process.BSD_PROMPT_HEAD (default "", i.e. empty; maximum 8 characters)H If the session prompt is being updated, this logical name is a literal1 string value which is pre-pended to the prompt.LSD_PROMPT_TAIL (default " ", i.e. a single space; maximum 6 characters)H If the session prompt is being updated, this logical name is a literal/ string value which is appended to the prompt."SD_PROMPT_FORMAT (default LEFT)H If the session prompt is being updated, this logical name is eitherH CENTRE or LEFT. If the length of the name of the current defaultH directory causes the prompt length to exceed its maximum, charactersH will be removed from the directory name to make the prompt no moreH than the maximum length. These characters may be removed either fromH the centre of the name or the left of the name. They are replaced by an asterisk ("*").7SD_MAX_PROMPT_SIZE (default 32, minimum 2, maximum 32)H If the session prompt is being updated, this logical name is an: integer value which is the maximum length of the prompt."SD_UNDO_IF_ERROR (default TRUE)H This logical name is a boolean value (TRUE or FALSE) which determinesH if the current default directory is set back to its original locationH if an error occurs in the expansion of a complex directory specification.DSD_INPUT_FILE (default SD_INPUT_FILE.DAT in current directory)H This logical name is a literal string value which is the filenameH specification of the file which will be used to read input directoryF specifications (one per line) to be loaded into the directory stack.ESD_OUTPUT_FILE (default SD_OUTPUT_FILE.DAT in current directory)H This logical name is a literal string value which is the filenameH specification of the file which will be used to write output directoryH specifications (one per line) currently loaded in the directory stack.#SD_QUIET (default FALSE)H This logical name is a boolean value (TRUE or FALSE) which determinesH if the new default directory name is displayed when you change default directory.2 Usage_SummaryJSquare brackets ("[]") below indicate optional items. TOS = Top-Of-Stack,;CDD = Current Default Directory, MFD = Main File Directory.9SD ! Set default to SYS$LOGIN2SD \ ! Swap CDD with TOS:SD \slot_number ! Swap CDD with slot_numberISD \-slot_count ! Swap CDD with slot slot_count slots downDSD ~user ! Set default to user's login default;SD [disk:]^ ! Set default to MFD of diskJSD ` ! Set default to next directory up the tree,SD ? [subtopic] ! Online help9SD /A ! Display stack attributesLSD /B [slot_count] ! Pop stack back slot_count slots (default 1),SD /C ! Display CDDJSD /E [value] ! Display/change undo expansion errors flag,SD /H [subtopic] ! Online help,SD /? [subtopic] ! Online helpGSD /L ! List CDD (indicated by "->") and stack>SD /O slot_number ! Overwrite stack slot with CDDGSD /P [slot_number] ! Pop stack to slot_number (default TOS)LSD /Q [value] ! Display/change if new CDD will be displayedJSD /R [input_file] ! Read file & load directory specificationsASD /S slot_number slot_number ! Swap contents of two stack slotsESD /T [value] ! Display/change the type of the stackBSD /U [value] ! Display/change update prompt flag=SD /W [output_file] ! Write stack contents to file7SD /Z ! Zero (reset) the stack 2 Options5SD can take from zero to three parameters as options.HAn option can be one of the characters "\", "~", "^", "`" or "?", or a-qualifier style of option as described below.HIf no parameter is supplied, the default login directory (SYS$LOGIN)4becomes the current default directory. For example, $ SDHBackslash ("\") means that the directory stored on the top of the stackHshould be made the current default directory and the current defaultHdirectory should be stored on the top of the stack, i.e., swap them. For example, $ SD \HBackslash ("\") can be immediately followed by a single slot number.HThis means that the directory stored in the given slot number in theHstack should be made the current default directory and the currentHdefault directory should be stored in the given slot number of the%stack, i.e., swap them. For example,K $ SD \5 ! Swap with directory in slot number 5 in the stack.HBackslash ("\") can also be immediately followed by a single negativeHnumber. This means that the directory stored in the slot which is thatHnumber of slots down in the stack should be made the current defaultHdirectory and the current default directory should be stored in thatHslot of the stack, i.e., swap them. The top-of-stack is always -1. Forexample,G $ SD \-7 ! Swap with directory 7 slots down in the stack.HTilde ("~") means that the default login directory of the user whoseHusername follows the tilde should be made the current default directory.>This function is restricted to privileged users! For example, $ SD ~CHARLIEHCircumflex ("^") means that the Main File Directory (MFD), i.e.H[000000], of the current or specified disk should be made the current default directory. For example,D $ SD ^ ! Set default to the MFD of the current disk.< $ SD D_9:^ ! Set default to the MFD of disk D_9.HBack-quote ("`") means to go one subdirectory up the tree of the currentHposition in the directory tree. For example, (assume a current defaultHdirectory in each of the following examples of D_Z:[ZENA.DATA.RAT.BIG]):; $ SD ` ! Set default to D_Z:[ZENA.DATA.RAT]7 $ SD `` ! Set default to D_Z:[ZENA.DATA]@ $ SD ``.CAT.SLOW ! Set default to D_Z:[ZENA.DATA.CAT.SLOW]HQuestion mark ("?") means provide online help. You may specify a validHHelp subtopic for quicker access to information you require. Forexample,9 $ SD ? ! The full help file entry.H $ SD ? usage_summary ! Just the entry entitled "Usage_Summary"./AH The A option causes all stack Attributes to be displayed. For example, $ SD /A/B [slot_count]H The B option causes the stack to be popped Back either to the currentH top-of-stack, or, if the optional slot_count is provided, by the givenH number of slots. The current default directory is set to the contentsH of the final slot popped. All intervening slots in the stack are discarded.K $ SD /B ! Pop to the top-of-stack (same as "/B 1" and "/P").I $ SD /B 7 ! Pop back 7 slots in the stack (same as "/P -7")./CH The C option causes the current default directory to be displayed.E This is equivalent to the DCL command "SHOW DEFAULT". For example, $ SD /C /E [value]H The E option causes the state of the undoing of Expansion Errors flagH to be displayed, or, if a valid value for the flag is supplied, forH the flag to be changed to that value. The value must be either TRUE or FALSE. For example,H $ SD /E ! Show whether expansion errors will be undone.B $ SD /E TRUE ! Ensure expansion errors will be undone. /H [subtopic] /? [subtopic]H The H option (for which the question mark ("?") is a synonym) causesH this Help information to be displayed online. The same action can beH caused by use of the question mark ("?") as a parameter. You mayH specify a valid Help subtopic for quicker access to information you require. For example,- $ SD /H ! Display online help.- $ SD /? ! Display online help.- $ SD ? ! Display online help.K $ SD /? usage ! Display the Usage_Summary subtopic in online help./LH The L option Lists the current default directory (indicated by "->")H and all used stack slots from the top-of-stack down by slot number. For example, $ SD /L/O slot_numberH The O option causes the the contents of the given stack slot to beH Overwritten with the current default directory. The current default* directory is not affected. For example, $ SD /O 8/P [slot_number]H The P option causes the stack to be Popped either to the currentH top-of-stack, or, if the optional slot_number is provided, to theH given slot number. The current default directory is set to theH contents of the final slot popped. All intervening slots in the stackH are discarded. The optional slot_number can be a single negativeH number. This means that the directory stored in the slot which isH that number of slots down in the stack should be made the currentH default directory and all intervening slots should be popped from the$ stack and discarded. For example,1 $ SD /P ! Pop to the top-of-stack.; $ SD /P 7 ! Pop to slot number 7 in the stack.K $ SD /P -7 ! Pop to 7 slots down in the stack (same as "/B 7"). /Q [value]H The Q (Quiet) option will either report whether new default directoryH names are to be displayed, or, if a valid value is supplied, cause newH directory names to be displayed or not, as indicated, thereafter. The3 value must be either TRUE or FALSE. For example,F $ SD /Q ! Show if new default dir names are displayedD $ SD /Q TRUE ! New default dir names are to be displayed/R [input_file]H The R option causes a file containing directory specifications, oneH per line, to be Read and for the stack to be loaded with theseH specifications in the order they are read. The current defaultH directory is not affected. An optional input filename may beH specified. If no filename is specified, SD uses the filenameH specified by the logical name SD_INPUT_FILE. If this is not defined,H SD uses the file called SD_INPUT_FILE.DAT in the current directory. For example, $ SD /R $ SD /R MY_DIR_LIST.SAVE/S slot_number slot_numberH The S option causes the contents of the two stack slots to be swapped.> The current default directory is not affected. For example,> $ SD /S 5 11 ! Swap the contents of slots 5 and 11. /T [value]H The T option causes the type of the stack (ABSOLUTE or RELATIVE) to beH displayed, or, if a valid value for the stack type is supplied, for: the stack type to be changed to that type. For example,6 $ SD /T ! Display current stack type.@ $ SD /T ABSOLUTE ! Make the current stack type ABSOLUTE. /U [value]H The U option causes the state of the Update prompt flag to beH displayed, or, if a valid value for the flag is supplied, for the flagH to be changed to that value. Whenever the flag is displayed orH changed, the current prompt is updated accordingly. The value must be% either TRUE or FALSE. For example, I $ SD /U ! Show whether prompt will be updated and updateF ! the current prompt if updating is enabled.H $ SD /U TRUE ! Set Update prompt flag and update the prompt./W [output_file]H The W option causes a file to be Written which contains the directoryH specifications in the stack, one per line in order. The currentH default directory is not affected. An optional output filename may beH specified. If no filename is specified, SD uses the filenameH specified by the logical name SD_OUTPUT_FILE. If this is not defined,H SD uses the file called SD_OUTPUT_FILE.DAT in the current directory. For example, $ SD /W# $ SD /W END_SESSION_DIRS.SAVEp/ZH The Z option causes the stack to be Zeroed (i.e., completely reset).> The current default directory is not affected. For example, $ SD /Z 2 ExamplesB 1. Set current default directory to the default login directory. $ SD D_R:[REBECCA]i $o, 2. Display online help about the L option.L $ SD ? /L ! Note the full option (including forward slash) is needed. SD /LJ The L option Lists the current default directory (indicated by "->")J and all used stack slots from the top-of-stack down by slot number. For example, $ SD /L Topic? $J 3. Use the L option to list the current default directory and the stack. $ SD /Lt -> D_R:[REBECCA.AEROBICS]c" 2: D_R:[REBECCA.FITNESS.RESULTS] 1: D_R:[REBECCA] $h@ 4. Set the current default directory to a specified directory.0 (Use stack from example immediately above.)5 $ SD -.SWIMMERS.ATEAM ! Do the SD.A D_R:[REBECCA.SWIMMERS.ATEAM]@ $ SD /L ! List the stack again.! -> D_R:[REBECCA.SWIMMERS.ATEAM]  3: D_R:[REBECCA.AEROBICS]r" 2: D_R:[REBECCA.FITNESS.RESULTS] 1: D_R:[REBECCA] $ J 5. S %et the current default directory to the most recently used directoryE (the top-of-stack) and save the current default directory to the  top-of-stack.E $ SD /L ! First just list the stack.  -> D_R:[REBECCA.AEROBICS]M" 2: D_R:[REBECCA.FITNESS.RESULTS] 1: D_R:[REBECCA]7 $ SD \ ! Do the swap.  D_R:[REBECCA.FITNESS.RESULTS]s@ $ SD /L ! List the stack again." -> D_R:[REBECCA.FITNESS.RESULTS] 2: D_R:[REBECCA.AEROBICS]d 1: D_R:[REBECCA] $tI 6. Set the current default directory to the directory used "3 SDs ago"..: $ SD /L ! List the stack.! -> D_R:[REBECCA.SWIMMERS.CTEAM]s! 5: D_R:[REBECCA.SWIMMERS.BTEAM]o! 4: D_R:[REBECCA.SWIMMERS.ATEAM]s 3: D_R:[REBECCA.AEROBICS]a" 2: D_R:[REBECCA.FITNESS.RESULTS] 1: D_R:[REBECCA]F $ SD \-3 ! Swap with directory 3 back. D_R:[REBECCA.AEROBICS] t@ $ SD /L ! List the stack again. -> D_R:[REBECCA.AEROBICS]m! 5: D_R:[REBECCA.SWIMMERS.BTEAM]n! 4: D_R:[REBECCA.SWIMMERS.ATEAM]L! 3: D_R:[REBECCA.SWIMMERS.CTEAM]e" 2: D_R:[REBECCA.FITNESS.RESULTS] 1: D_R:[REBECCA] $% 7. Enable the prompt to be updated. G $ SD /C ! Simply see where we are now.IK D_R:[REBECCA.AEROBICS] ! This is our current default dir.eB $ SD /U TRUE ! Enable prompt updating.' %SD-I-UPDATE, Prompt will be updated.,G D_R:[REBECCA.AEROBICS] ! This is now the new prompt !n4 8. With prompt updating enabled, change directory.L D_R:[REBECCA.AEROBICS] SD /A ! Check what SD attributes are set. SD Directory stack attributes: Stack size: 20l Stack limit: 200 Stack style: ABSOLUTE  Stack usage: 5 slots.  Slot range: 1 to 5t Undo errors: TRUEu Update Prompt: TRUEy Prompt format: LEFTl Prompt head: Default.c Prompt tail: Default.s Max Prompt size: 32iE D_R:[REBECCA.AEROBICS] SD .HUFFNPUFF.FAST ! SD to new directory.K *BECCA.AEROBICS.HUFFNPUFF.FAST] ! *This* is now the prompt !nK 9. Change the maximum prompt size from the default (32) to 20 characters.OK *BECCA.AEROBICS.HUFFNPUFF.FAST] DEFINE SD_MAX_PROMPT_SIZE 20 ! Set size.tL *BECCA.AEROBICS.HUFFNPUFF.FAST] SD /U TRUE ! Update it.' %SD-I-UPDATE, Prompt will be updated.u *CS.HUFFNPUFF.FAST]uI 10. Change directory using a complex directory specification involving aeG logical name. (Logical names may be defined by the user or by the,A system). (In this example, prompt updating is NOT enabled.)iF $ DEFINE FINANCE D_S:[SCOTTY.PRIVATE.FINANCE] ! Define logical name $ DIRECTORY FINANCE:( Directory D_S:[SCOTTY.PRIVATE.FINANCE] BANK.DIR;1 Total of 1 file. $ SD FINANCE:,.BANK.ANZb' D_S:[SCOTTY.PRIVATE.FINANCE.BANK.ANZ]r $ ring value which is appended to the pr' G,~SD.BCKXI[SYSEXE.SOURCE.SD]SD.HLP;5L-|*[SYSEXE.SOURCE.SD]SD.HLP;5+,X.-/ 4L-*-I0123KPWO+561B7HoW89BiGHJ1 SDKSD is a powerful and flexible alternative to the DCL command "SET DEFAULT".It has the capability toC . quickly set default to the default login directory (SYS$LOGIN);F . set default to logical directory names, wildcarded directory names) and complex directory specifications;L . store a history of "visited" directories in a "Last In First Out" (LIFO) directory stack;> . set default to any given directory in the directory stack;0 . display the contents of the directory stack;, . allow different styles of stack display;3 . manipulate the contents of the directory stack;0 . set the maximum size of the directory stack;& . re-initialize the directory stack;H . write the directory stack to a disk file for later re-loading of the stack;H . read a previously dumped directory stack from a disk file to re-load the stack;G . change the session prompt to reflect the current default directory;I . allow flexible specification of the format of the new session prompt;I . provide direct access to this help information from the command line;Format:. $ SD [directory_spec [, directory_spec ...]] or $ SD option2 Directory_SpecsHA directory_spec can be any valid VMS directory specification or anyHvalid relative VMS directory specification with or without squareHbrackets, with the exception of any specification which ends with theminus sign ("-").HStandard VMS wildcarding is allowed. When wildcards are used, the firstHvalid directory name to match is used. Note that empty directories are%NEVER matched when using wildcarding.3Examples of valid VMS directory specifications are: D_J:[JEREMY] [JULIE] [XFILES.TRIAL_DATA]% [URSULA.FUN_AND_*] ! Wildcard.) LAB_SYSTEM: ! Logical name.GExamples of valid relative VMS directory specifications used in SD are:> [.TRIAL_DATA] ! Square brackets are optional here.B .TEST.DONUT.SPICY ! Optional square brackets omitted here.< .FUN_AND_* ! Wildcard and no square brackets.I [--] ! Must have square brackets when ending in "-".; -.SURFER ! No square brackets needed here.E [...BAMBI] ! First occurence of a BAMBI sub-directory.G ...SAVE...RAW_DATA* ! First occurence of a sub-directory startingK ! with RAW_DATA under first SAVE sub-directory.HSD allows valid directory_specs to be specified as a comma-separatedHlist to be successively expanded in order so as to create a path to a%given target directory. For example, LAB_SYSTEM:,.SOURCE.GUIHwhere LAB_SYSTEM: is a logical name which cannot syntactically haveHsub-directory specifications added to it, yet it points to a directorywhich contains sub-directories.2 Logical_NamesHSD uses a number of logical names to determine its actions. SomeHlogical names have corresponding commands which allow you to change theHlogicals from SD using the command line, or you can explicitly DEFINE orHDEASSIGN them from DCL. Other logical names can only be explicitlyHchanged from DCL. In no case is any logical required for SD to function"- all logical names have defaults.&SD_STACK_STYLE (default ABSOLUTE)H The stack used by SD can be one of two types: ABSOLUTE (or its synonymH FIXED), or RELATIVE (or its synonym SLIDING). This logical name must be one of these four values.H An ABSOLUTE stack has its slots numbered in ascending order startingH from 1, and continuing beyond the size of the stack such that anyH given entry will always retain the same slot number. This allows youH to use a given valid slot number and be assured of getting the same directory each time.H A RELATIVE stack has its slots numbered in ascending order startingH from 1, and continuing up to (but not exceeding) the size of the stackH such that any given entry will retain the same slot number until theH stack is full, at which point, slot numbers for particular entries4 will change as new entries are added to the stack.8SD_STACK_SIZE (default 20, minimum 2, maximum 200)H This logical name is an integer value which determines the number ofE slots in the stack. One slot corresponds with one directory entry.#SD_UPDATE_PROMPT (default FALSE)H This logical name is a boolean value (TRUE or FALSE) which determinesH if the session prompt will be updated to reflect the current  defaultH directory. The update prompt function is ignored if specified in a non-interactive process.BSD_PROMPT_HEAD (default "", i.e. empty; maximum 8 characters)H If the session prompt is being updated, this logical name is a literal1 string value which is pre-pended to the prompt.LSD_PROMPT_TAIL (default " ", i.e. a single space; maximum 6 characters)H If the session prompt is being updated, this logical name is a literal/ string value which is appended to the prompt."SD_PROMPT_FORMAT (default LEFT)H If the session prompt is being updated, this logical name is eitherH CENTRE or LEFT. If the length of the name of the current defaultH directory causes the prompt length to exceed its maximum, charactersH will be removed from the directory name to make the prompt no moreH than the maximum length. These characters may be removed either fromH the centre of the name or the left of the name. They are replaced by an asterisk ("*").7SD_MAX_PROMPT_SIZE (default 32, minimum 2, maximum 32)H If the session prompt is being updated, this logical name is an: integer value which is the maximum length of the prompt."SD_UNDO_IF_ERROR (default TRUE)H This logical name is a boolean value (TRUE or FALSE) which determinesH if the current default directory is set back to its original locationH if an error occurs in the expansion of a complex directory specification.DSD_INPUT_FILE (default SD_INPUT_FILE.DAT in current directory)H This logical name is a literal string value which is the filenameH specification of the file which will be used to read input directoryF specifications (one per line) to be loaded into the directory stack.ESD_OUTPUT_FILE (default SD_OUTPUT_FILE.DAT in current directory)H This logical name is a literal string value which is the filenameH specification of the file which will be used to write output directoryH specifications (one per line) currently loaded in the directory stack.#SD_QUIET (default FALSE)H This logical name is a boolean value (TRUE or FALSE) which determinesH if the new default directory name is displayed when you change default directory.2 Usage_SummaryJSquare brackets ("[]") below indicate optional items. TOS = Top-Of-Stack,;CDD = Current Default Directory, MFD = Main File Directory.9SD ! Set default to SYS$LOGIN2SD \ ! Swap CDD with TOS:SD \slot_number ! Swap CDD with slot_numberISD \-slot_count ! Swap CDD with slot slot_count slots downDSD ~user ! Set default to user's login default;SD [disk:]^ ! Set default to MFD of diskJSD ` ! Set default to next directory up the tree,SD ? [subtopic] ! Online help9SD /A ! Display stack attributesLSD /B [slot_count] ! Pop stack back slot_count slots (default 1),SD /C ! Display CDDJSD /E [value] ! Display/change undo expansion errors flag,SD /H [subtopic] ! Online help,SD /? [subtopic] ! Online helpGSD /L ! List CDD (indicated by "->") and stack>SD /O slot_number ! Overwrite stack slot with CDDGSD /P [slot_number] ! Pop stack to slot_number (default TOS)LSD /Q [value] ! Display/change if new CDD will be displayedJSD /R [input_file] ! Read file & load directory specificationsASD /S slot_number slot_number ! Swap contents of two stack slotsESD /T [value] ! Display/change the type of the stackBSD /U [value] ! Display/change update prompt flag=SD /W [output_file] ! Write stack contents to file7SD /Z ! Zero (reset) the stack 2 Options5SD can take from zero to three parameters as options.HAn option can be one of the characters "\", "~", "^", "`" or "?", or a-qualifier style of option as described below.HIf no parameter is supplied, the default login directory (SYS$LOGIN)4becomes the current default directory. For example, $ SDHBackslash ("\") means that the directory stored on the top of the stackHshould be made the current default directory and the current defaultHdirectory should be stored on the top of the stack, i.e., swap them. For example, $ SD \HBackslash ("\") can be immediately followed by a single slot number.HThis means that the directory stored in the given slot number in theHstack should be made the current default directory and the currentHdefault directory should be stored in the given slot number of the%stack, i.e., swap them. For example,K $ SD \5 ! Swap with directory in slot number 5 in the stack.HBackslash ("\") can also be immediately followed by a single negativeHnumber. This means that the directory stored in the slot which is thatHnumber of slots down in the stack should be made the current defaultHdirectory and the current default directory should be stored in thatHslot of the stack, i.e., swap them. The top-of-stack is always -1. Forexample,G $ SD \-7 ! Swap with directory 7 slots down in the stack.HTilde ("~") means that the default login directory of the user whoseHusername follows the tilde should be made the current default directory.>This function is restricted to privileged users! For example, $ SD ~CHARLIEHCircumflex ("^") means that the Main File Directory (MFD), i.e.H[000000], of the current or specified disk should be made the current default directory. For example,D $ SD ^ ! Set default to the MFD of the current disk.< $ SD D_9:^ ! Set default to the MFD of disk D_9.HBack-quote ("`") means to go one subdirectory up the tree of the currentHposition in the directory tree. For example, (assume a current defaultHdirectory in each of the following examples of D_Z:[ZENA.DATA.RAT.BIG]):; $ SD ` ! Set default to D_Z:[ZENA.DATA.RAT]7 $ SD `` ! Set default to D_Z:[ZENA.DATA]@ $ SD ``.CAT.SLOW ! Set default to D_Z:[ZENA.DATA.CAT.SLOW]HQuestion mark ("?") means provide online help. You may specify a validHHelp subtopic for quicker access to information you require. Forexample,9 $ SD ? ! The full help file entry.H $ SD ? usage_summary ! Just the entry entitled "Usage_Summary"./AH The A option causes all stack Attributes to be displayed. For example, $ SD /A/B [slot_count]H The B option causes the stack to be popped Back either to the currentH top-of-stack, or, if the optional slot_count is provided, by the givenH number of slots. The current default directory is set to the contentsH of the final slot popped. All intervening slots in the stack are discarded.K $ SD /B ! Pop to the top-of-stack (same as "/B 1" and "/P").I $ SD /B 7 ! Pop back 7 slots in the stack (same as "/P -7")./CH The C option causes the current default directory to be displayed.E This is equivalent to the DCL command "SHOW DEFAULT". For example, $ SD /C /E [value]H The E option causes the state of the undoing of Expansion Errors flagH to be displayed, or, if a valid value for the flag is supplied, forH the flag to be changed to that value. The value must be either TRUE or FALSE. For example,H $ SD /E ! Show whether expansion errors will be undone.B $ SD /E TRUE ! Ensure expansion errors will be undone. /H [subtopic] /? [subtopic]H The H option (for which the question mark ("?") is a synonym) causesH this Help information to be displayed online. The same action can beH caused by use of the question mark ("?") as a parameter. You mayH specify a valid Help subtopic for quicker access to information you require. For example,- $ SD /H ! Display online help.- $ SD /? ! Display online help.- $ SD ? ! Display online help.K $ SD /? usage ! Display the Usage_Summary subtopic in online help./LH The L option Lists the current default directory (indicated by "->")H and all used stack slots from the top-of-stack down by slot number. For example, $ SD /L/O slot_numberH The O option causes the the contents of the given stack slot to beH Overwritten with the current default directory. The current default* directory is not affected. For example, $ SD /O 8/P [slot_number]H The P option causes the stack to be Popped either to the currentH top-of-stack, or, if the optional slot_number is provided, to theH given slot number. The current default directory is set to theH contents of the final slot popped. All intervening slots in the stackH are discarded. The optional slot_number can be a single negativeH number. This means that the directory stored in the slot which isH that number of slots down in the stack should be made the currentH default directory and all intervening slots should be popped from the$ stack and discarded. For example,1 $ SD /P ! Pop to the top-of-stack.; $ SD /P 7 ! Pop to slot number 7 in the stack.K $ SD /P -7 ! Pop to 7 slots down in the stack (same as "/B 7"). /Q [value]H The Q (Quiet) option will either report whether new default directoryH names are to be displayed, or, if a valid value is supplied, cause newH directory names to be displayed or not, as indicated, thereafter. The3 value must be either TRUE or FALSE. For example,F $ SD /Q ! Show if new default dir names are displayedD $ SD /Q TRUE ! New default dir names are to be displayed/R [input_file]H The R option causes a file containing directory specifications, oneH per line, to be Read and for the stack to be loaded with theseH specifications in the order they are read. The current defaultH directory is not affected. An optional input filename may beH specified. If no filename is specified, SD uses the filenameH specified by the logical name SD_INPUT_FILE. If this is not defined,H SD uses the file called SD_INPUT_FILE.DAT in the current directory. For example, $ SD /R $ SD /R MY_DIR_LIST.SAVE/S slot_number slot_numberH The S option causes the contents of the two stack slots to be swapped.> The current default directory is not affected. For example,> $ SD /S 5 11 ! Swap the contents of slots 5 and 11. /T [value]H The T option causes the type of the stack (ABSOLUTE or RELATIVE) to beH displayed, or, if a valid value for the stack type is supplied, for: the stack type to be changed to that type. For example,6 $ SD /T ! Display current stack type.@ $ SD /T ABSOLUTE ! Make the current stack type ABSOLUTE. /U [value]H The U option causes the state of the Update prompt flag to beH displayed, or, if a valid value for the flag is supplied, for the flagH to be changed to that value. Whenever the flag is displayed orH changed, the current prompt is updated accordingly. The value must be% either TRUE or FALSE. For example, I $ SD /U ! Show whether prompt will be updated and updateF ! the current prompt if updating is enabled.H $ SD /U TRUE ! Set Update prompt flag and update the prompt./W [output_file]H The W option causes a file to be Written which contains the directoryH specifications in the stack, one per line in order. The currentH default directory is not affected. An optional output filename may beH specified. If no filename is specified, SD uses the filenameH specified by the logical name SD_OUTPUT_FILE. If this is not defined,H SD uses the file called SD_OUTPUT_FILE.DAT in the current directory. For example, $ SD /W# $ SD /W END_SESSION_DIRS.SAVEp/ZH The Z option causes the stack to be Zeroed (i.e., completely reset).> The current default directory is not affected. For example, $ SD /Z 2 ExamplesB 1. Set current default directory to the default login directory. $ SD D_R:[REBECCA]i $o, 2. Display online help about the L option.L $ SD ? /L ! Note the full option (including forward slash) is needed. SD /LJ The L option Lists the current default directory (indicated by "->")J and all used stack slots from the top-of-stack down by slot number. For example, $ SD /L Topic? $J 3. Use the L option to list the current default directory and the stack. $ SD /Lt -> D_R:[REBECCA.AEROBICS]c" 2: D_R:[REBECCA.FITNESS.RESULTS] 1: D_R:[REBECCA] $h@ 4. Set the current default directory to a specified directory.0 (Use stack from example immediately above.)5 $ SD -.SWIMMERS.ATEAM ! Do the SD.A D_R:[REBECCA.SWIMMERS.ATEAM]@ $ SD /L ! List the stack again.! -> D_R:[REBECCA.SWIMMERS.ATEAM]  3: D_R:[REBECCA.AEROBICS]r" 2: D_R:[REBECCA.FITNESS.RESULTS] 1: D_R:[REBECCA] $ J 5. S %et the current default directory to the most recently used directoryE (the top-of-stack) and save the current default directory to the  top-of-stack.E $ SD /L ! First just list the stack.  -> D_R:[REBECCA.AEROBICS]M" 2: D_R:[REBECCA.FITNESS.RESULTS] 1: D_R:[REBECCA]7 $ SD \ ! Do the swap.  D_R:[REBECCA.FITNESS.RESULTS]s@ $ SD /L ! List the stack again." -> D_R:[REBECCA.FITNESS.RESULTS] 2: D_R:[REBECCA.AEROBICS]d 1: D_R:[REBECCA] $tI 6. Set the current default directory to the directory used "3 SDs ago"..: $ SD /L ! List the stack.! -> D_R:[REBECCA.SWIMMERS.CTEAM]s! 5: D_R:[REBECCA.SWIMMERS.BTEAM]o! 4: D_R:[REBECCA.SWIMMERS.ATEAM]s 3: D_R:[REBECCA.AEROBICS]a" 2: D_R:[REBECCA.FITNESS.RESULTS] 1: D_R:[REBECCA]F $ SD \-3 ! Swap with directory 3 back. D_R:[REBECCA.AEROBICS] t@ $ SD /L ! List the stack again. -> D_R:[REBECCA.AEROBICS]m! 5: D_R:[REBECCA.SWIMMERS.BTEAM]n! 4: D_R:[REBECCA.SWIMMERS.ATEAM]L! 3: D_R:[REBECCA.SWIMMERS.CTEAM]e" 2: D_R:[REBECCA.FITNESS.RESULTS] 1: D_R:[REBECCA] $% 7. Enable the prompt to be updated. G $ SD /C ! Simply see where we are now.IK D_R:[REBECCA.AEROBICS] ! This is our current default dir.eB $ SD /U TRUE ! Enable prompt updating.' %SD-I-UPDATE, Prompt will be updated.,G D_R:[REBECCA.AEROBICS] ! This is now the new prompt !n4 8. With prompt updating enabled, change directory.L D_R:[REBECCA.AEROBICS] SD /A ! Check what SD attributes are set. SD Directory stack attributes: Stack size: 20l Stack limit: 200 Stack style: ABSOLUTE  Stack usage: 5 slots.  Slot range: 1 to 5t Undo errors: TRUEu Update Prompt: TRUEy Prompt format: LEFTl Prompt head: Default.c Prompt tail: Default.s Max Prompt size: 32iE D_R:[REBECCA.AEROBICS] SD .HUFFNPUFF.FAST ! SD to new directory.K *BECCA.AEROBICS.HUFFNPUFF.FAST] ! *This* is now the prompt !nK 9. Change the maximum prompt size from the default (32) to 20 characters.OK *BECCA.AEROBICS.HUFFNPUFF.FAST] DEFINE SD_MAX_PROMPT_SIZE 20 ! Set size.tL *BECCA.AEROBICS.HUFFNPUFF.FAST] SD /U TRUE ! Update it.' %SD-I-UPDATE, Prompt will be updated.u *CS.HUFFNPUFF.FAST]uI 10. Change directory using a complex directory specification involving aeG logical name. (Logical names may be defined by the user or by the,A system). (In this example, prompt updating is NOT enabled.)iF $ DEFINE FINANCE D_S:[SCOTTY.PRIVATE.FINANCE] ! Define logical name $ DIRECTORY FINANCE:( Directory D_S:[SCOTTY.PRIVATE.FINANCE] BANK.DIR;1 Total of 1 file. $ SD FINANCE:,.BANK.ANZb' D_S:[SCOTTY.PRIVATE.FINANCE.BANK.ANZ]r $ ring value which is appended to the pr'