Tải bản đầy đủ (.docx) (21 trang)

Bao Cao Do An Huan docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (471.38 KB, 21 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
****************************
BÁO CÁO PROJECT 1
Đề tài:
SO SÁNH VÀ KIỂM ĐỊNH NỘI DUNG
VĂN BẢN VỚI CƠ SỞ DỮ LIỆU CÓ SẴN
Giảng viên hướng dẫn: TS. Nguyễn Hữu Phát
Nhóm sinh viên thực hiện:
Họ Và Tên
Nguyễn Văn Huân
Tạ Đức Giang
Dư Quốc Hưng
MSSV
20101598
20101439
20103179
Lớp
ĐTVT 02 – K55
ĐTVT 01 – K55
CN 04 – K55
Hà Nội, 5-2013
LỜI NÓI ĐẦU
Trong những năm gần đây, lập trình hướng đối đượng đã trở lên gần gũi nhờ
sự ra đời liên tiếp của các ngôn ngữ lập trình. Sức mạnh của phương pháp lập trình
hướng đối tượng thể hiện ở chỗ khả năng mô hình hóa hệ thống dựa trên các đối
tượng thực tế, khả năng đóng gói và bảo vệ an toàn các dữ liệu, khả năng dùng lại
mã nguồn để tiết kiệm chi phí và tài nguyên. Đặc biệt, khả năng chia sẻ mã nguồn
trong cộng đồng lập trình viên chuyên nghiệp. Những điểm mạnh này hứa hẹn sẽ
thúc đẩy phát triển một môi trường lập trình tiên tiến cùng với nên công nghiệp lắp
ráp phần mềm với các thư viện có sẵn.


MỤC LỤC
CHƯƠNG 1: GIỚI THIỆU
1.1 Đặt vấn đề
Ngày nay, khoa học và công nghệ đang có sự phát triển vượt bậc, đặc biệt là
công nghệ thông tin nói chung cũng như internet nói riêng. Việc tìm kiếm thông tin,
tài liệu trên internet đã trở nên dễ dàng hơn bao giờ hết. Tuy nhiên, bên cạnh những
lợi ích mà nó mang lại, còn có nhiều bất cập nảy sinh. Trong đó, vấn đề ăn cắp bản
quyền là một vấn đề nhức nhối và làm đau đầu các nhà kiểm định. Nhằm đưa ra
phương án giải quyết vấn đề trên, nhóm chúng em đã nghiên cứu đề tài “So sánh và
kiểm định nội dung văn bản với cơ sở dữ liệu có sẵn”. Mục đích của đề tài nhằm
đưa ra giao diện trực quan giúp người dùng có thể dễ dàng nhận biết mức độ giống
nhau giữa hai văn bản, qua đó có thể đánh giá được nội dung văn bản có phải là sao
chép hay không.
Chúng em xin gửi lời chân thành cảm ơn tới TS. Nguyễn Hữu Phát đã hướng
dẫn, chỉ bảo tận tình và tạo điều kiện cho chúng em trong suốt quá trình thực hiện
đề tài.
Nhóm sinh viên thực hiện đề tài:
Nguyễn Văn Huân
Tạ Đức Giang
Dư Quốc Hưng
1.2 Mục tiêu của đề tài
Mục tiêu của đề tài là so sánh được mức độ giống nhau giữa các văn bản và
làm nổi bật chúng trên giao diện trực quan của người dùng. Đồng thời đưa ra tỉ lệ
phần trăm để đánh giá giá trị trên.
Từ đó , người quản lí có thể giải quyết được các vấn đề còn lại giúp việc xác
minh tính chính xác của văn bản gốc có bị sao chép hay ăn cắp bản quyền hay
không.
1.3 Giới hạn của đề tài
Do điều kiện thời gian và kinh nghiệm còn hạn chế, đề tài mới chỉ dừng lại ở
việc so sánh nội dung hai văn bản kích thước nhỏ, chưa triển khai được trên hệ

thống cơ sở dữ liệu lớn, chưa có khả năng đọc được nhiều định dạng văn bản khác
nhau. Cùng với đó là những bất cập khi chưa cải tiến lên được so sánh 2 văn bản
online.
CHƯƠNG 2: GIẢI PHÁP VÀ CÔNG CỤ
2.1 Tổng quan về ngôn ngữ lập trình Java
2.1.1 Java là gì?
Thập kỷ 90 chứng kiến một sự phát triển như vũ bão của mạng Internet, kèm
theo đó là vô vàn các ứng dụng trên các môi trường, hệ điều hành (OS) và các hệ xử
lý (CPU) khác nhau. Tuy nhiên có một điểm hạn chế lớn là người lập trình phải rất
vất vả khi chuyển đổi các ứng dụng của mình để các hệ thống khác có thể sử dụng
được.
Ngày 23/5/1995, công ty máy tính Sun Microsystems đã giới thiệu một công
cụ lập trình mới - ngôn ngữ Java - nhằm khắc phục những khó khăn đó. Đặc điểm
nổi bật nhất của Java là nó không phụ thuộc vào hệ điều hành và bộ xử lý. Điều này
cho phép một ứng dụng viết bằng Java có thể được thực hiện trên bất kỳ hệ điều
hành và hệ xử lý nào có hỗ trợ Java. Do vậy, người lập trình chỉ cần viết ứng dụng
bằng Java đúng một lần, sau đó có thể sử dụng ứng dụng này trên các hệ điều hành
khác nhau như Windows95, WindowsNT, Mac OS, Unix, theo phương châm:
"viết một lần, sử dụng ở bất kỳ đâu".
Có thể định nghĩa một cách chính xác hơn về Java: "là ngôn ngữ lập trình
hướng đối tượng, được thiết kế độc lập với hệ điều hành, cho phép người lập trình
viết chương trình một lần và có thể sử dụng tại bất kỳ đâu".
Không chỉ giới thiệu ngôn ngữ lập trình, Sun Microsystems còn đưa ra hàng
loạt công cụ hỗ trợ người lập trình phát triển các ứng dụng bằng Java, như Java
Developer Kit, JavaBeans, HotJava
Ngôn ngữ Java có cú pháp rất giống với ngôn ngữ C/C++ (là một ngôn ngữ
rất mạnh được dùng phổ biến hiện nay), tuy nhiên nó đã được thay đổi khá nhiều để
đáp ứng khả năng độc lập với hệ điều hành. Nền tảng của ngôn ngữ Java là các
class. Các class đóng vai trò như những đối tượng, người lập trình khi xây dựng ứng
dụng sẽ sử dụng một số class chuẩn của hệ thống, đồng thời có thể tự mình xây

dựng class khác đáp ứng yêu cầu công việc.
Java là ngôn ngữ dễ học, nó lược bớt những lệnh thừa và rườm rà của C/C++
để người lập trình chú trọng vào việc viết chương trình. Đồng thời, nó còn hạn chế
người lập trình không can thiệp quá sâu vào hệ thống.
Hiện nay Java được ứng dụng rất rộng rãi, chủ yếu là các ứng dụng được viết
trên Internet nhằm khai thác tối đa khả năng của nó trong lĩnh vực viễn thông,
truyền hình, mạng, và các máy tính đơn lẻ. Hiện tại các ứng dụng viết bằng Java khi
thực hiện còn chậm hơn so với các ứng dụng được xây dựng thông thường, tuy
nhiên hầu hết các nhà phát triển phần mềm đều cho rằng tốc độ sẽ được cải thiện và
Java sẽ là ngôn ngữ lập trình của tương lai.
Có thể nói rằng sự ra đời của Java đánh dấu một cuộc cách mạng mới trong
lĩnh vực Công Nghệ Thông Tin. Cuộc cách mạng này kéo theo một loạt những thay
đổi: các ứng dụng dần được thay thế bằng Java, các thế hệ máy tính sử dụng những
vi mạch có khả năng hỗ trợ Java, Làm quen với Java sẽ giúp chúng ta tiếp cận
được với những công nghệ mới nhất của Công Nghệ Thông Tin.
2.1.2 Các đặc điểm của Java
* Làm thế nào để viết chương trình bằng Java?
Như đã nói ở trên, Java rất giống C/C++. Trên thị trường hiện nay có nhiều
bộ công cụ lập trình cho Java: Java Workshop của Sun Microsystems, Visual J của
Microsoft, Symantec Cafe của Symantec Tất cả đều có điểm chung là hỗ trợ tối đa
cho người lập trình. Sun Microsystems còn đưa ra khá nhiều phần mềm cung cấp
sẵn các đối tượng class để người lập trình sử dụng.
Ngôn ngữ Java xây dựng trên nền tảng các đối tượng (class). Toàn bộ
chương trình được viết bao gồm nhiều đối tượng, mỗi đối tượng được lưu vào một
tập tin có phần mở rộng là .java.
Để dịch Java, lập trình viên sử dụng chương trình Java đi kèm theo bất kỳ
công cụ lập trình nào.
* Môi trường hoạt động:
Đặc điểm nổi bật nhất của Java là độc lập với hệ điều hành và hệ xử lý. Điều
này cho phép Java có thể hoạt động trên bất kỳ môi trường nào. Với ưu thế này,

Java đang dần thâm nhập vào rất nhiều lĩnh vực khác nhau trong thế giới Internet.
* Khả năng xây dựng ứng dụng:
Các ứng dụng Java hiển nhiên phải được xây dựng dựa trên ngôn ngữ Java,
do đó nó phụ thuộc rất nhiều vào sự hỗ trợ từ Sun Microsystems và các hãng cung
cấp thư viện cho lập trình Java. Một điểm hạn chế nữa của Java là tốc độ. Do phải
hoạt động thông qua máy tính ảo JVM nên tốc độ thực hiện ứng dụng của Java khá
chậm.
* Phân loại:
Chương trình xây dựng bằng Java được chia làm hai loại: Java Applet và
Java Application.
Java Applet là các đối tượng được thực hiện trên trình duyệt Web. Khi thực
hiện trên các trình duyệt Web, Java Applet cũng tạo ra các hiệu ứng như một ứng
dụng bình thường, tuy nhiên các thông tin cho phép Java Applet thực hiện lại được
đưa từ các trang Web.
Java Application (Java App) là những ứng dụng độc lập, tương tự như những
chương trình có đuôi .EXE hay đuôi .COM thông thường. Việc thực hiện Java App
đơn giản hơn Java Applet vì chúng không cần phải thông qua trình duyệt Web.
Java Virtual Machine (JVM) đóng vai trò rất quan trọng để các ứng dụng
Java có thể thực hiện được. Nó hoạt động như một máy tính ảo, cũng có bộ lệnh,
cấu trúc dữ liệu, bộ nhớ, Khi các ứng dụng Java (sau khi dịch, các ứng dụng viết
bằng Java sẽ có phần mở rộng là class) thực hiện, JVM tiến hành phân tích mã trong
class đó thành bộ lệnh của JVM rồi thực hiện giống như máy tính PC thao tác với
các ứng dụng thông thường.
Bởi vậy, các class sau khi dịch có thể được thực hiện trên bất kỳ hệ điều
hành nào thông qua máy tính ảo JVM.
Hiện tại, JVM được xây dựng cho hầu hết các hệ điều hành và hệ xử lý hiện
có, điều này có nghĩa là các ứng dụng viết bằng Java có đầy đủ điều kiện để phát
triển.
2.1.3 Các hướng phát triển ứng dụng Java
2.1.3.1 Java và ứng dụng Console

Ứng dụng Console là ứng dụng nhập xuất ở chế độ văn bản tương tự như
màn hình Console của hệ điều hành MS-DOS. Lọai chương trình ứng dụng này
thích hợp với những ai bước đầu làm quen với ngôn ngữ lập trình java. Các ứng
dụng kiểu Console thường được dùng để minh họa các ví dụ cơ bản liên quan đến
cú pháp ngôn ngữ, các thuật toán, và các chương trình ứng dụng không cần thiết
đến giao diện người dùng đồ họa.
2.1.3.2 Java và phát triển ứng dụng Desktop dùng AWT và JFC.
Việc phát triển các chương trình ứng dụng có giao diện người dùng đồ họa
trực quan giống như những chương trình được viết dùng ngôn ngữ lập trình VC++
hay Visual Basic đã được Java giải quyết bằng thư viện AWT và JFC. JFC là thư
viện rất phong phú và hỗ trợ mạnh mẽ hơn nhiều so với AWT. JFC giúp cho người
lập trình có thể tạo ra một giao diện trực quan của bất kỳ ứng dụng nào. Liên quan
đến việc phát triển các ứng dụng có giao diện người dùng đồ họa trực quan chúng ta
sẽ tìm hiểu trong Project này.
2.2 Xủ lý chuỗi và văn bản trong Java
Java cung cấp một số phương thức rất mạnh để xử lý chuỗi ký tự:
* Khai báo và khởi tạo:
- Khai báo một xâu rỗng
Ví dụ: String str1 = new String();
- Khai báo và khởi tạo một xâu bằng một chuỗi cho trước:
Ví dụ: String str2 = new String(“Hello World”);
- Khai báo và khởi tạo một xâu bằng một mảng kí tự cho trước:
Ví dụ: char ch[ ] = {‘a’,’b’,’c’,’d’,’e’};
String str3=new String[ch];
- Khai báo và khởi tạo một xâu bằng cách chọn một vài kí tự trong một mảng
kí tự cho trước:
Ví dụ: char ch[ ] = {‘a’,’b’,’c’,’d’,’e’};
String str4 = new String[ch,0,2];
Kết quả str4 là xâu “ab”, vì khởi tạo này sẽ khởi tạo xâu str4 là lấy 2
kí tự từ vị trí thứ 0.

* Thao tác nối chuỗi:
- Cộng 2 chuỗi bằng toán tử “+”
Ví dụ: String str1 = new String(“Hello World”);
System.out.printf(“Toi muon noi ”+str1);
Kết quả trên màn hình: “Toi muon noi Hello World”
Chú ý: Java có khả năng tự chuyển bất cứ dữ liệu kiểu số nào khi cộng vào
String.
Ví dụ: int n=100;
Float m=100.123;
System.out.printf(“So nguyen la ”+n+”, so thuc la “+m);
Kết quả sẽ in ra chuỗi số: “So nguyen la 100, so thuc la 100.123”.
Khi cộng chuỗi bằng dấu cộng, kết quả sẽ đưa ra bằng cách nỗi 2
chuỗi vào vị trí cuối cùng của chuỗi đầu tiên.
Cách nối chuỗi này thường được sử dụng khi in ra màn hình hoặc
chuyển kiểu dữ liệu số sang String.
- Nối 2 chuỗi bằng phương thức concat( )
Khác với việc nối chuỗi bằng dấu cộng là nối 2 chuỗi tại vị trí cuối cùng của
chuỗi đầu tiên.thay vào đó phương thức này sẽ trả về một chuỗi mới.
Ví dụ: String str1,str2,str3;
str1 = ”Do An”;
str2 = ”So Sanh Van Ban”;
str3 = str1.concat(str2);
Kết quả là str3 sẽ bằng “Do An So Sanh Van Ban”
* Các hàm xử lí với chuỗi trong Java:
- Hàm trả về chuỗi con: substring
Ví dụ: String str1 = new String(“Do An I”);
String str2 = str1.substring(0,2);
Kết quả là str2 bằng “Do”, có nghĩa là phương thức substring sẽ lấy 2 kí tự
trong xâu str1 bắt đầu từ kí tự thứ 0.
- Hàm trả về độ dài chuỗi: length

Ví dụ: String str1 = new String(“Do An I”);
int n = str1.length();
Kết quả n = 7, nghĩa là phương thức length() sẽ trả về độ dài xâu kí tự.
- Hàm trả về kí tự ở vị trí bất kỳ: charAt
Ví dụ: String str1 = new String(“Do An I”);
char ch = str1.charAt(1);
Kết quả là ch = ’o’ nghĩa là phương thức charAt(1) sẽ trả về kí tự thứ
1 tính từ vị trí thứ 0 trong xâu str1.
- Hàm so sánh 2 chuỗi: equals
Phương thức này so sánh 2 chuỗi, kết quả trả về có kiểu Boolean.
- Hàm so sánh 2 chuỗi lần lượt thứ tự từng ký tự: compareTo
Ví dụ:
int a = str1.compareTo(str2);
a = 0 nếu str2 = str1
a > 0 nếu str2 > str1
a < 0 nếu str2 < str1
- Hàm chuyển chuỗi thành mảng ký tự: toCharArray
Ví dụ: String str1 = new String(“ABC”);
char [] ch = str1.toCharArray();
Kết quả là mảng ch = {‘A’,’B’,’C’}
- Hàm trả về vị trí của 1 chuỗi trong chuỗi khác: indexOf
Ví dụ: String str1 = new String(“abcd”);
String str2 = new String(“cd”);
int n = str1.indexOf(str2);
Kết quả là n = 2.
- Hàm kiểm tra xem 1 chuỗi có bắt đầu 1 chuỗi khác hay không: startsWith()
Ví dụ: String str1 = ”Do An I”;
String str2 = ”Do”;
boolean k = str1.startsWith(str2);
Kết quả là k = true.

- Hàm kiểm tra xem 1 chuỗi có kết thúc 1 chuỗi khác không: endsWith()
Tương tự như hàm startsWith()
- Hàm trả về 1 chuỗi được rút ra từ 1 ký tự: copyValueOf()
Ví dụ: char ch[] = {‘a’,’b’,’c’,’d’,’e’);
String str1 = String.copyValueOf(2,2);
Kết quả str1 = ”cd”, nghĩa là xâu str1 được rút ra từ mảng ch bằng cách lấy 2
phần tử của mảng và lấy từ vị trí thứ 2.
- Hàm trả chuyển chuỗi sang chữ hoa: toUpperCase()
- Hàm trả chuyển chuỗi sang chữ thường: toLowerCase()
CHƯƠNG 3: SO SÁNH NỘI DUNG HAI VĂN BẢN
3.1 Sơ đồ khối của hệ thống
3.2 Các hàm thực hiện
3.2.1 Hàm nhập và hiển thị
Cho phép người dùng nhập vào nội dung văn bản cần so sánh hoặc đọc từ
file có sẵn. Nội dung văn bản sẽ được hiển thị lên Textarea.
Cảnh báo người dùng nếu chưa nhập đủ hai văn bản.
Hỗ trợ đọc file văn bản tiếng Việt bằng file Text với đuôi .txt và ecoding là
UTF8.
3.2.2 Hàm xử lí văn bản
Dùng thuật toán tách câu để tách văn bản thành các câu riêng biệt, so sánh
từng câu của hai văn bản với nhau.
Đếm và lưu lại giá trị các câu so khớp giữa hai văn bản.
Tính toán tỉ lệ so khớp giữa hai văn bản.
3.2.3 Hàm Highlight nội dung
Dựa vào nội dung các câu so khớp giữa hai văn bản được lưu lại bằng “Hàm
xử lý văn bản”, “Hàm Highlight nội dung” làm nổi bật các câu này bằng cách đổi
màu background.
3.3 Các bước thực hiện
- Nhập văn bản tiếng việt cần so sánh và hiển thị (xuất) văn bản đó lên giao
diện.

- Chọn cơ sở dữ liệu gốc để so sánh và hiện thị lên giao diện.
- Xử lí văn bản được nhập vào:
+ Cắt các câu cần so sánh trong văn bản được nhập vào và các câu của
văn bản gốc vào 2 arraylist khác nhau.
+ Cắt các khoảng trống giữa các câu.
+ So sánh từng câu của array list 1 vs các câu của arraylist 2.
- Hiển thị lên giao diện sô câu trùng lặp giữa 2 văn bản.
- Đánh dấu, bôi màu các câu của văn bản cần so sánh với văn bản gốc lên giao
diện vùng chứa văn bản gốc.
CHƯƠNG 4: KẾT QUẢ VÀ ĐÁNH GIÁ
4.1 Các kết quả đã đạt được
Sau 1 kì học, chúng em đã viết dược phần mềm bằng Java với mục đích xử lí
và so sánh hai văn bản với nhau đồng thời đưa ra kết quả là tỉ lệ giống nhau giữa
văn bản cần so sánh với văn bản gốc.
Để trực quan hơn cho người dùng, chúng em đã đánh giấu bằng màu sắc các
câu giống lại và hiển thị lên trên văn bản gốc giúp người dùng dễ dàng nhận biết vị
trí các câu trùng lặp.
Bên cạnh đó phần mềm cũng đưa ra những nhắc nhở cho người dùng khi quên
không nhập file văn bản gốc hoặc file văn bản so sánh để người dùng bổ xung.Một
ưu điểm nữa là người dùng có thể bổ xung thêm cơ sở dữ liệu cho file văn bản gốc
để tăng thêm độ tin cậy trong việc thẩm định. Sau khi bổ xung thêm người dùng chỉ
cần nhấn nút “ So sánh” là sẽ có kết quả. Kết quả đó sẽ được bảo đảm an toàn và
không thể thay đổi được bởi bất cứ ai.
Với file văn bản có kích thước vừa và nhỏ thì phần mềm chạy nhanh và cho
kết quả tin cậy. Phần mềm có giao diện đơn giản thân thiện với người dùng. Vì là
phần mềm được viết trên ngôn ngữ Java nên nó có thể chạy được trên tất cả các
máy tính, trên các hệ điều hành khác nhau chỉ cần máy tính có cài đặt máy ảo Java
(Java Virtual Machine). Phần mềm này không yêu cầu hệ thống có cấu hình cao nên
người dùng có thể yên tâm sử dụng.
Qua môn học này, chúng em đã có thêm kiến thức lập trình trên ngôn ngữ

Java. Tư duy lập trình được nâng cao lên. Kĩ năng lập trình được cải thiện. Đồng
thời dưới sự hướng dẫn của thầy và làm việc theo nhóm để thực hiện đề tài này thì
chúng em được tích lũy thêm kinh nghiệm làm việc nhóm, kĩ năng phân công công
việc cho mỗi thành viên vì một mục tiêu chung.
4.2 Các vấn đề còn tồn tại
Thời gian load file văn bản trong cơ sở dữ liệu gốc có dung lượng lớn là khá
lâu dẫn tới bị đơ máy trong khoảng thời gian load khiến người dùng mất một
khoảng thời gian chờ đợi.
Sau khi load xong file văn bản gốc thì phần mềm chạy bình thường và đưa ra
kết quả so sánh lên giao diện. Đó là một nhược điểm cần cải thiện cho phần mềm
này mà chúng em đang tìm cách khắc phục. Nhưng do thời gian có hạn và hiểu biết
còn kém chúng em chưa khắc phục được, chúng em mong nhận được sự chỉ bảo và
giúp đỡ của thầy. Để từ đó chúng em hoàn thiện đề tài này được tốt hơn, khắc phục
được những khuyết điểm và hạn chế đang tồn tại.
KẾT LUẬN
Việc xử lí xâu chuỗi đã và đang là vấn đề hết sức quan trọng nói riêng cũng
như Java và các ngôn ngữ lập trình khác nói chung. Việc nghiên cứu và mô phỏng
phần mềm trên đã phần nào giải quyết bài toán trên. Để đi xâu về vấn để xử lí xâu
chuỗi cũng như các vấn đề khác nhằm khắc phục nhược điểm cũng như tối ưu phần
mềm thì cần một hướng phát triển tiếp cho đề tài này.
Trong khuổn khổ đề tài , chúng em đã áp dụng được một số chức năng của
Java hỗ trợ và một số thuật toán chúng em đã được học trong các môn khác để so
sánh được câu, xử lí câu khi có nhiều vấn đề xảy ra khi so sánh đồng thời đã có thể
cảnh báo số câu trùng lặp trong quá trình so sánh và bôi màu nó hiện lên văn bản
gốc. Đề tài mới chỉ thực hiện ở mức độ mô phỏng trên công cụ netbean, cần được
phát triển để áp dụng vào các phần mềm tối ưu khác.
TÀI LIỆU THAM KHẢO
1. Michael O'Connell, Java: The Inside Story, SunWord, July 1995.
2. Patrick Naughton, Java Was Strongly Influenced by Objective-C.

3. David Bank. The Java saga. Wired Magazine, 30 (12), December 1995.
4. Oracle's Developer Resources for Java Technology.
5. Oracle's Beginner's tutorial for Java SE Programming.
6. A Brief History of the Green Project.
7. Patrick Naughton, The Long Strange Trip to Java, March 18, 1996.
8. W. Kahan and Joseph D. Darcy, How Java's Floating-Point Hurts Everyone
Everywhere, University of California, Berkeley.
9. Shahrooz Feizabadi, A history of Java in: Marc Abrams, ed., World Wide
Web – Beyond the Basics, Prentice Hall, 1998.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×