From f762a94fdab90818a1db97375ee75f168271074c Mon Sep 17 00:00:00 2001 From: markusfluer Date: Tue, 6 Jun 2017 11:55:55 +0200 Subject: [PATCH] Fixed issue #12372: unsuitable and potentially derogatory CAPTCHA Dev: changed captcha to use mathematical quations again --- application/config/internal.php | 4 + .../controllers/RegisterController.php | 4 +- application/controllers/SurveyController.php | 5 +- .../extensions/captchaExtended/CHANGELOG | 16 + .../captchaExtended/CaptchaExtendedAction.php | 552 ++++++++++++++++++ .../CaptchaExtendedValidator.php | 65 +++ .../extensions/captchaExtended/LICENSE | 6 + application/extensions/captchaExtended/README | 65 +++ .../captchaExtended/fonts/nimbus.ttf | Bin 0 -> 106292 bytes .../captchaExtended/fonts/readme.txt | 173 ++++++ .../extensions/captchaExtended/words.de.txt | 5 + .../extensions/captchaExtended/words.en.txt | 5 + .../extensions/captchaExtended/words.ru.txt | 4 + .../extensions/captchaExtended/words.sk.txt | 7 + .../extensions/captchaExtended/words.txt | 6 + application/models/Survey.php | 1 + plugins/AuditLog/mdlAuditLog.php | 4 +- 17 files changed, 916 insertions(+), 6 deletions(-) create mode 100644 application/extensions/captchaExtended/CHANGELOG create mode 100644 application/extensions/captchaExtended/CaptchaExtendedAction.php create mode 100644 application/extensions/captchaExtended/CaptchaExtendedValidator.php create mode 100644 application/extensions/captchaExtended/LICENSE create mode 100644 application/extensions/captchaExtended/README create mode 100644 application/extensions/captchaExtended/fonts/nimbus.ttf create mode 100644 application/extensions/captchaExtended/fonts/readme.txt create mode 100644 application/extensions/captchaExtended/words.de.txt create mode 100644 application/extensions/captchaExtended/words.en.txt create mode 100644 application/extensions/captchaExtended/words.ru.txt create mode 100644 application/extensions/captchaExtended/words.sk.txt create mode 100644 application/extensions/captchaExtended/words.txt diff --git a/application/config/internal.php b/application/config/internal.php index 2685dde0514..e1814b25d1d 100644 --- a/application/config/internal.php +++ b/application/config/internal.php @@ -50,6 +50,8 @@ // yiiwheels configuration 'yiiwheels' => realpath(__DIR__ . '/../extensions/yiiwheels'), 'vendor.twbs.bootstrap.dist', + // 'CaptchaExtendedAction' => realpath(__DIR__ . '/../extensions/captchaExtended/CaptchaExtendedAction.php'), + // 'CaptchaExtendedValidator' => realpath(__DIR__ . '/../extensions/captchaExtended/CaptchaExtendedValidator.php') ), 'modules'=>array( @@ -81,6 +83,8 @@ 'bootstrap.widgets.*', 'bootstrap.behaviors.*', 'yiiwheels.widgets.select2.WhSelect2', + 'ext.captchaExtended.CaptchaExtendedAction', + 'ext.captchaExtended.CaptchaExtendedValidator' ), 'preload' => array ('log'), diff --git a/application/controllers/RegisterController.php b/application/controllers/RegisterController.php index 993685feb85..250c0d3ee9e 100644 --- a/application/controllers/RegisterController.php +++ b/application/controllers/RegisterController.php @@ -40,8 +40,8 @@ public function actions() { return array( 'captcha' => array( - 'class' => 'CCaptchaAction', - 'backColor'=>0xf6f6f6 + 'class' => 'CaptchaExtendedAction', + 'mode'=>CaptchaExtendedAction::MODE_LOGICAL ) ); } diff --git a/application/controllers/SurveyController.php b/application/controllers/SurveyController.php index dd7486ff623..4565deb2824 100644 --- a/application/controllers/SurveyController.php +++ b/application/controllers/SurveyController.php @@ -71,8 +71,9 @@ public function actions() 'uploader' => 'application.controllers.uploader', 'verification' => 'application.controllers.verification', 'captcha' => array( - 'class' => 'CCaptchaAction', - 'backColor'=>0xf6f6f6 + 'class'=>'CaptchaExtendedAction', + // if needed, modify settings + 'mode'=>CaptchaExtendedAction::MODE_LOGICAL, ) ); } diff --git a/application/extensions/captchaExtended/CHANGELOG b/application/extensions/captchaExtended/CHANGELOG new file mode 100644 index 00000000000..2c401770255 --- /dev/null +++ b/application/extensions/captchaExtended/CHANGELOG @@ -0,0 +1,16 @@ +Captcha Extended Change Log +=========================== + +Version 1.0.2 Sept 19, 2013 +--------------------------- +- bugfix: skip captcha counter incrementation if clientajax validation is turned on. Otherwise captcha code would be silently invalidated after entering as many form fields as the number of allowed captcha attempts. + +Version 1.0.1 July 01, 2012 +--------------------------- +- fixed client-side validation that generated incorrect validation hash + +Version 1.0.0 August 29, 2011 +---------------------------- +Initial release + +Please report bugs to lubosdz AT hotmail DOT com. diff --git a/application/extensions/captchaExtended/CaptchaExtendedAction.php b/application/extensions/captchaExtended/CaptchaExtendedAction.php new file mode 100644 index 00000000000..bd2b011787f --- /dev/null +++ b/application/extensions/captchaExtended/CaptchaExtendedAction.php @@ -0,0 +1,552 @@ + Yii::getPathOfAlias('ext.captchaExtended').DIRECTORY_SEPARATOR.'CaptchaExtendedAction.php', +* 'CaptchaExtendedValidator' => Yii::getPathOfAlias('ext.captchaExtended').DIRECTORY_SEPARATOR.'CaptchaExtendedValidator.php' +* )); +* } +* +* 3) Define action in controller, e.g. SiteController: +* +* public function actions(){ +* return array( +* 'captcha'=>array( +* 'class'=>'CaptchaExtendedAction', +* ), +* ); +* } +* +* 4) Define client validation in model::rules(): +* +* public function rules(){ +* return array( +* array('verifyCode', 'CaptchaExtendedValidator', 'allowEmpty'=>!CCaptcha::checkRequirements()), +* ); +* } +* +* 5) If needed, collect localized strings via CLI command "yiic message messages/config.php" and translate captcha related strings. +* +* 6) If needed, you can tune captcha modes and visibility options: +* - In "words" mode, you can place your own file [words.txt] or [words.yourlanguage.txt] +* - If needed, set the dots density [0-100], the number of through lines [0-] or fillSections [0-], font and background colors +* +* 7) Test & enjoy! +*/ +class CaptchaExtendedAction extends CCaptchaAction{ + + const + MODE_MATH = 'math', + MODE_MATHVERBAL = 'mathverbal', + MODE_DEFAULT = 'default', + MODE_LOGICAL = 'logical', + MODE_WORDS = 'words'; + + /** + * @var integer padding around the text. Defaults to 2. + */ + public $offset = 2; + + /** + * Captcha mode, supported values are [logical, words, mathverbal, math, default]. + * Default value is [default], which uses native frameworks implementation. + * Captcha mode examples: + * - logical e.g. min(5, one, 9) or max (two, three, 3) + * - words e.g. [localized random words] (supports translated strings in UTF-8 including latin2 and cyrillic) + * - mathverbal e.g. How much is 12 plus 8 ? + * - math e.g. 93 - 3 = + * - default e.g. random latin1 characters + */ + public $mode = self::MODE_DEFAULT; + + /** + * Path to the file to be used for generating random words in "words" mode + */ + public $fileWords; + + /** + * Dots density around characters 0 - 100 [%], defaults 5. + */ + public $density = 5; // dots density 0 - 100% + + /** + * The number of lines drawn through the generated captcha picture, default 3. + */ + public $lines = 3; + + /** + * The number of sections to be filled with random flood color, default 10. + */ + public $fillSections = 10; + + /** + * Run action + */ + public function run(){ + + if(!extension_loaded('mbstring')){ + throw new CHttpException(500, Yii::t('main','Missing extension "{ext}"', array('{ext}' => 'mbstring'))); + } + + // set font file with all extended UTF-8 characters + // Duality supplied with the framework does not support some extended characters like ščťžôäě... + $this->fontFile = dirname(__FILE__).'/fonts/nimbus.ttf'; + + // set captcha mode + $this->mode = strtolower($this->mode); + + // set image size + switch ($this->mode){ + case self::MODE_LOGICAL: + case self::MODE_WORDS: + $this->width = 300; + $this->height = 50; + break; + case self::MODE_MATHVERBAL: + $this->width = 400; + $this->height = 50; + break; + case self::MODE_MATH: + case self::MODE_DEFAULT: + default: + $this->width = 120; + $this->height = 50; + } + + if($this->mode == self::MODE_DEFAULT){ + // default framework implementation + parent::run(); + }else{ + // we hash result value rather than the displayed code + if(isset($_GET[self::REFRESH_GET_VAR])){ + $result=$this->getVerifyResult(true); + echo CJSON::encode(array( + 'hash1'=>$this->generateValidationHash($result), + 'hash2'=>$this->generateValidationHashCI($result), + 'url'=>$this->getController()->createUrl($this->getId(),array('v' => uniqid())), + )); + }else{ + $this->renderImage($this->getVerifyCode()); + } + } + Yii::app()->end(); + } + + /** + * Return hash for case insensitive result (converted to lowercase) + * @param string $result + */ + protected function generateValidationHashCI($result){ + $result = preg_replace('/\s/', '', $result); + $result = mb_convert_case($result, MB_CASE_LOWER, 'utf-8'); + $result = urlencode($result); + return $this->generateValidationHash($result); + } + + /** + * Generates a new verification code. + * @return string the generated verification code + */ + protected function generateVerifyCode(){ + switch (strtolower($this->mode)){ + case self::MODE_MATH: + return $this->getCodeMath(); + case self::MODE_MATHVERBAL: + return $this->getCodeMathVerbal(); + case self::MODE_LOGICAL: + return $this->getCodeLogical(); + case self::MODE_WORDS: + return $this->getCodeWords(); + case self::MODE_DEFAULT: + default: + $code = parent::generateVerifyCode(); + return array('code' => $code, 'result' => $code); + } + } + + /** + * Return code for random words from text file. + * First we'll try to load file for current language, like [words.de.txt] + * If not found, we will try to load generic file like [words.txt] + */ + protected function getCodeWords(){ + if($this->fileWords === null){ + // guess words file upon current language like [words.de.txt], [words.ru.txt] + $this->fileWords = dirname(__FILE__).DIRECTORY_SEPARATOR.'words.'.Yii::app()->language.'.txt'; + if(!is_file($this->fileWords)){ + // take fallback file without language specification + $this->fileWords = dirname(__FILE__).DIRECTORY_SEPARATOR.'words.txt'; + } + } + if(!file_exists($this->fileWords)){ + throw new CHttpException(500, Yii::t('main','File not found in "{path}"', array('{path}' => $this->fileWords))); + } + $words = file_get_contents($this->fileWords); + $words = explode(' ', $words); + $found = array(); + for($i=0;$ipurifyWord($w[0]); + if(strlen($w)>3){ + // accept only word with at least 3 characters + $found[] = $w; + if(strlen(implode('', $found))>10){ + // words must have at least 10 characters together + break; + } + } + } + $code = implode('', $found); // without whitespaces + return array('code' => $code, 'result' => $code); + } + + /** + * Return captcha word without dirty characters like *,/,{,},.. Retain diacritics if unicode supported. + * @param string $w The word to be purified + */ + protected function purifyWord($w){ + if(@preg_match('/\pL/u', 'a')){ + // unicode supported, we remove everything except for accented characters + $w = preg_replace('/[^\p{L}]/u', '', (string) $w); + }else{ + // Unicode is not supported. Cannot validate utf-8 characters, we keep only latin1 + $w = preg_replace('/[^a-zA-Z0-9]/','',$w); + } + return $w; + } + + /** + * Return code for math mode like 9+1= or 95-5= + */ + protected function getCodeMath(){ + $n2 = mt_rand(1,9); + if(mt_rand(1,100) > 50){ + $n1 = mt_rand(1,9)*10+$n2; + $code = $n1.'-'.$n2.'='; + $r = $n1-$n2; + }else{ + $n1 = mt_rand(1,10)*10-$n2; + $code = $n1.'+'.$n2.'='; + $r = $n1+$n2; + } + return array('code' => $code, 'result' => $r); + } + + /** + * Return numbers 0..9 translated into word + */ + protected static function getNumbers(){ + return array( + '0' => Yii::t('main','zero'), + '1' => Yii::t('main','one'), + '2' => Yii::t('main','two'), + '3' => Yii::t('main','three'), + '4' => Yii::t('main','four'), + '5' => Yii::t('main','five'), + '6' => Yii::t('main','six'), + '7' => Yii::t('main','seven'), + '8' => Yii::t('main','eight'), + '9' => Yii::t('main','nine'), + ); + } + + /** + * Return verbal representation for supplied number, like 1 => one + * @param int $n The number to be translated + */ + protected static function getNumber($n){ + static $nums; + if(empty($nums)){ + $nums = self::getNumbers(); + } + return array_key_exists($n, $nums) ? $nums[$n] : ''; + } + + /** + * Return code for logical formula like min(one,7,four) + */ + protected function getCodeLogical(){ + $t = mt_rand(2,4); + $a = array(); + for($i=0;$i<$t;++$i){ + // we dont use zero + $a[] = mt_rand(1,9); + } + if(mt_rand(0,1)){ + $r = max($a); + $code = array(); + for($i=0;$i30 ? self::getNumber($a[$i]) : $a[$i]; + } + $code = Yii::t('main','max').' ( '.implode(', ',$code).' )'; + }else{ + $r = min($a); + $code = array(); + for($i=0;$i30 ? self::getNumber($a[$i]) : $a[$i]; + } + $code = Yii::t('main','min').' ( '.implode(', ',$code).' )'; + } + return array('code' => $code, 'result' => $r); + } + + /** + * Return code for verbal math mode like "How much is 1 plus 1 ?" + */ + protected function getCodeMathVerbal(){ + $n2 = mt_rand(1,9); + if(mt_rand(1,100) > 50){ + switch(mt_rand(0,2)){ + case 0: + $op = Yii::t('main','minus'); + break; + case 1: + $op = Yii::t('main','deducted by'); + break; + case 2: + $op = '-'; + break; + } + $n1 = mt_rand(1,9)*10+$n2; + $code = $n1.' '.$op.' '. ( mt_rand(1,10)>3 ? self::getNumber($n2) : $n2); + $r = $n1-$n2; + }else{ + switch(mt_rand(0,2)){ + case 0: + $op = Yii::t('main','plus'); + break; + case 1: + $op = Yii::t('main','and'); + break; + case 2: + $op = '+'; + break; + } + $n1 = mt_rand(1,10)*10-$n2; + $code = $n1.' '.$op.' '.( mt_rand(1,10)>3 ? self::getNumber($n2) : $n2); + $r = $n1+$n2; + } + switch (mt_rand(0,2)){ + case 0: + $question = Yii::t('main','How much is'); + break; + case 1: + $question = Yii::t('main','What\'s result for'); + break; + case 2: + $question = Yii::t('main','Give result for'); + break; + } + + switch (mt_rand(0,2)){ + case 0: + $equal = '?'; + break; + case 1: + $equal = '='; + break; + case 2: + $equal = str_repeat('.', mt_rand(2,5)); + break; + } + + $code = $question.' '.$code.' '.$equal; + return array('code' => $code, 'result' => $r); + } + + + /** + * Validates the input to see if it matches the generated code. + * @param string $input user input + * @param boolean $caseSensitive whether the comparison should be case-sensitive + * @return whether the input is valid + */ + public function validate($input,$caseSensitive){ + // open session, if necessary generate new code + $this->getVerifyCode(); + // read result + $session = Yii::app()->session; + $name = $this->getSessionKey(); + $result = $session[$name . 'result']; + // input always taken without whitespaces + $input = preg_replace('/\s/','',$input); + $valid = $caseSensitive ? strcmp($input, $result)===0 : strcasecmp($input, $result)===0; + // increase attempts counter, but not in case of ajax-client validation (that is always POST request having variable 'ajax') + // otherwise captcha would be silently invalidated after entering the number of fields equaling to testlimit number + if(empty($_POST['ajax'])){ + $name = $this->getSessionKey() . 'count'; + $session[$name] = $session[$name] + 1; + if($valid || $session[$name] > $this->testLimit && $this->testLimit > 0){ + // generate new code also each time correctly entered + $this->getVerifyCode(true); + } + } + return $valid; + } + + /** + * Gets the verification code. + * @param boolean $regenerate whether the verification code should be regenerated. + * @return string the verification code. + */ + public function getVerifyCode($regenerate=false){ + if($this->fixedVerifyCode !== null){ + return $this->fixedVerifyCode; + } + $session = Yii::app()->session; + $session->open(); + $name = $this->getSessionKey(); + if(empty($session[$name]) || $regenerate){ + $code = $this->generateVerifyCode(); + $session[$name] = $code['code']; + $session[$name . 'result'] = $code['result']; + $session[$name . 'count'] = 1; + } + return $session[$name]; + } + + /** + * Return verification result expected by user + * @param bool $regenerate + */ + public function getVerifyResult($regenerate=false){ + if($this->fixedVerifyCode !== null){ + return $this->fixedVerifyCode; + } + $session = Yii::app()->session; + $session->open(); + $name = $this->getSessionKey(); + if(empty($session[$name . 'result']) || $regenerate){ + $code = $this->generateVerifyCode(); + $session[$name] = $code['code']; + $session[$name . 'result'] = $code['result']; + $session[$name . 'count'] = 1; + } + return $session[$name . 'result']; + } + + /** + * Renders the CAPTCHA image based on the code. + * @param string $code the verification code + * @return string image content + */ + protected function renderImage($code){ + + $image = imagecreatetruecolor($this->width,$this->height); + + $backColor = imagecolorallocate($image, + (int)($this->backColor % 0x1000000 / 0x10000), + (int)($this->backColor % 0x10000 / 0x100), + $this->backColor % 0x100); + imagefilledrectangle($image,0,0,$this->width,$this->height,$backColor); + imagecolordeallocate($image,$backColor); + + if($this->transparent){ + imagecolortransparent($image,$backColor); + } + + if($this->fontFile === null){ + $this->fontFile = dirname(__FILE__) . '/Duality.ttf'; + } + + $length = strlen($code); + $box = imagettfbbox(25,0,$this->fontFile,$code); + $w = $box[4] - $box[0] + $this->offset * ($length - 1); + $h = $box[1] - $box[5]; + $scale = min(($this->width - $this->padding * 2) / $w,($this->height - $this->padding * 2) / $h); + $x = 10; + $y = round($this->height * 27 / 40); + + $r = (int)($this->foreColor % 0x1000000 / 0x10000); + $g = (int)($this->foreColor % 0x10000 / 0x100); + $b = $this->foreColor % 0x100; + $foreColor = imagecolorallocate($image, mt_rand($r-50,$r+50), mt_rand($g-50,$g+50),mt_rand($b-50,$b+50)); + + for($i = 0; $i < $length; ++$i){ + $fontSize = (int)(rand(26,32) * $scale * 0.8); + $angle = rand(-10,10); + $letter = $code[$i]; + + // UTF-8 characters above > 127 are stored in two bytes + if(ord($letter)>127){ + ++$i; + $letter .= $code[$i]; + } + + // randomize font color + if(mt_rand(0,10)>7){ + $foreColor = imagecolorallocate($image, mt_rand($r-50,$r+50), mt_rand($g-50,$g+50),mt_rand($b-50,$b+50)); + } + + $box = imagettftext($image,$fontSize,$angle,$x,$y,$foreColor,$this->fontFile,$letter); + $x = $box[2] + $this->offset; + } + + // add density dots + $this->density = intval($this->density); + if($this->density > 0){ + $length = intval($this->width*$this->height/100*$this->density); + $c = imagecolorallocate($image, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); + for($i=0;$i<$length;++$i){ + $x = mt_rand(0,$this->width); + $y = mt_rand(0,$this->height); + imagesetpixel($image, $x, $y, $c); + } + } + + // add lines + $this->lines = intval($this->lines); + if($this->lines > 0){ + for($i=0; $i<$this->lines; ++$i){ + imagesetthickness($image, mt_rand(1,2)); + // gray lines only to save human eyes:-) + $c = imagecolorallocate($image, mt_rand(200,255), mt_rand(200,255), mt_rand(200,255)); + $x = mt_rand(0, $this->width); + $y = mt_rand(0, $this->width); + imageline($image, $x, 0, $y, $this->height, $c); + } + } + + // filled flood section + $this->fillSections = intval($this->fillSections); + if($this->fillSections > 0){ + for($i = 0; $i < $this->fillSections; ++$i){ + $c = imagecolorallocate($image, mt_rand(200,255), mt_rand(200,255), mt_rand(200,255)); + $x = mt_rand(0, $this->width); + $y = mt_rand(0, $this->width); + imagefill($image, $x, $y, $c); + } + } + + imagecolordeallocate($image,$foreColor); + + header('Pragma: public'); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Content-Transfer-Encoding: binary'); + header("Content-type: image/png"); + imagepng($image); + imagedestroy($image); + } + +} \ No newline at end of file diff --git a/application/extensions/captchaExtended/CaptchaExtendedValidator.php b/application/extensions/captchaExtended/CaptchaExtendedValidator.php new file mode 100644 index 00000000000..49d122830fc --- /dev/null +++ b/application/extensions/captchaExtended/CaptchaExtendedValidator.php @@ -0,0 +1,65 @@ +getCaptchaAction(); + + if($captcha->mode == CaptchaExtendedAction::MODE_DEFAULT){ + // default framework implementation + return parent::clientValidateAttribute($object,$attribute); + } + + $message=$this->message!==null ? $this->message : Yii::t('main','The verification code "{attribute}" is incorrect.'); + $message=strtr($message, array( + '{attribute}'=>$object->getAttributeLabel($attribute), + )); + + $result=$captcha->getVerifyResult(); + // remove whitespaces + $result = preg_replace('/\s/', '', $result); + + if(!$this->caseSensitive){ + $result = mb_convert_case($result, MB_CASE_LOWER, 'utf-8'); + } + $result = urlencode($result); + $hash=$captcha->generateValidationHash($result); + + $js=" +var hash = $('body').data('{$this->captchaAction}.hash'); +if(hash == null){ + hash = $hash; +}else{ + hash = hash[".($this->caseSensitive ? 0 : 1)."]; +} +value = value.replace(/\\s/g,''); +".($this->caseSensitive ? '' : 'value = value.toLowerCase();')." +value = encodeURIComponent(value); +for(var i=value.length-1, h=0; i >= 0; --i){ + h+=value.charCodeAt(i); +} +if(h != hash) { + messages.push(".CJSON::encode($message)."); +} +"; + if($this->allowEmpty){ + $js=" +if(value!=''){ + $js +} +"; + } + return $js; + } + +} \ No newline at end of file diff --git a/application/extensions/captchaExtended/LICENSE b/application/extensions/captchaExtended/LICENSE new file mode 100644 index 00000000000..5d5e8b2aa8b --- /dev/null +++ b/application/extensions/captchaExtended/LICENSE @@ -0,0 +1,6 @@ +Captcha Extended is free software. +That means you can freely use it for private and/or commercial purposes, +modify the code or use it in third party application. +You are not obliged to retain any copyrights from original author. +---------------------------------- + diff --git a/application/extensions/captchaExtended/README b/application/extensions/captchaExtended/README new file mode 100644 index 00000000000..51691892505 --- /dev/null +++ b/application/extensions/captchaExtended/README @@ -0,0 +1,65 @@ +Captcha Extended +================ + +Captcha Extended is an extension written for Yii framework. +It enhances original captcha code delivered along with the framework. + +Features +======== +- supports modes: logical, words, mathverbal, math, default +- supports extended characters latin1, latin2 (utf-8) including middle- east- european and cyrillyc characters +- implements masking elements: dots density, through lines, fillSections, font color varying. + +INSTALLATION +============ + +1) Unzip CaptchaExtended.zip files into ../protected/extensions/captchaExtended/*.* + +2) Register class paths to [CaptchaExtendedAction] and [CaptchaExtendedValidator], e.g. in components/controller.php: + + public function init(){ + // register class paths for extension captcha extended + Yii::$classMap = array_merge( Yii::$classMap, array( + 'CaptchaExtendedAction' => Yii::getPathOfAlias('ext.captchaExtended').DIRECTORY_SEPARATOR.'CaptchaExtendedAction.php', + 'CaptchaExtendedValidator' => Yii::getPathOfAlias('ext.captchaExtended').DIRECTORY_SEPARATOR.'CaptchaExtendedValidator.php' + )); + } + +3) Define action in controller, e.g. SiteController: + + public function actions(){ + return array( + 'captcha'=>array( + 'class'=>'CaptchaExtendedAction', + ), + ); + } + +4) Define client validation in model::rules(): + + public function rules(){ + return array( + array('verifyCode', 'CaptchaExtendedValidator', 'allowEmpty'=>!CCaptcha::checkRequirements()), + ); + } + +5) If needed, collect localized strings via CLI command "yiic message messages/config.php" and translate captcha related strings. + +6) If needed, you can tune captcha modes and visibility options: + - In "words" mode, you can place your own file [words.txt] or [words.yourlanguage.txt] + - If needed, you can .. + -> set the dots density [0-100], + -> the number of through lines [0-] + -> the number of fillSections [0-], + -> font and background colors + +7) Test & enjoy! + +============================= + +Please report bug to lubosdz AT hotmail DOT com. + +Thanx +Lubos +29/08/2011 +Bratislava, Slovakia \ No newline at end of file diff --git a/application/extensions/captchaExtended/fonts/nimbus.ttf b/application/extensions/captchaExtended/fonts/nimbus.ttf new file mode 100644 index 0000000000000000000000000000000000000000..309c0a23364459a01a1e69e1dc8551a1e1bb7b4b GIT binary patch literal 106292 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�&v^Gs7td`5G;r!=|z+mo{j#^z+r=`KlGkX<-8 z+C3(_E+xz@-0=o;f%%pDPSq2g?9%BVNr`+h1| zltWxe1Je0I?x2L@SZUHcTnhujf#Sn*YBTk-YKuCnnrGA%b&hIo&P%Mx%xTL_sL6ES zIku{4PHo}Xs^(dBh3z$&xlQ?rbs4$Mc?pc=DAyzIA`{DbEG0MtQIdF2l1K_xl)6R! zC=;u?iTl!XC7=cBRvB=iS9^6pNYQtc(t^%e^6nBsm)z}%VtYqBswQxZG z7!AZ*l%mz)95FQhD8rv;Dps#vZ4$e>zR!rjkz_|m zW2%v^n&aG*dQjVn^^zYZf9fuCmTB$UG-bsl7cZUS{*M15bADSJxX=G%^Hcv0bFzQ7 z>66*%4SeX%aBt8YqIjUh!^6p8Wv2v%zHzj~?HvsF4n|m1j)c-tKr9d={3}{en7GS$ zKz1HTEAf`kZ4HYr#{NQNIJZRz3i{WOk5iT=l~EZ2l~2;uQj+n9u0QZU!*R2I_=A5p zlZu%zF7TFTj&j%pauS~#Y;zJCu4MBzCVF2YJh2g;n6E;ZZjZ`hD&QfNKnP#fanZeG zh%cl6i=x|_+{{-E_ZSV-08OK5d2nPouMY8R(_~7^m7R{jP>JWZxoMECo8NZ$J3AN| zSZjDhcH@Z5HEM|Yn;-74oC}|&zIe_^oHh-=QK8JyHf6HOMgILDZL*+EHnhn~vQ0Kt zxP-G$G|8C0({XhDVc+e)lcxCGjUj0py>A7^0^>5_t@W0#!$G@LCpR44PUWlN z)>@#cg+4b6@;1lXGxTi%#sKYrzN1av(dxX&*T~y^6IzdS z<0I0#w0zhQ9L84oOC6g?du$G4XMA&i<*+d`t~0P(JrVdNl2eOq$@fK~t%-`UrD9#A zRuMs#s^Q4z20TEVrhgBy>6~G!HiEVQPvE}-e|Nv*eia*h8=eAaENYk!nn%Vr5&BIk z7B8NOta?ihjpted*TP7z`<%`F^0<}{6mWfvO116Y!RcOK3D-)2wqmxM#`;08hS* z(8y4cUlI*T7A>S^m_2Aje_*jfiRDg)#LSh$0c!-J?T zF_n<-TvBEGl7L43TtrcNJk_z0*v_njGY2Qpf?3|d*>H*YULn@iC}$$8DvQGMBskplBk0A!5huLf_+l+dFV$1($#usXlknh!;~#vm=;oVmalh{0=HF({FlX%VHDk;e z|D!xhR4=Gw*xw`2D5}pZuKtdC$RKdJaodXWh}%|^X^J+U;uuqLf~oR@%XJo^gZ`dk|UMa(G6vv1+JFc2E&+Y*|I*wiNo2u6ec5 zwl@LA=o#3Ufa1u?J?DM5{aF(>$2)eysv&1wHru3EmW0f zne_0MTGL`bE7N?-f2KTbqw_S8{}&+tpT(HBlevVU=EMfkWX-sdrhOiekp#eGpw){) zRroW>`9a|-aHkfF%sR?^(&e9P&hkJ1G_*<%+~mI7{R#Yef-9J6ial86bi2aAVEAA( zBSw|vNMunA3`GEL+k^NB6w;5*?vRT;ywU z+?p94-jnk@953h~@1Ije;(b>#OY=(ilSvWeSCUmKOZ8M}n20^?BFCds^co@crw}5f z@Qx)!IPR_SqCJN_l9ef%k9fY?XWpQFBnizqHRX|SRWiP*C^IcwEG6Q*HQKm0)JM0k^6!P&oN8bQ=gZ8wXo*Mmq3_T4;5_4i3+;jkTA4UgY`NmOg(Xep9 zBL~JXL6IIAil$O2oPGOpX#sD8dL@BPo)~>*y2Jug;z68!rI?rjVtG3C3!GvyX*imo zE&?UWxjIQuJm(S(%}FP}1z*8}HRQ+dNk!5~6>Wn^7ib&oqF#eZYBNsu`V#nxm^d=+ zydJbKB2suyOR*eetUALHX14#ch=1=(jWFh+rStdSGr!y2^0$3!D<7Y}?uGr|_|w*{ ze{$%vgucW|)Yb4>3y4Xg6gy;1j{}M@_@pFgG!P+2^hiNNbr)j9FcvE)-i~sCrb1W# zyWQNm|3mYs{{(YouyzM~k&NULs-(p-OH*A}9BJzY<4IfaoD@Y#_70{%MSO1)0cxW7 zQYC1`-cD$+OwGeHqt3Gu8iZ=xL7g|IRck4EQgXYcdNO(5#CEyM;=HA)58kOtKoFR;{a}A*Z?(=rnic zcM8)zwTYT0sAfb*!vc^Jh8jI9b`@V0wiWf<^hw$^EKfs@)1fuCt@E+BX;^aiwgOp! zrp2+G+L~0^eQco>6{<21IgSjgR>%grXl8TqjLPP#3ZoX8vpakDOwNi5TXTAX>ByLQ z$q(mLo1t2SO$`&xr0&j9t&-+m9Kq|NH(6%~3Lcivu6IyLDytxO@@t zW43>1wIuN?izk7X;>%`p=^AHRPOgRsSY4m0L>=iL|b z?pW7~pfsazwT>u3Be>0R>^9hPG}LzkvKLbA*(OS)cQDGUdjXeafa0z6nh=8_V&6$F zb(i?BSh3ukxnhNx#uD*UfSrgKXEDAkRfev|>U%ucMp&{y4K@MaPuw ze`$y}%lH3vQvFfeDq{VYnzOA>P(1@G!{?c~m|JD$1~$1LhGx31tSkvSSw%dyv<7wo zkZ_Jp96Ce>VvgEoQAb9$7ojXNSe`|2M;f)QMCB|f73KKpE?F^U{{ClHbThG$+nCy$ zoK@6LTM}JMg4Ta#Hk%K2O(!HR0F@;QHl8>h}LuSFyBNOL&46=zp`TdBhyW&5i*QgIX%k`sd^ zdy75GnPg6tEW1t26=@GfHK~k-#}$IGiwg+C&i)Xua(THlNEi?QncqLOV*ha~9#R?+ zHUICPRKXUjnca2{lfh-5 zaafB*#wugA)57Vc?icoNptTP%uvTNG!3?hK^+&TV7t?0(ZMxWM^^tltIRcvQ_BeGM z?A0V$U~R7^sO^LG&kj2y*Lz8O|!_iUau>+{}!5%}l-Rv!bxxaedD|esopV z#M1i5-CMi;f4?I;_q0j%-Q!E^dMYz4S>BUPpW@Uz{&Gi_7ZJen&~(Vfv1Tw`wczTB z6dWX(&-Pr-l6;2;Od6fFnaY@D@>q=7sjSEO3BM4TL%GD`(p@;XFJDdcig1uM@CC9Cf zRVAkR;+A5|5r&Z0pyxwGX%X2DGsWwnt<^ole~mdMc~yPqQm-+lB5~#Deb;xdI=TBw z|A)oL#AZ~j%H2G%(#+|;X>2Z2&6LjGw{*kad)M`u;_21hv1Y?$)=E#{4bRUww`3Es z@NJhbomN}6M#pQelt$VThVsUs6Obes^MIq-kYibmB{bp=ClgCmWtM*3Hk+8?E>VpYrt-`c%QvN;KWEMT3&(b+ zWzAbu=36q(Oucek*{U%|UopO7U8^HeJ=oiH^>N#;Ta%MECCa^JiTUlhGf(>IQPmq~ ztp3F;6drDJs;mA(H9L66*`AS>?*J6A1W@>sE#PSHhiDO^{xO#Ch%b#Er2`qPq67_p zvizfRf{F=WUYu+dBBaYHO#H;*8QDe;YeZ^{HRe|To9j*To~HQlG3~3&%;o5CN<@Vt zb?8jTrNyHbjUBhY(sY=kO3T_>%SuJ!v8uP^viFkNke;dEpC^(YHi*w>G-GWEDUve1 z3K0K4%UCMfonn3~0UC(6ko@qDGESIt5fZgH*_Q)oLM^+CFAFchY`g>!I<0))SVZNN z=A_f{YEt#opf*&u#w4qLKx<2rTE$S2I_5Cv%=*om4LjTOSB;r>b!YMU=~-LK62oUD zXLW7uD2lrQ|G&9~RqFp|{-bO2q@~}VUU}A(m1gd|_=ue7f|!`j?BeA7gz35Ec>i7A zkZL>s!BKHeFps0JOhkuWCl*G@+o8n~wAZEdyo{dLsNhxW9jx>ElDL)(5P=dxr*L{* z2owRuNl3ibIuSLc9j4=}LtPonHV^x?G@K+iB#}L7?M6c;?v4N=xigqID+UL-SRf8) zz+)O!nzN0_shtCrM`%Rlg~n#AQfQJ#vrSr(T#M-bx}Kg{Ici!@th=ge=1s>nWoLPe z$%xEqKJJpb%#4`0!ir1Wab@LWk1i>inmfLx#x$j*CK}`R#1y1Nr24PO$tWy|H8E-M zHlfzJP)oIdj%0$mRvaFo2APz!-!N*&+tnar;0y^8djc|jvG})knbwyG1(@SUcy_xA z0++eT9m!6eF8Nff=xSdg4-`^cZkIud$BWN+oS>lMQ#EBl9Wlyf9AT^jhuAa3`!W@J zs?Oe_upMCOxW#0uhQ6&ewKYWbCk}lXkr4}LqxtKZ*yUf}b;q-}yE9@ZMwtzjb^hji zHg3Ep&Ybb>GV`JSJwI35_B!e(#d+@ za2LFkY@x}~iqID)R#H4mEzOlFO|LA?G)-;kO)Z3#w3SAh-}F4V_I>}plV9w4@nrwL z_t!q?j{EhmKlATLvtQE|D^rwYTP6xJpIL9km6bzsyMhS&R5_g4n)Prr)5NRX6CK(EHWEPYR+!SX^-mhge1@E%ZaSaD}8oOTO$5{k-cXX#mp@C zPA>~DU+Cn_@+Kyi=Q;EEJ;q@Ky_3%71N2T%n$VvRy%QH?sRs2#Lc}mZl z>xj=e-t5``f!X6ni(utGeb0TrYMqGYwxf@2ty9SR4qxkJHONPPq=Oq3)I8aZ8m4)& zTR35u-YKNH?)!s!Ct2%%gGQ=%I;hQV)y>5)KQ*n0dbmr76r2ltFH2BQ&8g{xMU!Ba zHQ)dEF`t_hCZs#=@yB&0@@zOt;3J}u9B#E?H<)CL! z)YD-@0a}SRpJ7B~`Kq?*I@8m8yU8v;p))>Qq7}`9e?4~l{QG8#yhcCWWwanJLKZnb$-nw;l??v8=V0HfcOc(E6>wf^p z-0SW4n%8-+o`G#%VCj~yVWaJIQq$S3uoDfls}P><1f$up(-1){3}IqoMZM(E2F0ba zTtX{2+T*8}&J6vmm;c>yfBozJ58ik~=IF zoe&vD{_8Tg^nS{Vh4`?2Rt0|dxx^?Rf!}?I&%LwrLJ#cyjwZm`gE*rc!tY+fkiN?A z-Z`NO3#vTG@4oA(v8Ph7DeF(REC~ej25lTa2W?m;~P$@lg=$x-} zE;#rR^e8gOTZ6l*3lWOw8_>}H>X2LZ*W}VpbH>%ZSL+sQ9^~Ct)|EKky^ME@KW2re z+x;D49-5I0|LE+xvJVBzOeJE37!A|_wLm8@4j2yv1w<<|v$)xma=8p>23mktU@FlO zsxa5cOa>}gk7^7OVLQ;l9+5mahJoRzoo_DZ={YLZPxbHTcDY`w%e`znA+U=)0> zUQeP8-oZxZdx&(|rP8GdZYDB{6_t=A#Olrvw=~)ErRe1~oUEk+M+5cQawJakPVEU- zHl!b8>L*RBOGxgiZp{^GinmC@=if z%EliTgfm9T%!eo4GDgH@DQ~LJYGF zbdFeQ<+l)D;AkLT6|KmV)_*7iyI7^;x?ornS*OT27KbzsF;A1pq!G-0WDD5DxBqMx$!t0OBxiZ+)CBpc<}@iK%}ZBT(W1#S;yj7qMGdL9UU39tGD-txz&V< zK2jBBKHmSquf2uUN+Y=UdgY=ax-yy};))Y@VrBRkQC9|u*sVfzWn3T;MToA93&P?@ z(3M@Xqj&!ky*qm6m8&`39 zQ>%6K7c;;FqaF?K?lrOBcqq+1t$NIN&Rr8_dJ>Y)H4o0&YpzO6URs|&XL|CYSRA=@ ze?Nu3#c9;@bs;C-K|O=%tc|DD307YRQ&n-QT0P0R7%KS64hV-NPEJCjHTg$S@{!aE zlB_aG8Ixr!52JVCKm-sOPx=!TRygtpBdD#wr(pj$xuphsDB81Kb{9YD4fgTRh)_;1 zW!h;+jYsC7jHT?~FWdb+E2Ota-p{YmL-Zjka*W)egF7=qPh<_*J0%fQ*!+glWE3$% z#Q^#U&L%}nr1GKhvE7C&b`v@=Y?M~)d>qP3JLm7aze$;TrZ&`pSW73#$q`o5nMO*`% zXhJ73Dv6CC0-@TfOY-Hg59R`dq{1N@@JzLFUg$2=5j&53V>s%kYzJeA! zbnn?ZFjjny~gKN3l-# zm=Ee2hM@`fdRgG=ULWdi=s0NDvo0io9-bLKoZ_IOcu-?~aJ(~cGxU}5!~zYxvP{w; z>S|v_y72U3Pw9~RhDY>d&Lj(o*LSlk)d9ewtI-?dJDRT&|$Gc;+7%nDM%4<&4~5}&3K}&FXYeJde*lVvqLjkqQyz9 zyENOlC&ygdjyeKe%!~d%;?vQ%`~sUId+)R;a;IaFFk=s*hH<g2(Smz6G_g4Pm z-LWW(0W>MX@|S=bmdBASc=0+~yAjvKo7Vd;lRVCrTMJ&=_|CbHmJH5wc>ATiU9z#V z>krpB!EGE(jJRRNTSxvc^9f5lzyZr-mR8Pj{K8Cy6#jT}|LyKxOpf#R`#jfQCv8w~ z5YJ`MJIyuTp};VIkRjJ^JMI%r7h%t6Z0aRMED?wHjA0HV<)MyWj`xUvQfR?3+n3~D zY}FgQum}H$Ev$lAIdO?JZmj{%f6f#Soz|g&GL|={GqG*28iP|Hrf!jEl&$>)ekzd(eoM z2WJoB$T_0@AvVPRpcSl4!A>5B%7b16-%6j{XteXg-J~0oaBEO`G*2I^| zZ&F?&A1D9{Rq!k?wKk)JqQErbK@vn!P;Jpmk=;2(YtwsUSC1aEd3@CYRe__!o_~FF zdEEJz*QKrLIx(dB@A29BveVeQe8y&h?mUwjp&h!zu&VgG2l`Q&POK5He9B$d%GJQW zK!vMc@51?y-aDGVc-Eq0?X@H`#|>r#4dB;P#b%bT8k=CNV*j}O+WEK7u;2gxx<>SW zcxHD%_>Y*`!gD(gm8HgqK9r&Rxs z5}=)hEzOrFC|6L>Jj#jJ(PN4^n7Hhqye5YNECRPXvj4JWLuZ1;iIcdBpx#v zC5ESFApG4n0c6 zCSKWsRm3KWCK3^%?Apn}FwR65R_yHUoiXFgpA<%7GWUNveojtCW_3bT+Osoebj>y= zWfh8<{Cvr@DjBqJGv{PmC|Q)!pb7f(WULZW&?IQelEYpGLvCeQayD@s`RoLHj#Tfn z#~0yNg60rzJzigqc*FvEKmkykt8$#=e^GB(G4_*_BZ6@bI?QH9nl}p7FZQ9V%vSH5 zvW8bIpV`h1FKH56#XHs&-s=6AB-?9t<(LjH{gG@)acY&RaBU5p^YLi&696#^f9%9w%VcwUTOa9>`0c?<^s5nb<%A|`kNM%{p@qDJKCFtpxpV+(HI`=oNx7a@R!}rypcpufGhS=CFiQDn5h}KheDoa^xK3#w5{R{TB zH9z%FAB}vobRH7Awm^#Kl z%kQN;Tq3qGqK5Nj5DBJ%3pZ)|s zW3Q9`q`0tm+0i$;f7m;oWy*ARJSP)~twB*gHb+Zp8IMBuJ4YUubhe4IFgG<_mQkkYhk1W_d!cF=j?)3B40a2wc|zVWWC2rhh~QflFVILpmdXlbxO;FXUEc( zj-Kh$hd5`ad9JRm>tvg6nw_#A{{L+?pmBCz!tD8sR_c)RG_Gwv`*>G{v5*>>*3Q?8mh>q?{ zR#>Dm&k>~>42ZO)DEIxWokO;fgNHb%Mj%}{QBppv!Q>6#+@;>CL60iiZ;{i8l`X(& zBZ7w*_J>4Xr;RO^xwJ_nNb|b7)geB9~*y4?ECf51q|{v6RF7*$(6H2gY9hk7QhD5qA;;z5GpMB8BPAudsb|_ZUyS0h31F<4bK}EA<6R( z^aT@(zzfQyj&-tIf31i~HDyWUk#(l~>Y&Mr70c%De|T8Xr0VJ1W1wEFi`M)Do@sV2 zCug^^i!V86(vh9hj&|Ia#5v7gXVuE7Xp3z(#s+{2llV)UC6z^K@aH`=uvAxTYUEAL24r6aq zuQk!F%H}4nBU<#--qOS=$PC((DdNQ!-Eq$sCuYMy)e^YN{cY@|Wv-P$c@-0o6B%nI zIuI8>c#Q3nLHUPVE|3r3a_=qiI$BN%hzl)8SBBOGs8CCt8Mz*v1U?QGq;v1`8&lT4 zerw%^+_NWj-_hH#q37JI7MjA8Jb#$kV!E2UPH8JJg$o+H&%dlS|D3)H{&jiR(&FmL zEs=}cs(R|+w8J8I{%`0beIDkiLZ3CG4tDQkSAlDT<7w~}IdzBymT@LWe4f{rMv9bl zAOmB#rc0LWZrPTVen^YM;*dq+_)rubBJU2tt>OdOq^{de5}x78rq!VVEQiX-ASxusQbo5kK4-eK;4e#NIN~?9D9s&nyu!3Pa@Q43Bk40lg z8V zFzcsNNC}a{F-RqrVORx{%Sc_DYGn@~b--|6-^z;e;z-Mu);h`rLUz#Gd&lYyT9lG! zzVM&pY@mzm4fO233x{u@PG1Z*L+K0I{)hU4)z4@9J%{vzZGr^)zF7FJ=2LM3$|RD& z33sK?b7BS^0g^KgyCWBw+|fO&N_#U_*R)jp%g3~9Z#ig4I{ZE;(6%Bn=X(ngJ zsHtlj7!O2CF6oGs(rkmAb_Nww@P`0Sm_Z3rQpL*Hh%Kvd4Mn=Qu60n9vztsSr(8j z!)EMcc;+yM&&-xAdH!1uV-!94l0nZu_RwQ#(ZINO2Wf!yaEJz#jHjI?Af*3{rR2pP z@`JKfED}&b?}aK~(R;BXXEM}TK(-F|5fI=D?f?7cs|Vk`Tl;^(A*TSnwj`m|$O-Ap z=aUat7D`oFh?o(r8t6-5aMOVdAX^5R1L+~fpxi@@Y=U|XabSSJ>0FpLP=?l z(~E8%N95^FO86m9_wP|IJk-&By42%wJV4LZwvg*{xVJs~LC^y(HjYFwJ1Fl^%{&zSg3WZCY3*j(G`vgO80t}L z?U9@{G(V_)qIp?QG+sS}SQ#GlM6+H_G`LcdNMzsOB1sjwVEw=9&5~e(sM1{ z`u*b;Zdhrqi#~C}g3U9$5pK_Zf8z1ukKR19&i%?c#+-DsBB`+j%SSyv#ycr~OtQNlBd%;($-^j${`jkKY4l%aF#WD|WdQva})ta`K2>Z`nR*@J+>c%Hx=jRkItw?m|22)Sn*;W4O#YNFe zOY6GMDveuQ?84W}9v_?H)$Fpz{9{xf9Hk*pRo=lGFKK#wm8^tnU^Gz2ia7j1am0+n z8XW(dItRaEh}@T1GHAFxQoHSuDkn0Qe*Yt*HCU=C^$BjR^bU@qmJj_c2P%LnyWd|m zn2uavzG_hK(9RxuWX+paKP?&cHe}Q?B1LPYkN-&azrhOaBOR>v4vzL}|3+E;^VL{= z{OaU@PA3m9N#M_=r(c#S(0#5gCt8-@-Na{C5yMDMqklq-_F$!Y%#V`ZGM}Bn)Cpay z9X`AeZl}+O5z74s>F}4tbDMwF{yK4C)6omWq8D)N#dfM=>tGkHxmN8Odxq3Ip;?0~ z*#n)}ubce)?0~QJU0rZ(D-z;t^i3D_J^*)?NC=M|iMCqbm^hUAdw49GzSCAYL@_sF z0Xsjxp$uVY3y2I6PlaGB{P#=W?S@>X-3+!xcZvnFQ-rqV2D>d)Blq75fs=~zguor} zZX#030fz$qjl`sw1d#pypY7POBlz~;K#9wizZ!hI_)%1|s^awwdts1cex;3f(5iGt zsJNAG!j==9!}$@LfHT#x*$guQJCiNc6nwibqfmRWeH{1Lw!Gb(%2UV?uqkL~{8G#C zP(}$W)2viq5CsF(7ev9J^5J0{j{1xp1*Jc*+PV&)E2m_!BqGtoNE$EWkjH&}kAKmbk0eVj zN&lz4Ljf~)TN6gIkUVKF$|FEVLaFSy8FQDzVbq7na|8PD3td;ce!?oRP#M+QQGTP> zFAhkKdngG{uO^-HK$En51}`)}0i7Y2k^S@$229-imdp!0piZqLoy9?}YNJwH%k z-f&y(xkB4BORrn^TkYAS?Fqf#YR_fb9_xPf0<)k0s6KzRJSXsi_#au<1HaSjv*G(g zUSt2W-iVd{ZxNk-7S0Dj2Rrp*fu?v#JxLbkH9>2?l^EEL!;|_Dlx#`@l7SS!Iv*%k z${fm6N8FaAE7S}*ajFoqH05>%I}OXr)^KEwJ&v`4btyW+!U6;u*dvbHTN>!|7u|MSq6xINS0kulmFc+YhsbE8IS{wCMU-8Zto zY<~3*T)kGWe!=wVhvg~>=H=KkO(Aca)t!1YpkD@W=YwX?XBg@w>%># zV-;Cas^;-=M)PH5%2E~f=1yO}#F&Q3=QiiAoEMYUnV;#uV+Abh*>hX+7SxTKSie5i zZE8!p-Nwqb9p;+MOm9^GDNE;lja?y59HXMh#u5$00G3(DIX)5IM#QtEGr@UB^J&~Vqs@tmGPJ4M_6W4oc>$Yvx7MeCAujA5F2`~6|-&ix3Wch zDV!*hp0@Gxxt<4W5auTX7uzB3bTLfNfDmurYIrPQ@&=+?}Z)xe$5(L(PZ6l z$J#6L30-lTeIxJ!QP2TTGEt4GXqN44X_0i;>AZblloDi?LxUBYP-9o- zGqzB3BBL)huU1E^q4~RsN_V^i=^^_{$gY~pz5zsA`vwEyVL;4@=N{c_?l|u}Q)A67 z$1^n-{;~Ry{9_pJP(4bJcW^$(RSpG|gnfpv4~Zl_H2X*&nSC79Iwvh_b#+?L*o<7* z2XkdnUqaZlqH5tDU0Kn}Js1tuMnMtH4QtCa>iMke*%tPpjqN{7#3E&g2m=urOU8v?Jp|V z4AnI$*IX-H6I~N`YqXWU_HNg;*Q(boZLmoE7tWPEe}P_24^+F4*15VBDM2z$P^*Qf zBm`1Th4SyMk#BHyq3)QrS26My@v3$Ng-VNd3OkAWaPmA$?1yz~b4oin#Y%O~q4cyY z(surgU?!MosX!7XC`=+A!vzf$Wg9AUk*q34)1qgsU|gXImrP5`mMvdwZh5u4`_(T0 zZDy%#t*-dM8?OEC8;Ko$G&I)MsfL&vC%NLqd`x~X&2keg+bOZ+5)oMlSQ)aNL@k(N zDL3krrS}CRAe|l}rmKfDDeTygZ0oj@wpRjkLqo15;aFily)6(llx=E+8uEm3YfK5r zL?pUg1526+E=iLz1?l!?Roc>Lrcdu#z`u;F?8M6a#j$3(nSANgtFNAVY1i(G2v1m7 zOMY3=fNcMC%t6t^QJs;Yck7HiMP{UR zH~!Y1TdWyr#^{WM3-ithnBp&Ox$hyB`;aKPuKwfp48B9}$B&%r*6Cem@B*2^a$+`| z?p((0eufhg-oN4>EyY9NZ6qdf+v5|>)@eme#3M8%0EuzznHu414-mptXa-b?*?}|5 z)YITq!i$B{R%Wa8%98XS_jGm5%E-;k%I`3bPF=hxD>8hVX_3n6@HEe#mCI+Lzi4so zb@^&(RbA6yL(^a*-ltaHE*jy{DJRaWR!X_#0uEq68BkvEHhGUr`I{CM60KAim&1W9 zpoShy4lgh4Qu!@eV z{&G;W*baKB%)=j@oRI~5E(D6=nHDNMN?~0m7q6GZx+O|OGJw^4dBm_X*OFFY6i`Jb z{Bq4jSD{)&rzEY^7;Lsk>g<-9bG@>K@&T2@Q{{ToGs2roOVXOW%7x_bJca9=h{Z+XQ12v za#)z>UVe{4Zn6Fu=5si-C?wJWxm@TeR?inum?m~XA)1MiEPq=?HunH)V?*e&1DInMDfO4RM z`_~Kbj9Ph)LXGPv&&PZZUkqTL`_HZhU@@PUP;73AC&pF7?>&6)1ZI?VPmOE7XOe3+ z*XQu}3hrI1KmY7n&gTZcm(Jh%_*~!_bY<{UAfD@aJZGYz&HT(X|G~3s$U*mXXj-ee9 z{7eSYfI>6ZHQI#Hm$^K5hHEz8*~Gm<_Z-*v1Ks?LwLxe%#r1Pn1NSuW`8a+q1^ReS zoII1Zf6ny^0p7XLoz1-~SaHwknALM{qkNB9b2<=B|5tJ?16T&60pUO%kO-U(6ae#p zN^?};S$?(y%(}qGd_UHlrsL>>)&=}N+N^VpVxCBUSMW|3&rgBgqxg9~^p>$YG+5&- zV?8w9GUg+I%mLm(wQJXO00tEZ@N*e`6Z+4WdEkJ|gOPy0FISNHVL?6ZwC0J-l>=dy zHD94e}2Dmd`!eO7lOv(x6M4dzWh|*JX{Bxku~TahsK{ zaX>1NHo*%d-axH^OQS;oFabG9U4QzHD?O8o^e^`{O$Ne+qk3z#TcZ{pc+zIWL zxC;1P$J{fGxh`~T<2qpc{Hz5|2I>I$p8P(MzscCV>+0lZn&)chCp=*?e~SX{0v-jP zbG5sF!p~9G{qB$WT*$aHhdoniKRlK((KW%mIsu51=Y)-M^>{v_z1Ex;zC1_z%FiBY ztG<`EYa3`UV?0^rrtnDqu5;0DTZjBEZPe?#siiu~6~+5y4z$Yql?KPV!uT2G{4Qew zEu@{+JYp<(MhCy!KLekc4+8$+?^e6I!pdmh7rfv8UHT?%4F04)(k{Li&-Iv)pBem~ z?1|v}$MF4&*mJ&cO*`nP@HZJN`=`(>q^(xloOe6VkU1yo-~P#bjupPi?@L0Tcb zFIYbr(+sMVWCY#>z5w2L{~Pn?Oy&V}WFEZ0PZ|69<~o}{9nfz2Z}m&YM0kt!GoI)7 z@x4jTPmk>3?4$Nr3ExfeybCQp5Usb!HW@FujOVd9mn-_i8e&)z1HS|(D=rJ%!{_ON zx4_+jSHXROec%O(7s5efT#Ly!5W|_o4PHjxgc#Shz>mQ@^}GFw2f&H0n80J;w7`wv zO@Y61k}2Z}Nv^g4>KIph;LqR=^rcCz&cJuU+X5egcj`U;iU+{SJm>e|v;Z?gpOebx zKci{Oq$R1YoPcC{O$^)(PF9>6c!QCn?gD2*-7K!W ziq~&i;6K1}C7UZRA+IC`E(a$oP7C~&&*_1`fipP2=kWYn!C87|cHjv<=LEh0=juKA zfqx}abXwq#V0mUPe|;X?kh~?2@9qcZ(B?8|^>c6{Z7XvnalH(h$>$3CRYo1RXTe^+ zTjpvGyZ~aRdp$v;-7`ThkDPwMY0-h0g7d#6sc^UKM zzrekEeW6}o6p+)*;=qgGC4o1=%L31VPYFB@UPtfB7{^D!H*2fz*7iK4ZFpGmFBLzc z_;0+WoSE|`*vot3AE8eYmkKzHvck6TZ zD!xbYz2FMo@&b4??XPgv@!ksF_z8F$Ev(>~^4EUF1B&m~zwQNB^4sM&wO!A7fqRTBP@ErwvuE>-G8$=35nQkf-%4-lcfA;ysE7 z6yL3Hc}kz~wBi>Ozou{eSfBO@xSGCy25w_4s_FG(;11?(HT``Eyp4HS%^T&Oe#N^K z?^e7=@c_71>0itJFY;NaUF#A$*FlFrfh*{H9dlT)m$gvmY7IOEZe#V0^}Bl&Kc(M#LGj1>txp6SH{Y#iHLV3F1uh25N~)&~ ze+5@FM)kBoKDX+fZGjv3JO-NALjn2R5%@Q7XJ9LM5$~<1C69tP1x^QVqs{fMo%+mv z#RH0OX3p2sLV5CD#rG(_SMhy{ACkAw!cSd|%oD-Mipv5Y^SJ_QH_}2scq+585&fwf zybTIBLIJscJuA8q3d{ZdiU$UaAU?^3*5@gBtkitpBz?^S${ z;(Ha}2Oa}8UI8bwUyPye&w%H%uZ?jXt+)p{d<<=tD>84#@J6|(U-53mdlV0V+j-je z!AWqQcAhDp^8-Hv7bq?Z+{@<*W=^|uiFW4L6MSx^U+wfp{II67M%tm_zk_GNE!&~t z=iu(ZZ@_)Dxt%%oSMV|Z)R)<{gTi5colTeuit{pcuNQUdIMa|9P6N8Z-HgD zbkMI<@Kk8hLBC!A&w|<=^eX@sZrnk?{svy8SmeeI`t>XDI(pqfzvPWq>D#v>Ep*T? zdBRS8Z@=PQigzpCqj*5^-P)49itkZ;uj2c_W9iZF!4<5Uv9$Rw;AUq2SY6j+Y3(z7 z?uMRYY1`}IWr2smcXMYaG`R+xguK@YP2_VvbFvef`~X}QxEWkQFFK)#U@yJsgeHFl zw;`!@@)o&s2J@s7n%n`N!+h)HjXwhS(DzQ>`wQ@5TG9zkwt&|mC3ZrSe(+U#&vtFY z^?^INvQyvNuXvZ@-HP`p9#DL@wq&p3dlcWR_&)GB-t|0q8RIpDUOWJ9V+Kxv-f`eg z_|FvH?gQ`CzxFF008eF4d;@$G>t!m>c@w;ZQJc!sUPV$|3=f>fmHpslaJeqmY~`cXQ7^J};ry-AdSi`cw%dw^R>3H=q z*7DvR?7w|Fc74!R+VhO!XBEq6_PPGX==Zr^)3&{?_zlG$>k~dv{Hfy4zzd+>-@&rC zF646noDaWRNUsIA^2UYqU9QhyEEc+E>z&=qx`jH{3u%x1^=ZW~D1J@v{8;b#1iXkR ze?mWn!i%Bs2VkKvJ!fSt=3RoPGHQ#V@Vj7{V~e5c``~V5iN(yZkHOpZ%Jq8XDZT$` z#m^{yR`K(SUr;QwZn5ii#cwG7Sik#;;!nX#Xw_rjBwD_NR>@~+6*@P?A`2~{RiA=I zB3eSLJ_Czfw1ifD4&Dxhm*^NRff{nZ$UI9J9l_5keqOOiK}#4NdCu#K-%uHn>N1}87I*<~Uq<`)fv?v)pVDtVt@s(m&nkXi@e7LOG_;KN3w}fK z$NIES6n_d{3y=LBxQ#iymK{40+`$=sExbG&ye;q`c&FaeuXq5wo^L%4ZbMR9j|BJw za0gnN_3-Bl!Q0r;*7Gg7r(f{^cq8YO0&p8=`Hg(*esBl-=|;YF8+aRk-NciB3vR;` zeUr9l6Ya_2b0=JS6Hopbc&FaeuXq4_Hs5*-+!nY9+>R`FHc$Q;xD(m(Y`*myut<^A;x`(NyeIO~p<|ZNHv{!oi}c*vWqSELb!ZJ5^J$ zllR`rXVFyb6{HZ{GtJO~p>tRP1DwKjgD$Dt0o;AAvz5g zJ89L6V9`MMtrd{r3s5=qUQNo&DO*er>0m*21|i?d;cf_G>%)wVnOi&VFrY zzqYeq+sRH&JNvbr{o2lcZD+r>v!6NnE`OEQ_G@eVwYB})+J0?qzqYntTidU#?bp`! zYioCD3wLSTc4^yoY1?*b+jeQ&c4^yoY1?*b+jeQ&c4^xrwkF&qIyS-5yWRSP-TDNq zo5*#$^$EN63A^uC&VW)|PQ~G_0e#wlK5amsHlR-%(5DUP(+2cu1NyW9`)M*O29(+ZO6>uq_JC4* zK&d^T)E-c34=A+PFfEGOc- z^+bF(EqMfA3Atyl-m_Ql*{k>L)xX}O*YDBm_vn>-^$I5mo_4QZxlga$r&sRND-Xf( zUU5AHuX_zF=bDG;sRt~ln}_st^AJ0{T#?hw!+QV2djG?E|HFFc!+Ph#dgsG>=P&iI zk0^c$I=tz63Of83SY*7X^~%$F}r%4=MC&-EHtJ_d`V z$1cYe_7<+Zp;tbJ{vRQMiNpf$*Uusue#~G0j!Y)kKhf)-=#@|P3VRWEeyUeK(3-TcRdL zJsS0S^pxmj(VL@p$0WtPA6pXpqd0fmg1B4bUXDLD{s-}oCZr_HN;os&u7tM}7bf17 zRFrgUa((iu(s2@WY=f^ASX4aH|ICGwYi&fZ^`{r?iYEjc_-$*k{_0Tdj7-t?-wj9 zj4UiDysGf6qPvS5i@S@zSNxme7mGhFIj`jX(x}qz(nm^PDr+vAUv_rc6XlKN3(9Y* zc)GH$a&6^>l{Z%Ytn%^7Pe)~q>KJv)sJE&Ts%BT6RCQj}8`U>dKR$Zq=$C7HYny9( zYq!*XTKB#B3H9Hq|7E?up|j!YhR+)>ZG6GI(fef6q^8@N6PizKexN0*<;<2RTYFkR zY^!fu)V8_p&bFtknkByx+_V1mmJ3kn=b$s6VdnTMc;g=KZ zCSEr2GAspm}n;na7g&6&1m+UH%TPtTkF@Ql(K z-lE;?LUHTu(PFogOzHa$%R*YJ4`O3DH zH?RELF?q)vwIa+;ID;m!A65Z=818 z%G0)-_M_9@IX&)l@9B$A-*Wo%XB>aVx6j!B&G2uY_RX`u`Q0;P&RlrrgJ;E`b=z6b zZfx7QZsXpKA8zX0Gy&T(_*-vZ(RjtiD=xm`-YeeTHgnt2+ZJy-VcRL&Zr}Fql@(VWd*yeoyyMCbzJ2ah z5m&9h>aD8_ukOD3wyQtBrudpU*YscW()P2re{yZzwZ~k$wbFOYuDFZ zf7yFt#*TA$T(V=^j_Y>ZxZ}G!p4#!!4elFaZm7P&dqc+!n{W8{ohdsP@BHr0 zH~ZWA&+C7!|D9cncOAQH&90|*Pv3ps?tj_+(TyE9Zn^PyH$HLW%QwDr<7a!^dt&xv z>?zrE*`Bus)(`BvX~9kR-MsFWh+77}llPtDzVn0ce0J-cTNmAW{H+gvH}AVUZ;QKa z^KGAgukw4|@2&fP8aos4Hi|2b&wuR5#Bx%uat2ru5)x>FZfQv==vak-n?M{VB$R?8 zujP$p$;eWI18sn|l%r5u?jDpgSh1aya)d&-?;8q*a+RBKhMTq=32%3wMhd0hSL?Ip z&Gmk7Rx_))G`s4!RU@m`UA5a)D~HApT|BgU==z~Mh8`JucIb_vkA^l?TdO-%Cst=v zE7ixU&sR58Kdx?Com>6f>J7tFhZhfb51%*u{>apklSj@PxoG6dkw1^DAGvpQ^60gr zw~anH`t;~4qZ>y*U*lP`&6-7P$E>Z=ErwRpWI&kIYtm^XWA7+}9Y#A!I>=}HzYF`l ziT;Jy=)Bu9sJHb2xwcH_%7GT+9Jxsxfe9=(i+yN)&=7DnaVQiZmg6Os zX(y;Wf@MkT`rRxy(f*18%gxT74BJBcx5VS*)g11jJps3p1!x{iF}9tq?AqzduAQ#z z+Ud%!ov!TK>B_F1NjeL#pL&xe`t?VS?!{%H(S8UT3(_cQ8tr)7mws3AZE5^;MeUbH zPp=#NuRI#fH<)6;(OIC_DfDlLETjLtL+m4|K(v_@lVpCL;w+J+kQ_;aWLFRA(CGZx zE_#{tU!yIcusntIQb?Ne*!lYDRV0FKf0At1Xl~m_FF&nPxDxGNrg6R{`pD*rqq&3h z6dZ|mPg0ppB3DRThOUR8aeX&Q25~Lty6jIn|95`v8~HWrv)eWVi0>ym{y!_esYTFu z*CcD~Ygr^)HPSVMv_(kTvNW}_v=gaT5|J$S50#efRxdJ;bl;y0&Dn z7Ne!i0V`L~rjW4A%oqFn%tCplmZbdoyp`2*`N9640WH(jWp>%w7G&~fua>s*R)2qS znKm^!O$+#Z{^|4<5Ob`)C6xiKBU2dA+QmFGSIK8e;;`7sX5BWpRx-o1SL{CE`dR zDc(X#ya$N4#YPz7L-CRLn9d=5pS~+@pppAI;uGs-4@HGB`XYeeZ!}E9n|HO-U2`}Rnyo%TG zI^MtryotB)Hr~Ozcn=%#K0d&Q_y`~46MTx#@Gtxu|H0?@0$<`QY{F*xnunCKNjA$d z(j!~sR&uOtm0sB<$I0=Mo)IOtk=x4c{-zZ@%Lj(^;|#xpAFaq+jf$XkA=q#``i^vZif*w%FH~sTtx1w#=@%u3>G5 zHY93mZ}iM*@U+Zjo%0$3+h#R*S~^*ACzm+mUZD(oyWH}aj?-$^tu;A8-Ysd~O;>Pz z1;;n8xJ8LeZrp(5v<);E;VC=mX#ikfr^*(&RyfI9S158@xglpuhRrwGwYb2&4T;+F zjh;e-r=`frOO1gQ)>YvmmK^Kaa*b&$H?FOtA&{z5shBA@8QN(w6}q9nx#C`Ldrf{GDTjG$r!6(gt^LB$9vMo=+=iV;+d zkYa=sBcvE1#Rw@zNHIc+5mJnhVuTbUqH;u3j)=+;Q8^+iM^srARaQlnRrC}d{*0o^ zs;FW_6(gz`QN@TVMockciV;(cm}0~fBc>QJ#fT|JOfh1Lp(}>27`kHUilHlpt{A#v z=+Tx+!SaQCN?TZI3oC75r7f(qg_X9j(iT=0hn2-)WpP9?B7UZ(YF9f_WBEg2H!iGF z>opD3ayY%;SF_UZQ#pM#EB(Hjm408%O24mWrQcVx((kKT>G$bOty$#vE0!K~<6=p6 zQ|ub-rfa2WusP<&=>c|GhaO@-mr{?gpFan^mXGbx;~bx0mu=A52Ayrt({6m+$1Y#t zIP>Gok262c{5bRD%#Sla&ipv@Jt@|c z;&P<894XeDs@1Gms20N|Niiu^BXLPmT#^)*#9#{yw!mNu47R{v3kym_2ATbEmt>Z`jo zt3;3C^fNrB<9KJ)(|dDuxpkJx(3(@C_uzU8Z%kv&ksrn#@AZ zGuKsHbc@hYSK=M0%T9&&N8HQkj|7|N+eVgcBRgH|Dz4M%YOA=~7S=U*mp90Z8sx#c SJSJZ(. +nimbus.sfd.gz was downladed as NimbusSansL-Regu.sfd from + + + Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development; + Cyrillic glyphs added by Valek Filippov (C) 2001-2002 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + 02110-1301, USA. + + + +******************************************************************************* +Bitstream Vera Sans +"vera.ttf" - A "verdana"-look-alike font. If you want to use the real Verdana +font you should upload the verdana-normal ttf file from your Windows system +(fonts/verdana.ttf). +******************************************************************************* + +This file was downloaded from . + +Copyright Holder: Bitstream, Inc. + +License (t3lib/fonts/vera.ttf): + +Bitstream Vera Fonts Copyright + +The fonts have a generous copyright, allowing derivative works (as +long as "Bitstream" or "Vera" are not in the names), and full +redistribution (so long as they are not *sold* by themselves). They +can be be bundled, redistributed and sold with any software. + +The fonts are distributed under the following copyright: + +Copyright +========= + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream +Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute +the Font Software, including without limitation the rights to use, +copy, merge, publish, distribute, and/or sell copies of the Font +Software, and to permit persons to whom the Font Software is furnished +to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, +OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT +SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font +Software without prior written authorization from the Gnome Foundation +or Bitstream Inc., respectively. For further information, contact: +fonts at gnome dot org. + +Copyright FAQ +============= + + 1. I don't understand the resale restriction... What gives? + + Bitstream is giving away these fonts, but wishes to ensure its + competitors can't just drop the fonts as is into a font sale system + and sell them as is. It seems fair that if Bitstream can't make money + from the Bitstream Vera fonts, their competitors should not be able to + do so either. You can sell the fonts as part of any software package, + however. + + 2. I want to package these fonts separately for distribution and + sale as part of a larger software package or system. Can I do so? + + Yes. A RPM or Debian package is a "larger software package" to begin + with, and you aren't selling them independently by themselves. + See 1. above. + + 3. Are derivative works allowed? + Yes! + + 4. Can I change or add to the font(s)? + Yes, but you must change the name(s) of the font(s). + + 5. Under what terms are derivative works allowed? + + You must change the name(s) of the fonts. This is to ensure the + quality of the fonts, both to protect Bitstream and Gnome. We want to + ensure that if an application has opened a font specifically of these + names, it gets what it expects (though of course, using fontconfig, + substitutions could still could have occurred during font + opening). You must include the Bitstream copyright. Additional + copyrights can be added, as per copyright law. Happy Font Hacking! + + 6. If I have improvements for Bitstream Vera, is it possible they might get + adopted in future versions? + + Yes. The contract between the Gnome Foundation and Bitstream has + provisions for working with Bitstream to ensure quality additions to + the Bitstream Vera font family. Please contact us if you have such + additions. Note, that in general, we will want such additions for the + entire family, not just a single font, and that you'll have to keep + both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add + glyphs to the font, they must be stylistically in keeping with Vera's + design. Vera cannot become a "ransom note" font. Jim Lyles will be + providing a document describing the design elements used in Vera, as a + guide and aid for people interested in contributing to Vera. + + 7. I want to sell a software package that uses these fonts: Can I do so? + + Sure. Bundle the fonts with your software and sell your software + with the fonts. That is the intent of the copyright. + + 8. If applications have built the names "Bitstream Vera" into them, + can I override this somehow to use fonts of my choosing? + + This depends on exact details of the software. Most open source + systems and software (e.g., Gnome, KDE, etc.) are now converting to + use fontconfig (see www.fontconfig.org) to handle font configuration, + selection and substitution; it has provisions for overriding font + names and subsituting alternatives. An example is provided by the + supplied local.conf file, which chooses the family Bitstream Vera for + "sans", "serif" and "monospace". Other software (e.g., the XFree86 + core server) has other mechanisms for font substitution. + diff --git a/application/extensions/captchaExtended/words.de.txt b/application/extensions/captchaExtended/words.de.txt new file mode 100644 index 00000000000..e351f8fcb77 --- /dev/null +++ b/application/extensions/captchaExtended/words.de.txt @@ -0,0 +1,5 @@ +Nachfolgend finden Sie eine Liste sämtlicher Zeitungen mit Aktivitäten im Internet. +Mit Hilfe der nebenstehenden Gliederung gelangen Sie von jeder Zeitungspage per Klick auf die von Ihnen gewählte Übersicht. +Falls Sie auf unserer Liste ein Blatt vermissen oder überflüssig finden, können Sie uns dies gern in Form einer E-Mail mitteilen. +Sie können uns auch gern Ihre Erfahrungen bei diesbezüglichen "Reisen" im Netz mitteilen. +Sagen Sie uns bitte auch Ihre Meinung zu Online-Zeitungen. Wünschen und Kritik stehen wir aufgeschlossen gegenüber. \ No newline at end of file diff --git a/application/extensions/captchaExtended/words.en.txt b/application/extensions/captchaExtended/words.en.txt new file mode 100644 index 00000000000..bb80e1c1baa --- /dev/null +++ b/application/extensions/captchaExtended/words.en.txt @@ -0,0 +1,5 @@ +North Carolina and Virginia dealt with widespread power outages, flooding, deaths and damage Saturday as +Hurricane Irene continued its northward trek along the East Coast, with Norfolk, Virginia, and the Hampton Roads +area next in its sights. +Nearly 1 million power customers were without electricity in North Carolina and Virginia because of the storm +Saturday afternoon, according to state and utility reports. More than a million people had evacuated from New Jersey alone. \ No newline at end of file diff --git a/application/extensions/captchaExtended/words.ru.txt b/application/extensions/captchaExtended/words.ru.txt new file mode 100644 index 00000000000..ea2360d5b32 --- /dev/null +++ b/application/extensions/captchaExtended/words.ru.txt @@ -0,0 +1,4 @@ +Невыполнение Россией контракта на поставку Ирану получило дальнейшее развитие. +Исламская Республика решила обратиться в международный суд. Некоторые эксперты обращают внимание и на то, +что стали пробуксовывать и выгодные проекты в нефтегазовой сфере. +Ситуацию для "Правды.Ру" комментируют эксперты \ No newline at end of file diff --git a/application/extensions/captchaExtended/words.sk.txt b/application/extensions/captchaExtended/words.sk.txt new file mode 100644 index 00000000000..8e8302393c5 --- /dev/null +++ b/application/extensions/captchaExtended/words.sk.txt @@ -0,0 +1,7 @@ +Prichádza výťah, nastúpite, stlačíte trojku, kabína sa zatrasie a zastane. Neviete, či ste sa pohli, len si utierate pot z čela. +Vysoké teploty dokážu časť výťahov vyradiť z prevádzky. „Bolo tam minimálne štyridsať stupňov, ak nie viac. Za tri minúty som bol kompletne spotený, je to taká malá saunička,“ hovorí Bratislavčan Martin. Vo výťahu bratislavského bizniscentra na Lazaretskej ulici strávil v pondelok desiatky minút, chcel sa odviesť jedno poschodie. +„Našťastie som nebol na medziposchodí, čo som ani netušil a mohol som vystúpiť. Dvere sme vypáčili násilím.“ Profesionálna záchranka prišla asi desať minút po jeho vyslobodení. +Dodávateľ výťahov limity priznáva. „Definujeme, že výťahová šachta by mala pracovať v teplotnom rozmedzí od päť stupňov do štyridsať,“ povedal Peter Ondrík zo spoločnosti Schindler. +Teplotu má zabezpečiť správca budovy. „Ak sa to nestane, môžu nastať nejaké poruchy, za to je zodpovedná stavba,“ hovorí Ondrík. Výťah by sa v extrémnej teplote mal vypnúť, nie vždy sa to podarí. + + diff --git a/application/extensions/captchaExtended/words.txt b/application/extensions/captchaExtended/words.txt new file mode 100644 index 00000000000..403b8c9b407 --- /dev/null +++ b/application/extensions/captchaExtended/words.txt @@ -0,0 +1,6 @@ +We choose to do "Hello World" testing mainly to achieve our goal, i.e., to find out the minimal overhead of each framework. +Many people complain that the "Hello World" application is meaningless because a real world application often needs to deal +with more complex tasks, such as database queries. This is not very true. In reality, especially in a large scale Web 2.0 application, +we often encounter scenarios that are very close to "Hello World". For example, an application may need to respond to an AJAX request +that should return the current server timestamp; a page has a large portion of its content being cached and an application just needs to +fetch the cached content and display it. \ No newline at end of file diff --git a/application/models/Survey.php b/application/models/Survey.php index 1c5a8783bb6..0bb630ba707 100644 --- a/application/models/Survey.php +++ b/application/models/Survey.php @@ -1247,6 +1247,7 @@ public static function transcribeCaptchaOptions() { return 'N'; } + /** * Method to make an approximation on how long a survey will last * Approx is 3 questions each minute. diff --git a/plugins/AuditLog/mdlAuditLog.php b/plugins/AuditLog/mdlAuditLog.php index 9ca3da835a1..e3774cb8926 100644 --- a/plugins/AuditLog/mdlAuditLog.php +++ b/plugins/AuditLog/mdlAuditLog.php @@ -25,8 +25,8 @@ class mdlAuditlog extends LSActiveRecord { public static function model($className = __CLASS__) { return parent::model($className); } - + public function tableName() { return '{{auditlog}}'; } -} \ No newline at end of file +}