#!/usr/bin/perl #---------------------------------------# # PETIT BOARD v5.22 (2001/03/21) # # Copyright(C) Kent Web 1997-2001 # # webmaster@kent-web.com # # http://www.kent-web.com/ # #---------------------------------------# # バージョン情報 $ver = 'PETIT BOARD v5.22'; #--- [注意事項] ------------------------------------------------# # 1. このスクリプトはフリーソフトです。このスクリプトを使用した # # いかなる損害に対して作者は一切の責任を負いません。 # # 2. 設置に関する質問はサポート掲示板にお願いいたします。 # # 直接メールによる質問は一切お受けいたしておりません。 # # 3. 添付の home.gif は L.O.V.E の mayuRin さんによる画像です。 # #---------------------------------------------------------------# # 【ファイル構成例】 # # public_html (ホームディレクトリ) # | # +-- petit / petit.cgi [755] # | petit.log [666] # | count.dat [666] # | jcode.pl [644] # | pastno.dat[666] # | home.gif # | # +-- lock [777] / # | # +-- past [777] / 1.dat [666] ... #============# # 設定項目 # #============# # 文字コードライブラリ取込 require './jcode.pl'; # タイトル名を指定 $title = "すし半掲示板"; # タイトルの色 $t_color = "#008080"; # タイトルの大きさ(ポイント数:スタイルシートで有効) $t_size = '20pt'; # タイトル文字のフォントタイプ $t_face = "MS Pゴシック"; # 本文の文字大きさ(ポイント数:スタイルシートで有効) $b_size = '10pt'; # 壁紙を指定する場合(http://から指定) $backgif = "http://www.chi-ta.com/sushihan/back2.jpg"; # 背景色を指定 $bgcolor = "#FFFFFF"; # 文字色を指定 $text = "#000000"; # リンク色を指定 $link = "#0000FF"; # 未訪問 $vlink = "#800080"; # 訪問済 $alink = "#FF0000"; # 訪問中 # 戻り先のURL (index.htmlなど) $homepage = "../index.html"; # 最大記事数 $max = 100; # 管理者用マスタパスワード (英数字で8文字以内) $pass = '281792'; # 返信がつくと親記事をトップへ移動 (0=no 1=yes) $topsort = 1; # 返信フォーム複数行化 (0=no 1=yes) $res_forms = 1; # ホスト名取得モード # --> 0 : $ENV{'REMOTE_HOST'} で取得できる場合 # --> 1 : gethostbyaddr で取得できる場合 $get_remotehost = 0; # タイトルにGIF画像を使用する時 (http://から記述) $title_gif = "http://www.chi-ta.com/sushihan/bbs/bbs_title.jpg"; $tg_w = '600'; # GIF画像の幅 (ピクセル) $tg_h = '100'; # 〃 高さ (ピクセル) # ファイルロック形式 # → 0=no 1=symlink関数 2=mkdir関数 # → 設定する場合は、ロックファイルを生成するディレクトリ # のパーミッションは原則として「777」に設定する。 $lockkey = 1; # ロックファイル名 $lockfile = './lock/petit.lock'; # ミニカウンタの設置 # --> 0=no 1=テキスト 2=GIF画像 $counter = 1; # ミニカウンタの桁数 $mini_fig = 6; # テキストのとき:ミニカウンタの色 $cnt_color = "#223377"; # GIFのとき:画像までのディレクトリ # → 最後は必ず / で閉じる $gif_path = "./img/"; $mini_w = 8; # 画像の横サイズ $mini_h = 12; # 画像の縦サイズ # カウンタファイル $cntfile = './count.dat'; # タグの許可 (0=no 1=yes) $tagkey = 0; # スクリプトのファイル名 # --> フルパスで指定する場合は http:// から記述 $script = './sushihanbbs.cgi'; # ログファイルを指定 # --> フルパスで指定する場合は / から記述 $logfile = './petit.log'; # 記事 [タイトル] 部の長さ (全角文字換算) $sub_len = '20'; # 記事の [タイトル] 部の色 $sub_color = "#335544"; # 記事表示部の下地の色 $tbl_color = "#FFFFFF"; # 家アイコンの使用 (0=no 1=yes) $home_icon = 1; $home_gif = "./home.gif"; # 家アイコンのファイル名 $home_wid = 16; # 画像の横サイズ $home_hei = 20; # 〃 縦サイズ # methodの形式 (POST/GET) $method = 'POST'; # 記事の更新は method=POST 限定 (0=no 1=yes) # --> 連続投稿などの荒らし対策 $MethPost = 1; # 同一IPアドレスからの連続投稿時間(秒数) # --> 連続投稿などの荒らし対策 # --> 値を 0 にするとこの機能は無効になります $wait = 60; # 1ページ当たりの記事表示数 (親記事) $p_log = 10; # 投稿があるとメール通知する (sendmail必須) # 0 : 通知しない # 1 : 通知するが、自分の投稿記事はメールしない。 # 2 : 通知する。自分の投稿記事も通知する。 $mailing = 0; # メールアドレス(メール通知する時) $mailto = 'xxx@xxx.xxx'; # sendmailパス(メール通知する時) $sendmail = '/usr/sbin/sendmail'; # 他サイトから投稿排除時に指定 (http://から書く) $base_url = ""; # 文字色の設定。 @color1 = ('800000','DF0000','008040','0000FF','C100C1','FF80C0','FF8040','000080'); @color2 = ('茶','赤','みどり','青','紫','ピンク','オレンジ','あい色'); # 投稿フォーム改行形式 (soft=手動 hard=強制) $wrap = 'soft'; # URLの自動リンク (0=no 1=yes) # --> タグ許可の場合は no とすること。 $autolink = 1; # タグ広告挿入オプション (FreeWebなど) # → の代わりに「広告タグ」を挿入する。 # → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能です。 $banner1 = ''; # 掲示板上部に挿入 $banner2 = ''; # 掲示板下部に挿入 # アクセス制限(ホスト名、IPアドレスを記述) @deny = ( "*.anonymizer.com", "cache*.*.interlog.com", "211.154.120.*", "", "", "", "", "", "" ); #---(以下は「過去ログ」機能を使用する場合の設定です)---# # # 過去ログ生成 (0=no 1=yes) $pastkey = 1; # 過去ログ用NOファイル $nofile = './pastno.dat'; # 過去ログのディレクトリ # → フルパスなら / から記述(http://からではない) # → 最後は必ず / で閉じる $pastdir = './past/'; # 過去ログ1ファイルの行数 # → この行数を超えると次ページを自動生成します $log_line = '200'; #============# # 設定完了 # #============# # メイン処理 &decode; &axs_check; if ($mode eq "howto") { &howto; } elsif ($mode eq "find") { &find; } elsif ($mode eq "usr_del") { &usr_del; } elsif ($mode eq "regist") { ®ist; } elsif ($mode eq "admin") { &admin; } elsif ($mode eq "image") { ℑ } elsif ($mode eq "past") { &past; } elsif ($mode eq "check") { ✓ } &html_log; #----------------# # アクセス制限 # #----------------# sub axs_check { # ホスト名を取得 &get_host; $flag=0; foreach (@deny) { if (!$_) { next; } $_ =~ s/\*/\.\*/g; if ($host =~ /$_/i) { $flag=1; last; } } if ($flag) { &error("アクセスを許可されていません"); } } #--------------# # 記事表示部 # #--------------# sub html_log { # クッキーを取得 &get_cookie; # フォーム長を調整 &get_agent; # ヘッダを出力 &header; # カウンタ処理 if ($counter) { &counter; } # タイトル部 print "
\n"; if ($banner1 ne "") { print "$banner1

\n"; } if ($title_gif eq '') { print "$title\n"; } else { print "\n"; } print "
当店へのご意見・ご感想などお気軽にお書き込み下さい。\n"; print "


\n"; print "[トップに戻る]\n"; print "[使い方]\n"; print "[ワード検索]\n"; # 過去ログのリンク部を表示 if ($pastkey) { print "[過去ログ]\n"; } print <<"EOM"; [管理用]
EOM print "\n"; print "\n"; print "
おなまえ
Eメール
題  名  
コメント
URL
削除キー\n"; print "(自分の記事を削除時に使用。英数字で8文字以内)
文字色\n"; # クッキーの色情報がない場合 if ($c_color eq "") { $c_color = $color1[0]; } foreach (0 .. $#color1) { if ($c_color eq "$color1[$_]") { print ""; print "\n"; } else { print ""; print "\n"; } } print "
\n"; print "

\n"; # ページ区切り処理 $start = $page + 1; $end = $page + $p_log; # 記事を展開 open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; $i=0; $flag=0; $rf_flag=0; while () { $rf_flag=1; ($no,$reno,$date,$name,$mail,$sub, $comment,$url,$host,$pw,$color,$icon) = split(/<>/); if ($reno eq "") { $i++; } if ($i < $start) { next; } if ($i > $end) { last; } if ($mail) { $name = "$name"; } if ($home_icon && $url) { $url = "HomePage"; } elsif (!$home_icon && $url) { $url = "<HOME>"; } if (!$reno && $flag) { print "\n"; # 返信フォーム &res_form("$res_num"); $flag=1; } if (!$reno) { print "
\n"; $flag=1; } if ($reno && !$res_flag) { print "
\n"; $res_flag=1; } elsif (!$reno && $res_flag) { $res_flag=0; } if (!$reno) { $res_num = $no; print "$sub "; print "投稿者:$name 投稿日:$date "; print "No\.$no"; print "  $url
\n"; print "
$comment
\n"; } else { print "$name > $comment ($date) "; print "No\.$no
\n"; } } close(IN); if ($rf_flag) { print "
\n"; &res_form("$res_num"); } $next_page = $page + $p_log; $back_page = $page - $p_log; print "
\n"; if ($back_page >= 0) { print "\n"; } if ($next_page < $i) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "
\n"; print "\n"; print "記事No\n"; print "削除キー\n"; print "\n"; print "

\n"; # 著作権表示部 (削除改変を禁止) print "$banner2

\n"; print "- PetitBoard -\n"; print "

\n"; print "\n"; exit; } #----------------# # ログ書込処理 # #----------------# sub regist { # POST限定 if ($MethPost && !$post_flag) { &error("不正なアクセスです"); } # 他サイトからのアクセスを排除 if ($base_url) { $ref_url = $ENV{'HTTP_REFERER'}; $ref_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($ref_url !~ /$base_url/i) { &error("不正なアクセスです"); } } # 名前とコメントは必須 if ($in{'name'} eq "") { &error("名前が入力されていません"); } if ($in{'comment'} eq "") { &error("コメントが入力されていません"); } if ($in{'email'} && $in{'email'} !~ /(.*)\@(.*)\.(.*)/) { &error("Eメールの入力内容が正しくありません"); } # 題名の長さ制限 if (length($in{'sub'}) > $sub_len * 2) { &error("題名の長さは全角$sub_len文字までにして下さい"); } # 時間を取得 &get_time; # クッキーを発行 &set_cookie; # ファイルロック if ($lockkey) { &lock; } # ログを開く open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); # 記事NO処理 $top = shift(@lines); ($no,$ip,$time2) = split(/<>/, $top); $no++; # 連続投稿チェック if ($addr eq "$ip" && $wait > $times - $time2) { &error("連続投稿はもうしばらく時間をおいて下さい"); } # 重複チェック $flag=0; foreach (@lines) { ($no2,$reno2,$date2,$name2,$mail2,$sub2,$com2) = split(/<>/); if ($in{'name'} eq "$name2" && $in{'comment'} eq "$com2") { $flag=1; last; } } if ($flag) { &error("重複投稿のため処理を中断しました"); } # 削除キーを暗号化 if ($in{'pwd'} ne "") { $ango = &encrypt($in{'pwd'}); } # URL自動リンク if ($autolink) { &auto_link($in{'comment'}); } # 親記事の場合 if ($in{'reno'} eq "") { $i=0; $stop=0; foreach (@lines) { ($no2,$reno2) = split(/<>/); $i++; if ($i > $max-1 && $reno2 eq "") { $stop=1; } if (!$stop) { push(@new,$_); } elsif ($stop && $pastkey) { push(@data,$_); } } unshift(@new,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>\n"); unshift(@new,"$no<>$addr<>$times<>\n"); # 過去ログ更新 if ($data[0]) { &pastlog; } # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); } # レス記事の場合:トップソートあり elsif ($in{'reno'} && $topsort) { $match=0; @new=(); @tmp=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($in{'reno'} eq "$no2") { $match=1; push(@new,$_); } elsif ($in{'reno'} eq "$reno2") { push(@new,$_); } elsif ($match == 1 && $in{'reno'} ne "$reno2") { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>\n"); push(@tmp,$_); } else { push(@tmp,$_); } } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>\n"); } push(@new,@tmp); # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); } # レス記事の場合:トップソートなし else { $match=0; @new=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($match == 0 && $in{'reno'} eq "$no2") { $match=1; } elsif ($match == 1 && $in{'reno'} ne "$reno2") { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>\n"); } push(@new,$_); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>\n"); } # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); } # ロック解除 if ($lockkey) { &unlock; } # メール処理 if ($mailing == 1 && $in{'email'} ne "$mailto") { &mail_to; } elsif ($mailing == 2) { &mail_to; } } #----------------# # 返信フォーム # #----------------# sub res_form { $res_num = $_[0]; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "名前 \n"; if ($res_forms) { print "返信 \n"; } else { print "返信 \n"; } print "文字色 \n"; print "削除キー \n"; print "

\n"; } #----------------# # デコード処理 # #----------------# sub decode { $post_flag=0; if ($ENV{'REQUEST_METHOD'} eq "POST") { $post_flag=1; if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach (@pairs) { ($name,$value) = split(/=/); if ($name eq "word") { $word = $value; } $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 文字コードをシフトJIS変換 &jcode'convert(*value, "sjis", "", "z"); # タグ処理 if ($tagkey) { $value =~ s/<>/<>/g; } else { $value =~ s//>/g; $value =~ s/\"/"/g; } # 改行等処理 if ($name eq "comment") { $value =~ s/\r\n/
/g; $value =~ s/\r/
/g; $value =~ s/\n/
/g; } else { $value =~ s/\r//g; $value =~ s/\n//g; } # 一括削除用 if ($name eq "del") { push(@DEL,$value); } $in{$name} = $value; } $mode = $in{'mode'}; $page = $in{'page'}; $in{'url'} =~ s/^http\:\/\///; if ($in{'sub'} eq "") { $in{'sub'} = "無題"; } } #----------------------------# # 掲示板の使い方メッセージ # #----------------------------# sub howto { if ($tagkey == 0) { $tag_msg = "投稿内容には、タグは一切使用できません。\n"; } else { $tag_msg = "コメント欄には、タグ使用をすることができます。\n"; } &header; print <<"HTML"; [掲示板にもどる]
掲示板の利用上の注意

  1. この掲示板はクッキー対応です。1度記事を投稿いただくと、おなまえ、Eメール、URL、削除キーの情報は2回目以降は自動入力されます。(ただし利用者のブラウザがクッキー対応の場合)

  2. $tag_msg

  3. 記事を投稿する上での必須入力項目は「おなまえ」「メッセージ」です。Eメール、URL、題名、削除キーは任意です。

  4. 記事には、半角カナは一切使用しないで下さい。文字化けの原因となります。

  5. 記事の投稿時に「削除キー」にパスワード(英数字で8文字以内)を入れておくと、その記事は次回削除キーによって削除することができます。

  6. 記事の保持件数は最大 $max件です。それを超えると古い順に自動削除されます。

  7. 既存の記事に「返信」をすることができます。各記事の上部にある「返信」ボタンを押すと返信用フォームが現れます。

  8. 過去の投稿記事から「キーワード」によって簡易検索ができます。トップメニューの「ワード検索」のリンクをクリックすると検索モードとなります。

  9. 管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は予\告なく削除することがあります。
HTML exit; } #------------------# # ワード検索処理 # #------------------# sub find { &header; print <<"EOM"; [掲示板にもどる]
ワード検索

\n"; # ワード検索の実行と結果表示 if ($in{'word'} ne ""){ # 入力内容を整理 $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); # ファイルを読み込み @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); # 検索終了 $count = @new; print "検索結果:$count件\n"; if ($page eq '') { $page = 0; } $end_data = @new - 1; $page_end = $page + $in{'view'} - 1; if ($page_end >= $end_data) { $page_end = $end_data; } $next_line = $page_end + 1; $back_line = $page - $in{'view'}; if ($back_line >= 0) { print "[前の$in{'view'}件]\n"; } if ($page_end ne "$end_data") { print "[次の$in{'view'}件]\n"; } print "[検索やり直し]\n"; foreach ($page .. $page_end) { ($no,$reno,$date,$name,$email,$sub,$com,$url) = split(/<>/, $new[$_]); if ($email) { $name = "$name"; } if ($url) { $url = "<HOME>"; } if ($reno) { $no = "$renoへのレス"; } # 結果を表示 print "
[$no] $sub"; print " 投稿者:$name 投稿日:$date $url
\n"; print "
$com
\n"; } print "
\n"; } print "\n"; exit; } #---------------------------------# # ブラウザを判断:フォーム幅調整 # #---------------------------------# sub get_agent { # ブラウザ名を取得 $agent = $ENV{'HTTP_USER_AGENT'}; if ($agent =~ /MSIE 3/i) { $nam_wid = 30; $sub_wid = 40; $com_wid = 65; $url_wid = 48; $nam_wid2 = 18; } elsif ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) { $nam_wid = 30; $sub_wid = 40; $com_wid = 60; $url_wid = 70; $nam_wid2 = 18; } else { $nam_wid = 20; $sub_wid = 25; $com_wid = 56; $url_wid = 50; $nam_wid2 = 10; } } #------------------# # クッキーの発行 # #------------------# sub set_cookie { # クッキーは60日間有効 local($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time+60*24*60*60); @month=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $week[$wday],$mday,$month[$mon],$year+1900,$hour,$min,$sec); $cook="name<>$in{'name'}\,email<>$in{'email'}\,url<>$in{'url'}\,pwd<>$in{'pwd'}\,color<>$in{'color'}"; print "Set-Cookie: PetitBoard=$cook; expires=$gmt\n"; } #------------------# # クッキーを取得 # #------------------# sub get_cookie { local($key, $val, @pairs); @pairs = split(/;/, $ENV{'HTTP_COOKIE'}); foreach (@pairs) { ($key,$val) = split(/=/); $key =~ s/\s//g; $tmp{$key} = $val; } @pairs = split(/,/, $tmp{'PetitBoard'}); foreach (@pairs) { ($key,$val) = split(/<>/); $COOK{$key} = $val; } $c_name = $COOK{'name'}; $c_email = $COOK{'email'}; $c_url = $COOK{'url'}; $c_pwd = $COOK{'pwd'}; $c_color = $COOK{'color'}; if ($in{'name'}) { $c_name = $in{'name'}; } if ($in{'email'}) { $c_email = $in{'email'}; } if ($in{'url'}) { $c_url = $in{'url'}; } if ($in{'pwd'}) { $c_pwd = $in{'pwd'}; } if ($in{'color'}) { $c_color = $in{'color'}; } } #--------------# # エラー処理 # #--------------# sub error { if ($lockkey) { &unlock; } &header if (!$head_flag); print "

ERROR !

\n"; print "

$_[0]\n"; print "


\n"; print "\n"; exit; } #--------------# # 管理モード # #--------------# sub admin { if ($in{'pass'} ne "" && $in{'pass'} ne "$pass") { &error("パスワードが違います"); } &header; print "[掲示板に戻る]\n"; print "
\n"; print "管理モード\n"; print "
\n"; if ($in{'pass'} eq "") { print "

パスワードを入力して下さい

\n"; print "
\n"; print "\n"; print "\n"; print ""; print "
\n"; } else { # 削除処理 if ($DEL[0]) { # ロック処理 if ($lockkey) { &lock; } # 削除情報をマッチングし更新 @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { $flag=0; ($no,$reno,$date) = split(/<>/); foreach $del (@DEL) { if ($no eq "$del" || $reno eq "$del") { $flag=1; last; } } if ($flag == 0) { push(@new,$_); } } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } # 管理を表示 if ($page eq "") { $page = 0; } print "

\n"; print "
  • 削除する記事のチェックボックスにチェックを入れ、削除ボタンを押して下さい。\n"; print "
  • 親記事を削除するとレス記事も一括して削除されます。
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; print "\n"; print "

\n"; print ""; print "\n"; # ページ区切り処理 $start = $page + 1; $end = $page + $p_log; open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; $i=0; while () { ($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw) = split(/<>/); if ($reno eq "") { $i++; } if ($i < $start) { next; } if ($i > $end) { last; } if ($mail) { $name="$name"; } ($date,$dmy) = split(/\(/, $date); if ($url) { $url = "<Home>"; } else { $url = '-'; } $com =~ s/
//ig; $com =~ s//>/g; if (length($com) > 40) { $com = substr($com,0,38); $com .= "..."; } if ($reno eq "") { print "
\n"; } # 削除チェックボックス print ""; print ""; print ""; print ""; print "\n"; } close(IN); print "\n"; print "
削除記事NO投稿日タイトル投稿者URLコメントホスト名

$no$date$sub$name$url$com$host

\n"; } $next_page = $page + $p_log; $back_page = $page - $p_log; print "

\n"; if ($back_page >= 0) { print "\n"; } if ($next_page < $i) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "

\n"; print "\n"; exit; } #------------------# # ユーザ記事削除 # #------------------# sub usr_del { # POST限定 if ($MethPost && !$post_flag) { &error("不正なアクセスです"); } if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("記事Noまたは削除キーが入力モレです"); } # ロック処理 if ($lockkey) { &lock; } open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); $top = shift(@lines); $flag=0; foreach (@lines) { ($no,$reno,$dt,$name,$mail,$sub,$com,$url,$host,$pw) = split(/<>/); if ($flag == 0 && $in{'no'} eq "$no") { $PW = $pw; if ($reno eq "") { $flag=2; } else { $flag=1; } } elsif ($flag == 2 && $in{'no'} eq "$reno") { next; } else { push(@new,$_); } } if ($flag == 0) { &error("該当記事が見当たりません"); } if ($PW eq '') { &error("該当記事には削除キーが設定されていません"); } # 削除キーを照合 $match = &decrypt("$in{'pwd'}","$PW"); if ($match ne 'yes') { &error("削除キーが違います"); } # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } #--------------# # 時間を取得 # #--------------# sub get_time { $ENV{'TZ'} = "JST-9"; $times = time; ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times); @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 日時のフォーマット if ($in{'reno'}) { $date = sprintf("%s/%s-%02d:%02d",$mon+1,$mday,$hour,$min); } else { $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $year+1900,$mon+1,$mday,$week[$wday],$hour,$min); } } #----------------# # カウンタ処理 # #----------------# sub counter { # 閲覧時のみカウントアップ if ($mode eq '') { $cntup=1; } else { $cntup=0; } # カウントファイルを読みこみ open(IN,"$cntfile") || &error("Open Error : $cntfile"); eval "flock(IN, 1);"; $data = ; close(IN); # IPチェックとログ破損チェック ($cnt, $ip) = split(/:/, $data); if ($addr eq "$ip" || $cnt eq "") { $cntup=0; } # カウントアップ if ($cntup) { $cnt++; open(OUT,"+< $cntfile") || &error("Write Error : $cntfile"); eval "flock(OUT, 2);"; truncate(OUT, 0); seek(OUT, 0, 0); print OUT "$cnt\:$addr"; close(OUT); } # 桁数調整 while(length($cnt) < $mini_fig) { $cnt = '0' . $cnt; } @cnts = split(//, $cnt); # GIFカウンタ表示 if ($counter == 2) { foreach (0 .. $#cnts) { print "\"$cnts[$_]\""; } } # テキストカウンタ表示 else { print "$cnt
\n"; } } #--------------# # ロック処理 # #--------------# sub lock { # 3分以上古いロックは削除する if (-e $lockfile) { ($mtime) = (stat($lockfile))[9]; if ($mtime < time - 180) { &unlock; } } # symlink関数式ロック if ($lockkey == 1) { local($retry) = 5; while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error('Lock is busy'); } sleep(1); } # mkdir関数式ロック } elsif ($lockkey == 2) { local($retry) = 5; while (!mkdir($lockfile, 0755)) { if (--$retry <= 0) { &error('Lock is busy'); } sleep(1); } } } #--------------# # ロック解除 # #--------------# sub unlock { if ($lockkey == 1) { unlink($lockfile); } elsif ($lockkey == 2) { rmdir($lockfile); } } #--------------# # メール送信 # #--------------# sub mail_to { # メールタイトルを定義 $MailSub = "[$title : $no] $in{'sub'}"; # 記事の改行・タグを復元 $com = $in{'comment'}; $com =~ s/
/\n/g; $com =~ s/<//g; $com =~ s/"/\"/g; # メール本文を定義 $MailBody = <<"EOM"; 投稿日時:$date ホスト名:$host ブラウザ:$ENV{'HTTP_USER_AGENT'} 投稿者名:$in{'name'} Eメール:$in{'email'} URL :$in{'url'} タイトル:$in{'sub'} 投稿記事: $com EOM # JISコード変換 &jcode'convert(*MailSub,'jis'); &jcode'convert(*MailBody,'jis'); # メールアドレスがない場合はダミーメールに置き換え if ($in{'email'} eq "") { $email = 'nomail@xxx.xxx'; } else { $email = $in{'email'}; } if (!open(MAIL,"| $sendmail -t")) { &error("メール送信に失敗しました"); } print MAIL "To: $mailto\n"; print MAIL "From: $email\n"; print MAIL "Subject: $MailSub\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "X-Mailer: $ver\n\n"; print MAIL "--------------------------------------------------------\n"; print MAIL "$MailBody\n"; print MAIL "--------------------------------------------------------\n"; close(MAIL); } #----------------------# # パスワード暗号処理 # #----------------------# sub encrypt { local($inpw) = $_[0]; local(@SALT, $salt, $encrypt); @SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand; $salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))]; $encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt); return $encrypt; } #----------------------# # パスワード照合処理 # #----------------------# sub decrypt { local($inpw, $logpw) = @_; local($salt, $key, $check); $salt = $logpw =~ /^\$1\$(.*)\$/ && $1 || substr($logpw, 0, 2); $check = "no"; if (crypt($inpw, $salt) eq "$logpw" || crypt($inpw, '$1$' . $salt) eq "$logpw") { $check = "yes"; } return $check; } #------------------# # HTMLのヘッダー # #------------------# sub header { $head_flag=1; print "Content-type: text/html\n\n"; print <<"EOM"; $title EOM } #-----------------# # 自動URLリンク # #-----------------# sub auto_link { $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1$2<\/a>/g; } #----------------# # ホスト名取得 # #----------------# sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($get_remotehost) { if ($host eq "" || $host eq "$addr") { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } } if ($host eq "") { $host = $addr; } } #----------------# # 過去ログ生成 # #----------------# sub pastlog { local($past_flag)=0; # 過去NOを開く open(NO,"$nofile") || &error("Open Error : $nofile"); $count = ; close(NO); # 過去ログのファイル名を定義 $pastfile = "$pastdir$count\.dat"; # 過去ログを開く open(IN,"$pastfile") || &error("Open Error : $pastfile"); @past = ; close(IN); # 規定の行数をオーバーすると次ファイルを自動生成 if ($#past > $log_line) { $past_flag=1; # カウントファイル更新 $count++; open(NO,">$nofile") || &error("Write Error : $nofile"); print NO $count; close(NO); $pastfile = "$pastdir$count\.dat"; @past=(); } @temp=(); foreach (@data) { ($pno,$preno,$pdate,$pname,$pmail,$psub,$pcom,$purl,$pho) = split(/<>/); if ($pmail) { $pname = "$pname"; } if ($purl) { $purl = "<HOME>"; } if ($preno) { $pno = "$prenoへのレス"; } # 保存記事をフォーマット push(@temp,"
[$pno] $psub 投稿者:$pname 投稿日:$pdate $purl
$pcom
\n"); } # 過去ログを更新 unshift(@past,@temp); open(OUT,">$pastfile") || &error("Write Error : $pastfile"); print OUT @past; close(OUT); if ($past_flag) { chmod(0666,$pastfile); } } #------------# # 過去ログ # #------------# sub past { open(IN,"$nofile") || &error("Open Error : $nofile"); $pastno = ; close(IN); if (!$in{'pastlog'}) { $in{'pastlog'} = $pastno; } &header; print <<"EOM"; [掲示板に戻る]
過去ログ[$in{'pastlog'}]

\n"; print "
過去ログ:\n
\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "ワード検索:\n"; print "条件:\n"; print "表\示:\n
\n"; # 表示ログを定義 $in{'pastlog'} =~ s/\D//g; $file = "$pastdir$in{'pastlog'}\.dat"; # ワード検索処理 if ($in{'word'} ne "") { $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); @new=(); open(IN,"$file") || &error("Open Error : $file"); while () { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); $count = @new; print "検索結果:$count件\n"; if ($page eq '') { $page = 0; } $end_data = @new - 1; $page_end = $page + $in{'view'} - 1; if ($page_end >= $end_data) { $page_end = $end_data; } $next_line = $page_end + 1; $back_line = $page - $in{'view'}; if ($back_line >= 0) { print "[前の$in{'view'}件]\n"; } if ($page_end ne "$end_data") { print "[次の$in{'view'}件]\n"; } print "[検索やり直し]\n"; # 表示開始 foreach ($page .. $page_end) { print $new[$_]; } print "


\n"; print "\n"; exit; } # ページ区切り処理 $start = $page + 1; $end = $page + $p_log; $i=0; open(IN,"$file") || &error("Open Error : $file"); while () { $flag=0; if ($_ =~ /^\\[\d+\]/) { $flag=1; $i++; } if ($i < $start) { next; } if ($i > $end) { last; } if ($flag) { print $_; } else { $_ =~ s/
//ig; print "
$_
\n"; } } close(IN); print "
\n"; $next_page = $page + $p_log; $back_page = $page - $p_log; print "\n"; if ($back_page >= 0) { print "\n"; } if ($next_page < $i) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; exit; } #------------------# # チェックモード # #------------------# sub check { &header; print "

Check Mode

\n"; print "
    \n"; # ログパス if (-e $logfile) { print "
  • ログファイルのパス:OK\n"; } else { print "
  • ログファイルのパス:NG → $logfile\n"; } # ログパーミッション if (-r $logfile && -w $logfile) { print "
  • ログファイルのパーミッション:OK\n"; } else { print "
  • ログファイルのパーミッション:NG\n"; } # カウンタログ print "
  • カウンタ:"; if ($counter) { print "設定あり\n"; if (-e $cntfile) { print "
  • カウンタログファイルのパス:OK\n"; } else { print "
  • カウンタログファイルのパス:NG → $cntfile\n"; } } else { print "設定なし\n"; } # ロックディレクトリ print "
  • ロック形式:"; if ($lockkey == 0) { print "ロック設定なし\n"; } else { if ($lockkey == 1) { print "symlink\n"; } else { print "mkdir\n"; } $lockfile =~ s/(.*)[\\\/].*$/$lockdir = $1/e; print "
  • ロックディレクトリ:$lockdir\n"; if (-d $lockdir) { print "
  • ロックディレクトリのパス:OK\n"; } else { print "
  • ロックディレクトリのパス:NG → $lockdir\n"; } if (-r $lockdir && -w $lockdir && -x $lockdir) { print "
  • ロックディレクトリのパーミッション:OK\n"; } else { print "
  • ロックディレクトリのパーミッション:NG → $lockdir\n"; } } # 過去ログ print "
  • 過去ログ:"; if ($pastkey == 0) { print "設定なし\n"; } else { print "設定あり\n"; # NOファイル if (-e $nofile) { print "
  • NOファイルパス:OK\n"; } else { print "
  • NOファイルのパス:NG → $nofile\n"; } if (-r $nofile && -w $nofile) { print "
  • NOファイルパーミッション:OK\n"; } else { print "
  • NOファイルパーミッション:NG → $nofile\n"; } # ディレクトリ if (-d $pastdir) { print "
  • 過去ログディレクトリパス:OK\n"; } else { print "
  • 過去ログディレクトリパーミッション:NG → $pastdir\n"; } if (-r $pastdir && -w $pastdir && -x $pastdir) { print "
  • 過去ログディレクトリパーミッション:OK\n"; } else { print "
  • 過去ログディレクトリパーミッション:NG → $pastdir\n"; } } print "
\n\n"; exit; } d轣◯ZホロBタUヘ4啻}慥ュ否Xュヘネムヘ。ムツ;qケIEタ|洶,T3xz縒帥sニ?拜シ3ァ {u滯麒R+ヘセンv1モヲ球+マK3ェネイ艝!Unセf賽獵マ|H帋マロウ] /舉後Qコ3L 0^" ;゚淞ケ,Y敞yGモニヲーHィワgヤ笋Tヤ斂Kィファア8 メクメ/A」フm.#' ~エ」C舛s嘗@Yェoヨ"$-宵ク]W[,@シ鱈c(クャ[m@ユq滔」K}ニ3ノrMgXァヤ尖zシ管|スG3住wOァL。エレwゥ鰆MQm"*蜍」8p礁ュノォjヘヒKヌ?ナ$zニェ[h鶴8ネフ}h績>f$℃槨|メ"棚GOl>j鰊5el渺コィ8ュOッEテR ]*ア刎b-c◯エn枸nシイ」:敝ュ\ェレ嫐fヨッ5XマVァワ?ュノ\サ95bgaセE耄ヌ@O・sコ鶻(4ケbイモl",ロT(f >ンォ|@ユ」ハカ嬪Oウャマヘzc饐eヲ慯ルイ3'フ警R モ茂dカ拘ヒレ戝K剌YZャ啝Kq9ニリォ尽マゥヒo沫M%R[F耄 艨゚器ウ&kエホ#ロヒ}ミH鉉NユメX=yナpマ*G'9夛yヨ。gュタZKi「YノNTヌjミラm=OFキオXト4メ^T?ナ5ュsnュ+ィ.科==3Q]voイクカ'jキ瀬ッ9?Lム}Inレ%ュEp゙^搜ヒ混cp=ォ・カモdH」7V Dロ8ネゥ%ム0樢6f\ャq6脛。。チk0カ若mv*カ貅部3d`qヤ4、曝メf l~-キサツyV靨 cF#臭―臓Zス説o遥鍠J}Z xア鮗P蕨H$f*ク恍xナyャメE#ワXィ悖#0;マス\岾゙LUA典ユyvニ侯9甬d南*ロロNゥ寡畆ゾ+餮ヘ,0ャグ戮B=ェチjホ{/P喧{オ_S 饐<<-y、H6M >ap1DlソNkロ%コMャ7r娚クキエI>ム&^`ルチ遖ワッ8ヨu;MVWエ錆エ[{H吁痔c枢マ'違クゥ]黄ッ,ナュ$柬ニ7ニu笘ab8ヘ1招\ヘ[シo1ノuV5t干3;"坤 bキJv昿8詈B1卜L38ョD黍ルヨyWk$恢0ュ3ィワEюョム=(フィァ]」9獪「Ta讐堪ハ オラYワ oソラK濔,轜ネノ珥:ョQGクョマタニ"ク歳7?Pタ`淅忤リ゚妊hホA U$tォ陪ラフ フムヌエ+ォpqニ?Wg罍.」kHタ Es6mgョhzイv-ウ 5Tavキ_z|眠没 メ;徠「^ト梏5フ償フ{XFナハ oチ H*pOヨウ「ヤム゙TDニF 7袒カt[;ュN窖[ ighホリ瘡サGa]w?gwSオYu剽H/ノm並'イゥ ラ=|U>オd廉リィナス週1坂p%b朮6イb!U!ヤ1 \逧鍖「媚ムュ Lアnァ ケラミz<セW硴MZキ÷2fvY舟ロ8タァjタユ>3|<エDk=關呈 =ー蔟ホケッ崢bSッR・JP杢贅格_s貉ニ莎Hアェ顕キ・>レメ;吃メ6掬ネ><邇 lキWモu}KSヤ4+,tケ・A2 7d@ヒpャ!リフ` p<「}=モ=~オ4蒟レア祈麹オ嵒 $・%詛PyOヨ<メワI#,鹸1nクQ餽ンwd0LcミォJ妲J・ィ岾J}2ロkネ夕UFvコ゚ァZ蒐鰻FE e!zニョニV;謡ェFIマNxホサ9ソb%マ0 ・RKフcク8Zニスjt#マQルョ8xcf,坤,ヌメ偐ニTヌ蛯0ト#Wセノ;H]9 カユu戡テノアモ??[Gケメオヒヘ2Pイ\ロJムキ諒8=ォ 浪ナキOT7Y→#Q朸ロ_*7ヌwッ」オ +Zコユカ揚ァ鵺fn[F#ヒチi=8ッ楫;i獪ョg壥hチケxk餔サ?タ8゙BK6闢ノ\厠蕭4鵞ル撥hク*サ慶讎サ'ヲスaリGsゥ6ナKマpp」\,ソ$ ヘヌ=z メユ<;穉^ハセ モッャ「n、聡q迩5Hゥ(6ョb;孑薊鰍@メ(>Zヘ丞ヤヨウンM:Dイケ.v燧ユンEHXエ+'H箒BeC!.\}耋h:aノ# ~a<ユ{5Xミネテォa舩2 エ求マ\v41 hメ?哭築(SK;ナ#タUQ蕗ロsノヲャナn、N}鑞アm犯?ォ$Jモy飾=yW、8<ナ!テ}@ャ{テ*M苫'オK】 ヲ礙゙}=Niコ>講ゥ、ラFォ<ノ#カミオトユ nMFラ1レスエr0∴,OLメwカ鶉"難yタtリ T11a鮟ー&ェヨ。aI 蚌遑<>鮒孳ュU体.e致チレ`升ィsqzサL@。.瘴)(ムネ ヤ甜:・カヨラ ロヲC衒0GjヌTPェホI-マ覆wE'tM(章ロ ワクメメ辰1f蒄YY8タ相h壁ヘクJリv>。[#'嚏2Nユ\施uォcヒ鉅+oGJnP\ネァ$廓 ェテ椽e鮫~j( L朔σ哥レT ヨルイムdUュマ=ヲア?ヘXミレハ3eォ駢9モ[p?.Qリ蹙ャテmヌオ4A雎ゥtVkU没ォ8?q泛lユPнツ0;シ ?・B襴-:n@ンカ食I|1餬レ,ャハァミhCc, 3姙オ?マ漿坑th#?゙'kT[ミ哂lァゥoz,Uル崩EレDxm=ヒ耐ゥュ゚イヌラa4)&? ,#嘲07委ヲqBij2ィ&コ8_ハ杯)Xi悒飄#g0s ̄6'恍!0= +イノチN8ハg」.r馴r佗ノ艘gス オス厩縣Oカ+ォdハ5トxK培フ輓樓" ヨ]ャモッQjWヘ%コDムOエ G薩yョ氾駄郡E「ア濮メ+ JモXヌネ"9ワ、zj゙ク5 '訛栞ョコ]6;1ハサミAェュ硴6<'xミ」b^ァ戡 S2]y@vN1Z ァZ>ン嚏 g」#ュu=9モゥ?ン$T `~Iョ~ェチsaネッm゚ロqSN:e鯢綿゚ハ+アヤ~=ョ影ゥテゥo顔袍ム爍邇シ5'.ラ]フMワdSNャ*+チ゚ァワア傅v「ヘ =ーユvv敵0エロ,mケ\ツ2ァラ8ュ}ニVヌdナ7ネラmヤ ウcルュ.-ッ5ンFヨKkニン 2イcpャW釈{7唐ワ6ラa壤]u袙カラ31閧鉚r賺トYスユ《エx/$ヨLェノ渇Tдl{麭hレT刑。拗恍$マヲ&ァ 4゚コ?VYァロ漿Iォuァ?゙ア+サ渠邇砧ソ :ヤ瀛DQハヘj~ェテWBN範.S錢ュmcテ+・レYン_<[゙ヌゼBェzゥ>」ο'R)、゙ャ9NB>Ql゚ItDケ-テdS]BXYソスN!錵8i<+7カ亂クケN*Oj'RH・{=キォ冬「aw∋歪a∨ヨク雍崛>"&P鶫YA5I「∂ムe o3キ'ゲ9Y\-ワ+ヒケPコ繍ウー4R@*シララヲメ゙Gk}ツVYU`EFニS梦・&・3^}SZク!ヲウイF部テコミFワvヘw゙6U。キキ屡8フ.Q吾鴈G纎トシ5醇t」?仮rカウ*sR゙,ALラ.ァ1xnkハZ#ー咨+テナc% S 刷ュ+劼へ酣嚥ナ匚qRZ"G徠ミwュヒ=ueмウIウgレタ:扮tk鱒ヒ「I\r賑=+ョaハフエ1ノ%ナ齔0テ謾L0rjリ フフアiタヌハ僧tf ャ<_6ミg波ナ>`pc|9稾O]jヘ。ルゥ H$: 釟スマチュ]+G+ &YァuUI$ホz:u#テ0O=鵡ァ0<脊湮ス金ァGエkTfMア、艘ラ奥Q鮗ウW麺Wサ4ァフ擣R聨{ツヨ仏j($嗽xVC菜R28靱簟\]゙Kwuゥ\エ旅,e殆8ワz懊> 2マ。4ヌ &M2ヨ?エlrュフ鯀偲 ^ッョヌァh゚ 5モフiァAヲLa*ロ\,植9ッ/1ナb5徹ヒオ!6|・矚 jーミhfxD乖'o?)$s゚ッ・>=oテh06ォョルッルュnJ{9Sヤラ゚リ岐マルツニmOナモjク旻ムチP?-銜ョw罩Yオ4[炯ンTnvc アリzrォ゚ェ}セjトヌン\ナ_ロナ埔0ノa アIワすp#>ユ┻\エGニ2Fxi霧ioe:@7aAX逸Q睾]rOS$[ス匁ORナタ際フf;リ藐在]ヌテッリホテXめQ墹Rイu0\p[セ7モァkイキ檄eカイY逑З筏ォwRユ5=^(メ5H矍9ヒタ^~i欝(7Z]>鬮ウ鈿vトテュ]F鹹兩鞜ナ譴オgイ吁ノ#Fア9ロ:`~ヲスト7ツア=ワレ質g マ$鴎ォノク懃`$~補wリカ」y変ロ-PシqKー枠ヌl箙ツcc鎧Eヲサォ}ツ能Yヘロ[Kuエ[ニホヌゥォ杲綿茂36壜ク*ネ刳*哀岔Co=ロg~P$、+ーK{炭ワ猛燗#s;♀オas`キ6ェ-iサ鞠 &=T色{罸e/5箸"ワ8<瑙ヌ饐シュヨカラ{」iカ'-ワラ台w トクャォV(゙rー(キアメLwエクu]>邊w偃Yーネ>?利]掴ニBトワqク遮鴆7ヅ」q祟Dh佝N:ァ>i?<ア| [エャ燭Gミgラ僂^0QP桧;( 膰セヌ洲 ホサ}状」ナ "6サQカH蜃Np*ヘシ「4a 「榔N-z=鴒ノ2ホナ葎銓ッb詭s崗オユRミフヲワF†ア礦1YウセFケ'ュFレmェラYxオ-歪径c*;phソa[ケ*yEAi?ンe#5^X諸ヲK伯方羞A貊X\9b n権t メクノdInロアWnWッィk'1ーイ)ォ^ホ鎭佞蕨d0ィオ D輩ムHL| ~4ニ匸チハ住5ワ BハソコQ傭8ナY2Rサ~y4tム0ウ#%チタ9*=Mg^ メヌ 汗ウ蜒 ニユィ.$2aq践 喫ル[ネニ-8ャヨH|鵬トoA[2トEスシhロゐ]リヌ9マャサ9赭ナ智クミト軽、F #RV-ッョ-」佝iニラvゥ・キヨX剳Rタ)劣ZKl殀仔評キチ]スア゚唹]hセ6ウレH#)@9#>」メゥカP攤(xツ屐(wRュウJネ性ネpェ」$檗)閾「!t9Ufモ%{u?IiヲI1サ/s ワォF@*s:+蘭)m乕ァF細ェーチ&僵k欸": p萼q鯊ケヌjb モ#6」9ァ.悳嗔9'検ニ#ロー>」シ ロm「゙ GD斧u:ミpム:」キキo0マIQdミ▽ユ,qqァ鰌鍄ェLU¢峻Bア<ョ;ミ-。=Cカヨ・C。・r-d'盲Dz漲(キ,6獅峽v4Oメ庸yu8L鈑恣メ$佳#殍Qヌンチヤлスメ d7 O顱 (ク~((・Fミエァiケヘ3惧yk4サSnxヘ&ユニh!?lv、逗uM3ミ0暝~)フJ魂TmBG~(f鉋7絨 W慧侍9。I<ー&"%マN豬エヘ. シキソセ$q膚&f「次恒 n_ヒ'保「ェ苟ョォツ嘲O-ワV5'/ーsヌA\X齦6ヤャ漸W5Hhレ-・アメノp啻 マア9ネXgrPI8ホq^ヲ゚カュェKqa「撰バ^淡タ持荒セ4シユdユ」サカオ¢w)【u=2rsメショRァ?c%=]蟇ンw鱶京コTZl:弗、ワi鶴L8H杙vnO瘧rィホ;zT|cI#yクー芻銜貎ェアN沁h」ェ糧2タaメN泪ロ梠レD7cン孜ォ 5I゚_=變O副x?ヲ:s]>ッァs。:2ツレヨ"ヨ ョ=y脩ヨ_bC粱wホYbs寂シ叶。<%IF 4榴onヒWRG3ォル鯱ャ゚テki)ンrト莞侫ー難ルトソ祁ウB」Pシ>イア}ML"ホユ妄A゚ッ^垓゚C6耐Zx2モPスヨレ)メカミ}]?4m7ト4Kノ゙呼mク瀰e=ワネ箒Pカゥ d?ロw!ツngwNクfサモエュ.ムヲオヨsォ"曲#Pァ脩W娵ッエェ・tnォ~]>リエャ(淞ニ「k)チ ク ユ)|+~ ル$>、Wエ[>;Gmュマ凪 m%E傅ゥ<ヲs溪 Mh吠。)イbulnロョ8リホ~ハ「蝓g>「p齒+ムエ リ5ォサ燕ェフ! ツHマ躾ソ`啅裨めOケソ愾Iタ9リケ8豕エKシユュ!携|」83日fャMッHセv,県 、).4-Iョ」1`xWwエ9ニiJ蓊♪ッ]ニメ/孟冦、奪bB:醺レ,.セヘ1免H、゙ q?>kサレ」99=ノ*z諷+蚶X゙G3fメ`:)ュ 俥GvI[*FB+ミル q8B 際OミP「針y噤%芙ナ{]ァぇテ [Cv鵬B$ク達9'1+仂尺゙&y・zO4スhカレヘオ撩*サ<ム旙Aツ取シ慥n2・vン}溶サケ癬トejソレコキムう(,J9ヌ届} +エwセレq'藐槎゚m-;K)9チE"鉤゚*胚ッG@%括]。pWモ1ッ#0悸 j\レ=莚}カF滝|"Hタヌ$UァヤYY蛻+d*シ`p?A]ユキ-躅カカキrfU^タヲンwマi}n吭ネャ?R+龕」~[麁ッc2ニ鴻彡オjZfセ)7B寇Nテハイ9エ.EオぷI wv」蛹ナテ7ォmケ輻h゙サモ|;痂+P嘴トmV ヲメタCミ;rN4$x{鑷魄進.ニ澡タキfmホGラ$x5鋏鍬]m!ッ/攅~ッァ冥%ハエ:ッジ゙"ユシ9qゥ橸マ{ゥノキQHヌ` ホ:ッ*列Vアィy」 %シ家RVc懷顔楚裘抗ラヂ ケコ#イキロEリセ6ニソ? 奠gOムッO33ネyv'$オ亡B8垠+クレ/Dコk゚*Hキィ夲ナレスホ。笵eWpテ p9蔟$欒j譎yィ稀=wャヘ/[-ケンホBd ナs女8ェ段窯資アヌfョ猾/uモュ黴 #篭鉦~ ラ循ア」。ヘ$ュ痢Kヌ゙gmゥ\髻 >\゙$ヌs!cAフウーツ匠?E5゙砥ヷ%ンホ覈$',rI郢5サoト>勹Eャル>Cヤ4ッmo&劭Y;セモサネヌ゙ワ}?ZM*ン'チ7j禳ノs<収授 3ムr0タ箴g矍攸シ04j6E+・iト長=>遍#ケョ>,ヨuクlレhm問ー*n売fー9ナ|ホ>杷屮v-]nオンロキョ豎ミ5d3iw/拒UリサUタモo?驪WゥYX46*コ鬚uヌレmP<`gゥレ癈]・KN。熄]ャRc_カ<ミ3c。$亡智饋エウ8メ注x8セfゥ゚Tマ表j ゙Tィう`'ェ騨晏ク%ウヘz・>掟m.Tテq」A8ラZ{#3Ak'キ箆z*JIIj護マ3,e\5ュcタ Nミy-・>t,:総ネリ 楕奐_xfマY%・シ嗟j巌l&ユ蓍タj/圏ーxァヌ/f・オメミロチ頗ケツタk志襄ィRヨm汢i{キfオ癪ッリ-R綏 }「b0bヘラn@缺ワfシ窈テWn淑ゥ^jカ届<キD*AレI*Iヒ9瀋"ス\モ5xOJミァヤsサpモ蛉ン播$ニOJ瓱゚O ]JキhUノ\ャ7キqラ揆ィ霑~ェ軽・ァWォ裡rラdy虚キコ;勁2g?7ラ'┓\イヌyp!ミTx4!'送ア ソ綽ム而#.s* Tク竣アラュテ猖サ\8K ハ巓;リ a6A「盪3^ト>N付Ce劵マキ&キGオrイロ?エィ|7ィ}阪陵M`ル飆w 麭アネa9頭0oオnL蒲。?サp$N{i障kホモタェユカ昆ュコ#[d$ ャ@Dwシr$l鰌ァ洽ツ39ヌヒメウntオfンシテHAnナ」#vH<垳ャ<鋳}ワCPYルNォケ+0A3[HG゚Q戎る酋1@。肘bXマ*シ犲曇Jメスイ廃r6墹3Im#オ0F~・ハ'=1QAァ\ティロト」&P8ネ オトnユ[Iヲソo$Yニ3慥&Nレ柩カ=タH@」サ邇+f絖ユ<%ュG ワEゥロハ FOL月+゙ソレ]ス民u!7礼oエ 佝チマ_シ?整N酊Qメヘュ\6「ヘトdgル\`・MU娥9+゙カ・e=ワッyi(8サ >档ヤTzヅ靖nッ>ヘ5ーc腥Hネ鉅:アUUリWn{>オ?Lw牲モルヨメワ鋪徙~鉉BM癖貎遑hサ∇xJO カ聆ヤ。zez髪チzミBd痙較ー 6 ヤ{チn棣揣ホ到#oソ|R|ルカァqNN(閃g@ ヒ葬N>煤H`ル99・qヌSネノ#・92Wヤ{ミ ヲpx&煎ハ嘗h\墾q車99ノaマソ4・倥筑因_NN[)シ゚('v、 沢ケ! チU鰕」ョ}? aPク8'゙愿 菻ト諸:R苒ソ) 胄、ヌー鱇ュ.2リBs鎔・ヒ!チQ彭慴1蒡ヤヨ|リタ9ス;ョ 'i[jィ$:梍ワ`シ弃@ヌ;Pps゚ヨFモノヌqミムムホo、エーュウqi?ルu?ァ4゚xカ?C吼ロシユヤIp.-?pR99<握8|cャxunャt椀&買メ乳紋芸ンGqYzF孀<ウ哇 /,剤灌モオyオ0ウトV~ムZ ・/サキ價VZuス_Uユt 5ユケsdL.薊ysミ豎ネ>+ユ^I 、6ミNp3U<7篆'テz膃ュZネーd舒 ニ"GFQヤ}Gソhュu/ュ[RソEaモサトX`-ナFアO6J;ル+~溟縅霆&@.児+o{Qイユ温ヤ-7マfpzJタ@G_j曠マキ>オN絆オケ`トョNrq゙サメURMレホ搴゚ア7ェxU4>Lシレ ャヨl゙a損rOzラuケE 莵oj餌GKu 9筴メ、希jユ岔ノ穐」%メ+]{7繭#2o過 ャュュ・「Aニ鞨'wセ$eUキVフ[4? 齟ロD肪茜8マj罸m1ミI ャ#wO民^Rミ。W?スキo)Kモ;WU・#2p2:Uツマエ」w^9ッIPァ~バbzワノ^ヲoAシ2嚢トVヒ>、懽VM9Vq5eモLコイース鵺#ロト・フqョ譏肢; 樂ァhムエ]oケヤュワ~5ニォ;ェヒエ克NHxxケxfzニ<メuミMオ幢ア<楫鴎^j^1ラオ5ロロonァ+ zS黠0)Z}_テコト:キ]6・'スエ結、ZF|ュ壊NO$袤靡ョサトウKヒ7ョ ニヨ}ャ゚zWnリ歛レシナ゙'淨Q--缺1l7 .メ ホO躊jWオリ辰 =ヌzネユt冢チXnOア4ミXュqョ@!礪#チj9ElHナシ焉ユHB_ ゚ r」z トVM+イ4音ミナ沐ワ(jTH黔O"VWラW='S>モ>rチZ|ィ.ホ琿4s?嚶オォ~h貳q畋:@ 'モYオgQ-ケ4Y轜レ椌/外Y喩撻ハ~k(,Ep鬪G"ケ6'フナ"麪漱f聟p「タw)g碼粧 qヤスli"ニメt0ノlW QタW丿ォ\f@>ヤォゥトxx$。竡QY>キ_xキVヤ,墮禀eク`ャータャ6冱cv-諾W&ゥ腥ス"ョC%タヤケK諚ェh^ih゙ITニヌy%G|゚゙シ耶タレシNGリ>瓷ョ掃A眄ミムタロ i-オ咄=ヤsサ1>Jヨ+uケ 0ォ胡ーフ7/ :功。 ワ i蝌慈ォ ~2@ツ厚メィ==9、Gr (}チJヌ、移ウノ=)ル9餡淨竇E qホr@@NHiV%AホX)ハ`66哲,ァ=X「#;戮dcー荳;OュO 迯ケ飩チA蚋楙k湯9aーxsOeVSチ;y'<モ\`@,Nx顱`薩ワ畷椛@キ'飼ナネbOワマ%ヨ濤Hンア"+1Q\W啄ク篠~pLカIャロム[9ヘ"``1チヘ1nOjl`rマ」il}v:ムェ^$m櫂 1,nン枳$Jハ蔘LG,>、]皇6/eェDセ詠?U・0xv@モKvホWヘキYセk-O叺ナ(棍ヤ廉rメt陰Dリネ鑛Gャワソヲノ%EW ヘ&0ス9髴モ奏v燧E{、ヒG。涜コ故d0Lテ臣ク拷UVイyヘ5痰゙fÅヨウ` .8ウェュホ孺n歹t橲餡テwqf)蘓ソvB?足$ヨ"マ掠ン盛鑚Hv?燔ホS8g迥`際?>オヤァ寓端}:磴)ヌナョqq殫ァzY。マ蜉,+>韆!ヤn: ]ク暸願カ熹6、Iホr!h息h隴トゼ ァJv Nh光レ堵\sヤWF酔餮ラ;タ丿ュキ、9iオ弓彗9)X5テッ=Lb1Hヌモヘ・h/ォ^=ァウ`箒テz["6曵村bス皿(蚌タルIマ5リM\-カキ」\O1ヤ珎Tア}雑<)Kィノ?A,9c=;モ$ノ8P}、oソ禳sヌ@ オVテZフtサムキゥ?1@ケ聢釐カメ3{W?ゥi7WN^+}ワvョヘエ崙67J90キUgエ6"T22、f鴻掖g某iw6蠹、ィ^+.Xワ植。ッ]5A`Gヨゥ^YC.諄」bx9嘶ツア萸、uPコ0ネッEサヘ、タ任 sY72`:ネニ)ン卍Moエ,jェメ21チ1<ヨl問レ蜊コ瓷\ラ改#ゥh$レ骨カ!レョFA>彝コs^a4フチJ尼答告ッュ1イ:モ9彡ョ))マZ祥f\膠ヒミ3」]ケセサコF$q*ヨカe A癇嵳Y0ァヘm9キヨ・!頑1マァ5閹-伉$ンミ。コル、JMワIvニ[=yホ=ィeヌNエユヒ)レタH、Ы \。凰レJS坊^槨$sモ?Zpロクp3ヨ偕:ロチヤァト早9ニソuユア湘=ゥ姨三^ツヮYr@燧ミ胞osマョzB凜*!z謫」wヒリョ2) ィlV~ ノミ翦ャ> ン厮ツAe\ノナ クnワ}z夐ナ柬ボ」idアヲ6ォ。\o<<#bzレワq@Z^_yマゥ゚サ9飃2~O8シWC"x^G95KFq1「餒゚鞐$カ#ィY」d4・ロU<像 モ9u8l+・Эyvスカァ、L:逼_ jーニイオ朔H>ケY~丶 v テ`ヨッOヺレキE變G杙3ゞ$ H<ワ。・2霪0;G 58ヌS待棯A#岱ァPH9テ5W'ィ4Sホ吩メ頻湮bP縲88、vPsヤ4イ ゾ錢。2ヌraレ妥;チ<|、7s%ネp)$$Gヌ、rノ瑰ナlホrOA@杲 ワA@PWレsラ4Kロ科?w)藐ヒツ彡カiヤ 敝椰1KLφ9'噸ヲi゚衄3モャGオ4鳶゙スウQ姪制{s哭;ノ麪{ミ=$ロ8、ノ漆6ヤc9%zwヲ尽クーazSV*[ァOツ堽烱蕘モ c険O漣ゥ]w( 飃BPpァv飄ハタ|トヌL@Qキ zPォクu;モ」,q漆8」+ミp;b鼻#h幎F7 、s@<)0サsケ@ホヘ(Ns=i、ィ縊瘧:0 薑餡lga遑&憮w ン:斯モ]渋ヌs@ノホx$礁圍K#8」'x替」8ニ}タゼXB*"狭袍エ?而8ホE0ウb求]ス@#ュP98ィX播(、45\」跚ァJ博タ<ムE06Sヵ洒#8艫毟(Cハヲ}@ヲーチq朧蹙ウ鰄/luOTWョ「)ワv栩桎エ滑$eタレOJ(L 祝乞55エモ@フIタ(トb)tレ5".ウn&・9 !#ワUクシeェノ?eクタァッ^个竃oゥ/y\エン+KユU蹶ウV~I巷#S> ムシx「'r?<ムEZ8%C態|;koh、キ・p}フヘナv@O糀E3:roq2sノ1レP QEK:I|・ヌ塔ニONi iobHタノ「:界Pyヤ("c>欖E!槍 、苒2y*\ )ヌ }h「 C悄qM2敦) 0 タ掃ヒφ「jカISネモリ薜<怺(。l vrzS ゥタノQ@!。GQ閃,Aネ=h「ムリd瓰EFョニD章ヨ(.~Yァ4d 8チニ(「廃ァ棘ィ%U]ワh「雨FxヲコハA・ /ノ!Aメsエ6;ムEDノV$aPエF;ムE# FOpリヲォカヒ7QE0閊L6Vvヌn- tレd@X釵ー゙ュ瑙HMァワ7丹mロ柏リ_:[トニtメ{=Oミ2i罔koG剛f描スタ徭]8_>逃f(エナvXム曦UE,ヌZ蔬 zモニr\ン-゚$カ-hト昨ネXケホァユH7町。綟チfーシ{笵xN[ソ ・コ8Y、<"rLラD!ホヤbョト、筺吝゚エソトFtk忽セ「ワ:rmA3tル5ャH、ツUc^邀銛ュMwRケラスOP憔r勗纈OeUz マモo/aエウカ爺麒QナヒHヌ迥hメ(ル質磔ぉ頼`メl゙Xduナタ] @ネニマj鑪ァYZ[レ-亟E酌[o岱戈ホj猟テ/ [鳰#\K{pェyQ棗Wョムイ1エ3ホkニヌTu・n扱7x枡9-;[ kフケメf冽_Fク 撮ク+ッヤエkヘ&kォ"禀v ワ0IナmヘJィッ 2ーネ#ミ癌C=Jホ&督様趨フ嘴カ虜刻ンマ。肓\コo未訐胎 ハッ*o憤スゥkチレZ.恋兇Lメ0゙a替ェk料jmオ甘嫺b午゙ n8 V゚|Qァ]リュ片%蟆ノB84カV北,ォ」ェン^ヲZ[ァ¢冽d< Ta:kルノ~ヲ槲jャ鷏Mスmロ^ァCy"ルiマ:ーE2A峡x酘ソf樸lヲ.yク疱nニヤ マオモp%堊4ェ、(ノヌ冴_ [リh7Wヘエb鹵L杼jソ腔Zr-・荒ミツQ府ルwG1+<;u02AP 骼C.;ヨニ九h.瞠f6ンキボ亜z継GjjメE;鰊5ン;,#蘭4'藹\ニ3徼ェ~'セu磊?>nθヌホウfW7ヌN6キZ遘'J|ミ#ミッ6(ETヨ」ロウ=ッIー禿メ募>マazアテ#ヘ(P aTアwヘztz似qヲワンヌーヌフチFョuク*SMンh悖襤.垤酔bu`^-ワu#曾ソ刷7ェ゙゙劼サ冊ツ&C]e慓湃"ル%cィ*eラ<壁o。ョS礙/ll&=:ヨ]キメl/"/ェ楫フN.ラサgEiTKァ吼コソわ」イコエ`疫h'スエo缺)u 椹mタc貍bec.サ]xe=姿G潴リ・キgャヲ紗Eヲリ0ス産Stヲ=チ$xヌク赭!モgモオIRVaクbムLD捲zヘ{労イVrVf核\テエコクイケK喫肄]ッl「|`激ュ+託e碆嫋=?住`凧Z*Qx4yミゥ*nネッNEヤlGBムニD茂宅>ヨB%Cm#ッ屈5=gテ7ろ@ヤョl&マア柄゙Sチォレ<3E゚惟゚ナ%カゥ狷r~  W2韶tGmムF"~dur?R224mラ貼謇K瞶カ-゙+vワ! ヲ~a]メ5テi&モbアク鸛j.L1p}Lゥ!カ披U ゚ 拡5献>渫コ-K%」墮T?CIィpL6・ソ゚ヌョiaヲ槐X3箔テコ~ yスKoヲYB゙]キヲ uWR4;聊;AヌRJ殻#mヘ・ヲZRF@H、ーオ^ムエ、オミマKx斧顕ヌaT &m-懣假?^j罪蔭%ァゥ'ネ軻カ罌ラ9ィVヘV閤ィハ8>#_x日W]ァ?&U3<イ;Xマレf <ロ予アΧg鯒Yヤ.-4{?エ輪咯ー囘歛ヨッニ゚#Ge-ヲ熟G l◆キシモQササヤ壺鵺ォノ覈3#゚噸ッR曦碌W侮譛ワ゚sモエ鬥誑滬フャyUヘWзァトZッ疫{ッ_ヒ}pネъ 痾+Nヌチ~'ヨ%%胛e G_ヨサ 官ワ5ロXDGヘ荊#キ蘊q、゚゙b饕*5o]$サ呑゙・戟¢榲ケ}'「~ホ喀%_Wユ..O$c'+ム~ム0m4xP1覩<テR?#港ラレ涙|「xwZヨ]F律ン\8"3W・w澹葦だュ<6ニr゙スZセ氣漾色 險ネT変<]iキ。ャp」メァ富s燉ツ胆匏 練輕9kメ4ス.ヌJλモャ犒埴ア \ユワム夂jVmwk-ケW?ュ鼡n劇ョtヘl]9СヌミW}「21補KpX'゚嬉3,b仇z#ァ゙(ンj3:0vyQ@x. 譱S圖コ┳ソ/z漢> 追ォキ哦`アE`ケO聚ォ閑,1l_敖]チー9゙シ5血乕桷gルッ<;祠iハ0徐」s+_チ~エ~д{2レ、Maキhsサo麑夢サ孟G#Wa黷ヒィ・m^サeZ2z゚C障゚(オD?リッュ$。S諾ャ_'k:dコVァuau$Rヘm/FpGZkニォ)部7リ>゚迥衆ッ>Mキゥロ漬r袋UaePqヌN*ュ/ァュKW(コ・ロiZニiQマ ★ノキ徇ワトzラモ゙[ス-刮セメ・f7ーッ衒?8=;q_ |3ユ"D雑#フモ5v H 8セ柄:例ァゥ霧」ヲ4レンホ\,栖渤>フ烽2GPAナJ展州謨鋭o#~ヨ_&^ス2ュk列f」禀$イ記へヨYョッdFクTT\}OJゥ繪「コi-筝:zHヒケ,ネァ ネ 2:トt'eユホ9}敗^綺Tゥュ](ハS寫8ケオム+Pラオz eラ「檄ヘ曦寂タナ*ハユ怛ノ$貊 Zg-、イサモ。ウユャー.ル銭[ケ;=Ckノ%勞ワ'窯 ヒン%+滂億M;ヌ:垉jv-I#スタ層コ |ァフ^@ヨ4ェkg4ホ墟淡GGケアニ5 ェ0Rセ殄繩瀝シK}ャ_Eeォwn&ネYVレ迸ッ゚霍メ)~!ユHウマ臾ュkミ甞剣ヤ疫ヒエ蠎( ヌ+Юフラ奢暁qュ懽鰒ンE7.・"w8/`{ヨニッヲh<2_Om-テニ>・ョenp6$茵J?荷レ噺ェラ5棡X~螂kレ炳vェQサウv2[jr>* R゙サH )\乏:ミF$ラ彡 ムキ檍fキシ[~栃-bュナォ飛、Sヌラ'&ケ`ホキ゚モ+9Yヒンリレ7KQイ迹Tgc3モ垉+9烝5Q胖qZF:ケjhxe黠9テ」トs5リ"ショsテv`ハラ2/Lェ゚ヤメゥ;G~ァヨス<*j:枅-ァ=;ヘ(AタG メvz~uヤr 3キ棟Z:孜>シq3)Tr2Fr1ホEGB<R察萪/8  P8ネヌセiワB爵ナ.8zメtネ<毟1陀?Nクヲ珸ケ顴= ニ住Qχ侃!q:飼O^セ莫ヤuマNM/PG\tヘ Cモス ム!'ォチオセ( NラqCル9ヨメ;rzモネ>荻]i設Yネc>'ツ昂祢eャHLヒ沽鋼鹿怐ァヌ#Fウ+ゥJ?ZNヨサ榜*オ」ユ・慮ラv}エ頌c$φ_|u゙5>ヒI4m=レ+Xgn3pGソ!Gィ< Lオクモチ$モA$>l#踵随t=z希ロ}jGア鑑T珪ト++fL.6=WァハxW.靆NA7ォE uリrリホ89奧[Vt ・\xイヨ6ク曚+ッフ/ヒリnl光ツラ慾(p:)Fコキ}モヒ薬h 9チッア[]: k+[&ル4?0」^0^ヘn5臂ヌ8@pチ*+-d<ィ @N゙qモ=ゥm曵 恨礁乖,ノ>呻^Zウ`=y^9ュ+sヨ坿+3*イア^8、筐oナ^モBュ,娉UロH」ー>」リラ夐レ゙ュヲ獻M># 嚆セZ9 ?ナ朸ス戒 sヘSヤmn、オセ)紳」 >ケ孚_:gU,L」JZナ8二SLシヤ44箚-モ怕柔lW[ョ鰌^駸%オ諫ラVB 耙{WлdIuGQL,ーU+ヌ1鉋GC^U、E氛ッ袵[局セIャッx8チ<縦メスl-w└゚3ウF賑1pt-セgミZFiッホィ鏤)7ト壊竪:ホ=MXミ<5ヲン黝ャキー0渭ン豐l$z?捶_>0]閹;9n哥途ケ&O=ミ吸Kkー゙ォ゙6K テネ{V~ツqムニ遨ソj苺KiァMAjムHアビS)オラミ郢ヌj=WHソメ&ョ_aテ+ィワsタラァxラチ゚ロZ\精TG芋Hタ=y譟+I+テu:壮国?{&r2G|#ヨョ%CKiリォテIルョソ餾ート挑ョ~aョタ/|? ./、エcキsgf6c携゙オシs皚}7I蟹セヒqw!B何カ羆b:w垈=゙。m<ミロ]Oo眄ユw タ5ッエ孔ェワ%網「懊$メ=窰絶モWメ/bニ.m・s譯l ナz甍鎬s?WmィXヘu」゚C賣<ケュテd\)G耘_J蹊チltケu鰮幌ラム゙。w3!?トHニFp+oナ? ヲケエスオンヲホメ_ウ )ヌ。#ロャ゙<・BN Z_mマ6メオサ@ヨDヒ0++惇E做チヲッ5蟠0ワ斉匙モ1^ヒョ0悌ッ裝d5カ >ソ{゙シヒナXミオvウ ニョァhPT弱ラ ラ。F6N話0ウ樟FT耄E;sヤ{={舁1身oenн=j%N;^a&&,ョ0O臀烱ァノ モユA啄+スD緲アh雑ッ8ヨ蝌\ゥ ワ塒エLAヨシ$モ゙サゥ-,qVw74サL7wQ靭ル3ミロスユユ5ケ奨ラ=j>^NVホ}8ヘwツ{」ホゥ)tf゙ンK:NトシホGソzャ蜚;ユイM)'#ィヌ桾 アチマN做ュュ0サ}EiリbコxF翡z牌鐡ネ゙ヌモsルチO^+Jウ祐ヤ疂IeQvoサカqノ5゚4h|3、%ェイ=苻{ゥタヌ傀ヌ死zWマgy」。唹゙{#ンハー iヨィョコ.総、ナ幢クWm<ノ6頚qマ]ヲ甫}I/メ!8ニ,3c靡jチィSッ5甦V=玉+鰭 飩!`$貂|F允B殘サ\"ヤo9'Mk)ニ v*5+K万[~GcHフK1迥-K篝ウィ\ }"ハ =d62フ}ツ縦鑠択絃Y.N鬲リC~シBシナqシ|\ケi'&zk'5ヘ凹ユネMcヌメヌwォロ@U yッ.k祭セ3リDチ4ス.趁寉7!=}*゙愚Jオ(レ返Lァ"8@>ケニ'5ワhムdロヲiヨカン" ヌヌ圻稟ス「セKy}八?呎V'坂ホ淵ナcgxJιャнぜ/D!榴m_荘pkl6aミdz寿ワ3bゥJ皈#怐戀ッ?zT6゚ュ悟鬼\エ鯣+メw0b譴嵶綜p:ア笞リワX0qラ・Jイ薯2「セqM蓆akj瑚エナ]M蚓ホdjz ~ヲュネ クキQ"、楕8dMサコ甲pOu餽ェZtD戮 ∧ンャ8テンヲh当ャュィxJ]n^%<畏nQ;莞モ-.tヘUZ 巽ムC'ロ・jノィ フテ0臓ュPヤo[ネy鴻ゥu<モゥ9Eロ。ムkYウAョフヘ|ナbS#QヌユvHnu+D "t1}アヌYウヨレjヌF93X針゚駻ネ瘍襷? ヒ面Aニロ+メ8``$|=ャヤシ9A抔Mオク/-6゚ミ貂Wヤ」ヤ%90ネタ 椹腔xkVd駆メコ!%~S職z,E攪・I]nr~!暉;マ1K Qタuオx鏡 ヒ@$マミカ>u退qスE}溝tウF~aノォチォーリ兌IX$ンァ ミユm&オクqq 誓~eu サ=?ZGぞ9禀ルu*レw9@サ\タx?質g].'-I ゚ヲ槁。qォ-GY碑Bァサ Y滌1輜:B9ョ嵌゙サ・テs &fE預RO(テアニEs=~幣'第巾ハ・9S,岬ヌヲミuネ/A5`$dc9k]」ナ-オ姑ニロYカXVHモmpーヌ@ノマェ住オコ瑪酌オ| ι。kメj゚サキ剌 3ツ1ホ=ィ椿詢ル峨[ノt x」\」ヌヤ/斧ォ答屋 c懃ィノナ{トmKヘ)m|&o4ソm゙ホ9マュxエ袴ネチ轟9};W刻┿モ{Yツオ)F碁/器ァX楕リ3mbW$ヌカj ンタeノl畷L3縋ヨ#<t9獨iYrN<5ヒ},」}ヘス トニ.+躑マイワ察?綽ゥ猾0\]゙ネ4ロ|モ;胼ヤnノ驢=ーs^Hfツ#,6ェI^・*5{5i#K8橇ア%Xg>XXウ製G\5z8Iノサt>70エiニ`ュ6u]OHNァuコセL・L旬,ェア[ヲ>マ゙ッラ貅ヤI<輓4枦テ-Xgマ~3術1^オ秣&ュュィシ~1葩) 3キEy?サハvホO5サGセケアメヌm[匿伜IrIマ'$8ッFJT}ヨ姉UユPユfコbト9ツ<:ユQ)タユSホI4ワ慝ナ$&J1健j[;v暼アb{ ユt #'ヲ=Mt6R光<縄kヲ9ル杭#JユQUリナ\Vリ梼*、#衙鰊8ゥラスz M2Zイ|艚トzd」キ=q鋤ュ4gM;ゥ餠{剋買=?Unワ車 恷2?SLBサ#9ァθAテモN2y鑛^NF}zR懊ァz\舖ミzR:c・4ト!ニ1槹H竡ヱマjNzクワ@マ?z`.s恆ヌッPq∧h9 ゚殍Aモ荊ィA`鰥 ニ部ス淆メ=9、P3呉P#ヨ蔚票f、\臭}8ッ滌Kヲgjレ繭ネチ?q菖シウ粹¥RアヤT|ウニ`瞎罘ョフ=5シNl珍%~G大#4ノタ釵矢=萄驫P7 lア蓄^エロ{t・a椒_ZMロR」'd{?鴦ヌツ7囑略ヘ蒂j体~コcリ礁セウミヒ-^%敍Rdg 瑰_椁レ`帛2#光旭就瞭+Qd1敲拠セス+ニニ畭V~メ2ウ=a*Zメ称鰆H、1 vチチー堂eキ7ュ|聶o譲0マァ強 擺OV5ソ&メャ「ク肯オ6誕 ネ>ノツアワロ髷k報盾? \GウhfMムヘ 帚o&Oハヲj抛fmFスL;シOMHオノ「-[Zニ燭Ke,2 S襪xヌスO{稘俊C"シォテ`)'ラレイ淨7L「|x゚8= hレ鑰O Uヌ[Xノ..t坂ツ!~h$u゚レシ_筝ゥ」+ァヲ」";枝K]nyumIdモエ ゥmモI 甑ア=:聳3キサ什冢ハエI,傾0rzVヤe} s6メウ2-ァタGq飮メヌr蓍+ +bレ_5y鄙ラヨコ賑rRGフO袖-lタh驩ゥpD糖・ア#?zOォt循゚スI,z瓔W 攷ャヘフb;メ0p~ァ=・d^ツpニ=>-ッ 採=綫弩ニJャンJ酬~ュヒgQ*t#「=V]j-<勹n#rリワ;cケョw[キt/穣ウe@スO繩/&Vケ?l炭ョ~Pw?醪zWI・xm"Ukイ蓴M゙ーX凩υy^ b・フ"ヲォィx崘ラ ァケ廱2坊オヌ9cヘuG.ネ゚Zコ[dゥワ迸3!鴟ョソヅホレ;{+x簇6ト1忤'ゥkッ鮫ィヘwaiツ」谿ヘナ贏`ス(Gヒs3B゙贈!]*ツメcsキユ'ュr@ヨ」i+>8ラ!ニEzSトB超モォ+ノン.澣/pΝ /オ懣!」d^k`eQ恭 "ッ%酵ユアメoM肢a_Sァシセ1w詢8キオ=ョミゥ#ェワbケ=R+;ヒtkアスci$カIFウu yDカc6N@$_=官)ノ麑)u:ハシル&ミ響ソ+QヨムQホ &C~鴟Wェハツ,gソキ眼称ッ8ヌナ\氣オGVアeト:0ウ+フwF2{YS。RzE}賁哽輒ゥn、9W?>oOjャコ。Gーッ;ウ/nァwァx黙ャ/( ,ュ1櫺C\゙スゥ謔゙cd~e純ヤwモョ*ゥクエSQ蠎=薮ナnウ・シ隅aw嶮∀fテ耋2リ..Lウ`}y8ッh'$キlハKネル$リ溪tャ4h臂X形湛sタ H8楠]Pヒ!Sュレ 装8ァ%k{ゥノvG*ア 7 鵞ャロ尠ア夸ネ.ァコオi竊&] 9タcッ」シ燒カメ'ユシ]ェカ、- y・ウ,qイヲ =>オ怖枳瘻潮綴ハキケ] 髀JンアユハマFタ(R c8'ニxsR飢ー2`」(チ#?マメョリフN衙i゙」=ョ+)Rィヤコ 'キxUsテ!Vチ%z弖エJタV` zW願フー 追ォユ菖コ }Uオi睦喪'9ldz飮j{ヒ3ケ}}メツs到O藝゙'3ノ Sリ'候\Nロ2モ6 *v<}スォィ蓬 W戴"鼓$洶瀲ッ3狛ラ#ミj茶M]イ技ムY]J nニHク卯FOヒケ>サkツ|U潼Sテセム嶽職}葡9`h^レNHFンイ2r=+ヤヘャ/uvア幤トイニ.wォg殍jニo粟ヤuォQtヲI$郎q諸c$術kキ:6公セヲx胤[;l諸リ|リリミFAdTモツマ$2]:徼ヘx#リw%ステロハ%I LT銜ゥゥMTVcァ9ム喋'ハマTクミ.ミネbKキシr゚ノチィモテラメH触靨ク\"耶適血a網gヨク」マ]q9F゙ロ ゙ }セ?エオハ坐1クx遮$r#d譱j鵄}Kツ^ウi.盧ホ醂ク舌イ時彡Nゥナ:株クヨ&Hげ骨}k爆W芳暖gvホ$&コ鰌5h」ネュRヲ"ァオュ+ネッ?.オ隘アム疚 ^V9啣ネ>奕!<徹hUO7ユトモUGe-溥*ロHIシ)B3ーURト ヨハ[@俛マSホy=*AツG f龍+荘リZュセ|テサセ=ォJ9秧・屍ィ遯舵|H<緕シvュc渠U「硯互ロ5ニネタ餔]F@ル!ネマ5苫<マッ^/怡1飄ラ**lレムカ$睾甞ュウcノネ閂8ョxョW;H1モ#オ慈.{Qニヘnxtl齦テQ蔽鎹N lコ/スrョx'」{榕<7ラ,ホ肆9ヘmrHツXYムニ*v0Fk=]ヤ W=T5vロQキ(キコi稱マfsO R「ネ^ス?JカF1核険衄=sモ弱モ滔](轉 苙3ヘ)タ鯤ヲhnPz ヌ薺 ヌヒ3慧