<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7840291950242203302</id><updated>2012-01-19T16:09:14.801+01:00</updated><category term='Personal'/><category term='Cars'/><category term='XNA Not just for games'/><category term='Windows Mobile'/><category term='Vista'/><category term='Microsoft'/><category term='Windows x64'/><category term='Windows Phone 7 Games'/><category term='CodeProject'/><category term='Misc'/><category term='Windows'/><category term='Redcoon Apesta'/><category term='Upna'/><category term='Visual Studio 2010'/><category term='XNA'/><category term='TheCodeProject'/><category term='Photoshop'/><category term='C++'/><category term='ECO-Driving'/><category term='Visual Studio 2008'/><category term='Games'/><category term='Direct3D'/><category term='SlimDX'/><category term='Publicaciones'/><category term='Parallel Computing'/><category term='Setup Projects'/><category term='Events'/><category term='Toyota'/><category term='Road Safety'/><category term='Android'/><category term='WinForms'/><category term='OpenGL'/><category term='Windows 7'/><category term='Circuito de Navarra'/><category term='Kinect'/><category term='MotorSport'/><category term='Physics'/><category term='DotNetMania'/><category term='Simax'/><category term='SkateBoarding'/><category term='Graphics AND 3D'/><category term='Game Development'/><category term='C# 3.0'/><category term='C#'/><category term='Windows Phone 7'/><category term='Desarrollo de Juegos'/><category term='Bugs'/><category term='GPS'/><category term='XBox360'/><category term='Silver Navigator'/><category term='Compact Framework'/><category term='Computer Graphics'/><category term='.Net Framework 4'/><category term='HTC Touch'/><category term='DirectInput'/><category term='Sports Driving'/><category term='DirectX'/><category term='Pocket PCs'/><category term='Silverlight'/><category term='XNAImageReflector'/><title type='text'>Graphic DNA</title><subtitle type='html'>Computer Graphics, DirectX, XNA, .Net and more...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default?start-index=101&amp;max-results=100'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>330</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-6951571311921059275</id><published>2012-01-17T13:12:00.001+01:00</published><updated>2012-01-19T15:51:40.345+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='TheCodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net Framework 4'/><title type='text'>Make some cash developing for Windows Phone</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-c0DChePwtUI/TxVlurONQfI/AAAAAAAABOs/QTGcZqZvP9E/s1600-h/image%25255B12%25255D.png"&gt;&lt;img style="margin: 0px 10px 0px 0px; display: inline; float: left" title="image" alt="image" align="left" src="http://lh4.ggpht.com/-oYxKBErgCmA/TxVlvS7xrSI/AAAAAAAABOw/1jWBw2p2PdY/image_thumb%25255B8%25255D.png?imgmax=800" width="158" height="162" /&gt;&lt;/a&gt;In this post I’ll try to share my thoughts and experience developing applications for the Windows Phone Marketplace. I’ll share with you why I think it’s a great platform for an indie or pro developer, and I’ll also try tell you what did work in this last years, what didn’t, and a couple of hints that could help you improve a bit your revenue.&lt;/p&gt;  &lt;p&gt;First things first: I’m not a professional developer for mobile devices. I am indeed a software developer in other fields, but as I always was interested in this kind of devices, I decided to give them a try. All my interest was to test the investment and resources needed for a development like that, and the return profit one can expect from it.&lt;/p&gt;  &lt;p&gt;Although not everything I tried really worked, my applications has been downloaded almost 22.000 times since published (today is January 17th, 2012), with a &lt;strong&gt;full version conversion rate of almost a 16%&lt;/strong&gt;. This is my total and daily download chart since October 2010:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-Fb1c8sh7ir4/TxVlv9KNcCI/AAAAAAAABO4/O5xqsiP6SEA/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-8oqe9Erh1Ik/TxVlwwizLHI/AAAAAAAABPE/5GYH_WseV3w/image_thumb%25255B1%25255D.png?imgmax=800" width="677" height="329" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;&lt;font color="#4f81bd"&gt;A bit of history&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;&lt;img style="margin: 0px 4px 0px 0px; display: inline; float: left" title="Windows Blocks" alt="Windows Blocks" align="left" src="http://catalog.zune.net/v3.2/en-US/apps/4db992e6-b2d7-df11-a844-00237de2db9e/primaryImage?width=240&amp;amp;height=240&amp;amp;resize=true" width="106" height="106" /&gt;My first application for the phone, published in October 23rd 2010, was &lt;a href="http://www.windowsphone.com/en-US/apps/4db992e6-b2d7-df11-a844-00237de2db9e?wa=wsignin1.0"&gt;Windows Blocks&lt;/a&gt;. It was a very simple Arkanoid-like game, that was first developed as a C# game developing tutorial for a webcast. The title of the webcast was: &lt;em&gt;“Developing a full Windows Phone game in less than 2 hours”&lt;/em&gt;. Once it was done for the webcast, I decided to finish the few details still remaining, and to publish it in the marketplace, just to learn how it worked. Of course, it was not a hit, and the reviews weren’t excellent (remember it was done in a few hours), but it was a good first try. &lt;/p&gt;  &lt;p&gt;In those days (a couple of weeks after the Marketplace was launched), the publication process was a bit of a pain, I must say. But it has been improved a lot since then, and now it is far easier.&lt;/p&gt;  &lt;p&gt;&lt;img style="margin: 0px 0px 0px 2px; display: inline; float: right" title="Gravitards" alt="Gravitards" align="right" src="http://catalog.zune.net/v3.2/en-US/apps/3e4c027b-0e3b-e011-854c-00237de2db9e/primaryImage?width=240&amp;amp;height=240&amp;amp;resize=true" width="103" height="103" /&gt;&lt;/p&gt;  &lt;p&gt;Then, I decided to make something more serious, investing more resources and effort, what lead to my second Windows Phone game: &lt;a href="http://www.windowsphone.com/en-US/apps/3e4c027b-0e3b-e011-854c-00237de2db9e"&gt;Gravitards&lt;/a&gt;. It was a beautiful skill game in which the player had to move a ball through several levels with progressive difficulty. This time, reviews were much better, and sales were better too, but honestly not enough to cover the hours invested in the game. &lt;/p&gt;  &lt;p&gt;In the first case, it was not surprising that things didn’t work. After all, I didn’t invested too much efforts in the game, so that was predictable. The second one though was much more detailed and I put much more care into it, so I expected more. However it was, it had a couple of drawbacks users complained about that kept sales down I guess. &lt;/p&gt;  &lt;p&gt;&lt;img style="margin: 0px 5px 0px 0px; display: inline; float: left" title="Silver Navigator" alt="Silver Navigator" align="left" src="http://catalog.zune.net/v3.2/nb-NO/apps/91f99807-0957-e011-854c-00237de2db9e/primaryImage?width=240&amp;amp;height=240&amp;amp;resize=true" width="103" height="103" /&gt;But then came my third attempt: &lt;a href="http://www.windowsphone.com/nb-NO/apps/91f99807-0957-e011-854c-00237de2db9e"&gt;Silver Navigator&lt;/a&gt;. It was not a game, but a GPS-like application. &lt;/p&gt;  &lt;p&gt;One day, I had to drive to Madrid. My ex-wife kept my old GPS, and it was a holiday here, so I couldn’t buy a newer one. I decided to check in the Marketplace if there was something like that in there, but there wasn’t yet. Then, I remembered that I saw once a Silverlight Bing Maps control over there, that had pretty decent features. So I took Visual Studio, created a new Silverlight project, and put one of those controls in there. I found a couple of web services that could calculate routes, and added several features like route painting over the Bing Maps control. In three hours, I had a very primitive version of Silver Navigator, that allowed me to drive through Madrid without a problem.&lt;/p&gt;  &lt;p&gt;As there was not anything like that in the marketplace yet, I decided to invest some hours on it, and after two or three weeks adding more features, a User Interface, and some other stuff, I published the first version of Silver Navigator on April, 2011. It wasn’t a full-featured GPS device, as maps and route calculation required an internet connection, but it did a pretty decent job inside cities, where signal always works, and in fact that’s where I most use GPS devices, instead of open roads. &lt;/p&gt;  &lt;p&gt;The impact was remarkable. Downloads started to grow, and it stayed above 100 downloads per day for several months. I opened a Facebook page for it, where users could write their opinions, and that was a win with no doubt. People started to ask for new features, like voice guidance and automatic map rotation. As things were doing well, I decided to go further, and to implement those features, releasing a couple of new versions which had a great acceptance by the users.&lt;/p&gt;  &lt;p&gt;Now, Silver Navigator has been downloaded almost 18.300 times, with a full version conversion rate of almost a 18%.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#4f81bd"&gt;The numbers&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Up to date (January 17th, 2012), the statistics of my applications are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Windows Blocks&lt;/strong&gt;: Total Downloads: 620&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Conversion Rate: 10.1 % &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Gravitards&lt;/strong&gt;:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total Downloads: 2512&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Conversion Rate:&amp;#160; 5.6 % &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Silver Navigator&lt;/strong&gt;: Total Downloads: 18269&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Conversion Rate: 17.5 % &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;em&gt;Note: What these numbers mean? All my applications in the Windows Phone Marketplace had a free/demo mode, that users can try first, and then decide to buy them or not. The conversion rate is the percentage of the total downloads that truly became sales. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;So, as you can see, it’s been a great result for an indie developer, and even more if you think of the amount of hours and resources invested in the development of these applications. The effort/reward balance has been really positive:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Windows Blocks&lt;/strong&gt;: Aprox. hours invested: 5&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total units sold up to date:&amp;#160; 63 &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Gravitards&lt;/strong&gt;:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Aprox. hours invested: 280&amp;#160;&amp;#160; Total units sold up to date:&amp;#160; 141 &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Silver Navigator&lt;/strong&gt;: Aprox. hours invested: 240&amp;#160;&amp;#160; Total units sold up to date:&amp;#160; 3202 &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;font color="#4f81bd"&gt;Hints to keep in mind when publishing an application&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;First, you should care about &lt;strong&gt;maximizing the visibility &lt;/strong&gt;of your application in the Marketplace. This is influenced by many factors, like the number of total applications in there, how attractive it results for the users, etc. There are some things you cannot do anything about, like the number of apps in the marketplace, but you can help out in many others. In general, keep the following things in mind:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Try to think of a good name for your application. I failed in that with “Gravitards” (some people talked about the name, saying it reminded of “retard” or “retarded”, haha… :-). &lt;/li&gt;    &lt;li&gt;Publish it in the appropriate category, as people uses categories to filter searches. &lt;/li&gt;    &lt;li&gt;Put a lot of attention and detail to graphics and presentation of your application. Icons, pictures, and all media material should be well designed. It should be concise and clear, but also beautiful and attractive when possible. This is more important than you think… &lt;/li&gt;    &lt;li&gt;Promote your application as much as you can. If you can afford it, pay for ads at Facebook or wherever you want. If you think you have a really good idea, contact your local Microsoft representative and ask for support. They are amazing, and will really help you if they can. &lt;/li&gt;    &lt;li&gt;Give your users the chance to talk to you. Create a Facebook page for your application, and include a link on your app that takes you directly there. &lt;/li&gt;    &lt;li&gt;Send the details of your application to most common mobile websites our there, like WMPowerUser, XDA Devs, etc etc. They do a great job reviewing apps. &lt;/li&gt;    &lt;li&gt;Put a free/demo mode on your app. Give the users the chance to try it for free. Many people won’t pay without trying first. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Secondly, you will probably care about &lt;strong&gt;having the highest conversion rate&lt;/strong&gt; possible. It’s nice to see that your application is being downloaded thousands of times, but it’s even nicer to see that becoming sales :)&amp;#160; !!!. So, to improve your conversion rate, keep in mind:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Your free/demo mode should be long enough to allow users trying the application well. But more importantly, it should be long and featured enough to make them &lt;strong&gt;want the full version&lt;/strong&gt;. And this is important. If it’s too short, there might be not enough time for them to appreciate the app, and to get into it. If it’s too long, they might get the feeling that they had enough with the demo. In a game, for example, give them the chance to be playing for 10 or 15 minutes with the demo. I made this mistake with &lt;em&gt;Gravitards&lt;/em&gt;, where the demo was only one level long (only 2-3 minutes playing), and people found that way too short. &lt;/li&gt;    &lt;li&gt;Easy of use: this is crucial. Keep an eye on professional apps or games, and study how they are done. Why options are laid out that way, why menus have that shape. Everything is studied. Try to copy from the people that knows how to do it. Users should find easily what they want to do, with as few clicks as possible. &lt;/li&gt;    &lt;li&gt;If it’s a game, keep an eye on difficulty level. This is very important, and very difficult to properly tune. If the game is too easy, people will get bored soon, may be even with the demo only, and will not buy the full version. If it’s too hard, it could be frustrating for users, and stop playing. However, if you are about to make this mistake, it’s better to make it a hard game than an easy game (there’s always people out there that takes that as a challenge). &lt;/li&gt;    &lt;li&gt;Responsiveness of your application. Nowadays, people don’t tolerate slow or unresponsive applications. Easy as that. Everything should be fluid. &lt;/li&gt;    &lt;li&gt;Localize your app to as many languages as possible, and of course include English as a minimum. Your app will be sold worldwide !!! &lt;/li&gt;    &lt;li&gt;Consider including publicity in the free/demo version of your application. It’s a great way to make some cash with the free downloads. &lt;/li&gt;    &lt;li&gt;Think of a reasonable price. It’s sometimes better to sell a lot of copies at a low price, than selling a few, more expensive copies. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;font color="#4f81bd"&gt;Why do I think that Windows Phone is a GREAT platform to develop for?&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;There are many reasons, but some of them are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Microsoft’s support to developers is great, with direct contact that really helps, continuous contests and prizes for developers, app promotion as “App of the week”, etc. &lt;/li&gt;    &lt;li&gt;The number of Windows Phone devices in the market is raising amazingly. Specially since the Nokia Lumia came out, Windows Phone is now the hit. Everybody is talking about the Lumia. &lt;/li&gt;    &lt;li&gt;Technically, there are very few hardware differences between WP7 devices, so you can be pretty sure that your application will work well on every device. This is a BIG problem in other platforms, like Android, were the phones are frustratingly segmented. &lt;/li&gt;    &lt;li&gt;Microsoft offers development tools for free, like Visual Studio Expresss, XNA Game Studio, etc. The investment needed to start earning money from your developments is almost ZERO. And that doesn’t happen in any other platform. &lt;/li&gt;    &lt;li&gt;You can re-use your WP developments for the XBox too, what is really great. Very soon, you will also have a Marketplace for Windows, what is going to be an awesome milestone in software development. &lt;/li&gt;    &lt;li&gt;The technology behind your developments (.Net Framework, XNA Game Studio, Silverlight, etc), has a very affordable learning curve. In fact, it’s the easiest and most efficient platform in the market. And for free !!! &lt;/li&gt;    &lt;li&gt;The development tools are, simply, the best. And this deserves an specific chapter. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;font color="#4f81bd"&gt;Development tools&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Microsoft is not a clear software leader in all fields. But in Development Tools, it is. I think that every software developer opinion is the same. Microsoft Visual Studio has no rival.&lt;/p&gt;  &lt;p&gt;&lt;img style="margin: 0px 8px 0px 0px; display: inline; float: left" alt="" align="left" src="https://encrypted-tbn3.google.com/images?q=tbn:ANd9GcS3OtZy_-6rPm7GcqqJ8DBQMQV-ggXcDHPhf5FzXVJb3QikafqGZg" width="67" height="120" /&gt;&lt;/p&gt;  &lt;p&gt;And this is no exception. The set of tools that you will use to develop for the Windows Phone is truly amazing (and free). The Windows Phone emulator is a masterpiece, with a mindblowing debugging speed. Those of you that have tried developing for Android, for example, know what I´m talking about. &lt;/p&gt;  &lt;p&gt;If you plan to develop a game, the XNA Game Studio is simply awesome. It provides you with a full featured framework for game creation that allows you to develop last-gen games, again with a learning curve like no other. &lt;/p&gt;  &lt;p&gt;If you plan to develop and application, Silverlight is again very cool. Last-gen user interfaces, beautifully animated and fluid, all with a .Net Framework basement, with thousands of classes ready for you, that will make your developments a piece of cake. &lt;/p&gt;  &lt;p&gt;I have developed for Android for some time now, and believe me, it’s a frustrating experience compared to all of this. &lt;/p&gt;  &lt;h4&gt;&lt;font color="#4f81bd"&gt;My conclusion&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;If you are planning a new development for a mobile platform, Windows Phone has become THE way to go. When it first came out, it was soon positioned as a clear candidate and a tough competitor for iOS and Android. But now, in my modest opinion, it has no rival.&lt;/p&gt;  &lt;p&gt;No matter if you are a pro developer or an indie one, the design and development period of your life-cycle will be much easier and shorter. Of course, if you have the resources to make a cross-platform development, and you can make your app to work in all iOS, Android and Windows Phone, go for it. &lt;/p&gt;  &lt;p&gt;But if you’re a indie developer, or simply don’t need that level of compatibility, your best bet is WP. Currently, it is clearly the platform which requires the lowest initial investment (almost zero), the most efficient and easy (and therefore the one that requires less effort and work), and step by step it’s becoming the one with the highest return rates. You just need to check &lt;a href="http://blog.anlock.com/?p=28"&gt;this blog post&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Cheers !!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-6951571311921059275?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/6951571311921059275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=6951571311921059275' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/6951571311921059275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/6951571311921059275'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2012/01/make-some-cash-developing-for-windows.html' title='Make some cash developing for Windows Phone'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-oYxKBErgCmA/TxVlvS7xrSI/AAAAAAAABOw/1jWBw2p2PdY/s72-c/image_thumb%25255B8%25255D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-8174981451794469814</id><published>2012-01-16T12:02:00.001+01:00</published><updated>2012-01-16T12:02:18.179+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='TheCodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Finding the external IP Address of your machine, with a timeout, in C#</title><content type='html'>&lt;p&gt;If you try to find the IP Address your machine is using, you can follow two paths. The most obvious one is:&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&lt;span style="color: blue"&gt;string&lt;/span&gt; host = System.Net.&lt;span style="color: #2b91af"&gt;Dns&lt;/span&gt;.GetHostName();&lt;/p&gt;    &lt;p style="margin: 0px"&gt; System.Net.&lt;span style="color: #2b91af"&gt;IPHostEntry&lt;/span&gt; ipEntry = System.Net.&lt;span style="color: #2b91af"&gt;Dns&lt;/span&gt;.GetHostEntry(host);&lt;/p&gt;    &lt;p style="margin: 0px"&gt; System.Net.&lt;span style="color: #2b91af"&gt;IPAddress&lt;/span&gt;[] addr = ipEntry.AddressList;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; i = 0; i &amp;lt; addr.Length; i++)&lt;/p&gt;    &lt;p style="margin: 0px"&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (addr[i].AddressFamily != System.Net.Sockets.&lt;span style="color: #2b91af"&gt;AddressFamily&lt;/span&gt;.InterNetwork)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; addr[i].ToString();&lt;/p&gt;    &lt;p style="margin: 0px"&gt; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Unfortunately, in most cases people are connected to the internet through a router, and therefore each machine is assigned with an internal IP Address of the private LAN network, assigning the external IP Address to the router only, not to each machine. Finding this external address directly is not trivial, as you would need to deal with the router itself, with different router models, etc. &lt;/p&gt;  &lt;p&gt;The easiest way to find the external IP Address is to do a web request to one of the several websites out there specially designed to provide you with that address, like &lt;cite&gt;&lt;a href="http://whatismyipaddress.com"&gt;whatismyipaddress.com&lt;/a&gt;, &lt;cite&gt;&lt;a href="http://www.whatismyip.com"&gt;www.whatis&lt;b&gt;myip&lt;/b&gt;.com&lt;/a&gt;, etc. &lt;/cite&gt;&lt;/cite&gt;In this case, we will use the last one.&lt;/p&gt;  &lt;p&gt;Of course, doing a web request can take time, specially if there is no internet connection available, as the default timeout can take several seconds. This function will do the job for you, and accept a custom timeout.&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; This function uses a Web request to find the external IP Address your machine is using&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name=&amp;quot;pTimeOutMiliSeconds&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;Number of miliseconds to wait for a response&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetExternalIP(&lt;span style="color: blue"&gt;int&lt;/span&gt; pTimeOutMiliSeconds)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160; string&lt;/span&gt; whatIsMyIp = &lt;span style="color: #a31515"&gt;&amp;quot;http://automation.whatismyip.com/n09230945.asp&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; WebClient&lt;/span&gt; wc = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; UTF8Encoding&lt;/span&gt; utf8 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;UTF8Encoding&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160; try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string&lt;/span&gt; ipaddr = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bool&lt;/span&gt; done = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wc.DownloadDataCompleted += &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;DownloadDataCompletedEventHandler&lt;/span&gt;((&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;DownloadDataCompletedEventArgs&lt;/span&gt; e) =&amp;gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ipaddr = utf8.GetString(e.Result);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; done = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wc.DownloadDataAsync(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(whatIsMyIp));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; startTime = System.&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while&lt;/span&gt; (!done)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.&lt;span style="color: #2b91af"&gt;TimeSpan&lt;/span&gt; sp = System.&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now - startTime;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // We should get a response in less than timeout. If not, we cancel all and return the internal IP Address&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if&lt;/span&gt; (sp.TotalMilliseconds &amp;gt; pTimeOutMiliSeconds)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; done = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wc.CancelAsync();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return&lt;/span&gt; ipaddr;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160; catch&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160; finally&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if&lt;/span&gt; (wc != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wc.Dispose();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wc = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;It works pretty obviously. It just uses the DownloadDataAsync method, instead of the synchronous DownloadData, and waits for a certain amount of time. If no response is received in that time, cancels the async method and returns null. &lt;/p&gt;  &lt;p&gt;Hope it helps!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-8174981451794469814?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/8174981451794469814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=8174981451794469814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/8174981451794469814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/8174981451794469814'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2012/01/finding-external-ip-address-of-your.html' title='Finding the external IP Address of your machine, with a timeout, in C#'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-8476842483154727262</id><published>2011-12-23T11:03:00.001+01:00</published><updated>2011-12-23T11:09:08.497+01:00</updated><title type='text'>El modelo de negocio de Google</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 11px 0px 0px; display: inline; float: left" alt="" align="left" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhQSERUUEhQWFRUWFxsaGBYYGBgYGBgYFhgZFxgYFxoXHSceGB0kHBgZIi8gJCcpLCwsFh8xNTAqNSYrLCkBCQoKDgwOGg8PGSkkHyQqLCwqNTAvKyosKSwqKSotKiwsLywsKSwpKSwpLSkpLCksLzIsKSwpLCksKSwsLCksLP/AABEIAL4BCgMBIgACEQEDEQH/xAAcAAABBQEBAQAAAAAAAAAAAAAGAAMEBQcBAgj/xABMEAACAQIDBAYHBQYDBQYHAAABAgMAEQQSIQUGMUEHEyJRYXEyQoGRobHBFCMzUnIVYoKSstEWosJjc9Lh8AglQ5PD8SQ0U2SDs+L/xAAZAQEAAwEBAAAAAAAAAAAAAAAAAQMEAgX/xAAvEQACAgECBAQEBgMAAAAAAAAAAQIDERIhBBMxQVFhgaFxkbHRBRQjQsHwIjLh/9oADAMBAAIRAxEAPwDcaj4f0pB+8D71X+1SKjp+I3iqn4sP7UBlHSBEWxkiyYuygqY4iWOTMq620C8zfyqo/ZMb3Y4ieZibHJE7Mbd5PEVrO1ppVl+6wXXEgEyZ4oxfUWJbt6W7udMDEbRb0cNho/14iR/gkVvjWd05ecnqw/EXCCil0Xl9jNMNuyTltg8U/DMSMg9Gxtf96x5f3nwbn4nO5XBIEcKAskkd1sLEqbmxJ14cqPRg9otxmwkf6IJHPveQfKu/sDFt6e0JB/u4YE/qVjU8lES/ErH29390CH+BcYzIwXDQ5M1rFm9IWN8q2NWCbg4k2JxEUdjcdXABbS3FiO81f/4OB/ExeNf/APOUHuiC0v8AAODPpxtJ/vJZZP63NdcqJQ+Otfh8vvkopt1ET8faLLpb0oYtO7nUUYTZUZGbHFyCTpiCxueOkWvKjLD7o4NPQwsA8eqS/vIvVlDhlTRVVfIAfKuuXHwK3xVr/d/H0M/hw+yf/Dw00x/dw+Kkv7WFqsIJIh+DsmY+Jhgj+Mjg0a0qnSvArldZLrJ/MGI8bjOEez0T9eIRfhEjV7ybSb1cFH5maU/JBRJSroqBz9kY9vSxsaeEeGX5yO3yrv8AhaVvxNoYs/oMMY/yR3+NEVKgB3/A0B/EkxMv68TOR7g4Fe03FwC6/Zoj4uM/xcmr+vEsQYEEAg8iLj3GgBz9rbOhNkEII0+7jB17hkXWiKCQMoI4Gsp3zwgjxTqvCykcuI8K0zYoHUJb8oqqubk2n2M9NjnKSfZk6lSrl6tNB2hffHAF8p6nr1ySL1d1uGfLlcZiBpYgkagNcUUVExo4VKOZdAJfZzxM8iKM92ZVaREQs0KoZAQMw1U+lyN7A1B2aHROr+04XOAyLZhJdZgrMMi81ZSVFyGF71bT7vx/a+sMTPe7NJ93YNZVA1IYjKpBFvWqJhdgSpH1aoxzCEEmZUYdWGUhTEpsMtrceNSchFuvgMkk0gcOJshBAPBVyj1rG9r6Aeka87eOXExt3qPgx/vUnYbFQqyZM+U3CnQdq9gLA8La2pjexdYm/UP6TXLO0EKnSu0xgpM0anwFP0JFSpUqAVKlSoBVHb8UeKn4Ff71IqPN6aHzHvF/pQEig3ePpAWKQwYZRLLwJJ+7TzI4kdw/5VL6QduthsISmjyHIp7rgknzsDQt0ZbviS8zi+ul/h/141ohBRr5kvgiiU3KfLj8WT4tm47EjM+IlAPJCIl9gAufaah4/dDHxjNFiJiRyMjGtMC2rtcq+aex06otbmX7o74Yz7SIJj1ig2bMLsp7gy8/O9aeDUKDY0SSGRVAY9wAqaa5tmpyzjBNcNEcZydpUD739J8WDPVxr1sndfsj+9UGzelfEO3ajVR5Ej3g3FZXckspNryNcaJNqLaTfj/dvU1elVFsDepMT2SMkn5eR8VNWW0ccIkJ58vZxNQ+IrVbtzsczpnCeiSwyUWAriuDwNYjtrauPxjM6PJHHfshSV05E24mrHcrePELIIMS+Yn8OT1rjXI1uPgfC1UXcRdVDm6MpdVnfHyx7kRjGTxk1+om0dqxQLmmdUHAX4k9wHEnwFR9n7UzHK3G1we8DjWb7I2k2P2mWc6WIQfkS9uz3EjifE1u4WUeJq50f9cZ/wCFFsnXJQfVhXi+lDCISLSsR+5l/rINStjb6DEuFWF0X8zsuvdlVbk+21R96dyIpoGyC0iglT4gXt7aFeizahWZoWFwwuL8QRoa2cuuVLnFbrqZ9c42qEuj6EvpGjtib/miHwLCjfdqe+FjJ/LQp0lxfexN3oR7j/zqfsjEH9ksRxEZH0ryYy0ym/Unho54iUPFr3GsVvHLipjFhyVQaXXRn8bn0R8ag7TwWKwn3vXNlvzcmx8b8ajbq4p43k6tVLkCxa9hy4AEny0q7j3blxJzYhi3i3AfoTgvxPjVUY8+tPu+/h8D3py/LXNftXbxXn8fH5FrupvGMVHc+kpsbcD4in95pCsN8xQZlDMNCqF1DsDyst9eXGpOy9jxwLaNbd/jT2NW61timklk82Ulq1Y2z0AxsRGqgGV2h+0Mjy5z2exmRetvqofs5r8dDzvFkxEbDDPMDI2aQXyuzPCOsCPZBxPZN+9gatp9swRloyyoiGxCobagtbQFRoD4muYjeHDoqsQ5BDX0a65GCENc3BzEDTv7qw3cVGEtKTZrhGcllRe/vs/Lz9kNbBRhPCSjqxiUSt1YszWbR3437Q1HNdaud60+6Q9z/NTVRsreZXxCRqj6mxzMpKkZjpYnMLKdbkagcavt5Uvhz4FT8QPrWqmyM45iUXKSl/ksDmwZc0K+GlWNUW6st0Ydxq9q4pFSpUqAVKlSoBVHxfqHucfG6/WpFR8d6F+4qfcwNACfStDfBA/llU+8Mv1FO9GLD7EtuRsfZUzpCw2fZ81hcqFb+V1J+F6DOi/eERyGBzYOboT+bmvtrdGDnw23Z+xiclDiN+6NWpVwGqzb2GlkjKwyNGTxKgZvYT6PnasS3ZsZZ3qq3nx5iw0jKdfRB7ixtWWb4YHEYZow80rZwT2pCeBHkOdFmwcOZ9k5RxCggDvU3PmSb++u+JocaNcXnOcEcLdGXEKE1hJrJmG08V1eJdjHn7K2Leiotz9t6tsDv5h07E2H9i5g3DiQRU2KCMveVeyRYnmp5N7DRhhdmKQXkdXuuUtlFyvcaxcJNSqWO2xv/EK3C+We+69QN2ftdWtNASFDEi/EZeINaPjZ+uRDyZPnxoE27hY0kEUCKlwBlQAC54kgc7Wo+fAMmHjIFyi6gcbeFeVxHDTsotjX45Xp1NfEXJupy66d/wCDHJJ9oyqIcgjjDshYkIvYOUltbkc/Gmdn7syoxl6wnqZLqyk5GykG4vqfbWo5EbMVAdW9IA638vpVfjYww6sL1aesSLacwo4k16FHGVXVapPfG6757rB5cq5RlhFrJibSwW4sx9xXX6UD4zCybMx2fKSgYlTyZCeF+Rt8qNd38G+IxPXMMscYsg+Z/wCu4URbefDLHfFMir3sflzPsq78HjPhKFXJZznK+JTxkY2y1ZxjoyjxXSbhBAWVmZyukeU3vbgTa1r871S9HO7TiUzv/wAtdbCqHfDDxSMr4RJSgWxujKvG4K5tT7quNy+kPq8sGIAC3ssg0se5x9a9l0t1fpeq7mJW4t/U9H2LvpLj7ELdzMPeAfpT24iiTBtGeF2U+RuKn73bFfFRKI2tY3GgNza3H31Wbtbr4nDsC0hy3vlBsvtA4+2vIUHrb7MujCUbnNdGDqM+DxPDVTwPrLR5gd7MPIoPWBDzVtCP707tnd2PErZxqODDiKGx0aC/4rEdxJqiuiyp4ra0+fY9u3iar0nbF6vFdwowW3I5mIjOYD1uRPcvf4nhUnHtaNiOQJ91Rdk7CSAWXU95+lTp0upHeDWxJ4POljsZXj8bIkslsGpjOIyMzF2DCIEZyoIsAtjmsR2rWNQ/2jKliEjjI6k2Mcd+0LylGlY8mU95uTyBok3j3QXFv1jylCkJRgFBLAZyGBY2AOb3jiLVR4uDDTTRvJGzPGiL+IgDdUcylkUMdQMp/dvXgbJ4kt+/9Zo5kmuo9idrWntBilyNIvVRhkj0YKMq5Y75RLIhIPpKQdQL1o+2kvh5P0k+7X6UCbB2ThZLl4CWTKYyzSMezkyBWYKOz1aAW5A3vrfQZ1zRMOZQ/EVv4HukvAqmUO6svbZe8UT0GbvS2mXxozr0SsVKlSoBUqVKgFTONF43/SflT1cZbi1AeGQOtjqGGvkayPe3cOTDuZIAWjJvYcV8vCtZwTXjT9I+VPMgOh1q6m6VTzEqtqjasSMo2H0oywgR4lDIBpm9F/bfRvhRLF0owOOxDiGPcEHzzWq/xO7WHc3aMXrkO7GHXhGK6nbCW+jHqcwrnHbUZ9vXJiNosmWERhL2BbO5zW45eyOHfRluPsd8PhhHJx/vV/FhlX0VA8hTtcStlKKj2R3GuMW5d2Bu8G5BdjJAQpOpU8CfpVTg91sSDY3A/d/5kge6tIpVl5MM5x/Br/MWaVFvZdM74+YL7E3OWN+sk1bj3695J4mie1dpVYkksIpbcnllJtHdKCU5iuVu8aVzDbpxLxJI7v71eUqYXUgZyLGhsLBRew8Kx/ZM77R2hmlPioPBBfQKPAfO9bKwvWS7c3QxGDxHXYS+W5K24rf1ddCK2cO4YlFvDa2ZlvUsxkllLqjSsNsGJBbKCe860BdJ+7kUSLNGMrM+UqPWuCfp8a94XffaJGUwRX/MwYfBTUzDbvz4uRZMUxa3AWyogPHIvf8AvHWorfJnqytvA6mubHTgJt0ZWbCRZ+OUD3Vc0zh4VjQKNABavaTK17EG3GxBt52rKaD3SqBPtyFJREzjrG4IAxY246Acr691eNo7fihkSIktNJfJEgzOwHFrcFUfmYgeNAWVcNU2P3nSDJ10ckfWOqISAylnYKBmQkKdb9q2gNr1c0AMbW2tFG4SS+YqSLA8DcceGuUix41SyzRTMWVWbJlAA7AIaQqGUI1jY87fKizEYTMTZFY31uAdAbjj3Gg/eCHqXfrtodSjejEp7ag20Cob83tp+Xu1rlQrJbr23JjZCEenuSMPtmQACPDSNlUBePfqASoAsNDzv38aM9mSs8KF1ysRqPhzrMMPvhDHIjIcXOVTqz2Aqt2i2Ygm+Yk8dOHCtC3V24mLw4lQMozMpDWzAqdb2Jq78vKqO62OefXY8RX1BvBtklHg1vcbUdg0C45csz+Dn53o1wj3RT3gVySPUqVKgFSpUqAVKlSoCPgvRt3Fh7mIqRUfC8XHc5+IDfWh/bG/aYfGR4MwymWW3VnsBGBJF8xa41B5X0oAopVSYzeAjFJhIwpmaIysWJyogIXlqxLGwAtwJuObZ21OmLhgliXJLntMjErdFzBCpF1bQniQQPcBf0qg7aw8rwuMPJ1UtjkbKrDNbQEMCLXoM6MdvyY6CdMVLIcRHJlcA9WVX1cvVgZdQwPlQGg15zi9r691ZZ0c7VYbSxeFxMskzAsYXlZiSikggAm2qkH2Gjbd/ZkSSYmVI0XNMVBAA0jRENu4Zg9AXEeORnaNXUulsyggsubVcw4i/KoWJ3kgSf7OWJmK5+rVHdsvDMcoIA8SazLG419nbWgxzk9Rjx95fgoJ7I/hXq29jVqEOzQMTJPYXeKNAedkaRj7O2PdQFXs/fuHESyxYeOaSSH8RcoQgglbfesutwa9Rb8wfZJMVKHhSJ2R0kA6wOhy5coJ1JtYX50G7mfdbxbQj/OrN/mjf/Waj9OmGMcERW+SXEM7jlnEKoPeFJoDQsBj8TNCsyxxx51DLG5YtlOozsuikjkA1r86Gt4t78UuzpcVGqRSQymN4XXrLWkyXzXHIg3tY0c4GQNEjLwKKR5EAihfpCgRtnY5EHb6sSPpz0IPnaL4UBL3ZzYrAQyvIweaNXLoEQqzDULZbAX770K9FeMlxseKGLmlleOQICZHWwIPAIQOIOtWPRdguu2Zh2Ms1gGXKsmVRldhYZADwtzqo6J16naO1INdJLi5ubLJIOJ46MKAXQ2gmTGLiPvnSUKTL94cpBFu3fS6mqc4GfYrR47DAvhZAFxEV/RYEqfLUEq3Imx0NXPRd91tTakP+0LD2Sv9HFHeysMkkEsTqGXrZkZSLgq0rmx9jCgI0W14sScHiIWzI7soPMZonJUjkQUAIoK6O8ecRtvaMkmrgMi39VFlyZR3aKtRot3p9k7SgjjJbA4jEJlvr1b6qFJ5NY2v6w8RVxit25cBtY4+CNpcPOCJ0QZnjL2JcKNWXMA2lzx8KAI999uYfDwH7WsvVEr2kTNZr5kseRBUH3VfYSfOgbKVzC9ja4vwvlJHxoO39wb7SwowuFUku6s0jqyJGqXOpYAlibDKLnU3tRXsdGXDwiQWcRoGHGzBQGGnjegKDffEzxwN9nljicsLs7BeyAWIQnQNYX8gazwNiH6xi+GjFmLt2nYXazG6gkkGQfzd1avtnY8eI7MqZ1BDAa8QCOXmagS7uBQvUxxrlDCzC47TBufiL343ArRC1wWEkZpV6n3BHZ3UoyGbESzs4DCOKMRoc0pAzX7Xp6a24i+l6Ot1tsx4iImKMxopAC2AHaUPcZdPW18Qaj4HZLghm6pTmJZVVdb95A1N7m/jV1hYstx9KrnNy6lsI6ewJbeS2Ik8SD71FEuw5Lwr7qod50tPfvQfMj6VZ7rS3jI7jVZYXdKlSoBUqVKgFSpUqAjw+m4/SfeLf6azTpT+62nsub/aBT7JYz8mNaWPxT4oPgx/4qAel/Ys+J+yfZoXleOQuco0C2HFjYA3UaXoCTv3udNiMTHicDOIcXElipNsyEtlNwDbXMLEEH2VRRb8bRwM0S7Ww6tEXAEygXUkFcwKEqTYnSwNr0aYnB4mTFQ4mECMCJ0kil0L3dWVboTlI7RDa91ta5vDsOTaCJDKgiiEiPIcwZ2yG4RAugBPFib2vprQBMKyPeCb9kbbGJAPUYxGzgcM/P258jfxmtcFU28+68ONWITXHVSrIpFuKnVTfkRoaAz/AKQtmNgWwG0Yx2oMkc1uYtz87uv8Qo0EpGzlINnnAtfiHxb6e0dZf2VM3hfBzQvBipYhG4swaRVOhuLG9wQQKqdpbw7JkMaSzwSZCAi5ywDDRSAptcd/KgI+/wBug2I2fIrTFjEueMFY0UNGDpotxdbjjzrz0Tb3LisEkbuOuhGRgT2mRR2Htz0sCe8UZnBR5AhRSg4KQCNPA0E7c6UcNBKMPhIzipycoSKwQN3ZgNT+kHzFAUyBl3jbEpHK8DR5WkSKRlzGIDiq66qOFHu8+7kW0MK0MtwGsVa3aRh6LAHmOYPIkVUQxbYmXM0mEwt/UEbzMP1MWC38qod4dvba2cOtkGHxUA9JkRlK/qAN1HjqKAIN2sPj8JCuHljjxCxjLHMsuQlB6IdXW4IGlxfQVOxuw5ZMPOhaPrcSCrkhiiKUKBUGhbKNdbXJJ04VQ7p9MGGxbCOUfZ5ToAxujHuV9LHwIHto9oAZ3K3Tk2fh+o68SLdip6vKQza/nIIvfS3Oo+B3Khw2JlxX2qVZZr9YS0SqbkEjKU01ApzbvR5Find2xGKUvyWdgim1uynC3hXzntbCtFNJE5zNG7ISdblGK318qA3+LC7Jw0z4g4lBM987nFHM1zc3CuBa4GluVXm7P2N1abBlHBYhnUs120zXLcTw1rKug3YOHnkxDzRpI0YjyBgGC5s9yAdL6DWtuhgVRZQFHcAAPcKAUvAm17a256d3jQRtPpHniQyfsvF5FFyzZVAHecuYgUdVxlBGooDMdg9J+N2g7Jg8FH2QCzyStlW/C5CjU2Og7q0PZXXdUv2kRiXXMIsxTibZc2vC3toE6J8CIMRtOAC3V4kAfp7eX4Vo9ADe9GKmhs64iOGI6dqCSdywDMbZXAtlUnhyNUGOxmICRuMdI6yZrGOKCL0Gym2ZHJ18aJt6CCI42jSTMSQHdkAKryygkmxbTzobxWLncIseGhKWLIULhe2Qx9ZeLHmNSa7it9zlywUmNx7AAviMSwIzazSgEeUQjtw186LNy4I1lfJmuUFyzyO3G9j1jt3nhVAhnlVWywKpuRdAxAF76MGPq8B4Vfbs4fELOOtkUrla6ABddCLWUBrX5cNarsrbkmnhI6qsSr0yWZeJK3tTtxnvUj3Ef3ru6knaYeFPb2p2Yz4ke8X+lV27slph46VIDGlSpUAqVKlQCpUqVAR5PxE8VYf0n6Gqfe3aONhRWwWHTEGzFwz5SLWtlX1766X5VcYj0oz+9b3q1SKAwPGdOG0CSAkEZBsRkYkEcQczcfZUndDfLaO08WMO2N6gFWa6RR3OW3ZXTjz48AamdNW4+U/boV0YgTgcmOiye3gfGx5msu2ZtJ8PMk0RyvGwZT4jv7weBHcaEn1VsbZzQRBHmknYEkySWzG5vbsgCw5V3a+xosVEYp0zoSCVuRqpuNVINRN1N5I8dhUnj0zCzLzRx6Sny+IINXFCDGelncfB4eGD7LCEnlmCKqljnBU3FmJ55dfGtA3N3FgwMCKEVpbAySkAszc7E8FHAAVRyj7dt8DjFs+O57uuk4e0C38lGe3dqDDYaWc8I42bzKi4HtNh7aAy7ph6QmVjgcM2XT79wddR+ECOGnpedu+u9A+7i5ZcYwu2bqo/AAAuR53A9h76yHE4lpHZ3N3dizE82Y3J99fRXRDAF2TBb1jIx9sjD6UJDOvEsQYFWAIIIIOoIOhBHMV7pUIPmLpC3Y+w46SJfw27cf6G5fwkEeytC6H+kNpCMFiWuwH3Lk6kAaxseZA1B7gRyFe+n3ZV4cPiANUdoyfBxmHxQ++sbweLaKRJIzZ0YMp7ipuKEn15XzD0jYfJtTFjvlLfzgN9a+jtgbVXE4aGdeEqK1u4kaj2G49lYL0y4fLtWQ/nSNv8uX/TQIuugLEWxWIT80Ib+R7f6q3CvnroTxOXair+eKRfcA/+mvoWhDFSpUqAAd2Pu9u7Sj5OkMg9wB+LUfUA/h7yf77BfFH/ALLR9QA/vhA5SJoyAySE3PADI1yfYKGYtnThVyS2QhABlBJGQE6W1Az8DyHhRjvJBmh9PJZ1Oe9sutr35cfjQd+zofXnYm+oJGvpWHE2Og1/eruLOGtxraOHkhhCiYHK3BRlOrSdoNe/EHkPSFRN2JSuLhJJ9K3H8wI+ZqfHgcPZiNbLcFmIBbtaaAcLL3jW2l6iTNHHiojF6KsnO+uYE687Xt7KnJzgOd6UvCD3OPjcfWh3Z0mWVT40U7wJfDv4WPuYUHxtYg+NVlpoINdprDPdFPeBTtAKlSpUAqVKlQEfGcAe51/qA+tSKYxw+7bwF/dr9KfoBnF4RZUaORQyOpVlPAgixFfMe/G6bbPxbRG5jPaic+sh4e0cD5eNfUVC3SJucNoYUoAOuS7RN+9bVSe5hp7jyoDG+i3fX7Bissh/+HmIV+5W4LJ7OB8D4CvoLae0lhgkmc9iNC58lF9PP618lzRFGKsCGUkEHiCNCD7a0HZG98uOwMWyjmMkkyR9Z/8AbjtG/iuX+UUJNJ6KdnMMI2Jl/FxkjTMedmJyDytc/wAVe+l2YrsnEW55F9hkW9FuGw6xoqKLKoCqO4KLAe4UM9KeEMmysSALlVD/AMjqx+ANCD5or6Q6IZc2ycP4dYPdI9fN9b70GYvNs5k5xzOPYwVh8zQlmi0qVKhAFdMOEz7KmP5Gjf3OAfgxr5yr6e6R482y8WP9ix91j9K+YaEo+hehTGF9lqp/8OSRB5XDj+ugbp6w9sbC/wCaC3tV2/4hRn0GwkbNJPrTuR5AIvzU1Q/9oHC//KSf7xCf5GHyNAA/RhiMm1cKe9yv86Mv1r6Zr5R3WxfVY3DSH1Z4yfLOL/Cvq6gYqVKlQgAd5/u9u7Nk/Ok0f+Ukf1UfVn3SDJ/3nsgDj17n2dgGtBFAQdtwhoHB4W11toCCdeXCg1zhon4XIOmXMdDl5k6HR9P3hRzjo80bjvVh7way0JTOCGWcm2IQgURcFIFwvZuBe3frc348KGNp7RWKJnOY5AWsBc6a1YvHTbYHMrA+spX+YEfWo1jBqOLcSYZmHBosw9q3FBN6Kd0Jut2bhSfWw0YPn1YB+N6FgKkkN9iyXhXyqdVNuxLeIjuNXNAKlSpUAqVKlQDeIS6sO8Ee8UsO90U94B+FOVHwP4a+At7tPpQEilSpUBgnTjsdIsakiLl6+Ms/cXU5SfMjLeqXoqxGTa2G8Sy/zRsKNv8AtA4bs4R+4yL7wjD5Gs13NxPV7Qwr908fuLgH50JPqmmcZhVljeNxdXUqw8GBB+Bp6lQg+SttbKfDYiSCT0o3KnxA4N5EWPtrTegLagEmJw5PpKsi/wAJyt8GX3Vd9L3R82KX7Vh1vMi2dBxkQcCO9l7uY8hWR7o7fOCxkU4vZGs45lG7LjzsfeBQk+qaVMYLGJLGskbBkcBlYcCDqDT9CAY6S58mysWTziy+1yFHzr5mVSSABck2A5kngK2zp03kVYEwintyMHcDkiejfzb+g1SdEHR80ki43ELaNDeFSPTYcHt+VeXefKhJqu5mxPsmBggPpIgzfrbtP/mJqn6V93Ti9nuEF5IiJVA4nKCGA81J9oFGVKhB8fA19Q7j7zLjsHHKCM9gsg5rIos1/PiPA0C7+dDJldp8CVVmN2gbsqSeJjPBb/lOniOFAmzsFtXZkpeKHERHgbRl0YDkwAKsKEn0rXGawuaxnCdKW2GGVcCHbvEE4+Ga1SW2NtvanYxTDCYc+koAUkd2RSWbyYgUIJeAxo2pt8Sx9rD4FCA/JnNxcebE28I71qdU+6+60OAgEMA04sx9J25sx+nKrigOEVmE0VmI7iR7jWoUD4tYhJIHXUSNcjNex1U9w1vyqm14wdwWSkCV7AqxUxC9lZlKgeOYa8eWlOGxRjHCbEEX46H38Cv/AFes2vzLtHkWvR03/d8S/kaVP/LmkT5AVS4lLOw7mYe4mrbo+BWLERsLFMVJoeWdUl/9SoG10tPIP3iffY/WtsXlJmdrDLXdSTVhRJQhu3LabzFF9dECpUqVAKlSpUAqj4M6MO52+LE/WpFR8P6Ug/eB96r/AM6AkUqVVu3tiJiourkeRFzBrxuY2Nr6Fl1trwoDOunzGx9Rh4sw6zrS2W+oUIQSRyFyKxjDzlHVxxVgw81II+VfRsPRNs0G5gMhPN5JGJ8+1rU/D7l7OjYKuFgDG9gUVibWv6V+8UJK3A9LuznjVmnyMRcoUcsptqOypB9lGMMwdQy6hgCD4EXFRosDBF6McaeSqvyFdO0o1Cl2CFhcK1gbeVCCXQRvh0T4XGsZFvBMeLoAVY97pwJ8RY+dFJ21FfKGub2sAeNma3Dj2G9qkcRTeJ27GjEG+hsTbQaIzE/pV1Y+F+6gM82BurtnZnYw7wYiG9+rdmUC/ErcAoT4Ejwohkxe2pRlWDCYcn12laW3iFVbe+ryTb5vZYyTnyatYBtNCbHiWFvb7WNo7XkDlFHoyJcqTmy2jkJP7pBZPdQA7sbojjExxGPlbGTE3OYWjv4rxa3cdNOFH4AUcgB7AKoG2niW9FDopPoHUhVYL2uGodfaKexGGmkQhwDaRCvAXTNZsynT0dbXIPwoC6vSvVPgdnzdYrSuSAvAOfStHrp6QLCQ68mHkI2E2Ax1dioBZSmpDDNKAxsb5srrY/uj2AXpxSfmX3jz+VMnasQIGcXPdc8SQOHDUEedQRu1HlCsfzAleySHJNjY66G2t+HKnTsWK5JY3JBJLAXIZWBNud1Hx76AX7dS7Hiixs5bW/YtmFvJlPtpj/EBAcMnbDOoGltC2S+p42Hv08JMGBgXMRY2UhiWLDKQqkNc21CL7q8xSYcHsqCeNwhY6W1vbjoPdQETEbfLFQmhzIbggi2aHOCLcMs1/wCE12PbczcItSO57XGQ3vlOhBaxseA8RU9cco4RsLfuhRoNOJHKmTtrUjKq2/NIn0NAe9nzTMxMi5V/Lb91LG48c4I8uHOl2k7LNIFjDXYEk25qLDX2++rrC7TLSBSoAPCxZu/nlAtpVJvHcTMOsVAyIdba6ldCeFvrWTi3pgn5mjh1qlgjZpiLZEUWtr3EE66930rxHh5F0Lqgvy5ZiRp7T386jGCMDtTk9m9geIBygDjfypmUw6kByeQ1A4V5btff6/Y9BVeH0+5b7h4gmbGAm5LRP/NGY/8A0q5vElsQ3iFPwt9Kj7lzL9unCAhXhQgHiOrdwf8A9gqfvUlplPenyJ/vXr8NLVVFs83iI6bGiBsuTLKp8aOhWexNZgfGj6B7qD4VoKRylSpUAqVKlQCqPH+I3iqn+ofQVIpg/ijxQ/5SP+KgK3bjyKQYwzdh7qtzqAHUkDxQrobkuKiPNJOko4srIUQKQPu5bkgsAGvl76t9obXjhKiQkFuFlZr6geqD3ion7dXikE7A63WIi+vPNax560BHw+zZwWAYqgIKANYEGVncMBwurW00FhwrjbvSMO04JNzmN73MJi+BCG/gedW+z8Y0iktG8djYB7XI5HQm3l4VKoCni2AM6szBirljcXuG6w5Tc20MhsbeqKl4zZqSG731RktwuGKtfvuMotUDGH7xwSdLG2aTwtZVHf402I8w9H3o50/jfhcUBNbAQAgtluCTctqSZOsvpzz6+FzyJrpxWHJJuhJ0Jte9xbW3G4AHs8KhR4NwbhDf9MSjQ6d55VIXASEWPDxkbu4WUAEXoCZPKqEdhiTb0Uvw4XPhUU7QVWLKli1r3ZVJtoOJ7r0sdBYLmXNZbeiWAt4lh8arkWwBsq3OlupXy1N9bXoCwO2+7JY3sc2bwGijvrwdpSE8ABbiEkbX2gD/AN6ZE5J7JHkJGIHlkXSpKNFx6uQ/qDHjf85oD22JkMStcg5tTZV014BiR3c6hJi2NwXbmLdYAe/1V8DVggQxkACNQb+pp48x76rSxPAkngSJHN+OtkXx+FAeUBIJtm/85tTwtqO/XTkaXUgcha9/QS3vkcmnvs5PpRkkn8rt3i92YDhbSvf7PfkNQdOzEALdxOY2qSB7BxMFcm5BU2Byi9r/AJALVCZbqNTYa2++bna3K4/satsNBIrHMbrbTtfTKBTM+yjJcsVue4P8s1vhUElcYwDcJb+BF43F7ux5/KvSSKWtnyacQ8fgSQqDjodb6VPTYwHEj2Ig+YNPrs8D1n/mt/TapAxhpI8wymQnhr1hHmb6e2hXpG2kkDxM7IoZSO0QL5SDz86NPsKA3tqOZJPzNMY1cOxBl6pivAvkJF+Ns3Dhy7qouqVsdLLqbeVPVjJieK3+h4RAyHuiRm1/UBblXI94sdL+Fs7FsDz6tl+OW3xrav2xh00EiDwX/wDmm33ngHAsfJW+tqojwNS65Zolx1r6YXp9wG6OcPjvtvWYnBvBH1LrndlJLM0bAZRr6p5UV73JrGf1D5Gnn3tj5I5/lH1qr2vtrrwoyZcpvfNflbhatUIRrjpj0MllkrJapdSto42RLmhU+FA1Fu7Mt4rdxrs4LilSpUAqVKlQCqPN6aH9Q94v/pqRUfFcUP74+II+tAeNoZLDrDYX01Iv4aceHwriYlR2RfQXFlY6Wvx5mn5sOHFjfv0JHypv9npe5Fz4lj8zQDB2hqNGA72yqPjrTQ2qSSMttL3MgI/y3qeMIg9VfcKdC2oCtx8YJHpG/EfeFcpFuC6XqKMAx9Tn/wDTU91zeR/CrPE7QVOIPst/eq071x3sqMfOw+poCQMPKQBdha3rKunkqm1L9nOeJHLi8jcNeRFeU2tI3oovtc/RK9ddOecQ9jH6igJQwhCBQ1rcbC4I/iJrx+zF11NjyGUD2WF//eo/UYg/+MB5IPreuHZcp44h/ZYfICgJibOQEHtG3C7Np7L2rjYSJeKp/Fb61BO7oPpSSHzZv70hutFzuaAl/tGBPXjHgCv0ppt4oB69/IMfkK4u70I5U6uxIh6tARG3qiHAOf4QPmRTL72j1YmPmQPlerVdlRD1BTgwKD1R7qAoG3pkPoxKPMsfoKabb+JPAKPJCfmaJxh1/KPdXoRjuFACJx2Kb1m9iqPpXgw4luJlP8RHyNGVq7QAUdiTHipPmb/Ovabty/lAoypUAJLuzL4U4u6r82FFNKgBtd1DzenBuoObmiClQFGu6qc2NWOz9mrCCFvrUulQCpUqVAf/2Q==" width="294" height="219" /&gt;&lt;/p&gt;  &lt;p&gt;Últimamente, he apreciado un más que notable incremento en la cantidad de publicidad (y además obligatoria) en YouTube, lo cual me ha llevado a reflexionar sobre qué es Google, y sobre su modelo de negocio. Es algo bastante evidente y que mucha gente ya conoce, pero aún así creo que vale la pena comentarlo, ya que no pocas veces he oído a la gente preguntar: &amp;quot;si todo lo que hace Google es gratis... ¿de qué viven?&amp;quot;. &lt;/p&gt;  &lt;p&gt;Veamos... Aparte de que no todo lo que hacen es gratis, parece que Google vive de la publicidad. De recabar información sobre los usuarios para hacerla más efectiva, y ya de paso, de vender esa información a multinacionales. &lt;/p&gt;  &lt;p&gt;De hecho, últimamente ha habido un follón importante con el software denominado &lt;em&gt;Carrier IQ&lt;/em&gt;, que recopila información privada de lo que los usuarios hacen con el móvil (incluso mensajes, y pulsaciones en el teclado) y la envía a servidores corporativos (&lt;a href="http://www.gizmodo.es/2011/12/16/aqui-tienes-la-lista-completa-de-los-moviles-que-albergan-el-software-espia-carrier-iq.html"&gt;aquí tenéis la lista completa de móviles que lo llevan instalado&lt;/a&gt;). &lt;/p&gt;  &lt;p&gt;Cuando se destapó el escándalo, y tras hacerse público que millones de terminales &lt;em&gt;Android&lt;/em&gt; (entre otros) llevaban preinstalado ese software espía, el &lt;em&gt;chairman&lt;/em&gt; de Google (Eric Schmidt) declaró:&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;&amp;quot;Android is an open platform, so it's possible for people to build software that's actually not very good for you, and this appears to be one&amp;quot; &lt;/em&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;[Traducción] “Android es una plataforma abierta, por lo que es posible que la gente desarrolle software que, de hecho, no es bueno para ti. Y este parece ser uno de esos casos”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Con esa declaración, pretende desvincularse del problema y negar toda responsabilidad. Y no seré yo quien le acuse de nada, ya que ni soy quién, ni tengo conocimiento para hacerlo. Pero lo cierto es que un software así tendría un valor potencial enorme para una empresa como Google, cuyos ingresos dependen tanto de la publicidad. Y en mi pueblo, toda la vida se ha dicho… &lt;em&gt;si anda como un pato, huele como un pato, y hace ‘cuack cuak’… probablemente sea un puto pato&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Y es que, obviamente, uno de los principales objetivos de una empresa como Google, será hacer su publicidad lo más efectiva posible. &lt;/p&gt;  &lt;p&gt;Pero al margen de estas teorías conspiranóicas, es un hecho que Google, desde hace ya unos cuantos años, ha ido creando sistemas de software que, dado que son (aparentemente) gratuitos, se han ido instalando en todos los hogares del mundo. Y hay que reconocerles su parte de mérito, ya que han tenido visión y talento (en caso contrario no hubieran tenido éxito, por muy gratuito que fuera su software). &lt;/p&gt;  &lt;p&gt;Pero viendo el increíble incremento de la publicidad que nos toca sufrir ahora, no puedo dejar de pensar si el objetivo final no fue, desde el principio, nada más que colarse en todos los ordenadores del mundo, para poco a poco ir recabando información y colando anuncios.&lt;/p&gt;  &lt;p&gt;Por lo tanto, la pregunta importante es: ¿Es la publicidad el sustento que hace posible a Google, o es su razón de ser? &lt;/p&gt;  &lt;p&gt;Hasta ahora creí que la respuesta correcta era la primera, pero empiezo a ponerlo en duda. Y si realmente es así, me parecería lamentable. &lt;/p&gt;  &lt;p&gt;Primero, porque Google lleva años asociándose con ideologías de software libre. Pero claro, si su objetivo final era publicitario, su imagen molona de &lt;em&gt;OpenSoftware &lt;/em&gt;y&lt;em&gt; &lt;/em&gt;regalar sus programas era, simplemente, parte del plan. Una actitud bastante ruin. &lt;/p&gt;  &lt;p&gt;Segundo, porque los creadores de Google siempre han dicho que su objetivo prioritario era &amp;quot;cambiar el mundo&amp;quot;, y si finalmente se destapa el pastel publicitario, quedarían a la altura del betún. &lt;/p&gt;  &lt;p&gt;Y tercero, porque todas las críticas vertidas hacia sus competidores que no se alinean con el software libre, simplemente porque tienen (en el software) un modelo de negocio real y honesto, estarían realmente de más. &lt;strong&gt;Dejaría de tener sentido comparar a Google con tantas otras empresas para las que el software es mucho más que una valla publicitaria&lt;/strong&gt;, y cuyo objetivo final SÍ es desarrollar un software de calidad, útil para el usuario y fiable. &lt;/p&gt;  &lt;p&gt;Así que, si con lo años finalmente se confirma todo esto, y para Google el software no es más que un anuncio en la &lt;em&gt;Super Bowl&lt;/em&gt;, no habrán hecho sino &lt;strong&gt;prostituir la informática&lt;/strong&gt;. Venderla al mejor postor. Manipular al usuario, y vender una imagen totalmente falsa de si mismos. &lt;/p&gt;  &lt;p&gt;No es ilegal. Pero a mí personalmente, no me parece una actitud honesta. &lt;/p&gt;  &lt;p&gt;Ojala me equivoque, de verdad, y con el tiempo se demuestre que realmente son &lt;em&gt;ese grupo de tíos con talento que tanto nos han inspirado en el pasado&lt;/em&gt;...&lt;/p&gt;  &lt;p&gt;Ojala.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-8476842483154727262?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/8476842483154727262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=8476842483154727262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/8476842483154727262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/8476842483154727262'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/12/el-modelo-de-negocio-de-google.html' title='El modelo de negocio de Google'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-7321490602039609595</id><published>2011-11-20T11:46:00.001+01:00</published><updated>2011-11-20T11:46:12.037+01:00</updated><title type='text'>Toda una clase magistral de mecánica de motores, a escala</title><content type='html'>&lt;p&gt;Estoy flipando ahora mismo… Realmente hay genios anónimos por ahí…&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:6938a8eb-f6af-4385-b12e-5124449a6998" class="wlWriterEditableSmartContent"&gt;&lt;div id="2db84550-e0ff-4f86-954f-981f97b76800" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=3YfTtGCsiD8" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/-FORgEjIZroI/TsjacnqgIzI/AAAAAAAABOk/d5tn2G1w2N8/video7cdded480a43%25255B2%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('2db84550-e0ff-4f86-954f-981f97b76800'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/3YfTtGCsiD8?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/3YfTtGCsiD8?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;[Via Joke]&lt;/p&gt;  &lt;p&gt;Gracias !!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-7321490602039609595?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/7321490602039609595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=7321490602039609595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/7321490602039609595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/7321490602039609595'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/11/estoy-flipando-ahora-mismo-realmente.html' title='Toda una clase magistral de mecánica de motores, a escala'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-FORgEjIZroI/TsjacnqgIzI/AAAAAAAABOk/d5tn2G1w2N8/s72-c/video7cdded480a43%25255B2%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-8051976577289166116</id><published>2011-11-09T19:58:00.001+01:00</published><updated>2011-11-09T19:58:15.118+01:00</updated><title type='text'>Algunas mentiras sobre la Iglesia Católica</title><content type='html'>&lt;p&gt;Esto de Facebook deja cada vez más claro que la gente no tiene ninguna gana de esforzarse lo más mínimo en corroborar fuentes o en contrastar información.&lt;/p&gt;  &lt;p&gt;Hace algunos días, ya publicamos en &lt;a href="http://graphicdna.blogspot.com/2011/10/llamamiento-la-revolucion.html"&gt;otro post&lt;/a&gt; cómo mucha gente en Facebook estaba compartiendo un vídeo que en principio parecía un manifiesto anti-sistema, pero que tras un triste cuarto de hora de investigación quedó claro que era poco menos que un timo.&lt;/p&gt;  &lt;p&gt;Hoy me ha llegado otro caso que clama bastante al cielo (nunca mejor dicho...). Y conste que yo no soy católico practicante, ni mucho menos, y que critico y criticaré a la Iglesia Católica cuando crea que lo merece, igual que a cualquier otro. Pero me molesta que la gente ataque a nadie solo por pura diversión, &lt;strong&gt;mintiendo descaradamente&lt;/strong&gt; y sin aportar ni una sola prueba de nada (como suelen hacer siempre algunos).&lt;/p&gt;  &lt;p&gt;Hoy me ha llegado esta foto a través de Facebook:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-DnjbPbxOszM/TrrNQeQQyUI/AAAAAAAABOU/F_Fpst9Povc/s1600-h/385866_274239762617961_112956075412998_785039_1613035833_n%25255B1%25255D%25255B3%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="385866_274239762617961_112956075412998_785039_1613035833_n[1]" border="0" alt="385866_274239762617961_112956075412998_785039_1613035833_n[1]" src="http://lh6.ggpht.com/-hIgzIwYo2DU/TrrNQ8J0HWI/AAAAAAAABOc/53RPexRh184/385866_274239762617961_112956075412998_785039_1613035833_n%25255B1%25255D_thumb%25255B1%25255D.jpg?imgmax=800" width="305" height="313" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Como al leerlo me ha parecido un despropósito, me he molestado en dedicar 10 minutos a averiguar quién dice eso, por qué, y de donde se saca esa cifra, tras lo cual, he flipado bastante. &lt;/p&gt;  &lt;p&gt;Resulta que los que afirman tal cosa, se han dedicado a sumar todo lo que ellos consideran son “aportaciones del estado a la iglesia”. No solo monetarias, sino de todo tipo, como:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Profesores de religión y otros cargos religiosos: 500 millones de euros&lt;/li&gt;    &lt;li&gt;Conciertos educativos: nada menos que 3.200 millones de euros. &lt;/li&gt;    &lt;li&gt;Exención de impuestos: 750 millones de euros&lt;/li&gt;    &lt;li&gt;Donación de solares para templos&lt;/li&gt;    &lt;li&gt;Ayudas directas a la Iglesia para el sostenimiento de su patrimonio artístico e inmobiliario: 280 museos, 103 catedrales&lt;/li&gt;    &lt;li&gt;Desgravación de los donativos: las donaciones a la Iglesia Católica desgravan un 25% del IRPF (caso de personas físicas), y un 35% del Impuesto de sociedades (caso de personas jurídicas). Pero el Estado devuelve a los fieles, y por tanto aporta, el 25% (o el 35%) de esa cantidad. Esto supone 71 millones de euros.&lt;/li&gt;    &lt;li&gt;Etc&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Creo que esta información debería ir en el diccionario al lado de la palabra “demagogia”.&lt;/p&gt;  &lt;p&gt;No se ni por donde empezar… vamos a ver si lo consigo...&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;Profesores de Religión&lt;/h4&gt;  &lt;p&gt;Los profesores de religión existen porque hay padres que (aún) quieren que sus hijos estudien religión. Al igual que un segundo o tercer idioma, u otras asignaturas optativas… El programa educativo de cada colegio se diseña para satisfacer las demandas de los padres. ¿O acaso conocen uds. algún colegio que tenga contratado a un profesor de religión, a pesar de no tener alumnos? ¿Acaso pretenden decir que lo que les parece mal son las asignaturas optativas? ¿Deberían todos los colegios concertados impartir única y exclusivamente las materias troncales?. &lt;/p&gt;  &lt;p&gt;En mi opinión, esto es un absurdo. No creo que a nadie le moleste que se contrate a un profesor de Alemán, si hay suficientes padres interesados en que sus hijos lo estudien como asignatura extra. ¿Por qué el caso de la religión es diferente?&lt;/p&gt;  &lt;h4&gt;Conciertos educativos&lt;/h4&gt;  &lt;p&gt;El estado concierta centros privados de enseñanza. Punto. Sean religiosos o no.&lt;/p&gt;  &lt;p&gt;Lo que no podemos obviar es que este país tiene una tremenda tradición religiosa, y que obviamente muchísimos centros son de carácter religioso. Pero de hecho, es así porque así lo quiere la gente. Si esos colegios existen, es porque los padres llevan a sus hijos a estudiar allí. Simple y llanamente. ¿A alguien le han puesto una pistola en la cabeza para obligarle a llevar a sus hijos a un centro religioso? Es más, ¿por qué concierta el gobierno centros privados, sean religiosos o no? Pues porque le sale infinitamente más barato ese concierto que construir miles de colegios nuevos. Simple y llanamente.&lt;/p&gt;  &lt;p&gt;Así que mencionar cuánto dinero se despilfarra en este tema (3200 millones de euros nada menos) es una burla. Parece broma. &lt;/p&gt;  &lt;p&gt;Ya que les gusta tanto hacer cálculos, les animo a calcular cuanto dinero costaría construir dos o tres mil colegios nuevos. Y ya de paso, reflexionen sobre cuanto costaría mantener esos miles de colegios públicos nuevos. Seguramente bastante más de lo que cuesta mantener los actuales privados. Así que dejen de decir barbaridades, por favor.&lt;/p&gt;  &lt;h4&gt;Exenciones de impuestos&lt;/h4&gt;  &lt;p&gt;Sin duda, muchas de las tareas de la Iglesia Católica están exentas de impuestos, al igual que muchas de las tareas de cualquier ONG, u organización sin ánimo de lucro o dedicada a la caridad. Eso, de hecho, es una medida muy social, que fomenta la solidaridad y la ayuda al necesitado, y me parece fenomenal. ¿Le parecería bien que un voluntario tuviera que pagar impuestos por ir un día a ayudar a un comedor social? Si una entidad (y no estoy hablando ahora de la Iglesia) no tiene beneficios porque dedica todos sus fondos a la beneficencia, ¿qué impuestos quieren uds. que pague?.&lt;/p&gt;  &lt;p&gt;Sin embargo, y como también es totalmente normal, otras tareas de la Iglesia NO ESTAN exentas de impuestos. Por ejemplo, en el año 2009, la Iglesia abonó en concepto de Seguridad Social de sacerdotes y obispos 20.426.000 €. ¿Por qué? Pues porque los sacerdotes también se ponen enfermos. Y esto también es totalmente lógico.&lt;/p&gt;  &lt;p&gt;Los curas también pagan impuestos. Y eso que ellos no cobran dietas, ni horas extra, ni piden nada por tener que levantarse tres días por semana a las 3 de la mañana para ir al hospital a dar la extremaunción a un enfermo, ni por dar 6 misas en un día, en 6 pueblos distintos.&lt;/p&gt;  &lt;h4&gt;Donación de solares&lt;/h4&gt;  &lt;p&gt;Este es un tema polémico, y habrá casos de todo tipo. Lo que sí sé, y esto lo se de buena mano, es que muchas, muchísimas supuestas propiedades de la Iglesia Católica no estaban registradas a su nombre. Iglesias, casas parroquiales, conventos… En muchos casos, esas propiedades son utilizadas por la Iglesia desde hace siglos, sin estar muy clara su propiedad legal. Hace poco tiempo, la Iglesia procedió a regularizar esta situación porque en algunos casos, determinados Ayuntamientos se basaron en esa falta de claridad legal para efectuar algunas expropiaciones, generando una polémica enorme.&lt;/p&gt;  &lt;p&gt;No entraré a debatir más esto, porque habría que estudiar cada caso por separado. Lo que sí se, es que si el Gobierno cede la propiedad de la iglesia de un pueblo a la Iglesia Católica, que lleva utilizándola 500 o 600 años, pues me parece lo normal. ¿Para qué se iba a usar si no una iglesia?. Aunque reconozco que este aspecto es cuestión de opiniones, y habrá gente que no lo verá así, me parece tremendamente demagógico hacer una estimación “a ojo de buen cubero” de cuanto valen esas propiedades cedidas, para terminar con la bonita cifra de 10.000 millones de Euros. Lo dicho, demagogia pura…&lt;/p&gt;  &lt;h4&gt;Ayudas para el mantenimiento del patrimonio&lt;/h4&gt;  &lt;p&gt;Esto ya parece cachondeo. ¿Qué es lo que hay que hacer en opinión de algunos? ¿Abandonar las catedrales y los museos? ¿Dejar que se pudran y se vengan abajo? En mi opinión, son patrimonio de todos. Historia pura. Y yo personalmente agradezco vivir en un país con tanta historia. &lt;/p&gt;  &lt;p&gt;Nos guste o no, la historia de España está ligada a la Iglesia. Parece que algunos preferirían ver derribada la catedral de Burgos con tal de que el estado no soltara un duro para mantenerla. ¿Como pueden algunos sentir tanto odio hacia algo, como para que les nuble el más básico sentido común?&lt;/p&gt;  &lt;p&gt;A mi tampoco me gusta nada el fútbol u otros deportes, y el estado se gasta cientos de millones al año en la seguridad derivada de los partidos, en selecciones deportivas, etc. Pero entiendo que a una parte enorme de la población le encanta. Y por eso me parece normal que se haga. No entendería que se gastaran millones para organizar un encuentro internacional de escupir huesos de aceituna, pero si medio país se vuelve loco con la selección, pues qué le vamos a hacer…&lt;/p&gt;  &lt;p&gt;Respondan a esta pregunta… ¿Cuantos millones de Españoles se declaran Católicos? Creo que no cabe decir nada más.&lt;/p&gt;  &lt;h4&gt;Desgravación en los donativos&lt;/h4&gt;  &lt;p&gt;De nuevo, ¡qué sinsentido!… Los donativos para causas benéficas, ONGs, u organizaciones sociales desgravan, si… ¡PERO EN TODOS LOS CASOS!&lt;/p&gt;  &lt;p&gt;Si donas a Cruz Roja, a Cáritas, a Intermon-Oxfam, a Manos Unidas, a Médicos sin Fronteras, a Greenpeace o a Amnistía Internacional. En todos los casos obtienes la misma desgravación. Realmente hay que ser un poco “zote” para considerar una aportación del estado a la Iglesia lo que deja de recaudar por la desgravación… &lt;/p&gt;  &lt;p&gt;Esto también es otra medida social, y nuevamente me parece fenomenal, porque fomenta que la gente contribuya con causas benéficas. Sean cuales sean.&lt;/p&gt;  &lt;h3&gt;La verdad de las cuentas de la Iglesia&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;Primero&lt;/strong&gt;. Las cuentas de la Iglesia son públicas. La Conferencia Episcopal las publica cada año. Otra cosa es que ud. ni se haya molestado en averiguarlo.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Segundo&lt;/strong&gt;: desde el año 2007, el estado NO HACE UNA APORTACIÓN DIRECTA a la Iglesia. En ese año, se sustituyó tal aportación por la donación VOLUNTARIA que cada uno hace (o no) en la declaración de la renta. Y me parece fenomenal, porque yo TAMPOCO ESTOY DEACUERDO con que el estado haga una aportación no-voluntaria.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tercero&lt;/strong&gt;: Como ya he dicho, ESA APORTACIÓN ES VOLUNTARIA. La hace el que quiere. Y… ¿saben uds. una cosa? Uno de cada tres Españoles la hace. Más del 33% de los Españoles. ¿Le parece a ud. poco? Ni siquiera los partidos políticos mayoritarios tienen semejante apoyo, y eso que votarles es gratis.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Cuarto&lt;/strong&gt;: En el año 2006, la Iglesia recibió por este concepto 144 Millones de Euros, aportados voluntariamente por los ciudadanos. 144, no 10.000. Claro que, siguiendo su forma de hacer las cosas, aquí podríamos empezar a sumar cosas absurdas, como por ejemplo lo que el estado deja de recaudar por la gente que come en los comedores sociales de Cáritas, o lo que no declaran los que están pidiendo en la puerta de la iglesia. ¡Os habías dejado muchas cosas por incluir en esa suma!Animo, que con mi ayuda llegamos a los 20.000 millones fácilmente.&lt;/p&gt;  &lt;p&gt;Y por si dudan de mi objetividad al hacer estos comentarios, les diré que YO NO HAGO la aportación voluntaria a la Iglesia Católica. Tengo mis razones para preferir donar a otras entidades, como Cruz Roja, Intermon Oxfam o los Misioneros Javerianos. &lt;/p&gt;  &lt;p&gt;Pero aún así, pienso que la labor de la Iglesia Católica, sea o no cuestionable y criticable a veces, es INDISPENSABLE en muchas otras. Es una de las mayores ONGs que existen. Simple y llanamente. &lt;/p&gt;  &lt;h3&gt;Mi conclusión personal&lt;/h3&gt;  &lt;p&gt;Criticar es de sabios. Es algo bueno. Buenísimo. Pero cuando uno no se molesta en dedicar ni 5 minutos a estudiar si lo que dice es cierto, pasa muy rápidamente de sabio a borrico. Y sus críticas, que podrían haber sido constructivas y muy valiosas, se convierten en charlatanería barata y demagogia pura.&lt;/p&gt;  &lt;p&gt;Y además hacen daño, porque desgraciadamente la gente así abunda. Porque estamos deseosos de escuchar cómo alguien confirma que todo lo malo que nos pasa, en realidad es culpa de otros. Y estamos deseosos de que nos corroboren que el que tiene más, es porque nos lo ha robado, no porque se lo merezca. !Somos unos fanáticos de las conspiraciones! Especialmente en momentos jodidos como estos. &lt;/p&gt;  &lt;p&gt;En definitiva, es mucho más fácil creer todo lo que cualquier persona dice, que teclear 5 palabras en Google, y leer durante dos minutos. Por todo eso, no me extraña lo más mínimo que este tipo de mensajes se divulguen por la red exponencialmente. Y por eso no me extraña lo más mínimo que páginas &lt;a href="http://www.facebook.com/#!/pages/IDoCare/129656183800346"&gt;como esta&lt;/a&gt; solo tengan 3 amigos. &lt;/p&gt;  &lt;p&gt;Por eso escribo esto. Porque tengo la esperanza de que, poquito a poco, la gente se de cuenta de lo importante que es&amp;#160; investigar, pensar y sacar conclusiones propias, antes de creer a nadie a pie juntillas. Tampoco a mi, por supuesto…&lt;/p&gt;  &lt;p&gt;Y no se lo deseo a nadie, la verdad, pero ahora que se están poniendo las cosas tan chungas, quizá algunos de los que tanto critican a la Iglesia, tengan que acudir a pedir ayuda a Cáritas Diocesana. &lt;/p&gt;  &lt;p&gt;Y… ¿Saben qué? &lt;/p&gt;  &lt;p&gt;Allí nadie les preguntará cuales son sus creencias. Si se dedicaron a poner a parir a la Iglesia siempre que pudieron, o si han hecho la donación en la declaración de la renta.&lt;/p&gt;  &lt;p&gt;Simplemente les darán de comer.&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;font size="3"&gt;Pregúntense qué otra organización de esas que tanto les gustan y que “tanto luchan por los derechos de todos” hará lo mismo.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-8051976577289166116?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/8051976577289166116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=8051976577289166116' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/8051976577289166116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/8051976577289166116'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/11/algunas-mentiras-sobre-la-iglesia.html' title='Algunas mentiras sobre la Iglesia Católica'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-hIgzIwYo2DU/TrrNQ8J0HWI/AAAAAAAABOc/53RPexRh184/s72-c/385866_274239762617961_112956075412998_785039_1613035833_n%25255B1%25255D_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-9040354161771344384</id><published>2011-11-09T10:16:00.001+01:00</published><updated>2011-11-09T10:16:58.176+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='C# 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>FIXED: VStudio 2010 Intellisense doesn’t select a default value</title><content type='html'>&lt;p&gt;From time to time, my Visual Studio Intellisense seemed to stop working properly, until VStudio was re-booted.&lt;/p&gt;  &lt;p&gt;Apparently with no reason, Intellisense stopped selecting a default value automatically, what is pretty annoying for me, as I tend to misspell many words…&lt;/p&gt;  &lt;p&gt;As re-booting VStudio and re-loading my entire Solutions takes several priceless seconds, many times I saw myself working without that feature, and getting more and more nervous… &lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="" src="https://encrypted-tbn3.google.com/images?q=tbn:ANd9GcTqNJfJ-COA14rWfGPeU_elbJy5IGv0qUDs-uB5vCnd2P3DTZqU6g" width="275" height="183" /&gt;&lt;/p&gt;  &lt;p&gt;Today I have realized that, in fact, nothing was going wrong with Intellisense. &lt;/p&gt;  &lt;p&gt;It seems that there is a keyboard combination shortcut to enable/disable this feature (I probably was hitting it by mistake)… &lt;/p&gt;  &lt;p&gt;If that happens to you… simply hit:&lt;/p&gt;  &lt;p align="center"&gt;&lt;font size="5"&gt;&lt;strong&gt;Ctrl + Alt + Space&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="left"&gt;And you will be enabling/disabling it… Now I feel like a dumbass…. hahahaaa…&lt;/p&gt;  &lt;p align="left"&gt;Thank God!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-9040354161771344384?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/9040354161771344384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=9040354161771344384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/9040354161771344384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/9040354161771344384'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/11/fixed-vstudio-2010-intellisense-doesnt.html' title='FIXED: VStudio 2010 Intellisense doesn’t select a default value'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-4593775481414564827</id><published>2011-10-27T21:38:00.001+01:00</published><updated>2011-10-27T21:38:23.021+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Simax'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='Road Safety'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><title type='text'>Testing the influence of the CG Height in the Moose Test, with a Simax Sim</title><content type='html'>&lt;div style="padding-bottom: 0px; padding-left: 0px; width: 546px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:2b8da792-09cc-4411-abaf-0e5477d3dbfe" class="wlWriterEditableSmartContent"&gt;&lt;div id="9833e71a-c6bd-4e4f-8b97-5bb343ed4d91" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=-gWV__VSSYI" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/-bbP3APDjTiI/TqnBPlRcWsI/AAAAAAAABJ4/61PVgKW6ZJg/video950ffb3f5f70%25255B3%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('9833e71a-c6bd-4e4f-8b97-5bb343ed4d91'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;546\&amp;quot; height=\&amp;quot;307\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/-gWV__VSSYI?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/-gWV__VSSYI?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;546\&amp;quot; height=\&amp;quot;307\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-4593775481414564827?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/4593775481414564827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=4593775481414564827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/4593775481414564827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/4593775481414564827'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/10/testing-influence-of-cg-height-in-moose.html' title='Testing the influence of the CG Height in the Moose Test, with a Simax Sim'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-bbP3APDjTiI/TqnBPlRcWsI/AAAAAAAABJ4/61PVgKW6ZJg/s72-c/video950ffb3f5f70%25255B3%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-220923056844757142</id><published>2011-10-27T16:52:00.001+01:00</published><updated>2011-10-27T16:52:27.625+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cars'/><category scheme='http://www.blogger.com/atom/ns#' term='Simax'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Road Safety'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><title type='text'>Simax emergency braking practice, with and without ABS</title><content type='html'>&lt;p&gt;The following video shows one of the Road Safety training exercises available in the Simax Road Safety simulator. It allows to practice emergency braking and obstacle avoidance on wet surfaces. The driver learns how to react depending on the presence of an ABS system or not.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 581px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:bd6c6b69-9054-43da-b588-5eae1e600c31" class="wlWriterEditableSmartContent"&gt;&lt;div id="33230ce5-e557-4d83-b64a-b30a776c9e0c" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=SrRlrEWirw4" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/-LsL5CJ2-om0/Tql-OhNigiI/AAAAAAAABJw/vNhGm3Mam7k/video4c949cb1f420%25255B3%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('33230ce5-e557-4d83-b64a-b30a776c9e0c'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;581\&amp;quot; height=\&amp;quot;325\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/SrRlrEWirw4?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/SrRlrEWirw4?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;581\&amp;quot; height=\&amp;quot;325\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-220923056844757142?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/220923056844757142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=220923056844757142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/220923056844757142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/220923056844757142'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/10/simax-emergency-braking-practice-with.html' title='Simax emergency braking practice, with and without ABS'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-LsL5CJ2-om0/Tql-OhNigiI/AAAAAAAABJw/vNhGm3Mam7k/s72-c/video4c949cb1f420%25255B3%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-933474574615954449</id><published>2011-10-27T15:52:00.001+01:00</published><updated>2011-10-27T15:52:26.653+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Simax'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Road Safety'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><title type='text'>Simax Night Driving Practicing</title><content type='html'>&lt;p&gt;This training exercise allows the driver to practice night driving, like in any real car, through a 24Km-long highway.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 584px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:56877cac-2812-4185-bd22-194bf75bb763" class="wlWriterEditableSmartContent"&gt;&lt;div id="7f8e1056-cf3e-411c-bc8e-ed4f1020265e" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=cfKzr4RCKj0" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/-Kf5fjUO0PeA/TqlwKevaoXI/AAAAAAAABJo/l6TSObr4D14/videof429df41ae6d%25255B4%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('7f8e1056-cf3e-411c-bc8e-ed4f1020265e'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;584\&amp;quot; height=\&amp;quot;328\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/cfKzr4RCKj0?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/cfKzr4RCKj0?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;584\&amp;quot; height=\&amp;quot;328\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-933474574615954449?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/933474574615954449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=933474574615954449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/933474574615954449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/933474574615954449'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/10/simax-night-driving-practicing.html' title='Simax Night Driving Practicing'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-Kf5fjUO0PeA/TqlwKevaoXI/AAAAAAAABJo/l6TSObr4D14/s72-c/videof429df41ae6d%25255B4%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-1882963671359237887</id><published>2011-10-27T13:19:00.001+01:00</published><updated>2011-10-27T13:19:58.286+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Simax'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><title type='text'>Simax Driving Simulator exercise: emergency situations practice</title><content type='html'>&lt;p&gt;Today, we have released a new video about emergency situations practice in Simax:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 634px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:ef585096-e84e-4bb0-aa98-77944483eb19" class="wlWriterEditableSmartContent"&gt;&lt;div id="f4e79cdf-1519-4a9f-bc67-e67e0ee678d2" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=WMNoZMQcXcU" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/-Avp-Ea6rnfE/TqlMbMP0OII/AAAAAAAABJg/heqWv6Z5Tgc/video3aba8a10a239%25255B3%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('f4e79cdf-1519-4a9f-bc67-e67e0ee678d2'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;634\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/WMNoZMQcXcU?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/WMNoZMQcXcU?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;634\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: This exercise allows the driver to practice reactions at emergency situations like water ponds on the road, accidents, trucks dropping their load, or even rocks falling. The simulator can even analyze reaction times, traveling direction progress, etc.&lt;/p&gt;  &lt;p&gt;Hope you like it…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-1882963671359237887?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/1882963671359237887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=1882963671359237887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/1882963671359237887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/1882963671359237887'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/10/simax-driving-simulator-exercise.html' title='Simax Driving Simulator exercise: emergency situations practice'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-Avp-Ea6rnfE/TqlMbMP0OII/AAAAAAAABJg/heqWv6Z5Tgc/s72-c/video3aba8a10a239%25255B3%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-162642912639891164</id><published>2011-10-20T23:09:00.001+01:00</published><updated>2011-10-20T23:10:03.480+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Simax'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><title type='text'>Some of our last works, here at Simax</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-ucJ7xAotgN8/TqCcFN8JUKI/AAAAAAAABII/rYaF7syBACc/s1600-h/Polo2010_1%25255B5%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Polo2010_1" border="0" alt="Polo2010_1" src="http://lh3.ggpht.com/-JQdWp0sZO5Y/TqCcFuYgW9I/AAAAAAAABIQ/2GTppgAZLhc/Polo2010_1_thumb%25255B9%25255D.jpg?imgmax=800" width="627" height="489" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-bm67-FM3VXk/TqCcGNYMetI/AAAAAAAABIY/CSO35uxVT3Q/s1600-h/Polo2010_3%25255B3%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Polo2010_3" border="0" alt="Polo2010_3" src="http://lh4.ggpht.com/-IK16xuNWqNU/TqCcGlF9OyI/AAAAAAAABIg/nUgr8k4zzu4/Polo2010_3_thumb%25255B1%25255D.jpg?imgmax=800" width="644" height="380" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/--5tn7mT7O3k/TqCcG8JZUAI/AAAAAAAABIo/GG_VhJc6Kzg/s1600-h/Polo2010_2%25255B3%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Polo2010_2" border="0" alt="Polo2010_2" src="http://lh6.ggpht.com/-93INmooSRkk/TqCcHYtcysI/AAAAAAAABIw/hxYEWGdfIPg/Polo2010_2_thumb%25255B1%25255D.jpg?imgmax=800" width="634" height="374" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-X8C0I4nzCRM/TqCcHyZLOHI/AAAAAAAABJY/_QAxj9b4XZ8/s1600-h/ext_3%25255B8%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="ext_3" border="0" alt="ext_3" src="http://lh3.ggpht.com/-y1YR3iLTxUE/TqCcIdLVEwI/AAAAAAAABJc/1K_Ez-QK3nA/ext_3_thumb%25255B13%25255D.jpg?imgmax=800" width="632" height="408" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-TZ8ebYOCR3w/TqCcJP7i5BI/AAAAAAAABJI/3NyJ4CglNCs/s1600-h/Ent_PruebaLluvia%25255B6%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Ent_PruebaLluvia" border="0" alt="Ent_PruebaLluvia" src="http://lh5.ggpht.com/-G3hkZJaGfGY/TqCcJf7_6tI/AAAAAAAABJQ/shkbVV9M4zM/Ent_PruebaLluvia_thumb%25255B10%25255D.jpg?imgmax=800" width="620" height="210" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-162642912639891164?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/162642912639891164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=162642912639891164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/162642912639891164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/162642912639891164'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/10/some-of-our-last-works-here-at-simax.html' title='Some of our last works, here at Simax'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-JQdWp0sZO5Y/TqCcFuYgW9I/AAAAAAAABIQ/2GTppgAZLhc/s72-c/Polo2010_1_thumb%25255B9%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-6215801102894458229</id><published>2011-10-09T11:52:00.001+01:00</published><updated>2011-10-09T11:52:30.641+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SkateBoarding'/><title type='text'>The Longboard attraction…</title><content type='html'>&lt;p&gt;Cada vez me llama más la atención esto del Longboard… Será que me estoy haciendo abuelo.&lt;/p&gt;  &lt;p&gt;El caso es que, cuando estuve en Nueva York este verano, me llamó mucho la atención encontrarme con esto:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-L5YGElpz5_w/TpF84YGW8PI/AAAAAAAABHo/bG0NtwR_ef0/s1600-h/8%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="8" border="0" alt="8" src="http://lh3.ggpht.com/-3U5mGoMBPmI/TpF84yYi-XI/AAAAAAAABHs/WxTjyn68qxM/8_thumb%25255B1%25255D.jpg?imgmax=800" width="686" height="533" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Gente practicando Longboarding por medio de la quinta avenida, entre el tráfico, como si no tuviera el más mínimo peligro. Pero no uno, ni dos, ni tres… Mucha peña, como podéis apreciar en estas fotos que saqué.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-Untn_Quz3iU/TpF85k4Zq0I/AAAAAAAABHw/mod7Oj_24dM/s1600-h/P7160062%25255B5%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="P7160062" border="0" alt="P7160062" src="http://lh5.ggpht.com/-bL2v9uQbU-I/TpF86Ik3-mI/AAAAAAAABH0/sUMtfkc0fDk/P7160062_thumb%25255B2%25255D.jpg?imgmax=800" width="673" height="528" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pues bien, ahora me entero que es una afición muy en auge pro allí, e incluso se reúnen todos, una vez al año, para descender toda la avenida Broadway, hasta el Battery. Es la carrera conocida como “&lt;a href="http://bwaybomb.tumblr.com/"&gt;Broadway Bomb&lt;/a&gt;”: un evento organizado por internet, que no cuenta con permisos de ningún tipo.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:15b11b7b-e310-44da-9d4d-24dddc8d107f" class="wlWriterEditableSmartContent"&gt;&lt;div id="a320920f-8ce3-405a-9e3e-ac9cc1d22ac3" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=2Gct-Cpy6Sw&amp;amp;feature=player_embedded" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/-GX41QVYpZ_U/TpF86S8UBeI/AAAAAAAABH4/FuRSEldXcHQ/video37aef2580f08%25255B10%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('a320920f-8ce3-405a-9e3e-ac9cc1d22ac3'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/2Gct-Cpy6Sw?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/2Gct-Cpy6Sw?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Cada año son más, y este han participado casi 1000. Realmente se juegan el pellejo, pero como en NYC no está prohibido patinar por la calle, nadie les dice gran cosa. &lt;/p&gt;  &lt;p&gt;En la web de la organización, se solicitaba a los participantes que no se detuvieran a celebrarlo (como es tradicional) frente al toro que hay al sur de Broadway, ya que había protestas por todo Wall St. y temían que los policías se rebotaran al ver llegar a 1000 skaters por la calle. &lt;/p&gt;  &lt;p&gt;Me parece flipante el nivel de tolerancia que hay en esta ciudad… Y para que flipéis un poco, algunos vídeos alucinantes sobre Longboarding:&lt;/p&gt;  &lt;p&gt;1.- A más de 100 Kmh en un monopatín, adelantando a camiones por la autovía. Y para mayor alucine, al final se junta con otro pavo, que va a la misma velodidad, per…. ¡¡¡¡¡descalzo!!!!&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:055b0f99-2db4-41da-a6f8-5d4a9e7a5e98" class="wlWriterEditableSmartContent"&gt;&lt;div id="135750d6-bff7-438d-a75c-8b4935a8673b" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=mbPQm6qBypo&amp;amp;feature=related" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/-Sm88t3BQGFM/TpF865XZqwI/AAAAAAAABH8/32pZ5y177Q4/video50fceba85c78%25255B6%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('135750d6-bff7-438d-a75c-8b4935a8673b'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/mbPQm6qBypo?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/mbPQm6qBypo?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;2.- Extreme downhill championship&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:00ebfee8-93cf-49e8-af12-50d2a7b6663a" class="wlWriterEditableSmartContent"&gt;&lt;div id="ea034a9f-6b53-48f1-beb4-97c4b5e89abd" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=SLyG0mUnw4A&amp;amp;feature=results_main&amp;amp;playnext=1&amp;amp;list=PL41013CC975278E36" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/-fL15W4N3j4Y/TpF87EeG9hI/AAAAAAAABIA/yWQOh5TvSDw/video93a7c9dae6e9%25255B4%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('ea034a9f-6b53-48f1-beb4-97c4b5e89abd'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/SLyG0mUnw4A?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/SLyG0mUnw4A?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;3.- Y como estoy abuelo, pero no tanto, otro de esos vídeos que me hacen desear tener 18 años otra vez…&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:bd579a96-f4db-43ff-b415-268c119cf224" class="wlWriterEditableSmartContent"&gt;&lt;div id="9fec73b8-d3d7-4324-b543-ea9bc8155c83" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=QdI2vpRA40s&amp;amp;feature=related" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/-NfTyFcAqeyI/TpF87SYhFGI/AAAAAAAABIE/f3jT48uLOZ8/video5181b96d2135%25255B5%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('9fec73b8-d3d7-4324-b543-ea9bc8155c83'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/QdI2vpRA40s?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/QdI2vpRA40s?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Salu2 !!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-6215801102894458229?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/6215801102894458229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=6215801102894458229' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/6215801102894458229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/6215801102894458229'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/10/longboard-attraction.html' title='The Longboard attraction…'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-3U5mGoMBPmI/TpF84yYi-XI/AAAAAAAABHs/WxTjyn68qxM/s72-c/8_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-5252719881949329120</id><published>2011-10-07T16:59:00.001+01:00</published><updated>2011-10-07T17:30:08.079+01:00</updated><title type='text'>Llamamiento a la revolución</title><content type='html'>&lt;p&gt;No deja de resultar una contradicción.&lt;/p&gt;  &lt;p&gt;Llevamos décadas observando cómo miles de personas mueren cada día de hambre o por enfermedades curables, y cómo destruimos el planeta en que vivimos. Y nunca, o casi nunca, hacemos nada al respecto. Sin embargo, ahora que parece que nuestro estado de bienestar se tambalea mínimamente, todos ponemos el grito en el cielo, y hacemos llamamientos a movilizarnos, a rebelarnos y a actuar. &lt;/p&gt;  &lt;p&gt;Es un poco irónico, puesto que incluso poniéndonos en el peor de los casos, no es probable que lleguemos a sufrir aquí calamidades ni diez veces menores que las que sufren a diario en el tercer mundo. Pero parece que por esto sí merece la pena manifestarse y actuar. &lt;/p&gt;  &lt;p&gt;Habiendo demostrado tal nivel de pasotismo con temas mil veces más graves, el que ahora demostremos semejante pánico a perder nuestro estado de bienestar, no hace sino calificarnos como viles, hipócritas y egoístas. A todos nosotros.&lt;/p&gt;  &lt;p&gt;Y como muestra, no hay más que ver el preocupante ascenso del número de mensajes, posts en Facebook, o vídeos que nos llegan todos los días llamando a la revolución y a la rebelión:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-RLuY-tQcies/To8hwom3bsI/AAAAAAAABHU/NzE5zCnte1s/s1600-h/WP_000413%25255B12%25255D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="WP_000413" border="0" alt="WP_000413" src="http://lh5.ggpht.com/-gS_cDMOyj_8/To8hxMIFZmI/AAAAAAAABHY/9FvD1Bd3OF4/WP_000413_thumb%25255B6%25255D.jpg?imgmax=800" width="264" height="222" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://3.bp.blogspot.com/_AVZdPz-rKJI/S75RIP3eavI/AAAAAAAAA94/C2jiVDs7d5M/s1600/crisis_rebelate.jpg" width="262" height="351" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://2.bp.blogspot.com/_kfQBbiaoSw0/SrdXaxfV0_I/AAAAAAAABf4/1XUwqhtPxbo/s400/BLOG_REBELATE.GIF" width="263" height="179" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" border="0" alt="gasparllamazares.es" src="http://www.gasparllamazares.es/rebelate.gif" width="280" height="55" /&gt;&lt;/p&gt;  &lt;p&gt;“Rebélate” parece la palabra de moda. Incluso políticos la usan. Y es tentadora. Muy tentadora para todo aquel que lo está pasando mal. Por eso la utilizan. Saben bien que esa palabra remueve sentimientos, y hace que salga la rabia que nos hace enfrentarnos al sistema establecido. Por eso la utilizan, o más bien debería decir, nos utilizan.&lt;/p&gt;  &lt;p&gt;Creo que todos estamos de acuerdo en que este mundo necesita un cambio. La cuestión es: &lt;/p&gt;  &lt;p align="center"&gt;&lt;font size="3"&gt;&lt;em&gt;Si cambiamos el mundo, deberíamos asegurarnos de que sea a mejor&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Porque si en el proceso de cambio, vamos a combatir la injusticia con injusticia y la violencia con violencia, simplemente cambiaremos a unos dirigentes por otros, iguales o peores. &lt;/p&gt;  &lt;p&gt;Si crees que rebelándote contra el sistema eres un pionero, o eres &lt;em&gt;cool&lt;/em&gt;, estás muy equivocado. Muchos otros lo han hecho antes que tú. Mucho antes que tú:&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://www.yogananda.es/e107_images/Yogananda_Vicente_Ferrer.jpg" width="356" height="240" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="" src="http://t1.gstatic.com/images?q=tbn:ANd9GcRfm5VB27Ymkj4OKAbrYHYm85iDRmIEL2ETny4b7-5dmfQvRSrp" width="354" height="264" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://2.bp.blogspot.com/_kqLQygagUYI/THa8Q9AS94I/AAAAAAAAEXM/px9Dl1Gg5-o/s1600/madre-teresa-de-calcuta.jpg" width="361" height="261" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://productions.caffix.org.mx/wp-content/uploads/2008/09/gandhi.jpg" width="277" height="341" /&gt;&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;p&gt;Y el rebelde por excelencia: &lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://www.raulberzosa.com/fotosymusica/cua/73.jpg" width="281" height="420" /&gt;&lt;/p&gt;  &lt;p&gt;Ahora bien, ¿tu crees que Él lanzaría piedras contra un banco? &lt;/p&gt;  &lt;h4&gt;El origen de estas campañas de comunicación&lt;/h4&gt;  &lt;p&gt;¿Por qué no se envían campañas virales acerca de la labor de Ghandi, o de Vicente Ferrer? Por dos motivos:&lt;/p&gt;  &lt;p&gt;Primero, porque a nadie le interesa que sigamos sus ejemplos. Son ejemplos imparables. Aplastantes. Incontestables. Ejemplos ante los cuales no sirve ningún ejército. No sirve ningún gobierno. Si un país entero se rebela en contra de la injusticia, pero de forma pacífica y con un respeto escrupuloso a los demás (y e aquí la diferencia: respeto incluso a sus opresores), no hay nada que un gobierno pueda hacer, salvo conceder. Sin embargo, una rebelión airada, activista o violenta, puede ser de gran interés para aquellas asociaciones en las que no les va demasiado bien en el &lt;em&gt;statu quo &lt;/em&gt;actual. Para aquellos que saldrían beneficiados si el sistema se derrumbara, ya que obtendrían el apoyo de los desamparados y de los desdichados. Y la historia nos ha demostrado que el mundo está lleno de gente que dejará que todo se venga abajo, con tal de acceder al poder. Harán lo que sea, con tal de lograrlo.&lt;/p&gt;  &lt;p&gt;Segundo, y quizás todavía más importante, porque somos unos hipócritas. Todos. Conocer la labor de gente tan espléndida, no hace sino que nos sintamos mal. Porque vemos que deberíamos hacer mucho más de lo que hacemos. Porque llevamos una vida cómoda, a costa de que otros sufran, y no hacemos nada para remediarlo. Por eso no queremos saber nada de esta gente. Por eso, cuando aparece un video en televisión con niños que se mueren de hambre, ponemos cara de asco, y cambiamos de canal. Admitámoslo. No es necesario que todos dejemos nuestras vidas y nos vayamos de misioneros. Tan solo admitir esta realidad, cambiará el mundo.&lt;/p&gt;  &lt;p&gt;Y luego están los que hacen que, como siempre, la realidad supere a la ficción: &lt;/p&gt;  &lt;h4&gt;El caso Wayseers&lt;/h4&gt;  &lt;p&gt;Hoy ha llegado a mis manos un vídeo, a través de Facebook:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:d29d57df-d398-4470-b92b-ab1cdfb9b962" class="wlWriterEditableSmartContent"&gt;&lt;div id="6ad47901-a29c-4594-a956-a6946ae2020a" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=KYfc5_YFFb0" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/-4s3G93JGkQ0/To8pD6_Z_QI/AAAAAAAABHk/1hB8hwtxOGg/video561f2b5675d9%25255B11%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('6ad47901-a29c-4594-a956-a6946ae2020a'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/KYfc5_YFFb0?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/KYfc5_YFFb0?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;El vídeo en sí me ha parecido una gilipollez suprema, pero como parecía obra de un movimiento, he decidido investigarlo.&lt;/p&gt;  &lt;p&gt;Resulta que es obra de la asociación &lt;a href="http://www.wayseers.org/"&gt;Wayseer&lt;/a&gt;, fundada por John Garret LoPorto. Parece que es un ponente habitual, y experto en comunicación audiovisual y en marketing viral. Ha participado en actividades como “&lt;a href="http://occupywallst.org/"&gt;Occupy Wall Street&lt;/a&gt;”. &lt;/p&gt;  &lt;p&gt;Pues por lo visto, dicha asociación no es nada más que un engañabobos de lo más cutre. &lt;/p&gt;  &lt;p&gt;Cuando empiezas a leer su web, parece algún tipo de asociación de gente preocupada por el mundo, con ganas de ayudar. Nasa más empezar, te encuentras con cosas como:&lt;/p&gt;  &lt;blockquote&gt;   &lt;h5&gt;&lt;em&gt;Comentarios de la gente...&lt;/em&gt;&lt;/h5&gt;    &lt;p&gt;&lt;em&gt;&lt;strong&gt;&amp;quot;Confía en mi, merece la pena! &lt;/strong&gt;Yo escribo en muchos foros, y nunca había encontrado un sitio como éste. Dudo mucho que incluso Garret (el fundador) esperara este resultado. Este es un sitio increíble donde encontrarás gente como tu, y que te entiende. Esto es lo que TODOS NECESITAMOS en nuestras vidas… “&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Suena un poco a secta, no? &lt;/p&gt;  &lt;p&gt;La primera patada en la boca llega cuando, un poco más abajo, te piden el número de VISA (o PayPal, que no sea por no aceptar formas de pago fáciles), e inmediatamente después, empiezan a justificar por qué piden dinero, justo al lado de esta imagen:&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://www.wayseers.org/letters/images/starburst.png" width="155" height="155" /&gt;&lt;/p&gt;  &lt;p&gt;Que viene a decir algo así como: “&lt;em&gt;el apoyo y la comprensión que obtendrás aquí tienen el valor de 1000 dolares al mes!!!”.&lt;/em&gt; Impresionante.&lt;/p&gt;  &lt;p&gt;El caso es que en ningún momento explican cual es la labor que dicha asociación lleva a cabo. Y lo mejor es cuando justifican por qué cobran dinero: &lt;em&gt;“Es importante que hagas esta contribución, ya que así mantendremos nuestros servicios libres de la influencia de publicidad corporativa”.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Y la guinda del pastel, son las preguntas más frecuentes:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="left"&gt;&lt;em&gt;&lt;strong&gt;Pregunta&lt;/strong&gt;: No eres ya rico? No debería ser esto gratis?&lt;/em&gt;&lt;/p&gt;    &lt;p align="left"&gt;&lt;em&gt;&lt;strong&gt;Respuesta de John Garret&lt;/strong&gt; (el tipo del video): La gente suele pensar que soy rico, pero ahora mismo ando justo para llegar a fin de mes. He invertido todo lo que tengo en este movimiento, construir la página web (llevó años), escribir el libro (llevó años), escribir, grabar y editar el video del Manifiesto (llevó meses)…&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Mi opinión: si te llevó años construir esa web tan simple, es que realmente no estás capacitado para gestionar ningún movimiento…&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;Pregunta:&lt;/strong&gt; Por qué no permites que se acceda a este sitio de forma gratuita, como en Facebook?&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;strong&gt;Respuesta: &lt;/strong&gt;Afrontémoslo. Facebook no es realmente gratis. Facebook está financiada en la sombra, y por lo tanto&amp;#160; es propiedad parcialmente de intereses corporativos gigantescos y sin escrúpulos como Goldman Sachs, que cogió doce mil millones de dólares de dinero prestado de tus impuestos (si eres Americano) y repartió 14 mil millones de dolares en bonuses a sus directivos. Facebook también está dispuesta a vender tu información al mejor postor. Este no es un buen modelo a seguir.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Queremos ser independientes, no deber nada a la influencia corporativa. Queremos que este movimiento solo te rinda cuentas a ti, y al resto de nuestra tribu. Así que eso nos deja con el modelo de financiación que os proponemos, el cual se basa en tu ayuda, para “mantener las luces encendidas”.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Im-prezionante… &lt;/p&gt;  &lt;p&gt;En fin, algunas páginas en las que ponen a Wayseers a caer de un ciruelo:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.paperstreetbrigade.com/blog/?p=21491" href="http://www.paperstreetbrigade.com/blog/?p=21491"&gt;http://www.paperstreetbrigade.com/blog/?p=21491&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.sott.net/articles/show/226455-Wayseer-Manifesto-Selling-Freedom-or-Selling-Psychopathy-" href="http://www.sott.net/articles/show/226455-Wayseer-Manifesto-Selling-Freedom-or-Selling-Psychopathy-"&gt;http://www.sott.net/articles/show/226455-Wayseer-Manifesto-Selling-Freedom-or-Selling-Psychopathy-&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Os aconsejo que entréis en su web, veáis el video, y saquéis vuestras propias conclusiones. Pero a mi me parece demagogia pura. Una canción pegadiza. Un video bien editado. Imágenes y música emotivas, que hacen que te conmuevas. Gente en silla de ruedas superando sus limitaciones. Líderes y actores famosos. Incluso se permiten meter de por medio a Ghandi y a Teresa de Calcuta. &lt;/p&gt;  &lt;p&gt;Dicen frases que a todos nos encajan, como: “no dejes que repriman tu voz”, etc etc. Dicen eso que tanto nos gusta oír de que el “establishment” nos quiere acallar. Lo muestran con imágenes por detrás que a todos nos desagradas, con policías pegando a manifestantes, etc. En fin, pura demagogia visual, que cualquier con dos dedos de frente que se pare a analizar un poquito, huele a mil kilómetros de distancia. &lt;/p&gt;  &lt;p&gt;Lamentablemente, no todo el mundo se detiene a hacerlo. El vídeo oficial lleva más de 600.000 visitas en youtube. Estos son algunos de los comentarios:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="left"&gt;&lt;em&gt;“Gracias a este video, me canse de tener miedo, no﻿ me importa cuanto tiempo me cueste, pero io voi a lograr mis sueños, el q haia hecho este video gracias por darme el valor que me faltaba, cada vez q tenga dudas, vere esto”&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;“Que contento estoy estar viviendo en estos momentos. Me inspira ver videos como estos, ver la gente exigiendo sus derechos, y tener la pasion de vivir﻿ en libertad! Arriba la revolucion mundial!”&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Qué pena… &lt;/p&gt;  &lt;h4&gt;Mi conclusión personal&lt;/h4&gt;  &lt;p align="center"&gt;&lt;em&gt;&lt;font size="3"&gt;Los que zarandean a políticos, insultan a banqueros, o asaltan edificios públicos, no hacen sino demostrar que no son mucho mejores que ellos. &lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;&lt;font size="3"&gt;Los que ponen una flor en el rifle del soldado que les apunta... &lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;&lt;font size="3"&gt;esos cambian el mundo.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;h4 align="center"&gt;&lt;/h4&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-5252719881949329120?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/5252719881949329120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=5252719881949329120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/5252719881949329120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/5252719881949329120'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/10/llamamiento-la-revolucion.html' title='Llamamiento a la revolución'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-gS_cDMOyj_8/To8hxMIFZmI/AAAAAAAABHY/9FvD1Bd3OF4/s72-c/WP_000413_thumb%25255B6%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-2683083910364073512</id><published>2011-10-06T19:08:00.001+01:00</published><updated>2011-10-06T19:08:44.418+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Direct3D'/><category scheme='http://www.blogger.com/atom/ns#' term='C# 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Graphics AND 3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='TheCodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net Framework 4'/><title type='text'>XNA/Android cross-platform and strongly-typed access to game contents</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 0px 0px 13px; display: inline; float: right" align="right" src="http://t2.gstatic.com/images?q=tbn:ANd9GcS8XQfK813sGmEfRNXYseH4W2j6bxPX1lvcOHs2xmPva3QXuxnG" width="275" height="203" /&gt;&lt;/p&gt;  &lt;p&gt;In &lt;a href="http://graphicdna.blogspot.com/2011/10/using-t4-templates-to-generate-custom.html"&gt;this previous post&lt;/a&gt;, we already showed how to use T4 templates for several use cases, with a special focus on Resource Files (ResX). Now we are going to complete that post with another one, focused specifically on Content management.&lt;/p&gt;  &lt;p&gt;What we want to achieve is an elegant, cross-platform, and strongly-typed way of accessing contents in our projects.&lt;/p&gt;  &lt;h4&gt;The XNA approach to contents&lt;/h4&gt;  &lt;p&gt;XNA identifies contents with Asset Names, in the form of strings, but it doesn’t offer any form of strong-typed access, what is very bug-prone, because if you misspell the name of an asset, you won’t notice until runtime, or you won’t notice ever… &lt;/p&gt;  &lt;h4&gt;The Android approach to contents&lt;/h4&gt;  &lt;p&gt;Android already offers strongly-typed access to contents that are placed below the “Resources” special folder. Unfortunately, there are a lot of limitations for the contents inside that folder. One of the most evident (and stupid), is that contents cannot be re-arranged into subfolders, what makes it almost un-usable for medium-big projects. Besides that, the kind of access Android gives to that folder is through INT identifiers, what conflicts with the XNA way of doing this (which uses Asset names).&lt;/p&gt;  &lt;p&gt;One of the possible solutions is to move our contents to the “Assets” folder, where things can be arranged arbitrarily, and where assets are identified with a string, very much like in XNA. Too bad that Android doesn’t offer strongly-typed access to that folder… &lt;/p&gt;  &lt;h4&gt;What we want to achieve&lt;/h4&gt;  &lt;p&gt;1.- We want to be able to arrange our contents in sub-folders, so in Android, we will have to go to the &lt;em&gt;Assets &lt;/em&gt;approach, instead of the &lt;em&gt;Resources&lt;/em&gt; one.&lt;/p&gt;  &lt;p&gt;2.- That solves also the unification of types when identifying assets. In both cases (XNA and Android), we will be using Asset Names as strings.&lt;/p&gt;  &lt;p&gt;3.- In both sides we will need to provide a strongly-typed way of accessing contents.&lt;/p&gt;  &lt;p&gt;4.- We want the exact same interface that is finally published outwards, so that every piece of code that uses our strongly-typed classes, write the exact same code no matter which platform we are coding on.&lt;/p&gt;  &lt;h4&gt;An implementation using again T4 templates&lt;/h4&gt;  &lt;p&gt;Again, we will write down two different T4 templates, one for XNA and one for Android. Both of them will have to do merely the same, but with some minor differences. Let’s see them:&lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h3&gt;Example: XNA T4 Template to give strongly-typed access to contents&lt;/h3&gt;  &lt;p&gt;This template will be placed wherever we want to use it. It can be in the main XNA Game project, or in a library project shared all around. Basically, it will search inside the Visual Studio solution for the Game’s Content Project. Once found, it will iterate recursively through the file and folder structure of the project, generating classes that give strong-typed access to each Asset.&lt;/p&gt;  &lt;p&gt;Imagine we have the following structure in our contents project:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-7N7xlGkcj4o/To3upR4kg4I/AAAAAAAABHE/p57p56OWSj0/s1600-h/image%25255B9%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-aXABZgiaqnQ/To3up3N_YDI/AAAAAAAABHI/xAnK6Zjxugk/image_thumb%25255B16%25255D.png?imgmax=800" width="413" height="173" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We want to get an output like the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-kVEy0QD2Mb8/To3uqDEzgxI/AAAAAAAABHM/9nJuMUYDoG0/s1600-h/image%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-Vw4k3gEtRzA/To3uqsvYp0I/AAAAAAAABHQ/aETKrk2_Ajw/image_thumb%25255B6%25255D.png?imgmax=800" width="309" height="374" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As you can see, we will use namespaces to represent the tree-structure of folders in the content project. Once we find a folder with one or more content files, we will create a class named “Keys” that will hold properties to access asset names. We will also create an enumeration with all the assets found at that level. This way, we also allow to navigate through the contents tree, if needed.&lt;/p&gt;  &lt;h4&gt;The code&lt;/h4&gt;  &lt;p&gt;The XNA template that generates that, is the following:&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; Template: Generates C# code to give strongly-typed access to Asset files&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; Author: Inaki Ayucar&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; Website: www.graphicdna.net&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; Based on the work of: http://blog.baltrinic.com&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; -----------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;template&lt;/span&gt; &lt;span style="color: maroon"&gt;debug&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: maroon"&gt;hostspecific&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Core&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Xml&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Microsoft.VisualStudio.Shell.Interop.8.0&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;EnvDTE&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;EnvDTE80&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;VSLangProj&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Collections.Generic&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.IO&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Linq&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Text&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Text.RegularExpressions&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Xml&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Microsoft.VisualStudio.Shell.Interop&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;EnvDTE&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;EnvDTE80&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Microsoft.VisualStudio.TextTemplating&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#&lt;/span&gt;&amp;#160; &lt;span style="color: green"&gt;// ------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Get global variables&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// ------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; serviceProvider = Host &lt;span style="color: blue"&gt;as&lt;/span&gt; IServiceProvider;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (serviceProvider != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dte = serviceProvider.GetService(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(SDTE)) &lt;span style="color: blue"&gt;as&lt;/span&gt; DTE;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Fail if we couldn't get the DTE. This can happen when trying to run in TextTransform.exe&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (Dte == &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; Exception(&lt;span style="color: maroon"&gt;&amp;quot;T4MVC can only execute through the Visual Studio host&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; Project = GetXNAContentsProject(Dte);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (Project == &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Error(&lt;span style="color: maroon"&gt;&amp;quot;Could not find XNA Content Project.&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;&lt;span style="color: maroon"&gt;&amp;quot;XX&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; Project prjT4 = GetProjectContainingT4File(Dte);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (prjT4 == &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Error(&lt;span style="color: maroon"&gt;&amp;quot;Could not find Template's project&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;&lt;span style="color: maroon"&gt;&amp;quot;XX&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AppRoot = Path.GetDirectoryName(Project.FullName) + &lt;span style="color: maroon"&gt;'\\'&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RootNamespace = prjT4.Properties.Item(&lt;span style="color: maroon"&gt;&amp;quot;RootNamespace&amp;quot;&lt;/span&gt;).Value.ToString();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// --------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;// ------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;// &amp;lt;auto-generated&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160; This code was generated by a tool.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;//&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160; Changes to this file may cause incorrect behavior and will be lost if&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160; the code is regenerated.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;// &amp;lt;/auto-generated&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;// ------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;using System.Threading;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// We are storing in a List&amp;lt;ResourceEntry&amp;gt; (declared below) a list with all string entries of &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // all files found matching our search criteria&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AllEntries = &lt;span style="color: blue"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, List&amp;lt;AssetFileInfo&amp;gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; projectFileName = Path.GetFileName(Project.FullName);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; projectFullPath = Project.FullName.Substring(0, Project.FullName.Length - projectFileName.Length);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Find files on our project that match our search criteria (recursively), and store every string &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // entry on those files&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FindResourceFilesRecursivly(projectFullPath, Project.ProjectItems, &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt; path &lt;span style="color: blue"&gt;in&lt;/span&gt; AllEntries.Keys)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(path == &lt;span style="color: blue"&gt;null&lt;/span&gt; || path == &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; enumNames = &lt;span style="color: blue"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; aux = path;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// To avoid conflict names with namespaces, the class names will always be &amp;quot;Keys&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; className = &lt;span style="color: maroon"&gt;&amp;quot;Keys&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(aux.EndsWith(&lt;span style="color: maroon"&gt;&amp;quot;\\&amp;quot;&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; aux = aux.Remove(aux.Length - 1, 1);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; pathNameSpace = aux.Replace(&lt;span style="color: maroon"&gt;&amp;quot;\\&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Start of namespace&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(pathNameSpace != &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;namespace {0}.Assets.{1}&amp;quot;&lt;/span&gt;, RootNamespace, pathNameSpace));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;namespace {0}.Assets&amp;quot;&lt;/span&gt;, RootNamespace));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;{&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Start of class&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\tpublic class {0}&amp;quot;&lt;/span&gt;, className));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t{&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(AssetFileInfo info &lt;span style="color: blue"&gt;in&lt;/span&gt; AllEntries[path])&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; filenameWithoutExt= Path.GetFileNameWithoutExtension(info.File);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t\tpublic static string {0}&amp;quot;&lt;/span&gt;, filenameWithoutExt));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t\t{&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t\t\tget&amp;#160; {{ return \&amp;quot;{0}\&amp;quot;; }}&amp;quot;&lt;/span&gt;, info.AssetName.Replace(&lt;span style="color: maroon"&gt;@&amp;quot;\&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;@&amp;quot;\\&amp;quot;&lt;/span&gt;) ));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t\t}&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; enumNames.Add(filenameWithoutExt);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Start of Enum&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t\tpublic enum eKeys&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t\t{&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt; enumname &lt;span style="color: blue"&gt;in&lt;/span&gt; enumNames)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t\t\t{0},&amp;quot;&lt;/span&gt;, enumname));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Close enum&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t\t}&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Close class&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t}&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Close namespace&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;catch&lt;/span&gt;(Exception ex)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Error(ex.ToString());&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#+&lt;/span&gt; &lt;span style="color: green"&gt;// --------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Class feature control block: &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Remarks: Identified by the #+ mark, allows to define variables, methods, etc&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// --------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;const&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Kind_PhysicalFolder = &lt;span style="color: maroon"&gt;&amp;quot;{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; AlwaysKeepTemplateDirty = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; DTE Dte;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; Project Project;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; AppRoot;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; RootNamespace;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, List&amp;lt;AssetFileInfo&amp;gt;&amp;gt; AllEntries;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; SupportedExtensions = &lt;span style="color: blue"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;() {&lt;span style="color: maroon"&gt;&amp;quot;.dds&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;.png&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;.bmp&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;.tga&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;.jpg&amp;quot;&lt;/span&gt;};&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; FindResourceFilesRecursivly&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: Searches recursively in the files of our project, for those which are in the same folder &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160; ///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;that this file, or below, &lt;/span&gt;&lt;span style="color: green"&gt;and that have extensions included in the supported extension list&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; FindResourceFilesRecursivly(&lt;span style="color: blue"&gt;string&lt;/span&gt; pProjectFullPath, ProjectItems items, &lt;span style="color: blue"&gt;string&lt;/span&gt; path)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; assetRelativePath = path.TrimStart(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;char&lt;/span&gt;[1]{&lt;span style="color: maroon"&gt;'.'&lt;/span&gt;});&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; assetRelativePath = assetRelativePath.Replace(&lt;span style="color: maroon"&gt;'.'&lt;/span&gt;, &lt;span style="color: maroon"&gt;'\\'&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(ProjectItem item &lt;span style="color: blue"&gt;in&lt;/span&gt; items)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(item.Kind == Kind_PhysicalFolder)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FindResourceFilesRecursivly(pProjectFullPath, item.ProjectItems, path+&lt;span style="color: maroon"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;+item.Name);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// check if extension is supported&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; extension = Path.GetExtension(item.Name).ToLowerInvariant();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(SupportedExtensions.Contains(extension))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; itemFileName = item.FileNames[0];&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(itemFileName == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AssetFileInfo info = &lt;span style="color: blue"&gt;new&lt;/span&gt; AssetFileInfo();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; info.AssetName = itemFileName.Remove(0, pProjectFullPath.Length);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// XNA require que los asset names no tengan extensión&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; info.AssetName = info.AssetName.Substring(0, info.AssetName.Length - extension.Length);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; info.File = item.Name; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; info.Path = itemFileName.Substring(0, itemFileName.Length - item.Name.Length);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(!AllEntries.ContainsKey(assetRelativePath))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AllEntries.Add(assetRelativePath, &lt;span style="color: blue"&gt;new&lt;/span&gt; List&amp;lt;AssetFileInfo&amp;gt;());&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AllEntries[assetRelativePath].Add(info);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; GetXNAContentsProject&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: http://www.codeproject.com/KB/macros/EnvDTE.aspx&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; Project GetXNAContentsProject(DTE dte) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(Project prj &lt;span style="color: blue"&gt;in&lt;/span&gt; dte.Solution.Projects)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// XNA Content projects define this property. Use it to identify the project&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(!HasProperty(prj.Properties, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: maroon"&gt;&amp;quot;Microsoft.Xna.GameStudio.ContentProject.ContentRootDirectoryExtender.ContentRootDirectory&amp;quot;&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; prj;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; GetProjectContainingT4File&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks:&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; Project GetProjectContainingT4File(DTE dte) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Find the .tt file's ProjectItem&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ProjectItem projectItem = dte.Solution.FindProjectItem(Host.TemplateFile);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// If the .tt file is not opened, open it&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (projectItem.Document == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; projectItem.Open(Constants.vsViewKindCode);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (AlwaysKeepTemplateDirty) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Mark the .tt file as unsaved. This way it will be saved and update itself next time the&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// project is built. Basically, it keeps marking itself as unsaved to make the next build work.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Note: this is certainly hacky, but is the best I could come up with so far.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; projectItem.Document.Saved = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; projectItem.ContainingProject;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Struct: ResourceEntry&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: Stores information about an entry in a resource file&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; HasProperty(Properties properties, &lt;span style="color: blue"&gt;string&lt;/span&gt; propertyName) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (properties != &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (Property item &lt;span style="color: blue"&gt;in&lt;/span&gt; properties) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//WriteLine(&amp;quot;// &amp;quot; + item.Name);&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item != &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; item.Name == propertyName)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Struct: ResourceEntry&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: Stores information about an entry in a resource file&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;struct&lt;/span&gt; &lt;span style="color: teal"&gt;AssetFileInfo&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; AssetName {&lt;span style="color: blue"&gt;get&lt;/span&gt;;&lt;span style="color: blue"&gt;set&lt;/span&gt;;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Path { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; File { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;h4&gt;Usage&lt;/h4&gt;  &lt;p&gt;One the T4 template is included on your solution, the way of accessing Assets in XNA is like the following:&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;Content.Load&amp;lt;&lt;font color="#4bacc6"&gt;Texture2D&lt;/font&gt;&amp;gt;(GDNA.PencilBurst.Assets.Textures.UI.&lt;span style="color: #2b91af"&gt;Keys&lt;/span&gt;.circleT);&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;All absolutely strong-typed, much less bug-prone.&lt;/p&gt;  &lt;h4&gt;Android version&lt;/h4&gt;  &lt;p&gt;Once you have that as a start point, developing the Android version is pretty straight-forward. You just need to change a couple of things:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Instead of searching for the Contents Project inside your solution, you will need to search for the main project, and look for the “Assets” subfolder.&lt;/li&gt;    &lt;li&gt;Asset names do include file extensions in Android, so be sure to not remove them (like in XNA)&lt;/li&gt;    &lt;li&gt;Also, asset names will need to replace ‘\’ for ‘/’, so you can correctly invoke: &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p align="center"&gt;stream = mContext.Assets.Open(pAssetName);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="left"&gt;And that´s all !!!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-2683083910364073512?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/2683083910364073512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=2683083910364073512' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/2683083910364073512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/2683083910364073512'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/10/xnaandroid-cross-platform-and-strongly.html' title='XNA/Android cross-platform and strongly-typed access to game contents'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-aXABZgiaqnQ/To3up3N_YDI/AAAAAAAABHI/xAnK6Zjxugk/s72-c/image_thumb%25255B16%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-8151705288435838044</id><published>2011-10-06T13:06:00.001+01:00</published><updated>2011-10-06T13:07:23.158+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C# 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='WinForms'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='TheCodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net Framework 4'/><title type='text'>Using T4 Templates to generate custom strongly-typed code in Visual Studio</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 7px 0px 0px; display: inline; float: left" align="left" src="http://t2.gstatic.com/images?q=tbn:ANd9GcS8XQfK813sGmEfRNXYseH4W2j6bxPX1lvcOHs2xmPva3QXuxnG" width="275" height="203" /&gt;&lt;/p&gt;  &lt;p&gt;Strongly typed code rocks. Easy as that. Reduces bugs, and makes your developments more productive and efficient. We all know that. &lt;/p&gt;  &lt;p&gt;One example of strong-typing inside Visual Studio: resource files are parsed by default with the &lt;em&gt;ResXFileCodeGenerator&lt;/em&gt; tool, which generates automatic properties in &lt;em&gt;C#&lt;/em&gt; files, that give us strongly-typed access to strings. &lt;/p&gt;  &lt;p&gt;That’s cool, by I there’s a lot of customization capabilities there missing. For instance, &lt;em&gt;ResXFileCodeGenerator &lt;/em&gt;generates &lt;em&gt;&lt;font color="#0080ff"&gt;internal&lt;/font&gt; &lt;/em&gt;classes by default, and this is not always desirable. Many people struggled around this in the past, so in Visual Studio 2008 a new custom tool was introduced: PublicResXFileCodeGenerator: the same one than before, but building public classes. Cool again, but still missing many things… &lt;/p&gt;  &lt;p&gt;So, how to customize the code generation process?&lt;/p&gt;  &lt;h4&gt;Option 1: Write your own tool&lt;/h4&gt;  &lt;p&gt;You can write a tool that mimics the behavior of ResXFileCodeGenerator, and you can install it within the Visual Studio (so you can select your ResX files to be parsed with it). It´s not too complicated, but you need to develop a separate installation project, to be able to install it within VStudio. You can find an example &lt;a href="http://www.codeproject.com/KB/dotnet/ResXFileCodeGeneratorEx.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;To be honest, I don´t like the idea of having to write the extension in a different project, needing to go there for every change, recompiling, re-installing, etc. Besides that, this approach means having one single tool for every resX files you want to parse, and therefor, the tool needs to be generic enough to give support for every use case you have.&lt;/p&gt;  &lt;p&gt;One last inconvenient, is that as far as I know, a tool like this cannot act in several files at a time. That means that it will generate a code file for each resource file. It’s impossible to generate ONE code file for SEVERAL resource files.&lt;/p&gt;  &lt;p&gt;Seems that I´m too lazy today for all of that, so I searched for other solutions, and found one that I really like: T4 templates&lt;/p&gt;  &lt;h4&gt;Option 2: Write a T4 Text Template&lt;/h4&gt;  &lt;p&gt;A T4 Text Template is “a mixture of text blocks and control logic that generate a text file”. In other words, it’s a piece of code that will generate a text file and will include it in your Solution (below the .tt file itself). This text file, pretty well can be a source code file, so this way we can automatically generate code for the solution, with all the power to customize it.&lt;/p&gt;  &lt;p&gt;I have been studying them for a while, and I can tell you that they are really powerful. Some relevant aspects around them:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;They are text files (with .tt extension), that are included INSIDE your solution, so no need to keep them in a separate project, and no need to build a setup project to install them. &lt;/li&gt;    &lt;li&gt;This .tt files are, by default, parsed by the custom tool: &lt;em&gt;TextTemplatingFileGenerator&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;They can operate on several project files at a time, not only one, generating if you want ONE code file, for SEVERAL resource files. &lt;/li&gt;    &lt;li&gt;They don´t need to be installed or distributed in any form. Simply add them to your solution &lt;/li&gt;    &lt;li&gt;Changes in the Template don’t mean to go to a different solution, rebuilding and re-installing &lt;/li&gt;    &lt;li&gt;They can be written in both C# or VisualBasic. &lt;/li&gt;    &lt;li&gt;When they are parsed, the generate a code file below the Template (see below), with the same name as the template itself: &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-G7ZUQVYxbi0/To2ZY3TJy_I/AAAAAAAABFM/4YWxm_oiJfk/s1600-h/image3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-t11ujgQQieU/To2ZZcYK0qI/AAAAAAAABFQ/TfhQFKpIvwo/image_thumb9.png?imgmax=800" width="244" height="70" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;They are usually parsed as soon as they are modified and re-saved. &lt;/li&gt;    &lt;li&gt;Because the modification and installation process is so simple, and because you can have if you want a different T4 Template for each resX file, you can have as many versions of the templates as you wish. Each one covering different needs. And that is cool ! &lt;/li&gt; &lt;/ol&gt;  &lt;h5&gt;Any disadvantages? Visual Studio integration&lt;/h5&gt;  &lt;p&gt;By now, Visual Studio offers no integration for T4 files. That means that by default you get no syntax highlighting, no intellisense, etc.&lt;/p&gt;  &lt;p&gt;But this can be fixed by using one of the T4 integration extensions for VStudio out there. I have tested three of them:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/60297607-5fd4-4da4-97e1-3715e90c1a23"&gt;Tangible T4 Editor&lt;/a&gt;: Honestly, I couldn’t get it to work. I installed it, apparently with no error, but it didn’t work. And I already started this post by saying I´m too lazy today, so I tested other solutions that installed fine at first try: &lt;/li&gt;    &lt;li&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/40a887aa-f3be-40ec-a85d-37044b239591"&gt;Clarius Visual T4&lt;/a&gt;: It installed just fine and added syntax highlighting and intellisense to T4 files. Unfortunately, it made my Visual Studio 2010 Ultimate freeze for about 10 seconds from time to time. So I decided to try a different option. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/a42a8538-8d6e-491b-8097-5a8a00174d37"&gt;Deviart T4&lt;/a&gt;: It installed fine, and works pretty well. The syntax highlighting gets messed from time to time, but nothing serious. Just re-opening the file fixes it. It’s fast, and I like it. It’s the clear winner. And it’s free! &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-NivCYNMJ8Ho/To2ZZ8qhS_I/AAAAAAAABFU/zVtqTTlHVEc/s1600-h/image8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-FeUPQnf-Qq8/To2ZaIw1KPI/AAAAAAAABFY/DJBvhNhtjD0/image_thumb14.png?imgmax=800" width="537" height="338" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Some basic concepts about developing T4 templates&lt;/h3&gt;  &lt;p&gt;Developing a T4 template is pretty straightforward, if you have some experience with .Net. We are not going to explain here all the coding aspects about T4 templates, as it is extremely clearly explained &lt;a href="http://msdn.microsoft.com/en-us/library/bb126445.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/dd820620.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;However, it’s a bit meesy the first time you see one, how code blocks are mixed with plain text blocks, especially if you don´t have an extension installed that gives you syntax highlighting.&lt;/p&gt;  &lt;p&gt;So, first thing you should understand is that T4 templates mix parts of text that will simply be copied to the generated file (Text Blocks), and others that are code blocks to control the logic of the generation (Code Blocks). In Deviart T4, you will see the following highlighting:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Text blocks, copied directly to the destination file (grayed out): &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-VjQ3Xgi3-Xc/To2ZajSLtgI/AAAAAAAABFc/HrU5IPdxlG4/s1600-h/image14.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-pdxvsyYblLQ/To2ZbCxk1lI/AAAAAAAABFg/cWZ-nDRaUgI/image_thumb26.png?imgmax=800" width="725" height="167" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As I mentioned, whatever you write here will be directly copied to the destination file. No matter what it is. It won´t be validated by the tool, just copied. You are responsible of writing something that makes sense, and that won’t generate compiling errors.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Code blocks (surrounded by &amp;lt;# … #&amp;gt; and similar): &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-EXI2RgasC6c/To2ZbYw3igI/AAAAAAAABFk/8XeSF7qc5js/s1600-h/image27.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-6pkg6Levu6Y/To2Zb1_aiAI/AAAAAAAABFo/hWcJ3lLdng4/image_thumb39.png?imgmax=800" width="333" height="96" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;These code blocks are parsed by the tool and executed. They are validated by the compiler, just like any other piece of code you write (that means that will generate compiling errors as usually). In the previous example, the code block is writing a “}” symbol to the output file, using the WriteLine method (se next chapter for more info).&lt;/p&gt;  &lt;h4&gt;Different ways to output text to the destination file&lt;/h4&gt;  &lt;p&gt;We already seen some of them, but basically, you have three different ways of outputting text:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.- Put a Text Block&lt;/strong&gt; in your template (like in the previous chapter).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.- Invoke the WriteLine&lt;/strong&gt; method inside a Code Block. Like in the example of previous chapter, anywhere you call WriteLine(“…”) from within a code block, will write that text line to the destination file.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.- Mixing&lt;/strong&gt; both Code Blocks and Text Blocks, like in the following example:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-OQChnej4iPo/To2ZccLnzdI/AAAAAAAABFs/RlFpF8hxBfw/s1600-h/image38.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-VXlD6SC-tiw/To2Zct3WvFI/AAAAAAAABFw/Rl-OvpGkNwY/image_thumb52.png?imgmax=800" width="643" height="214" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this example, the header Text Block (grayed out) will only be copied if &lt;em&gt;insertWarningHeader == true. &lt;/em&gt;This means that flow control of code blocks affect the output of plain text blocks too. &lt;/p&gt;  &lt;p&gt;Please note that you need to “end” the Code Block by using the “#&amp;gt;”, and therefor the text inside the braces will be identified as a Text Block. Then, re-open a code block, just to put the final brace “}” of the IF statement. Separating it into two different Code Blocks doesn’t prevent the IF from doing its job…&lt;/p&gt;  &lt;h4&gt;Other useful kinds of Code Blocks&lt;/h4&gt;  &lt;p&gt;As you can see, the &amp;lt;# … #&amp;gt; labels define the start and end of code blocks that should be parsed and evaluated. Anything outside those labels is considered text blocks. There are other kinds of code blocks, as explained &lt;a href="http://msdn.microsoft.com/en-us/library/bb126478.aspx"&gt;here&lt;/a&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Expression code blocks&lt;/strong&gt; (&amp;lt;#= … #&amp;gt;): They evaluate an expression, and convert the result to string. Some examples:       &lt;ol&gt;       &lt;li&gt;         &lt;div align="left"&gt;&amp;lt;#= 2 + 3 #&amp;gt; … will output a “5”&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="left"&gt;&amp;lt;#= numberOfEntries * 2#&amp;gt; … Where numberOfEntries is a valid variable on that scope, will output the result of the addition.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="left"&gt;etc.&lt;/div&gt;       &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;strong&gt;Class feature code blocks&lt;/strong&gt; (&amp;lt;#+ … #&amp;gt;): Allow to define properties or helper methods. They can be defined in separate files. The following example defines the property &lt;em&gt;RootNamespace&lt;/em&gt; and the helper method &lt;em&gt;EmitEnum, &lt;/em&gt;available in all the template.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="left"&gt;&lt;a href="http://lh6.ggpht.com/-mejPU50_bC0/To2ZdMzAALI/AAAAAAAABF0/xjYGNxF2OZM/s1600-h/image44.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-opjrPaDy2TQ/To2ZdZFlg2I/AAAAAAAABF4/3SwVxeWEj00/image_thumb60.png?imgmax=800" width="630" height="283" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Importing namespaces &lt;/strong&gt;is also very easy, you just need to put in the top of the file statements like the following: &lt;/li&gt; &lt;/ul&gt;  &lt;p align="center"&gt;&amp;lt;#@ import namespace=&amp;quot;System.Xml&amp;quot; #&amp;gt; &lt;/p&gt;  &lt;p&gt;I think that there’s not too much magic in here, so I won’t bore you with more detail. Everything is really simple to follow, and is really well explained in the above links, so I guess the best way to show a real T4 Template is with an example!&lt;/p&gt;  &lt;h3&gt;Example: Custom strong-typed access to resources with a T4 template&lt;/h3&gt;  &lt;h4&gt;What we need&lt;/h4&gt;  &lt;p&gt;In this example, we will used the mentioned T4 templates to give a full-featured, strong-typed access to strings in resource files. I did it to meet my own needs, but using it as a starting point, it will very easy for you to adapt it to your own.&lt;/p&gt;  &lt;p&gt;The goal is to be able to customize the following aspects directly from the resX file:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Access modifier of the class: public, private, internal &lt;/li&gt;    &lt;li&gt;Namespace where the class is defined &lt;/li&gt;    &lt;li&gt;Generate (if wanted), an enumeration with all the keys of the entries &lt;/li&gt;    &lt;li&gt;Modify the return type of the properties. Does this make any sense? Yes (read below). &lt;/li&gt;    &lt;li&gt;Allow ResX files to use Conditional Compilation:      &lt;ol&gt;       &lt;li&gt;It would be fantastic if we could specify different values for strings, depending on conditional compilation symbols &lt;/li&gt;        &lt;li&gt;And it would be even greater, if we could specify different return types, depending on the same conditional compilation symbols. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h5&gt;Does it make any sense to modify return types?&lt;/h5&gt;  &lt;p&gt;In my scenario, it does. I’ll explain it, so you can see one example. Then it’s up to you to decide if that’s useful also in other situations…&lt;/p&gt;  &lt;p&gt;I was writing a piece of code, related to 3D graphics, that I wanted to run in both Windows Phone and Android. That code has contents (bitmaps, etc), which are identified differently in Windows Phone (XNA) projects, and Android. &lt;/p&gt;  &lt;p&gt;In the first one, contents are identified with Asset Names, which are strings. In the second one, contents are identified with Integer IDs. In fact, Android automatically generates a class like the ones we are creating here to give strong-type access to those integers. &lt;/p&gt;  &lt;p&gt;Well, I wanted to centralize the loading of contents, so it was obvious that I would need to unify content identification with my own IDs. I simply didn’t want to have #if #endif blocks all around my code. &lt;/p&gt;  &lt;p&gt;Question is, that I can write two versions of methods like LoadTexture(), one for each platform, and keeping the specifics inside the Content Repository, but the problem is that Android identifies contents with a different type (&lt;em&gt;ints&lt;/em&gt; instead of &lt;em&gt;strings&lt;/em&gt;), and that makes my code end up with a different interface for each version. Something like this:&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#if&lt;/span&gt;(ANDROID)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static void LoadTexture(int pResourceID)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#elif&lt;/span&gt;(WINDOWS_PHONE)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; LoadTexture(&lt;span style="color: blue"&gt;string&lt;/span&gt; pAssetName)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#endif&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;I have no problem with writing two versions of the method (that’s inevitable). But having two different interfaces is bad. Really bad. &lt;/p&gt;  &lt;p&gt;Why? Because then, every single point in my code where I use this method will need a #if #endif code block too. And I hate that. I want this contents repository to expose a single interface. How do we achieve that?&lt;/p&gt;  &lt;p&gt;If both platforms used strings to identify contents, I could create a table to map my own resource identifiers to that ones. But Android uses ints. And what is worse, they are automatically generated. I can see what IDs Android gave to a content, but I cannot guarantee that the ID will be consistent over time, as it’s generated by an automatic tool. In addition to that, I would need to maintain that table by hand, what is horrible and very bug prone.&lt;/p&gt;  &lt;p&gt;Mmmmmhhh…&lt;/p&gt;  &lt;p&gt;Seems that the only solution is writing code, with methods or properties that map my own resource IDs to: string assets in the case of XNA, and resource IDs in the case of Android. Something like:&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#if&lt;/span&gt;(ANDROID)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static int Button1&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Resource.Drawable.Button1;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#elif&lt;/span&gt;(WINDOWS_PHONE)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Button1&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #a31515"&gt;@&amp;quot;Contents\Textures\UI\Button1&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#endif&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Having a repository like this, would allow me to eliminate the #if #endif blocks when calling methods like LoadTextures, as I could use: LoadTextures ( Respository.Button1 );&lt;/p&gt;  &lt;p&gt;If we are compiling to ANDROID, Button1 will return an int and LoadTextures() will expect an int, so no problem. If we are compiling to Windows Phone, both will give and expect a string. Everything fine again.&lt;/p&gt;  &lt;p&gt;The problem with that is that a single project can have hundreds, or thousands of resources, an maintaining the file manually can be a nightmare. If only it could be done automatically…&lt;/p&gt;  &lt;p&gt;That’s where the variable return type of my template kicks in. It will give us precisely that, with the particularity that when on ANDROID (being the return type an int), the template will not insert string, but a call to the Android Repository. &lt;/p&gt;  &lt;p&gt;This way, I get rid of having to deal manually with Android int IDs, and just work with their strong-typed names.&lt;/p&gt;  &lt;p&gt;See below for more…&lt;/p&gt;  &lt;h4&gt;The implementation&lt;/h4&gt;  &lt;p&gt;The behavior of the template we have developed, to achieve all of this is:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It is designed to be placed inside your projects, just by the file it will process. It has to be in the same folder and needs to have the same name. So, if you want to process the file &lt;em&gt;Textures.resx&lt;/em&gt;, you will end up with something like this in your solution: &lt;/li&gt; &lt;/ul&gt; &lt;a href="http://lh5.ggpht.com/-bd-bUKD_hPw/To2ZdwTgC7I/AAAAAAAABF8/_XueHQyyX_4/s1600-h/image48.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-wYXnJwkL5YY/To2ZeNbDoBI/AAAAAAAABGA/1pvHnUgIXVg/image_thumb69.png?imgmax=800" width="244" height="112" /&gt;&lt;/a&gt;   &lt;p align="center"&gt;&lt;em&gt;&lt;strong&gt;Note 1:&lt;/strong&gt; You can easily modify it to parse all the ResX files it finds in the project at once, but this time I needed it to work this way. &lt;/em&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;&lt;strong&gt;Important Note 2:&lt;/strong&gt; To avoid duplicity of generated code, and compilation errors, when you add the template to a resource file, you should disable the default parsing of that ResX file, by removing the default custom tool (ResXFileCodeGenerator) and by setting BuildAction = None.&lt;/em&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It will generate strong-typed properties to access all the strings it finds in the resX file &lt;/li&gt;    &lt;li&gt;It can be instructed to generate an enumerate with all the keys in the file too &lt;/li&gt;    &lt;li&gt;It will automatically generate the well formatted XML comments for the properties &lt;/li&gt;    &lt;li&gt;It supports some special &lt;em&gt;keywords &lt;/em&gt;(entries starting by “#C#_”)&lt;em&gt;, to &lt;/em&gt;allow customizing the generation process:       &lt;ol&gt;       &lt;li&gt;&lt;em&gt;&lt;strong&gt;CT4_ACCESS_MODIFIERS (public, private, internal)&lt;/strong&gt;&lt;/em&gt;: By default, the generated class will be &lt;em&gt;public&lt;/em&gt;, but you can include this entry to modify this behavior. You can set the following values: &lt;em&gt;public&lt;/em&gt;, &lt;em&gt;private&lt;/em&gt; or &lt;em&gt;internal&lt;/em&gt;. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-bg1Wm1VHTug/To2ZekR8hnI/AAAAAAAABGE/wUACJw4Nqdk/s1600-h/image58.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-cJBJdc_Y9v8/To2ZfNuZOdI/AAAAAAAABGI/C2irovBQPS4/image_thumb80.png?imgmax=800" width="382" height="28" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;ol&gt;     &lt;li&gt;&lt;em&gt;&lt;strong&gt;CT4_OVERRIDE_NAMESPACE (namespace name)&lt;/strong&gt;: &lt;/em&gt;By default, the class will be in the default namespace of the project, but you can include this entry to override that behavior, setting the desired namespace in the value of the entry: &lt;/li&gt;   &lt;/ol&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-gHalmR_CUkU/To2ZftgUXVI/AAAAAAAABGM/jX8J9SNaYII/s1600-h/image65.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-9ZyyprlpKx4/To2Zf82PBrI/AAAAAAAABGQ/H__nRi_7Ap0/image_thumb88.png?imgmax=800" width="397" height="19" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;em&gt;&lt;strong&gt;CT4_GENERATE_ENUM (enum name)&lt;/strong&gt;: &lt;/em&gt;If this entry is included, the template will create an Enumeration with all the key names of the ResX file, and also an special version of the &lt;em&gt;GetResourceString()&lt;/em&gt; method, accepting as parameter one of those enumerations. You can specify the name of the enumeration in the Value field. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-KNzXVrXoKOM/To2ZgUdIZRI/AAAAAAAABGU/1Zg_myjr7QE/s1600-h/image66%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-bN-kT6xaRrg/To2ZgpWbaQI/AAAAAAAABGY/ZJoW59jh59w/image66_thumb%25255B7%25255D.png?imgmax=800" width="621" height="39" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;CT4_DEFAULT_RETURNTYPE (string, int, etc): &lt;/strong&gt;Allows to specify the default return type for all properties. The default return type if string. &lt;/li&gt; &lt;/ol&gt;  &lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/-CMrHQJDT5_A/To2ZnGgn_tI/AAAAAAAABGc/7dxSOLewR9E/s1600-h/image%25255B6%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-EBWU731YFpk/To2Znf3Yj4I/AAAAAAAABGg/Aq6ey9ioLvM/image_thumb%25255B7%25255D.png?imgmax=800" width="540" height="28" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;CT4_CONDITIONAL_COMPILATION_SYMBOLXX (Symbol Name)&lt;/strong&gt;: Allows to use conditional compilation inside the resource files. To do so, you must first identify what conditional compilation symbols are used in your project. In this example, we will have two of them: WINDOWS_PHONE, and ANDROID. So, we will create two entries to let the generator know about them, like the following: &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-YQNsGBUu0Ls/To2Zn0WbTaI/AAAAAAAABGk/ggSWbB0akzE/s1600-h/image85.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-WN_Q1UQBye8/To2ZodqcNJI/AAAAAAAABGo/LWrmc0d5vZE/image_thumb113.png?imgmax=800" width="438" height="48" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;CT4_CONDITIONAL_RETURNTYPE: &lt;/strong&gt;If conditional compilation is being used, it allows to specify a different return type for each conditional symbol, with following syntax: &lt;/li&gt; &lt;/ol&gt;  &lt;p align="center"&gt;&lt;strong&gt;@COND_SYMBOL1:&lt;/strong&gt;type_1;&lt;strong&gt;@COND_SYMBOL2:&lt;/strong&gt;type_2 …&lt;/p&gt;  &lt;p align="left"&gt;Where &lt;em&gt;COND_SYMBOLXX&lt;/em&gt; is one of the conditional compilation symbols defined before, and &lt;em&gt;type_XX &lt;/em&gt;is the return type desired for that symbol.&lt;/p&gt;  &lt;p align="left"&gt;The following example a string return type for WINDOWS_PHONE, and an integer return type for ANDROID:&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh5.ggpht.com/-EjIrNOFHUtc/To2ZoowZLtI/AAAAAAAABGs/gQnznH7XTlM/s1600-h/image%25255B18%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-1I3cj9Ph08k/To2Zo5q3j5I/AAAAAAAABGw/QYPWyaZzNgE/image_thumb%25255B20%25255D.png?imgmax=800" width="603" height="34" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;p&gt;Once we have configured the generation process with the control entries, it’s time to put some data there. A normal string entry is entered as usual, with unique name, a value, and a comment if you want to. How to include conditional compilation entries?&lt;/p&gt;  &lt;h5&gt;Using conditional compilation in string entries&lt;/h5&gt;  &lt;p&gt;The name and the comment of the entry are the same as in normal ones. It’s in the Value where we put the information needed, very much like when defining specific return types for each conditional compilation. The syntax is:&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;@COND_SYMBOL1:&lt;/strong&gt;value_1;&lt;strong&gt;@COND_SYMBOL2:&lt;/strong&gt;value_2 …&lt;/p&gt;  &lt;p align="left"&gt;Where &lt;em&gt;COND_SYMBOLXX&lt;/em&gt; is one of the conditional compilation symbols defined before, and &lt;em&gt;value_XX &lt;/em&gt;is the string value desired for that symbol.&lt;/p&gt;  &lt;p align="left"&gt;So, the following example:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Od5S-D_G_uk/To2ZpQxVU4I/AAAAAAAABG0/FLEFLtHIl4w/s1600-h/image%25255B35%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-CWhq4lVlLBQ/To2ZpgC2mDI/AAAAAAAABG4/N0m-zIg13Ro/image_thumb%25255B39%25255D.png?imgmax=800" width="750" height="31" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Will generate the following code:&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 66&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 67&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;Button 1 image asset name or ID&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 68&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 69&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #if&lt;/span&gt;(WINDOWS_PHONE)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 70&lt;/span&gt;&amp;#160;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static string Button1 { get { return &amp;quot;Content\Textures\UI\button1&amp;quot;; } }&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 71&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #elif&lt;/span&gt;(ANDROID)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 72&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; Button1 { &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Resource&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Drawable&lt;/span&gt;.app_Icon; } }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 73&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endif&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Note that the generator also takes into account the Comment field, and that the return types and values for each version of the property are different. Also, in the case of Android, note that the get method makes a Call to the Android resource repository class, with the strongly-typed properties that access the IDs.&lt;/p&gt;  &lt;h3&gt;The template code&lt;/h3&gt;  &lt;p&gt;The template is based on &lt;a href="http://blog.baltrinic.com/software-development/dotnet/t4-template-replace-resxfilecodegenerator"&gt;this other one&lt;/a&gt;, but with a modified behavior to meet my own needs. The code is:&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; ----------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; Template: Generates C# code to give strongly-typed access to resource files&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; Author: Inaki Ayucar&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; Website: www.graphicdna.net&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; Based on the work of: http://blog.baltrinic.com&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; Links: &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MSDN about developing T4 files: http://msdn.microsoft.com/en-us/library/bb126445.aspx&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; http://msdn.microsoft.com/en-us/library/dd820620.aspx &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160; ----------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;template&lt;/span&gt; &lt;span style="color: maroon"&gt;debug&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: maroon"&gt;hostspecific&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Core&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Xml&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Microsoft.VisualStudio.Shell.Interop.8.0&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;EnvDTE&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;EnvDTE80&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;assembly&lt;/span&gt; &lt;span style="color: maroon"&gt;name&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;VSLangProj&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Collections.Generic&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.IO&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Linq&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Text&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Text.RegularExpressions&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;System.Xml&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Microsoft.VisualStudio.Shell.Interop&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;EnvDTE&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;EnvDTE80&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color: maroon"&gt;import&lt;/span&gt; &lt;span style="color: maroon"&gt;namespace&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;quot;Microsoft.VisualStudio.TextTemplating&amp;quot;&lt;/span&gt; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#&lt;/span&gt;&amp;#160; &lt;span style="color: green"&gt;// --------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Get global variables&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// --------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; serviceProvider = Host &lt;span style="color: blue"&gt;as&lt;/span&gt; IServiceProvider;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (serviceProvider != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dte = serviceProvider.GetService(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(SDTE)) &lt;span style="color: blue"&gt;as&lt;/span&gt; DTE;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Fail if we couldn't get the DTE. This can happen when trying to run in TextTransform.exe&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (Dte == &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; Exception(&lt;span style="color: maroon"&gt;&amp;quot;T4MVC can only execute through the Visual Studio host&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; Project = GetProjectContainingT4File(Dte);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (Project == &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Error(&lt;span style="color: maroon"&gt;&amp;quot;Could not find the VS Project containing the T4 file.&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;&lt;span style="color: maroon"&gt;&amp;quot;XX&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AppRoot = Path.GetDirectoryName(Project.FullName) + &lt;span style="color: maroon"&gt;'\\'&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RootNamespace = Project.Properties.Item(&lt;span style="color: maroon"&gt;&amp;quot;RootNamespace&amp;quot;&lt;/span&gt;).Value.ToString();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// --------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;// ---------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;// &amp;lt;auto-generated&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160; This code was generated by a tool.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;//&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160; Changes to this file may cause incorrect behavior and will be lost if&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160; the code is regenerated.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;// &amp;lt;/auto-generated&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;// ---------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;using System.Threading;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// We are storing in a List&amp;lt;ResourceEntry&amp;gt; (declared below) a list with all string entries &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // of all files found matching our search criteria&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AllEntries = &lt;span style="color: blue"&gt;new&lt;/span&gt; List&amp;lt;ResourceEntry&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Entries starting with &amp;quot;CT4_&amp;quot;, are declared as &amp;quot;control&amp;quot; entries, defining keywords or data &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // that will modify the source code generation behavior&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ControlEntries = &lt;span style="color: blue"&gt;new&lt;/span&gt; List&amp;lt;ResourceEntry&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Find files on our project that match our search criteria (recursively), and store every &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // string entry on those files&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FindResourceFilesRecursivlyAndRecordEntries(Project.ProjectItems, &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AllEntries.Sort( &lt;span style="color: blue"&gt;new&lt;/span&gt; Comparison&amp;lt;ResourceEntry&amp;gt;( (e1, e2) =&amp;gt; (e1.Path + e1.File + &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e1.ValidIdentifierName).CompareTo(e2.Path + e2.File + e2.ValidIdentifierName)));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Parse control entries&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; overrideNameSpace = &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; classAccessModifier = &lt;span style="color: maroon"&gt;&amp;quot;public&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; generateEnumName = &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; defaultReturnType = &lt;span style="color: maroon"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; returnTypesForConditionalCompilation = &lt;span style="color: blue"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; conditionalCompilationSymbols = &lt;span style="color: blue"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; conditionalCompilationSymbolsInValues = &lt;span style="color: blue"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(ResourceEntry entry &lt;span style="color: blue"&gt;in&lt;/span&gt; ControlEntries)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(entry.OriginalName == &lt;span style="color: maroon"&gt;&amp;quot;CT4_OVERRIDE_NAMESPACE&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; overrideNameSpace = entry.Value;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(entry.OriginalName == &lt;span style="color: maroon"&gt;&amp;quot;CT4_ACCESS_MODIFIERS&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; classAccessModifier = entry.Value.ToLower();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(classAccessModifier != &lt;span style="color: maroon"&gt;&amp;quot;public&amp;quot;&lt;/span&gt; &amp;amp;&amp;amp; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; classAccessModifier != &lt;span style="color: maroon"&gt;&amp;quot;private&amp;quot;&lt;/span&gt; &amp;amp;&amp;amp; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; classAccessModifier != &lt;span style="color: maroon"&gt;&amp;quot;internal&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Error(&lt;span style="color: maroon"&gt;&amp;quot;Invalid CT4_ACCESS_MODIFIERS found: Only public, private or internal are allowed&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(entry.OriginalName == &lt;span style="color: maroon"&gt;&amp;quot;CT4_GENERATE_ENUM&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; generateEnumName = entry.Value;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(entry.OriginalName.StartsWith(&lt;span style="color: maroon"&gt;&amp;quot;CT4_CONDITIONAL_COMPILATION_SYMBOL&amp;quot;&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; conditionalCompilationSymbols.Add(entry.Value);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; conditionalCompilationSymbolsInValues.Add(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;@{0}:&amp;quot;&lt;/span&gt;, entry.Value));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(entry.OriginalName.StartsWith(&lt;span style="color: maroon"&gt;&amp;quot;CT4_DEFAULT_RETURNTYPE&amp;quot;&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; defaultReturnType = entry.Value;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(entry.OriginalName.StartsWith(&lt;span style="color: maroon"&gt;&amp;quot;CT4_CONDITIONAL_RETURNTYPE&amp;quot;&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnTypesForConditionalCompilation.Clear();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; hasCondCompilation = StringValueHasCompilationSymbols(entry.Value, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; conditionalCompilationSymbolsInValues);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(!hasCondCompilation)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Error(&lt;span style="color: maroon"&gt;&amp;quot;CT4_CONDITIONAL_RETURNTYPE entry found, but no conditional symbols were found in value&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; parts = SplitStringForConditionalCompilationSymbols(entry.Value, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; conditionalCompilationSymbolsInValues);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt; symbol &lt;span style="color: blue"&gt;in&lt;/span&gt; parts.Keys)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnTypesForConditionalCompilation.Add(symbol, parts[symbol]);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Foreach string entry found, add it's code&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; currentNamespace = &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; currentClass = &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; thisIsFirstEntryInClass = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; names = &lt;span style="color: blue"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt;(&lt;span style="color: blue"&gt;int&lt;/span&gt; i=0;i&amp;lt;AllEntries.Count;i++)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ResourceEntry entry = AllEntries[i];&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; newNamespace = overrideNameSpace == &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt; ? RootNamespace: overrideNameSpace;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; newClass = entry.File;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; namesapceIsChanging = newNamespace != currentNamespace;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; classIsChanging = namesapceIsChanging || newClass != currentClass;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Close out current class if class is changing and there is a current class&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(classIsChanging &amp;amp;&amp;amp; currentClass != &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EmitNamesInnerClass(names);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t}&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Check if there is a namespace change&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(namesapceIsChanging)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Close out current namespace if one exists&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;( currentNamespace != &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt; )&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentNamespace = newNamespace;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Open new namespace&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;namespace {0}&amp;quot;&lt;/span&gt;, currentNamespace));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;{&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Check if there is a class Change&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(classIsChanging)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentClass = newClass;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t&amp;quot;&lt;/span&gt; + classAccessModifier + &lt;span style="color: maroon"&gt;&amp;quot; class {0}&amp;quot;&lt;/span&gt;, currentClass));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t{&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; thisIsFirstEntryInClass = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Only if the class changed, Emit code for the ResourceManager property and &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // GetResourceString method for the current class&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private static global::System.Resources.ResourceManager resourceMan;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ///&amp;#160;&amp;#160; Returns the cached ResourceManager instance used by this class.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [global::System.ComponentModel.EditorBrowsableAttribute&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (global::System.ComponentModel.EditorBrowsableState.Advanced)]&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private static global::System.Resources.ResourceManager ResourceManager &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (object.ReferenceEquals(resourceMan, null)) &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; global::System.Resources.ResourceManager temp = new &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; global::System.Resources.ResourceManager(&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#=&lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;{0}.{1}{2}&amp;quot;&lt;/span&gt;, RootNamespace, entry.Path + &lt;span style="color: maroon"&gt;&amp;quot;.&amp;quot;&lt;/span&gt; + entry.File, entry.Type) &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;quot;, &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(&lt;/span&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#=&lt;/span&gt;entry.File&lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color: gray"&gt;).Assembly);&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resourceMan = temp;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return resourceMan;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ///&amp;#160;&amp;#160; Returns the formatted resource string.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [global::System.ComponentModel.EditorBrowsableAttribute&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (global::System.ComponentModel.EditorBrowsableState.Advanced)]&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private static string GetResourceString(string key, params string[] tokens)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var culture = Thread.CurrentThread.CurrentCulture;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var str = ResourceManager.GetString(key, culture);&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for(int i = 0; i &amp;lt; tokens.Length; i += 2)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; str = str.Replace(tokens[i], tokens[i+1]);&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return str;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(generateEnumName != &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Returns the formatted resource string, passing the enum value as parameter&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [global::System.ComponentModel.EditorBrowsableAttribute&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (global::System.ComponentModel.EditorBrowsableState.Advanced)]&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private static string GetResourceString(&lt;/span&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#=&lt;/span&gt; generateEnumName.ToString() &lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color: gray"&gt; key, params string[] tokens)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var culture = Thread.CurrentThread.CurrentCulture;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var str = ResourceManager.GetString(key.ToString(), culture);&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for(int i = 0; i &amp;lt; tokens.Length; i += 2)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; str = str.Replace(tokens[i], tokens[i+1]);&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return str;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Write entry comment for property&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EmitEntryComment(entry, thisIsFirstEntryInClass);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Select all tokens between braces that constitute valid identifiers&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; tokens = Regex.Matches(entry.Value, &lt;span style="color: maroon"&gt;@&amp;quot;{(([A-Za-z]{1}\w*?)|([A-Za-z_]{1}\w+?))?}&amp;quot;&lt;/span&gt;).&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cast&amp;lt;Match&amp;gt;().Select(m =&amp;gt; m.Value);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(tokens.Any())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; inParams = tokens.Aggregate(&lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, (list, &lt;span style="color: blue"&gt;value&lt;/span&gt;) =&amp;gt; list += &lt;span style="color: maroon"&gt;&amp;quot;, string &amp;quot;&lt;/span&gt; + &lt;span style="color: blue"&gt;value&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Replace(&lt;span style="color: maroon"&gt;&amp;quot;{&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;).Replace(&lt;span style="color: maroon"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(inParams.Length &amp;gt; 0 ) inParams = inParams.Substring(1);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; outParams = tokens.Aggregate(&lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, (list, &lt;span style="color: blue"&gt;value&lt;/span&gt;) =&amp;gt; list += &lt;span style="color: maroon"&gt;&amp;quot;, \&amp;quot;&amp;quot;&lt;/span&gt; + &lt;span style="color: blue"&gt;value&lt;/span&gt; +&lt;span style="color: maroon"&gt;&amp;quot;\&amp;quot;, &amp;quot;&lt;/span&gt; + &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;value&lt;/span&gt;.Replace(&lt;span style="color: maroon"&gt;&amp;quot;{&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;).Replace(&lt;span style="color: maroon"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;) );&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t\tpublic static string {0}({1}) {{ return &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: maroon"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetResourceString(\&amp;quot;{0}\&amp;quot;{2}); }}&amp;quot;&lt;/span&gt;,&amp;#160; entry.ValidIdentifierName, inParams, outParams));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; names.Add(entry.ValidIdentifierName);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Detect if entry has conditional compilation symbols&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; entryValue = entry.Value;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; hasCondCompilation = StringValueHasCompilationSymbols(entryValue, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; conditionalCompilationSymbolsInValues);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(!hasCondCompilation)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EmitProperty(defaultReturnType, entry.ValidIdentifierName, entryValue, &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;false&lt;/span&gt;, &lt;span style="color: blue"&gt;false&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// If has conditional compilation, generate one versino for each symbol&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; valuesForCondCompilation = SplitStringForConditionalCompilationSymbols&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (entryValue, conditionalCompilationSymbolsInValues);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt; c = -1;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt; key &lt;span style="color: blue"&gt;in&lt;/span&gt; valuesForCondCompilation.Keys)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c++;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; rtype = defaultReturnType;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(returnTypesForConditionalCompilation.ContainsKey(key))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rtype = returnTypesForConditionalCompilation[key];&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EmitProperty(rtype, entry.ValidIdentifierName, valuesForCondCompilation[key], &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; key, c == 0, c == valuesForCondCompilation.Count - 1);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; names.Add(entry.ValidIdentifierName);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; thisIsFirstEntryInClass = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Close out the current class when done, writing down the names&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(currentClass != &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EmitNamesInnerClass(names);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(generateEnumName != &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EmitEnum(names, generateEnumName);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; names.Clear();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t}&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;catch&lt;/span&gt;(Exception ex)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; Error(ex.ToString());&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#&lt;/span&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Only close the namespace if I added one &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(AllEntries.Count &amp;gt; 0)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;&amp;lt;#+&lt;/span&gt; &lt;span style="color: green"&gt;// ------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Class feature control block: &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Remarks: Identified by the #+ mark, allows to define variables, methods, etc&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// ------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;const&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Kind_PhysicalFolder = &lt;span style="color: maroon"&gt;&amp;quot;{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; AlwaysKeepTemplateDirty = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; DTE Dte;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; Project Project;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; AppRoot;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; RootNamespace;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; List&amp;lt;ResourceEntry&amp;gt; AllEntries;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; List&amp;lt;ResourceEntry&amp;gt; ControlEntries;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; FindResourceFilesRecursivlyAndRecordEntries&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: Searches in the files of our project, for one that is in the same folder than this &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt; template, has the same &lt;/span&gt;&lt;span style="color: green"&gt;name, and has the extension &amp;quot;.resx&amp;quot;. If found, takes all string entries &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;/// &lt;/span&gt;on it and stores them in the &lt;/span&gt;&lt;span style="color: green"&gt;AllEntries list.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; FindResourceFilesRecursivlyAndRecordEntries(ProjectItems items, &lt;span style="color: blue"&gt;string&lt;/span&gt; path)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// I wanna take care about file path and name, but not about extension, so take everything but the extension&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; aux = Path.GetExtension(Host.TemplateFile);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; T4FileWithoutExtension= Host.TemplateFile.Substring(0, Host.TemplateFile.Length - aux.Length);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(ProjectItem item &lt;span style="color: blue"&gt;in&lt;/span&gt; items)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(Path.GetExtension(item.Name) == &lt;span style="color: maroon"&gt;&amp;quot;.resx&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; itemFileName = item.FileNames[0];&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(itemFileName == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; aux = Path.GetExtension(itemFileName);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; itemFileName = itemFileName.Substring(0, itemFileName.Length - aux.Length);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// If the file path and name (without extension) is not equal to the template file, continue&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(itemFileName.ToLowerInvariant() != T4FileWithoutExtension.ToLowerInvariant())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RecordEntriesInResourceFile(item, path);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// We only want to parse one file. This should never happen, but if we find 2 files, just quit&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(item.Kind == Kind_PhysicalFolder)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FindResourceFilesRecursivlyAndRecordEntries(item.ProjectItems, path+&lt;span style="color: maroon"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;+item.Name);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; RecordEntriesInResourceFile &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: For a given file, takes all its entries and stores them in the AllEntries list.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; RecordEntriesInResourceFile(ProjectItem item, &lt;span style="color: blue"&gt;string&lt;/span&gt; path)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//skip resource files except those for the default culture&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(Regex.IsMatch(item.Name, &lt;span style="color: maroon"&gt;@&amp;quot;.*\.[a-zA-z]{2}(-[a-zA-z]{2})?\.resx&amp;quot;&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; filePath = (&lt;span style="color: blue"&gt;string&lt;/span&gt;)item.Properties.Item(&lt;span style="color: maroon"&gt;&amp;quot;FullPath&amp;quot;&lt;/span&gt;).Value;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; xml = &lt;span style="color: blue"&gt;new&lt;/span&gt; XmlDocument();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xml.Load(filePath);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; entries = xml.DocumentElement.SelectNodes(&lt;span style="color: maroon"&gt;&amp;quot;//data&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; parentFile = item.Name.Replace(&lt;span style="color: maroon"&gt;&amp;quot;.resx&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; fileType = Path.GetExtension(parentFile);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(fileType != &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; fileType != &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parentFile = parentFile.Replace(fileType, &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (XmlElement entryElement &lt;span style="color: blue"&gt;in&lt;/span&gt; entries)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; entry = &lt;span style="color: blue"&gt;new&lt;/span&gt; ResourceEntry&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Path = path != &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &amp;amp;&amp;amp; path != &lt;span style="color: blue"&gt;null&lt;/span&gt;?path.Substring(1):&lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; File = MakeIntoValidIdentifier(parentFile),&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Type = fileType,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OriginalName = entryElement.Attributes[&lt;span style="color: maroon"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;].Value,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; valueElement = entryElement.SelectSingleNode(&lt;span style="color: maroon"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(valueElement != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entry.Value = valueElement.InnerText;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; commentElement = entryElement.SelectSingleNode(&lt;span style="color: maroon"&gt;&amp;quot;comment&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(commentElement != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entry.Comment = commentElement.InnerText;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(entry.OriginalName.StartsWith(&lt;span style="color: maroon"&gt;&amp;quot;CT4_&amp;quot;&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ControlEntries.Add(entry);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Parse the name into a valid identifier&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entry.ValidIdentifierName = MakeIntoValidIdentifier(entry.OriginalName);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AllEntries.Add(entry);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; MakeIntoValidIdentifier&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks:&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; MakeIntoValidIdentifier(&lt;span style="color: blue"&gt;string&lt;/span&gt; arbitraryString)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; validIdentifier = Regex.Replace(arbitraryString, &lt;span style="color: maroon"&gt;@&amp;quot;[^A-Za-z0-9-._]&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot; &amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; validIdentifier = ConvertToPascalCase(validIdentifier);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (Regex.IsMatch(validIdentifier, &lt;span style="color: maroon"&gt;@&amp;quot;^\d&amp;quot;&lt;/span&gt;)) validIdentifier = &lt;span style="color: maroon"&gt;&amp;quot;_&amp;quot;&lt;/span&gt; + validIdentifier;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; validIdentifier;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; ConvertToPascalCase&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks:&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; ConvertToPascalCase(&lt;span style="color: blue"&gt;string&lt;/span&gt; phrase)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] splittedPhrase = phrase.Split(&lt;span style="color: maroon"&gt;' '&lt;/span&gt;, &lt;span style="color: maroon"&gt;'-'&lt;/span&gt;, &lt;span style="color: maroon"&gt;'.'&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; sb = &lt;span style="color: blue"&gt;new&lt;/span&gt; StringBuilder();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb = &lt;span style="color: blue"&gt;new&lt;/span&gt; StringBuilder();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (String s &lt;span style="color: blue"&gt;in&lt;/span&gt; splittedPhrase)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;char&lt;/span&gt;[] splittedPhraseChars = s.ToCharArray();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (splittedPhraseChars.Length &amp;gt; 0)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; splittedPhraseChars[0] = ((&lt;span style="color: blue"&gt;new&lt;/span&gt; String(splittedPhraseChars[0], 1)).ToUpper().ToCharArray())[0];&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sb.Append(&lt;span style="color: blue"&gt;new&lt;/span&gt; String(splittedPhraseChars));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; sb.ToString();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; EmitNamesInnerClass&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks:&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; EmitNamesInnerClass(List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; names)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(names.Any())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\r\n\t\tpublic static class Names&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t\t{&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(&lt;span style="color: blue"&gt;var&lt;/span&gt; name &lt;span style="color: blue"&gt;in&lt;/span&gt; names)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t\t\tpublic const string {0} = \&amp;quot;{0}\&amp;quot;;&amp;quot;&lt;/span&gt;, name));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t\t}&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; EmitNamesInnerClass&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; EmitEnum(List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; names, &lt;span style="color: blue"&gt;string&lt;/span&gt; pEnumName)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(!names.Any())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\r\n\t\tpublic enum &amp;quot;&lt;/span&gt; + pEnumName);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t\t{&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(&lt;span style="color: blue"&gt;var&lt;/span&gt; name &lt;span style="color: blue"&gt;in&lt;/span&gt; names)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t\t\t{0},&amp;quot;&lt;/span&gt;, name));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t\t}&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; names.Clear();&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; StringValueHasCompilationSymbols&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: Returns true if a conditional compilation symbol mark (@symbol:) is found in a string&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; StringValueHasCompilationSymbols(&lt;span style="color: blue"&gt;string&lt;/span&gt; pValue, List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; pConditionalCompilationSymbolsInValues)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt; symb &lt;span style="color: blue"&gt;in&lt;/span&gt; pConditionalCompilationSymbolsInValues)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(pValue.Contains(symb))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; SplitStringForConditionalCompilationSymbols&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: Splits a string (thas has been checked, and has conditional compilation symbols), and &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&lt;span style="color: gray"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;returns a dictionary&lt;/span&gt; &lt;span style="color: green"&gt;where the keys are the conditional compilation symbols, and the values are &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&lt;span style="color: green"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160; ///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;/span&gt;the values of the string for that symbols.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; SplitStringForConditionalCompilationSymbols(&lt;span style="color: blue"&gt;string&lt;/span&gt; entryValue, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; pConditionalCompilationSymbolsInValues)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; retValue= &lt;span style="color: blue"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] parts = entryValue.Split(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;char&lt;/span&gt;[1]{&lt;span style="color: maroon"&gt;';'&lt;/span&gt;}, StringSplitOptions.RemoveEmptyEntries);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt; part &lt;span style="color: blue"&gt;in&lt;/span&gt; parts)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt; symb &lt;span style="color: blue"&gt;in&lt;/span&gt; pConditionalCompilationSymbolsInValues)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(part.StartsWith(symb))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; origSymbol = symb.Remove(0, 1);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; origSymbol = origSymbol.Remove(origSymbol.Length - 1 , 1);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; val = part.Remove(0, symb.Length);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; retValue.Add(origSymbol, val);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; retValue;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; EmitProperty&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: Writes down a property of the return type specified, name and value, and allowing &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160; ///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;to add a conditionalcompilationSymbol&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; EmitProperty(&lt;span style="color: blue"&gt;string&lt;/span&gt; pReturnType, &lt;span style="color: blue"&gt;string&lt;/span&gt; pPropertyName, &lt;span style="color: blue"&gt;string&lt;/span&gt; pPropertyValue, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; pConditionalCompilationSymbol, &lt;span style="color: blue"&gt;bool&lt;/span&gt; pIsFirstConditionalCompilation, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; pIsLastConditionalCompilation)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; hasCondCompilation = (pConditionalCompilationSymbol != &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; pConditionalCompilationSymbol != &lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Write opening conditional compilation&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(hasCondCompilation)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(pIsFirstConditionalCompilation)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t\t#if({0})&amp;quot;&lt;/span&gt;, pConditionalCompilationSymbol));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t\t#elif({0})&amp;quot;&lt;/span&gt;, pConditionalCompilationSymbol));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Write property&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;switch&lt;/span&gt;(pReturnType)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: maroon"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t\tpublic static {0} {1} {{ get {{ return \&amp;quot;{2}\&amp;quot;; }} }}&amp;quot;&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pReturnType, pPropertyName, pPropertyValue));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;default&lt;/span&gt;:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\t\tpublic static {0} {1} {{ get {{ return {2}; }} }}&amp;quot;&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pReturnType, pPropertyName, pPropertyValue));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Close cond compilation&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(hasCondCompilation &amp;amp;&amp;amp; pIsLastConditionalCompilation)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;\t\t#endif&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; EmitEntryComment&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: Writes down an entry comment as a properly formatted XML documentation comment&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; EmitEntryComment(ResourceEntry entry, &lt;span style="color: blue"&gt;bool&lt;/span&gt; thisIsFirstEntryInClass)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Insert the entry comment (if any) in a proper XML documentation format&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(entry.Comment != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(!thisIsFirstEntryInClass) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon"&gt;&amp;quot;\r\n\t\t///&amp;lt;summary&amp;gt;\r\n\t\t///{0}\r\n\t\t///&amp;lt;/summary&amp;gt;&amp;quot;&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entry.Comment.Replace(&lt;span style="color: maroon"&gt;&amp;quot;\r\n&amp;quot;&lt;/span&gt;, &lt;span style="color: maroon"&gt;&amp;quot;\r\n\t\t///&amp;quot;&lt;/span&gt;)));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt; WriteLine(&lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; GetProjectContainingT4File&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks:&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; Project GetProjectContainingT4File(DTE dte) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Find the .tt file's ProjectItem&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ProjectItem projectItem = dte.Solution.FindProjectItem(Host.TemplateFile);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// If the .tt file is not opened, open it&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (projectItem.Document == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; projectItem.Open(Constants.vsViewKindCode);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (AlwaysKeepTemplateDirty) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Mark the .tt file as unsaved. This way it will be saved and update itself next time the&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// project is built. Basically, it keeps marking itself as unsaved to make the next build work.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Note: this is certainly hacky, but is the best I could come up with so far.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; projectItem.Document.Saved = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; projectItem.ContainingProject;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Struct: ResourceEntry&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Remarks: Stores information about an entry in a resource file&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/Summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;struct&lt;/span&gt; &lt;span style="color: teal"&gt;ResourceEntry&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Path { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; File { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Type { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; OriginalName { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; ValidIdentifierName { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Value { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Comment { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #ffd700"&gt;#&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;h3&gt;Et voilà ! An input and output example&lt;/h3&gt;  &lt;p&gt;The above template, applied to the following input:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-qTZ0gZk90KA/To2ZqA5fmDI/AAAAAAAABG8/hWultgJkP9k/s1600-h/image%25255B42%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-mWMHopPB-k4/To2Zqf1icEI/AAAAAAAABHA/V7peSXHMx-U/image_thumb%25255B48%25255D.png?imgmax=800" width="722" height="191" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Produces the following output class:&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;// ------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;// &amp;lt;auto-generated&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160; This code was generated by a tool.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160; Changes to this file may cause incorrect behavior and will be lost if&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;//&amp;#160;&amp;#160;&amp;#160;&amp;#160; the code is regenerated.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;// &amp;lt;/auto-generated&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;// ------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Threading;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; GDNA.PencilBurst&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Textures&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;global&lt;/span&gt;::System.Resources.&lt;span style="color: #2b91af"&gt;ResourceManager&lt;/span&gt; resourceMan;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160; Returns the cached ResourceManager instance used by this class.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: blue"&gt;global&lt;/span&gt;::System.ComponentModel.&lt;span style="color: #2b91af"&gt;EditorBrowsableAttribute&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color: blue"&gt;global&lt;/span&gt;::System.ComponentModel.&lt;span style="color: #2b91af"&gt;EditorBrowsableState&lt;/span&gt;.Advanced)]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;global&lt;/span&gt;::System.Resources.&lt;span style="color: #2b91af"&gt;ResourceManager&lt;/span&gt; ResourceManager &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;object&lt;/span&gt;.ReferenceEquals(resourceMan, &lt;span style="color: blue"&gt;null&lt;/span&gt;)) &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;global&lt;/span&gt;::System.Resources.&lt;span style="color: #2b91af"&gt;ResourceManager&lt;/span&gt; temp = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;global&lt;/span&gt;::System.Resources.&lt;span style="color: #2b91af"&gt;ResourceManager&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color: #a31515"&gt;&amp;quot;GDNA.PencilBurst..Textures&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Textures&lt;/span&gt;).Assembly);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resourceMan = temp;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; resourceMan;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160; Returns the formatted resource string.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: blue"&gt;global&lt;/span&gt;::System.ComponentModel.&lt;span style="color: #2b91af"&gt;EditorBrowsableAttribute&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color: blue"&gt;global&lt;/span&gt;::System.ComponentModel.&lt;span style="color: #2b91af"&gt;EditorBrowsableState&lt;/span&gt;.Advanced)]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetResourceString(&lt;span style="color: blue"&gt;string&lt;/span&gt; key, &lt;span style="color: blue"&gt;params&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] tokens)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; culture = &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.CurrentThread.CurrentCulture;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; str = ResourceManager.GetString(key, culture);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt;(&lt;span style="color: blue"&gt;int&lt;/span&gt; i = 0; i &amp;lt; tokens.Length; i += 2)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; str = str.Replace(tokens[i], tokens[i+1]);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; str;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Returns the formatted resource string, passing the enum value as parameter&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: blue"&gt;global&lt;/span&gt;::System.ComponentModel.&lt;span style="color: #2b91af"&gt;EditorBrowsableAttribute&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color: blue"&gt;global&lt;/span&gt;::System.ComponentModel.&lt;span style="color: #2b91af"&gt;EditorBrowsableState&lt;/span&gt;.Advanced)]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetResourceString(&lt;span style="color: #2b91af"&gt;eTextureIDs&lt;/span&gt; key, &lt;span style="color: blue"&gt;params&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] tokens)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; culture = &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.CurrentThread.CurrentCulture;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; str = ResourceManager.GetString(key.ToString(), culture);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt;(&lt;span style="color: blue"&gt;int&lt;/span&gt; i = 0; i &amp;lt; tokens.Length; i += 2)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; str = str.Replace(tokens[i], tokens[i+1]);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; str;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;Button 1 image asset name or ID&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #if&lt;/span&gt;(WINDOWS_PHONE)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static string Button1 { get { return &amp;quot;Content\Textures\UI\button1&amp;quot;; } }&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #elif&lt;/span&gt;(ANDROID)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; Button1 { &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Resource&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Drawable&lt;/span&gt;.app_Icon; } }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endif&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Names&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;const&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Button1 = &lt;span style="color: #a31515"&gt;&amp;quot;Button1&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;enum&lt;/span&gt; &lt;span style="color: #2b91af"&gt;eTextureIDs&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Button1,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt; &lt;/div&gt;  &lt;h3&gt;Other use cases&lt;/h3&gt;  &lt;p&gt;The possibilities are almost endless. You don´t need to stick to Resource Files (ResX) only. You can do this operations with almost anything. For example:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;You can write a T4 Template for a “Contents” projects, that searches for Textures or Bitmaps in the project, and generates a Class that strong-types the names and/or paths of those textures. Creating your own Content Manager. &lt;/li&gt;    &lt;li&gt;You can generate your own classes to give strong-type access to your Data-Sets, in a totally customized way. &lt;/li&gt;    &lt;li&gt;Or you can generate a class that bases it’s strong type access in an enumeration, instead properties, something like the following: &lt;/li&gt; &lt;/ul&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;internal&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TexturesByEnum&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;global&lt;/span&gt;::System.Resources.&lt;span style="color: #2b91af"&gt;ResourceManager&lt;/span&gt; resourceMan;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160; Returns the cached ResourceManager instance used by this class.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: blue"&gt;global&lt;/span&gt;::System.ComponentModel.&lt;span style="color: #2b91af"&gt;EditorBrowsableAttribute&lt;/span&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color: blue"&gt;global&lt;/span&gt;::System.ComponentModel.&lt;span style="color: #2b91af"&gt;EditorBrowsableState&lt;/span&gt;.Advanced)]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;global&lt;/span&gt;::System.Resources.&lt;span style="color: #2b91af"&gt;ResourceManager&lt;/span&gt; ResourceManager&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;object&lt;/span&gt;.ReferenceEquals(resourceMan, &lt;span style="color: blue"&gt;null&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;global&lt;/span&gt;::System.Resources.&lt;span style="color: #2b91af"&gt;ResourceManager&lt;/span&gt; temp = &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new&lt;/span&gt; &lt;span style="color: blue"&gt;global&lt;/span&gt;::System.Resources.&lt;span style="color: #2b91af"&gt;ResourceManager&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color: #a31515"&gt;&amp;quot;GDNA.Render.Repository.Textures&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Textures&lt;/span&gt;).Assembly);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resourceMan = temp;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; resourceMan;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Returns the formatted resource string, passing the enum value as parameter&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: blue"&gt;global&lt;/span&gt;::System.ComponentModel.&lt;span style="color: #2b91af"&gt;EditorBrowsableAttribute&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color: blue"&gt;global&lt;/span&gt;::System.ComponentModel.&lt;span style="color: #2b91af"&gt;EditorBrowsableState&lt;/span&gt;.Advanced)]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetResourceString(&lt;span style="color: #2b91af"&gt;eTextureIDs&lt;/span&gt; key, &lt;span style="color: blue"&gt;params&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] tokens)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; culture = &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.CurrentThread.CurrentCulture;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; str = ResourceManager.GetString(key.ToString(), culture);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; i = 0; i &amp;lt; tokens.Length; i += 2)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; str = str.Replace(tokens[i], tokens[i + 1]);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; str;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;enum&lt;/span&gt; &lt;span style="color: #2b91af"&gt;eTextureIDs&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Button1,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Button2,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;/// &lt;/span&gt;&lt;span style="color: green"&gt;Indexed access to class&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;[&lt;span style="color: #2b91af"&gt;eTextureIDs&lt;/span&gt; id]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; GetResourceString(id);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;This way, access to resources would be:&lt;/p&gt;  &lt;p style="margin: 0px; font-family: consolas; background: white; color: black; font-size: 10pt" align="left"&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; aux = Textures[&lt;span style="color: #2b91af"&gt;eTextureIDs&lt;/span&gt;.Button1];&lt;/p&gt;  &lt;p style="margin: 0px; font-family: consolas; background: white; color: black; font-size: 10pt" align="left"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin: 0px; font-family: consolas; background: white; color: black; font-size: 10pt" align="left"&gt;instead of…&lt;/p&gt;  &lt;p style="margin: 0px; font-family: consolas; background: white; color: black; font-size: 10pt" align="left"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin: 0px; font-family: consolas; background: white; color: black; font-size: 10pt" align="left"&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; aux = Textures.Button1;&lt;/p&gt;  &lt;p&gt;As you can see, the customization possibilities are huge, and the examples countless. &lt;/p&gt;  &lt;p&gt;So use your imagination !! &lt;/p&gt;  &lt;p&gt;Cheers !&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-8151705288435838044?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/8151705288435838044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=8151705288435838044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/8151705288435838044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/8151705288435838044'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/10/using-t4-templates-to-generate-custom.html' title='Using T4 Templates to generate custom strongly-typed code in Visual Studio'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-t11ujgQQieU/To2ZZcYK0qI/AAAAAAAABFQ/TfhQFKpIvwo/s72-c/image_thumb9.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-7037891647463435679</id><published>2011-09-23T17:51:00.001+01:00</published><updated>2011-09-29T14:50:12.703+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XBox360'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Ramblings about the excellent Windows Media Center</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 11px 0px 0px; display: inline; float: left" align="left" src="http://t1.gstatic.com/images?q=tbn:ANd9GcTOK_aoru-ZevwEDSD3wm3b6aWq96a3lqeVFi33hQIneW9hOygfUQ" width="263" height="192" /&gt;&lt;/p&gt;  &lt;p&gt;Today, I was trying to setup a Windows Media Center Extender, to be able to see my movies (stored in my PC) through my XBox in the living room. In theory, it´s easy, but you can get into some troubles I´d like to point, just in case that might help you…&lt;/p&gt;  &lt;p&gt;You can get some basic knowledge about Media Center extenders &lt;a href="http://windows.microsoft.com/en-US/windows7/Set-up-a-Windows-Media-Center-Extender"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;First, try to connect your XBox with the PC, through Settings-&amp;gt;Network-&amp;gt;Connection to computer. If the connection is established successfully, you probably won´t have any problem configuring the Media Center Extender. But if you have problems, check:&lt;/p&gt;  &lt;p&gt;1.- That your router supports Multicast Filtering, as some routers, like the Cisco EPC3825 (the one I was trying first), seem to have problems with that. In fact, in the settings dialogs of that router, you won´t find any option about Multicast Filtering. I can tell you that I tried every single possibility for a couple of hours with that router, and no luck. I switched to a different one (from Linksys), and everything worked like a charm…&lt;/p&gt;  &lt;p&gt;2.- If your router is supposed to work with this feature, make sure you have enabled the mentioned “Filter Multicast” option (probably available in the Security settings tab of the router), and also that you have enabled the uPnP (probably in the Management settings tab of the router).&lt;/p&gt;  &lt;p&gt;3.- If still have problems, you can check your Firewall settings to search for the needed open ports and so on… You can read more &lt;a href="http://windows.microsoft.com/en-IE/windows-vista/Troubleshoot-problems-with-a-Windows-Media-Center-Extender-device"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;One you have properly linked your PC and XBox 360, you can start the Windows Media Center on your PC, to choose what folders you will be sharing. &lt;/p&gt;  &lt;p&gt;Some tips about folder structures, in order to see the covers of the movies, and additional info:&lt;/p&gt;  &lt;p&gt;1.- Put each movie in a separate folder, as WMC will look this way for additional info for each movie&lt;/p&gt;  &lt;p&gt;2.- If you want to manually download a cover for a movie or video, you just need to put the picture in the movie folder, with the name “folder.jpg”. WMC will load it automatically.&lt;/p&gt;  &lt;p&gt;3.- If you want to put additional information, like movie specs, genre, etc, you should add some DVDID XML files with a certain format that will help WMC identifying the movie. You can download those files from &lt;a title="http://dvdxml.com" href="http://dvdxml.com"&gt;http://dvdxml.com&lt;/a&gt; or even better, use one of the available metadata managers out there. I have tried &lt;a href="http://mikinho.com/yammm/"&gt;YAMMM&lt;/a&gt; and works pretty well.&lt;/p&gt;  &lt;p&gt;4.- If your XBox is downloading the movie covers and info again and again, each time you enter the Windows Media Center, or if it takes long to recover the covers, etc, that´s probably because you don´t have indexed the shared folders on your PC. Just make sure that the Indexing Service is installed and enabled (Start-&amp;gt;Control Panel-&amp;gt;Programs and Features-&amp;gt;Turn on/off Windows features-&amp;gt;Indexing Service), and also make sure that the shared folders for the movies are added to the index (Rightclick-&amp;gt;properties-&amp;gt;advanced-&amp;gt;allow to add this folder to the index).&lt;/p&gt;  &lt;h4&gt;Some tips about YAMMM&lt;/h4&gt;  &lt;p&gt;1.- It´s a Windows Service, so don´t expect any User Interface, except for setting up the application. It’s run in background, monitoring the folders you tell it to for changes, and downloading automatically the info and covers.&lt;/p&gt;  &lt;p&gt;2.- It expects movies to be in separate folders, and users folder’s name (not file’s name) to identify what movie you are talking about. If it doesn´t identify what movie it is, it won´t download anything. If it does, it can automatically rename the folder and movie files (with a more standard name, if you indicate it to do so), and will start downloading.&lt;/p&gt;  &lt;p&gt;3.- YAMMM won´t find the correct movie if you don´t use the original movie name for the folder name. So forget any any translated version. &lt;/p&gt;  &lt;p&gt;4.- To help YAMMM finding it, you can include the year of the movie, like this: “American Gangster (2007)”. That will help, a lot…&lt;/p&gt;  &lt;p&gt;5.- If your movie is divided into several files (part 1, part 2, etc), YAMMM will automatically create a playlist for them, so WMC will identify them as a single movie. By default, after doing this you will see that WMC adds multiple entries for your movie: one for the playlist, and one for each part your AVI or DVD is divided into. In order to hide the parts, and live only the playlist, you can rename the AVI parts like: “video 1.avi” to “video 1.avi2”. This way, WMC won´t identify that part as a movie, and the reference file (playlist) will still work. (You should make sure that the playlist has modified the reference names too, by simply opening it with the WordPad).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-7037891647463435679?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/7037891647463435679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=7037891647463435679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/7037891647463435679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/7037891647463435679'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/09/ramblings-about-excellent-windows-media.html' title='Ramblings about the excellent Windows Media Center'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-7699122926205475467</id><published>2011-07-29T19:17:00.001+01:00</published><updated>2011-07-29T19:20:07.834+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Setup Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='TheCodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='C# 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net Framework 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Handling big files in Visual Studio Setup Projects</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 7px 0px 0px; display: inline; float: left" align="left" src="http://t2.gstatic.com/images?q=tbn:ANd9GcRAIYnVhduIZ9HPtRmkR1yRIZk07JOvrtZhTpZXauUMUgzLvH2PSw" width="147" height="109" /&gt;&lt;/p&gt;  &lt;p&gt;If you use Visual Studio to make your Setup projects, you probably noticed a very annoying and long lasting limitation of Visual Studio / Windows Installer, which is supposed to be fixed always in future versions. It´s nothing else than file size.&lt;/p&gt;  &lt;p&gt;Setup projects do not handle well big files. In this post, I’ll show you how to workaround those problems:&lt;/p&gt;  &lt;h3&gt;Scenario 1: your files are big, but not &lt;em&gt;that big&lt;/em&gt;&lt;/h3&gt;  &lt;p&gt;The first problem you will face when including big files in a setup project is a build error saying something like “&lt;em&gt;Not enough storage is available to complete the operation&lt;/em&gt;”.&lt;/p&gt;  &lt;p&gt;As mentioned &lt;a href="http://msdn.microsoft.com/en-us/library/kz0ke5xt.aspx"&gt;here&lt;/a&gt;, If you handle files of a few hundreds of Megabytes, you can workaround this by:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;In the project, add a fake small file that has the same name as the large file. &lt;/li&gt;    &lt;li&gt;In the project properties page, set to installer to Package as Loose Uncompressed files. &lt;/li&gt;    &lt;li&gt;Build. &lt;/li&gt;    &lt;li&gt;Copy the full-sized large files to the build location.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In other words, you will fool the installer by inserting fake small files with the same names, and leaving them outside the MSI, so you can overwrite them before distributing your installer with the real, bigger files. As Windows Installer just looks for the file names, it will think the files are Ok, and will install the big ones. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Quick-Tip&lt;/strong&gt;: If it’s annoying for you to have all the installation files as “loose uncompressed files”, you can only leave as “loose uncompressed” those files to be overwritten, leaving the rest inside the installer or in CAB files, whatever you prefer. To do so, do not change the project´s property, but instead change the property &lt;strong&gt;PackageAs&lt;/strong&gt; of those files to be overwritten. The default value is &lt;strong&gt;vsdpaDefault, &lt;/strong&gt;which means “do as specified in the project properties”. If you change it to &lt;strong&gt;vsdpaLoose, &lt;/strong&gt;those files will remain loose in the disk, no matter what the general behavior for the rest of the files is.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;This workaround is fine, but it doesn’t work always, as it will also fail if you have very big files, of several GBs… &lt;/p&gt;  &lt;h3&gt;Scenario 2: your files are huge&lt;/h3&gt;  &lt;p&gt;If you are dealing with huge files, of several GBs, the previous workaround won´t work either. The setup project will compile fine, but Windows Installer will probably fail later. This time, the error is shown when installing the application, and it appears in the form of a &lt;em&gt;“couldn’t access destination directory, check you have enough privileges to do so”&lt;/em&gt;… or something like that. &lt;/p&gt;  &lt;p&gt;What can you do in those cases?&lt;/p&gt;  &lt;h4&gt;Option 1: Split your files into smaller ones&lt;/h4&gt;  &lt;p&gt;You can use a file splitting utility, like &lt;a href="http://www.jaist.ac.jp"&gt;FFSJ&lt;/a&gt;, to split your files into parts. Then add those smaller files to your Setup Project and install normally. When installation is complete, you will need to deal with re-joining the parts back into the original file. FFSJ supports receiving commands from the command line, so you can easily do this with a Custom Action. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Insert FFSJ into your setup project (check copyright) &lt;/li&gt;    &lt;li&gt;Add a “&lt;em&gt;Commit Custom Action&lt;/em&gt;” that points to FFSJ &lt;/li&gt;    &lt;li&gt;Mark the Custom Action as &lt;strong&gt;InstallerClass = False&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Pass the following “&lt;em&gt;Arguments&lt;/em&gt;” to the custom action: &lt;/li&gt; &lt;/ul&gt;  &lt;p align="center"&gt;&lt;b&gt;&lt;em&gt;&amp;quot;-Task=Join&amp;quot; &amp;quot;-Input=[TARGETDIR]\FILE_TO_JOIN.001&amp;quot; &amp;quot;-Output=[TARGETDIR]\OUTPUT_FILE.dat&amp;quot; –DeleteInput&lt;/em&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p align="left"&gt;This action will be executed once the installation is complete, and once all the files have been copied to the Target Dir. If you include the “-DeleteInput” parameter, original file parts will be deleted. &lt;/p&gt;  &lt;p align="left"&gt;Pros of this workaround: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="left"&gt;All files are handled “inside” Visual Studio, but that won´t help much anyway, as the file copy progress is not as “fluid” as it should be&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="left"&gt;Cons of this workaround:&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;           &lt;div align="left"&gt;You need to split the file into parts and insert them in Visual Studio manually&lt;/div&gt;         &lt;/li&gt;          &lt;li&gt;           &lt;div align="left"&gt;Copyright issues with the file splitter may apply&lt;/div&gt;         &lt;/li&gt;          &lt;li&gt;           &lt;div align="left"&gt;Do not handle uninstallation, as Windows Installer will try to remove the original files (parts), which no longer exist&lt;/div&gt;         &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h4 align="left"&gt;Option 2: Code an specific Custom Action&lt;/h4&gt;  &lt;p align="left"&gt;I´m not sure of this, but I know of no way to call system commands like “copy” from a Visual Studio custom action, so we will code a very simple C# program, that will handle some basic file operations for us, like copying and deleting files.&amp;#160; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="left"&gt;Create a new Visual Studio project of the type &lt;strong&gt;&lt;em&gt;Windows&lt;/em&gt;&lt;/strong&gt; –&amp;gt; &lt;strong&gt;&lt;em&gt;Console Application&lt;/em&gt;&lt;/strong&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;In the class &lt;em&gt;Program.cs, &lt;/em&gt;we will deal with some file operations. In our example, we will assume that the huge file we want to copy has the name “Contents.dat” (you can experiment here to make it fit your needs). So, for our example, we would paste some code like the following:&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt; [&lt;span style="color: #2b91af"&gt;STAThread&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] cmdLine)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; operation = cmdLine[0];&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; sourcePath, installPath, sourceFileName, destFileName;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;switch&lt;/span&gt; (operation)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;Copy&amp;quot;&lt;/span&gt;:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sourcePath = cmdLine[1];&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; installPath = cmdLine[2];&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sourceFileName = System.IO.&lt;span style="color: #2b91af"&gt;Path&lt;/span&gt;.Combine(sourcePath, &lt;span style="color: #a31515"&gt;&amp;quot;Contents.dat&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; destFileName = System.IO.&lt;span style="color: #2b91af"&gt;Path&lt;/span&gt;.Combine(installPath, &lt;span style="color: #a31515"&gt;&amp;quot;Contents.dat&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!System.IO.&lt;span style="color: #2b91af"&gt;Directory&lt;/span&gt;.Exists(installPath))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; -1;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.IO.&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.Copy(sourceFileName, destFileName, &lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;Delete&amp;quot;&lt;/span&gt;:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; installPath = cmdLine[1];&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; destFileName = System.IO.&lt;span style="color: #2b91af"&gt;Path&lt;/span&gt;.Combine(installPath, &lt;span style="color: #a31515"&gt;&amp;quot;Contents.dat&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.IO.&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.Delete(destFileName);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; 0;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;As you can see, this is a very basic code that expects some Command Line parameters, with the following syntax:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Parameter 0&lt;/strong&gt;: Operation type [“Copy” or “Delete”, without the quotes].&lt;/p&gt;  &lt;p&gt;If copying: &lt;strong&gt;Parameter 1&lt;/strong&gt;: Source path where “Contents.dat” is located. &lt;strong&gt;Parameter 2&lt;/strong&gt;: Destination path where we want to copy it&lt;/p&gt;  &lt;p&gt;If Deleting: &lt;strong&gt;Parameter 1&lt;/strong&gt;: Path to delete “Contents.dat” from.&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;ul&gt;       &lt;ul&gt;         &lt;ul&gt;           &lt;ul&gt;             &lt;li&gt;Next, we compile the code and generate an EXE file&lt;/li&gt;              &lt;li&gt;Insert that EXE file into your setup project&lt;/li&gt;              &lt;li&gt;Now we just need to create a couple of Custom Actions in our setup project that point to that EXE file, like the following (note that they will be executed at installation Commit and at Uninstallation):&lt;/li&gt;           &lt;/ul&gt;         &lt;/ul&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Lb9HRntfBO8/TjL5SC3xtZI/AAAAAAAABEg/NFg2PqsMvlA/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-zDX9DOLjVJk/TjL5SwqzHBI/AAAAAAAABEk/L6lWH9kW6w0/image_thumb%25255B9%25255D.png?imgmax=800" width="472" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;ul&gt;       &lt;ul&gt;         &lt;ul&gt;           &lt;ul&gt;             &lt;ul&gt;               &lt;li&gt;Mark your custom actions as &lt;strong&gt;InstallerClass = False&lt;/strong&gt;&lt;/li&gt;                &lt;li&gt;Change the Custom Action arguments like the following:&lt;/li&gt;                &lt;ul&gt;                 &lt;ul&gt;                   &lt;ul&gt;                     &lt;ul&gt;                       &lt;ul&gt;                         &lt;ul&gt;                           &lt;ul&gt;                             &lt;li&gt;Arguments for the Copy operation: &lt;strong&gt;Copy &amp;quot;[SOURCEDIR]\&amp;quot; &amp;quot;[TARGETDIR]\&amp;quot;&lt;/strong&gt;&lt;/li&gt;                              &lt;li&gt;Arguments for the delete operation: &lt;strong&gt;Delete &amp;quot;[TARGETDIR]\&amp;quot;&lt;/strong&gt;&lt;/li&gt;                           &lt;/ul&gt;                         &lt;/ul&gt;                       &lt;/ul&gt;                     &lt;/ul&gt;                   &lt;/ul&gt;                 &lt;/ul&gt;               &lt;/ul&gt;             &lt;/ul&gt;           &lt;/ul&gt;         &lt;/ul&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Quick-Tip: &lt;/strong&gt;Variables that contain paths, like [SOURCEDIR] or [TARGETDIR] might contain spaces. By default, that would mean that each part of the path would be interpreted as separated arguments. In order to avoid that, we surround those variables with quotes (“”).&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Quick-Tip 2:&lt;/strong&gt; As explained &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/166458/quoted-targetdir-caused-argument-failure-in-deployment-custom-actions"&gt;here&lt;/a&gt;, Windows Installer automatically adds a trailing slash to variables like [TARGETDIR], so in order to avoid messing the arguments, you will need to put a \” at the end, instead of a single quote (“).&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Quick-Tip 3&lt;/strong&gt;: It is important to note the return value of the Custom Action, as it’s checked by Windows Installer to decide if the action was completed successfully. So, if it’s 0, everything went fine. If it’s –1, an error occurred and the installation will be cancelled. So it’s up to you if the file copy is vital for your installation or not. But if it is, you´d better be returning a “–1” in those cases, to interrupt the installation.&lt;/em&gt;&lt;/p&gt;  &lt;h5&gt;So what´s going on here?&lt;/h5&gt;  &lt;p&gt;Easy to guess: Windows Installer will call our custom action after when the installation finish is about to end (Commit), with the arguments we specified, that will make our EXE copy the huge files to the installation directory. &lt;/p&gt;  &lt;p&gt;In order to properly handle application uninstallation, we added another call to the same custom action, but this time with different arguments that will make it remove the huge files copied from the installation directory. &lt;/p&gt;  &lt;p align="left"&gt;Pros of this workaround: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="left"&gt;No need to split files&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;No copyright issues (everything is home made)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;Handles uninstallation&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;No need to create fake, smaller files to fool the installer&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;The custom action created can be made generic, so you can re-use it as many times you want.&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="left"&gt;Cons of this workaround:&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;           &lt;div align="left"&gt;It would be much better if Visual Studio didn’t have this limitation, and we never needed to worry about this &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Guiño" src="http://lh3.ggpht.com/-2SKy-VeRosk/TjL5TJIQBPI/AAAAAAAABEo/HKGmD1kVhqQ/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/div&gt;         &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;So, I think option 2 is much better. In fact, is what I use. &lt;/p&gt;  &lt;p&gt;Hope it helped. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-7699122926205475467?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/7699122926205475467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=7699122926205475467' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/7699122926205475467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/7699122926205475467'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/07/handling-big-files-in-visual-studio.html' title='Handling big files in Visual Studio Setup Projects'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-zDX9DOLjVJk/TjL5SwqzHBI/AAAAAAAABEk/L6lWH9kW6w0/s72-c/image_thumb%25255B9%25255D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-2455869631145783193</id><published>2011-06-28T10:10:00.001+01:00</published><updated>2011-06-28T15:25:52.737+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cars'/><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>A vueltas con el retorno de los 120 km/h</title><content type='html'>&lt;p&gt;El otro día, el Gobierno anunció que retiraba la limitación de 110 Km/h en autovías y autopistas, algo que, sinceramente, me alegra, y sobre lo que ya hablamos &lt;a href="http://graphicdna.blogspot.com/2011/05/vueltas-con-la-limitacion-de-110-kmh.html"&gt;aqui&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Como era de esperar, ahora llega el momento de las felicitaciones, de las palmaditas en la espalda y de, perdonen la expresión -no puedo evitar acordarme del &lt;a href="http://www.youtube.com/watch?v=BwuSRXf7r9g"&gt;Sr. Lobo&lt;/a&gt;-, chuparse las pollas. &lt;/p&gt;  &lt;p&gt;Que si “semos cojonudos”, “los más listos, y tal y tal…”. Lamentablemente, llega otra vez el momento de soltar alguna que otra mentirijilla, algo que parece que se le da muy bien a nuestros políticos. &lt;/p&gt;  &lt;p&gt;El otro día, el Sr. Rubalcaba dijo en TV que España había ahorrado 200 Millones de Euros en petróleo. A día de hoy, tras solo 4 o 5 días, esa cifra ha aumentado hasta 450 Millones, nada menos.&lt;/p&gt;  &lt;p&gt;Vamos a hacer una cuenta rápida. No será exacta, pero si bastante aproximada:&lt;/p&gt;  &lt;p&gt;En el anterior post sobre este tema comenté el consumo anual en barriles de petróleo de España en el año 2001. Hoy tengo información un poco más actualizada, ya que según la &lt;a href="https://www.cia.gov/library/publications/the-world-factbook/geos/sp.html"&gt;CIA&lt;/a&gt;, en &lt;a href="http://www.indexmundi.com/es/espana/petroleo_consumo.html"&gt;2010&lt;/a&gt; el consumo Español rondó los 1.482.000 barriles diarios de petróleo. Eso nos deja un total de: 540.930.000 barriles consumidos por España en todo el año.&lt;/p&gt;  &lt;p&gt;Pero la medida aplicada por el gobierno solo ha estado activa 4 meses, por lo que en ese periodo de tiempo, el número total de barriles consumidos habrá sido de: 177.840.000 barriles (ciento setenta y siete millones y pico)&lt;/p&gt;  &lt;p&gt;Bien, el precio actual del barril del petróleo ronda los 100 dólares, lo cual es equivalente a unos 70 Euros, por lo que el precio de todos esos barriles consumidos en 4 meses es de unos:&amp;#160; 12.448.800.000 € (doce mil millones de euros y pico).&lt;/p&gt;  &lt;p&gt;Como ya calculamos &lt;a href="http://graphicdna.blogspot.com/2011/05/vueltas-con-la-limitacion-de-110-kmh.html"&gt;en el otro post&lt;/a&gt;, el impacto real de la medida iba a rondar el 0.5%, o más bien el &lt;strong&gt;0.25%&lt;/strong&gt; si teníamos en cuenta el 50% de factor de error que el IEA aconsejaba aplicar.&lt;/p&gt;  &lt;p&gt;Muy bien. El 0.25% de ese montón de euros es…… [redoble de tambor]&lt;/p&gt;  &lt;p align="center"&gt;&lt;font size="6"&gt;31.122.000 €&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Es decir. 31 Millones de Euros, 15 veces menos que lo que pregona el Gobierno. No se de donde sacan los 450, y por cierto, estaría muy bien que lo explicaran. No es tan difícil, yo he hecho estas cuentas en 10 minutos. ¿No podría el gobierno publicar un informe detallado de sus cálculos, en lugar de salir en la tele tan alegremente a decir lo que les da la gana?&lt;/p&gt;  &lt;p&gt;Está claro que mis cálculos son muy aproximados, ¡pero coño!, es que ellos hablan de que han ahorrado &lt;strong&gt;15 veces más, &lt;/strong&gt;y mucho me he tenido que equivocar para multiplicar mis datos por 15…&lt;/p&gt;  &lt;p&gt;Encima, a esa cifra hay que restarle medio millón de euros, ya que ahora nos dicen que las pegatinas que pusieron se han pegado muy fuerte, y que no las pueden quitar, por lo que &lt;a href="http://www.diariodenavarra.es/noticias/mas_actualidad/nacional/fomento_gastara_otros_230_000_euros_pegatinas_120.html"&gt;van a hacer MÁS PEGATINAS !!&lt;/a&gt;, esta vez con un 2, en lugar de un 1. Las primeras costaron 230.000€ y estas también, así que otro medio millón de euros gastado. &lt;/p&gt;  &lt;h4&gt;Conclusión&lt;/h4&gt;  &lt;p&gt;Que aunque me veáis aquí despotricando contra esta medida, tampoco quiero quitar importancia al ahorro conseguido. Simplemente digo dos cosas:&lt;/p&gt;  &lt;p&gt;1.- Que esa no era, ni con mucho, la medida más eficaz para ahorrar petróleo. Que había otras mucho más efectivas y eficaces, y que además no causaban tanto trastorno al ciudadano. No hay más que leer el informe del IEA, publicado en el anterior post.&lt;/p&gt;  &lt;p&gt;2.- Que me provoca mucha desazón comprobar cómo el Gobierno infla los números a su antojo para justificar su propia incompetencia. Realizan una mala gestión, escogen medidas que no son efectivas, y para no quedar como el culo, salen por la tele mintiendo… Para terminar de arreglarlo, vamos… Habría quien diría incluso que, sabedores de que este tipo de medias causan mucho revuelo y ocupan muchos minutos en los medios, han utilizado esta medida (y otras muchas cosas), como cortina de humo para que la gente no preste atención a lo realmente importante. Quién sabe… &lt;/p&gt;  &lt;p&gt;En fin, qué país más ridículo… O más bien… Qué gobernantes más paquetes… Si primara la inteligencia a la hora de elegir a nuestros representantes, otro gallo nos cantara… &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Guiño" src="http://lh4.ggpht.com/-aC4rMnbqGFw/TgmaaqyEPrI/AAAAAAAABEc/koJC90QUdlg/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;h4&gt;Anexo I - Segunda comprobación&lt;/h4&gt;  &lt;p&gt;Por si alguien tiene dudas, vamos a hacer el cálculo de otra forma:&lt;/p&gt;  &lt;p&gt;Los 450 Millones de Euros ahorrados según el gobierno, son unos 6.5 Millones de barriles al precio actual, lo que corresponde al consumo TOTAL de petróleo en España durante 4.39 días. Dado que la medida ha estado implantada 120 días, según el gobierno hemos ahorrado un 3.65 % del total de petróleo consumido, lo cual, como es lógico, también es más o menos 15 veces más que el 0.25 % que calculamos en nuestro post inicial.&lt;/p&gt;  &lt;h4&gt;Anexo II - Segunda conclusión&lt;/h4&gt;  &lt;p&gt;Aunque yo estuviera equivocado en todo, que no lo creo, en la segunda comprobación hemos calculado que el ahorro que ahora predica el gobierno, supone un ahorro porcentual del 3.65 %. Por lo tanto, incluso si ahora estuvieran diciendo la verdad:&lt;/p&gt;  &lt;p align="center"&gt;¿Donde quedaron aquellos maravillosos 11% o incluso 15% que nos prometieron al imponer la restricción?&lt;/p&gt;  &lt;p&gt;Además, sigo pensando que ni de lejos el ahorro alcanza un 3.65%, sino que los números de nuestro primer post siguen siendo válidos, y el ahorro real rondará más los 30 millones citados arriba que los 450. &lt;/p&gt;  &lt;h4&gt;Anexo III – Tercera conclusión&lt;/h4&gt;  &lt;p&gt;Fijaos cómo son los gobernantes que tenemos actualmente. Son unos auténticos maestros del &lt;em&gt;maquillaje matemático&lt;/em&gt;. Anunciaron que iban a ahorrar un 15% del petróleo consumido. Eso hubiera supuesto un ahorro aproximado de 1.867.320.000 € (mil ochocientos y pico millones de euros). &lt;/p&gt;  &lt;p&gt;Como esa cifra, evidentemente, no se la creería nadie, se olvidan del porcentaje que dijeron. Pero entonces tienen un problema, porque si dicen un porcentaje menor, todo el mundo se va a dar cuenta de que se equivocaron (o mintieron). ¿Qué hacen entonces? Muy fácil, así como cuando implantaron la medida, todo lo dijeron en porcentajes, ahora que toca evaluarla, no utilizan los porcentajes ni una sola vez. Solo hablan de cifras absolutas, en Euros. &lt;/p&gt;  &lt;p&gt;De este modo, utilizando unidades diferentes, casi nadie puede relacionar las cifras actuales con las iniciales, porque casi nadie se molesta en investigar cuánto petróleo se consume en España. Así, consiguen que casi nadie se de cuenta del tremendo “error” (por llamarlo de alguna forma) que cometieron. &lt;/p&gt;  &lt;p&gt;Pero claro, evaluar el éxito de su medida en cifras absolutas tiene un problema, porque a diferencia de los porcentajes, todo el mundo es capaz de evaluar cuánto son 31 millones de Euros. Y sinceramente, haber movilizado a medio país para ahorrar 31 millones (que aunque parezcan mucho a título individual, a nivel nacional probablemente no justificarían semejante movida), pues qué queréis que os diga... ¿Qué hacen para no quedar mal? Pues nada… donde dije 31, digo 450 y arreglado.&lt;/p&gt;  &lt;p&gt;Así queda mucho mejor, hombre… Donde va a parar. &lt;/p&gt;  &lt;p&gt;Lo cierto es que cada vez veo más claro que lo único que les importa es cómo quedan ante la opinión pública. Si pierden o ganan votos. Todo lo demás, como la verdad, queda en un segundo plano… ¡Ojala el Gobierno publique un informe detallado donde demuestre que me equivoco en todo! ¡Ojala!&lt;/p&gt;  &lt;p&gt;Quizá así recobraría un poquito de confianza en los políticos que nos dirigen…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-2455869631145783193?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/2455869631145783193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=2455869631145783193' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/2455869631145783193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/2455869631145783193'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/06/vueltas-con-el-retorno-de-los-120-kmh.html' title='A vueltas con el retorno de los 120 km/h'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-aC4rMnbqGFw/TgmaaqyEPrI/AAAAAAAABEc/koJC90QUdlg/s72-c/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-8154268235737280812</id><published>2011-06-21T14:16:00.001+01:00</published><updated>2011-06-21T14:16:48.700+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cars'/><category scheme='http://www.blogger.com/atom/ns#' term='Simax'/><category scheme='http://www.blogger.com/atom/ns#' term='Graphics AND 3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Sports Driving'/><category scheme='http://www.blogger.com/atom/ns#' term='MotorSport'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><category scheme='http://www.blogger.com/atom/ns#' term='Circuito de Navarra'/><title type='text'>Simax F1 Simulator</title><content type='html'>&lt;p&gt;Today, we have released an introductory video of the next challenge we are facing here at &lt;a href="http://www.simaxvirt.com/"&gt;Simax&lt;/a&gt;: take our technology to the F1 racing field. &lt;/p&gt;  &lt;p&gt;In this case, we are developing a replica of the Renault R30: a 2.4L V8 engine which reaches 19.000 rpm and almost 900 hp, for less than 600 Kg… Awesome! &lt;/p&gt;  &lt;p&gt;Hope you like it…&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 562px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:5da41c60-f299-474e-a826-5e4858419edc" class="wlWriterEditableSmartContent"&gt;&lt;div id="1ac24c25-7938-43b7-b2a0-63200365cf90" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=jl4vK3PCDlw" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/-KM_XiZRCGgM/TgCZs7R7jyI/AAAAAAAABEY/TFdr87xWI-Q/videob82fc337302d%25255B12%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('1ac24c25-7938-43b7-b2a0-63200365cf90'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;562\&amp;quot; height=\&amp;quot;315\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/jl4vK3PCDlw?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/jl4vK3PCDlw?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;562\&amp;quot; height=\&amp;quot;315\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-8154268235737280812?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/8154268235737280812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=8154268235737280812' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/8154268235737280812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/8154268235737280812'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/06/simax-f1-simulator.html' title='Simax F1 Simulator'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-KM_XiZRCGgM/TgCZs7R7jyI/AAAAAAAABEY/TFdr87xWI-Q/s72-c/videob82fc337302d%25255B12%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-4394287527133724691</id><published>2011-06-15T10:46:00.001+01:00</published><updated>2011-06-15T10:46:06.241+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cars'/><category scheme='http://www.blogger.com/atom/ns#' term='Simax'/><category scheme='http://www.blogger.com/atom/ns#' term='Direct3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Sports Driving'/><category scheme='http://www.blogger.com/atom/ns#' term='MotorSport'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><category scheme='http://www.blogger.com/atom/ns#' term='Circuito de Navarra'/><title type='text'>A Porshce 911 S at the Simax Simulator</title><content type='html'>&lt;p&gt;Today, we have released a couple of videos of a lap to the &lt;a href="http://www.circuitodenavarra.com/"&gt;Circuit of Navarra&lt;/a&gt;, with a Porsche 911 S in the &lt;a href="http://www.simaxvirt.com/"&gt;Simax Simulator&lt;/a&gt;. You can check them out at YouTube (FullHD 1080p recommended):&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:b924f30b-f75b-4b11-b88a-305bdb8c6932" class="wlWriterEditableSmartContent"&gt;&lt;div id="6f4017c9-ea67-49a9-adb3-c19af4f67f19" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=OfZ0qAvug28" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/-Wk709hsuH64/Tfh_WyeOXyI/AAAAAAAABEM/fwkbdfgLJJE/video23a48ce075c5%25255B7%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('6f4017c9-ea67-49a9-adb3-c19af4f67f19'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/OfZ0qAvug28?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/OfZ0qAvug28?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="width:448px;clear:both;font-size:.8em"&gt;TCS and ESP are ON&lt;/div&gt;&lt;/div&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:c8a74c55-fa0f-427c-b4db-63609a0e3f5b" class="wlWriterEditableSmartContent"&gt;&lt;div id="ca8d1a5e-da93-4f93-a165-57f097849527" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=10r04AFszQ4" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/-OcZqfJzkJf0/Tfh_XaPc0BI/AAAAAAAABEQ/KL8_68Ag4Ek/video7b0ae679a10b%25255B4%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('ca8d1a5e-da93-4f93-a165-57f097849527'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/10r04AFszQ4?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/10r04AFszQ4?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="width:448px;clear:both;font-size:.8em"&gt;TCS and ESP are OFF&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-4394287527133724691?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/4394287527133724691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=4394287527133724691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/4394287527133724691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/4394287527133724691'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/06/porshce-911-s-at-simax-simulator.html' title='A Porshce 911 S at the Simax Simulator'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-Wk709hsuH64/Tfh_WyeOXyI/AAAAAAAABEM/fwkbdfgLJJE/s72-c/video23a48ce075c5%25255B7%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-5148245794244304586</id><published>2011-05-31T10:18:00.000+01:00</published><updated>2011-05-31T10:22:30.502+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><title type='text'>Battery charging problems on Samsung Focus (Windows Phone 7)</title><content type='html'>&lt;p&gt;Yesterday, my Samsung Focus stopped working properly. &lt;/p&gt;  &lt;p&gt;I plugged it to the wall for hours, the battery icon showed that it was plugged, but the battery level did not raise. If I unplugged the phone, an immediate message of “Battery critically low” appeared. &lt;/p&gt;  &lt;p&gt;After reading some posts, I realized that the battery was in fact being charged, but the OS was not “reading” the battery level correctly. &lt;/p&gt;  &lt;p&gt;In my case, as in many others, it was fixed by simply entering the Diagnostics mode of the Samsung Focus, to directly read the “actual” battery level. After that, everything is back to normality.&lt;/p&gt;  &lt;p&gt;1.- To enter Diagnostics mode, open the phone keypad and enter: ##634#&lt;/p&gt;  &lt;p&gt;2.- To access battery information (and others), type *#2*# in the next keypad that will appear.&lt;/p&gt;  &lt;p&gt;And that´s all.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-5148245794244304586?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/5148245794244304586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=5148245794244304586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/5148245794244304586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/5148245794244304586'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/05/battery-charging-problems-on-samsung.html' title='Battery charging problems on Samsung Focus (Windows Phone 7)'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-6150480965569362556</id><published>2011-05-24T12:22:00.001+01:00</published><updated>2011-05-24T12:23:31.010+01:00</updated><title type='text'>El poder del cerebro positivo</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 9px 0px 0px; display: inline; float: left" align="left" src="http://t2.gstatic.com/images?q=tbn:ANd9GcTDGFjB76OaWoiPZq3vzoxYeZ-FIssCxXeNcWojdQr0LNE12ouhMg" width="189" height="267" /&gt;No siempre se aprende algo en el cine, pero es cierto que a veces, si sucede. En mi caso, fue en el año 1993, en la increíble película &amp;quot;&lt;a href="http://www.imdb.com/title/tt0106489/"&gt;Una historia del Bronx - A Bronx tale&lt;/a&gt;&amp;quot; donde aprendí una lección que, hasta hoy, me ha sido muy útil en la vida.&lt;/p&gt;  &lt;p&gt;Transcurría la película describiendo la vida de varios gangsters, entre los que se encontraban un &amp;quot;capo&amp;quot; y su joven aprendiz, llamado &amp;quot;C&amp;quot;. En una escena, aparecía otro chaval, que por lo visto debía dinero al joven. Cada vez que lo veía, corría detrás de él, insultándole y reclamándole la deuda a gritos. Cuando el &amp;quot;capo&amp;quot; vio la escena, le preguntó: &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;gt;&amp;gt; &amp;quot;Qué haces?&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;gt;&amp;gt; &amp;quot;Ese chico me debe 40 dólares desde hace tres semanas&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;gt;&amp;gt; &amp;quot;Bueno, pues olvídalo...&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;El no podía creer que un gangster le aconsejara no reclamar lo que le debían, por lo que le replicó: &lt;em&gt;&amp;quot;Que lo olvide?... Estás hablando en serio?&amp;quot; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;A lo que el gangster le contestó... &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;quot;Míralo de este modo... Si lo olvidas, solo te costará 40 dólares deshacerte de un problema que lleva semanas martirizándote...&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Por aquel entonces yo solo tenía 15 años, pero esa forma de razonar me llamó mucho la atención. Simplemente me pareció muy cierto. Era algo sano, y mentalmente higiénico. Por un pequeño precio, te quitabas de encima un buen problema. Solo tenías que hacer algo que muchas veces nos resulta muy difícil: &lt;strong&gt;renunciar a tu orgullo&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;El orgullo, es uno de los Egos que más capacidad tiene para entorpecer nuestro crecimiento espiritual, y por tanto, para hacernos infelices. &lt;/p&gt;  &lt;p&gt;Aunque esto parezca algo de Perogrullo, no todo el mundo lo ve así... Hay gente que, herida por la ofensa de que alguien le deba 40 dólares, y totalmente guiada por su orgullo, prefiere estar durante años sufriendo el problema...&lt;/p&gt;  &lt;p&gt;Hoy, gracias a &lt;a href="http://elmoderador.wordpress.com/2011/04/09/la-felicidad-segun-harvard/"&gt;este link&lt;/a&gt;, he descubierto algunos videos que me han recordado aquello. Se trata de una serie de conferencias de Shawn Achor, investigador de Harvard, con algunas conclusiones en esa línea muy interesantes.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 366px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:c1fcfba0-40d5-4d7a-9735-a7db17908fc9" class="wlWriterEditableSmartContent"&gt;&lt;div id="a992fd4b-1c3b-4f8e-b0a3-3e88c73b9390" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=r8DngXKtvEQ&amp;amp;feature=player_embedded" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/_NiFMuxzz-JE/TduU9DwmblI/AAAAAAAABEA/UvbncULPAFU/video5f67e64e0a86%5B22%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('a992fd4b-1c3b-4f8e-b0a3-3e88c73b9390'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;366\&amp;quot; height=\&amp;quot;204\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/r8DngXKtvEQ?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/r8DngXKtvEQ?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;366\&amp;quot; height=\&amp;quot;204\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 361px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:96793d51-1dc4-4ba9-9847-72ccfbfdab9d" class="wlWriterEditableSmartContent"&gt;&lt;div id="656baaa7-85af-47bd-80fc-1d55cda55347" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=3I6YJtq2Oqk&amp;amp;feature=player_embedded" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_NiFMuxzz-JE/TduU9S14e0I/AAAAAAAABEE/y7J6d0sO8GU/video6386fbeb7116%5B22%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('656baaa7-85af-47bd-80fc-1d55cda55347'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;361\&amp;quot; height=\&amp;quot;202\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/3I6YJtq2Oqk?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/3I6YJtq2Oqk?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;361\&amp;quot; height=\&amp;quot;202\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 358px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:4aa8132f-8119-464d-bca0-d55c44d66da5" class="wlWriterEditableSmartContent"&gt;&lt;div id="3d9e5f30-0071-4d8a-a7c7-de661982ac44" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=vQt_WNewOKs&amp;amp;feature=player_embedded" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/_NiFMuxzz-JE/TduU96O3ajI/AAAAAAAABEI/X52fr-Ril-U/video95efafc25d0f%5B22%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('3d9e5f30-0071-4d8a-a7c7-de661982ac44'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;358\&amp;quot; height=\&amp;quot;198\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/vQt_WNewOKs?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/vQt_WNewOKs?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;358\&amp;quot; height=\&amp;quot;198\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;h3&gt;Un resumen de sus conclusiones&lt;/h3&gt;  &lt;p&gt;1.- La felicidad no es un estado natural. La felicidad se aprende, se trabaja y se practica. &lt;/p&gt;  &lt;p&gt;2.- Factores externos como la pobreza, la salud o las desgracias personales, solo afectan a la felicidad en un 10%. ¿Quién no ha conocido a una persona tremendamente pobre y a nuestros ojos muy desgraciada, que sin embargo es totalmente feliz?. Y por el contrario, ¿quién no ha conocido algún caso de un exitoso millonario, con salud y familia, que termina suicidándose?. Otros factores como las relaciones humanas, la amistad y el amor, tienen un impacto mucho más remarcable en nuestro nivel de felicidad.&lt;/p&gt;  &lt;p&gt;3.- Cuando vivimos una experiencia, y luego la recordamos o pensamos en ello, en nuestro cerebro se activan las mismas zonas. Esto quiere decir que para nuestro cerebro no hay mucha diferencia entre vivir algo de verdad, recordarlo o imaginarlo. Y esto es algo realmente importante, ya que precisamente por eso, recordar las cosas buenas que nos pasan, es casi tan beneficioso como vivirlas de nuevo. Duplicamos la experiencia positiva. Del mismo modo, recordar una y otra vez las negativas, es casi tan dañino como vivirlas de nuevo. Para nuestro cerebro no hay mucha diferencia.&lt;/p&gt;  &lt;p&gt;4.- Si ponemos todas las comidas “malas” en un estante alto y las “buenas” a la altura del brazo, a la larga incrementaremos el número de veces que comemos sano. Lo mismo pasa con los sentimientos. Curiosamente, a veces hacemos lo contrario: poner al alcance de nuestra mano lo malo, recordando más fácilmente las malas experiencias, cuando en realidad no hay ningún motivo para darles prioridad sobre las buenas. De esta forma, si tratamos de dar un poquito de prioridad a los recuerdos positivos y felices, estaremos duplicando las experiencias positivas, y por lo tanto estaremos aumentando sin quererlo nuestro nivel de felicidad.&lt;/p&gt;  &lt;p&gt;5.- El éxito no da la felicidad. Es la felicidad la que conduce al éxito. La gente vive pensando “si consigo la meta de ventas seré feliz”, “si subo las notas seré feliz”, “si pierdo esos kilos seré feliz”: primero el éxito, después la felicidad. Pero esta fórmula está al revés. Cuando se consigue una meta, rápidamente aparecen otras y la felicidad se pospone una y otra vez. Es el enfoque contrario al que deberíamos plantearnos. Primero aprende a ser feliz. Después te será mucho más fácil lograr tus metas.&lt;/p&gt;  &lt;p&gt;6.- La felicidad afecta notablemente a tu rendimiento: Según estudios realizados por el equipo de Shawn Achor, si cuando vas a acometer una tarea te sientes feliz, tienes un 50% más de posibilidades de tener éxito desempeñando dicha tarea. Y ese porcentaje se repite en niños y adultos, de distinta procedencia y formación.&lt;/p&gt;  &lt;h3&gt;En la práctica, ¿qué puedo hacer para incrementar mi nivel de felicidad? &lt;/h3&gt;  &lt;ol&gt;   &lt;li&gt;1.- Cada mañana, anota 5 cosas por las que te muestras agradecido. Según Shawn Achor, hacer esto durante 30 segundos cada mañana, mejorará tu nivel de felicidad en las próximas 24 horas. Y si lo haces durante 21 días seguidos, mejorarás tu nivel de felicidad para los 6 meses siguientes. Merece la pena, ¿no?. &lt;/li&gt;    &lt;li&gt;2.- Escribir durante 3 minutos, todos los días, acerca de las experiencias positivas que te han sucedido en el día. &lt;/li&gt;    &lt;li&gt;3.- Simplificar, tratar de no ser multi-tarea. Serás más feliz si haces más cosas, pero una a una, no varias a la vez, ya que eso incrementa tu nivel de estrés. &lt;/li&gt;    &lt;li&gt;4.- Identifica y utiliza tus puntos fuertes, donde más valor aportas a las cosas. Eso te dará más energía y confianza, e incrementará el éxito que tengas en todo lo que hagas. No te centres demasiado en tus puntos débiles. &lt;/li&gt;    &lt;li&gt;5.- Ejercicio físico. Es tan efectivo como antidepresivo, como los propios antidepresivos. &lt;/li&gt;    &lt;li&gt;6.- Meditación. Concéntrate y visualiza tu respiración, entrando y saliendo de tu cuerpo. Vas a respirar de todas formas, así que quizá merezca la pena probar. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Tomar como costumbre estos 6 sencillos ejercicios hace que tu cerebro dedique más recursos a fijarse en las cosas buenas que hay en tu vida, más que en las que te estresan, o son negativas de algún modo. Según Shawn Achor, el cerebro es mucho más maleable de lo que pensábamos.&lt;/p&gt;  &lt;h3&gt;Conclusión&lt;/h3&gt;  &lt;p align="center"&gt;&lt;em&gt;En definitiva, la felicidad hay que trabajarla, y solo se consigue educando al cerebro para dar más relevancia a los sentimientos felices, a los recuerdos positivos, por encima de los pensamientos negativos o de los miedos. Es un proceso lento, que lleva años, además de imperceptible, ya que no supone un cambio radical, de un día para otro. Poco a poco, día a día, vas conquistando gramito a gramito la felicidad.&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-6150480965569362556?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/6150480965569362556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=6150480965569362556' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/6150480965569362556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/6150480965569362556'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/05/el-poder-del-cerebro-positivo.html' title='El poder del cerebro positivo'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_NiFMuxzz-JE/TduU9DwmblI/AAAAAAAABEA/UvbncULPAFU/s72-c/video5f67e64e0a86%5B22%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-2773825750873673711</id><published>2011-05-20T09:58:00.001+01:00</published><updated>2011-05-20T10:00:15.058+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Silver Navigator'/><title type='text'>Silver Navigator 1.2 released !</title><content type='html'>&lt;p&gt;Hi there! &lt;/p&gt;  &lt;p&gt;Silver Navigator, ranking top downloads in many countries around the world, is ready for an update, as version 1.2 has just passed through the certification process in the Windows Phone Marketplace. So it´s ready for download!! &lt;/p&gt;  &lt;p&gt;This new version includes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Local Searches: hotels, restaurants, shops... (might not be available in all countries)&lt;/li&gt;    &lt;li&gt;Map rotation&lt;/li&gt;    &lt;li&gt;Voices volume increased&lt;/li&gt;    &lt;li&gt;Some minor bug fixes&lt;/li&gt;    &lt;li&gt;And much more…&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can follow Silver Navigator 1.2 &lt;a href="http://www.facebook.com/#!/pages/Silver-Navigator-for-Windows-Phone-7/101295386623246"&gt;here&lt;/a&gt;, and download it from &lt;a href="http://social.zune.net/redirect?type=phoneApp&amp;amp;id=91f99807-0957-e011-854c-00237de2db9e"&gt;this Zune Link&lt;/a&gt;.&lt;/p&gt;   &lt;a href="http://lh6.ggpht.com/_NiFMuxzz-JE/TdYtTr75ywI/AAAAAAAABDs/cbrxZal5rvU/s1600-h/ArtWork2_1000x800%5B6%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="ArtWork2_1000x800" border="0" alt="ArtWork2_1000x800" src="http://lh4.ggpht.com/_NiFMuxzz-JE/TdYtUhyfXhI/AAAAAAAABDw/8ieslNDU-eA/ArtWork2_1000x800_thumb%5B4%5D.png?imgmax=800" width="563" height="370" /&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-2773825750873673711?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/2773825750873673711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=2773825750873673711' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/2773825750873673711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/2773825750873673711'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/05/silver-navigator-12-released.html' title='Silver Navigator 1.2 released !'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_NiFMuxzz-JE/TdYtUhyfXhI/AAAAAAAABDw/8ieslNDU-eA/s72-c/ArtWork2_1000x800_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-1328558093335461906</id><published>2011-05-16T10:21:00.001+01:00</published><updated>2011-05-16T10:21:05.224+01:00</updated><title type='text'>A vueltas con la limitación de 110 km/h</title><content type='html'>&lt;p&gt;Creo que hay bastante confusión con la medida implantada por el gobierno, de reducir el limite de velocidad a 110km/h en autovías y autopistas. Hay cierta información que mucha gente ignora, y que creo debe conocer, para estar al tanto del impacto real de esta medida. &lt;/p&gt;  &lt;p&gt;Según este artículo de &lt;a href="http://www.elmundo.es/elmundo/2011/02/25/espana/1298641194.html"&gt;El Mundo&lt;/a&gt;, el gobierno afirma que aplica esta medida para reducir la dependencia del petróleo, y que con ella va a conseguir reducciones en el consumo de carburantes de entre un 15% y un 11%. &lt;/p&gt;  &lt;p&gt;Según un estudio de DIW elaborado en 1996, si en Alemania se redujera el límite de velocidad a 100 Km/h en autopistas, se lograría una reducción del 4.8% en el consumo del transporte privado. Así que, si en Alemania, que normalmente se circula por autopistas a velocidades muy superiores a las de aquí, se pusiera un límite todavía más restrictivo que el nuestro, ahorrarían un 4.8%. Pero aquí, como por lo visto somos más listos que nadie, vamos a ahorrar un 15%. &lt;/p&gt;  &lt;p&gt;Además, en ese informe deja bien claro que se refiere únicamente del consumo para transporte privado, mientras que aquí se ha jugado mucho a la ambigüedad a la hora de especificar “de qué” se va a ahorrar un 15%, dejando a mucha gente pensar que se está reduciendo un 15% la dependencia total del petróleo, algo que es simple y llanamente falso.&lt;/p&gt;  &lt;h4&gt;¿Cual es la reducción real en la dependencia del petróleo?&lt;/h4&gt;  &lt;p&gt;Según este &lt;a href="http://www.iea.org/textbase/nppdf/free/2005/SavingOil.pdf"&gt;informe de la Agencia Internacional de la Energía&lt;/a&gt; (que recomiendo a todo el mundo leer), de los 307.278.000 barriles de petróleo que consumió España en el año 2001, solo 207.175.000 fueron utilizados para transporte por carretera, es decir, un 67%. &lt;/p&gt;  &lt;p&gt;Pero la medida aplicada por el gobierno solo afecta a turismos, ya que el resto de vehículos (industriales, camiones, agrícolas, autobuses,...) no podían circular a 120kmh de todas formas. Según ANFAC, de los 28 millones de vehículos que hay en España, solo el 75% son turismos. &lt;/p&gt;  &lt;p&gt;Pero lo que nos importa es el consumo, y dado que los turismos consumen de media más o menos la mitad que el resto de vehículos más pesados, podemos decir que solo el 50% del combustible destinado a transporte por carretera es consumido por turismos. Por lo tanto, del 100% de petróleo importado en España, solo el 33.5% es utilizado por turismos.&lt;/p&gt;  &lt;p&gt;Pero sigamos un poco más, ya que esa medida solo se aplica a autovías/autopistas, y lógicamente no todos los turismos están siempre circulando por vías con limitación de 120 km/h. De hecho, según el IDAE, solo el 20% de los kilómetros que se ruedan en España, se hacen en vías limitadas a 120 km/h. Por lo tanto, del total de petróleo que se importa en España, solo el 6.7 % es consumido por turismos que ruedan en autovías o autopistas limitadas a 120 km/h.&lt;/p&gt;  &lt;p&gt;Pero aún hay más... ¿Cuántos, de los turismos que circulan por autovías, respetan el límite de 110 Km/h? Según el IEA, en Europa solo respetan los límites entre un 30% y un 60% de los conductores. Para que no me tachen de parcial, voy a ser muy muy optimista, y voy a decir que el 80% circulan a 110. Eso nos deja con que del total de petróleo consumido por España, &lt;strong&gt;solo el 5.36 %&lt;/strong&gt; es consumido por vehículos a los que les afecta la medida implantada por el gobierno.&lt;/p&gt;  &lt;p&gt;Ahora y no antes, es el momento de aplicar las cifras publicadas por el gobierno... Por cierto, ¿de dónde sacó esos datos el Sr. Rubalcaba? Es bastante fácil deducirlo, aunque dudo que el Sr. Rubalcaba y compañía se leyeran el informe de la &lt;em&gt;IEA&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Fijaos: como dicen &lt;a href="http://www.escolar.net/MT/archives/2011/02/%C2%BFcuanto-se-ahorra-con-los-110-kmh.html"&gt;aqui&lt;/a&gt;, según estadísticas del IDAE, el consumo medio de un coche de gasolina en España cuando circula a 120 km/h es de 8,58 litros cada cien kilómetros. A 110 km/h, el consumo baja a los 7,64 litros. En cuanto al diesel, el consumo medio de un coche de gasóleo en España es de 6,09 litros a 120 km/h. A 110 km/h, el consumo baja a 5,42 litros. En ambos casos, la reducción es más o menos del 11%. Así que, llega el político de turno, y dice que van a reducir el consumo de carburantes en un 15%. ¡Já!&lt;/p&gt;  &lt;p&gt;En primer lugar, esas estadísticas hablan de la reducción a velocidad constante, de 120kmh o de 110kmh. Pero como bien dicen en el informe del IEA, el consumo en conducción real, está muy afectado por aceleraciones, frenadas, incorporaciones, etc. En dicho informe, se aplica un 50% de margen de error debido a estos factores. Así que ese 11% deberíamos reducirlo a la mitad, pero como somos muy buenos, y nuevamente para que no nos tachen de parciales, lo dejaremos como está.&lt;/p&gt;  &lt;p&gt;Volvamos donde estábamos… De ese 5.36% de petróleo consumido por España al que le afecta la famosa medida, vamos a ahorrar un 11%. Así que, finalmente, la reducción de la dependencia del petróleo, gracias a la medida del gobierno se cifra en un &lt;strong&gt;&lt;font size="4"&gt;0.5%.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Del 15%, nasti de plasti señores... &lt;/p&gt;  &lt;p&gt;Claro que ahora nos dirán algo del estilo a… “noooo… es queeee… nosotros nos referíamos a que íbamos a ahorrar el 15%, pero únicamente del petróleo usado por coches verdes o azules, comprados en enero o febrero de 2010, y que circulan únicamente entre Burgos y Valladolid…”&lt;/p&gt;  &lt;p&gt;Yo no digo que no apliquen esa medida. Solo pido que no nos mientan, y que cuenten las cosas como son…&lt;/p&gt;  &lt;h4&gt;Conclusiones&lt;/h4&gt;  &lt;p&gt;&lt;strong&gt;¿Es una medida eficaz?&lt;/strong&gt; Pues más bien poco... Lo que realmente sería eficaz, según &lt;em&gt;IEA,&lt;/em&gt; es reducir la velocidad hasta 90 Km/h, no a 110. El impacto de una reducción a 110 es mínimo. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;¿Hay medidas más eficaces?&lt;/strong&gt; Por supuesto. Aunque se redujera la velocidad a 90 Km/h (siendo esta medida mucho más eficaz), solo estaría en el tercer puesto del ranking de medidas más eficaces. Ver sig. tabla, con el ahorro potencial en barriles, sin tener en cuenta el coste de cada medida:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_NiFMuxzz-JE/Tc0P4gl7rnI/AAAAAAAABDg/4bEv6_yyJ8s/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_NiFMuxzz-JE/Tc0P5X9fy_I/AAAAAAAABDk/YhXvNgfE8pw/image_thumb%5B1%5D.png?imgmax=800" width="384" height="400" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;Figura: Ranking de ahorro conseguido con distintas medidas, promediado para todos los países del estudio&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Si tenemos en cuenta el factor &lt;strong&gt;Coste-Efectividad&lt;/strong&gt; de las medidas, y según las propias conclusiones del informe de la &lt;em&gt;IEA, &lt;/em&gt;no son recomendables las medidas que requieran una gran inversión en infraestructura, como la construcción de nuevos carriles de tipo &lt;a href="http://en.wikipedia.org/wiki/Carpool"&gt;CarPool&lt;/a&gt;, o las relacionadas con incrementar la frecuencia del transporte público o reducir su precio. &lt;/p&gt;  &lt;p&gt;Según ellos, es más eficiente re-asignar carriles ya existentes como carriles &lt;a href="http://en.wikipedia.org/wiki/Carpool"&gt;CarPool&lt;/a&gt;, aunque en España, que casi todas las autovías son de 2 carriles, sería complicado. Este informe dice claramente que el beneficio (según el coste-efectividad) de las limitaciones de velocidad es, simplemente, moderada. Y eso que ellos hablan de una reducción mucho más drástica y con mucho más impacto en el consumo que la aplicada aquí.&lt;/p&gt;  &lt;p&gt;Su conclusión es clara… Sorpresa sorpresa… Nadie se imaginaba esto?&lt;/p&gt;  &lt;p&gt;“Las medidas más efectivas, en relación a su coste, son claramente aquellas que pueden ser implementadas con campañas de información al ciudadano. Campañas formativas y de concienciación de ECO-Driving.”&lt;/p&gt;  &lt;p&gt;Por último, terminan diciendo algo extremadamente importante que los políticos Españoles parecen olvidar siempre:&lt;/p&gt;  &lt;p&gt;“Aunque medidas como la limitación de velocidad pueden tener un muy buen impacto en la reducción de la siniestralidad en carretera, no se han tenido en cuenta en este estudio algunos costes derivados de estas medidas que pueden ser potencialmente importantes, como los incrementos en el tiempo de viaje”. &lt;/p&gt;  &lt;p&gt;Ahora, que cada uno saque sus propias conclusiones… &lt;/p&gt;  &lt;p&gt;Más información &lt;a href="http://www.iea.org/textbase/nppdf/free/2005/SavingOil.pdf"&gt;aqui&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-1328558093335461906?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/1328558093335461906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=1328558093335461906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/1328558093335461906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/1328558093335461906'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/05/vueltas-con-la-limitacion-de-110-kmh.html' title='A vueltas con la limitación de 110 km/h'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_NiFMuxzz-JE/Tc0P5X9fy_I/AAAAAAAABDk/YhXvNgfE8pw/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-2840398282051871719</id><published>2011-05-12T14:37:00.000+01:00</published><updated>2011-05-13T21:26:42.867+01:00</updated><title type='text'>Pienso, luego comparto, respeto, y aprendo…</title><content type='html'>&lt;p&gt;La justicia, la solidaridad, el respeto a nuestro entorno y a los demás, no son cuestión de valores, creencias ni moralidad. Es una cuestión de pura lógica. &lt;/p&gt;  &lt;p&gt;Si crees que puedes acumular riqueza hasta lo obsceno, mientras tu vecino de al lado se muere de hambre, o si crees que puedes aplastar al planeta hasta convertirlo en un árido páramo, es que eres más tonto que un mono. Y he aquí la prueba...&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 448px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:07f6a978-bf87-4831-b2c7-5028f7f4f2c1" class="wlWriterEditableSmartContent"&gt;&lt;div id="1f32b94c-fa3f-4c94-81ae-db145d16c6a9" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=9YSpzgRYn_U&amp;amp;feature=player_embedded" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_NiFMuxzz-JE/Tcvihez44EI/AAAAAAAABDY/xfgqaCRS7zc/video22d693f4e120%5B56%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('1f32b94c-fa3f-4c94-81ae-db145d16c6a9'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/9YSpzgRYn_U?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/9YSpzgRYn_U?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Si estudiaste física en el colegio, habrás oído hablar de la &lt;a href="http://es.wikipedia.org/wiki/Conservaci%C3%B3n_de_la_energ%C3%ADa"&gt;Ley de Conservación de la Energía&lt;/a&gt;, que viene a decirnos que la energía ni se crea ni se destruye, solo se transforma. Este es sin duda un concepto muy interesante, y francamente revelador, ya que es una prueba más (entre otras muchas) de que, físicamente, el desequilibrio no existe. &lt;/p&gt;  &lt;p&gt;No es algo tan difícil de entender. De hecho, lo vemos a diario en todo lo que nos rodea: en las matemáticas, en la física, en la naturaleza: &lt;b&gt;todo desequilibrio es compensado para que el resultado final esté balanceado, a todos los niveles&lt;/b&gt;. &lt;/p&gt;  &lt;p&gt;Dicho de otra forma, es una constante en nuestro universo que si se modifica el estado de un sistema, creando un (aparente) desequilibrio, inevitablemente se generarán reacciones contrarias que balancean la ecuación. Y esto es aplicable a todos los niveles del conocimiento, de la naturaleza y del universo.&lt;/p&gt;  &lt;p&gt;El problema es que prácticamente nada es infinito (quizá, como dijo Einstein, solo la estupidez humana). Por lo tanto, es evidente que estas reacciones contrarias de balanceo tampoco lo son. En algunos casos aguantan más, y en otros menos, pero está claro que tienen un límite. Por tanto... ¿qué sucede cuando la fuerza desestabilizadora en un sistema es excesiva (en intensidad, duración o ambas), y la reacción contraria balanceadora no es capaz de equilibrar dicho sistema?&lt;/p&gt;  &lt;p&gt;En estos casos, &lt;strong&gt;siempre&lt;/strong&gt; &lt;strong&gt;se produce un evento violento y agresivo que de forma brusca corrige el desequilibrio&lt;/strong&gt;. Es una medida correctora, que a menudo de forma brutal, devuelve las cosas a su estado de reposo natural.&lt;/p&gt;  &lt;p&gt;Hay miles de ejemplos. &lt;/p&gt;  &lt;p&gt;En un globo que vamos hinchando, por ejemplo: hay una fuerza desestabilizadora (el aire que empuja hacia afuera) y una fuerza balanceadora (la goma del globo, que gracias a sus propiedades elásticas, ejerce una fuerza hacia adentro, conteniendo el aire y manteniendo el sistema equilibrado). Si hinchamos demasiado el globo, llega un momento que la capacidad de la goma elástica para balancear el sistema se agota. La fuerza del aire es mayor que la del globo, por lo que el sistema se desequilibra. ¿Qué sucede entonces? Pues que el globo explota: un evento violento y agresivo que corrige la situación de forma brusca, permitiendo al sistema volver a su estado de reposo natural. El aire se dispersa, y todo permanece equilibrado.&lt;/p&gt;  &lt;p&gt;Esto no solo es aplicable a la física. Es un concepto universal que sirve para todo. &lt;/p&gt;  &lt;p&gt;Una sociedad, por ejemplo, no es más que otro sistema, donde también existen estos estados de reposo, fuerzas equilibradoras, y desestabilizadoras. Como bien explican en &lt;a href="http://www.somosprimates.com/2010/11/las-ventajas-de-ser-justo-1/"&gt;Las ventajas de ser justo&lt;/a&gt; (&lt;a href="http://www.somosprimates.com/2010/11/las-ventajas-de-ser-justo-1/"&gt;parte I&lt;/a&gt; y &lt;a href="http://www.somosprimates.com/2010/11/las-ventajas-de-ser-justo-y-2"&gt;parte II&lt;/a&gt;), en este tipo de sistemas, una situación de equilibrio o de estado de reposo no puede ser otra más que la equidad entre sus individuos. Equidad en calidad de vida, en bienestar, en compartición de recursos, en responsabilidades y obligaciones… en todo. &lt;/p&gt;  &lt;p&gt;La brutal crisis económica que nos toca vivir no es más que otro evento violento y agresivo que de forma brusca está corrigiendo una situación de desequilibrio insostenible. Las migraciones masivas, la caída de los mercados, el descenso de la seguridad ciudadana, los fanatismos... Siempre tendemos a culpar a los demás por estos terribles sucesos, pero lo cierto es que casi siempre, todo esto no son más que medidas correctoras que el sistema en que vivimos aplica para tratar de paliar los desequilibrios tan masivos que nosotros mismos provocamos.&lt;/p&gt;  &lt;p&gt;La gente se pregunta por qué hay tantas catástrofes naturales en los últimos años. ¡Quién sabe! Puede ser coincidencia o un ciclo natural. Es probable que ni siquiera un climatólogo o un geólogo puedan contestar con certeza a esa pregunta, pero no parece descabellado pensar que el trato que damos a nuestro planeta es también una situación totalmente desequilibrada que el medio-ambiente trata de balancear como puede. Ahora bien, ¿qué pasará cuando agotemos la capacidad del planeta de corregir nuestros abusos?&lt;/p&gt;  &lt;p&gt;La respuesta es clara: medidas correctivas, violentas y bruscas, que devolverán a nuestro sistema a su equilibrio natural…&lt;/p&gt;  &lt;p&gt;Con o sin nosotros…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7840291950242203302-2840398282051871719?l=graphicdna.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graphicdna.blogspot.com/feeds/2840398282051871719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7840291950242203302&amp;postID=2840398282051871719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/2840398282051871719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7840291950242203302/posts/default/2840398282051871719'/><link rel='alternate' type='text/html' href='http://graphicdna.blogspot.com/2011/05/pienso-luego-comparto-respeto-y-aprendo.html' title='Pienso, luego comparto, respeto, y aprendo…'/><author><name>Iñaki Ayucar</name><uri>http://www.blogger.com/profile/16347699878953872956</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_NiFMuxzz-JE/SL2oqJ35sLI/AAAAAAAAARA/FM-LwyWDYPc/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_NiFMuxzz-JE/Tcvihez44EI/AAAAAAAABDY/xfgqaCRS7zc/s72-c/video22d693f4e120%5B56%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7840291950242203302.post-2113733432143996798</id><published>2011-04-27T14:45:00.001+01:00</published><updated>2011-04-27T14:45:47.827+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Direct3D'/><category scheme='http://www.blogger.com/atom/ns#' term='C# 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Graphics AND 3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo de Juegos'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='TheCodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='SlimDX'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net Framework 4'/><title type='text'>Taking advantage of high-level C# features to make our 3D games API or platform independent</title><content type='html'>&lt;p&gt;In the last few years, programming languages and development tools have evolved quite a bit. Visual Studio is a masterpiece nowadays, and things like &lt;a href="http://msdn.microsoft.com/en-us/library/719exd8s(v=vs.80).aspx"&gt;Refactoring&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/43f44291(v=vs.71).aspx"&gt;Intellisense&lt;/a&gt; make our life much easier.&lt;/p&gt;  &lt;p&gt;There are other cool features that can be now used in our code, and that are really appropriate to make our 3D engines API-Independent. I´m talking about &lt;a href="http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx"&gt;Generics&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx"&gt;Extension Methods&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;What is API or platform multi-targeting?&lt;/h4&gt;  &lt;p&gt;Multi-targeting is writing a software (a game, for instance) that can run in different platforms or use different APIs. Of course, we should try to achieve this with the following constraints:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Avoid redundancy as much as possible (as we already saw that &lt;a href="http://graphicdna.blogspot.com/2010/03/you-duplicating-you-wrong.html"&gt;Duplicating is wrong&lt;/a&gt;). &lt;/li&gt;    &lt;li&gt;If possible, introduce no performance overhead at all, or at least try to minimize it &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;When is multi-target necessary?&lt;/h4&gt;  &lt;p&gt;&lt;img style="margin: 0px 15px 0px 0px; display: inline" align="left" src="http://www.ps3vault.com/wp-content/uploads/2006/12/xna-platforms.jpg" width="233" height="173" /&gt;&lt;/p&gt;  &lt;p&gt;It is obviously necessary if your application is meant to be distributed for different platforms (XBox, PS3, PC, etc, for example). But making your software multi-target is also very recommendable in other situations, for example when you need to upgrade your technology to a newer version of an API. &lt;/p&gt;  &lt;p&gt;For instance, imagine that DirectX11 just came out. You would like to take advantage of some new features of it, but cannot force all your clients to upgrade their graphics cards, so you still need to support DirectX10. The solution is to make your software support both DirectX10 and 11, with multi-targeting. In this article, we will use the case of targeting an application to two different render APIs: &lt;em&gt;SlimDX&lt;/em&gt; and &lt;em&gt;XNA&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;If you already faced this problem before, you know it can be a serious one, especially if your software was not designed to support multi-targeting from the beginning, and you have API calls scattered all around your code. How do we make the change without needing to re-write the entire software from scratch? &lt;/p&gt;  &lt;p&gt;Let’s explore the possibilities: &lt;/p&gt;  &lt;h3&gt;A macro-C++ approach&lt;/h3&gt;  &lt;p&gt;When using languages like C++, some people make multi-targeting using &lt;em&gt;Macros&lt;/em&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Write all your game-logic code using your own MACRO-named types like: myMatrix4x4, myTexture, etc. &lt;/li&gt;    &lt;li&gt;Write a header file for each platform, in which all that macros are declared: &lt;/li&gt; &lt;/ul&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;#define&lt;/span&gt; myVector3 Microsoft::Xna::Framework::Vector3&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;#define&lt;/span&gt; myMatrix4x4 Microsoft::Xna::Framework::Matrix&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;But remember, &lt;strong&gt;MACROS ARE THE SOURCE OF ALL EVIL IN THE WORLD.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Macros easily grow in complexity. Specially if you start making multi-level macro calls. They make debugging and understanding the software a hell on Earth, and are extremely bug-prone, if you are not very careful. They have even been removed from modern languages like C#. So I totally discourage you to use this solution.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Pros:&lt;/strong&gt;       &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;Everything arranged for each platform at compilation: no performance penalty. &lt;/li&gt;          &lt;li&gt;No design effort. Easy development &lt;/li&gt;          &lt;li&gt;Resolved at compilation: no performance overhead &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Cons:&lt;/strong&gt;       &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;Make debugging, tracing and maintenance of the software in general a hell in Earth &lt;/li&gt;          &lt;li&gt;Very bug-prone &lt;/li&gt;          &lt;li&gt;Not available in modern languages, like C# &lt;/li&gt;          &lt;li&gt;In my opinion it’s against good practices in software. At least as long as a better solution exists. &lt;/li&gt;          &lt;li&gt;Compilation of C++ projects which massively use macros can take years to complete, especially if macros are recursive &lt;/li&gt;          &lt;li&gt;They don´t do the job for every case &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;The conditional compilation approach&lt;/h3&gt;  &lt;p&gt;As we have already seen, some parts of your code must be different for each platform, so an obvious and easy way to make your software multi-target is using conditional compilation.&lt;/p&gt;  &lt;p&gt;This approach is supported in almost every language, and works by defining compilation constants in your project like: PLATFORM_XNA, or PLATFORM_SLIMDX. Then, each time you find an API-dependent code part, you do something like:&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#if&lt;/span&gt;(PLATFORM_XNA)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;...&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;...&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#endif&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;/p&gt; &lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Pros:&lt;/strong&gt;       &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;Everything arranged for each platform at compilation: no performance penalty. &lt;/li&gt;          &lt;li&gt;No design effort. Easy development &lt;/li&gt;          &lt;li&gt;Available in all languages &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Cons:&lt;/strong&gt;       &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;Ugly and un-elegant code &lt;/li&gt;          &lt;li&gt;Uncomfortable to understand and trace &lt;/li&gt;          &lt;li&gt;Your code will grow considerably (too much redundancy) &lt;/li&gt;          &lt;li&gt;In my opinion it’s against good practices in software. At least as long as a better solution exists. &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;The layered approach&lt;/h3&gt;  &lt;p&gt;This is one of the usual approaches. It is related to software engineering more than to an specific language, and involves all the stages of development, since conception and first designs, to the final coding.&lt;/p&gt;  &lt;p&gt;What it suggests is dividing your application in “layers”, keeping internal layers for the game-logic related issues, which do not depend on the API or platform at all, and making an external layer that will give output to all that logic, through the API. This way, when you need to target a different platform, only the external layer has to be rewritten.&lt;/p&gt;  &lt;p&gt;This external layer, usually deals with things like &lt;em&gt;Rendering, &lt;/em&gt;that’s why it’s very typical to find games out there with DLLs like: RendererDX9.dll, RendererDX10.dll, etc.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Pros:&lt;/strong&gt;       &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;Elegant &lt;/li&gt;          &lt;li&gt;Easy to understand, trace and debug &lt;/li&gt;          &lt;li&gt;Robust, not too bug-prone &lt;/li&gt;          &lt;li&gt;Available in all languages &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Cons:&lt;/strong&gt;       &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;It requires a big design effort &lt;/li&gt;          &lt;li&gt;It can introduce a bit of performance overhead &lt;/li&gt;          &lt;li&gt;It introduces redundancy of code and information, as some game states has to be stored in several layers &lt;/li&gt;          &lt;li&gt;It’s sometimes not a feasible solution if the project is already written (the multi-target was not planned from the beginning), as it implies big structural changes. &lt;/li&gt;          &lt;li&gt;Following this design will give your software a &lt;em&gt;Library &lt;/em&gt;or &lt;em&gt;API&lt;/em&gt; looking I personally don’t like, as it breaks a bit the consistency of classes, by separating tasks that conceptually should belong to a class into other assemblies. This is one of the points I personally disagree more of this approach. I prefer to keep this consistency, leaving all tasks related to an object inside it’s class. Just an example to show this: &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You will end up with lines of code like: &lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;RendererDX9&lt;/span&gt;.RenderModel(&lt;span style="color: blue"&gt;this&lt;/span&gt;);&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Instead of the traditional: &lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.Render();&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Some people would say that rendering an object is not a task naturally belonging to that object. Well, as I said, this is a matter of personal preference, and I prefer the second approach. That’s why in next chapter we will try to make a multi-target system that follows it.&lt;/p&gt;  &lt;h3&gt;The inheritance approach&lt;/h3&gt;  &lt;p&gt;This approach is elegant as well (as the previous one). It also related to engineering and planning more to an specific language, and also involves many stages of the development. &lt;/p&gt;  &lt;p&gt;Instead of dividing your software in layers, it relies mostly on &lt;em&gt;Inheritance, &lt;/em&gt;through a very basic design for classes that are API-Dependant like the next example:&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;ul&gt;       &lt;ul&gt;         &lt;ul&gt;           &lt;ul&gt;             &lt;li&gt;&lt;strong&gt;Model3DBase&lt;/strong&gt;                 &lt;ul&gt;                 &lt;ul&gt;                   &lt;ul&gt;                     &lt;li&gt;Model3DSlimDX &lt;/li&gt;                      &lt;li&gt;Model3DXNA &lt;/li&gt;                   &lt;/ul&gt;                 &lt;/ul&gt;               &lt;/ul&gt;             &lt;/li&gt;           &lt;/ul&gt;         &lt;/ul&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;It is quite obvious that we will put in the base class all the non API-dependent code, and the rest in the child classes. For example, the &lt;em&gt;ToString() &lt;/em&gt;method has nothing to do with the platform the 3D model will be rendered in. So that code will be in the base class, avoiding rewriting it for each child.&lt;/p&gt;  &lt;p&gt;Once we have all the classes divided for each version of the API, in the outer part of your software you just need to choose which kind of Scene to use. Something like: &lt;em&gt;SceneSlimDX&lt;/em&gt; or &lt;em&gt;SceneXNA&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;This approach works, it’s elegant, easy to understand and trace, and keeps the consistency of classes, but it has a major drawback: for classes like this (a 3D Model), many many member variables and methods will be API-specific, so the amount of code in the base class will be much lower than in the child, dependent classes. This will force you to write a huge amount of duplicated code, and we already said that duplicating is wrong. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Pros:&lt;/strong&gt;       &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;Elegant &lt;/li&gt;          &lt;li&gt;Easy to understand, trace and debug &lt;/li&gt;          &lt;li&gt;Robust, not too bug-prone &lt;/li&gt;          &lt;li&gt;Available in all languages &lt;/li&gt;          &lt;li&gt;It keeps the consistency of classes, allowing us to put the &lt;em&gt;Render &lt;/em&gt;method inside the Model3D class, instead of having to take it out to another class. &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Cons:&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;It requires some design effort &lt;/li&gt;      &lt;li&gt;It’s sometimes not a feasible solution if the project is already written (the multi-target was not planned from the beginning), as it implies big structural changes. &lt;/li&gt;      &lt;li&gt;Splitting your types for each API won´t help reducing redundancy in higher code levels too (what will happen when we are going to use the model? which version will be use? Again conditional compilation?) &lt;/li&gt;      &lt;li&gt;The biggest problem is the redundancy of code mentioned (many code parts will be repeated in the child classes) &lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h3&gt;So, which one is best?&lt;/h3&gt;  &lt;p&gt;Again, this is all a matter of personal preference. &lt;/p&gt;  &lt;p&gt;Macros are discarded by themselves… too bug-prone, and not present in modern languages. In my opinion, best option is a combination of: a lit
