#! /usr/local/bin/perl

#
#	͂Ղ Rev.0.1 Preview 9 (2000.9.3)
#	 (f{)
#
#	  mailto	kuzuha@kurumi.ne.jp
#	  webpage	http://kuzuha.tripod.co.jp/
#
#	TABSIZE=4
#
#	₵[ǁb Rev. 0.21 (2004.02.16)
#	 (f{)
#
#	OibcAFcCp[A[ÔL
#                            |    |
#	`A₩A󔒁AAL_`) A^c(j(s)
#
#
#
#	̑₵[ǁbɌgSĂ̐l
#
#	  mailto	admin@ge.st98.arena.ne.jp
#	  webpage	http://www.ge.st98.arena.ne.jp/

#LEm点폜(20040128)
#LEJ[@\(2003/11/29)thanks L_`)
#LEjumpurl666.htmlindex.html m点XV(2003/11/17)
#₩Ec[r[fix(2003/11/17)
#₩Ec[r[[h (2003/11/13)
#LE׍UꎞI΍(2002/06/20 20:14)

# ʐݒt@C̓Ǎ
require './bbsset.txt';

#pX[ht@C̓ǂݍ
require './bbspass.pl';

# ϊR[h̓Ǎ
require './change_xxx.txt';

###############################################################################
#  ݒ
###############################################################################

# fCGIURL
$cgiurl = 'http://www.ge.st98.arena.ne.jp/cgi-bin/bbs.cgi';

# ʌfCGIURL
$alturl = 'http://www.ge.st98.arena.ne.jp/cgi-bin/nazo777.cgi';

# gzipk̏l
#   0 : kȂ
#   1 : k
$gzipu = 1;

# Pʂɕ\郁bZ[W̕\
#  (1`bZ[W̕ۑ)
$msgdisp = 30;

# f̖O
$bbstitle = '₵[ǁ炢傤߂';

if ( !$FORM{'newtitle'} ) {
	$FORM{'newtitle'} = $bbstitle;
}

# tH[eʕ\
#   0 : VKEBhEI[vĕ\
#   1 : ʂɕ\
# iʕ\͕sc邽߁A܂萄ł܂j
$followwin = 1;


###############################################################################
#  VXepݒEϐiɎwȂύXsj
###############################################################################

$tmpl_msg = <<EOF;
<!-- \$postid -->
<FONT size="+1" color="#\$CC{'subj'}"><B>\$title</B></FONT>
@eҁF<B>\$user</B>
@<FONT size="-1">eF\$wdate\$btn</FONT>
<BLOCKQUOTE>
<PRE>
\$msg
</PRE>
\$envlist
</BLOCKQUOTE>
<HR>
<!-- -->
EOF

$S_pstime = 1;
$S_pltime = 3600;
$S_cexp = 7776000;
$S_alchk[0] = '';
$S_alchk[1] = 'checked';
$S_gzchk[0] = '';
$S_gzchk[1] = 'checked';


###############################################################################
#  tH[}bgϊ
###############################################################################

sub getnowdate {

	( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdat )
		= localtime ( $_[0] );
	$year += 1900;
	$mon++;
	$nowdate = sprintf ( "%d/%02d/%02d(%s)%02d%02d%02db",
	  $year, $mon, $mday,
	  ( '', '', '', '', '', '', 'y' )[$wday],
	  $hour, $min, $sec );
}


###############################################################################
#  tH[f[^擾
###############################################################################

sub getformdata {

	my ( $formbuf, $name, $value );

	if ( $ENV{'REQUEST_METHOD'} eq 'POST' ) {
		read ( STDIN, $formbuf[0], $ENV{'CONTENT_LENGTH'} );
	} else {
		$formbuf[0] = $ENV{'QUERY_STRING'};
	}

	if ( $formbuf[0] ) {

		&prterror ( 'ĂяosłB' )
		  if ( $ENV{'HTTP_HOST'} && ! ( $ENV{'HTTP_HOST'} =~ /$bbshost/i ) );

		$referer = $ENV{'HTTP_REFERER'};
		$referer =~ s/\+/ /g;
		$referer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack ( "C", hex ( $1 ) )/eg;

		foreach ( split ( /&/, $formbuf[0] ) ) {
			( $name, $value ) = split ( /=/ );
			$value =~ s/\+/ /g;
			$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack ( "C", hex ( $1 ) )/eg;
#			$value =~ s/&/&amp;/g;
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
			$value =~ s/"/&quot;/g;# X^CV[g΍
			$value =~ s/\r\n/\r/g;
			$value =~ s/\n/\r/g;
			$value =~ s/\r$//;
			$value =~ s/\,/\0/g;
			$FORM{$name} = $value;
		}
	}
}


###############################################################################
#  {ꕶR[hϊ
###############################################################################

sub jconv {

	if ( ( $FORM{'k'} ne '' && $FORM{'v'} ) || $FORM{'j'} ) {
		require "$jcode";
		foreach ( keys %FORM ) {
			&jcode'convert ( *FORM{$_}, 'sjis' );
		}
	}
}


###############################################################################
#  ϐ擾
###############################################################################

sub getenv {#

	if ( $uarec ) {
		$agent = $ENV{'HTTP_USER_AGENT'};
		$agent =~ s/</&lt;/g;
		$agent =~ s/>/&gt;/g;
		$agent =~ s/,/./g;
	}

	if ( !$iprec ) { return; }

	$addr = $ENV{'REMOTE_ADDR'};
	$host = $ENV{'REMOTE_HOST'};
	if ( $addr eq $host || !$host ) {
		$host = gethostbyaddr ( pack ( 'C4', split ( /\./, $addr ) ), 2 ) || $addr;
	}

	$proxyflg = 0;

	if ( $ENV{'HTTP_CACHE_CONTROL'} )			{ $proxyflg = 1; }
	if ( $ENV{'HTTP_CACHE_INFO'} )				{ $proxyflg += 2; }
	if ( $ENV{'HTTP_CLIENT_IP'} )				{ $proxyflg += 4; }
	if ( $ENV{'HTTP_FORWARDED'} )				{ $proxyflg += 8; }
	if ( $ENV{'HTTP_FROM'} )					{ $proxyflg += 16; }
	if ( $ENV{'HTTP_PROXY_AUTHORIZATION'} )		{ $proxyflg += 32; }
	if ( $ENV{'HTTP_PROXY_CONNECTION'} )		{ $proxyflg += 64; }
	if ( $ENV{'HTTP_SP_HOST'} )					{ $proxyflg += 128; }
	if ( $ENV{'HTTP_VIA'} )						{ $proxyflg += 256; }
	if ( $ENV{'HTTP_X_FORWARDED_FOR'} )			{ $proxyflg += 512; }
	if ( $ENV{'HTTP_X_LOCKING'} )				{ $proxyflg += 1024; }
	if ( $agent =~ /cache|delegate|gateway|httpd|proxy|squid|www|via/i ) {
		$proxyflg += 2048;
	}
	if ( $host =~ /cache|^dns|dummy|^ns|firewall|gate|keep|mail|^news|pop|proxy|smtp|w3|^web|www/i ) {
		$proxyflg += 4096;
	}
	if ( $host eq $addr ) {
		$proxyflg += 8192;
	}

	$realaddr = '';
	$realhost = '';
	if ( $proxyflg > 0 ) {

		if ( $ENV{'HTTP_X_FORWARDED_FOR'} =~
		  s/^(\d+)\.(\d+)\.(\d+)\.(\d+).*/$1.$2.$3.$4/ ) {
			$realaddr = "$1.$2.$3.$4";
		} elsif ( $ENV{'HTTP_FORWARDED'} =~
		  s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
			$realaddr = "$1.$2.$3.$4";
		} elsif ( $ENV{'HTTP_VIA'} =~
		  s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
			$realaddr = "$1.$2.$3.$4";
		} elsif ( $ENV{'HTTP_CLIENT_IP'} =~
		  s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
			$realaddr = "$1.$2.$3.$4";
		} elsif ( $ENV{'HTTP_SP_HOST'} =~
		  s/(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) {
			$realaddr = "$1.$2.$3.$4";
		} elsif ( $ENV{'HTTP_FORWARDED'} =~ s/.*\sfor\s(.+)/$1/ ) {
			$realhost = "$1";
		} elsif ( $ENV{'HTTP_FROM'} =~ s/\-\@(.+)/$1/ ) {
			$realhost = "$1";
		}

		if ( !$realaddr && $realhost ) {
			$realpackaddr = gethostbyname ( $realhost );
			( $a, $b, $c, $d ) = unpack ( 'C4', $realpackaddr );
			$realaddr = "$a.$b.$c.$d";
		}

			if ( $realaddr eq '' ) {
				$anonyproxyflg = 1;
			} else {
				if ( ($realaddr) && ($realhost eq '') ) {
					$realhost = $realaddr;
				}
			}

		if ( $realaddr && $iprec != 2 ) {
			$host = '(leak)';
		}

	} else {
		$host = '(none)' if ( $iprec != 2 );
	}

}#


###############################################################################
#  t@[
###############################################################################

#$jumpurl = "http://rotten.com/";
$jumpurl = "http://www.ge.st98.arena.ne.jp/index.html";
$referer = $ENV{'HTTP_REFERER'};

	@referer_list = (
	"ime\.nu",
	"pinktower\.com",
	"2ch",
	"ohayou\.com",
	"15ch",
	"bbspink",
	"jbbs",
	"machibbs",
	"megabbs",
	"shitaraba",
	"cgigame\.com"
	);

	foreach $referer_list2 (@referer_list) {

		if ( $referer =~ /$referer_list2/i ) {
			print "Content-type: text/html\n";
			print "Location: $jumpurl\n\n";
			exit;
		}

	}

###############################################################################
#  񏑍{bg΍
###############################################################################

# BBS Write͔zzI
# D-Engine͌
# {bg̓[UG[WFgύXł̂
# ̏ꍇIP𐧌邱

# WvURL
$jumpurl = 'http://www.rotten.com/';

	if ($ENV{'HTTP_USER_AGENT'} =~ /BBS Write|D-Engine/i ){
		print "Content-type: text/html\n";
		print "Location: $jumpurl\n\n";
		exit;
	}


###############################################################################
#  ̃GR[h
###############################################################################

sub escstring {

	my ( $srcstr ) = $_[0];

	$srcstr =~ s/([^a-zA-Z0-9\s])/sprintf ( "%%%lx", ( unpack ( "C", $1 ) ) )/eg;
	$srcstr =~ s/ /\+/g;

	return $srcstr;
}


###############################################################################
#  bZ[Wǂݍ
###############################################################################

sub loadmessage {

	my $openlog;

	if ( !$FORM{'ff'} ) {
		$openlog = $logfilename;
	} else {
		$FORM{'ff'} =~ /^([\w.]*)$/;
		$openlog = "$oldlogfiledir/$1";
	}

	open ( READLOG, "$openlog" ) || &prterror ( 'bZ[Wǂݍ݂Ɏs܂' );
	eval 'flock ( READLOG, 1 )';
	seek ( READLOG, 0, 0 );
	@logdata = <READLOG>;
	eval 'flock ( READLOG, 8 )';
	close ( READLOG );
}


###############################################################################
#  bZ[WP擾
###############################################################################

sub getmessage {
	my ( $raw_message, $need_rmsg ) = @_;

	( $ndate, $postid, $protect, $thread, $phost, $agent, $user, $mail, $title, $msg )
	  = split ( /\,/, $raw_message );
	$msg =~ s/\n$//;
	$title =~ s/\0/\,/g;
	$mail =~ s/\0/\,/g;
	$user =~ s/\0/\,/g;
	$msg =~ s/\0/\,/g;
	$wdate = &getnowdate ( $ndate );

	# ^O
	$rmsg = $msg if $need_rmsg;
	$msg = &tag_change($msg, 0);
}


###############################################################################
#  bZ[WPo
###############################################################################

sub prtmessage {

	if ( $FORM{'multizilla'} ) {
		$addblank = "\&multizilla=$FORM{'multizilla'}";
	} else {
		$addblank = '';
	}

	if ( ( $FORM{'newtitle'} ) eq $bbstitle ) {
		$addnewtitle = '';
	} else {
		$addnewtitle = "\&newtitle=$FORM{'newtitle'}";
	}

	#ZLeBz[΍
	$FORM{'e'} =~ /^([\w.]*)$/;
	$FORM{'e'} = $1;

	my $mode = $_[0];	# 0 : f 1 : ߋO({^\) 2 : ߋO({^\Ȃ) 3 : eҌ
	my $tlog = $_[1];
	my $change_buttons = $_[2];
	my ( $tag, $refdate, $prtmessage, $btn, $btnfollow, $btnauthor, $btnthread, $newwin,
	  $envlist, $envaddr, $envua, $envbr );

	# uQlvʑŊJ
	if ( $mode == 0 || $mode == 3 ) {

	# target=_blankɒuAmultizillã^uŊJ
	if ( ( !$followwin ) && ( !$FORM{'multizilla'} ) ) {
		$newwin = " target=\"link\"";
	} elsif ( $FORM{'multizilla'} ) {
		$newwin = " target=\"_blank\"";
	} else {
		$newwin = '';
	}

		$msg =~ s/<A href=\"m=f\&s=(\d+)\&r=(\S+)\">(.*)<\/A>/<A href=\"$cgiurl\?m=f\&c=$FORM{'c'}&s=$1\&r=$2$addnewtitle\"$newwin>$3<\/A>/i;
		$msg =~ s/<A href=\"mode=follow\&search=(\d+)\&ref=(\S+)\">(.*)<\/A>/<A href=\"$cgiurl\?m=f\&c=$FORM{'c'}&s=$1\&r=$2$addnewtitle\"$newwin>$3<\/A>/i;
	} else {
		$msg =~ s/<A href=\"m=f\&s=(\d+)\&r=(\S+)\">(.*)<\/A>/<A href=\"#$1\">$3<\/A>/i;
		$msg =~ s/<A href=\"mode=follow\&search=(\d+)\&ref=(\S+)\">(.*)<\/A>/<A href=\"#$1\">$3<\/A>/i;
	}

	if ( $mode == 0 || $mode == 3 || ( $mode == 1 && $oldlogbtn && $oldlogfmt ) ) {

	# target=_blankɒuAmultizillã^uŊJ
	if ( ( !$followwin ) && ( !$FORM{'multizilla'} ) ) {
		$newwin = " target=\"link\"";
	} elsif ( $FORM{'multizilla'} ) {
		$newwin = " target=\"_blank\"";
	} else {
		$newwin = '';
	}

		# tH[e{^
		$btnfollow = "<A href=\"$cgiurl\?m=f\&u=".
		  &escstring ( $FORM{'u'} ) .
		  "&d=$FORM{'d'}&p=$toppostid&s=$postid\&c=$FORM{'c'}$addblank$addnewtitle&$ks_param->{get}";
		if ( !$mode ) {
			$btnfollow .= "\"";
		} elsif ( $mode == 3 ) {
			$btnfollow .= "&ac=1\"";
		} else {
			#$btnfollow .= "&ff=$tlog\"";
			$btnfollow .= "\&ff=$FORM{'e'}\"";
		}
		$btnfollow .= "$newwin>$txtfollow</A>@\n";

		# eҌ{^

		# target=_blankɒuAmultizillã^uŊJ
		# Ɓ͂ɂtargetŊJ
		if ( $FORM{'multizilla'} ) {
			$newwin2 = ' target="_blank"';
		} else {
			$newwin2 = ' target="link"';
		}

		# 󔒓é\Ȃ
		if ( ( $anonymous_search ) || ( ( $user ne $anonymous_word ) && ( !$anonymous_search ) ) ) {

			$btnauthor = "<A href=\"$cgiurl\?m\=s\&s\=".
			  &escstring ( $user ) .
			  "\&c=$FORM{'c'}$addblank$addnewtitle&$ks_param->{get}\"".
			  "$newwin2>$txtauthor</A>@\n";

		} else {
			$btnauthor = '';
		}

		# Xbh\{^
		# ŏ̓e灟
		if ( ( !$thread ) && ( $first_thread ) ) {
			$thread = $postid;
		}

		# ߋÕ{^͏펞
		if ( ( !$thread ) && ( $mode == 1 ) ) {
			$thread = $postid;
		}

		if ( ( $thread ) || ( ( !$thread ) && ( $first_thread ) ) ) {
			$btnthread = "<A href=\"$cgiurl\?m\=t\&c=$FORM{'c'}".
			  "\&s\=$thread$addblank$addnewtitle\&ff=$FORM{'e'}&$ks_param->{get}\"$newwin2>$txtthread</A>\n";
		} else {
			$btnthread = '';
		}

		# f؂ւ{^
		my $btnchange = "";
		if ( $change_buttons ) {
			$btnchange .= "@<A href=\"$alturl\?m=f&s=$postid&ff=$FORM{'e'}\">" .
			  "<FONT color=\"#$bgc\">$txtfollow</FONT></A>\n";
			$btnchange .= "@<A href=\"$alturl\?m=t&s=$postid&ff=$FORM{'e'}\">" .
			  "<FONT color=\"#$bgc\">$txtthread</FONT></A>\n";
		}

		$btn = "@\n  $btnfollow  $btnauthor  $btnthread$btnchange";
	} else {
		$btn = '';
	}

	# [AhX
	if ( $mail ) {
		$user = "<A href=\"mailto\:$mail\">$user<\/A>";
	}

	# _blankŊJ
	if ( $FORM{'multizilla'} ) {
		$msg =~ s/target\=\"link\"/target\=\"_blank\"/g;
	}

	# pFύX
	if ( !$mode ) {
		$msg =~ s/(^|\r)(&gt;[^\r]*)/$1<FONT color=\"#$CC{'qmsgc'}\">$2<\/FONT>/g;
		$msg =~ s/<\/FONT>\r<FONT color=\"#$CC{'qmsgc'}\">/\r/g;
	} elsif ( $mode >= 1 && $qmsgc ) {
		$msg =~ s/(^|\r)(&gt;[^\r]*)/$1<FONT color=\"#$qmsgc\">$2<\/FONT>/g;
		$msg =~ s/<\/FONT>\r<FONT color=\"#$qmsgc\">/\r/g;
	}

	# ϐ
	if ( $ipprint ) {
		$envaddr = $phost;
	} else {
		$envaddr = '';
	}
	if ( $uaprint ) {
		$envua = $agent;
	} else {
		$envua = '';
	}
	if ( $ipprint && $uaprint ) {
		$envbr = '<BR>';
	}
	if ( $envaddr || $envua ) {
		$envlist = qq!<\!--$envaddr$envbr$envua-->!;
	} else {
		$envlist = '';
	}

	# bZ[W\e`
	$prtmessage = qq(<A name="$postid"></A>\n$tmpl_msg);
	$prtmessage =~ s/(\$[A-Za-z0-9\'\{\}]+)/$1/eeg;

	return $prtmessage;
}


###############################################################################
#  ɂJE^[
###############################################################################

sub counter {

	my ( @count, @filenumber, @sortedcount, $maxcount, $mincount );

	for ( $i = 0 ; $i < $countlevel ; $i++ ) {
		open ( IN, "$countfile$i.dat" );
		$count[$i] = <IN>;
		$filenumber{$count[$i]} = $i;
		close ( IN );
	}

	@sortedcount = sort { $a <=> $b; } @count;
	$maxcount = $sortedcount[$countlevel-1];
	$mincount = $sortedcount[0];

	$maxcount++;

	if ( open ( OUT, ">$countfile$filenumber{$mincount}.dat" ) ) {
		print OUT $maxcount;
		close ( OUT );
		return $maxcount;
	} else {
		return '<FONT color="red">JE^[t@C̏o̓G[ł</FONT>';
	}
}


###############################################################################
#  Q҃JEg
###############################################################################

sub mbrcount {

	my ( @hostbin, @ukey, @cntdata, $mbrcount, $cuser, $ctime, $cadd );

	if ( $cntfilename ) {
		undef @cntdata;
		$mbrcount = 0;
		@hostbin = split ( /\./, $ENV{'REMOTE_ADDR'} );
		for ( $i = 0 ; $i < 4 ; $i++ ) {
			$hostbin[$i] = vec ( pack ( 'C4', $hostbin[$i] ), 0, 8 );
		}
		$ukey[0] = $hostbin[0] + $hostbin[1] + $hostbin[2] + $hostbin[3];
		$ukey[1] = $hostbin[0] ^ $hostbin[1] & $hostbin[2] ^ $hostbin[3];
		$ukey[2] = $ukey[0] * $ukey[1];

		if ( open ( UCNT, $cntfilename ) ) {
			eval 'flock ( UCNT, 1 )';
			seek ( UCNT, 0, 0 );
			@cntdata = <UCNT>;
			eval 'flock ( UCNT, 8 )';
			close ( UCNT );

			$cadd = 0;
			for ( $i = 0 ; $i < @cntdata ; $i++ ) {
				( $cuser, $ctime ) = split ( /\,/, $cntdata[$i] );
				chomp ( $ctime );
				if ( $cuser eq $ukey[2] ) {
					$cntdata[$i] = "$ukey[2],$nowtime\n";
					$cadd = 1;
					$mbrcount++;
				} elsif ( ( $ctime + $cntlimit ) < $nowtime ) {
					# O
					$cntdata[$i] = '';
				} else {
					$mbrcount++;
				}
			}
			if ( !$cadd ) {
				push ( @cntdata, "$ukey[2],$nowtime\n" );
				$mbrcount++;
			}
		} else {
			push ( @cntdata, "$ukey[2],$nowtime\n" );
			$mbrcount++;
		}

		open ( UCNT, ">>$cntfilename" ) || &prterror ( 'Q҃JEgt@C݂̏Ɏs܂B' );
		eval 'flock ( UCNT, 2 )';
		truncate ( UCNT, 0 );
		seek ( UCNT, 0, 0 );
		print UCNT @cntdata;
		close ( UCNT );

		return "@݂̎Q : $mbrcount ($cntlimitbȓ)";
	} else {
		return;
	}
}


###############################################################################
#  HTMLwb_\
###############################################################################

sub prthtmlhead {

	my $headtitle = $_[0];

	# wb_o
	print "Content-type: text/html\n";
	if ( $gzip && $gzipu && ( $ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/ ) ) {
		print "Content-encoding: gzip\n\n";
		open ( STDOUT, "| $gzip -1 -c" );
		print "\n<!-- gzip enable -->\n";
	} else {
		print "\n<!-- gzip disable -->\n";
	}

	print <<EOF;
<HTML>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<HEAD>
<TITLE>$headtitle</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</HEAD>
$body
<a name="top"></a>
EOF
}


###############################################################################
#  G[bZ[W\
###############################################################################

sub prterror {

	my $error = $_[0];

	print <<EOF;
Content-type: text/html

<HTML>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Pragma" content="no-cache">
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Pragma" content="no-cache">
<TITLE>$FORM{'newtitle'} (G[)</TITLE>
</HEAD>
$body
<H3>$error</H3>
</BODY>
</HTML>
EOF
	exit;
}


###############################################################################
#  tH[ʕ\
###############################################################################

sub prtfollow {

	my $retry = $_[0];
	my $success = 0;
	my $formmsg;

	&loadmessage;

	&prterror ( 'p[^܂B' ) if ( !$FORM{'s'} );

	&prthtmlhead ( "$FORM{'newtitle'} tH[e" );
	print "<HR>\n";

	foreach ( 0 .. @logdata - 1 ) {
		&getmessage ( $logdata[$_] );
		if ( $postid eq $FORM{'s'} ) {
			&getmessage ( $logdata[$_], 1 );
			$success = 1;
			last;
		}
		$i++;
	}

	if ( !$success ) {
		print "<H3>w肳ꂽbZ[W܂B</H3></BODY></HTML>";
		exit;
	}

	if ( !$retry ) {
		$formmsg = $rmsg;

		$formmsg =~ s/&gt; &gt;.*?\r//g;
		$formmsg =~ s/<A href=\"m=f\S+\">.*<\/A>//i;
		$formmsg =~ s/<A href=\S+ target=\"link\">(\S+)<\/A>/$1/ig;
		$formmsg =~ s/\r/\r&gt; /g;
		$formmsg = "&gt; $formmsg\r";
		$formmsg =~ s/\r&gt;\s+\r/\r/g;
		$formmsg =~ s/\r&gt;\s+\r$/\r/g;

		# ȕϊ߂(FtƂ)
		$formmsg = &change_from_xxx($formmsg);
	} else {
		$formmsg = &change_from_xxx($FORM{'v'});
		$formmsg =~ s/<A href=\"m=f\S+\">.*<\/A>//i;
	}

	print &prtmessage ( 0, '', 1 );

	if ( !$thread ) {
		$thread = $postid;
	}

	if ( $user =~ /\<A\shref=\"mailto\:.*\"\>(.*)\<\/A\>/ ) {
		$user = $1;
	}
	print "tH[Le@<a href=\"$cgiurl\">߂</a><BR>";
	&prtform ( "$user$fsubj", "$formmsg\r", '' );

	print <<EOF;
  <BR>
  <INPUT type="hidden" name="d" value="$FORM{'d'}">
  <FONT size="-1">gzip] <INPUT type="checkbox" name="g" accesskey="G" value="checked" $S_gzchk[$gzipu]>
  URLN <INPUT type="checkbox" name="a" accesskey="U" value="checked" $S_alchk[$autolink]></FONT>
  \\ <INPUT type="checkbox" name="zwindow" accesskey="U" value="checked" $S_zwindow[$zwindow]></FONT><P>
  <INPUT type="submit" name="zeload" accesskey="0" value="e^0">
  <INPUT type="submit" name="meload" accesskey="Y" value="e^">
  <INPUT type="hidden" name="g" value="checked" $S_gzchk[$gzipu]>
  <INPUT type="hidden" name="p" value="$FORM{'p'}">
  <INPUT type="hidden" name="s" value="$FORM{'s'}">
  <INPUT type="hidden" name="h" value="$thread">
  <INPUT type="hidden" name="f" value="$postid:$wdate">
  <INPUT type="hidden" name="ac" value="$FORM{'ac'}">
  <INPUT type="hidden" name="newtitle" value="$FORM{'newtitle'}">
  <INPUT type="hidden" name="multizilla" value="$FORM{'multizilla'}">
  <INPUT type="hidden" name="target_blank" value="$FORM{'target_blank'}">
  <INPUT type="hidden" name="targetlink" value="$FORM{'targetlink'}">
  <INPUT type="hidden" name="gikoitsuoff" value="$FORM{'gikoitsuoff'}">
$ks_param->{post}
  <HR>
</FORM>
</BODY>
</HTML>
EOF

	exit;
}


###############################################################################
#  pX[h`FbN
###############################################################################

sub chkpasswd {#

	my $slen;

	if ( ($adminpost[0] =~ /^\$1\$/) || ($adminpost[1] =~ /^\$1\$/) ||  ($adminpost[2] =~ /^\$1\$/ ) ) {
		$slen = 5;
	} else {
		$slen = 2;
	}

	if ( crypt ( $FORM{'u'}, substr ( $adminpost[0], 0, $slen ) ) eq $adminpost[0] ) {
		return 1;
	} elsif ( crypt ( $FORM{'u'}, substr ( $adminpost[1], 0, $slen ) ) eq $adminpost[1] ) {
		return 2;
	} elsif ( crypt ( $FORM{'u'}, substr ( $adminpost[2], 0, $slen ) ) eq $adminpost[2] ) {
		return 3;
	} else {
		return 0;
	}

}#


###############################################################################
#  bZ[W`FbN
###############################################################################

sub chkmessage {

	my ( @hostbin, $admincheck, $adminfname );

	# Amj}CU[oR̓e^ۂ
	if ($anonymizer) {
		if ( ! ( $referer =~ /$cgiurl/i ) ) {#֎~
			&chkerror ( "eʂ̂tqk<BR>$cgiurl<BR>" .
			  'ȊO̓e͂ł܂B',  3 );
		}
	} else {
		if ( $referer && ! ( $referer =~ /$cgiurl/i ) ) {#
		&chkerror ( "eʂ̂tqk<BR>$cgiurl<BR>" .
		  'ȊO̓e͂ł܂B',  3 );
		}
	}

	$i = 0;
	foreach ( split ( /\r/, $FORM{'v'} ) ) {
		if ( length ( $_ ) > $maxmsgcol ) {
			$i++;
		}
	}
	if ( $i != 0 ) { &chkerror ( 'eě傫܂B', 10 ); }

	if ( ( $FORM{'v'} =~ tr/\r/\r/ ) > ( $maxmsgline - 1 ) ) {
		&chkerror ( 'ee̍s傫܂B', 11 );
	}

	if ( length ( $FORM{'v'} ) > $maxmsgsize ) {
		&chkerror ( 'ee傫܂B', 12 );
	}

	if ( $FORM{'pc'} ) {
		@hostbin = split ( /\./, $ENV{'REMOTE_ADDR'} );
		for ( $i = 0 ; $i < 4 ; $i++ ) {
			$hostbin[$i] = vec ( pack ( 'C4', $hostbin[$i] ), 0, 8 );
		}
		$protect_c = $hostbin[0] ^ $hostbin[1] ^ $hostbin[2] ^ $hostbin[3];
		$pcheck = ( $FORM{'pc'} - $protect_c ) / $protect_b - $protect_a;
		&getnowdate ( $pcheck );
		if ( ( $sec  < 0 ) || ( $sec  > 60 ) ||
		  ( $min  < 0 ) || ( $min  > 60 ) ||
		  ( $hour < 0 ) || ( $hour > 24 ) ) {
			&chkerror ( '', 32 );
		}
		if ( ( $nowtime - $pcheck ) < $S_pstime ) {
			&chkerror ( 'x蒼ĉB', 30 );
		}
		if ( ( $nowtime - $pcheck ) > $S_pltime ) {
			&chkerror ( '', 31 );
			if ( $FORM{'f'} ) {
				&prtfollow ( 1 );
			} else {
				&prtmain ( $FORM{'t'}, $FORM{'v'}, $FORM{'l'} );
			}
			exit;
		}
	} else {
		&chkerror ( 'tH[f[^̈ꕔɌ܂Bx蒼ĉB', 33 );
	}

	if ( $FORM{'i'} =~ / /i ) {
		$FORM{'i'} = '';
	}
	if ( $FORM{'i'} ) {
		if ( ! ( $FORM{'i'} =~ /.*\@.*\..*/ ) ) {
			&chkerror ( '[AhX͂Ă܂B', 20 );
		} elsif ( $FORM{'i'} =~ /,/ ) {
			&chkerror ( '[AhX͕wł܂B', 21 );
		}
	}

	if ( !$FORM{'t'} ) {
		$FORM{'t'} = $notitle;
	}

	if ( !$FORM{'u'} ) {
		if ( !$anonymous_post ) {
			# Le̋֎~
			&chkerror ( 'eҖ͂Ă܂B', 22 );
		} else {
			$FORM{'u'} = $anonymous_word;
		}
	} else {

		if ( &chkpasswd ) {
			if ( $FORM{'v'} =~ /^$adminkey/ ) {
				require 'sub/bbsadmin.pl';
				&adminmain;
				exit;
			} else {

				if ( &chkpasswd eq 1) {
					$FORM{'u'} = $adminname[0];
					$FORM{'i'} = $adminmail[0];
				} elsif ( &chkpasswd eq 2) {
					$FORM{'u'} = $adminname[1];
					$FORM{'i'} = $adminmail[1];
				} elsif ( &chkpasswd eq 3) {
					$FORM{'u'} = $adminname[2];
					$FORM{'i'} = $adminmail[2];
				}
			}
		} elsif ( $FORM{'u'} eq $adminpost[0] ) {
			$FORM{'u'} = "$adminname[0]inJ[j";
		} elsif ( $FORM{'u'} eq $adminpost[1] ) {
			$FORM{'u'} = "$adminname[1]inJ[j";
		} elsif ( $FORM{'u'} eq $adminpost[2] ) {
			$FORM{'u'} = "$adminname[2]inJ[j";
		} else {

			foreach $hadminname (@adminname) {
				$adminfname = quotemeta $hadminname;

				if ( $FORM{'u'} =~ /$adminfname/i ) {
					$admincheck = $FORM{'u'};
					$admincheck =~ s/ //g;
					$admincheck =~ s/@//g;
					$admincheck =~ s/_//g;
					if ( ( $admincheck eq $adminname[0] ) && ( $FORM{'i'} ) ) {
						$FORM{'u'} =~ s/$adminfname/$adminname[0]ixj/;
					}
					if ( ( $admincheck eq $adminname[1] )  && ( $FORM{'i'} ) ){
						$FORM{'u'} =~ s/$adminfname/$adminname[1]ixj/;
					}
					if ( ( $admincheck eq $adminname[2] )  && ( $FORM{'i'} ) ){
						$FORM{'u'} =~ s/$adminfname/$adminname[2]ixj/;
					}
				}
			}
		}
	}

	if ( $autolink ) {
		$FORM{'v'} =~ s#((https?|ftp|gopher|telnet|whois|news)://(=[\x21-\xfc]+|[\x21-\x7e])+)#<A href="$1" target="link">$1</A>#ig;
	}

	# URLtH[javascript:`ׂ

	#javascript:open('http://strange.kurumi.ne.jp/bbs.cgi');
	#javascript:for(;;){window.open();}
	#javascript:open('../diary/diary.html');

	if ( $FORM{'l'} =~ /javascript/i ) {
		$FORM{'l'} =~ s/:/F/gi;
	}

	if ( $FORM{'l'} =~ /\s+/ || !$FORM{'l'} ) {
		$FORM{'l'} = '';
	} else {
		$FORM{'l'} =~ s/http:\/\/http:\/\//http:\/\//;
		$FORM{'v'} .= "\r\r<A href=\"$FORM{'l'}\" target=\"link\">$FORM{'l'}</A>";
	}
	if ( $FORM{'f'} ) {
		( $i, $j ) = split ( /:/, $FORM{'f'} );
		$FORM{'v'} .= "\r\r<A href=\"m=f\&s=$i\&r=$j\">QlF$j</A>";
	}

	# date:2003/12/01
	# ȕϊs(FtƂ)
	$FORM{'v'} = &change_to_xxx($FORM{'v'});

	# mfl[
	if ($ngnameon) {
		&ngnamepre;
	}
}


###############################################################################
#  bZ[W`FbNG[
###############################################################################

sub chkerror {

	my $errstr = $_[0];
	$posterr = $_[1];

	&prterror ( $errstr ) if ( $errstr );
}


###############################################################################
#  bZ[Wo^
###############################################################################

sub putmessage {

	my $oldlogext;

	open ( FLOG, "+<$logfilename" ) || &prterror ( 'bZ[Wǂݍ݂Ɏs܂' );
	eval 'flock ( FLOG, 2 )';
	seek ( FLOG, 0, 0 );
	@logdata = <FLOG>;

	$i = 0;
	$posterr = 0;
	while ( $logdata[$i] && !$posterr ) {
		@items = split ( /\,/, $logdata[$i] );
		$items[9] =~ s/\n$//;
		$posterr = 1 if ( $i < $checkcount && $FORM{'v'} eq $items[9] );
		$posterr = 2 if ( $FORM{'pc'} eq $items[2] );
		$posterr = 2 if ( $host && ( $host eq $items[4] ) && ( $nowtime < ( $items[0] + $sptime ) ) );
		$i++;
	}

	if ( !$posterr ) {

		@items = split ( /\,/, $logdata[0] );
		$newpostid = $items[1] + 1;
# Ńf[^L^
		$msgdata = "$nowtime,$newpostid,$FORM{'pc'},$FORM{'h'},$host,$agent,$FORM{'u'},$FORM{'i'},$FORM{'t'},$FORM{'v'}\n";

		@logdata = @logdata[0 .. $logsave - 2] if ( @logdata >= $logsave );
		unshift ( @logdata, $msgdata );

		$oldstream = select ( FLOG );
		$| = 1;
		seek ( FLOG, 0, 0 );
		truncate ( FLOG, 0 );
		print FLOG @logdata;
		eval 'flock ( FLOG, 8 )';
		close ( FLOG );
		select ( $oldstream );

		&getnowdate ( $nowtime );

		# ߋOo
		if ( $oldlogfiledir ) {

			if ( !$oldlogfmt ) {
				$oldlogext = 'html';
			} else {
				$oldlogext = 'dat';
			}

			if ( !$oldlogsavesw ) {
				$oldlogfilename = sprintf ( "%s/%d%02d%02d.$oldlogext",
				  $oldlogfiledir, $year, $mon, $mday );
			} else {
				$oldlogfilename = sprintf ( "%s%d%02d.$oldlogext",
				  $oldlogfiledir, $year, $mon );
			}

			open ( CLOG, ">>$oldlogfilename" ) || &prterror ( 'ߋOo͂Ɏs܂' );
			eval 'flock ( CLOG, 2 )';

			$oldstream = select ( CLOG );
			$| = 1;

			if ( !$oldlogfmt ) {
				if ( -z CLOG ) {
					print CLOG <<EOF;
<HTML>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>$bbstitle</TITLE>
</HEAD>
<BODY bgcolor="#$bgc" text="#$textc" link="#$linkc" vlink="#$vlinkc" alink="#$alinkc">
<HR>
EOF
				}

				&getmessage ( $msgdata );

				print CLOG &prtmessage ( 1, '' );

			} else {
				print CLOG $msgdata;
			}

			eval 'flock ( CLOG, 8 )';
			close ( CLOG );

			select ( $oldstream );

			chmod 0400, $logfilename if ( ( -s $oldlogfilename ) > $maxoldlogsize );

			&getnowdate ( time - $difftime - $oldlogsaveday * 60 * 60 * 24 );
			$oldlogfilename = sprintf (  "%s/%d%02d%02d.$oldlogext",
			  $oldlogfiledir, $year, $mon, $mday );
			unlink $oldlogfilename;

			&putcookie ( 0 ) if ( $cookie );
		}

	} else {
		eval 'flock ( FLOG, 8 )';
		close ( FLOG );

		if ( $posterr == 2 ) {
			&chkerror ( '', $posterr );
			if ( $FORM{'f'} ) {
				&prtfollow ( 1 );
			} else {
				&prtmain ( $FORM{'t'}, $FORM{'v'}, $FORM{'l'} );
			}
			exit;
		}
	}
}


###############################################################################
#  Cookie擾
###############################################################################

sub getcookie {

	if ( $ENV{'HTTP_COOKIE'} ) {
		$ENV{'HTTP_COOKIE'} =~ /^c\=u\=(.*)\&m\=(.*)&c\=(.*)$/;
		$FORM{'u'} = $1 if ( $1 && !$FORM{'u'} );
		$FORM{'i'} = $2 if ( $2 && !$FORM{'i'} );
		$FORM{'c'} = $3 if ( ( length ( $3 ) == 3 ) || ( length ( $3 ) == 33 ) );
		$FORM{'c'} =~ s/;$//;
		$FORM{'u'} =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack ( "C", hex ( $1 ) )/eg;
		$FORM{'i'} =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack ( "C", hex ( $1 ) )/eg;
	}
}


###############################################################################
#  CookieM
###############################################################################

sub putcookie {

	my ( $cuser, $cmail, @ctime, $cmday, $cmon, $cdate );
	my $cexpdif = $_[0];

	$cuser = &escstring ( $FORM{'u'} );
	$cmail = &escstring ( $FORM{'i'} );

	( @ctime ) = gmtime ( time + $S_cexp - $cexpdif );
	$cmday = ( 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' )[$ctime[6]];
	$cmon = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' )[$ctime[4]];
	$cdate = sprintf ( "%s, %02d\-%s\-%04d %02d:%02d:%02d GMT",
	  $cmday, $ctime[3], $cmon, $ctime[5] + 1900, $ctime[2], $ctime[1], $ctime[0] );
	print "Set-Cookie: c=u=$cuser&m=$cmail&c=$FORM{'c'}; expires=$cdate; path=/\n";
}


###############################################################################
#  veNgR[h
###############################################################################

sub pcode {

	my ( @hostbin, @pkey, @pkeystr, @apkey );
	srand ( time | $$ );

	#$nowtime = time - $difftime * 60 * 60;
	@hostbin = split ( /\./, $ENV{'REMOTE_ADDR'} );
	for ( $i = 0 ; $i < 4 ; $i++ ) {
		$hostbin[$i] = vec ( pack ( 'C4', $hostbin[$i] ), 0, 8 );
	}
	$protect_c = $hostbin[0] ^ $hostbin[1] ^ $hostbin[2] ^ $hostbin[3];
	$pkey[0] = ( $nowtime + $protect_a ) * $protect_b + $protect_c;
	$pkey[1] = $pkey[0] - int ( rand ( 64 ) );
	$pkey[2] = $pkey[1] + int ( rand ( 128 ) );

	$pkeystr[0] = "\n  <INPUT type=\"hidden\" name=\"pc\" value=\"$pkey[0]\">\n";
	$pkeystr[1] = "  <!--\n  <INPUT type=\"hidden\" name=\"pc\" value=\"$pkey[1]\">\n  -->";
	$pkeystr[2] = "  <!--\n  <INPUT type=\"hidden\" name=\"pc\" value=\"$pkey[2]\">\n  -->";

	push ( @apkey, splice ( @pkeystr, rand ( @pkeystr ), 1 ) ) while @pkeystr;
	@pkeystr = @apkey;

	return "$pkeystr[0]$pkeystr[1]$pkeystr[2]";
}


###############################################################################
#  tH[\
###############################################################################

sub prtform {

	my $dtitle = $_[0];
	my $dmsg = $_[1];
	my $dlink = $_[2];
	my ( $bbslink, $gzipchk, $counter, $mbrcount );

	# veNgR[h
	my $ptext = &pcode;

	# JE^
	$counter = &counter;
	$mbrcount = &mbrcount;

	if ( $gzip ) {
		$gzipchk = qq#  @<FONT size="-1">gzipk] <INPUT type="checkbox" name="g" accesskey="G" value="checked" $S_gzchk[$gzipu]></FONT>#;
	} else {
		$gzipchk = '';
	}

	# OǂݐpʁÃ[h̕sC
	if ( $FORM{'m'} eq 'o' || $FORM{'m'} eq 'op' || $FORM{'rm'} eq 'o' ) {

		# OǂݐptH[
		print <<EOF;
<FORM method="$formmethod" action="$cgiurl">
  <INPUT type="hidden" name="m" value="op">
  <INPUT type="hidden" name="k" value="">
  <INPUT type="hidden" name="c" value="$FORM{'c'}">
  <P><FONT size="-1">\\ <INPUT size="6" type="text" name="d" accesskey="1" value="$FORM{'d'}">
$gzipchk
  @<FONT size="-1">URLN <INPUT type="checkbox" name="a" accesskey="U" value="checked" $S_alchk[$autolink]></FONT>
  @<FONT size="-1">LinksOFF <INPUT type="checkbox" name="linkline" accesskey="l" value="checked" $FORM{'linkline'}></FONT>
  @<FONT size="-1">\\ <INPUT type="checkbox" name="zwindow" accesskey="l" value="checked" $FORM{'zwindow'}></FONT>
  @<INPUT type="submit" name="setup" accesskey="C" value="ݒ"></FONT></P>$keikoku
  <FONT size="-1">$countdate  $counteriɂx$countlevelj$mbrcount</FONT>
  <HR>
EOF
if ($FORM{'linkline'}) {
	require './config.pl';
	&linklineoff;
} else {
	require './config.pl';
	&linklineon;
}
print <<EOF;
  <HR>
  <FONT size="-1">$txtfollow : tH[eʕ\\ @ $txtauthor : eҌ\\ @ $txtthread : Xbh\\
  @@@őo^ : $logsave</FONT>
  <HR>
  <INPUT type="submit" name="reload" value="[h" accesskey="R">
  <INPUT type="submit" name="zeload" accesskey="0" value="0">
  <INPUT type="submit" name="meload" accesskey="Y" value="">
  <a href="#bottom"></a>
  <INPUT type="hidden" name="p" value="$toppostid">
  <INPUT type="hidden" name="multizilla" value="$FORM{'multizilla'}">
  <INPUT type="hidden" name="newtitle" value="$FORM{'newtitle'}">
  <INPUT type="hidden" name="target_blank" value="$FORM{'target_blank'}">
  <INPUT type="hidden" name="targetlink" value="$FORM{'targetlink'}">
  <INPUT type="hidden" name="gikoitsuoff" value="$FORM{'gikoitsuoff'}">
$ks_param->{post}
</FORM>
EOF

	} else {

		# WetH[
		print <<EOF;
<FORM method="$formmethod" action="$cgiurl">
  <INPUT type="hidden" name="m" value="p">
  e <INPUT size="20" type="text" name="u" accesskey="1" maxlength="30" value="$FORM{'u'}"><BR>
  [ <INPUT size="30" type="text" name="i" accesskey="2" maxlength="255" value="$FORM{'i'}"><BR>
  薼 @<INPUT size="30" type="text" name="t" accesskey="3" maxlength="40" value="$dtitle">
  <INPUT type="submit" name="post" value="e^[h" accesskey="R"> <INPUT type="reset" accesskey="K" value=""><BR> <BR>
  e <FONT size="-1"><I>
  iKɉsĂB^O͎g܂Beɓe{^ƃ[hɂȂ܂j
  </I></FONT><BR>
  <TEXTAREA rows="5" cols="70" wrap="off" name="v" accesskey="4">$dmsg</TEXTAREA><BR> <BR>
  URL <FONT size="-1"><I>iNꂽꍇ͂ɋL܂j</I></FONT><BR>
  <INPUT size="70" type="text" name="l" accesskey="5" maxlength="255" value="$dlink">
  $ptext
  <INPUT type="hidden" name="k" value="">
  <INPUT type="hidden" name="c" value="$FORM{'c'}">
EOF

		if ( $FORM{'m'} ne 'f' && !$FORM{'f'} ) {
			print <<EOF;
  <P><FONT size="-1">\\ <INPUT size="6" type="text" name="d" accesskey="6" value="$FORM{'d'}">
  $gzipchk
  @<FONT size="-1">URLN <INPUT type="checkbox" name="a" accesskey="U" value="checked" $S_alchk[$autolink]></FONT>
  @<FONT size="-1">LinksOFF <INPUT type="checkbox" name="linkline" accesskey="l" value="checked" $FORM{'linkline'}></FONT>
  @<FONT size="-1">\\ <INPUT type="checkbox" name="zwindow" accesskey="l" value="checked" $FORM{'zwindow'}></FONT>
  @<INPUT type="submit" name="setup" accesskey="C" value="ݒ"></FONT></P>$keikoku
  <FONT size="-1">$countdate  $counteriɂx$countlevelj$mbrcount</FONT>
  <HR>
EOF
if ($FORM{'linkline'}) {
	require './config.pl';
	&linklineoff;
} else {
	require './config.pl';
	&linklineon;
}
print <<EOF;
  <HR>
  <FONT size="-1">$txtfollow : tH[eʕ\\ @ $txtauthor : eҌ\\ @ $txtthread : Xbh\\ @ őo^ : $logsave</FONT>
  <HR>
  <INPUT type="submit" name="post" value="e^[h">
  <INPUT type="submit" name="zeload" accesskey="0" value="0">
  <INPUT type="submit" name="meload" accesskey="Y" value="">
  <a href="#bottom"></a>
  <INPUT type="hidden" name="p" value="$toppostid">
  <INPUT type="hidden" name="multizilla" value="$FORM{'multizilla'}">
  <INPUT type="hidden" name="newtitle" value="$FORM{'newtitle'}">
  <INPUT type="hidden" name="target_blank" value="$FORM{'target_blank'}">
  <INPUT type="hidden" name="targetlink" value="$FORM{'targetlink'}">
  <INPUT type="hidden" name="gikoitsuoff" value="$FORM{'gikoitsuoff'}">
$ks_param->{post}
</FORM>
EOF
		}
	}
}


###############################################################################
#  ʕ\
###############################################################################

sub prtmain {

	my ( $prtmessage, $dispcount, @pkeystr, $msgmore, $msgnext, $cntnext );
	my $dtitle = $_[0];
	my $dmsg = $_[1];
	my $dlink = $_[2];

	&loadmessage;

	$prtmessage = '';

	# ŐVPOSTID擾iO[hpj
	$logdata[0] =~ /^.*,(.*),.*,.*,.*,.*,.*,.*,.*,.*/;
	$toppostid = $1;

	# bZ[W\ݒ
#	if ( $FORM{'d'} == 0 ) {
	if ( ( $FORM{'d'} == 0 ) || ( $FORM{'meload'} ) ) {
		$dispcount = $toppostid - $FORM{'p'};
		$cntnext = $msgdisp;
	} else {
		$dispcount = $FORM{'d'};
		$cntnext = $FORM{'d'};
	}

	# \bZ[W쐬
	$msgtop = $bmsg + $dispcount;
	$msgtop = @logdata if ( $msgtop > @logdata );
	$j = 0;

	if ( $FORM{'d'} == 0 && $reltype ) {
		for ( $i = $msgtop - 1 ; $i >= $bmsg ; $i-- ) {
			&getmessage ( $logdata[$i] );
			$prtmessage .= &prtmessage ( 0, '' );
			$j++
		}
	} else {
		for ( $i = $bmsg ; $i < $msgtop ; $i++ ) {
			&getmessage ( $logdata[$i] );
			$prtmessage .= &prtmessage ( 0, '' );
			$j++
		}
	}
# ===  ===
      # tree\
      if ($FORM{'tree'}) {
              require './sub/ks_treeview.pl';
              $prtmessage = output_treeview($bmsg, $msgtop);
      }
# === ܂ ===
	$bmsg++;
	if ( $j > 0 ) {
		$msgmore = "ȏ́Aݓo^ĂV$bmsgԖڂ$msgtopԖڂ܂ł̋LłB"
	} else {
		$msgmore = 'ǃbZ[W͂܂B';
		# [ÔLƂ
		$gikonekotoissho = '<FONT size="-1">[<A HREF="./gikonekoadd.cgi" target="link">[ÔLɂƂ΂</A>]</FONT>';

	}
	if ( $logdata[$msgtop] && $j > 0 ) {

	# OǂݐpʁÃ[h̕sC
	if ( $FORM{'m'} eq 'o' || $FORM{'m'} eq 'op' || $FORM{'rm'} eq 'o' ) {
		$romnext='        <INPUT type="hidden" name="rm" value="o">';
		$romreload='        <INPUT type="hidden" name="m" value="o">';
	}

		$msgnext = <<EOF;
<TABLE>
  <TR>
    <TD>
      <FORM method="$formmethod" action="$cgiurl">$romnext
        <INPUT type="hidden" name="m" value="n">
        <INPUT type="hidden" name="b" value="$msgtop">
        <INPUT type="hidden" name="u" value="$FORM{'u'}">
        <INPUT type="hidden" name="d" value="$cntnext">
        <INPUT type="hidden" name="c" value="$FORM{'c'}">
        <INPUT type="hidden" name="linkline" value="$FORM{'linkline'}">
        <INPUT type="hidden" name="multizilla" value="$FORM{'multizilla'}">
        <INPUT type="hidden" name="newtitle" value="$FORM{'newtitle'}">
	<INPUT type="hidden" name="target_blank" value="$FORM{'target_blank'}">
	<INPUT type="hidden" name="targetlink" value="$FORM{'targetlink'}">
	<INPUT type="hidden" name="gikoitsuoff" value="$FORM{'gikoitsuoff'}">
        <INPUT type="submit" name="pnext" value="̃y[W">
$ks_param->{post}
      </FORM>
    </TD>
    <TD>
      <FORM method="$formmethod" action="$cgiurl">$romreload
        <INPUT type="hidden" name="u" value="$FORM{'u'}">
        <INPUT type="hidden" name="p" value="$toppostid">
        <INPUT type="hidden" name="d" value="$FORM{'d'}">
        <INPUT type="hidden" name="c" value="$FORM{'c'}">
        <INPUT type="hidden" name="linkline" value="$FORM{'linkline'}">
        <INPUT type="hidden" name="multizilla" value="$FORM{'multizilla'}">
        <INPUT type="hidden" name="newtitle" value="$FORM{'newtitle'}">
	<INPUT type="hidden" name="target_blank" value="$FORM{'target_blank'}">
	<INPUT type="hidden" name="targetlink" value="$FORM{'targetlink'}">
	<INPUT type="hidden" name="gikoitsuoff" value="$FORM{'gikoitsuoff'}">
        <INPUT type="submit" name="reload" value="[h">
	<INPUT type="submit" name="meload" accesskey="Y" value="">
$ks_param->{post}
      </FORM>
    </TD>
    <TD>
	<a href="#top"></a>
    </TD>
  </TR>
</TABLE>
EOF
	} else {
		$msgmore .= 'ȉ̋L͂܂B';
		$msgnext = '';
	}

	# Co
	&prthtmlhead ( "$FORM{'newtitle'}" );

	# Oǂ݉ʂŁAVKeւ̂Nǉ

	if ( $FORM{'m'} eq 'o' || $FORM{'m'} eq 'op' ) {

		# OǂݐptH[
		$bbslink = qq#<A href="$cgiurl?c=$FORM{'c'}&$ks_param->{get}">W</A>#;
		$shinkitoukou = "<A HREF=\"$cgiurl?c=100&d=-1&$ks_param->{get}\" target=\"link\">VKe</A>\n";

	} else {

		# WetH[
		$bbslink = qq#<A href="$cgiurl?m=o&c=$FORM{'c'}&$ks_param->{get}">Oǂ݉</A>#;

	}


	# WAc[ÃNݒ
	my $treelink;
	my $treemode = $ks_param->get_param('tree');

	if ($treemode) {
	# c[[hȂ
		$ks_param->set_param(tree => '');
		$treelink = qq~<a href="$cgiurl?$ks_param->{get}">W\\</a>~;
	} else {
	# W[hȂ
		$ks_param->set_param(tree => 'on');
		$treelink = qq~<a href="$cgiurl?$ks_param->{get}">c[\\</a>~;
	}
	$ks_param->set_param(tree => $treemode);
	# /


	print <<EOF;
<P>
  <B><FONT size="+1">$FORM{'newtitle'}</FONT></B>
  <FONT size="-1"><A href="$infopage">L</A>
  A
  <A href="mailto:$adminmail[9]">0</A>
<!--  <A href="mailto:$adminmail[0]">1</A> -->
  <A href="mailto:$adminmail[1]">2</A>
  <A href="mailto:$adminmail[2]">3</A>
  $bbslink
  <a href="$icgi">ZANTEi-mode</a>
  $treelink
  $shinkitoukou
  <a href="#bottom"></a></FONT>
</P>
EOF

	&prtform ( $dtitle, $dmsg, $dlink );

	if ( ( ! $FORM{'gikoitsuoff'} ) && ( $gikonekotoissho ) ) {

	print <<EOF;
<HR>

$prtmessage

<P><I><FONT size="-1">$msgmore</FONT></I>
$gikonekotoissho</P>

$msgnext
<HR>

EOF
	# [ÔLƂ
		require './gikoneko.pl';
		&gikoneko;
	print '<HR>';
print <<EOF;

<P align="right">$copyright
</P>

<a name="bottom"></a>

</BODY>
</HTML>
EOF

	} else {

	print <<EOF;
<HR>

$prtmessage

<P><I><FONT size="-1">$msgmore</FONT></I></P>

$msgnext
<HR>

<P align="right">$copyright
</P>

<a name="bottom"></a>

</BODY>
</HTML>
EOF

	}

}


###############################################################################
#  lpݒ蔽f
###############################################################################

sub refcustom {

	if ( $FORM{'c'} ) {
		# lݒURLƌ݊ۂ
		if ( length ( $FORM{'c'} ) == 33  ) {
			$FORM{'c'} =~ /^(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w)(\w)(\w)$/;
			$CC{'text'} = $1;
			$CC{'bg'} = $2;
			$CC{'link'} = $3;
			$CC{'vlink'} = $4;
			$CC{'qmsgc'} = $5;
			$CC{'subj'} = $subjc;#$CC{'text'};
			$i = hex ( $7 );
			$j = hex ( $8 );	# \
			$k = hex ( $9 );	# \
		}
		elsif ( length ( $FORM{'c'} ) == 39  ) {
			$FORM{'c'} =~ /^(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w\w\w\w\w\w)(\w)(\w)(\w)$/;
			$CC{'text'} = $1;
			$CC{'bg'} = $2;
			$CC{'link'} = $3;
			$CC{'vlink'} = $4;
			$CC{'qmsgc'} = $5;
			$CC{'subj'} = $6;
			#$CC{'subj'} = $subjc;#$CC{'text'};
			$i = hex ( $7 );
			$j = hex ( $8 );	# \
			$k = hex ( $9 );	# \
		} elsif ( length ( $FORM{'c'} ) == 3  ) {
			$FORM{'c'} =~ /^(\w)(\w)(\w)$/;
			$CC{'text'} = $textc;
			$CC{'bg'} = $bgc;
			$CC{'link'} = $linkc;
			$CC{'vlink'} = $vlinkc;
			$CC{'qmsgc'} = $qmsgc;
			$CC{'subj'} = $subjc;
			$i = hex ( $1 );
			$j = hex ( $2 );	# \
			$k = hex ( $3 );	# \
		}
		$gzipu = int ( $i / 8 );
		$reltype = int ( $i % 8 / 4 );
		$followwin = int ( $i % 8 % 4 / 2 );
		$autolink = ( $i % 8 % 4 % 2 );
		if ( $FORM{'m'} eq 'p' || $FORM{'m'} eq 'op' ) {
			if ( $FORM{'a'} ) { $autolink = 1; } else { $autolink = 0; }
			if ( $FORM{'g'} ) { $gzipu = 1; } else { $gzipu = 0; }
		}
	} else {
		$CC{'text'} = $textc;
		$CC{'bg'} = $bgc;
		$CC{'link'} = $linkc;
		$CC{'vlink'} = $vlinkc;
		$CC{'qmsgc'} = $qmsgc;
		$CC{'subj'} = $subjc;
		$gzipu = $FORM{'g'} if ( $FORM{'m'} eq 'g' );
	}
	$i = sprintf ( "%x", $autolink + $followwin * 2 + $reltype * 4 + $gzipu * 8 );
	$j = 0;
	$k = 0;

	if (
	  ( $CC{'text'} eq $textc ) &&
	  ( $CC{'bg'} eq $bgc ) &&
	  ( $CC{'link'} eq $linkc ) &&
	  ( $CC{'vlink'} eq $vlinkc ) &&
	  ( $CC{'qmsgc'} eq $qmsgc ) &&
	  ( $CC{'subj'} eq $subjc ) ) {
		$FORM{'c'} = "$i$j$k";
	} else {
		$FORM{'c'} = "$CC{'text'}$CC{'bg'}$CC{'link'}$CC{'vlink'}$CC{'qmsgc'}$CC{'subj'}$i$j$k";
	}
}


###############################################################################
#  C
###############################################################################


&getformdata;
&jconv;
&getenv;
&getcookie if ( $cookie );
$nowtime = time - $difftime * 60 * 60;


# p[^Ǘ̂߂$ks_param𐶐
# $ks_param->{post} <form>p
# $ks_param->{get}  ɃNp̃p[^Ă܂
require './sub/ks_param.pl';
$ks_param = ks_param->new->set_param(
	tree			=> $FORM{tree},
	color_newmsg	=> $FORM{color_newmsg},
	color_branch	=> $FORM{color_branch},
);


if ( $FORM{'m'} eq 'c' ) {
	require './sub/bbscust.pl';
	&setcustom;
	exit;
}

# lpݒ蔽f
&refcustom;
$body = qq(<BODY bgcolor="#$CC{'bg'}" text="#$CC{'text'}" link="#$CC{'link'}" vlink="#$CC{'vlink'}" alink="#$alinkc">);

# Getlog
if ( $FORM{'m'} eq 'g' ) {
	require './sub/bbslog.pl';
	&getlog;
	exit;
}

# gsbNꗗ
if ( $FORM{'m'} eq 'l' ) {
	require './sub/bbstopic.pl';
	&lsttopic;
	exit;
}

# Ǘ[h
if ( $FORM{'ad'} ) {
	require './sub/bbsadmin.pl';
	&adminmain;
	exit;
}

if ( ( !$adminpost[0] ) || ( !$adminpost[1] ) || ( !$adminpost[2] ) ) {
	require './sub/bbsadmin.pl';
	&setpass;
	exit;
}

# lpݒ
if ( $FORM{'setup'} ) {
	require './sub/bbscust.pl';
	&prtcustom;
	exit;
}

# \ݒ

     if ($FORM{'zeload'}) {

             $FORM{'d'} = 0;
     } elsif ( $FORM{'d'} ne '' ) {
             if ( $FORM{'d'} > $logsave ) {
                     $FORM{'d'} = $logsave;
             }
     } else {
             $FORM{'d'} = $msgdisp;
     }

if ( $FORM{'m'} eq 'p' && $FORM{'v'} && !$FORM{'reload'} ) {

if ( ($anonyproxylimit) && ($anonyproxyflg) ) {
&prterror ( '݁Aproxyϐo͂zXgɂ̓ANZXĂ܂B' );
}

	$postid = 0;
	$posterr = 0;
	if ( $ENV{'CONTENT_TYPE'} eq 'application/x-www-form-urlencoded' ) {
		&chkmessage;
		&putmessage;
	} else {
		$posterr = 255;
	}
	if ( $FORM{'zwindow'} || $FORM{'ac'} || ( $FORM{'f'} && !$followwin ) ) {
		&prthtmlhead ( "$FORM{'newtitle'} ݊" );
		print <<EOF;
<H1><a href="$cgiurl?$ks_param->{get}">݊</a></H1>
</BODY>
</HTML>
EOF
		exit;
	}
	undef $FORM{'f'};
} elsif ( $FORM{'m'} eq 'f' ) {
	&prtfollow ( 0 );
} elsif ( $FORM{'m'} eq 's' || $FORM{'m'} eq 't' ) {
	require './sub/bbssrc.pl';
	&srcmessage;
} else {
	if ( $FORM{'m'} eq 'n' ) {
		$bmsg = $FORM{'b'};
	} else {
		$bmsg = 0;
	}
}

&prtmain ( '', '', '' );

exit;


__END__
