', for example 'forced-> cp1251', encoding tables in the reconstruction will be forcibly replaced by cp1251 // You can also specify comparison of the right to suit 'cp1251_ukrainian_ci' or 'forced-> cp1251_ukrainian_ci' define('RESTORE_CHARSET', 'latin1'); // Include your persistence and the latest action // To turn set 0 define('SC', 1); // Types tables have been maintained only structure separated semicolon define('ONLY_CREATE', 'MRG_MyISAM,MERGE,HEAP,MEMORY'); // Global statistics // To turn set 0 define('GS', 1); // Forward does not need editing $is_safe_mode = ini_get('safe_mode') == '1' ? 1 : 0; if (!$is_safe_mode && function_exists('set_time_limit')) set_time_limit(TIME_LIMIT); $timer = array_sum(explode(' ', microtime())); ob_implicit_flush(); error_reporting(E_ALL); $auth = 0; $error = ''; if (!empty($_POST['login']) && isset($_POST['pass'])) { if (@mysql_connect(DBHOST, $_POST['login'], $_POST['pass'])){ setcookie("sxd", base64_encode("SKD101:{$_POST['login']}:{$_POST['pass']}")); header("Location: ".$_SERVER['PHP_SELF']); mysql_close(); exit; } else{ $error = '#' . mysql_errno() . ': ' . mysql_error(); } } elseif (!empty($_COOKIE['sxd'])) { $user = explode(":", base64_decode($_COOKIE['sxd'])); if (@mysql_connect(DBHOST, $user[1], $user[2])){ $auth = 1; } else{ $error = '#' . mysql_errno() . ': ' . mysql_error(); } } if (!$auth || (isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING'] == 'reload')) { echo tpl_page(tpl_auth($error ? tpl_error($error) : ''), ""); echo ""; exit; } if (!file_exists(PATH) && !$is_safe_mode) { mkdir(PATH, 0777) || trigger_error("Unable to create a directory for printer ", E_USER_ERROR); } $SK = new dumper(); define('C_DEFAULT', 1); define('C_RESULT', 2); define('C_ERROR', 3); define('C_WARNING', 4); $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; switch($action){ case 'backup': $SK->backup(); break; case 'restore': $SK->restore(); break; default: $SK->main(); } mysql_close(); echo ""; class dumper { function dumper() { if (file_exists(PATH . "dumper.cfg.php")) { include(PATH . "dumper.cfg.php"); } else{ $this->SET['last_action'] = 0; $this->SET['last_db_backup'] = ''; $this->SET['tables'] = ''; $this->SET['comp_method'] = 2; $this->SET['comp_level'] = 7; $this->SET['last_db_restore'] = ''; } $this->tabs = 0; $this->records = 0; $this->size = 0; $this->comp = 0; // MySQL type 40101 preg_match("/^(\d+)\.(\d+)\.(\d+)/", mysql_get_server_info(), $m); $this->mysql_version = sprintf("%d%02d%02d", $m[1], $m[2], $m[3]); $this->only_create = explode(',', ONLY_CREATE); $this->forced_charset = false; $this->restore_charset = $this->restore_collate = ''; if (preg_match("/^(forced->)?(([a-z0-9]+)(\_\w+)?)$/", RESTORE_CHARSET, $matches)) { $this->forced_charset = $matches[1] == 'forced->'; $this->restore_charset = $matches[3]; $this->restore_collate = !empty($matches[4]) ? ' COLLATE ' . $matches[2] : ''; } } function backup() { if (!isset($_POST)) {$this->main();} set_error_handler("SXD_errorHandler"); $buttons = "Download File "; echo tpl_page(tpl_process("Xin vui lòng chờ đợi trong giây lát... "), $buttons); $this->SET['last_action'] = 0; $this->SET['last_db_backup'] = isset($_POST['db_backup']) ? $_POST['db_backup'] : ''; $this->SET['tables_exclude'] = !empty($_POST['tables']) && $_POST['tables']{0} == '^' ? 1 : 0; $this->SET['tables'] = isset($_POST['tables']) ? $_POST['tables'] : ''; $this->SET['comp_method'] = isset($_POST['comp_method']) ? intval($_POST['comp_method']) : 0; $this->SET['comp_level'] = isset($_POST['comp_level']) ? intval($_POST['comp_level']) : 0; $this->fn_save(); $this->SET['tables'] = explode(",", $this->SET['tables']); if (!empty($_POST['tables'])) { foreach($this->SET['tables'] AS $table){ $table = preg_replace("/[^\w*?^]/", "", $table); $pattern = array( "/\?/", "/\*/"); $replace = array( ".", ".*?"); $tbls[] = preg_replace($pattern, $replace, $table); } } else{ $this->SET['tables_exclude'] = 1; } if ($this->SET['comp_level'] == 0) { $this->SET['comp_method'] = 0; } $db = $this->SET['last_db_backup']; if (!$db) { echo tpl_l("ERROR! No database!", C_ERROR); echo tpl_enableBack(); exit; } echo tpl_l("Đang kết nối cơ sở dữ liệu."); mysql_select_db($db) or trigger_error ("Unable to select database." . mysql_error(), E_USER_ERROR); $tables = array(); $result = mysql_query("SHOW TABLES"); $all = 0; while($row = mysql_fetch_array($result)) { $status = 0; if (!empty($tbls)) { foreach($tbls AS $table){ $exclude = preg_match("/^\^/", $table) ? true : false; if (!$exclude) { if (preg_match("/^{$table}$/i", $row[0])) { $status = 1; } $all = 1; } if ($exclude && preg_match("/{$table}$/i", $row[0])) { $status = -1; } } } else { $status = 1; } if ($status >= $all) { $tables[] = $row[0]; } } $tabs = count($tables); // Determination of tables $result = mysql_query("SHOW TABLE STATUS"); $tabinfo = array(); $tab_charset = array(); $tab_type = array(); $tabinfo[0] = 0; $info = ''; while($item = mysql_fetch_assoc($result)){ //print_r($item); if(in_array($item['Name'], $tables)) { $item['Rows'] = empty($item['Rows']) ? 0 : $item['Rows']; $tabinfo[0] += $item['Rows']; $tabinfo[$item['Name']] = $item['Rows']; $this->size += $item['Data_length']; $tabsize[$item['Name']] = 1 + round(LIMIT * 1048576 / ($item['Avg_row_length'] + 1)); if($item['Rows']) $info .= "|" . $item['Rows']; if (!empty($item['Collation']) && preg_match("/^([a-z0-9]+)_/i", $item['Collation'], $m)) { $tab_charset[$item['Name']] = $m[1]; } $tab_type[$item['Name']] = isset($item['Engine']) ? $item['Engine'] : $item['Type']; } } $show = 10 + $tabinfo[0] / 50; $info = $tabinfo[0] . $info; $name = $db . '_' . date("Y-m-d_H-i"); $fp = $this->fn_open($name, "w"); echo tpl_l("Bắt đầu tạo tên cơ sở dữ liệu :\\n - {$this->filename}"); $this->fn_write($fp, "#SKD101|{$db}|{$tabs}|" . date("Y.m.d H:i:s") ."|{$info}\n\n"); $t=0; echo tpl_l(str_repeat("-", 60)); $result = mysql_query("SET SQL_QUOTE_SHOW_CREATE = 1"); // Encoding connections by default if ($this->mysql_version > 40101 && CHARSET != 'auto') { mysql_query("SET NAMES '" . CHARSET . "'") or trigger_error ("Cannot set the encoding for the connection." . mysql_error(), E_USER_ERROR); $last_charset = CHARSET; } else{ $last_charset = ''; } foreach ($tables AS $table){ // Bill encoding connecting the encoding tables if ($this->mysql_version > 40101 && $tab_charset[$table] != $last_charset) { if (CHARSET == 'auto') { mysql_query("SET NAMES '" . $tab_charset[$table] . "'") or trigger_error ("Cannot set the encoding for the connection." . mysql_error(), E_USER_ERROR); echo tpl_l("Using encoding `" . $tab_charset[$table] . "`.", C_WARNING); $last_charset = $tab_charset[$table]; } else{ echo tpl_l('Encoding connections, and the table does not match:', C_ERROR); echo tpl_l('Table `'. $table .'` -> ' . $tab_charset[$table] . ' (Connection ' . CHARSET . ')', C_ERROR); } } echo tpl_l("Processing Table`{$table}` [" . fn_int($tabinfo[$table]) . "]."); // Creating tables $result = mysql_query("SHOW CREATE TABLE `{$table}`"); $tab = mysql_fetch_array($result); $tab = preg_replace('/(default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP|DEFAULT CHARSET=\w+|COLLATE=\w+|character set \w+|collate \w+)/i', '/*!40101 \\1 */', $tab); $this->fn_write($fp, "DROP TABLE IF EXISTS `{$table}`;\n{$tab[1]};\n\n"); // Checking whether dampit data if (in_array($tab_type[$table], $this->only_create)) { continue; } // Oprededelyaem types of columns $NumericColumn = array(); $result = mysql_query("SHOW COLUMNS FROM `{$table}`"); $field = 0; while($col = mysql_fetch_row($result)) { $NumericColumn[$field++] = preg_match("/^(\w*int|year)/", $col[1]) ? 1 : 0; } $fields = $field; $from = 0; $limit = $tabsize[$table]; $limit2 = round($limit / 3); if ($tabinfo[$table] > 0) { if ($tabinfo[$table] > $limit2) { echo tpl_s(0, $t / $tabinfo[0]); } $i = 0; $this->fn_write($fp, "INSERT INTO `{$table}` VALUES"); while(($result = mysql_query("SELECT * FROM `{$table}` LIMIT {$from}, {$limit}")) && ($total = mysql_num_rows($result))){ while($row = mysql_fetch_row($result)) { $i++; $t++; for($k = 0; $k < $fields; $k++){ if ($NumericColumn[$k]) $row[$k] = isset($row[$k]) ? $row[$k] : "NULL"; else $row[$k] = isset($row[$k]) ? "'" . mysql_escape_string($row[$k]) . "'" : "NULL"; } $this->fn_write($fp, ($i == 1 ? "" : ",") . "\n(" . implode(", ", $row) . ")"); if ($i % $limit2 == 0) echo tpl_s($i / $tabinfo[$table], $t / $tabinfo[0]); } mysql_free_result($result); if ($total < $limit) { break; } $from += $limit; } $this->fn_write($fp, ";\n\n"); echo tpl_s(1, $t / $tabinfo[0]);} } $this->tabs = $tabs; $this->records = $tabinfo[0]; $this->comp = $this->SET['comp_method'] * 10 + $this->SET['comp_level']; echo tpl_s(1, 1); echo tpl_l(str_repeat("-", 60)); $this->fn_close($fp); echo tpl_l("Quá trình xử lý cơ sở dữ liệu `{$db}` đã thành công.", C_RESULT); echo tpl_l("Size of DB : " . round($this->size / 1048576, 2) . ".", C_RESULT); $filesize = round(filesize(PATH . $this->filename) / 1048576, 2) . "."; echo tpl_l("Size of file : {$filesize}", C_RESULT); echo tpl_l("Tables processed : {$tabs}", C_RESULT); echo tpl_l("Lines processed : " . fn_int($tabinfo[0]), C_RESULT); echo ""; // Data Transfer for global statistics if (GS) echo ""; } function restore(){ if (!isset($_POST)) {$this->main();} set_error_handler("SXD_errorHandler"); $buttons = ""; echo tpl_page(tpl_process("Restoring database backup"), $buttons); $this->SET['last_action'] = 1; $this->SET['last_db_restore'] = isset($_POST['db_restore']) ? $_POST['db_restore'] : ''; $file = isset($_POST['file']) ? $_POST['file'] : ''; $this->fn_save(); $db = $this->SET['last_db_restore']; if (!$db) { echo tpl_l("ERROR! No database!", C_ERROR); echo tpl_enableBack(); exit; } echo tpl_l("Đang kết nối cơ sở dữ liệu `{$db}`."); mysql_select_db($db) or trigger_error ("Unable to select database. ." . mysql_error(), E_USER_ERROR); // Definition file format if(preg_match("/^(.+?)\.sql(\.(bz2|gz))?$/", $file, $matches)) { if (isset($matches[3]) && $matches[3] == 'bz2') { $this->SET['comp_method'] = 2; } elseif (isset($matches[2]) &&$matches[3] == 'gz'){ $this->SET['comp_method'] = 1; } else{ $this->SET['comp_method'] = 0; } $this->SET['comp_level'] = ''; if (!file_exists(PATH . "/{$file}")) { echo tpl_l("ERROR! File Not Found! !", C_ERROR); echo tpl_enableBack(); exit; } echo tpl_l("Reading File`{$file}`."); $file = $matches[1]; } else{ echo tpl_l("ERROR! No file selected(", C_ERROR); echo tpl_enableBack(); exit; } echo tpl_l(str_repeat("-", 60)); $fp = $this->fn_open($file, "r"); $this->file_cache = $sql = $table = $insert = ''; $is_skd = $query_len = $execute = $q =$t = $i = $aff_rows = 0; $limit = 300; $index = 4; $tabs = 0; $cache = ''; $info = array(); // Setting coding connections if ($this->mysql_version > 40101 && (CHARSET != 'auto' || $this->forced_charset)) { // Encryption by default if the dump was not encoded mysql_query("SET NAMES '" . $this->restore_charset . "'") or trigger_error ("Cannot set the encoding for the connection." . mysql_error(), E_USER_ERROR); echo tpl_l("Using encoding `" . $this->restore_charset . "`.", C_WARNING); $last_charset = $this->restore_charset; } else { $last_charset = ''; } $last_showed = ''; while(($str = $this->fn_read_str($fp)) !== false){ if (empty($str) || preg_match("/^(#|--)/", $str)) { if (!$is_skd && preg_match("/^#SKD101\|/", $str)) { $info = explode("|", $str); echo tpl_s(0, $t / $info[4]); $is_skd = 1; } continue; } $query_len += strlen($str); if (!$insert && preg_match("/^(INSERT INTO `?([^` ]+)`? .*?VALUES)(.*)$/i", $str, $m)) { if ($table != $m[2]) { $table = $m[2]; $tabs++; $cache .= tpl_l("Table `{$table}`."); $last_showed = $table; $i = 0; if ($is_skd) echo tpl_s(100 , $t / $info[4]); } $insert = $m[1] . ' '; $sql .= $m[3]; $index++; $info[$index] = isset($info[$index]) ? $info[$index] : 0; $limit = round($info[$index] / 20); $limit = $limit < 300 ? 300 : $limit; if ($info[$index] > $limit){ echo $cache; $cache = ''; echo tpl_s(0 / $info[$index], $t / $info[4]); } } else{ $sql .= $str; if ($insert) { $i++; $t++; if ($is_skd && $info[$index] > $limit && $t % $limit == 0){ echo tpl_s($i / $info[$index], $t / $info[4]); } } } if (!$insert && preg_match("/^CREATE TABLE (IF NOT EXISTS )?`?([^` ]+)`?/i", $str, $m) && $table != $m[2]){ $table = $m[2]; $insert = ''; $tabs++; $is_create = true; $i = 0; } if ($sql) { if (preg_match("/;$/", $str)) { $sql = rtrim($insert . $sql, ";"); if (empty($insert)) { if ($this->mysql_version < 40101) { $sql = preg_replace("/ENGINE\s?=/", "TYPE=", $sql); } elseif (preg_match("/CREATE TABLE/i", $sql)){ // Bill encoding connections if (preg_match("/(CHARACTER SET|CHARSET)[=\s]+(\w+)/i", $sql, $charset)) { if (!$this->forced_charset && $charset[2] != $last_charset) { if (CHARSET == 'auto') { mysql_query("SET NAMES '" . $charset[2] . "'") or trigger_error ("Cannot set the encoding for the connection.{$sql}" . mysql_error(), E_USER_ERROR); $cache .= tpl_l("Using encoding `" . $charset[2] . "`.", C_WARNING); $last_charset = $charset[2]; } else{ $cache .= tpl_l('Encoding connections, and the table does not match :', C_ERROR); $cache .= tpl_l('Table `'. $table .'` -> ' . $charset[2] . ' (Connection ' . $this->restore_charset . ')', C_ERROR); } } // Changing encoding if the rush encoding if ($this->forced_charset) { $sql = preg_replace("/(\/\*!\d+\s)?((COLLATE)[=\s]+)\w+(\s+\*\/)?/i", '', $sql); $sql = preg_replace("/((CHARACTER SET|CHARSET)[=\s]+)\w+/i", "\\1" . $this->restore_charset . $this->restore_collate, $sql); } } elseif(CHARSET == 'auto'){ // Run encoding table if it is not specified and installed auto encoding $sql .= ' DEFAULT CHARSET=' . $this->restore_charset . $this->restore_collate; if ($this->restore_charset != $last_charset) { mysql_query("SET NAMES '" . $this->restore_charset . "'") or trigger_error ("Cannot set the encoding for the connection.{$sql}" . mysql_error(), E_USER_ERROR); $cache .= tpl_l("Using encoding `" . $this->restore_charset . "`.", C_WARNING); $last_charset = $this->restore_charset; } } } if ($last_showed != $table) {$cache .= tpl_l("Table `{$table}`."); $last_showed = $table;} } elseif($this->mysql_version > 40101 && empty($last_charset)) { // Install encoding for the absence CREATE TABLE mysql_query("SET $this->restore_charset '" . $this->restore_charset . "'") or trigger_error ("Cannot set the encoding for the connection.{$sql}" . mysql_error(), E_USER_ERROR); echo tpl_l("Using encoding `" . $this->restore_charset . "`.", C_WARNING); $last_charset = $this->restore_charset; } $insert = ''; $execute = 1; } if ($query_len >= 65536 && preg_match("/,$/", $str)) { $sql = rtrim($insert . $sql, ","); $execute = 1; } if ($execute) { $q++; mysql_query($sql) or trigger_error ("Bad request." . mysql_error(), E_USER_ERROR); if (preg_match("/^insert/i", $sql)) { $aff_rows += mysql_affected_rows(); } $sql = ''; $query_len = 0; $execute = 0; } } } echo $cache; echo tpl_s(1 , 1); echo tpl_l(str_repeat("-", 60)); echo tpl_l("DB restored from a backup.", C_RESULT); if (isset($info[3])) echo tpl_l("Established copies: {$info[3]}", C_RESULT); echo tpl_l("Queries to DB: {$q}", C_RESULT); echo tpl_l("Tables set up: {$tabs}", C_RESULT); echo tpl_l("Lines added: {$aff_rows}", C_RESULT); $this->tabs = $tabs; $this->records = $aff_rows; $this->size = filesize(PATH . $this->filename); $this->comp = $this->SET['comp_method'] * 10 + $this->SET['comp_level']; echo ""; // Data Transfer for global statistics if (GS) echo ""; $this->fn_close($fp); } function main(){ $this->comp_levels = array('9' => 'Level 9 (Cao nhất)', '8' => 'Level 8', '7' => 'Level 7', '6' => 'Level 6', '5' => 'Level 5 (Trung bình)', '4' => 'Level 4', '3' => 'Level 3', '2' => 'Level 2', '1' => 'Level 1 (Bình thường)','0' => 'Không tối ưu hóa '); if (function_exists("bzopen")) { $this->comp_methods[2] = 'BZip2'; } if (function_exists("gzopen")) { $this->comp_methods[1] = 'GZip'; } $this->comp_methods[0] = 'No compression'; if (count($this->comp_methods) == 1) { $this->comp_levels = array('0' =>'No compression'); } $dbs = $this->db_select(); $this->vars['db_backup'] = $this->fn_select($dbs, $this->SET['last_db_backup']); $this->vars['db_restore'] = $this->fn_select($dbs, $this->SET['last_db_restore']); $this->vars['comp_levels'] = $this->fn_select($this->comp_levels, $this->SET['comp_level']); $this->vars['comp_methods'] = $this->fn_select($this->comp_methods, $this->SET['comp_method']); $this->vars['tables'] = $this->SET['tables']; $this->vars['files'] = $this->fn_select($this->file_select(), ''); $buttons = ""; echo tpl_page(tpl_main(), $buttons); } function db_select(){ if (DBNAMES != '') { $items = explode(',', trim(DBNAMES)); foreach($items AS $item){ if (mysql_select_db($item)) { $tables = mysql_query("SHOW TABLES"); if ($tables) { $tabs = mysql_num_rows($tables); $dbs[$item] = "{$item} ({$tabs})"; } } } } else { $result = mysql_query("SHOW DATABASES"); $dbs = array(); while($item = mysql_fetch_array($result)){ if (mysql_select_db($item[0])) { $tables = mysql_query("SHOW TABLES"); if ($tables) { $tabs = mysql_num_rows($tables); $dbs[$item[0]] = "{$item[0]} ({$tabs})"; } } } } return $dbs; } function file_select(){ $files = array('' => ' '); if (is_dir(PATH) && $handle = opendir(PATH)) { while (false !== ($file = readdir($handle))) { if (preg_match("/^.+?\.sql(\.(gz|bz2))?$/", $file)) { $files[$file] = $file; } } closedir($handle); } ksort($files); return $files; } function fn_open($name, $mode){ if ($this->SET['comp_method'] == 2) { $this->filename = "{$name}.sql.bz2"; return bzopen(PATH . $this->filename, "{$mode}b{$this->SET['comp_level']}"); } elseif ($this->SET['comp_method'] == 1) { $this->filename = "{$name}.sql.gz"; return gzopen(PATH . $this->filename, "{$mode}b{$this->SET['comp_level']}"); } else{ $this->filename = "{$name}.sql"; return fopen(PATH . $this->filename, "{$mode}b"); } } function fn_write($fp, $str){ if ($this->SET['comp_method'] == 2) { bzwrite($fp, $str); } elseif ($this->SET['comp_method'] == 1) { gzwrite($fp, $str); } else{ fwrite($fp, $str); } } function fn_read($fp){ if ($this->SET['comp_method'] == 2) { return bzread($fp, 4096); } elseif ($this->SET['comp_method'] == 1) { return gzread($fp, 4096); } else{ return fread($fp, 4096); } } function fn_read_str($fp){ $string = ''; $this->file_cache = ltrim($this->file_cache); $pos = strpos($this->file_cache, "\n", 0); if ($pos < 1) { while (!$string && ($str = $this->fn_read($fp))){ $pos = strpos($str, "\n", 0); if ($pos === false) { $this->file_cache .= $str; } else{ $string = $this->file_cache . substr($str, 0, $pos); $this->file_cache = substr($str, $pos + 1); } } if (!$str) { if ($this->file_cache) { $string = $this->file_cache; $this->file_cache = ''; return trim($string); } return false; } } else { $string = substr($this->file_cache, 0, $pos); $this->file_cache = substr($this->file_cache, $pos + 1); } return trim($string); } function fn_close($fp){ if ($this->SET['comp_method'] == 2) { bzclose($fp); } elseif ($this->SET['comp_method'] == 1) { gzclose($fp); } else{ fclose($fp); } @chmod(PATH . $this->filename, 0666); $this->fn_index(); } function fn_select($items, $selected){ $select = ''; foreach($items AS $key => $value){ $select .= $key == $selected ? "{$value}" : "{$value}"; } return $select; } function fn_save(){ if (SC) { $ne = !file_exists(PATH . "dumper.cfg.php"); $fp = fopen(PATH . "dumper.cfg.php", "wb"); fwrite($fp, "SET = " . fn_arr2str($this->SET) . "\n?>"); fclose($fp); if ($ne) @chmod(PATH . "dumper.cfg.php", 0666); $this->fn_index(); } } function fn_index(){ if (!file_exists(PATH . 'index.html')) { $fh = fopen(PATH . 'index.html', 'wb'); fwrite($fh, tpl_backup_index()); fclose($fh); @chmod(PATH . 'index.html', 0666); } } } function fn_int($num){ return number_format($num, 0, ',', ' '); } function fn_arr2str($array) { $str = "array(\n"; foreach ($array as $key => $value) { if (is_array($value)) { $str .= "'$key' => " . fn_arr2str($value) . ",\n\n"; } else { $str .= "'$key' => '" . str_replace("'", "\'", $value) . "',\n"; } } return $str . ")"; } // Templates function tpl_page($content = '', $buttons = ''){ return << The Soda Pop HOMECHAT BLOG - Nếu tải trang bị lỗi Xt:TimeOut hãy tải lại trang hoặc bấm vàoĐÂYAdmin nhận làm wap,forum giá rẻ. Liên hệ thông tin admin cuối trang để thương lượng giá và demo. Thank all Đăng nhập phpMyadmin | Localhost:3306 {$content} {$buttons} Tag: TẮT QCBẬT QC Liên kếtWap sex 18+ Thông tin © Design by: Nhox Attend © Liên hệ: 01649373906© Thanks to Xtgem © Filelist Thân Thiện Style VipTruyen Log in