#!/usr/bin/perl
my $myfilepath = '';
chdir $myfilepath;
use lib "./lib/";
require 'clsMail.pm';
use POSIX;
use MIME::Base64;
use File::Copy;
#require $myfilepath.'lib/jcode.pl';
#require $myfilepath.'lib/mimew.pl';
require 'setup.cgi';
my $mode = $ARGV[0];
our $SYS;
# 絶対パスに上書き
$SYS->{data_dir} = $myfilepath."data/";
# 管理者のデータ取得
my $objAcData = new clsAcData($SYS->{data_dir});
my $admindata = $objAcData->GetAdminData();
my %FORM;
# メール内容取得
my $v = getmaildata();
$FORM{email} = $v->{email};
$FORM{body} = $v->{body};
# 自動返信メールテンプレート情報取得
my $rowform = $objAcData->GetRowData('form', 'FORM');
# 送信者のメールアドレス
my $sendername = &SetFromName($admindata->{admin_email}, $admindata->{admin_name});
# sendmailへのパス
my $sendmailpath = $admindata->{sendmail_path};
# チェックボックスの値を変更して取得
%FORM = &ChangeCheckboxValue(\%FORM);
my $ml_comment_admin= "";
my $xmailer = '';
# 登録
if ($mode eq "reg") {
if ($admindata->{double_opt}) {
&doubleopt();
} else {
®add();
}
} elsif ($mode eq "del") {
®del();
} elsif ($mode eq "autoform") {
&autoform();
}
exit;
sub autoform() {
# 登録フォームを表示
# このモードは強制的にダブルオプトインの機能となります。
$FORM{id} = time.$$;
$FORM{id} = &md5sum($FORM{id});
# 配信フラグの立っているデータあるかどうか
# フォームからの登録が許可されていない場合
if (!$admindata->{double_reg_form}) {
if (!$objAcData->RegCheckDouble($FORM{email}, 1)) {
&error_mail("そのアドレスは既に登録されています。");
}
}
# データ登録
$objAcData->AddTempData(\%FORM, $SYS->{max_colnum});
my $body = $rowform->{form_autoform_mailbody};
my $userdata;
foreach my $n (keys %FORM) {
$userdata->{$n} = $FORM{$n};
}
# 置換作業
$body = $objAcData->ReplaceMailBody($body, $admindata, $userdata, $SYS->{max_colnum});
$body =~ s/__<
>__/\n/g;
if ($rowform->{type} eq "html") {
$body =~ s/\n/
/gi;
}
my $objMail = new clsMail($admindata->{relay_use}, $admindata->{relay_host}, $admindata->{relay_port}, $admindata->{relay_user}, $admindata->{relay_pass}, $admindata->{relay_send_mode}, $admindata->{qmail}, $admindata->{fail_send_local});
# 登録者へメール
$objMail->send($sendmailpath,$FORM{email},$rowform->{form_autoform_mailtitle},$body,$sendername,$admindata->{admin_email},$xmailer,$admindata->{admin_email}, $rowform->{send_type}) || &error_mail("メールアドレスの送信に失敗しました。
お手数ですが管理人「$sendername」にご連絡ください。");
#}
}
sub doubleopt{
$FORM{id} = time.$$;
$FORM{id} = &md5sum($FORM{id});
# 自由項目取得
my $freecol = $objAcData->GetRowData('freecol', 'FREECOL');
# 項目取得
for(my $i = 1; $i <= $SYS->{max_colnum}; $i++) {
my $target = $freecol->{"col".$i."name"};
my @body = split(/\r\n|\r|\n/, $FORM{body});
foreach my $ref (@body) {
if ($ref =~ /^$target(\:)(.*)/i) {
$FORM{"col".$i} = $2;
}
}
}
my $error_data;
# エラーチェック(必須項目チェック)
if (!$objAcData->RegCheckExists(\%FORM, $SYS->{max_colnum}, \$error_data)) {
$error_data =~ s/
/\n/gi;
&error_mail($error_data);
}
# 配信フラグの立っているデータあるかどうか
# フォームからの登録が許可されていない場合
if (!$admindata->{double_reg_form}) {
if (!$objAcData->RegCheckDouble($FORM{email}, 1)) {
&error_mail("そのアドレスは既に登録されています。");
}
}
# データ登録
$objAcData->AddTempData(\%FORM, $SYS->{max_colnum});
my $body = $rowform->{form_temp_mailbody};
my $userdata;
foreach my $n (keys %FORM) {
$userdata->{$n} = $FORM{$n};
}
# 置換作業
$body = $objAcData->ReplaceMailBody($body, $admindata, $userdata, $SYS->{max_colnum});
$body =~ s/__<
>__/\n/g;
if ($rowform->{type} eq "html") {
$body =~ s/\n/
/gi;
}
my $objMail = new clsMail($admindata->{relay_use}, $admindata->{relay_host}, $admindata->{relay_port}, $admindata->{relay_user}, $admindata->{relay_pass}, $admindata->{relay_send_mode}, $admindata->{qmail}, $admindata->{fail_send_local});
# 登録者へメール
$objMail->send($sendmailpath,$FORM{email},$rowform->{form_temp_mailtitle},$body,$sendername,$admindata->{admin_email},$xmailer,$admindata->{admin_email}, $rowform->{send_type}) || &error_mail("メールアドレスの送信に失敗しました。
お手数ですが管理人「$sendername」にご連絡ください。");
#}
}
sub regadd{
# 新規登録時の日付セット
my %TIME = &getdatetime();
$FORM{'add_date'} = $TIME{'year'}."/".$TIME{'mon'}."/".$TIME{'mday'}." ".$TIME{'hour'}.":".$TIME{'min'}.":".$TIME{'sec'};
$FORM{'edit_date'} = $FORM{'add_date'};
# 自由項目取得
my $freecol = $objAcData->GetRowData('freecol', 'FREECOL');
# 項目取得
for(my $i = 1; $i <= $SYS->{max_colnum}; $i++) {
my $target = $freecol->{"col".$i."name"};
my @body = split(/\r\n|\r|\n/, $FORM{body});
foreach my $ref (@body) {
if ($ref =~ /^$target(\:)(.*)/i) {
$FORM{"col".$i} = $2;
}
}
}
my $error_data;
# エラーチェック(必須項目チェック)
if (!$objAcData->RegCheckExists(\%FORM, $SYS->{max_colnum}, \$error_data)) {
$error_data =~ s/
/\n/gi;
&error_mail($error_data);
}
# 配信フラグの立っているデータあるかどうか
#if (!$objAcData->RegCheckDouble($FORM{email}, 1)) {
# &error_mail("そのアドレスは既に登録されています。");
#}
# 対象のメールアドレスを取得
my $maildata = $objAcData->GetMailData('', $FORM{'email'}) ;
# フォームからの重複登録が許可されていない場合
if (!$admindata->{double_reg_form}) {
if ($maildata->{email} && $maildata->{status}) {
&error_mail("対象のアドレスは既に登録されています。");
}
}
# 文字コード調査
if ($FORM{force}) {
# 強制
for(1..$SYS->{max_colnum}) {
&Jcode::convert(\$FORM{"col".$_}, "euc", $FORM{force});
}
} else {
if ($FORM{encode}) {
my $enc = getcode($FORM{encode});
if ($enc ne "euc") {
for(1..$SYS->{max_colnum}) {
&Jcode::convert(\$FORM{"col".$_}, "euc", $enc);
}
}
}
}
# データ登録
if ($admindata->{double_reg_form}) {
# 新規登録
$objAcData->RegEmail(\%FORM);
} elsif ($maildata->{email}) {
# 登録データを全て上書きする 10/03/24
$FORM{id} = $maildata->{id};
$FORM{status} = 1;
$objAcData->UpdData('mail', 'MAIL', $maildata->{id}, \%FORM);
# 配信フラグ更新
#$FORM{"send_flg".$maildata->{id}} = 1;
#$FORM{"hid_email".$maildata->{id}} = 1;
#$objAcData->UpdMailStatus(\%FORM);
} else {
# 新規登録
$objAcData->RegEmail(\%FORM);
}
my $userdata;
foreach my $n (keys %FORM) {
$userdata->{$n} = $FORM{$n};
}
my $body = $rowform->{form_mailbody};
# 置換作業
$body = $objAcData->ReplaceMailBody($body, $admindata, $userdata, $SYS->{max_colnum});
$body =~ s/__<
>__/\n/gi;
if ($rowform->{type} eq "html") {
$body =~ s/\n/
/gi;
$body =~ s/\n/
/gi;
}
my $objMail = new clsMail($admindata->{relay_use}, $admindata->{relay_host}, $admindata->{relay_port}, $admindata->{relay_user}, $admindata->{relay_pass}, $admindata->{relay_send_mode}, $admindata->{qmail}, $admindata->{fail_send_local});
if ($admindata->{merumaga_usermail}) {
# 登録者へメール
$objMail->send($sendmailpath,$FORM{email},$rowform->{form_mailtitle},$body,$sendername,$admindata->{admin_email},$xmailer,$admindata->{admin_email}, $rowform->{send_type}) || &error_mail("メールアドレスの送信に失敗しました。
お手数ですが管理人「$sendername」にご連絡ください。");
}
if ($admindata->{merumaga_adminmail}) {
# 管理人へメール
$objMail->send($sendmailpath,$admindata->{admin_email},$rowform->{form_mailtitle}.$FORM{email},$body.$ml_comment_admin,$sendername,$sendername,$xmailer,$sendername, $rowform->{send_type}) || &error_mail("メールアドレスの送信に失敗しました。
お手数ですが管理人「$sendername」にご連絡ください。");
}
}
sub getmaildata {
my %TIME = &getdatetime();
my $message;
my $boundary;
my $email;
# 一度メールを読み込み保存する
while () {
$message .= $_;
}
&jcode::convert(\$message,"euc");
# ヘッダーと本文に分解&配列化
my $mail_head = $message;
$mail_head =~ s/\n\n(.*)//s;
my $mail_body = $1;
my @mail_head = split(/\n/,$mail_head);
my @mail_body = split(/\n/,$mail_body);
my $kind;
my ($email_f, $subject_f, $body_f);
foreach (@mail_head) {
if (/^(.*): (.*)$/i) {
$kind = $1;
}
# 送信元メールアドレス
if ($kind =~ /from/i) {
$email .= $_;
$mail_f = 1;
}
# 件名取得
if (/Subject:(.*)/i) {
$kind = "subject";
$subject = $1;
$subject_f = 1;
}
# boundary取得
if(/(.*)boundary\=\"(.*)\"/ && $email_f && $subject_f && $body_f) {
$kind = "boundary";
$boundary = $2;
}
}
# DOCOMOとAU対策 "asdf..asdf."@docomo.ne.jpみたいなアドレスできた場合"を外す
if ($email =~ /[^\"]*(\")([^\"]*)\"(\@.*)$/) {
$email = $2.$3;
}
# メールアドレス取得
$email = lc(&getmailaddr($email));
my $bound_count = 0;
my $flag;
my $chk_3gp;
my @data;
my $bodydata;
foreach (@mail_body) {
if ($boundary) {
if(/(.*)$boundary(.*)/) {
$bound_count++;
next;
}
if ($bound_count == 1) {
$bodydata .= $_."\n";
}
} else {
$bodydata .= $_."\n";
}
}
# 件名Bエンコードをデコード
my $lws = '(?:(?:\x0D\x0A|\x0D|\x0A)?[ \t])+';
my $ew_regex = '=\?ISO-2022-JP\?B\?([A-Za-z0-9+/]+=*)\?=';
$subject =~ s/($ew_regex)$lws(?=$ew_regex)/$1/gio;
$subject =~ s/$lws/ /go;
$subject =~ s/$ew_regex/decode_base64($1)/egio;
&jcode::convert(\$subject, 'euc', 'jis');
my $v;
$v->{email} = $email;
$v->{subject} = $subject;
$v->{body} = $bodydata;
return $v;
}
sub regdel{
# メールデータ一式取得
my @DELMAIL = $objAcData->GetData('mail', 'MAIL');
my $exist = 0;
my $data;
foreach my $ref (@DELMAIL) {
if ($FORM{email} eq $ref->{email}) {
$data = $ref; # 対象データ取得
if ($ref->{status}) { $exist = 1; }
if ($admindata->{delmode} eq "del") {
# 物理削除
$objAcData->DelData('mail', 'MAIL', $ref->{id});
} else {
# 配信ステータス変更
my $CHANGE;
$CHANGE->{$ref->{id}} = 1;
$FORM{"send_flg".$ref->{id}} = 0;
$FORM{"hid_email".$ref->{id}} = 1;
$objAcData->UpdMailStatus(\%FORM);
}
}
}
if(!$exist){
&error_mail("そのメールアドレスは登録されていません。");
}
my $body = $rowform->{form2_mailbody};
my $userdata = $data;
# 置換作業
$body = $objAcData->ReplaceMailBody($body, $admindata, $userdata, $SYS->{max_colnum});
$body =~ s/__<
>__/\n/gi;
if ($rowform->{type} eq "html") {
$body =~ s/\n/
/gi;
$ml_comment_admin =~ s/\n/
/gi;
}
my $objMail = new clsMail($admindata->{relay_use}, $admindata->{relay_host}, $admindata->{relay_port}, $admindata->{relay_user}, $admindata->{relay_pass}, $admindata->{relay_send_mode}, $admindata->{qmail}, $admindata->{fail_send_local});
if ($admindata->{merumaga_usermail}) {
# 登録者へメール
$objMail->send($sendmailpath,$FORM{email},$rowform->{form2_mailtitle},$body,$sendername,$admindata->{admin_email},$xmailer,$admindata->{admin_email}, $rowform->{send_type}) || &error_mail("メールアドレスの送信に失敗しました。
お手数ですが管理人「$sendername」にご連絡ください。");
}
if ($admindata->{merumaga_adminmail}) {
# 管理人へメール
$objMail->send($sendmailpath,$admindata->{admin_email},$rowform->{form2_mailtitle}.$FORM{email},$body.$ml_comment_admin,$sendername,$admindata->{admin_email},$xmailer,$admindata->{admin_email}, $rowform->{send_type}) || &error_mail("メールアドレスの送信に失敗しました。
お手数ですが管理人「$sendername」にご連絡ください。");
}
}
sub error_mail {
my $str = shift;
my $objMail = new clsMail($admindata->{relay_use}, $admindata->{relay_host}, $admindata->{relay_port}, $admindata->{relay_user}, $admindata->{relay_pass}, $admindata->{relay_send_mode}, $admindata->{qmail}, $admindata->{fail_send_local});
if (!$FORM{email}) { $FORM{email} = $admindata->{admin_email}; }
$objMail->send($sendmailpath,$FORM{email},'エラー',$str,$sendername,$admindata->{admin_email},$xmailer,$admindata->{admin_email});
exit;
}
sub getmailaddr{
my $mail = shift;
# メールアドレス正規表現
$mail_regex = q{([\w|\!\#\$\%\'\=\-\^\`\\\|\~\[\{\]\}\+\*\.\?\/]+)\@([\w|\!\#\$\%\'\(\)\=\-\^\`\\\|\~\[\{\]\}\+\*\.\?\/]+)};
if($mail =~ /$mail_regex/o){
$mail =~ s/($mail_regex)(.*)/$1/go; # メールアドレスの最後以降を削除
$mail =~ s/(.*)[^\w|\!\#\$\%\'\=\-\^\`\\\|\~\[\{\]\}\+\*\.\?\/]+($mail_regex)/$2/go; # メールアドレスまでを削除
}
return $mail;
}
sub md5sum{
use integer;
my ($l,$m,@n,$a,$b,$c,$d,@e,$r);
# Initial values set
$a=0x67452301;$b=0xefcdab89;$c=0x98badcfe;$d=0x10325476;
$m=$_[0];
# Padding
$l=length $m;
$m.="\x80"."\x00"x(($l%64<56?55:119)-$l%64);
$m.=pack "VV",($l<<3)&0xffffffff,$l<<35;
# Round
for(0..($l+8)/64){
@n=unpack 'V16',substr($m,$_<<6,64);
@e[0..3]=($a,$b,$c,$d);
$r=($a+$n[0]+0xd76aa478+($b&$c|(~$b&$d)));$a=$b+(($r<<7)|(($r>>25)&0x7f));
$r=($d+$n[1]+0xe8c7b756+($a&$b|(~$a&$c)));$d=$a+(($r<<12)|(($r>>20)&0xfff));
$r=($c+$n[2]+0x242070db+($d&$a|(~$d&$b)));$c=$d+(($r<<17)|(($r>>15)&0x1ffff));
$r=($b+$n[3]+0xc1bdceee+($c&$d|(~$c&$a)));$b=$c+(($r<<22)|(($r>>10)&0x3fffff));
$r=($a+$n[4]+0xf57c0faf+($b&$c|(~$b&$d)));$a=$b+(($r<<7)|(($r>>25)&0x7f));
$r=($d+$n[5]+0x4787c62a+($a&$b|(~$a&$c)));$d=$a+(($r<<12)|(($r>>20)&0xfff));
$r=($c+$n[6]+0xa8304613+($d&$a|(~$d&$b)));$c=$d+(($r<<17)|(($r>>15)&0x1ffff));
$r=($b+$n[7]+0xfd469501+($c&$d|(~$c&$a)));$b=$c+(($r<<22)|(($r>>10)&0x3fffff));
$r=($a+$n[8]+0x698098d8+($b&$c|(~$b&$d)));$a=$b+(($r<<7)|(($r>>25)&0x7f));
$r=($d+$n[9]+0x8b44f7af+($a&$b|(~$a&$c)));$d=$a+(($r<<12)|(($r>>20)&0xfff));
$r=($c+$n[10]+0xffff5bb1+($d&$a|(~$d&$b)));$c=$d+(($r<<17)|(($r>>15)&0x1ffff));
$r=($b+$n[11]+0x895cd7be+($c&$d|(~$c&$a)));$b=$c+(($r<<22)|(($r>>10)&0x3fffff));
$r=($a+$n[12]+0x6b901122+($b&$c|(~$b&$d)));$a=$b+(($r<<7)|(($r>>25)&0x7f));
$r=($d+$n[13]+0xfd987193+($a&$b|(~$a&$c)));$d=$a+(($r<<12)|(($r>>20)&0xfff));
$r=($c+$n[14]+0xa679438e+($d&$a|(~$d&$b)));$c=$d+(($r<<17)|(($r>>15)&0x1ffff));
$r=($b+$n[15]+0x49b40821+($c&$d|(~$c&$a)));$b=$c+(($r<<22)|(($r>>10)&0x3fffff));
$r=($a+$n[1]+0xf61e2562+($b&$d|(~$d&$c)));$a=$b+(($r<<5)|(($r>>27)&0x1f));
$r=($d+$n[6]+0xc040b340+($a&$c|(~$c&$b)));$d=$a+(($r<<9)|(($r>>23)&0x1ff));
$r=($c+$n[11]+0x265e5a51+($d&$b|(~$b&$a)));$c=$d+(($r<<14)|(($r>>18)&0x3fff));
$r=($b+$n[0]+0xe9b6c7aa+($c&$a|(~$a&$d)));$b=$c+(($r<<20)|(($r>>12)&0xfffff));
$r=($a+$n[5]+0xd62f105d+($b&$d|(~$d&$c)));$a=$b+(($r<<5)|(($r>>27)&0x1f));
$r=($d+$n[10]+0x02441453+($a&$c|(~$c&$b)));$d=$a+(($r<<9)|(($r>>23)&0x1ff));
$r=($c+$n[15]+0xd8a1e681+($d&$b|(~$b&$a)));$c=$d+(($r<<14)|(($r>>18)&0x3fff));
$r=($b+$n[4]+0xe7d3fbc8+($c&$a|(~$a&$d)));$b=$c+(($r<<20)|(($r>>12)&0xfffff));
$r=($a+$n[9]+0x21e1cde6+($b&$d|(~$d&$c)));$a=$b+(($r<<5)|(($r>>27)&0x1f));
$r=($d+$n[14]+0xc33707d6+($a&$c|(~$c&$b)));$d=$a+(($r<<9)|(($r>>23)&0x1ff));
$r=($c+$n[3]+0xf4d50d87+($d&$b|(~$b&$a)));$c=$d+(($r<<14)|(($r>>18)&0x3fff));
$r=($b+$n[8]+0x455a14ed+($c&$a|(~$a&$d)));$b=$c+(($r<<20)|(($r>>12)&0xfffff));
$r=($a+$n[13]+0xa9e3e905+($b&$d|(~$d&$c)));$a=$b+(($r<<5)|(($r>>27)&0x1f));
$r=($d+$n[2]+0xfcefa3f8+($a&$c|(~$c&$b)));$d=$a+(($r<<9)|(($r>>23)&0x1ff));
$r=($c+$n[7]+0x676f02d9+($d&$b|(~$b&$a)));$c=$d+(($r<<14)|(($r>>18)&0x3fff));
$r=($b+$n[12]+0x8d2a4c8a+($c&$a|(~$a&$d)));$b=$c+(($r<<20)|(($r>>12)&0xfffff));
$r=($a+$n[5]+0xfffa3942+($b^$c^$d));$a=$b+(($r<<4)|(($r>>28)&0xf));
$r=($d+$n[8]+0x8771f681+($a^$b^$c));$d=$a+(($r<<11)|(($r>>21)&0x7ff));
$r=($c+$n[11]+0x6d9d6122+($d^$a^$b));$c=$d+(($r<<16)|(($r>>16)&0xffff));
$r=($b+$n[14]+0xfde5380c+($c^$d^$a));$b=$c+(($r<<23)|(($r>>9)&0x7fffff));
$r=($a+$n[1]+0xa4beea44+($b^$c^$d));$a=$b+(($r<<4)|(($r>>28)&0xf));
$r=($d+$n[4]+0x4bdecfa9+($a^$b^$c));$d=$a+(($r<<11)|(($r>>21)&0x7ff));
$r=($c+$n[7]+0xf6bb4b60+($d^$a^$b));$c=$d+(($r<<16)|(($r>>16)&0xffff));
$r=($b+$n[10]+0xbebfbc70+($c^$d^$a));$b=$c+(($r<<23)|(($r>>9)&0x7fffff));
$r=($a+$n[13]+0x289b7ec6+($b^$c^$d));$a=$b+(($r<<4)|(($r>>28)&0xf));
$r=($d+$n[0]+0xeaa127fa+($a^$b^$c));$d=$a+(($r<<11)|(($r>>21)&0x7ff));
$r=($c+$n[3]+0xd4ef3085+($d^$a^$b));$c=$d+(($r<<16)|(($r>>16)&0xffff));
$r=($b+$n[6]+0x04881d05+($c^$d^$a));$b=$c+(($r<<23)|(($r>>9)&0x7fffff));
$r=($a+$n[9]+0xd9d4d039+($b^$c^$d));$a=$b+(($r<<4)|(($r>>28)&0xf));
$r=($d+$n[12]+0xe6db99e5+($a^$b^$c));$d=$a+(($r<<11)|(($r>>21)&0x7ff));
$r=($c+$n[15]+0x1fa27cf8+($d^$a^$b));$c=$d+(($r<<16)|(($r>>16)&0xffff));
$r=($b+$n[2]+0xc4ac5665+($c^$d^$a));$b=$c+(($r<<23)|(($r>>9)&0x7fffff));
$r=($a+$n[0]+0xf4292244+($c^($b|~$d)));$a=$b+(($r<<6)|(($r>>26)&0x3f));
$r=($d+$n[7]+0x432aff97+($b^($a|~$c)));$d=$a+(($r<<10)|(($r>>22)&0x3ff));
$r=($c+$n[14]+0xab9423a7+($a^($d|~$b)));$c=$d+(($r<<15)|(($r>>17)&0x7fff));
$r=($b+$n[5]+0xfc93a039+($d^($c|~$a)));$b=$c+(($r<<21)|(($r>>11)&0x1fffff));
$r=($a+$n[12]+0x655b59c3+($c^($b|~$d)));$a=$b+(($r<<6)|(($r>>26)&0x3f));
$r=($d+$n[3]+0x8f0ccc92+($b^($a|~$c)));$d=$a+(($r<<10)|(($r>>22)&0x3ff));
$r=($c+$n[10]+0xffeff47d+($a^($d|~$b)));$c=$d+(($r<<15)|(($r>>17)&0x7fff));
$r=($b+$n[1]+0x85845dd1+($d^($c|~$a)));$b=$c+(($r<<21)|(($r>>11)&0x1fffff));
$r=($a+$n[8]+0x6fa87e4f+($c^($b|~$d)));$a=$b+(($r<<6)|(($r>>26)&0x3f));
$r=($d+$n[15]+0xfe2ce6e0+($b^($a|~$c)));$d=$a+(($r<<10)|(($r>>22)&0x3ff));
$r=($c+$n[6]+0xa3014314+($a^($d|~$b)));$c=$d+(($r<<15)|(($r>>17)&0x7fff));
$r=($b+$n[13]+0x4e0811a1+($d^($c|~$a)));$b=$c+(($r<<21)|(($r>>11)&0x1fffff));
$r=($a+$n[4]+0xf7537e82+($c^($b|~$d)));$a=$b+(($r<<6)|(($r>>26)&0x3f));
$r=($d+$n[11]+0xbd3af235+($b^($a|~$c)));$d=$a+(($r<<10)|(($r>>22)&0x3ff));
$r=($c+$n[2]+0x2ad7d2bb+($a^($d|~$b)));$c=$d+(($r<<15)|(($r>>17)&0x7fff));
$r=($b+$n[9]+0xeb86d391+($d^($c|~$a)));$b=$c+(($r<<21)|(($r>>11)&0x1fffff));
$a=($a+$e[0])&0xffffffff;
$b=($b+$e[1])&0xffffffff;
$c=($c+$e[2])&0xffffffff;
$d=($d+$e[3])&0xffffffff;}
unpack('H*',(pack 'V4',$a,$b,$c,$d));
}
1;