#include <exec/types.h>

#define CNET_VERSION "$VER: CNet PRO 3.03"

#define TOP_STAT 51
#define TOP_NOSTAT 11

#define C_BLACK  0
#define C_RED    4
#define C_GREEN  2
#define C_YELLOW 6
#define C_BLUE   1
#define C_PURPLE 5
#define C_CYAN   3
#define C_WHITE  7

#define GRN_BLK 0x20
#define YEL_BLK 0x60
#define BLU_BLU 0x11
#define CYN_BLK 0x30
#define CYN_BLU 0x31
#define WHT_BLK 0x70
#define WHT_RED 0x74
#define WHT_BLU 0x71
#define WHT_PUR 0x75

#define EVER ;;

#define EDHANDLE_FLAG		0x01
#define EDREALNAME_FLAG		0x02
#define EDADDRESS_FLAG		0x04
#define EDVOICE_FLAG		0x08
#define EDDATA_FLAG		0x10
#define BANNER_FLAG		0x20
#define NOT_USED_FLAG		0x40
#define PORTMONITOR_FLAG	0x80
#define VOTEMAINT_FLAG		0x0100
#define ALARMSYSOP_FLAG		0x0200
#define OPENSCREEN_FLAG		0x0400
#define OPENCAPTURE_FLAG	0x0800
#define NETMAIL_FLAG		0x1000
#define FREQSEND_FLAG		0x2000
#define NETCOSTEXEMPT_FLAG	0x4000
#define EXPANSION1_FLAG		0x8000
#define EXPANSION2_FLAG		0x010000
#define EXPANSION3_FLAG		0x020000
#define EXPANSION4_FLAG		0x040000
#define UUCPMAIL_FLAG		0x080000
#define NETCOSTCREDITS_FLAG	0x100000
#define HOLDANDCRASH_FLAG	0x200000
#define EXPANSION8_FLAG		0x400000
#define EXPANSION9_FLAG		0x800000
#define EXPANSION10_FLAG	0x01000000

#define EMAIL_FLAG		0x01	/* bit defs for ABits of struct Privs */
#define	PFILE_FLAG		0x02
#define GFILE_FLAG		0x04
#define	ULIST_FLAG		0x08
#define	SYSOP_FLAG		0x10
#define	REWARDS_FLAG		0x20	/* may receive download rewards? */
#define	FCREDEX_FLAG		0x40
#define BCREDEX_FLAG		0x80
#define	EXPIREMAIL_FLAG		0x0100
#define	BULK_FLAG		0x0200
#define PARTY_FLAG		0x0400
#define	URGENT_FLAG		0x0800
#define	TIMESBP_FLAG		0x1000
#define	FILEADD_FLAG		0x2000
#define	READANY_FLAG		0x4000
#define	DELETEANY_FLAG		0x8000
#define XXXXXXXXX_FLAG		0x010000	/* not used */
#define	XXXXXXXXX4_FLAG		0x020000
#define AUTOVALID_FLAG		0x040000
#define	XXXXXXXXX2_FLAG		0x080000	/* not used */
#define	SEEANON_FLAG		0x100000
#define	XXXXXXXXX3_FLAG		0x200000	/* not used */
#define	CONF_FLAG		0x400000
#define CONFCON_FLAG		0x800000
#define MCI1_FLAG		0x01000000
#define MCI2_FLAG		0x02000000
#define	RELOGON_FLAG		0x04000000
#define RECEIVEMAIL_FLAG 	0x08000000
#define FORWARD_FLAG   		0x10000000
#define VOTETOPIC_FLAG  	0x20000000
#define VOTECHOICE_FLAG 	0x40000000
#define NOLOCKS_FLAG		0x80000000

struct RangeContext {
	long	nparts;
	long	parts[10][2];
	long	set;
	long	element;
};

struct DrawElement {
	UBYTE	x;		/* x screen position */
	UBYTE	y;		/* y screen position */
	UBYTE	att;		/* the character's attribute (colors) */
	UBYTE	att2;		/* the character's attribute (others) */
	UBYTE	c;		/* the character */
	UBYTE	att0;		/* Was the attribute (underneath) */
	UBYTE	att20;		/* Was the attribute (underneath) */
	UBYTE	c0;		/* Was the character (underneath) */
};

struct VDEentry {
	char	text[48];

	short	xpos,		/* where to print these things */
		ypos;

	long	min,		/* for numerix */
		max;		/* for numerix */

	short	length,		/* for string entry, field size */
				/* for bit boolean, which bit? */

		type;		/* 0 = UBYTE 0/1
				   1 = ULONG BIT 0/1
				   2 = Text (char *)
				   3 = BYTE numeric
				   4 = short numeric
				   5 = USHORT numeric
				   6 = long numeric
				   7 = date
				   8 = flags
				   9 = ordered BBSTEXT list
				   10= ordered BBSMENU list
				   11= char **
				   12= UBYTE BIT 0/1 */

	long	offset;		/* position in structure */

	short	screen0,	/* belongs-to screen */
		screen2;	/* goes-to screen, -1 for exit */

	short	goup,		/* VDEentry for movement */
		godown,
		goleft,
		goright;

	UWORD	ghost;
};

struct TermLink {
	char	dial[32];
	long	baud;
	char	ports[40];
	long	access;
	short	rate;
	char	name[38];
	short	databits;
};

struct LogType {
	char	name  [10];
	short	id;

	char	custom[10];

	UBYTE	flag;
	UBYTE	other;
};

struct	FidoType {
	char	Name[25];

	USHORT	ZoneB,  Zone,
		NetB,   Net,
		NodeB,  Node,
		PointB, Point;

	USHORT	ZoneC, NetC, NodeC, PointC;

	char	EchoOrigin[78];
	USHORT	LoZone;

	char	NetOrigin[76];
	USHORT	Pointnet;
	USHORT	HiZone;
};

struct	ProtoType {
	char	Name[16];
	char	Env[36];
	short	Flags;
	char	One[2];
	char	Path[22];
};

struct	ArcType {
	char	Suffix[8];
	char	Keyword[16];
	char	View[64];
	char	Test[64];
	char	Pack[64];
	char	Extract[64];

	long	Row;
	long	Column;
};

struct	EditorType {
	char	name[20];
	char	path[32];
	long	flags;
};

struct	Config1 {
	char	MySystemName[26];
	char	MySysopName[26];
	char	MyLocation[26];
	char	MyPhoneNumber[20];
	char	MyBBSID[10];

	char	FontName[40];
	long	DefBalance;
	long	DefaultColor;
	long	BlankTicks;
	long	BlankBright;

	long	nUDBASEx;		/* highest UDBASE partition */
	long	MaxShortLines;		/* Short description lines */
	long	MaxOpenPfiles;		/* stuff from BBSCONFIG */
	long	maxUserAccounts;
	long	NumRooms;
	long	nLinkPorts;		/* max link ID            */
	long	nsub;			/* */
	long	BListPurgeDays;
	long	nselect;		/* */
	long	nupload;
	long	nlist;
	long	maxYankTasks;
	long	maxYankSize;
	long	maxYankDays;
	long	maxLogonAttempts;
	long	maxLogonTime;
	long	maxYanksPerUser;

	long	DefNetCredits;
	long	DefByteCredits;
	long	DefFileCredits;
	char	MyCountry[4];
	char	MyAreaCode[12];
	char	DefDefProtocol[4];
	char	Yprefix[4];		/* Yank identifier */
	long	DefDoorPoints;
	long	DefTimeForm;

	UBYTE	MyLinkID;

	UBYTE	LogonFeedback;
	UBYTE	LogonSearch;
	UBYTE	GuestUsers;
	UBYTE	HideStatus;
	UBYTE	ConfProfile;
	UBYTE	MailFeedback;
	UBYTE	SeparateTexts;
	UBYTE	IndentSpaces;
	UBYTE	CIDvalidate;
	UBYTE	CIDhandleskip;
	UBYTE	SkipIdlePorts;

	char	MyLinkPass[8];

	char	OLMpath[40],
		ZIPpath[40],
		EXTRACTpath[40],
		YANKwork[40],
		RAMpath[40],
		TERMpath[40],
		LocalEditor[40],
		CDROMpath[40],
		DictPath[40];

	char	FKey [10][80];
	char	TFKey[10][80];

	USHORT	DColors2[2];
	USHORT	DColors4[4];
	USHORT	DColors8[8];
	USHORT	DColors16[16];

	long	narc;
	long	ned;
	long	nproto;
	long	nfido;
	long	nlog;

	struct	ArcType	   arc   [20];
	struct	EditorType ed     [8];
	struct	ProtoType  proto [16];
	struct	FidoType   fido  [12];
	struct	LogType	   log   [88];

	char	MyUUCPName[44];
	char	OutboundPath[40];
	char	InboundPath[40];

	ULONG	TossInputSize;
	ULONG	TossOutputSize;
	USHORT	DupeTableSize;

	UBYTE	BadUnknown;
	UBYTE	Trapdoor174;
	UBYTE	BadDupes;
	UBYTE	ZoneGateAdjust;
	UBYTE	ShowKludges;
	UBYTE	ThreeD;
	UBYTE	DeleteUUCP;
	UBYTE	CIDsilence;
	UBYTE	TwoDotMsg;

	char	expansion[73];

	char	Nodelist[40];
};

struct LinkPortUser {
	short	tick;

	UBYTE	channel;
	char	name[21];
};

struct LinkPort {
	long	s;				/* serial number */

	short	ports;
	char	name[22];

	struct	LinkPortUser user[100];
};

struct IsDate {		/* must LEAVE as BYTE */
	BYTE Year;
	BYTE Month;
	BYTE Date;
	BYTE Hour;
	BYTE Minute;
	BYTE Second;
};

/* LONG aligned */

struct RoomConfig {
	long	Access;		/* which groups may enter */

	short	Creator;	/* who created this room (id#) */
	short	Youngest;
	short	Oldest;

	UBYTE	Doors;
	UBYTE	NameType;
	UBYTE	Gender;
	UBYTE	Quiet;
	UBYTE	Public;
	UBYTE	PermaRoom;

	char	Name[31];
	char	Topic[31];
	char	Entry[81];	/* Messages for entry, exit */
	char	Exit[81];

	UBYTE	Scribe;			/* are we writing a scribe? */
	UBYTE	MCIScribe;		/* remove MCI's ?? */
	char	SName[78];		/* name of current scribe file */

	UBYTE	Channel;
	UBYTE	LinkID;

	UBYTE	Invited[300];		/* 1 bit each for 2400 users */

	short	MaxUsers;
	UBYTE	Chaos;
	UBYTE	LurkTimeout;

	short	NoiseSet;
};

struct Room {
	struct	RoomConfig rc;

	long	Pointer;
	long	Users;			/* how many users are in this room */

	short	pSBuff;			/* pointer into Scribe Buffer */

	UBYTE	Buffer[15000];		/* Actual I/O buffer (Q) */

	UBYTE	SBuff[1024];		/* buffer for Scribe */
};

/* LONG aligned.  Total length == 304 */

struct RoomUser {
	long	MyPointer;		/* 0 */
	long	UID;			/* 4 */
	short	Room;			/* 8 */

	char	Entry[71];		/* 10 */
	char	Exit[71];
	char	Topic[31];
	char	Alias[21];
	char	Noise[71];
	UBYTE	Action;
	UBYTE	DefRoom;
	UBYTE	Quit;
	UBYTE	AllowReal;

	UBYTE	expansion[25];		/* 278 */
};

struct SelectType {			/* Select list */
	long	Size;

	char	Title   [32];
	char	Location[96];		/* physical path to file */
	short	Base;			/* physical subboard # */

	UBYTE	SDownFiles;		/* Which accounting schedule ? */
	UBYTE	SDownBytes;

	UBYTE	temp_rem;		/* DS from DS list!! */
	UBYTE	CDROM;			/* Copy to CDROMpath before download? */
	BYTE	FreeStuff;
	UBYTE	AutoKill;		/* 1==mark for amaint deletion when downloaded
					   2==Yank, 3==DELETE when unselected */

	long	ByteDownload;		/* credits to subtract when this */
	short	FileDownload;		/* item is downloaded ... */
					/* makes * faster by being here */
	struct	IsDate ADate;		/* utility ... AO adopt dates? */

	long	Number;			/* item number */
};

struct BaseUser {
	long	UID;			/* ==IDNumber if user's been here */

	BYTE	Joined;			/* -1 dropped, 0 sub.def., 1 joined  */
	BYTE	Invited;		/* -1 denied,  0 sub.def., 1 invited */
	BYTE	Sort;
	UBYTE	scan_flags;		/* used to 'mark' subboards */

	struct	IsDate LastMNew;
	struct	IsDate MNewDate;

	long	Created;		/* when sub was created */

	char	Alias[22];
	BYTE	Carbons;		/* -1 no, 0 sub.def., 1 yes */
	UBYTE	MNewSave;

	short	tome0;
	short	tome1;			/* while "online" */

	char	expansion[12];
};

struct HeaderType {
	struct	IsDate ShowDate;	/* for display */
	struct	IsDate EditDate;	/* last edited */
	struct	IsDate PostDate;

	short	ByAccount;

	char	NetAddress[52];		/* May be shortened */
	long	UUCPnumber;

	char	other[16];

	char	By[36];			/* Real name or alias */
	char	ByUser[24];		/* Handle */
	long	ByID;

	char	To[36];
	char	ToUser[24];
	long	ToID;

	UBYTE	ByNotParanoid;		/* allow showing real name? */
	UBYTE	ByAnonymous;
	UBYTE	ToAnonymous;
	UBYTE	Private;

	UBYTE	Imported;
	UBYTE	ByAlias;		/* is BY an alais for ByUser? */
	UBYTE	ToNotParanoid;		/* allow showing real name? */
	UBYTE	ToAlias;		/* is TO an alias for ToUser? */

	short	ToAccount;		/* for SendToMailBox() */

	ULONG	Magic;			/* to ensure alignment   */
	long	Number;			/* unique message number */

	long	Text;
	long	TextLen;

	char	Organ[31];

	UBYTE	Received;

	short	unknown;

	long	Next;
	long	Previous;
};

struct	OldMessageType {
	long	ItemNumber;
	long	ResponseNumber;
	long	ByID;
	long	ToID;

	struct	IsDate PostDate;

	UBYTE	Imported;
	UBYTE	IsFile;
};

struct	MessageType3 {
	long	ItemNumber;		/* item serial ID# */
	long	Seek;			/* position in text */
	long	ByID;
	long	ToID;
	long	Number;			/* serial ID# */

	struct	IsDate PostDate;

	UBYTE	Imported;
	UBYTE	IsFile;
};

struct	OldItemType {
	long	Number;
	long	Response1;		/*  1st valid response # */
	long	Responses;		/* last valid response # */

	char	Title[72];
	struct	IsDate PostDate;	/* new item ?      */
	struct	IsDate RespDate;	/* new responses ? */

	long	ByID;
	long	ToID;

	long	Size;
	long	Downloads;
	char	Info[84];
	struct	IsDate UsedDate;	/* new downloads ? */
	short	Part;			/* which partition? */

	short	fcredit;	/* Remember the Accounting credits */
	short	bcredit;	/* and File/Byte credits given for */
	UBYTE	fratio;		/* for this item so they can accurately */
	UBYTE	bratio;		/* be removed if un-validated or killed */

	UBYTE	Private;
	UBYTE	Killed;

	UBYTE	PleaseKill;
	UBYTE	Frozen;
	UBYTE	Free;
	UBYTE	Protected;

	UBYTE	Favorite;
	UBYTE	Validated;
	UBYTE	Finished;
	UBYTE	Described;

	UBYTE	Transformed;		/* has the script been ran? */
	UBYTE	MissingPost;
	UBYTE	MissingFile;
	BYTE	Integrity;		/* 0 == not tested
					   1 == passed
					  -1 == failed
					   2 == not testable */

	short	ByAccount;		/* for AddCredits */

	short	order;			/* for New Files Scan */
	short	base;
	UBYTE	WasMoved;

	BYTE	expand[57];
};

/* size = 34 */

struct	ItemHeader {
	long	Number;
	long	Size;			/* ==0-->POST, not file */
	long	Responses;		/* How many responses */

	struct	IsDate PostDate;	/* new item ?      */
	struct	IsDate RespDate;	/* new responses ? */

	UBYTE	TitleSort[9];
	UBYTE	Killed;
};

struct	ItemType3 {
	char	Title[42];		/* 0 */
	short	ByAccount;		/* 42 Uploader's account # */

	long	ByID;			/* 44 */
	long	ToID;			/* 48 */

	struct	IsDate UsedDate;	/* 52 new downloads ? */
	short	Part;			/* 58 which partition? */

	long	Downloads;		/* 60 */

	long	ByteCharges;		/* 64 Accounting system charges to the */
	short	FileCharges;		/* 68 uploader ... */

	UBYTE	Private;		/* 70 */
	UBYTE	DLnotifyULer;		/* 71 */

	UBYTE	PleaseKill_NOT;		/* 72 */
	UBYTE	Frozen;			/* 73 */
	UBYTE	Free;			/* 74 */
	UBYTE	delta;

	UBYTE	Favorite;		/* 76 */
	UBYTE	Validated;		/* 77 */
	UBYTE	Finished;		/* 78 */
	UBYTE	Described;		/* 79 */

	UBYTE	Transformed;		/* 80 has the script been ran? */
	UBYTE	PurgeKill;		/* 81 delete file when purged? */
	UBYTE	MissingFile;		/* 82 offline? */
	BYTE	Integrity;		/* 83	0 == not tested
						1 == passed
					       -1 == failed
						2 == not testable */

	UBYTE	AutoGrab;		/* 84 ASCII-Grab when read */
	UBYTE	PurgeStatus;		/* 85   0 == Auto
						1 == @DL
						2 == Query@DL
						3 == @Amaint
						4 == Protected */

	struct	IsDate ShowDate;

	UBYTE	nada[7];		/*  86 reserved */
	UBYTE	VirusChecked;		/*  99 */
	UBYTE	override;		/* 100 */
	UBYTE	loaded;			/* 101 is in memory? */

	short	FilePayBack;		/* 102 after each download */
	long	BytePayBack;		/* 104 Credits to award the uploader */

	long	VoteLink;		/* 108 vote serial# */
	long	SizeTemp;		/* 112 used privately by AT */

	long	ByteRewards;		/* 116 # of bytes awarded so far */
	long	FileRewards;		/* 120 # of files awarded so far */

	long	ByteDownload;		/* 124 Number of byte cred to download */
	short	FileDownload;		/* 128 Number of file cred to download */

	struct	IsDate DLableFrom;	/* 130 */
	struct	IsDate DLableTo;	/* 136 */
	struct	IsDate PurgeOn;		/* 142 */

	long	BestCPS;		/* 148 best download rate this file */

	long	First;			/* 152 pointer to post in _Text */
	long	Last;			/* 156 pointer to last response in _Text */

	long	InfoX;			/* 160 pointer into _Short */
	long	InfoLen;		/* 164 */
};

struct FreeType
{
	long	start;
	long	length;
	struct	FreeType *next;
};

/* Total length == 332 */

struct OldSubboardType {
	char	Title[31];		/* 0  */
	char	SubDirName[21];		/* 31 */
	char	Part0Path [40];		/* 52 */
	long	Parts;			/* 92 partitions 0-31 now allowed */

	long	SubOpIDs [6];		/* 96 */

	short	MRewardBytes;		/* 120 % of byte  size to award */
	short	NRewardFiles;		/* 122 # of file creds to award
					       uploader each time his file is
					       downloaded */

	struct	FreeType *free;		/* 124 */
	long	nf;			/* 128 */
	long	nfmax;			/* 132 */

	short	SubOpAccs[6];		/* 136 */

	char	Filler[4];		/* 148 shown during SCAN */

	short	fdelta;			/* 152 */
	short	fowner;			/* 154 current owner of "free" */

	UBYTE	Direct;			/* 156 Disk-exchange type */
	UBYTE	Vote;			/* 157 May non-sysops add topics? */

	short	FreeDays;		/* 158 when files are auto-free */

	UBYTE	Subdirectory;
	UBYTE	Closed;

	long	UnionFlags;		/* 162 Must have all of these flags */
	long	Access;			/* 166 Groups which may ENTER */
	long	PostAccess;		/* 170 Groups which may Post  */
	long	RespondAccess;		/* 174 ... Respond */
	long	UploadAccess;		/* 178 ... Upload */
	long	DownloadAccess;		/* 182 ... Download */
	long	ComputerTypes;		/* 186 */
	long	Hours;			/* 190 restricted entry hours */
	long	HourUnionFlags;		/* 194 */
	long	HourAccess;		/* 198 groups which may Enter during Hours*/
	long	Baud;			/* 202 minimum Baud rate to enter */
	long	BaudHours;		/* 206 hours to enforce min baud rate */

	UBYTE	Gender;			/* 210 0 or 'M', 'F' */
	UBYTE	AllowAliases;
	UBYTE	OnlyOnce;		/* 212 */
	UBYTE	Youngest;		/* 213 */

	UBYTE	EXTRA;

	UBYTE	Oldest;			/* 215 */

	struct	IsDate	Sent;		/* 216 FIDO to track new messages */

	short	MDownBytes;		/* 222 % of download bytes to subtract */
	short	NDownFiles;		/* 224 # of files to subtract per download */
	short	MTimeCredit;		/* 226 % of time to give back for uploads */

	long	MinFreeBytes;	/* 228 to upload in this subboard */
	short	SubSort;	/* 232 */
	short	InactiveDays;	/* 234 */

	UBYTE	RealNames;	/* 236 use real names instead of Handles? */
	UBYTE	Addressees;
	UBYTE	Anonymous;
	UBYTE	override;	/* 239 how to set the use defaults flags in
					newly uploaded items */

	UBYTE	Verification;	/* 240 */
	UBYTE	DupCheck;
	UBYTE	ShowUnvalidated;
	UBYTE	NoMCI;

	UBYTE	PrivateArea;	/* 244 0/1 No/Yes ... 2==FORCE */
	BYTE	SDownFiles;	/* Which download charge schedules? */
	BYTE	SDownBytes;
	UBYTE	TestImmediate;	/* test at upload time */

	UBYTE	TransImmediate;	/* 248 run script at upload time */
	UBYTE	AutoAdopt;	/* Adopt Orphans at a-maint */
	UBYTE	WeedResponses;	/* Use inactive days against indiv responses */
	UBYTE	NoSignatures;

	UBYTE	NoReadCharges;	/* 252 opt to short circuit accounting system */
	UBYTE	NoWriteCharges; /* 253 for reading/writing messages */

	long	Arcs;		/* 254 which Arcs in BBSARC are allowed uploaded*/

	short	UpRatioBytes;	/* 258 which set of file/byte ratios to use? */
	short	UpChargeBytes;	/* 260 which set of charges to use?          */
	short	UpRatioFiles;	/* 262 */
	short	UpChargeFiles;	/* 264 */

	UBYTE	Invitation;	/* 266 */
	UBYTE	UserMustJoin;
	UBYTE	DeleteOwn;
	UBYTE	Marker;		/* 0 = Base, 1 = UDBASE, &128 = Killed */

	long	Transforms;	/* 270 which BBSARCS to transform */

	char	NetPath[20];	/* 274 */
	UBYTE	NetNumber;	/* 294 */ 
	UBYTE	Locked;		/* 295 Does AMAINT have a lock here? */
	UBYTE	DLnotifyULer;	/* 296 */

	char	Transform[5];	/* 297 */

	UBYTE	QWKReplies;	/* 302 */
	BYTE	SBaseUse;	/* 303  which BBSCHARGE rate to use? */
	UBYTE	CarbonCopy;	/* 304 */
	UBYTE	CDROM;		/* 305 copy to hard drive before download? */

	struct	IsDate LastUpload;
	struct	IsDate LastMessage;

	short	Users;		/* how many people are in this sub
				   REAL TIME (not # of members) */

	long	Created;	/* for membership determination */

	short	Parent;		/* pointers to other subboard #s */
	short	Child;
	short	Next;

	short	TimeLock;	/* 330 minutes online before available */
};

struct NewSubboardType {
	char	Title[31];		/* 0  */
	char	SubDirName[21];		/* 31 */
	char	DataPath  [40];		/* 52 */
	long	Parts;			/* 92 partitions 0-31 now allowed */

	long	SubOpIDs [6];		/* 96 */

	short	MRewardBytes;		/* 120 % of byte  size to award */
	short	NRewardFiles;		/* 122 # of file creds to award
					       uploader each time his file is
					       downloaded */

	struct	FreeType *free0;	/* 124 */
	long	nf_obs;			/* 128 */
	long	nfmax_obs;		/* 132 */

	short	SubOpAccs[6];		/* 136 */

	char	Filler[6];		/* 148 shown during SCAN */

	UBYTE	fdelta;			/* 152 */
	UBYTE	floaded;		/* 154 */

	UBYTE	Direct;			/* 156 Disk-exchange type */
	UBYTE	Vote;			/* 157 May non-sysops add topics? */

	short	FreeDays;		/* 158 when files are auto-free */

	UBYTE	Subdirectory;
	UBYTE	Closed;

	long	UnionFlags;		/* 162 Must have all of these flags */
	long	Access;			/* 166 Groups which may ENTER */
	long	PostAccess;		/* 170 Groups which may Post  */
	long	RespondAccess;		/* 174 ... Respond */
	long	UploadAccess;		/* 178 ... Upload */
	long	DownloadAccess;		/* 182 ... Download */
	long	ComputerTypes;		/* 186 */
	long	Hours;			/* 190 restricted entry hours */
	long	HourUnionFlags;		/* 194 */
	long	HourAccess;		/* 198 groups which may Enter during Hours*/
	long	Baud;			/* 202 minimum Baud rate to enter */
	long	BaudHours;		/* 206 hours to enforce min baud rate */

	UBYTE	Gender;			/* 210 0 or 'M', 'F' */
	UBYTE	AllowAliases;
	UBYTE	PurgeStatus;		/* 212 */
	UBYTE	Youngest;		/* 213 */

	UBYTE	EXTRA;

	UBYTE	Oldest;			/* 215 */

	struct	IsDate	Sent;		/* 216 FIDO to track new messages */

	short	MDownBytes;		/* 222 % of download bytes to subtract */
	short	NDownFiles;		/* 224 # of files to subtract per download */
	short	MTimeCredit;		/* 226 % of time to give back for uploads */

	long	MinFreeBytes;	/* 228 to upload in this subboard */
	short	SubSort;	/* 232 */
	short	InactiveDays;	/* 234 */

	UBYTE	RealNames;	/* 236 use real names instead of Handles? */
	UBYTE	Addressees;
	UBYTE	Anonymous;
	UBYTE	override;	/* 239 how to set the use defaults flags in
					newly uploaded items */

	UBYTE	Verification;	/* 240 */
	UBYTE	DupCheck;
	UBYTE	ShowUnvalidated;
	UBYTE	NoMCI;

	UBYTE	PrivateArea;	/* 244 0/1 No/Yes ... 2==FORCE */
	BYTE	SDownFiles;	/* Which download charge schedules? */
	BYTE	SDownBytes;
	UBYTE	Test;		/* test at upload time */

	UBYTE	Transform;	/* 248 run script at upload time */
	UBYTE	AutoAdopt;	/* Adopt Orphans at a-maint */
	UBYTE	WeedResponses;	/* Use inactive days against indiv responses */
	UBYTE	NoSignatures;

	UBYTE	NoReadCharges;	/* 252 opt to short circuit accounting system */
	UBYTE	NoWriteCharges; /* 253 for reading/writing messages */

	long	Arcs;		/* 254 which Arcs in BBSARC are allowed uploaded*/

	short	UpRatioBytes;	/* 258 which set of file/byte ratios to use? */
	short	UpChargeBytes;	/* 260 which set of charges to use?          */
	short	UpRatioFiles;	/* 262 */
	short	UpChargeFiles;	/* 264 */

	UBYTE	Invitation;	/* 266 */
	UBYTE	UserMustJoin;
	UBYTE	DeleteOwn;
	UBYTE	Marker;		/* 0 = Base, 1 = UDBASE, &128 = Killed */

	long	Transforms;	/* 270 which BBSARCS to transform */

	long	ExportTo;	/* 274 */

	char	NothingNow[8];	/* 278 */

	long	count;		/* 286 replaces the _COUNT file */
	long	hiwater;	/* 290 */

	UBYTE	NetNumber;	/* 294 */ 
	UBYTE	Locked;		/* 295 Does AMAINT have a lock here? */
	UBYTE	DLnotifyULer;	/* 296 */

	char	TransformTo[5];	/* 297 */

	UBYTE	QWKReplies;	/* 302 */
	BYTE	SBaseUse;	/* 303  which BBSCHARGE rate to use? */
	UBYTE	CarbonCopy;	/* 304 */
	UBYTE	CDROM;		/* 305 copy to hard drive before download? */

	struct	IsDate LastUpload;
	struct	IsDate LastMessage;

	short	Users;		/* how many people are in this sub
				   REAL TIME (not # of members) */

	long	Created;	/* for membership determination */

	short	Parent;		/* pointers to other subboard #s */
	short	Child;
	short	Next;

	short	TimeLock;	/* 330 minutes online before available */

	char	ZeroPath[48];	/* 332 */
	char	Origin  [60];	/* 380 */

/* if more room is needed, I could put all of this into a pointer to a
   'sub-info' structure */

	short	MaxItems;	/* 440 */
	UBYTE	Persist;	/* 442 */
	UBYTE	Delay;		/* 443 */

	struct	ItemType3 *Item;
	struct	ItemHeader *ihead;
	struct	MessageType3 *NewMess;
	struct	SignalSemaphore *sem;

	long	nm;		/* 460 # of _Messages */
	short	rn;		/* 464 # of _Items */
	short	AllocItems;
	short	nNewMess;

	UBYTE	resetIP;	/* 470 */

	char	more_stuff[17];	/* 471 */
};

/* LONG aligned.  Total length == 348 */

struct SerPort {
	long	unit;		/* 0 */
	long	flags;		/* 4 */

	short	idlebaud;	/* 8 */
	short	escape;
	short	answerpause;	/* 12 */
	short	seconds;

	char	name[21];	/* 16 */
	char	init1[50];
	char	ppass[11];
	char	init2[61];
	char	hangup[21];
	char	dialout[21];
	char	answer[21];
	char	offhook[21];
	char	terminal[50];
	char	callerid[11];
	char	ring[9];
	char	connect[11];

	char	termlink[21];	/* 324 */

	UBYTE	other[2];

	UBYTE	null;		/* local terminal, no clear line */
};

/* LONG aligned.  Total length == 20 */

struct	PortConfig {
	UBYTE	online;			/* port loaded or not */
	UBYTE	open;			/* 1==perm, 2==call only */

	UBYTE	check;			/* menus */
	UBYTE	idle;			/* clock, SAG, SAM ? */

	UBYTE	offline;		/* port loaded, but modem offline */
	UBYTE	not_used;

	UBYTE	bplanes;
	UBYTE	lace;			/* 0=none, 1=24 line, 2=49 line */

	USHORT	sizes[8];		/* workbench window & zoom size */
};

/* LONG aligned.  Total length==92 */

struct Privs {				/* each user&group has one */
	long	MBaseFlags;		/* 580 */
	long	FBaseFlags;		/* 584 Can user reach which subs ? */
	long	LBaseFlags;		/* 588 Gfiles/Pfiles flags */

	ULONG	ABits;			/* 592 see bitdefs above */

	long	DailyDownBytes;		/* 596 */
	long	DailyUpBytes;		/* 600 */
	long	XFreeBytes;		/* 604 !!! NOT USED ANYMORE !!! */
	long	XFreeFiles;		/* 608 SEE GLOBAL DEFAULT IN CONFIG1 */

	short	Calls;			/* 612 */
	short	CallMinutes;		/* 614 */
	short	DailyMinutes;		/* 616 */
	short	DailyDownloads;		/* 618 per 24 hr DAY */
	short	DailyUploads;		/* 620 same */
	short	Messages;		/* 622 */
	short	Feedbacks;		/* 624 */
	short	EditorLines;		/* 626 */
	short	Idle;			/* 628 */
	short	MaxMailKBytes;		/* 630 before mail-receive is limited */
	short	PurgeDays;		/* 632 */

	UBYTE	FileRatio;		/* 634 */
	UBYTE	ByteRatio;
	UBYTE	FileRatio2;
	UBYTE	ByteRatio2;
	UBYTE	FileRatio3;
	UBYTE	ByteRatio3;

	ULONG	ABits2;			/* 640 now gives 64 flags! */

	short	SigLines;		/* 644 how many lines per signature */

	UBYTE	AllowAliases;		/* 646 new tri-state variables */
	UBYTE	DeleteOwn;
	UBYTE	Anonymous;
	UBYTE	PrivateArea;

	short	DailyPfileMinutes;	/* 650 */
	short	LogToMail;		/* account # to send log */

	long	LogFlags;		/* 654 */

	UBYTE	CallBack;		/* 658 Tri-state */
	UBYTE	TermLink;		/* 659 */
	UBYTE	CallerID;		/* 660 */
	UBYTE	PageSysop;		/* 661 */

	char	exp[ 6 ];		/* 662 */

	short	Alias;			/* 668 */
	short	Dictionary;		/* 670 */
};

struct AccessGroup {
	char	Name[32];		/*   0 */
	struct	Privs DefPrivs;		/*  32 */

	short	ExpireDays;		/*  32+92 */
	UBYTE	ExpireAccess;		/*  32+94 */

	char	exp[29];
};

/* FILE: BBS.UKEYS3
   Alpha "key" for sortable data.  Phone# for caller-id, Handle/RealName
   for user addressing/mail/logon/etc.
*/

struct KeyElement3 {
	char	UUCP[8];
	long	IDNumber;		/* high order byte ALWAYS 0 */
	long	phone1, phone2;		/* data phone's area code & local # */
	char	Handle   [21];
	char	RealName [26];
	UBYTE	PName;
};

struct OldKeyElement {
	char	Handle[22];		/* actual user handle */
	short	HandleX;		/* account number where found */
};

struct MarkType {
	short	sub;			/* The new system can uniquely  */
	long	ItemNumber;		/* identify a message with this */
	long	Seek;			/* information.  Used for Z/ZG. */
	long	Number;
};

struct TransType {
	struct	TransType *next;	/* linked list */

	long	lines;
	long	bytes;

	UBYTE	**mm;			/* pointers to BBSMENU lines */
	UBYTE	**bm;			/* pointers to BBSTEXT lines */
	short	menustart[50];		/* */
	short	menulen  [50];
};

struct NoiseType {
	struct	NoiseType *next;

	long	lines;
	long	bytes;

	char	**nn;
	char	*args;
};

struct MainPort {			/* common, public to all ports */
	struct	MsgPort mp;		/*   0 standard EXEC message port  */
	char	portName[22];		/*  34 */

	char	LastOn[32];		/*  56 */

	long	Nums[5];		/*  88 [0] # of physical user accounts
					       [1] # of in-use user accounts
					       [2] last assigned unique ID Number
					       [3] # of calls to system TOTAL
					       [4] # of calls now logged */

	ULONG	SAG[2][72];		/* 108 activity graph    */
	long	SAM[5][15];		/* activity monitor  */
	struct	IsDate SAMDate[6];	/* */

	long	um[10];			/* for C programmer use.  You can */
					/* (typecast) them as you need to. */
					/* Initially at bootup == 0 */

	struct	Window		*PWindow;
	struct	TransType	*FirstTT;
	struct	NewSubboardType *Subboard;
	struct	LinkPort	*link;	/* all-linked port users! */
	struct	KeyElement3	*Key;	/* alpha order, etc. */
	short	*IName;			/* Indexs into KeyElement3 array */
	short	*IPhone;
	char	*SubTitle;
	char	**Noise_00;		/* Conference NOISE memory */
	char	*NArg_00;		/* */

	long	ns;			/* number of subs in memory */
	long	nNOISElines_00;
	long	nNOISEbytes_00;
	long	YankCount;
	long	OpenPfiles;		/* */

	struct	NoiseType	*FirstNT;

	long	ClickMaint;		/* can we use local mouse maint? */
	long	Verbose;		/* do not redirect to NIL: for debug */

	long	s1;			/* version of CONTROL */
	long	s2;
	long	s3;			/* serial number of owner 0==DEMO */

	struct	BitMap  ClockBrush;	/* 40 bytes */
	struct	SignalSemaphore SEM[19];	/* for critical secs. */
	struct	AccessGroup     AGC[32];	/* BBS.ADATA stuff    */

	struct	Config1 gc;

	char	SysPassword[6][21];
	char	IDQ[6];			/* obs */

	struct	PortConfig  pc   [101];	/* For CONTROL, remembers things */
	struct	PortData   *PortZ[100];	/* pointers to each port's PortData struct */
	struct	Room       *CRoom[100];	/* pointers to ROOM structures  */

	struct	ULock *FirstULock;	/* Account Locking ... ! */
	short	LastTickHour;		/* control is ticking ... */
	short	LastTickMinute;

	short	HiPort;
	short	nPorts;

	char	regto[32], regco[32];
};

/* LONG Aligned, total length==672 */

struct UserData {			/* each user account */
	long	IDNumber;		/* 0 unique (serial) ID # */
	char	Handle[21];		/* 4 */
	char	RealName[26];		/* 25 */
	char	Address[31];		/* 51 */
	char	CityState[31];		/* 82 */
	char	ZipCode[11];		/* 113 */
	char	Country[8];		/* 124 */
	char	PhoneNo[17];		/* 132 Euro 8-7 format POSSIBLE!! */
	char	PassWord[15];		/* 149 */
	char	Comments[34];		/* 164 */
	char	Macro[3][36];		/* 198 user's defined macro keys */
	char	Organ[31];		/* 306 */
	UBYTE	PhoneVerified;		/* 337 */

	char	not_used[4];		/* 338 */

	struct	IsDate Birthdate;	/* 342 */
	struct	IsDate FirstCall;	/* 348 */
	struct	IsDate LastCall;	/* 354 */

	struct	IsDate NO_LONGER_USED;	/* 360 */

	struct	IsDate ConnectDate;	/* 366 */
	struct	IsDate YankDate;	/* 372 */

	BYTE	Access;			/* 378 */
	BYTE	ExpireAccess;		/* 379 */

	short	PfileTimeToday;

	short	not_used2;

	BYTE	TextSet;		/* 384 which BBSTEXT/MENU translation */
	BYTE	TimeForm;
	BYTE	MoreMode;
	BYTE	LineFeeds;
	BYTE	ObsParanoia;
	BYTE	TimeZone;
	BYTE	Colors;			/* can user display ANSI colors? */
	BYTE	Tabs;			/* can user do ANSI tabs? */
	BYTE	ANSI;			/* 392 */
	BYTE	Sex;
	BYTE	AutoMore;		/* More? and CLS between messages? */
	BYTE	TermType;
	BYTE	HelpLevel;		/* 396 */
	BYTE	CompType;
	BYTE	DefProtocol;		/* 398 */
	BYTE	TermWidth;
	BYTE	TermLength;		/* 400 */
	BYTE	MailBoxOpen;		/* 401 */
	short	MailForward;		/* 402 */

	long 	TotalCalls;		/* 404 */
	long	PubMessages;		/* 408 */
	long	PriMessages;		/* 412 */
	long	UpBytes;		/* 416 KILO bytes */
	long	UpFiles;		/* 420 */
	long	DownBytes;		/* 424 KILO bytes */
	long	DownFiles;		/* 428 */

	long	FileCredits;		/* 432 CREDITS used now! */
	long	ByteCredits;		/* 436 */
	long	TimeCredits;		/* 440 */

	long	Balance;		/* 444 */
	long	NetCredits;		/* 448 */
	long	DoorPoints;		/* 452 */

	long	DayUpBytes;		/* 456 */
	long	DayDownBytes;		/* 460 */
	short	DayUpFiles;		/* 464 */
	short	DayDownFiles;		/* 466 */

	short	CallsToday;		/* 468 */
	short 	TimeToday;		/* 470 */
	short	LogonAttempts;		/* 472 */

	USHORT	BaudRate;		/* 474 */
	USHORT	HighBaud;		/* 476 */

	char	UUCP[11];		/* 478 */

	UBYTE	PName;			/* 489 flags, are these data     */
	UBYTE	PAge;			/* items to be kept private? */
	UBYTE	PAddress;		/* street address only */
	UBYTE	PVoice;			/* phone numbers */
	UBYTE	PData;

	char	Banner[43];		/* 494 */

	char	VoiceNo[17];		/* 537 Euro 8-7 format POSSIBLE!! */

	short	YankCount;		/* 554 */

	struct	IsDate ExpireDate;	/* 556 */
	struct	IsDate FNewDate;	/* 562 */

	char	more[7];		/* 568 reserved */

	UBYTE	YankCR;			/* 575 add CR's to yank text? */
	UBYTE	YankArc;		/* which archiver to use? */
	BYTE	DefEditor;		/* 577 */
	BYTE	AutoHide;
	BYTE	PrivsSet_NOT;		/* 579 */
	struct	Privs MyPrivs;		/* 580 THESE ACTUALLY USED, not AGC */
};

struct OLMHeader {
	char	ByUser[26];		/* actual handle only */
	short	ByAccount;
	short	Port;

	UBYTE	system;
	UBYTE	broadcast;

	UBYTE	other[22];
};

/* length == 296 */

struct MailHeader {			/* NEW 2.0 for mail, etc */
	struct	IsDate  Date;
	struct	IsDate	EDate;		/* for EXPIRATION setting */
	short	EDays;
	char	Subject [81];		/* Ahh, nice and roomy */
	char	From    [27];

	long	Number;

	short	ByAccount;
	long	ByID;

	char	To	[28];		/* originals, if was Sent/forwarded */
	long	ToID;
	short	ToAccount;

	UBYTE	Receipt;		/* return-receipt ?? */
	UBYTE	Return;			/* return original message?? */

	UBYTE	HasOriginal;		/* is original attached to this one? */
	UBYTE	File;			/* for File Mail */
	UBYTE	Anonymous;		/* From an anonymous user? */

	char	Route	[41];		/* for Bulk Mail, list of recips */
	short	Recipients;		/* number of recipients ... */
	UBYTE	Party;			/* Allow party responses? */

	long	Length;
	long	CheckSum;		/* must be 0 */

	long	Item;			/* if this message is repeated */
	long	Seek;			/* somewhere on the system     */
	short	Base;			/* this tells where !!!        */

	char	NetAddress[52];		/* may be shortened */

	UBYTE	Alias;
	UBYTE	Replied;
	UBYTE	Received;
	UBYTE	NoEdits;

	struct	IsDate  ShowDate;
};

/* LONG aligned.  Length==172 */

struct Subdirectory {
	long	SubOpIDs [10];
	short	SubOpAccs[10];

	long	Access;
	long	UnionFlags;

	long	Hours;
	long	HourUnionFlags;
	long	HourAccess;

	long	Baud;
	long	BaudHours;

	short	Youngest;
	short	Oldest;

/* when the Download command is used on a Gfile */

	short	NDownFiles;	/* # of download files to subtract */
	BYTE	SDownFiles;	/* Which download charge schedules? */
	BYTE	SDownBytes;

/* per-usage charge schedules from BBSCHARGESX.A files */

	long	unused;

	UBYTE	Gender;		/* 0 or 1, 2 */
	UBYTE	SBaseUse;	/* accounting schedule for this area */
	UBYTE	Closed;

	UBYTE	exp[61];

	long	ComputerTypes;

	short	TimeLock;	/* minutes online before available */
	short	MDownBytes;	/* % of download Bytes to subtract */
};

struct ListItem {
	short	Version;		/* should be 225 */
	char	Path       [54];	/*   2 */
	char	Description[64];	/*  56 */
	char	Arguments  [64];	/* 120 */

	long	Access;			/* 184 */
	long	UnionFlags;		/* 188 */

	struct	IsDate Date;		/* 192 */

	short	SCharge;		/* 198 accounting use-of-item charge */

	UBYTE	Subdirectory;		/* 200 */
	UBYTE	FifoFlags;		/* 201 1==RAW startup */
	UBYTE	ReadFlags;		/* internal only */
	UBYTE	Environ;

	UBYTE	DailyPfileTime;		/* 204 subtract from daily pfile time? */
	UBYTE	Disabled;		/* 205 */
	UBYTE	Type;			/* 206 not really used yet */
	UBYTE	PurgeKill;		/* 207 Delete item when purged? */

	UBYTE	Expansion[14];		/* 208 */

	struct	IsDate PurgeDate;	/* 222 */
};

/* Length== 176 */

struct OldListItem {
	char	Path       [51];	/* 0 */
	char	Description[61];	/* 51 */
	char	Arguments  [20];

	struct	IsDate Date;		/* 132 */

	long	Access;			/* 138 un-al */

	UBYTE	Subdirectory;		/* 142 */
	UBYTE	DaysToKeep;
	UBYTE	ReadFlags;		/* internal only */
	UBYTE	Environ;

	short	SCharge;		/* 146 override a subdir schedule */

	long	UnionFlags;

	UBYTE	DailyPfileTime;		/* subtract from daily pfile time? */

	UBYTE	Expansion[23];		/* 148 */
};

/* LONG aligned.  Length==48 */

struct CPort {				/* setup when a C pfile is ran */
	struct	MsgPort  mport;		/* 0 */
	short	align;
	struct	MainPort *myp;		/* 36 pointer to MainPort */
	struct	PortData *zp;		/* 40 pointer to my PortData */

	UBYTE	ack;			/* 44 tell CNet we've arrived */
	UBYTE	align2[3];
};

struct CMessage {			/* passed between C pfile and C-Net */
	struct	Message cn_Message;	/* 0 communication stuff */
	ULONG	arg1;			/* 20 */
	ULONG	arg2;
	ULONG	arg3;
	ULONG	arg4;
	ULONG	result;
	UBYTE	command;		/* 40 which command? see programming doc */
	UBYTE	align[3];
};

struct Event {
	long	Start;
	long	End;

	short	Event;
	char	Args[82];
	long	IntArgs;

	struct	Event *Next;
};

struct ConfigEvent {
	char	Ports[40];

	UBYTE	Days;		/* if this is 0, use Date */
	char	Date[7];

	short	Time,
		Duration,
		Interval,
		Iterations;

	short	Event;
	char	Args[81];

	UBYTE	Type;
};

/* all LONG's 4 byte aligned */

struct PortData {			/* each opened ports global vars */
	struct	IsDate	Today;		/* 0 what time is it right now? */
	struct	IsDate	VConnectDate;	/* 6 Virtual connect...eg 12am */

	short	id,			/* 12 current user1 account # */
		InPort,			/* 14 which port are we in??  */
		Age,			/* 16 how old am I ? */
		CurrentCPS,		/* 18 CPS rate.  240 == 2400 baud */
		OnType,			/* 20 type of logon  */
		OffType,		/* 22 */
		CallMessages,		/* 24 */
		CallFeedbacks,		/* 26 */
		TimeLeft,		/* 28 TENTHS of minutes left */
		TimeIdle,		/* 30 TENTHS of minutes without activity */
		TimeOnLine,		/* 32 TENTHS of minutes since logon */
		TimeCredit,		/* 34 TENTHS awarded for uploads, etc */
		LastTSR,		/* 36 */
		Carrier;		/* 38 Is there a carrier or Local? */

	char	*AName;			/* 40 ptr to access group name */
	long	SysMaint,		/* 44 */
		LocalTime,		/* 48 current area sur-time minutes */
		LocalCharge,		/* 52 current area sur-charge per minute */
		LastTime,		/* 56 */
		ServLen,		/* 60 seconds in-between Service() calls */
		Caller;			/* 64 which caller am I? */

	struct	UserData	user1,	/* 68 */
				user2;	/* 740 actual user structs */

	short	MyMail;			/* 1412 counters for user currently online */
	short	MyNewMail;		/* 1414 */
	short	bn;			/* 1416 current sub # */

	char	CallerID [18];		/* 1418 Received from Supra, prev connect */
	short	CIDmatch [ 8];		/* Accounts which MATCH, [0] will be current user  */

	UBYTE	expansion[18];		/* 1436 */

	UBYTE	PAccess,		/* 1470 */
		RAccess,
		DAccess,
		UAccess;

	char	fsuff[8],		/* 1474 more header stuff */
		fcore[32],		/* 1482 */
		Title[80],		/* 1514 Screen/Window */
		lastby[36];		/* 1594 */

	UBYTE	IUCBits[100];		/* 1630 Hidden, Muffled, Monitor, ChatReq */

	char	*MyDoing;		/* 1730 */
	struct	Room *CRoom;		/* 1734 which room am I in ? */
	struct	RoomUser *CUser;	/* 1738 where is my RoomUser struct */

	UBYTE	Dumped,			/* 1742 auto-kickoff flag	*/
		OLMWaiting,		/* 1743 OLM waiting		*/
		HideAll,		/* 1744 Hidden from ALL?	*/
		MuffAll,		/* 1745  Muffling ALL?	*/
		MonitorAll,		/* 1746 Monitoring ALL?	*/
		OnLine,			/* 1747 */
		nPdepth,		/* 1748 How many pfiles a port is running */
		ChatCode,		/* 1749 who's chatting with whom */
		WantToOpen,		/* 1750 */
		getout,			/* 1751 flag to auto-quit port */
		loaded,			/* 1752 Is this port loaded? */
		other[3];		/* 1753 */

	long	LastEvent,		/* 1756 keep track of the last event */
		LastCut,		/* 1760 time in these 4 catagories */
		LastHold,		/* 1764 */
		LastOnLine;		/* 1768 */

	long	TempSysMaint;
	short	ConfIdle;

	UBYTE	expansion2[16];		/* 1772 */

	ULONG	DOIO_MASK;		 /* 1794 */
	struct	IOStdReq 	*DoReq;	 /* 1798 */
	struct	MsgPort		*DoPort; /* 1802 */

	long	uz[10];			/* 1806 for C programmer use.  You can */
					/* (typecast) them as you need to */

	struct	Task		*ThisTask;
	struct	MainPort	*cnp;

	struct	Window		*Window, *CWindow, *SWindow, *TWindow,
				*TTWindow, *WBWindow;
	struct	Screen		*Screen;
	struct	RastPort	*wrp, *trp;
	struct	TextFont	*BlueFont,
				*StandardFont;
	struct	IOStdReq 	*UTReq, *ServReq, *PrintReq, *ConReq;
	struct	IOExtSer	*SerRdReq, *SerWrReq, *SerIOReq;
	struct	MsgPort		*SerRdPort,*SerWrPort,*SerIOPort, *ConPort,
				*UTPort,   *ServPort, *PrintPort, *cpreplyp;

	struct	FileInfoBlock	*fib;	/* for reading directories */
	struct	InfoData	*IData;	/* for getting free disk space, etc */
	struct	ItemType3       *Item_obs;
	struct	MessageType3    *Message;
	struct	BaseUser	*buser;
	struct	SelectType      *Select;
	struct	BaseUser	*brec;
	struct	SelectType	*Upload;
	struct	ListItem        *fpt;
	struct	ItemHeader	**ih, *ihead_obs;
	struct	ItemType3	**ip;
	char	**EdBuffer;		/* pointers to editor lines.*/
	char	*EdBase;		/* pointer to editor memory */
	UBYTE	*CR;			/* Is there a Carriage Return? ea line*/
	char	**mm;			/* pointers to bbsmenu lines */
	char	**bm;			/* pointers to bbstext lines */
	short	*menustart;
	short	*menulen;

	long	plsize, nplanes;	/* SkyStuff Stuff */
	short	skyxpen, skyypen;
	PLANEPTR planePtr;
	struct	TmpRas		tmpRas;
	struct	BitMap  	SkyBrush;

	long	FullMaint;

	long	numWE;			/* window-edit, current number */
	long	WWidth;		/* 80 */
	long	WLength;	/* 24 */
	long	WLeft;		/* def   0 */
	long	WRight;		/* def 639 */
	long	WTop;		/* def  11 */
	long	WBottom;	/* def YMAX */

	short	xc,			/* x coord, cursor pos */
		yc,			/* y coord */
		sxc,			/* storage for ANSI [s, [t */
		syc,
		YMAX,			/* max y value */
		CurrentMouseX,
		CurrentMouseY,
		countWE;		/* window-edit, # characters */

	short	IsHalfScreen;
	short	TermLength;

	short	SWidth;
	short	SHeight;
	short	DWidth;
	UBYTE	io_bad;
	UBYTE	io_status;		/* debugging Supra hangs */

	char	*by0,			/* scan and header variables */
		*by1,			/* for MCI configurability */
		*to0,
		*to1,
		*date0,
		*organ,

		plus[2],
		star[2],
		fdate[8],
		fsize[8],
		ftime[12],
		*title0,
		*olm_default,
		*vis_subj,
		*vis_to,
		*user_default,
		*subj_default;

	short	Depth;
	short	DHeight;

	short	TextSet;		/* 0==use system-wide text/menu */
	short	npitems;		/* number of items parsed */
	char	pitem[8][61];		/* last input parsed list */

	long	txline;			/* number of lines in ed buffer */
	char	GBuffer[16][81];	/* General purpose 2-D text buffer */
	UBYTE	GCR[16];

	ULONG	WaitFlags,
		SERVICE_MASK,
		RAWKEY_MASK;

	short	ACC[80],		/* accounting table currently in use */
		nowCharge;		/* schedule now in memory            */

	long	CTC[80];		/* users account, 62 items, Cost of This Call */

	short	sorder[240];		/* max subboards per subdir is 240 */

	char	*LastError;		/* for file transfer WHY command */

	char	RexxObject  [100],
		KBuff       [256],	/* keyboard buffer! */
		ABuffer     [256],	/* workspace */
		InBuffer    [256],	/* after a line input */
		FileNote    [364],
		Doing	     [48],
		SPrompt     [128],	/* subboard prompt */
		LPrompt     [128],	/* G/P/N list prompt */
		diskloc_obs  [80],
		ldiskloc     [80],	/* diskloc for P/G/N */
		myloc        [80],
		LastSubject_obs  [84],	/* for Read-Mail */
		filename    [116],
		ListArea     [40],
		rsearch      [64],
		myfile       [54],
		dirname      [32],
		CStack       [80],	/* Command stacking */
		ChatMsg      [84],	/* current chat message */
		sbuff        [48],
		outbuffer    [84],
		ansiout      [164],
		ConnectCode  [84],
		ChatBuff     [84],
		APrint       [36],	/* for PrintAccess */
		PName     [3][32],
		home         [36],
		qwk_to       [28],
		qwk_subject  [28],
		BackBuff [10][80],	/* last 10 commands executed */
		Pathx     [8][64];	/* g/p/n subdir history */

	long	bbnum;			/* pointer into D-Q */

	long	warn1;

	long	TotalCTC;		/* TOTAL Cost of this Call (100ths)*/

	short	bz,		/* # of subs on current List */
		dz,		/* how deep in the tree are we? */
		br,		/* item last used */
		rn_NOT,		/* how many items, current list */

		nl,		/* number on g/p/n list */
		allin_NOT,	/* Are all items in memory? */
		VTimeOnLine,	/* may reset at midnight */
		PTimeOnLine,	/* in-current-pfile time counter */

		mx,		/* highest item NOT killed */
		listn,		/* current list subboard pointer */
		parent0,
		gpos,		/* for global commands, last command # */

		nsubs,		/* tracks # subs accessed in a Global cmd */
		LinkPort;

	long	TermLinkBaud;

	long	nm_NOT,		/* were once SHORTS...moved here to*/
		rs,		/* avoid conflicts with 32767 max  */
		cpos,
		mstart,
		mend,
		new_i,		/* responses/item or per subboard  */
		new_n,
		new_f,
		new_p,
		new_ri,
		t_new_i,	/* total new items */
		t_new_n,	/* total new messages to you */
		t_new_f,	/* total new files */
		t_new_p,	/* total new posts */
		t_new_ri;	/* total new response items */

	short	AParams,
		AParam[17];

	UBYTE	qwk;
	UBYTE	ylharc;
	UBYTE	yaddcr;
	UBYTE	ylocal;

	short	zmatches;
	UBYTE	zheader;
	UBYTE	readnew;

	long	nsets,
		rset,
		rcount,
		rtotal,
		set[10][2];

	UBYTE	runseen,
		resetIP,		/* flag, must re-order item pointers */
		atbase,
		TermLink,

		rtome,
		rfree,
		rfavorite,
		runval,

		rprivate,
		rreverse,
		rbrandnew,
		rnresponse,

		rpass,
		rsince,
		rnew,
		rglobal,

		rdeftype,
		rchron,
		rbyme,
		runtil,

		rjustposts,
		rpreview,
		rbanner,
		rjustfiles;

	struct	IsDate	rdate,
			udate;

	short	pos,
		num,

		rdelta,		/* for/back n items */

		NoSelected,	/* number of items in Select List */
		NoUploaded,
		ModelType;		/* Controls .M in editor.  */

	struct	RangeContext EdRange;

	long	tline, bit_mci;
	short	times, repmode, MaxLines, WScroll;

	long	warn2;

	char	keyin,
		edall_not,		/* allow enterline all chars */
		serbuffer[2];

	UBYTE	mode,
		ZAlternate,
		CheckAllEvents,		/* force check of TimeTilEvent's */
		TrapDoor,

		AtPrompt,
		InShell,
		donormal,
		dtr,		/* modem device OPENED and ready */

		sread,		/* read request pending ... */
		modem,		/* modem exists ... allows BBSPORT0 */
		mio,		/* modem IO allowed */
		isud,		/* when in base, is UD, not BASE */

		MaxColors,		/* # of colors on screen */
		FlagCH,
		FlagED,
		Gflag,

		ConfMode,		/* Are we in conference? */
		column,
		KB1,			/* DeQueue pointers */
		KB2,

		KB3,			/* what inter-user chat sees */
		CursorStatus,		/* is cursor on? */
		AbortFlags,
		HourNow,

		LastHour,
		Indent,
		InANSI,
		GETarg,

		CMDarg,
		LocalMode,		/* BOOLS .. In Local Mode ? */
		noflowcontrol,
		AtWaitScreen,		/* Are we at IDLE? */

		InMCI,
		DoQuick,		/* ! at last input ? */
		AutoLogon,
		TermOn,			/* in terminal? */

		ANSIon,			/* can we type ansi? (ESC) */
		PrintFlags,		/* space or ^C pressed */
		CountUp,
		InputFlags,

		Relogon,
		Logoff,
		NewScanBROWSE,		/* BROWSE at logon scan for new? */
		AutoScroll,

		WWrap,
		DoubleBuffer,
		MoreRow,
		MoreAtRow,

		WScreen,
		InTransfer,
		NoMCI,
		FreezeTime,

		kolorific,
		mciflash,		/* actually, bold */
		mciscore,
		mcireverse,

		intense,		/* color greater than 7? */
		mciprint,
		mcispeed,
		mcicolor,		/* the requested MCI color 0-7 */

		pencolor,		/* actual screen pencolor */
		mcinoabort,
		backcolor,		/* background color */
		mciback,

		MCIenv,			/* current MCI environ flags */
		MCIdefenv,
		MRinuse,
		OffLine,		/* skip answering the phone?? */

		cminute, 
		chour,
		FNewSave,		/* flag: update FNewDate at logoff */
		intab;			/* for LoadLine() */

	char	mcitest,		/* MCI stuff */
		EditorOn,		/* is editor on? */
		var5,
		ScreenWidth;

	long	warn3;

	long	swrite, LogoffFlag;	/* file transfer stuff */
	long	ResumeSize;
	short	ResumeNumber, StartUpTime;

	short	protonum;
	char	protobyte;
	char	edbuff;			/*  1 saved new text
					    0 saved empty buffer
					   -1 aborted
					*/

/* If you use QuoteType=2, you MUST set the following three variables.
   Note that QuoteFrom and QuoteDate are POINTERS ... do NOT copy into
   them!
*/
	char	*QuoteFrom;		/* Who are we quoting? */
	struct	IsDate *QuoteDate;	/* When was that message written? */
	long	QuoteEnd;		/* LAST BYTE position in file */
					/* Quoter will stop automatically
					   if ^Z occurs first */
	UBYTE	qwk_anonymous;
	UBYTE	qwk_private;
	short	xfercount;

	long	XferTime;
	long	LastCPS, cpsavecount;
	long	cpsavesum, LastXTime, StartByte, LastByte;

	short	ARunCount;		/* depth of AREXX pfiles */
	short	CRunCount;		/* depth of C pfiles */
	char	CSpawn[84];

	long	TrapBaud;
	long	TrapLock;

	UBYTE	QuoteType;		/* 0==Mail, 1==Message base
					   2==User defined.  See QuoteFrom,
					      QuoteDate, etc., above */
	char	QuotePath[103];		/* MESSAGE QUOTING in editor. */
					/* SETTING this ENABLES quoting.
					   Remember to QuotePath[0] = 0 after
					   you use it. */
	long	QuoteSeek;		/* What's the starting byte pos? */

	short	imode;		/* editor.  Insert mode?  If yes, which line*/
	short	iline;

	long	abort;

	short	UrgentMail1;
	char	ExtTransfer;
	char	ExtProtocol;

	long	ExtMinFree;

	long	ALogon;
	long	BLogon;
	long	ATransfer;
	long	BDownload;
	long	BUpload;
	long	APfiles;
	long	BCharge;
	long	hiCharge;
	long	loCharge;

	long	rtoid;			/* to 'handle' searches */

	long	TimeTilOnLine,
		TimeTilCutoff,		/* Log user off first event */
		TimeTilEvent,		/* Immediate (regular) event */
		TimeTilHold;		/* hold until off-line event */

	long	SERIAL_MASK,
		UTILITY_MASK;

	char	*xpr_filename;


	UBYTE	xpr_obsolete[124];


	struct	MsgPort *rexxPort;
	long	rexxPortBit;
	char	*extension;
	struct	rexxCommandList *globalrcl;

	UBYTE	callback,		/* enable AUTOCALLBACK @ LOGON */
		avalid,			/* which avalid set to use */
		joinlink,		/* 0==off, 1==accept, 2==accept ONLY */
		FreezeIdle;		/* special use -- stop idle timer */

	long	rbyid;			/* by 'handle' searches */

	long	SAMNow[20];		/* users 'Last' SAM column */

	struct	CMessage	cpmess;
	struct	SerPort		sp;	/* BBSPORT data. see above struct */
	struct	BaseUser	xbrec;
	struct	ItemType3	Item0;
	struct	ItemHeader	ihead0;
	struct	HeaderType	Header0, LastHeader;
	struct	MailHeader	Mail0;
	struct	SelectType	Select0;
	struct	MessageType3	Message0;
	struct	Subdirectory	sub;

	struct	NewSubboardType *sb;

	char	rpattok[202];		/* tokenized search pattern */

	UBYTE	Subboard0_NOT [276];

	short	WBorTop;
	short	nupload;		/* # of upload allocated    */
	short	nips;			/* # of ip,ih now allocated */

	short	Monitored;		/* 128 + port number if monitored. */
	short	ModelEnable;		/* Controls .M in editor.  */

	BPTR	MCIfile;
	long	mcilabel;
	long	nlabels;
	long	mlabel[20];
	long	mfseek[20];
	long	MCInreg[10];
	char	MCIcreg[ 5][100];

	BPTR	sf;			/* for _short scan */
	long	sfin;

	long	VoteItem;		/* which vote? -1==New */
	char	*VotePath;		/* for Vote in Any Area! */

	UBYTE	q_kolorific,		/* MCI Q2/Q3 storage */
		q_mciflash,
		q_mciscore,
		q_mcireverse,

		q_intense,
		q_mciprint,
		q_mcispeed,
		q_mcicolor,

		q_mciback,
		q_mcinoabort,
		q_MCIenv;

	UBYTE	SelectInMemory;		/* is _select in memory or on disk? */

	struct	Event	*FirstEvent,
			*FirstCutEvent,
			*FirstHoldEvent,
			*FirstOnLineEvent;

	struct	TermLink tl;

	char	JoinLinkOut[76];

	struct	VDEentry *vv;		/* the currently loaded VDE file */
	short	vns;			/* used with VDEapply featuers!  */
	UBYTE	vmulti;			/* editing more than one?        */
	UBYTE	iselect;		/* is the input SELECTED?        */

	char	gmFile[40];		/* global Read-Mail variables... */
	long	*gmPos;			/* needed for Yank command ....  */
	UBYTE	*gmFlags;

	UBYTE	*amem;			/* DrawEd variables */
	UBYTE	*cmem;
	long	maxdraw;

	UBYTE	predraw;
	UBYTE	hmmmm[3];

	UBYTE	*smem;

	long	inlen, edlength;
};

#define HIDDEN_FLAG	0x01
#define MUFFLED_FLAG	0x02
#define MONITOR_FLAG	0x04
#define CHATREQ_FLAG	0x08

struct ULock {				/* account locking node!!! */
	short	Account;
	short	Wait;

	struct	SignalSemaphore Sem;

	struct	ULock *Next;
};

struct FidoNet {
	char from[36];
	char to  [36];
	char subject [72];
	char dateline[20];
	USHORT time;
	USHORT destnode;
	USHORT orignode;
	USHORT cost;
	USHORT orignet;
	USHORT destnet;
	USHORT destzone;
	USHORT orignzone;
	USHORT destpoint;
	USHORT orignpoint;
	USHORT replyto;
	USHORT attribute;
	USHORT nextrply;
};

struct PacketHeader {
	USHORT	orignode;
	USHORT	destnode;
	USHORT	year;
	USHORT	month;
	USHORT	day;
	USHORT	hour;
	USHORT	minute;
	USHORT	second;
	USHORT	baud;
	USHORT	two_oh;
	USHORT	orignet;
	USHORT	destnet;
	char	fill[34];
};

struct PackedMessage {
	USHORT	two_oh;
	USHORT	orignode;
	USHORT	destnode;
	USHORT	orignet;
	USHORT	destnet;
	USHORT	attribute;
	USHORT	cost;
	char	date[20];
};

struct NodeType {		/* a node that we export-to */
	char	*buffer;
	ULONG	buffpos;
	ULONG	buffsize;

	USHORT	zone;
	USHORT	net;
	USHORT	node;
	USHORT	point;

	USHORT	packer;
	USHORT	format;		/* 4d or 2d */
	USHORT	type;		/* normal, crash, hold */

	USHORT	flag;		/* 0-31 ... which subboards? */
	USHORT	domain;		/* which fido-net domain? */

	UBYTE	Access;
	UBYTE	Flags;

	USHORT	more[4];

	ULONG	incount;
	ULONG	outcount;

	char	Password[12];
};

struct RouteType {		/* a netmail routing pattern */
	USHORT	zone;		/* from ... -1's mean wildcard ... */
	USHORT	net;
	USHORT	node;
	USHORT	point;

	USHORT	zone2;		/* to */
	USHORT	net2;
	USHORT	node2;
	USHORT	point2;

	USHORT	domain;		/* which fido-net domain? */
	USHORT	type;		/* normal, crash, hold */

	USHORT	more[4];

	ULONG	outcount;
};

struct PacketType {
	struct	PacketType *next;

	char	filename[32];
};

struct ImportType {
	struct	ImportType *next;
	struct	PacketType *file;	/* which packet? */

	USHORT	zone0, net0, node0, point0;

	long	seek;
	long	end;
	long	seen;		/* index */
	long	xoff;		/* index */

	struct	IsDate date;

	UBYTE	isdupe;
};

struct	DupeType {
	USHORT	zone;
	USHORT	net;
	USHORT	node;
	USHORT	point;
	ULONG	data;
};

struct	EchoType {
	char	Title[24];
	ULONG	ExportTo[4];		/* export to which node types */

	struct	ImportType *first;	/* during toss, list to import */
	struct	ImportType *last;

	USHORT	listn;			/* during toss, which local sub? */
	USHORT	domain;

	struct	DupeType *duptab;
	ULONG	incount;
	ULONG	outcount;

	USHORT	dupsize;

	UBYTE	dupdelta;
	UBYTE	Access;
	UBYTE	Flags;

	UBYTE	other[3];

	char	Info[48];
};

struct	BBSItem {
	long	ID;

	char	Phone[16];
	char	Title[26];
	char	Location[21];
	char	Baud[6];
	char	Comments[62];
	char	Country[4];
	char	Flags[10];

	UBYTE	Immortal;

	struct	IsDate Date;
};
