0 && ($i%$size)==0) { $j++; } $retval[$j][$i%$size] = (empty($array[$i])) ? $fill : $array[$i]; } } return $retval; } // }}} function authorized() { // {{{ global $config; $r=$u=$p=$a=false; $remember = ( linkex::get( 'remember', $_REQUEST, 0 ) == 1 ); if ( ( $u = linkex::get( 'username', $_POST, false ) ) && ( $p = linkex::get( 'password', $_POST, false ) ) ) { $r=true; } else if ( $a = linkex::get( '_authcookie', $_SESSION, false ) ) { $r=false; } else if ( $a = linkex::get( '_authcookie', $_COOKIE, false ) ) { $remember=true; $r=false; } $path = dirname( linkex::get( 'SCRIPT_NAME', $_SERVER, '/' ) ); if ( ( $u !== false && $p !== false ) || ( $a !== false ) ) { if ( md5( $u .'---'. $p ) == $config->password || $a == $config->password ) { $_SESSION['_authcookie'] = $config->password; if ( $remember ) { setcookie( '_authcookie', $config->password, time()+60*60*24*30, $path ); } if ( $r ) { linkex::redirect( $_SERVER['REQUEST_URI'] ); } return true; } else { setcookie( '_authcookie', '', time() - 3600, $path ); unset( $_SESSION['_authcookie'] ); return false; } } else { setcookie( '_authcookie', '', time() - 3600, $path ); unset( $_SESSION['_authcookie'] ); return false; } } // }}} function buildquery( $array ) { // {{{ $retval = array(); foreach( $array AS $k=>$v ) { $retval[] = urlencode( $k ).'='.urlencode( $v ); } return join( '&', $retval ); } // }}} function categories( $all = false, $checkslots=false ) { // {{{ $categories = array(); $cids = linkex::listfiles( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'categories' . DIRECTORY_SEPARATOR ); foreach( $cids AS $cid ) { $c = new category( $cid ); if ( ( $all || $c->public == 1 ) && ( !$checkslots || ( $checkslots && $c->slots > 0 && $c->links() < $c->slots ) ) ) { $categories{ $cid } = $c->name; } unset( $c ); } return $categories; } // }}} function compareIPs( $a, $b ) { // {{{ a can be 127., 127.0, 127.0.0, 127.0.0.1, or a hostname if ( !preg_match( '/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/', $a ) ) { $a = linkex::gethostbyname( $a ); } if ( !preg_match( '/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/', $b ) ) { $b = linkex::gethostbyname( $b ); } $a = explode( '.', $a ); $b = explode( '.', $b ); for( $i=0; $ilinkbotdisregardwww == 1 ) { $a = str_replace( 'www.', '', $a ); $b = str_replace( 'www.', '', $b ); } if ( $config->linkbotignoretrailingslash == 1 ) { $a = rtrim( $a, '/' ); $b = rtrim( $b, '/' ); } return strcmp( $a, $b ); } // }}} function checkbox( $val ) { // {{{ return ( intval( $val ) != 0 ) ? 'checked="checked"':''; } // }}} function du( $dir ) { // {{{ $s = @stat( $dir ); $space = linkex::get( 'size', $s, 0 ); if ( is_dir( $dir ) ) { $dh = opendir( $dir ); while ( ( $file = readdir( $dh ) ) !== false ) { if ( !in_array( $file, array( '.', '..' ) ) ) { $space += linkex::du( rtrim( $dir, '/' ) .'/'. $file ); } } closedir( $dh ); } return $space; } // }}} function elapsed( $seconds ) { // {{{ $retval = array( 'Y' => 0, 'm' => 0, 'd' => 0, 'H' => 0, 'i' => 0, 's' => 0, 'nice' => '' ); // Years ( 60*60*24*365 ) = 31536000 seconds if ( $seconds > 31536000 ) { $retval{'Y'} = floor( $seconds / 31536000 ); $seconds = $seconds - ( $retval{'Y'} * 31536000 ); $retval{'nice'} = $retval{'Y'} . ' year' . ( $retval{'Y'}>1?'s':'' ); } // Months ( 60*60*24*30 ) = 2592000 if ( $seconds > 2592000 ) { $retval{'m'} = floor( $seconds / 2592000 ); $seconds = $seconds - ( $retval{'m'} * 2592000 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'m'} . ' month' . ( $retval{'m'}>1?'s':'' ); } // Days ( 60*60*24 ) = 86400 if ( $seconds > 86400 ) { $retval{'d'} = floor( $seconds / 86400 ); $seconds = $seconds - ( $retval{'d'} * 86400 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'d'} . ' day' . ( $retval{'d'}>1?'s':'' ); } // Hours ( 60*60 ) = 3600 if ( $seconds > 3600 ) { $retval{'H'} = floor( $seconds / 3600 ); $seconds = $seconds - ( $retval{'H'} * 3600 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'H'} . ' hour' . ( $retval{'H'}>1?'s':'' ); } // Minutes ( 60 ) = 60 if ( $seconds > 60 ) { $retval{'i'} = floor( $seconds / 60 ); $seconds = $seconds - ( $retval{'i'} * 60 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'i'} . ' minute' . ( $retval{'i'} > 1 ? 's':'' ); } // Seconds 0 if ( $seconds >= 0 ) { $retval{'s'} = $seconds; $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'s'} . ' second' . ( $retval{'s'}>1?'s':'' ); } return $retval; } // }}} function expandlink( $link, $baseurl ) { // {{{ preg_match( "'^[^\?]+'", $baseurl.'/', $res ); $res = preg_replace( "|/[^\/\.]+\.[^\/\.]+$|", '', $res[0] ); $res = rtrim( $res, '/' ); if ( ( $root = @parse_url( $res ) ) ) { $root = $root['scheme'] .'://'. $root['host']; } else { // fixme // die( 'Unable to parse: '.$res ); $root = 'http://'; } $search = array( "|^(\/)|i", "|^(?!http://)(?!mailto:)|i", "|/\./|", "|/[^\/]+/\.\./|" ); $replace = array( $root .'/', $res . '/', '/', '/' ); return preg_replace( $search, $replace, $link ); } // }}} function fetch( $url, $params=array() ) { // {{{ global $config; if ( ( $host = @parse_url( $url ) ) && linkex::get( 'host', $host, false ) !== false ) { $po = linkex::get( 'port', $host, '80' ); $ho = linkex::get( 'host', $host, '' ); $pa = linkex::get( 'path', $host ); $pa = ( strlen( $pa ) == 0 ) ? '/':$pa; $qu = linkex::get( 'query', $host, '' ); $pa.= ( strlen( $qu ) == 0 ) ? '':'?'.$qu; $ua = linkex::get( 'agent', $params, $config->linkbotagent ); $h = array(); $h[]= linkex::get( 'method', $params, 'GET' ).' '.$pa.' HTTP/1.0'; $h[]= 'Host: '.$ho; $h[]= 'User-Agent: '.$ua; $h[]= 'Connection: close'; if ( linkex::get( 'method', $params, 'GET' ) == 'POST' && strlen( linkex::get( 'data', $params, '' ) ) > 0 ) { $h[]= 'Content-Length: '.strlen( linkex::get( 'data', $params, '' ) ); $h[] = 'Content-Type: application/x-www-form-urlencoded'; } $header = join( "\r\n", $h ) . "\r\n\r\n"; if ( ( $data = linkex::get( 'data', $params, false ) ) !== false ) { $header .= $data; } $buffer = ''; $fp = @fsockopen ( $ho, $po, $errno, $error, linkex::get( 'timeout', $params, 3 ) ); if ( !$fp ) { return array( 'URL' => $url, 'error' => 'Socket error: '.$error.' ['.$errno.']' ); } else { fputs( $fp, $header ); while( !feof( $fp ) ) { $buffer .= fgets( $fp, 1024 ); } fclose( $fp ); /// buffer holder nu hele resultatet, incl headers etc if ( preg_match( '/^HTTP\/(\d+\.\d+)\s+(\d{3})\s+(.*)/i', $buffer, $res ) === false ) { return array( 'URL' => $url, 'error' => 'Invalid HTTP response ('.substr( $buffer,0,30).')' ); } else { switch ( $res[2] ) { case 200: /// ok /// strip off the headers $res = explode( "\n\n", str_replace( chr( 13 ), '', $buffer ) ); if ( sizeof( $res ) >= 2 ) { $headers = array_shift( $res ); if ( function_exists( 'utf8_encode' ) ) { $contents = utf8_encode( join( "\n\n", $res ) ); } else { $contents = join( "\n\n", $res ); } return array( 'URL' => $url, 'headers' => $headers, 'contents' => $contents ); } else { return array( 'URL' => $url, 'contents' => utf8_encode( $buffer ) ); } break; case 301: case 302: /// maybe redirect? if ( !preg_match( '/location\:\s+(.*)/i', $buffer, $redir ) ) { return array( 'URL' => $url, 'error' => $res[2].' but no redirect' ); } else { $url = $redir[1]; if ( !preg_match( '"^http"i', $url ) ) { $url = 'http://'.$ho.'/'.ltrim( $url, '/' ); } if ( ( $h = @parse_url( $url ) ) === false ) { return array( 'URL' => $url, 'error' => $res[2].' but unparsable URL' ); } else { if ( str_replace( 'www.', '', strtolower( linkex::get( 'host', $h, '' ) ) ) != str_replace( 'www.','', strtolower( $ho ) ) ) { return array( 'URL' => $url, 'error' => $res[2].' but to external site ('.$h{'host'}.')' ); } else { return linkex::fetch( trim( $url ) ); } } } break; default: /// not good return array( 'URL' => $url, 'error' => $res[2].' '.trim( $res[3] ) ); break; } } } } else { return array( 'URL' => $url, 'error' => 'Unparsable URL' ); } } // }}} function fileget( $file, $default=null ) { // {{{ if ( file_exists( $file ) ) { if ( $fp = @fopen( $file, 'r' ) ) { $locked = ( @flock( $fp, LOCK_EX ) ) ? true:false; // $default = fread( $fp, filesize( $file ) ); $default = ''; while ( !feof( $fp ) ) { $default .= fread( $fp, 1024*1024 ); } if ( $locked ) { @flock( $fp, LOCK_UN ); } fclose( $fp ); } } return $default; } // }}} function fileput( $file, $con ) { // {{{ if ( $fp = @fopen( $file, 'w' ) ) { $locked = ( @flock( $fp, LOCK_EX ) ) ? true:false; $default = fwrite( $fp, $con ); //, strlen( $con ) ); if ( $locked ) { @flock( $fp, LOCK_UN ); } @fclose( $fp ); return ( intval( $default ) > 0 ); } else { return false; } } // }}} function flush() { // {{{ echo str_pad('',4096)."\n"; flush(); usleep( 500000 ); } // }}} function genID() { // {{{ $id = linkex::fileget( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR .'uid' ); $id++; linkex::fileput( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR .'uid', $id ) or die( "[Fatal Error: Unable to write to UID file]" ); return $id; } // }}} function get( $key, $array, $default=null ) { // {{{ if ( is_array( $array ) && in_array( $key, array_keys( $array ) ) ) { $default = $array{ $key }; } return $default; } // }}} function getDomain( $var ) { // {{{ $var = strtolower( $var ); if ( ( $pos = strpos( $var, '@' ) ) !== false ) { // Email $domain = substr( $var, $pos + 1 ); } else { // URL $domain = @parse_url( $var ); $domain = linkex::get( 'host', $domain, 'unparseable' ); } return $domain; } // }}} function gethostbyname( $dom, $force=false ) { // {{{ $dom = strtolower( trim( $dom ) ); $data = array(); if ( file_exists( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'ips' ) && ( $data = linkex::fileget( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'ips' ) ) && ( $data = linkex::unserialize( $data ) ) ) { if ( ( $force === false ) && ( $ipinfo = linkex::get( $dom, $data, false ) ) !== false && ( time() - linkex::get( 'date', $ipinfo, 0 ) ) < 604800 && ( $ip = linkex::get( 'ip', $ipinfo, false ) ) !== false ) { unset( $data ); return $ip; } } $ip = gethostbyname( $dom ); $data{ $dom } = array( 'date' => time(), 'ip' => $ip ); linkex::fileput( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'ips', trim( serialize( $data ) ) ); unset( $data ); return $ip; } // }}} function getLinks( $str, $baseurl ) { // {{{ $thisdom = linkex::getDomain( $baseurl ); preg_match_all( "'<\s*a.*>(.*)<\s*/\s*a\s*>'Umis", $str, $res ); $links = array(); for( $i=0; $i' ); } $retval = ''; for($i=$pos+$d;$i0 && $haystack{$i-1} == '\\' ) );$retval.=$haystack{$i}, $i++ ) {} foreach( $end AS $c ) { $retval = str_replace( '\\'.$c, $c, $retval ); } return $retval; } else { return $default; } } /// }}} function glob( $dir, $regex ) { // {{{ $files = array(); if ( $d = @opendir( $dir ) ) { while ( false !== ( $file = readdir( $d ) ) ) { if ( preg_match( '|' . $regex . '|i', $file ) ) { $files[] = $file; } } } return $files; } // }}} function installed() { // {{{ return ( is_dir( BASEDIR . DIRECTORY_SEPARATOR .'data' ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'backup' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'categories' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'blacklist' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'links' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'output' . DIRECTORY_SEPARATOR ) ); } // }}} function listfiles( $dir, $ext=array() ) { // {{{ $retval = array(); if ( is_dir( $dir ) ) { if ( $dh = opendir( $dir ) ) { while ( ( $file = readdir( $dh ) ) !== false ) { if ( filetype( rtrim( $dir, DIRECTORY_SEPARATOR ) .DIRECTORY_SEPARATOR. $file ) == 'file' ) { $retval[] = $file; } } } } return $retval; } // }}} function log( $level, $type, $str ) { // {{{ $file = 'linkex.log'; $log = sprintf( "[%s] [level=%d] [%s] %s\n", date( 'Y-m-d H:i:s' ), $level, $type, $str ); $fp = fopen( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'logs' . DIRECTORY_SEPARATOR . $file, 'a' ); flock( $fp, LOCK_EX ); fwrite( $fp, $log ); fclose( $fp ); } // }}} function map( $fun, $arr ) { // {{{ $retval = array(); foreach( $arr AS $k=>$v ) { $retval[ $k ] = $fun( $v ); } return $retval; } // }}} function mail( $to, $sub, $body ) { // {{{ global $config; $headers = array(); $headers[] = 'X-Mailer: LinkEX/20071229'; if ( strlen( $config->email ) > 0 ) { $headers[] = sprintf( 'From: LinkEX @ %s <%s>', linkex::get( 'HTTP_HOST', $_SERVER, linkex::getdomain( $config->url ) ), $config->email ); $headers[] = sprintf( 'Reply-To: %s', $config->email ); } return mail( $to, $sub, $body, join( "\r\n", $headers ) ); } // }}} function redirect( $url, $code=301 ) { // {{{ $resp = array( 301 => 'HTTP/1.1 301 Moved Permanently', 404 => 'HTTP/1.1 404 Not Found' ); if ( ( $resp = linkex::get( $code, $resp, false ) ) !== false ) { header( $resp ); } header( 'location: '.$url ); exit; } // }}} function selector( $name, $list, $selected=null, $multiple=true, $forcetype=null, $extra=null, $sep='
' ) { /// {{{ $type = ( $multiple ) ? 'checkbox':'radio'; $type = ( sizeof( $list ) > 5 ) ? 'select':$type; if ( $forcetype && in_array( $forcetype, array( 'checkbox', 'radio', 'select' ) ) ) { $type = $forcetype; } $extra['class'] = $type.' '.linkex::get( 'class', $extra, '' ); if ( $extra ) { $buffer=array(); foreach( $extra AS $k=>$v ) { $buffer[] = sprintf( '%s="%s"', $k, $v ); } $extra=' '.join( ' ', $buffer ); } else { $extra=''; } $formname = ( $multiple ) ? $name.'[]' : $name; $buffer = ''; if ( $type == 'select' ) { $buffer .= sprintf( ' %s%s', $formname, $id, ($ck)?' checked="checked"':'', $extra, $txt, $sep ); } elseif ( $type == 'radio' ) { $buffer .= sprintf( '%s', $formname, $id, ($ck)?' checked="checked"':'', $extra, $txt, $sep ); } } if ( $type == 'select' ) { $buffer .= ''; } return $buffer; } /// }}} function serialize( $val ) { // {{{ return serialize( $val ); } // }}} function sort( &$array, $field, $order='desc' ) { // {{{ if ( $field == 'random' ) { shuffle( $array ); } else { $GLOBALS['sortby'] = $field; usort( $array, array( 'linkex', 'usort' ) ); if ( $order == 'desc' ) { $array = array_reverse( $array ); } } } // }}} function stripcomments( $con ) { // {{{ $con = preg_replace( '||Umis', '', $con ); $con = preg_replace( '||Umis', '', $con ); $con = preg_replace( '||Umis', '', $con ); return $con; } // }}} function substr( $str, $len, $pad='..' ) { // {{{ if ( strlen( $str ) > $len ) { return substr( $str, 0, $len - strlen( $pad ) ) . $pad; } else { return $str; } } // }}} function truncate( $str, $len, $txt='..' ) { // {{{ if ( strlen( $str ) > ( $len-strlen( $txt ) ) ) { return substr( $str, 0, $len-strlen( $txt ) ).$txt; } else { return $str; } } // }}} function unserialize( $str ) { // {{{ $retval = @unserialize( $str ); if ( $retval !== false ) { return $retval; } else { // Attempt to fix it $str = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", trim( $str ) ); $retval = @unserialize( $str ); if ( $retval !== false ) { return $retval; } else { echo '[Fatal error in linkex::unserialize( "'. $str .'" )]'; } } } // }}} function usort( $a, $b ) { // {{{ if ( isset( $GLOBALS['sortby'] ) && strlen( $GLOBALS['sortby'] ) > 0 ) { $f = $GLOBALS['sortby']; if ( is_object( $a ) && isset( $a->$f ) ) { $aa = $a->$f; } else if ( is_array( $a ) && isset( $a[$f] ) ) { $aa = $a[$f]; } else { $aa = $a; } if ( is_object( $b ) && isset( $b->$f ) ) { $bb = $b->$f; } else if ( is_array( $b ) && isset( $b[$f] ) ) { $bb = $b[$f]; } else { $bb = $b; } switch( $f ) { case 'rdomip': $aa = sprintf( '%u', ip2long( $aa ) ); $bb = sprintf( '%u', ip2long( $bb ) ); break; case 'rdom': $aa = str_replace( 'www.', '', strtolower( $aa ) ); $bb = str_replace( 'www.', '', strtolower( $bb ) ); break; case 'anchor': $aa = strtolower( $aa ); $bb = strtolower( $bb ); break; } if ($aa == $bb) { return 0; } return ($aa < $bb) ? -1 : 1; } else { return 0; } } // }}} function verifybacklinks( $ids=array(), $callback=null ) { // {{{ global $config; $retval = array( 'starttime' => time(), 'links' => array(), 'categories' => array() ); foreach( $ids AS $id ) { $l = new link( $id ); $l->updateIPs(); $buffer = array( 'action' => 'link', 'id' => $l->id, 'rdom' => $l->rdom, 'rdomip' => $l->rdomip, 'rurl' => $l->rurl, 'skipcheck' => $l->skipcheck, 'skippagerank' => $l->skippagerank, 'minpagerank' => ( $l->minpagerank != -1 ) ? $l->minpagerank : $config->minpagerank, 'oldstatus' => $l->status, 'oldpagerank' => $l->pagerank ); if ( $l->skipcheck == 0 ) { $pr = $l->getPageRank(); $buffer{'res'} = $l->hasBacklink(); $buffer{'code'} = ( !is_string( linkex::get( 'reason', $buffer{'res'}, null ) ) ) ? '200 OK' : $l->laststatus; if ( $l->status != 4 ) { $l->status = ( ( $pr >= ( ( $l->minpagerank != -1 ) ? $l->minpagerank : $config->minpagerank ) ) && ( linkex::get( 'res', $buffer{'res'}, -1 ) == 0 ) ) ? 1:2; } $l->save( false ); } $buffer{'status'} = $l->status; $buffer{'pagerank'} = $l->pagerank; $retval{'links'}[] = $buffer; unset( $l ); if ( $callback != null && function_exists( $callback ) ) { call_user_func( $callback, $buffer ); } unset( $buffer ); } // Rebuild categories $categories = linkex::listfiles( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'categories' . DIRECTORY_SEPARATOR ); foreach( $categories AS $cid ) { $c = new category( $cid ); $c->generate(); $buffer = array( 'action' => 'category', 'id' => $cid, 'name' => $c->name ); $retval{'categories'}[] = $buffer; unset( $c ); if ( $callback != null && function_exists( $callback ) ) { call_user_func( $callback, $buffer ); } unset( $buffer ); } $retval{'endtime'} = time(); return $retval; } // }}} function sum( $array = array() ) { // {{{ $retval = 0; foreach( $array AS $a ) { $retval += $a; } return $retval; } // }}} function yesno( $val ) { // {{{ return ( $val ) ? 'Yes':'No'; } // }}} } class template { function about() { // {{{ global $config; if ( LOGGEDIN ) { $phpver = phpversion(); $zendver = zend_version(); $uname = php_uname( 's r' ); $du = round( linkex::du( BASEDIR . DIRECTORY_SEPARATOR . 'data' ) / 1024, 2 ).'KB'; $links = sizeof( linkex::listfiles( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'links' . DIRECTORY_SEPARATOR ) ); $installdate = date( $config->dateformat, $config->installdate ); if ( function_exists( 'gd_info' ) ) { $gd = gd_info(); $gd = sprintf( '%s - GIF Support: %s', $gd{'GD Version'}, ( ( $gd{'GIF Create Support'} ) ? 'enabled':'unsupported, using plain text for CAPTCHA if used' ) ); } else { $gd = 'Not installed, using plain text for CAPTCHA if used.'; } echo "
\n\t
\n\t\tServer info\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
PHP version:{$phpver}
Zend version:{$zendver}
GD Info:{$gd}
Server OS:{$uname}
\n\t
\n
\n\n
\n\t
\n\t\tLinkEX info\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
LinkEX version:20071229
Current version: (Force upgrade)
Database size:{$du}
Links:{$links}
Install date:{$installdate}
\n\t
\n
\n\n\n\n"; } else { echo "
\n\tPowered by LinkEX\n\t
\n\t\tThis site is powered by LinkEX, a free script that will take care of accepting link exchange requests, \n\t\tand, if needed, making sure a link back is present.
\n\t\t
\n\t\tIf you run a website, you can have this script also. Head over to linkex.dk, \n\t\tand get your free copy.
\n\t\t
\n\t\t
Features
\n\t\t
    \n\t\t\t
  • Free! This script is free. No hidden fees, no nothing.
  • \n\t\t\t
  • Easy to install - upload 1 (one) file, fill out the basic settings, and you are good to go.
  • \n\t\t\t
  • One click updates. Update the script, just by a single click. The script will fetch the latest release, install it, making sure you are up to date at all times.
  • \n\t\t\t
  • Advancend link robot. You choose what sites to check for backlinks, and the bot will make sure the link is present.
  • \n\t\t\t
  • Google PageRank™ check. The script will show you the PageRank™ of all your link partners.
  • \n\t\t\t
  • And much much more..
  • \n\t\t
\n\t\tHead over to linkex.dk to read more\n\t
\n
\n"; } } // }}} function footer() { // {{{ return "\t\t\t\n\t\t\t
\n\t\t\t\tv.20071229 © linkex.dk 2006-2007\n\t\t\t
\n\t\t\n\t
Download Mp3/Mp3 MusicTop Chartsdownload R.E.M. music lyricdownload Leona Lewis music lyricdownload Portishead music lyricdownload Iron Maiden music lyricdownload Led Zeppelin music lyricdownload Beth Rowley music lyricdownload Mariah Carey music lyricdownload Bruce Springsteen music lyricdownload AC/DC music lyricdownload Linkin Park music lyricdownload OneRepublic music lyricdownload Bob Dylan music lyricdownload Metallica music lyricdownload The Who music lyricdownload Rihanna music lyricdownload Al Green music lyricdownload The Kooks music lyricdownload U2 music lyricdownload David Bowie music lyricdownload Prince music lyricdownload Alanis Morissette music lyricdownload Putumayo music lyricdownload Elvis Presley music lyricdownload Willie Nelson music lyricdownload Jon Bon Jovi music lyricloren wilson wheelan

loren wilson wheelan

science little cacapon river real estate

little cacapon river real estate

fire lisa smedman

lisa smedman

equal longview tx drain grid

longview tx drain grid

door lowe s dublin ca

lowe s dublin ca

three lordi webpage

lordi webpage

thick lotta stennson clothes new york

lotta stennson clothes new york

once lisa dragonetti

lisa dragonetti

sand listen to elu by christophe willem

listen to elu by christophe willem

valley lloyd quarterman face

lloyd quarterman face

cost logan blade bickford

logan blade bickford

meet little joe que bruto

little joe que bruto

fig longenbaugh at hwy 6

longenbaugh at hwy 6

us linksys dsb c320

linksys dsb c320

grew lisa billman

lisa billman

carry los castillos restaurant westminster ca

los castillos restaurant westminster ca

word lititz pike apartments

lititz pike apartments

tool littermaid instruction manual

littermaid instruction manual

test liquidation sale lexington ky

liquidation sale lexington ky

region llano bike rally

llano bike rally

roll lockout tagout fatality

lockout tagout fatality

until lippolis electric

lippolis electric

force lithium ion battery camera hp r07

lithium ion battery camera hp r07

son lottery millionaire london ontario

lottery millionaire london ontario

matter listen to jock jams cd

listen to jock jams cd

just long term care ombudsman and nh

long term care ombudsman and nh

card logan ut utah state university apartments

logan ut utah state university apartments

cross longarm accessories extras tools and gadgets

longarm accessories extras tools and gadgets

property louis arguir

louis arguir

drive lodders marine fairfield

lodders marine fairfield

rather lindsey buckingham hypnotized

lindsey buckingham hypnotized

one london escors

london escors

music lip swelling and burning

lip swelling and burning

question loc nitride

loc nitride

science lisa rinna nippple

lisa rinna nippple

office london borough population estimates 2026

london borough population estimates 2026

body lowdin and proton transfer in dna

lowdin and proton transfer in dna

found long sleeve salwar kameez

long sleeve salwar kameez

expect lois grocki

lois grocki

tell low power output on ft 857

low power output on ft 857

self lindsay katcoff

lindsay katcoff

complete ll bean catalogue cover posters

ll bean catalogue cover posters

equate little miss cutey

little miss cutey

new liseli etekalt

liseli etekalt

game low cal baked haddock

low cal baked haddock

meat louise harkey school of nursing

louise harkey school of nursing

field lonicera honey suckle for sale

lonicera honey suckle for sale

silver louis breland panama city beach fla

louis breland panama city beach fla

face long layered straight haircuts

long layered straight haircuts

indicate loral defense system

loral defense system

kept little secrets terracotta resin statue

little secrets terracotta resin statue

mile linette lecher

linette lecher

tell loughborough estate agents uk

loughborough estate agents uk

father list austin housing

list austin housing

head lloyd hockaday

lloyd hockaday

view liquid paving au

liquid paving au

who little peguin

little peguin

radio little tykes pickup truck

little tykes pickup truck

pattern lisa heil north bay ontario

lisa heil north bay ontario

record low dose immunotherapy for allergies knoxville

low dose immunotherapy for allergies knoxville

snow lisa diplacido

lisa diplacido

sight live report atlanta hartsfield security traffic

live report atlanta hartsfield security traffic

whole louisville cardinals furniture

louisville cardinals furniture

paint loran to gps converter

loran to gps converter

rule loveland factory outlets

loveland factory outlets

mount listen to badger basketball game

listen to badger basketball game

able lovejoy spider sox

lovejoy spider sox

wheel lindt lindor dark chocolate

lindt lindor dark chocolate

lay liquidation zone chatham

liquidation zone chatham

total louisiana notary tes

louisiana notary tes

least lisette larkins

lisette larkins

guide log cabion contest ajc

log cabion contest ajc

contain little mermaid party centerpiece

little mermaid party centerpiece

such louvre bill crump

louvre bill crump

cover lovelace rio bravo

lovelace rio bravo

land liquor depot detroit

liquor depot detroit

thus longus capitis depression

longus capitis depression

music little latin lupe righteous brothers

little latin lupe righteous brothers

drop louis de wohl aleister crowley

louis de wohl aleister crowley

so louis arcement

louis arcement

read llano estacado cooder graw

llano estacado cooder graw

dream london camberwell college of art

london camberwell college of art

corner linn benton community band

linn benton community band

original london broil cooked temp

london broil cooked temp

require little tikes 8 in 1 gym

little tikes 8 in 1 gym

watch long term side effects mefloquine

long term side effects mefloquine

feet long range diesel catamaran

long range diesel catamaran

but lound school

lound school

system los bravos johnson ferry

los bravos johnson ferry

proper loft conversions crawley sussex

loft conversions crawley sussex

difficult linn akito for sme

linn akito for sme

air lou s diner nichols ny

lou s diner nichols ny

anger lolhan

lolhan

than lori carletti

lori carletti

ground lopi pellet stove parts

lopi pellet stove parts

able lodi wi townhouse

lodi wi townhouse

throw linger lodge bradenton fl

linger lodge bradenton fl

yes liquid kelp fertilizer

liquid kelp fertilizer

one lisa a palovick

lisa a palovick

study livellanti

livellanti

gentle lord belper s mineral railway

lord belper s mineral railway

string lisa m proffitt

lisa m proffitt

don't loeve france

loeve france

wear long term dianabol cycle discussion forum

long term dianabol cycle discussion forum

tree lolikon chan

lolikon chan

floor lohr builders ltd

lohr builders ltd

industry litchfield elementary construction projects

litchfield elementary construction projects

heart linksys wireless b adapter wpc11 driver

linksys wireless b adapter wpc11 driver

doctor linea imperiale faucets

linea imperiale faucets

children louis penner sustained volunteerism

louis penner sustained volunteerism

this line x franchise for sale by owner

line x franchise for sale by owner

book lobo super trac

lobo super trac

card lonsdale quay n van bc

lonsdale quay n van bc

dark long toenails kathy hayes

long toenails kathy hayes

example long napple

long napple

master listec telepromter accessories

listec telepromter accessories

steam local housing office isc seattle wa

local housing office isc seattle wa

island linessa side effects

linessa side effects

safe lowering link for yamaha ttr 125

lowering link for yamaha ttr 125

told loading yahoo add mtg rhodes

loading yahoo add mtg rhodes

are lorenzo pfuhl

lorenzo pfuhl

card logan ohio amish food

logan ohio amish food

such longfield industrial estate derry

longfield industrial estate derry

went lovers cario

lovers cario

captain lori niemi

lori niemi

smile live cam laconia

live cam laconia

time lotto schweitz

lotto schweitz

tree louis p slotin

louis p slotin

continue linen lampshade ruffle

linen lampshade ruffle

clothe lisa glancy

lisa glancy

shout linux redha

linux redha

always lindy kidder

lindy kidder

cool lludd

lludd

near linville falls lodging

linville falls lodging

wish lobelia inflata 6c

lobelia inflata 6c

view lokken walkthrough

lokken walkthrough

course loctite 30534

loctite 30534

white lisam

lisam

million louis l amour anything for a pal

louis l amour anything for a pal

speech lingere moeling tampa bay

lingere moeling tampa bay

us lingnan kindergarten

lingnan kindergarten

trouble literatute

literatute

behind lisa marinac

lisa marinac

temperature louisana primary

louisana primary

meat lotr online maps amd quests

lotr online maps amd quests

force loratadine muscle cramps

loratadine muscle cramps

weight lisa gerrard aria

lisa gerrard aria

smell lowell herrero address labels

lowell herrero address labels

speed lisa tatro

lisa tatro

draw listech canada

listech canada

gold loperamide hydrochlorid

loperamide hydrochlorid

guide longines evidenza uk

longines evidenza uk

dream liquidation judiciare

liquidation judiciare

bank locksmith chestertown maryland

locksmith chestertown maryland

best loire valley latitude

loire valley latitude

grand lori g giovannoni

lori g giovannoni

tiny lowes movie theater owner

lowes movie theater owner

between live counting crows eastlake july 24

live counting crows eastlake july 24

better linux digicorder t1 festplatte

linux digicorder t1 festplatte

be lisa plexi

lisa plexi

meet lisa northey

lisa northey

them lora w4b

lora w4b

clean lonnie leffingwell

lonnie leffingwell

die lissajous ratios

lissajous ratios

window lipha tech labs

lipha tech labs

fish longsy d

longsy d

mount linsey dawn mckenzie penthouse

linsey dawn mckenzie penthouse

down lisa aplanalp

lisa aplanalp

phrase logan elementary moline

logan elementary moline

learn log cabin kit barnum

log cabin kit barnum

care linus project fabric

linus project fabric

valley littman master cardiology black edition

littman master cardiology black edition

stand loguestbook pics

loguestbook pics

yard lisa litt idaho

lisa litt idaho

shape lord kamote

lord kamote

copy lori gomes castle high school

lori gomes castle high school

few liquidation swimming pool cleaner robot

liquidation swimming pool cleaner robot

wash lowes moen eastlake

lowes moen eastlake

stop liquid latex party pics

liquid latex party pics

fruit louiville courier jurnal

louiville courier jurnal

chair lorin tumbler maintenance

lorin tumbler maintenance

bar lori adeniji

lori adeniji

nine locost builders

locost builders

board lodine 400 mg like medications

lodine 400 mg like medications

laugh lotro npcs too short

lotro npcs too short

found loading and unloading a shotgun

loading and unloading a shotgun

instrument lithonia recessed lights

lithonia recessed lights

few low hgb level

low hgb level

fell lothian health vaccines find public

lothian health vaccines find public

band los barriles fishing

los barriles fishing

while little less satisfaction elvis download

little less satisfaction elvis download

teach lousiville cheerleaders

lousiville cheerleaders

from lori a carrol boerne tx

lori a carrol boerne tx

rope longterm complications of prednisone therapy

longterm complications of prednisone therapy

engine long mcquade markham

long mcquade markham

continue lolicon uncensored

lolicon uncensored

occur lineated kalij feather

lineated kalij feather

sea loki ragnarok believe in heaven

loki ragnarok believe in heaven

pretty lisence plate trace

lisence plate trace

hour loard of the rings hobbits

loard of the rings hobbits

create listing 2000059

listing 2000059

black linux factorial segfault

linux factorial segfault

came los hermonos bakersfield

los hermonos bakersfield

effect lindsay patricia northover said

lindsay patricia northover said

fear listen to tuxedo junction erskine butterfield

listen to tuxedo junction erskine butterfield

appear litovchenko

litovchenko

use loctite marine epoxy uses

loctite marine epoxy uses

paragraph linksys etherfast cable dsl router befsr11

linksys etherfast cable dsl router befsr11

decide little gull hotel longboat key

little gull hotel longboat key

develop londa villareal

londa villareal

hot lofton employment service

lofton employment service

again lindsay ann riera ft myers

lindsay ann riera ft myers

lady lovus

lovus

probable longerie fucking

longerie fucking

snow louisiana state police hom

louisiana state police hom

stood local artists temuka

local artists temuka

vary lonny lays of new york

lonny lays of new york

basic logansport indiana psychiatrist

logansport indiana psychiatrist

ago live skycam of las vegas now

live skycam of las vegas now

object lloyd piehl

lloyd piehl

dog lisa chenery

lisa chenery

syllable louis vuitton cup semifinals

louis vuitton cup semifinals

fall lobster claw clasp manufacturer

lobster claw clasp manufacturer

pass linen ironing tips and tricks

linen ironing tips and tricks

decide louise carpenter vanderburgh indiana

louise carpenter vanderburgh indiana

plant lovesong wolfsheim

lovesong wolfsheim

piece longview wa postoffice

longview wa postoffice

triangle lingerie 84040

lingerie 84040

summer lloyd wells slidell

lloyd wells slidell

but lotte hirschmann

lotte hirschmann

eight lisa ling korea undercover

lisa ling korea undercover

position louis camilleri birthday

louis camilleri birthday

drink longhaired german shepherd

longhaired german shepherd

hurry lornas laces bucks bar 142

lornas laces bucks bar 142

eight longhorn goosenecks

longhorn goosenecks

fast low sodium worcheshire sauce recipe

low sodium worcheshire sauce recipe

young logus mfg florida

logus mfg florida

or longchamp racecourse

longchamp racecourse

except loftus death survived by kristy

loftus death survived by kristy

develop lonnie mcree

lonnie mcree

depend lothar strunk

lothar strunk

joy literatura puertorrique a informacion

literatura puertorrique a informacion

value look at us sarina pairs lyrics

look at us sarina pairs lyrics

triangle loni silva t o ca

loni silva t o ca

of lori sedlak

lori sedlak

we lloyd ray lamunyon

lloyd ray lamunyon

did lori redmond attorney

lori redmond attorney

stone lori k redmon

lori k redmon

when loris presbyterian

loris presbyterian

black lloyd eichorn charlotte nc

lloyd eichorn charlotte nc

round lotro furniture

lotro furniture

company lloyds tsb hong kong

lloyds tsb hong kong

track louise olivi

louise olivi

note lord reign in me vineyard music

lord reign in me vineyard music

fell lisa theil

lisa theil

their longeron f 15

longeron f 15

describe lowa cevedale gtx

lowa cevedale gtx

king little tikes cozy cottage

little tikes cozy cottage

plant lompoc dmv

lompoc dmv

win lirik lagu dua insan

lirik lagu dua insan

past little bear deli glen arbor

little bear deli glen arbor

jump lonliest day of my life lyrics

lonliest day of my life lyrics

visit lisbeth davidson

lisbeth davidson

ran long torso corset

long torso corset

electric los panchos mid

los panchos mid

round linsay lohan magazine

linsay lohan magazine

observe local finishline located near boston ga

local finishline located near boston ga

salt lowell schnurr

lowell schnurr

seven lipo battery 4000mah

lipo battery 4000mah

study lisa jackson naniamo bc

lisa jackson naniamo bc

rule litter maid lm500

litter maid lm500

mix lonny workman

lonny workman

map logan s death maul

logan s death maul

numeral lordex spinal compression

lordex spinal compression

string lisa sette stallone

lisa sette stallone

size lisa saville florida

lisa saville florida

step little nemo the dream master rom

little nemo the dream master rom

salt listen weekapaug groove

listen weekapaug groove

city literacy rates in uniontown pa

literacy rates in uniontown pa

east lotion dispensing pump

lotion dispensing pump

neck loudonville perrysville schools

loudonville perrysville schools

poor lora stanton shawnee

lora stanton shawnee

element lori fox nwi

lori fox nwi

cross longchang

longchang

silent lineco holland

lineco holland

want littlest pet shop colouring pages

littlest pet shop colouring pages

own lindsey mccully

lindsey mccully

mile longstreath

longstreath

spend longview cowlitz students

longview cowlitz students

dress lisa karamardian

lisa karamardian

choose locking storage cupboards

locking storage cupboards

off louisianna powerball

louisianna powerball

full lorio and german shepard

lorio and german shepard

observe line air charter de colombia ambulancias

line air charter de colombia ambulancias

key lisa laviolette

lisa laviolette

position llnl engineering micro

llnl engineering micro

visit littlest pet shop curious kittens

littlest pet shop curious kittens

each lindy postage stamp

lindy postage stamp

came locksmith in burlingame

locksmith in burlingame

certain loadcell readout

loadcell readout

paragraph lisa lipss

lisa lipss

keep locksmith in greenfield

locksmith in greenfield

settle longarm quilting supply

longarm quilting supply

ready lloyd s servicecenter new orleans la

lloyd s servicecenter new orleans la

product log wood carvings two harbors mn

log wood carvings two harbors mn

board lisa chelenza photo

lisa chelenza photo

circle long thoracic nerve entrapment

long thoracic nerve entrapment

student lindsey buckingham painful

lindsey buckingham painful

am louise county auditor in iowa

louise county auditor in iowa

take lobero santa barbara

lobero santa barbara

effect local sqlexpress sqlcmd sdk server

local sqlexpress sqlcmd sdk server

wear lititz pa tuxedo fitting

lititz pa tuxedo fitting

hot linspire five o tutorials

linspire five o tutorials

piece little train that could paty supplies

little train that could paty supplies

air linehead screwdriver

linehead screwdriver

select little mermaid look a likes

little mermaid look a likes

for liveournal

liveournal

circle loran marie dave matthews

loran marie dave matthews

arm litens china

litens china

winter lisa liffick fabric

lisa liffick fabric

show linville falls vacations

linville falls vacations

mountain litek led signs

litek led signs

gave low profile triton foundation foundation simmons

low profile triton foundation foundation simmons

position louisville museams

louisville museams

each lord hutchingson

lord hutchingson

tie lord of the gourd pbs

lord of the gourd pbs

dress liteon lh 20a1p drivers

liteon lh 20a1p drivers

blow lord help me by dave hollister

lord help me by dave hollister

drink lois daley laycock

lois daley laycock

direct lowered 1968 firebird

lowered 1968 firebird

paragraph logan oney md

logan oney md

difficult louisa harding thalia

louisa harding thalia

multiply little muskego lake water ski show

little muskego lake water ski show

door long term trailer unit maine bmv

long term trailer unit maine bmv

hour lindsey funeral home harrisonburg

lindsey funeral home harrisonburg

four lipowrap reviews

lipowrap reviews

map long term farm rental near mazatlan

long term farm rental near mazatlan

govern lower calorific value petrol

lower calorific value petrol

farm loblaws mississauga

loblaws mississauga

morning liteon pa 1650 02

liteon pa 1650 02

car louie s back porch

louie s back porch

rub longhorn supply buxton

longhorn supply buxton

yes lousiville galt house suites

lousiville galt house suites

double lips together teeth apart terrence

lips together teeth apart terrence

joy littlemidgets milfseeker

littlemidgets milfseeker

suffix live video katu2

live video katu2

thought loisa may alcott

loisa may alcott

least lisa chomko

lisa chomko

which livelink job posting

livelink job posting

scale lotro yesterday finally stuck questions

lotro yesterday finally stuck questions

page lisa collins bozeman real estate

lisa collins bozeman real estate

iron lowe alpine upland jacket review

lowe alpine upland jacket review

thus lower chiquita campground

lower chiquita campground

wash little rock thermacool facelift

little rock thermacool facelift

column louisiana dairy stabilization board

louisiana dairy stabilization board

children louin travel

louin travel

experiment linton indiana food services

linton indiana food services

front loins of ephriam

loins of ephriam

pay lora l nix

lora l nix

ask lithium orotate dosage and wellbutrin xr

lithium orotate dosage and wellbutrin xr

symbol lord calverts decanters

lord calverts decanters

told llama hikes lee mass

llama hikes lee mass

copy lindsey rekow washington

lindsey rekow washington

map low vision magnifier wholesaale

low vision magnifier wholesaale

either lori grassgreen

lori grassgreen

drive lisa ulik

lisa ulik

thank lolist

lolist

bar loughlin nevada hotels

loughlin nevada hotels

six lott v earles

lott v earles

dead loteria el borracho

loteria el borracho

change llv 3 pahse

llv 3 pahse

took lorie griffin robbs celebrities

lorie griffin robbs celebrities

sit linus flanders field speech

linus flanders field speech

the lorenzo siena fragrances

lorenzo siena fragrances

gold liquor store in 92126 zip code

liquor store in 92126 zip code

show long range varmint cartridge most economical

long range varmint cartridge most economical

current listhaus

listhaus

clear lord taylor frozen yogurt

lord taylor frozen yogurt

stead linoleum prices mn

linoleum prices mn

seem llano county attorney

llano county attorney

tall low ballast factor 71

low ballast factor 71

colony lopers kearney nebraska

lopers kearney nebraska

size linux dv9000z

linux dv9000z

ease linear models lee seber solution

linear models lee seber solution

quite lista fobaproa

lista fobaproa

raise lord craven at boome castle

lord craven at boome castle

simple lorewood grove

lorewood grove

ready linux stl2 ide serverworks

linux stl2 ide serverworks

father loralie patchwork fabrics

loralie patchwork fabrics

fraction little miss muffet costume

little miss muffet costume

cook lister lab victoria tx

lister lab victoria tx

smell lon trost

lon trost

collect loctite speedbonder 312

loctite speedbonder 312

might liver snax

liver snax

one louis viton cup

louis viton cup

develop lovebird cage location

lovebird cage location

state lofty blomfield

lofty blomfield

month lombardini manual

lombardini manual

glad lindros russia

lindros russia

listen logging softward

logging softward

cat louise giannone

louise giannone

press lordz hood board game

lordz hood board game

beauty lisa bonet dreads

lisa bonet dreads

middle logansport indiana divorce lawyers

logansport indiana divorce lawyers

train louisville chainsaw dealers

louisville chainsaw dealers

believe logs poles wanted classifieds

logs poles wanted classifieds

yard lotte mimi ferrer

lotte mimi ferrer

melody lorne pier to pub

lorne pier to pub

late lisa gribetz

lisa gribetz

mine
\n\n"; } // }}} function header( $params = array() ) { // {{{ global $errors, $config; $params = array_merge( array( 'menu' => Template::menu(), 'title' => '', 'onload' => '' ), $params ); $error = ''; $cookieIds = "'".join( '\',\'', array_unique( explode( ',', linkex::get( 'fscookie', $_COOKIE, '' ) ) ) )."'"; $charset = isset( $config->charset ) ? $config->charset : 'utf8'; if ( linkex::get( 'noerrors', $params, true ) && sizeof( $errors ) > 0 ) { $error = join( '
', $errors ); $error = "
\n\t
\n\t\tError\n\t\t
\n\t\t\t{$error}\n\t\t
\n\t
\n
\n"; } return "\n\n\t\n\t\t\n\t\tLinkEX » {$params{'title'}}\n\t\t\n\t\t