优化CI框架,使其更灵活应用

1.优化$this->db->count_all

vim system/database/drivers/mysql/mysql_driver.php

function count_all($table = '',$id = NULL)
{
	if ($table == '')
	{
		return 0;
	}

    if( !empty($id) ) $this->_count_string = str_replace ('*', $id, $this->_count_string);
	$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));

	if ($query->num_rows() == 0)
	{
		return 0;
	}

	$row = $query->row();
	$this->_reset_select();
	return (int) $row->numrows;
}
2.修改Email类,中文标题会出现乱码

vim system/libraries/Email.php
//修改方法_prep_q_encoding中的如下语句
$limit = 200 - 7 - strlen($this->charset);
3.使CI的session保存在memcached中
http://devops.jiunile.com/dev/18.html

4.CI模版引擎
http://devops.jiunile.com/dev/15.html


5.新建一个my_helper.php方法,然后在autoload里自动调用

vim application/helper/my_helper.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if ( !function_exists( 'uuid' ) )
{
    function uuid( $more = true, $admin = false )
    {
        if ( $more )
        {
            return uniqid( md5( mt_rand() ), true );
        }
        else
        {
            if ( $admin ) return uniqid( "zzz", false );
            return uniqid( create_guid_section( 3 ), false );
        }
    }
}

if ( !function_exists( 'create_guid_section' ) )
{
    function create_guid_section( $characters )
    {
        $return = "";
        for ( $i = 0; $i < $characters; $i++ )
        {
            $return .= dechex( mt_rand( 0, 15 ) );
        }
        return $return;
    }
}

/**
 * @name    获取cookie
 * @access  public
 * @param   String  $name
 * @param   Bool    $flag   TRUE解密字符串
 * @return  Mix
 */
if ( !function_exists( 'gcookie' ) )
{
    function gcookie($name, $flag = FALSE)
    {
        $value = get_cookie($name);
        if($value)
        {
            if( !$flag )
            {
                return json_decode($value,true);
            }
            else
            {
                return authcode(json_decode($value,true));
            }
        }
        else
        {
            return null;
        }
    }
}

/**
 * @name    写入cookie
 * @access  public
 * @param   String  $name   cookie名称
 * @param   Array   $value  cookie值
 * @param   Int     $expire cookie失效时间
 * @return  Void
 */
if ( !function_exists( 'scookie' ) )
{
    function scookie( $name, $value, $expire = NULL )
    {
        if( !$expire ) $expire = EXPIREDATE * 86400;
        $domain = '.'.str_replace('/','',str_replace('http:','',str_replace('www.','',base_url())));
        $cookie = array(
            'name'  => $name,
            'value' => json_encode($value),
            'expire'=> $expire,
            'domain'=> $domain,
        );
        set_cookie($cookie);
    }
}

/**
 * @name    删除cookie
 * @access  public
 * @param   Mixed  $value   cookie名称
 * @return  Void
 */
if ( !function_exists( 'dcookie') )
{
    function dcookie( $value )
    {
        $domain = '.'.str_replace('/','',str_replace('http:','',str_replace('www.','',base_url())));
        if( is_array($value) )
        {
            foreach($value as $v)
            {
                delete_cookie($v,$domain);
            }
        }
        else
        {
            delete_cookie($value,$domain);
        }
    }
}

/**
 * @name    输出js
 * @access  public
 * @param   Array     $js
 * @return  String
 */
if ( !function_exists( 'output_js' ) )
{
    function output_js($js)
    {
        $output = '';
        if(!empty($js) && is_array($js))
        {
            foreach($js as $v)
            {
                $output .= "<script type=\"text/javascript\" src=\"".base_url()."assets/js/{$v}\"></script>\n\t    ";
            }
        }
        return $output;
    }
}

/**
 * @name    检查手机号码是否正确
 * @access  public
 * @param   String     $value
 * @return  Bool
 */
if ( !function_exists( 'check_mobile' ) )
{
    function check_mobile( $value )
    {
        if ( strlen( $value ) != 11 )
        {
            return FALSE;
        }

        if ( preg_match('/^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/', $value) )
        {
            return TRUE;
        }
        return FALSE;
    }
}

/**
 * @name    检查邮箱是否正确
 * @access  public
 * @param   Int     $value
 * @return  Bool
 */
if ( !function_exists( 'check_email') )
{
    function check_email ( $value )
    {
        if ( preg_match('/^[\.\-_A-Za-z0-9]+@([_A-Za-z0-9]+\.)+[A-Za-z0-9]{2,3}$/', $value) )
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
}

if ( !function_exists( 'getConstellation' ) )
{
	// PHP根据身份证号,自动获取对应的星座函数
	function getConstellation($cid)
	{ 
		// 根据身份证号,自动返回对应的星座
		if (!isIdCard($cid)) return '';
		$bir = substr($cid,10,4);
		$month = (int)substr($bir,0,2);
		$day = (int)substr($bir,2);
		$strValue = '';

		if (($month == 1 && $day >= 20) || ($month == 2 && $day <= 18)) 
		{
			$strValue = "水瓶座";
		} 
		else if (($month == 2 && $day >= 19) || ($month == 3 && $day <= 20)) 
		{
			$strValue = "双鱼座";
		} 
		else if (($month == 3 && $day > 20) || ($month == 4 && $day <= 19)) 
		{
			$strValue = "白羊座";
		} 
		else if (($month == 4 && $day >= 20) || ($month == 5 && $day <= 20)) 
		{
			$strValue = "金牛座";
		} 
		else if (($month == 5 && $day >= 21) || ($month == 6 && $day <= 21)) 
		{
			$strValue = "双子座";
		} 
		else if (($month == 6 && $day > 21) || ($month == 7 && $day <= 22)) 
		{
			$strValue = "巨蟹座";
		} 
		else if (($month == 7 && $day > 22) || ($month == 8 && $day <= 22)) 
		{
			$strValue = "狮子座";
		} 
		else if (($month == 8 && $day >= 23) || ($month == 9 && $day <= 22)) 
		{
			$strValue = "处女座";
		} 
		else if (($month == 9 && $day >= 23) || ($month == 10 && $day <= 23)) 
		{
			$strValue = "天秤座";
		} 
		else if (($month == 10 && $day > 23) || ($month == 11 && $day <= 22)) 
		{
			$strValue = "天蝎座";
		} 
		else if (($month == 11 && $day > 22) || ($month == 12 && $day <= 21)) 
		{
			$strValue = "射手座";
		} 
		else if (($month == 12 && $day > 21) || ($month == 1 && $day <= 19)) 
		{
			$strValue = "魔羯座";
		}

		return $strValue;
	}
}

if ( !function_exists( 'getZodiac' ) )
{
	function getZodiac($cid)
	{ //根据身份证号,自动返回对应的生肖
		if ( !isIdCard($cid) ) return '';
		$start = 1901;
		$end = $end = (int)substr($cid,6,4);
		$x = ($start - $end) % 12;
		$value = "";
		if ($x == 1 || $x == -11) {$value = "鼠";}
		if ($x == 0) { $value = "牛";}
		if ($x == 11 || $x == -1) {$value = "虎";}
		if ($x == 10 || $x == -2) {$value = "兔";}
		if ($x == 9 || $x == -3) {$value = "龙";}
		if ($x == 8 || $x == -4) {$value = "蛇";}
		if ($x == 7 || $x == -5) {$value = "马";}
		if ($x == 6 || $x == -6) {$value = "羊";}
		if ($x == 5 || $x == -7) {$value = "猴";}
		if ($x == 4 || $x == -8) {$value = "鸡";}
		if ($x == 3 || $x == -9) {$value = "狗";}
		if ($x == 2 || $x == -10) {$value = "猪";}

		return $value;
	}
}

if ( !function_exists( 'getSex' ) )
{
	function getSex($cid)
	{ //根据身份证号,自动返回性别
		if ( !isIdCard($cid) ) return '';
		$sexint = (int)substr($cid,16,1);

		return $sexint % 2 === 0 ? '女' : '男';
	}
}

/**
 * @name    检查身份证是否正确
 * @access  public
 * @param   String     $number      身份证号码
 * @return  Bool
 */
if ( !function_exists( 'isIdCard') )
{
    function isIdCard($number)
    { // 检查是否是身份证号
        // 转化为大写,如出现x
        $number = strtoupper($number);
        //加权因子
        $wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
        //校验码串
        $ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
        //按顺序循环处理前17位
        $sigma = 0;
        for ($i = 0;$i < 17;$i++) {
            //提取前17位的其中一位,并将变量类型转为实数
            $b = (int) $number{$i};

            //提取相应的加权因子
            $w = $wi[$i];

            //把从身份证号码中提取的一位数字和加权因子相乘,并累加
            $sigma += $b * $w;
        }
        //计算序号
        $snumber = $sigma % 11;

        //按照序号从校验码串中提取相应的字符。
        $check_number = $ai[$snumber];

        if ($number{17} == $check_number) {
            return true;
        } else {
            return false;
        }
    }
}

/**
 * @name    加密
 * @access  public
 * @param   String     $string      明文 或 密文
 * @param   String     $operation   DECODE表示解密,其它表示加密
 * @param   String     $key         密匙
 * @param   Int        $expiry      密文有效期
 * @return  String
 */
if ( !function_exists( 'authcode') )
{
    function authcode($string, $operation = 'DECODE', $key = SECRET_KEY, $expiry = 0)
    {
        // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
        $ckey_length = 4;

        // 密匙
        $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);

        // 密匙a会参与加解密
        $keya = md5(substr($key, 0, 16));
        // 密匙b会用来做数据完整性验证
        $keyb = md5(substr($key, 16, 16));
        // 密匙c用于变化生成的密文
        $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
        // 参与运算的密匙
        $cryptkey = $keya.md5($keya.$keyc);
        $key_length = strlen($cryptkey);
        // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
        // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
        $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
        $string_length = strlen($string);
        $result = '';
        $box = range(0, 255);
        $rndkey = array();
        // 产生密匙簿
        for($i = 0; $i <= 255; $i++)
        {
            $rndkey[$i] = ord($cryptkey[$i % $key_length]);
        }
        // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
        for($j = $i = 0; $i < 256; $i++)
        {
            $j = ($j + $box[$i] + $rndkey[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }
        // 核心加解密部分
        for($a = $j = $i = 0; $i < $string_length; $i++)
        {
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            // 从密匙簿得出密匙进行异或,再转成字符
            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
        }
        if($operation == 'DECODE')
        {
            // substr($result, 0, 10) == 0 验证数据有效性
            // substr($result, 0, 10) - time() > 0 验证数据有效性
            // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
            // 验证数据有效性,请看未加密明文的格式
            if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
                return substr($result, 26);
            } else {
                return '';
            }
        }
        else
        {
            // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
            // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
            return $keyc.str_replace('=', '', base64_encode($result));
        }
    }

}

/**
 * 产生随机字串,可用来自动生成密码
 * 默认长度6位 字母和数字混合 支持中文
 * @param string $len 长度
 * @param string $type 字串类型
 * 0 字母 1 数字 其它 混合
 * @param string $addChars 额外字符
 * @return string
 */
if ( ! function_exists ( 'rand_string' ) )
{
    function rand_string($len=6,$type='',$addChars='')
    {
       $str ='';
       switch($type) {
           case 0:
               $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.$addChars;
               break;
           case 1:
               $chars= str_repeat('0123456789',3);
               break;
           case 2:
               $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.$addChars;
               break;
           case 3:
               $chars='abcdefghijklmnopqrstuvwxyz'.$addChars;
               break;
           case 4:
               $chars = "们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书术状厂须离再目海交权且儿青才证低越际八试规斯近注办布门铁需走议县兵固除般引齿千胜细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝仅针怎植京助升王眼她抓含苗副杂普谈围食射源例致酸旧却充足短划剂宣环落首尺波承粉践府鱼随考刻靠够满夫失包住促枝局菌杆周护岩师举曲春元超负砂封换太模贫减阳扬江析亩木言球朝医校古呢稻宋听唯输滑站另卫字鼓刚写刘微略范供阿块某功套友限项余倒卷创律雨让骨远帮初皮播优占死毒圈伟季训控激找叫云互跟裂粮粒母练塞钢顶策双留误础吸阻故寸盾晚丝女散焊功株亲院冷彻弹错散商视艺灭版烈零室轻血倍缺厘泵察绝富城冲喷壤简否柱李望盘磁雄似困巩益洲脱投送奴侧润盖挥距触星松送获兴独官混纪依未突架宽冬章湿偏纹吃执阀矿寨责熟稳夺硬价努翻奇甲预职评读背协损棉侵灰虽矛厚罗泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨奋械载胞幼哪剥迫旋征槽倒握担仍呀鲜吧卡粗介钻逐弱脚怕盐末阴丰雾冠丙街莱贝辐肠付吉渗瑞惊顿挤秒悬姆烂森糖圣凹陶词迟蚕亿矩康遵牧遭幅园腔订香肉弟屋敏恢忘编印蜂急拿扩伤飞露核缘游振操央伍域甚迅辉异序免纸夜乡久隶缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染既秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃剧堆赫荷胸衡勤膜篇登驻案刊秧缓凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋弧爆谬涂味津臂障褐陆啊健尊豆拔莫抵桑坡缝警挑污冰柬嘴啥饭塑寄赵喊垫丹渡耳刨虎笔稀昆浪萨茶滴浅拥穴覆伦娘吨浸袖珠雌妈紫戏塔锤震岁貌洁剖牢锋疑霸闪埔猛诉刷狠忽灾闹乔唐漏闻沈熔氯荒茎男凡抢像浆旁玻亦忠唱蒙予纷捕锁尤乘乌智淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借".$addChars;
               break;
           default :
               // 默认去掉了容易混淆的字符oOLl和数字01,要添加请使用addChars参数
               $chars='ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'.$addChars;
               break;
       }
       if($len>10 ) {//位数过长重复字符串一定次数
           $chars= $type==1? str_repeat($chars,$len) : str_repeat($chars,5);
       }
       if($type!=4) {
           $chars   =   str_shuffle($chars);
           $str     =   substr($chars,0,$len);
       }else{
           // 中文随机字
           for($i=0;$i<$len;$i++){
               $str.= self::msubstr($chars, floor(mt_rand(0,mb_strlen($chars,'utf-8')-1)),1);
           }
       }
       return $str;
    }
}

/**
 * @name 获取客户端真实的ip
 * @access public
 * @return String
 */
if ( !function_exists ( 'getrealip' ) )
{
	function getrealip()
    {
		$onlineip = '';
		if (getenv ( 'HTTP_CLIENT_IP' ) && strcasecmp ( getenv ( 'HTTP_CLIENT_IP' ), 'unknown' )) {
			$onlineip = getenv ( 'HTTP_CLIENT_IP' );
		} elseif (getenv ( 'HTTP_X_FORWARDED_FOR' ) && strcasecmp ( getenv ( 'HTTP_X_FORWARDED_FOR' ), 'unknown' )) {
			$onlineip = getenv ( 'HTTP_X_FORWARDED_FOR' );
		} elseif (getenv ( 'REMOTE_ADDR' ) && strcasecmp ( getenv ( 'REMOTE_ADDR' ), 'unknown' )) {
			$onlineip = getenv ( 'REMOTE_ADDR' );
		} elseif (isset ( $_SERVER ['REMOTE_ADDR'] ) && $_SERVER ['REMOTE_ADDR'] && strcasecmp ( $_SERVER ['REMOTE_ADDR'], 'unknown' )) {
			$onlineip = $_SERVER ['REMOTE_ADDR'];
		}
		return $onlineip;
	}
}

/*
 * @name 	纯文字截取
 * @access 	public
 * @param	String 	$str	原文
 * @param	Int 	$len
 * @param	Bool 	$flag	false不加...
 * @return	String
 */
if ( ! function_exists( 'my_cus_substr' ) )
{
    function my_cus_substr( $str, $len, $flag = TRUE)
    {
		if(mb_strlen($str) < $len) return $str;
        $i = 0;
        $tlen = 0;
        $tstr = '';
        while ( $tlen < $len )
        {
			$tlen++;
            $chr = mb_substr( $str, $i, 1, 'utf8' );
            //$chrLen = ord( $chr ) > 127 ? 2 : 1;
            if ( $tlen > $len ) break;
            $tstr .= $chr;
            $i++;
        }
        if ( $tstr != $str && $flag )
        {
            $tstr .= '...';
        }
        return $tstr;
    }
}

/*
 * @name 	html截取
 * @access 	public
 * @param	String 	$str 	原文
 * @param	Int 	$len
 * @param 	Bool 	$flag 	false不加...
 * @return 	String
 */
if ( ! function_exists( 'my_substr_html' ) )
{
	function my_substr_html( $str, $len, $flag = TRUE)
	{
		if(mb_strlen(strip_tags($str)) < $len) return $str;
		$i = 0;
		$j = 0;
		$tlen = 0;
		$tstr = '';
		$status = 1;
		$type = 1;
		while (1)
		{
			$chr = mb_substr( $str, $i, 1, 'utf8' );
			if($chr == '<') $status = 0;
			if($chr == '>')
			{
				$status = 1;
				$j++;
				//($j%2==0) ? $type = 0 : $type = 1;
			}

			if($status && ($chr != '>'))
			{
				$tlen++;
                //&& ($type == 0 || $j == 0)
				if($tlen > $len )
				{
					break;
				}
				$tstr .= $chr;
				$i++;
			}
			else
			{
				$i++;
				$tstr .= $chr;
				continue;
			}
		}
		if ( $tstr != $str && $flag )
		{
			$tstr .= '...';
		}
		return $tstr;
	}
}

if( !function_exists( 'getEmailHostByEmail' ) )
{
    function getEmailHostByEmail($email)
    {
        $domain = substr ( $email, strrpos ( $email, "@" ) + 1 );
        switch ( $domain )
        {
            case 'me.com':
                $emailHost = 'https://www.icloud.com/';
                break;

            case 'yahoo.com.cn':
            case 'yahoo.cn':
                $emailHost = 'http://mail.cn.yahoo.com/';
                break;

            default:
                $emailHost = "http://mail." . $domain;
                break;
        }
        return $emailHost;
    }
}

if( !function_exists( 'timeFromNow' ) )
{
	function timeFromNow($dateline)
	{
	    if( empty($dateline) ) return false;

	    $seconds = time() - $dateline;
	    if ($seconds < 60)
	    {
	        return "1分钟前";
	    }
	    elseif( $seconds < 3600 )
	    {
	        return floor($seconds/60)."分钟前";
	    }
	    elseif( $seconds  < 24*3600 )
	    {
	        return floor($seconds/3600)."小时前";
	    }
	    elseif( $seconds < 48*3600 )
	    {
	        return date("昨天 H:i", $dateline)."";
	    }
	    else
	    {
	        return date('Y-m-d', $dateline);
	    }
	}
}

if( !function_exists( 'getpost' ) )
{
	function getpost($type, $post = true, $xss_clean = true)
	{
	    $ci = &get_instance();

	    return ($post) ? trim($ci->input->post($type,$xss_clean)) : trim($ci->input->get_post($type,$xss_clean));
	}
}