Draw beautiful diagram effortlessly on ipad. Click here to know more..

Sunday, April 1, 2012

How to implement UndoManager (with example in Java on Android)

Undo-redo is a must-to-have feature in editing programs. This blog post describes how to implement undo-redo in your program. The example taken here is in Java but the concept is very simple and can be implemented easily in any language. 
Here is idea to implement the undo-redo. First of all you need these: UndoManager - a class that implements undo-redo features. UserAction - an abstract base class for all user actions.
The operations in the UndoManager are: undo, redo, canUndo, canRedo, addAction And the operations in UserAction are: perform, undo
As said above, the UserAction abstracts user actions which user can undo. For example in text editing program, inserting a character at a particular cursor location is an action which user can undo. So you need to implement this abstract class for all type of user's undo-able actions. 
Lets start with some real code. The code here is taken from an Android app "Scratchpad" 
This is a simple drawing program using touch. User can draw on the screen using touch dragging on Android tablet screen. So the user action,in this case, is draw a stroke on canvas. A stroke is defined as the drawing done between users actions of starting touch drag and stopping touch drag. Here is UndoManager class:
import java.util.*;
public class UndoManager {
 private UndoManager(){
  undoActions = new Stack();
  redoActions = new Stack();
 }
 public boolean canUndo(){
  return undoActions.size() > 0;
 }
 public boolean canRedo(){
  return redoActions.size() > 0;
 }
 public void undo(){
  if(canUndo()){
   UserAction act = this.undoActions.pop();
   act.undo();
   redoActions.push(act);
  }
 }
 public void redo(){
  if(canRedo()){
   UserAction act = this.redoActions.pop();
   act.perform();
   undoActions.add(act);
  }
 }
 public void add(UserAction action){
  this.undoActions.push(action);
  this.redoActions.clear();
 }
 private Stack undoActions;
 private Stack redoActions;
}

The code for UserAction
public abstract class UserAction {
 public abstract void perform();
 public abstract void undo();
}
Here is code for StrokeAction
public class StrokeAction extends UserAction{
 public StrokeAction(DrawingStroke ds){
  this.stroke = ds;
 }
 @Override
 public void perform(){
  ObjectStore.instance.addObject(stroke);
 }
 @Override
 public void undo(){
  ObjectStore.instance.removeObject(stroke);
 }
 private DrawingStroke stroke;
}

Whenever the user completes a drawing stroke in Scratchpad, an object of DrawingAction is created. The ObjectManager in the code above contains the all stroke objects. Whenever user performs a drawing, we add the stroke to object manager. The drawing of all available objects are managed ObjectManager. And when user wants to undo, we simply remove the stroke from object manager. For simplicity and readability, I am not adding the code of ObjectManager here. 

The code of UndoManager and UserAction is very generic and can be used any application. UserActions has to be implemented for for each undo-able user action type. This implementation will be application dependent.

325 comments:


  1. Hi, This is Jamuna from Chennai. I have read your blog and I got some knowledgeable information through this blog. Really useful blog. Keep update your blog.

    Regards...
    Java Training Chennai

    ReplyDelete
  2. Java Training Institutes Java Training Institutes
    Java Spring Hibernate Training Institutes in Chennai J2EE Training Institutes in Chennai J2EE Training Institutes in Chennai Core Java Training Institutes in Chennai Core Java Training Institutes in Chennai

    Hibernate Online Training Hibernate Online Training Hibernate Training in Chennai Hibernate Training in Chennai Java Online Training Java Online Training Hibernate Training Institutes in ChennaiHibernate Training Institutes in Chennai

    ReplyDelete
  3. Thank You for sharing your article. I like it. It is great information about Java. We provides TIBCO Online Training in Hyderabad.

    ReplyDelete
  4. Thanks for taking time to share this post.It is really useful.Continue sharing more like this.
    Regards, Java Training in Chennai

    ReplyDelete
  5. I have completely read your post and the content is crisp and clear.Thank you for posting such an informative article, I have decided to follow your blog so that I can myself updated.
    Java Training in Chennai

    ReplyDelete
  6. I completely read your blog.It is very useful to me .I have imporve my coading knowledge. Thanks for sharing. Keep sharing more blogs.


    Software Testing Training in chennai

    ReplyDelete
  7. I found your blog while searching for the updates in Selenium WebDriver,I am happy to be here. Very useful content and also easily understandable providing.. Believe me I did wrote an post about selenium tutorials for beginners with reference of your blog.

    ReplyDelete
  8. Needed to compose you a very little word to thank you yet again regarding the nice suggestions you’ve contributed here.

    Java Training in Bangalore

    ReplyDelete
  9. I used to write critical essays about these platforms using useful info about writing critical analysis essays and I must say that I was surprised that these system have such high security level.

    ReplyDelete
  10. Thanks for sharing wonderful information which helps all audience

    devOps Training | devOps supports

    ReplyDelete
  11. Extraordinary occupation for distributed such a gainful site. Your web log isn't just helpful however it is furthermore truly innovative as well. There have a tendency to be relatively few individuals who can surely compose not all that straightforward posts that imaginatively. Proceed with the decent written work Tax Enquiry Accounts

    ReplyDelete
  12. I have read your blog and I gathered some needful information from your blog. Keep update your blog. Waiting for your next update. Java Training in Chennai | Python Training in Chennai

    ReplyDelete
  13. This information is impressive; I am inspired by your post writing style & how continuously you describe this topic.... Java Training in Chennai | Blue prism Training in Chennai

    ReplyDelete
  14. Much obliged to you again for all the information you distribute,Good post. I was exceptionally keen on the article, it's entirely rousing I ought to concede. I like going to you site since I generally run over fascinating articles like this one.Great Job, I incredibly acknowledge that.Do Keep sharing! Respects, HMRC Tax Investigation Accountants

    ReplyDelete
  15. I"ve been surfing online over three hours today, yet I never discovered any fascinating article like yours. It"s really sufficiently worth for me. As I would like to think, if all website admins and bloggers made great substance as you did, the web will be significantly more valuable than any other time in recent memory. Tax Enquiry

    ReplyDelete
  16. On the off chance that more individuals that compose articles truly fretted about composing incredible substance like you, more perusers would be occupied with their works. Much obliged to you for thinking about your substance. Let Campaign Tax Enquiry

    ReplyDelete
  17. i do a lot of article submissions in a week or two and i hire some writers from india and other countries to do my stuf,. Tax Investigation Self Employed

    ReplyDelete
  18. Extraordinary occupation for distributed such a gainful site. Your web log isn't just helpful however it is furthermore truly innovative as well. There have a tendency to be relatively few individuals who can surely compose not all that straightforward posts that imaginatively. Proceed with the decent written work Let Campaign Tax Enquiry Accountants

    ReplyDelete
  19. Hey! A debt of gratitude is in order for the colossal data you havr gave! You have touched on crucuial focuses! Let Property Campaign

    ReplyDelete
  20. I am upbeat to discover this post exceptionally helpful for me, as it contains part of data. I generally want to peruse the quality substance and this thing I found in you post. A debt of gratitude is in order for sharing. Let Property Campaign Accountants

    ReplyDelete
  21. Thanks for sharing this post.Keep sharing more like this.

    dgreatwallofchina
    Education

    ReplyDelete
  22. Thanks for the information, Get the best Java Training in Chennai from hope tutors.

    ReplyDelete
  23. Amazing information,thank you for your ideas.after along time i have studied
    an interesting information's.we need more updates in your blog.
    Selenium Training in Amjikarai
    Selenium Training Institutes in Vadapalani
    Selenium training near me
    Selenium Training in Chennai

    ReplyDelete
  24. I accept there are numerous more pleasurable open doors ahead for people that took a gander at your site.we are providing ReactJs training in Chennai.
    For more details: ReactJs training in Velachery | ReactJs training in chennai

    ReplyDelete
  25. This is the kind of data I've long been attempting to discover. Much obliged to you for composing this data. Buy to Let Property Tax Advisors

    ReplyDelete
  26. That is truly decent to listen. much obliged to you for the upgrade and good fortunes. Buy to Let Property Tax Advice

    ReplyDelete
  27. I am happy you take pride in what you compose. This makes you stand way out from numerous different authors that push ineffectively composed substance. high DA backlinks

    ReplyDelete
  28. Thanks for sharing this unique information with us. Your post is really awesome. Your blog is really helpful for me..
    organic oil
    organic oil in jaipur
    organic cold pressed oils
    ayurvedic oil store in jaipur

    ReplyDelete
  29. Is it alright to post some portion of this on my site essentially present a hyperlink on this page? high DA backlinks

    ReplyDelete
  30. Incredible post I might want to thank you for the endeavors you have made in composing this fascinating and learned article. Buy to Let Tax Advisor

    ReplyDelete
  31. plz any one can help with the code how to add undo redo function using bitmap

    ReplyDelete
  32. Much obliged to you for some other educational web journal. Where else would I be able to understand that sort of data written in such a perfect means? I have a mission that I'm a little while ago chipping away at, and I have been at the post for such data. Buy to Let Property Tax Advice London

    ReplyDelete
  33. Your site is truly cool and this is an awesome rousing article. Much obliged to you to such an extent. Property Tax Accountant

    ReplyDelete
  34. This is really the sort of data I have been attempting to discover. Much thanks to you for composing this data. Property Tax Advice

    ReplyDelete
  35. Thanks for sharing this unique information with us. Your post is really awesome. Your blog is really helpful for me..
    organic oil
    organic oil in jaipur
    organic cold pressed oils
    ayurvedic oil store in jaipur

    ReplyDelete
  36. A debt of gratitude is in order For sharing this Superb article.I utilize this Article to demonstrate my task in college.it is helpful For me Great Work. Property Tax Advisors

    ReplyDelete
  37. I cherish the way you compose and share your corner! Exceptionally intriguing and distinctive! Keep it coming! Tax on Buy to Let Property

    ReplyDelete
  38. I adore this online journal!! The glimmer up the top is wonderful!! Tax Investigation Accountants

    ReplyDelete
  39. Fantastic article. Exceptionally fascinating to peruse. I truly love to peruse such a decent article. Much obliged! continue shaking. Tax Investigation Advisors

    ReplyDelete
  40. I am glad to discover this post Very valuable for me, as it contains part of data. I Always like to peruse The Quality and happy I discovered this thing in you post. Much appreciated Tax Investigation Self Assessment

    ReplyDelete
  41. Goodness, cool post. I"d like to compose like this as well – requiring significant investment and genuine diligent work to make an incredible article… yet I put things off an excessive amount of and never appear to begin. Much obliged however. Tax Investigation Specialists

    ReplyDelete
  42. A debt of gratitude is in order for your post. I've been contemplating composing an exceptionally equivalent post in the course of the last couple of weeks, I'll most likely keep it quick and painless and connection to this rather if thats cool. Much obliged. www.smartphones-pliable.fr

    ReplyDelete
  43. This is truly a pleasant and instructive, containing all data furthermore greatly affects the new innovation. A debt of gratitude is in order for sharing it Tax Investigation Self Employed

    ReplyDelete
  44. Incredible learning, do anybody mind only reference back to it Tax Investigation Accountants

    ReplyDelete
  45. i read a great deal of stuff and i found that the method for composing to clearifing that precisely need to say was great so i am awed and ilike to come back again in future.. Tax Investigation Advisors

    ReplyDelete
  46. Much obliged to you again for all the information you distribute,Good post. I was exceptionally keen on the article, it's very motivating I ought to concede. I like going to you site since I generally go over intriguing articles like this one.Great Job, I incredibly acknowledge that.Do Keep sharing! Respects, Tax Investigation Specialists

    ReplyDelete
  47. If you don't mind proceed with this extraordinary work and I anticipate a greater amount of your marvelous blog entries. Tax Investigation Self Assessment

    ReplyDelete
  48. I'm happy to see the considerable point of interest here!. Tax Investigation Self Employed

    ReplyDelete
  49. Your site is truly cool and this is an awesome motivating article. Much obliged to you to such an extent. Revenue Tax Investigation

    ReplyDelete
  50. Outstanding blog thanks for sharing such wonderful blog with us ,after long time came across such knowlegeble blog. keep sharing such informative blog with us.
    Check out : hadoop training in chennai cost
    hadoop certification training in chennai
    big data hadoop course in chennai with placement
    big data certification in chennai

    ReplyDelete
  51. This was a truly awesome challenge and ideally I can go to the following one. It was alot of fun and I truly had a ball.. Tax Investigation Accountants

    ReplyDelete
  52. I cherish the way you compose and share your corner! Exceptionally intriguing and distinctive! Keep it coming! High TF backlinks

    ReplyDelete
  53. The Project Management Institute (PMI)is a nonprofit membership association and certification body, best known for its Project Management Professional (PMP) credential and the Project Management Body of Knowledge (PMBOK), a collection of best practices and standards for project management.
    Good job and thanks for sharing such a good blog You’re doing a great job. Keep it up !!

    PMP Certification Fees | Best PMP training in chennai |
    pmp certification cost in chennai | PMP Certification Training Institutes in Velachery |
    pmp certification courses and books | pmp certification requirements |
    pmp training centers in chennai | pmp certification requirements

    ReplyDelete
  54. I am unquestionably making the most of your site. You unquestionably have some extraordinary knowledge and awesome stories. Tax Investigation Self Assessment

    ReplyDelete
  55. A debt of gratitude is in order for the post and awesome tips..even I additionally imagine that diligent work is the most imperative part of getting achievement.. Profile backlinks

    ReplyDelete
  56. I respect this article for the all around scrutinized substance and phenomenal wording. I got so included in this material that I couldn"t quit perusing. I am inspired with your work and ability. Much obliged to you to such an extent. Tax Investigation Specialists

    ReplyDelete
  57. This is an extraordinary article much obliged for sharing this enlightening data. I will visit your website consistently for some most recent post. I will visit your web journal consistently for Some most recent post. Revenue Tax Investigation

    ReplyDelete
  58. I cherish the way you compose and share your corner! Exceptionally intriguing and distinctive! Keep it coming! High TF backlinks

    ReplyDelete
  59. I cherish the way you compose and share your corner! Exceptionally intriguing and distinctive! Keep it coming! High TF backlinks

    ReplyDelete
  60. Positive site, where did u think of the data on this posting? I'm satisfied I found it however, sick be inquiring soon to figure out what extra posts you incorporate. atlanta luxury chauffeur service

    ReplyDelete

  61. I like your post very much. It is very much useful for my research. I hope you to share more info about this. Keep posting!!
    Best Devops Training Institute

    ReplyDelete
  62. Much obliged to you for setting aside an ideal opportunity to distribute this data extremely valuable! Tax Investigation Accountants

    ReplyDelete
  63. Incredible Article it its truly useful and imaginative update us as often as possible with new upgrades. its was truly profitable. much appreciated. Tax Investigation Advisors

    ReplyDelete
  64. Kindly fill me in as to whether you're searching for an article essayist for your site. You have some truly extraordinary posts and I feel I would be a decent resource. On the off chance that you ever need to take a percentage of the heap off, I'd totally love to compose some material for your web journal in return for a connection back to mine. It would be ideal if you send me an email if intrigued. Much obliged to you! Tax Investigation Self Assessment

    ReplyDelete
  65. Extremely fascinating online journal. Alot of online journals I see nowadays don't generally give anything that I'm keen on, however I'm most definately intrigued by this one. Recently felt that I would post and let you know. Tax Investigation Specialists
    Extremely fascinating online journal. Alot of online journals I see nowadays don't generally give anything that I'm keen on, however I'm most definately intrigued by this one. Recently felt that I would post and let you know. Tax Investigation Specialists

    ReplyDelete
  66. A debt of gratitude is in order for setting aside an ideal opportunity to talk about this, I feel emphatically about it and affection adapting more on this theme. On the off chance that conceivable, as you pick up skill, would you brain overhauling your online journal with additional data? It is to a great degree accommodating for me. Profile backlinks

    ReplyDelete
  67. البعوض عبارة عن أجنحة للحشرات ، صغيرة الحجم ، وتسبب العديد من الأمراض مثل الملاريا والسالمونيلا وغيرها من الأمراض الخطيرة التي قد تؤدي إلى الوفاة ، وليس فقط تغذية البعوض على دم الإنسان قد يتغذى على دم الحيوانات والطيور. افضل شركة مكافحة حشرات
    شركة مكافحة النمل الابيض بالجبيل
    شركة مكافحة حشرات بالجبيل
    شركة رش مبيدات بالجبيل

    ReplyDelete
  68. I visit your web page. It is really useful and easy to understand. Hope everyone get benefit. Thanks for sharing your Knowledge and experience with us.
    Norton setup - Get started with Norton by downloading the setup and installing it on the device. Enter the unique 25-character alphanumeric product key for activation. Check your subscription norton.com/setup | norton.com/setup | norton.com/setup |norton.com/setup |

    For more Information on MS Office office.com/setup

    ReplyDelete
  69. פוסט נחמד. חייב לשתף עם העוקבים שלי.
    קבוצת גבאי נדלן

    ReplyDelete
  70. This comment has been removed by the author.

    ReplyDelete
  71. רציתי רק לשאול, אפשר לשתף את הפוסט בבלוג שלי?
    תכשיטי אפולו

    ReplyDelete
  72. כתיבה מעולה, אהבתי. אשתף עם העוקבים שלי.
    רהיטים לסלון

    ReplyDelete
  73. סגנון כתיבה מרענן, תודה על השיתוף.
    פינות אוכל נפתחות

    ReplyDelete
  74. הדעות שלי קצת חלוקות בעניין הזה אבל ללא ספק כתבת מעניין מאוד.
    עיניים שקועות

    ReplyDelete
  75. תודה על השיתוף. מחכה לכתבות חדשות.
    הפקת אירועים

    ReplyDelete
  76. מעולה. תודה על הכתיבה היצירתית.
    בייביזמול

    ReplyDelete
  77. אין ספק שהפוסט הזה דורש שיתוף. תודה.
    השקעה בנדלן בחול

    ReplyDelete
  78. After looking at a handful of the blog articles on your web site, I seriously like your way of writing a blog. I book-marked it to my bookmark webpage list and will be checking back soon.YesMovies

    ReplyDelete
  79. Good writeup, I am normal visitor of ones blog, maintain up the excellent operate, and It's going to be a regular visitor for a lengthy time.123Movies

    ReplyDelete
  80. "I am actually glad to glance at this website posts which carries lots of helpful data,
    thanks for providing these data.
    SolarMovies
    "

    ReplyDelete
  81. Nice blog, it's so knowledgeable, informative, and good-looking site. myassignmenthelpau is a great platform that has been performing astonishingly well.FMovies

    ReplyDelete
  82. Excellent information Providing by your Article. Thanks
    gemcreature

    ReplyDelete
  83. I just loved your article on the beginners guide to starting a blog.If somebody take this blog article seriously in their life, he/she can earn his living by doing blogging.thank you for thizs article. blockchain online training

    ReplyDelete
  84. אין ספק שהפוסט הזה דורש שיתוף. תודה.
    תמונה מודפסת על עץ

    ReplyDelete
  85. פוסט נחמד. חייב לשתף עם העוקבים שלי.
    מצלמות אבטחה

    ReplyDelete
  86. Your blog is very good to see & thanks for sharing &keep sharing
    devops training in Hyderabad

    ReplyDelete
  87. הדעות שלי קצת חלוקות בעניין הזה אבל ללא ספק כתבת מעניין מאוד.
    פרסום דיגיטלי לעסקים

    ReplyDelete
  88. Keep up the wonderful piece of work, I read few blog posts on this website and I conceive that your website is real interesting and has got sets of great information. 123Movies
    Movies123
    FMovies
    YesMovies

    ReplyDelete
  89. סופסוף מישהו שתואם לדעותיי בנושא. תודה.
    חברת פיתוח תוכנה

    ReplyDelete
  90. Well I really liked reading it. This tip procured by you is very helpful for accurate planning.Well I really liked reading it. This tip procured by you is very helpful for accurate planning. lgbt là gì

    ReplyDelete
  91. "KUBET - Nhà cái cá cược bóng đá, lô đề, xóc đĩa uy tín nhất năm 2020 - Đăng ký KU BET - KUCASINO - KU CASINO nhận ngay 128K tại KUBET.IO.
    #ku, #kubet, #kucasino, #ku777, #ku888, #ku999, #casino, #kubetio, #keonhacai, #xoso, #lode, #xocdia, #nhacai.
    Social KUBET: https://kubet-ku-casino.webflow.io/
    https://infogram.com/dang-ky-kubet-cach-tao-lap-tai-khoan-ku-bet-don-gian-1h8j4xglr0od6mv<
    https://www.youtube.com/channel/UCyPQbqZIZKV60Q7njSmKe3A
    http://trello.com/kubet"

    ReplyDelete
  92. Taxitaithanhhung.vn - công ty cung cấp giải pháp chuyển nhà trọn gói tại Hà Nội uy tín chuyên nghiệp.
    Liên hệ ngay với dịch vụ chuyển nhà Hà Nội - chuyển nhà trọn gói Thành Hưng để được tư vấn và phục vụ nhanh nhất.
    #taxitaithanhhungvn #chuyennhahanoi #chuyennhataihanoi #chuyennhatrongoihanoi #chuyennhatrongoithanhhung #dichvuchuyennhahanoi #dichvuchuyennhataihanoi
    Link social :
    http://taxitaithanhhungvn.over-blog.com/
    https://www.scoop.it/topic/dich-vu-chuyen-nha-thanh-hung-chuyen-nha-gai-re-ha-noi
    https://trello.com/chuyennhatrongoithanhhung
    https://medium.com/@vantaitthanhhung/dich-vu-chuyen-nha-thanh-hung-tai-ha-noi-9ddbff5cda4
    https://infogram.com/dich-vu-chuyen-nha-tron-goi-ha-noi-chuyen-nghiep-1h0n251r77q96pe?live
    https://tuoitre.vn/chuyen-nha-thanh-hung-20-nam-dong-hanh-va-phat-trien-thuong-hieu-20200422112222106.htm

    ReplyDelete
  93. 188BET - Link vào 188BET mới nhất không bị chặn bởi nhà mạng 2020 tại 188BET.IO. Đăng ký 188BET ngay hôm nay để nhận ngay quà tặng cực khủng. #188bet, #188betio, #bet188, #casino . https://trello.com/188betio/t

    ReplyDelete
  94. "123Movies - Watch Movies Online Free - 123Movies is the new official 123MoviesA.NET. Access 123 movies, Movies 123, movie123, movie 123, 123movie, 123 movie.
    #123movies, #movies123, #movies, #123moviesh. Website: https://www.123moviesa.net/"

    ReplyDelete
  95. "123Movies - Watch Movies Online Free - 123Movies is the new official 123MoviesA.Site. Access 123 movies, Movies 123, movie123, movie 123, 123movie, 123 movie.
    #123movies, #movies123, #movies, #123moviesh. Website: https://123moviesa.site/"""

    ReplyDelete
  96. """
    ThienHaBet là nhà cái số 1 về Casino, bóng đá, lô đề - Hỗ trợ Online 24/7 - Rút tiền 5 phút. Nhận ngay 128k đăng ký Thien Ha Bet tại KUBET.IO.

    Từ khóa: #ku, #kubet, #kucasino, #kubetio, #ku777, #ku888, #ku999, #casino, #thienhabet, #kubetcasino

    Trang chủ Thienhabet: https://kubet.io/thienhabet-nha-cai-uy-tin/"""""""

    ReplyDelete
  97. "KUBET - Nhà cái KU888 đẳng cấp uy tín nhất năm 2020 - Link đăng ký KU BET - KUCASINO - KU CASINO nhận ngay 588K tại KUBET.IO

    Từ khóa: #ku, #kubet, #kucasino, #kubetio, #ku777, #ku888, #ku999, #casino, #thienhabet, #kubetcasino

    Trang chủ KUBET: https://dev.to/kubetio"

    ReplyDelete

  98. I have read your blog its very attractive and impressive. Nice information. It helped me alot.
    Government vacancy
    Govt Jobs
    Sarkari nokri
    latest sarkari vacancy
    Online Form
    latest govt jobs

    ReplyDelete
  99. I really enjoy reading and also appreciate your work.Keto pills

    ReplyDelete
  100. Though i have learned about it but after read your articles, i just realized the amount of knowledge that i missed. Thank for your shared. Jav Streaming

    ReplyDelete
  101. Really suprised with these things, i have thought it would be different. Thanks for useful information Jav Hot

    ReplyDelete
  102. Thank you and thank for your shared, i will introduce to my friend to visit your website more often Jav Free

    ReplyDelete
  103. I have read your blog its very attractive and impressive. Nice information. It helped me alot.
    Government vacancy
    Govt Jobs
    Sarkari nokri
    latest sarkari vacancy
    Online Form
    latest govt jobs

    ReplyDelete
  104. "KUBET — Link KUBET — Tai KUBET tai KUBET.IO. Trang web chính thức, đăng ký, đăng nhập mới nhất của nhà cái KUBET.
    Từ khóa: #ku, #kubet, #kucasino, #kubetio, #ku777, #ku888, #ku999, #casino, #thienhabet, #kubetcasino
    Thông tin mới nhất về KUBET https://twitter.com/i/events/1238063354268114945"

    ReplyDelete
  105. "Meebec.com – Kênh thông tin tổng hợp bóng đá quốc tế mới nhất trong hôm nay – Bóng đá Việt Nam – Soi kèo chuẩn xác nhất – Thông tin update liên tục những nhà cái uy tín hàng đầu Việt Nam – Cập nhật những thông tin bóng đá 24/7, xem trực tiếp bóng đá 24h các giải thi đấu hàng đầu thế giới.
    #meebec #nhacai #bongdameebec #soikeobongda #bongdaquocte #bongdavietnam #lichthidau #giaidauquocte #lichthidaubongda #soikeo #keobongdahomnay #giaidaunoibat
    Cập nhật các tin tức thể thao, bóng đá, nhà cái, soi kèo chính xác nhất tại: https://meebec.com/"

    ReplyDelete
  106. "Chuyển nhà trọn gói Thành Hưng - chuyển nhà trọn gói tại Hà Nội. Công ty chuyển cung cấp dịch vụ chuyển nhà tại Hà Nội. Với đội ngũ nhân viên giàu kinh nghiệm, hệ thống xe tải với số lượng lớn, chuyển nhà Thành Hưng cam kết mang đến cho khách hàng 1 dịch vụ tốt nhất.
    #chuyennhathanhhung #chuyennhatrongoithanhhung #chuyennhahanoi #chuyennhataihanoi #chuyennhatrongoihanoi #dichvuchuyennhahanoi #vanchuyennhahanoi
    Link social :https://sites.google.com/view/vantaithanhhung300"

    ReplyDelete
  107. great inspiring article.pretty much pleased with your good work.very helpful information...
    prescription discount card cvs

    ReplyDelete
  108. Thank you for your post.this post give me lots of advise it is very useful for me.
    Hair salon Brooklyn

    ReplyDelete
  109. "TOPSoiCau.com - Chuyên trang soi cầu xổ số 3 miền, dự đoán kết quả XSMB, XSMT, XSMN chính xác. Soi cầu bạch thủ, song thủ, lô kép, lô xiên, dàn đề chuẩn.
    https://infogram.com/soi-cau-viet-soi-cau-3-mien-247-tot-nhat-topsoicau-1hnq41dl73g943z
    Website soi cầu: topsoicau.com

    #soicau
    #topsoicau
    #soicauviet
    #soicauwin2888
    #soicau888
    #soicau366
    #soicau247
    #soicauxoso
    #soicau666
    #soicaumienbac
    #soicauangiang
    #soicauag
    #soicauasia
    #soicauatrungroi"

    ReplyDelete
  110. I will be interested in more similar topics. i i will be always checking your blog thanks
    wireless backup cameras for cars

    ReplyDelete
  111. הייתי חייבת לפרגן, תודה על השיתוף.
    הדפסת תמונות על קנבס

    ReplyDelete
  112. TOPSoiCau - Chuyên trang SOI CẦU MB, MT, MN VIP 24h tốt nhất Việt Nam 247 cho anh em tham khảo, lấy số đẹp. Dự đoán kết quả xổ số 3 miền Bắc, Trung, Nam nhanh nhất hàng ngày. https://dev.to/topsoicau"Xem thêm: #topsoicau, #soicau, #soicauxsmb, #soicauxsmt, #soicauxsmn, #dudoanxsmb, #dudoanxsmt, #dudoanxsmn, #soicaurongbachkim, #soicauviet, #soicaulotto, #soicaulovip, #soicau3mien, #soicau7777, #soicau247, #soicau555, #soicau366, #soicauwap, #soicau568, #soicau24h, #soicau888, #soicau666, #soicauwin2888, #soicaukubet, #soicaukhongtu Website: TOPSoiCau.com

    ReplyDelete
  113. 123movies. r Completely doesn't have any ads or increase-ons that are damaging to buyers. So you're able to c

    ReplyDelete
  114. Its very useful, without read your article, it hard to think about. Thank you so muchgogoanime

    ReplyDelete
  115. """TOPSoiCau - Chuyên trang SOI CẦU MB, MT, MN VIP 24h tốt nhất Việt Nam 247 cho anh em tham khảo, lấy số đẹp. Dự đoán kết quả xổ số 3 miền Bắc, Trung, Nam nhanh nhất hàng ngày.
    https://stocktwits.com/topsoicau""
    Xem thêm: #topsoicau, #soicau, #soicauxsmb, #soicauxsmt, #soicauxsmn, #dudoanxsmb, #dudoanxsmt, #dudoanxsmn, #soicaurongbachkim, #soicauviet, #soicaulotto, #soicaulovip, #soicau3mien, #soicau7777, #soicau247, #soicau555, #soicau366, #soicauwap, #soicau568, #soicau24h, #soicau888, #soicau666, #soicauwin2888, #soicaukubet, #soicaukhongtu
    sdsdsd
    Website: TOPSoiCau.com
    """

    ReplyDelete
  116. "Taxitaithanhhung.vn- công ty cung cấp dịch vụ chuyển nhà trọn gói tại Hải Phòng - chuyển nhà tại Hải Phòng - chuyển nhà Hải Phòng giá rẻ.
    https://infogram.com/dich-vu-chuyen-nha-tron-goi-hai-phong-1h7j4d83vp0x6nr?live https://medium.com/@vantaitthanhhung/chuyen-nha-tron-goi-hai-phong-taxitaithanhhung-vn-ed41a7a9c6f0
    Website chuyển nhà Thành Hưng:Taxitaithanhhung.vn

    Từ khóa chuyển nhà: #chuyennhasgthanhhung
    #chuyennhahaiphong
    #chuyennhatrongoihaiphong
    #chuyennhataihaiphong
    #chuyennhahaiphonggiare
    #dichvuchuyennhahaiphong
    #vanchuyennhahaiphong
    #chuyennhahaiphonguytin
    #dichvuchuyennhatrongoihaiphong
    "

    ReplyDelete
  117. "Taxitaithanhhung.vn- Website chuyên cung cấp dịch vụ chuyển nhà trọn gói tại Hải Phòng - chuyển nhà tại Hải Phòng - chuyển nhà Hải Phòng giá rẻ.
    https://www.ko-fi.com/post/Dich-vu-chuyen-nha-tai-Hai-Phong--0915-388-666-J3J81TFJP https://sketchfab.com/chuyennhahaiphong
    Website chuyển nhà Thành Hưng:Taxitaithanhhung.vn

    Từ khóa chuyển nhà: #chuyennhasgthanhhung
    #chuyennhahaiphong
    #chuyennhatrongoihaiphong
    #chuyennhataihaiphong
    #chuyennhahaiphonggiare
    #dichvuchuyennhahaiphong
    #vanchuyennhahaiphong
    #chuyennhahaiphonguytin
    #dichvuchuyennhatrongoihaiphong
    "

    ReplyDelete
  118. "Taxitaithanhhung.vn- Website chuyên cung cấp dịch vụ chuyển nhà trọn gói tại Hải Phòng - chuyển nhà tại Hải Phòng - chuyển nhà Hải Phòng giá rẻ.
    https://www.ko-fi.com/post/Dich-vu-chuyen-nha-tai-Hai-Phong--0915-388-666-J3J81TFJP https://sketchfab.com/chuyennhahaiphong
    Website chuyển nhà Thành Hưng:Taxitaithanhhung.vn

    Từ khóa chuyển nhà: #chuyennhasgthanhhung
    #chuyennhahaiphong
    #chuyennhatrongoihaiphong
    #chuyennhataihaiphong
    #chuyennhahaiphonggiare
    #dichvuchuyennhahaiphong
    #vanchuyennhahaiphong
    #chuyennhahaiphonguytin
    #dichvuchuyennhatrongoihaiphong
    "dffdfd

    ReplyDelete
  119. Locally owned and operated roofing business, we are dedicated to quality craftsmanship and outstanding customer service. Our integrity and thoroughness will make your roofing experience a rewarding one.
    Titan Roofing

    ReplyDelete
  120. "Taxitaithanhhung.vn- dịch vụ chuyển nhà trọn gói Thành Hưng : công ty cung cấp giải pháp chuyển nhà Hà Nội - chuyển nhà trọn gói Hà Nội số 1 Việt Nam
    https://stocktwits.com/chuyennhahanoi
    Website chuyển nhàThành Hưng: taxitaithanhhung.vn

    #taxitaithanhhung
    #chuyennhathanhhung
    #chuyennhahanoi
    #chuyennhatrongoihanoi
    #vanchuyennhahanoi
    #chuyennhatrongoihanoi
    #dichvuchuyennhahanoi
    #dichvuchuyenhathanhhung
    #dichvuchuyennhatrongoihanoi
    #chuyennhatrongoithanhhung
    #chuyennhahanoiuytin
    #chuyennhatihanoi
    "

    ReplyDelete
  121. Radioboss Crack-
    A lot of people failed at what you accomplished, simply because they were busy finding problems while you were busy finding solutions.

    ReplyDelete
  122. Ableton Live Cracked
    Opportunity comes to those who quit Waiting and start Looking. Success comes to those who quit Thinking and start Doing. Congratulations for Looking and Doing.

    ReplyDelete
  123. Windows 8 Activator Key
    Your work speaks volumes of the kind of man you are – efficient, organized and result-oriented.

    ReplyDelete
  124. Nessus Crack With Keygen
    Even the smallest of jobs well done will take you one step closer towards the success that you have always dreamed about. Keep it up.

    ReplyDelete
  125. 3utools CrackYour hard work and effort have paid off! A success well deserved, an occasion worth celebrating! Congratulations!

    ReplyDelete
  126. Macbooster Torrent
    Doing a good job is not always about impressive innovation. Sometimes it is only about doing something with plain dedication.

    ReplyDelete
  127. Smadav Pro Crack
    alent means nothing, while experience, acquired in humility and with hard work, means everything.

    ReplyDelete
  128. Drivermax Pro Crack
    Not a single effort of yours will go in vain. You will be rewarded for your pain. Your hard work will bring you a lot of gain.

    ReplyDelete
  129. Windows 10 Activator
    The highest reward for man’s toil is not what he gets for it, but what he becomes by it.

    ReplyDelete
  130. Smadav Pro Crack
    The highest reward for man’s toil is not what he gets for it, but what he becomes by it.

    ReplyDelete
  131. Microsoft Toolkit Final Activator
    If Oscars were given for a job well done, I’d nominate you! Congratulations for your fantastic achievement

    ReplyDelete
  132. chuyển nhà trọn gói Thành Hưng

    taxitaithanhhung042020@gmail.com

    https://vnexpress.net/20-nam-taxi-tai-thanh-hung-phuc-vu-khach-hang-4075831.html

    "Taxi tải Thành Hưng - xe tải Thành Hưng - Vận tải Thành Hưng dịch vụ vận tải số 1 Việt Nam.
    Taxitaithanhhung.vn - công ty cung cấp giải pháp chuyển nhà - chuyển văn phòng trọn gói tại Hà Nội.
    #taxitaithanhhungvn #taxitaithanhhung #vantaithanhhung #xetaithanhhung #taxitaihanoi #taithanhhung #taxithanhhung #xeThanhhung #chuyennhathanhhung #thanhhung
    Link social :
    https://vnexpress.net/20-nam-taxi-tai-thanh-hung-phuc-vu-khach-hang-4075831.html"

    ReplyDelete
  133. "Taxi tải Thành Hưng - xe tải Thành Hưng - Vận tải Thành Hưng dịch vụ vận tải số 1 Việt Nam.
    Taxitaithanhhung.vn - công ty cung cấp giải pháp chuyển nhà - chuyển văn phòng trọn gói tại Hà Nội.
    #taxitaithanhhungvn #taxitaithanhhung #vantaithanhhung #xetaithanhhung #taxitaihanoi #taithanhhung #taxithanhhung #xeThanhhung #chuyennhathanhhung #thanhhung
    Link social :ddddddddddddddd
    https://vnexpress.net/20-nam-taxi-tai-thanh-hung-phuc-vu-khach-hang-4075831.html"

    ReplyDelete
  134. "Putlocker - Putlockers new site 2020 - Putlockerc new site | Putlocker new | Putlockerc.to where you can watch free movies online in HD quality.

    https://putlockercto.contently.com/
    #putlocker
    #putlockers
    #pulockerc
    #putlockerproxy
    #putlockers2
    #putlockerreddit
    #putlockerc.to
    #putlockerswebsite
    "

    ReplyDelete
  135. "Thietkenhadepmoi.vn - công ty thiết kế nhà đẹp uy tín. Thiết kế nhà - thiết kế nhà đẹp mới - thiết kế thi công nhà đẹp - thiết kế xây dựng nhà đẹp - mẫu nhà đẹp mới. Tổng hợp các mẫu nhà mái thái đẹp - mẫu nhà phố đẹp - mẫu biệt thự đẹp sang trọng.
    Liên hệ ngay với công ty Thiết kế nhà đẹp mới để được tư vấn và báo giá miễn phí!
    https://www.reddit.com/user/thiekenhadepmoivn

    Từ khóa thiết kế nhà đẹp mới :
    #thietkenhadepmoi #thietkenhadepmoivn #thietkennha #thietkennhadep #maunhadepmoi #thietkennhadepmoi #thietkennhauytin #maubietthudep #maunhamaithaidep #mauthietkenhadep #thietkexaydungnhadep #maunhaphodep #congtythietkenhadep #thietkethicongnhadep #thietkexaydungnhadep #maunhadepmoi #maunhamoi #xaydungnhadep #congtynhadep
    "

    ReplyDelete
  136. "Putlocker 2020 - Putlockerc.to - Illegal HD Movies Download Website. Putlockers is a website that provides updated links to movies and TV shows like a large index of streaming sources.
    https://www.pinterest.com/pin/714313190889726952/

    #putlocker
    #putlockers
    #pulockerc
    #putlockerproxy
    #putlockers2
    #putlockerreddit
    #putlockerc.to
    #putlockerswebsite"

    ReplyDelete