DIRECTORY MiscUtilities USING [KeyForBansheeStatus, KeyForCommunicationStatus, KeyForRavenStatus], NSExec USING [CheckForAbort, Error, ExecProc, Handle, OutputHandle, UserAServerSA], NSString USING [AppendDecimal, AppendLongDecimal, FreeString, String], PaperTypes USING [PaperSize], PSActivity USING [Basic, Printer, Spooler], PSAsyncMsg USING [Msg], PSCommand USING [GetPrintServiceActivity, GetPrintServiceStatus], PSExecInternal USING [ExpandKeyAndPrint, printServiceName], PSExecMessages USING [Key], PSKMessages USING [GetHandle], PSState USING [CurrentActivity, StateHandle], Rope USING [ToRefText], XFormat USING [Blanks, Date, Handle, NSLine, NSString, NSStringObject], XMessage USING [Compose, Get, Handle, StringArray]; PSExecDImpl: CEDAR PROGRAM IMPORTS MiscUtilities, NSExec, NSString, PSCommand, PSExecInternal, PSKMessages, Rope, XFormat, XMessage EXPORTS PSExecInternal SHARES NSString = BEGIN nsNil: NSString.String = NIL; tab0: CARDINAL = 2; tab1: CARDINAL = 4; tab2: CARDINAL = 6; tab3: CARDINAL = 8; execMsgs: XMessage.Handle _ PSKMessages.GetHandle[exec]; DisplayPrintServiceStatus: PUBLIC NSExec.ExecProc = BEGIN ENABLE NSExec.Error => IF type = invalidExec THEN GOTO Exit; state: PSState.StateHandle _ PSCommand.GetPrintServiceStatus[]; activity: PSState.CurrentActivity _ PSCommand.GetPrintServiceActivity[]; showInternalState: BOOLEAN _ NSExec.UserAServerSA[exec]; DisplayBasicStatus[exec, state, showInternalState]; IF NSExec.CheckForAbort[exec] THEN GOTO Exit; IF showInternalState THEN ShowVolumeStatus[exec, activity]; IF NSExec.CheckForAbort[exec] THEN GOTO Exit; DisplayOptionSpecificStatus[exec, state, activity, showInternalState]; IF NSExec.CheckForAbort[exec] THEN GOTO Exit; DisplayStats[exec, state, showInternalState]; EXITS Exit => NULL; END; --DisplayPrintServiceStatus QueryTargetPrintService: PUBLIC NSExec.ExecProc = TRUSTED BEGIN ENABLE NSExec.Error => IF type = invalidExec THEN GOTO Exit; outputHandle: XFormat.Handle _ NSExec.OutputHandle[exec]; stringArray: REF XMessage.StringArray _ NEW [XMessage.StringArray[2]]; state: PSState.StateHandle _ PSCommand.GetPrintServiceStatus[]; WITH s: state SELECT FROM ENDCASE => ERROR; EXITS Exit => NULL; END; --QueryTargetPrintService DisplayBasicStatus: PROCEDURE [exec: NSExec.Handle, state: PSState.StateHandle, showInternalState: BOOLEAN] = BEGIN outputHandle: XFormat.Handle _ NSExec.OutputHandle[exec]; stringArray: REF XMessage.StringArray _ NEW [XMessage.StringArray[2]]; freeThisString: NSString.String; freeString: BOOLEAN _ FALSE; nsDateAndTime: NSString.String _ NEW[TEXT[40]]; nsDateTimeObject: XFormat.Handle _ XFormat.NSStringObject[nsDateAndTime]; sCount: NSString.String _ NEW[TEXT[20]]; stringArray[0] _ IF PSExecInternal.printServiceName = [NIL, NIL, NIL] THEN nsNil ELSE Rope.ToRefText[PSExecInternal.printServiceName.object]; stringArray[1] _ M[ SELECT state.mode.current FROM diagnostic => mDiagMode, repair => mRepairMode, shutDown, notStarted => mStopped, ENDCASE => mStarted]; PSExecInternal.ExpandKeyAndPrint[exec, mStatusHerald, stringArray]; IF state.mode.current # shutDown OR state.mode.returnTo # shutDown THEN BEGIN SELECT TRUE FROM state.clientControl.spooler = enabled AND state.internalControl.spooler = enabled => BEGIN --Queuing started stringArray[0] _ IF state.lastUserToStartQueuing.length > 0 THEN state.lastUserToStartQueuing ELSE nsNil; PSExecInternal.ExpandKeyAndPrint[exec, mQueuingStartedBy, stringArray]; END; state.clientControl.spooler # enabled => BEGIN --Queuing stopped IF state.lastStopQueuingReason.length > 0 THEN BEGIN stringArray[0] _ state.lastStopQueuingReason; freeThisString _ XMessage.Compose[M[mReason], stringArray]; freeString _ TRUE; stringArray[1] _ freeThisString; END ELSE stringArray[1] _ nsNil; stringArray[0] _ IF state.lastUserToStopQueuing.length > 0 THEN state.lastUserToStopQueuing ELSE nsNil; PSExecInternal.ExpandKeyAndPrint[exec, mQueuingStoppedBy, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; END; ENDCASE => --Queuing preempted outputHandle.NSLine[M[mQueuingPreempted]]; SELECT TRUE FROM state.clientControl.markerEnabled AND state.internalControl.markerEnabled => BEGIN --Printing started stringArray[0] _ IF state.lastUserToStartPrinting.length > 0 THEN state.lastUserToStartPrinting ELSE nsNil; PSExecInternal.ExpandKeyAndPrint[exec, mPrintingStartedBy, stringArray]; END; NOT state.clientControl.markerEnabled => BEGIN --Printing stopped IF state.lastStopPrintingReason.length > 0 THEN BEGIN stringArray[0] _ state.lastStopPrintingReason; freeThisString _ XMessage.Compose[M[mReason], stringArray]; freeString _ TRUE; stringArray[1] _ freeThisString; END ELSE stringArray[1] _ nsNil; stringArray[0] _ IF state.lastUserToStopPrinting.length > 0 THEN state.lastUserToStopPrinting ELSE nsNil; PSExecInternal.ExpandKeyAndPrint[exec, mPrintingStoppedBy, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; END; ENDCASE => --Printing preempted outputHandle.NSLine[M[mPrintingPreempted]]; END; -- state.mode # shutDown IF showInternalState THEN BEGIN nsDateAndTime.length _ 0; XFormat.Date[nsDateTimeObject, state.lastInstallation]; --aopends date to nsDateAndTime stringArray[0] _ nsDateAndTime; IF state.nBoots > 0 THEN BEGIN XFormat.NSString[outputHandle, NSString.AppendLongDecimal[NIL, state.nBoots]]; stringArray[1] _ NEW[TEXT[20]]; freeThisString _ XMessage.Compose[M[mTimesRebooted], stringArray]; freeString _ TRUE; stringArray[0] _ freeThisString; END; PSExecInternal.ExpandKeyAndPrint[exec, mInstalled, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; END; IF showInternalState THEN BEGIN nsDateAndTime.length _ 0; XFormat.Date[nsDateTimeObject, state.lastBoot]; --appends date to nsDateAndTime stringArray[0] _ nsDateAndTime; PSExecInternal.ExpandKeyAndPrint[exec, mServerBooted, stringArray]; END; IF showInternalState THEN BEGIN nsDateAndTime.length _ 0; XFormat.Date[nsDateTimeObject, state.statisticsReset]; --aopends date to nsDateAndTime stringArray[0] _ nsDateAndTime; PSExecInternal.ExpandKeyAndPrint[exec, mStatsReset, stringArray]; END; nsDateAndTime.length _ 0; XFormat.Date[nsDateTimeObject, state.lastActivity]; --aopends date to nsDateAndTime stringArray[0] _ nsDateAndTime; PSExecInternal.ExpandKeyAndPrint[exec, mLastActivity, stringArray]; END; -- of DisplayBasicStatus DisplayCurrentFaxRetries: PROCEDURE [exec: NSExec.Handle, currentCount: CARDINAL, currentDelay: LONG CARDINAL, reasonKey: PSExecMessages.Key, showInternalState: BOOLEAN _ TRUE] = BEGIN outputHandle: XFormat.Handle _ NSExec.OutputHandle[exec]; sCount1: NSString.String _ NEW[TEXT[20]]; sCount2: NSString.String _ NEW[TEXT[20]]; freeThisString: NSString.String; freeString: BOOLEAN _ FALSE; stringArray: REF XMessage.StringArray _ NEW[XMessage.StringArray[2]]; XFormat.NSString[outputHandle, NSString.AppendDecimal[sCount1, currentCount]]; IF currentCount > 0 AND showInternalState THEN BEGIN XFormat.NSString[outputHandle, NSString.AppendDecimal[sCount2, currentDelay]]; freeThisString _ XMessage.Compose[M[mRetryDelay], stringArray]; freeString _ TRUE; stringArray[1] _ freeThisString; END ELSE stringArray[1] _ NEW[TEXT[20]]; stringArray[0] _ M[reasonKey]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mTransmissionRetries, stringArray]; IF freeString THEN NSString.FreeString[freeThisString]; END; --DisplayCurrentFaxRetries DisplayOptionSpecificStatus: PROCEDURE [exec: NSExec.Handle, state: PSState.StateHandle, activity: PSState.CurrentActivity, showInternalState: BOOLEAN] = TRUSTED BEGIN outputHandle: XFormat.Handle _ NSExec.OutputHandle[exec]; stringArray: REF XMessage.StringArray _ NEW[XMessage.StringArray[2]]; freeThisString: NSString.String; freeString: BOOLEAN _ FALSE; WITH s: state SELECT FROM bansheeDl => stringArray[0] _ M[mBanshee]; d1 => stringArray[0] _ M[mD1]; fax295 => stringArray[0] _ M[mTC295]; fax495 => stringArray[0] _ M[mTC495]; feps9700 => stringArray[0] _ M[mFEPS]; fx3500 => stringArray[0] _ M[mFX3500]; raven => BEGIN stringArray[0] _ M[mRaven]; stringArray[1] _ M[ SELECT s.engineBuild FROM b1 => mRavenB1, b2, b2TraySensing, b2XSISModified => mRavenB2, ENDCASE => mQuestion]; freeThisString _ XMessage.Compose[M[mOneCommaTwo], stringArray]; freeString _ TRUE; stringArray[0] _ freeThisString; END; ENDCASE => ERROR; PSExecInternal.ExpandKeyAndPrint[exec, mPrintingOption, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; WITH a: activity SELECT FROM bansheeDl => BEGIN stringArray[0] _ M[IF a.marker IN [marking..paused] THEN mBusy ELSE mIdle]; stringArray[1] _ MGeneric[MiscUtilities.KeyForBansheeStatus[a.bansheeStatus]]; PSExecInternal.ExpandKeyAndPrint[exec, mPrinterStatus, stringArray]; END; feps9700 => BEGIN IF a.forwarder = busy THEN BEGIN stringArray[0] _ MGeneric[MiscUtilities.KeyForCommunicationStatus[a.forwardingStatus]]; freeThisString _ XMessage.Compose[M[mRetrying], stringArray]; freeString _ TRUE; stringArray[0] _ freeThisString; END ELSE stringArray[0] _ M[mNone]; PSExecInternal.ExpandKeyAndPrint[exec, mForwardingActivity, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; END; raven => BEGIN stringArray[0] _ M[IF a.marker IN [marking..paused] THEN mBusy ELSE mIdle]; stringArray[1] _ MGeneric[MiscUtilities.KeyForRavenStatus[a.ravenStatus]]; PSExecInternal.ExpandKeyAndPrint[exec, mPrinterStatus, stringArray]; END; ENDCASE; WITH s: state SELECT FROM raven => BEGIN twoPaperSizesLoaded: BOOLEAN _ s.paperSupply.size2 # s.paperSupply.size1; outputHandle.NSLine[M[mOperationalParms]]; stringArray[0] _ M[ IF twoPaperSizesLoaded THEN mTopTray ELSE mBothTrays]; stringArray[1] _ StringForPaper[s.paperSupply.size2]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPaperSize2, stringArray]; IF twoPaperSizesLoaded THEN BEGIN stringArray[0] _ M[mBottomTray]; stringArray[1] _ StringForPaper[s.paperSupply.size1]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPaperSize2, stringArray]; END; stringArray[0] _ IF twoPaperSizesLoaded THEN M[mAsAppropriate] ELSE M[ SELECT s.paperFeed FROM fromBottomBannerFromTop => mFromBottomBannerfromTopTray, ENDCASE => mFromBottomorTopTray]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPaperFeed, stringArray]; IF s.engineBuild > b1 THEN BEGIN --Stacking only applies to B2 or later engines. stringArray[0] _ M[ SELECT s.paperStacking FROM aligned => mAligned, documentOffset => mCopyOffset, ENDCASE --jobOffset-- => mSetOfCopiesOffset]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mOutputStacking, stringArray]; END; stringArray[0] _ M[ SELECT s.banner FROM oncePerDocument => mPerCopy, oncePerJob => mPerSetOfCopies, ENDCASE => mSuppressed]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mBanner2, stringArray]; END; --raven parms ENDCASE; END; -- of DisplayOptionSpecificStatus DisplayStats: PROCEDURE [exec: NSExec.Handle, state: PSState.StateHandle, showInternalState: BOOLEAN] = TRUSTED BEGIN outputHandle: XFormat.Handle _ NSExec.OutputHandle[exec]; stringArray: REF XMessage.StringArray _ NEW[XMessage.StringArray[2]]; freeThisString: NSString.String; freeString: BOOLEAN _ FALSE; sCount1: NSString.String _ NEW[TEXT[20]]; sCount2: NSString.String _ NEW[TEXT[20]]; sCount1.length _ sCount2.length _ 0; XFormat.NSString[outputHandle, NSString.AppendDecimal[NIL, state.docsPrinted.total]]; IF showInternalState THEN XFormat.NSString[outputHandle, NSString.AppendLongDecimal[ NIL, state.docsPrinted.grandTotal + state.docsPrinted.total]]; stringArray[0] _ NEW[TEXT[20]]; IF showInternalState THEN BEGIN -- mTotalSinceInstalled is inserted into mDocsPrinted stringArray[1] _ NEW[TEXT[20]]; freeThisString _ XMessage.Compose[M[mTotalSinceInstalled], stringArray]; freeString _ TRUE; stringArray[0] _ freeThisString; END; IF state.option = feps9700 THEN PSExecInternal.ExpandKeyAndPrint[exec, mDocsForwarded, stringArray] ELSE PSExecInternal.ExpandKeyAndPrint[exec, mDocsPrinted, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; WITH s: state SELECT FROM fax495 => BEGIN sCount1.length _ sCount2.length _ 0; stringArray[0] _ NEW[TEXT[20]]; IF showInternalState THEN BEGIN -- mTotalSinceInstalled is inserted into mDocsTransmitted stringArray[1] _ NEW[TEXT[20]]; freeString _ TRUE; stringArray[0] _ freeThisString; END; PSExecInternal.ExpandKeyAndPrint[exec, mDocsTransmitted, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; END; ENDCASE; IF showInternalState AND (state.docsAborted.total # 0 OR state.docsAborted.grandTotal # 0) THEN BEGIN sCount1.length _ sCount2.length _ 0; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[NIL, state.docsAborted.total]]; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[ NIL, state.docsAborted.grandTotal + state.docsAborted.total]]; stringArray[0] _ NEW[TEXT[20]]; stringArray[1] _ NEW[TEXT[20]]; PSExecInternal.ExpandKeyAndPrint[exec, mDocsCanceledStat, stringArray]; END; IF showInternalState AND (state.commErrors.total # 0 OR state.commErrors.grandTotal # 0) THEN BEGIN sCount1.length _ sCount2.length _ 0; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[NIL, state.commErrors.total]]; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[ NIL, state.commErrors.grandTotal + state.commErrors.total]]; stringArray[0] _ NEW[TEXT[20]]; stringArray[1] _ NEW[TEXT[20]]; PSExecInternal.ExpandKeyAndPrint[exec, mCommErrorsStat, stringArray]; END; IF showInternalState AND (state.testPatternsPrinted.total # 0 OR state.testPatternsPrinted.grandTotal # 0) THEN BEGIN sCount1.length _ sCount2.length _ 0; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[NIL, state.testPatternsPrinted.total]]; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[ NIL, state.testPatternsPrinted.grandTotal + state.testPatternsPrinted.total]]; stringArray[0] _ NEW[TEXT[20]]; stringArray[1] _ NEW[TEXT[20]]; PSExecInternal.ExpandKeyAndPrint[exec, mTPRequests, stringArray]; END; IF showInternalState AND (state.docsRetried.total # 0 OR state.docsRetried.grandTotal # 0) THEN BEGIN sCount1.length _ sCount2.length _ 0; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[NIL, state.docsRetried.total]]; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[ NIL, state.docsRetried.grandTotal + state.docsRetried.total]]; stringArray[0] _ NEW[TEXT[20]]; stringArray[1] _ NEW[TEXT[20]]; PSExecInternal.ExpandKeyAndPrint[exec, mRecoveryRetryRequests, stringArray]; END; IF showInternalState AND (state.docsPurged.total # 0 OR state.docsPurged.grandTotal # 0) THEN BEGIN sCount1.length _ sCount2.length _ 0; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[NIL, state.docsPurged.total]]; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[ NIL, state.docsPurged.grandTotal + state.docsPurged.total]]; stringArray[0] _ NEW[TEXT[20]]; stringArray[1] _ NEW[TEXT[20]]; PSExecInternal.ExpandKeyAndPrint[exec, mDocsPurgedAtRecovery, stringArray]; END; END; -- of DisplayStats ShowVolumeStatus: PROCEDURE [exec: NSExec.Handle, activity: PSState.CurrentActivity] = BEGIN stringArray: REF XMessage.StringArray _ NEW[XMessage.StringArray[3]]; outputHandle: XFormat.Handle _ NSExec.OutputHandle[exec]; sCount1: NSString.String _ NEW[TEXT[20]]; sCount2: NSString.String _ NEW[TEXT[20]]; usedPages, freePages: LONG CARDINAL; stringArray[0] _ nsNil; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[sCount1, usedPages + freePages]]; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[sCount2, freePages]]; stringArray[1] _ NEW[TEXT[20]]; stringArray[2] _ NEW[TEXT[20]]; PSExecInternal.ExpandKeyAndPrint[exec, mTotalVolumePages, stringArray]; sCount1.length _ sCount2.length _ 0; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[NIL, activity.queuePages]]; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[NIL, activity.fontPages]]; stringArray[0] _ NEW[TEXT[20]]; stringArray[1] _ NEW[TEXT[20]]; PSExecInternal.ExpandKeyAndPrint[exec, mPagesAllocated, stringArray]; END; -- ShowVolumeStatus StringForActivity: PROCEDURE [a: PSActivity.Basic] RETURNS [NSString.String] = BEGIN RETURN [M[ SELECT a FROM available => mAvailable, busy => mBusy, disabled => mDisabled, ENDCASE => mQuestion]]; END; --StringForActivity StringForPaper: PROCEDURE [p: PaperTypes.PaperSize] RETURNS [NSString.String] = BEGIN RETURN [M[ SELECT p FROM letter => mLetter, legal => mLegal, a4 => mA4, a5 => mA5, jisB4 => mB4, jisB5 => mB5, fxPostcard => mPostalCard, ENDCASE => mQuestion] ]; END; --StringForPaper StringForPrinterActivity: PROCEDURE [p: PSActivity.Printer] RETURNS [NSString.String] = BEGIN RETURN [M[ SELECT p FROM available => mAvailable, busy => mBusy, disabled => mDisabled, needsAttention => mNeedsAttention, needsKeyOperator => mNeedsKeyOperator, ENDCASE => mQuestion]]; END; --StringForPrinterActivity StringForSpoolerActivity: PROCEDURE [s: PSActivity.Spooler] RETURNS [NSString.String] = BEGIN RETURN [M[SELECT s FROM available, spooling => mAvailable, busy => mBusy, disabled => mDisabled, full => mFull, ENDCASE => mQuestion]]; END; --StringForSpoolerActivity M: PROCEDURE [key: PSExecMessages.Key] RETURNS [string: NSString.String] = { RETURN[XMessage.Get[execMsgs, ORD[key]]]}; MGeneric: PROCEDURE [msg: PSAsyncMsg.Msg] RETURNS [string: NSString.String] = { RETURN[XMessage.Get[msg.domain, msg.key]]}; END. --PSExecDImpl LOG when/who/what 10-Jan-84 11:20:27 - Jacks - Split off from PSTTYExecAImpl, which was too large. 26-Jan-84 18:11:54 - Jacks - Converted to 8.0 SCS. 9-Feb-84 14:40:29 - Jacks - Updated FX3500 status msg keys; added FX3500 parameters status. 14-Feb-84 14:04:50 - Jacks - Fixed engine type and FX3500 feeding display. 17-Feb-84 18:50:04 - Jacks - mFaxAddPaper became mAddPaper. 23-Feb-84 21:14:25 - Jacks - Fixed display of queuing/printing status to show user and reason; converted to private heap. 8-Mar-84 10:34:25 - Jacks - Changed a msg key; changed stop/start printing/queuing status. 21-Mar-84 15:32:28 - Jacks - Set up to display fax retries for no connection and transmit error; made adjustments to StringForFaxStatus. 30-Mar-84 15:44:33 - Jacks - Minor output format change. 2-Apr-84 11:01:14 - Jacks - Removed NewControlMessages. 3-Apr-84 19:18:29 - Jacks - Added support for multiple execs. 6-Apr-84 17:01:01 - Jacks - Fixed storage leak. 18-Apr-84 16:30:53 - Jacks - Minor editing. 15-Sep-84 13:55:51 - Jacks - Converted to new 9.0 PS interfaces: PSState, PSCommand. 4-Oct-84 13:48:34 - Jacks - Renamed from PSTTYExecDImpl to PSExecDImpl; added calls to NSExec.CheckForAbort. 18-Oct-84 14:47:59 - Jacks - DisplayPrintServiceStatus: Made engine type and service name display for all users; got rid of "Operation Mode" line; added "Last booted" line; using new MiscUtilities I/F for KeyFor*Status procs instead of defining StringFor*Status procs in module//added QueryTargetPrintService//renamed ttyHeap to execHeap. 1-Nov-84 18:00:26 - Jacks - Added catch phrases to call to PSCommand.GetTargetPSStatus; added feps9700 stuff to DisplayPrintServiceStatus. 16-Nov-84 12:31:07 - Jacks - Updated to new PSCommand/PSState/StatusTypes interfaces; removed TTY.Rubout catch phrases. 28-Nov-84 14:18:32 - Jacks - Fixed small bug in DisplayPrintServiceStatus marker status display; don't display all '5 switch parms for feps9700. 13-Dec-84 14:58:00 - Jacks - QueryTargetPrintService and Show Status now show two sided copy and stapling attributes. 16-Jan-85 15:47:59 - Jacks - Added "ps" prefix to all new msg keys for 9.0. 28-Feb-85 15:30:37 - Jacks - Added comment. 8-Mar-85 11:23:53 - Jacks - Changed forwarding activity display. 20-Jun-85 10:31:34 - Jacks - Added copyright notice; updated to PS Euclid interfaces; turned off public error catching by SCS in development mode in all exec procs. 28-Jun-85 15:09:35 - Jacks - Added d1 code; removed SetCatching calls. 19-Jul-85 13:53:05 - Jacks - Converted to XMessage; changed ShowVolumeStatus somewhat. 7-Aug-85 18:07:36 - Jacks - Removed system volume stats from Show Status. 15-Aug-85 17:13:09 - Jacks - Slight change to optional status display. 28-Aug-85 15:51:09 - Jacks - Changed ShowVolumeStatus slightly. 26-Sep-85 9:32:44 - Jacks - Added fxPostcard to StringForPaper; added unlimited printing to status for banshee and raven. 27-Sep-85 12:17:30 - Jacks - Only display unlimited printing info if memory size is big enough. 8-Oct-85 12:57:45 - Jacks - Updated to new PSInit. 15-Oct-85 10:15:54 - Jacks - Converted to new banshee paper in PSState. 6-Nov-85 13:13:54 - Jacks - Call PSKMessages for msg handle. 7-Nov-85 17:03:14 - Jacks - Display # of band buffers not pages; split DisplayPrintServiceStatus into little procs because it got too big for compiler. 13-Dec-85 16:45:17 - Jacks - ExecMessages renamed to PSExecMessages. @¸PSExecDImpl.mesa Copyright (C) Xerox Corporation 1984, 1985. All rights reserved. Last edited by Jacks 13-Dec-85 16:45:30 Ruseli Binsol: December 12, 1986 1:58:40 pm PST Implements Show Status and Query Target Print Service. BootSwitch USING [Set, useTeleDebugger], CHNameP2V0 USING [maxDomainLength, maxObjectLength, maxOrganizationLength, Name], File USING [SystemVolume], NSVolumeControl USING [GetSpaceAttributes], PaperTypesExtras USING [bansheeDlEnvelope], PSInit USING [unlimitedPrintingCutOffMemSize], PSVolume USING [GetUserVolID], SpecialSpace USING [realMemorySize], TargetPSStatus USING [Current], Message domain handle: feps9700 => IF s.targetPSAddress = XNS.nullNetworkAddress THEN BEGIN The target has not been set; display error msg... stringArray[0] _ M[mTargetNotSet]; PSExecInternal.ExpandKeyAndPrint[exec, mQueryError, DESCRIPTOR[BASE[stringArray], 1]]; END ELSE TRUSTED BEGIN --display target status and properties freeThisString: NSString.String; freeString: BOOLEAN _ FALSE; targetName: CHName.Name _ LOOPHOLE[@s.targetPSName.record]; targetActivity: TargetPSStatus.Current _ []; targetProperties: TargetPSStatus.Properties _ []; sNetAddress: LONG STRING _ [40]; nsNetAddress: NSString.String _ NEW[TEXT[40]]; nsNetAddressObject: XFormat.Handle _ XFormat.NSStringObject[nsNetAddress]; IF targetName.local.length # 0 THEN BEGIN "Clearinghouse name:..." targetNameString: NSString.String _ NSString.MakeString[bytes: CHName.maxOrganizationLength + CHName.maxDomainLength + CHName.maxObjectLength + 5]; targetNameString _ CHName.AppendString[ s: targetNameString, name: targetName]; stringArray[0] _ targetNameString; outputHandle.Blanks[tab3]; PSExecInternal.ExpandKeyAndPrint[exec, mCHName, stringArray]; NSString.FreeString[targetNameString]; END; "Network address:..." XFormat.NetworkAddress[h: nsNetAddressObject, networkAddress: s.targetPSAddress, format: productSoftware]; --appends net address string to nsNetAddress stringArray[0] _ nsNetAddress; outputHandle.Blanks[tab3]; PSExecInternal.ExpandKeyAndPrint[exec, mNetAddress, stringArray]; Call PSCommand for target status... [targetActivity, targetProperties] _ PSCommand.GetTargetPSStatus[ ! PSCommand.Error => BEGIN --display error message and exit WITH problem SELECT FROM targetPSNotSet => stringArray[0] _ M[mTargetNotSet]; targetPS => stringArray[0] _ MGeneric[MiscUtilities.KeyForCommunicationStatus[what]]; ENDCASE => stringArray[0] _ M[mUnknownProblem]; PSExecInternal.ExpandKeyAndPrint[exec, mQueryError, stringArray]; GOTO Exit; END ]; "Spooler:..." stringArray[0] _ StringForSpoolerActivity[targetActivity.spooler]; outputHandle.Blanks[tab3]; PSExecInternal.ExpandKeyAndPrint[exec, mSpooler, stringArray]; "Formatter:..." stringArray[0] _ StringForActivity[targetActivity.formatter]; outputHandle.Blanks[tab3]; PSExecInternal.ExpandKeyAndPrint[exec, mFormatter, stringArray]; "Printer:..." stringArray[0] _ StringForPrinterActivity[targetActivity.printer]; outputHandle.Blanks[tab3]; PSExecInternal.ExpandKeyAndPrint[exec, mPrinter, stringArray]; outputHandle.CR[]; "Paper size(s):..." stringArray[0] _ StringForPaper[targetActivity.paperSupply.size1]; If second paper size # max (target has two paper sizes) and size one # size two, display two paper sizes... IF targetActivity.paperSupply.size2 # max AND targetActivity.paperSupply.size1 # targetActivity.paperSupply.size2 THEN BEGIN stringArray[1] _ StringForPaper[targetActivity.paperSupply.size2]; freeThisString _ XMessage.Compose[M[mOneCommaTwo], stringArray]; freeString _ TRUE; stringArray[0] _ freeThisString; END; outputHandle.Blanks[tab3]; PSExecInternal.ExpandKeyAndPrint[exec, mPaper, stringArray]; IF freeString THEN NSString.FreeString[freeThisString]; "Two-sided copy:..." stringArray[0] _ M[IF targetProperties.twoSided THEN mAvailable ELSE mUnavailable]; outputHandle.Blanks[tab3]; PSExecInternal.ExpandKeyAndPrint[exec, mTwoSidedCopy, stringArray]; "Stapling:..." stringArray[0] _ M[IF targetProperties.staple THEN mAvailable ELSE mUnavailable]; outputHandle.Blanks[tab3]; PSExecInternal.ExpandKeyAndPrint[exec, mStapling, stringArray]; END; ********************* Support routines: ********************* sDateAndTime: STRING _ [40]; "Print Service "" " "Queuing {Started|Stopped|Preempted}" "Printing {Started|Stopped|Preempted}" "Installed {; Times Rebooted=n}" sCount.length _ 0; "Last booted " "Statistics Reset " "Last Activity " stringArray[0] _ Str[sCount1]; stringArray[1] _ Str[sCount2]; "Printing option: <>{, }" "Printer ; Status: " d1 => BEGIN stringArray[0] _ M[IF a.marker IN [marking..paused] THEN mBusy ELSE mIdle]; stringArray[1] _ MGeneric[MiscUtilities.KeyForD1Status[a.d1Status]]; PSExecInternal.ExpandKeyAndPrint[exec, mPrinterStatus, stringArray]; END; fax295, fax495 => BEGIN stringArray[0] _ M[IF a.marker IN [marking..paused] THEN mBusy ELSE mIdle]; stringArray[1] _ MGeneric[MiscUtilities.KeyForFaxStatus[a.faxStatus]]; PSExecInternal.ExpandKeyAndPrint[exec, mPrinterStatus, stringArray]; END; "Forwarding activity: ; Status = <>> If forwarding is in progress display the lastest forwarding status... fx3500 => BEGIN stringArray[0] _ M[IF a.marker IN [marking..paused] THEN mBusy ELSE mIdle]; stringArray[1] _ MGeneric[MiscUtilities.KeyForFX3500Status[a.fx3500Status]]; PSExecInternal.ExpandKeyAndPrint[exec, mPrinterStatus, stringArray]; END; Display printing option specific status information... d1 => BEGIN "Operational Parameters: " outputHandle.NSLine[M[mOperationalParms]]; "Paper size = <>" stringArray[0] _ StringForPaper[s.paperSize]; IF s.trayEmpty THEN BEGIN freeThisString _ XMessage.Compose[M[mUnknown], stringArray]; freeString _ TRUE; stringArray[0] _ freeThisString; END; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPaper, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; "Print Order = <>" stringArray[0] _ M[ SELECT s.printOrder FROM firstPageOutFirst => mFirstPagePrintedFirst, ENDCASE => mLastPagePrintedFirst]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPrintOrder2, stringArray]; "Banner = <>" stringArray[0] _ M[ SELECT s.banner FROM oncePerDocument => mPerCopy, oncePerJob => mPerSetOfCopies, ENDCASE => mSuppressed]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mBanner2, stringArray]; END; --d1 parms bansheeDl => BEGIN IF SpecialSpace.realMemorySize > PSInit.unlimitedPrintingCutOffMemSize THEN BEGIN "Unlimited printing: " stringArray[0] _ IF s.enableUnlimitedPrinting THEN M[mEnabled] ELSE M[mDisabled]; PSExecInternal.ExpandKeyAndPrint[exec, mUnlimitedPrinting, stringArray]; END; "Paper size = <>" stringArray[0] _ IF s.paper = PaperTypesExtras.bansheeDlEnvelope THEN M[mEnvelope] ELSE StringForPaper[s.paper.knownSize]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPaper, stringArray]; "Banner = <>" stringArray[0] _ M[ SELECT s.banner FROM oncePerDocument => mPerCopy, oncePerJob => mPerSetOfCopies, ENDCASE => mSuppressed]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mBanner2, stringArray]; END; --banshee parms fax495 => BEGIN "Operational Parameters: " outputHandle.NSLine[M[mOperationalParms]]; "Transmission retries (no connection) = <>{, retry delay (minutes) = <>" DisplayCurrentFaxRetries[exec: exec, currentCount: s.retries[noConnection].count, currentDelay: s.retries[noConnection].delayInSecs/60, reasonKey: mNoConnection, showInternalState: showInternalState]; "Transmission retries (transmit error) = <>{, retry delay (minutes) = <>" DisplayCurrentFaxRetries[exec: exec, currentCount: s.retries[transmitError].count, currentDelay: s.retries[transmitError].delayInSecs/60, reasonKey: mTransmitFailure, showInternalState: showInternalState]; "Local banner = <>" stringArray[0] _ M[ SELECT s.banner.local FROM oncePerDocument => mPerCopy, oncePerJob => mPerSetOfCopies, ENDCASE => mSuppressed]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mLocalBanner, stringArray]; "Remote banner = <>" stringArray[0] _ M[ SELECT s.banner.remote FROM oncePerDocument => mPerCopy, oncePerJob => mPerSetOfCopies, ENDCASE => mSuppressed]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mRemoteBanner, stringArray]; "Local duplicate copies = <>" stringArray[0] _ M[ IF s.multLocalCopiesAllowed THEN mAllowed ELSE mSuppressed]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mLocalCopies, stringArray]; "Remote duplicate copies = <>" stringArray[0] _ M[ IF s.multRemoteCopiesAllowed THEN mAllowed ELSE mSuppressed]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mRemoteCopies, stringArray]; END; --fax parms feps9700 => BEGIN targetNameString: NSString.String _ NSString.MakeString[bytes: CHName.maxOrganizationLength + CHName.maxDomainLength + CHName.maxObjectLength + 5]; sNetAddress: LONG STRING _ [40]; nsNetAddress: NSString.String _ NEW[TEXT[40]]; nsNetAddressObject: XFormat.Handle _ XFormat.NSStringObject[nsNetAddress]; "Target Print Service: <>" SELECT TRUE FROM s.targetPSName.record.local.length # 0 => BEGIN targetName: CHName.Name _ LOOPHOLE[s.targetPSName.record]; targetNameString _ NSString.AppendString[ s: targetNameString, name: targetName]; stringArray[0] _ targetNameString; END; s.targetPSAddress # XNS.nullNetworkAddress => BEGIN XFormat.NetworkAddress[h: nsNetAddressObject, networkAddress: s.targetPSAddress, format: productSoftware]; --appends net address string to nsNetAddress stringArray[0] _ nsNetAddress; END; ENDCASE => BEGIN stringArray[0] _ M[mSetTarget]; freeThisString _ XMessage.Compose[ M[mUnknown], stringArray]; freeString _ TRUE; stringArray[0] _ freeThisString; END; outputHandle.Blanks[tab0]; PSExecInternal.ExpandKeyAndPrint[exec, mTargetPS, stringArray]; NSString.FreeString[targetNameString]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; "Paper size = <>" stringArray[0] _ StringForPaper[s.paperSupply.size1]; If second paper size # max (target has two paper sizes) and size one # size two, display two paper sizes... IF s.paperSupply.size2 # max AND s.paperSupply.size1 # s.paperSupply.size2 THEN BEGIN stringArray[1] _ StringForPaper[s.paperSupply.size2]; freeThisString _ XMessage.Compose[M[mOneCommaTwo], stringArray]; freeString _ TRUE; stringArray[0] _ freeThisString; END; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPaper, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; "Two-sided copy = <>" stringArray[0] _ M[IF s.twoSidedCopy THEN mAvailable ELSE mUnavailable]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mTwoSidedCopy, stringArray]; "Stapling = <>" stringArray[0] _ M[IF s.stapling THEN mAvailable ELSE mUnavailable]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mStapling, stringArray]; END; --feps9700 parms fx3500 => BEGIN twoPaperSizesLoaded: BOOLEAN _ (s.paperSupply.size2 # s.paperSupply.size1) OR (s.topPaperTrayEmpty # s.bottomPaperTrayEmpty); "Operational Parameters: " outputHandle.NSLine[M[mOperationalParms]]; "Paper Size = <>" stringArray[0] _ StringForPaper[s.paperSupply.size2]; IF s.topPaperTrayEmpty THEN BEGIN freeThisString _ XMessage.Compose[M[mUnknown], stringArray]; freeString _ TRUE; stringArray[1] _ freeThisString; END ELSE stringArray[1] _ stringArray[0]; stringArray[0] _ M[ IF twoPaperSizesLoaded THEN mTopTray ELSE mBothTrays]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPaperSize2, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; IF twoPaperSizesLoaded THEN BEGIN stringArray[0] _ StringForPaper[s.paperSupply.size1]; IF s.bottomPaperTrayEmpty THEN BEGIN freeThisString _ XMessage.Compose[M[mUnknown], stringArray]; freeString _ TRUE; stringArray[1] _ freeThisString; END ELSE stringArray[1] _ stringArray[0]; stringArray[0] _ M[mBottomTray]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPaperSize2, stringArray]; IF freeString THEN BEGIN NSString.FreeString[freeThisString]; freeString _ FALSE; END; END; "Feed = <>" stringArray[0] _ IF twoPaperSizesLoaded THEN M[mAsAppropriate] ELSE M[ SELECT s.paperFeed FROM fromBottom => mFromBottom, fromBottomBannerFromTop => mFromBottomBannerfromTopTray, fromBottomOrTop => mFromBottomorTopTray, fromTop => mFromTop, ENDCASE => mAlternateBottomAndTop ]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPaperFeed, stringArray]; "Print Order = <>" stringArray[0] _ M[ SELECT s.printOrder FROM firstPageOutFirst => mFirstPagePrintedFirst, ENDCASE => mLastPagePrintedFirst]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mPrintOrder2, stringArray]; "Banner = <>" stringArray[0] _ M[ SELECT s.banner FROM oncePerDocument => mPerCopy, oncePerJob => mPerSetOfCopies, ENDCASE => mSuppressed]; outputHandle.Blanks[tab2]; PSExecInternal.ExpandKeyAndPrint[exec, mBanner2, stringArray]; END; --fx3500 parms IF SpecialSpace.realMemorySize > PSInit.unlimitedPrintingCutOffMemSize THEN BEGIN "Unlimited printing: " stringArray[0] _ IF s.enableUnlimitedPrinting THEN M[mEnabled] ELSE M[mDisabled]; PSExecInternal.ExpandKeyAndPrint[exec, mUnlimitedPrinting, stringArray]; END; "Operational Parameters: " "Paper Size = <>" "Feed = <>" "Stacking = <>" "Banner = <>" Print Stats "Documents Printed: <> {; Total Since Installed: <>}" or "Documents Forwarded: <>" for feps9700 IF showInternalState THEN NSString.AppendLongDecimal[ sCount2.length, state.docsPrinted.grandTotal + state.docsPrinted.total]; " Documents Transmitted: <> {; Total Since Installed: <>}" XFormat.NSString[outputHandle, NSString.AppendDecimal[NIL, s.docsTransmitted.total]]; XFormat.NSString[outputHandle, NSString.AppendLongDecimal[ NIL, s.docsTransmitted.grandTotal + s.docsTransmitted.total]]; freeThisString _ XMessage.Compose[M[mTotalSinceInstalled], stringArray]; " Documents Canceled: <1>; Total Since Installed: <2>" " Failed Communications Attempts: <1>; Total Since Installed: <2>" " TestPattern Requests: <1>; Total Since Installed: <2>" " Recovery Retry Requests: <1>; Total Since Installed: <2>" " Docs Purged at Recovery: <1>; Total Since Installed: <2>" IF showInternalState AND BootSwitch.Set[BootSwitch.useTeleDebugger] THEN BEGIN OPEN NSString; wordsPerPage: LONG CARDINAL = 256; outputHandle.Blanks[tab1]; outputHandle.NSLine[Str["PS Parameters (shown only if booted with 5 switch):"]]; outputHandle.Blanks[tab2]; outputHandle.String["Memory size: "]; outputHandle.Decimal[SpecialSpace.realMemorySize]; outputHandle.String[" pages = "]; outputHandle.Decimal[SpecialSpace.realMemorySize*wordsPerPage]; outputHandle.NSLine[Str[" words"]]; outputHandle.Blanks[tab2]; outputHandle.String["Boot switches: "]; FOR c: CHARACTER IN [' ..'~] DO IF BootSwitch.Set[c] THEN outputHandle.Char[LOOPHOLE[c]]; ENDLOOP; FOR c: CHARACTER IN [177C..377C] DO IF BootSwitch.Set[c] THEN BEGIN outputHandle.Char[134B]; -- '\ outputHandle.Octal[c]; outputHandle.Char[134B]; -- '\ END; ENDLOOP; outputHandle.CR[]; IF state.option # feps9700 THEN BEGIN --parms that don't pertain to feps outputHandle.Blanks[tab2]; outputHandle.String["Decomposing while marking "]; outputHandle.NSLine[Str[IF state.decomposeWhileMarking THEN "ENABLED" ELSE "DISABLED"]]; outputHandle.Blanks[tab2]; outputHandle.String["Spooling while marking "]; outputHandle.NSLine[Str[IF state.spoolWhileMarking THEN "ENABLED" ELSE "DISABLED"]]; outputHandle.Blanks[tab2]; outputHandle.String["RM page limit observed by decomposer = "]; outputHandle.Decimal[state.decomposerRMPagesForMarker]; outputHandle.CR[]; outputHandle.Blanks[tab2]; outputHandle.String["Number of band buffers = "]; outputHandle.Decimal[ state.markerRMPagesForBands/MiscUtilities.pagesPerBandBuffer]; outputHandle.CR[]; END; outputHandle.Blanks[tab2]; outputHandle.String["VM pages reserved by decomposer = "]; outputHandle.Decimal[state.decomposerVMPages]; outputHandle.CR[]; END; userVolID: File.SystemVolume _ PSVolume.GetUserVolID[]; " Total <1>volume pages = <2>; Free pages = <3>" [usedPages, freePages] _ NSVolumeControl.GetSpaceAttributes[userVolID]; " Queue pages allocated = <1>; Font pages allocated = <2>" This procedure is only set up to handle a limited number of known paper sizes. Support routines: Proc for getting NSString from XMessage key ÊT˜code™K™@K™'K™/—˜K™6—K˜šÏk ˜ Kšœ œ™(Kšœ œA™QKšœœ™KšœœE˜XKšœœG˜SKšœ œ8˜FKšœœ™+Kšœ œ ˜Kšœœ™+Kšœ œ˜+Kšœ œ˜Kšœ œ2˜AKšœœ'˜;Kšœœ˜Kšœœ"™.Kšœ œ ˜Kšœœ ˜-Kšœ œ™K˜Kšœ œ™$Kšœœ ™Kšœœ;˜HKšœ œ%˜3—K˜šÏn œœ˜Kšœa˜hKšœ˜Kšœ ˜K˜Kšœœ˜Kšœœ˜Kšœœ˜Kšœœ˜Kšœœ˜K˜Kšœ™˜8K˜—šžœœ˜9Kšœœœœ˜™>Kšœ™K™=K™Kšœ@™@Kšœ ™ K™BK™Kšœ>™>Kšœ œ™Kšœ™K™BKšœ7™7Kšœ3™3šœ(™-KšœDœ™NK™BKšœ@™@Kšœ œ™K™ Kšœ™—K™Kšœ<™<šœ ™K™$—Kšœ™Kšœœœ œ™SK™KšœC™CKšœ™Kšœœœ œ™QK™Kšœ?™?Kšœ™———Kšœœ˜—Kšœ œ˜KšœŸ˜K˜—K˜Kšœ™Kšœ™Kšœ™K˜šžœ œ˜3Kšœ/œ˜?K˜9Kšœ œœ˜FK˜ Kšœ œœ˜Kšœœ™Kšœ!œœ˜/K˜IKšœœœ˜(K˜KšœL™Lš œœ$œœœ˜EKšœœ8˜G—˜šœ˜K˜K˜K˜!Kšœ˜——šœC˜CK˜—šœœ ˜GKš˜Kšœ%™%šœœ˜˜%Kšœ,œŸ˜Fšœœ)˜@Kšœœ˜(—KšœG˜GKšœ˜—šœ)œŸ˜@šœ(œ˜4K˜-Kšœ;˜;Kšœ œ˜K˜ Kš˜—Kšœ˜šœœ(˜?Kšœœ˜'—KšœG˜Gšœ œ˜K˜$Kšœ œ˜Kšœ˜—Kšœ˜—šœŸ˜K˜*—K˜—Kšœ&™&šœœ˜˜!Kšœ(œŸ˜Cšœœ*˜AKšœœ˜)—KšœH˜HKšœ˜—šœ&œŸ˜Ašœ)œ˜5K˜.Kšœ;˜;Kšœ œ˜K˜ Kš˜—Kšœ˜šœœ)˜@Kšœœ˜(—KšœH˜Hšœ œ˜K˜$Kšœ œ˜Kšœ˜—Kšœ˜—šœŸ˜K˜+——KšœŸ˜K˜—Kšœ/™/šœœ˜K˜Kšœ8Ÿ˜WK˜šœœ˜K™Kšœ:œ˜NKšœœœ˜KšœB˜BKšœ œ˜K˜ Kšœ˜—Kšœ@˜@šœ œ˜K˜$Kšœ œ˜Kšœ˜—Kšœ˜K˜—Kšœ™šœœ˜K˜Kšœ0Ÿ˜OK˜KšœC˜CKšœ˜K˜—Kšœ ™ šœœ˜K˜Kšœ7Ÿ˜VK˜KšœA˜AKšœ˜K˜—Kšœ™K˜Kšœ4Ÿ˜SK˜KšœC˜CKšœŸ˜—K˜šžœ œ˜9Kšœœ˜Kšœœœ ˜;Kšœœœ˜*K˜9Kšœœœ˜)Kšœœœ˜)K˜ Kšœ œœ˜Kšœ œœ˜EKšœN˜Nšœœœ˜4K™KšœN˜NK™Kšœ?˜?Kšœ œ˜K˜ Kš˜—šœœœ˜$K˜—K˜K˜KšœJ˜JKšœ œ%˜7KšœŸ˜K˜—šžœ œ2˜XK˜"Kšœœœ˜+K˜9Kšœ œœ˜EK˜ šœ œœ˜K˜—Kšœ&™&šœ œ˜K˜*K˜K˜%K˜%K˜&K˜&šœ ˜K˜˜šœ˜K˜K˜.Kšœ˜——Kšœ@˜@Kšœ œ˜K˜ Kšœ˜—Kšœœ˜—KšœE˜Ešœ œ˜K˜$Kšœ œ˜Kšœ˜K˜—šœ œ˜Kšœ'™'šœ ˜Kš œœ œœœ˜KKšœN˜NKšœD˜DKšœ˜—šœ™ Kš œœ œœœ™KK™DKšœD™DKšœ™—šœ™Kš œœ œœœ™KK™FKšœD™DKšœ™—Kšœ6™6šœ ˜Kšœœ˜ šœE™EKšœW˜WKšœ=˜=Kšœ œ˜K˜ Kš˜—š˜K˜—KšœI˜Išœ œ˜K˜$Kšœ œ˜Kšœ˜—Kšœ˜—šœ ™Kš œœ œœœ™KK™LKšœD™DKšœ™—šœ ˜Kš œœ œœœ˜KKšœJ˜JKšœD˜DKšœ˜—Kšœ˜—K˜Kšœ6™6šœ œ˜šœ™ Kšœ™K™*Kšœ™K™-šœ œ™Kšœ<™™>KšœŸ ™K™—šœ ™šœEœ™QKšœ(™(šœœœ ™>Kšœ™—KšœH™HKšœ™—Kšœ™šœœ.™EKšœ œ#™4—K™Kšœ<™™>KšœŸ™K™—šœ ™Kšœ™K™*KšœH™H™$K™,K™5K™K™&—KšœI™I™$K™-K™6K™K™&—Kšœ™™šœ™K™K™Kšœ™——K™KšœB™BKšœ™™šœ™K™K™Kšœ™——K™KšœC™CKšœ™™Kšœœ ™)Kšœ™—K™KšœB™BKšœ™™Kšœœ ™*Kšœ™—K™KšœC™CKšœŸ ™K™—šœ ™Kšœ“™“Kšœ œœ™ Kšœ œœ™.K™JKšœ™šœœ™šœ*™/Kšœœ™:™)K™'—K™"Kšœ™—šœœ™3™.Kšœ=Ÿ,™i—K™Kšœ™—šœ™K™™"Kšœ™—Kšœ œ™K™ Kšœ™——K™Kšœ?™?K™&šœ œ™K™$Kšœ œ™Kšœ™—Kšœ™K™5Kšœ7™7Kšœ3™3šœ™ Kšœ*œ™4K™5Kšœ@™@Kšœ œ™K™ Kšœ™—K™Kšœ<™<šœ œ™K™$Kšœ œ™Kšœ™—Kšœ™Kšœœœ œ™HK™KšœC™CKšœ™Kšœœ œ œ™DK™Kšœ?™?KšœŸ™K™—šœ ™šœœ™Kšœ,™.K™/—Kšœ™K™*Kšœ™K™5šœœ™!Kšœ<™™>KšœŸ™——˜šœ œ˜šœœ˜K˜*—šœEœ™QKšœ(™(šœœœ ™>Kšœ™—KšœH™HKšœ™—Kšœ™K˜*Kšœ™˜Kšœœ ˜$Kšœ ˜—K˜5K˜KšœA˜Ašœœ˜!K˜ K˜5K˜KšœA˜AKšœ˜—Kšœ ™ ˜Kšœœ˜-šœ˜šœ ˜K˜8Kšœ˜!———K˜Kšœ@˜@Kšœ™šœœœŸ/˜P˜šœ˜K˜K˜KšœŸ œ˜-——K˜KšœE˜EKšœ˜—Kšœ ™ ˜šœ ˜K˜K˜Kšœ˜——K˜Kšœ>˜>KšœŸ ˜—Kšœ˜—KšœŸ!˜&K˜—š ž œ œFœœ˜uK˜9Kšœ œœ˜EK˜ Kšœ œœ˜Kšœœœ˜)šœœœ˜)K˜—Kšœ ™ Kšœ9™9Kšœ&™&K˜$Kšœ6œ˜Ušœœ;˜TKšœ;˜>—šœœ™5KšœH™H—Kšœœœ˜šœœœŸ5˜VKšœœœ˜KšœH˜HKšœ œ˜K˜ Kšœ˜—šœœ˜ KšœC˜C—š˜KšœB˜B—šœ œ˜K˜$Kšœ œ˜Kšœ˜—K˜šœ œ˜šœ ˜Kšœ<™—Kšœœœ˜KšœH™HKšœ œ˜K˜ Kšœ˜—KšœF˜Fšœ œ˜K˜$Kšœ œ˜Kšœ˜—Kšœ˜—Kšœ˜—K˜šœ˜Kšœœ#œ˜PKšœ8™8K˜$Kšœ:œ˜Yšœ:˜:Kšœ;˜>—Kšœœœ˜Kšœœœ˜KšœG˜GKšœ˜—šœ˜Kšœœ"œ˜NKšœD™DK˜$Kšœ:œ˜Xšœ:˜:Kšœ9˜<—Kšœœœ˜Kšœœœ˜KšœE˜EKšœ˜—šœ˜Kšœ&œ+˜ZKš˜Kšœ:™:K˜$Kšœ:œ$˜ašœ:˜:KšœK˜N—Kšœœœ˜Kšœœœ˜KšœA˜AKšœ˜—šœ˜Kšœœ#œ˜PKšœ=™=K˜$Kšœ:œ˜Yšœ:˜:Kšœ;˜>—Kšœœœ˜Kšœœœ˜KšœL˜LKšœ˜—šœ˜Kšœœ"œ˜NKšœ=™=K˜$Kšœ:œ˜Xšœ:˜:Kšœ9˜<—Kšœœœ˜Kšœœœ˜KšœK˜KKšœ˜K˜—šœœ,œ™NKšœ ™Kšœœœ™"K™K™PK™K™%K™2K™!K™?K™#K™K™'šœ œœ ™Kšœœœ™9Kšœ™—šœ œœ™#šœœ™KšœŸ™K™KšœŸ™Kšœ™—Kšœ™—Kšœ œ™šœœœŸ"™HK™K™2Kšœœœ œ™XK™K™/Kšœœœ œ™TK™K™?K™8Kšœ œ™K™K™1™K™>—Kšœ œ™Kšœ™—K™K™:Kšœ<œ™AKšœ™—KšœŸ˜K˜—šžœ œ;˜\Kšœ œœ˜EK˜9Kšœœœ˜)Kšœœœ˜)Kšœ7™7Kšœœœ˜$Kšœ1™1K˜K™GKšœ[˜[KšœO˜OKšœœœ˜Kšœœœ˜KšœG˜GK˜$Kšœ;™;Kšœ:œ˜UKšœ:œ˜TKšœœœ˜Kšœœœ˜KšœE˜EKšœŸ˜K˜—šžœ œ˜2Kšœ˜!šœ˜ Kšœ˜ ˜K˜K˜Kšœ˜——KšœŸ˜K˜—šžœ œ˜3Kšœ˜!Kšœ'™'Kšœ&™&šœ˜ Kšœ˜ ˜K˜K˜ K˜ K˜ K˜ K˜Kšœ˜—K˜—KšœŸ˜K˜—šžœ œ˜;Kšœ˜!šœ˜ šœ˜ K˜K˜K˜K˜"K˜&Kšœ˜——KšœŸ˜K˜—šžœ œ˜;Kšœ˜!šœœ˜˜%K˜K˜K˜Kšœ˜——KšœŸ˜K˜—šœ™K˜—Kšœ+™+šžœ œœ˜LKšœœ ˜*K˜—šžœ œœ˜OKšœ%˜+K™—KšœŸ ˜K˜Kšœ˜—K˜Pšœ.œ˜2K˜[—K˜JK˜;˜yK˜Z—K˜ˆ˜8K˜7K˜=K˜/—K˜+šœ2œ ˜TK˜l—šœžœœ˜ÒK˜Š—Kšœ^œ˜wK˜K˜uK˜K˜+K˜@—Kšœ@œ8œ'˜¤K˜F˜VK˜I—K˜FK˜?K˜z˜_K˜2—˜GK˜