U0 BgtDataRead()
{
	CBgtEntry 		*tmpb;
	CBgtTemplate	*tmpt;
	I64 					i,count,size;
	U8						*b,*ptr;
	I64 					max_num;
	U8						**s=StrFileRead(bgt_string_file,&max_num);

	MemSet(&b_head,0,sizeof(CBgtEntry));
	QueueInit(&b_head);
	b_head.date=Now;
	MemSet(&t_head,0,sizeof(CBgtTemplate));
	QueueInit(&t_head);
	t_head.b.date=Now;

	if (ptr=b=FileRead(bgt_data_file,&size)) {
		count=*ptr(I64 *)++;
		for (i=0;i<count;i++) {
			tmpb=CAlloc(sizeof(CBgtEntry));
			MemCopy(&tmpb->start,ptr,BE_SIZE);
			tmpb->credit=StrNew(s[tmpb->credit_idx]);
			tmpb->debit =StrNew(s[tmpb->debit_idx]);
			tmpb->desc	=StrNew(s[tmpb->desc_idx]);
			QueueInsert(tmpb,b_head.last);
			ptr+=BE_SIZE;
		}

		count=*ptr(I64 *)++;
		for (i=0;i<count;i++) {
			tmpt=CAlloc(sizeof(CBgtTemplate));
			MemCopy(&tmpt->start,ptr,BT_SIZE);
			ptr+=BT_SIZE;
			MemCopy(&tmpt->b.start,ptr,BE_SIZE);
			ptr+=BE_SIZE;
			tmpt->b.credit=StrNew(s[tmpt->b.credit_idx]);
			tmpt->b.debit =StrNew(s[tmpt->b.debit_idx]);
			tmpt->b.desc	=StrNew(s[tmpt->b.desc_idx]);
			QueueInsert(tmpt,t_head.last);
		}
	}

	StrFileArrDel(s,max_num);
	Free(b);

	BgtAcctsUpdate;
}

U0 BgtDataWrite()
{
	I64 i,num=0,size,count1,count2;
	CHashTable		*table=HashTableNew(1024);
	CBgtEntry 		*tmpb;
	CBgtTemplate	*tmpt;
	CHashGeneric *tmph;
	U8 *buf,*ptr;

	for (i=0;i<=accts_table->mask;i++) {
		tmph=accts_table->body[i];
		while (tmph) {
			StrFileAdd(tmph->str,&num,table); //Cosmetics -- make accts appear first.
			tmph=tmph->next;
		}
	}

	tmpb=b_head.next;
	count1=0;
	while (tmpb!=&b_head) {
		if (tmpb->type!=BE_TEMPLATE_COPY) {
			tmpb->credit_idx	=StrFileAdd(tmpb->credit,&num,table);
			tmpb->debit_idx 	=StrFileAdd(tmpb->debit,&num,table);
			tmpb->desc_idx						=StrFileAdd(tmpb->desc,&num,table);
			count1++;
		}
		tmpb=tmpb->next;
	}

	tmpt=t_head.next;
	count2=0;
	while (tmpt!=&t_head) {
		tmpt->b.credit_idx	=StrFileAdd(tmpt->b.credit,&num,table);
		tmpt->b.debit_idx 	=StrFileAdd(tmpt->b.debit,&num,table);
		tmpt->b.desc_idx						=StrFileAdd(tmpt->b.desc,&num,table);
		count2++;
		tmpt=tmpt->next;
	}
	StrFileWrite(bgt_string_file,table);
	StrFileDel(table);

	size=sizeof(I64)*2+count1*BE_SIZE+count2*(BT_SIZE+BE_SIZE);
	buf=ptr=MAlloc(size);

	MemCopy(ptr,&count1,sizeof(I64));
	ptr+=sizeof(I64);
	tmpb=b_head.next;
	while (tmpb!=&b_head) {
		if (tmpb->type!=BE_TEMPLATE_COPY) {
			MemCopy(ptr,&tmpb->start,BE_SIZE);
			ptr+=BE_SIZE;
		}
		tmpb=tmpb->next;
	}

	MemCopy(ptr,&count2,sizeof(I64));
	ptr+=sizeof(I64);
	tmpt=t_head.next;
	while (tmpt!=&t_head) {
		MemCopy(ptr,&tmpt->start,BT_SIZE);
		ptr+=BT_SIZE;
		MemCopy(ptr,&tmpt->b.start,BE_SIZE);
		ptr+=BE_SIZE;
		tmpt=tmpt->next;
	}

	FileWrite(bgt_data_file,buf,size);
	Free(buf);
}

U0 BgtDel()
{
	CBgtEntry 		*tmpb,*tmpb1;
	CBgtTemplate	*tmpt,*tmpt1;
	tmpb=b_head.next;
	while (tmpb!=&b_head) {
		tmpb1=tmpb->next;
		BgtEntryDel2(tmpb);
		Free(tmpb);
		tmpb=tmpb1;
	}
	tmpt=t_head.next;
	while (tmpt!=&t_head) {
		tmpt1=tmpt->next;
		BgtEntryDel2(&tmpt->b);
		Free(tmpt);
		tmpt=tmpt1;
	}
	StrFileDel(accts_table);
	accts_table=NULL;
	accts_table_strs=0;
}