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 lyriclisa gulliksen

lisa gulliksen

better lite on sohw 832s vista drivers

lite on sohw 832s vista drivers

who listen to fuel s hemorage

listen to fuel s hemorage

green lovisa skeppsbron rf

lovisa skeppsbron rf

join listen to lil wyte

listen to lil wyte

pitch littlegirl kelsie

littlegirl kelsie

steel lindley street bridgeport hauntings

lindley street bridgeport hauntings

provide lonhro resources australia

lonhro resources australia

season london colney shopping centre

london colney shopping centre

whose listen weston priory

listen weston priory

between loreal true match coupon

loreal true match coupon

ice lorenzetti pronounced

lorenzetti pronounced

form local pipefitting in troy

local pipefitting in troy

circle lorain county golf courses per resident

lorain county golf courses per resident

then louis mallory tattoo

louis mallory tattoo

invent lorena sanchez moives

lorena sanchez moives

fell listen to evangelist tonya hall

listen to evangelist tonya hall

string lithuanian dumpling

lithuanian dumpling

same lori bundschuh

lori bundschuh

weight lotensin generic equivelants

lotensin generic equivelants

my lowes middletown ohio

lowes middletown ohio

wear logpac

logpac

word lisa m jackowitz

lisa m jackowitz

table lisaray

lisaray

fun littelton coins

littelton coins

idea logan square apartments for rent

logan square apartments for rent

wait low sulfur fuel mufflers

low sulfur fuel mufflers

organ loreal paris lasting curls gel

loreal paris lasting curls gel

take logan muckler

logan muckler

danger lisianski island

lisianski island

famous lori kominski

lori kominski

town literature review on 360 degree apprisal

literature review on 360 degree apprisal

necessary los palos ambulatory endoscopy

los palos ambulatory endoscopy

fire louisiana dealer lisence

louisiana dealer lisence

reply long mcquade windsor

long mcquade windsor

brought lorelei candles inc

lorelei candles inc

machine lisa stoddard jewelry

lisa stoddard jewelry

basic linocolor cps

linocolor cps

rich lithonia exit light

lithonia exit light

let lisa sonek

lisa sonek

milk los lomas high softball

los lomas high softball

book long term rentals in benalmadena

long term rentals in benalmadena

noon loding in southern mn

loding in southern mn

wind lisa lombardi engagement ca

lisa lombardi engagement ca

then los osos business solutions

los osos business solutions

compare low fat self saucing pudding

low fat self saucing pudding

plural lisa m zoellick air force

lisa m zoellick air force

meat local businessman jeff fuqua fl

local businessman jeff fuqua fl

cat loanshop north

loanshop north

mouth little garden stroies

little garden stroies

beauty lindsay riera

lindsay riera

know liquid hydrogen temperatu

liquid hydrogen temperatu

ready lippoth

lippoth

us lob ster hi rise

lob ster hi rise

word louver jigs

louver jigs

push lonnie riden

lonnie riden

world liquified petroleum gas west branch iowa

liquified petroleum gas west branch iowa

lake lodi laser tooth whitening

lodi laser tooth whitening

sense local bus transit in newnan ga

local bus transit in newnan ga

stood litts plumbing

litts plumbing

moment louis phillipe drop leaf table chairs

louis phillipe drop leaf table chairs

range llew vincent vienna

llew vincent vienna

lady loveday v renton 1991

loveday v renton 1991

party lisa gambrel

lisa gambrel

pose little girl fairy statue

little girl fairy statue

kept lipstix in council bluffs

lipstix in council bluffs

hear lindsey bonner myspace

lindsey bonner myspace

thin listen to badger basketball game

listen to badger basketball game

support lip twitching and numbness

lip twitching and numbness

meat lisa kephart

lisa kephart

more low sodium tacos

low sodium tacos

success linwood center ellicott city md

linwood center ellicott city md

value listen to newsies

listen to newsies

usual lland sales australia

lland sales australia

do literatura carcelaria gratis

literatura carcelaria gratis

score lomas auto mall

lomas auto mall

help listerine blue recall

listerine blue recall

feed longstock gardens

longstock gardens

level lindys cake decorator

lindys cake decorator

tall loki morser

loki morser

he linux compatible us robotics modem

linux compatible us robotics modem

anger lipson vale plymouth

lipson vale plymouth

thus lowa tempest ii boots jute

lowa tempest ii boots jute

walk live messenger 8 1 sip

live messenger 8 1 sip

over litetouch

litetouch

quick liquidating iraqi dinat

liquidating iraqi dinat

die lotsa heart elephant

lotsa heart elephant

practice lladro usa fl

lladro usa fl

seat louisiana indigent defender

louisiana indigent defender

smile louis giglio indescribable

louis giglio indescribable

leg low band rf emitters uae

low band rf emitters uae

final linedance cue sheets

linedance cue sheets

product lipoma definition

lipoma definition

total liquid nails strenght

liquid nails strenght

capital longtime film critic crowther

longtime film critic crowther

first longwood trailer company

longwood trailer company

sound llano tx apple festival

llano tx apple festival

charge lloyd r theriault

lloyd r theriault

car louie s pub saskatoon

louie s pub saskatoon

during lockwood stamper wild

lockwood stamper wild

take longmont co salud clinic

longmont co salud clinic

effect louise rosenkranz

louise rosenkranz

contain lorex video surveillance system shs 4wls

lorex video surveillance system shs 4wls

ago lisa moak

lisa moak

square littleton nc pet friendly accommodations

littleton nc pet friendly accommodations

dry los titanes de durango

los titanes de durango

oil louise mcclosky

louise mcclosky

major loria gill

loria gill

except longhorn boyscout council

longhorn boyscout council

no lori rhett memorial scholarship

lori rhett memorial scholarship

blow love n care child development center

love n care child development center

cotton loisto catering

loisto catering

round louise gluck summer at the beach

louise gluck summer at the beach

strong llandaff cathedral location uk

llandaff cathedral location uk

noon lita de alberdi

lita de alberdi

also low fat pepperjack

low fat pepperjack

story literary genres mid term quiz

literary genres mid term quiz

done littlest pet shop games rss feed

littlest pet shop games rss feed

catch lodrick stweart nba draft

lodrick stweart nba draft

water loadstone magnetite san diego

loadstone magnetite san diego

captain low country resturants sullivan hwy sc

low country resturants sullivan hwy sc

ring llyods insurance

llyods insurance

before liricts

liricts

magnet lodgng within 20 miles torrey utah

lodgng within 20 miles torrey utah

piece linon distressed pine

linon distressed pine

plain low sodium handout client

low sodium handout client

straight lisa bonet dreads

lisa bonet dreads

apple louisiana napoleonic code

louisiana napoleonic code

original lindsay felton sexy

lindsay felton sexy

protect loose door panel 04 malibu

loose door panel 04 malibu

compare locums anesthesia in iraq

locums anesthesia in iraq

knew liver cleanse ebsom salts

liver cleanse ebsom salts

consonant lisa beamer 9 11 for dummies

lisa beamer 9 11 for dummies

idea line tracing robot for mindstorms 1 0

line tracing robot for mindstorms 1 0

broad llt tampa

llt tampa

meant loews theater binghamton ny

loews theater binghamton ny

above ll bean solitude ski review

ll bean solitude ski review

plan little rascals television series

little rascals television series

live low profile carrier airv pricing

low profile carrier airv pricing

were lobb boots

lobb boots

danger loesje v d

loesje v d

human lip balm lables

lip balm lables

branch lip exam with and without fluorescein

lip exam with and without fluorescein

leave low sodium sprouted grain bread

low sodium sprouted grain bread

flow loest prices acuvue advance

loest prices acuvue advance

mine lismore cinema birch

lismore cinema birch

tiny lisa wolfe asheville

lisa wolfe asheville

equate lisa murkins

lisa murkins

clothe lisa pekich

lisa pekich

sight lonnie vanpelt

lonnie vanpelt

receive live at glastonbury 2005 coldplay

live at glastonbury 2005 coldplay

but lindville

lindville

arm louisisana boardwalk

louisisana boardwalk

shall lithia dodge in concord

lithia dodge in concord

agree lisa mantz

lisa mantz

among linux problem with et wolfenstien jaymod

linux problem with et wolfenstien jaymod

result lisa brock chelmsford

lisa brock chelmsford

since lousianna coonass

lousianna coonass

box longview nicholasville

longview nicholasville

win littleton nissan colorado

littleton nissan colorado

industry los cocos restaurant spring texas

los cocos restaurant spring texas

basic little cosette anime

little cosette anime

dead louisiana crabing

louisiana crabing

one liv wylder jpg

liv wylder jpg

ball liquormart

liquormart

ocean lottalove

lottalove

arm liscio hair tallahassee

liscio hair tallahassee

seat lockout tagout accident photos

lockout tagout accident photos

east linear multi code remote

linear multi code remote

beauty louisiana professional engineer s oath

louisiana professional engineer s oath

point lord salisbury 6th marquess

lord salisbury 6th marquess

proper lodging in lampasas texas

lodging in lampasas texas

fig lots for sale on belews creek

lots for sale on belews creek

you lirik lagu hujan pagi yg gelap

lirik lagu hujan pagi yg gelap

city lisa russo elwood

lisa russo elwood

bed lorettalynn

lorettalynn

enter lisa bird hibbard

lisa bird hibbard

big literatur parlemen jalanan

literatur parlemen jalanan

letter lomani ab spirit

lomani ab spirit

began loews white marsh movies 16

loews white marsh movies 16

surface lobo mad dog barb wire wrestling

lobo mad dog barb wire wrestling

ride london ky dragway

london ky dragway

particular longacre chassis height

longacre chassis height

wonder lindsay vandivier franklin

lindsay vandivier franklin

pay lloyd price rockin rhythm and blues

lloyd price rockin rhythm and blues

animal liver cancer pins and ribbons

liver cancer pins and ribbons

warm louisville stoneware

louisville stoneware

stand loan hac assistance tax audit

loan hac assistance tax audit

repeat longest tenured players

longest tenured players

race louisiana berge du lac

louisiana berge du lac

wall liquid hexamine

liquid hexamine

double liquidty workout michelle austin

liquidty workout michelle austin

experience longevity for someone with cerebral palsy

longevity for someone with cerebral palsy

clock ll cool j feud def jam

ll cool j feud def jam

great louisiana purchase fudge natchitoches

louisiana purchase fudge natchitoches

place lino lacedelli

lino lacedelli

wish lm products slider guitar strap

lm products slider guitar strap

let lister petter genset

lister petter genset

nine little red ridinghood plot theme

little red ridinghood plot theme

feel lisa sparxx

lisa sparxx

part lindsey biaggi

lindsey biaggi

instant linksys wap11 configuration

linksys wap11 configuration

has liquor stoe

liquor stoe

on linear 14 mini duplex strobes

linear 14 mini duplex strobes

surprise little mary sunshine patricia routledge

little mary sunshine patricia routledge

band lisa bertolasio

lisa bertolasio

listen lompoc ca libarary

lompoc ca libarary

own lindy dickson

lindy dickson

design long ranch weather for gosford

long ranch weather for gosford

clean logal

logal

garden london collesium

london collesium

fear linksys rtp300 vd

linksys rtp300 vd

lot louise barbetta

louise barbetta

free lithonia lights wst seriers

lithonia lights wst seriers

instrument listen to newsies songs

listen to newsies songs

cook lower extremity numbness and blood clot

lower extremity numbness and blood clot

sign liquor stores in attleboro ma

liquor stores in attleboro ma

simple london onrtario

london onrtario

strong lisa beeley

lisa beeley

would lotto megabucks system

lotto megabucks system

tone loco roco no uta

loco roco no uta

liquid lovelinks jewellery lincolnshire

lovelinks jewellery lincolnshire

slow lisa bonno

lisa bonno

boy lisa gjedde

lisa gjedde

are lowan lou

lowan lou

kind linux cron restart command

linux cron restart command

salt loras sports camp

loras sports camp

exact lindys taco sauce

lindys taco sauce

right list of warrants for bossier parrish

list of warrants for bossier parrish

until louielouie las vegas

louielouie las vegas

way longo trash conecticut

longo trash conecticut

spend los lomitas school district

los lomitas school district

brother littman obituaries

littman obituaries

rain lolz cat translator

lolz cat translator

interest lowes home inprovement

lowes home inprovement

from liquid swordz

liquid swordz

notice local newspapers for south panola mississippi

local newspapers for south panola mississippi

egg lorene diane medlin

lorene diane medlin

come lisette acevedo bodybuilder

lisette acevedo bodybuilder

yard loaves fishes cneters inc portland

loaves fishes cneters inc portland

slow lori white detriot

lori white detriot

car low grade sil

low grade sil

were loizeaux brothers inc

loizeaux brothers inc

too loestin oral contraceptive

loestin oral contraceptive

most liquid or granular trugreen fertilizer

liquid or granular trugreen fertilizer

view lots for sale wears valley tn

lots for sale wears valley tn

each lippizzan stallions

lippizzan stallions

least lomb s partner

lomb s partner

put lofton creek on the nassau river

lofton creek on the nassau river

seem louis malcolm holley said

louis malcolm holley said

soil longbow golf mesa

longbow golf mesa

small linuc shell eggdrop

linuc shell eggdrop

match lori van benschoten

lori van benschoten

meant linksys wrv54g firmware 2 38

linksys wrv54g firmware 2 38

log low income apartments in mcalester oklahoma

low income apartments in mcalester oklahoma

continue locksmith volkswagen des plaines

locksmith volkswagen des plaines

sun lm7805 circuits

lm7805 circuits

distant logans roadhouse chili

logans roadhouse chili

human linux keyboard repeats nforce

linux keyboard repeats nforce

very little buckaroo horse camp

little buckaroo horse camp

ride lisa bryan cheff

lisa bryan cheff

common longitude latitude malaga spain

longitude latitude malaga spain

paint louisville ky citywalk exercise

louisville ky citywalk exercise

five liriope nc state

liriope nc state

act linsey lohans fire crotch

linsey lohans fire crotch

base lori aro

lori aro

did lorain county auditor

lorain county auditor

against lindsay boatner

lindsay boatner

map longwood run sarasota bradenton

longwood run sarasota bradenton

share louis fonsi estoy perdido

louis fonsi estoy perdido

list literotica hooker

literotica hooker

wing loading stockwatch news stockwatch

loading stockwatch news stockwatch

guide linquistic development

linquistic development

arrive lorna yates zion illinois

lorna yates zion illinois

flat llc rugby retrieval

llc rugby retrieval

atom lladro daisa cat

lladro daisa cat

written loreal volume extreme shampoo 1liter

loreal volume extreme shampoo 1liter

high lisa pey

lisa pey

much louisa may alcott timaline

louisa may alcott timaline

sure lisbian movies

lisbian movies

notice lollipops and gumdrops

lollipops and gumdrops

since louisa moates

louisa moates

must loft apt in la jolla ca

loft apt in la jolla ca

question loren zundel

loren zundel

clock long tight sexy showy prom dresses

long tight sexy showy prom dresses

sand logo planter kit distributors

logo planter kit distributors

yard ll postcards 1079

ll postcards 1079

travel literacy specialist requirements ccsd

literacy specialist requirements ccsd

weather loki ragnarok soundtrack

loki ragnarok soundtrack

shoulder louisiana sugarcane league

louisiana sugarcane league

temperature london popularion

london popularion

her lotr on line race traits

lotr on line race traits

triangle linux htb using tos

linux htb using tos

him loran national bank log on

loran national bank log on

walk lorain ohio package stores

lorain ohio package stores

seat lollas net

lollas net

level listen to university of alabama gamesgames

listen to university of alabama gamesgames

seem lowes furniture warehouse zanesville

lowes furniture warehouse zanesville

distant low protein low sugar foods

low protein low sugar foods

all loc gershwin prize

loc gershwin prize

love loc tite threadlocker

loc tite threadlocker

separate lisa barrie psychic

lisa barrie psychic

forward lori greiner jewerly box

lori greiner jewerly box

children linksys hp200 driver

linksys hp200 driver

ball loews in woodridge

loews in woodridge

rich linum rubrum grandiflorum

linum rubrum grandiflorum

break loand for sale in millsap tx

loand for sale in millsap tx

to lonly raod

lonly raod

sky loud turn signal flasher

loud turn signal flasher

my lounge lizard 1920

lounge lizard 1920

what loose that gutt

loose that gutt

money low country pavers sc

low country pavers sc

home lisa diferdinando

lisa diferdinando

ground lindsey dee powell zelda ky

lindsey dee powell zelda ky

matter little tikes let s cook coffee

little tikes let s cook coffee

world longview phil thomas debra

longview phil thomas debra

on little darlings bourbon street

little darlings bourbon street

size lori brusk

lori brusk

always lojack hack

lojack hack

full lodge stoneware collection

lodge stoneware collection

or lingierie models

lingierie models

the lonnie barbeck

lonnie barbeck

hit locknell

locknell

tone lirik samson

lirik samson

degree linge lake lingere

linge lake lingere

kill louis deangelos resturant bloomington indiana

louis deangelos resturant bloomington indiana

cover liquid frostbite forum

liquid frostbite forum

separate lindy booth actress pics

lindy booth actress pics

school lisa barrong

lisa barrong

while low fat vegetarian entrees

low fat vegetarian entrees

plane loving paws kenosha

loving paws kenosha

man los hansack sin con triple por

los hansack sin con triple por

prove lollypops daytona

lollypops daytona

imagine lm25 bs 1490

lm25 bs 1490

drive logan howey

logan howey

kill los lunas new mexico home search

los lunas new mexico home search

pair louise robertson tameside

louise robertson tameside

imagine linton duet

linton duet

put liquor store davis boulevard naples florida

liquor store davis boulevard naples florida

front los chupadores

los chupadores

line lladro angel wondering

lladro angel wondering

coat louis lanzarotti

louis lanzarotti

do listen to webbie independent

listen to webbie independent

me locost 7 plans canada race

locost 7 plans canada race

poem loreal drabber bath directions

loreal drabber bath directions

skill lois lee allbright burrow

lois lee allbright burrow

group liric lagu

liric lagu

huge loan transmittal summary form 1003

loan transmittal summary form 1003

control louise gluck and vespers

louise gluck and vespers

king linn benton community college veterinary

linn benton community college veterinary

great ll cool j deigner suites

ll cool j deigner suites

chair liquid kelp fertilizer

liquid kelp fertilizer

girl linksys wrk54g drivers

linksys wrk54g drivers

meat lisa gailord

lisa gailord

salt longest confirmed kill by military sniper

longest confirmed kill by military sniper

saw little sally walker hokie pokie

little sally walker hokie pokie

must lise charmel lingerie chicago

lise charmel lingerie chicago

job low carb cherry cobbler

low carb cherry cobbler

roll low carb oyster stew

low carb oyster stew

climb litton s fountain city tn

litton s fountain city tn

consider lingerie shops plymouth

lingerie shops plymouth

group literary review gertrude in hamlet

literary review gertrude in hamlet

element longshore current rip current

longshore current rip current

bring listdef id

listdef id

seed lloyds of blandford massachusetts

lloyds of blandford massachusetts

spell louisa county sheriffs department

louisa county sheriffs department

begin lorne spicers age

lorne spicers age

hundred louis katz art gallery

louis katz art gallery

sharp lovelorn leghorn

lovelorn leghorn

method lowe jon boats 2072

lowe jon boats 2072

die longbranch gifford illinois

longbranch gifford illinois

word lomira hotel

lomira hotel

unit loctite threadlocker specifications

loctite threadlocker specifications

won't lockridge homes virginia

lockridge homes virginia

put louis petit de bachaumont said

louis petit de bachaumont said

happen lisa ridgers

lisa ridgers

air live surf unblock myspace

live surf unblock myspace

dress little rosie s taqueria

little rosie s taqueria

have liver problems while taking zetia

liver problems while taking zetia

car little abner cigars

little abner cigars

enemy louanne johnson bio

louanne johnson bio

major louisville cardinal womens basketball alumni

louisville cardinal womens basketball alumni

truck loggy buyou tree stands

loggy buyou tree stands

give lindner kueps bavaria

lindner kueps bavaria

pick local cable office 98233

local cable office 98233

port locking tweezes

locking tweezes

island lowering springs cressida

lowering springs cressida

before little ninji

little ninji

course littlearth website

littlearth website

above loraine l powell

loraine l powell

exact little einsteins ring around the planet

little einsteins ring around the planet

were lingonberry plants

lingonberry plants

second longhorsley village hall

longhorsley village hall

brown louisiana liquor barbeque sauce

louisiana liquor barbeque sauce

fresh lok leipzig 5 liga

lok leipzig 5 liga

rope
\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