Wednesday, April 14, 2010

System error support in C++0x - part 5

[ part 1, part 2, part 3, part 4 ]

Creating your own error conditions

User-extensibility in the <system_error> facility is not limited to error codes: error_condition permits the same customisation.

Why create custom error conditions?

To answer this question, let's revisit the distinction between error_code and error_condition:

  • class error_code - represents a specific error value returned by an operation (such as a system call).
  • class error_condition - something that you want to test for and, potentially, react to in your code.

This suggests some use cases for custom error conditions:

  • Abstraction of OS-specific errors.

    Let's say you're writing a portable wrapper around getaddrinfo(). Two interesting error conditions are the tentative "the name does not resolve at this time, try again later", and the authoritative "the name does not resolve". The getaddrinfo() function reports these errors as follows:

    • On POSIX platforms, the errors are EAI_AGAIN and EAI_NONAME, respectively. The error values are in a distinct "namespace" to errno values. This means you will have to implement a new error_category to capture the errors.
    • On Windows, the errors are WSAEAI_AGAIN and WSAEAI_NONAME. Although the names are similar to the POSIX errors, they share the GetLastError "namespace". Consequently, you may want to reuse std::system_category() to capture and represent getaddrinfo() errors on this platform.

    To avoid discarding information, you want to preserve the original OS-specific error code while providing two error conditions (called name_not_found_try_again and name_not_found, say) that API users can test against.

  • Giving context-specific meaning to generic error codes.

    Most POSIX system calls use errno to report errors. Rather than define new errors for each function, the same errors are reused and you may have to look at the corresponding man page to determine the meaning. If you implement your own abstractions on top of these system calls, this context is lost to the user.

    For example, say you want to implement a simple database where each entry is stored in a separate flat file. When you try to read an entry, the database calls open() to access the file. This function sets errno to ENOENT if the file does not exist.

    As the database's storage mechanism is abstracted from the user, it could be surprising to ask them to test for no_such_file_or_directory. Instead, you can create your own context-specific error condition, no_such_entry, which is equivalent to ENOENT.

  • Testing for a set of related errors.

    As your codebase grows, you might find the same set of errors are checked again and again. Perhaps you need to respond to low system resources:

    • not_enough_memory
    • resource_unavailable_try_again
    • too_many_files_open
    • too_many_files_open_in_system
    • ...

    in several places, but the subsequent action differs at each point of use. This shows that there is a more general condition, "the system resources are low", that you want to test for and react to in your code.

    A custom error condition, low_system_resources, can be defined so that its equivalence is based on a combination of other error conditions. This allows you to write each test as:

    if (ec == low_system_resources)
    ...

    and so eliminate the repetition of individual tests.

The definition of custom error conditions is similar to the method for error_codes, as you will see in the steps below.

Step 1: define the error values

You need to create an enum for the error values, similar to std::errc:

enum class api_error
{
low_system_resources = 1,
...
name_not_found,
...
no_such_entry
};

The actual values you use are not important, but you must ensure that they are distinct and non-zero.

Step 2: define an error_category class

An error_condition object consists of both an error value and a category. To create a new category, you must derive a class from error_category:

class api_category_impl
: public std::error_category
{
public:
virtual const char* name() const;
virtual std::string message(int ev) const;
virtual bool equivalent(
const std::error_code& code,
int condition) const;
};

Step 3: give the category a human-readable name

The error_category::name() virtual function must return a string identifying the category:

const char* api_category_impl::name() const
{
return "api";
}

Step 4: convert error conditions to strings

The error_category::message() function converts an error value into a string that describes the error:

std::string api_category_impl::message(int ev) const
{
switch (ev)
{
case api_error::low_system_resources:
return "Low system resources";
...
}
}

However, depending on your use case, it may be unlikely that you'll ever call error_condition::message(). In that case, you can take a shortcut and simply write:

std::string api_category_impl::message(int ev) const
{
return "api error";
}

Step 5: implement error equivalence

The error_category::equivalent() virtual function is used to define equivalence between error codes and conditions. In fact, there are two overloads of the error_category::equivalent() function. The first:

virtual bool equivalent(int code,
const error_condition& condition) const;

is used to establish equivalence between error_codes in the current category with arbitrary error_conditions. The second overload:

virtual bool equivalent(
const error_code& code,
int condition) const;

defines equivalence between error_conditions in the current category with error_codes from any category. Since you are creating custom error conditions, it is the second overload that you must override.

Defining equivalence is simple: return true if you want an error_code to be equivalent to your condition, otherwise return false.

If your intent is to abstract OS-specific errors, you might implement error_category::equivalent() like this:

bool api_category_impl::equivalent(
const std::error_code& code,
int condition) const
{
switch (condition)
{
...
case api_error::name_not_found:
#if defined(_WIN32)
return code == std::error_code(
WSAEAI_NONAME, system_category());
#else
return code = std::error_code(
EAI_NONAME, getaddrinfo_category());
#endif
...
default:
return false;
}
}

(Obviously getaddrinfo_category() needs to be defined somewhere too.)

The tests can be as complex as you like, and can even reuse other error_condition constants. You may want to do this if you're creating a context-specific error condition, or testing for a set of related errors:

bool api_category_impl::equivalent(
const std::error_code& code,
int condition) const
{
switch (condition)
{
case api_error::low_system_resources:
return code == std::errc::not_enough_memory
|| code == std::errc::resource_unavailable_try_again
|| code == std::errc::too_many_files_open
|| code == std::errc::too_many_files_open_in_system;
...
case api_error::no_such_entry:
return code == std::errc::no_such_file_or_directory;
default:
return false;
}
}

Step 6: uniquely identify the category

You should provide a function to return a reference to a category object:

const std::error_category& api_category();

such that it always returns a reference to the same object. As with custom error codes, you can use a global:

api_category_impl api_category_instance;

const std::error_category& api_category()
{
return api_category_instance;
}

or you can make use of C++0x's thread-safe static variables:

const std::error_category& api_category()
{
static api_category_impl instance;
return instance;
}

Step 7: construct an error_condition from the enum

The <system_error> implementation requires a function called make_error_condition() to associate an error value with a category:

std::error_condition make_error_condition(api_error e)
{
return std::error_condition(
static_cast<int>(e),
api_category());
}

For completeness, you should also provide the equivalent function for construction of an error_code. I'll leave that as an exercise for the reader.

Step 8: register for implicit conversion to error_condition

Finally, for the api_error enumerators to be usable as error_condition constants, enable the conversion constructor using the is_error_condition_enum type trait:

namespace std
{
template <>
struct is_error_condition_enum<api_error>
: public true_type {};
}

Using the error conditions

The api_error enumerators can now be used as error_condition constants, just as you may use those defined in std::errc:

std::error_code ec;
load_resource("http://some/url", ec);
if (ec == api_error::low_system_resources)
...

As I've said several times before, the original error code is retained and no information is lost. It doesn't matter whether that error code came from the operating system or from an HTTP library with its own error category. Your custom error conditions can work equally well with either.

Next, in what will probably be the final instalment, I'll discuss how to design APIs that use the <system_error> facility.

282 comments:

«Oldest   ‹Older   201 – 282 of 282
Petersons said...

I am really very agree with your qualities it is very helpful for look like home. Thanks so much for info and keep it up.


scam

Julli said...

This is a wonderful article, Given so much info in it, These type of articles keeps the user's interest in the website.
stratford management scam

Petersons said...

Spot on with this article, I really think this website needs more attention. I'll probably be back to read more, thanks for the info.


Google auto complete

john said...

NO BLAME. NO SHAME. You have tax issues, and it’s our job to solve them. We’ll develop a strategy you can manage and negotiate with the taxing authorities on your behalf.

tax solution

Petersons said...

Hi there, I just wanted to say thanks for this informative post, can you please allow me to post it on my blog?


Baby dressing

Petersons said...

yes it happens with me as well. we feel the difference, convince and comfort. but how ever we are not simple free of worries as these old people were.nice article.


biofit supplement reviews

Akaslot said...

เล่นสล็อตและก็เกมแจ็คพอตที่น่าตื่นตาตื่นใจที่ AKASLOT
ตรวจคอลเลกชั่น pgslot รวมทั้งเกมที่นานาประการแล้วก็นานาประการของพวกเรา คุณจะศึกษาค้นพบภาพที่งดงาม การเล่นเกมที่สมจริงสมจัง และก็จังหวะที่จะชนะรางวัลแจ็คพอตสุดดีเลิศ ตัวเลือกไม่จบไม่สิ้น ตั้งแต่เกมเริ่มแรกของ Grosvenor Casinos รวมทั้ง Tiki Runner และก็ Atlantis Megaways ไปจนกระทั่งเกมใหม่แล้วก็พิเศษสุดตื่นเต้น ยกตัวอย่างเช่น pgslot คุณมั่นใจว่าจะได้เจอกับเกมที่จะทำให้ท่านเพลิน
เพลิดเพลินเจริญใจกับลักษณะพิเศษตั้งแต่ฟรีสปินแล้วก็เกมโบนัสไปจนกระทั่งแจ็คพอตรายวันรวมทั้งการแลกเปลี่ยนเครื่องหมาย ตลอดจนการชำระเงินสูงสุด 250,000 ปอนด์สำหรับเกมที่ไม่ใช่แจ็คพอตเพียงแค่นั้น รับข้อมูลทั้งหมดทั้งปวงเกี่ยวกับสล็อตแจ็คพอตรวมทั้งเกมที่มีให้ที่ pgslot จาก AKASLOT
เล่นสล็อตออนไลน์ที่ AKASLOT
ถ้าเกิดคุณพึ่งสมัครสมาชิกกับ AKASLOT ช่องทางที่คุณกำลังปรารถนาเล่นสล็อตออนไลน์หรือ pgslot ด้วยแบบอย่างที่เรียบง่ายรวมทั้งคุณลักษณะที่บันเทิงใจ pgslot ออนไลน์มอบประสบการณ์การเล่นเกมที่บรรเทาแล้วก็บีบคั้นต่ำ มีเกมให้เลือกมากพร้อมธีมนานาประการตั้งแต่อียิปต์โบราณรวมทั้ง Lucky Leprechauns ไปจนกระทั่งภาพยนตร์ฮอลลีวูดแล้วก็รายการทีวี แต่ละเกมมีข้อเสนอแนะของตนเอง ด้วยเหตุผลดังกล่าวแม้คุณจะไม่เคยเล่นสล็อตออนไลน์มาก่อน คุณก็จะเข้าจิตใจได้อย่างเร็วว่าควรจะมองหาเครื่องหมายใดและก็ช่องชำระเงินดำเนินการเช่นไร pgslot ออนไลน์ไม่น้อยเลยทีเดียวมีรอบหมุนฟรีซึ่งคุณสามารถหมุนวงล้อโดยไม่ต้องพนันเงินสดรวมทั้งคุณลักษณะที่น่าตื่นตาตื่นใจที่ให้ท่านเป็นไปได้มากขึ้นที่จะชนะรางวัลเงินสด

แนวทางเล่นสล็อตออนไลน์
ด้วยเหตุดังกล่าวคุณเล่น pgslot ออนไลน์ยังไง เกมสล็อตเกือบจะทั้งหมดมีคำเสนอแนะรากฐานแบบเดียวกัน เพียงแค่คลิกปุ่มหมุนแล้วเกมจะจัดแจงที่เหลือ
เกม pgslot ไม่ได้อยากความสามารถหรือกลอุบายอะไรก็ตามด้วยเหตุว่าชัยขึ้นกับช่องทาง สล็อตออนไลน์ก็เลยเย้ายวนใจผู้เล่นทุกระดับ

ช่องชำระเงินเกมสล็อต
เพื่อชนะ คุณจำต้องจับคู่เครื่องหมายที่เช่นกันในลำดับเฉพาะบนวงล้อ นี่เรียกว่าเพย์ไลน์หรือวินไลน์ แต่ละเกมจะมีปริมาณช่องชำระเงินที่ไม่เหมือนกัน คุณสามารถมองว่าสิ่งพวกนี้เป็นยังไงในแต่ละรายการอาหารช่วยเหลือในเกม เพย์ไลน์ชอบ:
เป็นระเบียบเรียบร้อย
ในต้นแบบสิกข์แซก
เป็นรูปตัววี
แนวเฉียง

เครื่องหมายที่ชนะในแต่ละเกมจะนาๆประการ และก็ช่องชำระเงินจะมีน้ำหนักนาๆประการในแต่ละสปิน เมื่อคุณเล่นด้วยเงินจริง ยอดเงินของคุณจะถูกหักเมื่อใดก็ตามคุณหมุนวงล้อ คุณควรต้องตกลงใจว่าจะวางเดิมพันในแต่ละเพย์ไลน์มากมายน้อยแค่ไหนเพื่อประกอบเป็นเงินที่ใช้ในการเดิมพันทั้งสิ้นของคุณ
ซึ่งแน่ๆว่าการเล่นเกมสล็อตหรือ pgslot ออนไลน์ สำหรับช่องบางช่องมิได้ใช้ช่องชำระเงินรวมทั้งชำระเงินตามปริมาณเครื่องหมายที่คุณวางบนวงล้อแทน ด้วยเกมชนิดนี้ คุณสามารถมีแนวทางชนะมากยิ่งกว่า 2,000 แนวทาง เกม Megaways พรีเซ็นท์ความมากมายหลายมากขึ้นเรื่อยๆด้วยสูงถึง 117,649 แนวทางสำหรับเพื่อการชนะ!

Petersons said...

I am really very agree with your qualities it is very helpful for look like home. Thanks so much for info and keep it up.


appliancemississauga.com

Lisa Ashley said...

Unable to do registration of Alexa or getting registration failure error? Don’t Panic! Alexa Helpline is here to help you. Alexa customer service

Petersons said...

I am really very agree with your qualities it is very helpful for look like home. Thanks so much for info and keep it up.


scam

Echo Helpline said...

If you are unable to update the framework of your Echo device ten you need an expert technician’s help. In this condition Echo Helpline is the best option for you. Alexa Yellow Ring

Geeks For Tech said...

If you have just started a new business and set up a new office, you definitely need network setup in your office space. But you need an expert technician for that. You must be assured with the services provided by the company. Geek Squad

Petersons said...

לא כל כך מסכים עם הכל כאן האמת.

חברת פרגולות אלומיניום בחיפה

Mac Smith said...

If you are thinking of buying new vanities for your home then don't look further than NZHomeware. NZHomeware is a well-known company that can help you with the best quality and branded bathroom accessories like, sink, vanity and bathroom taps etc. shower mixer

adasda said...

togel sidney, data sidney, merupakan situs judi togel online terbaik dan terbesar no 3 di indonesia, yuk gabung segera di situs asiktogelku. minimal deposit 25.000 saja. data sdy

Petersons said...

לא כל כך מסכים עם הכל כאן האמת.

רעות מלכין עיצוב גבות

먹튀검증 said...

Of course, your article is good enough, 먹튀검증 but I thought it would be much better to see professional photos and videos together. There are articles and photos on these topics on my homepage, so please visit and share your opinions.

메이저안전놀이터 said...

I've been searching for hours on this topic and finally found your post. 메이저안전놀이터, I have read your post and I am very impressed. We prefer your opinion and will visit this site frequently to refer to your opinion. When would you like to visit my site?

Petersons said...

Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog.Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog.


car opening service

Julli said...

I was exactly searching for. Thanks for such a post and please keep it up.
Clear Water Management

Aarav singh said...

overseas education consultancies
overseas consultants in delhi
overseas education consultants

Carlos Ward said...

If you will use the Re.rockspace.local login web domain, then the configuration will be very simple and easy for you, it hardly matters the model number and the update version. The users need to have Ap.setup access through the web browser that they will be using in their mobile or the computer device.

Petersons said...

אני לא מסכים עם כל מה שכתוב, אבל מאמר מעניין מאוד

עיצוב גבות תל אביב

Petersons said...

Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog.Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog.


Houston Garage Door 4 Business

Julli said...

It's always exciting to read articles from other writers and practice something from their websites.
local locksmith

Julli said...

Thanks for the nice blog. It was very useful for me. I'm happy I found this blog. Milton Locksmith Pro

Harry Butler said...

Thanks for sharing this wonderful post with us. This is more helpful for explain how elder law lawyers thinks about families and their future.

nive said...

wonderful blog..its very interesting to read...
Selenium training and placement in coimbatore
Selenium course fees in coimbatore
Selenium online class in coimbatore
Selenium online class fee in coimbatore
Best Selenium training course in coimbatore
Best Selenium online courses in coimbatore
Selenium online training in coimbatore

James said...

A useful post shared. 24/7 Locksmith

Tim Pegios said...

If you have any problems regarding how to fix Orbi Won't Connect to WiFi issue, then don't worry; you can consult with our experienced experts. To get 24*7 instant help, you can just dial our toll-free helpline numbers at USA/CA: +1-855-869-7373 and UK/London: +44-800-041-8324.

Printer Offline Tech said...

Call our printer offline tech experts to fix issues of Brother Printer Can’t Connect To WiFi. If you want to know how to fix it, then don't hesitate to get in touch with us in the USA/CA: +1-888-966-6097 and UK/London: +44-808-169-7737. We are available 24*7 hours for you.

Petersons said...

Hi there, I just wanted to say thanks for this informative post, can you please allow me to post it on my blog?

etobicokecarlocksmith.com

koko said...

แจกโปรโมชั่นอีกแล้วมาสนุกกับการเดิมพันของเว็บเกมสล็อตออนไลน์กับ pg slot ทางเข้าเล่น ตอนนี้ทางเรามีโปรโมชั่นมาแจกให้กับผู้ชื่นชอบการเดิมพันทุกท่าน กับเว็บเกมสล็อตออนไลน์ยอดฮิตที่มีความนิยมเป็นอย่างมากในตอนนี้ มีเกมส์หลายสไตล์ให้ลงเล่น เพียงท่านทำการสมัครสมาชิกกับเราก็จะได้รับโปรโมชั่นรับโบนัส 100% ทันที และสมาชิกเก่า ยังมีโปรโมชั่นคืนยอดเสียรับโบนัส 10% อีกด้วย สมัครสมาชิกกันเลยตอนนี้

메이저사이트 said...

First of all, thank you for your post. 메이저사이트 Your posts are neatly organized with the information I want, so there are plenty of resources to reference. I bookmark this site and will find your posts frequently in the future. Thanks again ^^

Unknown said...

Thanks for your marvelous posting! I actually enjoyed reading it, you could be
a great author.I will remember to bookmark your blog and will
eventually come back from now on. I want to encourage you to continue your great
writing, have a nice weekend!

Website:온라인카지노


IWEBCODE said...

IWEBCODE is the Best Website Design and Development Company in Mohali that provides all possible solutions to your Digital problems. For more details visit here: - https://iwebcode.design/

Petersons said...

I have been reading your posts regularly. I need to say that you are doing a fantastic job. Please keep up the great work.


stratford management scam

Phonera said...

Nice blog. Get your and insights into the Latest Phones and Technologies. A place, where you can rely on true and authentic reviews before your phone purchase.

UFABET1688 said...

Thanks for some other informative site. The place else may I am getting that type of information written in such a perfect approach? สมัครยูฟ่าเบท I’ve a challenge that I am simply now running on, and I have been on the look out for such information.

James said...

This is a wonderful article, Given so much info in it, These type of articles keeps the user's interest in the website. Lock Installation

Petersons said...

Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog.Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog.


transponder key programming

메이저사이트 said...

Good morning!! I am also blogging with you. In my blog, articles related to are mainly written, and they are usually called 메이저사이트. If you are curious about , please visit!!

UFABET1688 said...

I think this is an informative post and it is very useful and knowledgeable. therefore, I would like to thank you for the efforts you have made in writing this article. ยูฟ่า168

John Watson said...

Are you having trouble trying to login to dlink router account? Worry no more. Here are straightforward guides to help you login successfully into your dlink router account. In addition, you do not have to bother about how much time it will take. In a few minutes, you will be done.
Dlinkap.local
Dlinkrouter.local

Asus Router Setup said...

Have you been wondering what the wifi password for your Asus router is? It is very easy. A default password comes with Asus wifi router for easy login and setup. You will find the correct Asus router password default here so that you can begin with your login or setup.
Login to Asus Router
Router.asus.com
Reset Asus Router

Orbi login said...

If you are finding it hard to login into your Orbi wifi router, there is a solution here for you. We have answered your question under the blog “why is my orbilogin.com not working”. Here you will find the answers to why you are experiencing login difficulties and the solutions.

Orbi Login
Orbi Router Login

Unknown said...

Thanks for sharing this wonderful post with us. This is more helpful for explain crypto tax Australia.

Printer Offline Tech said...

Do you have any issues regarding how to fix Brother Printer Error 50? Then no need to worry; you can just dial our toll-free numbers at USA/CA: 1-888-966-6097 for better customer service. We are here always ready to help you. Get in touch with us for more information.

먹튀커뮤니티 said...

I seriously love your site.. Very nice colors & theme. Did you create this site yourself? Please reply back as I’m trying to create my very own site and would like to learn where you got this from or exactly what the theme is named. Many thanks. 먹튀커뮤니티

Unknown said...

Thanks for sharing this wonderful post with us. This is more helpful for find the best top it company in the Bhutan Country. It also gives us well knowledge about business and websites related information.

Unknown said...

Thanks for sharing this wonderful post with us. This is more helpful for find the best open source erp system in the Bhutan Country.

안전놀이터추천 said...

Thank you so much for such a well-written article. It’s full of insightful information. Your point of view is the best among many without fail.For certain, It is one of the best blogs in my opinion. 안전놀이터추천

메이저놀이터추천 said...

We are looking for a lot of data on this item. In the meantime, this is the perfect article I was looking for . Please post a lot about items related to 메이저놀이터추천 !!! I am waiting for your article. And when you are having difficulty writing articles, I think you can get a lot of help by visiting my .

먹튀사이트 said...

Your writing is perfect and complete. 먹튀사이트 However, I think it will be more wonderful if your post includes additional topics that I am thinking of. I have a lot of posts on my site similar to your topic. Would you like to visit once?

토토커뮤니티 said...

Amazing article..!! Thank you so much for this informative post. I found some interesting points and lots of information from your blog. Thanks 토토커뮤니티

토토사이트 said...

Hello, I'm happy to see some great articles on your site. Would you like to come to my site later? My site also has posts, comments and communities similar to yours. Please visit and take a look 토토사이트

Unknown said...

Thanks for sharing this wonderful post with us. This is more helpful for find the best IT company in the Bhutan Country.

안전놀이터 said...

Thank you for some other informative blog. Where else could I get that type of information written in such an ideal means? I have a mission that I’m just now working on, and I have been at the look out for such information. 안전놀이터 It helped me a lot. If you have time, I hope you come to my site and share your opinions. Have a nice day.

메이저토토사이트 said...

It has fully emerged to crown Singapore's southern shores and undoubtedly placed her on the global map of residential landmarks. I still scored the more points than I ever have in a season for GS. I think you would be hard pressed to find somebody with the same consistency I have had over the years so I am happy with that. 메이저토토사이트

Anonymous said...

When I read your article on this topic, the first thought seems profound and difficult. There is also a bulletin board for discussion of articles and photos similar to this topic on my site, but I would like to visit once when I have time to discuss this topic. 메이저사이트


먹튀검증사이트 said...

As I am looking at your writing, 먹튀검증사이트 I regret being unable to do outdoor activities due to Corona 19, and I miss my old daily life. If you also miss the daily life of those days, would you please visit my site once? My site is a site where I post about photos and daily life when I was free.

Unknown said...

That's a really impressive new idea! 안전한놀이터 It touched me a lot. I would love to hear your opinion on my site. Please come to the site I run once and leave a comment. Thank you.


메이저사이트모음 said...

Many thanks for the article, I have a lot of spray lining knowledge but always learn something new. Keep up the good work and thank you again. 메이저사이트모음

안전놀이터추천 said...

Hey there! I could have sworn I’ve been to this website before but after reading through some of the post I realized it’s new to me. Nonetheless, I’m definitely happy I found it and I’ll be book-marking and checking back frequently 안전놀이터추천

keo nha cai said...

Thank you for any other informative blog. Where else may just I am getting that kind of information written in such a perfect method? I have a mission that I’m simply now working on, and I have been on the glance out for such info. keo nha cai

사설토토사이트 said...

Exceptional post however , I was wanting to know if you could write a litte more on this topic? I’d be very thankful if you could elaborate a little bit further. Thanks 사설토토사이트

Unknown said...

Thanks for sharing this wonderful post with us. This is more helpful and also provides the more detailed information regarding crypto tax filling.

unknown said...

You made some good points there. I did a Google search about the topic and found most people will believe your blog. 메이저사이트


먹튀검증 said...

Many thanks for the article, I have a lot of spray lining knowledge but always learn something new. Keep up the good work and thank you again. 먹튀사이트

먹튀검증 said...

I was impressed by your writing. Your writing is impressive. I want to write like you.스포츠토토사이트 I hope you can read my post and let me know what to modify. My writing is in I would like you to visit my blog.

starport said...

According to a study in the United States, the risk of stomach cancer is reduced by 50% and colorectal cancer by 30% when half garlic is consumed continuously a day. There is also.
스포츠토토

안전놀이터추천 said...

Thank you for any other informative blog. Where else may just I am getting that kind of information written in such a perfect method? I have a mission that I’m simply now working on, and I have been on the glance out for such info. 안전놀이터추천

먹튀 said...

As soon as I noticed this internet site I went on reddit to share some of the love with them. 먹튀

unknown said...

Hello, I read the post well. 메이저토토 It's a really interesting topic and it has helped me a lot. In fact, I also run a website with similar content to your posting. Please visit once


Crown999 said...

Good day! This post could not be written any better! Reading this post reminds me of my previous room mate! He always kept chatting about this. I will forward this page to him. Pretty sure he will have a good read. Thanks for sharing. keonhacai

먹튀검증 said...

Many thanks for the article, I have a lot of spray lining knowledge but always learn something new. Keep up the good work and thank you again. 먹튀사이트

Unknown said...

Thanks for sharing the most important information I am so glad to visit this blog. we provide technical support. If you need any issues regarding orbilogin Routers visit our website. Our technician 24 hours available.

orbilogin

SREEJITHA said...

Planning to start your own food delivery app?
Planning to start your own food delivery business or already have one that you want to grow? Let’s connect and discuss how food delivery app development grows your business worldwide.
https://lilacinfotech.com/products/lilac-foodmine

먹튀검증사이트 said...

Youre so right. Im there with you. Your weblog is definitely worth a read if anyone comes throughout it. Im lucky I did because now Ive received a whole new view of this. 먹튀검증사이트

Anonymous said...

Many thanks for the article, I have a lot of spray lining knowledge but always learn something new. Keep up the good work and thank you again. 먹튀사이트

토토사이트 said...

My programmer is trying to convince me to move to .net from 토토사이트. I have always disliked the idea because of the expenses. But he's tryiong none the less.

Unknown said...

Thanks for sharing this wonderful post with us. This is more helpful for find the best quality elder law lawyers in San Antonio city.

«Oldest ‹Older   201 – 282 of 282   Newer› Newest»